angular-three 1.9.12 → 1.9.13
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/esm2020/lib/canvas.mjs +9 -10
- package/esm2020/lib/di/before-render.mjs +2 -2
- package/esm2020/lib/di/ref.mjs +6 -10
- package/esm2020/lib/directives/args.mjs +5 -7
- package/esm2020/lib/directives/common.mjs +3 -3
- package/esm2020/lib/directives/parent.mjs +3 -3
- package/esm2020/lib/directives/repeat.mjs +3 -3
- package/esm2020/lib/pipes/push.mjs +3 -3
- package/esm2020/lib/portal.mjs +16 -17
- package/esm2020/lib/renderer/provider.mjs +3 -5
- package/esm2020/lib/renderer/renderer.mjs +6 -5
- package/esm2020/lib/renderer/store.mjs +376 -0
- package/esm2020/lib/renderer/utils.mjs +13 -24
- package/esm2020/lib/routed-scene.mjs +3 -3
- package/esm2020/lib/stores/rx-store.mjs +12 -20
- package/esm2020/lib/stores/store.mjs +8 -13
- package/fesm2015/angular-three.mjs +93 -129
- package/fesm2015/angular-three.mjs.map +1 -1
- package/fesm2020/angular-three.mjs +92 -130
- package/fesm2020/angular-three.mjs.map +1 -1
- package/lib/canvas.d.ts +2 -2
- package/lib/portal.d.ts +1 -1
- package/lib/renderer/renderer.d.ts +4 -4
- package/lib/renderer/{state.d.ts → store.d.ts} +2 -2
- package/package.json +3 -3
- package/plugin/package.json +1 -1
- package/esm2020/lib/renderer/state.mjs +0 -381
package/lib/canvas.d.ts
CHANGED
|
@@ -9,8 +9,8 @@ export declare class NgtCanvas extends NgtRxStore<NgtCanvasInputs> implements On
|
|
|
9
9
|
private readonly host;
|
|
10
10
|
private readonly store;
|
|
11
11
|
initialize(): void;
|
|
12
|
-
readonly
|
|
13
|
-
get
|
|
12
|
+
readonly hbClass = true;
|
|
13
|
+
get hbPointerEvents(): "none" | "auto";
|
|
14
14
|
sceneGraph: Type<any>;
|
|
15
15
|
sceneGraphInputs: NgtAnyRecord;
|
|
16
16
|
compoundPrefixes: string[];
|
package/lib/portal.d.ts
CHANGED
|
@@ -23,7 +23,7 @@ export declare class NgtPortalBeforeRender implements OnInit, OnDestroy {
|
|
|
23
23
|
ngOnInit(): void;
|
|
24
24
|
ngOnDestroy(): void;
|
|
25
25
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgtPortalBeforeRender, never>;
|
|
26
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<NgtPortalBeforeRender, "
|
|
26
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgtPortalBeforeRender, "[ngtPortalBeforeRender]", never, { "renderPriority": "renderPriority"; "parentScene": "parentScene"; "parentCamera": "parentCamera"; }, { "beforeRender": "beforeRender"; }, never, never, true, never>;
|
|
27
27
|
}
|
|
28
28
|
export declare class NgtPortalContent {
|
|
29
29
|
constructor(vcr: ViewContainerRef, parentVcr: ViewContainerRef);
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { Renderer2, RendererFactory2, RendererType2 } from '@angular/core';
|
|
2
2
|
import { NgtAnyRecord } from '../types';
|
|
3
|
-
import { NgtRendererNode, NgtRendererState, NgtRendererStore } from './
|
|
3
|
+
import { NgtRendererNode, NgtRendererState, NgtRendererStore } from './store';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export declare class NgtRendererFactory implements RendererFactory2 {
|
|
6
6
|
private readonly delegateRendererFactory;
|
|
7
7
|
private readonly catalogue;
|
|
8
|
-
private rendererMap;
|
|
9
|
-
private routedSet;
|
|
10
|
-
private rendererStore;
|
|
8
|
+
private readonly rendererMap;
|
|
9
|
+
private readonly routedSet;
|
|
10
|
+
private readonly rendererStore;
|
|
11
11
|
createRenderer(hostElement: any, type: RendererType2 | null): Renderer2;
|
|
12
12
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgtRendererFactory, never>;
|
|
13
13
|
static ɵprov: i0.ɵɵInjectableDeclaration<NgtRendererFactory>;
|
|
@@ -2,7 +2,7 @@ import { ChangeDetectorRef, Injector } from '@angular/core';
|
|
|
2
2
|
import { NgtInjectedRef } from '../di/ref';
|
|
3
3
|
import { NgtStore } from '../stores/store';
|
|
4
4
|
import type { NgtAnyRecord } from '../types';
|
|
5
|
-
import {
|
|
5
|
+
import { NgtRendererClassId } from './enums';
|
|
6
6
|
export type NgtRendererRootState = {
|
|
7
7
|
store: NgtStore;
|
|
8
8
|
cdr: ChangeDetectorRef;
|
|
@@ -43,7 +43,7 @@ export declare class NgtRendererStore {
|
|
|
43
43
|
removeChild(node: NgtRendererNode, child: NgtRendererNode): void;
|
|
44
44
|
setCompound(compound: NgtRendererNode, instance: NgtRendererNode): void;
|
|
45
45
|
queueOperation(node: NgtRendererNode, op: NgtQueueOp): void;
|
|
46
|
-
executeOperation
|
|
46
|
+
private executeOperation;
|
|
47
47
|
processPortalContainer(portal: NgtRendererNode): void;
|
|
48
48
|
applyAttribute(node: NgtRendererNode, name: string, value: string): void;
|
|
49
49
|
applyProperty(node: NgtRendererNode, name: string, value: any): void;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "angular-three",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.13",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
"peerDependencies": {
|
|
24
24
|
"@angular/common": "^15.1.0",
|
|
25
25
|
"@angular/core": "^15.1.0",
|
|
26
|
-
"three": "^0.148.0 || ^0.149.0 || ^0.150.0",
|
|
26
|
+
"three": "^0.148.0 || ^0.149.0 || ^0.150.0 || ^0.151.0",
|
|
27
27
|
"rxjs": "7.8.0",
|
|
28
|
-
"@angular/router": "15.2.
|
|
28
|
+
"@angular/router": "15.2.5"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"ngx-resize": "^1.0.0",
|
package/plugin/package.json
CHANGED
|
@@ -1,381 +0,0 @@
|
|
|
1
|
-
import { getDebugNode } from '@angular/core';
|
|
2
|
-
import { NgtArgs } from '../directives/args';
|
|
3
|
-
import { NgtParent } from '../directives/parent';
|
|
4
|
-
import { NgtStore } from '../stores/store';
|
|
5
|
-
import { applyProps } from '../utils/apply-props';
|
|
6
|
-
import { getLocalState } from '../utils/instance';
|
|
7
|
-
import { is } from '../utils/is';
|
|
8
|
-
import { attachThreeChild, removeThreeChild, SPECIAL_PROPERTIES } from './utils';
|
|
9
|
-
export class NgtRendererStore {
|
|
10
|
-
constructor(root) {
|
|
11
|
-
this.root = root;
|
|
12
|
-
this.comments = [];
|
|
13
|
-
}
|
|
14
|
-
createNode(type, node) {
|
|
15
|
-
const state = [
|
|
16
|
-
type,
|
|
17
|
-
null,
|
|
18
|
-
null,
|
|
19
|
-
[],
|
|
20
|
-
false,
|
|
21
|
-
undefined,
|
|
22
|
-
undefined,
|
|
23
|
-
undefined,
|
|
24
|
-
undefined,
|
|
25
|
-
undefined,
|
|
26
|
-
undefined,
|
|
27
|
-
undefined,
|
|
28
|
-
undefined,
|
|
29
|
-
undefined,
|
|
30
|
-
undefined,
|
|
31
|
-
];
|
|
32
|
-
const rendererNode = Object.assign(node, { __ngt_renderer__: state });
|
|
33
|
-
// assign ownerDocument to node so we can use HostListener in Component
|
|
34
|
-
if (!rendererNode['ownerDocument']) {
|
|
35
|
-
rendererNode['ownerDocument'] = this.root.document;
|
|
36
|
-
}
|
|
37
|
-
// assign injectorFactory on non-three type since
|
|
38
|
-
// rendererNode is an instance of DOM Node
|
|
39
|
-
if (state[0 /* NgtRendererClassId.type */] !== 'three') {
|
|
40
|
-
state[14 /* NgtRendererClassId.injectorFactory */] = () => getDebugNode(rendererNode).injector;
|
|
41
|
-
}
|
|
42
|
-
if (state[0 /* NgtRendererClassId.type */] === 'comment') {
|
|
43
|
-
// we attach an arrow function to the Comment node
|
|
44
|
-
// In our directives, we can call this function to then start tracking the RendererNode
|
|
45
|
-
// this is done to limit the amount of Nodes we need to process for getCreationState
|
|
46
|
-
rendererNode['__ngt_renderer_add_comment__'] = (portalNode) => {
|
|
47
|
-
if (portalNode && portalNode.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'portal') {
|
|
48
|
-
this.portals.push(portalNode);
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
this.comments.push(rendererNode);
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
return rendererNode;
|
|
55
|
-
}
|
|
56
|
-
if (state[0 /* NgtRendererClassId.type */] === 'compound') {
|
|
57
|
-
state[8 /* NgtRendererClassId.queueOps */] = new Set();
|
|
58
|
-
state[9 /* NgtRendererClassId.attributes */] = {};
|
|
59
|
-
state[10 /* NgtRendererClassId.properties */] = {};
|
|
60
|
-
return rendererNode;
|
|
61
|
-
}
|
|
62
|
-
return rendererNode;
|
|
63
|
-
}
|
|
64
|
-
setParent(node, parent) {
|
|
65
|
-
if (!node.__ngt_renderer__[1 /* NgtRendererClassId.parent */]) {
|
|
66
|
-
node.__ngt_renderer__[1 /* NgtRendererClassId.parent */] = parent;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
addChild(node, child) {
|
|
70
|
-
if (!node.__ngt_renderer__[3 /* NgtRendererClassId.children */].includes(child)) {
|
|
71
|
-
node.__ngt_renderer__[3 /* NgtRendererClassId.children */].push(child);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
removeChild(node, child) {
|
|
75
|
-
const index = node.__ngt_renderer__[3 /* NgtRendererClassId.children */].findIndex((c) => child === c);
|
|
76
|
-
if (index >= 0) {
|
|
77
|
-
node.__ngt_renderer__[3 /* NgtRendererClassId.children */].splice(index, 1);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
setCompound(compound, instance) {
|
|
81
|
-
const rS = compound.__ngt_renderer__;
|
|
82
|
-
rS[7 /* NgtRendererClassId.compounded */] = instance;
|
|
83
|
-
const attributes = Object.keys(rS[9 /* NgtRendererClassId.attributes */]);
|
|
84
|
-
const properties = Object.keys(rS[10 /* NgtRendererClassId.properties */]);
|
|
85
|
-
if (attributes.length) {
|
|
86
|
-
for (const key of attributes) {
|
|
87
|
-
this.applyAttribute(instance, key, rS[9 /* NgtRendererClassId.attributes */][key]);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
if (properties.length) {
|
|
91
|
-
for (const key of properties) {
|
|
92
|
-
this.applyProperty(instance, key, rS[10 /* NgtRendererClassId.properties */][key]);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
this.executeOperation(compound);
|
|
96
|
-
}
|
|
97
|
-
queueOperation(node, op) {
|
|
98
|
-
node.__ngt_renderer__[8 /* NgtRendererClassId.queueOps */].add(op);
|
|
99
|
-
}
|
|
100
|
-
executeOperation(node, type = 'op') {
|
|
101
|
-
const rS = node.__ngt_renderer__;
|
|
102
|
-
if (rS[8 /* NgtRendererClassId.queueOps */]?.size) {
|
|
103
|
-
rS[8 /* NgtRendererClassId.queueOps */].forEach((op) => {
|
|
104
|
-
if (op[0 /* NgtQueueOpClassId.type */] === type) {
|
|
105
|
-
op[1 /* NgtQueueOpClassId.op */]();
|
|
106
|
-
rS[8 /* NgtRendererClassId.queueOps */].delete(op);
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
processPortalContainer(portal) {
|
|
112
|
-
const injectorFactory = portal.__ngt_renderer__[14 /* NgtRendererClassId.injectorFactory */];
|
|
113
|
-
const injector = injectorFactory?.();
|
|
114
|
-
if (!injector)
|
|
115
|
-
return;
|
|
116
|
-
const portalStore = injector.get(NgtStore, null);
|
|
117
|
-
if (!portalStore)
|
|
118
|
-
return;
|
|
119
|
-
const portalContainer = portalStore.get('scene');
|
|
120
|
-
if (!portalContainer)
|
|
121
|
-
return;
|
|
122
|
-
portal.__ngt_renderer__[13 /* NgtRendererClassId.portalContainer */] = this.createNode('three', portalContainer);
|
|
123
|
-
}
|
|
124
|
-
applyAttribute(node, name, value) {
|
|
125
|
-
const rS = node.__ngt_renderer__;
|
|
126
|
-
if (rS[4 /* NgtRendererClassId.destroyed */])
|
|
127
|
-
return;
|
|
128
|
-
if (name === SPECIAL_PROPERTIES.RENDER_PRIORITY) {
|
|
129
|
-
// priority needs to be set as an attribute string so that they can be set as early as possible
|
|
130
|
-
// we convert that string to a number. if it's invalid, 0
|
|
131
|
-
let priority = Number(value);
|
|
132
|
-
if (isNaN(priority)) {
|
|
133
|
-
priority = 0;
|
|
134
|
-
console.warn(`[NGT] "priority" is an invalid number, default to 0`);
|
|
135
|
-
}
|
|
136
|
-
getLocalState(node).priority = priority;
|
|
137
|
-
}
|
|
138
|
-
if (name === SPECIAL_PROPERTIES.COMPOUND) {
|
|
139
|
-
// we set the compound property on instance node now so we know that this instance is being compounded
|
|
140
|
-
rS[5 /* NgtRendererClassId.compound */] = [value === '' || value === 'first', {}];
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
if (name === SPECIAL_PROPERTIES.ATTACH) {
|
|
144
|
-
// handle attach as tring
|
|
145
|
-
const paths = value.split('.');
|
|
146
|
-
if (paths.length)
|
|
147
|
-
getLocalState(node).attach = paths;
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
if (name === SPECIAL_PROPERTIES.VALUE) {
|
|
151
|
-
// coercion
|
|
152
|
-
let maybeCoerced = value;
|
|
153
|
-
if (maybeCoerced === '' || maybeCoerced === 'true' || maybeCoerced === 'false') {
|
|
154
|
-
maybeCoerced = maybeCoerced === 'true' || maybeCoerced === '';
|
|
155
|
-
}
|
|
156
|
-
else if (!isNaN(Number(maybeCoerced))) {
|
|
157
|
-
maybeCoerced = Number(maybeCoerced);
|
|
158
|
-
}
|
|
159
|
-
rS[11 /* NgtRendererClassId.rawValue */] = maybeCoerced;
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
applyProps(node, { [name]: value });
|
|
163
|
-
}
|
|
164
|
-
applyProperty(node, name, value) {
|
|
165
|
-
const rS = node.__ngt_renderer__;
|
|
166
|
-
if (rS[4 /* NgtRendererClassId.destroyed */])
|
|
167
|
-
return;
|
|
168
|
-
// [ref]
|
|
169
|
-
if (name === SPECIAL_PROPERTIES.REF && is.ref(value)) {
|
|
170
|
-
rS[12 /* NgtRendererClassId.ref */] = value;
|
|
171
|
-
value.nativeElement = node;
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
const parent = getLocalState(node).parent || rS[1 /* NgtRendererClassId.parent */];
|
|
175
|
-
// [rawValue]
|
|
176
|
-
if (getLocalState(node).isRaw && name === SPECIAL_PROPERTIES.VALUE) {
|
|
177
|
-
rS[11 /* NgtRendererClassId.rawValue */] = value;
|
|
178
|
-
if (parent)
|
|
179
|
-
attachThreeChild(parent, node);
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
// [attach]
|
|
183
|
-
if (name === SPECIAL_PROPERTIES.ATTACH) {
|
|
184
|
-
getLocalState(node).attach = Array.isArray(value) ? value.map((v) => v.toString()) : value;
|
|
185
|
-
if (parent)
|
|
186
|
-
attachThreeChild(parent, node);
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
const compound = rS[5 /* NgtRendererClassId.compound */];
|
|
190
|
-
if (compound?.[1 /* NgtCompoundClassId.props */] &&
|
|
191
|
-
name in compound[1 /* NgtCompoundClassId.props */] &&
|
|
192
|
-
!compound[0 /* NgtCompoundClassId.applyFirst */]) {
|
|
193
|
-
value = compound[1 /* NgtCompoundClassId.props */][name];
|
|
194
|
-
}
|
|
195
|
-
applyProps(node, { [name]: value });
|
|
196
|
-
}
|
|
197
|
-
isCompound(name) {
|
|
198
|
-
return this.root.compoundPrefixes.some((prefix) => name.startsWith(prefix));
|
|
199
|
-
}
|
|
200
|
-
isDOM(node) {
|
|
201
|
-
const rS = node['__ngt_renderer__'];
|
|
202
|
-
return (!rS ||
|
|
203
|
-
(rS[0 /* NgtRendererClassId.type */] !== 'compound' &&
|
|
204
|
-
(node instanceof Element || node instanceof Document || node instanceof Window)));
|
|
205
|
-
}
|
|
206
|
-
get rootScene() {
|
|
207
|
-
return this.root.store.get('scene');
|
|
208
|
-
}
|
|
209
|
-
get rootCdr() {
|
|
210
|
-
return this.root.cdr;
|
|
211
|
-
}
|
|
212
|
-
get portals() {
|
|
213
|
-
return this.root.portals;
|
|
214
|
-
}
|
|
215
|
-
getClosestParentWithInstance(node) {
|
|
216
|
-
let parent = node.__ngt_renderer__[1 /* NgtRendererClassId.parent */];
|
|
217
|
-
while (parent && parent.__ngt_renderer__[0 /* NgtRendererClassId.type */] !== 'three') {
|
|
218
|
-
parent = parent.__ngt_renderer__[13 /* NgtRendererClassId.portalContainer */]
|
|
219
|
-
? parent.__ngt_renderer__[13 /* NgtRendererClassId.portalContainer */]
|
|
220
|
-
: parent.__ngt_renderer__[1 /* NgtRendererClassId.parent */];
|
|
221
|
-
}
|
|
222
|
-
return parent;
|
|
223
|
-
}
|
|
224
|
-
getClosestParentWithCompound(node) {
|
|
225
|
-
if (node.__ngt_renderer__[6 /* NgtRendererClassId.compoundParent */]) {
|
|
226
|
-
return node.__ngt_renderer__[6 /* NgtRendererClassId.compoundParent */];
|
|
227
|
-
}
|
|
228
|
-
let parent = node.__ngt_renderer__[1 /* NgtRendererClassId.parent */];
|
|
229
|
-
if (parent &&
|
|
230
|
-
parent.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'compound' &&
|
|
231
|
-
!parent.__ngt_renderer__[7 /* NgtRendererClassId.compounded */]) {
|
|
232
|
-
return parent;
|
|
233
|
-
}
|
|
234
|
-
while (parent &&
|
|
235
|
-
(parent.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'three' ||
|
|
236
|
-
!parent.__ngt_renderer__[6 /* NgtRendererClassId.compoundParent */] ||
|
|
237
|
-
parent.__ngt_renderer__[0 /* NgtRendererClassId.type */] !== 'compound')) {
|
|
238
|
-
parent = parent.__ngt_renderer__[1 /* NgtRendererClassId.parent */];
|
|
239
|
-
}
|
|
240
|
-
if (!parent)
|
|
241
|
-
return;
|
|
242
|
-
if (parent.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'three' &&
|
|
243
|
-
parent.__ngt_renderer__[6 /* NgtRendererClassId.compoundParent */]) {
|
|
244
|
-
return parent.__ngt_renderer__[6 /* NgtRendererClassId.compoundParent */];
|
|
245
|
-
}
|
|
246
|
-
if (!parent.__ngt_renderer__[7 /* NgtRendererClassId.compounded */]) {
|
|
247
|
-
return parent;
|
|
248
|
-
}
|
|
249
|
-
return null;
|
|
250
|
-
}
|
|
251
|
-
getCreationState() {
|
|
252
|
-
const injectedArgs = this.firstNonInjectedDirective(NgtArgs)?.args || [];
|
|
253
|
-
const injectedParent = this.firstNonInjectedDirective(NgtParent)?.parent || null;
|
|
254
|
-
const store = this.tryGetPortalStore();
|
|
255
|
-
return { injectedArgs, injectedParent, store };
|
|
256
|
-
}
|
|
257
|
-
destroy(node, parent) {
|
|
258
|
-
const rS = node.__ngt_renderer__;
|
|
259
|
-
if (rS[4 /* NgtRendererClassId.destroyed */])
|
|
260
|
-
return;
|
|
261
|
-
if (rS[0 /* NgtRendererClassId.type */] === 'three') {
|
|
262
|
-
rS[5 /* NgtRendererClassId.compound */] = undefined;
|
|
263
|
-
rS[6 /* NgtRendererClassId.compoundParent */] = undefined;
|
|
264
|
-
const localState = getLocalState(node);
|
|
265
|
-
if (localState.objects) {
|
|
266
|
-
localState.objects.value.forEach((obj) => this.destroy(obj, parent));
|
|
267
|
-
localState.objects.complete();
|
|
268
|
-
}
|
|
269
|
-
if (localState.nonObjects) {
|
|
270
|
-
localState.nonObjects.value.forEach((obj) => this.destroy(obj, parent));
|
|
271
|
-
localState.nonObjects.complete();
|
|
272
|
-
}
|
|
273
|
-
if (localState.afterUpdate)
|
|
274
|
-
localState.afterUpdate.complete();
|
|
275
|
-
if (localState.afterAttach)
|
|
276
|
-
localState.afterAttach.complete();
|
|
277
|
-
delete localState['objects'];
|
|
278
|
-
delete localState['nonObjects'];
|
|
279
|
-
delete localState['add'];
|
|
280
|
-
delete localState['remove'];
|
|
281
|
-
delete localState['afterUpdate'];
|
|
282
|
-
delete localState['afterAttach'];
|
|
283
|
-
delete localState['store'];
|
|
284
|
-
delete localState['handlers'];
|
|
285
|
-
if (!localState.primitive) {
|
|
286
|
-
delete node['__ngt__'];
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
if (rS[0 /* NgtRendererClassId.type */] === 'comment') {
|
|
290
|
-
rS[14 /* NgtRendererClassId.injectorFactory */] = null;
|
|
291
|
-
delete node['__ngt_renderer_add_comment__'];
|
|
292
|
-
const index = this.comments.findIndex((comment) => comment === node);
|
|
293
|
-
if (index > -1) {
|
|
294
|
-
this.comments.splice(index, 1);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
if (rS[0 /* NgtRendererClassId.type */] === 'portal') {
|
|
298
|
-
rS[14 /* NgtRendererClassId.injectorFactory */] = null;
|
|
299
|
-
const index = this.portals.findIndex((portal) => portal === node);
|
|
300
|
-
if (index > -1) {
|
|
301
|
-
this.portals.splice(index, 1);
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
if (rS[0 /* NgtRendererClassId.type */] === 'compound') {
|
|
305
|
-
rS[7 /* NgtRendererClassId.compounded */] = undefined;
|
|
306
|
-
rS[9 /* NgtRendererClassId.attributes */] = null;
|
|
307
|
-
rS[10 /* NgtRendererClassId.properties */] = null;
|
|
308
|
-
this.executeOperation(node, 'cleanUp');
|
|
309
|
-
rS[8 /* NgtRendererClassId.queueOps */].clear();
|
|
310
|
-
rS[8 /* NgtRendererClassId.queueOps */] = null;
|
|
311
|
-
}
|
|
312
|
-
if (rS[12 /* NgtRendererClassId.ref */]) {
|
|
313
|
-
// nullify ref
|
|
314
|
-
rS[12 /* NgtRendererClassId.ref */].nativeElement = null;
|
|
315
|
-
rS[12 /* NgtRendererClassId.ref */] = undefined;
|
|
316
|
-
}
|
|
317
|
-
// nullify parent
|
|
318
|
-
rS[1 /* NgtRendererClassId.parent */] = null;
|
|
319
|
-
for (const renderChild of rS[3 /* NgtRendererClassId.children */] || []) {
|
|
320
|
-
if (renderChild.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'three' && parent) {
|
|
321
|
-
removeThreeChild(parent, renderChild, true);
|
|
322
|
-
}
|
|
323
|
-
this.destroy(renderChild, parent);
|
|
324
|
-
}
|
|
325
|
-
rS[3 /* NgtRendererClassId.children */] = [];
|
|
326
|
-
rS[4 /* NgtRendererClassId.destroyed */] = true;
|
|
327
|
-
if (parent) {
|
|
328
|
-
this.removeChild(parent, node);
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
firstNonInjectedDirective(dir) {
|
|
332
|
-
let directive;
|
|
333
|
-
let i = this.comments.length - 1;
|
|
334
|
-
while (i >= 0) {
|
|
335
|
-
const comment = this.comments[i];
|
|
336
|
-
if (comment.__ngt_renderer__[4 /* NgtRendererClassId.destroyed */]) {
|
|
337
|
-
i--;
|
|
338
|
-
continue;
|
|
339
|
-
}
|
|
340
|
-
const injector = comment.__ngt_renderer__[14 /* NgtRendererClassId.injectorFactory */]();
|
|
341
|
-
if (!injector) {
|
|
342
|
-
i--;
|
|
343
|
-
continue;
|
|
344
|
-
}
|
|
345
|
-
const instance = injector.get(dir, null);
|
|
346
|
-
if (instance && instance.validate()) {
|
|
347
|
-
directive = instance;
|
|
348
|
-
break;
|
|
349
|
-
}
|
|
350
|
-
i--;
|
|
351
|
-
}
|
|
352
|
-
return directive;
|
|
353
|
-
}
|
|
354
|
-
tryGetPortalStore() {
|
|
355
|
-
let store;
|
|
356
|
-
// we only care about the portal states because NgtStore only differs per Portal
|
|
357
|
-
let i = this.portals.length - 1;
|
|
358
|
-
while (i >= 0) {
|
|
359
|
-
// loop through the portal state backwards to find the closest NgtStore
|
|
360
|
-
const portal = this.portals[i];
|
|
361
|
-
if (portal.__ngt_renderer__[4 /* NgtRendererClassId.destroyed */]) {
|
|
362
|
-
i--;
|
|
363
|
-
continue;
|
|
364
|
-
}
|
|
365
|
-
const injector = portal.__ngt_renderer__[14 /* NgtRendererClassId.injectorFactory */]();
|
|
366
|
-
if (!injector) {
|
|
367
|
-
i--;
|
|
368
|
-
continue;
|
|
369
|
-
}
|
|
370
|
-
const instance = injector.get(NgtStore, null);
|
|
371
|
-
// only the instance with previousStore should pass
|
|
372
|
-
if (instance && instance.get('previousStore')) {
|
|
373
|
-
store = instance;
|
|
374
|
-
break;
|
|
375
|
-
}
|
|
376
|
-
i--;
|
|
377
|
-
}
|
|
378
|
-
return store || this.root.store;
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUvc3JjL2xpYi9yZW5kZXJlci9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFlBQVksRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFFaEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWpDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQWtDakYsTUFBTSxPQUFPLGdCQUFnQjtJQUd6QixZQUE2QixJQUEwQjtRQUExQixTQUFJLEdBQUosSUFBSSxDQUFzQjtRQUZ0QyxhQUFRLEdBQUcsRUFBNEIsQ0FBQztJQUVDLENBQUM7SUFFM0QsVUFBVSxDQUFDLElBQStDLEVBQUUsSUFBa0I7UUFDMUUsTUFBTSxLQUFLLEdBQUc7WUFDVixJQUFJO1lBQ0osSUFBSTtZQUNKLElBQUk7WUFDSixFQUFFO1lBQ0YsS0FBSztZQUNMLFNBQVU7WUFDVixTQUFVO1lBQ1YsU0FBVTtZQUNWLFNBQVU7WUFDVixTQUFVO1lBQ1YsU0FBVTtZQUNWLFNBQVU7WUFDVixTQUFVO1lBQ1YsU0FBVTtZQUNWLFNBQVU7U0FDTyxDQUFDO1FBRXRCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUs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LENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFO2dCQUMzQyxLQUFLLEdBQUcsUUFBUSxDQUFDO2dCQUNqQixNQUFNO2FBQ1Q7WUFDRCxDQUFDLEVBQUUsQ0FBQztTQUNQO1FBQ0QsT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUssQ0FBQyxLQUFLLENBQUM7SUFDckMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIGdldERlYnVnTm9kZSwgSW5qZWN0b3IsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5ndEluamVjdGVkUmVmIH0gZnJvbSAnLi4vZGkvcmVmJztcbmltcG9ydCB7IE5ndEFyZ3MgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2FyZ3MnO1xuaW1wb3J0IHsgTmd0Q29tbW9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9jb21tb24nO1xuaW1wb3J0IHsgTmd0UGFyZW50IH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9wYXJlbnQnO1xuaW1wb3J0IHsgTmd0U3RvcmUgfSBmcm9tICcuLi9zdG9yZXMvc3RvcmUnO1xuaW1wb3J0IHR5cGUgeyBOZ3RBbnlSZWNvcmQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBhcHBseVByb3BzIH0gZnJvbSAnLi4vdXRpbHMvYXBwbHktcHJvcHMnO1xuaW1wb3J0IHsgZ2V0TG9jYWxTdGF0ZSB9IGZyb20gJy4uL3V0aWxzL2luc3RhbmNlJztcbmltcG9ydCB7IGlzIH0gZnJvbSAnLi4vdXRpbHMvaXMnO1xuaW1wb3J0IHsgTmd0Q29tcG91bmRDbGFzc0lkLCBOZ3RRdWV1ZU9wQ2xhc3NJZCwgTmd0UmVuZGVyZXJDbGFzc0lkIH0gZnJvbSAnLi9lbnVtcyc7XG5pbXBvcnQgeyBhdHRhY2hUaHJlZUNoaWxkLCByZW1vdmVUaHJlZUNoaWxkLCBTUEVDSUFMX1BST1BFUlRJRVMgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IHR5cGUgTmd0UmVuZGVyZXJSb290U3RhdGUgPSB7XG4gICAgc3RvcmU6IE5ndFN0b3JlO1xuICAgIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWY7XG4gICAgY29tcG91bmRQcmVmaXhlczogc3RyaW5nW107XG4gICAgZG9jdW1lbnQ6IERvY3VtZW50O1xuICAgIHBvcnRhbHM6IEFycmF5PE5ndFJlbmRlcmVyTm9kZT47XG59O1xuXG5leHBvcnQgdHlwZSBOZ3RRdWV1ZU9wID0gW3R5cGU6ICdvcCcgfCAnY2xlYW5VcCcsIG9wOiAoKSA9PiB2b2lkLCBkb25lPzogdHJ1ZV07XG5cbmV4cG9ydCB0eXBlIE5ndFJlbmRlcmVyU3RhdGUgPSBbXG4gICAgdHlwZTogJ3RocmVlJyB8ICdjb21wb3VuZCcgfCAncG9ydGFsJyB8ICdjb21tZW50JyB8ICdkb20nLFxuICAgIHBhcmVudDogTmd0UmVuZGVyZXJOb2RlIHwgbnVsbCxcbiAgICBpbmplY3RlZFBhcmVudDogTmd0UmVuZGVyZXJOb2RlIHwgTmd0SW5qZWN0ZWRSZWY8Tmd0UmVuZGVyZXJOb2RlPiB8IG51bGwsXG4gICAgY2hpbGRyZW46IE5ndFJlbmRlcmVyTm9kZVtdLFxuICAgIGRlc3Ryb3llZDogYm9vbGVhbixcbiAgICBjb21wb3VuZDogW2FwcGx5Rmlyc3Q6IGJvb2xlYW4sIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XSxcbiAgICBjb21wb3VuZFBhcmVudDogTmd0UmVuZGVyZXJOb2RlLFxuICAgIGNvbXBvdW5kZWQ6IE5ndFJlbmRlcmVyTm9kZSxcbiAgICBxdWV1ZU9wczogU2V0PE5ndFF1ZXVlT3A+LFxuICAgIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICByYXdWYWx1ZTogYW55LFxuICAgIHJlZjogYW55LFxuICAgIHBvcnRhbENvbnRhaW5lcjogTmd0UmVuZGVyZXJOb2RlLFxuICAgIGluamVjdG9yRmFjdG9yeTogKCkgPT4gSW5qZWN0b3Jcbl07XG5cbmV4cG9ydCB0eXBlIE5ndFJlbmRlcmVyTm9kZSA9IHtcbiAgICBfX25ndF9yZW5kZXJlcl9fOiBOZ3RSZW5kZXJlclN0YXRlO1xufTtcblxuZXhwb3J0IGNsYXNzIE5ndFJlbmRlcmVyU3RvcmUge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbWVudHMgPSBbXSBhcyBBcnJheTxOZ3RSZW5kZXJlck5vZGU+O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSByb290OiBOZ3RSZW5kZXJlclJvb3RTdGF0ZSkge31cblxuICAgIGNyZWF0ZU5vZGUodHlwZTogTmd0UmVuZGVyZXJTdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0sIG5vZGU6IE5ndEFueVJlY29yZCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IFtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICB1bmRlZmluZWQhLFxuICAgICAgICAgICAgdW5kZWZpbmVkISxcbiAgICAgICAgICAgIHVuZGVmaW5lZCEsXG4gICAgICAgICAgICB1bmRlZmluZWQhLFxuICAgICAgICAgICAgdW5kZWZpbmVkISxcbiAgICAgICAgICAgIHVuZGVmaW5lZCEsXG4gICAgICAgICAgICB1bmRlZmluZWQhLFxuICAgICAgICAgICAgdW5kZWZpbmVkISxcbiAgICAgICAgICAgIHVuZGVmaW5lZCEsXG4gICAgICAgICAgICB1bmRlZmluZWQhLFxuICAgICAgICBdIGFzIE5ndFJlbmRlcmVyU3RhdGU7XG5cbiAgICAgICAgY29uc3QgcmVuZGVyZXJOb2RlID0gT2JqZWN0LmFzc2lnbihub2RlLCB7IF9fbmd0X3JlbmRlcmVyX186IHN0YXRlIH0pO1xuXG4gICAgICAgIC8vIGFzc2lnbiBvd25lckRvY3VtZW50IHRvIG5vZGUgc28gd2UgY2FuIHVzZSBIb3N0TGlzdGVuZXIgaW4gQ29tcG9uZW50XG4gICAgICAgIGlmICghcmVuZGVyZXJOb2RlWydvd25lckRvY3VtZW50J10pIHtcbiAgICAgICAgICAgIHJlbmRlcmVyTm9kZVsnb3duZXJEb2N1bWVudCddID0gdGhpcy5yb290LmRvY3VtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXNzaWduIGluamVjdG9yRmFjdG9yeSBvbiBub24tdGhyZWUgdHlwZSBzaW5jZVxuICAgICAgICAvLyByZW5kZXJlck5vZGUgaXMgYW4gaW5zdGFuY2Ugb2YgRE9NIE5vZGVcbiAgICAgICAgaWYgKHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSAhPT0gJ3RocmVlJykge1xuICAgICAgICAgICAgc3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0gPSAoKSA9PiBnZXREZWJ1Z05vZGUocmVuZGVyZXJOb2RlKSEuaW5qZWN0b3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tbWVudCcpIHtcbiAgICAgICAgICAgIC8vIHdlIGF0dGFjaCBhbiBhcnJvdyBmdW5jdGlvbiB0byB0aGUgQ29tbWVudCBub2RlXG4gICAgICAgICAgICAvLyBJbiBvdXIgZGlyZWN0aXZlcywgd2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0byB0aGVuIHN0YXJ0IHRyYWNraW5nIHRoZSBSZW5kZXJlck5vZGVcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgZG9uZSB0byBsaW1pdCB0aGUgYW1vdW50IG9mIE5vZGVzIHdlIG5lZWQgdG8gcHJvY2VzcyBmb3IgZ2V0Q3JlYXRpb25TdGF0ZVxuICAgICAgICAgICAgcmVuZGVyZXJOb2RlWydfX25ndF9yZW5kZXJlcl9hZGRfY29tbWVudF9fJ10gPSAocG9ydGFsTm9kZT86IE5ndFJlbmRlcmVyTm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwb3J0YWxOb2RlICYmIHBvcnRhbE5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdwb3J0YWwnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9ydGFscy5wdXNoKHBvcnRhbE5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tbWVudHMucHVzaChyZW5kZXJlck5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXJOb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJykge1xuICAgICAgICAgICAgc3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLnF1ZXVlT3BzXSA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC5hdHRyaWJ1dGVzXSA9IHt9O1xuICAgICAgICAgICAgc3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLnByb3BlcnRpZXNdID0ge307XG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXJOb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlbmRlcmVyTm9kZTtcbiAgICB9XG5cbiAgICBzZXRQYXJlbnQobm9kZTogTmd0UmVuZGVyZXJOb2RlLCBwYXJlbnQ6IE5ndFJlbmRlcmVyTm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XSkge1xuICAgICAgICAgICAgbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkQ2hpbGQobm9kZTogTmd0UmVuZGVyZXJOb2RlLCBjaGlsZDogTmd0UmVuZGVyZXJOb2RlKSB7XG4gICAgICAgIGlmICghbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0uaW5jbHVkZXMoY2hpbGQpKSB7XG4gICAgICAgICAgICBub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNoaWxkcmVuXS5wdXNoKGNoaWxkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZUNoaWxkKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgY2hpbGQ6IE5ndFJlbmRlcmVyTm9kZSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dLmZpbmRJbmRleCgoYykgPT4gY2hpbGQgPT09IGMpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldENvbXBvdW5kKGNvbXBvdW5kOiBOZ3RSZW5kZXJlck5vZGUsIGluc3RhbmNlOiBOZ3RSZW5kZXJlck5vZGUpIHtcbiAgICAgICAgY29uc3QgclMgPSBjb21wb3VuZC5fX25ndF9yZW5kZXJlcl9fO1xuICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0gPSBpbnN0YW5jZTtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC5rZXlzKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5hdHRyaWJ1dGVzXSk7XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhyU1tOZ3RSZW5kZXJlckNsYXNzSWQucHJvcGVydGllc10pO1xuXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlBdHRyaWJ1dGUoaW5zdGFuY2UsIGtleSwgclNbTmd0UmVuZGVyZXJDbGFzc0lkLmF0dHJpYnV0ZXNdW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlQcm9wZXJ0eShpbnN0YW5jZSwga2V5LCByU1tOZ3RSZW5kZXJlckNsYXNzSWQucHJvcGVydGllc11ba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV4ZWN1dGVPcGVyYXRpb24oY29tcG91bmQpO1xuICAgIH1cblxuICAgIHF1ZXVlT3BlcmF0aW9uKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgb3A6IE5ndFF1ZXVlT3ApIHtcbiAgICAgICAgbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10uYWRkKG9wKTtcbiAgICB9XG5cbiAgICBleGVjdXRlT3BlcmF0aW9uKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgdHlwZTogTmd0UXVldWVPcFtOZ3RRdWV1ZU9wQ2xhc3NJZC50eXBlXSA9ICdvcCcpIHtcbiAgICAgICAgY29uc3QgclMgPSBub2RlLl9fbmd0X3JlbmRlcmVyX187XG4gICAgICAgIGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdPy5zaXplKSB7XG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdLmZvckVhY2goKG9wKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wW05ndFF1ZXVlT3BDbGFzc0lkLnR5cGVdID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wW05ndFF1ZXVlT3BDbGFzc0lkLm9wXSgpO1xuICAgICAgICAgICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdLmRlbGV0ZShvcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9jZXNzUG9ydGFsQ29udGFpbmVyKHBvcnRhbDogTmd0UmVuZGVyZXJOb2RlKSB7XG4gICAgICAgIGNvbnN0IGluamVjdG9yRmFjdG9yeSA9IHBvcnRhbC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldO1xuICAgICAgICBjb25zdCBpbmplY3RvciA9IGluamVjdG9yRmFjdG9yeT8uKCk7XG4gICAgICAgIGlmICghaW5qZWN0b3IpIHJldHVybjtcblxuICAgICAgICBjb25zdCBwb3J0YWxTdG9yZSA9IGluamVjdG9yLmdldChOZ3RTdG9yZSwgbnVsbCk7XG4gICAgICAgIGlmICghcG9ydGFsU3RvcmUpIHJldHVybjtcblxuICAgICAgICBjb25zdCBwb3J0YWxDb250YWluZXIgPSBwb3J0YWxTdG9yZS5nZXQoJ3NjZW5lJyk7XG4gICAgICAgIGlmICghcG9ydGFsQ29udGFpbmVyKSByZXR1cm47XG5cbiAgICAgICAgcG9ydGFsLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBvcnRhbENvbnRhaW5lcl0gPSB0aGlzLmNyZWF0ZU5vZGUoJ3RocmVlJywgcG9ydGFsQ29udGFpbmVyKTtcbiAgICB9XG5cbiAgICBhcHBseUF0dHJpYnV0ZShub2RlOiBOZ3RSZW5kZXJlck5vZGUsIG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCByUyA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfXztcbiAgICAgICAgaWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5kZXN0cm95ZWRdKSByZXR1cm47XG4gICAgICAgIGlmIChuYW1lID09PSBTUEVDSUFMX1BST1BFUlRJRVMuUkVOREVSX1BSSU9SSVRZKSB7XG4gICAgICAgICAgICAvLyBwcmlvcml0eSBuZWVkcyB0byBiZSBzZXQgYXMgYW4gYXR0cmlidXRlIHN0cmluZyBzbyB0aGF0IHRoZXkgY2FuIGJlIHNldCBhcyBlYXJseSBhcyBwb3NzaWJsZVxuICAgICAgICAgICAgLy8gd2UgY29udmVydCB0aGF0IHN0cmluZyB0byBhIG51bWJlci4gaWYgaXQncyBpbnZhbGlkLCAwXG4gICAgICAgICAgICBsZXQgcHJpb3JpdHkgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgaWYgKGlzTmFOKHByaW9yaXR5KSkge1xuICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gMDtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFtOR1RdIFwicHJpb3JpdHlcIiBpcyBhbiBpbnZhbGlkIG51bWJlciwgZGVmYXVsdCB0byAwYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnZXRMb2NhbFN0YXRlKG5vZGUpLnByaW9yaXR5ID0gcHJpb3JpdHk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLkNPTVBPVU5EKSB7XG4gICAgICAgICAgICAvLyB3ZSBzZXQgdGhlIGNvbXBvdW5kIHByb3BlcnR5IG9uIGluc3RhbmNlIG5vZGUgbm93IHNvIHdlIGtub3cgdGhhdCB0aGlzIGluc3RhbmNlIGlzIGJlaW5nIGNvbXBvdW5kZWRcbiAgICAgICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZF0gPSBbdmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSAnZmlyc3QnLCB7fV07XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLkFUVEFDSCkge1xuICAgICAgICAgICAgLy8gaGFuZGxlIGF0dGFjaCBhcyB0cmluZ1xuICAgICAgICAgICAgY29uc3QgcGF0aHMgPSB2YWx1ZS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgaWYgKHBhdGhzLmxlbmd0aCkgZ2V0TG9jYWxTdGF0ZShub2RlKS5hdHRhY2ggPSBwYXRocztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuYW1lID09PSBTUEVDSUFMX1BST1BFUlRJRVMuVkFMVUUpIHtcbiAgICAgICAgICAgIC8vIGNvZXJjaW9uXG4gICAgICAgICAgICBsZXQgbWF5YmVDb2VyY2VkOiBhbnkgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChtYXliZUNvZXJjZWQgPT09ICcnIHx8IG1heWJlQ29lcmNlZCA9PT0gJ3RydWUnIHx8IG1heWJlQ29lcmNlZCA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgICAgIG1heWJlQ29lcmNlZCA9IG1heWJlQ29lcmNlZCA9PT0gJ3RydWUnIHx8IG1heWJlQ29lcmNlZCA9PT0gJyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc05hTihOdW1iZXIobWF5YmVDb2VyY2VkKSkpIHtcbiAgICAgICAgICAgICAgICBtYXliZUNvZXJjZWQgPSBOdW1iZXIobWF5YmVDb2VyY2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5yYXdWYWx1ZV0gPSBtYXliZUNvZXJjZWQ7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhcHBseVByb3BzKG5vZGUsIHsgW25hbWVdOiB2YWx1ZSB9KTtcbiAgICB9XG5cbiAgICBhcHBseVByb3BlcnR5KG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgbmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIGNvbnN0IHJTID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fO1xuICAgICAgICBpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHJldHVybjtcblxuICAgICAgICAvLyBbcmVmXVxuICAgICAgICBpZiAobmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLlJFRiAmJiBpcy5yZWYodmFsdWUpKSB7XG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQucmVmXSA9IHZhbHVlO1xuICAgICAgICAgICAgdmFsdWUubmF0aXZlRWxlbWVudCA9IG5vZGU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJlbnQgPSBnZXRMb2NhbFN0YXRlKG5vZGUpLnBhcmVudCB8fCByU1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XTtcblxuICAgICAgICAvLyBbcmF3VmFsdWVdXG4gICAgICAgIGlmIChnZXRMb2NhbFN0YXRlKG5vZGUpLmlzUmF3ICYmIG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5WQUxVRSkge1xuICAgICAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLnJhd1ZhbHVlXSA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHBhcmVudCkgYXR0YWNoVGhyZWVDaGlsZChwYXJlbnQsIG5vZGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gW2F0dGFjaF1cbiAgICAgICAgaWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5BVFRBQ0gpIHtcbiAgICAgICAgICAgIGdldExvY2FsU3RhdGUobm9kZSkuYXR0YWNoID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAoKHYpID0+IHYudG9TdHJpbmcoKSkgOiB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQpIGF0dGFjaFRocmVlQ2hpbGQocGFyZW50LCBub2RlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbXBvdW5kID0gclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29tcG91bmQ/LltOZ3RDb21wb3VuZENsYXNzSWQucHJvcHNdICYmXG4gICAgICAgICAgICBuYW1lIGluIGNvbXBvdW5kW05ndENvbXBvdW5kQ2xhc3NJZC5wcm9wc10gJiZcbiAgICAgICAgICAgICFjb21wb3VuZFtOZ3RDb21wb3VuZENsYXNzSWQuYXBwbHlGaXJzdF1cbiAgICAgICAgKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGNvbXBvdW5kW05ndENvbXBvdW5kQ2xhc3NJZC5wcm9wc11bbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgYXBwbHlQcm9wcyhub2RlLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgfVxuXG4gICAgaXNDb21wb3VuZChuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jb21wb3VuZFByZWZpeGVzLnNvbWUoKHByZWZpeCkgPT4gbmFtZS5zdGFydHNXaXRoKHByZWZpeCkpO1xuICAgIH1cblxuICAgIGlzRE9NKG5vZGU6IE5ndEFueVJlY29yZCkge1xuICAgICAgICBjb25zdCByUyA9IG5vZGVbJ19fbmd0X3JlbmRlcmVyX18nXTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICFyUyB8fFxuICAgICAgICAgICAgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSAhPT0gJ2NvbXBvdW5kJyAmJlxuICAgICAgICAgICAgICAgIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFdpbmRvdykpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0IHJvb3RTY2VuZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5zdG9yZS5nZXQoJ3NjZW5lJyk7XG4gICAgfVxuXG4gICAgZ2V0IHJvb3RDZHIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3QuY2RyO1xuICAgIH1cblxuICAgIGdldCBwb3J0YWxzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290LnBvcnRhbHM7XG4gICAgfVxuXG4gICAgZ2V0Q2xvc2VzdFBhcmVudFdpdGhJbnN0YW5jZShub2RlOiBOZ3RSZW5kZXJlck5vZGUpOiBOZ3RSZW5kZXJlck5vZGUgfCBudWxsIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XTtcbiAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gIT09ICd0aHJlZScpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdXG4gICAgICAgICAgICAgICAgPyBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucG9ydGFsQ29udGFpbmVyXVxuICAgICAgICAgICAgICAgIDogcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cblxuICAgIGdldENsb3Nlc3RQYXJlbnRXaXRoQ29tcG91bmQobm9kZTogTmd0UmVuZGVyZXJOb2RlKSB7XG4gICAgICAgIGlmIChub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcmVudCA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGFyZW50ICYmXG4gICAgICAgICAgICBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcgJiZcbiAgICAgICAgICAgICFwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF1cbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgcGFyZW50ICYmXG4gICAgICAgICAgICAocGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnIHx8XG4gICAgICAgICAgICAgICAgIXBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF0gfHxcbiAgICAgICAgICAgICAgICBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gIT09ICdjb21wb3VuZCcpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJyAmJlxuICAgICAgICAgICAgcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0pIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXRDcmVhdGlvblN0YXRlKCkge1xuICAgICAgICBjb25zdCBpbmplY3RlZEFyZ3MgPSB0aGlzLmZpcnN0Tm9uSW5qZWN0ZWREaXJlY3RpdmUoTmd0QXJncyk/LmFyZ3MgfHwgW107XG4gICAgICAgIGNvbnN0IGluamVjdGVkUGFyZW50ID0gdGhpcy5maXJzdE5vbkluamVjdGVkRGlyZWN0aXZlKE5ndFBhcmVudCk/LnBhcmVudCB8fCBudWxsO1xuICAgICAgICBjb25zdCBzdG9yZSA9IHRoaXMudHJ5R2V0UG9ydGFsU3RvcmUoKTtcbiAgICAgICAgcmV0dXJuIHsgaW5qZWN0ZWRBcmdzLCBpbmplY3RlZFBhcmVudCwgc3RvcmUgfTtcbiAgICB9XG5cbiAgICBkZXN0cm95KG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgcGFyZW50PzogTmd0UmVuZGVyZXJOb2RlKSB7XG4gICAgICAgIGNvbnN0IHJTID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fO1xuICAgICAgICBpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHJldHVybjtcbiAgICAgICAgaWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuICAgICAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kXSA9IHVuZGVmaW5lZCE7XG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdID0gdW5kZWZpbmVkITtcblxuICAgICAgICAgICAgY29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUobm9kZSk7XG4gICAgICAgICAgICBpZiAobG9jYWxTdGF0ZS5vYmplY3RzKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxTdGF0ZS5vYmplY3RzLnZhbHVlLmZvckVhY2goKG9iaikgPT4gdGhpcy5kZXN0cm95KG9iaiwgcGFyZW50KSk7XG4gICAgICAgICAgICAgICAgbG9jYWxTdGF0ZS5vYmplY3RzLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsb2NhbFN0YXRlLm5vbk9iamVjdHMpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0YXRlLm5vbk9iamVjdHMudmFsdWUuZm9yRWFjaCgob2JqKSA9PiB0aGlzLmRlc3Ryb3kob2JqLCBwYXJlbnQpKTtcbiAgICAgICAgICAgICAgICBsb2NhbFN0YXRlLm5vbk9iamVjdHMuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxvY2FsU3RhdGUuYWZ0ZXJVcGRhdGUpIGxvY2FsU3RhdGUuYWZ0ZXJVcGRhdGUuY29tcGxldGUoKTtcbiAgICAgICAgICAgIGlmIChsb2NhbFN0YXRlLmFmdGVyQXR0YWNoKSBsb2NhbFN0YXRlLmFmdGVyQXR0YWNoLmNvbXBsZXRlKCk7XG5cbiAgICAgICAgICAgIGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydvYmplY3RzJ107XG4gICAgICAgICAgICBkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnbm9uT2JqZWN0cyddO1xuICAgICAgICAgICAgZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ2FkZCddO1xuICAgICAgICAgICAgZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ3JlbW92ZSddO1xuICAgICAgICAgICAgZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ2FmdGVyVXBkYXRlJ107XG4gICAgICAgICAgICBkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnYWZ0ZXJBdHRhY2gnXTtcbiAgICAgICAgICAgIGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydzdG9yZSddO1xuICAgICAgICAgICAgZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ2hhbmRsZXJzJ107XG5cbiAgICAgICAgICAgIGlmICghbG9jYWxTdGF0ZS5wcmltaXRpdmUpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgKG5vZGUgYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfXyddO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbW1lbnQnKSB7XG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSA9IG51bGwhO1xuICAgICAgICAgICAgZGVsZXRlIChub2RlIGFzIE5ndEFueVJlY29yZClbJ19fbmd0X3JlbmRlcmVyX2FkZF9jb21tZW50X18nXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb21tZW50cy5maW5kSW5kZXgoKGNvbW1lbnQpID0+IGNvbW1lbnQgPT09IG5vZGUpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbW1lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAncG9ydGFsJykge1xuICAgICAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0gPSBudWxsITtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5wb3J0YWxzLmZpbmRJbmRleCgocG9ydGFsKSA9PiBwb3J0YWwgPT09IG5vZGUpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcnRhbHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcpIHtcbiAgICAgICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSA9IHVuZGVmaW5lZCE7XG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQuYXR0cmlidXRlc10gPSBudWxsITtcbiAgICAgICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wcm9wZXJ0aWVzXSA9IG51bGwhO1xuICAgICAgICAgICAgdGhpcy5leGVjdXRlT3BlcmF0aW9uKG5vZGUsICdjbGVhblVwJyk7XG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdLmNsZWFyKCk7XG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdID0gbnVsbCE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnJlZl0pIHtcbiAgICAgICAgICAgIC8vIG51bGxpZnkgcmVmXG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQucmVmXS5uYXRpdmVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5yZWZdID0gdW5kZWZpbmVkITtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG51bGxpZnkgcGFyZW50XG4gICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCByZW5kZXJDaGlsZCBvZiByU1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAocmVuZGVyQ2hpbGQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScgJiYgcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlVGhyZWVDaGlsZChwYXJlbnQsIHJlbmRlckNoaWxkLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGVzdHJveShyZW5kZXJDaGlsZCwgcGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0gPSBbXTtcbiAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0gPSB0cnVlO1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUNoaWxkKHBhcmVudCwgbm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZpcnN0Tm9uSW5qZWN0ZWREaXJlY3RpdmU8VCBleHRlbmRzIE5ndENvbW1vbkRpcmVjdGl2ZT4oZGlyOiBUeXBlPFQ+KSB7XG4gICAgICAgIGxldCBkaXJlY3RpdmU6IFQgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IGkgPSB0aGlzLmNvbW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlIChpID49IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmNvbW1lbnRzW2ldO1xuICAgICAgICAgICAgaWYgKGNvbW1lbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuZGVzdHJveWVkXSkge1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGluamVjdG9yID0gY29tbWVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldKCk7XG4gICAgICAgICAgICBpZiAoIWluamVjdG9yKSB7XG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBpbmplY3Rvci5nZXQoZGlyLCBudWxsKTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS52YWxpZGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aXZlID0gaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGktLTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cnlHZXRQb3J0YWxTdG9yZSgpIHtcbiAgICAgICAgbGV0IHN0b3JlOiBOZ3RTdG9yZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gd2Ugb25seSBjYXJlIGFib3V0IHRoZSBwb3J0YWwgc3RhdGVzIGJlY2F1c2UgTmd0U3RvcmUgb25seSBkaWZmZXJzIHBlciBQb3J0YWxcbiAgICAgICAgbGV0IGkgPSB0aGlzLnBvcnRhbHMubGVuZ3RoIC0gMTtcbiAgICAgICAgd2hpbGUgKGkgPj0gMCkge1xuICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIHRoZSBwb3J0YWwgc3RhdGUgYmFja3dhcmRzIHRvIGZpbmQgdGhlIGNsb3Nlc3QgTmd0U3RvcmVcbiAgICAgICAgICAgIGNvbnN0IHBvcnRhbCA9IHRoaXMucG9ydGFsc1tpXTtcbiAgICAgICAgICAgIGlmIChwb3J0YWwuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuZGVzdHJveWVkXSkge1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW5qZWN0b3IgPSBwb3J0YWwuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSgpO1xuICAgICAgICAgICAgaWYgKCFpbmplY3Rvcikge1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gaW5qZWN0b3IuZ2V0KE5ndFN0b3JlLCBudWxsKTtcbiAgICAgICAgICAgIC8vIG9ubHkgdGhlIGluc3RhbmNlIHdpdGggcHJldmlvdXNTdG9yZSBzaG91bGQgcGFzc1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLmdldCgncHJldmlvdXNTdG9yZScpKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUgPSBpbnN0YW5jZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGktLTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RvcmUgfHwgdGhpcy5yb290IS5zdG9yZTtcbiAgICB9XG59XG4iXX0=
|