angular-three 0.0.0-replace
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/esm2022/angular-three.mjs +5 -0
- package/esm2022/index.mjs +20 -0
- package/esm2022/lib/canvas.mjs +187 -0
- package/esm2022/lib/directives/args.mjs +35 -0
- package/esm2022/lib/directives/common.mjs +42 -0
- package/esm2022/lib/directives/parent.mjs +35 -0
- package/esm2022/lib/dom/events.mjs +73 -0
- package/esm2022/lib/events.mjs +362 -0
- package/esm2022/lib/instance.mjs +70 -0
- package/esm2022/lib/loader.mjs +64 -0
- package/esm2022/lib/loop.mjs +153 -0
- package/esm2022/lib/portal.mjs +208 -0
- package/esm2022/lib/ref.mjs +46 -0
- package/esm2022/lib/renderer/catalogue.mjs +7 -0
- package/esm2022/lib/renderer/constants.mjs +21 -0
- package/esm2022/lib/renderer/index.mjs +432 -0
- package/esm2022/lib/renderer/store.mjs +423 -0
- package/esm2022/lib/renderer/utils.mjs +201 -0
- package/esm2022/lib/roots.mjs +261 -0
- package/esm2022/lib/routed-scene.mjs +33 -0
- package/esm2022/lib/store.mjs +181 -0
- package/esm2022/lib/three-types.mjs +2 -0
- package/esm2022/lib/types.mjs +2 -0
- package/esm2022/lib/utils/apply-props.mjs +123 -0
- package/esm2022/lib/utils/attach.mjs +32 -0
- package/esm2022/lib/utils/before-render.mjs +12 -0
- package/esm2022/lib/utils/create-api-token.mjs +13 -0
- package/esm2022/lib/utils/inputs.mjs +18 -0
- package/esm2022/lib/utils/is.mjs +52 -0
- package/esm2022/lib/utils/make.mjs +53 -0
- package/esm2022/lib/utils/signal-store.mjs +101 -0
- package/esm2022/lib/utils/update.mjs +34 -0
- package/fesm2022/angular-three.mjs +3167 -0
- package/fesm2022/angular-three.mjs.map +1 -0
- package/index.d.ts +22 -0
- package/lib/canvas.d.ts +1170 -0
- package/lib/directives/args.d.ts +11 -0
- package/lib/directives/common.d.ts +26 -0
- package/lib/directives/parent.d.ts +13 -0
- package/lib/dom/events.d.ts +5 -0
- package/lib/events.d.ts +83 -0
- package/lib/instance.d.ts +46 -0
- package/lib/loader.d.ts +32 -0
- package/lib/loop.d.ts +68 -0
- package/lib/portal.d.ts +58 -0
- package/lib/ref.d.ts +7 -0
- package/lib/renderer/catalogue.d.ts +13 -0
- package/lib/renderer/constants.d.ts +20 -0
- package/lib/renderer/index.d.ts +56 -0
- package/lib/renderer/store.d.ts +64 -0
- package/lib/renderer/utils.d.ts +31 -0
- package/lib/roots.d.ts +12 -0
- package/lib/routed-scene.d.ts +10 -0
- package/lib/store.d.ts +141 -0
- package/lib/three-types.d.ts +302 -0
- package/lib/types.d.ts +12 -0
- package/lib/utils/apply-props.d.ts +3 -0
- package/lib/utils/attach.d.ts +11 -0
- package/lib/utils/before-render.d.ts +6 -0
- package/lib/utils/create-api-token.d.ts +23 -0
- package/lib/utils/inputs.d.ts +5 -0
- package/lib/utils/is.d.ts +23 -0
- package/lib/utils/make.d.ts +19 -0
- package/lib/utils/signal-store.d.ts +30 -0
- package/lib/utils/update.d.ts +4 -0
- package/metadata.json +1 -0
- package/package.json +73 -0
- package/plugin/README.md +11 -0
- package/plugin/generators.json +17 -0
- package/plugin/src/generators/init/compat.d.ts +2 -0
- package/plugin/src/generators/init/compat.js +6 -0
- package/plugin/src/generators/init/compat.js.map +1 -0
- package/plugin/src/generators/init/files/experience/experience.component.html__tmpl__ +4 -0
- package/plugin/src/generators/init/files/experience/experience.component.ts__tmpl__ +18 -0
- package/plugin/src/generators/init/generator.d.ts +3 -0
- package/plugin/src/generators/init/generator.js +143 -0
- package/plugin/src/generators/init/generator.js.map +1 -0
- package/plugin/src/generators/init/schema.json +6 -0
- package/plugin/src/generators/utils.d.ts +2 -0
- package/plugin/src/generators/utils.js +34 -0
- package/plugin/src/generators/utils.js.map +1 -0
- package/plugin/src/generators/version.d.ts +14 -0
- package/plugin/src/generators/version.js +18 -0
- package/plugin/src/generators/version.js.map +1 -0
- package/plugin/src/index.d.ts +0 -0
- package/plugin/src/index.js +1 -0
- package/plugin/src/index.js.map +1 -0
- package/web-types.json +1 -0
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
import { InjectionToken, Injector, Type, getDebugNode } from '@angular/core';
|
|
2
|
+
import { NgtArgs } from '../directives/args';
|
|
3
|
+
import { NgtParent } from '../directives/parent';
|
|
4
|
+
import { getLocalState } from '../instance';
|
|
5
|
+
import { NGT_STORE } from '../store';
|
|
6
|
+
import { applyProps } from '../utils/apply-props';
|
|
7
|
+
import { is } from '../utils/is';
|
|
8
|
+
import { SPECIAL_INTERNAL_ADD_COMMENT, SPECIAL_PROPERTIES } from './constants';
|
|
9
|
+
import { NgtCompoundClassId, NgtQueueOpClassId, NgtRendererClassId, attachThreeChild, removeThreeChild } from './utils';
|
|
10
|
+
export const NGT_COMPOUND_PREFIXES = new InjectionToken('NgtCompoundPrefixes');
|
|
11
|
+
export class NgtRendererStore {
|
|
12
|
+
constructor(rootState) {
|
|
13
|
+
this.rootState = rootState;
|
|
14
|
+
this.argsCommentNodes = [];
|
|
15
|
+
this.parentCommentNodes = [];
|
|
16
|
+
this.portalCommentsNodes = [];
|
|
17
|
+
}
|
|
18
|
+
createNode(type, node) {
|
|
19
|
+
const state = [
|
|
20
|
+
type,
|
|
21
|
+
null,
|
|
22
|
+
null,
|
|
23
|
+
[],
|
|
24
|
+
false,
|
|
25
|
+
undefined,
|
|
26
|
+
undefined,
|
|
27
|
+
undefined,
|
|
28
|
+
undefined,
|
|
29
|
+
undefined,
|
|
30
|
+
undefined,
|
|
31
|
+
undefined,
|
|
32
|
+
undefined,
|
|
33
|
+
undefined,
|
|
34
|
+
undefined,
|
|
35
|
+
];
|
|
36
|
+
const rendererNode = Object.assign(node, { __ngt_renderer__: state });
|
|
37
|
+
// NOTE: assign ownerDocument to node so we can use HostListener in Component
|
|
38
|
+
if (!rendererNode['ownerDocument'])
|
|
39
|
+
rendererNode['ownerDocument'] = this.rootState.document;
|
|
40
|
+
// NOTE: assign injectorFactory on non-three type since
|
|
41
|
+
// rendererNode is an instance of DOM Node
|
|
42
|
+
if (state[NgtRendererClassId.type] !== 'three') {
|
|
43
|
+
state[NgtRendererClassId.injectorFactory] = () => getDebugNode(rendererNode)?.injector;
|
|
44
|
+
}
|
|
45
|
+
if (state[NgtRendererClassId.type] === 'comment') {
|
|
46
|
+
// NOTE: we attach an arrow function to the Comment node
|
|
47
|
+
// In our directives, we can call this function to then start tracking the RendererNode
|
|
48
|
+
// this is done to limit the amount of Nodes we need to process for getCreationState
|
|
49
|
+
rendererNode[SPECIAL_INTERNAL_ADD_COMMENT] = (node) => {
|
|
50
|
+
if (node === 'args') {
|
|
51
|
+
this.argsCommentNodes.push(rendererNode);
|
|
52
|
+
}
|
|
53
|
+
else if (node === 'parent') {
|
|
54
|
+
this.parentCommentNodes.push(rendererNode);
|
|
55
|
+
}
|
|
56
|
+
else if (typeof node === 'object') {
|
|
57
|
+
this.portalCommentsNodes.push(node);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
return rendererNode;
|
|
61
|
+
}
|
|
62
|
+
if (state[NgtRendererClassId.type] === 'compound') {
|
|
63
|
+
state[NgtRendererClassId.queueOps] = new Set();
|
|
64
|
+
state[NgtRendererClassId.attributes] = state[NgtRendererClassId.properties] = {};
|
|
65
|
+
return rendererNode;
|
|
66
|
+
}
|
|
67
|
+
return rendererNode;
|
|
68
|
+
}
|
|
69
|
+
isCompound(name) {
|
|
70
|
+
return this.rootState.compoundPrefixes.some((prefix) => name.startsWith(prefix));
|
|
71
|
+
}
|
|
72
|
+
isDOM(node) {
|
|
73
|
+
const rS = node['__ngt_renderer__'];
|
|
74
|
+
return (!rS ||
|
|
75
|
+
(rS[NgtRendererClassId.type] !== 'compound' &&
|
|
76
|
+
(node instanceof Element || node instanceof Document || node instanceof Window)));
|
|
77
|
+
}
|
|
78
|
+
getClosestParentWithInstance(node) {
|
|
79
|
+
let parent = node.__ngt_renderer__[NgtRendererClassId.parent];
|
|
80
|
+
while (parent && parent.__ngt_renderer__[NgtRendererClassId.type] !== 'three') {
|
|
81
|
+
parent = parent.__ngt_renderer__[NgtRendererClassId.portalContainer]
|
|
82
|
+
? parent.__ngt_renderer__[NgtRendererClassId.portalContainer]
|
|
83
|
+
: parent.__ngt_renderer__[NgtRendererClassId.parent];
|
|
84
|
+
}
|
|
85
|
+
return parent;
|
|
86
|
+
}
|
|
87
|
+
getClosestParentWithCompound(node) {
|
|
88
|
+
if (node.__ngt_renderer__[NgtRendererClassId.compoundParent]) {
|
|
89
|
+
return node.__ngt_renderer__[NgtRendererClassId.compoundParent];
|
|
90
|
+
}
|
|
91
|
+
let parent = node.__ngt_renderer__[NgtRendererClassId.parent];
|
|
92
|
+
if (parent &&
|
|
93
|
+
parent.__ngt_renderer__[NgtRendererClassId.type] === 'compound' &&
|
|
94
|
+
!parent.__ngt_renderer__[NgtRendererClassId.compounded]) {
|
|
95
|
+
return parent;
|
|
96
|
+
}
|
|
97
|
+
while (parent &&
|
|
98
|
+
(parent.__ngt_renderer__[NgtRendererClassId.type] === 'three' ||
|
|
99
|
+
!parent.__ngt_renderer__[NgtRendererClassId.compoundParent] ||
|
|
100
|
+
parent.__ngt_renderer__[NgtRendererClassId.type] !== 'compound')) {
|
|
101
|
+
parent = parent.__ngt_renderer__[NgtRendererClassId.parent];
|
|
102
|
+
}
|
|
103
|
+
if (!parent)
|
|
104
|
+
return null;
|
|
105
|
+
if (parent.__ngt_renderer__[NgtRendererClassId.type] === 'three' &&
|
|
106
|
+
parent.__ngt_renderer__[NgtRendererClassId.compoundParent]) {
|
|
107
|
+
return parent.__ngt_renderer__[NgtRendererClassId.compoundParent];
|
|
108
|
+
}
|
|
109
|
+
if (!parent.__ngt_renderer__[NgtRendererClassId.compounded]) {
|
|
110
|
+
return parent;
|
|
111
|
+
}
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
processPortalContainer(portal) {
|
|
115
|
+
const injector = portal.__ngt_renderer__[NgtRendererClassId.injectorFactory]?.();
|
|
116
|
+
if (!injector)
|
|
117
|
+
return;
|
|
118
|
+
const portalStore = injector.get(NGT_STORE, null);
|
|
119
|
+
if (!portalStore)
|
|
120
|
+
return;
|
|
121
|
+
const portalContainer = portalStore.get('scene');
|
|
122
|
+
if (!portalContainer)
|
|
123
|
+
return;
|
|
124
|
+
portal.__ngt_renderer__[NgtRendererClassId.portalContainer] = this.createNode('three', portalContainer);
|
|
125
|
+
}
|
|
126
|
+
getCreationState() {
|
|
127
|
+
return [
|
|
128
|
+
this.firstNonInjectedDirective('argsCommentNodes', NgtArgs)?.value || [],
|
|
129
|
+
this.firstNonInjectedDirective('parentCommentNodes', NgtParent)?.value || null,
|
|
130
|
+
this.tryGetPortalStore(),
|
|
131
|
+
];
|
|
132
|
+
}
|
|
133
|
+
setParent(node, parent) {
|
|
134
|
+
if (!node.__ngt_renderer__[NgtRendererClassId.parent]) {
|
|
135
|
+
node.__ngt_renderer__[NgtRendererClassId.parent] = parent;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
addChild(node, child) {
|
|
139
|
+
if (!node.__ngt_renderer__[NgtRendererClassId.children].includes(child)) {
|
|
140
|
+
node.__ngt_renderer__[NgtRendererClassId.children].push(child);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
removeChild(node, child) {
|
|
144
|
+
const index = node.__ngt_renderer__?.[NgtRendererClassId.children].findIndex((c) => child === c);
|
|
145
|
+
if (index >= 0) {
|
|
146
|
+
node.__ngt_renderer__[NgtRendererClassId.children].splice(index, 1);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
setCompound(compound, instance) {
|
|
150
|
+
const instanceRS = instance.__ngt_renderer__;
|
|
151
|
+
if (instanceRS && instanceRS[NgtRendererClassId.parent]) {
|
|
152
|
+
const parentRS = instanceRS[NgtRendererClassId.parent].__ngt_renderer__;
|
|
153
|
+
// NOTE: if instance is already compounded by its parent. skip
|
|
154
|
+
if (parentRS[NgtRendererClassId.type] === 'compound' && parentRS[NgtRendererClassId.compounded] === instance) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const rS = compound.__ngt_renderer__;
|
|
159
|
+
rS[NgtRendererClassId.compounded] = instance;
|
|
160
|
+
for (const key of Object.keys(rS[NgtRendererClassId.attributes])) {
|
|
161
|
+
this.applyAttribute(instance, key, rS[NgtRendererClassId.attributes][key]);
|
|
162
|
+
}
|
|
163
|
+
for (const key of Object.keys(rS[NgtRendererClassId.properties])) {
|
|
164
|
+
this.applyProperty(instance, key, rS[NgtRendererClassId.properties][key]);
|
|
165
|
+
}
|
|
166
|
+
this.executeOperation(compound);
|
|
167
|
+
}
|
|
168
|
+
queueOperation(node, op) {
|
|
169
|
+
node.__ngt_renderer__[NgtRendererClassId.queueOps].add(op);
|
|
170
|
+
}
|
|
171
|
+
executeOperation(node, type = 'op') {
|
|
172
|
+
const rS = node.__ngt_renderer__;
|
|
173
|
+
// TODO: maybe an array with pop() would work better
|
|
174
|
+
if (rS[NgtRendererClassId.queueOps]?.size) {
|
|
175
|
+
rS[NgtRendererClassId.queueOps].forEach((op) => {
|
|
176
|
+
if (op[NgtQueueOpClassId.type] === type) {
|
|
177
|
+
op[NgtQueueOpClassId.op]();
|
|
178
|
+
rS[NgtRendererClassId.queueOps].delete(op);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
applyAttribute(node, name, value) {
|
|
184
|
+
const rS = node.__ngt_renderer__;
|
|
185
|
+
if (rS[NgtRendererClassId.destroyed])
|
|
186
|
+
return;
|
|
187
|
+
if (name === SPECIAL_PROPERTIES.RENDER_PRIORITY) {
|
|
188
|
+
// NOTE: priority needs to be set as an attribute string so that they can be set as early as possible
|
|
189
|
+
// we convert that string to a number. if it's invalid, default 0
|
|
190
|
+
let priority = Number(value);
|
|
191
|
+
if (isNaN(priority)) {
|
|
192
|
+
priority = 0;
|
|
193
|
+
console.warn(`[NGT] "priority" is an invalid number, default to 0`);
|
|
194
|
+
}
|
|
195
|
+
const localState = getLocalState(node);
|
|
196
|
+
if (localState) {
|
|
197
|
+
localState.priority = priority;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (name === SPECIAL_PROPERTIES.COMPOUND) {
|
|
201
|
+
// NOTE: we set the compound property on instance node now so we know that this instance is being compounded
|
|
202
|
+
rS[NgtRendererClassId.compound] = [value === '' || value === 'first', {}];
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (name === SPECIAL_PROPERTIES.ATTACH) {
|
|
206
|
+
// NOTE: handle attach as tring
|
|
207
|
+
const paths = value.split('.');
|
|
208
|
+
if (paths.length) {
|
|
209
|
+
const localState = getLocalState(node);
|
|
210
|
+
if (localState) {
|
|
211
|
+
localState.attach = paths;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
// NOTE: coercion
|
|
217
|
+
let maybeCoerced = value;
|
|
218
|
+
if (maybeCoerced === '' || maybeCoerced === 'true' || maybeCoerced === 'false') {
|
|
219
|
+
maybeCoerced = maybeCoerced === 'true' || maybeCoerced === '';
|
|
220
|
+
}
|
|
221
|
+
else if (!isNaN(Number(maybeCoerced))) {
|
|
222
|
+
maybeCoerced = Number(maybeCoerced);
|
|
223
|
+
}
|
|
224
|
+
if (name === SPECIAL_PROPERTIES.RAW_VALUE) {
|
|
225
|
+
rS[NgtRendererClassId.rawValue] = maybeCoerced;
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
applyProps(node, { [name]: maybeCoerced });
|
|
229
|
+
this.updateNativeProps(node, name, maybeCoerced);
|
|
230
|
+
}
|
|
231
|
+
applyProperty(node, name, value) {
|
|
232
|
+
const rS = node.__ngt_renderer__;
|
|
233
|
+
if (rS[NgtRendererClassId.destroyed])
|
|
234
|
+
return;
|
|
235
|
+
// [ref]
|
|
236
|
+
if (name === SPECIAL_PROPERTIES.REF && is.ref(value)) {
|
|
237
|
+
rS[NgtRendererClassId.ref] = value;
|
|
238
|
+
value.nativeElement = node;
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
const localState = getLocalState(node);
|
|
242
|
+
const parent = localState?.instanceStore.get('parent') || rS[NgtRendererClassId.parent];
|
|
243
|
+
// [rawValue]
|
|
244
|
+
if (localState?.isRaw && name === SPECIAL_PROPERTIES.RAW_VALUE) {
|
|
245
|
+
rS[NgtRendererClassId.rawValue] = value;
|
|
246
|
+
if (parent)
|
|
247
|
+
attachThreeChild(parent, node);
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
// [attach]
|
|
251
|
+
if (name === SPECIAL_PROPERTIES.ATTACH) {
|
|
252
|
+
if (localState)
|
|
253
|
+
localState.attach = Array.isArray(value) ? value.map((v) => v.toString()) : value;
|
|
254
|
+
if (parent)
|
|
255
|
+
attachThreeChild(parent, node);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
const compound = rS[NgtRendererClassId.compound];
|
|
259
|
+
if (compound?.[NgtCompoundClassId.props] &&
|
|
260
|
+
name in compound[NgtCompoundClassId.props] &&
|
|
261
|
+
!compound[NgtCompoundClassId.applyFirst]) {
|
|
262
|
+
value = compound[NgtCompoundClassId.props][name];
|
|
263
|
+
}
|
|
264
|
+
applyProps(node, { [name]: value });
|
|
265
|
+
// NOTE: special case for Geometry and Material
|
|
266
|
+
if (value && (name === 'geometry' || name === 'material')) {
|
|
267
|
+
const childLS = getLocalState(value);
|
|
268
|
+
childLS?.setParent(node);
|
|
269
|
+
localState?.add(value, 'nonObjects');
|
|
270
|
+
}
|
|
271
|
+
this.updateNativeProps(node, name, value);
|
|
272
|
+
}
|
|
273
|
+
get rootScene() {
|
|
274
|
+
return this.rootState.store.get('scene');
|
|
275
|
+
}
|
|
276
|
+
destroy(node, parent) {
|
|
277
|
+
const rS = node.__ngt_renderer__;
|
|
278
|
+
if (!rS || rS[NgtRendererClassId.destroyed])
|
|
279
|
+
return;
|
|
280
|
+
if (rS[NgtRendererClassId.type] === 'three') {
|
|
281
|
+
rS[NgtRendererClassId.compound] = undefined;
|
|
282
|
+
rS[NgtRendererClassId.compoundParent] = undefined;
|
|
283
|
+
const localState = getLocalState(node);
|
|
284
|
+
if (localState?.instanceStore) {
|
|
285
|
+
localState.instanceStore.get('objects').forEach((obj) => this.destroy(obj, parent));
|
|
286
|
+
localState.instanceStore.get('nonObjects').forEach((obj) => this.destroy(obj, parent));
|
|
287
|
+
}
|
|
288
|
+
if (localState?.afterUpdate)
|
|
289
|
+
localState.afterUpdate.complete();
|
|
290
|
+
if (localState?.afterAttach)
|
|
291
|
+
localState.afterAttach.complete();
|
|
292
|
+
delete localState['objects'];
|
|
293
|
+
delete localState['nonObjects'];
|
|
294
|
+
delete localState['parent'];
|
|
295
|
+
delete localState['nativeProps'];
|
|
296
|
+
delete localState['add'];
|
|
297
|
+
delete localState['remove'];
|
|
298
|
+
delete localState['afterUpdate'];
|
|
299
|
+
delete localState['afterAttach'];
|
|
300
|
+
delete localState['store'];
|
|
301
|
+
delete localState['handlers'];
|
|
302
|
+
if (!localState?.primitive) {
|
|
303
|
+
delete node['__ngt__'];
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
if (rS[NgtRendererClassId.type] === 'comment') {
|
|
307
|
+
rS[NgtRendererClassId.injectorFactory] = null;
|
|
308
|
+
delete node[SPECIAL_INTERNAL_ADD_COMMENT];
|
|
309
|
+
if (!this.removeCommentNode(node, this.argsCommentNodes)) {
|
|
310
|
+
this.removeCommentNode(node, this.parentCommentNodes);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
if (rS[NgtRendererClassId.type] === 'portal') {
|
|
314
|
+
rS[NgtRendererClassId.injectorFactory] = null;
|
|
315
|
+
this.removeCommentNode(node, this.portalCommentsNodes);
|
|
316
|
+
}
|
|
317
|
+
if (rS[NgtRendererClassId.type] === 'compound') {
|
|
318
|
+
rS[NgtRendererClassId.compounded] = undefined;
|
|
319
|
+
rS[NgtRendererClassId.attributes] = null;
|
|
320
|
+
rS[NgtRendererClassId.properties] = null;
|
|
321
|
+
this.executeOperation(node, 'cleanUp');
|
|
322
|
+
rS[NgtRendererClassId.queueOps].clear();
|
|
323
|
+
rS[NgtRendererClassId.queueOps] = null;
|
|
324
|
+
}
|
|
325
|
+
if (rS[NgtRendererClassId.ref]) {
|
|
326
|
+
// nullify ref
|
|
327
|
+
// but we do it later so that it doesn't hinder render
|
|
328
|
+
// TODO: will this cause memory leak?
|
|
329
|
+
requestAnimationFrame(() => {
|
|
330
|
+
rS[NgtRendererClassId.ref].nativeElement = null;
|
|
331
|
+
rS[NgtRendererClassId.ref] = undefined;
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
// nullify parent
|
|
335
|
+
rS[NgtRendererClassId.parent] = null;
|
|
336
|
+
for (const renderChild of rS[NgtRendererClassId.children] || []) {
|
|
337
|
+
if (renderChild.__ngt_renderer__?.[NgtRendererClassId.type] === 'three' && parent) {
|
|
338
|
+
const closestInstance = this.getClosestParentWithInstance(parent);
|
|
339
|
+
if (closestInstance) {
|
|
340
|
+
removeThreeChild(closestInstance, renderChild, true);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
this.destroy(renderChild, parent);
|
|
344
|
+
}
|
|
345
|
+
rS[NgtRendererClassId.children] = [];
|
|
346
|
+
rS[NgtRendererClassId.destroyed] = true;
|
|
347
|
+
if (parent) {
|
|
348
|
+
this.removeChild(parent, node);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
removeCommentNode(node, nodes) {
|
|
352
|
+
const index = nodes.findIndex((comment) => comment === node);
|
|
353
|
+
if (index > -1) {
|
|
354
|
+
nodes.splice(index, 1);
|
|
355
|
+
return true;
|
|
356
|
+
}
|
|
357
|
+
return false;
|
|
358
|
+
}
|
|
359
|
+
updateNativeProps(node, key, value) {
|
|
360
|
+
const localState = getLocalState(node);
|
|
361
|
+
localState?.setNativeProps(key, value);
|
|
362
|
+
}
|
|
363
|
+
firstNonInjectedDirective(listProperty, dir) {
|
|
364
|
+
let directive;
|
|
365
|
+
const destroyed = [];
|
|
366
|
+
let i = this[listProperty].length - 1;
|
|
367
|
+
while (i >= 0) {
|
|
368
|
+
const comment = this[listProperty][i];
|
|
369
|
+
if (comment.__ngt_renderer__[NgtRendererClassId.destroyed]) {
|
|
370
|
+
destroyed.push(i);
|
|
371
|
+
i--;
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
const injector = comment.__ngt_renderer__[NgtRendererClassId.injectorFactory]();
|
|
375
|
+
if (!injector) {
|
|
376
|
+
i--;
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
const instance = injector.get(dir, null);
|
|
380
|
+
if (instance && instance.validate()) {
|
|
381
|
+
directive = instance;
|
|
382
|
+
break;
|
|
383
|
+
}
|
|
384
|
+
i--;
|
|
385
|
+
}
|
|
386
|
+
destroyed.forEach((index) => {
|
|
387
|
+
this[listProperty].splice(index, 1);
|
|
388
|
+
});
|
|
389
|
+
return directive;
|
|
390
|
+
}
|
|
391
|
+
tryGetPortalStore() {
|
|
392
|
+
let store;
|
|
393
|
+
const destroyed = [];
|
|
394
|
+
// we only care about the portal states because NgtStore only differs per Portal
|
|
395
|
+
let i = this.portalCommentsNodes.length - 1;
|
|
396
|
+
while (i >= 0) {
|
|
397
|
+
// loop through the portal state backwards to find the closest NgtStore
|
|
398
|
+
const portal = this.portalCommentsNodes[i];
|
|
399
|
+
if (portal.__ngt_renderer__[NgtRendererClassId.destroyed]) {
|
|
400
|
+
destroyed.push(i);
|
|
401
|
+
i--;
|
|
402
|
+
continue;
|
|
403
|
+
}
|
|
404
|
+
const injector = portal.__ngt_renderer__[NgtRendererClassId.injectorFactory]();
|
|
405
|
+
if (!injector) {
|
|
406
|
+
i--;
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
const instance = injector.get(NGT_STORE, null);
|
|
410
|
+
// only the instance with previousRoot should pass
|
|
411
|
+
if (instance && instance.get('previousRoot')) {
|
|
412
|
+
store = instance;
|
|
413
|
+
break;
|
|
414
|
+
}
|
|
415
|
+
i--;
|
|
416
|
+
}
|
|
417
|
+
destroyed.forEach((index) => {
|
|
418
|
+
this.portalCommentsNodes.splice(index, 1);
|
|
419
|
+
});
|
|
420
|
+
return store || this.rootState.store;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9yZW5kZXJlci9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBd0IsTUFBTSxhQUFhLENBQUM7QUFFbEUsT0FBTyxFQUFFLFNBQVMsRUFBaUIsTUFBTSxVQUFVLENBQUM7QUFFcEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFakMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUV4SCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLGNBQWMsQ0FBVyxxQkFBcUIsQ0FBQyxDQUFDO0FBZ0N6RixNQUFNLE9BQU8sZ0JBQWdCO0lBSzVCLFlBQW9CLFNBQStCO1FBQS9CLGNBQVMsR0FBVCxTQUFTLENBQXNCO1FBSjNDLHFCQUFnQixHQUEyQixFQUFFLENBQUM7UUFDOUMsdUJBQWtCLEdBQTJCLEVBQUUsQ0FBQztRQUNoRCx3QkFBbUIsR0FBMkIsRUFBRSxDQUFDO0lBRUgsQ0FBQztJQUV2RCxVQUFVLENBQUMsSUFBK0MsRUFBRSxJQUFrQjtRQUM3RSxNQUFNLEtBQUssR0FBRztZQUNiLElB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LFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMvQyxrREFBa0Q7WUFDbEQsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUM5QyxLQUFLLEdBQUcsUUFBUSxDQUFDO2dCQUNqQixNQUFNO1lBQ1AsQ0FBQztZQUNELENBQUMsRUFBRSxDQUFDO1FBQ0wsQ0FBQztRQUVELFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMzQixJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO0lBQ3RDLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuLCBJbmplY3RvciwgVHlwZSwgZ2V0RGVidWdOb2RlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ3RBcmdzIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9hcmdzJztcbmltcG9ydCB0eXBlIHsgTmd0Q29tbW9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9jb21tb24nO1xuaW1wb3J0IHsgTmd0UGFyZW50IH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9wYXJlbnQnO1xuaW1wb3J0IHsgZ2V0TG9jYWxTdGF0ZSwgdHlwZSBOZ3RJbnN0YW5jZU5vZGUgfSBmcm9tICcuLi9pbnN0YW5jZSc7XG5pbXBvcnQgdHlwZSB7IE5ndFJlZiB9IGZyb20gJy4uL3JlZic7XG5pbXBvcnQgeyBOR1RfU1RPUkUsIHR5cGUgTmd0U3RhdGUgfSBmcm9tICcuLi9zdG9yZSc7XG5pbXBvcnQgdHlwZSB7IE5ndEFueVJlY29yZCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGFwcGx5UHJvcHMgfSBmcm9tICcuLi91dGlscy9hcHBseS1wcm9wcyc7XG5pbXBvcnQgeyBpcyB9IGZyb20gJy4uL3V0aWxzL2lzJztcbmltcG9ydCB0eXBlIHsgTmd0U2lnbmFsU3RvcmUgfSBmcm9tICcuLi91dGlscy9zaWduYWwtc3RvcmUnO1xuaW1wb3J0IHsgU1BFQ0lBTF9JTlRFUk5BTF9BRERfQ09NTUVOVCwgU1BFQ0lBTF9QUk9QRVJUSUVTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgTmd0Q29tcG91bmRDbGFzc0lkLCBOZ3RRdWV1ZU9wQ2xhc3NJZCwgTmd0UmVuZGVyZXJDbGFzc0lkLCBhdHRhY2hUaHJlZUNoaWxkLCByZW1vdmVUaHJlZUNoaWxkIH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBOR1RfQ09NUE9VTkRfUFJFRklYRVMgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nW10+KCdOZ3RDb21wb3VuZFByZWZpeGVzJyk7XG5cbnR5cGUgTmd0UXVldWVPcCA9IFt0eXBlOiAnb3AnIHwgJ2NsZWFuVXAnLCBvcDogKCkgPT4gdm9pZCwgZG9uZT86IHRydWVdO1xuXG5leHBvcnQgdHlwZSBOZ3RSZW5kZXJlclN0YXRlID0gW1xuXHR0eXBlOiAndGhyZWUnIHwgJ2NvbXBvdW5kJyB8ICdwb3J0YWwnIHwgJ2NvbW1lbnQnIHwgJ2RvbScsXG5cdHBhcmVudDogTmd0UmVuZGVyZXJOb2RlIHwgbnVsbCxcblx0aW5qZWN0ZWRQYXJlbnQ6IE5ndFJlZjxOZ3RSZW5kZXJlck5vZGU+IHwgbnVsbCxcblx0Y2hpbGRyZW46IE5ndFJlbmRlcmVyTm9kZVtdLFxuXHRkZXN0cm95ZWQ6IGJvb2xlYW4sXG5cdGNvbXBvdW5kOiBbYXBwbHlGaXJzdDogYm9vbGVhbiwgcHJvcHM6IE5ndEFueVJlY29yZF0sXG5cdGNvbXBvdW5kUGFyZW50OiBOZ3RSZW5kZXJlck5vZGUsXG5cdGNvbXBvdW5kZWQ6IE5ndFJlbmRlcmVyTm9kZSxcblx0cXVldWVPcHM6IFNldDxOZ3RRdWV1ZU9wPixcblx0YXR0cmlidXRlczogTmd0QW55UmVjb3JkLFxuXHRwcm9wZXJ0aWVzOiBOZ3RBbnlSZWNvcmQsXG5cdHJhd1ZhbHVlOiBhbnksXG5cdHJlZjogYW55LFxuXHRwb3J0YWxDb250YWluZXI6IE5ndFJlbmRlcmVyTm9kZSxcblx0aW5qZWN0b3JGYWN0b3J5OiAoKSA9PiBJbmplY3RvciB8IHVuZGVmaW5lZCxcbl07XG5cbmV4cG9ydCB0eXBlIE5ndFJlbmRlcmVyTm9kZSA9IHtcblx0X19uZ3RfcmVuZGVyZXJfXzogTmd0UmVuZGVyZXJTdGF0ZTtcbn07XG5cbnR5cGUgTmd0UmVuZGVyZXJSb290U3RhdGUgPSB7XG5cdHN0b3JlOiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT47XG5cdGNvbXBvdW5kUHJlZml4ZXM6IHN0cmluZ1tdO1xuXHRkb2N1bWVudDogRG9jdW1lbnQ7XG59O1xuXG5leHBvcnQgY2xhc3MgTmd0UmVuZGVyZXJTdG9yZSB7XG5cdHByaXZhdGUgYXJnc0NvbW1lbnROb2RlczogQXJyYXk8Tmd0UmVuZGVyZXJOb2RlPiA9IFtdO1xuXHRwcml2YXRlIHBhcmVudENvbW1lbnROb2RlczogQXJyYXk8Tmd0UmVuZGVyZXJOb2RlPiA9IFtdO1xuXHRwcml2YXRlIHBvcnRhbENvbW1lbnRzTm9kZXM6IEFycmF5PE5ndFJlbmRlcmVyTm9kZT4gPSBbXTtcblxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIHJvb3RTdGF0ZTogTmd0UmVuZGVyZXJSb290U3RhdGUpIHt9XG5cblx0Y3JlYXRlTm9kZSh0eXBlOiBOZ3RSZW5kZXJlclN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSwgbm9kZTogTmd0QW55UmVjb3JkKSB7XG5cdFx0Y29uc3Qgc3RhdGUgPSBbXG5cdFx0XHR0eXBlLFxuXHRcdFx0bnVsbCxcblx0XHRcdG51bGwsXG5cdFx0XHRbXSxcblx0XHRcdGZhbHNlLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRcdHVuZGVmaW5lZCEsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRcdHVuZGVmaW5lZCEsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRcdHVuZGVmaW5lZCEsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRdIGFzIE5ndFJlbmRlcmVyU3RhdGU7XG5cblx0XHRjb25zdCByZW5kZXJlck5vZGUgPSBPYmplY3QuYXNzaWduKG5vZGUsIHsgX19uZ3RfcmVuZGVyZXJfXzogc3RhdGUgfSk7XG5cblx0XHQvLyBOT1RFOiBhc3NpZ24gb3duZXJEb2N1bWVudCB0byBub2RlIHNvIHdlIGNhbiB1c2UgSG9zdExpc3RlbmVyIGluIENvbXBvbmVudFxuXHRcdGlmICghcmVuZGVyZXJOb2RlWydvd25lckRvY3VtZW50J10pIHJlbmRlcmVyTm9kZVsnb3duZXJEb2N1bWVudCddID0gdGhpcy5yb290U3RhdGUuZG9jdW1lbnQ7XG5cblx0XHQvLyBOT1RFOiBhc3NpZ24gaW5qZWN0b3JGYWN0b3J5IG9uIG5vbi10aHJlZSB0eXBlIHNpbmNlXG5cdFx0Ly8gcmVuZGVyZXJOb2RlIGlzIGFuIGluc3RhbmNlIG9mIERPTSBOb2RlXG5cdFx0aWYgKHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSAhPT0gJ3RocmVlJykge1xuXHRcdFx0c3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0gPSAoKSA9PiBnZXREZWJ1Z05vZGUocmVuZGVyZXJOb2RlKT8uaW5qZWN0b3I7XG5cdFx0fVxuXG5cdFx0aWYgKHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbW1lbnQnKSB7XG5cdFx0XHQvLyBOT1RFOiB3ZSBhdHRhY2ggYW4gYXJyb3cgZnVuY3Rpb24gdG8gdGhlIENvbW1lbnQgbm9kZVxuXHRcdFx0Ly8gSW4gb3VyIGRpcmVjdGl2ZXMsIHdlIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gdGhlbiBzdGFydCB0cmFja2luZyB0aGUgUmVuZGVyZXJOb2RlXG5cdFx0XHQvLyB0aGlzIGlzIGRvbmUgdG8gbGltaXQgdGhlIGFtb3VudCBvZiBOb2RlcyB3ZSBuZWVkIHRvIHByb2Nlc3MgZm9yIGdldENyZWF0aW9uU3RhdGVcblx0XHRcdHJlbmRlcmVyTm9kZVtTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5UXSA9IChub2RlOiBOZ3RSZW5kZXJlck5vZGUgfCAnYXJncycgfCAncGFyZW50JykgPT4ge1xuXHRcdFx0XHRpZiAobm9kZSA9PT0gJ2FyZ3MnKSB7XG5cdFx0XHRcdFx0dGhpcy5hcmdzQ29tbWVudE5vZGVzLnB1c2gocmVuZGVyZXJOb2RlKTtcblx0XHRcdFx0fSBlbHNlIGlmIChub2RlID09PSAncGFyZW50Jykge1xuXHRcdFx0XHRcdHRoaXMucGFyZW50Q29tbWVudE5vZGVzLnB1c2gocmVuZGVyZXJOb2RlKTtcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0XHR0aGlzLnBvcnRhbENvbW1lbnRzTm9kZXMucHVzaChub2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdHJldHVybiByZW5kZXJlck5vZGU7XG5cdFx0fVxuXG5cdFx0aWYgKHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJykge1xuXHRcdFx0c3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLnF1ZXVlT3BzXSA9IG5ldyBTZXQoKTtcblx0XHRcdHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC5hdHRyaWJ1dGVzXSA9IHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC5wcm9wZXJ0aWVzXSA9IHt9O1xuXHRcdFx0cmV0dXJuIHJlbmRlcmVyTm9kZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVuZGVyZXJOb2RlO1xuXHR9XG5cblx0aXNDb21wb3VuZChuYW1lOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gdGhpcy5yb290U3RhdGUuY29tcG91bmRQcmVmaXhlcy5zb21lKChwcmVmaXgpID0+IG5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKTtcblx0fVxuXG5cdGlzRE9NKG5vZGU6IE5ndEFueVJlY29yZCkge1xuXHRcdGNvbnN0IHJTID0gbm9kZVsnX19uZ3RfcmVuZGVyZXJfXyddO1xuXHRcdHJldHVybiAoXG5cdFx0XHQhclMgfHxcblx0XHRcdChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gIT09ICdjb21wb3VuZCcgJiZcblx0XHRcdFx0KG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCB8fCBub2RlIGluc3RhbmNlb2YgV2luZG93KSlcblx0XHQpO1xuXHR9XG5cblx0Z2V0Q2xvc2VzdFBhcmVudFdpdGhJbnN0YW5jZShub2RlOiBOZ3RSZW5kZXJlck5vZGUpOiBOZ3RSZW5kZXJlck5vZGUgfCBudWxsIHtcblx0XHRsZXQgcGFyZW50ID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdO1xuXHRcdHdoaWxlIChwYXJlbnQgJiYgcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdICE9PSAndGhyZWUnKSB7XG5cdFx0XHRwYXJlbnQgPSBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucG9ydGFsQ29udGFpbmVyXVxuXHRcdFx0XHQ/IHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdXG5cdFx0XHRcdDogcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBhcmVudDtcblx0fVxuXG5cdGdldENsb3Nlc3RQYXJlbnRXaXRoQ29tcG91bmQobm9kZTogTmd0UmVuZGVyZXJOb2RlKSB7XG5cdFx0aWYgKG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdKSB7XG5cdFx0XHRyZXR1cm4gbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF07XG5cdFx0fVxuXG5cdFx0bGV0IHBhcmVudCA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XTtcblx0XHRpZiAoXG5cdFx0XHRwYXJlbnQgJiZcblx0XHRcdHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJyAmJlxuXHRcdFx0IXBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHBhcmVudDtcblx0XHR9XG5cblx0XHR3aGlsZSAoXG5cdFx0XHRwYXJlbnQgJiZcblx0XHRcdChwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScgfHxcblx0XHRcdFx0IXBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF0gfHxcblx0XHRcdFx0cGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdICE9PSAnY29tcG91bmQnKVxuXHRcdCkge1xuXHRcdFx0cGFyZW50ID0gcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG5cdFx0fVxuXG5cdFx0aWYgKCFwYXJlbnQpIHJldHVybiBudWxsO1xuXG5cdFx0aWYgKFxuXHRcdFx0cGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnICYmXG5cdFx0XHRwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XTtcblx0XHR9XG5cblx0XHRpZiAoIXBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSkge1xuXHRcdFx0cmV0dXJuIHBhcmVudDtcblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHByb2Nlc3NQb3J0YWxDb250YWluZXIocG9ydGFsOiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRjb25zdCBpbmplY3RvciA9IHBvcnRhbC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldPy4oKTtcblx0XHRpZiAoIWluamVjdG9yKSByZXR1cm47XG5cblx0XHRjb25zdCBwb3J0YWxTdG9yZSA9IGluamVjdG9yLmdldChOR1RfU1RPUkUsIG51bGwpO1xuXHRcdGlmICghcG9ydGFsU3RvcmUpIHJldHVybjtcblxuXHRcdGNvbnN0IHBvcnRhbENvbnRhaW5lciA9IHBvcnRhbFN0b3JlLmdldCgnc2NlbmUnKTtcblx0XHRpZiAoIXBvcnRhbENvbnRhaW5lcikgcmV0dXJuO1xuXG5cdFx0cG9ydGFsLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBvcnRhbENvbnRhaW5lcl0gPSB0aGlzLmNyZWF0ZU5vZGUoJ3RocmVlJywgcG9ydGFsQ29udGFpbmVyKTtcblx0fVxuXG5cdGdldENyZWF0aW9uU3RhdGUoKSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHRoaXMuZmlyc3ROb25JbmplY3RlZERpcmVjdGl2ZSgnYXJnc0NvbW1lbnROb2RlcycsIE5ndEFyZ3MpPy52YWx1ZSB8fCBbXSxcblx0XHRcdHRoaXMuZmlyc3ROb25JbmplY3RlZERpcmVjdGl2ZSgncGFyZW50Q29tbWVudE5vZGVzJywgTmd0UGFyZW50KT8udmFsdWUgfHwgbnVsbCxcblx0XHRcdHRoaXMudHJ5R2V0UG9ydGFsU3RvcmUoKSxcblx0XHRdIGFzIGNvbnN0O1xuXHR9XG5cblx0c2V0UGFyZW50KG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgcGFyZW50OiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRpZiAoIW5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XSkge1xuXHRcdFx0bm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdID0gcGFyZW50O1xuXHRcdH1cblx0fVxuXG5cdGFkZENoaWxkKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgY2hpbGQ6IE5ndFJlbmRlcmVyTm9kZSkge1xuXHRcdGlmICghbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0uaW5jbHVkZXMoY2hpbGQpKSB7XG5cdFx0XHRub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNoaWxkcmVuXS5wdXNoKGNoaWxkKTtcblx0XHR9XG5cdH1cblxuXHRyZW1vdmVDaGlsZChub2RlOiBOZ3RSZW5kZXJlck5vZGUsIGNoaWxkOiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRjb25zdCBpbmRleCA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfXz8uW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0uZmluZEluZGV4KChjKSA9PiBjaGlsZCA9PT0gYyk7XG5cdFx0aWYgKGluZGV4ID49IDApIHtcblx0XHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dLnNwbGljZShpbmRleCwgMSk7XG5cdFx0fVxuXHR9XG5cblx0c2V0Q29tcG91bmQoY29tcG91bmQ6IE5ndFJlbmRlcmVyTm9kZSwgaW5zdGFuY2U6IE5ndFJlbmRlcmVyTm9kZSkge1xuXHRcdGNvbnN0IGluc3RhbmNlUlMgPSBpbnN0YW5jZS5fX25ndF9yZW5kZXJlcl9fO1xuXG5cdFx0aWYgKGluc3RhbmNlUlMgJiYgaW5zdGFuY2VSU1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XSkge1xuXHRcdFx0Y29uc3QgcGFyZW50UlMgPSBpbnN0YW5jZVJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0XHQvLyBOT1RFOiBpZiBpbnN0YW5jZSBpcyBhbHJlYWR5IGNvbXBvdW5kZWQgYnkgaXRzIHBhcmVudC4gc2tpcFxuXHRcdFx0aWYgKHBhcmVudFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJyAmJiBwYXJlbnRSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0gPT09IGluc3RhbmNlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCByUyA9IGNvbXBvdW5kLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdID0gaW5zdGFuY2U7XG5cblx0XHRmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyU1tOZ3RSZW5kZXJlckNsYXNzSWQuYXR0cmlidXRlc10pKSB7XG5cdFx0XHR0aGlzLmFwcGx5QXR0cmlidXRlKGluc3RhbmNlLCBrZXksIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5hdHRyaWJ1dGVzXVtrZXldKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyU1tOZ3RSZW5kZXJlckNsYXNzSWQucHJvcGVydGllc10pKSB7XG5cdFx0XHR0aGlzLmFwcGx5UHJvcGVydHkoaW5zdGFuY2UsIGtleSwgclNbTmd0UmVuZGVyZXJDbGFzc0lkLnByb3BlcnRpZXNdW2tleV0pO1xuXHRcdH1cblxuXHRcdHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihjb21wb3VuZCk7XG5cdH1cblxuXHRxdWV1ZU9wZXJhdGlvbihub2RlOiBOZ3RSZW5kZXJlck5vZGUsIG9wOiBOZ3RRdWV1ZU9wKSB7XG5cdFx0bm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10uYWRkKG9wKTtcblx0fVxuXG5cdHByaXZhdGUgZXhlY3V0ZU9wZXJhdGlvbihub2RlOiBOZ3RSZW5kZXJlck5vZGUsIHR5cGU6IE5ndFF1ZXVlT3BbTmd0UXVldWVPcENsYXNzSWQudHlwZV0gPSAnb3AnKSB7XG5cdFx0Y29uc3QgclMgPSBub2RlLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0Ly8gVE9ETzogbWF5YmUgYW4gYXJyYXkgd2l0aCBwb3AoKSB3b3VsZCB3b3JrIGJldHRlclxuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdPy5zaXplKSB7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdLmZvckVhY2goKG9wKSA9PiB7XG5cdFx0XHRcdGlmIChvcFtOZ3RRdWV1ZU9wQ2xhc3NJZC50eXBlXSA9PT0gdHlwZSkge1xuXHRcdFx0XHRcdG9wW05ndFF1ZXVlT3BDbGFzc0lkLm9wXSgpO1xuXHRcdFx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10uZGVsZXRlKG9wKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0YXBwbHlBdHRyaWJ1dGUobm9kZTogTmd0UmVuZGVyZXJOb2RlLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcblx0XHRjb25zdCByUyA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfXztcblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHJldHVybjtcblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLlJFTkRFUl9QUklPUklUWSkge1xuXHRcdFx0Ly8gTk9URTogcHJpb3JpdHkgbmVlZHMgdG8gYmUgc2V0IGFzIGFuIGF0dHJpYnV0ZSBzdHJpbmcgc28gdGhhdCB0aGV5IGNhbiBiZSBzZXQgYXMgZWFybHkgYXMgcG9zc2libGVcblx0XHRcdC8vIHdlIGNvbnZlcnQgdGhhdCBzdHJpbmcgdG8gYSBudW1iZXIuIGlmIGl0J3MgaW52YWxpZCwgZGVmYXVsdCAwXG5cdFx0XHRsZXQgcHJpb3JpdHkgPSBOdW1iZXIodmFsdWUpO1xuXHRcdFx0aWYgKGlzTmFOKHByaW9yaXR5KSkge1xuXHRcdFx0XHRwcmlvcml0eSA9IDA7XG5cdFx0XHRcdGNvbnNvbGUud2FybihgW05HVF0gXCJwcmlvcml0eVwiIGlzIGFuIGludmFsaWQgbnVtYmVyLCBkZWZhdWx0IHRvIDBgKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKG5vZGUpO1xuXHRcdFx0aWYgKGxvY2FsU3RhdGUpIHtcblx0XHRcdFx0bG9jYWxTdGF0ZS5wcmlvcml0eSA9IHByaW9yaXR5O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChuYW1lID09PSBTUEVDSUFMX1BST1BFUlRJRVMuQ09NUE9VTkQpIHtcblx0XHRcdC8vIE5PVEU6IHdlIHNldCB0aGUgY29tcG91bmQgcHJvcGVydHkgb24gaW5zdGFuY2Ugbm9kZSBub3cgc28gd2Uga25vdyB0aGF0IHRoaXMgaW5zdGFuY2UgaXMgYmVpbmcgY29tcG91bmRlZFxuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kXSA9IFt2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09ICdmaXJzdCcsIHt9XTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLkFUVEFDSCkge1xuXHRcdFx0Ly8gTk9URTogaGFuZGxlIGF0dGFjaCBhcyB0cmluZ1xuXHRcdFx0Y29uc3QgcGF0aHMgPSB2YWx1ZS5zcGxpdCgnLicpO1xuXHRcdFx0aWYgKHBhdGhzLmxlbmd0aCkge1xuXHRcdFx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShub2RlKTtcblx0XHRcdFx0aWYgKGxvY2FsU3RhdGUpIHtcblx0XHRcdFx0XHRsb2NhbFN0YXRlLmF0dGFjaCA9IHBhdGhzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gTk9URTogY29lcmNpb25cblx0XHRsZXQgbWF5YmVDb2VyY2VkOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuID0gdmFsdWU7XG5cdFx0aWYgKG1heWJlQ29lcmNlZCA9PT0gJycgfHwgbWF5YmVDb2VyY2VkID09PSAndHJ1ZScgfHwgbWF5YmVDb2VyY2VkID09PSAnZmFsc2UnKSB7XG5cdFx0XHRtYXliZUNvZXJjZWQgPSBtYXliZUNvZXJjZWQgPT09ICd0cnVlJyB8fCBtYXliZUNvZXJjZWQgPT09ICcnO1xuXHRcdH0gZWxzZSBpZiAoIWlzTmFOKE51bWJlcihtYXliZUNvZXJjZWQpKSkge1xuXHRcdFx0bWF5YmVDb2VyY2VkID0gTnVtYmVyKG1heWJlQ29lcmNlZCk7XG5cdFx0fVxuXG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5SQVdfVkFMVUUpIHtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5yYXdWYWx1ZV0gPSBtYXliZUNvZXJjZWQ7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0YXBwbHlQcm9wcyhub2RlLCB7IFtuYW1lXTogbWF5YmVDb2VyY2VkIH0pO1xuXHRcdHRoaXMudXBkYXRlTmF0aXZlUHJvcHMobm9kZSwgbmFtZSwgbWF5YmVDb2VyY2VkKTtcblx0fVxuXG5cdGFwcGx5UHJvcGVydHkobm9kZTogTmd0UmVuZGVyZXJOb2RlLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcblx0XHRjb25zdCByUyA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfXztcblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHJldHVybjtcblxuXHRcdC8vIFtyZWZdXG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5SRUYgJiYgaXMucmVmKHZhbHVlKSkge1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnJlZl0gPSB2YWx1ZTtcblx0XHRcdHZhbHVlLm5hdGl2ZUVsZW1lbnQgPSBub2RlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKG5vZGUpO1xuXHRcdGNvbnN0IHBhcmVudCA9IGxvY2FsU3RhdGU/Lmluc3RhbmNlU3RvcmUuZ2V0KCdwYXJlbnQnKSB8fCByU1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XTtcblxuXHRcdC8vIFtyYXdWYWx1ZV1cblx0XHRpZiAobG9jYWxTdGF0ZT8uaXNSYXcgJiYgbmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLlJBV19WQUxVRSkge1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnJhd1ZhbHVlXSA9IHZhbHVlO1xuXHRcdFx0aWYgKHBhcmVudCkgYXR0YWNoVGhyZWVDaGlsZChwYXJlbnQsIG5vZGUpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFthdHRhY2hdXG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5BVFRBQ0gpIHtcblx0XHRcdGlmIChsb2NhbFN0YXRlKSBsb2NhbFN0YXRlLmF0dGFjaCA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKCh2KSA9PiB2LnRvU3RyaW5nKCkpIDogdmFsdWU7XG5cdFx0XHRpZiAocGFyZW50KSBhdHRhY2hUaHJlZUNoaWxkKHBhcmVudCwgbm9kZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29tcG91bmQgPSByU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdO1xuXHRcdGlmIChcblx0XHRcdGNvbXBvdW5kPy5bTmd0Q29tcG91bmRDbGFzc0lkLnByb3BzXSAmJlxuXHRcdFx0bmFtZSBpbiBjb21wb3VuZFtOZ3RDb21wb3VuZENsYXNzSWQucHJvcHNdICYmXG5cdFx0XHQhY29tcG91bmRbTmd0Q29tcG91bmRDbGFzc0lkLmFwcGx5Rmlyc3RdXG5cdFx0KSB7XG5cdFx0XHR2YWx1ZSA9IGNvbXBvdW5kW05ndENvbXBvdW5kQ2xhc3NJZC5wcm9wc11bbmFtZV07XG5cdFx0fVxuXG5cdFx0YXBwbHlQcm9wcyhub2RlLCB7IFtuYW1lXTogdmFsdWUgfSk7XG5cblx0XHQvLyBOT1RFOiBzcGVjaWFsIGNhc2UgZm9yIEdlb21ldHJ5IGFuZCBNYXRlcmlhbFxuXHRcdGlmICh2YWx1ZSAmJiAobmFtZSA9PT0gJ2dlb21ldHJ5JyB8fCBuYW1lID09PSAnbWF0ZXJpYWwnKSkge1xuXHRcdFx0Y29uc3QgY2hpbGRMUyA9IGdldExvY2FsU3RhdGUodmFsdWUpO1xuXHRcdFx0Y2hpbGRMUz8uc2V0UGFyZW50KG5vZGUpO1xuXHRcdFx0bG9jYWxTdGF0ZT8uYWRkKHZhbHVlLCAnbm9uT2JqZWN0cycpO1xuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlTmF0aXZlUHJvcHMobm9kZSwgbmFtZSwgdmFsdWUpO1xuXHR9XG5cblx0Z2V0IHJvb3RTY2VuZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5yb290U3RhdGUuc3RvcmUuZ2V0KCdzY2VuZScpO1xuXHR9XG5cblx0ZGVzdHJveShub2RlOiBOZ3RSZW5kZXJlck5vZGUsIHBhcmVudD86IE5ndFJlbmRlcmVyTm9kZSkge1xuXHRcdGNvbnN0IHJTID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdGlmICghclMgfHwgclNbTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHJldHVybjtcblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnKSB7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdID0gdW5kZWZpbmVkITtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF0gPSB1bmRlZmluZWQhO1xuXG5cdFx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShub2RlKTtcblx0XHRcdGlmIChsb2NhbFN0YXRlPy5pbnN0YW5jZVN0b3JlKSB7XG5cdFx0XHRcdGxvY2FsU3RhdGUuaW5zdGFuY2VTdG9yZS5nZXQoJ29iamVjdHMnKS5mb3JFYWNoKChvYmopID0+IHRoaXMuZGVzdHJveShvYmosIHBhcmVudCkpO1xuXHRcdFx0XHRsb2NhbFN0YXRlLmluc3RhbmNlU3RvcmUuZ2V0KCdub25PYmplY3RzJykuZm9yRWFjaCgob2JqKSA9PiB0aGlzLmRlc3Ryb3kob2JqLCBwYXJlbnQpKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGxvY2FsU3RhdGU/LmFmdGVyVXBkYXRlKSBsb2NhbFN0YXRlLmFmdGVyVXBkYXRlLmNvbXBsZXRlKCk7XG5cdFx0XHRpZiAobG9jYWxTdGF0ZT8uYWZ0ZXJBdHRhY2gpIGxvY2FsU3RhdGUuYWZ0ZXJBdHRhY2guY29tcGxldGUoKTtcblxuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ29iamVjdHMnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydub25PYmplY3RzJ107XG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsncGFyZW50J107XG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnbmF0aXZlUHJvcHMnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydhZGQnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydyZW1vdmUnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydhZnRlclVwZGF0ZSddO1xuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ2FmdGVyQXR0YWNoJ107XG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnc3RvcmUnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydoYW5kbGVycyddO1xuXG5cdFx0XHRpZiAoIWxvY2FsU3RhdGU/LnByaW1pdGl2ZSkge1xuXHRcdFx0XHRkZWxldGUgKG5vZGUgYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfXyddO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21tZW50Jykge1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0gPSBudWxsITtcblx0XHRcdGRlbGV0ZSAobm9kZSBhcyBOZ3RBbnlSZWNvcmQpW1NQRUNJQUxfSU5URVJOQUxfQUREX0NPTU1FTlRdO1xuXHRcdFx0aWYgKCF0aGlzLnJlbW92ZUNvbW1lbnROb2RlKG5vZGUsIHRoaXMuYXJnc0NvbW1lbnROb2RlcykpIHtcblx0XHRcdFx0dGhpcy5yZW1vdmVDb21tZW50Tm9kZShub2RlLCB0aGlzLnBhcmVudENvbW1lbnROb2Rlcyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3BvcnRhbCcpIHtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldID0gbnVsbCE7XG5cdFx0XHR0aGlzLnJlbW92ZUNvbW1lbnROb2RlKG5vZGUsIHRoaXMucG9ydGFsQ29tbWVudHNOb2Rlcyk7XG5cdFx0fVxuXG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJykge1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdID0gdW5kZWZpbmVkITtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5hdHRyaWJ1dGVzXSA9IG51bGwhO1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnByb3BlcnRpZXNdID0gbnVsbCE7XG5cdFx0XHR0aGlzLmV4ZWN1dGVPcGVyYXRpb24obm9kZSwgJ2NsZWFuVXAnKTtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10uY2xlYXIoKTtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10gPSBudWxsITtcblx0XHR9XG5cblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnJlZl0pIHtcblx0XHRcdC8vIG51bGxpZnkgcmVmXG5cdFx0XHQvLyBidXQgd2UgZG8gaXQgbGF0ZXIgc28gdGhhdCBpdCBkb2Vzbid0IGhpbmRlciByZW5kZXJcblx0XHRcdC8vIFRPRE86IHdpbGwgdGhpcyBjYXVzZSBtZW1vcnkgbGVhaz9cblx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cdFx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5yZWZdLm5hdGl2ZUVsZW1lbnQgPSBudWxsO1xuXHRcdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQucmVmXSA9IHVuZGVmaW5lZCE7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvLyBudWxsaWZ5IHBhcmVudFxuXHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdID0gbnVsbDtcblx0XHRmb3IgKGNvbnN0IHJlbmRlckNoaWxkIG9mIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0gfHwgW10pIHtcblx0XHRcdGlmIChyZW5kZXJDaGlsZC5fX25ndF9yZW5kZXJlcl9fPy5bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnICYmIHBhcmVudCkge1xuXHRcdFx0XHRjb25zdCBjbG9zZXN0SW5zdGFuY2UgPSB0aGlzLmdldENsb3Nlc3RQYXJlbnRXaXRoSW5zdGFuY2UocGFyZW50KTtcblx0XHRcdFx0aWYgKGNsb3Nlc3RJbnN0YW5jZSkge1xuXHRcdFx0XHRcdHJlbW92ZVRocmVlQ2hpbGQoY2xvc2VzdEluc3RhbmNlLCByZW5kZXJDaGlsZCwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuZGVzdHJveShyZW5kZXJDaGlsZCwgcGFyZW50KTtcblx0XHR9XG5cblx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dID0gW107XG5cdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0gPSB0cnVlO1xuXHRcdGlmIChwYXJlbnQpIHtcblx0XHRcdHRoaXMucmVtb3ZlQ2hpbGQocGFyZW50LCBub2RlKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHJlbW92ZUNvbW1lbnROb2RlKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgbm9kZXM6IE5ndFJlbmRlcmVyTm9kZVtdKSB7XG5cdFx0Y29uc3QgaW5kZXggPSBub2Rlcy5maW5kSW5kZXgoKGNvbW1lbnQpID0+IGNvbW1lbnQgPT09IG5vZGUpO1xuXHRcdGlmIChpbmRleCA+IC0xKSB7XG5cdFx0XHRub2Rlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlTmF0aXZlUHJvcHMobm9kZTogTmd0SW5zdGFuY2VOb2RlLCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuXHRcdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKG5vZGUpO1xuXHRcdGxvY2FsU3RhdGU/LnNldE5hdGl2ZVByb3BzKGtleSwgdmFsdWUpO1xuXHR9XG5cblx0cHJpdmF0ZSBmaXJzdE5vbkluamVjdGVkRGlyZWN0aXZlPFQgZXh0ZW5kcyBOZ3RDb21tb25EaXJlY3RpdmU+KFxuXHRcdGxpc3RQcm9wZXJ0eTogJ2FyZ3NDb21tZW50Tm9kZXMnIHwgJ3BhcmVudENvbW1lbnROb2RlcycsXG5cdFx0ZGlyOiBUeXBlPFQ+LFxuXHQpIHtcblx0XHRsZXQgZGlyZWN0aXZlOiBUIHwgdW5kZWZpbmVkO1xuXG5cdFx0Y29uc3QgZGVzdHJveWVkID0gW107XG5cblx0XHRsZXQgaSA9IHRoaXNbbGlzdFByb3BlcnR5XS5sZW5ndGggLSAxO1xuXHRcdHdoaWxlIChpID49IDApIHtcblx0XHRcdGNvbnN0IGNvbW1lbnQgPSB0aGlzW2xpc3RQcm9wZXJ0eV1baV07XG5cdFx0XHRpZiAoY29tbWVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5kZXN0cm95ZWRdKSB7XG5cdFx0XHRcdGRlc3Ryb3llZC5wdXNoKGkpO1xuXHRcdFx0XHRpLS07XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaW5qZWN0b3IgPSBjb21tZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0oKTtcblx0XHRcdGlmICghaW5qZWN0b3IpIHtcblx0XHRcdFx0aS0tO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGluc3RhbmNlID0gaW5qZWN0b3IuZ2V0KGRpciwgbnVsbCk7XG5cdFx0XHRpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UudmFsaWRhdGUoKSkge1xuXHRcdFx0XHRkaXJlY3RpdmUgPSBpbnN0YW5jZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdGktLTtcblx0XHR9XG5cblx0XHRkZXN0cm95ZWQuZm9yRWFjaCgoaW5kZXgpID0+IHtcblx0XHRcdHRoaXNbbGlzdFByb3BlcnR5XS5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIGRpcmVjdGl2ZTtcblx0fVxuXG5cdHByaXZhdGUgdHJ5R2V0UG9ydGFsU3RvcmUoKSB7XG5cdFx0bGV0IHN0b3JlOiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT4gfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgZGVzdHJveWVkID0gW107XG5cdFx0Ly8gd2Ugb25seSBjYXJlIGFib3V0IHRoZSBwb3J0YWwgc3RhdGVzIGJlY2F1c2UgTmd0U3RvcmUgb25seSBkaWZmZXJzIHBlciBQb3J0YWxcblx0XHRsZXQgaSA9IHRoaXMucG9ydGFsQ29tbWVudHNOb2Rlcy5sZW5ndGggLSAxO1xuXHRcdHdoaWxlIChpID49IDApIHtcblx0XHRcdC8vIGxvb3AgdGhyb3VnaCB0aGUgcG9ydGFsIHN0YXRlIGJhY2t3YXJkcyB0byBmaW5kIHRoZSBjbG9zZXN0IE5ndFN0b3JlXG5cdFx0XHRjb25zdCBwb3J0YWwgPSB0aGlzLnBvcnRhbENvbW1lbnRzTm9kZXNbaV07XG5cdFx0XHRpZiAocG9ydGFsLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHtcblx0XHRcdFx0ZGVzdHJveWVkLnB1c2goaSk7XG5cdFx0XHRcdGktLTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGluamVjdG9yID0gcG9ydGFsLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0oKTtcblx0XHRcdGlmICghaW5qZWN0b3IpIHtcblx0XHRcdFx0aS0tO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGluc3RhbmNlID0gaW5qZWN0b3IuZ2V0KE5HVF9TVE9SRSwgbnVsbCk7XG5cdFx0XHQvLyBvbmx5IHRoZSBpbnN0YW5jZSB3aXRoIHByZXZpb3VzUm9vdCBzaG91bGQgcGFzc1xuXHRcdFx0aWYgKGluc3RhbmNlICYmIGluc3RhbmNlLmdldCgncHJldmlvdXNSb290JykpIHtcblx0XHRcdFx0c3RvcmUgPSBpbnN0YW5jZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpLS07XG5cdFx0fVxuXG5cdFx0ZGVzdHJveWVkLmZvckVhY2goKGluZGV4KSA9PiB7XG5cdFx0XHR0aGlzLnBvcnRhbENvbW1lbnRzTm9kZXMuc3BsaWNlKGluZGV4LCAxKTtcblx0XHR9KTtcblxuXHRcdHJldHVybiBzdG9yZSB8fCB0aGlzLnJvb3RTdGF0ZS5zdG9yZTtcblx0fVxufVxuIl19
|