@ali-hm/angular-tree-component 18.0.5 → 19.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/README.md +2 -1
  2. package/fesm2022/ali-hm-angular-tree-component.mjs +80 -71
  3. package/fesm2022/ali-hm-angular-tree-component.mjs.map +1 -1
  4. package/package.json +4 -6
  5. package/esm2022/ali-hm-angular-tree-component.mjs +0 -5
  6. package/esm2022/lib/angular-tree-component.module.mjs +0 -100
  7. package/esm2022/lib/components/loading.component.mjs +0 -32
  8. package/esm2022/lib/components/tree-node-checkbox.component.mjs +0 -34
  9. package/esm2022/lib/components/tree-node-collection.component.mjs +0 -284
  10. package/esm2022/lib/components/tree-node-content.component.mjs +0 -32
  11. package/esm2022/lib/components/tree-node-drop-slot.component.mjs +0 -39
  12. package/esm2022/lib/components/tree-node-expander.component.mjs +0 -43
  13. package/esm2022/lib/components/tree-node-wrapper.component.mjs +0 -81
  14. package/esm2022/lib/components/tree-viewport.component.mjs +0 -66
  15. package/esm2022/lib/components/tree.component.mjs +0 -186
  16. package/esm2022/lib/constants/events.mjs +0 -20
  17. package/esm2022/lib/constants/keys.mjs +0 -10
  18. package/esm2022/lib/defs/api.mjs +0 -2
  19. package/esm2022/lib/directives/tree-animate-open.directive.mjs +0 -101
  20. package/esm2022/lib/directives/tree-drag.directive.mjs +0 -65
  21. package/esm2022/lib/directives/tree-drop.directive.mjs +0 -127
  22. package/esm2022/lib/mobx-angular/mobx-proxy.mjs +0 -17
  23. package/esm2022/lib/mobx-angular/tree-mobx-autorun.directive.mjs +0 -40
  24. package/esm2022/lib/models/tree-dragged-element.model.mjs +0 -25
  25. package/esm2022/lib/models/tree-node.model.mjs +0 -390
  26. package/esm2022/lib/models/tree-options.model.mjs +0 -150
  27. package/esm2022/lib/models/tree-virtual-scroll.model.mjs +0 -197
  28. package/esm2022/lib/models/tree.model.mjs +0 -546
  29. package/esm2022/public-api.mjs +0 -5
@@ -1,390 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- import { observable, computed, reaction, action } from 'mobx';
8
- import { TREE_EVENTS } from '../constants/events';
9
- export class TreeNode {
10
- get isHidden() { return this.treeModel.isHidden(this); }
11
- ;
12
- get isExpanded() { return this.treeModel.isExpanded(this); }
13
- ;
14
- get isActive() { return this.treeModel.isActive(this); }
15
- ;
16
- get isFocused() { return this.treeModel.isNodeFocused(this); }
17
- ;
18
- get isSelected() {
19
- if (this.isSelectable()) {
20
- return this.treeModel.isSelected(this);
21
- }
22
- else {
23
- return this.children.some((node) => node.isSelected);
24
- }
25
- }
26
- ;
27
- get isAllSelected() {
28
- if (this.isSelectable()) {
29
- return this.treeModel.isSelected(this);
30
- }
31
- else {
32
- return this.children.every((node) => node.isAllSelected);
33
- }
34
- }
35
- ;
36
- get isPartiallySelected() {
37
- return this.isSelected && !this.isAllSelected;
38
- }
39
- get level() {
40
- return this.parent ? this.parent.level + 1 : 0;
41
- }
42
- get path() {
43
- return this.parent ? [...this.parent.path, this.id] : [];
44
- }
45
- get elementRef() {
46
- throw `Element Ref is no longer supported since introducing virtual scroll\n
47
- You may use a template to obtain a reference to the element`;
48
- }
49
- get originalNode() { return this._originalNode; }
50
- ;
51
- constructor(data, parent, treeModel, index) {
52
- this.data = data;
53
- this.parent = parent;
54
- this.treeModel = treeModel;
55
- this.position = 0;
56
- this.allowDrop = (element, $event) => {
57
- return this.options.allowDrop(element, { parent: this, index: 0 }, $event);
58
- };
59
- this.allowDragoverStyling = () => {
60
- return this.options.allowDragoverStyling;
61
- };
62
- if (this.id === undefined || this.id === null) {
63
- this.id = uuid();
64
- } // Make sure there's a unique id without overriding existing ids to work with immutable data structures
65
- this.index = index;
66
- if (this.getField('children')) {
67
- this._initChildren();
68
- }
69
- this.autoLoadChildren();
70
- }
71
- // helper get functions:
72
- get hasChildren() {
73
- return !!(this.getField('hasChildren') || (this.children && this.children.length > 0));
74
- }
75
- get isCollapsed() { return !this.isExpanded; }
76
- get isLeaf() { return !this.hasChildren; }
77
- get isRoot() { return this.parent.data.virtual; }
78
- get realParent() { return this.isRoot ? null : this.parent; }
79
- // proxy functions:
80
- get options() { return this.treeModel.options; }
81
- fireEvent(event) { this.treeModel.fireEvent(event); }
82
- // field accessors:
83
- get displayField() {
84
- return this.getField('display');
85
- }
86
- get id() {
87
- return this.getField('id');
88
- }
89
- set id(value) {
90
- this.setField('id', value);
91
- }
92
- getField(key) {
93
- return this.data[this.options[`${key}Field`]];
94
- }
95
- setField(key, value) {
96
- this.data[this.options[`${key}Field`]] = value;
97
- }
98
- // traversing:
99
- _findAdjacentSibling(steps, skipHidden = false) {
100
- const siblings = this._getParentsChildren(skipHidden);
101
- const index = siblings.indexOf(this);
102
- return siblings.length > index + steps ? siblings[index + steps] : null;
103
- }
104
- findNextSibling(skipHidden = false) {
105
- return this._findAdjacentSibling(+1, skipHidden);
106
- }
107
- findPreviousSibling(skipHidden = false) {
108
- return this._findAdjacentSibling(-1, skipHidden);
109
- }
110
- getVisibleChildren() {
111
- return this.visibleChildren;
112
- }
113
- get visibleChildren() {
114
- return (this.children || []).filter((node) => !node.isHidden);
115
- }
116
- getFirstChild(skipHidden = false) {
117
- let children = skipHidden ? this.visibleChildren : this.children;
118
- return children != null && children.length ? children[0] : null;
119
- }
120
- getLastChild(skipHidden = false) {
121
- let children = skipHidden ? this.visibleChildren : this.children;
122
- return children != null && children.length ? children[children.length - 1] : null;
123
- }
124
- findNextNode(goInside = true, skipHidden = false) {
125
- return goInside && this.isExpanded && this.getFirstChild(skipHidden) ||
126
- this.findNextSibling(skipHidden) ||
127
- this.parent && this.parent.findNextNode(false, skipHidden);
128
- }
129
- findPreviousNode(skipHidden = false) {
130
- let previousSibling = this.findPreviousSibling(skipHidden);
131
- if (!previousSibling) {
132
- return this.realParent;
133
- }
134
- return previousSibling._getLastOpenDescendant(skipHidden);
135
- }
136
- _getLastOpenDescendant(skipHidden = false) {
137
- const lastChild = this.getLastChild(skipHidden);
138
- return (this.isCollapsed || !lastChild)
139
- ? this
140
- : lastChild._getLastOpenDescendant(skipHidden);
141
- }
142
- _getParentsChildren(skipHidden = false) {
143
- const children = this.parent &&
144
- (skipHidden ? this.parent.getVisibleChildren() : this.parent.children);
145
- return children || [];
146
- }
147
- getIndexInParent(skipHidden = false) {
148
- return this._getParentsChildren(skipHidden).indexOf(this);
149
- }
150
- isDescendantOf(node) {
151
- if (this === node)
152
- return true;
153
- else
154
- return this.parent && this.parent.isDescendantOf(node);
155
- }
156
- getNodePadding() {
157
- return this.options.levelPadding * (this.level - 1) + 'px';
158
- }
159
- getClass() {
160
- return [this.options.nodeClass(this), `tree-node-level-${this.level}`].join(' ');
161
- }
162
- onDrop($event) {
163
- this.mouseAction('drop', $event.event, {
164
- from: $event.element,
165
- to: { parent: this, index: 0, dropOnNode: true }
166
- });
167
- }
168
- allowDrag() {
169
- return this.options.allowDrag(this);
170
- }
171
- // helper methods:
172
- loadNodeChildren() {
173
- if (!this.options.getChildren) {
174
- return Promise.resolve(); // Not getChildren method - for using redux
175
- }
176
- return Promise.resolve(this.options.getChildren(this))
177
- .then((children) => {
178
- if (children) {
179
- this.setField('children', children);
180
- this._initChildren();
181
- if (this.options.useTriState && this.treeModel.isSelected(this)) {
182
- this.setIsSelected(true);
183
- }
184
- this.children.forEach((child) => {
185
- if (child.getField('isExpanded') && child.hasChildren) {
186
- child.expand();
187
- }
188
- });
189
- }
190
- }).then(() => {
191
- this.fireEvent({
192
- eventName: TREE_EVENTS.loadNodeChildren,
193
- node: this
194
- });
195
- });
196
- }
197
- expand() {
198
- if (!this.isExpanded) {
199
- this.toggleExpanded();
200
- }
201
- return this;
202
- }
203
- collapse() {
204
- if (this.isExpanded) {
205
- this.toggleExpanded();
206
- }
207
- return this;
208
- }
209
- doForAll(fn) {
210
- Promise.resolve(fn(this)).then(() => {
211
- if (this.children) {
212
- this.children.forEach((child) => child.doForAll(fn));
213
- }
214
- });
215
- }
216
- expandAll() {
217
- this.doForAll((node) => node.expand());
218
- }
219
- collapseAll() {
220
- this.doForAll((node) => node.collapse());
221
- }
222
- ensureVisible() {
223
- if (this.realParent) {
224
- this.realParent.expand();
225
- this.realParent.ensureVisible();
226
- }
227
- return this;
228
- }
229
- toggleExpanded() {
230
- this.setIsExpanded(!this.isExpanded);
231
- return this;
232
- }
233
- setIsExpanded(value) {
234
- if (this.hasChildren) {
235
- this.treeModel.setExpandedNode(this, value);
236
- }
237
- return this;
238
- }
239
- ;
240
- autoLoadChildren() {
241
- this.handler =
242
- reaction(() => this.isExpanded, (isExpanded) => {
243
- if (!this.children && this.hasChildren && isExpanded) {
244
- this.loadNodeChildren();
245
- }
246
- }, { fireImmediately: true });
247
- }
248
- dispose() {
249
- if (this.children) {
250
- this.children.forEach((child) => child.dispose());
251
- }
252
- if (this.handler) {
253
- this.handler();
254
- }
255
- this.parent = null;
256
- this.children = null;
257
- }
258
- setIsActive(value, multi = false) {
259
- this.treeModel.setActiveNode(this, value, multi);
260
- if (value) {
261
- this.focus(this.options.scrollOnActivate);
262
- }
263
- return this;
264
- }
265
- isSelectable() {
266
- return this.isLeaf || !this.children || !this.options.useTriState;
267
- }
268
- setIsSelected(value) {
269
- if (this.isSelectable()) {
270
- this.treeModel.setSelectedNode(this, value);
271
- }
272
- else {
273
- this.visibleChildren.forEach((child) => child.setIsSelected(value));
274
- }
275
- return this;
276
- }
277
- toggleSelected() {
278
- this.setIsSelected(!this.isSelected);
279
- return this;
280
- }
281
- toggleActivated(multi = false) {
282
- this.setIsActive(!this.isActive, multi);
283
- return this;
284
- }
285
- setActiveAndVisible(multi = false) {
286
- this.setIsActive(true, multi)
287
- .ensureVisible();
288
- setTimeout(this.scrollIntoView.bind(this));
289
- return this;
290
- }
291
- scrollIntoView(force = false) {
292
- this.treeModel.virtualScroll.scrollIntoView(this, force);
293
- }
294
- focus(scroll = true) {
295
- let previousNode = this.treeModel.getFocusedNode();
296
- this.treeModel.setFocusedNode(this);
297
- if (scroll) {
298
- this.scrollIntoView();
299
- }
300
- if (previousNode) {
301
- this.fireEvent({ eventName: TREE_EVENTS.blur, node: previousNode });
302
- }
303
- this.fireEvent({ eventName: TREE_EVENTS.focus, node: this });
304
- return this;
305
- }
306
- blur() {
307
- let previousNode = this.treeModel.getFocusedNode();
308
- this.treeModel.setFocusedNode(null);
309
- if (previousNode) {
310
- this.fireEvent({ eventName: TREE_EVENTS.blur, node: this });
311
- }
312
- return this;
313
- }
314
- setIsHidden(value) {
315
- this.treeModel.setIsHidden(this, value);
316
- }
317
- hide() {
318
- this.setIsHidden(true);
319
- }
320
- show() {
321
- this.setIsHidden(false);
322
- }
323
- mouseAction(actionName, $event, data = null) {
324
- this.treeModel.setFocus(true);
325
- const actionMapping = this.options.actionMapping.mouse;
326
- const mouseAction = actionMapping[actionName];
327
- if (mouseAction) {
328
- mouseAction(this.treeModel, this, $event, data);
329
- }
330
- }
331
- getSelfHeight() {
332
- return this.options.nodeHeight(this);
333
- }
334
- _initChildren() {
335
- this.children = this.getField('children')
336
- .map((c, index) => new TreeNode(c, this, this.treeModel, index));
337
- }
338
- }
339
- __decorate([
340
- computed
341
- ], TreeNode.prototype, "isHidden", null);
342
- __decorate([
343
- computed
344
- ], TreeNode.prototype, "isExpanded", null);
345
- __decorate([
346
- computed
347
- ], TreeNode.prototype, "isActive", null);
348
- __decorate([
349
- computed
350
- ], TreeNode.prototype, "isFocused", null);
351
- __decorate([
352
- computed
353
- ], TreeNode.prototype, "isSelected", null);
354
- __decorate([
355
- computed
356
- ], TreeNode.prototype, "isAllSelected", null);
357
- __decorate([
358
- computed
359
- ], TreeNode.prototype, "isPartiallySelected", null);
360
- __decorate([
361
- observable
362
- ], TreeNode.prototype, "children", void 0);
363
- __decorate([
364
- observable
365
- ], TreeNode.prototype, "index", void 0);
366
- __decorate([
367
- observable
368
- ], TreeNode.prototype, "position", void 0);
369
- __decorate([
370
- observable
371
- ], TreeNode.prototype, "height", void 0);
372
- __decorate([
373
- computed
374
- ], TreeNode.prototype, "level", null);
375
- __decorate([
376
- computed
377
- ], TreeNode.prototype, "path", null);
378
- __decorate([
379
- computed
380
- ], TreeNode.prototype, "visibleChildren", null);
381
- __decorate([
382
- action
383
- ], TreeNode.prototype, "setIsSelected", null);
384
- __decorate([
385
- action
386
- ], TreeNode.prototype, "_initChildren", null);
387
- function uuid() {
388
- return Math.floor(Math.random() * 10000000000000);
389
- }
390
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1ub2RlLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10cmVlLWNvbXBvbmVudC9zcmMvbGliL21vZGVscy90cmVlLW5vZGUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFXLE1BQU0sRUFBcUIsTUFBTSxNQUFNLENBQUM7QUFJMUYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxELE1BQU0sT0FBTyxRQUFRO0lBRVQsSUFBSSxRQUFRLEtBQUssT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFBQSxDQUFDO0lBQ3pELElBQUksVUFBVSxLQUFLLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQUEsQ0FBQztJQUM3RCxJQUFJLFFBQVEsS0FBSyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUFBLENBQUM7SUFDekQsSUFBSSxTQUFTLEtBQUssT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFBQSxDQUFDO0lBQy9ELElBQUksVUFBVTtRQUN0QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENB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QUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7Q0FDRjtBQTVZVztJQUFULFFBQVE7d0NBQXlEO0FBQ3hEO0lBQVQsUUFBUTswQ0FBNkQ7QUFDNUQ7SUFBVCxRQUFRO3dDQUF5RDtBQUN4RDtJQUFULFFBQVE7eUNBQStEO0FBQzlEO0lBQVQsUUFBUTswQ0FNUjtBQUNTO0lBQVQsUUFBUTs2Q0FNUjtBQUNTO0lBQVQsUUFBUTttREFFUjtBQUVXO0lBQVgsVUFBVTswQ0FBc0I7QUFDckI7SUFBWCxVQUFVO3VDQUFlO0FBQ2Q7SUFBWCxVQUFVOzBDQUFjO0FBQ2I7SUFBWCxVQUFVO3dDQUFnQjtBQUNqQjtJQUFULFFBQVE7cUNBRVI7QUFDUztJQUFULFFBQVE7b0NBRVI7QUE0RVM7SUFBVCxRQUFROytDQUVSO0FBcU1PO0lBQVAsTUFBTTs2Q0FRTjtBQThFTztJQUFQLE1BQU07NkNBR047QUFHSCxTQUFTLElBQUk7SUFDWCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLGNBQWMsQ0FBQyxDQUFDO0FBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBvYnNlcnZhYmxlLCBjb21wdXRlZCwgcmVhY3Rpb24sIGF1dG9ydW4sIGFjdGlvbiwgSVJlYWN0aW9uRGlzcG9zZXIgfSBmcm9tICdtb2J4JztcclxuaW1wb3J0IHsgVHJlZU1vZGVsIH0gZnJvbSAnLi90cmVlLm1vZGVsJztcclxuaW1wb3J0IHsgVHJlZU9wdGlvbnMgfSBmcm9tICcuL3RyZWUtb3B0aW9ucy5tb2RlbCc7XHJcbmltcG9ydCB7IElUcmVlTm9kZSB9IGZyb20gJy4uL2RlZnMvYXBpJztcclxuaW1wb3J0IHsgVFJFRV9FVkVOVFMgfSBmcm9tICcuLi9jb25zdGFudHMvZXZlbnRzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBUcmVlTm9kZSBpbXBsZW1lbnRzIElUcmVlTm9kZSB7XHJcbiAgcHJpdmF0ZSBoYW5kbGVyOiBJUmVhY3Rpb25EaXNwb3NlcjtcclxuICBAY29tcHV0ZWQgZ2V0IGlzSGlkZGVuKCkgeyByZXR1cm4gdGhpcy50cmVlTW9kZWwuaXNIaWRkZW4odGhpcyk7IH07XHJcbiAgQGNvbXB1dGVkIGdldCBpc0V4cGFuZGVkKCkgeyByZXR1cm4gdGhpcy50cmVlTW9kZWwuaXNFeHBhbmRlZCh0aGlzKTsgfTtcclxuICBAY29tcHV0ZWQgZ2V0IGlzQWN0aXZlKCkgeyByZXR1cm4gdGhpcy50cmVlTW9kZWwuaXNBY3RpdmUodGhpcyk7IH07XHJcbiAgQGNvbXB1dGVkIGdldCBpc0ZvY3VzZWQoKSB7IHJldHVybiB0aGlzLnRyZWVNb2RlbC5pc05vZGVGb2N1c2VkKHRoaXMpOyB9O1xyXG4gIEBjb21wdXRlZCBnZXQgaXNTZWxlY3RlZCgpIHtcclxuICAgIGlmICh0aGlzLmlzU2VsZWN0YWJsZSgpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZU1vZGVsLmlzU2VsZWN0ZWQodGhpcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5zb21lKChub2RlOiBUcmVlTm9kZSkgPT4gbm9kZS5pc1NlbGVjdGVkKTtcclxuICAgIH1cclxuICB9O1xyXG4gIEBjb21wdXRlZCBnZXQgaXNBbGxTZWxlY3RlZCgpIHtcclxuICAgIGlmICh0aGlzLmlzU2VsZWN0YWJsZSgpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRyZWVNb2RlbC5pc1NlbGVjdGVkKHRoaXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uZXZlcnkoKG5vZGU6IFRyZWVOb2RlKSA9PiBub2RlLmlzQWxsU2VsZWN0ZWQpO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgQGNvbXB1dGVkIGdldCBpc1BhcnRpYWxseVNlbGVjdGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZCAmJiAhdGhpcy5pc0FsbFNlbGVjdGVkO1xyXG4gIH1cclxuXHJcbiAgQG9ic2VydmFibGUgY2hpbGRyZW46IFRyZWVOb2RlW107XHJcbiAgQG9ic2VydmFibGUgaW5kZXg6IG51bWJlcjtcclxuICBAb2JzZXJ2YWJsZSBwb3NpdGlvbiA9IDA7XHJcbiAgQG9ic2VydmFibGUgaGVpZ2h0OiBudW1iZXI7XHJcbiAgQGNvbXB1dGVkIGdldCBsZXZlbCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQubGV2ZWwgKyAxIDogMDtcclxuICB9XHJcbiAgQGNvbXB1dGVkIGdldCBwYXRoKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiB0aGlzLnBhcmVudCA/IFsuLi50aGlzLnBhcmVudC5wYXRoLCB0aGlzLmlkXSA6IFtdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGVsZW1lbnRSZWYoKTogYW55IHtcclxuICAgIHRocm93IGBFbGVtZW50IFJlZiBpcyBubyBsb25nZXIgc3VwcG9ydGVkIHNpbmNlIGludHJvZHVjaW5nIHZpcnR1YWwgc2Nyb2xsXFxuXHJcbiAgICAgIFlvdSBtYXkgdXNlIGEgdGVtcGxhdGUgdG8gb2J0YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29yaWdpbmFsTm9kZTogYW55O1xyXG4gIGdldCBvcmlnaW5hbE5vZGUoKSB7IHJldHVybiB0aGlzLl9vcmlnaW5hbE5vZGU7IH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBkYXRhOiBhbnksIHB1YmxpYyBwYXJlbnQ6IFRyZWVOb2RlLCBwdWJsaWMgdHJlZU1vZGVsOiBUcmVlTW9kZWwsIGluZGV4OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLmlkID09PSB1bmRlZmluZWQgfHwgdGhpcy5pZCA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmlkID0gdXVpZCgpO1xyXG4gICAgfSAvLyBNYWtlIHN1cmUgdGhlcmUncyBhIHVuaXF1ZSBpZCB3aXRob3V0IG92ZXJyaWRpbmcgZXhpc3RpbmcgaWRzIHRvIHdvcmsgd2l0aCBpbW11dGFibGUgZGF0YSBzdHJ1Y3R1cmVzXHJcbiAgICB0aGlzLmluZGV4ID0gaW5kZXg7XHJcblxyXG4gICAgaWYgKHRoaXMuZ2V0RmllbGQoJ2NoaWxkcmVuJykpIHtcclxuICAgICAgdGhpcy5faW5pdENoaWxkcmVuKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmF1dG9Mb2FkQ2hpbGRyZW4oKTtcclxuICB9XHJcblxyXG4gIC8vIGhlbHBlciBnZXQgZnVuY3Rpb25zOlxyXG4gIGdldCBoYXNDaGlsZHJlbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhISh0aGlzLmdldEZpZWxkKCdoYXNDaGlsZHJlbicpIHx8ICh0aGlzLmNoaWxkcmVuICYmIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkpO1xyXG4gIH1cclxuICBnZXQgaXNDb2xsYXBzZWQoKTogYm9vbGVhbiB7IHJldHVybiAhdGhpcy5pc0V4cGFuZGVkOyB9XHJcbiAgZ2V0IGlzTGVhZigpOiBib29sZWFuIHsgcmV0dXJuICF0aGlzLmhhc0NoaWxkcmVuOyB9XHJcbiAgZ2V0IGlzUm9vdCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucGFyZW50LmRhdGEudmlydHVhbDsgfVxyXG4gIGdldCByZWFsUGFyZW50KCk6IFRyZWVOb2RlIHsgcmV0dXJuIHRoaXMuaXNSb290ID8gbnVsbCA6IHRoaXMucGFyZW50OyB9XHJcblxyXG4gIC8vIHByb3h5IGZ1bmN0aW9uczpcclxuICBnZXQgb3B0aW9ucygpOiBUcmVlT3B0aW9ucyB7IHJldHVybiB0aGlzLnRyZWVNb2RlbC5vcHRpb25zOyB9XHJcbiAgZmlyZUV2ZW50KGV2ZW50KSB7IHRoaXMudHJlZU1vZGVsLmZpcmVFdmVudChldmVudCk7IH1cclxuXHJcbiAgLy8gZmllbGQgYWNjZXNzb3JzOlxyXG4gIGdldCBkaXNwbGF5RmllbGQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRGaWVsZCgnZGlzcGxheScpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RmllbGQoJ2lkJyk7XHJcbiAgfVxyXG5cclxuICBzZXQgaWQodmFsdWUpIHtcclxuICAgIHRoaXMuc2V0RmllbGQoJ2lkJywgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmllbGQoa2V5KSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhW3RoaXMub3B0aW9uc1tgJHtrZXl9RmllbGRgXV07XHJcbiAgfVxyXG5cclxuICBzZXRGaWVsZChrZXksIHZhbHVlKSB7XHJcbiAgICB0aGlzLmRhdGFbdGhpcy5vcHRpb25zW2Ake2tleX1GaWVsZGBdXSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8gdHJhdmVyc2luZzpcclxuICBfZmluZEFkamFjZW50U2libGluZyhzdGVwcywgc2tpcEhpZGRlbiA9IGZhbHNlKSB7XHJcbiAgICBjb25zdCBzaWJsaW5ncyA9IHRoaXMuX2dldFBhcmVudHNDaGlsZHJlbihza2lwSGlkZGVuKTtcclxuICAgIGNvbnN0IGluZGV4ID0gc2libGluZ3MuaW5kZXhPZih0aGlzKTtcclxuXHJcbiAgICByZXR1cm4gc2libGluZ3MubGVuZ3RoID4gaW5kZXggKyBzdGVwcyA/IHNpYmxpbmdzW2luZGV4ICsgc3RlcHNdIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGZpbmROZXh0U2libGluZyhza2lwSGlkZGVuID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLl9maW5kQWRqYWNlbnRTaWJsaW5nKCsxLCBza2lwSGlkZGVuKTtcclxuICB9XHJcblxyXG4gIGZpbmRQcmV2aW91c1NpYmxpbmcoc2tpcEhpZGRlbiA9IGZhbHNlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmluZEFkamFjZW50U2libGluZygtMSwgc2tpcEhpZGRlbik7XHJcbiAgfVxyXG5cclxuICBnZXRWaXNpYmxlQ2hpbGRyZW4oKSB7XHJcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlQ2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICBAY29tcHV0ZWQgZ2V0IHZpc2libGVDaGlsZHJlbigpIHtcclxuICAgIHJldHVybiAodGhpcy5jaGlsZHJlbiB8fCBbXSkuZmlsdGVyKChub2RlKSA9PiAhbm9kZS5pc0hpZGRlbik7XHJcbiAgfVxyXG5cclxuICBnZXRGaXJzdENoaWxkKHNraXBIaWRkZW4gPSBmYWxzZSkge1xyXG4gICAgbGV0IGNoaWxkcmVuID0gc2tpcEhpZGRlbiA/IHRoaXMudmlzaWJsZUNoaWxkcmVuIDogdGhpcy5jaGlsZHJlbjtcclxuXHJcbiAgICByZXR1cm4gY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggPyBjaGlsZHJlblswXSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXRMYXN0Q2hpbGQoc2tpcEhpZGRlbiA9IGZhbHNlKSB7XHJcbiAgICBsZXQgY2hpbGRyZW4gPSBza2lwSGlkZGVuID8gdGhpcy52aXNpYmxlQ2hpbGRyZW4gOiB0aGlzLmNoaWxkcmVuO1xyXG5cclxuICAgIHJldHVybiBjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA/IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGZpbmROZXh0Tm9kZShnb0luc2lkZSA9IHRydWUsIHNraXBIaWRkZW4gPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIGdvSW5zaWRlICYmIHRoaXMuaXNFeHBhbmRlZCAmJiB0aGlzLmdldEZpcnN0Q2hpbGQoc2tpcEhpZGRlbikgfHxcclxuICAgICAgICAgICB0aGlzLmZpbmROZXh0U2libGluZyhza2lwSGlkZGVuKSB8fFxyXG4gICAgICAgICAgIHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmZpbmROZXh0Tm9kZShmYWxzZSwgc2tpcEhpZGRlbik7XHJcbiAgfVxyXG5cclxuICBmaW5kUHJldmlvdXNOb2RlKHNraXBIaWRkZW4gPSBmYWxzZSkge1xyXG4gICAgbGV0IHByZXZpb3VzU2libGluZyA9IHRoaXMuZmluZFByZXZpb3VzU2libGluZyhza2lwSGlkZGVuKTtcclxuICAgIGlmICghcHJldmlvdXNTaWJsaW5nKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnJlYWxQYXJlbnQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJldmlvdXNTaWJsaW5nLl9nZXRMYXN0T3BlbkRlc2NlbmRhbnQoc2tpcEhpZGRlbik7XHJcbiAgfVxyXG5cclxuICBfZ2V0TGFzdE9wZW5EZXNjZW5kYW50KHNraXBIaWRkZW4gPSBmYWxzZSkge1xyXG4gICAgY29uc3QgbGFzdENoaWxkID0gdGhpcy5nZXRMYXN0Q2hpbGQoc2tpcEhpZGRlbik7XHJcbiAgICByZXR1cm4gKHRoaXMuaXNDb2xsYXBzZWQgfHwgIWxhc3RDaGlsZClcclxuICAgICAgPyB0aGlzXHJcbiAgICAgIDogbGFzdENoaWxkLl9nZXRMYXN0T3BlbkRlc2NlbmRhbnQoc2tpcEhpZGRlbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRQYXJlbnRzQ2hpbGRyZW4oc2tpcEhpZGRlbiA9IGZhbHNlKTogYW55W10ge1xyXG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLnBhcmVudCAmJlxyXG4gICAgICAoc2tpcEhpZGRlbiA/IHRoaXMucGFyZW50LmdldFZpc2libGVDaGlsZHJlbigpIDogdGhpcy5wYXJlbnQuY2hpbGRyZW4pO1xyXG5cclxuICAgIHJldHVybiBjaGlsZHJlbiB8fCBbXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SW5kZXhJblBhcmVudChza2lwSGlkZGVuID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLl9nZXRQYXJlbnRzQ2hpbGRyZW4oc2tpcEhpZGRlbikuaW5kZXhPZih0aGlzKTtcclxuICB9XHJcblxyXG4gIGlzRGVzY2VuZGFudE9mKG5vZGU6IFRyZWVOb2RlKSB7XHJcbiAgICBpZiAodGhpcyA9PT0gbm9kZSkgcmV0dXJuIHRydWU7XHJcbiAgICBlbHNlIHJldHVybiB0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5pc0Rlc2NlbmRhbnRPZihub2RlKTtcclxuICB9XHJcblxyXG4gIGdldE5vZGVQYWRkaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxldmVsUGFkZGluZyAqICh0aGlzLmxldmVsIC0gMSkgKyAncHgnO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2xhc3MoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBbdGhpcy5vcHRpb25zLm5vZGVDbGFzcyh0aGlzKSwgYHRyZWUtbm9kZS1sZXZlbC0keyB0aGlzLmxldmVsIH1gXS5qb2luKCcgJyk7XHJcbiAgfVxyXG5cclxuICBvbkRyb3AoJGV2ZW50KSB7XHJcbiAgICB0aGlzLm1vdXNlQWN0aW9uKCdkcm9wJywgJGV2ZW50LmV2ZW50LCB7XHJcbiAgICAgIGZyb206ICRldmVudC5lbGVtZW50LFxyXG4gICAgICB0bzogeyBwYXJlbnQ6IHRoaXMsIGluZGV4OiAwLCBkcm9wT25Ob2RlOiB0cnVlIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWxsb3dEcm9wID0gKGVsZW1lbnQsICRldmVudD8pID0+IHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYWxsb3dEcm9wKGVsZW1lbnQsIHsgcGFyZW50OiB0aGlzLCBpbmRleDogMCB9LCAkZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgYWxsb3dEcmFnb3ZlclN0eWxpbmcgPSAoKSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFsbG93RHJhZ292ZXJTdHlsaW5nO1xyXG4gIH1cclxuXHJcbiAgYWxsb3dEcmFnKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hbGxvd0RyYWcodGhpcyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gaGVscGVyIG1ldGhvZHM6XHJcbiAgbG9hZE5vZGVDaGlsZHJlbigpIHtcclxuICAgIGlmICghdGhpcy5vcHRpb25zLmdldENoaWxkcmVuKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsgLy8gTm90IGdldENoaWxkcmVuIG1ldGhvZCAtIGZvciB1c2luZyByZWR1eFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLm9wdGlvbnMuZ2V0Q2hpbGRyZW4odGhpcykpXHJcbiAgICAgIC50aGVuKChjaGlsZHJlbikgPT4ge1xyXG4gICAgICAgIGlmIChjaGlsZHJlbikge1xyXG4gICAgICAgICAgdGhpcy5zZXRGaWVsZCgnY2hpbGRyZW4nLCBjaGlsZHJlbik7XHJcbiAgICAgICAgICB0aGlzLl9pbml0Q2hpbGRyZW4oKTtcclxuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudXNlVHJpU3RhdGUgJiYgdGhpcy50cmVlTW9kZWwuaXNTZWxlY3RlZCh0aGlzKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldElzU2VsZWN0ZWQodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZC5nZXRGaWVsZCgnaXNFeHBhbmRlZCcpICYmIGNoaWxkLmhhc0NoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgY2hpbGQuZXhwYW5kKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9fSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5maXJlRXZlbnQoe1xyXG4gICAgICAgICAgZXZlbnROYW1lOiBUUkVFX0VWRU5UUy5sb2FkTm9kZUNoaWxkcmVuLFxyXG4gICAgICAgICAgbm9kZTogdGhpc1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGV4cGFuZCgpIHtcclxuICAgIGlmICghdGhpcy5pc0V4cGFuZGVkKSB7XHJcbiAgICAgIHRoaXMudG9nZ2xlRXhwYW5kZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIGNvbGxhcHNlKCkge1xyXG4gICAgaWYgKHRoaXMuaXNFeHBhbmRlZCkge1xyXG4gICAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBkb0ZvckFsbChmbjogKG5vZGU6IElUcmVlTm9kZSkgPT4gYW55KSB7XHJcbiAgICBQcm9taXNlLnJlc29sdmUoZm4odGhpcykpLnRoZW4oKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5jaGlsZHJlbikge1xyXG4gICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IGNoaWxkLmRvRm9yQWxsKGZuKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZXhwYW5kQWxsKCkge1xyXG4gICAgdGhpcy5kb0ZvckFsbCgobm9kZSkgPT4gbm9kZS5leHBhbmQoKSk7XHJcbiAgfVxyXG5cclxuICBjb2xsYXBzZUFsbCgpIHtcclxuICAgIHRoaXMuZG9Gb3JBbGwoKG5vZGUpID0+IG5vZGUuY29sbGFwc2UoKSk7XHJcbiAgfVxyXG5cclxuICBlbnN1cmVWaXNpYmxlKCkge1xyXG4gICAgaWYgKHRoaXMucmVhbFBhcmVudCkge1xyXG4gICAgICB0aGlzLnJlYWxQYXJlbnQuZXhwYW5kKCk7XHJcbiAgICAgIHRoaXMucmVhbFBhcmVudC5lbnN1cmVWaXNpYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVFeHBhbmRlZCgpIHtcclxuICAgIHRoaXMuc2V0SXNFeHBhbmRlZCghdGhpcy5pc0V4cGFuZGVkKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIHNldElzRXhwYW5kZWQodmFsdWUpIHtcclxuICAgIGlmICh0aGlzLmhhc0NoaWxkcmVuKSB7XHJcbiAgICAgIHRoaXMudHJlZU1vZGVsLnNldEV4cGFuZGVkTm9kZSh0aGlzLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfTtcclxuXHJcbiAgYXV0b0xvYWRDaGlsZHJlbigpIHtcclxuICAgIHRoaXMuaGFuZGxlciA9XHJcbiAgICAgIHJlYWN0aW9uKFxyXG4gICAgICAgICgpID0+IHRoaXMuaXNFeHBhbmRlZCxcclxuICAgICAgICAoaXNFeHBhbmRlZCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuICYmIHRoaXMuaGFzQ2hpbGRyZW4gJiYgaXNFeHBhbmRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWROb2RlQ2hpbGRyZW4oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHsgZmlyZUltbWVkaWF0ZWx5OiB0cnVlIH1cclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICBpZiAodGhpcy5jaGlsZHJlbikge1xyXG4gICAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiBjaGlsZC5kaXNwb3NlKCkpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaGFuZGxlcikge1xyXG4gICAgICB0aGlzLmhhbmRsZXIoKTtcclxuICAgIH1cclxuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcclxuICAgIHRoaXMuY2hpbGRyZW4gPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgc2V0SXNBY3RpdmUodmFsdWUsIG11bHRpID0gZmFsc2UpIHtcclxuICAgIHRoaXMudHJlZU1vZGVsLnNldEFjdGl2ZU5vZGUodGhpcywgdmFsdWUsIG11bHRpKTtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLmZvY3VzKHRoaXMub3B0aW9ucy5zY3JvbGxPbkFjdGl2YXRlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIGlzU2VsZWN0YWJsZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmlzTGVhZiB8fCAhdGhpcy5jaGlsZHJlbiB8fCAhdGhpcy5vcHRpb25zLnVzZVRyaVN0YXRlO1xyXG4gIH1cclxuXHJcbiAgQGFjdGlvbiBzZXRJc1NlbGVjdGVkKHZhbHVlKSB7XHJcbiAgICBpZiAodGhpcy5pc1NlbGVjdGFibGUoKSkge1xyXG4gICAgICB0aGlzLnRyZWVNb2RlbC5zZXRTZWxlY3RlZE5vZGUodGhpcywgdmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy52aXNpYmxlQ2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IGNoaWxkLnNldElzU2VsZWN0ZWQodmFsdWUpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlbGVjdGVkKCkge1xyXG4gICAgdGhpcy5zZXRJc1NlbGVjdGVkKCF0aGlzLmlzU2VsZWN0ZWQpO1xyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQWN0aXZhdGVkKG11bHRpID0gZmFsc2UpIHtcclxuICAgIHRoaXMuc2V0SXNBY3RpdmUoIXRoaXMuaXNBY3RpdmUsIG11bHRpKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIHNldEFjdGl2ZUFuZFZpc2libGUobXVsdGkgPSBmYWxzZSkge1xyXG4gICAgdGhpcy5zZXRJc0FjdGl2ZSh0cnVlLCBtdWx0aSlcclxuICAgICAgLmVuc3VyZVZpc2libGUoKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KHRoaXMuc2Nyb2xsSW50b1ZpZXcuYmluZCh0aGlzKSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBzY3JvbGxJbnRvVmlldyhmb3JjZSA9IGZhbHNlKSB7XHJcbiAgICB0aGlzLnRyZWVNb2RlbC52aXJ0dWFsU2Nyb2xsLnNjcm9sbEludG9WaWV3KHRoaXMsIGZvcmNlKTtcclxuICB9XHJcblxyXG4gIGZvY3VzKHNjcm9sbCA9IHRydWUpIHtcclxuICAgIGxldCBwcmV2aW91c05vZGUgPSB0aGlzLnRyZWVNb2RlbC5nZXRGb2N1c2VkTm9kZSgpO1xyXG4gICAgdGhpcy50cmVlTW9kZWwuc2V0Rm9jdXNlZE5vZGUodGhpcyk7XHJcbiAgICBpZiAoc2Nyb2xsKSB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsSW50b1ZpZXcoKTtcclxuICAgIH1cclxuICAgIGlmIChwcmV2aW91c05vZGUpIHtcclxuICAgICAgdGhpcy5maXJlRXZlbnQoeyBldmVudE5hbWU6IFRSRUVfRVZFTlRTLmJsdXIsIG5vZGU6IHByZXZpb3VzTm9kZSB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuZmlyZUV2ZW50KHsgZXZlbnROYW1lOiBUUkVFX0VWRU5UUy5mb2N1cywgbm9kZTogdGhpcyB9KTtcclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIGJsdXIoKSB7XHJcbiAgICBsZXQgcHJldmlvdXNOb2RlID0gdGhpcy50cmVlTW9kZWwuZ2V0Rm9jdXNlZE5vZGUoKTtcclxuICAgIHRoaXMudHJlZU1vZGVsLnNldEZvY3VzZWROb2RlKG51bGwpO1xyXG4gICAgaWYgKHByZXZpb3VzTm9kZSkge1xyXG4gICAgICB0aGlzLmZpcmVFdmVudCh7IGV2ZW50TmFtZTogVFJFRV9FVkVOVFMuYmx1ciwgbm9kZTogdGhpcyB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIHNldElzSGlkZGVuKHZhbHVlKSB7XHJcbiAgICB0aGlzLnRyZWVNb2RlbC5zZXRJc0hpZGRlbih0aGlzLCB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBoaWRlKCkge1xyXG4gICAgdGhpcy5zZXRJc0hpZGRlbih0cnVlKTtcclxuICB9XHJcblxyXG4gIHNob3coKSB7XHJcbiAgICB0aGlzLnNldElzSGlkZGVuKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIG1vdXNlQWN0aW9uKGFjdGlvbk5hbWU6IHN0cmluZywgJGV2ZW50LCBkYXRhOiBhbnkgPSBudWxsKSB7XHJcbiAgICB0aGlzLnRyZWVNb2RlbC5zZXRGb2N1cyh0cnVlKTtcclxuXHJcbiAgICBjb25zdCBhY3Rpb25NYXBwaW5nID0gdGhpcy5vcHRpb25zLmFjdGlvbk1hcHBpbmcubW91c2U7XHJcbiAgICBjb25zdCBtb3VzZUFjdGlvbiA9IGFjdGlvbk1hcHBpbmdbYWN0aW9uTmFtZV07XHJcblxyXG4gICAgaWYgKG1vdXNlQWN0aW9uKSB7XHJcbiAgICAgIG1vdXNlQWN0aW9uKHRoaXMudHJlZU1vZGVsLCB0aGlzLCAkZXZlbnQsIGRhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZkhlaWdodCgpIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubm9kZUhlaWdodCh0aGlzKTtcclxuICB9XHJcblxyXG4gIEBhY3Rpb24gX2luaXRDaGlsZHJlbigpIHtcclxuICAgIHRoaXMuY2hpbGRyZW4gPSB0aGlzLmdldEZpZWxkKCdjaGlsZHJlbicpXHJcbiAgICAgIC5tYXAoKGMsIGluZGV4KSA9PiBuZXcgVHJlZU5vZGUoYywgdGhpcywgdGhpcy50cmVlTW9kZWwsIGluZGV4KSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB1dWlkKCkge1xyXG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwMDAwMDAwMCk7XHJcbn1cclxuIl19
@@ -1,150 +0,0 @@
1
- import { KEYS } from '../constants/keys';
2
- export const TREE_ACTIONS = {
3
- TOGGLE_ACTIVE: (tree, node, $event) => node && node.toggleActivated(),
4
- TOGGLE_ACTIVE_MULTI: (tree, node, $event) => node && node.toggleActivated(true),
5
- TOGGLE_SELECTED: (tree, node, $event) => node && node.toggleSelected(),
6
- ACTIVATE: (tree, node, $event) => node.setIsActive(true),
7
- DEACTIVATE: (tree, node, $event) => node.setIsActive(false),
8
- SELECT: (tree, node, $event) => node.setIsSelected(true),
9
- DESELECT: (tree, node, $event) => node.setIsSelected(false),
10
- FOCUS: (tree, node, $event) => node.focus(),
11
- TOGGLE_EXPANDED: (tree, node, $event) => node.hasChildren && node.toggleExpanded(),
12
- EXPAND: (tree, node, $event) => node.expand(),
13
- COLLAPSE: (tree, node, $event) => node.collapse(),
14
- DRILL_DOWN: (tree, node, $event) => tree.focusDrillDown(),
15
- DRILL_UP: (tree, node, $event) => tree.focusDrillUp(),
16
- NEXT_NODE: (tree, node, $event) => tree.focusNextNode(),
17
- PREVIOUS_NODE: (tree, node, $event) => tree.focusPreviousNode(),
18
- MOVE_NODE: (tree, node, $event, { from, to }) => {
19
- // default action assumes from = node, to = {parent, index}
20
- if ($event.ctrlKey) {
21
- tree.copyNode(from, to);
22
- }
23
- else {
24
- tree.moveNode(from, to);
25
- }
26
- }
27
- };
28
- const defaultActionMapping = {
29
- mouse: {
30
- click: TREE_ACTIONS.TOGGLE_ACTIVE,
31
- dblClick: null,
32
- contextMenu: null,
33
- expanderClick: TREE_ACTIONS.TOGGLE_EXPANDED,
34
- checkboxClick: TREE_ACTIONS.TOGGLE_SELECTED,
35
- drop: TREE_ACTIONS.MOVE_NODE
36
- },
37
- keys: {
38
- [KEYS.RIGHT]: TREE_ACTIONS.DRILL_DOWN,
39
- [KEYS.LEFT]: TREE_ACTIONS.DRILL_UP,
40
- [KEYS.DOWN]: TREE_ACTIONS.NEXT_NODE,
41
- [KEYS.UP]: TREE_ACTIONS.PREVIOUS_NODE,
42
- [KEYS.SPACE]: TREE_ACTIONS.TOGGLE_ACTIVE,
43
- [KEYS.ENTER]: TREE_ACTIONS.TOGGLE_ACTIVE
44
- }
45
- };
46
- export class TreeOptions {
47
- get hasChildrenField() { return this.options.hasChildrenField || 'hasChildren'; }
48
- get childrenField() { return this.options.childrenField || 'children'; }
49
- get displayField() { return this.options.displayField || 'name'; }
50
- get idField() { return this.options.idField || 'id'; }
51
- get isExpandedField() { return this.options.isExpandedField || 'isExpanded'; }
52
- get getChildren() { return this.options.getChildren; }
53
- get levelPadding() { return this.options.levelPadding || 0; }
54
- get useVirtualScroll() { return this.options.useVirtualScroll; }
55
- get animateExpand() { return this.options.animateExpand; }
56
- get animateSpeed() { return this.options.animateSpeed || 1; }
57
- get animateAcceleration() { return this.options.animateAcceleration || 1.2; }
58
- get scrollOnActivate() { return this.options.scrollOnActivate === undefined ? true : this.options.scrollOnActivate; }
59
- get rtl() { return !!this.options.rtl; }
60
- get rootId() { return this.options.rootId; }
61
- get useCheckbox() { return this.options.useCheckbox; }
62
- get useTriState() { return this.options.useTriState === undefined ? true : this.options.useTriState; }
63
- get scrollContainer() { return this.options.scrollContainer; }
64
- get allowDragoverStyling() { return this.options.allowDragoverStyling === undefined ? true : this.options.allowDragoverStyling; }
65
- constructor(options = {}) {
66
- this.options = options;
67
- this.actionMapping = {
68
- mouse: {
69
- click: this.options?.actionMapping?.mouse?.click ?? defaultActionMapping.mouse.click,
70
- dblClick: this.options?.actionMapping?.mouse?.dblClick ?? defaultActionMapping.mouse.dblClick,
71
- contextMenu: this.options?.actionMapping?.mouse?.contextMenu ?? defaultActionMapping.mouse.contextMenu,
72
- expanderClick: this.options?.actionMapping?.mouse?.expanderClick ?? defaultActionMapping.mouse.expanderClick,
73
- checkboxClick: this.options?.actionMapping?.mouse?.checkboxClick ?? defaultActionMapping.mouse.checkboxClick,
74
- drop: this.options?.actionMapping?.mouse?.drop ?? defaultActionMapping.mouse.drop,
75
- dragStart: this.options?.actionMapping?.mouse?.dragStart ?? undefined,
76
- drag: this.options?.actionMapping?.mouse?.drag ?? undefined,
77
- dragEnd: this.options?.actionMapping?.mouse?.dragEnd ?? undefined,
78
- dragOver: this.options?.actionMapping?.mouse?.dragOver ?? undefined,
79
- dragLeave: this.options?.actionMapping?.mouse?.dragLeave ?? undefined,
80
- dragEnter: this.options?.actionMapping?.mouse?.dragEnter ?? undefined,
81
- mouseOver: this.options?.actionMapping?.mouse?.mouseOver ?? undefined,
82
- mouseOut: this.options?.actionMapping?.mouse?.mouseOut ?? undefined,
83
- },
84
- keys: {
85
- [KEYS.RIGHT]: TREE_ACTIONS.DRILL_DOWN,
86
- [KEYS.LEFT]: TREE_ACTIONS.DRILL_UP,
87
- [KEYS.DOWN]: TREE_ACTIONS.NEXT_NODE,
88
- [KEYS.UP]: TREE_ACTIONS.PREVIOUS_NODE,
89
- [KEYS.SPACE]: TREE_ACTIONS.TOGGLE_ACTIVE,
90
- [KEYS.ENTER]: TREE_ACTIONS.TOGGLE_ACTIVE
91
- }
92
- };
93
- if (this.options?.actionMapping?.keys) {
94
- this.actionMapping.keys = {
95
- ...this.actionMapping.keys,
96
- ...this.options.actionMapping.keys
97
- };
98
- }
99
- if (options.rtl) {
100
- this.actionMapping.keys[KEYS.RIGHT] = options.actionMapping?.keys[KEYS.RIGHT] || TREE_ACTIONS.DRILL_UP;
101
- this.actionMapping.keys[KEYS.LEFT] = options.actionMapping?.keys[KEYS.LEFT] || TREE_ACTIONS.DRILL_DOWN;
102
- }
103
- }
104
- getNodeClone(node) {
105
- if (this.options.getNodeClone) {
106
- return this.options.getNodeClone(node);
107
- }
108
- // remove id from clone
109
- // keeping ie11 compatibility
110
- const nodeClone = Object.assign({}, node.data);
111
- if (nodeClone.id) {
112
- delete nodeClone.id;
113
- }
114
- return nodeClone;
115
- }
116
- allowDrop(element, to, $event) {
117
- if (this.options.allowDrop instanceof Function) {
118
- return this.options.allowDrop(element, to, $event);
119
- }
120
- else {
121
- return this.options.allowDrop === undefined ? true : this.options.allowDrop;
122
- }
123
- }
124
- allowDrag(node) {
125
- if (this.options.allowDrag instanceof Function) {
126
- return this.options.allowDrag(node);
127
- }
128
- else {
129
- return this.options.allowDrag;
130
- }
131
- }
132
- nodeClass(node) {
133
- return this.options.nodeClass ? this.options.nodeClass(node) : '';
134
- }
135
- nodeHeight(node) {
136
- if (node.data.virtual) {
137
- return 0;
138
- }
139
- let nodeHeight = this.options.nodeHeight || 22;
140
- if (typeof nodeHeight === 'function') {
141
- nodeHeight = nodeHeight(node);
142
- }
143
- // account for drop slots:
144
- return nodeHeight + (node.index === 0 ? 2 : 1) * this.dropSlotHeight;
145
- }
146
- get dropSlotHeight() {
147
- return typeof this.options.dropSlotHeight === 'number' ? this.options.dropSlotHeight : 2;
148
- }
149
- }
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1vcHRpb25zLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10cmVlLWNvbXBvbmVudC9zcmMvbGliL21vZGVscy90cmVlLW9wdGlvbnMubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBT3pDLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRztJQUMxQixhQUFhLEVBQUUsQ0FBQyxJQUFlLEVBQUUsSUFBYyxFQUFFLE1BQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7SUFDL0YsbUJBQW1CLEVBQUUsQ0FBQyxJQUFlLEVBQUUsSUFBYyxFQUFFLE1BQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO0lBQ3pHLGVBQWUsRUFBRSxDQUFDLElBQWUsRUFBRSxJQUFjLEVBQUUsTUFBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtJQUNoRyxRQUFRLEVBQUUsQ0FBQyxJQUFlLEVBQUUsSUFBYyxFQUFFLE1BQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFDbEYsVUFBVSxFQUFFLENBQUMsSUFBZSxFQUFFLElBQWMsRUFBRSxNQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO0lBQ3JGLE1BQU0sRUFBRSxDQUFDLElBQWUsRUFBRSxJQUFjLEVBQUUsTUFBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztJQUNsRixRQUFRLEVBQUUsQ0FBQyxJQUFlLEVBQUUsSUFBYyxFQUFFLE1BQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENB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LE9BQU8sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO1FBRS9DLElBQUksT0FBTyxVQUFVLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDckMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsMEJBQTBCO1FBQzFCLE9BQU8sVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJlZU5vZGUgfSBmcm9tICcuL3RyZWUtbm9kZS5tb2RlbCc7XHJcbmltcG9ydCB7IFRyZWVNb2RlbCB9IGZyb20gJy4vdHJlZS5tb2RlbCc7XHJcbmltcG9ydCB7IEtFWVMgfSBmcm9tICcuLi9jb25zdGFudHMva2V5cyc7XHJcbmltcG9ydCB7IElUcmVlT3B0aW9ucyB9IGZyb20gJy4uL2RlZnMvYXBpJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUFjdGlvbkhhbmRsZXIge1xyXG4gICh0cmVlOiBUcmVlTW9kZWwsIG5vZGU6IFRyZWVOb2RlLCAkZXZlbnQ6IGFueSwgLi4ucmVzdCk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBUUkVFX0FDVElPTlMgPSB7XHJcbiAgVE9HR0xFX0FDVElWRTogKHRyZWU6IFRyZWVNb2RlbCwgbm9kZTogVHJlZU5vZGUsICRldmVudDogYW55KSA9PiBub2RlICYmIG5vZGUudG9nZ2xlQWN0aXZhdGVkKCksXHJcbiAgVE9HR0xFX0FDVElWRV9NVUxUSTogKHRyZWU6IFRyZWVNb2RlbCwgbm9kZTogVHJlZU5vZGUsICRldmVudDogYW55KSA9PiBub2RlICYmIG5vZGUudG9nZ2xlQWN0aXZhdGVkKHRydWUpLFxyXG4gIFRPR0dMRV9TRUxFQ1RFRDogKHRyZWU6IFRyZWVNb2RlbCwgbm9kZTogVHJlZU5vZGUsICRldmVudDogYW55KSA9PiBub2RlICYmIG5vZGUudG9nZ2xlU2VsZWN0ZWQoKSxcclxuICBBQ1RJVkFURTogKHRyZWU6IFRyZWVNb2RlbCwgbm9kZTogVHJlZU5vZGUsICRldmVudDogYW55KSA9PiBub2RlLnNldElzQWN0aXZlKHRydWUpLFxyXG4gIERFQUNUSVZBVEU6ICh0cmVlOiBUcmVlTW9kZWwsIG5vZGU6IFRyZWVOb2RlLCAkZXZlbnQ6IGFueSkgPT4gbm9kZS5zZXRJc0FjdGl2ZShmYWxzZSksXHJcbiAgU0VMRUNUOiAodHJlZTogVHJlZU1vZGVsLCBub2RlOiBUcmVlTm9kZSwgJGV2ZW50OiBhbnkpID0+IG5vZGUuc2V0SXNTZWxlY3RlZCh0cnVlKSxcclxuICBERVNFTEVDVDogKHRyZWU6IFRyZWVNb2RlbCwgbm9kZTogVHJlZU5vZGUsICRldmVudDogYW55KSA9PiBub2RlLnNldElzU2VsZWN0ZWQoZmFsc2UpLFxyXG4gIEZPQ1VTOiAodHJlZTogVHJlZU1vZGVsLCBub2RlOiBUcmVlTm9kZSwgJGV2ZW50OiBhbnkpID0+IG5vZGUuZm9jdXMoKSxcclxuICBUT0dHTEVfRVhQQU5ERUQ6ICh0cmVlOiBUcmVlTW9kZWwsIG5vZGU6IFRyZWVOb2RlLCAkZXZlbnQ6IGFueSkgPT4gbm9kZS5oYXNDaGlsZHJlbiAmJiBub2RlLnRvZ2dsZUV4cGFuZGVkKCksXHJcbiAgRVhQQU5EOiAodHJlZTogVHJlZU1vZGVsLCBub2RlOiBUcmVlTm9kZSwgJGV2ZW50OiBhbnkpID0+IG5vZGUuZXhwYW5kKCksXHJcbiAgQ09MTEFQU0U6ICh0cmVlOiBUcmVlTW9kZWwsIG5vZGU6IFRyZWVOb2RlLCAkZXZlbnQ6IGFueSkgPT4gbm9kZS5jb2xsYXBzZSgpLFxyXG4gIERSSUxMX0RPV046ICh0cmVlOiBUcmVlTW9kZWwsIG5vZGU6IFRyZWVOb2RlLCAkZXZlbnQ6IGFueSkgPT4gdHJlZS5mb2N1c0RyaWxsRG93bigpLFxyXG4gIERSSUxMX1VQOiAodHJlZTogVHJlZU1vZGVsLCBub2RlOiBUcmVlTm9kZSwgJGV2ZW50OiBhbnkpID0+IHRyZWUuZm9jdXNEcmlsbFVwKCksXHJcbiAgTkVYVF9OT0RFOiAodHJlZTogVHJlZU1vZGVsLCBub2RlOiBUcmVlTm9kZSwgJGV2ZW50OiBhbnkpID0+ICB0cmVlLmZvY3VzTmV4dE5vZGUoKSxcclxuICBQUkVWSU9VU19OT0RFOiAodHJlZTogVHJlZU1vZGVsLCBub2RlOiBUcmVlTm9kZSwgJGV2ZW50OiBhbnkpID0+ICB0cmVlLmZvY3VzUHJldmlvdXNOb2RlKCksXHJcbiAgTU9WRV9OT0RFOiAodHJlZTogVHJlZU1vZGVsLCBub2RlOiBUcmVlTm9kZSwgJGV2ZW50OiBhbnksIHtmcm9tICwgdG99OiB7ZnJvbTogYW55LCB0bzogYW55fSkgPT4ge1xyXG4gICAgLy8gZGVmYXVsdCBhY3Rpb24gYXNzdW1lcyBmcm9tID0gbm9kZSwgdG8gPSB7cGFyZW50LCBpbmRleH1cclxuICAgIGlmICgkZXZlbnQuY3RybEtleSkge1xyXG4gICAgICB0cmVlLmNvcHlOb2RlKGZyb20sIHRvKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRyZWUubW92ZU5vZGUoZnJvbSwgdG8pO1xyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGRlZmF1bHRBY3Rpb25NYXBwaW5nOiBJQWN0aW9uTWFwcGluZyA9IHtcclxuICBtb3VzZToge1xyXG4gICAgY2xpY2s6IFRSRUVfQUNUSU9OUy5UT0dHTEVfQUNUSVZFLFxyXG4gICAgZGJsQ2xpY2s6IG51bGwsXHJcbiAgICBjb250ZXh0TWVudTogbnVsbCxcclxuICAgIGV4cGFuZGVyQ2xpY2s6IFRSRUVfQUNUSU9OUy5UT0dHTEVfRVhQQU5ERUQsXHJcbiAgICBjaGVja2JveENsaWNrOiBUUkVFX0FDVElPTlMuVE9HR0xFX1NFTEVDVEVELFxyXG4gICAgZHJvcDogVFJFRV9BQ1RJT05TLk1PVkVfTk9ERVxyXG4gIH0sXHJcbiAga2V5czoge1xyXG4gICAgW0tFWVMuUklHSFRdOiBUUkVFX0FDVElPTlMuRFJJTExfRE9XTixcclxuICAgIFtLRVlTLkxFRlRdOiBUUkVFX0FDVElPTlMuRFJJTExfVVAsXHJcbiAgICBbS0VZUy5ET1dOXTogVFJFRV9BQ1RJT05TLk5FWFRfTk9ERSxcclxuICAgIFtLRVlTLlVQXTogVFJFRV9BQ1RJT05TLlBSRVZJT1VTX05PREUsXHJcbiAgICBbS0VZUy5TUEFDRV06IFRSRUVfQUNUSU9OUy5UT0dHTEVfQUNUSVZFLFxyXG4gICAgW0tFWVMuRU5URVJdOiBUUkVFX0FDVElPTlMuVE9HR0xFX0FDVElWRVxyXG4gIH1cclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUFjdGlvbk1hcHBpbmcge1xyXG4gIG1vdXNlPzoge1xyXG4gICAgY2xpY2s/OiBJQWN0aW9uSGFuZGxlcixcclxuICAgIGRibENsaWNrPzogSUFjdGlvbkhhbmRsZXIsXHJcbiAgICBjb250ZXh0TWVudT86IElBY3Rpb25IYW5kbGVyLFxyXG4gICAgZXhwYW5kZXJDbGljaz86IElBY3Rpb25IYW5kbGVyLFxyXG4gICAgY2hlY2tib3hDbGljaz86IElBY3Rpb25IYW5kbGVyLFxyXG4gICAgZHJhZ1N0YXJ0PzogSUFjdGlvbkhhbmRsZXIsXHJcbiAgICBkcmFnPzogSUFjdGlvbkhhbmRsZXIsXHJcbiAgICBkcmFnRW5kPzogSUFjdGlvbkhhbmRsZXIsXHJcbiAgICBkcmFnT3Zlcj86IElBY3Rpb25IYW5kbGVyLFxyXG4gICAgZHJhZ0xlYXZlPzogSUFjdGlvbkhhbmRsZXIsXHJcbiAgICBkcmFnRW50ZXI/OiBJQWN0aW9uSGFuZGxlcixcclxuICAgIGRyb3A/OiBJQWN0aW9uSGFuZGxlcixcclxuICAgIG1vdXNlT3Zlcj86IElBY3Rpb25IYW5kbGVyLFxyXG4gICAgbW91c2VPdXQ/OiBJQWN0aW9uSGFuZGxlclxyXG4gIH07XHJcbiAga2V5cz86IHtcclxuICAgIFtrZXk6IG51bWJlcl06IElBY3Rpb25IYW5kbGVyXHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFRyZWVPcHRpb25zIHtcclxuICBnZXQgaGFzQ2hpbGRyZW5GaWVsZCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5vcHRpb25zLmhhc0NoaWxkcmVuRmllbGQgfHwgJ2hhc0NoaWxkcmVuJzsgfVxyXG4gIGdldCBjaGlsZHJlbkZpZWxkKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLm9wdGlvbnMuY2hpbGRyZW5GaWVsZCB8fCAnY2hpbGRyZW4nOyB9XHJcbiAgZ2V0IGRpc3BsYXlGaWVsZCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5vcHRpb25zLmRpc3BsYXlGaWVsZCB8fCAnbmFtZSc7IH1cclxuICBnZXQgaWRGaWVsZCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5vcHRpb25zLmlkRmllbGQgfHwgJ2lkJzsgfVxyXG4gIGdldCBpc0V4cGFuZGVkRmllbGQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMub3B0aW9ucy5pc0V4cGFuZGVkRmllbGQgfHwgJ2lzRXhwYW5kZWQnOyB9XHJcbiAgZ2V0IGdldENoaWxkcmVuKCk6IGFueSB7IHJldHVybiB0aGlzLm9wdGlvbnMuZ2V0Q2hpbGRyZW47IH1cclxuICBnZXQgbGV2ZWxQYWRkaW5nKCk6IG51bWJlciB7IHJldHVybiB0aGlzLm9wdGlvbnMubGV2ZWxQYWRkaW5nIHx8IDA7IH1cclxuICBnZXQgdXNlVmlydHVhbFNjcm9sbCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMub3B0aW9ucy51c2VWaXJ0dWFsU2Nyb2xsOyB9XHJcbiAgZ2V0IGFuaW1hdGVFeHBhbmQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm9wdGlvbnMuYW5pbWF0ZUV4cGFuZDsgfVxyXG4gIGdldCBhbmltYXRlU3BlZWQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMub3B0aW9ucy5hbmltYXRlU3BlZWQgfHwgMTsgfVxyXG4gIGdldCBhbmltYXRlQWNjZWxlcmF0aW9uKCk6IG51bWJlciB7IHJldHVybiB0aGlzLm9wdGlvbnMuYW5pbWF0ZUFjY2VsZXJhdGlvbiB8fCAxLjI7IH1cclxuICBnZXQgc2Nyb2xsT25BY3RpdmF0ZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMub3B0aW9ucy5zY3JvbGxPbkFjdGl2YXRlID09PSB1bmRlZmluZWQgPyB0cnVlIDogdGhpcy5vcHRpb25zLnNjcm9sbE9uQWN0aXZhdGU7IH1cclxuICBnZXQgcnRsKCk6IGJvb2xlYW4geyByZXR1cm4gISF0aGlzLm9wdGlvbnMucnRsOyB9XHJcbiAgZ2V0IHJvb3RJZCgpOiBhbnkge3JldHVybiB0aGlzLm9wdGlvbnMucm9vdElkOyB9XHJcbiAgZ2V0IHVzZUNoZWNrYm94KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5vcHRpb25zLnVzZUNoZWNrYm94OyB9XHJcbiAgZ2V0IHVzZVRyaVN0YXRlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5vcHRpb25zLnVzZVRyaVN0YXRlID09PSB1bmRlZmluZWQgPyB0cnVlIDogdGhpcy5vcHRpb25zLnVzZVRyaVN0YXRlOyB9XHJcbiAgZ2V0IHNjcm9sbENvbnRhaW5lcigpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLm9wdGlvbnMuc2Nyb2xsQ29udGFpbmVyOyB9XHJcbiAgZ2V0IGFsbG93RHJhZ292ZXJTdHlsaW5nKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5vcHRpb25zLmFsbG93RHJhZ292ZXJTdHlsaW5nID09PSB1bmRlZmluZWQgPyB0cnVlIDogdGhpcy5vcHRpb25zLmFsbG93RHJhZ292ZXJTdHlsaW5nOyB9XHJcbiAgYWN0aW9uTWFwcGluZzogSUFjdGlvbk1hcHBpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgb3B0aW9uczogSVRyZWVPcHRpb25zID0ge30pIHtcclxuICAgIHRoaXMuYWN0aW9uTWFwcGluZyA9IHtcclxuICAgICAgbW91c2U6IHtcclxuICAgICAgICBjbGljazogdGhpcy5vcHRpb25zPy5hY3Rpb25NYXBwaW5nPy5tb3VzZT8uY2xpY2sgPz8gZGVmYXVsdEFjdGlvbk1hcHBpbmcubW91c2UuY2xpY2ssXHJcbiAgICAgICAgZGJsQ2xpY2s6IHRoaXMub3B0aW9ucz8uYWN0aW9uTWFwcGluZz8ubW91c2U/LmRibENsaWNrID8/IGRlZmF1bHRBY3Rpb25NYXBwaW5nLm1vdXNlLmRibENsaWNrLFxyXG4gICAgICAgIGNvbnRleHRNZW51OiB0aGlzLm9wdGlvbnM/LmFjdGlvbk1hcHBpbmc/Lm1vdXNlPy5jb250ZXh0TWVudSA/PyBkZWZhdWx0QWN0aW9uTWFwcGluZy5tb3VzZS5jb250ZXh0TWVudSxcclxuICAgICAgICBleHBhbmRlckNsaWNrOiB0aGlzLm9wdGlvbnM/LmFjdGlvbk1hcHBpbmc/Lm1vdXNlPy5leHBhbmRlckNsaWNrID8/IGRlZmF1bHRBY3Rpb25NYXBwaW5nLm1vdXNlLmV4cGFuZGVyQ2xpY2ssXHJcbiAgICAgICAgY2hlY2tib3hDbGljazogdGhpcy5vcHRpb25zPy5hY3Rpb25NYXBwaW5nPy5tb3VzZT8uY2hlY2tib3hDbGljayA/PyBkZWZhdWx0QWN0aW9uTWFwcGluZy5tb3VzZS5jaGVja2JveENsaWNrLFxyXG4gICAgICAgIGRyb3A6IHRoaXMub3B0aW9ucz8uYWN0aW9uTWFwcGluZz8ubW91c2U/LmRyb3AgPz8gZGVmYXVsdEFjdGlvbk1hcHBpbmcubW91c2UuZHJvcCxcclxuICAgICAgICBkcmFnU3RhcnQ6IHRoaXMub3B0aW9ucz8uYWN0aW9uTWFwcGluZz8ubW91c2U/LmRyYWdTdGFydCA/PyB1bmRlZmluZWQsXHJcbiAgICAgICAgZHJhZzogdGhpcy5vcHRpb25zPy5hY3Rpb25NYXBwaW5nPy5tb3VzZT8uZHJhZyA/PyB1bmRlZmluZWQsXHJcbiAgICAgICAgZHJhZ0VuZDogdGhpcy5vcHRpb25zPy5hY3Rpb25NYXBwaW5nPy5tb3VzZT8uZHJhZ0VuZCA/PyB1bmRlZmluZWQsXHJcbiAgICAgICAgZHJhZ092ZXI6IHRoaXMub3B0aW9ucz8uYWN0aW9uTWFwcGluZz8ubW91c2U/LmRyYWdPdmVyID8/IHVuZGVmaW5lZCxcclxuICAgICAgICBkcmFnTGVhdmU6IHRoaXMub3B0aW9ucz8uYWN0aW9uTWFwcGluZz8ubW91c2U/LmRyYWdMZWF2ZSA/PyB1bmRlZmluZWQsXHJcbiAgICAgICAgZHJhZ0VudGVyOiB0aGlzLm9wdGlvbnM/LmFjdGlvbk1hcHBpbmc/Lm1vdXNlPy5kcmFnRW50ZXIgPz8gdW5kZWZpbmVkLFxyXG4gICAgICAgIG1vdXNlT3ZlcjogdGhpcy5vcHRpb25zPy5hY3Rpb25NYXBwaW5nPy5tb3VzZT8ubW91c2VPdmVyID8/IHVuZGVmaW5lZCxcclxuICAgICAgICBtb3VzZU91dDogdGhpcy5vcHRpb25zPy5hY3Rpb25NYXBwaW5nPy5tb3VzZT8ubW91c2VPdXQgPz8gdW5kZWZpbmVkLFxyXG4gICAgICB9LFxyXG4gICAgICBrZXlzOiB7XHJcbiAgICAgICAgW0tFWVMuUklHSFRdOiBUUkVFX0FDVElPTlMuRFJJTExfRE9XTixcclxuICAgICAgICBbS0VZUy5MRUZUXTogVFJFRV9BQ1RJT05TLkRSSUxMX1VQLFxyXG4gICAgICAgIFtLRVlTLkRPV05dOiBUUkVFX0FDVElPTlMuTkVYVF9OT0RFLFxyXG4gICAgICAgIFtLRVlTLlVQXTogVFJFRV9BQ1RJT05TLlBSRVZJT1VTX05PREUsXHJcbiAgICAgICAgW0tFWVMuU1BBQ0VdOiBUUkVFX0FDVElPTlMuVE9HR0xFX0FDVElWRSxcclxuICAgICAgICBbS0VZUy5FTlRFUl06IFRSRUVfQUNUSU9OUy5UT0dHTEVfQUNUSVZFXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zPy5hY3Rpb25NYXBwaW5nPy5rZXlzKSB7XHJcbiAgICAgIHRoaXMuYWN0aW9uTWFwcGluZy5rZXlzID0ge1xyXG4gICAgICAgIC4uLnRoaXMuYWN0aW9uTWFwcGluZy5rZXlzLFxyXG4gICAgICAgIC4uLnRoaXMub3B0aW9ucy5hY3Rpb25NYXBwaW5nLmtleXNcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChvcHRpb25zLnJ0bCkge1xyXG4gICAgICB0aGlzLmFjdGlvbk1hcHBpbmcua2V5c1tLRVlTLlJJR0hUXSA9IDxJQWN0aW9uSGFuZGxlcj5vcHRpb25zLmFjdGlvbk1hcHBpbmc/LmtleXNbS0VZUy5SSUdIVF0gfHwgVFJFRV9BQ1RJT05TLkRSSUxMX1VQO1xyXG4gICAgICB0aGlzLmFjdGlvbk1hcHBpbmcua2V5c1tLRVlTLkxFRlRdID0gPElBY3Rpb25IYW5kbGVyPm9wdGlvbnMuYWN0aW9uTWFwcGluZz8ua2V5c1tLRVlTLkxFRlRdIHx8IFRSRUVfQUNUSU9OUy5EUklMTF9ET1dOO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0Tm9kZUNsb25lKG5vZGU6IFRyZWVOb2RlKTogYW55IHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZ2V0Tm9kZUNsb25lKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZ2V0Tm9kZUNsb25lKG5vZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlbW92ZSBpZCBmcm9tIGNsb25lXHJcbiAgICAvLyBrZWVwaW5nIGllMTEgY29tcGF0aWJpbGl0eVxyXG4gICAgY29uc3Qgbm9kZUNsb25lID0gT2JqZWN0LmFzc2lnbih7fSwgbm9kZS5kYXRhKTtcclxuICAgIGlmIChub2RlQ2xvbmUuaWQpIHtcclxuICAgICAgZGVsZXRlIG5vZGVDbG9uZS5pZDtcclxuICAgIH1cclxuICAgIHJldHVybiBub2RlQ2xvbmU7XHJcbiAgfVxyXG5cclxuICBhbGxvd0Ryb3AoZWxlbWVudCwgdG8sICRldmVudD8pOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuYWxsb3dEcm9wIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcclxuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hbGxvd0Ryb3AoZWxlbWVudCwgdG8sICRldmVudCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hbGxvd0Ryb3AgPT09IHVuZGVmaW5lZCA/IHRydWUgOiB0aGlzLm9wdGlvbnMuYWxsb3dEcm9wO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWxsb3dEcmFnKG5vZGU6IFRyZWVOb2RlKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93RHJhZyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYWxsb3dEcmFnKG5vZGUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hbGxvd0RyYWc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBub2RlQ2xhc3Mobm9kZTogVHJlZU5vZGUpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ub2RlQ2xhc3MgPyB0aGlzLm9wdGlvbnMubm9kZUNsYXNzKG5vZGUpIDogJyc7XHJcbiAgfVxyXG5cclxuICBub2RlSGVpZ2h0KG5vZGU6IFRyZWVOb2RlKTogbnVtYmVyIHtcclxuICAgIGlmIChub2RlLmRhdGEudmlydHVhbCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbm9kZUhlaWdodCA9IHRoaXMub3B0aW9ucy5ub2RlSGVpZ2h0IHx8IDIyO1xyXG5cclxuICAgIGlmICh0eXBlb2Ygbm9kZUhlaWdodCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBub2RlSGVpZ2h0ID0gbm9kZUhlaWdodChub2RlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhY2NvdW50IGZvciBkcm9wIHNsb3RzOlxyXG4gICAgcmV0dXJuIG5vZGVIZWlnaHQgKyAobm9kZS5pbmRleCA9PT0gMCA/ICAyIDogMSkgKiB0aGlzLmRyb3BTbG90SGVpZ2h0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRyb3BTbG90SGVpZ2h0KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMub3B0aW9ucy5kcm9wU2xvdEhlaWdodCA9PT0gJ251bWJlcicgPyB0aGlzLm9wdGlvbnMuZHJvcFNsb3RIZWlnaHQgOiAyO1xyXG4gIH1cclxufVxyXG4iXX0=