@limble/limble-tree 1.0.0 → 3.0.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 +8 -0
- package/esm2022/lib/components/branch/branch.component.mjs +79 -0
- package/{esm2020 → esm2022}/lib/components/dragover-no-change-detect.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/dropzone/dropzone.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/root/root.component.mjs +5 -5
- package/esm2022/lib/core/tree-branch/tree-branch.mjs +429 -0
- package/esm2022/lib/core/tree-node-base.mjs +77 -0
- package/{esm2020 → esm2022}/lib/core/tree-root/root-controller.mjs +1 -1
- package/esm2022/lib/core/tree-root/tree-root.mjs +193 -0
- package/{esm2020 → esm2022}/lib/core/tree-service/tree.service.mjs +4 -4
- package/{esm2020 → esm2022}/lib/extras/collapse/collapse.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/extras/collapse/collapse.service.mjs +4 -4
- package/esm2022/lib/extras/drag-and-drop/drag-and-drop.mjs +83 -0
- package/{esm2020 → esm2022}/lib/extras/drag-and-drop/drag-and-drop.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/extras/drag-and-drop/drag-and-drop.service.mjs +4 -4
- package/{esm2020 → esm2022}/lib/extras/drag-and-drop/draggable.directive.mjs +4 -4
- package/esm2022/lib/legacy/limble-tree-legacy.module.mjs +20 -0
- package/{esm2020 → esm2022}/lib/legacy/limble-tree-root/limble-tree-root.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/limble-tree.module.mjs +5 -5
- package/{fesm2020 → fesm2022}/limble-limble-tree.mjs +60 -63
- package/fesm2022/limble-limble-tree.mjs.map +1 -0
- package/lib/components/branch/branch.component.d.ts +1 -1
- package/lib/components/dragover-no-change-detect.d.ts +1 -1
- package/lib/components/dropzone/dropzone.component.d.ts +1 -1
- package/lib/components/root/root.component.d.ts +1 -1
- package/lib/core/tree-plot.interface.d.ts +1 -1
- package/lib/extras/drag-and-drop/draggable.directive.d.ts +1 -1
- package/lib/legacy/legacy-tree-data.interface.d.ts +1 -1
- package/lib/legacy/limble-tree-root/limble-tree-root.component.d.ts +1 -1
- package/package.json +7 -13
- package/esm2020/lib/components/branch/branch.component.mjs +0 -79
- package/esm2020/lib/core/tree-branch/tree-branch.mjs +0 -429
- package/esm2020/lib/core/tree-node-base.mjs +0 -80
- package/esm2020/lib/core/tree-root/tree-root.mjs +0 -193
- package/esm2020/lib/extras/drag-and-drop/drag-and-drop.mjs +0 -83
- package/esm2020/lib/legacy/limble-tree-legacy.module.mjs +0 -20
- package/fesm2015/limble-limble-tree.mjs +0 -1812
- package/fesm2015/limble-limble-tree.mjs.map +0 -1
- package/fesm2020/limble-limble-tree.mjs.map +0 -1
- /package/{esm2020 → esm2022}/lib/components/branch/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/dropzone/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/host-component.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/node-component.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/root/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/branch-options.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/branchable.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/component-container.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/configuration/configuration.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/configuration/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/configuration/tree-options.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/tree-branch/branch-controller.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/tree-branch/graftable.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/tree-branch/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/tree-node.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/tree-plot.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/tree-root/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/tree-service/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/errors/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/errors/tree-error.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/events/drag/drag-end-event.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/events/drag/drag-start-event.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/events/drag/drop-event.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/events/drag/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/events/general/destruction-event.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/events/general/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/events/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/events/relational/graft-event.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/events/relational/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/events/relational/prune-event.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/events/relational/relational-tree-event.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/events/relational/tree-relationship.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/events/tree-event.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/extras/collapse/collapse.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/extras/collapse/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/extras/drag-and-drop/drag-state.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/extras/drag-and-drop/dropzone-renderer.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/extras/drag-and-drop/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/legacy/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/legacy/legacy-component-obj.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/legacy/legacy-tree-data.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/legacy/legacy-tree-options.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/legacy/legacy-tree.mjs +0 -0
- /package/{esm2020 → esm2022}/limble-limble-tree.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/assert.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/has-property.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/index.mjs +0 -0
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
import { assert } from "../../../shared";
|
|
2
|
+
import { TreeError } from "../../errors";
|
|
3
|
+
import { dropzoneRenderer } from "../../extras/drag-and-drop";
|
|
4
|
+
import { TreeRoot } from "../tree-root";
|
|
5
|
+
import { TreeNodeBase } from "../tree-node-base";
|
|
6
|
+
import { config } from "../configuration";
|
|
7
|
+
import { BranchController } from "./branch-controller";
|
|
8
|
+
import { treeCollapser } from "../../extras/collapse";
|
|
9
|
+
import { DestructionEvent, GraftEvent, PruneEvent } from "../../events";
|
|
10
|
+
/** Represents a standard node in a tree. Renders a BranchComponent.
|
|
11
|
+
*
|
|
12
|
+
* @remarks
|
|
13
|
+
* This class renders a branch component, which does the following:
|
|
14
|
+
* 1. Renders a component provided by the user
|
|
15
|
+
* 2. Provides a container in which child branches may be rendered
|
|
16
|
+
* 3. Contains two Dropzones: one for dropping branches below this branch (as a
|
|
17
|
+
* sibling), and one for dropping branches as a first child of this branch.
|
|
18
|
+
*/
|
|
19
|
+
export class TreeBranch {
|
|
20
|
+
constructor(parent, branchOptions) {
|
|
21
|
+
this.branchOptions = branchOptions;
|
|
22
|
+
this.detachedView = null;
|
|
23
|
+
this.treeNodeBase = new TreeNodeBase();
|
|
24
|
+
const parentBranchesContainer = parent.getBranchesContainer();
|
|
25
|
+
assert(parentBranchesContainer !== undefined);
|
|
26
|
+
this.branchController = new BranchController(this, parentBranchesContainer);
|
|
27
|
+
const hostView = this.branchController.getHostView();
|
|
28
|
+
if (parent instanceof TreeBranch &&
|
|
29
|
+
parent.branchOptions.defaultCollapsed === true) {
|
|
30
|
+
treeCollapser.storePrecollapsedNode(parent, this);
|
|
31
|
+
this.detachedView = hostView;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
parentBranchesContainer.insert(hostView);
|
|
35
|
+
this._parent = parent;
|
|
36
|
+
this.dispatch(new GraftEvent(this, {
|
|
37
|
+
parent: this._parent,
|
|
38
|
+
child: this,
|
|
39
|
+
index: this._parent.branches().length
|
|
40
|
+
}));
|
|
41
|
+
this.setIndentation();
|
|
42
|
+
}
|
|
43
|
+
this.detectChanges();
|
|
44
|
+
}
|
|
45
|
+
/** @returns All child branches as an array of TreeBranch instances, in order. */
|
|
46
|
+
branches() {
|
|
47
|
+
return this.treeNodeBase.branches();
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Recursively destroys all descendant branches, as well as itself. This
|
|
51
|
+
* releases all resources held or consumed by this branch and its descendants.
|
|
52
|
+
*
|
|
53
|
+
* @remarks
|
|
54
|
+
* It is important to call this method when a branch is discarded, otherwise
|
|
55
|
+
* the branch will remain in memory and continue to consume resources.
|
|
56
|
+
*/
|
|
57
|
+
destroy() {
|
|
58
|
+
if (this.isDestroyed()) {
|
|
59
|
+
throw new TreeError("Cannot destroy a destroyed tree branch");
|
|
60
|
+
}
|
|
61
|
+
this.prune();
|
|
62
|
+
treeCollapser.expand(this);
|
|
63
|
+
dropzoneRenderer.clearTreeFromRegistry(this);
|
|
64
|
+
this.branchController.getHostView().destroy();
|
|
65
|
+
this.treeNodeBase.destroy();
|
|
66
|
+
this.branchController.destroy();
|
|
67
|
+
this.dispatch(new DestructionEvent(this));
|
|
68
|
+
}
|
|
69
|
+
/** Run Angular change detection on this branch */
|
|
70
|
+
detectChanges() {
|
|
71
|
+
this.branchController.detectChanges();
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Emits the specified TreeEvent.
|
|
75
|
+
*
|
|
76
|
+
* @remarks
|
|
77
|
+
* Caution: It is not recommended to manually emit TreeEvents that are already
|
|
78
|
+
* provided by the library. For example, it is not recommended to emit a
|
|
79
|
+
* `GraftEvent`, `DestructionEvent`, etc. These events may be used by the tree,
|
|
80
|
+
* and emitting them manually may cause unexpected behavior. Instead, we
|
|
81
|
+
* recommend implementing the TreeEvent interface with your own custom events
|
|
82
|
+
* and dispatching those.
|
|
83
|
+
*
|
|
84
|
+
* @param event - The TreeEvent that will be emitted.
|
|
85
|
+
*/
|
|
86
|
+
dispatch(event) {
|
|
87
|
+
this.treeNodeBase.dispatch(event);
|
|
88
|
+
this._parent?.dispatch(event);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* @returns
|
|
92
|
+
* An observable that emits TreeEvents whenever an event is dispatched
|
|
93
|
+
* in this branch or any of its descendant branches.
|
|
94
|
+
*/
|
|
95
|
+
events() {
|
|
96
|
+
return this.treeNodeBase.events();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* @param index - The index of the child branch to retrieve.
|
|
100
|
+
*
|
|
101
|
+
* @returns
|
|
102
|
+
* The child branch at the specified index, or undefined if there is
|
|
103
|
+
* no child branch at the specified index.
|
|
104
|
+
*/
|
|
105
|
+
getBranch(index) {
|
|
106
|
+
return this.treeNodeBase.getBranch(index);
|
|
107
|
+
}
|
|
108
|
+
/** @returns The ViewContainerRef in which child branches are rendered */
|
|
109
|
+
getBranchesContainer() {
|
|
110
|
+
if (this.isDestroyed()) {
|
|
111
|
+
throw new TreeError("Cannot get branches container from a destroyed tree branch");
|
|
112
|
+
}
|
|
113
|
+
return this.branchController.getBranchesContainer();
|
|
114
|
+
}
|
|
115
|
+
/** @returns The instance of BranchComponent that is rendered by this class. */
|
|
116
|
+
getComponentInstance() {
|
|
117
|
+
if (this.isDestroyed()) {
|
|
118
|
+
throw new TreeError("Cannot get component instance from a destroyed tree branch");
|
|
119
|
+
}
|
|
120
|
+
return this.branchController.getComponentInstance();
|
|
121
|
+
}
|
|
122
|
+
/** @returns The Host View in which the BranchComponent is rendered */
|
|
123
|
+
getHostView() {
|
|
124
|
+
if (this.isDestroyed()) {
|
|
125
|
+
throw new TreeError("Cannot get component host view from a destroyed tree branch");
|
|
126
|
+
}
|
|
127
|
+
return this.branchController.getHostView();
|
|
128
|
+
}
|
|
129
|
+
/** @returns The BranchComponent as a native HTML Element */
|
|
130
|
+
getNativeElement() {
|
|
131
|
+
if (this.isDestroyed()) {
|
|
132
|
+
throw new TreeError("Cannot get native element from a destroyed tree branch");
|
|
133
|
+
}
|
|
134
|
+
return this.branchController.getNativeElement();
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* @returns
|
|
138
|
+
* A ComponentRef containing the instance of the user-provided
|
|
139
|
+
* component which is rendered by this branch.
|
|
140
|
+
*/
|
|
141
|
+
getUserlandComponentRef() {
|
|
142
|
+
if (this.isDestroyed()) {
|
|
143
|
+
throw new TreeError("Cannot get userland component from a destroyed tree branch");
|
|
144
|
+
}
|
|
145
|
+
return this.branchController.getUserlandComponentRef();
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Attaches a branch to a new parent node.
|
|
149
|
+
*
|
|
150
|
+
* @remarks
|
|
151
|
+
* If not already pruned, this method prunes (removes) this branch from its
|
|
152
|
+
* current position in the tree; then grafts (reattaches) it as a child of the
|
|
153
|
+
* specified parent branch at the specified index. If no index is specified,
|
|
154
|
+
* the branch is appended as the last child of the parent. This causes this
|
|
155
|
+
* branch's associated BranchComponent to be re-rendered in the DOM at the
|
|
156
|
+
* new location.
|
|
157
|
+
*
|
|
158
|
+
* @param newParent - The new parent branch unto which this branch will be grafted.
|
|
159
|
+
* @param index - The index at which this branch will be grafted. If not specified,
|
|
160
|
+
* this branch will be appended as the last child of the new parent.
|
|
161
|
+
*
|
|
162
|
+
* @returns The index at which this branch was grafted.
|
|
163
|
+
*/
|
|
164
|
+
graftTo(newParent, index) {
|
|
165
|
+
this.checkGraftLocationValidity(newParent, index);
|
|
166
|
+
const ownIndex = this.index();
|
|
167
|
+
if (ownIndex !== undefined) {
|
|
168
|
+
this.prune();
|
|
169
|
+
}
|
|
170
|
+
this._parent = newParent;
|
|
171
|
+
const newIndex = index ?? newParent.branches().length;
|
|
172
|
+
this.reattachView(newIndex);
|
|
173
|
+
this.dispatch(new GraftEvent(this, {
|
|
174
|
+
parent: newParent,
|
|
175
|
+
child: this,
|
|
176
|
+
index: newIndex
|
|
177
|
+
}));
|
|
178
|
+
return newIndex;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Appends a new child branch to this branch. The child branch will render
|
|
182
|
+
* the specified component according to the (optional) configuration parameter.
|
|
183
|
+
*
|
|
184
|
+
* @param component - The component to render in the new child branch.
|
|
185
|
+
* @param options - Configuration options for the new child branch.
|
|
186
|
+
*
|
|
187
|
+
* @returns
|
|
188
|
+
* The newly-created child branch.
|
|
189
|
+
*/
|
|
190
|
+
grow(component, options) {
|
|
191
|
+
if (this.isDestroyed()) {
|
|
192
|
+
throw new TreeError("Cannot grow a branch on a destroyed tree branch");
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
return new TreeBranch(this, { component, ...options });
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
this.handleUserlandError(error);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Determines this branch's index in relation to its sibling branches.
|
|
203
|
+
*
|
|
204
|
+
* @remarks
|
|
205
|
+
* For example, if it is the first child of its parent, this method will return
|
|
206
|
+
* 0. If it is the second child of its parent, this method will return 1.
|
|
207
|
+
*
|
|
208
|
+
* If this branch has no parent, (eg, if this branch has been pruned) this
|
|
209
|
+
* method will return undefined.
|
|
210
|
+
*
|
|
211
|
+
* @returns
|
|
212
|
+
* The index of this branch in relation to its sibling branches, or undefined.
|
|
213
|
+
*/
|
|
214
|
+
index() {
|
|
215
|
+
if (!this._parent) {
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
const index = this._parent
|
|
219
|
+
.branches()
|
|
220
|
+
.findIndex((branch) => branch === this);
|
|
221
|
+
assert(index >= 0);
|
|
222
|
+
return index;
|
|
223
|
+
}
|
|
224
|
+
/** @returns `true` if the branch is destroyed, `false` otherwise */
|
|
225
|
+
isDestroyed() {
|
|
226
|
+
return this.treeNodeBase.isDestroyed();
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* @returns
|
|
230
|
+
* The data that was passed into the `branchOptions`' `meta` property
|
|
231
|
+
* at construction.
|
|
232
|
+
*/
|
|
233
|
+
meta() {
|
|
234
|
+
return this.branchOptions.meta ?? {};
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* @returns
|
|
238
|
+
* This branch's parent node (which may be a TreeBranch or TreeRoot).
|
|
239
|
+
* If this branch has no parent, (eg, if this branch has been pruned) this
|
|
240
|
+
* method will return undefined.
|
|
241
|
+
*/
|
|
242
|
+
parent() {
|
|
243
|
+
return this._parent;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Provides a model describing this branch's descendants.
|
|
247
|
+
*
|
|
248
|
+
* @returns
|
|
249
|
+
* A multi-dimensional Map which describes the shape of this branch's
|
|
250
|
+
* descendants.
|
|
251
|
+
*
|
|
252
|
+
* @example
|
|
253
|
+
* A branch with no children will return an empty Map. A branch with
|
|
254
|
+
* a single child will return a Map with a single entry, where the key is the index
|
|
255
|
+
* of the branch (zero) and the value is an empty Map. A Tree like this:
|
|
256
|
+
*
|
|
257
|
+
* ```
|
|
258
|
+
* ---Branch-------Branch
|
|
259
|
+
* /
|
|
260
|
+
* Branch-------Branch
|
|
261
|
+
* \
|
|
262
|
+
* ---Branch
|
|
263
|
+
* ```
|
|
264
|
+
* Will return a Map of matching shape:
|
|
265
|
+
* ```
|
|
266
|
+
* Map {
|
|
267
|
+
* 0: Map { 0: Map {}},
|
|
268
|
+
* 1: Map {},
|
|
269
|
+
* 2: Map {}
|
|
270
|
+
* }
|
|
271
|
+
* ```
|
|
272
|
+
*/
|
|
273
|
+
plot() {
|
|
274
|
+
return this.treeNodeBase.plot();
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Calculates the branch's position in the tree relative to the Root.
|
|
278
|
+
*
|
|
279
|
+
* @remarks
|
|
280
|
+
* The position is described as an array of numbers, where each number
|
|
281
|
+
* represents the index of the branch at that level of the tree.
|
|
282
|
+
*
|
|
283
|
+
* For example, if this branch is the first child of the Root, this method
|
|
284
|
+
* will return [0]. If this branch is the second child of the first child
|
|
285
|
+
* of the Root, this method will return [0, 1].
|
|
286
|
+
*
|
|
287
|
+
* If the branch is not related to a TreeRoot, (such as when it has been
|
|
288
|
+
* pruned,) this method will throw an error.
|
|
289
|
+
*
|
|
290
|
+
* @returns
|
|
291
|
+
* An array of numbers which describe the branch's position in the tree
|
|
292
|
+
* relative to the Root.
|
|
293
|
+
*/
|
|
294
|
+
position() {
|
|
295
|
+
const index = this.index();
|
|
296
|
+
if (index === undefined) {
|
|
297
|
+
throw new TreeError("branch has no parent. Position cannot be determined.");
|
|
298
|
+
}
|
|
299
|
+
if (this._parent instanceof TreeBranch) {
|
|
300
|
+
const parentPosition = this._parent.position();
|
|
301
|
+
return [...parentPosition, index];
|
|
302
|
+
}
|
|
303
|
+
return [index];
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Removes a branch from its tree without destroying it.
|
|
307
|
+
*
|
|
308
|
+
* @remarks
|
|
309
|
+
* Removes this branch from its parent and detaches its associated
|
|
310
|
+
* BranchComponent from the DOM. This puts the branch in a "pruned" state,
|
|
311
|
+
* which may affect the behavior of other methods.
|
|
312
|
+
*
|
|
313
|
+
* A pruned branch can be reattached to any other node using the `graftTo` method.
|
|
314
|
+
*
|
|
315
|
+
* @returns
|
|
316
|
+
* Itself, or undefined if it is already in a pruned state.
|
|
317
|
+
*/
|
|
318
|
+
prune() {
|
|
319
|
+
if (this.isDestroyed()) {
|
|
320
|
+
throw new TreeError("Cannot prune a destroyed tree branch");
|
|
321
|
+
}
|
|
322
|
+
const parent = this._parent;
|
|
323
|
+
const index = this.index();
|
|
324
|
+
if (index === undefined || parent === undefined)
|
|
325
|
+
return;
|
|
326
|
+
const container = parent.getBranchesContainer();
|
|
327
|
+
assert(container !== undefined);
|
|
328
|
+
this.detachedView = container.detach(index);
|
|
329
|
+
assert(this.detachedView !== null);
|
|
330
|
+
this.detachedView.detach();
|
|
331
|
+
this.dispatch(new PruneEvent(this, {
|
|
332
|
+
parent: parent,
|
|
333
|
+
child: this,
|
|
334
|
+
index: index
|
|
335
|
+
}));
|
|
336
|
+
this._parent = undefined;
|
|
337
|
+
return this;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Get the root of the tree to which this Branch is attached.
|
|
341
|
+
*
|
|
342
|
+
* @returns
|
|
343
|
+
* The TreeRoot of the tree this branch is in. If this branch is
|
|
344
|
+
* does not have a root (such as when it has been pruned) this method will
|
|
345
|
+
* return undefined.
|
|
346
|
+
*/
|
|
347
|
+
root() {
|
|
348
|
+
const parent = this.parent();
|
|
349
|
+
if (parent instanceof TreeBranch) {
|
|
350
|
+
return parent.root();
|
|
351
|
+
}
|
|
352
|
+
assert(parent instanceof TreeRoot || parent === undefined);
|
|
353
|
+
return parent;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Traverses this branch's descendants in depth-first pre-order, executing
|
|
357
|
+
* the provided callback function on each node. Traversal includes this branch.
|
|
358
|
+
*
|
|
359
|
+
* @param callback - A function to execute on each node.
|
|
360
|
+
*/
|
|
361
|
+
traverse(callback) {
|
|
362
|
+
callback(this);
|
|
363
|
+
this.treeNodeBase.traverse(callback);
|
|
364
|
+
}
|
|
365
|
+
checkGraftLocationValidity(newParent, index) {
|
|
366
|
+
if (this.isDestroyed()) {
|
|
367
|
+
throw new TreeError("Cannot graft a destroyed tree branch");
|
|
368
|
+
}
|
|
369
|
+
if (newParent.isDestroyed()) {
|
|
370
|
+
throw new TreeError("Cannot graft to a destroyed tree branch");
|
|
371
|
+
}
|
|
372
|
+
if (typeof index === "number" &&
|
|
373
|
+
this.indexIsOutOfRange(newParent, index)) {
|
|
374
|
+
throw new TreeError(`Cannot graft branch at index ${index} of the parent. Out of range.`);
|
|
375
|
+
}
|
|
376
|
+
this.traverse((node) => {
|
|
377
|
+
if (node === newParent) {
|
|
378
|
+
throw new TreeError("Cannot graft a branch to itself or any of its own descendants");
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
handleUserlandError(error) {
|
|
383
|
+
/* When an error occurs in a userland component during a tree operation,
|
|
384
|
+
* it can cause undefined, bizarre behavior in the tree. To prevent this,
|
|
385
|
+
* we destroy the tree and throw an error instead. This helps protect
|
|
386
|
+
* the end-user's data from corruption. */
|
|
387
|
+
this.furthestAncestor().destroy();
|
|
388
|
+
this.treeNodeBase.handleUserlandError(error);
|
|
389
|
+
}
|
|
390
|
+
indexIsOutOfRange(parent, index) {
|
|
391
|
+
return index < 0 || index > parent.branches().length;
|
|
392
|
+
}
|
|
393
|
+
furthestAncestor() {
|
|
394
|
+
// eslint-disable-next-line typescript/no-this-alias -- This code is for an iteration, not to make `this` available in other scopes (which is what the rule is intended to protect against).
|
|
395
|
+
let node = this;
|
|
396
|
+
while (node instanceof TreeBranch) {
|
|
397
|
+
const parent = node.parent();
|
|
398
|
+
if (parent === undefined)
|
|
399
|
+
break;
|
|
400
|
+
node = parent;
|
|
401
|
+
}
|
|
402
|
+
return node;
|
|
403
|
+
}
|
|
404
|
+
reattachView(index) {
|
|
405
|
+
assert(this._parent !== undefined);
|
|
406
|
+
assert(this.detachedView !== null);
|
|
407
|
+
const container = this._parent.getBranchesContainer();
|
|
408
|
+
assert(container !== undefined);
|
|
409
|
+
this.detachedView.reattach();
|
|
410
|
+
container.insert(this.detachedView, index);
|
|
411
|
+
this.detachedView = null;
|
|
412
|
+
this.setIndentation();
|
|
413
|
+
}
|
|
414
|
+
setIndentation() {
|
|
415
|
+
assert(this._parent !== undefined);
|
|
416
|
+
const root = this._parent.root();
|
|
417
|
+
if (root === undefined) {
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
const options = config.getConfig(root);
|
|
421
|
+
const branchesContainerEl = this.branchController
|
|
422
|
+
.getNativeElement()
|
|
423
|
+
.getElementsByClassName("branches-container")
|
|
424
|
+
.item(0);
|
|
425
|
+
assert(branchesContainerEl instanceof HTMLElement);
|
|
426
|
+
branchesContainerEl.style.marginLeft = `${options?.indentation ?? 16}px`;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1icmFuY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2NvcmUvdHJlZS1icmFuY2gvdHJlZS1icmFuY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBU3pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUd4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSzFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQ0osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixVQUFVLEVBRVosTUFBTSxjQUFjLENBQUM7QUFFdEI7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sVUFBVTtJQVFwQixZQUNHLE1BQW1DLEVBQ25CLGFBQW1EO1FBQW5ELGtCQUFhLEdBQWIsYUFBYSxDQUFzQztRQU45RCxpQkFBWSxHQUFtQixJQUFJLENBQUM7UUFRekMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUQsTUFBTSxDQUFDLHVCQUF1QixLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixDQUN6QyxJQUFJLEVBQ0osdUJBQXVC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QUM7UUFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDbkMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3RELE1BQU0sQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QixTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxjQUFjO1FBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakMsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3JCLE9BQU87U0FDVDtRQUNELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCO2FBQzdDLGdCQUFnQixFQUFFO2FBQ2xCLHNCQUFzQixDQUFDLG9CQUFvQixDQUFDO2FBQzVDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNaLE1BQU0sQ0FBQyxtQkFBbUIsWUFBWSxXQUFXLENBQUMsQ0FBQztRQUNuRCxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLEdBQUcsT0FBTyxFQUFFLFdBQVcsSUFBSSxFQUFFLElBQUksQ0FBQztJQUM1RSxDQUFDO0NBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3NlcnQgfSBmcm9tIFwiLi4vLi4vLi4vc2hhcmVkXCI7XG5pbXBvcnQgdHlwZSB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHR5cGUge1xuICAgQ29tcG9uZW50UmVmLFxuICAgVHlwZSxcbiAgIFZpZXdDb250YWluZXJSZWYsXG4gICBWaWV3UmVmXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBCcmFuY2hDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgVHJlZUVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yc1wiO1xuaW1wb3J0IHsgZHJvcHpvbmVSZW5kZXJlciB9IGZyb20gXCIuLi8uLi9leHRyYXMvZHJhZy1hbmQtZHJvcFwiO1xuaW1wb3J0IHsgVHJlZVJvb3QgfSBmcm9tIFwiLi4vdHJlZS1yb290XCI7XG5pbXBvcnQgdHlwZSB7IFRyZWVOb2RlIH0gZnJvbSBcIi4uL3RyZWUtbm9kZS5pbnRlcmZhY2VcIjtcbmltcG9ydCB0eXBlIHsgVHJlZVBsb3QgfSBmcm9tIFwiLi4vdHJlZS1wbG90LmludGVyZmFjZVwiO1xuaW1wb3J0IHsgVHJlZU5vZGVCYXNlIH0gZnJvbSBcIi4uL3RyZWUtbm9kZS1iYXNlXCI7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tIFwiLi4vY29uZmlndXJhdGlvblwiO1xuaW1wb3J0IHR5cGUge1xuICAgQnJhbmNoT3B0aW9ucyxcbiAgIEZ1bGxCcmFuY2hPcHRpb25zXG59IGZyb20gXCIuLi9icmFuY2gtb3B0aW9ucy5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IEJyYW5jaENvbnRyb2xsZXIgfSBmcm9tIFwiLi9icmFuY2gtY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBHcmFmdGFibGUgfSBmcm9tIFwiLi9ncmFmdGFibGUuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyB0cmVlQ29sbGFwc2VyIH0gZnJvbSBcIi4uLy4uL2V4dHJhcy9jb2xsYXBzZVwiO1xuaW1wb3J0IHtcbiAgIERlc3RydWN0aW9uRXZlbnQsXG4gICBHcmFmdEV2ZW50LFxuICAgUHJ1bmVFdmVudCxcbiAgIHR5cGUgVHJlZUV2ZW50XG59IGZyb20gXCIuLi8uLi9ldmVudHNcIjtcblxuLyoqIFJlcHJlc2VudHMgYSBzdGFuZGFyZCBub2RlIGluIGEgdHJlZS4gUmVuZGVycyBhIEJyYW5jaENvbXBvbmVudC5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyBjbGFzcyByZW5kZXJzIGEgYnJhbmNoIGNvbXBvbmVudCwgd2hpY2ggZG9lcyB0aGUgZm9sbG93aW5nOlxuICogMS4gUmVuZGVycyBhIGNvbXBvbmVudCBwcm92aWRlZCBieSB0aGUgdXNlclxuICogMi4gUHJvdmlkZXMgYSBjb250YWluZXIgaW4gd2hpY2ggY2hpbGQgYnJhbmNoZXMgbWF5IGJlIHJlbmRlcmVkXG4gKiAzLiBDb250YWlucyB0d28gRHJvcHpvbmVzOiBvbmUgZm9yIGRyb3BwaW5nIGJyYW5jaGVzIGJlbG93IHRoaXMgYnJhbmNoIChhcyBhXG4gKiBzaWJsaW5nKSwgYW5kIG9uZSBmb3IgZHJvcHBpbmcgYnJhbmNoZXMgYXMgYSBmaXJzdCBjaGlsZCBvZiB0aGlzIGJyYW5jaC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+XG4gICBpbXBsZW1lbnRzIFRyZWVOb2RlPFVzZXJsYW5kQ29tcG9uZW50PiwgR3JhZnRhYmxlPFVzZXJsYW5kQ29tcG9uZW50Plxue1xuICAgcHJpdmF0ZSByZWFkb25seSBicmFuY2hDb250cm9sbGVyOiBCcmFuY2hDb250cm9sbGVyPFVzZXJsYW5kQ29tcG9uZW50PjtcbiAgIHByaXZhdGUgZGV0YWNoZWRWaWV3OiBWaWV3UmVmIHwgbnVsbCA9IG51bGw7XG4gICBwcml2YXRlIF9wYXJlbnQ6IFRyZWVOb2RlPFVzZXJsYW5kQ29tcG9uZW50PiB8IHVuZGVmaW5lZDtcbiAgIHByaXZhdGUgcmVhZG9ubHkgdHJlZU5vZGVCYXNlOiBUcmVlTm9kZUJhc2U8VXNlcmxhbmRDb21wb25lbnQ+O1xuXG4gICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICBwYXJlbnQ6IFRyZWVOb2RlPFVzZXJsYW5kQ29tcG9uZW50PixcbiAgICAgIHB1YmxpYyByZWFkb25seSBicmFuY2hPcHRpb25zOiBGdWxsQnJhbmNoT3B0aW9uczxVc2VybGFuZENvbXBvbmVudD5cbiAgICkge1xuICAgICAgdGhpcy50cmVlTm9kZUJhc2UgPSBuZXcgVHJlZU5vZGVCYXNlKCk7XG4gICAgICBjb25zdCBwYXJlbnRCcmFuY2hlc0NvbnRhaW5lciA9IHBhcmVudC5nZXRCcmFuY2hlc0NvbnRhaW5lcigpO1xuICAgICAgYXNzZXJ0KHBhcmVudEJyYW5jaGVzQ29udGFpbmVyICE9PSB1bmRlZmluZWQpO1xuICAgICAgdGhpcy5icmFuY2hDb250cm9sbGVyID0gbmV3IEJyYW5jaENvbnRyb2xsZXIoXG4gICAgICAgICB0aGlzLFxuICAgICAgICAgcGFyZW50QnJhbmNoZXNDb250YWluZXJcbiAgICAgICk7XG4gICAgICBjb25zdCBob3N0VmlldyA9IHRoaXMuYnJhbmNoQ29udHJvbGxlci5nZXRIb3N0VmlldygpO1xuICAgICAgaWYgKFxuICAgICAgICAgcGFyZW50IGluc3RhbmNlb2YgVHJlZUJyYW5jaCAmJlxuICAgICAgICAgcGFyZW50LmJyYW5jaE9wdGlvbnMuZGVmYXVsdENvbGxhcHNlZCA9PT0gdHJ1ZVxuICAgICAgKSB7XG4gICAgICAgICB0cmVlQ29sbGFwc2VyLnN0b3JlUHJlY29sbGFwc2VkTm9kZShwYXJlbnQsIHRoaXMpO1xuICAgICAgICAgdGhpcy5kZXRhY2hlZFZpZXcgPSBob3N0VmlldztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICBwYXJlbnRCcmFuY2hlc0NvbnRhaW5lci5pbnNlcnQoaG9zdFZpZXcpO1xuICAgICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICAgICAgICAgdGhpcy5kaXNwYXRjaChcbiAgICAgICAgICAgIG5ldyBHcmFmdEV2ZW50KHRoaXMsIHtcbiAgICAgICAgICAgICAgIHBhcmVudDogdGhpcy5fcGFyZW50LFxuICAgICAgICAgICAgICAgY2hpbGQ6IHRoaXMsXG4gICAgICAgICAgICAgICBpbmRleDogdGhpcy5fcGFyZW50LmJyYW5jaGVzKCkubGVuZ3RoXG4gICAgICAgICAgICB9KVxuICAgICAgICAgKTtcbiAgICAgICAgIHRoaXMuc2V0SW5kZW50YXRpb24oKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuICAgfVxuXG4gICAvKiogQHJldHVybnMgQWxsIGNoaWxkIGJyYW5jaGVzIGFzIGFuIGFycmF5IG9mIFRyZWVCcmFuY2ggaW5zdGFuY2VzLCBpbiBvcmRlci4gKi9cbiAgIHB1YmxpYyBicmFuY2hlcygpOiBBcnJheTxUcmVlQnJhbmNoPFVzZXJsYW5kQ29tcG9uZW50Pj4ge1xuICAgICAgcmV0dXJuIHRoaXMudHJlZU5vZGVCYXNlLmJyYW5jaGVzKCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogUmVjdXJzaXZlbHkgZGVzdHJveXMgYWxsIGRlc2NlbmRhbnQgYnJhbmNoZXMsIGFzIHdlbGwgYXMgaXRzZWxmLiBUaGlzXG4gICAgKiByZWxlYXNlcyBhbGwgcmVzb3VyY2VzIGhlbGQgb3IgY29uc3VtZWQgYnkgdGhpcyBicmFuY2ggYW5kIGl0cyBkZXNjZW5kYW50cy5cbiAgICAqXG4gICAgKiBAcmVtYXJrc1xuICAgICogSXQgaXMgaW1wb3J0YW50IHRvIGNhbGwgdGhpcyBtZXRob2Qgd2hlbiBhIGJyYW5jaCBpcyBkaXNjYXJkZWQsIG90aGVyd2lzZVxuICAgICogdGhlIGJyYW5jaCB3aWxsIHJlbWFpbiBpbiBtZW1vcnkgYW5kIGNvbnRpbnVlIHRvIGNvbnN1bWUgcmVzb3VyY2VzLlxuICAgICovXG4gICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKCkpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXCJDYW5ub3QgZGVzdHJveSBhIGRlc3Ryb3llZCB0cmVlIGJyYW5jaFwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucHJ1bmUoKTtcbiAgICAgIHRyZWVDb2xsYXBzZXIuZXhwYW5kKHRoaXMpO1xuICAgICAgZHJvcHpvbmVSZW5kZXJlci5jbGVhclRyZWVGcm9tUmVnaXN0cnkodGhpcyk7XG4gICAgICB0aGlzLmJyYW5jaENvbnRyb2xsZXIuZ2V0SG9zdFZpZXcoKS5kZXN0cm95KCk7XG4gICAgICB0aGlzLnRyZWVOb2RlQmFzZS5kZXN0cm95KCk7XG4gICAgICB0aGlzLmJyYW5jaENvbnRyb2xsZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5kaXNwYXRjaChuZXcgRGVzdHJ1Y3Rpb25FdmVudCh0aGlzKSk7XG4gICB9XG5cbiAgIC8qKiBSdW4gQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoaXMgYnJhbmNoICovXG4gICBwdWJsaWMgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkIHtcbiAgICAgIHRoaXMuYnJhbmNoQ29udHJvbGxlci5kZXRlY3RDaGFuZ2VzKCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogRW1pdHMgdGhlIHNwZWNpZmllZCBUcmVlRXZlbnQuXG4gICAgKlxuICAgICogQHJlbWFya3NcbiAgICAqIENhdXRpb246IEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBtYW51YWxseSBlbWl0IFRyZWVFdmVudHMgdGhhdCBhcmUgYWxyZWFkeVxuICAgICogcHJvdmlkZWQgYnkgdGhlIGxpYnJhcnkuIEZvciBleGFtcGxlLCBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gZW1pdCBhXG4gICAgKiBgR3JhZnRFdmVudGAsIGBEZXN0cnVjdGlvbkV2ZW50YCwgZXRjLiBUaGVzZSBldmVudHMgbWF5IGJlIHVzZWQgYnkgdGhlIHRyZWUsXG4gICAgKiBhbmQgZW1pdHRpbmcgdGhlbSBtYW51YWxseSBtYXkgY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvci4gSW5zdGVhZCwgd2VcbiAgICAqIHJlY29tbWVuZCBpbXBsZW1lbnRpbmcgdGhlIFRyZWVFdmVudCBpbnRlcmZhY2Ugd2l0aCB5b3VyIG93biBjdXN0b20gZXZlbnRzXG4gICAgKiBhbmQgZGlzcGF0Y2hpbmcgdGhvc2UuXG4gICAgKlxuICAgICogQHBhcmFtIGV2ZW50IC0gVGhlIFRyZWVFdmVudCB0aGF0IHdpbGwgYmUgZW1pdHRlZC5cbiAgICAqL1xuICAgcHVibGljIGRpc3BhdGNoKGV2ZW50OiBUcmVlRXZlbnQ8VXNlcmxhbmRDb21wb25lbnQ+KTogdm9pZCB7XG4gICAgICB0aGlzLnRyZWVOb2RlQmFzZS5kaXNwYXRjaChldmVudCk7XG4gICAgICB0aGlzLl9wYXJlbnQ/LmRpc3BhdGNoKGV2ZW50KTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBAcmV0dXJuc1xuICAgICogQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIFRyZWVFdmVudHMgd2hlbmV2ZXIgYW4gZXZlbnQgaXMgZGlzcGF0Y2hlZFxuICAgICogaW4gdGhpcyBicmFuY2ggb3IgYW55IG9mIGl0cyBkZXNjZW5kYW50IGJyYW5jaGVzLlxuICAgICovXG4gICBwdWJsaWMgZXZlbnRzKCk6IE9ic2VydmFibGU8VHJlZUV2ZW50PFVzZXJsYW5kQ29tcG9uZW50Pj4ge1xuICAgICAgcmV0dXJuIHRoaXMudHJlZU5vZGVCYXNlLmV2ZW50cygpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgYnJhbmNoIHRvIHJldHJpZXZlLlxuICAgICpcbiAgICAqIEByZXR1cm5zXG4gICAgKiBUaGUgY2hpbGQgYnJhbmNoIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSBpc1xuICAgICogbm8gY2hpbGQgYnJhbmNoIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguXG4gICAgKi9cbiAgIHB1YmxpYyBnZXRCcmFuY2goaW5kZXg6IG51bWJlcik6IFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLnRyZWVOb2RlQmFzZS5nZXRCcmFuY2goaW5kZXgpO1xuICAgfVxuXG4gICAvKiogQHJldHVybnMgVGhlIFZpZXdDb250YWluZXJSZWYgaW4gd2hpY2ggY2hpbGQgYnJhbmNoZXMgYXJlIHJlbmRlcmVkICovXG4gICBwdWJsaWMgZ2V0QnJhbmNoZXNDb250YWluZXIoKTogVmlld0NvbnRhaW5lclJlZiB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFxuICAgICAgICAgICAgXCJDYW5ub3QgZ2V0IGJyYW5jaGVzIGNvbnRhaW5lciBmcm9tIGEgZGVzdHJveWVkIHRyZWUgYnJhbmNoXCJcbiAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5icmFuY2hDb250cm9sbGVyLmdldEJyYW5jaGVzQ29udGFpbmVyKCk7XG4gICB9XG5cbiAgIC8qKiBAcmV0dXJucyBUaGUgaW5zdGFuY2Ugb2YgQnJhbmNoQ29tcG9uZW50IHRoYXQgaXMgcmVuZGVyZWQgYnkgdGhpcyBjbGFzcy4gKi9cbiAgIHB1YmxpYyBnZXRDb21wb25lbnRJbnN0YW5jZSgpOiBCcmFuY2hDb21wb25lbnQ8VXNlcmxhbmRDb21wb25lbnQ+IHtcbiAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKCkpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXG4gICAgICAgICAgICBcIkNhbm5vdCBnZXQgY29tcG9uZW50IGluc3RhbmNlIGZyb20gYSBkZXN0cm95ZWQgdHJlZSBicmFuY2hcIlxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmJyYW5jaENvbnRyb2xsZXIuZ2V0Q29tcG9uZW50SW5zdGFuY2UoKTtcbiAgIH1cblxuICAgLyoqIEByZXR1cm5zIFRoZSBIb3N0IFZpZXcgaW4gd2hpY2ggdGhlIEJyYW5jaENvbXBvbmVudCBpcyByZW5kZXJlZCAqL1xuICAgcHVibGljIGdldEhvc3RWaWV3KCk6IFZpZXdSZWYge1xuICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcbiAgICAgICAgICAgIFwiQ2Fubm90IGdldCBjb21wb25lbnQgaG9zdCB2aWV3IGZyb20gYSBkZXN0cm95ZWQgdHJlZSBicmFuY2hcIlxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmJyYW5jaENvbnRyb2xsZXIuZ2V0SG9zdFZpZXcoKTtcbiAgIH1cblxuICAgLyoqIEByZXR1cm5zIFRoZSBCcmFuY2hDb21wb25lbnQgYXMgYSBuYXRpdmUgSFRNTCBFbGVtZW50ICovXG4gICBwdWJsaWMgZ2V0TmF0aXZlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFxuICAgICAgICAgICAgXCJDYW5ub3QgZ2V0IG5hdGl2ZSBlbGVtZW50IGZyb20gYSBkZXN0cm95ZWQgdHJlZSBicmFuY2hcIlxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmJyYW5jaENvbnRyb2xsZXIuZ2V0TmF0aXZlRWxlbWVudCgpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEByZXR1cm5zXG4gICAgKiBBIENvbXBvbmVudFJlZiBjb250YWluaW5nIHRoZSBpbnN0YW5jZSBvZiB0aGUgdXNlci1wcm92aWRlZFxuICAgICogY29tcG9uZW50IHdoaWNoIGlzIHJlbmRlcmVkIGJ5IHRoaXMgYnJhbmNoLlxuICAgICovXG4gICBwdWJsaWMgZ2V0VXNlcmxhbmRDb21wb25lbnRSZWYoKTpcbiAgICAgIHwgQ29tcG9uZW50UmVmPFVzZXJsYW5kQ29tcG9uZW50PlxuICAgICAgfCB1bmRlZmluZWQge1xuICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcbiAgICAgICAgICAgIFwiQ2Fubm90IGdldCB1c2VybGFuZCBjb21wb25lbnQgZnJvbSBhIGRlc3Ryb3llZCB0cmVlIGJyYW5jaFwiXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnJhbmNoQ29udHJvbGxlci5nZXRVc2VybGFuZENvbXBvbmVudFJlZigpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEF0dGFjaGVzIGEgYnJhbmNoIHRvIGEgbmV3IHBhcmVudCBub2RlLlxuICAgICpcbiAgICAqIEByZW1hcmtzXG4gICAgKiBJZiBub3QgYWxyZWFkeSBwcnVuZWQsIHRoaXMgbWV0aG9kIHBydW5lcyAocmVtb3ZlcykgdGhpcyBicmFuY2ggZnJvbSBpdHNcbiAgICAqIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHRyZWU7IHRoZW4gZ3JhZnRzIChyZWF0dGFjaGVzKSBpdCBhcyBhIGNoaWxkIG9mIHRoZVxuICAgICogc3BlY2lmaWVkIHBhcmVudCBicmFuY2ggYXQgdGhlIHNwZWNpZmllZCBpbmRleC4gSWYgbm8gaW5kZXggaXMgc3BlY2lmaWVkLFxuICAgICogdGhlIGJyYW5jaCBpcyBhcHBlbmRlZCBhcyB0aGUgbGFzdCBjaGlsZCBvZiB0aGUgcGFyZW50LiBUaGlzIGNhdXNlcyB0aGlzXG4gICAgKiBicmFuY2gncyBhc3NvY2lhdGVkIEJyYW5jaENvbXBvbmVudCB0byBiZSByZS1yZW5kZXJlZCBpbiB0aGUgRE9NIGF0IHRoZVxuICAgICogbmV3IGxvY2F0aW9uLlxuICAgICpcbiAgICAqIEBwYXJhbSBuZXdQYXJlbnQgLSBUaGUgbmV3IHBhcmVudCBicmFuY2ggdW50byB3aGljaCB0aGlzIGJyYW5jaCB3aWxsIGJlIGdyYWZ0ZWQuXG4gICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggYXQgd2hpY2ggdGhpcyBicmFuY2ggd2lsbCBiZSBncmFmdGVkLiBJZiBub3Qgc3BlY2lmaWVkLFxuICAgICogdGhpcyBicmFuY2ggd2lsbCBiZSBhcHBlbmRlZCBhcyB0aGUgbGFzdCBjaGlsZCBvZiB0aGUgbmV3IHBhcmVudC5cbiAgICAqXG4gICAgKiBAcmV0dXJucyBUaGUgaW5kZXggYXQgd2hpY2ggdGhpcyBicmFuY2ggd2FzIGdyYWZ0ZWQuXG4gICAgKi9cbiAgIHB1YmxpYyBncmFmdFRvKFxuICAgICAgbmV3UGFyZW50OiBUcmVlTm9kZTxVc2VybGFuZENvbXBvbmVudD4sXG4gICAgICBpbmRleD86IG51bWJlclxuICAgKTogbnVtYmVyIHtcbiAgICAgIHRoaXMuY2hlY2tHcmFmdExvY2F0aW9uVmFsaWRpdHkobmV3UGFyZW50LCBpbmRleCk7XG4gICAgICBjb25zdCBvd25JbmRleCA9IHRoaXMuaW5kZXgoKTtcbiAgICAgIGlmIChvd25JbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICB0aGlzLnBydW5lKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9wYXJlbnQgPSBuZXdQYXJlbnQ7XG4gICAgICBjb25zdCBuZXdJbmRleCA9IGluZGV4ID8/IG5ld1BhcmVudC5icmFuY2hlcygpLmxlbmd0aDtcbiAgICAgIHRoaXMucmVhdHRhY2hWaWV3KG5ld0luZGV4KTtcbiAgICAgIHRoaXMuZGlzcGF0Y2goXG4gICAgICAgICBuZXcgR3JhZnRFdmVudCh0aGlzLCB7XG4gICAgICAgICAgICBwYXJlbnQ6IG5ld1BhcmVudCxcbiAgICAgICAgICAgIGNoaWxkOiB0aGlzLFxuICAgICAgICAgICAgaW5kZXg6IG5ld0luZGV4XG4gICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHJldHVybiBuZXdJbmRleDtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBBcHBlbmRzIGEgbmV3IGNoaWxkIGJyYW5jaCB0byB0aGlzIGJyYW5jaC4gVGhlIGNoaWxkIGJyYW5jaCB3aWxsIHJlbmRlclxuICAgICogdGhlIHNwZWNpZmllZCBjb21wb25lbnQgYWNjb3JkaW5nIHRvIHRoZSAob3B0aW9uYWwpIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLlxuICAgICpcbiAgICAqIEBwYXJhbSBjb21wb25lbnQgLSBUaGUgY29tcG9uZW50IHRvIHJlbmRlciBpbiB0aGUgbmV3IGNoaWxkIGJyYW5jaC5cbiAgICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbmV3IGNoaWxkIGJyYW5jaC5cbiAgICAqXG4gICAgKiBAcmV0dXJuc1xuICAgICogVGhlIG5ld2x5LWNyZWF0ZWQgY2hpbGQgYnJhbmNoLlxuICAgICovXG4gICBwdWJsaWMgZ3JvdyhcbiAgICAgIGNvbXBvbmVudDogVHlwZTxVc2VybGFuZENvbXBvbmVudD4sXG4gICAgICBvcHRpb25zPzogQnJhbmNoT3B0aW9uczxVc2VybGFuZENvbXBvbmVudD5cbiAgICk6IFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+IHtcbiAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKCkpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXCJDYW5ub3QgZ3JvdyBhIGJyYW5jaCBvbiBhIGRlc3Ryb3llZCB0cmVlIGJyYW5jaFwiKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgICByZXR1cm4gbmV3IFRyZWVCcmFuY2godGhpcywgeyBjb21wb25lbnQsIC4uLm9wdGlvbnMgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgdGhpcy5oYW5kbGVVc2VybGFuZEVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgIH1cblxuICAgLyoqXG4gICAgKiBEZXRlcm1pbmVzIHRoaXMgYnJhbmNoJ3MgaW5kZXggaW4gcmVsYXRpb24gdG8gaXRzIHNpYmxpbmcgYnJhbmNoZXMuXG4gICAgKlxuICAgICogQHJlbWFya3NcbiAgICAqIEZvciBleGFtcGxlLCBpZiBpdCBpcyB0aGUgZmlyc3QgY2hpbGQgb2YgaXRzIHBhcmVudCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm5cbiAgICAqIDAuIElmIGl0IGlzIHRoZSBzZWNvbmQgY2hpbGQgb2YgaXRzIHBhcmVudCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gMS5cbiAgICAqXG4gICAgKiBJZiB0aGlzIGJyYW5jaCBoYXMgbm8gcGFyZW50LCAoZWcsIGlmIHRoaXMgYnJhbmNoIGhhcyBiZWVuIHBydW5lZCkgdGhpc1xuICAgICogbWV0aG9kIHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICAqXG4gICAgKiBAcmV0dXJuc1xuICAgICogVGhlIGluZGV4IG9mIHRoaXMgYnJhbmNoIGluIHJlbGF0aW9uIHRvIGl0cyBzaWJsaW5nIGJyYW5jaGVzLCBvciB1bmRlZmluZWQuXG4gICAgKi9cbiAgIHB1YmxpYyBpbmRleCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgaWYgKCF0aGlzLl9wYXJlbnQpIHtcbiAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuX3BhcmVudFxuICAgICAgICAgLmJyYW5jaGVzKClcbiAgICAgICAgIC5maW5kSW5kZXgoKGJyYW5jaCkgPT4gYnJhbmNoID09PSB0aGlzKTtcbiAgICAgIGFzc2VydChpbmRleCA+PSAwKTtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgIH1cblxuICAgLyoqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYnJhbmNoIGlzIGRlc3Ryb3llZCwgYGZhbHNlYCBvdGhlcndpc2UgKi9cbiAgIHB1YmxpYyBpc0Rlc3Ryb3llZCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLnRyZWVOb2RlQmFzZS5pc0Rlc3Ryb3llZCgpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEByZXR1cm5zXG4gICAgKiBUaGUgZGF0YSB0aGF0IHdhcyBwYXNzZWQgaW50byB0aGUgYGJyYW5jaE9wdGlvbnNgJyBgbWV0YWAgcHJvcGVydHlcbiAgICAqIGF0IGNvbnN0cnVjdGlvbi5cbiAgICAqL1xuICAgcHVibGljIG1ldGEoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICByZXR1cm4gdGhpcy5icmFuY2hPcHRpb25zLm1ldGEgPz8ge307XG4gICB9XG5cbiAgIC8qKlxuICAgICogQHJldHVybnNcbiAgICAqIFRoaXMgYnJhbmNoJ3MgcGFyZW50IG5vZGUgKHdoaWNoIG1heSBiZSBhIFRyZWVCcmFuY2ggb3IgVHJlZVJvb3QpLlxuICAgICogSWYgdGhpcyBicmFuY2ggaGFzIG5vIHBhcmVudCwgKGVnLCBpZiB0aGlzIGJyYW5jaCBoYXMgYmVlbiBwcnVuZWQpIHRoaXNcbiAgICAqIG1ldGhvZCB3aWxsIHJldHVybiB1bmRlZmluZWQuXG4gICAgKi9cbiAgIHB1YmxpYyBwYXJlbnQoKTogVHJlZU5vZGU8VXNlcmxhbmRDb21wb25lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQ7XG4gICB9XG5cbiAgIC8qKlxuICAgICogUHJvdmlkZXMgYSBtb2RlbCBkZXNjcmliaW5nIHRoaXMgYnJhbmNoJ3MgZGVzY2VuZGFudHMuXG4gICAgKlxuICAgICogQHJldHVybnNcbiAgICAqIEEgbXVsdGktZGltZW5zaW9uYWwgTWFwIHdoaWNoIGRlc2NyaWJlcyB0aGUgc2hhcGUgb2YgdGhpcyBicmFuY2gnc1xuICAgICogZGVzY2VuZGFudHMuXG4gICAgKlxuICAgICogQGV4YW1wbGVcbiAgICAqIEEgYnJhbmNoIHdpdGggbm8gY2hpbGRyZW4gd2lsbCByZXR1cm4gYW4gZW1wdHkgTWFwLiBBIGJyYW5jaCB3aXRoXG4gICAgKiBhIHNpbmdsZSBjaGlsZCB3aWxsIHJldHVybiBhIE1hcCB3aXRoIGEgc2luZ2xlIGVudHJ5LCB3aGVyZSB0aGUga2V5IGlzIHRoZSBpbmRleFxuICAgICogb2YgdGhlIGJyYW5jaCAoemVybykgYW5kIHRoZSB2YWx1ZSBpcyBhbiBlbXB0eSBNYXAuIEEgVHJlZSBsaWtlIHRoaXM6XG4gICAgKlxuICAgICogYGBgXG4gICAgKiAgICAgICAgIC0tLUJyYW5jaC0tLS0tLS1CcmFuY2hcbiAgICAqICAgICAgICAvXG4gICAgKiBCcmFuY2gtLS0tLS0tQnJhbmNoXG4gICAgKiAgICAgICAgXFxcbiAgICAqICAgICAgICAgLS0tQnJhbmNoXG4gICAgKiBgYGBcbiAgICAqIFdpbGwgcmV0dXJuIGEgTWFwIG9mIG1hdGNoaW5nIHNoYXBlOlxuICAgICogYGBgXG4gICAgKiBNYXAge1xuICAgICogICAgMDogTWFwIHsgMDogTWFwIHt9fSxcbiAgICAqICAgIDE6IE1hcCB7fSxcbiAgICAqICAgIDI6IE1hcCB7fVxuICAgICogfVxuICAgICogYGBgXG4gICAgKi9cbiAgIHB1YmxpYyBwbG90KCk6IFRyZWVQbG90IHtcbiAgICAgIHJldHVybiB0aGlzLnRyZWVOb2RlQmFzZS5wbG90KCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQ2FsY3VsYXRlcyB0aGUgYnJhbmNoJ3MgcG9zaXRpb24gaW4gdGhlIHRyZWUgcmVsYXRpdmUgdG8gdGhlIFJvb3QuXG4gICAgKlxuICAgICogQHJlbWFya3NcbiAgICAqIFRoZSBwb3NpdGlvbiBpcyBkZXNjcmliZWQgYXMgYW4gYXJyYXkgb2YgbnVtYmVycywgd2hlcmUgZWFjaCBudW1iZXJcbiAgICAqIHJlcHJlc2VudHMgdGhlIGluZGV4IG9mIHRoZSBicmFuY2ggYXQgdGhhdCBsZXZlbCBvZiB0aGUgdHJlZS5cbiAgICAqXG4gICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhpcyBicmFuY2ggaXMgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBSb290LCB0aGlzIG1ldGhvZFxuICAgICogd2lsbCByZXR1cm4gWzBdLiBJZiB0aGlzIGJyYW5jaCBpcyB0aGUgc2Vjb25kIGNoaWxkIG9mIHRoZSBmaXJzdCBjaGlsZFxuICAgICogb2YgdGhlIFJvb3QsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIFswLCAxXS5cbiAgICAqXG4gICAgKiBJZiB0aGUgYnJhbmNoIGlzIG5vdCByZWxhdGVkIHRvIGEgVHJlZVJvb3QsIChzdWNoIGFzIHdoZW4gaXQgaGFzIGJlZW5cbiAgICAqIHBydW5lZCwpIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAgKlxuICAgICogQHJldHVybnNcbiAgICAqIEFuIGFycmF5IG9mIG51bWJlcnMgd2hpY2ggZGVzY3JpYmUgdGhlIGJyYW5jaCdzIHBvc2l0aW9uIGluIHRoZSB0cmVlXG4gICAgKiByZWxhdGl2ZSB0byB0aGUgUm9vdC5cbiAgICAqL1xuICAgcHVibGljIHBvc2l0aW9uKCk6IEFycmF5PG51bWJlcj4ge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4KCk7XG4gICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcbiAgICAgICAgICAgIFwiYnJhbmNoIGhhcyBubyBwYXJlbnQuIFBvc2l0aW9uIGNhbm5vdCBiZSBkZXRlcm1pbmVkLlwiXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIFRyZWVCcmFuY2gpIHtcbiAgICAgICAgIGNvbnN0IHBhcmVudFBvc2l0aW9uID0gdGhpcy5fcGFyZW50LnBvc2l0aW9uKCk7XG4gICAgICAgICByZXR1cm4gWy4uLnBhcmVudFBvc2l0aW9uLCBpbmRleF07XG4gICAgICB9XG4gICAgICByZXR1cm4gW2luZGV4XTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBSZW1vdmVzIGEgYnJhbmNoIGZyb20gaXRzIHRyZWUgd2l0aG91dCBkZXN0cm95aW5nIGl0LlxuICAgICpcbiAgICAqIEByZW1hcmtzXG4gICAgKiBSZW1vdmVzIHRoaXMgYnJhbmNoIGZyb20gaXRzIHBhcmVudCBhbmQgZGV0YWNoZXMgaXRzIGFzc29jaWF0ZWRcbiAgICAqIEJyYW5jaENvbXBvbmVudCBmcm9tIHRoZSBET00uIFRoaXMgcHV0cyB0aGUgYnJhbmNoIGluIGEgXCJwcnVuZWRcIiBzdGF0ZSxcbiAgICAqIHdoaWNoIG1heSBhZmZlY3QgdGhlIGJlaGF2aW9yIG9mIG90aGVyIG1ldGhvZHMuXG4gICAgKlxuICAgICogQSBwcnVuZWQgYnJhbmNoIGNhbiBiZSByZWF0dGFjaGVkIHRvIGFueSBvdGhlciBub2RlIHVzaW5nIHRoZSBgZ3JhZnRUb2AgbWV0aG9kLlxuICAgICpcbiAgICAqIEByZXR1cm5zXG4gICAgKiBJdHNlbGYsIG9yIHVuZGVmaW5lZCBpZiBpdCBpcyBhbHJlYWR5IGluIGEgcHJ1bmVkIHN0YXRlLlxuICAgICovXG4gICBwdWJsaWMgcHJ1bmUoKTogdGhpcyB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFwiQ2Fubm90IHBydW5lIGEgZGVzdHJveWVkIHRyZWUgYnJhbmNoXCIpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5fcGFyZW50O1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4KCk7XG4gICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCB8fCBwYXJlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgY29uc3QgY29udGFpbmVyID0gcGFyZW50LmdldEJyYW5jaGVzQ29udGFpbmVyKCk7XG4gICAgICBhc3NlcnQoY29udGFpbmVyICE9PSB1bmRlZmluZWQpO1xuICAgICAgdGhpcy5kZXRhY2hlZFZpZXcgPSBjb250YWluZXIuZGV0YWNoKGluZGV4KTtcbiAgICAgIGFzc2VydCh0aGlzLmRldGFjaGVkVmlldyAhPT0gbnVsbCk7XG4gICAgICB0aGlzLmRldGFjaGVkVmlldy5kZXRhY2goKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2goXG4gICAgICAgICBuZXcgUHJ1bmVFdmVudCh0aGlzLCB7XG4gICAgICAgICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgICAgIGNoaWxkOiB0aGlzLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuX3BhcmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEdldCB0aGUgcm9vdCBvZiB0aGUgdHJlZSB0byB3aGljaCB0aGlzIEJyYW5jaCBpcyBhdHRhY2hlZC5cbiAgICAqXG4gICAgKiBAcmV0dXJuc1xuICAgICogVGhlIFRyZWVSb290IG9mIHRoZSB0cmVlIHRoaXMgYnJhbmNoIGlzIGluLiBJZiB0aGlzIGJyYW5jaCBpc1xuICAgICogZG9lcyBub3QgaGF2ZSBhIHJvb3QgKHN1Y2ggYXMgd2hlbiBpdCBoYXMgYmVlbiBwcnVuZWQpIHRoaXMgbWV0aG9kIHdpbGxcbiAgICAqIHJldHVybiB1bmRlZmluZWQuXG4gICAgKi9cbiAgIHB1YmxpYyByb290KCk6IFRyZWVSb290PFVzZXJsYW5kQ29tcG9uZW50PiB8IHVuZGVmaW5lZCB7XG4gICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudCgpO1xuICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRyZWVCcmFuY2gpIHtcbiAgICAgICAgIHJldHVybiBwYXJlbnQucm9vdCgpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KHBhcmVudCBpbnN0YW5jZW9mIFRyZWVSb290IHx8IHBhcmVudCA9PT0gdW5kZWZpbmVkKTtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICB9XG5cbiAgIC8qKlxuICAgICogVHJhdmVyc2VzIHRoaXMgYnJhbmNoJ3MgZGVzY2VuZGFudHMgaW4gZGVwdGgtZmlyc3QgcHJlLW9yZGVyLCBleGVjdXRpbmdcbiAgICAqIHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBvbiBlYWNoIG5vZGUuIFRyYXZlcnNhbCBpbmNsdWRlcyB0aGlzIGJyYW5jaC5cbiAgICAqXG4gICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gZWFjaCBub2RlLlxuICAgICovXG4gICBwdWJsaWMgdHJhdmVyc2UoXG4gICAgICBjYWxsYmFjazogKG5vZGU6IFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+KSA9PiB2b2lkXG4gICApOiB2b2lkIHtcbiAgICAgIGNhbGxiYWNrKHRoaXMpO1xuICAgICAgdGhpcy50cmVlTm9kZUJhc2UudHJhdmVyc2UoY2FsbGJhY2spO1xuICAgfVxuXG4gICBwcml2YXRlIGNoZWNrR3JhZnRMb2NhdGlvblZhbGlkaXR5KFxuICAgICAgbmV3UGFyZW50OiBUcmVlTm9kZTxVc2VybGFuZENvbXBvbmVudD4sXG4gICAgICBpbmRleD86IG51bWJlclxuICAgKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFwiQ2Fubm90IGdyYWZ0IGEgZGVzdHJveWVkIHRyZWUgYnJhbmNoXCIpO1xuICAgICAgfVxuICAgICAgaWYgKG5ld1BhcmVudC5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFwiQ2Fubm90IGdyYWZ0IHRvIGEgZGVzdHJveWVkIHRyZWUgYnJhbmNoXCIpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAgdHlwZW9mIGluZGV4ID09PSBcIm51bWJlclwiICYmXG4gICAgICAgICB0aGlzLmluZGV4SXNPdXRPZlJhbmdlKG5ld1BhcmVudCwgaW5kZXgpXG4gICAgICApIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGdyYWZ0IGJyYW5jaCBhdCBpbmRleCAke2luZGV4fSBvZiB0aGUgcGFyZW50LiBPdXQgb2YgcmFuZ2UuYFxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudHJhdmVyc2UoKG5vZGUpID0+IHtcbiAgICAgICAgIGlmIChub2RlID09PSBuZXdQYXJlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXG4gICAgICAgICAgICAgICBcIkNhbm5vdCBncmFmdCBhIGJyYW5jaCB0byBpdHNlbGYgb3IgYW55IG9mIGl0cyBvd24gZGVzY2VuZGFudHNcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgfVxuXG4gICBwcml2YXRlIGhhbmRsZVVzZXJsYW5kRXJyb3IoZXJyb3I6IHVua25vd24pOiBuZXZlciB7XG4gICAgICAvKiBXaGVuIGFuIGVycm9yIG9jY3VycyBpbiBhIHVzZXJsYW5kIGNvbXBvbmVudCBkdXJpbmcgYSB0cmVlIG9wZXJhdGlvbixcbiAgICAgICAqIGl0IGNhbiBjYXVzZSB1bmRlZmluZWQsIGJpemFycmUgYmVoYXZpb3IgaW4gdGhlIHRyZWUuIFRvIHByZXZlbnQgdGhpcyxcbiAgICAgICAqIHdlIGRlc3Ryb3kgdGhlIHRyZWUgYW5kIHRocm93IGFuIGVycm9yIGluc3RlYWQuIFRoaXMgaGVscHMgcHJvdGVjdFxuICAgICAgICogdGhlIGVuZC11c2VyJ3MgZGF0YSBmcm9tIGNvcnJ1cHRpb24uICovXG4gICAgICB0aGlzLmZ1cnRoZXN0QW5jZXN0b3IoKS5kZXN0cm95KCk7XG4gICAgICB0aGlzLnRyZWVOb2RlQmFzZS5oYW5kbGVVc2VybGFuZEVycm9yKGVycm9yKTtcbiAgIH1cblxuICAgcHJpdmF0ZSBpbmRleElzT3V0T2ZSYW5nZShcbiAgICAgIHBhcmVudDogVHJlZU5vZGU8VXNlcmxhbmRDb21wb25lbnQ+LFxuICAgICAgaW5kZXg6IG51bWJlclxuICAgKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gaW5kZXggPCAwIHx8IGluZGV4ID4gcGFyZW50LmJyYW5jaGVzKCkubGVuZ3RoO1xuICAgfVxuXG4gICBwcml2YXRlIGZ1cnRoZXN0QW5jZXN0b3IoKTogVHJlZU5vZGU8VXNlcmxhbmRDb21wb25lbnQ+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L25vLXRoaXMtYWxpYXMgLS0gVGhpcyBjb2RlIGlzIGZvciBhbiBpdGVyYXRpb24sIG5vdCB0byBtYWtlIGB0aGlzYCBhdmFpbGFibGUgaW4gb3RoZXIgc2NvcGVzICh3aGljaCBpcyB3aGF0IHRoZSBydWxlIGlzIGludGVuZGVkIHRvIHByb3RlY3QgYWdhaW5zdCkuXG4gICAgICBsZXQgbm9kZTogVHJlZU5vZGU8VXNlcmxhbmRDb21wb25lbnQ+ID0gdGhpcztcbiAgICAgIHdoaWxlIChub2RlIGluc3RhbmNlb2YgVHJlZUJyYW5jaCkge1xuICAgICAgICAgY29uc3QgcGFyZW50ID0gbm9kZS5wYXJlbnQoKTtcbiAgICAgICAgIGlmIChwYXJlbnQgPT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICAgICBub2RlID0gcGFyZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vZGU7XG4gICB9XG5cbiAgIHByaXZhdGUgcmVhdHRhY2hWaWV3KGluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgICBhc3NlcnQodGhpcy5fcGFyZW50ICE9PSB1bmRlZmluZWQpO1xuICAgICAgYXNzZXJ0KHRoaXMuZGV0YWNoZWRWaWV3ICE9PSBudWxsKTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuX3BhcmVudC5nZXRCcmFuY2hlc0NvbnRhaW5lcigpO1xuICAgICAgYXNzZXJ0KGNvbnRhaW5lciAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIHRoaXMuZGV0YWNoZWRWaWV3LnJlYXR0YWNoKCk7XG4gICAgICBjb250YWluZXIuaW5zZXJ0KHRoaXMuZGV0YWNoZWRWaWV3LCBpbmRleCk7XG4gICAgICB0aGlzLmRldGFjaGVkVmlldyA9IG51bGw7XG4gICAgICB0aGlzLnNldEluZGVudGF0aW9uKCk7XG4gICB9XG5cbiAgIHByaXZhdGUgc2V0SW5kZW50YXRpb24oKTogdm9pZCB7XG4gICAgICBhc3NlcnQodGhpcy5fcGFyZW50ICE9PSB1bmRlZmluZWQpO1xuICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuX3BhcmVudC5yb290KCk7XG4gICAgICBpZiAocm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBvcHRpb25zID0gY29uZmlnLmdldENvbmZpZyhyb290KTtcbiAgICAgIGNvbnN0IGJyYW5jaGVzQ29udGFpbmVyRWwgPSB0aGlzLmJyYW5jaENvbnRyb2xsZXJcbiAgICAgICAgIC5nZXROYXRpdmVFbGVtZW50KClcbiAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiYnJhbmNoZXMtY29udGFpbmVyXCIpXG4gICAgICAgICAuaXRlbSgwKTtcbiAgICAgIGFzc2VydChicmFuY2hlc0NvbnRhaW5lckVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpO1xuICAgICAgYnJhbmNoZXNDb250YWluZXJFbC5zdHlsZS5tYXJnaW5MZWZ0ID0gYCR7b3B0aW9ucz8uaW5kZW50YXRpb24gPz8gMTZ9cHhgO1xuICAgfVxufVxuIl19
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { filter, Subject } from "rxjs";
|
|
2
|
+
import { hasProperty } from "../../shared";
|
|
3
|
+
import { TreeError } from "../errors";
|
|
4
|
+
import { GraftEvent, PruneEvent } from "../events";
|
|
5
|
+
export class TreeNodeBase {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.destroyed = false;
|
|
8
|
+
this._branches = [];
|
|
9
|
+
this.events$ = new Subject();
|
|
10
|
+
this.subscriptions = [
|
|
11
|
+
this.graftsToSelf().subscribe((event) => {
|
|
12
|
+
this.registerChildRelationship(event.child(), event.index());
|
|
13
|
+
}),
|
|
14
|
+
this.prunesToSelf().subscribe((event) => {
|
|
15
|
+
this.deregisterChildRelationship(event.child());
|
|
16
|
+
})
|
|
17
|
+
];
|
|
18
|
+
}
|
|
19
|
+
branches() {
|
|
20
|
+
return [...this._branches];
|
|
21
|
+
}
|
|
22
|
+
destroy() {
|
|
23
|
+
this.branches().forEach((branch) => {
|
|
24
|
+
branch.destroy();
|
|
25
|
+
});
|
|
26
|
+
this.subscriptions.forEach((sub) => {
|
|
27
|
+
sub.unsubscribe();
|
|
28
|
+
});
|
|
29
|
+
this.destroyed = true;
|
|
30
|
+
}
|
|
31
|
+
dispatch(event) {
|
|
32
|
+
this.events$.next(event);
|
|
33
|
+
}
|
|
34
|
+
events() {
|
|
35
|
+
return this.events$;
|
|
36
|
+
}
|
|
37
|
+
getBranch(index) {
|
|
38
|
+
return this._branches[index];
|
|
39
|
+
}
|
|
40
|
+
handleUserlandError(error) {
|
|
41
|
+
const message = hasProperty(error, "message")
|
|
42
|
+
? error.message
|
|
43
|
+
: "Unknown error";
|
|
44
|
+
throw new TreeError(`Failed to grow branch: ${message}`, {
|
|
45
|
+
cause: error
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
isDestroyed() {
|
|
49
|
+
return this.destroyed;
|
|
50
|
+
}
|
|
51
|
+
plot() {
|
|
52
|
+
return new Map(this.branches().map((branch, index) => [index, branch.plot()]));
|
|
53
|
+
}
|
|
54
|
+
traverse(callback) {
|
|
55
|
+
this.branches().forEach((branch) => {
|
|
56
|
+
branch.traverse(callback);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
deregisterChildRelationship(child) {
|
|
60
|
+
const index = this.branches().findIndex((branch) => branch === child);
|
|
61
|
+
this._branches.splice(index, 1);
|
|
62
|
+
}
|
|
63
|
+
graftsToSelf() {
|
|
64
|
+
return this.events().pipe(filter((event) => event instanceof GraftEvent), filter((event) => event.parent().events() === this.events$));
|
|
65
|
+
}
|
|
66
|
+
prunesToSelf() {
|
|
67
|
+
return this.events().pipe(filter((event) => event instanceof PruneEvent), filter((event) => event.parent().events() === this.events$));
|
|
68
|
+
}
|
|
69
|
+
registerChildRelationship(child, index) {
|
|
70
|
+
const branches = this.branches();
|
|
71
|
+
if (index < 0 || index > branches.length) {
|
|
72
|
+
throw new TreeError(`Can't register child at index ${index}. Out of range.`);
|
|
73
|
+
}
|
|
74
|
+
this._branches.splice(index, 0, child);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1ub2RlLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2NvcmUvdHJlZS1ub2RlLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBbUIsT0FBTyxFQUFxQixNQUFNLE1BQU0sQ0FBQztBQUMzRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQWtCLE1BQU0sV0FBVyxDQUFDO0FBS25FLE1BQU0sT0FBTyxZQUFZO0lBUXRCO1FBSFEsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUloQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRztZQUNsQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDaEUsQ0FBQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNyQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDbkQsQ0FBQyxDQUFDO1NBQ0osQ0FBQztJQUNMLENBQUM7SUFFTSxRQUFRO1FBQ1osT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTSxPQUFPO1FB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RyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3ZDLE1BQU0sSUFBSSxTQUFTLENBQ2hCLGlDQUFpQyxLQUFLLGlCQUFpQixDQUN6RCxDQUFDO1NBQ0o7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpbHRlciwgdHlwZSBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0eXBlIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBoYXNQcm9wZXJ0eSB9IGZyb20gXCIuLi8uLi9zaGFyZWRcIjtcbmltcG9ydCB7IFRyZWVFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCB7IEdyYWZ0RXZlbnQsIFBydW5lRXZlbnQsIHR5cGUgVHJlZUV2ZW50IH0gZnJvbSBcIi4uL2V2ZW50c1wiO1xuaW1wb3J0IHsgVHJlZUJyYW5jaCB9IGZyb20gXCIuL3RyZWUtYnJhbmNoXCI7XG5pbXBvcnQgdHlwZSB7IFRyZWVQbG90IH0gZnJvbSBcIi4vdHJlZS1wbG90LmludGVyZmFjZVwiO1xuaW1wb3J0IHR5cGUgeyBUcmVlTm9kZSB9IGZyb20gXCIuL3RyZWUtbm9kZS5pbnRlcmZhY2VcIjtcblxuZXhwb3J0IGNsYXNzIFRyZWVOb2RlQmFzZTxVc2VybGFuZENvbXBvbmVudD5cbiAgIGltcGxlbWVudHMgUGFydGlhbDxUcmVlTm9kZTxVc2VybGFuZENvbXBvbmVudD4+XG57XG4gICBwcml2YXRlIHJlYWRvbmx5IF9icmFuY2hlczogQXJyYXk8VHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4+O1xuICAgcHJpdmF0ZSByZWFkb25seSBldmVudHMkOiBTdWJqZWN0PFRyZWVFdmVudDxVc2VybGFuZENvbXBvbmVudD4+O1xuICAgcHJpdmF0ZSBkZXN0cm95ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaXB0aW9uczogQXJyYXk8U3Vic2NyaXB0aW9uPjtcblxuICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgdGhpcy5fYnJhbmNoZXMgPSBbXTtcbiAgICAgIHRoaXMuZXZlbnRzJCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBbXG4gICAgICAgICB0aGlzLmdyYWZ0c1RvU2VsZigpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJDaGlsZFJlbGF0aW9uc2hpcChldmVudC5jaGlsZCgpLCBldmVudC5pbmRleCgpKTtcbiAgICAgICAgIH0pLFxuICAgICAgICAgdGhpcy5wcnVuZXNUb1NlbGYoKS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRlcmVnaXN0ZXJDaGlsZFJlbGF0aW9uc2hpcChldmVudC5jaGlsZCgpKTtcbiAgICAgICAgIH0pXG4gICAgICBdO1xuICAgfVxuXG4gICBwdWJsaWMgYnJhbmNoZXMoKTogQXJyYXk8VHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4+IHtcbiAgICAgIHJldHVybiBbLi4udGhpcy5fYnJhbmNoZXNdO1xuICAgfVxuXG4gICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuYnJhbmNoZXMoKS5mb3JFYWNoKChicmFuY2gpID0+IHtcbiAgICAgICAgIGJyYW5jaC5kZXN0cm95KCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWIpID0+IHtcbiAgICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICB9XG5cbiAgIHB1YmxpYyBkaXNwYXRjaChldmVudDogVHJlZUV2ZW50PFVzZXJsYW5kQ29tcG9uZW50Pik6IHZvaWQge1xuICAgICAgdGhpcy5ldmVudHMkLm5leHQoZXZlbnQpO1xuICAgfVxuXG4gICBwdWJsaWMgZXZlbnRzKCk6IE9ic2VydmFibGU8VHJlZUV2ZW50PFVzZXJsYW5kQ29tcG9uZW50Pj4ge1xuICAgICAgcmV0dXJuIHRoaXMuZXZlbnRzJDtcbiAgIH1cblxuICAgcHVibGljIGdldEJyYW5jaChpbmRleDogbnVtYmVyKTogVHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4gfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIHRoaXMuX2JyYW5jaGVzW2luZGV4XTtcbiAgIH1cblxuICAgcHVibGljIGhhbmRsZVVzZXJsYW5kRXJyb3IoZXJyb3I6IHVua25vd24pOiBuZXZlciB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gaGFzUHJvcGVydHkoZXJyb3IsIFwibWVzc2FnZVwiKVxuICAgICAgICAgPyBlcnJvci5tZXNzYWdlXG4gICAgICAgICA6IFwiVW5rbm93biBlcnJvclwiO1xuICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihgRmFpbGVkIHRvIGdyb3cgYnJhbmNoOiAke21lc3NhZ2V9YCwge1xuICAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICB9KTtcbiAgIH1cblxuICAgcHVibGljIGlzRGVzdHJveWVkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGVzdHJveWVkO1xuICAgfVxuXG4gICBwdWJsaWMgcGxvdCgpOiBUcmVlUGxvdCB7XG4gICAgICByZXR1cm4gbmV3IE1hcChcbiAgICAgICAgIHRoaXMuYnJhbmNoZXMoKS5tYXAoKGJyYW5jaCwgaW5kZXgpID0+IFtpbmRleCwgYnJhbmNoLnBsb3QoKV0pXG4gICAgICApO1xuICAgfVxuXG4gICBwdWJsaWMgdHJhdmVyc2UoXG4gICAgICBjYWxsYmFjazogKG5vZGU6IFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+KSA9PiB2b2lkXG4gICApOiB2b2lkIHtcbiAgICAgIHRoaXMuYnJhbmNoZXMoKS5mb3JFYWNoKChicmFuY2gpID0+IHtcbiAgICAgICAgIGJyYW5jaC50cmF2ZXJzZShjYWxsYmFjayk7XG4gICAgICB9KTtcbiAgIH1cblxuICAgcHJpdmF0ZSBkZXJlZ2lzdGVyQ2hpbGRSZWxhdGlvbnNoaXAoXG4gICAgICBjaGlsZDogVHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD5cbiAgICk6IHZvaWQge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmJyYW5jaGVzKCkuZmluZEluZGV4KChicmFuY2gpID0+IGJyYW5jaCA9PT0gY2hpbGQpO1xuICAgICAgdGhpcy5fYnJhbmNoZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgIH1cblxuICAgcHJpdmF0ZSBncmFmdHNUb1NlbGYoKTogT2JzZXJ2YWJsZTxHcmFmdEV2ZW50PFVzZXJsYW5kQ29tcG9uZW50Pj4ge1xuICAgICAgcmV0dXJuIHRoaXMuZXZlbnRzKCkucGlwZShcbiAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgIChldmVudCk6IGV2ZW50IGlzIEdyYWZ0RXZlbnQ8VXNlcmxhbmRDb21wb25lbnQ+ID0+XG4gICAgICAgICAgICAgICBldmVudCBpbnN0YW5jZW9mIEdyYWZ0RXZlbnRcbiAgICAgICAgICksXG4gICAgICAgICBmaWx0ZXIoKGV2ZW50KSA9PiBldmVudC5wYXJlbnQoKS5ldmVudHMoKSA9PT0gdGhpcy5ldmVudHMkKVxuICAgICAgKTtcbiAgIH1cblxuICAgcHJpdmF0ZSBwcnVuZXNUb1NlbGYoKTogT2JzZXJ2YWJsZTxQcnVuZUV2ZW50PFVzZXJsYW5kQ29tcG9uZW50Pj4ge1xuICAgICAgcmV0dXJuIHRoaXMuZXZlbnRzKCkucGlwZShcbiAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgIChldmVudCk6IGV2ZW50IGlzIFBydW5lRXZlbnQ8VXNlcmxhbmRDb21wb25lbnQ+ID0+XG4gICAgICAgICAgICAgICBldmVudCBpbnN0YW5jZW9mIFBydW5lRXZlbnRcbiAgICAgICAgICksXG4gICAgICAgICBmaWx0ZXIoKGV2ZW50KSA9PiBldmVudC5wYXJlbnQoKS5ldmVudHMoKSA9PT0gdGhpcy5ldmVudHMkKVxuICAgICAgKTtcbiAgIH1cblxuICAgcHJpdmF0ZSByZWdpc3RlckNoaWxkUmVsYXRpb25zaGlwKFxuICAgICAgY2hpbGQ6IFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+LFxuICAgICAgaW5kZXg6IG51bWJlclxuICAgKTogdm9pZCB7XG4gICAgICBjb25zdCBicmFuY2hlcyA9IHRoaXMuYnJhbmNoZXMoKTtcbiAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBicmFuY2hlcy5sZW5ndGgpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXG4gICAgICAgICAgICBgQ2FuJ3QgcmVnaXN0ZXIgY2hpbGQgYXQgaW5kZXggJHtpbmRleH0uIE91dCBvZiByYW5nZS5gXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5fYnJhbmNoZXMuc3BsaWNlKGluZGV4LCAwLCBjaGlsZCk7XG4gICB9XG59XG4iXX0=
|
|
@@ -39,4 +39,4 @@ export class RootController {
|
|
|
39
39
|
return this.rootComponentRef.location.nativeElement;
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9vdC1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbGltYmxlLXRyZWUvc3JjL2xpYi9jb3JlL3RyZWUtcm9vdC9yb290LWNvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUk5RDs7R0FFRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBSXhCLFlBQ29CLFFBQXFCLEVBQ3RDLGdCQUFrQztRQURqQixhQUFRLEdBQVIsUUFBUSxDQUFhO1FBR3RDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEUsTUFBTSxXQUFXLEdBQ2QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN6RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUN6RCxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDO1lBQy9CLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUM7UUFDTixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQ2hFLEdBQUcsRUFBRTtZQUNGLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FDSCxDQUFDO1FBQ0YsSUFBSSxDQUFDLHFCQUFxQixHQUFHLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFTSxPQUFPO1FBQ1gsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3hDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTSxhQUFhO1FBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzRCxDQUFDO0lBRU0sb0JBQW9CO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztJQUMzRCxDQUFDO0lBRU0sb0JBQW9CO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztJQUN6QyxDQUFDO0lBRU0sV0FBVztRQUNmLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztJQUN6QyxDQUFDO0lBRU0sZ0JBQWdCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7SUFDdkQsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb21wb25lbnRSZWYsIFZpZXdDb250YWluZXJSZWYsIFZpZXdSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSBcIi4uLy4uLy4uL3NoYXJlZFwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgUm9vdENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBkcm9wem9uZVJlbmRlcmVyIH0gZnJvbSBcIi4uLy4uL2V4dHJhcy9kcmFnLWFuZC1kcm9wXCI7XG5pbXBvcnQgdHlwZSB7IFRyZWVSb290IH0gZnJvbSBcIi4vdHJlZS1yb290XCI7XG5pbXBvcnQgdHlwZSB7IENvbXBvbmVudENvbnRhaW5lciB9IGZyb20gXCIuLi9jb21wb25lbnQtY29udGFpbmVyLmludGVyZmFjZVwiO1xuXG4vKipcbiAqIEEgd3JhcHBlciBhcm91bmQgdGhlIEJyYW5jaENvbXBvbmVudCB0aGF0IGhlbHBzIGluc3RhbnRpYXRlIGl0IGFuZCBoYW5kbGVzIGl0cyBldmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSb290Q29udHJvbGxlcjxUPiBpbXBsZW1lbnRzIENvbXBvbmVudENvbnRhaW5lcjxSb290Q29tcG9uZW50PiB7XG4gICBwcml2YXRlIHJlYWRvbmx5IHJvb3RDb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxSb290Q29tcG9uZW50PjtcbiAgIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VTdWJzY3JpcHRpb25zOiBBcnJheTxTdWJzY3JpcHRpb24+O1xuXG4gICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IHRyZWVSb290OiBUcmVlUm9vdDxUPixcbiAgICAgIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWZcbiAgICkge1xuICAgICAgdGhpcy5yb290Q29tcG9uZW50UmVmID0gdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoUm9vdENvbXBvbmVudCk7XG4gICAgICBjb25zdCB2aWV3SW5pdFN1YiA9XG4gICAgICAgICB0aGlzLnJvb3RDb21wb25lbnRSZWYuaW5zdGFuY2UuYWZ0ZXJWaWV3SW5pdC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZHJvcHpvbmUgPSB0aGlzLnJvb3RDb21wb25lbnRSZWYuaW5zdGFuY2UuZHJvcHpvbmU7XG4gICAgICAgICAgICBhc3NlcnQoZHJvcHpvbmUgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBkcm9wem9uZVJlbmRlcmVyLnJlZ2lzdGVyRHJvcHpvbmUoZHJvcHpvbmUsIHRoaXMudHJlZVJvb3QpO1xuICAgICAgICAgfSk7XG4gICAgICBjb25zdCBkcm9wcGVkU3ViID0gdGhpcy5yb290Q29tcG9uZW50UmVmLmluc3RhbmNlLmRyb3BwZWQuc3Vic2NyaWJlKFxuICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgZHJvcHpvbmVSZW5kZXJlci5oYW5kbGVEcm9wKHRoaXMudHJlZVJvb3QsIFwiaW5uZXJcIik7XG4gICAgICAgICB9XG4gICAgICApO1xuICAgICAgdGhpcy5pbnN0YW5jZVN1YnNjcmlwdGlvbnMgPSBbdmlld0luaXRTdWIsIGRyb3BwZWRTdWJdO1xuICAgfVxuXG4gICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuaW5zdGFuY2VTdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YikgPT4ge1xuICAgICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9KTtcbiAgIH1cblxuICAgcHVibGljIGRldGVjdENoYW5nZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLnJvb3RDb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgfVxuXG4gICBwdWJsaWMgZ2V0QnJhbmNoZXNDb250YWluZXIoKTogVmlld0NvbnRhaW5lclJlZiB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gdGhpcy5yb290Q29tcG9uZW50UmVmLmluc3RhbmNlLmJyYW5jaGVzQ29udGFpbmVyO1xuICAgfVxuXG4gICBwdWJsaWMgZ2V0Q29tcG9uZW50SW5zdGFuY2UoKTogUm9vdENvbXBvbmVudCB7XG4gICAgICByZXR1cm4gdGhpcy5yb290Q29tcG9uZW50UmVmLmluc3RhbmNlO1xuICAgfVxuXG4gICBwdWJsaWMgZ2V0SG9zdFZpZXcoKTogVmlld1JlZiB7XG4gICAgICByZXR1cm4gdGhpcy5yb290Q29tcG9uZW50UmVmLmhvc3RWaWV3O1xuICAgfVxuXG4gICBwdWJsaWMgZ2V0TmF0aXZlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICByZXR1cm4gdGhpcy5yb290Q29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQ7XG4gICB9XG59XG4iXX0=
|