@limble/limble-tree 0.12.2 → 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} +105 -147
- 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 +24 -10
- package/bundles/limble-limble-tree.umd.js +0 -2905
- 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 -372
- 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,172 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, NgZone, Output, ViewChild, ViewContainerRef } from "@angular/core";
|
|
2
|
+
import { DropZoneService } from "./drop-zone.service";
|
|
3
|
+
import { TreeService } from "./tree.service";
|
|
4
|
+
import { isElementDescendant, isFirefox } from "../util";
|
|
5
|
+
import { first } from "rxjs/operators";
|
|
6
|
+
import { TreeConstructionStatus } from "./tree-construction-status.service";
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "./tree.service";
|
|
9
|
+
import * as i2 from "./drop-zone.service";
|
|
10
|
+
import * as i3 from "../singletons/drag-state.service";
|
|
11
|
+
import * as i4 from "../singletons/global-events.service";
|
|
12
|
+
import * as i5 from "@angular/common";
|
|
13
|
+
import * as i6 from "../limble-tree-placeholder/limble-tree-placeholder.component";
|
|
14
|
+
import * as i7 from "../custom-event-bindings/dragover-no-change-detect.directive";
|
|
15
|
+
import * as i8 from "../custom-event-bindings/dragleave-no-change-detect.directive";
|
|
16
|
+
const _c0 = ["host"];
|
|
17
|
+
function LimbleTreeRootComponent_limble_tree_placeholder_1_Template(rf, ctx) { if (rf & 1) {
|
|
18
|
+
i0.ɵɵelement(0, "limble-tree-placeholder");
|
|
19
|
+
} }
|
|
20
|
+
function LimbleTreeRootComponent_ng_template_2_Template(rf, ctx) { }
|
|
21
|
+
export class LimbleTreeRootComponent {
|
|
22
|
+
constructor(treeService, dropZoneService, dragStateService, globalEventsService, ngZone, changeDetectorRef, el) {
|
|
23
|
+
this.treeService = treeService;
|
|
24
|
+
this.dropZoneService = dropZoneService;
|
|
25
|
+
this.dragStateService = dragStateService;
|
|
26
|
+
this.globalEventsService = globalEventsService;
|
|
27
|
+
this.ngZone = ngZone;
|
|
28
|
+
this.changeDetectorRef = changeDetectorRef;
|
|
29
|
+
this.el = el;
|
|
30
|
+
this.treeChange = new EventEmitter();
|
|
31
|
+
this.treeDrop = new EventEmitter();
|
|
32
|
+
this.changesSubscription = this.treeService.changes$.subscribe(() => {
|
|
33
|
+
//"In dev mode, Angular performs an additional check after each change
|
|
34
|
+
//detection run, to ensure the bindings haven’t changed." We use a timeout here
|
|
35
|
+
//to preclude the possibility of causing a binding to update in the parent
|
|
36
|
+
//component after change detection runs but before the additional check.
|
|
37
|
+
//See https://angular.io/errors/NG0100 for details.
|
|
38
|
+
setTimeout(() => {
|
|
39
|
+
this.treeChange.emit();
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
this.dropSubscription = this.treeService.drops$.subscribe((drop) => {
|
|
43
|
+
setTimeout(() => {
|
|
44
|
+
this.treeDrop.emit(drop);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
this.placeholder = false;
|
|
48
|
+
this.treeService.placeholder$.subscribe((value) => {
|
|
49
|
+
this.placeholder = value;
|
|
50
|
+
if (!NgZone.isInAngularZone()) {
|
|
51
|
+
this.changeDetectorRef.detectChanges();
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
ngAfterViewInit() {
|
|
56
|
+
if (this.options?.listMode !== true &&
|
|
57
|
+
(this.itemsPerPage !== undefined || this.page !== undefined)) {
|
|
58
|
+
console.warn("pagination is only allowed in listMode; `itemsPerPage` and `page` inputs will be ignored");
|
|
59
|
+
}
|
|
60
|
+
this.update();
|
|
61
|
+
this.changeDetectorRef.detectChanges();
|
|
62
|
+
this.ngZone.runOutsideAngular(() => {
|
|
63
|
+
//this is for mac os - without this dragover handler drop events aren't firing correctly
|
|
64
|
+
this.el.nativeElement.addEventListener("dragover", (event) => {
|
|
65
|
+
event.preventDefault();
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
ngOnChanges() {
|
|
70
|
+
if (this.host !== undefined && this.data !== undefined) {
|
|
71
|
+
this.update();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/** Rebuild the tree */
|
|
75
|
+
update() {
|
|
76
|
+
if (this.host === undefined) {
|
|
77
|
+
throw new Error("Failed to render limble tree. Failure occurred at root.");
|
|
78
|
+
}
|
|
79
|
+
if (this.data === undefined) {
|
|
80
|
+
throw new Error(`limbleTree requires a data object`);
|
|
81
|
+
}
|
|
82
|
+
this.treeService.init(this.host, this.data, this.options, this.itemsPerPage, this.page);
|
|
83
|
+
//We check for firefox here because there is a bug in Firefox that causes the
|
|
84
|
+
//custom scrolling to break. See https://bugzilla.mozilla.org/show_bug.cgi?id=505521#c80
|
|
85
|
+
if (!isFirefox()) {
|
|
86
|
+
this.globalEventsService.addScrolling();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
dragoverHandler(event) {
|
|
90
|
+
if (event.dataTransfer === null) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
event.stopPropagation();
|
|
94
|
+
event.preventDefault();
|
|
95
|
+
event.dataTransfer.dropEffect = "move";
|
|
96
|
+
}
|
|
97
|
+
dragleaveHandler(event) {
|
|
98
|
+
const currentTarget = event.currentTarget;
|
|
99
|
+
const relatedTarget = event.relatedTarget;
|
|
100
|
+
if (!(currentTarget instanceof Node) ||
|
|
101
|
+
!(relatedTarget instanceof Node) ||
|
|
102
|
+
isElementDescendant(currentTarget, relatedTarget) !== false) {
|
|
103
|
+
//event came from deeper in the tree. Ignore it.
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
//Mouse has left the tree, so clear the drop zones
|
|
107
|
+
this.dropZoneService.clearVisibleZones();
|
|
108
|
+
this.changeDetectorRef.detectChanges();
|
|
109
|
+
}
|
|
110
|
+
dropHandler(event) {
|
|
111
|
+
event.stopPropagation();
|
|
112
|
+
if (this.dragStateService.getState() !== "droppable") {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const sourceBranch = this.dragStateService.capture();
|
|
116
|
+
if (sourceBranch === undefined) {
|
|
117
|
+
throw new Error("failed to get current branch in dragendHandler");
|
|
118
|
+
}
|
|
119
|
+
const dropZone = this.dropZoneService.getActiveDropZone();
|
|
120
|
+
if (dropZone === null) {
|
|
121
|
+
throw new Error("failed to get active drop zone at drop handler");
|
|
122
|
+
}
|
|
123
|
+
this.treeService.captured = true;
|
|
124
|
+
this.dragStateService.state$
|
|
125
|
+
.pipe(first((message) => message === "idle"))
|
|
126
|
+
.subscribe(() => {
|
|
127
|
+
this.treeService.captured = false;
|
|
128
|
+
});
|
|
129
|
+
this.dropZoneService.clearVisibleZones();
|
|
130
|
+
this.treeService.drop(sourceBranch, dropZone.getFullInsertCoordinates());
|
|
131
|
+
}
|
|
132
|
+
ngOnDestroy() {
|
|
133
|
+
this.changesSubscription.unsubscribe();
|
|
134
|
+
this.dropSubscription.unsubscribe();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
LimbleTreeRootComponent.ɵfac = function LimbleTreeRootComponent_Factory(t) { return new (t || LimbleTreeRootComponent)(i0.ɵɵdirectiveInject(i1.TreeService), i0.ɵɵdirectiveInject(i2.DropZoneService), i0.ɵɵdirectiveInject(i3.DragStateService), i0.ɵɵdirectiveInject(i4.GlobalEventsService), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.ElementRef)); };
|
|
138
|
+
LimbleTreeRootComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LimbleTreeRootComponent, selectors: [["limble-tree-root"]], viewQuery: function LimbleTreeRootComponent_Query(rf, ctx) { if (rf & 1) {
|
|
139
|
+
i0.ɵɵviewQuery(_c0, 5, ViewContainerRef);
|
|
140
|
+
} if (rf & 2) {
|
|
141
|
+
let _t;
|
|
142
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.host = _t.first);
|
|
143
|
+
} }, inputs: { data: "data", options: "options", itemsPerPage: "itemsPerPage", page: "page" }, outputs: { treeChange: "treeChange", treeDrop: "treeDrop" }, features: [i0.ɵɵProvidersFeature([TreeService, DropZoneService, TreeConstructionStatus]), i0.ɵɵNgOnChangesFeature], decls: 4, vars: 1, consts: [[1, "tree-event-host", 3, "dragoverNoChangeDetect", "dragleaveNoChangeDetect", "drop"], [4, "ngIf"], ["host", ""]], template: function LimbleTreeRootComponent_Template(rf, ctx) { if (rf & 1) {
|
|
144
|
+
i0.ɵɵelementStart(0, "div", 0);
|
|
145
|
+
i0.ɵɵlistener("dragoverNoChangeDetect", function LimbleTreeRootComponent_Template_div_dragoverNoChangeDetect_0_listener($event) { return ctx.dragoverHandler($event); })("dragleaveNoChangeDetect", function LimbleTreeRootComponent_Template_div_dragleaveNoChangeDetect_0_listener($event) { return ctx.dragleaveHandler($event); })("drop", function LimbleTreeRootComponent_Template_div_drop_0_listener($event) { return ctx.dropHandler($event); });
|
|
146
|
+
i0.ɵɵtemplate(1, LimbleTreeRootComponent_limble_tree_placeholder_1_Template, 1, 0, "limble-tree-placeholder", 1);
|
|
147
|
+
i0.ɵɵtemplate(2, LimbleTreeRootComponent_ng_template_2_Template, 0, 0, "ng-template", null, 2, i0.ɵɵtemplateRefExtractor);
|
|
148
|
+
i0.ɵɵelementEnd();
|
|
149
|
+
} if (rf & 2) {
|
|
150
|
+
i0.ɵɵadvance(1);
|
|
151
|
+
i0.ɵɵproperty("ngIf", ctx.placeholder === true);
|
|
152
|
+
} }, dependencies: [i5.NgIf, i6.LimbleTreePlaceholderComponent, i7.DragoverNoChangeDetectDirective, i8.DragleaveNoChangeDetectDirective] });
|
|
153
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LimbleTreeRootComponent, [{
|
|
154
|
+
type: Component,
|
|
155
|
+
args: [{ selector: "limble-tree-root", providers: [TreeService, DropZoneService, TreeConstructionStatus], template: "<div\n (dragoverNoChangeDetect)=\"dragoverHandler($event)\"\n (dragleaveNoChangeDetect)=\"dragleaveHandler($event)\"\n (drop)=\"dropHandler($event)\"\n class=\"tree-event-host\"\n>\n <limble-tree-placeholder\n *ngIf=\"placeholder === true\"\n ></limble-tree-placeholder>\n <ng-template #host></ng-template>\n</div>\n" }]
|
|
156
|
+
}], function () { return [{ type: i1.TreeService }, { type: i2.DropZoneService }, { type: i3.DragStateService }, { type: i4.GlobalEventsService }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, { data: [{
|
|
157
|
+
type: Input
|
|
158
|
+
}], options: [{
|
|
159
|
+
type: Input
|
|
160
|
+
}], itemsPerPage: [{
|
|
161
|
+
type: Input
|
|
162
|
+
}], page: [{
|
|
163
|
+
type: Input
|
|
164
|
+
}], host: [{
|
|
165
|
+
type: ViewChild,
|
|
166
|
+
args: ["host", { read: ViewContainerRef }]
|
|
167
|
+
}], treeChange: [{
|
|
168
|
+
type: Output
|
|
169
|
+
}], treeDrop: [{
|
|
170
|
+
type: Output
|
|
171
|
+
}] }); })();
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGltYmxlLXRyZWUtcm9vdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2xpbWJsZS10cmVlLXJvb3QvbGltYmxlLXRyZWUtcm9vdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2xpbWJsZS10cmVlLXJvb3QvbGltYmxlLXRyZWUtcm9vdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0osU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUdOLE1BQU0sRUFDTixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQU10RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUd6RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7Ozs7OztJQ3BCekUsMENBRTJCOzs7QUQwQjlCLE1BQU0sT0FBTyx1QkFBdUI7SUFvQmpDLFlBQ29CLFdBQXdCLEVBQ3hCLGVBQWdDLEVBQ2hDLGdCQUFrQyxFQUNsQyxtQkFBd0MsRUFDeEMsTUFBYyxFQUNkLGlCQUFvQyxFQUNwQyxFQUF1QjtRQU52QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLFdBQU0sR0FBTixN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dUJBQXVCO2NBTm5DLFNBQVM7MkJBQ0csa0JBQWtCLGFBR2pCLENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsQ0FBQzsyT0FLeEQsSUFBSTtrQkFBWixLQUFLO1lBQ0csT0FBTztrQkFBZixLQUFLO1lBQ0csWUFBWTtrQkFBcEIsS0FBSztZQUNHLElBQUk7a0JBQVosS0FBSztZQUVpRCxJQUFJO2tCQUExRCxTQUFTO21CQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtZQUkxQixVQUFVO2tCQUE1QixNQUFNO1lBRVksUUFBUTtrQkFBMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICBBZnRlclZpZXdJbml0LFxuICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICBDb21wb25lbnQsXG4gICBFbGVtZW50UmVmLFxuICAgRXZlbnRFbWl0dGVyLFxuICAgSW5wdXQsXG4gICBOZ1pvbmUsXG4gICBPbkNoYW5nZXMsXG4gICBPbkRlc3Ryb3ksXG4gICBPdXRwdXQsXG4gICBWaWV3Q2hpbGQsXG4gICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgRHJvcFpvbmVTZXJ2aWNlIH0gZnJvbSBcIi4vZHJvcC16b25lLnNlcnZpY2VcIjtcbmltcG9ydCB7XG4gICBMaW1ibGVUcmVlRGF0YSxcbiAgIExpbWJsZVRyZWVPcHRpb25zLFxuICAgVHJlZURyb3Bcbn0gZnJvbSBcIi4uL2xpbWJsZS10cmVlLXJvb3QvdHJlZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBUcmVlU2VydmljZSB9IGZyb20gXCIuL3RyZWUuc2VydmljZVwiO1xuaW1wb3J0IHsgaXNFbGVtZW50RGVzY2VuZGFudCwgaXNGaXJlZm94IH0gZnJvbSBcIi4uL3V0aWxcIjtcbmltcG9ydCB7IERyYWdTdGF0ZVNlcnZpY2UgfSBmcm9tIFwiLi4vc2luZ2xldG9ucy9kcmFnLXN0YXRlLnNlcnZpY2VcIjtcbmltcG9ydCB7IEdsb2JhbEV2ZW50c1NlcnZpY2UgfSBmcm9tIFwiLi4vc2luZ2xldG9ucy9nbG9iYWwtZXZlbnRzLnNlcnZpY2VcIjtcbmltcG9ydCB7IGZpcnN0IH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBUcmVlQ29uc3RydWN0aW9uU3RhdHVzIH0gZnJvbSBcIi4vdHJlZS1jb25zdHJ1Y3Rpb24tc3RhdHVzLnNlcnZpY2VcIjtcblxuQENvbXBvbmVudCh7XG4gICBzZWxlY3RvcjogXCJsaW1ibGUtdHJlZS1yb290XCIsXG4gICB0ZW1wbGF0ZVVybDogXCIuL2xpbWJsZS10cmVlLXJvb3QuY29tcG9uZW50Lmh0bWxcIixcbiAgIHN0eWxlVXJsczogW1wiLi9saW1ibGUtdHJlZS1yb290LmNvbXBvbmVudC5zY3NzXCJdLFxuICAgcHJvdmlkZXJzOiBbVHJlZVNlcnZpY2UsIERyb3Bab25lU2VydmljZSwgVHJlZUNvbnN0cnVjdGlvblN0YXR1c11cbn0pXG5leHBvcnQgY2xhc3MgTGltYmxlVHJlZVJvb3RDb21wb25lbnRcbiAgIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3lcbntcbiAgIEBJbnB1dCgpIGRhdGE6IExpbWJsZVRyZWVEYXRhIHwgdW5kZWZpbmVkO1xuICAgQElucHV0KCkgb3B0aW9uczogTGltYmxlVHJlZU9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICBASW5wdXQoKSBpdGVtc1BlclBhZ2U6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgIEBJbnB1dCgpIHBhZ2U6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgQFZpZXdDaGlsZChcImhvc3RcIiwgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIHByaXZhdGUgaG9zdDpcbiAgICAgIHwgVmlld0NvbnRhaW5lclJlZlxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgIEBPdXRwdXQoKSByZWFkb25seSB0cmVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudWxsPigpO1xuXG4gICBAT3V0cHV0KCkgcmVhZG9ubHkgdHJlZURyb3AgPSBuZXcgRXZlbnRFbWl0dGVyPFRyZWVEcm9wPigpO1xuXG4gICBwcml2YXRlIHJlYWRvbmx5IGNoYW5nZXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgIHByaXZhdGUgcmVhZG9ubHkgZHJvcFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICAgcHVibGljIHBsYWNlaG9sZGVyOiBib29sZWFuO1xuXG4gICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgdHJlZVNlcnZpY2U6IFRyZWVTZXJ2aWNlLFxuICAgICAgcHJpdmF0ZSByZWFkb25seSBkcm9wWm9uZVNlcnZpY2U6IERyb3Bab25lU2VydmljZSxcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgZHJhZ1N0YXRlU2VydmljZTogRHJhZ1N0YXRlU2VydmljZSxcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgZ2xvYmFsRXZlbnRzU2VydmljZTogR2xvYmFsRXZlbnRzU2VydmljZSxcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgbmdab25lOiBOZ1pvbmUsXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgZWw6IEVsZW1lbnRSZWY8RWxlbWVudD5cbiAgICkge1xuICAgICAgdGhpcy5jaGFuZ2VzU3Vic2NyaXB0aW9uID0gdGhpcy50cmVlU2VydmljZS5jaGFuZ2VzJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgLy9cIkluIGRldiBtb2RlLCBBbmd1bGFyIHBlcmZvcm1zIGFuIGFkZGl0aW9uYWwgY2hlY2sgYWZ0ZXIgZWFjaCBjaGFuZ2VcbiAgICAgICAgIC8vZGV0ZWN0aW9uIHJ1biwgdG8gZW5zdXJlIHRoZSBiaW5kaW5ncyBoYXZlbuKAmXQgY2hhbmdlZC5cIiBXZSB1c2UgYSB0aW1lb3V0IGhlcmVcbiAgICAgICAgIC8vdG8gcHJlY2x1ZGUgdGhlIHBvc3NpYmlsaXR5IG9mIGNhdXNpbmcgYSBiaW5kaW5nIHRvIHVwZGF0ZSBpbiB0aGUgcGFyZW50XG4gICAgICAgICAvL2NvbXBvbmVudCBhZnRlciBjaGFuZ2UgZGV0ZWN0aW9uIHJ1bnMgYnV0IGJlZm9yZSB0aGUgYWRkaXRpb25hbCBjaGVjay5cbiAgICAgICAgIC8vU2VlIGh0dHBzOi8vYW5ndWxhci5pby9lcnJvcnMvTkcwMTAwIGZvciBkZXRhaWxzLlxuICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyZWVDaGFuZ2UuZW1pdCgpO1xuICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZHJvcFN1YnNjcmlwdGlvbiA9IHRoaXMudHJlZVNlcnZpY2UuZHJvcHMkLnN1YnNjcmliZSgoZHJvcCkgPT4ge1xuICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyZWVEcm9wLmVtaXQoZHJvcCk7XG4gICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5wbGFjZWhvbGRlciA9IGZhbHNlO1xuICAgICAgdGhpcy50cmVlU2VydmljZS5wbGFjZWhvbGRlciQuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgdGhpcy5wbGFjZWhvbGRlciA9IHZhbHVlO1xuICAgICAgICAgaWYgKCFOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgfVxuICAgICAgfSk7XG4gICB9XG5cbiAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIHRoaXMub3B0aW9ucz8ubGlzdE1vZGUgIT09IHRydWUgJiZcbiAgICAgICAgICh0aGlzLml0ZW1zUGVyUGFnZSAhPT0gdW5kZWZpbmVkIHx8IHRoaXMucGFnZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgKSB7XG4gICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBcInBhZ2luYXRpb24gaXMgb25seSBhbGxvd2VkIGluIGxpc3RNb2RlOyBgaXRlbXNQZXJQYWdlYCBhbmQgYHBhZ2VgIGlucHV0cyB3aWxsIGJlIGlnbm9yZWRcIlxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgLy90aGlzIGlzIGZvciBtYWMgb3MgLSB3aXRob3V0IHRoaXMgZHJhZ292ZXIgaGFuZGxlciBkcm9wIGV2ZW50cyBhcmVuJ3QgZmlyaW5nIGNvcnJlY3RseVxuICAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJkcmFnb3ZlclwiLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgfVxuXG4gICBuZ09uQ2hhbmdlcygpIHtcbiAgICAgIGlmICh0aGlzLmhvc3QgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgIH1cbiAgIH1cblxuICAgLyoqIFJlYnVpbGQgdGhlIHRyZWUgKi9cbiAgIHB1YmxpYyB1cGRhdGUoKSB7XG4gICAgICBpZiAodGhpcy5ob3N0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiRmFpbGVkIHRvIHJlbmRlciBsaW1ibGUgdHJlZS4gRmFpbHVyZSBvY2N1cnJlZCBhdCByb290LlwiXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGxpbWJsZVRyZWUgcmVxdWlyZXMgYSBkYXRhIG9iamVjdGApO1xuICAgICAgfVxuICAgICAgdGhpcy50cmVlU2VydmljZS5pbml0KFxuICAgICAgICAgdGhpcy5ob3N0LFxuICAgICAgICAgdGhpcy5kYXRhLFxuICAgICAgICAgdGhpcy5vcHRpb25zLFxuICAgICAgICAgdGhpcy5pdGVtc1BlclBhZ2UsXG4gICAgICAgICB0aGlzLnBhZ2VcbiAgICAgICk7XG4gICAgICAvL1dlIGNoZWNrIGZvciBmaXJlZm94IGhlcmUgYmVjYXVzZSB0aGVyZSBpcyBhIGJ1ZyBpbiBGaXJlZm94IHRoYXQgY2F1c2VzIHRoZVxuICAgICAgLy9jdXN0b20gc2Nyb2xsaW5nIHRvIGJyZWFrLiBTZWUgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTA1NTIxI2M4MFxuICAgICAgaWYgKCFpc0ZpcmVmb3goKSkge1xuICAgICAgICAgdGhpcy5nbG9iYWxFdmVudHNTZXJ2aWNlLmFkZFNjcm9sbGluZygpO1xuICAgICAgfVxuICAgfVxuXG4gICBwdWJsaWMgZHJhZ292ZXJIYW5kbGVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5kYXRhVHJhbnNmZXIgPT09IG51bGwpIHtcbiAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gXCJtb3ZlXCI7XG4gICB9XG5cbiAgIHB1YmxpYyBkcmFnbGVhdmVIYW5kbGVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRUYXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gICAgICBpZiAoXG4gICAgICAgICAhKGN1cnJlbnRUYXJnZXQgaW5zdGFuY2VvZiBOb2RlKSB8fFxuICAgICAgICAgIShyZWxhdGVkVGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkgfHxcbiAgICAgICAgIGlzRWxlbWVudERlc2NlbmRhbnQoY3VycmVudFRhcmdldCwgcmVsYXRlZFRhcmdldCkgIT09IGZhbHNlXG4gICAgICApIHtcbiAgICAgICAgIC8vZXZlbnQgY2FtZSBmcm9tIGRlZXBlciBpbiB0aGUgdHJlZS4gSWdub3JlIGl0LlxuICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy9Nb3VzZSBoYXMgbGVmdCB0aGUgdHJlZSwgc28gY2xlYXIgdGhlIGRyb3Agem9uZXNcbiAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLmNsZWFyVmlzaWJsZVpvbmVzKCk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgIH1cblxuICAgcHVibGljIGRyb3BIYW5kbGVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKHRoaXMuZHJhZ1N0YXRlU2VydmljZS5nZXRTdGF0ZSgpICE9PSBcImRyb3BwYWJsZVwiKSB7XG4gICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzb3VyY2VCcmFuY2ggPSB0aGlzLmRyYWdTdGF0ZVNlcnZpY2UuY2FwdHVyZSgpO1xuICAgICAgaWYgKHNvdXJjZUJyYW5jaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmYWlsZWQgdG8gZ2V0IGN1cnJlbnQgYnJhbmNoIGluIGRyYWdlbmRIYW5kbGVyXCIpO1xuICAgICAgfVxuICAgICAgY29uc3QgZHJvcFpvbmUgPSB0aGlzLmRyb3Bab25lU2VydmljZS5nZXRBY3RpdmVEcm9wWm9uZSgpO1xuICAgICAgaWYgKGRyb3Bab25lID09PSBudWxsKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmYWlsZWQgdG8gZ2V0IGFjdGl2ZSBkcm9wIHpvbmUgYXQgZHJvcCBoYW5kbGVyXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy50cmVlU2VydmljZS5jYXB0dXJlZCA9IHRydWU7XG4gICAgICB0aGlzLmRyYWdTdGF0ZVNlcnZpY2Uuc3RhdGUkXG4gICAgICAgICAucGlwZShmaXJzdCgobWVzc2FnZSkgPT4gbWVzc2FnZSA9PT0gXCJpZGxlXCIpKVxuICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLmNhcHR1cmVkID0gZmFsc2U7XG4gICAgICAgICB9KTtcbiAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLmNsZWFyVmlzaWJsZVpvbmVzKCk7XG4gICAgICB0aGlzLnRyZWVTZXJ2aWNlLmRyb3Aoc291cmNlQnJhbmNoLCBkcm9wWm9uZS5nZXRGdWxsSW5zZXJ0Q29vcmRpbmF0ZXMoKSk7XG4gICB9XG5cbiAgIG5nT25EZXN0cm95KCkge1xuICAgICAgdGhpcy5jaGFuZ2VzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLmRyb3BTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgIH1cbn1cbiIsIjxkaXZcbiAgIChkcmFnb3Zlck5vQ2hhbmdlRGV0ZWN0KT1cImRyYWdvdmVySGFuZGxlcigkZXZlbnQpXCJcbiAgIChkcmFnbGVhdmVOb0NoYW5nZURldGVjdCk9XCJkcmFnbGVhdmVIYW5kbGVyKCRldmVudClcIlxuICAgKGRyb3ApPVwiZHJvcEhhbmRsZXIoJGV2ZW50KVwiXG4gICBjbGFzcz1cInRyZWUtZXZlbnQtaG9zdFwiXG4+XG4gICA8bGltYmxlLXRyZWUtcGxhY2Vob2xkZXJcbiAgICAgICpuZ0lmPVwicGxhY2Vob2xkZXIgPT09IHRydWVcIlxuICAgPjwvbGltYmxlLXRyZWUtcGxhY2Vob2xkZXI+XG4gICA8bmctdGVtcGxhdGUgI2hvc3Q+PC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuIl19
|
|
@@ -30,4 +30,4 @@ TreeConstructionStatus.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: T
|
|
|
30
30
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TreeConstructionStatus, [{
|
|
31
31
|
type: Injectable
|
|
32
32
|
}], function () { return []; }, null); })();
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1jb25zdHJ1Y3Rpb24tc3RhdHVzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2xpbWJsZS10cmVlLXJvb3QvdHJlZS1jb25zdHJ1Y3Rpb24tc3RhdHVzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUd2QyxNQUFNLE9BQU8sc0JBQXNCO0lBS2hDO1FBQ0csSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU0sWUFBWTtRQUNoQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUVNLGdCQUFnQjtRQUNwQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUVNLFlBQVk7UUFDaEIsT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU0sS0FBSyxDQUFDLEdBQVk7UUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDdEIsQ0FBQztJQUVNLElBQUk7UUFDUixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUMxQyxDQUFDOzs0RkEvQlMsc0JBQXNCOzRFQUF0QixzQkFBc0IsV0FBdEIsc0JBQXNCO3VGQUF0QixzQkFBc0I7Y0FEbEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRyZWVDb25zdHJ1Y3Rpb25TdGF0dXMge1xuICAgcHJpdmF0ZSBiZWluZ0J1aWx0OiBudW1iZXI7XG4gICBwcml2YXRlIGlzUmVhZHk6IGJvb2xlYW47XG4gICBwdWJsaWMgcmVhZG9ubHkgc3RhYmxlJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xuXG4gICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLmJlaW5nQnVpbHQgPSAwO1xuICAgICAgdGhpcy5pc1JlYWR5ID0gZmFsc2U7XG4gICAgICB0aGlzLnN0YWJsZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRoaXMudHJlZUlzU3RhYmxlKCkpO1xuICAgfVxuXG4gICBwdWJsaWMgY29uc3RydWN0aW5nKCk6IHZvaWQge1xuICAgICAgdGhpcy5iZWluZ0J1aWx0Kys7XG4gICAgICB0aGlzLmVtaXQoKTtcbiAgIH1cblxuICAgcHVibGljIGRvbmVDb25zdHJ1Y3RpbmcoKTogdm9pZCB7XG4gICAgICB0aGlzLmJlaW5nQnVpbHQtLTtcbiAgICAgIHRoaXMuZW1pdCgpO1xuICAgfVxuXG4gICBwdWJsaWMgdHJlZUlzU3RhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuaXNSZWFkeSA9PT0gdHJ1ZSAmJiB0aGlzLmJlaW5nQnVpbHQgPT09IDA7XG4gICB9XG5cbiAgIHB1YmxpYyByZWFkeSh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHRoaXMuaXNSZWFkeSA9IHZhbDtcbiAgIH1cblxuICAgcHVibGljIGVtaXQoKTogdm9pZCB7XG4gICAgICB0aGlzLnN0YWJsZSQubmV4dCh0aGlzLnRyZWVJc1N0YWJsZSgpKTtcbiAgIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { Injectable } from "@angular/core";
|
|
2
|
+
import { Branch } from "../classes/Branch";
|
|
3
|
+
import { LimbleTreeNodeComponent } from "../limble-tree-node/limble-tree-node.component";
|
|
4
|
+
import { BehaviorSubject, EMPTY, Subject } from "rxjs";
|
|
5
|
+
import { arraysAreEqual } from "../util";
|
|
6
|
+
import { debounce, debounceTime, filter, tap } from "rxjs/operators";
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "../singletons/component-creator.service";
|
|
9
|
+
import * as i2 from "./drop-zone.service";
|
|
10
|
+
import * as i3 from "../singletons/drag-state.service";
|
|
11
|
+
import * as i4 from "./tree-construction-status.service";
|
|
12
|
+
/** The default value for the `indent` option */
|
|
13
|
+
export const INDENT = 45;
|
|
14
|
+
export class TreeService {
|
|
15
|
+
constructor(componentCreatorService, dropZoneService, dragStateService, treeConstructionStatus) {
|
|
16
|
+
this.componentCreatorService = componentCreatorService;
|
|
17
|
+
this.dropZoneService = dropZoneService;
|
|
18
|
+
this.dragStateService = dragStateService;
|
|
19
|
+
this.treeConstructionStatus = treeConstructionStatus;
|
|
20
|
+
this.changes$ = new Subject();
|
|
21
|
+
this.drops$ = new Subject();
|
|
22
|
+
this.treeModel = new Branch(null);
|
|
23
|
+
this.placeholder = false;
|
|
24
|
+
this.captured = false;
|
|
25
|
+
this.cleanupSignal$ = new Subject();
|
|
26
|
+
let rebuild = false;
|
|
27
|
+
let treeIsStable = false;
|
|
28
|
+
const treeIsStable$ = this.treeConstructionStatus.stable$.pipe(tap((value) => {
|
|
29
|
+
treeIsStable = value;
|
|
30
|
+
}), filter((value) => value === true));
|
|
31
|
+
this.cleanupSignal$
|
|
32
|
+
.pipe(tap((value) => {
|
|
33
|
+
rebuild = value;
|
|
34
|
+
}), debounce(() => {
|
|
35
|
+
if (treeIsStable === true) {
|
|
36
|
+
//If tree is stable, continue right away
|
|
37
|
+
return EMPTY;
|
|
38
|
+
}
|
|
39
|
+
//If tree is not stable, wait for it to become so.
|
|
40
|
+
return treeIsStable$;
|
|
41
|
+
}),
|
|
42
|
+
//We use this timed debounce to throttle chained destruction of components
|
|
43
|
+
debounceTime(5))
|
|
44
|
+
.subscribe(() => {
|
|
45
|
+
this.cleanup(rebuild);
|
|
46
|
+
rebuild = false;
|
|
47
|
+
});
|
|
48
|
+
this.placeholder$ = new BehaviorSubject(false);
|
|
49
|
+
this.placeholder$.subscribe((value) => {
|
|
50
|
+
this.placeholder = value;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
drop(source, targetCoordinates) {
|
|
54
|
+
//prep
|
|
55
|
+
const sourceParent = source.getParent();
|
|
56
|
+
if (sourceParent === null) {
|
|
57
|
+
throw new Error("can't drop root of tree");
|
|
58
|
+
}
|
|
59
|
+
const sourceIndex = source.getIndex();
|
|
60
|
+
if (sourceIndex === undefined || sourceIndex === null) {
|
|
61
|
+
throw new Error("Cannot move the hidden root node");
|
|
62
|
+
}
|
|
63
|
+
let targetParentCoordinates;
|
|
64
|
+
let newIndex;
|
|
65
|
+
if (this.placeholder === true) {
|
|
66
|
+
targetParentCoordinates = [];
|
|
67
|
+
newIndex = 0;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
targetParentCoordinates = [...targetCoordinates];
|
|
71
|
+
newIndex = targetParentCoordinates.pop();
|
|
72
|
+
}
|
|
73
|
+
if (newIndex === undefined) {
|
|
74
|
+
throw new Error("target coordinates are empty");
|
|
75
|
+
}
|
|
76
|
+
const targetParent = this.treeModel.getDescendant(targetParentCoordinates);
|
|
77
|
+
if (targetParent === undefined) {
|
|
78
|
+
throw new Error("could not get to target");
|
|
79
|
+
}
|
|
80
|
+
const target = this.dropZoneService.getDropZone(targetCoordinates);
|
|
81
|
+
const targetIndex = target?.getLocation().insertIndex;
|
|
82
|
+
const targetHost = target?.getHost();
|
|
83
|
+
const sourceHost = this.dragStateService.getData()?.parentContainer;
|
|
84
|
+
if (this.placeholder === true) {
|
|
85
|
+
this.placeholder$.next(false);
|
|
86
|
+
}
|
|
87
|
+
//Change the treeModel
|
|
88
|
+
targetParent.insertChild(source, newIndex);
|
|
89
|
+
//Prepare to update the view
|
|
90
|
+
if (targetHost === undefined ||
|
|
91
|
+
sourceHost === undefined ||
|
|
92
|
+
targetIndex === undefined) {
|
|
93
|
+
//Hitting this means there is a bug, but not a fatal one.
|
|
94
|
+
//Just render the whole tree again.
|
|
95
|
+
console.warn("Could not perform a precise update. Re-rendering the entire tree instead");
|
|
96
|
+
this.render();
|
|
97
|
+
this.changes$.next(null);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
//Update the view
|
|
101
|
+
const nodesInSource = sourceHost.length;
|
|
102
|
+
const componentRef = this.componentCreatorService.appendComponent(LimbleTreeNodeComponent, targetHost, newIndex);
|
|
103
|
+
componentRef.instance.branch = source;
|
|
104
|
+
componentRef.instance.parentHost = targetHost;
|
|
105
|
+
if (targetIndex < sourceIndex &&
|
|
106
|
+
sourceHost.length > nodesInSource &&
|
|
107
|
+
arraysAreEqual(sourceParent.getCoordinates(), targetParentCoordinates)) {
|
|
108
|
+
sourceHost.remove(sourceIndex + 1);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
sourceHost.remove(sourceIndex);
|
|
112
|
+
}
|
|
113
|
+
//Update the tree data
|
|
114
|
+
this.rebuildTreeData();
|
|
115
|
+
//Publish drop data
|
|
116
|
+
this.drops$.next({
|
|
117
|
+
target: source.data,
|
|
118
|
+
oldParent: sourceParent.data,
|
|
119
|
+
oldIndex: sourceIndex,
|
|
120
|
+
newParent: targetParent.data,
|
|
121
|
+
newIndex: newIndex
|
|
122
|
+
});
|
|
123
|
+
this.cleanupSignal$.next(false);
|
|
124
|
+
}
|
|
125
|
+
/** Initializes the service and renders the tree.
|
|
126
|
+
* @param host - The ViewContainerRef into which the tree will be rendered.
|
|
127
|
+
* @param data - The data array that was passed in to LimbleTreeRoot, which is
|
|
128
|
+
* the users' representation of the tree
|
|
129
|
+
* @param options - The options object that was passed in to LimbleTreeRoot
|
|
130
|
+
*/
|
|
131
|
+
init(host, data, options, itemsPerPage, page) {
|
|
132
|
+
this.host = host;
|
|
133
|
+
this.originalData = data;
|
|
134
|
+
this.treeOptions = this.processOptions(options, itemsPerPage, page);
|
|
135
|
+
if (this.treeOptions.listMode === true) {
|
|
136
|
+
let start = this.treeOptions.itemsPerPage * (this.treeOptions.page - 1);
|
|
137
|
+
if (isNaN(start)) {
|
|
138
|
+
//This catches the case where itemsPerPage was not passed by the user,
|
|
139
|
+
//causing `start` to equal infinity*0, which is NaN.
|
|
140
|
+
start = 0;
|
|
141
|
+
}
|
|
142
|
+
const end = start + this.treeOptions.itemsPerPage;
|
|
143
|
+
this.treeData = this.originalData.slice(start, end);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
this.treeData = [...this.originalData];
|
|
147
|
+
}
|
|
148
|
+
this.render();
|
|
149
|
+
}
|
|
150
|
+
cleanup(rebuild = false) {
|
|
151
|
+
if (rebuild) {
|
|
152
|
+
this.rebuildTreeData();
|
|
153
|
+
}
|
|
154
|
+
if (this.treeData?.length === 0) {
|
|
155
|
+
//We do a full render here because it isn't actually any slower
|
|
156
|
+
//when there are no nodes, and it is a little more straightforward
|
|
157
|
+
this.render();
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
this.changes$.next(null);
|
|
161
|
+
this.dropZoneService.update();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/** Renders the entire tree from root to leaves */
|
|
165
|
+
render() {
|
|
166
|
+
if (this.host === undefined ||
|
|
167
|
+
this.treeData === undefined ||
|
|
168
|
+
this.treeOptions === undefined) {
|
|
169
|
+
throw new Error("TreeModel not initialized");
|
|
170
|
+
}
|
|
171
|
+
this.treeConstructionStatus.ready(false);
|
|
172
|
+
this.host.clear();
|
|
173
|
+
this.dropZoneService.restart();
|
|
174
|
+
this.placeholder$.next(false);
|
|
175
|
+
this.treeModel = new Branch(null);
|
|
176
|
+
if (this.treeData.length === 0) {
|
|
177
|
+
//Tree is empty, but we have to to have something there so other trees' items can be dropped into it
|
|
178
|
+
this.placeholder$.next(true);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
for (const node of this.treeData) {
|
|
182
|
+
const branch = new Branch(node);
|
|
183
|
+
this.treeModel.appendChild(branch);
|
|
184
|
+
}
|
|
185
|
+
for (const branch of this.treeModel.getChildren()) {
|
|
186
|
+
const componentRef = this.componentCreatorService.appendComponent(LimbleTreeNodeComponent, this.host);
|
|
187
|
+
componentRef.instance.branch = branch;
|
|
188
|
+
componentRef.instance.parentHost = this.host;
|
|
189
|
+
//The LimbleTreeNodeComponent will (indirectly) call the `renderBranch` method of this service to render
|
|
190
|
+
//its own children
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
this.treeConstructionStatus.ready(true);
|
|
194
|
+
this.changes$.next(null);
|
|
195
|
+
this.dropZoneService.init(this.treeModel, this.treeOptions);
|
|
196
|
+
}
|
|
197
|
+
/** Renders a branch of the tree and all of its descendants */
|
|
198
|
+
renderBranch(host, branch) {
|
|
199
|
+
if (this.treeModel === undefined) {
|
|
200
|
+
throw new Error("TreeModel not initialized");
|
|
201
|
+
}
|
|
202
|
+
host.clear();
|
|
203
|
+
branch.clearChildren();
|
|
204
|
+
for (const node of branch.data?.nodes ?? []) {
|
|
205
|
+
const newBranch = new Branch(node);
|
|
206
|
+
branch.appendChild(newBranch);
|
|
207
|
+
const componentRef = this.componentCreatorService.appendComponent(LimbleTreeNodeComponent, host);
|
|
208
|
+
componentRef.instance.branch = newBranch;
|
|
209
|
+
componentRef.instance.parentHost = host;
|
|
210
|
+
//The LimbleTreeNodeComponent will (indirectly) call the `renderBranch` method of this service to render
|
|
211
|
+
//its own children
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
processOptions(options = {}, itemsPerPage = Infinity, page = 1) {
|
|
215
|
+
if (options.listMode === true &&
|
|
216
|
+
options.allowNesting !== undefined &&
|
|
217
|
+
options.allowNesting !== false) {
|
|
218
|
+
console.warn("The value of `allowNesting` will be ignored; it must be false when `listMode` is true");
|
|
219
|
+
}
|
|
220
|
+
const result = {
|
|
221
|
+
defaultComponent: options.defaultComponent,
|
|
222
|
+
indent: options.indent ?? INDENT,
|
|
223
|
+
allowNesting: options.listMode !== true && (options.allowNesting ?? true),
|
|
224
|
+
allowDragging: options.allowDragging ?? true,
|
|
225
|
+
allowDrop: options.allowDrop ?? (() => true),
|
|
226
|
+
listMode: options.listMode ?? false,
|
|
227
|
+
itemsPerPage: options.listMode ? itemsPerPage : undefined,
|
|
228
|
+
page: options.listMode ? page : undefined
|
|
229
|
+
};
|
|
230
|
+
return result;
|
|
231
|
+
}
|
|
232
|
+
rebuildTreeData() {
|
|
233
|
+
if (this.originalData === undefined ||
|
|
234
|
+
this.treeData === undefined ||
|
|
235
|
+
this.treeOptions === undefined ||
|
|
236
|
+
this.host === undefined) {
|
|
237
|
+
throw new Error("Tree data not initialized");
|
|
238
|
+
}
|
|
239
|
+
this.treeData = [];
|
|
240
|
+
for (const branch of this.treeModel.getChildren()) {
|
|
241
|
+
this.treeData.push(this.rebuildBranch(branch));
|
|
242
|
+
}
|
|
243
|
+
if (this.treeOptions.listMode === true &&
|
|
244
|
+
this.treeOptions.itemsPerPage < Infinity) {
|
|
245
|
+
const itemsPerPage = this.treeOptions.itemsPerPage;
|
|
246
|
+
const start = itemsPerPage * (this.treeOptions.page - 1);
|
|
247
|
+
this.originalData.splice(start, itemsPerPage, ...this.treeData);
|
|
248
|
+
if (this.treeData.length !== itemsPerPage) {
|
|
249
|
+
let action = false;
|
|
250
|
+
if (this.treeData.length < itemsPerPage &&
|
|
251
|
+
start + itemsPerPage <= this.originalData.length) {
|
|
252
|
+
//The current page does not have enough nodes. Add some to the view from the next page.
|
|
253
|
+
const count = itemsPerPage - this.treeData.length;
|
|
254
|
+
for (let index = itemsPerPage - 1; index < itemsPerPage + count - 1; index++) {
|
|
255
|
+
const branch = new Branch(this.originalData[start + index]);
|
|
256
|
+
this.treeModel.appendChild(branch);
|
|
257
|
+
const componentRef = this.componentCreatorService.appendComponent(LimbleTreeNodeComponent, this.host);
|
|
258
|
+
componentRef.instance.branch = branch;
|
|
259
|
+
componentRef.instance.parentHost = this.host;
|
|
260
|
+
}
|
|
261
|
+
action = true;
|
|
262
|
+
}
|
|
263
|
+
else if (this.treeData.length > itemsPerPage) {
|
|
264
|
+
//The current page has too many nodes. Remove some of them from the view.
|
|
265
|
+
const count = this.treeData.length - itemsPerPage;
|
|
266
|
+
for (let index = itemsPerPage + count - 1; index >= itemsPerPage; index--) {
|
|
267
|
+
this.treeModel.removeChild(index);
|
|
268
|
+
this.host.remove(index);
|
|
269
|
+
}
|
|
270
|
+
action = true;
|
|
271
|
+
}
|
|
272
|
+
if (action === true) {
|
|
273
|
+
const end = start + itemsPerPage;
|
|
274
|
+
this.treeData = this.originalData.slice(start, end);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
this.originalData.length = 0;
|
|
280
|
+
this.originalData.push(...this.treeData);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
rebuildBranch(branch) {
|
|
284
|
+
const temp = branch.data;
|
|
285
|
+
temp.nodes = [];
|
|
286
|
+
for (const child of branch.getChildren()) {
|
|
287
|
+
temp.nodes.push(this.rebuildBranch(child));
|
|
288
|
+
}
|
|
289
|
+
return temp;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
TreeService.ɵfac = function TreeService_Factory(t) { return new (t || TreeService)(i0.ɵɵinject(i1.ComponentCreatorService), i0.ɵɵinject(i2.DropZoneService), i0.ɵɵinject(i3.DragStateService), i0.ɵɵinject(i4.TreeConstructionStatus)); };
|
|
293
|
+
TreeService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: TreeService, factory: TreeService.ɵfac });
|
|
294
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TreeService, [{
|
|
295
|
+
type: Injectable
|
|
296
|
+
}], function () { return [{ type: i1.ComponentCreatorService }, { type: i2.DropZoneService }, { type: i3.DragStateService }, { type: i4.TreeConstructionStatus }]; }, null); })();
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbGltYmxlLXRyZWUvc3JjL2xpYi9saW1ibGUtdHJlZS1yb290L3RyZWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUEwQixNQUFNLGVBQWUsQ0FBQztBQUduRSxPQUFPLEVBQUUsTUFBTSxFQUFxQixNQUFNLG1CQUFtQixDQUFDO0FBQzlELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBRXpGLE9BQU8sRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBK0RyRSxnREFBZ0Q7QUFDaEQsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQWtEekIsTUFBTSxPQUFPLFdBQVc7SUFjckIsWUFDb0IsdUJBQWdELEVBQ2hELGVBQWdDLEVBQ2hDLGdCQUFrQyxFQUNsQyxzQkFBOEM7UUFIOUMsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF5QjtRQUNoRCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBRS9ELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMs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O1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZixDQUFDOztzRUE5VlMsV0FBVztpRUFBWCxXQUFXLFdBQVgsV0FBVzt1RkFBWCxXQUFXO2NBRHZCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBUeXBlLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvbXBvbmVudENyZWF0b3JTZXJ2aWNlIH0gZnJvbSBcIi4uL3NpbmdsZXRvbnMvY29tcG9uZW50LWNyZWF0b3Iuc2VydmljZVwiO1xuaW1wb3J0IHsgRHJvcFpvbmVTZXJ2aWNlIH0gZnJvbSBcIi4vZHJvcC16b25lLnNlcnZpY2VcIjtcbmltcG9ydCB7IEJyYW5jaCwgQnJhbmNoQ29vcmRpbmF0ZXMgfSBmcm9tIFwiLi4vY2xhc3Nlcy9CcmFuY2hcIjtcbmltcG9ydCB7IExpbWJsZVRyZWVOb2RlQ29tcG9uZW50IH0gZnJvbSBcIi4uL2xpbWJsZS10cmVlLW5vZGUvbGltYmxlLXRyZWUtbm9kZS5jb21wb25lbnRcIjtcbmltcG9ydCB7IERyYWdTdGF0ZVNlcnZpY2UgfSBmcm9tIFwiLi4vc2luZ2xldG9ucy9kcmFnLXN0YXRlLnNlcnZpY2VcIjtcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgRU1QVFksIFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgYXJyYXlzQXJlRXF1YWwgfSBmcm9tIFwiLi4vdXRpbFwiO1xuaW1wb3J0IHsgZGVib3VuY2UsIGRlYm91bmNlVGltZSwgZmlsdGVyLCB0YXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IFRyZWVDb25zdHJ1Y3Rpb25TdGF0dXMgfSBmcm9tIFwiLi90cmVlLWNvbnN0cnVjdGlvbi1zdGF0dXMuc2VydmljZVwiO1xuXG4vKiogQW4gb2JqZWN0IGRlc2NyaWJpbmcgYSBub2RlIG9mIHRoZSB0cmVlICovXG5leHBvcnQgaW50ZXJmYWNlIExpbWJsZVRyZWVOb2RlIHtcbiAgIC8qKiBBIGxpc3Qgb2Ygbm9kZXMgdG8gYmUgcmVuZGVyZWQgXCJ1bmRlclwiIHRoaXMgb25lLCBvbmUgbGV2ZWwgZGVlcGVyIGluIHRoZSB0cmVlLiAqL1xuICAgbm9kZXM/OiBMaW1ibGVUcmVlRGF0YTtcbiAgIC8vIC8qKiBBIGN1c3RvbSBkYXRhIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIGludG8gdGhlIGNvbXBvbmVudCBhcyBhbiBgSW5wdXQoKWAgYmluZGluZyBjYWxsZWQgYG5vZGVEYXRhYCAqL1xuICAgLy8gZGF0YTogdW5rbm93bjtcbiAgIC8qKiBBbiBvYmplY3QgdGhhdCBkZXNjcmliZXMgdGhlIGNvbXBvbmVudCB3aGljaCB3aWxsIHJlcHJlc2VudCB0aGlzIG5vZGUgaW4gdGhlIHZpc3VhbCB0cmVlICovXG4gICBjb21wb25lbnQ/OiBDb21wb25lbnRPYmo7XG4gICBjb2xsYXBzZWQ/OiBib29sZWFuO1xuICAgW2luZGV4OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG4vKiogQW4gb2JqZWN0IHRoYXQgdGhlIGxpbWJsZS10cmVlLXJvb3QgY29tcG9uZW50IHVzZXMgdG8gYnVpbGQgdGhlIHRyZWUgKi9cbmV4cG9ydCB0eXBlIExpbWJsZVRyZWVEYXRhID0gQXJyYXk8TGltYmxlVHJlZU5vZGU+O1xuXG4vKiogQSBncm91cCBvZiBzZXR0aW5ncyBmb3IgY2hhbmdpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHRyZWUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGltYmxlVHJlZU9wdGlvbnMge1xuICAgLyoqIFRoZSBjb21wb25lbnQgb2JqZWN0IHRvIHVzZSBpZiBvbmUgaXMgbm90IHNwZWNpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIG5vZGUgKi9cbiAgIGRlZmF1bHRDb21wb25lbnQ/OiBDb21wb25lbnRPYmo7XG4gICAvKiogVGhlIG51bWJlciBvZiBwaXhlbHMgdG8gaW5kZW50IGVhY2ggbGV2ZWwgb2YgdGhlIHRyZWUuIERlZmF1bHRzIHRvIDQ1ICovXG4gICBpbmRlbnQ/OiBudW1iZXI7XG4gICAvKipcbiAgICAqIFdoZXRoZXIgdG8gYWxsb3cgXCJuZXN0aW5nXCIgKHBsYWNpbmcgYSBub2RlIG9uZSBsZXZlbCBkZWVwZXIgdGhhbiBjdXJyZW50bHkgZXhpc3RzIG9uIHRoZSBicmFuY2gpLlxuICAgICogV2hlbiB0aGlzIGlzIGEgYm9vbGVhbiwgaXQgYXBwbGllcyB0byBhbGwgbm9kZXMuIFdoZW4gdGhpcyBpcyBhIGZ1bmN0aW9uLCB0aGUgbm9kZSBpbiBxdWVzdGlvblxuICAgICogaXMgcGFzc2VkIGluLiBEZWZhdWx0cyB0byB0cnVlLlxuICAgICovXG4gICBhbGxvd05lc3Rpbmc/OiBib29sZWFuIHwgKChub2RlRGF0YTogTGltYmxlVHJlZU5vZGUpID0+IGJvb2xlYW4pO1xuICAgLyoqXG4gICAgKiBXaGV0aGVyIHRvIGFsbG93IGEgbm9kZSB0byBiZSBkcmFnZ2VkLiBXaGVuIHRoaXMgaXMgYSBib29sZWFuLCBpdCBhcHBsaWVzIHRvIGFsbCBub2Rlcy4gV2hlbiB0aGlzXG4gICAgKiBpcyBhIGZ1bmN0aW9uLCB0aGUgbm9kZSBpbiBxdWVzdGlvbiBpcyBwYXNzZWQgaW4uIERlZmF1bHRzIHRvIHRydWUuXG4gICAgKi9cbiAgIGFsbG93RHJhZ2dpbmc/OiBib29sZWFuIHwgKChub2RlRGF0YTogTGltYmxlVHJlZU5vZGUpID0+IGJvb2xlYW4pO1xuICAgLyoqIEEgY2FsbGJhY2sgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBzb3VyY2VOb2RlIGNhbiBiZSBkcm9wcGVkIGF0IGEgcGFydGljdWxhciBsb2NhdGlvbi4gKi9cbiAgIGFsbG93RHJvcD86IChcbiAgICAgIHNvdXJjZU5vZGU6IExpbWJsZVRyZWVOb2RlLFxuICAgICAgcHJvcG9zZWRQYXJlbnQ6IExpbWJsZVRyZWVOb2RlIHwgbnVsbCxcbiAgICAgIHByb3Bvc2VkSW5kZXg6IG51bWJlclxuICAgKSA9PiBib29sZWFuO1xuICAgLyoqIFdoZW4gc2V0IHRvIHRydWUsIGxpc3QgbW9kZSB3aWxsIGVuZm9yY2UgYSBmbGF0IHRyZWUgc3RydWN0dXJlLCBtZWFuaW5nIHRoZXJlXG4gICAgKiBjYW4gb25seSBiZSBvbmUgbGV2ZWwgb2YgdGhlIHRyZWUuIGBhbGxvd05lc3RpbmdgIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIGBmYWxzZWBcbiAgICAqIGFuZCBhbnkgY2hpbGRyZW4gd2lsbCBiZSBkZWxldGVkLlxuICAgICpcbiAgICAqIFRoaXMgbW9kZSBjYW4gYmUgdXNlZCB3aGVuIHRoZSBzYW1lIGR5bmFtaWMgZHJhZyBhbmQgZHJvcCBmdW5jdGlvbmFsaXR5IG9mXG4gICAgKiB0aGUgdHJlZSBpcyBkZXNpcmVkLCBidXQgdGhlIHRyZWUgc3RydWN0dXJlIGl0c2VsZiBpcyBub3QgbmVjZXNzYXJ5LiBUaGlzXG4gICAgKiBhbHNvIG9wZW5zIHVwIHRoZSBwYWdpbmF0aW9uIEFQSSBvbiB0aGUgbGltYmxlLXRyZWUtcm9vdCBjb21wb25lbnQuIFNlZSB0aGVcbiAgICAqIFJFQURNRSBmb3IgZGV0YWlscyBvbiBwYWdpbmF0aW9uLlxuICAgICovXG4gICBsaXN0TW9kZT86IGJvb2xlYW47XG59XG5cbi8qKiBBbiBvYmplY3QgdGhhdCByZWZlcmVuY2VzIHRoZSBjb21wb25lbnQgdG8gYmUgcmVuZGVyZWQgYW5kIGl0cyBiaW5kaW5ncyAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRPYmoge1xuICAgLyoqIFRoZSBjb21wb25lbnQgY2xhc3MgKi9cbiAgIGNsYXNzOiBUeXBlPHVua25vd24+O1xuICAgLyoqIFRoZSBiaW5kaW5ncyAoaW5wdXRzIGFuZCBvdXRwdXRzKSBvZiB0aGUgY2xhc3MgKi9cbiAgIGJpbmRpbmdzPzoge1xuICAgICAgW2luZGV4OiBzdHJpbmddOiB1bmtub3duO1xuICAgfTtcbn1cblxuLyoqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYGluZGVudGAgb3B0aW9uICovXG5leHBvcnQgY29uc3QgSU5ERU5UID0gNDU7XG5cbi8qKiBBbiBvcHRpb25zIG9iamVjdCB3aXRoIGRlZmF1bHQgdmFsdWVzIGxvYWRlZCB3aGVyZSBhcHBsaWNhYmxlICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NlZE9wdGlvbnNCYXNlIGV4dGVuZHMgTGltYmxlVHJlZU9wdGlvbnMge1xuICAgZGVmYXVsdENvbXBvbmVudD86IENvbXBvbmVudE9iajtcbiAgIGluZGVudDogbnVtYmVyO1xuICAgYWxsb3dOZXN0aW5nOiBib29sZWFuIHwgKChub2RlRGF0YTogTGltYmxlVHJlZU5vZGUpID0+IGJvb2xlYW4pO1xuICAgYWxsb3dEcmFnZ2luZzogYm9vbGVhbiB8ICgobm9kZURhdGE6IExpbWJsZVRyZWVOb2RlKSA9PiBib29sZWFuKTtcbiAgIGFsbG93RHJvcDogKFxuICAgICAgc291cmNlTm9kZTogTGltYmxlVHJlZU5vZGUsXG4gICAgICBwcm9wb3NlZFBhcmVudDogTGltYmxlVHJlZU5vZGUgfCBudWxsLFxuICAgICAgcHJvcG9zZWRJbmRleDogbnVtYmVyXG4gICApID0+IGJvb2xlYW47XG4gICBsaXN0TW9kZTogYm9vbGVhbjtcbiAgIGl0ZW1zUGVyUGFnZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgcGFnZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NlZE9wdGlvbnNXaXRoUGFnaW5hdGlvbiBleHRlbmRzIFByb2Nlc3NlZE9wdGlvbnNCYXNlIHtcbiAgIGxpc3RNb2RlOiB0cnVlO1xuICAgaXRlbXNQZXJQYWdlOiBudW1iZXI7XG4gICBwYWdlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc2VkT3B0aW9uc1dpdGhvdXRQYWdpbmF0aW9uXG4gICBleHRlbmRzIFByb2Nlc3NlZE9wdGlvbnNCYXNlIHtcbiAgIGxpc3RNb2RlOiBmYWxzZTtcbiAgIGl0ZW1zUGVyUGFnZTogdW5kZWZpbmVkO1xuICAgcGFnZTogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgdHlwZSBQcm9jZXNzZWRPcHRpb25zID1cbiAgIHwgUHJvY2Vzc2VkT3B0aW9uc1dpdGhQYWdpbmF0aW9uXG4gICB8IFByb2Nlc3NlZE9wdGlvbnNXaXRob3V0UGFnaW5hdGlvbjtcblxuLyoqIHRoZSB2YWx1ZSBlbWl0dGVkIGZyb20gdGhlIHJvb3QgY29tcG9uZW50IGFmdGVyIGEgbm9kZSBpcyBkcm9wcGVkICovXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVEcm9wIHtcbiAgIC8qKiBUaGUgbm9kZSB0aGF0IHdhcyBkcm9wcGVkICovXG4gICB0YXJnZXQ6IExpbWJsZVRyZWVOb2RlO1xuICAgLyoqIHRoZSB0YXJnZXQncyBwYXJlbnQgYmVmb3JlIHRoZSBkcmFnIGFuZCBkcm9wLCBvciBudWxsIGlmIGl0IHdhcyBhIHRvcC1sZXZlbCBub2RlICovXG4gICBvbGRQYXJlbnQ6IExpbWJsZVRyZWVOb2RlIHwgbnVsbDtcbiAgIC8qKiB0aGUgaW5kZXggb2YgdGhlIG5vZGUgYmVmb3JlIHRoZSBkcmFnIGFuZCBkcm9wIHJlbGF0aXZlIHRvIGl0cyBvbGQgc2libGluZ3MgKi9cbiAgIG9sZEluZGV4OiBudW1iZXI7XG4gICAvKiogdGhlIHRhcmdldCdzIHBhcmVudCBhZnRlciB0aGUgZHJhZyBhbmQgZHJvcCwgb3IgbnVsbCBpZiBpdCBpcyBub3cgYSB0b3AtbGV2ZWwgbm9kZSAqL1xuICAgbmV3UGFyZW50OiBMaW1ibGVUcmVlTm9kZSB8IG51bGw7XG4gICAvKiogdGhlIGluZGV4IG9mIHRoZSBub2RlIGFmdGVyIHRoZSBkcmFnIGFuZCBkcm9wIHJlbGF0aXZlIHRvIGl0cyBuZXcgc2libGluZ3MgKi9cbiAgIG5ld0luZGV4OiBudW1iZXI7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUcmVlU2VydmljZSB7XG4gICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlcyQ6IFN1YmplY3Q8bnVsbD47XG4gICBwdWJsaWMgcmVhZG9ubHkgZHJvcHMkOiBTdWJqZWN0PFRyZWVEcm9wPjtcbiAgIHB1YmxpYyBob3N0OiBWaWV3Q29udGFpbmVyUmVmIHwgdW5kZWZpbmVkO1xuICAgcHVibGljIHRyZWVEYXRhOiBMaW1ibGVUcmVlRGF0YSB8IHVuZGVmaW5lZDtcbiAgIC8qKiBUaGlzIHNob3VsZCBuZXZlciBiZSByZWFzc2lnbmVkLiBJdCBpcyBhc3NpZ25lZCBpbiBpbml0KCkgYW5kIG5vIHdoZXJlIGVsc2UuIFdlIG5lZWQgdG8ga2VlcCB0aGUgcmVmZXJlbmNlIGZyb20gYnJlYWtpbmcuICovXG4gICBwcml2YXRlIG9yaWdpbmFsRGF0YTogTGltYmxlVHJlZURhdGEgfCB1bmRlZmluZWQ7XG4gICBwdWJsaWMgdHJlZU9wdGlvbnM6IFByb2Nlc3NlZE9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICBwdWJsaWMgdHJlZU1vZGVsOiBCcmFuY2g8YW55PjtcbiAgIHByaXZhdGUgcGxhY2Vob2xkZXI6IGJvb2xlYW47XG4gICBwdWJsaWMgY2FwdHVyZWQ6IGJvb2xlYW47XG4gICBwdWJsaWMgcmVhZG9ubHkgY2xlYW51cFNpZ25hbCQ6IFN1YmplY3Q8Ym9vbGVhbj47XG4gICBwdWJsaWMgcGxhY2Vob2xkZXIkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XG5cbiAgIGNvbnN0cnVjdG9yKFxuICAgICAgcHJpdmF0ZSByZWFkb25seSBjb21wb25lbnRDcmVhdG9yU2VydmljZTogQ29tcG9uZW50Q3JlYXRvclNlcnZpY2UsXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IGRyb3Bab25lU2VydmljZTogRHJvcFpvbmVTZXJ2aWNlLFxuICAgICAgcHJpdmF0ZSByZWFkb25seSBkcmFnU3RhdGVTZXJ2aWNlOiBEcmFnU3RhdGVTZXJ2aWNlLFxuICAgICAgcHJpdmF0ZSByZWFkb25seSB0cmVlQ29uc3RydWN0aW9uU3RhdHVzOiBUcmVlQ29uc3RydWN0aW9uU3RhdHVzXG4gICApIHtcbiAgICAgIHRoaXMuY2hhbmdlcyQgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgdGhpcy5kcm9wcyQgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgdGhpcy50cmVlTW9kZWwgPSBuZXcgQnJhbmNoKG51bGwpO1xuICAgICAgdGhpcy5wbGFjZWhvbGRlciA9IGZhbHNlO1xuICAgICAgdGhpcy5jYXB0dXJlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5jbGVhbnVwU2lnbmFsJCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICBsZXQgcmVidWlsZCA9IGZhbHNlO1xuICAgICAgbGV0IHRyZWVJc1N0YWJsZSA9IGZhbHNlO1xuICAgICAgY29uc3QgdHJlZUlzU3RhYmxlJCA9IHRoaXMudHJlZUNvbnN0cnVjdGlvblN0YXR1cy5zdGFibGUkLnBpcGUoXG4gICAgICAgICB0YXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0cmVlSXNTdGFibGUgPSB2YWx1ZTtcbiAgICAgICAgIH0pLFxuICAgICAgICAgZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgPT09IHRydWUpXG4gICAgICApO1xuICAgICAgdGhpcy5jbGVhbnVwU2lnbmFsJFxuICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICB0YXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICByZWJ1aWxkID0gdmFsdWU7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGRlYm91bmNlKCgpID0+IHtcbiAgICAgICAgICAgICAgIGlmICh0cmVlSXNTdGFibGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgIC8vSWYgdHJlZSBpcyBzdGFibGUsIGNvbnRpbnVlIHJpZ2h0IGF3YXlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIC8vSWYgdHJlZSBpcyBub3Qgc3RhYmxlLCB3YWl0IGZvciBpdCB0byBiZWNvbWUgc28uXG4gICAgICAgICAgICAgICByZXR1cm4gdHJlZUlzU3RhYmxlJDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgLy9XZSB1c2UgdGhpcyB0aW1lZCBkZWJvdW5jZSB0byB0aHJvdHRsZSBjaGFpbmVkIGRlc3RydWN0aW9uIG9mIGNvbXBvbmVudHNcbiAgICAgICAgICAgIGRlYm91bmNlVGltZSg1KVxuICAgICAgICAgKVxuICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXAocmVidWlsZCk7XG4gICAgICAgICAgICByZWJ1aWxkID0gZmFsc2U7XG4gICAgICAgICB9KTtcbiAgICAgIHRoaXMucGxhY2Vob2xkZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgICB0aGlzLnBsYWNlaG9sZGVyJC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICB0aGlzLnBsYWNlaG9sZGVyID0gdmFsdWU7XG4gICAgICB9KTtcbiAgIH1cblxuICAgcHVibGljIGRyb3Aoc291cmNlOiBCcmFuY2g8YW55PiwgdGFyZ2V0Q29vcmRpbmF0ZXM6IEJyYW5jaENvb3JkaW5hdGVzKSB7XG4gICAgICAvL3ByZXBcbiAgICAgIGNvbnN0IHNvdXJjZVBhcmVudCA9IHNvdXJjZS5nZXRQYXJlbnQoKTtcbiAgICAgIGlmIChzb3VyY2VQYXJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbid0IGRyb3Agcm9vdCBvZiB0cmVlXCIpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc291cmNlSW5kZXggPSBzb3VyY2UuZ2V0SW5kZXgoKTtcbiAgICAgIGlmIChzb3VyY2VJbmRleCA9PT0gdW5kZWZpbmVkIHx8IHNvdXJjZUluZGV4ID09PSBudWxsKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgbW92ZSB0aGUgaGlkZGVuIHJvb3Qgbm9kZVwiKTtcbiAgICAgIH1cbiAgICAgIGxldCB0YXJnZXRQYXJlbnRDb29yZGluYXRlczogQnJhbmNoQ29vcmRpbmF0ZXM7XG4gICAgICBsZXQgbmV3SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyID09PSB0cnVlKSB7XG4gICAgICAgICB0YXJnZXRQYXJlbnRDb29yZGluYXRlcyA9IFtdO1xuICAgICAgICAgbmV3SW5kZXggPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIHRhcmdldFBhcmVudENvb3JkaW5hdGVzID0gWy4uLnRhcmdldENvb3JkaW5hdGVzXTtcbiAgICAgICAgIG5ld0luZGV4ID0gdGFyZ2V0UGFyZW50Q29vcmRpbmF0ZXMucG9wKCk7XG4gICAgICB9XG4gICAgICBpZiAobmV3SW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidGFyZ2V0IGNvb3JkaW5hdGVzIGFyZSBlbXB0eVwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldFBhcmVudCA9IHRoaXMudHJlZU1vZGVsLmdldERlc2NlbmRhbnQoXG4gICAgICAgICB0YXJnZXRQYXJlbnRDb29yZGluYXRlc1xuICAgICAgKTtcbiAgICAgIGlmICh0YXJnZXRQYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY291bGQgbm90IGdldCB0byB0YXJnZXRcIik7XG4gICAgICB9XG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmRyb3Bab25lU2VydmljZS5nZXREcm9wWm9uZSh0YXJnZXRDb29yZGluYXRlcyk7XG4gICAgICBjb25zdCB0YXJnZXRJbmRleCA9IHRhcmdldD8uZ2V0TG9jYXRpb24oKS5pbnNlcnRJbmRleDtcbiAgICAgIGNvbnN0IHRhcmdldEhvc3QgPSB0YXJnZXQ/LmdldEhvc3QoKTtcbiAgICAgIGNvbnN0IHNvdXJjZUhvc3QgPSB0aGlzLmRyYWdTdGF0ZVNlcnZpY2UuZ2V0RGF0YSgpPy5wYXJlbnRDb250YWluZXI7XG4gICAgICBpZiAodGhpcy5wbGFjZWhvbGRlciA9PT0gdHJ1ZSkge1xuICAgICAgICAgdGhpcy5wbGFjZWhvbGRlciQubmV4dChmYWxzZSk7XG4gICAgICB9XG4gICAgICAvL0NoYW5nZSB0aGUgdHJlZU1vZGVsXG4gICAgICB0YXJnZXRQYXJlbnQuaW5zZXJ0Q2hpbGQoc291cmNlLCBuZXdJbmRleCk7XG4gICAgICAvL1ByZXBhcmUgdG8gdXBkYXRlIHRoZSB2aWV3XG4gICAgICBpZiAoXG4gICAgICAgICB0YXJnZXRIb3N0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgIHNvdXJjZUhvc3QgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgdGFyZ2V0SW5kZXggPT09IHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgICAvL0hpdHRpbmcgdGhpcyBtZWFucyB0aGVyZSBpcyBhIGJ1ZywgYnV0IG5vdCBhIGZhdGFsIG9uZS5cbiAgICAgICAgIC8vSnVzdCByZW5kZXIgdGhlIHdob2xlIHRyZWUgYWdhaW4uXG4gICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBcIkNvdWxkIG5vdCBwZXJmb3JtIGEgcHJlY2lzZSB1cGRhdGUuIFJlLXJlbmRlcmluZyB0aGUgZW50aXJlIHRyZWUgaW5zdGVhZFwiXG4gICAgICAgICApO1xuICAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgIHRoaXMuY2hhbmdlcyQubmV4dChudWxsKTtcbiAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vVXBkYXRlIHRoZSB2aWV3XG4gICAgICBjb25zdCBub2Rlc0luU291cmNlID0gc291cmNlSG9zdC5sZW5ndGg7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLmNvbXBvbmVudENyZWF0b3JTZXJ2aWNlLmFwcGVuZENvbXBvbmVudChcbiAgICAgICAgIExpbWJsZVRyZWVOb2RlQ29tcG9uZW50LFxuICAgICAgICAgdGFyZ2V0SG9zdCxcbiAgICAgICAgIG5ld0luZGV4XG4gICAgICApO1xuICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmJyYW5jaCA9IHNvdXJjZTtcbiAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5wYXJlbnRIb3N0ID0gdGFyZ2V0SG9zdDtcbiAgICAgIGlmIChcbiAgICAgICAgIHRhcmdldEluZGV4IDwgc291cmNlSW5kZXggJiZcbiAgICAgICAgIHNvdXJjZUhvc3QubGVuZ3RoID4gbm9kZXNJblNvdXJjZSAmJlxuICAgICAgICAgYXJyYXlzQXJlRXF1YWwoc291cmNlUGFyZW50LmdldENvb3JkaW5hdGVzKCksIHRhcmdldFBhcmVudENvb3JkaW5hdGVzKVxuICAgICAgKSB7XG4gICAgICAgICBzb3VyY2VIb3N0LnJlbW92ZShzb3VyY2VJbmRleCArIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIHNvdXJjZUhvc3QucmVtb3ZlKHNvdXJjZUluZGV4KTtcbiAgICAgIH1cbiAgICAgIC8vVXBkYXRlIHRoZSB0cmVlIGRhdGFcbiAgICAgIHRoaXMucmVidWlsZFRyZWVEYXRhKCk7XG4gICAgICAvL1B1Ymxpc2ggZHJvcCBkYXRhXG4gICAgICB0aGlzLmRyb3BzJC5uZXh0KHtcbiAgICAgICAgIHRhcmdldDogc291cmNlLmRhdGEsXG4gICAgICAgICBvbGRQYXJlbnQ6IHNvdXJjZVBhcmVudC5kYXRhIGFzIExpbWJsZVRyZWVOb2RlLFxuICAgICAgICAgb2xkSW5kZXg6IHNvdXJjZUluZGV4LFxuICAgICAgICAgbmV3UGFyZW50OiB0YXJnZXRQYXJlbnQuZGF0YSxcbiAgICAgICAgIG5ld0luZGV4OiBuZXdJbmRleFxuICAgICAgfSk7XG4gICAgICB0aGlzLmNsZWFudXBTaWduYWwkLm5leHQoZmFsc2UpO1xuICAgfVxuXG4gICAvKiogSW5pdGlhbGl6ZXMgdGhlIHNlcnZpY2UgYW5kIHJlbmRlcnMgdGhlIHRyZWUuXG4gICAgKiBAcGFyYW0gaG9zdCAtIFRoZSBWaWV3Q29udGFpbmVyUmVmIGludG8gd2hpY2ggdGhlIHRyZWUgd2lsbCBiZSByZW5kZXJlZC5cbiAgICAqIEBwYXJhbSBkYXRhIC0gVGhlIGRhdGEgYXJyYXkgdGhhdCB3YXMgcGFzc2VkIGluIHRvIExpbWJsZVRyZWVSb290LCB3aGljaCBpc1xuICAgICogdGhlIHVzZXJzJyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHJlZVxuICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIGluIHRvIExpbWJsZVRyZWVSb290XG4gICAgKi9cbiAgIHB1YmxpYyBpbml0KFxuICAgICAgaG9zdDogVmlld0NvbnRhaW5lclJlZixcbiAgICAgIGRhdGE6IExpbWJsZVRyZWVEYXRhLFxuICAgICAgb3B0aW9ucz86IExpbWJsZVRyZWVPcHRpb25zLFxuICAgICAgaXRlbXNQZXJQYWdlPzogbnVtYmVyLFxuICAgICAgcGFnZT86IG51bWJlclxuICAgKTogdm9pZCB7XG4gICAgICB0aGlzLmhvc3QgPSBob3N0O1xuICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSBkYXRhO1xuICAgICAgdGhpcy50cmVlT3B0aW9ucyA9IHRoaXMucHJvY2Vzc09wdGlvbnMob3B0aW9ucywgaXRlbXNQZXJQYWdlLCBwYWdlKTtcbiAgICAgIGlmICh0aGlzLnRyZWVPcHRpb25zLmxpc3RNb2RlID09PSB0cnVlKSB7XG4gICAgICAgICBsZXQgc3RhcnQgPVxuICAgICAgICAgICAgdGhpcy50cmVlT3B0aW9ucy5pdGVtc1BlclBhZ2UgKiAodGhpcy50cmVlT3B0aW9ucy5wYWdlIC0gMSk7XG4gICAgICAgICBpZiAoaXNOYU4oc3RhcnQpKSB7XG4gICAgICAgICAgICAvL1RoaXMgY2F0Y2hlcyB0aGUgY2FzZSB3aGVyZSBpdGVtc1BlclBhZ2Ugd2FzIG5vdCBwYXNzZWQgYnkgdGhlIHVzZXIsXG4gICAgICAgICAgICAvL2NhdXNpbmcgYHN0YXJ0YCB0byBlcXVhbCBpbmZpbml0eSowLCB3aGljaCBpcyBOYU4uXG4gICAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgICB9XG4gICAgICAgICBjb25zdCBlbmQgPSBzdGFydCArIHRoaXMudHJlZU9wdGlvbnMuaXRlbXNQZXJQYWdlO1xuICAgICAgICAgdGhpcy50cmVlRGF0YSA9IHRoaXMub3JpZ2luYWxEYXRhLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIHRoaXMudHJlZURhdGEgPSBbLi4udGhpcy5vcmlnaW5hbERhdGFdO1xuICAgICAgfVxuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgIH1cblxuICAgcHJpdmF0ZSBjbGVhbnVwKHJlYnVpbGQgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgaWYgKHJlYnVpbGQpIHtcbiAgICAgICAgIHRoaXMucmVidWlsZFRyZWVEYXRhKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy50cmVlRGF0YT8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAvL1dlIGRvIGEgZnVsbCByZW5kZXIgaGVyZSBiZWNhdXNlIGl0IGlzbid0IGFjdHVhbGx5IGFueSBzbG93ZXJcbiAgICAgICAgIC8vd2hlbiB0aGVyZSBhcmUgbm8gbm9kZXMsIGFuZCBpdCBpcyBhIGxpdHRsZSBtb3JlIHN0cmFpZ2h0Zm9yd2FyZFxuICAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICB0aGlzLmNoYW5nZXMkLm5leHQobnVsbCk7XG4gICAgICAgICB0aGlzLmRyb3Bab25lU2VydmljZS51cGRhdGUoKTtcbiAgICAgIH1cbiAgIH1cblxuICAgLyoqIFJlbmRlcnMgdGhlIGVudGlyZSB0cmVlIGZyb20gcm9vdCB0byBsZWF2ZXMgKi9cbiAgIHByaXZhdGUgcmVuZGVyKCkge1xuICAgICAgaWYgKFxuICAgICAgICAgdGhpcy5ob3N0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgIHRoaXMudHJlZURhdGEgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgdGhpcy50cmVlT3B0aW9ucyA9PT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRyZWVNb2RlbCBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgICB9XG4gICAgICB0aGlzLnRyZWVDb25zdHJ1Y3Rpb25TdGF0dXMucmVhZHkoZmFsc2UpO1xuICAgICAgdGhpcy5ob3N0LmNsZWFyKCk7XG4gICAgICB0aGlzLmRyb3Bab25lU2VydmljZS5yZXN0YXJ0KCk7XG4gICAgICB0aGlzLnBsYWNlaG9sZGVyJC5uZXh0KGZhbHNlKTtcbiAgICAgIHRoaXMudHJlZU1vZGVsID0gbmV3IEJyYW5jaChudWxsKTtcbiAgICAgIGlmICh0aGlzLnRyZWVEYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgLy9UcmVlIGlzIGVtcHR5LCBidXQgd2UgaGF2ZSB0byB0byBoYXZlIHNvbWV0aGluZyB0aGVyZSBzbyBvdGhlciB0cmVlcycgaXRlbXMgY2FuIGJlIGRyb3BwZWQgaW50byBpdFxuICAgICAgICAgdGhpcy5wbGFjZWhvbGRlciQubmV4dCh0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcy50cmVlRGF0YSkge1xuICAgICAgICAgICAgY29uc3QgYnJhbmNoID0gbmV3IEJyYW5jaChub2RlKTtcbiAgICAgICAgICAgIHRoaXMudHJlZU1vZGVsLmFwcGVuZENoaWxkKGJyYW5jaCk7XG4gICAgICAgICB9XG4gICAgICAgICBmb3IgKGNvbnN0IGJyYW5jaCBvZiB0aGlzLnRyZWVNb2RlbC5nZXRDaGlsZHJlbigpKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLmNvbXBvbmVudENyZWF0b3JTZXJ2aWNlLmFwcGVuZENvbXBvbmVudDxMaW1ibGVUcmVlTm9kZUNvbXBvbmVudD4oXG4gICAgICAgICAgICAgICBMaW1ibGVUcmVlTm9kZUNvbXBvbmVudCxcbiAgICAgICAgICAgICAgIHRoaXMuaG9zdFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5icmFuY2ggPSBicmFuY2g7XG4gICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UucGFyZW50SG9zdCA9IHRoaXMuaG9zdDtcbiAgICAgICAgICAgIC8vVGhlIExpbWJsZVRyZWVOb2RlQ29tcG9uZW50IHdpbGwgKGluZGlyZWN0bHkpIGNhbGwgdGhlIGByZW5kZXJCcmFuY2hgIG1ldGhvZCBvZiB0aGlzIHNlcnZpY2UgdG8gcmVuZGVyXG4gICAgICAgICAgICAvL2l0cyBvd24gY2hpbGRyZW5cbiAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudHJlZUNvbnN0cnVjdGlvblN0YXR1cy5yZWFkeSh0cnVlKTtcbiAgICAgIHRoaXMuY2hhbmdlcyQubmV4dChudWxsKTtcbiAgICAgIHRoaXMuZHJvcFpvbmVTZXJ2aWNlLmluaXQodGhpcy50cmVlTW9kZWwsIHRoaXMudHJlZU9wdGlvbnMpO1xuICAgfVxuXG4gICAvKiogUmVuZGVycyBhIGJyYW5jaCBvZiB0aGUgdHJlZSBhbmQgYWxsIG9mIGl0cyBkZXNjZW5kYW50cyAqL1xuICAgcHVibGljIHJlbmRlckJyYW5jaChob3N0OiBWaWV3Q29udGFpbmVyUmVmLCBicmFuY2g6IEJyYW5jaDxhbnk+KSB7XG4gICAgICBpZiAodGhpcy50cmVlTW9kZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVHJlZU1vZGVsIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICAgIH1cbiAgICAgIGhvc3QuY2xlYXIoKTtcbiAgICAgIGJyYW5jaC5jbGVhckNoaWxkcmVuKCk7XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgYnJhbmNoLmRhdGE/Lm5vZGVzID8/IFtdKSB7XG4gICAgICAgICBjb25zdCBuZXdCcmFuY2ggPSBuZXcgQnJhbmNoKG5vZGUpO1xuICAgICAgICAgYnJhbmNoLmFwcGVuZENoaWxkKG5ld0JyYW5jaCk7XG4gICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLmNvbXBvbmVudENyZWF0b3JTZXJ2aWNlLmFwcGVuZENvbXBvbmVudDxMaW1ibGVUcmVlTm9kZUNvbXBvbmVudD4oXG4gICAgICAgICAgICBMaW1ibGVUcmVlTm9kZUNvbXBvbmVudCxcbiAgICAgICAgICAgIGhvc3RcbiAgICAgICAgICk7XG4gICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuYnJhbmNoID0gbmV3QnJhbmNoO1xuICAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLnBhcmVudEhvc3QgPSBob3N0O1xuICAgICAgICAgLy9UaGUgTGltYmxlVHJlZU5vZGVDb21wb25lbnQgd2lsbCAoaW5kaXJlY3RseSkgY2FsbCB0aGUgYHJlbmRlckJyYW5jaGAgbWV0aG9kIG9mIHRoaXMgc2VydmljZSB0byByZW5kZXJcbiAgICAgICAgIC8vaXRzIG93biBjaGlsZHJlblxuICAgICAgfVxuICAgfVxuXG4gICBwcml2YXRlIHByb2Nlc3NPcHRpb25zKFxuICAgICAgb3B0aW9uczogTGltYmxlVHJlZU9wdGlvbnMgPSB7fSxcbiAgICAgIGl0ZW1zUGVyUGFnZTogbnVtYmVyID0gSW5maW5pdHksXG4gICAgICBwYWdlOiBudW1iZXIgPSAxXG4gICApOiBQcm9jZXNzZWRPcHRpb25zIHtcbiAgICAgIGlmIChcbiAgICAgICAgIG9wdGlvbnMubGlzdE1vZGUgPT09IHRydWUgJiZcbiAgICAgICAgIG9wdGlvbnMuYWxsb3dOZXN0aW5nICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIG9wdGlvbnMuYWxsb3dOZXN0aW5nICE9PSBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBcIlRoZSB2YWx1ZSBvZiBgYWxsb3dOZXN0aW5nYCB3aWxsIGJlIGlnbm9yZWQ7IGl0IG11c3QgYmUgZmFsc2Ugd2hlbiBgbGlzdE1vZGVgIGlzIHRydWVcIlxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdDogUHJvY2Vzc2VkT3B0aW9uc0Jhc2UgPSB7XG4gICAgICAgICBkZWZhdWx0Q29tcG9uZW50OiBvcHRpb25zLmRlZmF1bHRDb21wb25lbnQsXG4gICAgICAgICBpbmRlbnQ6IG9wdGlvbnMuaW5kZW50ID8/IElOREVOVCxcbiAgICAgICAgIGFsbG93TmVzdGluZzpcbiAgICAgICAgICAgIG9wdGlvbnMubGlzdE1vZGUgIT09IHRydWUgJiYgKG9wdGlvbnMuYWxsb3dOZXN0aW5nID8/IHRydWUpLFxuICAgICAgICAgYWxsb3dEcmFnZ2luZzogb3B0aW9ucy5hbGxvd0RyYWdnaW5nID8/IHRydWUsXG4gICAgICAgICBhbGxvd0Ryb3A6IG9wdGlvbnMuYWxsb3dEcm9wID8/ICgoKSA9PiB0cnVlKSxcbiAgICAgICAgIGxpc3RNb2RlOiBvcHRpb25zLmxpc3RNb2RlID8/IGZhbHNlLFxuICAgICAgICAgaXRlbXNQZXJQYWdlOiBvcHRpb25zLmxpc3RNb2RlID8gaXRlbXNQZXJQYWdlIDogdW5kZWZpbmVkLFxuICAgICAgICAgcGFnZTogb3B0aW9ucy5saXN0TW9kZSA/IHBhZ2UgOiB1bmRlZmluZWRcbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVzdWx0IGFzIFByb2Nlc3NlZE9wdGlvbnM7XG4gICB9XG5cbiAgIHByaXZhdGUgcmVidWlsZFRyZWVEYXRhKCk6IHZvaWQge1xuICAgICAgaWYgKFxuICAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgdGhpcy50cmVlRGF0YSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICB0aGlzLnRyZWVPcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgIHRoaXMuaG9zdCA9PT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRyZWUgZGF0YSBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgICB9XG4gICAgICB0aGlzLnRyZWVEYXRhID0gW107XG4gICAgICBmb3IgKGNvbnN0IGJyYW5jaCBvZiB0aGlzLnRyZWVNb2RlbC5nZXRDaGlsZHJlbigpKSB7XG4gICAgICAgICB0aGlzLnRyZWVEYXRhLnB1c2godGhpcy5yZWJ1aWxkQnJhbmNoKGJyYW5jaCkpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAgdGhpcy50cmVlT3B0aW9ucy5saXN0TW9kZSA9PT0gdHJ1ZSAmJlxuICAgICAgICAgdGhpcy50cmVlT3B0aW9ucy5pdGVtc1BlclBhZ2UgPCBJbmZpbml0eVxuICAgICAgKSB7XG4gICAgICAgICBjb25zdCBpdGVtc1BlclBhZ2UgPSB0aGlzLnRyZWVPcHRpb25zLml0ZW1zUGVyUGFnZTtcbiAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaXRlbXNQZXJQYWdlICogKHRoaXMudHJlZU9wdGlvbnMucGFnZSAtIDEpO1xuICAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEuc3BsaWNlKHN0YXJ0LCBpdGVtc1BlclBhZ2UsIC4uLnRoaXMudHJlZURhdGEpO1xuICAgICAgICAgaWYgKHRoaXMudHJlZURhdGEubGVuZ3RoICE9PSBpdGVtc1BlclBhZ2UpIHtcbiAgICAgICAgICAgIGxldCBhY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgIHRoaXMudHJlZURhdGEubGVuZ3RoIDwgaXRlbXNQZXJQYWdlICYmXG4gICAgICAgICAgICAgICBzdGFydCArIGl0ZW1zUGVyUGFnZSA8PSB0aGlzLm9yaWdpbmFsRGF0YS5sZW5ndGhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgLy9UaGUgY3VycmVudCBwYWdlIGRvZXMgbm90IGhhdmUgZW5vdWdoIG5vZGVzLiBBZGQgc29tZSB0byB0aGUgdmlldyBmcm9tIHRoZSBuZXh0IHBhZ2UuXG4gICAgICAgICAgICAgICBjb25zdCBjb3VudCA9IGl0ZW1zUGVyUGFnZSAtIHRoaXMudHJlZURhdGEubGVuZ3RoO1xuICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGl0ZW1zUGVyUGFnZSAtIDE7XG4gICAgICAgICAgICAgICAgICBpbmRleCA8IGl0ZW1zUGVyUGFnZSArIGNvdW50IC0gMTtcbiAgICAgICAgICAgICAgICAgIGluZGV4KytcbiAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgYnJhbmNoID0gbmV3IEJyYW5jaCh0aGlzLm9yaWdpbmFsRGF0YVtzdGFydCArIGluZGV4XSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnRyZWVNb2RlbC5hcHBlbmRDaGlsZChicmFuY2gpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5jb21wb25lbnRDcmVhdG9yU2VydmljZS5hcHBlbmRDb21wb25lbnQ8TGltYmxlVHJlZU5vZGVDb21wb25lbnQ+KFxuICAgICAgICAgICAgICAgICAgICAgTGltYmxlVHJlZU5vZGVDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgICB0aGlzLmhvc3RcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuYnJhbmNoID0gYnJhbmNoO1xuICAgICAgICAgICAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLnBhcmVudEhvc3QgPSB0aGlzLmhvc3Q7XG4gICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICBhY3Rpb24gPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRyZWVEYXRhLmxlbmd0aCA+IGl0ZW1zUGVyUGFnZSkge1xuICAgICAgICAgICAgICAgLy9UaGUgY3VycmVudCBwYWdlIGhhcyB0b28gbWFueSBub2Rlcy4gUmVtb3ZlIHNvbWUgb2YgdGhlbSBmcm9tIHRoZSB2aWV3LlxuICAgICAgICAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLnRyZWVEYXRhLmxlbmd0aCAtIGl0ZW1zUGVyUGFnZTtcbiAgICAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBpdGVtc1BlclBhZ2UgKyBjb3VudCAtIDE7XG4gICAgICAgICAgICAgICAgICBpbmRleCA+PSBpdGVtc1BlclBhZ2U7XG4gICAgICAgICAgICAgICAgICBpbmRleC0tXG4gICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMudHJlZU1vZGVsLnJlbW92ZUNoaWxkKGluZGV4KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5yZW1vdmUoaW5kZXgpO1xuICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgYWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhY3Rpb24gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgaXRlbXNQZXJQYWdlO1xuICAgICAgICAgICAgICAgdGhpcy50cmVlRGF0YSA9IHRoaXMub3JpZ2luYWxEYXRhLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIHRoaXMub3JpZ2luYWxEYXRhLmxlbmd0aCA9IDA7XG4gICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YS5wdXNoKC4uLnRoaXMudHJlZURhdGEpO1xuICAgICAgfVxuICAgfVxuXG4gICBwcml2YXRlIHJlYnVpbGRCcmFuY2goYnJhbmNoOiBCcmFuY2g8YW55Pik6IExpbWJsZVRyZWVOb2RlIHtcbiAgICAgIGNvbnN0IHRlbXA6IExpbWJsZVRyZWVOb2RlID0gYnJhbmNoLmRhdGE7XG4gICAgICB0ZW1wLm5vZGVzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGJyYW5jaC5nZXRDaGlsZHJlbigpKSB7XG4gICAgICAgICB0ZW1wLm5vZGVzLnB1c2godGhpcy5yZWJ1aWxkQnJhbmNoKGNoaWxkKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGVtcDtcbiAgIH1cbn1cbiJdfQ==
|
|
@@ -16,7 +16,7 @@ export class LimbleTreeModule {
|
|
|
16
16
|
}
|
|
17
17
|
LimbleTreeModule.ɵfac = function LimbleTreeModule_Factory(t) { return new (t || LimbleTreeModule)(); };
|
|
18
18
|
LimbleTreeModule.ɵmod = /*@__PURE__*/ i0.ɵɵdefineNgModule({ type: LimbleTreeModule });
|
|
19
|
-
LimbleTreeModule.ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({ providers: [ComponentCreatorService, DragStateService, GlobalEventsService], imports: [
|
|
19
|
+
LimbleTreeModule.ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({ providers: [ComponentCreatorService, DragStateService, GlobalEventsService], imports: [CommonModule] });
|
|
20
20
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LimbleTreeModule, [{
|
|
21
21
|
type: NgModule,
|
|
22
22
|
args: [{
|
|
@@ -41,7 +41,7 @@ LimbleTreeModule.ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({ providers: [Compo
|
|
|
41
41
|
LimbleTreePlaceholderComponent,
|
|
42
42
|
DragoverNoChangeDetectDirective,
|
|
43
43
|
DragleaveNoChangeDetectDirective], imports: [CommonModule], exports: [LimbleTreeRootComponent] }); })();
|
|
44
|
-
i0.ɵɵsetComponentScope(LimbleTreeNodeComponent, [i1.NgIf,
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
44
|
+
i0.ɵɵsetComponentScope(LimbleTreeNodeComponent, [i1.NgIf, LimbleTreeBranchComponent,
|
|
45
|
+
DropZoneComponent,
|
|
46
|
+
DragoverNoChangeDetectDirective], []);
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGltYmxlLXRyZWUubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbGltYmxlLXRyZWUvc3JjL2xpYi9saW1ibGUtdHJlZS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUM5RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDeEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDeEYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDN0csT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDekUsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDOUcsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sOERBQThELENBQUM7OztBQWdCaEgsTUFBTSxPQUFPLGdCQUFnQjs7Z0ZBQWhCLGdCQUFnQjtrRUFBaEIsZ0JBQWdCO3VFQUZmLENBQUMsdUJBQXVCLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUMsWUFGakUsWUFBWTt1RkFJWixnQkFBZ0I7Y0FkNUIsUUFBUTtlQUFDO2dCQUNQLFlBQVksRUFBRTtvQkFDWCx5QkFBeUI7b0JBQ3pCLGlCQUFpQjtvQkFDakIsdUJBQXVCO29CQUN2Qix1QkFBdUI7b0JBQ3ZCLDhCQUE4QjtvQkFDOUIsK0JBQStCO29CQUMvQixnQ0FBZ0M7aUJBQ2xDO2dCQUNELE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztnQkFDdkIsT0FBTyxFQUFFLENBQUMsdUJBQXVCLENBQUM7Z0JBQ2xDLFNBQVMsRUFBRSxDQUFDLHVCQUF1QixFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixDQUFDO2FBQzdFOzt3RkFDWSxnQkFBZ0IsbUJBWnZCLHlCQUF5QjtRQUN6QixpQkFBaUI7UUFDakIsdUJBQXVCO1FBQ3ZCLHVCQUF1QjtRQUN2Qiw4QkFBOEI7UUFDOUIsK0JBQStCO1FBQy9CLGdDQUFnQyxhQUV6QixZQUFZLGFBQ1osdUJBQXVCO3VCQVA5Qix1QkFBdUIsWUFGdkIseUJBQXlCO0lBQ3pCLGlCQUFpQjtJQUlqQiwrQkFBK0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb21wb25lbnRDcmVhdG9yU2VydmljZSB9IGZyb20gXCIuL3NpbmdsZXRvbnMvY29tcG9uZW50LWNyZWF0b3Iuc2VydmljZVwiO1xuaW1wb3J0IHsgRHJvcFpvbmVDb21wb25lbnQgfSBmcm9tIFwiLi9kcm9wLXpvbmUvZHJvcC16b25lLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgTGltYmxlVHJlZUJyYW5jaENvbXBvbmVudCB9IGZyb20gXCIuL2xpbWJsZS10cmVlLWJyYW5jaC9saW1ibGUtdHJlZS1icmFuY2guY29tcG9uZW50XCI7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBMaW1ibGVUcmVlTm9kZUNvbXBvbmVudCB9IGZyb20gXCIuL2xpbWJsZS10cmVlLW5vZGUvbGltYmxlLXRyZWUtbm9kZS5jb21wb25lbnRcIjtcbmltcG9ydCB7IERyYWdTdGF0ZVNlcnZpY2UgfSBmcm9tIFwiLi9zaW5nbGV0b25zL2RyYWctc3RhdGUuc2VydmljZVwiO1xuaW1wb3J0IHsgTGltYmxlVHJlZVJvb3RDb21wb25lbnQgfSBmcm9tIFwiLi9saW1ibGUtdHJlZS1yb290L2xpbWJsZS10cmVlLXJvb3QuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBMaW1ibGVUcmVlUGxhY2Vob2xkZXJDb21wb25lbnQgfSBmcm9tIFwiLi9saW1ibGUtdHJlZS1wbGFjZWhvbGRlci9saW1ibGUtdHJlZS1wbGFjZWhvbGRlci5jb21wb25lbnRcIjtcbmltcG9ydCB7IEdsb2JhbEV2ZW50c1NlcnZpY2UgfSBmcm9tIFwiLi9zaW5nbGV0b25zL2dsb2JhbC1ldmVudHMuc2VydmljZVwiO1xuaW1wb3J0IHsgRHJhZ292ZXJOb0NoYW5nZURldGVjdERpcmVjdGl2ZSB9IGZyb20gXCIuL2N1c3RvbS1ldmVudC1iaW5kaW5ncy9kcmFnb3Zlci1uby1jaGFuZ2UtZGV0ZWN0LmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgRHJhZ2xlYXZlTm9DaGFuZ2VEZXRlY3REaXJlY3RpdmUgfSBmcm9tIFwiLi9jdXN0b20tZXZlbnQtYmluZGluZ3MvZHJhZ2xlYXZlLW5vLWNoYW5nZS1kZXRlY3QuZGlyZWN0aXZlXCI7XG5cbkBOZ01vZHVsZSh7XG4gICBkZWNsYXJhdGlvbnM6IFtcbiAgICAgIExpbWJsZVRyZWVCcmFuY2hDb21wb25lbnQsXG4gICAgICBEcm9wWm9uZUNvbXBvbmVudCxcbiAgICAgIExpbWJsZVRyZWVOb2RlQ29tcG9uZW50LFxuICAgICAgTGltYmxlVHJlZVJvb3RDb21wb25lbnQsXG4gICAgICBMaW1ibGVUcmVlUGxhY2Vob2xkZXJDb21wb25lbnQsXG4gICAgICBEcmFnb3Zlck5vQ2hhbmdlRGV0ZWN0RGlyZWN0aXZlLFxuICAgICAgRHJhZ2xlYXZlTm9DaGFuZ2VEZXRlY3REaXJlY3RpdmVcbiAgIF0sXG4gICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgIGV4cG9ydHM6IFtMaW1ibGVUcmVlUm9vdENvbXBvbmVudF0sXG4gICBwcm92aWRlcnM6IFtDb21wb25lbnRDcmVhdG9yU2VydmljZSwgRHJhZ1N0YXRlU2VydmljZSwgR2xvYmFsRXZlbnRzU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgTGltYmxlVHJlZU1vZHVsZSB7fVxuIl19
|