@limble/limble-tree 1.0.0-alpha.1 → 1.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +450 -17
- package/esm2020/lib/components/branch/branch.component.mjs +7 -15
- package/esm2020/lib/components/dropzone/dropzone.component.mjs +2 -2
- package/esm2020/lib/components/root/root.component.mjs +3 -4
- package/esm2020/lib/core/branch-options.interface.mjs +1 -1
- package/esm2020/lib/core/configuration/configuration.mjs +1 -1
- package/esm2020/lib/core/configuration/tree-options.interface.mjs +1 -1
- package/esm2020/lib/core/index.mjs +1 -2
- package/esm2020/lib/core/relationship.interface.mjs +1 -1
- package/esm2020/lib/core/tree-branch/branch-controller.mjs +99 -0
- package/esm2020/lib/core/tree-branch/tree-branch.mjs +260 -106
- package/esm2020/lib/core/tree-node-base.mjs +10 -9
- package/esm2020/lib/core/tree-root/root-controller.mjs +42 -0
- package/esm2020/lib/core/tree-root/tree-root.mjs +138 -27
- package/esm2020/lib/core/tree-service/tree.service.mjs +7 -1
- package/esm2020/lib/events/drag/drag-end-event.mjs +9 -7
- package/esm2020/lib/events/drag/drag-start-event.mjs +2 -4
- package/esm2020/lib/events/drag/drop-event.mjs +2 -4
- package/esm2020/lib/events/general/destruction-event.mjs +10 -0
- package/esm2020/lib/events/general/index.mjs +2 -0
- package/esm2020/lib/events/index.mjs +2 -1
- package/esm2020/lib/events/relational/graft-event.mjs +2 -4
- package/esm2020/lib/events/relational/prune-event.mjs +2 -4
- package/esm2020/lib/events/relational/relational-tree-event.interface.mjs +1 -1
- package/esm2020/lib/extras/collapse/collapse.mjs +2 -2
- package/esm2020/lib/extras/collapse/collapse.module.mjs +2 -1
- package/esm2020/lib/extras/collapse/collapse.service.mjs +26 -1
- package/esm2020/lib/extras/drag-and-drop/drag-and-drop.mjs +6 -10
- package/esm2020/lib/extras/drag-and-drop/drag-and-drop.module.mjs +5 -1
- package/esm2020/lib/extras/drag-and-drop/drag-and-drop.service.mjs +21 -5
- package/esm2020/lib/extras/drag-and-drop/draggable.directive.mjs +7 -7
- package/esm2020/lib/extras/drag-and-drop/dragover-no-change-detect.mjs +10 -11
- package/esm2020/lib/extras/drag-and-drop/dropzone-renderer.mjs +9 -7
- package/esm2020/lib/legacy/legacy-component-obj.interface.mjs +1 -1
- package/esm2020/lib/legacy/legacy-tree-data.interface.mjs +1 -1
- package/esm2020/lib/legacy/legacy-tree-options.interface.mjs +1 -1
- package/esm2020/lib/legacy/legacy-tree.mjs +30 -30
- package/esm2020/lib/legacy/limble-tree-root/limble-tree-root.component.mjs +1 -1
- package/esm2020/lib/limble-tree.module.mjs +6 -2
- package/esm2020/lib/structure/branchable.interface.mjs +1 -1
- package/esm2020/lib/structure/component-container.interface.mjs +2 -0
- package/esm2020/lib/structure/index.mjs +2 -5
- package/esm2020/lib/structure/tree-branch-node.interface.mjs +1 -1
- package/esm2020/lib/structure/tree-event.interface.mjs +1 -1
- package/esm2020/lib/structure/tree-node.interface.mjs +1 -1
- package/esm2020/lib/structure/tree-relationship.interface.mjs +1 -1
- package/fesm2015/limble-limble-tree.mjs +821 -376
- package/fesm2015/limble-limble-tree.mjs.map +1 -1
- package/fesm2020/limble-limble-tree.mjs +819 -372
- package/fesm2020/limble-limble-tree.mjs.map +1 -1
- package/lib/core/branch-options.interface.d.ts +1 -1
- package/lib/core/configuration/configuration.d.ts +2 -2
- package/lib/core/configuration/tree-options.interface.d.ts +48 -29
- package/lib/core/index.d.ts +0 -1
- package/lib/core/relationship.interface.d.ts +2 -3
- package/lib/core/tree-branch/branch-controller.d.ts +25 -0
- package/lib/core/tree-branch/tree-branch.d.ts +199 -24
- package/lib/core/tree-node-base.d.ts +4 -5
- package/lib/core/tree-root/root-controller.d.ts +19 -0
- package/lib/core/tree-root/tree-root.d.ts +109 -14
- package/lib/core/tree-service/tree.service.d.ts +8 -2
- package/lib/events/drag/drag-end-event.d.ts +15 -13
- package/lib/events/drag/drag-start-event.d.ts +6 -5
- package/lib/events/drag/drop-event.d.ts +7 -10
- package/lib/events/general/destruction-event.d.ts +8 -0
- package/lib/events/general/index.d.ts +1 -0
- package/lib/events/index.d.ts +1 -0
- package/lib/events/relational/graft-event.d.ts +5 -6
- package/lib/events/relational/prune-event.d.ts +5 -6
- package/lib/events/relational/relational-tree-event.interface.d.ts +5 -1
- package/lib/extras/collapse/collapse.module.d.ts +1 -0
- package/lib/extras/collapse/collapse.service.d.ts +25 -0
- package/lib/extras/drag-and-drop/drag-and-drop.d.ts +2 -3
- package/lib/extras/drag-and-drop/drag-and-drop.module.d.ts +4 -0
- package/lib/extras/drag-and-drop/drag-and-drop.service.d.ts +22 -3
- package/lib/extras/drag-and-drop/draggable.directive.d.ts +4 -5
- package/lib/extras/drag-and-drop/dragover-no-change-detect.d.ts +7 -3
- package/lib/legacy/legacy-component-obj.interface.d.ts +1 -1
- package/lib/legacy/legacy-tree-data.interface.d.ts +1 -1
- package/lib/legacy/legacy-tree-options.interface.d.ts +2 -2
- package/lib/legacy/legacy-tree.d.ts +4 -4
- package/lib/legacy/limble-tree-root/limble-tree-root.component.d.ts +4 -4
- package/lib/limble-tree.module.d.ts +4 -0
- package/lib/structure/branchable.interface.d.ts +0 -1
- package/lib/structure/component-container.interface.d.ts +8 -0
- package/lib/structure/index.d.ts +1 -4
- package/lib/structure/tree-branch-node.interface.d.ts +3 -3
- package/lib/structure/tree-event.interface.d.ts +3 -3
- package/lib/structure/tree-node.interface.d.ts +11 -6
- package/lib/structure/tree-relationship.interface.d.ts +2 -2
- package/package.json +1 -1
- package/esm2020/lib/structure/container-tree-node.interface.mjs +0 -2
- package/esm2020/lib/structure/content-container.interface.mjs +0 -2
- package/esm2020/lib/structure/event-conduit.interface.mjs +0 -2
- package/esm2020/lib/structure/tree-root.node.interface.mjs +0 -2
- package/lib/structure/container-tree-node.interface.d.ts +0 -3
- package/lib/structure/content-container.interface.d.ts +0 -3
- package/lib/structure/event-conduit.interface.d.ts +0 -6
- package/lib/structure/tree-root.node.interface.d.ts +0 -2
|
@@ -1,38 +1,38 @@
|
|
|
1
1
|
import { assert } from "../../../shared/assert";
|
|
2
|
-
import { filter } from "rxjs";
|
|
3
|
-
import { GraftEvent } from "../../events/relational/graft-event";
|
|
4
|
-
import { PruneEvent } from "../../events/relational/prune-event";
|
|
5
|
-
import { createComponent, EnvironmentInjector } from "@angular/core";
|
|
6
|
-
import { BranchComponent } from "../../components/branch/branch.component";
|
|
7
2
|
import { TreeNodeBase } from "../tree-node-base";
|
|
8
|
-
import { TreeError } from "../../errors
|
|
3
|
+
import { TreeError } from "../../errors";
|
|
9
4
|
import { dropzoneRenderer } from "../../extras/drag-and-drop/dropzone-renderer";
|
|
10
5
|
import { config } from "../configuration/configuration";
|
|
11
6
|
import { TreeRoot } from "..";
|
|
12
7
|
import { treeCollapser } from "../../extras/collapse/collapse";
|
|
8
|
+
import { DestructionEvent, GraftEvent, PruneEvent } from "../../events";
|
|
9
|
+
import { BranchController } from "./branch-controller";
|
|
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
|
+
*/
|
|
13
19
|
export class TreeBranch {
|
|
14
20
|
constructor(parent, branchOptions) {
|
|
15
21
|
this.branchOptions = branchOptions;
|
|
16
22
|
this.detachedView = null;
|
|
17
23
|
this.treeNodeBase = new TreeNodeBase();
|
|
18
|
-
|
|
19
|
-
const parentBranchesContainer = parent.getContents().instance.branchesContainer;
|
|
24
|
+
const parentBranchesContainer = parent.getBranchesContainer();
|
|
20
25
|
assert(parentBranchesContainer !== undefined);
|
|
21
|
-
this.
|
|
22
|
-
environmentInjector: parentBranchesContainer.injector.get(EnvironmentInjector)
|
|
23
|
-
});
|
|
24
|
-
this.contents.instance.contentToHost = this.userlandComponent;
|
|
26
|
+
this.branchController = new BranchController(this, parentBranchesContainer);
|
|
25
27
|
this.setIndentation(parent);
|
|
26
|
-
this.outputBindingSubscriptions = [];
|
|
27
|
-
this.instanceSubscriptions = this.getInstanceSubscriptions();
|
|
28
28
|
if (parent instanceof TreeBranch &&
|
|
29
|
-
parent.branchOptions.
|
|
29
|
+
parent.branchOptions.defaultCollapsed === true) {
|
|
30
30
|
treeCollapser.storePrecollapsedNode(parent, this);
|
|
31
|
-
this.detachedView = this.
|
|
31
|
+
this.detachedView = this.branchController.getHostView();
|
|
32
32
|
}
|
|
33
33
|
else {
|
|
34
|
-
parentBranchesContainer.insert(this.
|
|
35
|
-
this.
|
|
34
|
+
parentBranchesContainer.insert(this.branchController.getHostView());
|
|
35
|
+
this.detectChanges();
|
|
36
36
|
this._parent = parent;
|
|
37
37
|
this.dispatch(new GraftEvent(this, {
|
|
38
38
|
parent: this._parent,
|
|
@@ -41,50 +41,127 @@ export class TreeBranch {
|
|
|
41
41
|
}));
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
|
+
/** @returns All child branches as an array of TreeBranch instances, in order. */
|
|
44
45
|
branches() {
|
|
45
46
|
return this.treeNodeBase.branches();
|
|
46
47
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
/**
|
|
49
|
+
* Recursively destroys all descendant branches, as well as itself. This
|
|
50
|
+
* releases all resources held or consumed by this branch and its descendants.
|
|
51
|
+
*
|
|
52
|
+
* @remarks
|
|
53
|
+
* It is important to call this method when a branch is discarded, otherwise
|
|
54
|
+
* the branch will remain in memory and continue to consume resources.
|
|
55
|
+
*/
|
|
50
56
|
destroy() {
|
|
51
|
-
if (
|
|
52
|
-
|
|
53
|
-
dropzoneRenderer.clearTreeFromRegistry(this);
|
|
54
|
-
}
|
|
55
|
-
this.branches().forEach((branch) => {
|
|
56
|
-
branch.destroy();
|
|
57
|
-
});
|
|
58
|
-
const parent = this._parent;
|
|
59
|
-
const index = this.index();
|
|
60
|
-
if (index !== undefined && parent !== undefined) {
|
|
61
|
-
const container = parent.getContents().instance.branchesContainer;
|
|
62
|
-
assert(container !== undefined);
|
|
63
|
-
container.remove(index);
|
|
64
|
-
parent.deleteBranch(index);
|
|
57
|
+
if (this.isDestroyed()) {
|
|
58
|
+
throw new TreeError("Cannot destroy a destroyed tree branch");
|
|
65
59
|
}
|
|
60
|
+
this.prune();
|
|
61
|
+
treeCollapser.expand(this);
|
|
62
|
+
dropzoneRenderer.clearTreeFromRegistry(this);
|
|
63
|
+
this.branchController.getHostView().destroy();
|
|
66
64
|
this.treeNodeBase.destroy();
|
|
67
|
-
this.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
65
|
+
this.branchController.destroy();
|
|
66
|
+
this.dispatch(new DestructionEvent(this));
|
|
67
|
+
}
|
|
68
|
+
/** Run Angular change detection on this branch */
|
|
69
|
+
detectChanges() {
|
|
70
|
+
this.branchController.detectChanges();
|
|
73
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Emits the specified TreeEvent.
|
|
74
|
+
*
|
|
75
|
+
* @remarks
|
|
76
|
+
* Caution: It is not recommended to manually emit TreeEvents that are already
|
|
77
|
+
* provided by the library. For example, it is not recommended to emit a
|
|
78
|
+
* `GraftEvent`, `DestructionEvent`, etc. These events may be used by the tree,
|
|
79
|
+
* and emitting them manually may cause unexpected behavior. Instead, we
|
|
80
|
+
* recommend implementing the TreeEvent interface with your own custom events
|
|
81
|
+
* and dispatching those.
|
|
82
|
+
*
|
|
83
|
+
* @param event - The TreeEvent that will be emitted.
|
|
84
|
+
*/
|
|
74
85
|
dispatch(event) {
|
|
75
86
|
this.treeNodeBase.dispatch(event);
|
|
76
87
|
this._parent?.dispatch(event);
|
|
77
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* @returns
|
|
91
|
+
* An observable that emits TreeEvents whenever an event is dispatched
|
|
92
|
+
* in this branch or any of its descendant branches.
|
|
93
|
+
*/
|
|
78
94
|
events() {
|
|
79
95
|
return this.treeNodeBase.events();
|
|
80
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* @param index - The index of the child branch to retrieve.
|
|
99
|
+
*
|
|
100
|
+
* @returns
|
|
101
|
+
* The child branch at the specified index, or undefined if there is
|
|
102
|
+
* no child branch at the specified index.
|
|
103
|
+
*/
|
|
81
104
|
getBranch(index) {
|
|
82
105
|
return this.treeNodeBase.getBranch(index);
|
|
83
106
|
}
|
|
84
|
-
|
|
85
|
-
|
|
107
|
+
/** @returns The ViewContainerRef in which child branches are rendered */
|
|
108
|
+
getBranchesContainer() {
|
|
109
|
+
if (this.isDestroyed()) {
|
|
110
|
+
throw new TreeError("Cannot get branches container from a destroyed tree branch");
|
|
111
|
+
}
|
|
112
|
+
return this.branchController.getBranchesContainer();
|
|
113
|
+
}
|
|
114
|
+
/** @returns The instance of BranchComponent that is rendered by this class. */
|
|
115
|
+
getComponentInstance() {
|
|
116
|
+
if (this.isDestroyed()) {
|
|
117
|
+
throw new TreeError("Cannot get component instance from a destroyed tree branch");
|
|
118
|
+
}
|
|
119
|
+
return this.branchController.getComponentInstance();
|
|
120
|
+
}
|
|
121
|
+
/** @returns The Host View in which the BranchComponent is rendered */
|
|
122
|
+
getHostView() {
|
|
123
|
+
if (this.isDestroyed()) {
|
|
124
|
+
throw new TreeError("Cannot get component host view from a destroyed tree branch");
|
|
125
|
+
}
|
|
126
|
+
return this.branchController.getHostView();
|
|
127
|
+
}
|
|
128
|
+
/** @returns The BranchComponent as a native HTML Element */
|
|
129
|
+
getNativeElement() {
|
|
130
|
+
if (this.isDestroyed()) {
|
|
131
|
+
throw new TreeError("Cannot get native element from a destroyed tree branch");
|
|
132
|
+
}
|
|
133
|
+
return this.branchController.getNativeElement();
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* @returns
|
|
137
|
+
* A ComponentRef containing the instance of the user-provided
|
|
138
|
+
* component which is rendered by this branch.
|
|
139
|
+
*/
|
|
140
|
+
getUserlandComponentRef() {
|
|
141
|
+
if (this.isDestroyed()) {
|
|
142
|
+
throw new TreeError("Cannot get userland component from a destroyed tree branch");
|
|
143
|
+
}
|
|
144
|
+
return this.branchController.getUserlandComponentRef();
|
|
86
145
|
}
|
|
146
|
+
/**
|
|
147
|
+
* Attaches a branch to a new parent node.
|
|
148
|
+
*
|
|
149
|
+
* @remarks
|
|
150
|
+
* If not already pruned, this method prunes (removes) this branch from its
|
|
151
|
+
* current position in the tree; then grafts (reattaches) it as a child of the
|
|
152
|
+
* specified parent branch at the specified index. If no index is specified,
|
|
153
|
+
* the branch is appended as the last child of the parent. This causes this
|
|
154
|
+
* branch's associated BranchComponent to be re-rendered in the DOM at the
|
|
155
|
+
* new location.
|
|
156
|
+
*
|
|
157
|
+
* @param newParent - The new parent branch unto which this branch will be grafted.
|
|
158
|
+
* @param index - The index at which this branch will be grafted. If not specified,
|
|
159
|
+
* this branch will be appended as the last child of the new parent.
|
|
160
|
+
*
|
|
161
|
+
* @returns The index at which this branch was grafted.
|
|
162
|
+
*/
|
|
87
163
|
graftTo(newParent, index) {
|
|
164
|
+
this.checkGraftLocationValidity(newParent, index);
|
|
88
165
|
const ownIndex = this.index();
|
|
89
166
|
if (ownIndex !== undefined) {
|
|
90
167
|
this.prune();
|
|
@@ -99,9 +176,35 @@ export class TreeBranch {
|
|
|
99
176
|
}));
|
|
100
177
|
return newIndex;
|
|
101
178
|
}
|
|
179
|
+
/**
|
|
180
|
+
* Appends a new child branch to this branch. The child branch will render
|
|
181
|
+
* the specified component according to the (optional) configuration parameter.
|
|
182
|
+
*
|
|
183
|
+
* @param component - The component to render in the new child branch.
|
|
184
|
+
* @param options - Configuration options for the new child branch.
|
|
185
|
+
*
|
|
186
|
+
* @returns
|
|
187
|
+
* The newly-created child branch.
|
|
188
|
+
*/
|
|
102
189
|
grow(component, options) {
|
|
190
|
+
if (this.isDestroyed()) {
|
|
191
|
+
throw new TreeError("Cannot grow a branch on a destroyed tree branch");
|
|
192
|
+
}
|
|
103
193
|
return new TreeBranch(this, { component, ...options });
|
|
104
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* Determines this branch's index in relation to its sibling branches.
|
|
197
|
+
*
|
|
198
|
+
* @remarks
|
|
199
|
+
* For example, if it is the first child of its parent, this method will return
|
|
200
|
+
* 0. If it is the second child of its parent, this method will return 1.
|
|
201
|
+
*
|
|
202
|
+
* If this branch has no parent, (eg, if this branch has been pruned) this
|
|
203
|
+
* method will return undefined.
|
|
204
|
+
*
|
|
205
|
+
* @returns
|
|
206
|
+
* The index of this branch in relation to its sibling branches, or undefined.
|
|
207
|
+
*/
|
|
105
208
|
index() {
|
|
106
209
|
if (!this._parent) {
|
|
107
210
|
return undefined;
|
|
@@ -112,15 +215,76 @@ export class TreeBranch {
|
|
|
112
215
|
assert(index >= 0);
|
|
113
216
|
return index;
|
|
114
217
|
}
|
|
218
|
+
/** @returns `true` if the branch is destroyed, `false` otherwise */
|
|
219
|
+
isDestroyed() {
|
|
220
|
+
return this.treeNodeBase.isDestroyed();
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* @returns
|
|
224
|
+
* The data that was passed into the `branchOptions`' `meta` property
|
|
225
|
+
* at construction.
|
|
226
|
+
*/
|
|
115
227
|
meta() {
|
|
116
228
|
return this.branchOptions.meta ?? {};
|
|
117
229
|
}
|
|
230
|
+
/**
|
|
231
|
+
* @returns
|
|
232
|
+
* This branch's parent node (which may be a TreeBranch or TreeRoot).
|
|
233
|
+
* If this branch has no parent, (eg, if this branch has been pruned) this
|
|
234
|
+
* method will return undefined.
|
|
235
|
+
*/
|
|
118
236
|
parent() {
|
|
119
237
|
return this._parent;
|
|
120
238
|
}
|
|
239
|
+
/**
|
|
240
|
+
* Provides a model describing this branch's descendants.
|
|
241
|
+
*
|
|
242
|
+
* @returns
|
|
243
|
+
* A multi-dimensional Map which describes the shape of this branch's
|
|
244
|
+
* descendants.
|
|
245
|
+
*
|
|
246
|
+
* @example
|
|
247
|
+
* A branch with no children will return an empty Map. A branch with
|
|
248
|
+
* a single child will return a Map with a single entry, where the key is the index
|
|
249
|
+
* of the branch (zero) and the value is an empty Map. A Tree like this:
|
|
250
|
+
*
|
|
251
|
+
* ```
|
|
252
|
+
* ---Branch-------Branch
|
|
253
|
+
* /
|
|
254
|
+
* Branch-------Branch
|
|
255
|
+
* \
|
|
256
|
+
* ---Branch
|
|
257
|
+
* ```
|
|
258
|
+
* Will return a Map of matching shape:
|
|
259
|
+
* ```
|
|
260
|
+
* Map {
|
|
261
|
+
* 0: Map { 0: Map {}},
|
|
262
|
+
* 1: Map {},
|
|
263
|
+
* 2: Map {}
|
|
264
|
+
* }
|
|
265
|
+
* ```
|
|
266
|
+
*/
|
|
121
267
|
plot() {
|
|
122
268
|
return this.treeNodeBase.plot();
|
|
123
269
|
}
|
|
270
|
+
/**
|
|
271
|
+
* Calculates the branch's position in the tree relative to the Root.
|
|
272
|
+
*
|
|
273
|
+
* @remarks
|
|
274
|
+
* The position is described as an array of numbers, where each number
|
|
275
|
+
* represents the index of the branch at that level of the tree.
|
|
276
|
+
*
|
|
277
|
+
* For example, if this branch is the first child of the Root, this method
|
|
278
|
+
* will return [0]. If this branch is the second child of the first child
|
|
279
|
+
* of the Root, this method will return [0, 1].
|
|
280
|
+
*
|
|
281
|
+
* If the branch is not related to a TreeRoot, (such as when it has been
|
|
282
|
+
* pruned,) this method will throw an error.
|
|
283
|
+
*
|
|
284
|
+
* @returns
|
|
285
|
+
* An array of numbers which describe the branch's position in the tree
|
|
286
|
+
* relative to the Root.
|
|
287
|
+
*/
|
|
124
288
|
position() {
|
|
125
289
|
const index = this.index();
|
|
126
290
|
if (index === undefined) {
|
|
@@ -132,12 +296,28 @@ export class TreeBranch {
|
|
|
132
296
|
}
|
|
133
297
|
return [index];
|
|
134
298
|
}
|
|
299
|
+
/**
|
|
300
|
+
* Removes a branch from its tree without destroying it.
|
|
301
|
+
*
|
|
302
|
+
* @remarks
|
|
303
|
+
* Removes this branch from its parent and detaches its associated
|
|
304
|
+
* BranchComponent from the DOM. This puts the branch in a "pruned" state,
|
|
305
|
+
* which may affect the behavior of other methods.
|
|
306
|
+
*
|
|
307
|
+
* A pruned branch can be reattached to any other node using the `graftTo` method.
|
|
308
|
+
*
|
|
309
|
+
* @returns
|
|
310
|
+
* Itself, or undefined if it is already in a pruned state.
|
|
311
|
+
*/
|
|
135
312
|
prune() {
|
|
313
|
+
if (this.isDestroyed()) {
|
|
314
|
+
throw new TreeError("Cannot prune a destroyed tree branch");
|
|
315
|
+
}
|
|
136
316
|
const parent = this._parent;
|
|
137
317
|
const index = this.index();
|
|
138
318
|
if (index === undefined || parent === undefined)
|
|
139
319
|
return;
|
|
140
|
-
const container = parent.
|
|
320
|
+
const container = parent.getBranchesContainer();
|
|
141
321
|
assert(container !== undefined);
|
|
142
322
|
this.detachedView = container.detach(index);
|
|
143
323
|
assert(this.detachedView !== null);
|
|
@@ -150,83 +330,56 @@ export class TreeBranch {
|
|
|
150
330
|
this._parent = undefined;
|
|
151
331
|
return this;
|
|
152
332
|
}
|
|
333
|
+
/**
|
|
334
|
+
* Get the root of the tree to which this Branch is attached.
|
|
335
|
+
*
|
|
336
|
+
* @returns
|
|
337
|
+
* The TreeRoot of the tree this branch is in. If this branch is
|
|
338
|
+
* does not have a root (such as when it has been pruned) this method will
|
|
339
|
+
* return undefined.
|
|
340
|
+
*/
|
|
153
341
|
root() {
|
|
154
342
|
const parent = this.parent();
|
|
155
|
-
if (parent === undefined) {
|
|
156
|
-
return undefined;
|
|
157
|
-
}
|
|
158
343
|
if (parent instanceof TreeBranch) {
|
|
159
344
|
return parent.root();
|
|
160
345
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
}
|
|
164
|
-
throw new Error("unexpected parent type");
|
|
346
|
+
assert(parent instanceof TreeRoot || parent === undefined);
|
|
347
|
+
return parent;
|
|
165
348
|
}
|
|
349
|
+
/**
|
|
350
|
+
* Traverses this branch's descendants in depth-first pre-order, executing
|
|
351
|
+
* the provided callback function on each node. Traversal includes this branch.
|
|
352
|
+
*
|
|
353
|
+
* @param callback - A function to execute on each node.
|
|
354
|
+
*/
|
|
166
355
|
traverse(callback) {
|
|
167
356
|
callback(this);
|
|
168
357
|
this.treeNodeBase.traverse(callback);
|
|
169
358
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
dropzoneRenderer.registerDropzones(dropzones, this);
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
getInstanceSubscriptions() {
|
|
188
|
-
const droppedSub = this.contents.instance.dropped.subscribe((placement) => {
|
|
189
|
-
dropzoneRenderer.handleDrop(this, placement);
|
|
190
|
-
});
|
|
191
|
-
return [
|
|
192
|
-
this.getContentCreatedSub(),
|
|
193
|
-
this.getShowLowerZonesSub(),
|
|
194
|
-
this.getShowUpperZonesSub(),
|
|
195
|
-
droppedSub
|
|
196
|
-
];
|
|
197
|
-
}
|
|
198
|
-
getShowLowerZonesSub() {
|
|
199
|
-
const instance = this.contents.instance;
|
|
200
|
-
return instance.showDropzones
|
|
201
|
-
.pipe(filter((direction) => direction === "lower"))
|
|
202
|
-
.subscribe(() => {
|
|
203
|
-
const currentDropzoneDisplayed = dropzoneRenderer.getCurrentDisplay();
|
|
204
|
-
if (currentDropzoneDisplayed?.treeBranch === this &&
|
|
205
|
-
currentDropzoneDisplayed.direction === "lower") {
|
|
206
|
-
return;
|
|
359
|
+
checkGraftLocationValidity(newParent, index) {
|
|
360
|
+
if (this.isDestroyed()) {
|
|
361
|
+
throw new TreeError("Cannot graft a destroyed tree branch");
|
|
362
|
+
}
|
|
363
|
+
if (newParent.isDestroyed()) {
|
|
364
|
+
throw new TreeError("Cannot graft to a destroyed tree branch");
|
|
365
|
+
}
|
|
366
|
+
if (typeof index === "number" &&
|
|
367
|
+
this.indexIsOutOfRange(newParent, index)) {
|
|
368
|
+
throw new TreeError(`Cannot graft branch at index ${index} of the parent. Out of range.`);
|
|
369
|
+
}
|
|
370
|
+
this.traverse((node) => {
|
|
371
|
+
if (node === newParent) {
|
|
372
|
+
throw new TreeError("Cannot graft a branch to itself or any of its own descendants");
|
|
207
373
|
}
|
|
208
|
-
dropzoneRenderer.showLowerZones(this);
|
|
209
|
-
instance.triggerChangeDetection();
|
|
210
374
|
});
|
|
211
375
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
return instance.showDropzones
|
|
215
|
-
.pipe(filter((direction) => direction === "upper"))
|
|
216
|
-
.subscribe(() => {
|
|
217
|
-
const currentDropzoneDisplayed = dropzoneRenderer.getCurrentDisplay();
|
|
218
|
-
if (currentDropzoneDisplayed?.treeBranch === this &&
|
|
219
|
-
currentDropzoneDisplayed.direction === "upper") {
|
|
220
|
-
return;
|
|
221
|
-
}
|
|
222
|
-
dropzoneRenderer.showUpperZones(this);
|
|
223
|
-
instance.triggerChangeDetection();
|
|
224
|
-
});
|
|
376
|
+
indexIsOutOfRange(parent, index) {
|
|
377
|
+
return index < 0 || index > parent.branches().length;
|
|
225
378
|
}
|
|
226
379
|
reattachView(index) {
|
|
227
380
|
assert(this._parent !== undefined);
|
|
228
381
|
assert(this.detachedView !== null);
|
|
229
|
-
const container = this._parent.
|
|
382
|
+
const container = this._parent.getBranchesContainer();
|
|
230
383
|
assert(container !== undefined);
|
|
231
384
|
this.detachedView.reattach();
|
|
232
385
|
container.insert(this.detachedView, index);
|
|
@@ -236,11 +389,12 @@ export class TreeBranch {
|
|
|
236
389
|
const root = parent.root();
|
|
237
390
|
assert(root !== undefined);
|
|
238
391
|
const options = config.getConfig(root);
|
|
239
|
-
const branchesContainerEl = this.
|
|
392
|
+
const branchesContainerEl = this.branchController
|
|
393
|
+
.getNativeElement()
|
|
240
394
|
.getElementsByClassName("branches-container")
|
|
241
395
|
.item(0);
|
|
242
396
|
assert(branchesContainerEl instanceof HTMLElement);
|
|
243
397
|
branchesContainerEl.style.marginLeft = `${options?.indentation ?? 16}px`;
|
|
244
398
|
}
|
|
245
399
|
}
|
|
246
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1icmFuY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2NvcmUvdHJlZS1icmFuY2gvdHJlZS1icmFuY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWhELE9BQU8sRUFBRSxNQUFNLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFHakUsT0FBTyxFQUVKLGVBQWUsRUFDZixtQkFBbUIsRUFHckIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDaEYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDOUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRS9ELE1BQU0sT0FBTyxVQUFVO0lBcUJwQixZQUNHLE1BR0MsRUFDZSxhQUFtRDtRQUFuRCxrQkFBYSxHQUFiLGFBQWEsQ0FBc0M7UUFQOUQsaUJBQVksR0FBbUIsSUFBSSxDQUFDO1FBU3pDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENB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Q0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGFBQWE7YUFDNUQsc0JBQXNCLENBQUMsb0JBQW9CLENBQUM7YUFDNUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1osTUFBTSxDQUFDLG1CQUFtQixZQUFZLFdBQVcsQ0FBQyxDQUFDO1FBQ25ELG1CQUFtQixDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsR0FBRyxPQUFPLEVBQUUsV0FBVyxJQUFJLEVBQUUsSUFBSSxDQUFDO0lBQzVFLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFzc2VydCB9IGZyb20gXCIuLi8uLi8uLi9zaGFyZWQvYXNzZXJ0XCI7XG5pbXBvcnQgeyBUcmVlUGxvdCB9IGZyb20gXCIuLi8uLi9zdHJ1Y3R1cmUvdHJlZS1wbG90XCI7XG5pbXBvcnQgeyBmaWx0ZXIsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBHcmFmdEV2ZW50IH0gZnJvbSBcIi4uLy4uL2V2ZW50cy9yZWxhdGlvbmFsL2dyYWZ0LWV2ZW50XCI7XG5pbXBvcnQgeyBQcnVuZUV2ZW50IH0gZnJvbSBcIi4uLy4uL2V2ZW50cy9yZWxhdGlvbmFsL3BydW5lLWV2ZW50XCI7XG5pbXBvcnQgeyBUcmVlRXZlbnQgfSBmcm9tIFwiLi4vLi4vc3RydWN0dXJlL3RyZWUtZXZlbnQuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBUcmVlQnJhbmNoTm9kZSB9IGZyb20gXCIuLi8uLi9zdHJ1Y3R1cmUvdHJlZS1icmFuY2gtbm9kZS5pbnRlcmZhY2VcIjtcbmltcG9ydCB7XG4gICBDb21wb25lbnRSZWYsXG4gICBjcmVhdGVDb21wb25lbnQsXG4gICBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgVHlwZSxcbiAgIFZpZXdSZWZcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEJyYW5jaENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL2JyYW5jaC9icmFuY2guY29tcG9uZW50XCI7XG5pbXBvcnQgeyBDb250YWluZXJUcmVlTm9kZSB9IGZyb20gXCIuLi8uLi9zdHJ1Y3R1cmUvY29udGFpbmVyLXRyZWUtbm9kZS5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IE5vZGVDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9ub2RlLWNvbXBvbmVudC5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IFRyZWVOb2RlQmFzZSB9IGZyb20gXCIuLi90cmVlLW5vZGUtYmFzZVwiO1xuaW1wb3J0IHsgVHJlZUVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9ycy90cmVlLWVycm9yXCI7XG5pbXBvcnQgeyBCcmFuY2hPcHRpb25zLCBGdWxsQnJhbmNoT3B0aW9ucyB9IGZyb20gXCIuLi9icmFuY2gtb3B0aW9ucy5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IGRyb3B6b25lUmVuZGVyZXIgfSBmcm9tIFwiLi4vLi4vZXh0cmFzL2RyYWctYW5kLWRyb3AvZHJvcHpvbmUtcmVuZGVyZXJcIjtcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gXCIuLi9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB7IFRyZWVSb290IH0gZnJvbSBcIi4uXCI7XG5pbXBvcnQgeyB0cmVlQ29sbGFwc2VyIH0gZnJvbSBcIi4uLy4uL2V4dHJhcy9jb2xsYXBzZS9jb2xsYXBzZVwiO1xuXG5leHBvcnQgY2xhc3MgVHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD5cbiAgIGltcGxlbWVudHNcbiAgICAgIFRyZWVCcmFuY2hOb2RlPFxuICAgICAgICAgQ29tcG9uZW50UmVmPEJyYW5jaENvbXBvbmVudDxVc2VybGFuZENvbXBvbmVudD4+LFxuICAgICAgICAgVHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4sXG4gICAgICAgICBDb21wb25lbnRSZWY8Tm9kZUNvbXBvbmVudD5cbiAgICAgID5cbntcbiAgIHByaXZhdGUgcmVhZG9ubHkgY29udGVudHM6IENvbXBvbmVudFJlZjxCcmFuY2hDb21wb25lbnQ8VXNlcmxhbmRDb21wb25lbnQ+PjtcbiAgIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VTdWJzY3JpcHRpb25zOiBBcnJheTxTdWJzY3JpcHRpb24+O1xuICAgcHJpdmF0ZSByZWFkb25seSBvdXRwdXRCaW5kaW5nU3Vic2NyaXB0aW9uczogQXJyYXk8U3Vic2NyaXB0aW9uPjtcbiAgIHByaXZhdGUgX3BhcmVudDpcbiAgICAgIHwgQ29udGFpbmVyVHJlZU5vZGU8XG4gICAgICAgICAgIENvbXBvbmVudFJlZjxOb2RlQ29tcG9uZW50PixcbiAgICAgICAgICAgVHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD5cbiAgICAgICAgPlxuICAgICAgfCB1bmRlZmluZWQ7XG4gICBwcml2YXRlIHJlYWRvbmx5IHRyZWVOb2RlQmFzZTogVHJlZU5vZGVCYXNlPFVzZXJsYW5kQ29tcG9uZW50PjtcbiAgIHByaXZhdGUgcmVhZG9ubHkgdXNlcmxhbmRDb21wb25lbnQ6IFR5cGU8VXNlcmxhbmRDb21wb25lbnQ+O1xuICAgcHJpdmF0ZSBkZXRhY2hlZFZpZXc6IFZpZXdSZWYgfCBudWxsID0gbnVsbDtcblxuICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgcGFyZW50OiBDb250YWluZXJUcmVlTm9kZTxcbiAgICAgICAgIENvbXBvbmVudFJlZjxOb2RlQ29tcG9uZW50PixcbiAgICAgICAgIFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+XG4gICAgICA+LFxuICAgICAgcHVibGljIHJlYWRvbmx5IGJyYW5jaE9wdGlvbnM6IEZ1bGxCcmFuY2hPcHRpb25zPFVzZXJsYW5kQ29tcG9uZW50PlxuICAgKSB7XG4gICAgICB0aGlzLnRyZWVOb2RlQmFzZSA9IG5ldyBUcmVlTm9kZUJhc2UoKTtcbiAgICAgIHRoaXMudXNlcmxhbmRDb21wb25lbnQgPSB0aGlzLmJyYW5jaE9wdGlvbnMuY29tcG9uZW50O1xuICAgICAgY29uc3QgcGFyZW50QnJhbmNoZXNDb250YWluZXIgPVxuICAgICAgICAgcGFyZW50LmdldENvbnRlbnRzKCkuaW5zdGFuY2UuYnJhbmNoZXNDb250YWluZXI7XG4gICAgICBhc3NlcnQocGFyZW50QnJhbmNoZXNDb250YWluZXIgIT09IHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLmNvbnRlbnRzID0gY3JlYXRlQ29tcG9uZW50PEJyYW5jaENvbXBvbmVudDxVc2VybGFuZENvbXBvbmVudD4+KFxuICAgICAgICAgQnJhbmNoQ29tcG9uZW50LFxuICAgICAgICAge1xuICAgICAgICAgICAgZW52aXJvbm1lbnRJbmplY3RvcjpcbiAgICAgICAgICAgICAgIHBhcmVudEJyYW5jaGVzQ29udGFpbmVyLmluamVjdG9yLmdldChFbnZpcm9ubWVudEluamVjdG9yKVxuICAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHRoaXMuY29udGVudHMuaW5zdGFuY2UuY29udGVudFRvSG9zdCA9IHRoaXMudXNlcmxhbmRDb21wb25lbnQ7XG4gICAgICB0aGlzLnNldEluZGVudGF0aW9uKHBhcmVudCk7XG4gICAgICB0aGlzLm91dHB1dEJpbmRpbmdTdWJzY3JpcHRpb25zID0gW107XG4gICAgICB0aGlzLmluc3RhbmNlU3Vic2NyaXB0aW9ucyA9IHRoaXMuZ2V0SW5zdGFuY2VTdWJzY3JpcHRpb25zKCk7XG4gICAgICBpZiAoXG4gICAgICAgICBwYXJlbnQgaW5zdGFuY2VvZiBUcmVlQnJhbmNoICYmXG4gICAgICAgICBwYXJlbnQuYnJhbmNoT3B0aW9ucy5zdGFydENvbGxhcHNlZCA9PT0gdHJ1ZVxuICAgICAgKSB7XG4gICAgICAgICB0cmVlQ29sbGFwc2VyLnN0b3JlUHJlY29sbGFwc2VkTm9kZShwYXJlbnQsIHRoaXMpO1xuICAgICAgICAgdGhpcy5kZXRhY2hlZFZpZXcgPSB0aGlzLmNvbnRlbnRzLmhvc3RWaWV3O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIHBhcmVudEJyYW5jaGVzQ29udGFpbmVyLmluc2VydCh0aGlzLmNvbnRlbnRzLmhvc3RWaWV3KTtcbiAgICAgICAgIHRoaXMuY29udGVudHMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICAgICAgICAgdGhpcy5kaXNwYXRjaChcbiAgICAgICAgICAgIG5ldyBHcmFmdEV2ZW50KHRoaXMsIHtcbiAgICAgICAgICAgICAgIHBhcmVudDogdGhpcy5fcGFyZW50LFxuICAgICAgICAgICAgICAgY2hpbGQ6IHRoaXMsXG4gICAgICAgICAgICAgICBpbmRleDogdGhpcy5fcGFyZW50LmJyYW5jaGVzKCkubGVuZ3RoXG4gICAgICAgICAgICB9KVxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHVibGljIGJyYW5jaGVzKCk6IEFycmF5PFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+PiB7XG4gICAgICByZXR1cm4gdGhpcy50cmVlTm9kZUJhc2UuYnJhbmNoZXMoKTtcbiAgIH1cblxuICAgcHVibGljIGRlbGV0ZUJyYW5jaChpbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgICAgdGhpcy50cmVlTm9kZUJhc2UuZGVsZXRlQnJhbmNoKGluZGV4KTtcbiAgIH1cblxuICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICBpZiAodHJlZUNvbGxhcHNlci5pc0NvbGxhcHNlZCh0aGlzKSkge1xuICAgICAgICAgdHJlZUNvbGxhcHNlci5leHBhbmQodGhpcyk7XG4gICAgICAgICBkcm9wem9uZVJlbmRlcmVyLmNsZWFyVHJlZUZyb21SZWdpc3RyeSh0aGlzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYnJhbmNoZXMoKS5mb3JFYWNoKChicmFuY2gpID0+IHtcbiAgICAgICAgIGJyYW5jaC5kZXN0cm95KCk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX3BhcmVudDtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleCgpO1xuICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQgJiYgcGFyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHBhcmVudC5nZXRDb250ZW50cygpLmluc3RhbmNlLmJyYW5jaGVzQ29udGFpbmVyO1xuICAgICAgICAgYXNzZXJ0KGNvbnRhaW5lciAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgIGNvbnRhaW5lci5yZW1vdmUoaW5kZXgpO1xuICAgICAgICAgcGFyZW50LmRlbGV0ZUJyYW5jaChpbmRleCk7XG4gICAgICB9XG4gICAgICB0aGlzLnRyZWVOb2RlQmFzZS5kZXN0cm95KCk7XG4gICAgICB0aGlzLmluc3RhbmNlU3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWIpID0+IHtcbiAgICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm91dHB1dEJpbmRpbmdTdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YikgPT4ge1xuICAgICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9KTtcbiAgIH1cblxuICAgcHVibGljIGRpc3BhdGNoKGV2ZW50OiBUcmVlRXZlbnQpOiB2b2lkIHtcbiAgICAgIHRoaXMudHJlZU5vZGVCYXNlLmRpc3BhdGNoKGV2ZW50KTtcbiAgICAgIHRoaXMuX3BhcmVudD8uZGlzcGF0Y2goZXZlbnQpO1xuICAgfVxuXG4gICBwdWJsaWMgZXZlbnRzKCk6IE9ic2VydmFibGU8VHJlZUV2ZW50PiB7XG4gICAgICByZXR1cm4gdGhpcy50cmVlTm9kZUJhc2UuZXZlbnRzKCk7XG4gICB9XG5cbiAgIHB1YmxpYyBnZXRCcmFuY2goaW5kZXg6IG51bWJlcik6IFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLnRyZWVOb2RlQmFzZS5nZXRCcmFuY2goaW5kZXgpO1xuICAgfVxuXG4gICBwdWJsaWMgZ2V0Q29udGVudHMoKTogQ29tcG9uZW50UmVmPEJyYW5jaENvbXBvbmVudDxVc2VybGFuZENvbXBvbmVudD4+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRzO1xuICAgfVxuXG4gICBwdWJsaWMgZ3JhZnRUbyhcbiAgICAgIG5ld1BhcmVudDogQ29udGFpbmVyVHJlZU5vZGU8XG4gICAgICAgICBDb21wb25lbnRSZWY8Tm9kZUNvbXBvbmVudD4sXG4gICAgICAgICBUcmVlQnJhbmNoPFVzZXJsYW5kQ29tcG9uZW50PlxuICAgICAgPixcbiAgICAgIGluZGV4PzogbnVtYmVyXG4gICApOiBudW1iZXIge1xuICAgICAgY29uc3Qgb3duSW5kZXggPSB0aGlzLmluZGV4KCk7XG4gICAgICBpZiAob3duSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhpcy5wcnVuZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fcGFyZW50ID0gbmV3UGFyZW50O1xuICAgICAgY29uc3QgbmV3SW5kZXggPSBpbmRleCA/PyBuZXdQYXJlbnQuYnJhbmNoZXMoKS5sZW5ndGg7XG4gICAgICB0aGlzLnJlYXR0YWNoVmlldyhuZXdJbmRleCk7XG4gICAgICB0aGlzLmRpc3BhdGNoKFxuICAgICAgICAgbmV3IEdyYWZ0RXZlbnQodGhpcywge1xuICAgICAgICAgICAgcGFyZW50OiBuZXdQYXJlbnQsXG4gICAgICAgICAgICBjaGlsZDogdGhpcyxcbiAgICAgICAgICAgIGluZGV4OiBuZXdJbmRleFxuICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm4gbmV3SW5kZXg7XG4gICB9XG5cbiAgIHB1YmxpYyBncm93KFxuICAgICAgY29tcG9uZW50OiBUeXBlPFVzZXJsYW5kQ29tcG9uZW50PixcbiAgICAgIG9wdGlvbnM/OiBCcmFuY2hPcHRpb25zPFVzZXJsYW5kQ29tcG9uZW50PlxuICAgKTogVHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4ge1xuICAgICAgcmV0dXJuIG5ldyBUcmVlQnJhbmNoKHRoaXMsIHsgY29tcG9uZW50LCAuLi5vcHRpb25zIH0pO1xuICAgfVxuXG4gICBwdWJsaWMgaW5kZXgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmICghdGhpcy5fcGFyZW50KSB7XG4gICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9wYXJlbnRcbiAgICAgICAgIC5icmFuY2hlcygpXG4gICAgICAgICAuZmluZEluZGV4KChicmFuY2gpID0+IGJyYW5jaCA9PT0gdGhpcyk7XG4gICAgICBhc3NlcnQoaW5kZXggPj0gMCk7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICB9XG5cbiAgIHB1YmxpYyBtZXRhKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgcmV0dXJuIHRoaXMuYnJhbmNoT3B0aW9ucy5tZXRhID8/IHt9O1xuICAgfVxuXG4gICBwdWJsaWMgcGFyZW50KCk6XG4gICAgICB8IENvbnRhaW5lclRyZWVOb2RlPFxuICAgICAgICAgICBDb21wb25lbnRSZWY8Tm9kZUNvbXBvbmVudD4sXG4gICAgICAgICAgIFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+XG4gICAgICAgID5cbiAgICAgIHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQ7XG4gICB9XG5cbiAgIHB1YmxpYyBwbG90KCk6IFRyZWVQbG90IHtcbiAgICAgIHJldHVybiB0aGlzLnRyZWVOb2RlQmFzZS5wbG90KCk7XG4gICB9XG5cbiAgIHB1YmxpYyBwb3NpdGlvbigpOiBBcnJheTxudW1iZXI+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleCgpO1xuICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXG4gICAgICAgICAgICBcImJyYW5jaCBoYXMgbm8gcGFyZW50LiBQb3NpdGlvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5cIlxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBUcmVlQnJhbmNoKSB7XG4gICAgICAgICBjb25zdCBwYXJlbnRQb3NpdGlvbiA9IHRoaXMuX3BhcmVudC5wb3NpdGlvbigpO1xuICAgICAgICAgcmV0dXJuIFsuLi5wYXJlbnRQb3NpdGlvbiwgaW5kZXhdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtpbmRleF07XG4gICB9XG5cbiAgIHB1YmxpYyBwcnVuZSgpOiB0aGlzIHwgdW5kZWZpbmVkIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX3BhcmVudDtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleCgpO1xuICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQgfHwgcGFyZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHBhcmVudC5nZXRDb250ZW50cygpLmluc3RhbmNlLmJyYW5jaGVzQ29udGFpbmVyO1xuICAgICAgYXNzZXJ0KGNvbnRhaW5lciAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIHRoaXMuZGV0YWNoZWRWaWV3ID0gY29udGFpbmVyLmRldGFjaChpbmRleCk7XG4gICAgICBhc3NlcnQodGhpcy5kZXRhY2hlZFZpZXcgIT09IG51bGwpO1xuICAgICAgdGhpcy5kZXRhY2hlZFZpZXcuZGV0YWNoKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoKFxuICAgICAgICAgbmV3IFBydW5lRXZlbnQodGhpcywge1xuICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgICAgICBjaGlsZDogdGhpcyxcbiAgICAgICAgICAgIGluZGV4OiBpbmRleFxuICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLl9wYXJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgIH1cblxuICAgcHVibGljIHJvb3QoKTogVHJlZVJvb3Q8VXNlcmxhbmRDb21wb25lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50KCk7XG4gICAgICBpZiAocGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgVHJlZUJyYW5jaCkge1xuICAgICAgICAgcmV0dXJuIHBhcmVudC5yb290KCk7XG4gICAgICB9XG4gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgVHJlZVJvb3QpIHtcbiAgICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmV4cGVjdGVkIHBhcmVudCB0eXBlXCIpO1xuICAgfVxuXG4gICBwdWJsaWMgdHJhdmVyc2UoXG4gICAgICBjYWxsYmFjazogKFxuICAgICAgICAgbm9kZTogQ29udGFpbmVyVHJlZU5vZGU8XG4gICAgICAgICAgICBDb21wb25lbnRSZWY8Tm9kZUNvbXBvbmVudD4sXG4gICAgICAgICAgICBUcmVlQnJhbmNoPFVzZXJsYW5kQ29tcG9uZW50PlxuICAgICAgICAgPlxuICAgICAgKSA9PiB2b2lkXG4gICApOiB2b2lkIHtcbiAgICAgIGNhbGxiYWNrKHRoaXMpO1xuICAgICAgdGhpcy50cmVlTm9kZUJhc2UudHJhdmVyc2UoY2FsbGJhY2spO1xuICAgfVxuXG4gICBwcml2YXRlIGdldENvbnRlbnRDcmVhdGVkU3ViKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuY29udGVudHMuaW5zdGFuY2U7XG4gICAgICByZXR1cm4gaW5zdGFuY2UuY29udGVudENyZWF0ZWQuc3Vic2NyaWJlKCh1c2VybGFuZENvbXBvbmVudEluc3RhbmNlKSA9PiB7XG4gICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICAgIHRoaXMuYnJhbmNoT3B0aW9ucy5pbnB1dEJpbmRpbmdzID8/IHt9XG4gICAgICAgICApKSB7XG4gICAgICAgICAgICAodXNlcmxhbmRDb21wb25lbnRJbnN0YW5jZSBhcyBhbnkpW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgIH1cbiAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgICAgdGhpcy5icmFuY2hPcHRpb25zLm91dHB1dEJpbmRpbmdzID8/IHt9XG4gICAgICAgICApKSB7XG4gICAgICAgICAgICB0aGlzLm91dHB1dEJpbmRpbmdTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAodXNlcmxhbmRDb21wb25lbnRJbnN0YW5jZSBhcyBhbnkpW2tleV0uc3Vic2NyaWJlKHZhbHVlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgIH1cbiAgICAgICAgICh1c2VybGFuZENvbXBvbmVudEluc3RhbmNlIGFzIGFueSkudHJlZUJyYW5jaCA9IHRoaXM7XG4gICAgICAgICBjb25zdCBkcm9wem9uZXMgPSBpbnN0YW5jZS5kcm9wem9uZXM7XG4gICAgICAgICBpZiAoIWRyb3B6b25lcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZHJvcHpvbmVzIG5vdCBkZWZpbmVkXCIpO1xuICAgICAgICAgfVxuICAgICAgICAgZHJvcHpvbmVSZW5kZXJlci5yZWdpc3RlckRyb3B6b25lcyhkcm9wem9uZXMsIHRoaXMpO1xuICAgICAgfSk7XG4gICB9XG5cbiAgIHByaXZhdGUgZ2V0SW5zdGFuY2VTdWJzY3JpcHRpb25zKCk6IEFycmF5PFN1YnNjcmlwdGlvbj4ge1xuICAgICAgY29uc3QgZHJvcHBlZFN1YiA9IHRoaXMuY29udGVudHMuaW5zdGFuY2UuZHJvcHBlZC5zdWJzY3JpYmUoXG4gICAgICAgICAocGxhY2VtZW50KSA9PiB7XG4gICAgICAgICAgICBkcm9wem9uZVJlbmRlcmVyLmhhbmRsZURyb3AodGhpcywgcGxhY2VtZW50KTtcbiAgICAgICAgIH1cbiAgICAgICk7XG4gICAgICByZXR1cm4gW1xuICAgICAgICAgdGhpcy5nZXRDb250ZW50Q3JlYXRlZFN1YigpLFxuICAgICAgICAgdGhpcy5nZXRTaG93TG93ZXJab25lc1N1YigpLFxuICAgICAgICAgdGhpcy5nZXRTaG93VXBwZXJab25lc1N1YigpLFxuICAgICAgICAgZHJvcHBlZFN1YlxuICAgICAgXTtcbiAgIH1cblxuICAgcHJpdmF0ZSBnZXRTaG93TG93ZXJab25lc1N1YigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmNvbnRlbnRzLmluc3RhbmNlO1xuICAgICAgcmV0dXJuIGluc3RhbmNlLnNob3dEcm9wem9uZXNcbiAgICAgICAgIC5waXBlKGZpbHRlcigoZGlyZWN0aW9uKSA9PiBkaXJlY3Rpb24gPT09IFwibG93ZXJcIikpXG4gICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREcm9wem9uZURpc3BsYXllZCA9XG4gICAgICAgICAgICAgICBkcm9wem9uZVJlbmRlcmVyLmdldEN1cnJlbnREaXNwbGF5KCk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICBjdXJyZW50RHJvcHpvbmVEaXNwbGF5ZWQ/LnRyZWVCcmFuY2ggPT09IHRoaXMgJiZcbiAgICAgICAgICAgICAgIGN1cnJlbnREcm9wem9uZURpc3BsYXllZC5kaXJlY3Rpb24gPT09IFwibG93ZXJcIlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkcm9wem9uZVJlbmRlcmVyLnNob3dMb3dlclpvbmVzKHRoaXMpO1xuICAgICAgICAgICAgaW5zdGFuY2UudHJpZ2dlckNoYW5nZURldGVjdGlvbigpO1xuICAgICAgICAgfSk7XG4gICB9XG5cbiAgIHByaXZhdGUgZ2V0U2hvd1VwcGVyWm9uZXNTdWIoKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5jb250ZW50cy5pbnN0YW5jZTtcbiAgICAgIHJldHVybiBpbnN0YW5jZS5zaG93RHJvcHpvbmVzXG4gICAgICAgICAucGlwZShmaWx0ZXIoKGRpcmVjdGlvbikgPT4gZGlyZWN0aW9uID09PSBcInVwcGVyXCIpKVxuICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RHJvcHpvbmVEaXNwbGF5ZWQgPVxuICAgICAgICAgICAgICAgZHJvcHpvbmVSZW5kZXJlci5nZXRDdXJyZW50RGlzcGxheSgpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgY3VycmVudERyb3B6b25lRGlzcGxheWVkPy50cmVlQnJhbmNoID09PSB0aGlzICYmXG4gICAgICAgICAgICAgICBjdXJyZW50RHJvcHpvbmVEaXNwbGF5ZWQuZGlyZWN0aW9uID09PSBcInVwcGVyXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZHJvcHpvbmVSZW5kZXJlci5zaG93VXBwZXJab25lcyh0aGlzKTtcbiAgICAgICAgICAgIGluc3RhbmNlLnRyaWdnZXJDaGFuZ2VEZXRlY3Rpb24oKTtcbiAgICAgICAgIH0pO1xuICAgfVxuXG4gICBwcml2YXRlIHJlYXR0YWNoVmlldyhpbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgICAgYXNzZXJ0KHRoaXMuX3BhcmVudCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIGFzc2VydCh0aGlzLmRldGFjaGVkVmlldyAhPT0gbnVsbCk7XG4gICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9wYXJlbnQuZ2V0Q29udGVudHMoKS5pbnN0YW5jZS5icmFuY2hlc0NvbnRhaW5lcjtcbiAgICAgIGFzc2VydChjb250YWluZXIgIT09IHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLmRldGFjaGVkVmlldy5yZWF0dGFjaCgpO1xuICAgICAgY29udGFpbmVyLmluc2VydCh0aGlzLmRldGFjaGVkVmlldywgaW5kZXgpO1xuICAgICAgdGhpcy5kZXRhY2hlZFZpZXcgPSBudWxsO1xuICAgfVxuXG4gICBwcml2YXRlIHNldEluZGVudGF0aW9uKFxuICAgICAgcGFyZW50OiBDb250YWluZXJUcmVlTm9kZTxcbiAgICAgICAgIENvbXBvbmVudFJlZjxOb2RlQ29tcG9uZW50PixcbiAgICAgICAgIFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+XG4gICAgICA+XG4gICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IHJvb3QgPSBwYXJlbnQucm9vdCgpO1xuICAgICAgYXNzZXJ0KHJvb3QgIT09IHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCBvcHRpb25zID0gY29uZmlnLmdldENvbmZpZyhyb290KTtcbiAgICAgIGNvbnN0IGJyYW5jaGVzQ29udGFpbmVyRWwgPSB0aGlzLmNvbnRlbnRzLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiYnJhbmNoZXMtY29udGFpbmVyXCIpXG4gICAgICAgICAuaXRlbSgwKTtcbiAgICAgIGFzc2VydChicmFuY2hlc0NvbnRhaW5lckVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpO1xuICAgICAgYnJhbmNoZXNDb250YWluZXJFbC5zdHlsZS5tYXJnaW5MZWZ0ID0gYCR7b3B0aW9ucz8uaW5kZW50YXRpb24gPz8gMTZ9cHhgO1xuICAgfVxufVxuIl19
|
|
400
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1icmFuY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2NvcmUvdHJlZS1icmFuY2gvdHJlZS1icmFuY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBVWhELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBS3pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQU94RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBZXBCLFlBQ0csTUFBOEQsRUFDOUMsYUFBbUQ7UUFBbkQsa0JBQWEsR0FBYixhQUFhLENBQXNDO1FBUjlELGlCQUFZLEdBQW1CLElBQUksQ0FBQztRQVV6QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdkMsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM5RCxNQUFNLENBQUMsdUJBQXVCLEtBQUssU0FBUyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLENBQ3pDLElBQUksRUFDSix1QkFBdUIs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QUFDO1FBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGdCQUFnQjthQUM3QyxnQkFBZ0IsRUFBRTthQUNsQixzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FBQzthQUM1QyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDWixNQUFNLENBQUMsbUJBQW1CLFlBQVksV0FBVyxDQUFDLENBQUM7UUFDbkQsbUJBQW1CLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxHQUFHLE9BQU8sRUFBRSxXQUFXLElBQUksRUFBRSxJQUFJLENBQUM7SUFDNUUsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSBcIi4uLy4uLy4uL3NoYXJlZC9hc3NlcnRcIjtcbmltcG9ydCB0eXBlIHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gICBDb21wb25lbnRSZWYsXG4gICBUeXBlLFxuICAgVmlld0NvbnRhaW5lclJlZixcbiAgIFZpZXdSZWZcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEJyYW5jaENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL2JyYW5jaC9icmFuY2guY29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IE5vZGVDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9ub2RlLWNvbXBvbmVudC5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IFRyZWVOb2RlQmFzZSB9IGZyb20gXCIuLi90cmVlLW5vZGUtYmFzZVwiO1xuaW1wb3J0IHsgVHJlZUVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yc1wiO1xuaW1wb3J0IHR5cGUge1xuICAgQnJhbmNoT3B0aW9ucyxcbiAgIEZ1bGxCcmFuY2hPcHRpb25zXG59IGZyb20gXCIuLi9icmFuY2gtb3B0aW9ucy5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IGRyb3B6b25lUmVuZGVyZXIgfSBmcm9tIFwiLi4vLi4vZXh0cmFzL2RyYWctYW5kLWRyb3AvZHJvcHpvbmUtcmVuZGVyZXJcIjtcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gXCIuLi9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB7IFRyZWVSb290IH0gZnJvbSBcIi4uXCI7XG5pbXBvcnQgeyB0cmVlQ29sbGFwc2VyIH0gZnJvbSBcIi4uLy4uL2V4dHJhcy9jb2xsYXBzZS9jb2xsYXBzZVwiO1xuaW1wb3J0IHsgRGVzdHJ1Y3Rpb25FdmVudCwgR3JhZnRFdmVudCwgUHJ1bmVFdmVudCB9IGZyb20gXCIuLi8uLi9ldmVudHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgIFRyZWVOb2RlLFxuICAgVHJlZVBsb3QsXG4gICBUcmVlRXZlbnQsXG4gICBUcmVlQnJhbmNoTm9kZVxufSBmcm9tIFwiLi4vLi4vc3RydWN0dXJlXCI7XG5pbXBvcnQgeyBCcmFuY2hDb250cm9sbGVyIH0gZnJvbSBcIi4vYnJhbmNoLWNvbnRyb2xsZXJcIjtcblxuLyoqIFJlcHJlc2VudHMgYSBzdGFuZGFyZCBub2RlIGluIGEgdHJlZS4gUmVuZGVycyBhIEJyYW5jaENvbXBvbmVudC5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyBjbGFzcyByZW5kZXJzIGEgYnJhbmNoIGNvbXBvbmVudCwgd2hpY2ggZG9lcyB0aGUgZm9sbG93aW5nOlxuICogMS4gUmVuZGVycyBhIGNvbXBvbmVudCBwcm92aWRlZCBieSB0aGUgdXNlclxuICogMi4gUHJvdmlkZXMgYSBjb250YWluZXIgaW4gd2hpY2ggY2hpbGQgYnJhbmNoZXMgbWF5IGJlIHJlbmRlcmVkXG4gKiAzLiBDb250YWlucyB0d28gRHJvcHpvbmVzOiBvbmUgZm9yIGRyb3BwaW5nIGJyYW5jaGVzIGJlbG93IHRoaXMgYnJhbmNoIChhcyBhXG4gKiBzaWJsaW5nKSwgYW5kIG9uZSBmb3IgZHJvcHBpbmcgYnJhbmNoZXMgYXMgYSBmaXJzdCBjaGlsZCBvZiB0aGlzIGJyYW5jaC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+XG4gICBpbXBsZW1lbnRzXG4gICAgICBUcmVlQnJhbmNoTm9kZTxcbiAgICAgICAgIEJyYW5jaENvbXBvbmVudDxVc2VybGFuZENvbXBvbmVudD4sXG4gICAgICAgICBUcmVlQnJhbmNoPFVzZXJsYW5kQ29tcG9uZW50PixcbiAgICAgICAgIE5vZGVDb21wb25lbnRcbiAgICAgID5cbntcbiAgIHByaXZhdGUgcmVhZG9ubHkgYnJhbmNoQ29udHJvbGxlcjogQnJhbmNoQ29udHJvbGxlcjxVc2VybGFuZENvbXBvbmVudD47XG4gICBwcml2YXRlIGRldGFjaGVkVmlldzogVmlld1JlZiB8IG51bGwgPSBudWxsO1xuICAgcHJpdmF0ZSBfcGFyZW50OlxuICAgICAgfCBUcmVlTm9kZTxUcmVlQnJhbmNoPFVzZXJsYW5kQ29tcG9uZW50PiwgTm9kZUNvbXBvbmVudD5cbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgcHJpdmF0ZSByZWFkb25seSB0cmVlTm9kZUJhc2U6IFRyZWVOb2RlQmFzZTxVc2VybGFuZENvbXBvbmVudD47XG5cbiAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgIHBhcmVudDogVHJlZU5vZGU8VHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4sIE5vZGVDb21wb25lbnQ+LFxuICAgICAgcHVibGljIHJlYWRvbmx5IGJyYW5jaE9wdGlvbnM6IEZ1bGxCcmFuY2hPcHRpb25zPFVzZXJsYW5kQ29tcG9uZW50PlxuICAgKSB7XG4gICAgICB0aGlzLnRyZWVOb2RlQmFzZSA9IG5ldyBUcmVlTm9kZUJhc2UoKTtcbiAgICAgIGNvbnN0IHBhcmVudEJyYW5jaGVzQ29udGFpbmVyID0gcGFyZW50LmdldEJyYW5jaGVzQ29udGFpbmVyKCk7XG4gICAgICBhc3NlcnQocGFyZW50QnJhbmNoZXNDb250YWluZXIgIT09IHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLmJyYW5jaENvbnRyb2xsZXIgPSBuZXcgQnJhbmNoQ29udHJvbGxlcihcbiAgICAgICAgIHRoaXMsXG4gICAgICAgICBwYXJlbnRCcmFuY2hlc0NvbnRhaW5lclxuICAgICAgKTtcbiAgICAgIHRoaXMuc2V0SW5kZW50YXRpb24ocGFyZW50KTtcbiAgICAgIGlmIChcbiAgICAgICAgIHBhcmVudCBpbnN0YW5jZW9mIFRyZWVCcmFuY2ggJiZcbiAgICAgICAgIHBhcmVudC5icmFuY2hPcHRpb25zLmRlZmF1bHRDb2xsYXBzZWQgPT09IHRydWVcbiAgICAgICkge1xuICAgICAgICAgdHJlZUNvbGxhcHNlci5zdG9yZVByZWNvbGxhcHNlZE5vZGUocGFyZW50LCB0aGlzKTtcbiAgICAgICAgIHRoaXMuZGV0YWNoZWRWaWV3ID0gdGhpcy5icmFuY2hDb250cm9sbGVyLmdldEhvc3RWaWV3KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgcGFyZW50QnJhbmNoZXNDb250YWluZXIuaW5zZXJ0KHRoaXMuYnJhbmNoQ29udHJvbGxlci5nZXRIb3N0VmlldygpKTtcbiAgICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICAgICAgICAgdGhpcy5kaXNwYXRjaChcbiAgICAgICAgICAgIG5ldyBHcmFmdEV2ZW50KHRoaXMsIHtcbiAgICAgICAgICAgICAgIHBhcmVudDogdGhpcy5fcGFyZW50LFxuICAgICAgICAgICAgICAgY2hpbGQ6IHRoaXMsXG4gICAgICAgICAgICAgICBpbmRleDogdGhpcy5fcGFyZW50LmJyYW5jaGVzKCkubGVuZ3RoXG4gICAgICAgICAgICB9KVxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgIH1cblxuICAgLyoqIEByZXR1cm5zIEFsbCBjaGlsZCBicmFuY2hlcyBhcyBhbiBhcnJheSBvZiBUcmVlQnJhbmNoIGluc3RhbmNlcywgaW4gb3JkZXIuICovXG4gICBwdWJsaWMgYnJhbmNoZXMoKTogQXJyYXk8VHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4+IHtcbiAgICAgIHJldHVybiB0aGlzLnRyZWVOb2RlQmFzZS5icmFuY2hlcygpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIFJlY3Vyc2l2ZWx5IGRlc3Ryb3lzIGFsbCBkZXNjZW5kYW50IGJyYW5jaGVzLCBhcyB3ZWxsIGFzIGl0c2VsZi4gVGhpc1xuICAgICogcmVsZWFzZXMgYWxsIHJlc291cmNlcyBoZWxkIG9yIGNvbnN1bWVkIGJ5IHRoaXMgYnJhbmNoIGFuZCBpdHMgZGVzY2VuZGFudHMuXG4gICAgKlxuICAgICogQHJlbWFya3NcbiAgICAqIEl0IGlzIGltcG9ydGFudCB0byBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gYSBicmFuY2ggaXMgZGlzY2FyZGVkLCBvdGhlcndpc2VcbiAgICAqIHRoZSBicmFuY2ggd2lsbCByZW1haW4gaW4gbWVtb3J5IGFuZCBjb250aW51ZSB0byBjb25zdW1lIHJlc291cmNlcy5cbiAgICAqL1xuICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFwiQ2Fubm90IGRlc3Ryb3kgYSBkZXN0cm95ZWQgdHJlZSBicmFuY2hcIik7XG4gICAgICB9XG4gICAgICB0aGlzLnBydW5lKCk7XG4gICAgICB0cmVlQ29sbGFwc2VyLmV4cGFuZCh0aGlzKTtcbiAgICAgIGRyb3B6b25lUmVuZGVyZXIuY2xlYXJUcmVlRnJvbVJlZ2lzdHJ5KHRoaXMpO1xuICAgICAgdGhpcy5icmFuY2hDb250cm9sbGVyLmdldEhvc3RWaWV3KCkuZGVzdHJveSgpO1xuICAgICAgdGhpcy50cmVlTm9kZUJhc2UuZGVzdHJveSgpO1xuICAgICAgdGhpcy5icmFuY2hDb250cm9sbGVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2gobmV3IERlc3RydWN0aW9uRXZlbnQodGhpcykpO1xuICAgfVxuXG4gICAvKiogUnVuIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbiBvbiB0aGlzIGJyYW5jaCAqL1xuICAgcHVibGljIGRldGVjdENoYW5nZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLmJyYW5jaENvbnRyb2xsZXIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEVtaXRzIHRoZSBzcGVjaWZpZWQgVHJlZUV2ZW50LlxuICAgICpcbiAgICAqIEByZW1hcmtzXG4gICAgKiBDYXV0aW9uOiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gbWFudWFsbHkgZW1pdCBUcmVlRXZlbnRzIHRoYXQgYXJlIGFscmVhZHlcbiAgICAqIHByb3ZpZGVkIGJ5IHRoZSBsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGVtaXQgYVxuICAgICogYEdyYWZ0RXZlbnRgLCBgRGVzdHJ1Y3Rpb25FdmVudGAsIGV0Yy4gVGhlc2UgZXZlbnRzIG1heSBiZSB1c2VkIGJ5IHRoZSB0cmVlLFxuICAgICogYW5kIGVtaXR0aW5nIHRoZW0gbWFudWFsbHkgbWF5IGNhdXNlIHVuZXhwZWN0ZWQgYmVoYXZpb3IuIEluc3RlYWQsIHdlXG4gICAgKiByZWNvbW1lbmQgaW1wbGVtZW50aW5nIHRoZSBUcmVlRXZlbnQgaW50ZXJmYWNlIHdpdGggeW91ciBvd24gY3VzdG9tIGV2ZW50c1xuICAgICogYW5kIGRpc3BhdGNoaW5nIHRob3NlLlxuICAgICpcbiAgICAqIEBwYXJhbSBldmVudCAtIFRoZSBUcmVlRXZlbnQgdGhhdCB3aWxsIGJlIGVtaXR0ZWQuXG4gICAgKi9cbiAgIHB1YmxpYyBkaXNwYXRjaChldmVudDogVHJlZUV2ZW50KTogdm9pZCB7XG4gICAgICB0aGlzLnRyZWVOb2RlQmFzZS5kaXNwYXRjaChldmVudCk7XG4gICAgICB0aGlzLl9wYXJlbnQ/LmRpc3BhdGNoKGV2ZW50KTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBAcmV0dXJuc1xuICAgICogQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIFRyZWVFdmVudHMgd2hlbmV2ZXIgYW4gZXZlbnQgaXMgZGlzcGF0Y2hlZFxuICAgICogaW4gdGhpcyBicmFuY2ggb3IgYW55IG9mIGl0cyBkZXNjZW5kYW50IGJyYW5jaGVzLlxuICAgICovXG4gICBwdWJsaWMgZXZlbnRzKCk6IE9ic2VydmFibGU8VHJlZUV2ZW50PiB7XG4gICAgICByZXR1cm4gdGhpcy50cmVlTm9kZUJhc2UuZXZlbnRzKCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQHBhcmFtIGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBjaGlsZCBicmFuY2ggdG8gcmV0cmlldmUuXG4gICAgKlxuICAgICogQHJldHVybnNcbiAgICAqIFRoZSBjaGlsZCBicmFuY2ggYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgb3IgdW5kZWZpbmVkIGlmIHRoZXJlIGlzXG4gICAgKiBubyBjaGlsZCBicmFuY2ggYXQgdGhlIHNwZWNpZmllZCBpbmRleC5cbiAgICAqL1xuICAgcHVibGljIGdldEJyYW5jaChpbmRleDogbnVtYmVyKTogVHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4gfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIHRoaXMudHJlZU5vZGVCYXNlLmdldEJyYW5jaChpbmRleCk7XG4gICB9XG5cbiAgIC8qKiBAcmV0dXJucyBUaGUgVmlld0NvbnRhaW5lclJlZiBpbiB3aGljaCBjaGlsZCBicmFuY2hlcyBhcmUgcmVuZGVyZWQgKi9cbiAgIHB1YmxpYyBnZXRCcmFuY2hlc0NvbnRhaW5lcigpOiBWaWV3Q29udGFpbmVyUmVmIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKCkpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXG4gICAgICAgICAgICBcIkNhbm5vdCBnZXQgYnJhbmNoZXMgY29udGFpbmVyIGZyb20gYSBkZXN0cm95ZWQgdHJlZSBicmFuY2hcIlxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmJyYW5jaENvbnRyb2xsZXIuZ2V0QnJhbmNoZXNDb250YWluZXIoKTtcbiAgIH1cblxuICAgLyoqIEByZXR1cm5zIFRoZSBpbnN0YW5jZSBvZiBCcmFuY2hDb21wb25lbnQgdGhhdCBpcyByZW5kZXJlZCBieSB0aGlzIGNsYXNzLiAqL1xuICAgcHVibGljIGdldENvbXBvbmVudEluc3RhbmNlKCk6IEJyYW5jaENvbXBvbmVudDxVc2VybGFuZENvbXBvbmVudD4ge1xuICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcbiAgICAgICAgICAgIFwiQ2Fubm90IGdldCBjb21wb25lbnQgaW5zdGFuY2UgZnJvbSBhIGRlc3Ryb3llZCB0cmVlIGJyYW5jaFwiXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnJhbmNoQ29udHJvbGxlci5nZXRDb21wb25lbnRJbnN0YW5jZSgpO1xuICAgfVxuXG4gICAvKiogQHJldHVybnMgVGhlIEhvc3QgVmlldyBpbiB3aGljaCB0aGUgQnJhbmNoQ29tcG9uZW50IGlzIHJlbmRlcmVkICovXG4gICBwdWJsaWMgZ2V0SG9zdFZpZXcoKTogVmlld1JlZiB7XG4gICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFxuICAgICAgICAgICAgXCJDYW5ub3QgZ2V0IGNvbXBvbmVudCBob3N0IHZpZXcgZnJvbSBhIGRlc3Ryb3llZCB0cmVlIGJyYW5jaFwiXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnJhbmNoQ29udHJvbGxlci5nZXRIb3N0VmlldygpO1xuICAgfVxuXG4gICAvKiogQHJldHVybnMgVGhlIEJyYW5jaENvbXBvbmVudCBhcyBhIG5hdGl2ZSBIVE1MIEVsZW1lbnQgKi9cbiAgIHB1YmxpYyBnZXROYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKCkpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXG4gICAgICAgICAgICBcIkNhbm5vdCBnZXQgbmF0aXZlIGVsZW1lbnQgZnJvbSBhIGRlc3Ryb3llZCB0cmVlIGJyYW5jaFwiXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnJhbmNoQ29udHJvbGxlci5nZXROYXRpdmVFbGVtZW50KCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQHJldHVybnNcbiAgICAqIEEgQ29tcG9uZW50UmVmIGNvbnRhaW5pbmcgdGhlIGluc3RhbmNlIG9mIHRoZSB1c2VyLXByb3ZpZGVkXG4gICAgKiBjb21wb25lbnQgd2hpY2ggaXMgcmVuZGVyZWQgYnkgdGhpcyBicmFuY2guXG4gICAgKi9cbiAgIHB1YmxpYyBnZXRVc2VybGFuZENvbXBvbmVudFJlZigpOlxuICAgICAgfCBDb21wb25lbnRSZWY8VXNlcmxhbmRDb21wb25lbnQ+XG4gICAgICB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFxuICAgICAgICAgICAgXCJDYW5ub3QgZ2V0IHVzZXJsYW5kIGNvbXBvbmVudCBmcm9tIGEgZGVzdHJveWVkIHRyZWUgYnJhbmNoXCJcbiAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5icmFuY2hDb250cm9sbGVyLmdldFVzZXJsYW5kQ29tcG9uZW50UmVmKCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQXR0YWNoZXMgYSBicmFuY2ggdG8gYSBuZXcgcGFyZW50IG5vZGUuXG4gICAgKlxuICAgICogQHJlbWFya3NcbiAgICAqIElmIG5vdCBhbHJlYWR5IHBydW5lZCwgdGhpcyBtZXRob2QgcHJ1bmVzIChyZW1vdmVzKSB0aGlzIGJyYW5jaCBmcm9tIGl0c1xuICAgICogY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgdHJlZTsgdGhlbiBncmFmdHMgKHJlYXR0YWNoZXMpIGl0IGFzIGEgY2hpbGQgb2YgdGhlXG4gICAgKiBzcGVjaWZpZWQgcGFyZW50IGJyYW5jaCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LiBJZiBubyBpbmRleCBpcyBzcGVjaWZpZWQsXG4gICAgKiB0aGUgYnJhbmNoIGlzIGFwcGVuZGVkIGFzIHRoZSBsYXN0IGNoaWxkIG9mIHRoZSBwYXJlbnQuIFRoaXMgY2F1c2VzIHRoaXNcbiAgICAqIGJyYW5jaCdzIGFzc29jaWF0ZWQgQnJhbmNoQ29tcG9uZW50IHRvIGJlIHJlLXJlbmRlcmVkIGluIHRoZSBET00gYXQgdGhlXG4gICAgKiBuZXcgbG9jYXRpb24uXG4gICAgKlxuICAgICogQHBhcmFtIG5ld1BhcmVudCAtIFRoZSBuZXcgcGFyZW50IGJyYW5jaCB1bnRvIHdoaWNoIHRoaXMgYnJhbmNoIHdpbGwgYmUgZ3JhZnRlZC5cbiAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCBhdCB3aGljaCB0aGlzIGJyYW5jaCB3aWxsIGJlIGdyYWZ0ZWQuIElmIG5vdCBzcGVjaWZpZWQsXG4gICAgKiB0aGlzIGJyYW5jaCB3aWxsIGJlIGFwcGVuZGVkIGFzIHRoZSBsYXN0IGNoaWxkIG9mIHRoZSBuZXcgcGFyZW50LlxuICAgICpcbiAgICAqIEByZXR1cm5zIFRoZSBpbmRleCBhdCB3aGljaCB0aGlzIGJyYW5jaCB3YXMgZ3JhZnRlZC5cbiAgICAqL1xuICAgcHVibGljIGdyYWZ0VG8oXG4gICAgICBuZXdQYXJlbnQ6IFRyZWVOb2RlPFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+LCBOb2RlQ29tcG9uZW50PixcbiAgICAgIGluZGV4PzogbnVtYmVyXG4gICApOiBudW1iZXIge1xuICAgICAgdGhpcy5jaGVja0dyYWZ0TG9jYXRpb25WYWxpZGl0eShuZXdQYXJlbnQsIGluZGV4KTtcbiAgICAgIGNvbnN0IG93bkluZGV4ID0gdGhpcy5pbmRleCgpO1xuICAgICAgaWYgKG93bkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRoaXMucHJ1bmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3BhcmVudCA9IG5ld1BhcmVudDtcbiAgICAgIGNvbnN0IG5ld0luZGV4ID0gaW5kZXggPz8gbmV3UGFyZW50LmJyYW5jaGVzKCkubGVuZ3RoO1xuICAgICAgdGhpcy5yZWF0dGFjaFZpZXcobmV3SW5kZXgpO1xuICAgICAgdGhpcy5kaXNwYXRjaChcbiAgICAgICAgIG5ldyBHcmFmdEV2ZW50KHRoaXMsIHtcbiAgICAgICAgICAgIHBhcmVudDogbmV3UGFyZW50LFxuICAgICAgICAgICAgY2hpbGQ6IHRoaXMsXG4gICAgICAgICAgICBpbmRleDogbmV3SW5kZXhcbiAgICAgICAgIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuIG5ld0luZGV4O1xuICAgfVxuXG4gICAvKipcbiAgICAqIEFwcGVuZHMgYSBuZXcgY2hpbGQgYnJhbmNoIHRvIHRoaXMgYnJhbmNoLiBUaGUgY2hpbGQgYnJhbmNoIHdpbGwgcmVuZGVyXG4gICAgKiB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBhY2NvcmRpbmcgdG8gdGhlIChvcHRpb25hbCkgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXG4gICAgKlxuICAgICogQHBhcmFtIGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgdG8gcmVuZGVyIGluIHRoZSBuZXcgY2hpbGQgYnJhbmNoLlxuICAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBuZXcgY2hpbGQgYnJhbmNoLlxuICAgICpcbiAgICAqIEByZXR1cm5zXG4gICAgKiBUaGUgbmV3bHktY3JlYXRlZCBjaGlsZCBicmFuY2guXG4gICAgKi9cbiAgIHB1YmxpYyBncm93KFxuICAgICAgY29tcG9uZW50OiBUeXBlPFVzZXJsYW5kQ29tcG9uZW50PixcbiAgICAgIG9wdGlvbnM/OiBCcmFuY2hPcHRpb25zPFVzZXJsYW5kQ29tcG9uZW50PlxuICAgKTogVHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4ge1xuICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcIkNhbm5vdCBncm93IGEgYnJhbmNoIG9uIGEgZGVzdHJveWVkIHRyZWUgYnJhbmNoXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBUcmVlQnJhbmNoKHRoaXMsIHsgY29tcG9uZW50LCAuLi5vcHRpb25zIH0pO1xuICAgfVxuXG4gICAvKipcbiAgICAqIERldGVybWluZXMgdGhpcyBicmFuY2gncyBpbmRleCBpbiByZWxhdGlvbiB0byBpdHMgc2libGluZyBicmFuY2hlcy5cbiAgICAqXG4gICAgKiBAcmVtYXJrc1xuICAgICogRm9yIGV4YW1wbGUsIGlmIGl0IGlzIHRoZSBmaXJzdCBjaGlsZCBvZiBpdHMgcGFyZW50LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVyblxuICAgICogMC4gSWYgaXQgaXMgdGhlIHNlY29uZCBjaGlsZCBvZiBpdHMgcGFyZW50LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiAxLlxuICAgICpcbiAgICAqIElmIHRoaXMgYnJhbmNoIGhhcyBubyBwYXJlbnQsIChlZywgaWYgdGhpcyBicmFuY2ggaGFzIGJlZW4gcHJ1bmVkKSB0aGlzXG4gICAgKiBtZXRob2Qgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuICAgICpcbiAgICAqIEByZXR1cm5zXG4gICAgKiBUaGUgaW5kZXggb2YgdGhpcyBicmFuY2ggaW4gcmVsYXRpb24gdG8gaXRzIHNpYmxpbmcgYnJhbmNoZXMsIG9yIHVuZGVmaW5lZC5cbiAgICAqL1xuICAgcHVibGljIGluZGV4KCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAoIXRoaXMuX3BhcmVudCkge1xuICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fcGFyZW50XG4gICAgICAgICAuYnJhbmNoZXMoKVxuICAgICAgICAgLmZpbmRJbmRleCgoYnJhbmNoKSA9PiBicmFuY2ggPT09IHRoaXMpO1xuICAgICAgYXNzZXJ0KGluZGV4ID49IDApO1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgfVxuXG4gICAvKiogQHJldHVybnMgYHRydWVgIGlmIHRoZSBicmFuY2ggaXMgZGVzdHJveWVkLCBgZmFsc2VgIG90aGVyd2lzZSAqL1xuICAgcHVibGljIGlzRGVzdHJveWVkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMudHJlZU5vZGVCYXNlLmlzRGVzdHJveWVkKCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQHJldHVybnNcbiAgICAqIFRoZSBkYXRhIHRoYXQgd2FzIHBhc3NlZCBpbnRvIHRoZSBgYnJhbmNoT3B0aW9uc2AnIGBtZXRhYCBwcm9wZXJ0eVxuICAgICogYXQgY29uc3RydWN0aW9uLlxuICAgICovXG4gICBwdWJsaWMgbWV0YSgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgIHJldHVybiB0aGlzLmJyYW5jaE9wdGlvbnMubWV0YSA/PyB7fTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBAcmV0dXJuc1xuICAgICogVGhpcyBicmFuY2gncyBwYXJlbnQgbm9kZSAod2hpY2ggbWF5IGJlIGEgVHJlZUJyYW5jaCBvciBUcmVlUm9vdCkuXG4gICAgKiBJZiB0aGlzIGJyYW5jaCBoYXMgbm8gcGFyZW50LCAoZWcsIGlmIHRoaXMgYnJhbmNoIGhhcyBiZWVuIHBydW5lZCkgdGhpc1xuICAgICogbWV0aG9kIHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICAqL1xuICAgcHVibGljIHBhcmVudCgpOlxuICAgICAgfCBUcmVlTm9kZTxUcmVlQnJhbmNoPFVzZXJsYW5kQ29tcG9uZW50PiwgTm9kZUNvbXBvbmVudD5cbiAgICAgIHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQ7XG4gICB9XG5cbiAgIC8qKlxuICAgICogUHJvdmlkZXMgYSBtb2RlbCBkZXNjcmliaW5nIHRoaXMgYnJhbmNoJ3MgZGVzY2VuZGFudHMuXG4gICAgKlxuICAgICogQHJldHVybnNcbiAgICAqIEEgbXVsdGktZGltZW5zaW9uYWwgTWFwIHdoaWNoIGRlc2NyaWJlcyB0aGUgc2hhcGUgb2YgdGhpcyBicmFuY2gnc1xuICAgICogZGVzY2VuZGFudHMuXG4gICAgKlxuICAgICogQGV4YW1wbGVcbiAgICAqIEEgYnJhbmNoIHdpdGggbm8gY2hpbGRyZW4gd2lsbCByZXR1cm4gYW4gZW1wdHkgTWFwLiBBIGJyYW5jaCB3aXRoXG4gICAgKiBhIHNpbmdsZSBjaGlsZCB3aWxsIHJldHVybiBhIE1hcCB3aXRoIGEgc2luZ2xlIGVudHJ5LCB3aGVyZSB0aGUga2V5IGlzIHRoZSBpbmRleFxuICAgICogb2YgdGhlIGJyYW5jaCAoemVybykgYW5kIHRoZSB2YWx1ZSBpcyBhbiBlbXB0eSBNYXAuIEEgVHJlZSBsaWtlIHRoaXM6XG4gICAgKlxuICAgICogYGBgXG4gICAgKiAgICAgICAgIC0tLUJyYW5jaC0tLS0tLS1CcmFuY2hcbiAgICAqICAgICAgICAvXG4gICAgKiBCcmFuY2gtLS0tLS0tQnJhbmNoXG4gICAgKiAgICAgICAgXFxcbiAgICAqICAgICAgICAgLS0tQnJhbmNoXG4gICAgKiBgYGBcbiAgICAqIFdpbGwgcmV0dXJuIGEgTWFwIG9mIG1hdGNoaW5nIHNoYXBlOlxuICAgICogYGBgXG4gICAgKiBNYXAge1xuICAgICogICAgMDogTWFwIHsgMDogTWFwIHt9fSxcbiAgICAqICAgIDE6IE1hcCB7fSxcbiAgICAqICAgIDI6IE1hcCB7fVxuICAgICogfVxuICAgICogYGBgXG4gICAgKi9cbiAgIHB1YmxpYyBwbG90KCk6IFRyZWVQbG90IHtcbiAgICAgIHJldHVybiB0aGlzLnRyZWVOb2RlQmFzZS5wbG90KCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQ2FsY3VsYXRlcyB0aGUgYnJhbmNoJ3MgcG9zaXRpb24gaW4gdGhlIHRyZWUgcmVsYXRpdmUgdG8gdGhlIFJvb3QuXG4gICAgKlxuICAgICogQHJlbWFya3NcbiAgICAqIFRoZSBwb3NpdGlvbiBpcyBkZXNjcmliZWQgYXMgYW4gYXJyYXkgb2YgbnVtYmVycywgd2hlcmUgZWFjaCBudW1iZXJcbiAgICAqIHJlcHJlc2VudHMgdGhlIGluZGV4IG9mIHRoZSBicmFuY2ggYXQgdGhhdCBsZXZlbCBvZiB0aGUgdHJlZS5cbiAgICAqXG4gICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhpcyBicmFuY2ggaXMgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBSb290LCB0aGlzIG1ldGhvZFxuICAgICogd2lsbCByZXR1cm4gWzBdLiBJZiB0aGlzIGJyYW5jaCBpcyB0aGUgc2Vjb25kIGNoaWxkIG9mIHRoZSBmaXJzdCBjaGlsZFxuICAgICogb2YgdGhlIFJvb3QsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIFswLCAxXS5cbiAgICAqXG4gICAgKiBJZiB0aGUgYnJhbmNoIGlzIG5vdCByZWxhdGVkIHRvIGEgVHJlZVJvb3QsIChzdWNoIGFzIHdoZW4gaXQgaGFzIGJlZW5cbiAgICAqIHBydW5lZCwpIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAgKlxuICAgICogQHJldHVybnNcbiAgICAqIEFuIGFycmF5IG9mIG51bWJlcnMgd2hpY2ggZGVzY3JpYmUgdGhlIGJyYW5jaCdzIHBvc2l0aW9uIGluIHRoZSB0cmVlXG4gICAgKiByZWxhdGl2ZSB0byB0aGUgUm9vdC5cbiAgICAqL1xuICAgcHVibGljIHBvc2l0aW9uKCk6IEFycmF5PG51bWJlcj4ge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4KCk7XG4gICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcbiAgICAgICAgICAgIFwiYnJhbmNoIGhhcyBubyBwYXJlbnQuIFBvc2l0aW9uIGNhbm5vdCBiZSBkZXRlcm1pbmVkLlwiXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIFRyZWVCcmFuY2gpIHtcbiAgICAgICAgIGNvbnN0IHBhcmVudFBvc2l0aW9uID0gdGhpcy5fcGFyZW50LnBvc2l0aW9uKCk7XG4gICAgICAgICByZXR1cm4gWy4uLnBhcmVudFBvc2l0aW9uLCBpbmRleF07XG4gICAgICB9XG4gICAgICByZXR1cm4gW2luZGV4XTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBSZW1vdmVzIGEgYnJhbmNoIGZyb20gaXRzIHRyZWUgd2l0aG91dCBkZXN0cm95aW5nIGl0LlxuICAgICpcbiAgICAqIEByZW1hcmtzXG4gICAgKiBSZW1vdmVzIHRoaXMgYnJhbmNoIGZyb20gaXRzIHBhcmVudCBhbmQgZGV0YWNoZXMgaXRzIGFzc29jaWF0ZWRcbiAgICAqIEJyYW5jaENvbXBvbmVudCBmcm9tIHRoZSBET00uIFRoaXMgcHV0cyB0aGUgYnJhbmNoIGluIGEgXCJwcnVuZWRcIiBzdGF0ZSxcbiAgICAqIHdoaWNoIG1heSBhZmZlY3QgdGhlIGJlaGF2aW9yIG9mIG90aGVyIG1ldGhvZHMuXG4gICAgKlxuICAgICogQSBwcnVuZWQgYnJhbmNoIGNhbiBiZSByZWF0dGFjaGVkIHRvIGFueSBvdGhlciBub2RlIHVzaW5nIHRoZSBgZ3JhZnRUb2AgbWV0aG9kLlxuICAgICpcbiAgICAqIEByZXR1cm5zXG4gICAgKiBJdHNlbGYsIG9yIHVuZGVmaW5lZCBpZiBpdCBpcyBhbHJlYWR5IGluIGEgcHJ1bmVkIHN0YXRlLlxuICAgICovXG4gICBwdWJsaWMgcHJ1bmUoKTogdGhpcyB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFwiQ2Fubm90IHBydW5lIGEgZGVzdHJveWVkIHRyZWUgYnJhbmNoXCIpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5fcGFyZW50O1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4KCk7XG4gICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCB8fCBwYXJlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgY29uc3QgY29udGFpbmVyID0gcGFyZW50LmdldEJyYW5jaGVzQ29udGFpbmVyKCk7XG4gICAgICBhc3NlcnQoY29udGFpbmVyICE9PSB1bmRlZmluZWQpO1xuICAgICAgdGhpcy5kZXRhY2hlZFZpZXcgPSBjb250YWluZXIuZGV0YWNoKGluZGV4KTtcbiAgICAgIGFzc2VydCh0aGlzLmRldGFjaGVkVmlldyAhPT0gbnVsbCk7XG4gICAgICB0aGlzLmRldGFjaGVkVmlldy5kZXRhY2goKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2goXG4gICAgICAgICBuZXcgUHJ1bmVFdmVudCh0aGlzLCB7XG4gICAgICAgICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgICAgIGNoaWxkOiB0aGlzLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuX3BhcmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEdldCB0aGUgcm9vdCBvZiB0aGUgdHJlZSB0byB3aGljaCB0aGlzIEJyYW5jaCBpcyBhdHRhY2hlZC5cbiAgICAqXG4gICAgKiBAcmV0dXJuc1xuICAgICogVGhlIFRyZWVSb290IG9mIHRoZSB0cmVlIHRoaXMgYnJhbmNoIGlzIGluLiBJZiB0aGlzIGJyYW5jaCBpc1xuICAgICogZG9lcyBub3QgaGF2ZSBhIHJvb3QgKHN1Y2ggYXMgd2hlbiBpdCBoYXMgYmVlbiBwcnVuZWQpIHRoaXMgbWV0aG9kIHdpbGxcbiAgICAqIHJldHVybiB1bmRlZmluZWQuXG4gICAgKi9cbiAgIHB1YmxpYyByb290KCk6IFRyZWVSb290PFVzZXJsYW5kQ29tcG9uZW50PiB8IHVuZGVmaW5lZCB7XG4gICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudCgpO1xuICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRyZWVCcmFuY2gpIHtcbiAgICAgICAgIHJldHVybiBwYXJlbnQucm9vdCgpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KHBhcmVudCBpbnN0YW5jZW9mIFRyZWVSb290IHx8IHBhcmVudCA9PT0gdW5kZWZpbmVkKTtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICB9XG5cbiAgIC8qKlxuICAgICogVHJhdmVyc2VzIHRoaXMgYnJhbmNoJ3MgZGVzY2VuZGFudHMgaW4gZGVwdGgtZmlyc3QgcHJlLW9yZGVyLCBleGVjdXRpbmdcbiAgICAqIHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBvbiBlYWNoIG5vZGUuIFRyYXZlcnNhbCBpbmNsdWRlcyB0aGlzIGJyYW5jaC5cbiAgICAqXG4gICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gZWFjaCBub2RlLlxuICAgICovXG4gICBwdWJsaWMgdHJhdmVyc2UoXG4gICAgICBjYWxsYmFjazogKFxuICAgICAgICAgbm9kZTogVHJlZU5vZGU8VHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4sIE5vZGVDb21wb25lbnQ+XG4gICAgICApID0+IHZvaWRcbiAgICk6IHZvaWQge1xuICAgICAgY2FsbGJhY2sodGhpcyk7XG4gICAgICB0aGlzLnRyZWVOb2RlQmFzZS50cmF2ZXJzZShjYWxsYmFjayk7XG4gICB9XG5cbiAgIHByaXZhdGUgY2hlY2tHcmFmdExvY2F0aW9uVmFsaWRpdHkoXG4gICAgICBuZXdQYXJlbnQ6IFRyZWVOb2RlPFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+LCBOb2RlQ29tcG9uZW50PixcbiAgICAgIGluZGV4PzogbnVtYmVyXG4gICApOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKCkpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXCJDYW5ub3QgZ3JhZnQgYSBkZXN0cm95ZWQgdHJlZSBicmFuY2hcIik7XG4gICAgICB9XG4gICAgICBpZiAobmV3UGFyZW50LmlzRGVzdHJveWVkKCkpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXCJDYW5ub3QgZ3JhZnQgdG8gYSBkZXN0cm95ZWQgdHJlZSBicmFuY2hcIik7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgICB0eXBlb2YgaW5kZXggPT09IFwibnVtYmVyXCIgJiZcbiAgICAgICAgIHRoaXMuaW5kZXhJc091dE9mUmFuZ2UobmV3UGFyZW50LCBpbmRleClcbiAgICAgICkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgZ3JhZnQgYnJhbmNoIGF0IGluZGV4ICR7aW5kZXh9IG9mIHRoZSBwYXJlbnQuIE91dCBvZiByYW5nZS5gXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy50cmF2ZXJzZSgobm9kZSkgPT4ge1xuICAgICAgICAgaWYgKG5vZGUgPT09IG5ld1BhcmVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcbiAgICAgICAgICAgICAgIFwiQ2Fubm90IGdyYWZ0IGEgYnJhbmNoIHRvIGl0c2VsZiBvciBhbnkgb2YgaXRzIG93biBkZXNjZW5kYW50c1wiXG4gICAgICAgICAgICApO1xuICAgICAgICAgfVxuICAgICAgfSk7XG4gICB9XG5cbiAgIHByaXZhdGUgaW5kZXhJc091dE9mUmFuZ2UoXG4gICAgICBwYXJlbnQ6IFRyZWVOb2RlPFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+LCBOb2RlQ29tcG9uZW50PixcbiAgICAgIGluZGV4OiBudW1iZXJcbiAgICk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGluZGV4IDwgMCB8fCBpbmRleCA+IHBhcmVudC5icmFuY2hlcygpLmxlbmd0aDtcbiAgIH1cblxuICAgcHJpdmF0ZSByZWF0dGFjaFZpZXcoaW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIGFzc2VydCh0aGlzLl9wYXJlbnQgIT09IHVuZGVmaW5lZCk7XG4gICAgICBhc3NlcnQodGhpcy5kZXRhY2hlZFZpZXcgIT09IG51bGwpO1xuICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fcGFyZW50LmdldEJyYW5jaGVzQ29udGFpbmVyKCk7XG4gICAgICBhc3NlcnQoY29udGFpbmVyICE9PSB1bmRlZmluZWQpO1xuICAgICAgdGhpcy5kZXRhY2hlZFZpZXcucmVhdHRhY2goKTtcbiAgICAgIGNvbnRhaW5lci5pbnNlcnQodGhpcy5kZXRhY2hlZFZpZXcsIGluZGV4KTtcbiAgICAgIHRoaXMuZGV0YWNoZWRWaWV3ID0gbnVsbDtcbiAgIH1cblxuICAgcHJpdmF0ZSBzZXRJbmRlbnRhdGlvbihcbiAgICAgIHBhcmVudDogVHJlZU5vZGU8VHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4sIE5vZGVDb21wb25lbnQ+XG4gICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IHJvb3QgPSBwYXJlbnQucm9vdCgpO1xuICAgICAgYXNzZXJ0KHJvb3QgIT09IHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCBvcHRpb25zID0gY29uZmlnLmdldENvbmZpZyhyb290KTtcbiAgICAgIGNvbnN0IGJyYW5jaGVzQ29udGFpbmVyRWwgPSB0aGlzLmJyYW5jaENvbnRyb2xsZXJcbiAgICAgICAgIC5nZXROYXRpdmVFbGVtZW50KClcbiAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiYnJhbmNoZXMtY29udGFpbmVyXCIpXG4gICAgICAgICAuaXRlbSgwKTtcbiAgICAgIGFzc2VydChicmFuY2hlc0NvbnRhaW5lckVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpO1xuICAgICAgYnJhbmNoZXNDb250YWluZXJFbC5zdHlsZS5tYXJnaW5MZWZ0ID0gYCR7b3B0aW9ucz8uaW5kZW50YXRpb24gPz8gMTZ9cHhgO1xuICAgfVxufVxuIl19
|