@mnemonica/tactica 0.4.8 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +114 -46
- package/SKILL.md +37 -22
- package/lib/analyzer.d.ts +46 -2
- package/lib/analyzer.js +548 -37
- package/lib/cli.js +13 -42
- package/lib/generator.d.ts +11 -25
- package/lib/generator.js +194 -165
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/plugins.d.ts +20 -9
- package/lib/plugins.js +1 -1
- package/lib/types.d.ts +16 -2
- package/lib/types.js +1 -1
- package/lib/writer.d.ts +0 -4
- package/lib/writer.js +1 -10
- package/package.json +23 -7
package/lib/generator.js
CHANGED
|
@@ -39,9 +39,10 @@ const path = __importStar(require("path"));
|
|
|
39
39
|
* TypeScript declaration file generator
|
|
40
40
|
*/
|
|
41
41
|
class TypesGenerator {
|
|
42
|
-
constructor(graph, esm = false, outputDir = '.tactica', referenceResolver) {
|
|
42
|
+
constructor(graph, esm = false, outputDir = '.tactica', referenceResolver, builderValues = []) {
|
|
43
43
|
this.graph = graph;
|
|
44
44
|
this.referenceResolver = referenceResolver;
|
|
45
|
+
this.builderValues = builderValues;
|
|
45
46
|
this.resolutionErrors = [];
|
|
46
47
|
this.esm = esm;
|
|
47
48
|
this.outputDir = outputDir;
|
|
@@ -52,150 +53,57 @@ class TypesGenerator {
|
|
|
52
53
|
importPath(relative) {
|
|
53
54
|
return this.esm ? `${relative}.js` : relative;
|
|
54
55
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
// Header - make this a module so we can use declare global
|
|
67
|
-
lines.push('// Generated by @mnemonica/tactica - DO NOT EDIT');
|
|
68
|
-
lines.push('// This file provides automatic type augmentation for decorated classes');
|
|
69
|
-
lines.push('');
|
|
70
|
-
lines.push('/* eslint-disable @typescript-eslint/no-empty-object-type */');
|
|
71
|
-
lines.push('/* eslint-disable @typescript-eslint/no-empty-interface */');
|
|
72
|
-
lines.push('');
|
|
73
|
-
// Import ProtoFlat from mnemonica
|
|
74
|
-
lines.push('import type { ProtoFlat } from \'mnemonica\';');
|
|
75
|
-
lines.push('');
|
|
76
|
-
// Make this a module so we can use declare global
|
|
77
|
-
lines.push('export {};');
|
|
78
|
-
lines.push('');
|
|
79
|
-
// All types go inside declare global so they are globally accessible
|
|
80
|
-
lines.push('declare global {');
|
|
81
|
-
lines.push('');
|
|
82
|
-
// Generate instance types for all default-collection types - in global scope
|
|
83
|
-
for (const root of this.graph.roots.values()) {
|
|
84
|
-
for (const node of this.graph.dfs(root)) {
|
|
85
|
-
if (node.collectionId) {
|
|
86
|
-
continue;
|
|
87
|
-
}
|
|
88
|
-
const instanceName = this.getInstanceTypeName(node);
|
|
89
|
-
generatedTypes.push(instanceName);
|
|
90
|
-
// Root types are declared as interfaces below (declaration
|
|
91
|
-
// merging with @decorate classes). Emitting `type X` here as
|
|
92
|
-
// well would collide with `interface X` in the same global
|
|
93
|
-
// scope (TS2300), and the root interface already carries
|
|
94
|
-
// everything the alias would (props + child constructors).
|
|
95
|
-
if (!node.parent) {
|
|
96
|
-
continue;
|
|
56
|
+
derivedTypePaths() {
|
|
57
|
+
const result = new Set();
|
|
58
|
+
for (const value of this.builderValues) {
|
|
59
|
+
for (const root of this.graph.roots.values()) {
|
|
60
|
+
for (const node of this.graph.dfs(root)) {
|
|
61
|
+
if (node.collectionId || node.metadataOnly) {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (node.fullPath === value.fullPath || value.fullPath.startsWith(`${node.fullPath}.`)) {
|
|
65
|
+
result.add(node.fullPath);
|
|
66
|
+
}
|
|
97
67
|
}
|
|
98
|
-
this.generateInstanceType(node, lines, 1);
|
|
99
68
|
}
|
|
100
69
|
}
|
|
101
|
-
|
|
102
|
-
// These interfaces will merge with classes of the same name in user modules
|
|
103
|
-
lines.push(' // Class interfaces for declaration merging');
|
|
104
|
-
lines.push(' // These merge with @decorate() classes to provide proper typing');
|
|
105
|
-
lines.push('');
|
|
106
|
-
for (const root of this.graph.roots.values()) {
|
|
107
|
-
for (const node of this.graph.dfs(root)) {
|
|
108
|
-
if (node.collectionId) {
|
|
109
|
-
continue;
|
|
110
|
-
}
|
|
111
|
-
this.generateClassInterface(node, lines, 1);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
lines.push('}');
|
|
115
|
-
return {
|
|
116
|
-
content: lines.join('\n'),
|
|
117
|
-
types: generatedTypes,
|
|
118
|
-
};
|
|
70
|
+
return result;
|
|
119
71
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
lines.push(`${indentStr}\t${readonly}${propName}${optional}: ${propInfo.type};`);
|
|
140
|
-
}
|
|
141
|
-
// Add nested constructor properties for non-leaf nodes — mirrors
|
|
142
|
-
// generateCompleteInstanceInterface (types.ts): subtypes construct
|
|
143
|
-
// from parent instances at any depth, not only from roots.
|
|
144
|
-
if (node.children.size > 0) {
|
|
145
|
-
for (const child of node.children.values()) {
|
|
146
|
-
this.pushChildConstructorField(lines, indentStr, child);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
// For nested types, add this node's constructor and all siblings as
|
|
150
|
-
// undefined (strict-chain behavior; parent undefineds come via ProtoFlat)
|
|
151
|
-
if (node.parent) {
|
|
152
|
-
lines.push(`${indentStr}\t${node.name}: undefined;`);
|
|
153
|
-
for (const sibling of node.parent.children.values()) {
|
|
154
|
-
if (sibling.name !== node.name) {
|
|
155
|
-
lines.push(`${indentStr}\t${sibling.name}: undefined;`);
|
|
156
|
-
}
|
|
72
|
+
builderImportName(value) {
|
|
73
|
+
const node = this.graph.findType(value.fullPath);
|
|
74
|
+
const instanceName = node ? this.getInstanceTypeName(node) : '';
|
|
75
|
+
const result = value.name === instanceName ? `${value.name}Ctor` : value.name;
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
pushBuilderImports(lines) {
|
|
79
|
+
const named = new Map();
|
|
80
|
+
const defaults = new Map();
|
|
81
|
+
const fromBuilder = [];
|
|
82
|
+
for (const value of this.builderValues) {
|
|
83
|
+
const group = value.defaultImport ? defaults : named;
|
|
84
|
+
const importName = this.builderImportName(value);
|
|
85
|
+
const names = group.get(value.sourceFile) ?? [];
|
|
86
|
+
const binding = importName === value.name ? value.name : `${value.name} as ${importName}`;
|
|
87
|
+
names.push(binding);
|
|
88
|
+
group.set(value.sourceFile, names);
|
|
89
|
+
if (value.kind === 'registryOf') {
|
|
90
|
+
fromBuilder.push(`RegistryOf<typeof ${importName}>`);
|
|
157
91
|
}
|
|
158
92
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
lines.push(
|
|
162
|
-
}
|
|
163
|
-
else {
|
|
164
|
-
lines.push(`${indentStr}};`);
|
|
165
|
-
}
|
|
166
|
-
// Add empty line after each type
|
|
167
|
-
lines.push('');
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* Generate class interface for TypeScript declaration merging
|
|
171
|
-
* This merges with the actual class to provide proper typing
|
|
172
|
-
*/
|
|
173
|
-
generateClassInterface(node, lines, indent) {
|
|
174
|
-
const indentStr = '\t'.repeat(indent);
|
|
175
|
-
// Build extends clause
|
|
176
|
-
const extendsTypes = [];
|
|
177
|
-
if (node.parent) {
|
|
178
|
-
extendsTypes.push(node.parent.name);
|
|
179
|
-
}
|
|
180
|
-
const extendsClause = extendsTypes.length > 0
|
|
181
|
-
? ` extends ${extendsTypes.join(', ')}`
|
|
182
|
-
: '';
|
|
183
|
-
// Interface with same name as class - TypeScript merges these
|
|
184
|
-
lines.push(`${indentStr}interface ${node.name}${extendsClause} {`);
|
|
185
|
-
// Add all instance properties (for type merging)
|
|
186
|
-
for (const [propName, propInfo] of node.properties.entries()) {
|
|
187
|
-
const optional = propInfo.optional ? '?' : '';
|
|
188
|
-
const readonly = propInfo.readonly ? 'readonly ' : '';
|
|
189
|
-
lines.push(`${indentStr}\t${readonly}${propName}${optional}: ${propInfo.type};`);
|
|
93
|
+
for (const [sourceFile, names] of named) {
|
|
94
|
+
const modulePath = this.resolveModulePath(sourceFile);
|
|
95
|
+
lines.push(`import type { ${names.join(', ')} } from '${modulePath}';`);
|
|
190
96
|
}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
for (const
|
|
194
|
-
|
|
97
|
+
for (const [sourceFile, names] of defaults) {
|
|
98
|
+
const modulePath = this.resolveModulePath(sourceFile);
|
|
99
|
+
for (const name of names) {
|
|
100
|
+
lines.push(`import type ${name} from '${modulePath}';`);
|
|
195
101
|
}
|
|
196
102
|
}
|
|
197
|
-
|
|
198
|
-
|
|
103
|
+
if (fromBuilder.length > 0) {
|
|
104
|
+
lines.push(`type FromBuilder = ${fromBuilder.join(' & ')};`);
|
|
105
|
+
lines.push('');
|
|
106
|
+
}
|
|
199
107
|
}
|
|
200
108
|
/**
|
|
201
109
|
* Generate a types.ts file with complete instance interfaces
|
|
@@ -208,24 +116,61 @@ class TypesGenerator {
|
|
|
208
116
|
lines.push('// Generated by @mnemonica/tactica - DO NOT EDIT');
|
|
209
117
|
lines.push('// This file provides complete TypeScript interfaces for Mnemonica types');
|
|
210
118
|
lines.push('');
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
119
|
+
const derived = this.derivedTypePaths();
|
|
120
|
+
let needsProtoFlat = false;
|
|
121
|
+
let needsLookedUpConstructor = false;
|
|
122
|
+
for (const root of this.graph.roots.values()) {
|
|
123
|
+
for (const node of this.graph.dfs(root)) {
|
|
124
|
+
if (node.metadataOnly) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (node.parent && !derived.has(node.fullPath)) {
|
|
128
|
+
needsProtoFlat = true;
|
|
129
|
+
}
|
|
130
|
+
const hasEmittedChildren = Array.from(node.children.values()).some(child => !child.metadataOnly);
|
|
131
|
+
if (!node.collectionId && hasEmittedChildren && !derived.has(node.fullPath)) {
|
|
132
|
+
needsLookedUpConstructor = true;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const mnemonicaImports = [];
|
|
137
|
+
if (needsProtoFlat) {
|
|
138
|
+
mnemonicaImports.push('ProtoFlat');
|
|
139
|
+
}
|
|
140
|
+
if (needsLookedUpConstructor) {
|
|
141
|
+
mnemonicaImports.push('LookedUpConstructor');
|
|
142
|
+
}
|
|
143
|
+
if (derived.size > 0) {
|
|
144
|
+
mnemonicaImports.push('LookedUpInstance');
|
|
145
|
+
}
|
|
146
|
+
if (mnemonicaImports.length > 0) {
|
|
147
|
+
lines.push(`import type { ${mnemonicaImports.join(', ')} } from 'mnemonica';`);
|
|
148
|
+
}
|
|
149
|
+
if (derived.size > 0 || needsLookedUpConstructor) {
|
|
150
|
+
lines.push('import type { TypeRegistry } from \'./registry\';');
|
|
151
|
+
}
|
|
152
|
+
if (mnemonicaImports.length > 0 || derived.size > 0 || needsLookedUpConstructor) {
|
|
153
|
+
lines.push('');
|
|
154
|
+
}
|
|
217
155
|
// Generate complete instance interfaces for default-collection types and
|
|
218
156
|
// for custom collections that declare a user-provided registry interface
|
|
219
157
|
// (Option B). Custom-collection types without a registry interface are
|
|
220
|
-
// isolated at runtime and are not emitted.
|
|
158
|
+
// isolated at runtime and are not emitted. Computed loop definitions are
|
|
159
|
+
// metadata-only in every collection.
|
|
221
160
|
for (const root of this.graph.roots.values()) {
|
|
222
161
|
for (const node of this.graph.dfs(root)) {
|
|
223
|
-
if (node.collectionId && !node.registryInterfaceName) {
|
|
162
|
+
if (node.metadataOnly || (node.collectionId && !node.registryInterfaceName)) {
|
|
224
163
|
continue;
|
|
225
164
|
}
|
|
226
165
|
const interfaceName = this.getInstanceTypeName(node);
|
|
227
166
|
generatedTypes.push(interfaceName);
|
|
228
|
-
|
|
167
|
+
if (derived.has(node.fullPath)) {
|
|
168
|
+
lines.push(`export type ${interfaceName} = LookedUpInstance<TypeRegistry, '${node.fullPath}'>;`);
|
|
169
|
+
lines.push('');
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
this.generateCompleteInstanceInterface(node, lines);
|
|
173
|
+
}
|
|
229
174
|
}
|
|
230
175
|
}
|
|
231
176
|
return {
|
|
@@ -239,6 +184,11 @@ class TypesGenerator {
|
|
|
239
184
|
*/
|
|
240
185
|
generateCompleteInstanceInterface(node, lines) {
|
|
241
186
|
const typeName = this.getInstanceTypeName(node);
|
|
187
|
+
if (node.instanceTypeOverride === 'any') {
|
|
188
|
+
lines.push(`export type ${typeName} = any;`);
|
|
189
|
+
lines.push('');
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
242
192
|
if (node.parent) {
|
|
243
193
|
// Nested type: Use ProtoFlat to properly exclude overridden properties
|
|
244
194
|
lines.push(`export type ${typeName} = ProtoFlat<${this.getInstanceTypeName(node.parent)}, {`);
|
|
@@ -262,14 +212,17 @@ class TypesGenerator {
|
|
|
262
212
|
}
|
|
263
213
|
}
|
|
264
214
|
// For nested types, add this node's constructor and all siblings from same parent as undefined
|
|
265
|
-
// This is needed for strict chain behavior - parent undefineds are inherited via ProtoFlat
|
|
215
|
+
// This is needed for strict chain behavior - parent undefineds are inherited via ProtoFlat.
|
|
216
|
+
// Optional on default-collection types so builder children can cross;
|
|
217
|
+
// Option B keeps required markers.
|
|
266
218
|
if (node.parent) {
|
|
219
|
+
const optional = node.collectionId ? '' : '?';
|
|
267
220
|
// Add this node's own constructor as undefined
|
|
268
|
-
lines.push(`\t${node.name}: undefined;`);
|
|
221
|
+
lines.push(`\t${node.name}${optional}: undefined;`);
|
|
269
222
|
// Add all siblings (other children of the same parent) as undefined
|
|
270
223
|
for (const sibling of node.parent.children.values()) {
|
|
271
|
-
if (sibling.name !== node.name) {
|
|
272
|
-
lines.push(`\t${sibling.name}: undefined;`);
|
|
224
|
+
if (sibling.name !== node.name && !sibling.metadataOnly) {
|
|
225
|
+
lines.push(`\t${sibling.name}${optional}: undefined;`);
|
|
273
226
|
}
|
|
274
227
|
}
|
|
275
228
|
}
|
|
@@ -283,12 +236,20 @@ class TypesGenerator {
|
|
|
283
236
|
lines.push('');
|
|
284
237
|
}
|
|
285
238
|
/**
|
|
286
|
-
* Emit one nested-ctor field
|
|
287
|
-
*
|
|
288
|
-
*
|
|
289
|
-
*
|
|
239
|
+
* Emit one nested-ctor field. Default-collection children use core's
|
|
240
|
+
* complete constructor surface. Option B uses dual signatures:
|
|
241
|
+
* construct + the chain-tip CALL form, both resolving through
|
|
242
|
+
* getConstructorResultType.
|
|
290
243
|
*/
|
|
291
244
|
pushChildConstructorField(lines, indentStr, child) {
|
|
245
|
+
if (child.metadataOnly) {
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
if (!child.collectionId) {
|
|
249
|
+
const fullPath = this.getFullPath(child);
|
|
250
|
+
lines.push(`${indentStr}\t${child.name}: LookedUpConstructor<TypeRegistry, '${fullPath}', true>;`);
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
292
253
|
const childInstanceType = this.getConstructorResultType(child);
|
|
293
254
|
const constructorParams = this.generateConstructorParams(child);
|
|
294
255
|
lines.push(`${indentStr}\t${child.name}: {`);
|
|
@@ -334,15 +295,49 @@ class TypesGenerator {
|
|
|
334
295
|
lines.push('// const instance = new MyType({ /* constructor args */ });');
|
|
335
296
|
lines.push('// // instance has full intellisense for the generated type');
|
|
336
297
|
lines.push('');
|
|
337
|
-
|
|
298
|
+
const derived = this.derivedTypePaths();
|
|
299
|
+
this.pushBuilderImports(lines);
|
|
300
|
+
const extractedSignatures = [];
|
|
301
|
+
let needsRegistryEntry = false;
|
|
302
|
+
let needsAsyncRegistryEntry = false;
|
|
303
|
+
for (const root of this.graph.roots.values()) {
|
|
304
|
+
for (const node of this.graph.dfs(root)) {
|
|
305
|
+
if (node.metadataOnly ||
|
|
306
|
+
(node.collectionId && !node.registryInterfaceName) || derived.has(node.fullPath)) {
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
if (!node.collectionId) {
|
|
310
|
+
if (node.isAsync) {
|
|
311
|
+
needsAsyncRegistryEntry = true;
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
needsRegistryEntry = true;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
extractedSignatures.push(this.generateConstructorSignature(node));
|
|
318
|
+
if (node.parent) {
|
|
319
|
+
extractedSignatures.push(this.getInstanceTypeName(node.parent));
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// Import instance types from types.ts. Derived aliases are needed only
|
|
324
|
+
// when an extracted constructor signature or RegistryEntry parent refers to them.
|
|
338
325
|
// Skip custom-collection types that have no user-provided registry interface.
|
|
339
326
|
lines.push('import type {');
|
|
340
327
|
for (const root of this.graph.roots.values()) {
|
|
341
328
|
for (const node of this.graph.dfs(root)) {
|
|
342
|
-
if (node.collectionId && !node.registryInterfaceName) {
|
|
329
|
+
if (node.metadataOnly || (node.collectionId && !node.registryInterfaceName)) {
|
|
343
330
|
continue;
|
|
344
331
|
}
|
|
332
|
+
const fullPath = this.getFullPath(node);
|
|
345
333
|
const instanceTypeName = this.getInstanceTypeName(node);
|
|
334
|
+
if (derived.has(fullPath)) {
|
|
335
|
+
const reference = new RegExp(`\\b${instanceTypeName}\\b`);
|
|
336
|
+
const used = extractedSignatures.some(signature => reference.test(signature));
|
|
337
|
+
if (!used) {
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
346
341
|
lines.push(`\t${instanceTypeName},`);
|
|
347
342
|
generatedTypes.push(instanceTypeName);
|
|
348
343
|
}
|
|
@@ -357,21 +352,36 @@ class TypesGenerator {
|
|
|
357
352
|
lines.push(' * Usage: const SomeType = lookup(\'SomeType\'); // Fully typed!');
|
|
358
353
|
lines.push(' */');
|
|
359
354
|
lines.push('declare module \'mnemonica\' {');
|
|
360
|
-
|
|
355
|
+
const fromBuilder = this.builderValues.some(value => value.kind === 'registryOf');
|
|
356
|
+
lines.push(`\tinterface TypeRegistry ${fromBuilder ? 'extends FromBuilder ' : ''}{`);
|
|
361
357
|
// Generate entries for all type paths that belong to the default/global collection.
|
|
362
358
|
// Types that live in a custom collection (collectionId set) are isolated at runtime
|
|
363
359
|
// and are not reachable through free lookup(), so they must not be added to the
|
|
364
360
|
// global TypeRegistry augmentation.
|
|
365
361
|
for (const root of this.graph.roots.values()) {
|
|
366
362
|
for (const node of this.graph.dfs(root)) {
|
|
367
|
-
if (node.collectionId) {
|
|
363
|
+
if (node.collectionId || node.metadataOnly) {
|
|
368
364
|
continue;
|
|
369
365
|
}
|
|
370
366
|
const fullPath = this.getFullPath(node);
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
367
|
+
if (derived.has(fullPath)) {
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
370
|
+
// Default extracted entries use core's complete constructor surface.
|
|
371
|
+
// AsyncRegistryEntry owns the Promise result, so its F stays the
|
|
372
|
+
// resolved instance for hooks and inheritance.
|
|
373
|
+
const instanceType = this.getInstanceTypeName(node);
|
|
374
|
+
const parentType = node.parent ? this.getInstanceTypeName(node.parent) : 'object';
|
|
375
|
+
const constructorArgs = this.generateConstructorArgs(node);
|
|
376
|
+
const entryKind = node.isAsync ? 'AsyncRegistryEntry' : 'RegistryEntry';
|
|
377
|
+
const entry = `${entryKind}<${instanceType}, '${fullPath}', ${parentType}, ${constructorArgs}>`;
|
|
378
|
+
lines.push(`\t\t'${fullPath}': ${entry};`);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
for (const value of this.builderValues) {
|
|
382
|
+
if (value.kind === 'typeof') {
|
|
383
|
+
const importName = this.builderImportName(value);
|
|
384
|
+
lines.push(`\t\t'${value.fullPath}': typeof ${importName};`);
|
|
375
385
|
}
|
|
376
386
|
}
|
|
377
387
|
lines.push('\t}');
|
|
@@ -396,7 +406,17 @@ class TypesGenerator {
|
|
|
396
406
|
lines.push('');
|
|
397
407
|
}
|
|
398
408
|
// Re-export for backward compatibility and explicit usage
|
|
399
|
-
|
|
409
|
+
const registryImports = ['TypeRegistry'];
|
|
410
|
+
if (fromBuilder) {
|
|
411
|
+
registryImports.unshift('RegistryOf');
|
|
412
|
+
}
|
|
413
|
+
if (needsRegistryEntry) {
|
|
414
|
+
registryImports.unshift('RegistryEntry');
|
|
415
|
+
}
|
|
416
|
+
if (needsAsyncRegistryEntry) {
|
|
417
|
+
registryImports.unshift('AsyncRegistryEntry');
|
|
418
|
+
}
|
|
419
|
+
lines.push(`import type { ${registryImports.join(', ')} } from 'mnemonica';`);
|
|
400
420
|
lines.push('export type { TypeRegistry };');
|
|
401
421
|
return {
|
|
402
422
|
content: lines.join('\n'),
|
|
@@ -414,10 +434,19 @@ class TypesGenerator {
|
|
|
414
434
|
const props = [];
|
|
415
435
|
for (const param of params) {
|
|
416
436
|
const optional = param.optional ? '?' : '';
|
|
417
|
-
|
|
437
|
+
const rest = param.kind === 'rest' ? '...' : '';
|
|
438
|
+
const arrayMatch = rest ? /^Array<(.+)>$/.exec(param.type) : undefined;
|
|
439
|
+
const type = arrayMatch ? `${arrayMatch[1]}[]` : param.type;
|
|
440
|
+
props.push(`${rest}${param.name}${optional}: ${type}`);
|
|
418
441
|
}
|
|
419
442
|
return `(${props.join(', ')})`;
|
|
420
443
|
}
|
|
444
|
+
generateConstructorArgs(node) {
|
|
445
|
+
const params = this.generateConstructorParams(node);
|
|
446
|
+
// Step 6 changes rest parameters here to [data: T, ...values: number[]].
|
|
447
|
+
const result = `[${params.slice(1, -1)}]`;
|
|
448
|
+
return result;
|
|
449
|
+
}
|
|
421
450
|
/**
|
|
422
451
|
* Generate constructor signature for a type node
|
|
423
452
|
* Uses constructorParams for TypeRegistry signature (not instance properties)
|
|
@@ -541,7 +570,7 @@ class TypesGenerator {
|
|
|
541
570
|
const groups = new Map();
|
|
542
571
|
for (const root of this.graph.roots.values()) {
|
|
543
572
|
for (const node of this.graph.dfs(root)) {
|
|
544
|
-
if (!node.registryInterfaceName) {
|
|
573
|
+
if (node.metadataOnly || !node.registryInterfaceName) {
|
|
545
574
|
continue;
|
|
546
575
|
}
|
|
547
576
|
const homeFile = node.collectionSourceFile ?? node.sourceFile;
|
|
@@ -575,4 +604,4 @@ class TypesGenerator {
|
|
|
575
604
|
}
|
|
576
605
|
}
|
|
577
606
|
exports.TypesGenerator = TypesGenerator;
|
|
578
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2dlbmVyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUViLDJDQUE2QjtBQWdCN0I7O0dBRUc7QUFDSCxNQUFhLGNBQWM7SUFLMUIsWUFDUyxLQUFvQixFQUM1QixHQUFHLEdBQUcsS0FBSyxFQUNYLFNBQVMsR0FBRyxVQUFVLEVBQ2QsaUJBQTBDO1FBSDFDLFVBQUssR0FBTCxLQUFLLENBQWU7UUFHcEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUF5QjtRQU4zQyxxQkFBZ0IsR0FBc0IsRUFBRSxDQUFDO1FBUWhELElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssVUFBVSxDQUFFLFFBQWdCO1FBQ25DLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7OztVQU9HO0lBQ0gsMEJBQTBCO1FBQ3pCLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztRQUMzQixNQUFNLGNBQWMsR0FBYSxFQUFFLENBQUM7UUFFcEMsMkRBQTJEO1FBQzNELEtBQUssQ0FBQyxJQUFJLENBQUMsa0RBQWtELENBQUMsQ0FBQztRQUMvRCxLQUFLLENBQUMsSUFBSSxDQUFDLHlFQUF5RSxDQUFDLENBQUM7UUFDdEYsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNmLEtBQUssQ0FBQyxJQUFJLENBQUMsOERBQThELENBQUMsQ0FBQztRQUMzRSxLQUFLLENBQUMsSUFBSSxDQUFDLDREQUE0RCxDQUFDLENBQUM7UUFDekUsS0FBSyxDQUFDLElBQUksQ0FB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QUUsY0FBYyxDQUFDLENBQUM7UUFDN0QsNkNBQTZDO1FBQzdDLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM1RCxRQUFRLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0Qsc0NBQXNDO1FBQ3RDLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sYUFBYSxDQUFDO0lBQ3RCLENBQUM7Q0FDRDtBQXJsQkQsd0NBcWxCQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7XG5cdFR5cGVOb2RlLCBHZW5lcmF0ZWRUeXBlcywgUmVzb2x1dGlvbkVycm9yIFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFR5cGVHcmFwaEltcGwgfSBmcm9tICcuL2dyYXBoJztcblxuLyoqXG4gKiBQYXRoLWF3YXJlIHJlc29sdmVyIGZvciBtbmVtb25pY2EgZ3JhcGggdHlwZSBuYW1lcyByZWZlcmVuY2VkIGluc2lkZSB0eXBlXG4gKiBzdHJpbmdzIHdoaWxlIGdlbmVyYXRpbmcgb3V0cHV0LiBSZXR1cm5zIHRoZSB1bmlxdWUgdHlwZSwgJ2FtYmlndW91cycsIG9yXG4gKiB1bmRlZmluZWQgKHJlc29sdmVzIHRvIG5vdGhpbmcpIOKAlCBzZWUgcmVzb2x2ZUdyYXBoVHlwZVJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IHR5cGUgR3JhcGhSZWZlcmVuY2VSZXNvbHZlciA9IChcblx0c2ltcGxlTmFtZTogc3RyaW5nLFxuXHRjdXJyZW50Tm9kZTogVHlwZU5vZGVcbikgPT4gVHlwZU5vZGUgfCAnYW1iaWd1b3VzJyB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGZpbGUgZ2VuZXJhdG9yXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlc0dlbmVyYXRvciB7XG5cdHByaXZhdGUgZXNtOiBib29sZWFuO1xuXHRwcml2YXRlIG91dHB1dERpcjogc3RyaW5nO1xuXHRwcml2YXRlIHJlc29sdXRpb25FcnJvcnM6IFJlc29sdXRpb25FcnJvcltdID0gW107XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgZ3JhcGg6IFR5cGVHcmFwaEltcGwsXG5cdFx0ZXNtID0gZmFsc2UsXG5cdFx0b3V0cHV0RGlyID0gJy50YWN0aWNhJyxcblx0XHRwcml2YXRlIHJlZmVyZW5jZVJlc29sdmVyPzogR3JhcGhSZWZlcmVuY2VSZXNvbHZlclxuXHQpIHtcblx0XHR0aGlzLmVzbSA9IGVzbTtcblx0XHR0aGlzLm91dHB1dERpciA9IG91dHB1dERpcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgaW1wb3J0IHBhdGggd2l0aCBvcHRpb25hbCAuanMgZXh0ZW5zaW9uIGZvciBFU00gTm9kZU5leHRcblx0ICovXG5cdHByaXZhdGUgaW1wb3J0UGF0aCAocmVsYXRpdmU6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXNtID8gYCR7cmVsYXRpdmV9LmpzYCA6IHJlbGF0aXZlO1xuXHR9XG5cblx0LyoqXG5cdFx0KiBHZW5lcmF0ZSBnbG9iYWwgYXVnbWVudGF0aW9uIGZpbGUgdGhhdCBhdWdtZW50cyB1c2VyIGNsYXNzZXMgZGlyZWN0bHlcblx0XHQqIFRoaXMgYWxsb3dzIHVzaW5nIGRlY29yYXRlZCBjbGFzc2VzIHdpdGhvdXQgbWFudWFsIHR5cGUgY2FzdGluZ1xuXHRcdCpcblx0XHQqIEFsbCB0eXBlcyBhcmUgcGxhY2VkIGluIHRoZSBnbG9iYWwgc2NvcGUgdmlhIGRlY2xhcmUgZ2xvYmFsLCB3aGljaCBhbGxvd3Ncblx0XHQqIHRoZW0gdG8gYmUgYWNjZXNzZWQgZnJvbSBhbnkgbW9kdWxlIHdpdGhvdXQgaW1wb3J0cy4gSW50ZXJmYWNlcyBkZWNsYXJlZFxuXHRcdCogaW4gdGhlIGdsb2JhbCBzY29wZSB3aWxsIG1lcmdlIHdpdGggY2xhc3NlcyBvZiB0aGUgc2FtZSBuYW1lIGluIHVzZXIgbW9kdWxlcy5cblx0XHQqL1xuXHRnZW5lcmF0ZUdsb2JhbEF1Z21lbnRhdGlvbiAoKTogR2VuZXJhdGVkVHlwZXMge1xuXHRcdGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IGdlbmVyYXRlZFR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0Ly8gSGVhZGVyIC0gbWFrZSB0aGlzIGEgbW9kdWxlIHNvIHdlIGNhbiB1c2UgZGVjbGFyZSBnbG9iYWxcblx0XHRsaW5lcy5wdXNoKCcvLyBHZW5lcmF0ZWQgYnkgQG1uZW1vbmljYS90YWN0aWNhIC0gRE8gTk9UIEVESVQnKTtcblx0XHRsaW5lcy5wdXNoKCcvLyBUaGlzIGZpbGUgcHJvdmlkZXMgYXV0b21hdGljIHR5cGUgYXVnbWVudGF0aW9uIGZvciBkZWNvcmF0ZWQgY2xhc3NlcycpO1xuXHRcdGxpbmVzLnB1c2goJycpO1xuXHRcdGxpbmVzLnB1c2goJy8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1vYmplY3QtdHlwZSAqLycpO1xuXHRcdGxpbmVzLnB1c2goJy8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1pbnRlcmZhY2UgKi8nKTtcblx0XHRsaW5lcy5wdXNoKCcnKTtcblxuXHRcdC8vIEltcG9ydCBQcm90b0ZsYXQgZnJvbSBtbmVtb25pY2Fcblx0XHRsaW5lcy5wdXNoKCdpbXBvcnQgdHlwZSB7IFByb3RvRmxhdCB9IGZyb20gXFwnbW5lbW9uaWNhXFwnOycpO1xuXHRcdGxpbmVzLnB1c2goJycpO1xuXG5cdFx0Ly8gTWFrZSB0aGlzIGEgbW9kdWxlIHNvIHdlIGNhbiB1c2UgZGVjbGFyZSBnbG9iYWxcblx0XHRsaW5lcy5wdXNoKCdleHBvcnQge307Jyk7XG5cdFx0bGluZXMucHVzaCgnJyk7XG5cblx0XHQvLyBBbGwgdHlwZXMgZ28gaW5zaWRlIGRlY2xhcmUgZ2xvYmFsIHNvIHRoZXkgYXJlIGdsb2JhbGx5IGFjY2Vzc2libGVcblx0XHRsaW5lcy5wdXNoKCdkZWNsYXJlIGdsb2JhbCB7Jyk7XG5cdFx0bGluZXMucHVzaCgnJyk7XG5cblxuXHRcdC8vIEdlbmVyYXRlIGluc3RhbmNlIHR5cGVzIGZvciBhbGwgZGVmYXVsdC1jb2xsZWN0aW9uIHR5cGVzIC0gaW4gZ2xvYmFsIHNjb3BlXG5cdFx0Zm9yIChjb25zdCByb290IG9mIHRoaXMuZ3JhcGgucm9vdHMudmFsdWVzKCkpIHtcblx0XHRcdGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLmdyYXBoLmRmcyhyb290KSkge1xuXHRcdFx0XHRpZiAobm9kZS5jb2xsZWN0aW9uSWQpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBpbnN0YW5jZU5hbWUgPSB0aGlzLmdldEluc3RhbmNlVHlwZU5hbWUobm9kZSk7XG5cdFx0XHRcdGdlbmVyYXRlZFR5cGVzLnB1c2goaW5zdGFuY2VOYW1lKTtcblx0XHRcdFx0Ly8gUm9vdCB0eXBlcyBhcmUgZGVjbGFyZWQgYXMgaW50ZXJmYWNlcyBiZWxvdyAoZGVjbGFyYXRpb25cblx0XHRcdFx0Ly8gbWVyZ2luZyB3aXRoIEBkZWNvcmF0ZSBjbGFzc2VzKS4gRW1pdHRpbmcgYHR5cGUgWGAgaGVyZSBhc1xuXHRcdFx0XHQvLyB3ZWxsIHdvdWxkIGNvbGxpZGUgd2l0aCBgaW50ZXJmYWNlIFhgIGluIHRoZSBzYW1lIGdsb2JhbFxuXHRcdFx0XHQvLyBzY29wZSAoVFMyMzAwKSwgYW5kIHRoZSByb290IGludGVyZmFjZSBhbHJlYWR5IGNhcnJpZXNcblx0XHRcdFx0Ly8gZXZlcnl0aGluZyB0aGUgYWxpYXMgd291bGQgKHByb3BzICsgY2hpbGQgY29uc3RydWN0b3JzKS5cblx0XHRcdFx0aWYgKCFub2RlLnBhcmVudCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZ2VuZXJhdGVJbnN0YW5jZVR5cGUobm9kZSwgbGluZXMsIDEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEdlbmVyYXRlIGNsYXNzIGludGVyZmFjZXMgLSBpbiBnbG9iYWwgc2NvcGUgZm9yIGRlY2xhcmF0aW9uIG1lcmdpbmdcblx0XHQvLyBUaGVzZSBpbnRlcmZhY2VzIHdpbGwgbWVyZ2Ugd2l0aCBjbGFzc2VzIG9mIHRoZSBzYW1lIG5hbWUgaW4gdXNlciBtb2R1bGVzXG5cdFx0bGluZXMucHVzaCgnXHQvLyBDbGFzcyBpbnRlcmZhY2VzIGZvciBkZWNsYXJhdGlvbiBtZXJnaW5nJyk7XG5cdFx0bGluZXMucHVzaCgnXHQvLyBUaGVzZSBtZXJnZSB3aXRoIEBkZWNvcmF0ZSgpIGNsYXNzZXMgdG8gcHJvdmlkZSBwcm9wZXIgdHlwaW5nJyk7XG5cdFx0bGluZXMucHVzaCgnJyk7XG5cdFx0Zm9yIChjb25zdCByb290IG9mIHRoaXMuZ3JhcGgucm9vdHMudmFsdWVzKCkpIHtcblx0XHRcdGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLmdyYXBoLmRmcyhyb290KSkge1xuXHRcdFx0XHRpZiAobm9kZS5jb2xsZWN0aW9uSWQpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdlbmVyYXRlQ2xhc3NJbnRlcmZhY2Uobm9kZSwgbGluZXMsIDEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGxpbmVzLnB1c2goJ30nKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRjb250ZW50IDogbGluZXMuam9pbignXFxuJyksXG5cdFx0XHR0eXBlcyAgIDogZ2VuZXJhdGVkVHlwZXMsXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHRcdCAqIEdlbmVyYXRlIGluc3RhbmNlIHR5cGUgYWxpYXMgKGRlc2NyaWJlcyB3aGF0IHRoZSBpbnN0YW5jZSBJUylcblx0XHQgKiBVc2VzIFByb3RvRmxhdCBmb3IgcHJvcGVyIGluaGVyaXRhbmNlIChleGNsdWRlcyBvdmVycmlkZGVuIHBhcmVudCBwcm9wcylcblx0XHQgKi9cblx0cHJpdmF0ZSBnZW5lcmF0ZUluc3RhbmNlVHlwZSAobm9kZTogVHlwZU5vZGUsIGxpbmVzOiBzdHJpbmdbXSwgaW5kZW50OiBudW1iZXIpOiB2b2lkIHtcblx0XHRjb25zdCBpbmRlbnRTdHIgPSAnXFx0Jy5yZXBlYXQoaW5kZW50KTtcblx0XHRjb25zdCBpbnN0YW5jZU5hbWUgPSB0aGlzLmdldEluc3RhbmNlVHlwZU5hbWUobm9kZSk7XG5cblx0XHRpZiAobm9kZS5wYXJlbnQpIHtcblx0XHRcdC8vIE5lc3RlZCB0eXBlOiBVc2UgUHJvdG9GbGF0IHRvIHByb3Blcmx5IGV4Y2x1ZGUgb3ZlcnJpZGRlbiBwcm9wZXJ0aWVzXG5cdFx0XHRsaW5lcy5wdXNoKGAke2luZGVudFN0cn10eXBlICR7aW5zdGFuY2VOYW1lfSA9IFByb3RvRmxhdDwke3RoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShub2RlLnBhcmVudCl9LCB7YCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFJvb3QgdHlwZToganVzdCB0aGUgcHJvcGVydGllcyBvYmplY3Rcblx0XHRcdGxpbmVzLnB1c2goYCR7aW5kZW50U3RyfXR5cGUgJHtpbnN0YW5jZU5hbWV9ID0ge2ApO1xuXHRcdH1cblxuXHRcdC8vIEFkZCBpbnN0YW5jZSBwcm9wZXJ0aWVzXG5cdFx0Zm9yIChjb25zdCBbIHByb3BOYW1lLCBwcm9wSW5mbyBdIG9mIG5vZGUucHJvcGVydGllcy5lbnRyaWVzKCkpIHtcblx0XHRcdGNvbnN0IG9wdGlvbmFsID0gcHJvcEluZm8ub3B0aW9uYWwgPyAnPycgOiAnJztcblx0XHRcdGNvbnN0IHJlYWRvbmx5ID0gcHJvcEluZm8ucmVhZG9ubHkgPyAncmVhZG9ubHkgJyA6ICcnO1xuXHRcdFx0bGluZXMucHVzaChgJHtpbmRlbnRTdHJ9XFx0JHtyZWFkb25seX0ke3Byb3BOYW1lfSR7b3B0aW9uYWx9OiAke3Byb3BJbmZvLnR5cGV9O2ApO1xuXHRcdH1cblxuXHRcdC8vIEFkZCBuZXN0ZWQgY29uc3RydWN0b3IgcHJvcGVydGllcyBmb3Igbm9uLWxlYWYgbm9kZXMg4oCUIG1pcnJvcnNcblx0XHQvLyBnZW5lcmF0ZUNvbXBsZXRlSW5zdGFuY2VJbnRlcmZhY2UgKHR5cGVzLnRzKTogc3VidHlwZXMgY29uc3RydWN0XG5cdFx0Ly8gZnJvbSBwYXJlbnQgaW5zdGFuY2VzIGF0IGFueSBkZXB0aCwgbm90IG9ubHkgZnJvbSByb290cy5cblx0XHRpZiAobm9kZS5jaGlsZHJlbi5zaXplID4gMCkge1xuXHRcdFx0Zm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuLnZhbHVlcygpKSB7XG5cdFx0XHRcdHRoaXMucHVzaENoaWxkQ29uc3RydWN0b3JGaWVsZChsaW5lcywgaW5kZW50U3RyLCBjaGlsZCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRm9yIG5lc3RlZCB0eXBlcywgYWRkIHRoaXMgbm9kZSdzIGNvbnN0cnVjdG9yIGFuZCBhbGwgc2libGluZ3MgYXNcblx0XHQvLyB1bmRlZmluZWQgKHN0cmljdC1jaGFpbiBiZWhhdmlvcjsgcGFyZW50IHVuZGVmaW5lZHMgY29tZSB2aWEgUHJvdG9GbGF0KVxuXHRcdGlmIChub2RlLnBhcmVudCkge1xuXHRcdFx0bGluZXMucHVzaChgJHtpbmRlbnRTdHJ9XFx0JHtub2RlLm5hbWV9OiB1bmRlZmluZWQ7YCk7XG5cdFx0XHRmb3IgKGNvbnN0IHNpYmxpbmcgb2Ygbm9kZS5wYXJlbnQuY2hpbGRyZW4udmFsdWVzKCkpIHtcblx0XHRcdFx0aWYgKHNpYmxpbmcubmFtZSAhPT0gbm9kZS5uYW1lKSB7XG5cdFx0XHRcdFx0bGluZXMucHVzaChgJHtpbmRlbnRTdHJ9XFx0JHtzaWJsaW5nLm5hbWV9OiB1bmRlZmluZWQ7YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDbG9zZSB0aGUgdHlwZSBwcm9wZXJseSAtIFByb3RvRmxhdCB1c2VzIH0+OyBmb3IgbmVzdGVkLCB9OyBmb3Igcm9vdFxuXHRcdGlmIChub2RlLnBhcmVudCkge1xuXHRcdFx0bGluZXMucHVzaChgJHtpbmRlbnRTdHJ9fT47YCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxpbmVzLnB1c2goYCR7aW5kZW50U3RyfX07YCk7XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIGVtcHR5IGxpbmUgYWZ0ZXIgZWFjaCB0eXBlXG5cdFx0bGluZXMucHVzaCgnJyk7XG5cdH1cblxuXHQvKipcblx0XHQgKiBHZW5lcmF0ZSBjbGFzcyBpbnRlcmZhY2UgZm9yIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gbWVyZ2luZ1xuXHRcdCAqIFRoaXMgbWVyZ2VzIHdpdGggdGhlIGFjdHVhbCBjbGFzcyB0byBwcm92aWRlIHByb3BlciB0eXBpbmdcblx0XHQgKi9cblx0cHJpdmF0ZSBnZW5lcmF0ZUNsYXNzSW50ZXJmYWNlIChub2RlOiBUeXBlTm9kZSwgbGluZXM6IHN0cmluZ1tdLCBpbmRlbnQ6IG51bWJlcik6IHZvaWQge1xuXHRcdGNvbnN0IGluZGVudFN0ciA9ICdcXHQnLnJlcGVhdChpbmRlbnQpO1xuXG5cdFx0Ly8gQnVpbGQgZXh0ZW5kcyBjbGF1c2Vcblx0XHRjb25zdCBleHRlbmRzVHlwZXM6IHN0cmluZ1tdID0gW107XG5cdFx0aWYgKG5vZGUucGFyZW50KSB7XG5cdFx0XHRleHRlbmRzVHlwZXMucHVzaChub2RlLnBhcmVudC5uYW1lKTtcblx0XHR9XG5cblx0XHRjb25zdCBleHRlbmRzQ2xhdXNlID0gZXh0ZW5kc1R5cGVzLmxlbmd0aCA+IDBcblx0XHRcdD8gYCBleHRlbmRzICR7ZXh0ZW5kc1R5cGVzLmpvaW4oJywgJyl9YFxuXHRcdFx0OiAnJztcblxuXHRcdC8vIEludGVyZmFjZSB3aXRoIHNhbWUgbmFtZSBhcyBjbGFzcyAtIFR5cGVTY3JpcHQgbWVyZ2VzIHRoZXNlXG5cdFx0bGluZXMucHVzaChgJHtpbmRlbnRTdHJ9aW50ZXJmYWNlICR7bm9kZS5uYW1lfSR7ZXh0ZW5kc0NsYXVzZX0ge2ApO1xuXHRcdFx0XG5cdFx0Ly8gQWRkIGFsbCBpbnN0YW5jZSBwcm9wZXJ0aWVzIChmb3IgdHlwZSBtZXJnaW5nKVxuXHRcdGZvciAoY29uc3QgWyBwcm9wTmFtZSwgcHJvcEluZm8gXSBvZiBub2RlLnByb3BlcnRpZXMuZW50cmllcygpKSB7XG5cdFx0XHRjb25zdCBvcHRpb25hbCA9IHByb3BJbmZvLm9wdGlvbmFsID8gJz8nIDogJyc7XG5cdFx0XHRjb25zdCByZWFkb25seSA9IHByb3BJbmZvLnJlYWRvbmx5ID8gJ3JlYWRvbmx5ICcgOiAnJztcblx0XHRcdGxpbmVzLnB1c2goYCR7aW5kZW50U3RyfVxcdCR7cmVhZG9ubHl9JHtwcm9wTmFtZX0ke29wdGlvbmFsfTogJHtwcm9wSW5mby50eXBlfTtgKTtcblx0XHR9XG5cblx0XHQvLyBBZGQgc3VidHlwZSBjb25zdHJ1Y3RvcnMgKG5vbi1vcHRpb25hbCBzbyB0aGV5J3JlIGFjY2Vzc2libGUpIC0gb25seSBmb3Igcm9vdCB0eXBlc1xuXHRcdGlmICghbm9kZS5wYXJlbnQpIHtcblx0XHRcdGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbi52YWx1ZXMoKSkge1xuXHRcdFx0XHR0aGlzLnB1c2hDaGlsZENvbnN0cnVjdG9yRmllbGQobGluZXMsIGluZGVudFN0ciwgY2hpbGQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XG5cdFx0bGluZXMucHVzaChgJHtpbmRlbnRTdHJ9fWApO1xuXHRcdGxpbmVzLnB1c2goJycpO1xuXHR9XG5cdFx0XG5cdC8qKlxuXHRcdCogR2VuZXJhdGUgYSB0eXBlcy50cyBmaWxlIHdpdGggY29tcGxldGUgaW5zdGFuY2UgaW50ZXJmYWNlc1xuXHRcdCogVGhpcyBpbmNsdWRlcyBhbGwgcHJvcGVydGllcyBleHRyYWN0ZWQgZnJvbSB0aGUgY29uc3RydWN0b3JzXG5cdFx0Ki9cblx0Z2VuZXJhdGVUeXBlc0ZpbGUgKCk6IEdlbmVyYXRlZFR5cGVzIHtcblx0XHRjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10gPSBbXTtcblxuXHRcdC8vIEhlYWRlclxuXHRcdGxpbmVzLnB1c2goJy8vIEdlbmVyYXRlZCBieSBAbW5lbW9uaWNhL3RhY3RpY2EgLSBETyBOT1QgRURJVCcpO1xuXHRcdGxpbmVzLnB1c2goJy8vIFRoaXMgZmlsZSBwcm92aWRlcyBjb21wbGV0ZSBUeXBlU2NyaXB0IGludGVyZmFjZXMgZm9yIE1uZW1vbmljYSB0eXBlcycpO1xuXHRcdGxpbmVzLnB1c2goJycpO1xuXHRcdGxpbmVzLnB1c2goJy8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1vYmplY3QtdHlwZSAqLycpO1xuXHRcdGxpbmVzLnB1c2goJy8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1pbnRlcmZhY2UgKi8nKTtcblx0XHRsaW5lcy5wdXNoKCcnKTtcblxuXHRcdC8vIEltcG9ydCBQcm90b0ZsYXQgZnJvbSBtbmVtb25pY2Fcblx0XHRsaW5lcy5wdXNoKCdpbXBvcnQgdHlwZSB7IFByb3RvRmxhdCB9IGZyb20gXFwnbW5lbW9uaWNhXFwnOycpO1xuXHRcdGxpbmVzLnB1c2goJycpO1xuXG5cdFx0Ly8gR2VuZXJhdGUgY29tcGxldGUgaW5zdGFuY2UgaW50ZXJmYWNlcyBmb3IgZGVmYXVsdC1jb2xsZWN0aW9uIHR5cGVzIGFuZFxuXHRcdC8vIGZvciBjdXN0b20gY29sbGVjdGlvbnMgdGhhdCBkZWNsYXJlIGEgdXNlci1wcm92aWRlZCByZWdpc3RyeSBpbnRlcmZhY2Vcblx0XHQvLyAoT3B0aW9uIEIpLiBDdXN0b20tY29sbGVjdGlvbiB0eXBlcyB3aXRob3V0IGEgcmVnaXN0cnkgaW50ZXJmYWNlIGFyZVxuXHRcdC8vIGlzb2xhdGVkIGF0IHJ1bnRpbWUgYW5kIGFyZSBub3QgZW1pdHRlZC5cblx0XHRmb3IgKGNvbnN0IHJvb3Qgb2YgdGhpcy5ncmFwaC5yb290cy52YWx1ZXMoKSkge1xuXHRcdFx0Zm9yIChjb25zdCBub2RlIG9mIHRoaXMuZ3JhcGguZGZzKHJvb3QpKSB7XG5cdFx0XHRcdGlmIChub2RlLmNvbGxlY3Rpb25JZCAmJiAhbm9kZS5yZWdpc3RyeUludGVyZmFjZU5hbWUpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBpbnRlcmZhY2VOYW1lID0gdGhpcy5nZXRJbnN0YW5jZVR5cGVOYW1lKG5vZGUpO1xuXHRcdFx0XHRnZW5lcmF0ZWRUeXBlcy5wdXNoKGludGVyZmFjZU5hbWUpO1xuXHRcdFx0XHR0aGlzLmdlbmVyYXRlQ29tcGxldGVJbnN0YW5jZUludGVyZmFjZShub2RlLCBsaW5lcyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGNvbnRlbnQgOiBsaW5lcy5qb2luKCdcXG4nKSxcblx0XHRcdHR5cGVzICAgOiBnZW5lcmF0ZWRUeXBlcyxcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdFx0ICogR2VuZXJhdGUgYSBjb21wbGV0ZSBpbnN0YW5jZSB0eXBlIGFsaWFzIHdpdGggYWxsIHByb3BlcnRpZXNcblx0XHQgKiBUaGlzIGlzIGZvciB0aGUgdHlwZXMudHMgZmlsZSB0aGF0IHVzZXJzIGltcG9ydCBmcm9tXG5cdFx0ICovXG5cdHByaXZhdGUgZ2VuZXJhdGVDb21wbGV0ZUluc3RhbmNlSW50ZXJmYWNlIChub2RlOiBUeXBlTm9kZSwgbGluZXM6IHN0cmluZ1tdKTogdm9pZCB7XG5cdFx0Y29uc3QgdHlwZU5hbWUgPSB0aGlzLmdldEluc3RhbmNlVHlwZU5hbWUobm9kZSk7XG5cblx0XHRpZiAobm9kZS5wYXJlbnQpIHtcblx0XHRcdC8vIE5lc3RlZCB0eXBlOiBVc2UgUHJvdG9GbGF0IHRvIHByb3Blcmx5IGV4Y2x1ZGUgb3ZlcnJpZGRlbiBwcm9wZXJ0aWVzXG5cdFx0XHRsaW5lcy5wdXNoKGBleHBvcnQgdHlwZSAke3R5cGVOYW1lfSA9IFByb3RvRmxhdDwke3RoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShub2RlLnBhcmVudCl9LCB7YCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFJvb3QgdHlwZToganVzdCB0aGUgcHJvcGVydGllcyBvYmplY3Rcblx0XHRcdGxpbmVzLnB1c2goYGV4cG9ydCB0eXBlICR7dHlwZU5hbWV9ID0ge2ApO1xuXHRcdH1cblxuXHRcdC8vIEFkZCBpbnN0YW5jZSBwcm9wZXJ0aWVzIGV4dHJhY3RlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvclxuXHRcdGZvciAoY29uc3QgWyBwcm9wTmFtZSwgcHJvcEluZm8gXSBvZiBub2RlLnByb3BlcnRpZXMuZW50cmllcygpKSB7XG5cdFx0XHRjb25zdCBvcHRpb25hbCA9IHByb3BJbmZvLm9wdGlvbmFsID8gJz8nIDogJyc7XG5cdFx0XHRjb25zdCByZWFkb25seSA9IHByb3BJbmZvLnJlYWRvbmx5ID8gJ3JlYWRvbmx5ICcgOiAnJztcblx0XHRcdGxpbmVzLnB1c2goYFxcdCR7cmVhZG9ubHl9JHtwcm9wTmFtZX0ke29wdGlvbmFsfTogJHt0aGlzLnJlc29sdmVUeXBlSW5TdHJpbmcocHJvcEluZm8udHlwZSwgbm9kZSl9O2ApO1xuXHRcdH1cblxuXHRcdC8vIEFkZCBuZXN0ZWQgY29uc3RydWN0b3IgcHJvcGVydGllcyBmb3Igbm9uLWxlYWYgbm9kZXNcblx0XHQvLyBMZWFmIG5vZGVzIChubyBjaGlsZHJlbikgZG9uJ3QgZ2V0IGNvbnN0cnVjdG9yIHByb3BlcnRpZXNcblx0XHQvLyBUaGlzIGZvbGxvd3MgbW5lbW9uaWNhJ3Mgc3RyaWN0Q2hhaW4gYmVoYXZpb3Jcblx0XHRpZiAobm9kZS5jaGlsZHJlbi5zaXplID4gMCkge1xuXHRcdFx0Zm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuLnZhbHVlcygpKSB7XG5cdFx0XHRcdHRoaXMucHVzaENoaWxkQ29uc3RydWN0b3JGaWVsZChsaW5lcywgJycsIGNoaWxkKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGb3IgbmVzdGVkIHR5cGVzLCBhZGQgdGhpcyBub2RlJ3MgY29uc3RydWN0b3IgYW5kIGFsbCBzaWJsaW5ncyBmcm9tIHNhbWUgcGFyZW50IGFzIHVuZGVmaW5lZFxuXHRcdC8vIFRoaXMgaXMgbmVlZGVkIGZvciBzdHJpY3QgY2hhaW4gYmVoYXZpb3IgLSBwYXJlbnQgdW5kZWZpbmVkcyBhcmUgaW5oZXJpdGVkIHZpYSBQcm90b0ZsYXRcblx0XHRpZiAobm9kZS5wYXJlbnQpIHtcblx0XHRcdC8vIEFkZCB0aGlzIG5vZGUncyBvd24gY29uc3RydWN0b3IgYXMgdW5kZWZpbmVkXG5cdFx0XHRsaW5lcy5wdXNoKGBcXHQke25vZGUubmFtZX06IHVuZGVmaW5lZDtgKTtcblxuXHRcdFx0Ly8gQWRkIGFsbCBzaWJsaW5ncyAob3RoZXIgY2hpbGRyZW4gb2YgdGhlIHNhbWUgcGFyZW50KSBhcyB1bmRlZmluZWRcblx0XHRcdGZvciAoY29uc3Qgc2libGluZyBvZiBub2RlLnBhcmVudC5jaGlsZHJlbi52YWx1ZXMoKSkge1xuXHRcdFx0XHRpZiAoc2libGluZy5uYW1lICE9PSBub2RlLm5hbWUpIHtcblx0XHRcdFx0XHRsaW5lcy5wdXNoKGBcXHQke3NpYmxpbmcubmFtZX06IHVuZGVmaW5lZDtgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENsb3NlIHRoZSB0eXBlIHByb3Blcmx5IC0gUHJvdG9GbGF0IHVzZXMgfT47IGZvciBuZXN0ZWQsIH07IGZvciByb290XG5cdFx0aWYgKG5vZGUucGFyZW50KSB7XG5cdFx0XHRsaW5lcy5wdXNoKCd9PjsnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bGluZXMucHVzaCgnfTsnKTtcblx0XHR9XG5cdFx0bGluZXMucHVzaCgnJyk7XG5cdH1cblxuXHQvKipcblx0XHQgKiBFbWl0IG9uZSBuZXN0ZWQtY3RvciBmaWVsZDogZHVhbCBzaWduYXR1cmVzIChjb25zdHJ1Y3QgKyB0aGVcblx0XHQgKiBjaGFpbi10aXAgQ0FMTCBmb3JtKS4gQm90aCBicmFuY2hlcyByZXNvbHZlIHRvIHRoZSBjb25zdHJ1Y3RvclxuXHRcdCAqIHJlc3VsdCB0eXBlIOKAlCBQcm9taXNlPEluc3RhbmNlVHlwZT4gZm9yIGFzeW5jIGhhbmRsZXJzLCB0aGUgcGxhaW5cblx0XHQgKiBpbnN0YW5jZSB0eXBlIG90aGVyd2lzZSAoZ2V0Q29uc3RydWN0b3JSZXN1bHRUeXBlKS5cblx0XHQgKi9cblx0cHJpdmF0ZSBwdXNoQ2hpbGRDb25zdHJ1Y3RvckZpZWxkIChsaW5lczogc3RyaW5nW10sIGluZGVudFN0cjogc3RyaW5nLCBjaGlsZDogVHlwZU5vZGUpOiB2b2lkIHtcblx0XHRjb25zdCBjaGlsZEluc3RhbmNlVHlwZSA9IHRoaXMuZ2V0Q29uc3RydWN0b3JSZXN1bHRUeXBlKGNoaWxkKTtcblx0XHRjb25zdCBjb25zdHJ1Y3RvclBhcmFtcyA9IHRoaXMuZ2VuZXJhdGVDb25zdHJ1Y3RvclBhcmFtcyhjaGlsZCk7XG5cdFx0bGluZXMucHVzaChgJHtpbmRlbnRTdHJ9XFx0JHtjaGlsZC5uYW1lfToge2ApO1xuXHRcdGxpbmVzLnB1c2goYCR7aW5kZW50U3RyfVxcdFxcdG5ldyAke2NvbnN0cnVjdG9yUGFyYW1zfTogJHtjaGlsZEluc3RhbmNlVHlwZX07YCk7XG5cdFx0bGluZXMucHVzaChgJHtpbmRlbnRTdHJ9XFx0XFx0JHtjb25zdHJ1Y3RvclBhcmFtc306ICR7Y2hpbGRJbnN0YW5jZVR5cGV9O2ApO1xuXHRcdGxpbmVzLnB1c2goYCR7aW5kZW50U3RyfVxcdH07YCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHR5cGUgYSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIHJlc29sdmVzIHRvOiB0aGUgaW5zdGFuY2UgdHlwZSwgb3Jcblx0ICogUHJvbWlzZTxJbnN0YW5jZVR5cGU+IGZvciBhc3luYyBoYW5kbGVycyAoaXNBc3luYykuIFRoZSBpbnN0YW5jZSB0eXBlXG5cdCAqIGl0c2VsZiBpcyBuZXZlciB3cmFwcGVkIOKAlCBvbmx5IHRoZSBjb25zdHJ1Y3RvciBSRVNVTFQgcG9zaXRpb25zXG5cdCAqIChzdWJ0eXBlIHByb3BlcnR5IHR3aW5zICsgcmVnaXN0cnkgZW50cmllcykuXG5cdCAqL1xuXHRwcml2YXRlIGdldENvbnN0cnVjdG9yUmVzdWx0VHlwZSAobm9kZTogVHlwZU5vZGUpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGluc3RhbmNlVHlwZSA9IHRoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShub2RlKTtcblx0XHRjb25zdCByZXN1bHQgPSBub2RlLmlzQXN5bmMgPyBgUHJvbWlzZTwke2luc3RhbmNlVHlwZX0+YCA6IGluc3RhbmNlVHlwZTtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdFx0ICogR2VuZXJhdGUgYSBzaW1wbGUgdHlwZSBkZWNsYXJhdGlvbiBmb3IgYSBzaW5nbGUgdHlwZVxuXHRcdCAqL1xuXHRnZW5lcmF0ZVNpbmdsZVR5cGUgKG5vZGU6IFR5cGVOb2RlKTogc3RyaW5nIHtcblx0XHRjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblx0XHR0aGlzLmdlbmVyYXRlQ29tcGxldGVJbnN0YW5jZUludGVyZmFjZShub2RlLCBsaW5lcyk7XG5cdFx0cmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuXHR9XG5cblx0LyoqXG5cdFx0ICogR2VuZXJhdGUgVHlwZVJlZ2lzdHJ5IGludGVyZmFjZSBmb3IgdHlwZS1zYWZlIGxvb2t1cCgpIGZ1bmN0aW9uXG5cdFx0ICogQXVnbWVudCBtbmVtb25pY2EncyBUeXBlUmVnaXN0cnkgc28gbG9va3VwKCdUeXBlTmFtZScpIHJldHVybnMgdGhlIHR5cGVkIGNvbnN0cnVjdG9yXG5cdFx0ICovXG5cdGdlbmVyYXRlVHlwZVJlZ2lzdHJ5ICgpOiBHZW5lcmF0ZWRUeXBlcyB7XG5cdFx0Y29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3QgZ2VuZXJhdGVkVHlwZXM6IHN0cmluZ1tdID0gW107XG5cblx0XHQvLyBIZWFkZXJcblx0XHRsaW5lcy5wdXNoKCcvLyBHZW5lcmF0ZWQgVHlwZVJlZ2lzdHJ5IGZvciB0eXBlLXNhZmUgbW5lbW9uaWNhLmxvb2t1cCgpJyk7XG5cdFx0bGluZXMucHVzaCgnLy8gVGhpcyBmaWxlIGF1Z21lbnRzIG1uZW1vbmljYVxcJ3MgVHlwZVJlZ2lzdHJ5IHZpYSBkZWNsYXJhdGlvbiBtZXJnaW5nLicpO1xuXHRcdGxpbmVzLnB1c2goJy8vJyk7XG5cdFx0bGluZXMucHVzaCgnLy8gVXNhZ2U6Jyk7XG5cdFx0bGluZXMucHVzaCgnLy8gICBpbXBvcnQgeyBsb29rdXAgfSBmcm9tIFxcJ21uZW1vbmljYVxcJzsnKTtcblx0XHRsaW5lcy5wdXNoKCcvLyAgIGltcG9ydCBcXCcuLy50YWN0aWNhL3JlZ2lzdHJ5XFwnOyAgLy8gYXBwbGllcyB0aGUgYXVnbWVudGF0aW9uJyk7XG5cdFx0bGluZXMucHVzaCgnLy8gICBjb25zdCBNeVR5cGUgPSBsb29rdXAoXFwnTXlUeXBlXFwnKTsnKTtcblx0XHRsaW5lcy5wdXNoKCcvLyAgIC8vIFR5cGVTY3JpcHQga25vd3M6IE15VHlwZSBpcyB0aGUgdHlwZWQgY29uc3RydWN0b3IgZm9yIE15VHlwZScpO1xuXHRcdGxpbmVzLnB1c2goJy8vICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgTXlUeXBlKHsgLyogY29uc3RydWN0b3IgYXJncyAqLyB9KTsnKTtcblx0XHRsaW5lcy5wdXNoKCcvLyAgIC8vIGluc3RhbmNlIGhhcyBmdWxsIGludGVsbGlzZW5zZSBmb3IgdGhlIGdlbmVyYXRlZCB0eXBlJyk7XG5cdFx0bGluZXMucHVzaCgnJyk7XG5cblx0XHQvLyBJbXBvcnQgaW5zdGFuY2UgdHlwZXMgZnJvbSB0eXBlcy50cy5cblx0XHQvLyBTa2lwIGN1c3RvbS1jb2xsZWN0aW9uIHR5cGVzIHRoYXQgaGF2ZSBubyB1c2VyLXByb3ZpZGVkIHJlZ2lzdHJ5IGludGVyZmFjZS5cblx0XHRsaW5lcy5wdXNoKCdpbXBvcnQgdHlwZSB7Jyk7XG5cdFx0Zm9yIChjb25zdCByb290IG9mIHRoaXMuZ3JhcGgucm9vdHMudmFsdWVzKCkpIHtcblx0XHRcdGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLmdyYXBoLmRmcyhyb290KSkge1xuXHRcdFx0XHRpZiAobm9kZS5jb2xsZWN0aW9uSWQgJiYgIW5vZGUucmVnaXN0cnlJbnRlcmZhY2VOYW1lKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgaW5zdGFuY2VUeXBlTmFtZSA9IHRoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShub2RlKTtcblx0XHRcdFx0bGluZXMucHVzaChgXFx0JHtpbnN0YW5jZVR5cGVOYW1lfSxgKTtcblx0XHRcdFx0Z2VuZXJhdGVkVHlwZXMucHVzaChpbnN0YW5jZVR5cGVOYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bGluZXMucHVzaChgfSBmcm9tICcke3RoaXMuaW1wb3J0UGF0aCgnLi90eXBlcycpfSc7YCk7XG5cdFx0bGluZXMucHVzaCgnJyk7XG5cblx0XHQvLyBHZW5lcmF0ZSBtb2R1bGUgYXVnbWVudGF0aW9uIGZvciBtbmVtb25pY2EgVHlwZVJlZ2lzdHJ5XG5cdFx0bGluZXMucHVzaCgnLyoqJyk7XG5cdFx0bGluZXMucHVzaCgnICogVHlwZSByZWdpc3RyeSBhdWdtZW50aW5nIG1uZW1vbmljYVxcJ3MgVHlwZVJlZ2lzdHJ5IGludGVyZmFjZScpO1xuXHRcdGxpbmVzLnB1c2goJyAqIFRoaXMgZW5hYmxlcyB0eXBlLXNhZmUgbG9va3VwKCkgd2l0aG91dCBleHBsaWNpdCB0eXBlIGFyZ3VtZW50cycpO1xuXHRcdGxpbmVzLnB1c2goJyAqJyk7XG5cdFx0bGluZXMucHVzaCgnICogVXNhZ2U6IGNvbnN0IFNvbWVUeXBlID0gbG9va3VwKFxcJ1NvbWVUeXBlXFwnKTsgLy8gRnVsbHkgdHlwZWQhJyk7XG5cdFx0bGluZXMucHVzaCgnICovJyk7XG5cdFx0bGluZXMucHVzaCgnZGVjbGFyZSBtb2R1bGUgXFwnbW5lbW9uaWNhXFwnIHsnKTtcblx0XHRsaW5lcy5wdXNoKCdcdGludGVyZmFjZSBUeXBlUmVnaXN0cnkgeycpO1xuXG5cdFx0Ly8gR2VuZXJhdGUgZW50cmllcyBmb3IgYWxsIHR5cGUgcGF0aHMgdGhhdCBiZWxvbmcgdG8gdGhlIGRlZmF1bHQvZ2xvYmFsIGNvbGxlY3Rpb24uXG5cdFx0Ly8gVHlwZXMgdGhhdCBsaXZlIGluIGEgY3VzdG9tIGNvbGxlY3Rpb24gKGNvbGxlY3Rpb25JZCBzZXQpIGFyZSBpc29sYXRlZCBhdCBydW50aW1lXG5cdFx0Ly8gYW5kIGFyZSBub3QgcmVhY2hhYmxlIHRocm91Z2ggZnJlZSBsb29rdXAoKSwgc28gdGhleSBtdXN0IG5vdCBiZSBhZGRlZCB0byB0aGVcblx0XHQvLyBnbG9iYWwgVHlwZVJlZ2lzdHJ5IGF1Z21lbnRhdGlvbi5cblx0XHRmb3IgKGNvbnN0IHJvb3Qgb2YgdGhpcy5ncmFwaC5yb290cy52YWx1ZXMoKSkge1xuXHRcdFx0Zm9yIChjb25zdCBub2RlIG9mIHRoaXMuZ3JhcGguZGZzKHJvb3QpKSB7XG5cdFx0XHRcdGlmIChub2RlLmNvbGxlY3Rpb25JZCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGZ1bGxQYXRoID0gdGhpcy5nZXRGdWxsUGF0aChub2RlKTtcblx0XHRcdFx0Y29uc3QgaW5zdGFuY2VUeXBlID0gdGhpcy5nZXRDb25zdHJ1Y3RvclJlc3VsdFR5cGUobm9kZSk7XG5cdFx0XHRcdC8vIEdlbmVyYXRlIHR5cGVkIGNvbnN0cnVjdG9yIHNpZ25hdHVyZSBmb3IgbmVzdGVkIHR5cGVzIHdpdGggcHJvcGVydGllc1xuXHRcdFx0XHRjb25zdCBjb25zdHJ1Y3RvclNpZyA9IHRoaXMuZ2VuZXJhdGVDb25zdHJ1Y3RvclNpZ25hdHVyZShub2RlKTtcblx0XHRcdFx0bGluZXMucHVzaChgXFx0XFx0JyR7ZnVsbFBhdGh9JzogJHtjb25zdHJ1Y3RvclNpZ30gPT4gJHtpbnN0YW5jZVR5cGV9O2ApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGxpbmVzLnB1c2goJ1xcdH0nKTtcblx0XHRsaW5lcy5wdXNoKCd9Jyk7XG5cdFx0bGluZXMucHVzaCgnJyk7XG5cblx0XHQvLyBHZW5lcmF0ZSBwZXItY29sbGVjdGlvbiByZWdpc3RyeSBhdWdtZW50YXRpb25zIGZvciBPcHRpb24gQlxuXHRcdC8vICh1c2VyLXByb3ZpZGVkIHJlZ2lzdHJ5IGludGVyZmFjZXMpLlxuXHRcdGNvbnN0IGNvbGxlY3Rpb25Hcm91cHMgPSB0aGlzLmdyb3VwQ29sbGVjdGlvblJlZ2lzdHJ5Tm9kZXMoKTtcblx0XHRmb3IgKGNvbnN0IFsga2V5LCBub2RlcyBdIG9mIGNvbGxlY3Rpb25Hcm91cHMpIHtcblx0XHRcdGNvbnN0IFsgcmVnaXN0cnlJbnRlcmZhY2VOYW1lLCBzb3VyY2VGaWxlIF0gPSBrZXkuc3BsaXQoJzo6Jyk7XG5cdFx0XHRjb25zdCBtb2R1bGVQYXRoID0gdGhpcy5yZXNvbHZlTW9kdWxlUGF0aChzb3VyY2VGaWxlKTtcblx0XHRcdGxpbmVzLnB1c2goYGRlY2xhcmUgbW9kdWxlICcke21vZHVsZVBhdGh9JyB7YCk7XG5cdFx0XHRsaW5lcy5wdXNoKGBcXHRpbnRlcmZhY2UgJHtyZWdpc3RyeUludGVyZmFjZU5hbWV9IHtgKTtcblx0XHRcdGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuXHRcdFx0XHRjb25zdCBmdWxsUGF0aCA9IHRoaXMuZ2V0RnVsbFBhdGgobm9kZSk7XG5cdFx0XHRcdGNvbnN0IGluc3RhbmNlVHlwZSA9IHRoaXMuZ2V0Q29uc3RydWN0b3JSZXN1bHRUeXBlKG5vZGUpO1xuXHRcdFx0XHRjb25zdCBjb25zdHJ1Y3RvclNpZyA9IHRoaXMuZ2VuZXJhdGVDb25zdHJ1Y3RvclNpZ25hdHVyZShub2RlKTtcblx0XHRcdFx0bGluZXMucHVzaChgXFx0XFx0JyR7ZnVsbFBhdGh9JzogJHtjb25zdHJ1Y3RvclNpZ30gPT4gJHtpbnN0YW5jZVR5cGV9O2ApO1xuXHRcdFx0fVxuXHRcdFx0bGluZXMucHVzaCgnXFx0fScpO1xuXHRcdFx0bGluZXMucHVzaCgnfScpO1xuXHRcdFx0bGluZXMucHVzaCgnJyk7XG5cdFx0fVxuXG5cdFx0Ly8gUmUtZXhwb3J0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFuZCBleHBsaWNpdCB1c2FnZVxuXHRcdGxpbmVzLnB1c2goJ2ltcG9ydCB0eXBlIHsgVHlwZVJlZ2lzdHJ5IH0gZnJvbSBcXCdtbmVtb25pY2FcXCc7Jyk7XG5cdFx0bGluZXMucHVzaCgnZXhwb3J0IHR5cGUgeyBUeXBlUmVnaXN0cnkgfTsnKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRjb250ZW50IDogbGluZXMuam9pbignXFxuJyksXG5cdFx0XHR0eXBlcyAgIDogZ2VuZXJhdGVkVHlwZXMsXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHRcdCAqIEdlbmVyYXRlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBsaXN0IGZvciBhIHR5cGUgbm9kZSAodGhlIFwiKOKApilcIiBwYXJ0KVxuXHRcdCAqL1xuXHRwcml2YXRlIGdlbmVyYXRlQ29uc3RydWN0b3JQYXJhbXMgKG5vZGU6IFR5cGVOb2RlKTogc3RyaW5nIHtcblx0XHRjb25zdCBwYXJhbXMgPSBub2RlLmNvbnN0cnVjdG9yUGFyYW1zO1xuXHRcdGlmICghcGFyYW1zIHx8IHBhcmFtcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiAnKCknO1xuXHRcdH1cblx0XHRjb25zdCBwcm9wczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuXHRcdFx0Y29uc3Qgb3B0aW9uYWwgPSBwYXJhbS5vcHRpb25hbCA/ICc/JyA6ICcnO1xuXHRcdFx0cHJvcHMucHVzaChgJHtwYXJhbS5uYW1lfSR7b3B0aW9uYWx9OiAke3BhcmFtLnR5cGV9YCk7XG5cdFx0fVxuXHRcdHJldHVybiBgKCR7cHJvcHMuam9pbignLCAnKX0pYDtcblx0fVxuXG5cdC8qKlxuXHRcdCAqIEdlbmVyYXRlIGNvbnN0cnVjdG9yIHNpZ25hdHVyZSBmb3IgYSB0eXBlIG5vZGVcblx0XHQgKiBVc2VzIGNvbnN0cnVjdG9yUGFyYW1zIGZvciBUeXBlUmVnaXN0cnkgc2lnbmF0dXJlIChub3QgaW5zdGFuY2UgcHJvcGVydGllcylcblx0XHQgKi9cblx0cHJpdmF0ZSBnZW5lcmF0ZUNvbnN0cnVjdG9yU2lnbmF0dXJlIChub2RlOiBUeXBlTm9kZSk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGBuZXcgJHt0aGlzLmdlbmVyYXRlQ29uc3RydWN0b3JQYXJhbXMobm9kZSl9YDtcblx0fVxuXG5cdC8qKlxuXHRcdCAqIEdldCB0aGUgZnVsbCBkb3R0ZWQgcGF0aCBmb3IgYSB0eXBlIG5vZGVcblx0XHQgKi9cblx0cHJpdmF0ZSBnZXRGdWxsUGF0aCAobm9kZTogVHlwZU5vZGUpOiBzdHJpbmcge1xuXHRcdGlmICghbm9kZS5wYXJlbnQpIHtcblx0XHRcdHJldHVybiBub2RlLm5hbWU7XG5cdFx0fVxuXHRcdHJldHVybiBgJHt0aGlzLmdldEZ1bGxQYXRoKG5vZGUucGFyZW50KX0uJHtub2RlLm5hbWV9YDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGluc3RhbmNlIHR5cGUgbmFtZSBmb3IgYSBub2RlXG5cdCAqIFVzZXMgZnVsbCBwYXRoIHdpdGggdW5kZXJzY29yZXM6IFVzYWdlcy5Vc2FnZUVudHJ5IC0+IFVzYWdlc19Vc2FnZUVudHJ5XG5cdCAqIEZvciBPcHRpb24gQiBjdXN0b20gY29sbGVjdGlvbnMsIHByZWZpeGVzIHdpdGggdGhlIHJlZ2lzdHJ5IGludGVyZmFjZSBuYW1lLlxuXHQgKi9cblx0cHJpdmF0ZSBnZXRJbnN0YW5jZVR5cGVOYW1lIChub2RlOiBUeXBlTm9kZSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgZnVsbFBhdGggPSB0aGlzLmdldEZ1bGxQYXRoKG5vZGUpO1xuXHRcdGNvbnN0IHByZWZpeCA9IG5vZGUucmVnaXN0cnlJbnRlcmZhY2VOYW1lID8gYCR7bm9kZS5yZWdpc3RyeUludGVyZmFjZU5hbWV9X2AgOiAnJztcblx0XHRyZXR1cm4gYCR7cHJlZml4fSR7ZnVsbFBhdGgucmVwbGFjZSgvXFwuL2csICdfJyl9YDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXNvbHZlIGEgc2ltcGxlIHR5cGUgbmFtZSB0byBpdHMgZnVsbCBwYXRoIG5hbWVcblx0ICogZS5nLiwgXCJEZWZpbml0aW9uRW50cnlcIiAtPiBcIkRlZmluaXRpb25zX0RlZmluaXRpb25FbnRyeVwiXG5cdCAqXG5cdCAqIFdpdGggYSByZWZlcmVuY2VSZXNvbHZlciBpbnN0YWxsZWQgKHRoZSBDTEkgcGF0aCksIHJlc29sdXRpb24gaXNcblx0ICogcGF0aC1hd2FyZSBwZXIgdGhlIGdyYXBoIGlkZW50aXR5IGxhdzogdGhlIHJlc29sdmVyIHJldHVybnMgdGhlIHVuaXF1ZVxuXHQgKiB0eXBlLCAnYW1iaWd1b3VzJywgb3IgdW5kZWZpbmVkIOKAlCB0aGUgbGF0dGVyIHR3byByZWNvcmQgYSBoYXJkLWZhaWxcblx0ICogUmVzb2x1dGlvbkVycm9yIGFuZCBlbWl0IGB1bmtub3duYCBpbnN0ZWFkIG9mIHNpbGVudGx5IHBpY2tpbmcgYVxuXHQgKiBmaXJzdCBtYXRjaC4gV2l0aG91dCBhIHJlc29sdmVyIHRoZSBsZWdhY3kgZmlyc3QtbWF0Y2ggc2NhbiBzdGF5cy5cblx0ICovXG5cdHByaXZhdGUgcmVzb2x2ZVR5cGVOYW1lIChzaW1wbGVOYW1lOiBzdHJpbmcsIGN1cnJlbnROb2RlOiBUeXBlTm9kZSk6IHN0cmluZyB7XG5cdFx0aWYgKHRoaXMucmVmZXJlbmNlUmVzb2x2ZXIpIHtcblx0XHRcdGNvbnN0IHJlc29sdmVkID0gdGhpcy5yZWZlcmVuY2VSZXNvbHZlcihzaW1wbGVOYW1lLCBjdXJyZW50Tm9kZSk7XG5cdFx0XHRpZiAocmVzb2x2ZWQgJiYgcmVzb2x2ZWQgIT09ICdhbWJpZ3VvdXMnKSB7XG5cdFx0XHRcdGNvbnN0IGluc3RhbmNlTmFtZSA9IHRoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShyZXNvbHZlZCk7XG5cdFx0XHRcdHJldHVybiBpbnN0YW5jZU5hbWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBhbmNob3JMb2NhdGlvbiA9IGAke2N1cnJlbnROb2RlLnNvdXJjZUZpbGV9OiR7Y3VycmVudE5vZGUubGluZX06JHtjdXJyZW50Tm9kZS5jb2x1bW59YDtcblx0XHRcdGNvbnN0IGFtYmlndW91c0dlbmVyYXRpb25NZXNzYWdlID0gYEFtYmlndW91cyByZWZlcmVuY2UgdG8gbW5lbW9uaWNhIHR5cGUgJyR7c2ltcGxlTmFtZX0nIGAgK1xuXHRcdFx0XHRgd2hpbGUgZ2VuZXJhdGluZyAnJHt0aGlzLmdldEZ1bGxQYXRoKGN1cnJlbnROb2RlKX0nYDtcblx0XHRcdGNvbnN0IHVucmVzb2x2ZWRHZW5lcmF0aW9uTWVzc2FnZSA9IGBVbnJlc29sdmVkIHJlZmVyZW5jZSB0byBtbmVtb25pY2EgdHlwZSAnJHtzaW1wbGVOYW1lfScgYCArXG5cdFx0XHRcdGB3aGlsZSBnZW5lcmF0aW5nICcke3RoaXMuZ2V0RnVsbFBhdGgoY3VycmVudE5vZGUpfSdgO1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IHJlc29sdmVkID09PSAnYW1iaWd1b3VzJ1xuXHRcdFx0XHQ/IGFtYmlndW91c0dlbmVyYXRpb25NZXNzYWdlXG5cdFx0XHRcdDogdW5yZXNvbHZlZEdlbmVyYXRpb25NZXNzYWdlO1xuXHRcdFx0Y29uc3QgZXJyb3I6IFJlc29sdXRpb25FcnJvciA9IHsgbWVzc2FnZSwgbG9jYXRpb25zIDogWyBhbmNob3JMb2NhdGlvbiBdIH07XG5cdFx0XHR0aGlzLnJlc29sdXRpb25FcnJvcnMucHVzaChlcnJvcik7XG5cdFx0XHRjb25zdCB1bmtub3duUmVzdWx0ID0gJ3Vua25vd24nO1xuXHRcdFx0cmV0dXJuIHVua25vd25SZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Ly8gRmlyc3QgY2hlY2sgaWYgaXQncyB0aGUgY3VycmVudCBub2RlIG9yIGl0cyBjaGlsZHJlblxuXHRcdGlmIChjdXJyZW50Tm9kZS5uYW1lID09PSBzaW1wbGVOYW1lKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRJbnN0YW5jZVR5cGVOYW1lKGN1cnJlbnROb2RlKTtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBjaGlsZCBvZiBjdXJyZW50Tm9kZS5jaGlsZHJlbi52YWx1ZXMoKSkge1xuXHRcdFx0aWYgKGNoaWxkLm5hbWUgPT09IHNpbXBsZU5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShjaGlsZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIFNlYXJjaCBhbGwgdHlwZXMgaW4gdGhlIGdyYXBoXG5cdFx0Zm9yIChjb25zdCB0eXBlIG9mIHRoaXMuZ3JhcGguZ2V0QWxsVHlwZXMoKSkge1xuXHRcdFx0aWYgKHR5cGUubmFtZSA9PT0gc2ltcGxlTmFtZSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRJbnN0YW5jZVR5cGVOYW1lKHR5cGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc2ltcGxlTmFtZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYXJkLWZhaWwgZ3JhcGggcmVmZXJlbmNlIGVycm9ycyByZWNvcmRlZCB3aGlsZSBnZW5lcmF0aW5nIChzZWVcblx0ICogcmVmZXJlbmNlUmVzb2x2ZXIpLiBUaGUgQ0xJIHByaW50cyBldmVyeSBsb2NhdGlvbiBhbmQgd3JpdGVzIG5vIG91dHB1dC5cblx0ICovXG5cdGdldFJlc29sdXRpb25FcnJvcnMgKCk6IFJlc29sdXRpb25FcnJvcltdIHtcblx0XHRjb25zdCByZXN1bHQgPSBbIC4uLnRoaXMucmVzb2x1dGlvbkVycm9ycyBdO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogUmVzb2x2ZSBzaW1wbGUgdHlwZSBuYW1lcyB0byBmdWxsIHBhdGggbmFtZXMgd2l0aGluIGEgdHlwZSBzdHJpbmdcblx0ICogSGFuZGxlcyBjb21wbGV4IHR5cGVzIGxpa2UgQXJyYXk8VXNhZ2VFbnRyeT4sIE1hcDxzdHJpbmcsIFR5cGVFbnRyeT4sIGV0Yy5cblx0ICovXG5cdHByaXZhdGUgcmVzb2x2ZVR5cGVJblN0cmluZyAodHlwZVN0cjogc3RyaW5nLCBjdXJyZW50Tm9kZTogVHlwZU5vZGUpOiBzdHJpbmcge1xuXHRcdC8vIEdldCBhbGwgdHlwZSBuYW1lcyBmcm9tIHRoZSBncmFwaFxuXHRcdGNvbnN0IGFsbFR5cGVzID0gdGhpcy5ncmFwaC5nZXRBbGxUeXBlcygpO1xuXHRcdGNvbnN0IHR5cGVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRcdGZvciAoY29uc3QgdHlwZSBvZiBhbGxUeXBlcykge1xuXHRcdFx0dHlwZU5hbWVzLmFkZCh0eXBlLm5hbWUpO1xuXHRcdH1cblxuXHRcdC8vIFNvcnQgYnkgbGVuZ3RoIChsb25nZXN0IGZpcnN0KSB0byBhdm9pZCBwYXJ0aWFsIHJlcGxhY2VtZW50c1xuXHRcdGNvbnN0IHNvcnRlZE5hbWVzID0gQXJyYXkuZnJvbSh0eXBlTmFtZXMpLnNvcnQoKGEsIGIpID0+IGIubGVuZ3RoIC0gYS5sZW5ndGgpO1xuXG5cdFx0Ly8gUmVwbGFjZSBlYWNoIHNpbXBsZSB0eXBlIG5hbWUgd2l0aCBpdHMgZnVsbCBwYXRoIHZlcnNpb25cblx0XHRsZXQgcmVzdWx0ID0gdHlwZVN0cjtcblx0XHRmb3IgKGNvbnN0IG5hbWUgb2Ygc29ydGVkTmFtZXMpIHtcblx0XHRcdC8vIFNraXAgbmFtZXMgdGhhdCBkbyBub3Qgb2NjdXIg4oCUIHdpdGggYSByZWZlcmVuY2VSZXNvbHZlciBpbnN0YWxsZWQsXG5cdFx0XHQvLyByZXNvbHZpbmcgYWJzZW50IG5hbWVzIHdvdWxkIHJlY29yZCBzcHVyaW91cyBlcnJvcnNcblx0XHRcdGNvbnN0IG9jY3VycyA9IG5ldyBSZWdFeHAoYFxcXFxiJHtuYW1lfVxcXFxiYCkudGVzdChyZXN1bHQpO1xuXHRcdFx0aWYgKCFvY2N1cnMpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHQvLyBVc2Ugd29yZCBib3VuZGFyeSBtYXRjaGluZyB0byBhdm9pZCByZXBsYWNpbmcgcGFydGlhbCBuYW1lc1xuXHRcdFx0Y29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBcXFxcYiR7bmFtZX1cXFxcYmAsICdnJyk7XG5cdFx0XHRjb25zdCBmdWxsVHlwZU5hbWUgPSB0aGlzLnJlc29sdmVUeXBlTmFtZShuYW1lLCBjdXJyZW50Tm9kZSk7XG5cdFx0XHRpZiAoZnVsbFR5cGVOYW1lICE9PSBuYW1lKSB7XG5cdFx0XHRcdHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKHJlZ2V4LCBmdWxsVHlwZU5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdyb3VwIGNvbGxlY3Rpb24gdHlwZSBub2RlcyBieSB0aGVpciByZWdpc3RyeSBpbnRlcmZhY2UgbmFtZSBhbmQgdGhlXG5cdCAqIGNvbGxlY3Rpb24ncyBob21lIGZpbGUgKHRoZSBtb2R1bGUgZGVjbGFyaW5nIHRoZSBpbnRlcmZhY2Ug4oCUIHRoZVxuXHQgKiBhdWdtZW50YXRpb24gdGFyZ2V0KSwgTk9UIGVhY2ggdHlwZSdzIG93biBkZWZpbmUgZmlsZTogbXVsdGktZmlsZVxuXHQgKiBjb2xsZWN0aW9ucyBkZWZpbmUgdHlwZXMgYWNyb3NzIG1hbnkgbW9kdWxlcy5cblx0ICogUmV0dXJucyBhIG1hcCBrZXllZCBieSBgJHtyZWdpc3RyeUludGVyZmFjZU5hbWV9Ojoke3NvdXJjZUZpbGV9YC5cblx0ICovXG5cdHByaXZhdGUgZ3JvdXBDb2xsZWN0aW9uUmVnaXN0cnlOb2RlcyAoKTogTWFwPHN0cmluZywgVHlwZU5vZGVbXT4ge1xuXHRcdGNvbnN0IGdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBUeXBlTm9kZVtdPigpO1xuXHRcdGZvciAoY29uc3Qgcm9vdCBvZiB0aGlzLmdyYXBoLnJvb3RzLnZhbHVlcygpKSB7XG5cdFx0XHRmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcy5ncmFwaC5kZnMocm9vdCkpIHtcblx0XHRcdFx0aWYgKCFub2RlLnJlZ2lzdHJ5SW50ZXJmYWNlTmFtZSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGhvbWVGaWxlID0gbm9kZS5jb2xsZWN0aW9uU291cmNlRmlsZSA/PyBub2RlLnNvdXJjZUZpbGU7XG5cdFx0XHRcdGNvbnN0IGtleSA9IGAke25vZGUucmVnaXN0cnlJbnRlcmZhY2VOYW1lfTo6JHtob21lRmlsZX1gO1xuXHRcdFx0XHRjb25zdCBleGlzdGluZyA9IGdyb3Vwcy5nZXQoa2V5KTtcblx0XHRcdFx0aWYgKGV4aXN0aW5nKSB7XG5cdFx0XHRcdFx0ZXhpc3RpbmcucHVzaChub2RlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRncm91cHMuc2V0KGtleSwgWyBub2RlIF0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBncm91cHM7XG5cdH1cblxuXHQvKipcblx0ICogUmVzb2x2ZSBhIHNvdXJjZSBmaWxlIHBhdGggdG8gYSBtb2R1bGUgc3BlY2lmaWVyIHJlbGF0aXZlIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LFxuXHQgKiBzdWl0YWJsZSBmb3IgdXNlIGluIGEgYGRlY2xhcmUgbW9kdWxlICcuLi4nYCBibG9jay5cblx0ICovXG5cdHByaXZhdGUgcmVzb2x2ZU1vZHVsZVBhdGggKHNvdXJjZUZpbGU6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgb3V0cHV0QWJzb2x1dGUgPSBwYXRoLnJlc29sdmUodGhpcy5vdXRwdXREaXIpO1xuXHRcdGNvbnN0IHNvdXJjZUFic29sdXRlID0gcGF0aC5yZXNvbHZlKHNvdXJjZUZpbGUpO1xuXHRcdGxldCByZWxhdGl2ZSA9IHBhdGgucmVsYXRpdmUob3V0cHV0QWJzb2x1dGUsIHNvdXJjZUFic29sdXRlKTtcblx0XHQvLyBSZW1vdmUgLnRzIGV4dGVuc2lvbjsga2VlcCAudHN4IGlmIHByZXNlbnRcblx0XHRpZiAocmVsYXRpdmUuZW5kc1dpdGgoJy50cycpICYmICFyZWxhdGl2ZS5lbmRzV2l0aCgnLnRzeCcpKSB7XG5cdFx0XHRyZWxhdGl2ZSA9IHJlbGF0aXZlLnNsaWNlKDAsIC0zKTtcblx0XHR9XG5cdFx0Ly8gQ29udmVydCBXaW5kb3dzIHNlcGFyYXRvcnMgdG8gUE9TSVhcblx0XHRjb25zdCBwb3NpeFJlbGF0aXZlID0gcmVsYXRpdmUucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXHRcdHJldHVybiBwb3NpeFJlbGF0aXZlO1xuXHR9XG59XG4iXX0=
|
|
607
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2dlbmVyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUViLDJDQUE2QjtBQWdCN0I7O0dBRUc7QUFDSCxNQUFhLGNBQWM7SUFLMUIsWUFDUyxLQUFvQixFQUM1QixHQUFHLEdBQUcsS0FBSyxFQUNYLFNBQVMsR0FBRyxVQUFVLEVBQ2QsaUJBQTBDLEVBQzFDLGdCQUFnQyxFQUFFO1FBSmxDLFVBQUssR0FBTCxLQUFLLENBQWU7UUFHcEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUF5QjtRQUMxQyxrQkFBYSxHQUFiLGFBQWEsQ0FBcUI7UUFQbkMscUJBQWdCLEdBQXNCLEVBQUUsQ0FBQztRQVNoRCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNLLFVBQVUsQ0FBRSxRQUFnQjtRQUNuQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUMvQyxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3ZCLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDakMsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEMsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO2dCQUM5QyxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ3pDLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJ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QyxVQUFVLENBQUMsQ0FBQztRQUNoRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUM3RCw2Q0FBNkM7UUFDN0MsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzVELFFBQVEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxzQ0FBc0M7UUFDdEMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbkQsT0FBTyxhQUFhLENBQUM7SUFDdEIsQ0FBQztDQUNEO0FBcG1CRCx3Q0FvbUJDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtcblx0VHlwZU5vZGUsIEdlbmVyYXRlZFR5cGVzLCBSZXNvbHV0aW9uRXJyb3IsIEJ1aWxkZXJWYWx1ZSBcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBUeXBlR3JhcGhJbXBsIH0gZnJvbSAnLi9ncmFwaCc7XG5cbi8qKlxuICogUGF0aC1hd2FyZSByZXNvbHZlciBmb3IgbW5lbW9uaWNhIGdyYXBoIHR5cGUgbmFtZXMgcmVmZXJlbmNlZCBpbnNpZGUgdHlwZVxuICogc3RyaW5ncyB3aGlsZSBnZW5lcmF0aW5nIG91dHB1dC4gUmV0dXJucyB0aGUgdW5pcXVlIHR5cGUsICdhbWJpZ3VvdXMnLCBvclxuICogdW5kZWZpbmVkIChyZXNvbHZlcyB0byBub3RoaW5nKSDigJQgc2VlIHJlc29sdmVHcmFwaFR5cGVSZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCB0eXBlIEdyYXBoUmVmZXJlbmNlUmVzb2x2ZXIgPSAoXG5cdHNpbXBsZU5hbWU6IHN0cmluZyxcblx0Y3VycmVudE5vZGU6IFR5cGVOb2RlXG4pID0+IFR5cGVOb2RlIHwgJ2FtYmlndW91cycgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiBmaWxlIGdlbmVyYXRvclxuICovXG5leHBvcnQgY2xhc3MgVHlwZXNHZW5lcmF0b3Ige1xuXHRwcml2YXRlIGVzbTogYm9vbGVhbjtcblx0cHJpdmF0ZSBvdXRwdXREaXI6IHN0cmluZztcblx0cHJpdmF0ZSByZXNvbHV0aW9uRXJyb3JzOiBSZXNvbHV0aW9uRXJyb3JbXSA9IFtdO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGdyYXBoOiBUeXBlR3JhcGhJbXBsLFxuXHRcdGVzbSA9IGZhbHNlLFxuXHRcdG91dHB1dERpciA9ICcudGFjdGljYScsXG5cdFx0cHJpdmF0ZSByZWZlcmVuY2VSZXNvbHZlcj86IEdyYXBoUmVmZXJlbmNlUmVzb2x2ZXIsXG5cdFx0cHJpdmF0ZSBidWlsZGVyVmFsdWVzOiBCdWlsZGVyVmFsdWVbXSA9IFtdXG5cdCkge1xuXHRcdHRoaXMuZXNtID0gZXNtO1xuXHRcdHRoaXMub3V0cHV0RGlyID0gb3V0cHV0RGlyO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBpbXBvcnQgcGF0aCB3aXRoIG9wdGlvbmFsIC5qcyBleHRlbnNpb24gZm9yIEVTTSBOb2RlTmV4dFxuXHQgKi9cblx0cHJpdmF0ZSBpbXBvcnRQYXRoIChyZWxhdGl2ZTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5lc20gPyBgJHtyZWxhdGl2ZX0uanNgIDogcmVsYXRpdmU7XG5cdH1cblxuXHRwcml2YXRlIGRlcml2ZWRUeXBlUGF0aHMgKCk6IFNldDxzdHJpbmc+IHtcblx0XHRjb25zdCByZXN1bHQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRmb3IgKGNvbnN0IHZhbHVlIG9mIHRoaXMuYnVpbGRlclZhbHVlcykge1xuXHRcdFx0Zm9yIChjb25zdCByb290IG9mIHRoaXMuZ3JhcGgucm9vdHMudmFsdWVzKCkpIHtcblx0XHRcdFx0Zm9yIChjb25zdCBub2RlIG9mIHRoaXMuZ3JhcGguZGZzKHJvb3QpKSB7XG5cdFx0XHRcdFx0aWYgKG5vZGUuY29sbGVjdGlvbklkIHx8IG5vZGUubWV0YWRhdGFPbmx5KSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG5vZGUuZnVsbFBhdGggPT09IHZhbHVlLmZ1bGxQYXRoIHx8IHZhbHVlLmZ1bGxQYXRoLnN0YXJ0c1dpdGgoYCR7bm9kZS5mdWxsUGF0aH0uYCkpIHtcblx0XHRcdFx0XHRcdHJlc3VsdC5hZGQobm9kZS5mdWxsUGF0aCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcml2YXRlIGJ1aWxkZXJJbXBvcnROYW1lICh2YWx1ZTogQnVpbGRlclZhbHVlKTogc3RyaW5nIHtcblx0XHRjb25zdCBub2RlID0gdGhpcy5ncmFwaC5maW5kVHlwZSh2YWx1ZS5mdWxsUGF0aCk7XG5cdFx0Y29uc3QgaW5zdGFuY2VOYW1lID0gbm9kZSA/IHRoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShub2RlKSA6ICcnO1xuXHRcdGNvbnN0IHJlc3VsdCA9IHZhbHVlLm5hbWUgPT09IGluc3RhbmNlTmFtZSA/IGAke3ZhbHVlLm5hbWV9Q3RvcmAgOiB2YWx1ZS5uYW1lO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcml2YXRlIHB1c2hCdWlsZGVySW1wb3J0cyAobGluZXM6IHN0cmluZ1tdKTogdm9pZCB7XG5cdFx0Y29uc3QgbmFtZWQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cdFx0Y29uc3QgZGVmYXVsdHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cdFx0Y29uc3QgZnJvbUJ1aWxkZXI6IHN0cmluZ1tdID0gW107XG5cdFx0Zm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLmJ1aWxkZXJWYWx1ZXMpIHtcblx0XHRcdGNvbnN0IGdyb3VwID0gdmFsdWUuZGVmYXVsdEltcG9ydCA/IGRlZmF1bHRzIDogbmFtZWQ7XG5cdFx0XHRjb25zdCBpbXBvcnROYW1lID0gdGhpcy5idWlsZGVySW1wb3J0TmFtZSh2YWx1ZSk7XG5cdFx0XHRjb25zdCBuYW1lcyA9IGdyb3VwLmdldCh2YWx1ZS5zb3VyY2VGaWxlKSA/PyBbXTtcblx0XHRcdGNvbnN0IGJpbmRpbmcgPSBpbXBvcnROYW1lID09PSB2YWx1ZS5uYW1lID8gdmFsdWUubmFtZSA6IGAke3ZhbHVlLm5hbWV9IGFzICR7aW1wb3J0TmFtZX1gO1xuXHRcdFx0bmFtZXMucHVzaChiaW5kaW5nKTtcblx0XHRcdGdyb3VwLnNldCh2YWx1ZS5zb3VyY2VGaWxlLCBuYW1lcyk7XG5cdFx0XHRpZiAodmFsdWUua2luZCA9PT0gJ3JlZ2lzdHJ5T2YnKSB7XG5cdFx0XHRcdGZyb21CdWlsZGVyLnB1c2goYFJlZ2lzdHJ5T2Y8dHlwZW9mICR7aW1wb3J0TmFtZX0+YCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgWyBzb3VyY2VGaWxlLCBuYW1lcyBdIG9mIG5hbWVkKSB7XG5cdFx0XHRjb25zdCBtb2R1bGVQYXRoID0gdGhpcy5yZXNvbHZlTW9kdWxlUGF0aChzb3VyY2VGaWxlKTtcblx0XHRcdGxpbmVzLnB1c2goYGltcG9ydCB0eXBlIHsgJHtuYW1lcy5qb2luKCcsICcpfSB9IGZyb20gJyR7bW9kdWxlUGF0aH0nO2ApO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IFsgc291cmNlRmlsZSwgbmFtZXMgXSBvZiBkZWZhdWx0cykge1xuXHRcdFx0Y29uc3QgbW9kdWxlUGF0aCA9IHRoaXMucmVzb2x2ZU1vZHVsZVBhdGgoc291cmNlRmlsZSk7XG5cdFx0XHRmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcblx0XHRcdFx0bGluZXMucHVzaChgaW1wb3J0IHR5cGUgJHtuYW1lfSBmcm9tICcke21vZHVsZVBhdGh9JztgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGZyb21CdWlsZGVyLmxlbmd0aCA+IDApIHtcblx0XHRcdGxpbmVzLnB1c2goYHR5cGUgRnJvbUJ1aWxkZXIgPSAke2Zyb21CdWlsZGVyLmpvaW4oJyAmICcpfTtgKTtcblx0XHRcdGxpbmVzLnB1c2goJycpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHRcdCogR2VuZXJhdGUgYSB0eXBlcy50cyBmaWxlIHdpdGggY29tcGxldGUgaW5zdGFuY2UgaW50ZXJmYWNlc1xuXHRcdCogVGhpcyBpbmNsdWRlcyBhbGwgcHJvcGVydGllcyBleHRyYWN0ZWQgZnJvbSB0aGUgY29uc3RydWN0b3JzXG5cdFx0Ki9cblx0Z2VuZXJhdGVUeXBlc0ZpbGUgKCk6IEdlbmVyYXRlZFR5cGVzIHtcblx0XHRjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10gPSBbXTtcblxuXHRcdC8vIEhlYWRlclxuXHRcdGxpbmVzLnB1c2goJy8vIEdlbmVyYXRlZCBieSBAbW5lbW9uaWNhL3RhY3RpY2EgLSBETyBOT1QgRURJVCcpO1xuXHRcdGxpbmVzLnB1c2goJy8vIFRoaXMgZmlsZSBwcm92aWRlcyBjb21wbGV0ZSBUeXBlU2NyaXB0IGludGVyZmFjZXMgZm9yIE1uZW1vbmljYSB0eXBlcycpO1xuXHRcdGxpbmVzLnB1c2goJycpO1xuXG5cdFx0Y29uc3QgZGVyaXZlZCA9IHRoaXMuZGVyaXZlZFR5cGVQYXRocygpO1xuXHRcdGxldCBuZWVkc1Byb3RvRmxhdCA9IGZhbHNlO1xuXHRcdGxldCBuZWVkc0xvb2tlZFVwQ29uc3RydWN0b3IgPSBmYWxzZTtcblx0XHRmb3IgKGNvbnN0IHJvb3Qgb2YgdGhpcy5ncmFwaC5yb290cy52YWx1ZXMoKSkge1xuXHRcdFx0Zm9yIChjb25zdCBub2RlIG9mIHRoaXMuZ3JhcGguZGZzKHJvb3QpKSB7XG5cdFx0XHRcdGlmIChub2RlLm1ldGFkYXRhT25seSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChub2RlLnBhcmVudCAmJiAhZGVyaXZlZC5oYXMobm9kZS5mdWxsUGF0aCkpIHtcblx0XHRcdFx0XHRuZWVkc1Byb3RvRmxhdCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgaGFzRW1pdHRlZENoaWxkcmVuID0gQXJyYXkuZnJvbShub2RlLmNoaWxkcmVuLnZhbHVlcygpKS5zb21lKGNoaWxkID0+ICFjaGlsZC5tZXRhZGF0YU9ubHkpO1xuXHRcdFx0XHRpZiAoIW5vZGUuY29sbGVjdGlvbklkICYmIGhhc0VtaXR0ZWRDaGlsZHJlbiAmJiAhZGVyaXZlZC5oYXMobm9kZS5mdWxsUGF0aCkpIHtcblx0XHRcdFx0XHRuZWVkc0xvb2tlZFVwQ29uc3RydWN0b3IgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IG1uZW1vbmljYUltcG9ydHM6IHN0cmluZ1tdID0gW107XG5cdFx0aWYgKG5lZWRzUHJvdG9GbGF0KSB7XG5cdFx0XHRtbmVtb25pY2FJbXBvcnRzLnB1c2goJ1Byb3RvRmxhdCcpO1xuXHRcdH1cblx0XHRpZiAobmVlZHNMb29rZWRVcENvbnN0cnVjdG9yKSB7XG5cdFx0XHRtbmVtb25pY2FJbXBvcnRzLnB1c2goJ0xvb2tlZFVwQ29uc3RydWN0b3InKTtcblx0XHR9XG5cdFx0aWYgKGRlcml2ZWQuc2l6ZSA+IDApIHtcblx0XHRcdG1uZW1vbmljYUltcG9ydHMucHVzaCgnTG9va2VkVXBJbnN0YW5jZScpO1xuXHRcdH1cblx0XHRpZiAobW5lbW9uaWNhSW1wb3J0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRsaW5lcy5wdXNoKGBpbXBvcnQgdHlwZSB7ICR7bW5lbW9uaWNhSW1wb3J0cy5qb2luKCcsICcpfSB9IGZyb20gJ21uZW1vbmljYSc7YCk7XG5cdFx0fVxuXHRcdGlmIChkZXJpdmVkLnNpemUgPiAwIHx8IG5lZWRzTG9va2VkVXBDb25zdHJ1Y3Rvcikge1xuXHRcdFx0bGluZXMucHVzaCgnaW1wb3J0IHR5cGUgeyBUeXBlUmVnaXN0cnkgfSBmcm9tIFxcJy4vcmVnaXN0cnlcXCc7Jyk7XG5cdFx0fVxuXHRcdGlmIChtbmVtb25pY2FJbXBvcnRzLmxlbmd0aCA+IDAgfHwgZGVyaXZlZC5zaXplID4gMCB8fCBuZWVkc0xvb2tlZFVwQ29uc3RydWN0b3IpIHtcblx0XHRcdGxpbmVzLnB1c2goJycpO1xuXHRcdH1cblxuXHRcdC8vIEdlbmVyYXRlIGNvbXBsZXRlIGluc3RhbmNlIGludGVyZmFjZXMgZm9yIGRlZmF1bHQtY29sbGVjdGlvbiB0eXBlcyBhbmRcblx0XHQvLyBmb3IgY3VzdG9tIGNvbGxlY3Rpb25zIHRoYXQgZGVjbGFyZSBhIHVzZXItcHJvdmlkZWQgcmVnaXN0cnkgaW50ZXJmYWNlXG5cdFx0Ly8gKE9wdGlvbiBCKS4gQ3VzdG9tLWNvbGxlY3Rpb24gdHlwZXMgd2l0aG91dCBhIHJlZ2lzdHJ5IGludGVyZmFjZSBhcmVcblx0XHQvLyBpc29sYXRlZCBhdCBydW50aW1lIGFuZCBhcmUgbm90IGVtaXR0ZWQuIENvbXB1dGVkIGxvb3AgZGVmaW5pdGlvbnMgYXJlXG5cdFx0Ly8gbWV0YWRhdGEtb25seSBpbiBldmVyeSBjb2xsZWN0aW9uLlxuXHRcdGZvciAoY29uc3Qgcm9vdCBvZiB0aGlzLmdyYXBoLnJvb3RzLnZhbHVlcygpKSB7XG5cdFx0XHRmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcy5ncmFwaC5kZnMocm9vdCkpIHtcblx0XHRcdFx0aWYgKG5vZGUubWV0YWRhdGFPbmx5IHx8IChub2RlLmNvbGxlY3Rpb25JZCAmJiAhbm9kZS5yZWdpc3RyeUludGVyZmFjZU5hbWUpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgaW50ZXJmYWNlTmFtZSA9IHRoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShub2RlKTtcblx0XHRcdFx0Z2VuZXJhdGVkVHlwZXMucHVzaChpbnRlcmZhY2VOYW1lKTtcblx0XHRcdFx0aWYgKGRlcml2ZWQuaGFzKG5vZGUuZnVsbFBhdGgpKSB7XG5cdFx0XHRcdFx0bGluZXMucHVzaChgZXhwb3J0IHR5cGUgJHtpbnRlcmZhY2VOYW1lfSA9IExvb2tlZFVwSW5zdGFuY2U8VHlwZVJlZ2lzdHJ5LCAnJHtub2RlLmZ1bGxQYXRofSc+O2ApO1xuXHRcdFx0XHRcdGxpbmVzLnB1c2goJycpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZ2VuZXJhdGVDb21wbGV0ZUluc3RhbmNlSW50ZXJmYWNlKG5vZGUsIGxpbmVzKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRjb250ZW50IDogbGluZXMuam9pbignXFxuJyksXG5cdFx0XHR0eXBlcyAgIDogZ2VuZXJhdGVkVHlwZXMsXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHRcdCAqIEdlbmVyYXRlIGEgY29tcGxldGUgaW5zdGFuY2UgdHlwZSBhbGlhcyB3aXRoIGFsbCBwcm9wZXJ0aWVzXG5cdFx0ICogVGhpcyBpcyBmb3IgdGhlIHR5cGVzLnRzIGZpbGUgdGhhdCB1c2VycyBpbXBvcnQgZnJvbVxuXHRcdCAqL1xuXHRwcml2YXRlIGdlbmVyYXRlQ29tcGxldGVJbnN0YW5jZUludGVyZmFjZSAobm9kZTogVHlwZU5vZGUsIGxpbmVzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdGNvbnN0IHR5cGVOYW1lID0gdGhpcy5nZXRJbnN0YW5jZVR5cGVOYW1lKG5vZGUpO1xuXG5cdFx0aWYgKG5vZGUuaW5zdGFuY2VUeXBlT3ZlcnJpZGUgPT09ICdhbnknKSB7XG5cdFx0XHRsaW5lcy5wdXNoKGBleHBvcnQgdHlwZSAke3R5cGVOYW1lfSA9IGFueTtgKTtcblx0XHRcdGxpbmVzLnB1c2goJycpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAobm9kZS5wYXJlbnQpIHtcblx0XHRcdC8vIE5lc3RlZCB0eXBlOiBVc2UgUHJvdG9GbGF0IHRvIHByb3Blcmx5IGV4Y2x1ZGUgb3ZlcnJpZGRlbiBwcm9wZXJ0aWVzXG5cdFx0XHRsaW5lcy5wdXNoKGBleHBvcnQgdHlwZSAke3R5cGVOYW1lfSA9IFByb3RvRmxhdDwke3RoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShub2RlLnBhcmVudCl9LCB7YCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFJvb3QgdHlwZToganVzdCB0aGUgcHJvcGVydGllcyBvYmplY3Rcblx0XHRcdGxpbmVzLnB1c2goYGV4cG9ydCB0eXBlICR7dHlwZU5hbWV9ID0ge2ApO1xuXHRcdH1cblxuXHRcdC8vIEFkZCBpbnN0YW5jZSBwcm9wZXJ0aWVzIGV4dHJhY3RlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvclxuXHRcdGZvciAoY29uc3QgWyBwcm9wTmFtZSwgcHJvcEluZm8gXSBvZiBub2RlLnByb3BlcnRpZXMuZW50cmllcygpKSB7XG5cdFx0XHRjb25zdCBvcHRpb25hbCA9IHByb3BJbmZvLm9wdGlvbmFsID8gJz8nIDogJyc7XG5cdFx0XHRjb25zdCByZWFkb25seSA9IHByb3BJbmZvLnJlYWRvbmx5ID8gJ3JlYWRvbmx5ICcgOiAnJztcblx0XHRcdGxpbmVzLnB1c2goYFxcdCR7cmVhZG9ubHl9JHtwcm9wTmFtZX0ke29wdGlvbmFsfTogJHt0aGlzLnJlc29sdmVUeXBlSW5TdHJpbmcocHJvcEluZm8udHlwZSwgbm9kZSl9O2ApO1xuXHRcdH1cblxuXHRcdC8vIEFkZCBuZXN0ZWQgY29uc3RydWN0b3IgcHJvcGVydGllcyBmb3Igbm9uLWxlYWYgbm9kZXNcblx0XHQvLyBMZWFmIG5vZGVzIChubyBjaGlsZHJlbikgZG9uJ3QgZ2V0IGNvbnN0cnVjdG9yIHByb3BlcnRpZXNcblx0XHQvLyBUaGlzIGZvbGxvd3MgbW5lbW9uaWNhJ3Mgc3RyaWN0Q2hhaW4gYmVoYXZpb3Jcblx0XHRpZiAobm9kZS5jaGlsZHJlbi5zaXplID4gMCkge1xuXHRcdFx0Zm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuLnZhbHVlcygpKSB7XG5cdFx0XHRcdHRoaXMucHVzaENoaWxkQ29uc3RydWN0b3JGaWVsZChsaW5lcywgJycsIGNoaWxkKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGb3IgbmVzdGVkIHR5cGVzLCBhZGQgdGhpcyBub2RlJ3MgY29uc3RydWN0b3IgYW5kIGFsbCBzaWJsaW5ncyBmcm9tIHNhbWUgcGFyZW50IGFzIHVuZGVmaW5lZFxuXHRcdC8vIFRoaXMgaXMgbmVlZGVkIGZvciBzdHJpY3QgY2hhaW4gYmVoYXZpb3IgLSBwYXJlbnQgdW5kZWZpbmVkcyBhcmUgaW5oZXJpdGVkIHZpYSBQcm90b0ZsYXQuXG5cdFx0Ly8gT3B0aW9uYWwgb24gZGVmYXVsdC1jb2xsZWN0aW9uIHR5cGVzIHNvIGJ1aWxkZXIgY2hpbGRyZW4gY2FuIGNyb3NzO1xuXHRcdC8vIE9wdGlvbiBCIGtlZXBzIHJlcXVpcmVkIG1hcmtlcnMuXG5cdFx0aWYgKG5vZGUucGFyZW50KSB7XG5cdFx0XHRjb25zdCBvcHRpb25hbCA9IG5vZGUuY29sbGVjdGlvbklkID8gJycgOiAnPyc7XG5cdFx0XHQvLyBBZGQgdGhpcyBub2RlJ3Mgb3duIGNvbnN0cnVjdG9yIGFzIHVuZGVmaW5lZFxuXHRcdFx0bGluZXMucHVzaChgXFx0JHtub2RlLm5hbWV9JHtvcHRpb25hbH06IHVuZGVmaW5lZDtgKTtcblxuXHRcdFx0Ly8gQWRkIGFsbCBzaWJsaW5ncyAob3RoZXIgY2hpbGRyZW4gb2YgdGhlIHNhbWUgcGFyZW50KSBhcyB1bmRlZmluZWRcblx0XHRcdGZvciAoY29uc3Qgc2libGluZyBvZiBub2RlLnBhcmVudC5jaGlsZHJlbi52YWx1ZXMoKSkge1xuXHRcdFx0XHRpZiAoc2libGluZy5uYW1lICE9PSBub2RlLm5hbWUgJiYgIXNpYmxpbmcubWV0YWRhdGFPbmx5KSB7XG5cdFx0XHRcdFx0bGluZXMucHVzaChgXFx0JHtzaWJsaW5nLm5hbWV9JHtvcHRpb25hbH06IHVuZGVmaW5lZDtgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENsb3NlIHRoZSB0eXBlIHByb3Blcmx5IC0gUHJvdG9GbGF0IHVzZXMgfT47IGZvciBuZXN0ZWQsIH07IGZvciByb290XG5cdFx0aWYgKG5vZGUucGFyZW50KSB7XG5cdFx0XHRsaW5lcy5wdXNoKCd9PjsnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bGluZXMucHVzaCgnfTsnKTtcblx0XHR9XG5cdFx0bGluZXMucHVzaCgnJyk7XG5cdH1cblxuXHQvKipcblx0XHQgKiBFbWl0IG9uZSBuZXN0ZWQtY3RvciBmaWVsZC4gRGVmYXVsdC1jb2xsZWN0aW9uIGNoaWxkcmVuIHVzZSBjb3JlJ3Ncblx0XHQgKiBjb21wbGV0ZSBjb25zdHJ1Y3RvciBzdXJmYWNlLiBPcHRpb24gQiB1c2VzIGR1YWwgc2lnbmF0dXJlczpcblx0XHQgKiBjb25zdHJ1Y3QgKyB0aGUgY2hhaW4tdGlwIENBTEwgZm9ybSwgYm90aCByZXNvbHZpbmcgdGhyb3VnaFxuXHRcdCAqIGdldENvbnN0cnVjdG9yUmVzdWx0VHlwZS5cblx0XHQgKi9cblx0cHJpdmF0ZSBwdXNoQ2hpbGRDb25zdHJ1Y3RvckZpZWxkIChcblx0XHRsaW5lczogc3RyaW5nW10sXG5cdFx0aW5kZW50U3RyOiBzdHJpbmcsXG5cdFx0Y2hpbGQ6IFR5cGVOb2RlXG5cdCk6IHZvaWQge1xuXHRcdGlmIChjaGlsZC5tZXRhZGF0YU9ubHkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKCFjaGlsZC5jb2xsZWN0aW9uSWQpIHtcblx0XHRcdGNvbnN0IGZ1bGxQYXRoID0gdGhpcy5nZXRGdWxsUGF0aChjaGlsZCk7XG5cdFx0XHRsaW5lcy5wdXNoKGAke2luZGVudFN0cn1cXHQke2NoaWxkLm5hbWV9OiBMb29rZWRVcENvbnN0cnVjdG9yPFR5cGVSZWdpc3RyeSwgJyR7ZnVsbFBhdGh9JywgdHJ1ZT47YCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGNoaWxkSW5zdGFuY2VUeXBlID0gdGhpcy5nZXRDb25zdHJ1Y3RvclJlc3VsdFR5cGUoY2hpbGQpO1xuXHRcdGNvbnN0IGNvbnN0cnVjdG9yUGFyYW1zID0gdGhpcy5nZW5lcmF0ZUNvbnN0cnVjdG9yUGFyYW1zKGNoaWxkKTtcblx0XHRsaW5lcy5wdXNoKGAke2luZGVudFN0cn1cXHQke2NoaWxkLm5hbWV9OiB7YCk7XG5cdFx0bGluZXMucHVzaChgJHtpbmRlbnRTdHJ9XFx0XFx0bmV3ICR7Y29uc3RydWN0b3JQYXJhbXN9OiAke2NoaWxkSW5zdGFuY2VUeXBlfTtgKTtcblx0XHRsaW5lcy5wdXNoKGAke2luZGVudFN0cn1cXHRcXHQke2NvbnN0cnVjdG9yUGFyYW1zfTogJHtjaGlsZEluc3RhbmNlVHlwZX07YCk7XG5cdFx0bGluZXMucHVzaChgJHtpbmRlbnRTdHJ9XFx0fTtgKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBhIGNvbnN0cnVjdG9yIGludm9jYXRpb24gcmVzb2x2ZXMgdG86IHRoZSBpbnN0YW5jZSB0eXBlLCBvclxuXHQgKiBQcm9taXNlPEluc3RhbmNlVHlwZT4gZm9yIGFzeW5jIGhhbmRsZXJzIChpc0FzeW5jKS4gVGhlIGluc3RhbmNlIHR5cGVcblx0ICogaXRzZWxmIGlzIG5ldmVyIHdyYXBwZWQg4oCUIG9ubHkgdGhlIGNvbnN0cnVjdG9yIFJFU1VMVCBwb3NpdGlvbnNcblx0ICogKHN1YnR5cGUgcHJvcGVydHkgdHdpbnMgKyByZWdpc3RyeSBlbnRyaWVzKS5cblx0ICovXG5cdHByaXZhdGUgZ2V0Q29uc3RydWN0b3JSZXN1bHRUeXBlIChub2RlOiBUeXBlTm9kZSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgaW5zdGFuY2VUeXBlID0gdGhpcy5nZXRJbnN0YW5jZVR5cGVOYW1lKG5vZGUpO1xuXHRcdGNvbnN0IHJlc3VsdCA9IG5vZGUuaXNBc3luYyA/IGBQcm9taXNlPCR7aW5zdGFuY2VUeXBlfT5gIDogaW5zdGFuY2VUeXBlO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0XHQgKiBHZW5lcmF0ZSBhIHNpbXBsZSB0eXBlIGRlY2xhcmF0aW9uIGZvciBhIHNpbmdsZSB0eXBlXG5cdFx0ICovXG5cdGdlbmVyYXRlU2luZ2xlVHlwZSAobm9kZTogVHlwZU5vZGUpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdHRoaXMuZ2VuZXJhdGVDb21wbGV0ZUluc3RhbmNlSW50ZXJmYWNlKG5vZGUsIGxpbmVzKTtcblx0XHRyZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG5cdH1cblxuXHQvKipcblx0XHQgKiBHZW5lcmF0ZSBUeXBlUmVnaXN0cnkgaW50ZXJmYWNlIGZvciB0eXBlLXNhZmUgbG9va3VwKCkgZnVuY3Rpb25cblx0XHQgKiBBdWdtZW50IG1uZW1vbmljYSdzIFR5cGVSZWdpc3RyeSBzbyBsb29rdXAoJ1R5cGVOYW1lJykgcmV0dXJucyB0aGUgdHlwZWQgY29uc3RydWN0b3Jcblx0XHQgKi9cblx0Z2VuZXJhdGVUeXBlUmVnaXN0cnkgKCk6IEdlbmVyYXRlZFR5cGVzIHtcblx0XHRjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10gPSBbXTtcblxuXHRcdC8vIEhlYWRlclxuXHRcdGxpbmVzLnB1c2goJy8vIEdlbmVyYXRlZCBUeXBlUmVnaXN0cnkgZm9yIHR5cGUtc2FmZSBtbmVtb25pY2EubG9va3VwKCknKTtcblx0XHRsaW5lcy5wdXNoKCcvLyBUaGlzIGZpbGUgYXVnbWVudHMgbW5lbW9uaWNhXFwncyBUeXBlUmVnaXN0cnkgdmlhIGRlY2xhcmF0aW9uIG1lcmdpbmcuJyk7XG5cdFx0bGluZXMucHVzaCgnLy8nKTtcblx0XHRsaW5lcy5wdXNoKCcvLyBVc2FnZTonKTtcblx0XHRsaW5lcy5wdXNoKCcvLyAgIGltcG9ydCB7IGxvb2t1cCB9IGZyb20gXFwnbW5lbW9uaWNhXFwnOycpO1xuXHRcdGxpbmVzLnB1c2goJy8vICAgaW1wb3J0IFxcJy4vLnRhY3RpY2EvcmVnaXN0cnlcXCc7ICAvLyBhcHBsaWVzIHRoZSBhdWdtZW50YXRpb24nKTtcblx0XHRsaW5lcy5wdXNoKCcvLyAgIGNvbnN0IE15VHlwZSA9IGxvb2t1cChcXCdNeVR5cGVcXCcpOycpO1xuXHRcdGxpbmVzLnB1c2goJy8vICAgLy8gVHlwZVNjcmlwdCBrbm93czogTXlUeXBlIGlzIHRoZSB0eXBlZCBjb25zdHJ1Y3RvciBmb3IgTXlUeXBlJyk7XG5cdFx0bGluZXMucHVzaCgnLy8gICBjb25zdCBpbnN0YW5jZSA9IG5ldyBNeVR5cGUoeyAvKiBjb25zdHJ1Y3RvciBhcmdzICovIH0pOycpO1xuXHRcdGxpbmVzLnB1c2goJy8vICAgLy8gaW5zdGFuY2UgaGFzIGZ1bGwgaW50ZWxsaXNlbnNlIGZvciB0aGUgZ2VuZXJhdGVkIHR5cGUnKTtcblx0XHRsaW5lcy5wdXNoKCcnKTtcblxuXHRcdGNvbnN0IGRlcml2ZWQgPSB0aGlzLmRlcml2ZWRUeXBlUGF0aHMoKTtcblx0XHR0aGlzLnB1c2hCdWlsZGVySW1wb3J0cyhsaW5lcyk7XG5cblx0XHRjb25zdCBleHRyYWN0ZWRTaWduYXR1cmVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGxldCBuZWVkc1JlZ2lzdHJ5RW50cnkgPSBmYWxzZTtcblx0XHRsZXQgbmVlZHNBc3luY1JlZ2lzdHJ5RW50cnkgPSBmYWxzZTtcblx0XHRmb3IgKGNvbnN0IHJvb3Qgb2YgdGhpcy5ncmFwaC5yb290cy52YWx1ZXMoKSkge1xuXHRcdFx0Zm9yIChjb25zdCBub2RlIG9mIHRoaXMuZ3JhcGguZGZzKHJvb3QpKSB7XG5cdFx0XHRcdGlmIChub2RlLm1ldGFkYXRhT25seSB8fFxuXHRcdFx0XHRcdChub2RlLmNvbGxlY3Rpb25JZCAmJiAhbm9kZS5yZWdpc3RyeUludGVyZmFjZU5hbWUpIHx8IGRlcml2ZWQuaGFzKG5vZGUuZnVsbFBhdGgpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFub2RlLmNvbGxlY3Rpb25JZCkge1xuXHRcdFx0XHRcdGlmIChub2RlLmlzQXN5bmMpIHtcblx0XHRcdFx0XHRcdG5lZWRzQXN5bmNSZWdpc3RyeUVudHJ5ID0gdHJ1ZTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bmVlZHNSZWdpc3RyeUVudHJ5ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0ZXh0cmFjdGVkU2lnbmF0dXJlcy5wdXNoKHRoaXMuZ2VuZXJhdGVDb25zdHJ1Y3RvclNpZ25hdHVyZShub2RlKSk7XG5cdFx0XHRcdGlmIChub2RlLnBhcmVudCkge1xuXHRcdFx0XHRcdGV4dHJhY3RlZFNpZ25hdHVyZXMucHVzaCh0aGlzLmdldEluc3RhbmNlVHlwZU5hbWUobm9kZS5wYXJlbnQpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEltcG9ydCBpbnN0YW5jZSB0eXBlcyBmcm9tIHR5cGVzLnRzLiBEZXJpdmVkIGFsaWFzZXMgYXJlIG5lZWRlZCBvbmx5XG5cdFx0Ly8gd2hlbiBhbiBleHRyYWN0ZWQgY29uc3RydWN0b3Igc2lnbmF0dXJlIG9yIFJlZ2lzdHJ5RW50cnkgcGFyZW50IHJlZmVycyB0byB0aGVtLlxuXHRcdC8vIFNraXAgY3VzdG9tLWNvbGxlY3Rpb24gdHlwZXMgdGhhdCBoYXZlIG5vIHVzZXItcHJvdmlkZWQgcmVnaXN0cnkgaW50ZXJmYWNlLlxuXHRcdGxpbmVzLnB1c2goJ2ltcG9ydCB0eXBlIHsnKTtcblx0XHRmb3IgKGNvbnN0IHJvb3Qgb2YgdGhpcy5ncmFwaC5yb290cy52YWx1ZXMoKSkge1xuXHRcdFx0Zm9yIChjb25zdCBub2RlIG9mIHRoaXMuZ3JhcGguZGZzKHJvb3QpKSB7XG5cdFx0XHRcdGlmIChub2RlLm1ldGFkYXRhT25seSB8fCAobm9kZS5jb2xsZWN0aW9uSWQgJiYgIW5vZGUucmVnaXN0cnlJbnRlcmZhY2VOYW1lKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGZ1bGxQYXRoID0gdGhpcy5nZXRGdWxsUGF0aChub2RlKTtcblx0XHRcdFx0Y29uc3QgaW5zdGFuY2VUeXBlTmFtZSA9IHRoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShub2RlKTtcblx0XHRcdFx0aWYgKGRlcml2ZWQuaGFzKGZ1bGxQYXRoKSkge1xuXHRcdFx0XHRcdGNvbnN0IHJlZmVyZW5jZSA9IG5ldyBSZWdFeHAoYFxcXFxiJHtpbnN0YW5jZVR5cGVOYW1lfVxcXFxiYCk7XG5cdFx0XHRcdFx0Y29uc3QgdXNlZCA9IGV4dHJhY3RlZFNpZ25hdHVyZXMuc29tZShzaWduYXR1cmUgPT4gcmVmZXJlbmNlLnRlc3Qoc2lnbmF0dXJlKSk7XG5cdFx0XHRcdFx0aWYgKCF1c2VkKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0bGluZXMucHVzaChgXFx0JHtpbnN0YW5jZVR5cGVOYW1lfSxgKTtcblx0XHRcdFx0Z2VuZXJhdGVkVHlwZXMucHVzaChpbnN0YW5jZVR5cGVOYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bGluZXMucHVzaChgfSBmcm9tICcke3RoaXMuaW1wb3J0UGF0aCgnLi90eXBlcycpfSc7YCk7XG5cdFx0bGluZXMucHVzaCgnJyk7XG5cblx0XHQvLyBHZW5lcmF0ZSBtb2R1bGUgYXVnbWVudGF0aW9uIGZvciBtbmVtb25pY2EgVHlwZVJlZ2lzdHJ5XG5cdFx0bGluZXMucHVzaCgnLyoqJyk7XG5cdFx0bGluZXMucHVzaCgnICogVHlwZSByZWdpc3RyeSBhdWdtZW50aW5nIG1uZW1vbmljYVxcJ3MgVHlwZVJlZ2lzdHJ5IGludGVyZmFjZScpO1xuXHRcdGxpbmVzLnB1c2goJyAqIFRoaXMgZW5hYmxlcyB0eXBlLXNhZmUgbG9va3VwKCkgd2l0aG91dCBleHBsaWNpdCB0eXBlIGFyZ3VtZW50cycpO1xuXHRcdGxpbmVzLnB1c2goJyAqJyk7XG5cdFx0bGluZXMucHVzaCgnICogVXNhZ2U6IGNvbnN0IFNvbWVUeXBlID0gbG9va3VwKFxcJ1NvbWVUeXBlXFwnKTsgLy8gRnVsbHkgdHlwZWQhJyk7XG5cdFx0bGluZXMucHVzaCgnICovJyk7XG5cdFx0bGluZXMucHVzaCgnZGVjbGFyZSBtb2R1bGUgXFwnbW5lbW9uaWNhXFwnIHsnKTtcblx0XHRjb25zdCBmcm9tQnVpbGRlciA9IHRoaXMuYnVpbGRlclZhbHVlcy5zb21lKHZhbHVlID0+IHZhbHVlLmtpbmQgPT09ICdyZWdpc3RyeU9mJyk7XG5cdFx0bGluZXMucHVzaChgXFx0aW50ZXJmYWNlIFR5cGVSZWdpc3RyeSAke2Zyb21CdWlsZGVyID8gJ2V4dGVuZHMgRnJvbUJ1aWxkZXIgJyA6ICcnfXtgKTtcblxuXHRcdC8vIEdlbmVyYXRlIGVudHJpZXMgZm9yIGFsbCB0eXBlIHBhdGhzIHRoYXQgYmVsb25nIHRvIHRoZSBkZWZhdWx0L2dsb2JhbCBjb2xsZWN0aW9uLlxuXHRcdC8vIFR5cGVzIHRoYXQgbGl2ZSBpbiBhIGN1c3RvbSBjb2xsZWN0aW9uIChjb2xsZWN0aW9uSWQgc2V0KSBhcmUgaXNvbGF0ZWQgYXQgcnVudGltZVxuXHRcdC8vIGFuZCBhcmUgbm90IHJlYWNoYWJsZSB0aHJvdWdoIGZyZWUgbG9va3VwKCksIHNvIHRoZXkgbXVzdCBub3QgYmUgYWRkZWQgdG8gdGhlXG5cdFx0Ly8gZ2xvYmFsIFR5cGVSZWdpc3RyeSBhdWdtZW50YXRpb24uXG5cdFx0Zm9yIChjb25zdCByb290IG9mIHRoaXMuZ3JhcGgucm9vdHMudmFsdWVzKCkpIHtcblx0XHRcdGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLmdyYXBoLmRmcyhyb290KSkge1xuXHRcdFx0XHRpZiAobm9kZS5jb2xsZWN0aW9uSWQgfHwgbm9kZS5tZXRhZGF0YU9ubHkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBmdWxsUGF0aCA9IHRoaXMuZ2V0RnVsbFBhdGgobm9kZSk7XG5cdFx0XHRcdGlmIChkZXJpdmVkLmhhcyhmdWxsUGF0aCkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBEZWZhdWx0IGV4dHJhY3RlZCBlbnRyaWVzIHVzZSBjb3JlJ3MgY29tcGxldGUgY29uc3RydWN0b3Igc3VyZmFjZS5cblx0XHRcdFx0Ly8gQXN5bmNSZWdpc3RyeUVudHJ5IG93bnMgdGhlIFByb21pc2UgcmVzdWx0LCBzbyBpdHMgRiBzdGF5cyB0aGVcblx0XHRcdFx0Ly8gcmVzb2x2ZWQgaW5zdGFuY2UgZm9yIGhvb2tzIGFuZCBpbmhlcml0YW5jZS5cblx0XHRcdFx0Y29uc3QgaW5zdGFuY2VUeXBlID0gdGhpcy5nZXRJbnN0YW5jZVR5cGVOYW1lKG5vZGUpO1xuXHRcdFx0XHRjb25zdCBwYXJlbnRUeXBlID0gbm9kZS5wYXJlbnQgPyB0aGlzLmdldEluc3RhbmNlVHlwZU5hbWUobm9kZS5wYXJlbnQpIDogJ29iamVjdCc7XG5cdFx0XHRcdGNvbnN0IGNvbnN0cnVjdG9yQXJncyA9IHRoaXMuZ2VuZXJhdGVDb25zdHJ1Y3RvckFyZ3Mobm9kZSk7XG5cdFx0XHRcdGNvbnN0IGVudHJ5S2luZCA9IG5vZGUuaXNBc3luYyA/ICdBc3luY1JlZ2lzdHJ5RW50cnknIDogJ1JlZ2lzdHJ5RW50cnknO1xuXHRcdFx0XHRjb25zdCBlbnRyeSA9IGAke2VudHJ5S2luZH08JHtpbnN0YW5jZVR5cGV9LCAnJHtmdWxsUGF0aH0nLCAke3BhcmVudFR5cGV9LCAke2NvbnN0cnVjdG9yQXJnc30+YDtcblx0XHRcdFx0bGluZXMucHVzaChgXFx0XFx0JyR7ZnVsbFBhdGh9JzogJHtlbnRyeX07YCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLmJ1aWxkZXJWYWx1ZXMpIHtcblx0XHRcdGlmICh2YWx1ZS5raW5kID09PSAndHlwZW9mJykge1xuXHRcdFx0XHRjb25zdCBpbXBvcnROYW1lID0gdGhpcy5idWlsZGVySW1wb3J0TmFtZSh2YWx1ZSk7XG5cdFx0XHRcdGxpbmVzLnB1c2goYFxcdFxcdCcke3ZhbHVlLmZ1bGxQYXRofSc6IHR5cGVvZiAke2ltcG9ydE5hbWV9O2ApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRsaW5lcy5wdXNoKCdcXHR9Jyk7XG5cdFx0bGluZXMucHVzaCgnfScpO1xuXHRcdGxpbmVzLnB1c2goJycpO1xuXG5cdFx0Ly8gR2VuZXJhdGUgcGVyLWNvbGxlY3Rpb24gcmVnaXN0cnkgYXVnbWVudGF0aW9ucyBmb3IgT3B0aW9uIEJcblx0XHQvLyAodXNlci1wcm92aWRlZCByZWdpc3RyeSBpbnRlcmZhY2VzKS5cblx0XHRjb25zdCBjb2xsZWN0aW9uR3JvdXBzID0gdGhpcy5ncm91cENvbGxlY3Rpb25SZWdpc3RyeU5vZGVzKCk7XG5cdFx0Zm9yIChjb25zdCBbIGtleSwgbm9kZXMgXSBvZiBjb2xsZWN0aW9uR3JvdXBzKSB7XG5cdFx0XHRjb25zdCBbIHJlZ2lzdHJ5SW50ZXJmYWNlTmFtZSwgc291cmNlRmlsZSBdID0ga2V5LnNwbGl0KCc6OicpO1xuXHRcdFx0Y29uc3QgbW9kdWxlUGF0aCA9IHRoaXMucmVzb2x2ZU1vZHVsZVBhdGgoc291cmNlRmlsZSk7XG5cdFx0XHRsaW5lcy5wdXNoKGBkZWNsYXJlIG1vZHVsZSAnJHttb2R1bGVQYXRofScge2ApO1xuXHRcdFx0bGluZXMucHVzaChgXFx0aW50ZXJmYWNlICR7cmVnaXN0cnlJbnRlcmZhY2VOYW1lfSB7YCk7XG5cdFx0XHRmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcblx0XHRcdFx0Y29uc3QgZnVsbFBhdGggPSB0aGlzLmdldEZ1bGxQYXRoKG5vZGUpO1xuXHRcdFx0XHRjb25zdCBpbnN0YW5jZVR5cGUgPSB0aGlzLmdldENvbnN0cnVjdG9yUmVzdWx0VHlwZShub2RlKTtcblx0XHRcdFx0Y29uc3QgY29uc3RydWN0b3JTaWcgPSB0aGlzLmdlbmVyYXRlQ29uc3RydWN0b3JTaWduYXR1cmUobm9kZSk7XG5cdFx0XHRcdGxpbmVzLnB1c2goYFxcdFxcdCcke2Z1bGxQYXRofSc6ICR7Y29uc3RydWN0b3JTaWd9ID0+ICR7aW5zdGFuY2VUeXBlfTtgKTtcblx0XHRcdH1cblx0XHRcdGxpbmVzLnB1c2goJ1xcdH0nKTtcblx0XHRcdGxpbmVzLnB1c2goJ30nKTtcblx0XHRcdGxpbmVzLnB1c2goJycpO1xuXHRcdH1cblxuXHRcdC8vIFJlLWV4cG9ydCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhbmQgZXhwbGljaXQgdXNhZ2Vcblx0XHRjb25zdCByZWdpc3RyeUltcG9ydHMgPSBbICdUeXBlUmVnaXN0cnknIF07XG5cdFx0aWYgKGZyb21CdWlsZGVyKSB7XG5cdFx0XHRyZWdpc3RyeUltcG9ydHMudW5zaGlmdCgnUmVnaXN0cnlPZicpO1xuXHRcdH1cblx0XHRpZiAobmVlZHNSZWdpc3RyeUVudHJ5KSB7XG5cdFx0XHRyZWdpc3RyeUltcG9ydHMudW5zaGlmdCgnUmVnaXN0cnlFbnRyeScpO1xuXHRcdH1cblx0XHRpZiAobmVlZHNBc3luY1JlZ2lzdHJ5RW50cnkpIHtcblx0XHRcdHJlZ2lzdHJ5SW1wb3J0cy51bnNoaWZ0KCdBc3luY1JlZ2lzdHJ5RW50cnknKTtcblx0XHR9XG5cdFx0bGluZXMucHVzaChgaW1wb3J0IHR5cGUgeyAke3JlZ2lzdHJ5SW1wb3J0cy5qb2luKCcsICcpfSB9IGZyb20gJ21uZW1vbmljYSc7YCk7XG5cdFx0bGluZXMucHVzaCgnZXhwb3J0IHR5cGUgeyBUeXBlUmVnaXN0cnkgfTsnKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRjb250ZW50IDogbGluZXMuam9pbignXFxuJyksXG5cdFx0XHR0eXBlcyAgIDogZ2VuZXJhdGVkVHlwZXMsXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHRcdCAqIEdlbmVyYXRlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBsaXN0IGZvciBhIHR5cGUgbm9kZSAodGhlIFwiKOKApilcIiBwYXJ0KVxuXHRcdCAqL1xuXHRwcml2YXRlIGdlbmVyYXRlQ29uc3RydWN0b3JQYXJhbXMgKG5vZGU6IFR5cGVOb2RlKTogc3RyaW5nIHtcblx0XHRjb25zdCBwYXJhbXMgPSBub2RlLmNvbnN0cnVjdG9yUGFyYW1zO1xuXHRcdGlmICghcGFyYW1zIHx8IHBhcmFtcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiAnKCknO1xuXHRcdH1cblx0XHRjb25zdCBwcm9wczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuXHRcdFx0Y29uc3Qgb3B0aW9uYWwgPSBwYXJhbS5vcHRpb25hbCA/ICc/JyA6ICcnO1xuXHRcdFx0Y29uc3QgcmVzdCA9IHBhcmFtLmtpbmQgPT09ICdyZXN0JyA/ICcuLi4nIDogJyc7XG5cdFx0XHRjb25zdCBhcnJheU1hdGNoID0gcmVzdCA/IC9eQXJyYXk8KC4rKT4kLy5leGVjKHBhcmFtLnR5cGUpIDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgdHlwZSA9IGFycmF5TWF0Y2ggPyBgJHthcnJheU1hdGNoWyAxIF19W11gIDogcGFyYW0udHlwZTtcblx0XHRcdHByb3BzLnB1c2goYCR7cmVzdH0ke3BhcmFtLm5hbWV9JHtvcHRpb25hbH06ICR7dHlwZX1gKTtcblx0XHR9XG5cdFx0cmV0dXJuIGAoJHtwcm9wcy5qb2luKCcsICcpfSlgO1xuXHR9XG5cblx0cHJpdmF0ZSBnZW5lcmF0ZUNvbnN0cnVjdG9yQXJncyAobm9kZTogVHlwZU5vZGUpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHBhcmFtcyA9IHRoaXMuZ2VuZXJhdGVDb25zdHJ1Y3RvclBhcmFtcyhub2RlKTtcblx0XHQvLyBTdGVwIDYgY2hhbmdlcyByZXN0IHBhcmFtZXRlcnMgaGVyZSB0byBbZGF0YTogVCwgLi4udmFsdWVzOiBudW1iZXJbXV0uXG5cdFx0Y29uc3QgcmVzdWx0ID0gYFske3BhcmFtcy5zbGljZSgxLCAtMSl9XWA7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qKlxuXHRcdCAqIEdlbmVyYXRlIGNvbnN0cnVjdG9yIHNpZ25hdHVyZSBmb3IgYSB0eXBlIG5vZGVcblx0XHQgKiBVc2VzIGNvbnN0cnVjdG9yUGFyYW1zIGZvciBUeXBlUmVnaXN0cnkgc2lnbmF0dXJlIChub3QgaW5zdGFuY2UgcHJvcGVydGllcylcblx0XHQgKi9cblx0cHJpdmF0ZSBnZW5lcmF0ZUNvbnN0cnVjdG9yU2lnbmF0dXJlIChub2RlOiBUeXBlTm9kZSk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGBuZXcgJHt0aGlzLmdlbmVyYXRlQ29uc3RydWN0b3JQYXJhbXMobm9kZSl9YDtcblx0fVxuXG5cdC8qKlxuXHRcdCAqIEdldCB0aGUgZnVsbCBkb3R0ZWQgcGF0aCBmb3IgYSB0eXBlIG5vZGVcblx0XHQgKi9cblx0cHJpdmF0ZSBnZXRGdWxsUGF0aCAobm9kZTogVHlwZU5vZGUpOiBzdHJpbmcge1xuXHRcdGlmICghbm9kZS5wYXJlbnQpIHtcblx0XHRcdHJldHVybiBub2RlLm5hbWU7XG5cdFx0fVxuXHRcdHJldHVybiBgJHt0aGlzLmdldEZ1bGxQYXRoKG5vZGUucGFyZW50KX0uJHtub2RlLm5hbWV9YDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGluc3RhbmNlIHR5cGUgbmFtZSBmb3IgYSBub2RlXG5cdCAqIFVzZXMgZnVsbCBwYXRoIHdpdGggdW5kZXJzY29yZXM6IFVzYWdlcy5Vc2FnZUVudHJ5IC0+IFVzYWdlc19Vc2FnZUVudHJ5XG5cdCAqIEZvciBPcHRpb24gQiBjdXN0b20gY29sbGVjdGlvbnMsIHByZWZpeGVzIHdpdGggdGhlIHJlZ2lzdHJ5IGludGVyZmFjZSBuYW1lLlxuXHQgKi9cblx0cHJpdmF0ZSBnZXRJbnN0YW5jZVR5cGVOYW1lIChub2RlOiBUeXBlTm9kZSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgZnVsbFBhdGggPSB0aGlzLmdldEZ1bGxQYXRoKG5vZGUpO1xuXHRcdGNvbnN0IHByZWZpeCA9IG5vZGUucmVnaXN0cnlJbnRlcmZhY2VOYW1lID8gYCR7bm9kZS5yZWdpc3RyeUludGVyZmFjZU5hbWV9X2AgOiAnJztcblx0XHRyZXR1cm4gYCR7cHJlZml4fSR7ZnVsbFBhdGgucmVwbGFjZSgvXFwuL2csICdfJyl9YDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXNvbHZlIGEgc2ltcGxlIHR5cGUgbmFtZSB0byBpdHMgZnVsbCBwYXRoIG5hbWVcblx0ICogZS5nLiwgXCJEZWZpbml0aW9uRW50cnlcIiAtPiBcIkRlZmluaXRpb25zX0RlZmluaXRpb25FbnRyeVwiXG5cdCAqXG5cdCAqIFdpdGggYSByZWZlcmVuY2VSZXNvbHZlciBpbnN0YWxsZWQgKHRoZSBDTEkgcGF0aCksIHJlc29sdXRpb24gaXNcblx0ICogcGF0aC1hd2FyZSBwZXIgdGhlIGdyYXBoIGlkZW50aXR5IGxhdzogdGhlIHJlc29sdmVyIHJldHVybnMgdGhlIHVuaXF1ZVxuXHQgKiB0eXBlLCAnYW1iaWd1b3VzJywgb3IgdW5kZWZpbmVkIOKAlCB0aGUgbGF0dGVyIHR3byByZWNvcmQgYSBoYXJkLWZhaWxcblx0ICogUmVzb2x1dGlvbkVycm9yIGFuZCBlbWl0IGB1bmtub3duYCBpbnN0ZWFkIG9mIHNpbGVudGx5IHBpY2tpbmcgYVxuXHQgKiBmaXJzdCBtYXRjaC4gV2l0aG91dCBhIHJlc29sdmVyIHRoZSBsZWdhY3kgZmlyc3QtbWF0Y2ggc2NhbiBzdGF5cy5cblx0ICovXG5cdHByaXZhdGUgcmVzb2x2ZVR5cGVOYW1lIChzaW1wbGVOYW1lOiBzdHJpbmcsIGN1cnJlbnROb2RlOiBUeXBlTm9kZSk6IHN0cmluZyB7XG5cdFx0aWYgKHRoaXMucmVmZXJlbmNlUmVzb2x2ZXIpIHtcblx0XHRcdGNvbnN0IHJlc29sdmVkID0gdGhpcy5yZWZlcmVuY2VSZXNvbHZlcihzaW1wbGVOYW1lLCBjdXJyZW50Tm9kZSk7XG5cdFx0XHRpZiAocmVzb2x2ZWQgJiYgcmVzb2x2ZWQgIT09ICdhbWJpZ3VvdXMnKSB7XG5cdFx0XHRcdGNvbnN0IGluc3RhbmNlTmFtZSA9IHRoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShyZXNvbHZlZCk7XG5cdFx0XHRcdHJldHVybiBpbnN0YW5jZU5hbWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBhbmNob3JMb2NhdGlvbiA9IGAke2N1cnJlbnROb2RlLnNvdXJjZUZpbGV9OiR7Y3VycmVudE5vZGUubGluZX06JHtjdXJyZW50Tm9kZS5jb2x1bW59YDtcblx0XHRcdGNvbnN0IGFtYmlndW91c0dlbmVyYXRpb25NZXNzYWdlID0gYEFtYmlndW91cyByZWZlcmVuY2UgdG8gbW5lbW9uaWNhIHR5cGUgJyR7c2ltcGxlTmFtZX0nIGAgK1xuXHRcdFx0XHRgd2hpbGUgZ2VuZXJhdGluZyAnJHt0aGlzLmdldEZ1bGxQYXRoKGN1cnJlbnROb2RlKX0nYDtcblx0XHRcdGNvbnN0IHVucmVzb2x2ZWRHZW5lcmF0aW9uTWVzc2FnZSA9IGBVbnJlc29sdmVkIHJlZmVyZW5jZSB0byBtbmVtb25pY2EgdHlwZSAnJHtzaW1wbGVOYW1lfScgYCArXG5cdFx0XHRcdGB3aGlsZSBnZW5lcmF0aW5nICcke3RoaXMuZ2V0RnVsbFBhdGgoY3VycmVudE5vZGUpfSdgO1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IHJlc29sdmVkID09PSAnYW1iaWd1b3VzJ1xuXHRcdFx0XHQ/IGFtYmlndW91c0dlbmVyYXRpb25NZXNzYWdlXG5cdFx0XHRcdDogdW5yZXNvbHZlZEdlbmVyYXRpb25NZXNzYWdlO1xuXHRcdFx0Y29uc3QgZXJyb3I6IFJlc29sdXRpb25FcnJvciA9IHsgbWVzc2FnZSwgbG9jYXRpb25zIDogWyBhbmNob3JMb2NhdGlvbiBdIH07XG5cdFx0XHR0aGlzLnJlc29sdXRpb25FcnJvcnMucHVzaChlcnJvcik7XG5cdFx0XHRjb25zdCB1bmtub3duUmVzdWx0ID0gJ3Vua25vd24nO1xuXHRcdFx0cmV0dXJuIHVua25vd25SZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Ly8gRmlyc3QgY2hlY2sgaWYgaXQncyB0aGUgY3VycmVudCBub2RlIG9yIGl0cyBjaGlsZHJlblxuXHRcdGlmIChjdXJyZW50Tm9kZS5uYW1lID09PSBzaW1wbGVOYW1lKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRJbnN0YW5jZVR5cGVOYW1lKGN1cnJlbnROb2RlKTtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBjaGlsZCBvZiBjdXJyZW50Tm9kZS5jaGlsZHJlbi52YWx1ZXMoKSkge1xuXHRcdFx0aWYgKGNoaWxkLm5hbWUgPT09IHNpbXBsZU5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0SW5zdGFuY2VUeXBlTmFtZShjaGlsZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIFNlYXJjaCBhbGwgdHlwZXMgaW4gdGhlIGdyYXBoXG5cdFx0Zm9yIChjb25zdCB0eXBlIG9mIHRoaXMuZ3JhcGguZ2V0QWxsVHlwZXMoKSkge1xuXHRcdFx0aWYgKHR5cGUubmFtZSA9PT0gc2ltcGxlTmFtZSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRJbnN0YW5jZVR5cGVOYW1lKHR5cGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc2ltcGxlTmFtZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYXJkLWZhaWwgZ3JhcGggcmVmZXJlbmNlIGVycm9ycyByZWNvcmRlZCB3aGlsZSBnZW5lcmF0aW5nIChzZWVcblx0ICogcmVmZXJlbmNlUmVzb2x2ZXIpLiBUaGUgQ0xJIHByaW50cyBldmVyeSBsb2NhdGlvbiBhbmQgd3JpdGVzIG5vIG91dHB1dC5cblx0ICovXG5cdGdldFJlc29sdXRpb25FcnJvcnMgKCk6IFJlc29sdXRpb25FcnJvcltdIHtcblx0XHRjb25zdCByZXN1bHQgPSBbIC4uLnRoaXMucmVzb2x1dGlvbkVycm9ycyBdO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogUmVzb2x2ZSBzaW1wbGUgdHlwZSBuYW1lcyB0byBmdWxsIHBhdGggbmFtZXMgd2l0aGluIGEgdHlwZSBzdHJpbmdcblx0ICogSGFuZGxlcyBjb21wbGV4IHR5cGVzIGxpa2UgQXJyYXk8VXNhZ2VFbnRyeT4sIE1hcDxzdHJpbmcsIFR5cGVFbnRyeT4sIGV0Yy5cblx0ICovXG5cdHByaXZhdGUgcmVzb2x2ZVR5cGVJblN0cmluZyAodHlwZVN0cjogc3RyaW5nLCBjdXJyZW50Tm9kZTogVHlwZU5vZGUpOiBzdHJpbmcge1xuXHRcdC8vIEdldCBhbGwgdHlwZSBuYW1lcyBmcm9tIHRoZSBncmFwaFxuXHRcdGNvbnN0IGFsbFR5cGVzID0gdGhpcy5ncmFwaC5nZXRBbGxUeXBlcygpO1xuXHRcdGNvbnN0IHR5cGVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRcdGZvciAoY29uc3QgdHlwZSBvZiBhbGxUeXBlcykge1xuXHRcdFx0dHlwZU5hbWVzLmFkZCh0eXBlLm5hbWUpO1xuXHRcdH1cblxuXHRcdC8vIFNvcnQgYnkgbGVuZ3RoIChsb25nZXN0IGZpcnN0KSB0byBhdm9pZCBwYXJ0aWFsIHJlcGxhY2VtZW50c1xuXHRcdGNvbnN0IHNvcnRlZE5hbWVzID0gQXJyYXkuZnJvbSh0eXBlTmFtZXMpLnNvcnQoKGEsIGIpID0+IGIubGVuZ3RoIC0gYS5sZW5ndGgpO1xuXG5cdFx0Ly8gUmVwbGFjZSBlYWNoIHNpbXBsZSB0eXBlIG5hbWUgd2l0aCBpdHMgZnVsbCBwYXRoIHZlcnNpb25cblx0XHRsZXQgcmVzdWx0ID0gdHlwZVN0cjtcblx0XHRmb3IgKGNvbnN0IG5hbWUgb2Ygc29ydGVkTmFtZXMpIHtcblx0XHRcdC8vIFNraXAgbmFtZXMgdGhhdCBkbyBub3Qgb2NjdXIg4oCUIHdpdGggYSByZWZlcmVuY2VSZXNvbHZlciBpbnN0YWxsZWQsXG5cdFx0XHQvLyByZXNvbHZpbmcgYWJzZW50IG5hbWVzIHdvdWxkIHJlY29yZCBzcHVyaW91cyBlcnJvcnNcblx0XHRcdGNvbnN0IG9jY3VycyA9IG5ldyBSZWdFeHAoYFxcXFxiJHtuYW1lfVxcXFxiYCkudGVzdChyZXN1bHQpO1xuXHRcdFx0aWYgKCFvY2N1cnMpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHQvLyBVc2Ugd29yZCBib3VuZGFyeSBtYXRjaGluZyB0byBhdm9pZCByZXBsYWNpbmcgcGFydGlhbCBuYW1lc1xuXHRcdFx0Y29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBcXFxcYiR7bmFtZX1cXFxcYmAsICdnJyk7XG5cdFx0XHRjb25zdCBmdWxsVHlwZU5hbWUgPSB0aGlzLnJlc29sdmVUeXBlTmFtZShuYW1lLCBjdXJyZW50Tm9kZSk7XG5cdFx0XHRpZiAoZnVsbFR5cGVOYW1lICE9PSBuYW1lKSB7XG5cdFx0XHRcdHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKHJlZ2V4LCBmdWxsVHlwZU5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdyb3VwIGNvbGxlY3Rpb24gdHlwZSBub2RlcyBieSB0aGVpciByZWdpc3RyeSBpbnRlcmZhY2UgbmFtZSBhbmQgdGhlXG5cdCAqIGNvbGxlY3Rpb24ncyBob21lIGZpbGUgKHRoZSBtb2R1bGUgZGVjbGFyaW5nIHRoZSBpbnRlcmZhY2Ug4oCUIHRoZVxuXHQgKiBhdWdtZW50YXRpb24gdGFyZ2V0KSwgTk9UIGVhY2ggdHlwZSdzIG93biBkZWZpbmUgZmlsZTogbXVsdGktZmlsZVxuXHQgKiBjb2xsZWN0aW9ucyBkZWZpbmUgdHlwZXMgYWNyb3NzIG1hbnkgbW9kdWxlcy5cblx0ICogUmV0dXJucyBhIG1hcCBrZXllZCBieSBgJHtyZWdpc3RyeUludGVyZmFjZU5hbWV9Ojoke3NvdXJjZUZpbGV9YC5cblx0ICovXG5cdHByaXZhdGUgZ3JvdXBDb2xsZWN0aW9uUmVnaXN0cnlOb2RlcyAoKTogTWFwPHN0cmluZywgVHlwZU5vZGVbXT4ge1xuXHRcdGNvbnN0IGdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBUeXBlTm9kZVtdPigpO1xuXHRcdGZvciAoY29uc3Qgcm9vdCBvZiB0aGlzLmdyYXBoLnJvb3RzLnZhbHVlcygpKSB7XG5cdFx0XHRmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcy5ncmFwaC5kZnMocm9vdCkpIHtcblx0XHRcdFx0aWYgKG5vZGUubWV0YWRhdGFPbmx5IHx8ICFub2RlLnJlZ2lzdHJ5SW50ZXJmYWNlTmFtZSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGhvbWVGaWxlID0gbm9kZS5jb2xsZWN0aW9uU291cmNlRmlsZSA/PyBub2RlLnNvdXJjZUZpbGU7XG5cdFx0XHRcdGNvbnN0IGtleSA9IGAke25vZGUucmVnaXN0cnlJbnRlcmZhY2VOYW1lfTo6JHtob21lRmlsZX1gO1xuXHRcdFx0XHRjb25zdCBleGlzdGluZyA9IGdyb3Vwcy5nZXQoa2V5KTtcblx0XHRcdFx0aWYgKGV4aXN0aW5nKSB7XG5cdFx0XHRcdFx0ZXhpc3RpbmcucHVzaChub2RlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRncm91cHMuc2V0KGtleSwgWyBub2RlIF0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBncm91cHM7XG5cdH1cblxuXHQvKipcblx0ICogUmVzb2x2ZSBhIHNvdXJjZSBmaWxlIHBhdGggdG8gYSBtb2R1bGUgc3BlY2lmaWVyIHJlbGF0aXZlIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LFxuXHQgKiBzdWl0YWJsZSBmb3IgdXNlIGluIGEgYGRlY2xhcmUgbW9kdWxlICcuLi4nYCBibG9jay5cblx0ICovXG5cdHByaXZhdGUgcmVzb2x2ZU1vZHVsZVBhdGggKHNvdXJjZUZpbGU6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgb3V0cHV0QWJzb2x1dGUgPSBwYXRoLnJlc29sdmUodGhpcy5vdXRwdXREaXIpO1xuXHRcdGNvbnN0IHNvdXJjZUFic29sdXRlID0gcGF0aC5yZXNvbHZlKHNvdXJjZUZpbGUpO1xuXHRcdGxldCByZWxhdGl2ZSA9IHBhdGgucmVsYXRpdmUob3V0cHV0QWJzb2x1dGUsIHNvdXJjZUFic29sdXRlKTtcblx0XHQvLyBSZW1vdmUgLnRzIGV4dGVuc2lvbjsga2VlcCAudHN4IGlmIHByZXNlbnRcblx0XHRpZiAocmVsYXRpdmUuZW5kc1dpdGgoJy50cycpICYmICFyZWxhdGl2ZS5lbmRzV2l0aCgnLnRzeCcpKSB7XG5cdFx0XHRyZWxhdGl2ZSA9IHJlbGF0aXZlLnNsaWNlKDAsIC0zKTtcblx0XHR9XG5cdFx0Ly8gQ29udmVydCBXaW5kb3dzIHNlcGFyYXRvcnMgdG8gUE9TSVhcblx0XHRjb25zdCBwb3NpeFJlbGF0aXZlID0gcmVsYXRpdmUucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXHRcdHJldHVybiBwb3NpeFJlbGF0aXZlO1xuXHR9XG59XG4iXX0=
|