1 | (function (factory) {
|
---|
2 | if (typeof module === "object" && typeof module.exports === "object") {
|
---|
3 | var v = factory(require, exports);
|
---|
4 | if (v !== undefined) module.exports = v;
|
---|
5 | }
|
---|
6 | else if (typeof define === "function" && define.amd) {
|
---|
7 | define("@angular/compiler-cli/src/metadata/bundler", ["require", "exports", "tslib", "path", "typescript", "@angular/compiler-cli/src/metadata/collector", "@angular/compiler-cli/src/metadata/schema"], factory);
|
---|
8 | }
|
---|
9 | })(function (require, exports) {
|
---|
10 | "use strict";
|
---|
11 | Object.defineProperty(exports, "__esModule", { value: true });
|
---|
12 | exports.CompilerHostAdapter = exports.MetadataBundler = void 0;
|
---|
13 | var tslib_1 = require("tslib");
|
---|
14 | /**
|
---|
15 | * @license
|
---|
16 | * Copyright Google LLC All Rights Reserved.
|
---|
17 | *
|
---|
18 | * Use of this source code is governed by an MIT-style license that can be
|
---|
19 | * found in the LICENSE file at https://angular.io/license
|
---|
20 | */
|
---|
21 | var path = require("path");
|
---|
22 | var ts = require("typescript");
|
---|
23 | var collector_1 = require("@angular/compiler-cli/src/metadata/collector");
|
---|
24 | var schema_1 = require("@angular/compiler-cli/src/metadata/schema");
|
---|
25 | // The character set used to produce private names.
|
---|
26 | var PRIVATE_NAME_CHARS = 'abcdefghijklmnopqrstuvwxyz';
|
---|
27 | var MetadataBundler = /** @class */ (function () {
|
---|
28 | function MetadataBundler(root, importAs, host, privateSymbolPrefix) {
|
---|
29 | this.root = root;
|
---|
30 | this.importAs = importAs;
|
---|
31 | this.host = host;
|
---|
32 | this.symbolMap = new Map();
|
---|
33 | this.metadataCache = new Map();
|
---|
34 | this.exports = new Map();
|
---|
35 | this.rootModule = "./" + path.basename(root);
|
---|
36 | this.privateSymbolPrefix = (privateSymbolPrefix || '').replace(/\W/g, '_');
|
---|
37 | }
|
---|
38 | MetadataBundler.prototype.getMetadataBundle = function () {
|
---|
39 | // Export the root module. This also collects the transitive closure of all values referenced by
|
---|
40 | // the exports.
|
---|
41 | var exportedSymbols = this.exportAll(this.rootModule);
|
---|
42 | this.canonicalizeSymbols(exportedSymbols);
|
---|
43 | // TODO: exports? e.g. a module re-exports a symbol from another bundle
|
---|
44 | var metadata = this.getEntries(exportedSymbols);
|
---|
45 | var privates = Array.from(this.symbolMap.values())
|
---|
46 | .filter(function (s) { return s.referenced && s.isPrivate; })
|
---|
47 | .map(function (s) { return ({
|
---|
48 | privateName: s.privateName,
|
---|
49 | name: s.declaration.name,
|
---|
50 | module: s.declaration.module
|
---|
51 | }); });
|
---|
52 | var origins = Array.from(this.symbolMap.values())
|
---|
53 | .filter(function (s) { return s.referenced && !s.reexport; })
|
---|
54 | .reduce(function (p, s) {
|
---|
55 | p[s.isPrivate ? s.privateName : s.name] = s.declaration.module;
|
---|
56 | return p;
|
---|
57 | }, {});
|
---|
58 | var exports = this.getReExports(exportedSymbols);
|
---|
59 | return {
|
---|
60 | metadata: {
|
---|
61 | __symbolic: 'module',
|
---|
62 | version: schema_1.METADATA_VERSION,
|
---|
63 | exports: exports.length ? exports : undefined,
|
---|
64 | metadata: metadata,
|
---|
65 | origins: origins,
|
---|
66 | importAs: this.importAs
|
---|
67 | },
|
---|
68 | privates: privates
|
---|
69 | };
|
---|
70 | };
|
---|
71 | MetadataBundler.resolveModule = function (importName, from) {
|
---|
72 | return resolveModule(importName, from);
|
---|
73 | };
|
---|
74 | MetadataBundler.prototype.getMetadata = function (moduleName) {
|
---|
75 | var result = this.metadataCache.get(moduleName);
|
---|
76 | if (!result) {
|
---|
77 | if (moduleName.startsWith('.')) {
|
---|
78 | var fullModuleName = resolveModule(moduleName, this.root);
|
---|
79 | result = this.host.getMetadataFor(fullModuleName, this.root);
|
---|
80 | }
|
---|
81 | this.metadataCache.set(moduleName, result);
|
---|
82 | }
|
---|
83 | return result;
|
---|
84 | };
|
---|
85 | MetadataBundler.prototype.exportAll = function (moduleName) {
|
---|
86 | var e_1, _a, e_2, _b, e_3, _c;
|
---|
87 | var _this = this;
|
---|
88 | var module = this.getMetadata(moduleName);
|
---|
89 | var result = this.exports.get(moduleName);
|
---|
90 | if (result) {
|
---|
91 | return result;
|
---|
92 | }
|
---|
93 | result = [];
|
---|
94 | var exportSymbol = function (exportedSymbol, exportAs) {
|
---|
95 | var symbol = _this.symbolOf(moduleName, exportAs);
|
---|
96 | result.push(symbol);
|
---|
97 | exportedSymbol.reexportedAs = symbol;
|
---|
98 | symbol.exports = exportedSymbol;
|
---|
99 | };
|
---|
100 | // Export all the symbols defined in this module.
|
---|
101 | if (module && module.metadata) {
|
---|
102 | for (var key in module.metadata) {
|
---|
103 | var data = module.metadata[key];
|
---|
104 | if (schema_1.isMetadataImportedSymbolReferenceExpression(data)) {
|
---|
105 | // This is a re-export of an imported symbol. Record this as a re-export.
|
---|
106 | var exportFrom = resolveModule(data.module, moduleName);
|
---|
107 | this.exportAll(exportFrom);
|
---|
108 | var symbol = this.symbolOf(exportFrom, data.name);
|
---|
109 | exportSymbol(symbol, key);
|
---|
110 | }
|
---|
111 | else {
|
---|
112 | // Record that this symbol is exported by this module.
|
---|
113 | result.push(this.symbolOf(moduleName, key));
|
---|
114 | }
|
---|
115 | }
|
---|
116 | }
|
---|
117 | // Export all the re-exports from this module
|
---|
118 | if (module && module.exports) {
|
---|
119 | var unnamedModuleExportsIdx = 0;
|
---|
120 | try {
|
---|
121 | for (var _d = tslib_1.__values(module.exports), _e = _d.next(); !_e.done; _e = _d.next()) {
|
---|
122 | var exportDeclaration = _e.value;
|
---|
123 | var exportFrom = resolveModule(exportDeclaration.from, moduleName);
|
---|
124 | // Record all the exports from the module even if we don't use it directly.
|
---|
125 | var exportedSymbols = this.exportAll(exportFrom);
|
---|
126 | if (exportDeclaration.export) {
|
---|
127 | try {
|
---|
128 | // Re-export all the named exports from a module.
|
---|
129 | for (var _f = (e_2 = void 0, tslib_1.__values(exportDeclaration.export)), _g = _f.next(); !_g.done; _g = _f.next()) {
|
---|
130 | var exportItem = _g.value;
|
---|
131 | var name = typeof exportItem == 'string' ? exportItem : exportItem.name;
|
---|
132 | var exportAs = typeof exportItem == 'string' ? exportItem : exportItem.as;
|
---|
133 | var symbol = this.symbolOf(exportFrom, name);
|
---|
134 | if (exportedSymbols && exportedSymbols.length == 1 && exportedSymbols[0].reexport &&
|
---|
135 | exportedSymbols[0].name == '*') {
|
---|
136 | // This is a named export from a module we have no metadata about. Record the named
|
---|
137 | // export as a re-export.
|
---|
138 | symbol.reexport = true;
|
---|
139 | }
|
---|
140 | exportSymbol(this.symbolOf(exportFrom, name), exportAs);
|
---|
141 | }
|
---|
142 | }
|
---|
143 | catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
---|
144 | finally {
|
---|
145 | try {
|
---|
146 | if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
|
---|
147 | }
|
---|
148 | finally { if (e_2) throw e_2.error; }
|
---|
149 | }
|
---|
150 | }
|
---|
151 | else {
|
---|
152 | // Re-export all the symbols from the module
|
---|
153 | var exportedSymbols_2 = this.exportAll(exportFrom);
|
---|
154 | try {
|
---|
155 | for (var exportedSymbols_1 = (e_3 = void 0, tslib_1.__values(exportedSymbols_2)), exportedSymbols_1_1 = exportedSymbols_1.next(); !exportedSymbols_1_1.done; exportedSymbols_1_1 = exportedSymbols_1.next()) {
|
---|
156 | var exportedSymbol = exportedSymbols_1_1.value;
|
---|
157 | // In case the exported symbol does not have a name, we need to give it an unique
|
---|
158 | // name for the current module. This is necessary because there can be multiple
|
---|
159 | // unnamed re-exports in a given module.
|
---|
160 | var name = exportedSymbol.name === '*' ?
|
---|
161 | "unnamed_reexport_" + unnamedModuleExportsIdx++ :
|
---|
162 | exportedSymbol.name;
|
---|
163 | exportSymbol(exportedSymbol, name);
|
---|
164 | }
|
---|
165 | }
|
---|
166 | catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
---|
167 | finally {
|
---|
168 | try {
|
---|
169 | if (exportedSymbols_1_1 && !exportedSymbols_1_1.done && (_c = exportedSymbols_1.return)) _c.call(exportedSymbols_1);
|
---|
170 | }
|
---|
171 | finally { if (e_3) throw e_3.error; }
|
---|
172 | }
|
---|
173 | }
|
---|
174 | }
|
---|
175 | }
|
---|
176 | catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
---|
177 | finally {
|
---|
178 | try {
|
---|
179 | if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
|
---|
180 | }
|
---|
181 | finally { if (e_1) throw e_1.error; }
|
---|
182 | }
|
---|
183 | }
|
---|
184 | if (!module) {
|
---|
185 | // If no metadata is found for this import then it is considered external to the
|
---|
186 | // library and should be recorded as a re-export in the final metadata if it is
|
---|
187 | // eventually re-exported.
|
---|
188 | var symbol = this.symbolOf(moduleName, '*');
|
---|
189 | symbol.reexport = true;
|
---|
190 | result.push(symbol);
|
---|
191 | }
|
---|
192 | this.exports.set(moduleName, result);
|
---|
193 | return result;
|
---|
194 | };
|
---|
195 | /**
|
---|
196 | * Fill in the canonicalSymbol which is the symbol that should be imported by factories.
|
---|
197 | * The canonical symbol is the one exported by the index file for the bundle or definition
|
---|
198 | * symbol for private symbols that are not exported by bundle index.
|
---|
199 | */
|
---|
200 | MetadataBundler.prototype.canonicalizeSymbols = function (exportedSymbols) {
|
---|
201 | var symbols = Array.from(this.symbolMap.values());
|
---|
202 | this.exported = new Set(exportedSymbols);
|
---|
203 | symbols.forEach(this.canonicalizeSymbol, this);
|
---|
204 | };
|
---|
205 | MetadataBundler.prototype.canonicalizeSymbol = function (symbol) {
|
---|
206 | var rootExport = getRootExport(symbol);
|
---|
207 | var declaration = getSymbolDeclaration(symbol);
|
---|
208 | var isPrivate = !this.exported.has(rootExport);
|
---|
209 | var canonicalSymbol = isPrivate ? declaration : rootExport;
|
---|
210 | symbol.isPrivate = isPrivate;
|
---|
211 | symbol.declaration = declaration;
|
---|
212 | symbol.canonicalSymbol = canonicalSymbol;
|
---|
213 | symbol.reexport = declaration.reexport;
|
---|
214 | };
|
---|
215 | MetadataBundler.prototype.getEntries = function (exportedSymbols) {
|
---|
216 | var _this = this;
|
---|
217 | var result = {};
|
---|
218 | var exportedNames = new Set(exportedSymbols.map(function (s) { return s.name; }));
|
---|
219 | var privateName = 0;
|
---|
220 | function newPrivateName(prefix) {
|
---|
221 | while (true) {
|
---|
222 | var digits = [];
|
---|
223 | var index = privateName++;
|
---|
224 | var base = PRIVATE_NAME_CHARS;
|
---|
225 | while (!digits.length || index > 0) {
|
---|
226 | digits.unshift(base[index % base.length]);
|
---|
227 | index = Math.floor(index / base.length);
|
---|
228 | }
|
---|
229 | var result_1 = "\u0275" + prefix + digits.join('');
|
---|
230 | if (!exportedNames.has(result_1))
|
---|
231 | return result_1;
|
---|
232 | }
|
---|
233 | }
|
---|
234 | exportedSymbols.forEach(function (symbol) { return _this.convertSymbol(symbol); });
|
---|
235 | var symbolsMap = new Map();
|
---|
236 | Array.from(this.symbolMap.values()).forEach(function (symbol) {
|
---|
237 | if (symbol.referenced && !symbol.reexport) {
|
---|
238 | var name = symbol.name;
|
---|
239 | var identifier = symbol.declaration.module + ":" + symbol.declaration.name;
|
---|
240 | if (symbol.isPrivate && !symbol.privateName) {
|
---|
241 | name = newPrivateName(_this.privateSymbolPrefix);
|
---|
242 | symbol.privateName = name;
|
---|
243 | }
|
---|
244 | if (symbolsMap.has(identifier)) {
|
---|
245 | var names = symbolsMap.get(identifier);
|
---|
246 | names.push(name);
|
---|
247 | }
|
---|
248 | else {
|
---|
249 | symbolsMap.set(identifier, [name]);
|
---|
250 | }
|
---|
251 | result[name] = symbol.value;
|
---|
252 | }
|
---|
253 | });
|
---|
254 | // check for duplicated entries
|
---|
255 | symbolsMap.forEach(function (names, identifier) {
|
---|
256 | if (names.length > 1) {
|
---|
257 | var _a = tslib_1.__read(identifier.split(':'), 2), module_1 = _a[0], declaredName = _a[1];
|
---|
258 | // prefer the export that uses the declared name (if any)
|
---|
259 | var reference_1 = names.indexOf(declaredName);
|
---|
260 | if (reference_1 === -1) {
|
---|
261 | reference_1 = 0;
|
---|
262 | }
|
---|
263 | // keep one entry and replace the others by references
|
---|
264 | names.forEach(function (name, i) {
|
---|
265 | if (i !== reference_1) {
|
---|
266 | result[name] = { __symbolic: 'reference', name: names[reference_1] };
|
---|
267 | }
|
---|
268 | });
|
---|
269 | }
|
---|
270 | });
|
---|
271 | return result;
|
---|
272 | };
|
---|
273 | MetadataBundler.prototype.getReExports = function (exportedSymbols) {
|
---|
274 | var e_4, _a;
|
---|
275 | var modules = new Map();
|
---|
276 | var exportAlls = new Set();
|
---|
277 | try {
|
---|
278 | for (var exportedSymbols_3 = tslib_1.__values(exportedSymbols), exportedSymbols_3_1 = exportedSymbols_3.next(); !exportedSymbols_3_1.done; exportedSymbols_3_1 = exportedSymbols_3.next()) {
|
---|
279 | var symbol = exportedSymbols_3_1.value;
|
---|
280 | if (symbol.reexport) {
|
---|
281 | // symbol.declaration is guaranteed to be defined during the phase this method is called.
|
---|
282 | var declaration = symbol.declaration;
|
---|
283 | var module_2 = declaration.module;
|
---|
284 | if (declaration.name == '*') {
|
---|
285 | // Reexport all the symbols.
|
---|
286 | exportAlls.add(declaration.module);
|
---|
287 | }
|
---|
288 | else {
|
---|
289 | // Re-export the symbol as the exported name.
|
---|
290 | var entry = modules.get(module_2);
|
---|
291 | if (!entry) {
|
---|
292 | entry = [];
|
---|
293 | modules.set(module_2, entry);
|
---|
294 | }
|
---|
295 | var as = symbol.name;
|
---|
296 | var name = declaration.name;
|
---|
297 | entry.push({ name: name, as: as });
|
---|
298 | }
|
---|
299 | }
|
---|
300 | }
|
---|
301 | }
|
---|
302 | catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
---|
303 | finally {
|
---|
304 | try {
|
---|
305 | if (exportedSymbols_3_1 && !exportedSymbols_3_1.done && (_a = exportedSymbols_3.return)) _a.call(exportedSymbols_3);
|
---|
306 | }
|
---|
307 | finally { if (e_4) throw e_4.error; }
|
---|
308 | }
|
---|
309 | return tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(Array.from(exportAlls.values()).map(function (from) { return ({ from: from }); }))), tslib_1.__read(Array.from(modules.entries()).map(function (_a) {
|
---|
310 | var _b = tslib_1.__read(_a, 2), from = _b[0], exports = _b[1];
|
---|
311 | return ({ export: exports, from: from });
|
---|
312 | })));
|
---|
313 | };
|
---|
314 | MetadataBundler.prototype.convertSymbol = function (symbol) {
|
---|
315 | // canonicalSymbol is ensured to be defined before this is called.
|
---|
316 | var canonicalSymbol = symbol.canonicalSymbol;
|
---|
317 | if (!canonicalSymbol.referenced) {
|
---|
318 | canonicalSymbol.referenced = true;
|
---|
319 | // declaration is ensured to be definded before this method is called.
|
---|
320 | var declaration = canonicalSymbol.declaration;
|
---|
321 | var module_3 = this.getMetadata(declaration.module);
|
---|
322 | if (module_3) {
|
---|
323 | var value = module_3.metadata[declaration.name];
|
---|
324 | if (value && !declaration.name.startsWith('___')) {
|
---|
325 | canonicalSymbol.value = this.convertEntry(declaration.module, value);
|
---|
326 | }
|
---|
327 | }
|
---|
328 | }
|
---|
329 | };
|
---|
330 | MetadataBundler.prototype.convertEntry = function (moduleName, value) {
|
---|
331 | if (schema_1.isClassMetadata(value)) {
|
---|
332 | return this.convertClass(moduleName, value);
|
---|
333 | }
|
---|
334 | if (schema_1.isFunctionMetadata(value)) {
|
---|
335 | return this.convertFunction(moduleName, value);
|
---|
336 | }
|
---|
337 | if (schema_1.isInterfaceMetadata(value)) {
|
---|
338 | return value;
|
---|
339 | }
|
---|
340 | return this.convertValue(moduleName, value);
|
---|
341 | };
|
---|
342 | MetadataBundler.prototype.convertClass = function (moduleName, value) {
|
---|
343 | var _this = this;
|
---|
344 | return {
|
---|
345 | __symbolic: 'class',
|
---|
346 | arity: value.arity,
|
---|
347 | extends: this.convertExpression(moduleName, value.extends),
|
---|
348 | decorators: value.decorators && value.decorators.map(function (d) { return _this.convertExpression(moduleName, d); }),
|
---|
349 | members: this.convertMembers(moduleName, value.members),
|
---|
350 | statics: value.statics && this.convertStatics(moduleName, value.statics)
|
---|
351 | };
|
---|
352 | };
|
---|
353 | MetadataBundler.prototype.convertMembers = function (moduleName, members) {
|
---|
354 | var _this = this;
|
---|
355 | var result = {};
|
---|
356 | for (var name in members) {
|
---|
357 | var value = members[name];
|
---|
358 | result[name] = value.map(function (v) { return _this.convertMember(moduleName, v); });
|
---|
359 | }
|
---|
360 | return result;
|
---|
361 | };
|
---|
362 | MetadataBundler.prototype.convertMember = function (moduleName, member) {
|
---|
363 | var _this = this;
|
---|
364 | var result = { __symbolic: member.__symbolic };
|
---|
365 | result.decorators =
|
---|
366 | member.decorators && member.decorators.map(function (d) { return _this.convertExpression(moduleName, d); });
|
---|
367 | if (schema_1.isMethodMetadata(member)) {
|
---|
368 | result.parameterDecorators = member.parameterDecorators &&
|
---|
369 | member.parameterDecorators.map(function (d) { return d && d.map(function (p) { return _this.convertExpression(moduleName, p); }); });
|
---|
370 | if (schema_1.isConstructorMetadata(member)) {
|
---|
371 | if (member.parameters) {
|
---|
372 | result.parameters =
|
---|
373 | member.parameters.map(function (p) { return _this.convertExpression(moduleName, p); });
|
---|
374 | }
|
---|
375 | }
|
---|
376 | }
|
---|
377 | return result;
|
---|
378 | };
|
---|
379 | MetadataBundler.prototype.convertStatics = function (moduleName, statics) {
|
---|
380 | var result = {};
|
---|
381 | for (var key in statics) {
|
---|
382 | var value = statics[key];
|
---|
383 | if (schema_1.isFunctionMetadata(value)) {
|
---|
384 | result[key] = this.convertFunction(moduleName, value);
|
---|
385 | }
|
---|
386 | else if (schema_1.isMetadataSymbolicCallExpression(value)) {
|
---|
387 | // Class members can also contain static members that call a function with module
|
---|
388 | // references. e.g. "static ɵprov = ɵɵdefineInjectable(..)". We also need to
|
---|
389 | // convert these module references because otherwise these resolve to non-existent files.
|
---|
390 | result[key] = this.convertValue(moduleName, value);
|
---|
391 | }
|
---|
392 | else {
|
---|
393 | result[key] = value;
|
---|
394 | }
|
---|
395 | }
|
---|
396 | return result;
|
---|
397 | };
|
---|
398 | MetadataBundler.prototype.convertFunction = function (moduleName, value) {
|
---|
399 | var _this = this;
|
---|
400 | return {
|
---|
401 | __symbolic: 'function',
|
---|
402 | parameters: value.parameters,
|
---|
403 | defaults: value.defaults && value.defaults.map(function (v) { return _this.convertValue(moduleName, v); }),
|
---|
404 | value: this.convertValue(moduleName, value.value)
|
---|
405 | };
|
---|
406 | };
|
---|
407 | MetadataBundler.prototype.convertValue = function (moduleName, value) {
|
---|
408 | var _this = this;
|
---|
409 | if (isPrimitive(value)) {
|
---|
410 | return value;
|
---|
411 | }
|
---|
412 | if (schema_1.isMetadataError(value)) {
|
---|
413 | return this.convertError(moduleName, value);
|
---|
414 | }
|
---|
415 | if (schema_1.isMetadataSymbolicExpression(value)) {
|
---|
416 | return this.convertExpression(moduleName, value);
|
---|
417 | }
|
---|
418 | if (Array.isArray(value)) {
|
---|
419 | return value.map(function (v) { return _this.convertValue(moduleName, v); });
|
---|
420 | }
|
---|
421 | // Otherwise it is a metadata object.
|
---|
422 | var object = value;
|
---|
423 | var result = {};
|
---|
424 | for (var key in object) {
|
---|
425 | result[key] = this.convertValue(moduleName, object[key]);
|
---|
426 | }
|
---|
427 | return result;
|
---|
428 | };
|
---|
429 | MetadataBundler.prototype.convertExpression = function (moduleName, value) {
|
---|
430 | if (value) {
|
---|
431 | switch (value.__symbolic) {
|
---|
432 | case 'error':
|
---|
433 | return this.convertError(moduleName, value);
|
---|
434 | case 'reference':
|
---|
435 | return this.convertReference(moduleName, value);
|
---|
436 | default:
|
---|
437 | return this.convertExpressionNode(moduleName, value);
|
---|
438 | }
|
---|
439 | }
|
---|
440 | return value;
|
---|
441 | };
|
---|
442 | MetadataBundler.prototype.convertError = function (module, value) {
|
---|
443 | return {
|
---|
444 | __symbolic: 'error',
|
---|
445 | message: value.message,
|
---|
446 | line: value.line,
|
---|
447 | character: value.character,
|
---|
448 | context: value.context,
|
---|
449 | module: module
|
---|
450 | };
|
---|
451 | };
|
---|
452 | MetadataBundler.prototype.convertReference = function (moduleName, value) {
|
---|
453 | var _this = this;
|
---|
454 | var createReference = function (symbol) {
|
---|
455 | var declaration = symbol.declaration;
|
---|
456 | if (declaration.module.startsWith('.')) {
|
---|
457 | // Reference to a symbol defined in the module. Ensure it is converted then return a
|
---|
458 | // references to the final symbol.
|
---|
459 | _this.convertSymbol(symbol);
|
---|
460 | return {
|
---|
461 | __symbolic: 'reference',
|
---|
462 | get name() {
|
---|
463 | // Resolved lazily because private names are assigned late.
|
---|
464 | var canonicalSymbol = symbol.canonicalSymbol;
|
---|
465 | if (canonicalSymbol.isPrivate == null) {
|
---|
466 | throw Error('Invalid state: isPrivate was not initialized');
|
---|
467 | }
|
---|
468 | return canonicalSymbol.isPrivate ? canonicalSymbol.privateName : canonicalSymbol.name;
|
---|
469 | }
|
---|
470 | };
|
---|
471 | }
|
---|
472 | else {
|
---|
473 | // The symbol was a re-exported symbol from another module. Return a reference to the
|
---|
474 | // original imported symbol.
|
---|
475 | return { __symbolic: 'reference', name: declaration.name, module: declaration.module };
|
---|
476 | }
|
---|
477 | };
|
---|
478 | if (schema_1.isMetadataGlobalReferenceExpression(value)) {
|
---|
479 | var metadata = this.getMetadata(moduleName);
|
---|
480 | if (metadata && metadata.metadata && metadata.metadata[value.name]) {
|
---|
481 | // Reference to a symbol defined in the module
|
---|
482 | return createReference(this.canonicalSymbolOf(moduleName, value.name));
|
---|
483 | }
|
---|
484 | // If a reference has arguments, the arguments need to be converted.
|
---|
485 | if (value.arguments) {
|
---|
486 | return {
|
---|
487 | __symbolic: 'reference',
|
---|
488 | name: value.name,
|
---|
489 | arguments: value.arguments.map(function (a) { return _this.convertValue(moduleName, a); })
|
---|
490 | };
|
---|
491 | }
|
---|
492 | // Global references without arguments (such as to Math or JSON) are unmodified.
|
---|
493 | return value;
|
---|
494 | }
|
---|
495 | if (schema_1.isMetadataImportedSymbolReferenceExpression(value)) {
|
---|
496 | // References to imported symbols are separated into two, references to bundled modules and
|
---|
497 | // references to modules external to the bundle. If the module reference is relative it is
|
---|
498 | // assumed to be in the bundle. If it is Global it is assumed to be outside the bundle.
|
---|
499 | // References to symbols outside the bundle are left unmodified. References to symbol inside
|
---|
500 | // the bundle need to be converted to a bundle import reference reachable from the bundle
|
---|
501 | // index.
|
---|
502 | if (value.module.startsWith('.')) {
|
---|
503 | // Reference is to a symbol defined inside the module. Convert the reference to a reference
|
---|
504 | // to the canonical symbol.
|
---|
505 | var referencedModule = resolveModule(value.module, moduleName);
|
---|
506 | var referencedName = value.name;
|
---|
507 | return createReference(this.canonicalSymbolOf(referencedModule, referencedName));
|
---|
508 | }
|
---|
509 | // Value is a reference to a symbol defined outside the module.
|
---|
510 | if (value.arguments) {
|
---|
511 | // If a reference has arguments the arguments need to be converted.
|
---|
512 | return {
|
---|
513 | __symbolic: 'reference',
|
---|
514 | name: value.name,
|
---|
515 | module: value.module,
|
---|
516 | arguments: value.arguments.map(function (a) { return _this.convertValue(moduleName, a); })
|
---|
517 | };
|
---|
518 | }
|
---|
519 | return value;
|
---|
520 | }
|
---|
521 | if (schema_1.isMetadataModuleReferenceExpression(value)) {
|
---|
522 | // Cannot support references to bundled modules as the internal modules of a bundle are erased
|
---|
523 | // by the bundler.
|
---|
524 | if (value.module.startsWith('.')) {
|
---|
525 | return {
|
---|
526 | __symbolic: 'error',
|
---|
527 | message: 'Unsupported bundled module reference',
|
---|
528 | context: { module: value.module }
|
---|
529 | };
|
---|
530 | }
|
---|
531 | // References to unbundled modules are unmodified.
|
---|
532 | return value;
|
---|
533 | }
|
---|
534 | };
|
---|
535 | MetadataBundler.prototype.convertExpressionNode = function (moduleName, value) {
|
---|
536 | var result = { __symbolic: value.__symbolic };
|
---|
537 | for (var key in value) {
|
---|
538 | result[key] = this.convertValue(moduleName, value[key]);
|
---|
539 | }
|
---|
540 | return result;
|
---|
541 | };
|
---|
542 | MetadataBundler.prototype.symbolOf = function (module, name) {
|
---|
543 | var symbolKey = module + ":" + name;
|
---|
544 | var symbol = this.symbolMap.get(symbolKey);
|
---|
545 | if (!symbol) {
|
---|
546 | symbol = { module: module, name: name };
|
---|
547 | this.symbolMap.set(symbolKey, symbol);
|
---|
548 | }
|
---|
549 | return symbol;
|
---|
550 | };
|
---|
551 | MetadataBundler.prototype.canonicalSymbolOf = function (module, name) {
|
---|
552 | // Ensure the module has been seen.
|
---|
553 | this.exportAll(module);
|
---|
554 | var symbol = this.symbolOf(module, name);
|
---|
555 | if (!symbol.canonicalSymbol) {
|
---|
556 | this.canonicalizeSymbol(symbol);
|
---|
557 | }
|
---|
558 | return symbol;
|
---|
559 | };
|
---|
560 | return MetadataBundler;
|
---|
561 | }());
|
---|
562 | exports.MetadataBundler = MetadataBundler;
|
---|
563 | var CompilerHostAdapter = /** @class */ (function () {
|
---|
564 | function CompilerHostAdapter(host, cache, options) {
|
---|
565 | this.host = host;
|
---|
566 | this.cache = cache;
|
---|
567 | this.options = options;
|
---|
568 | this.collector = new collector_1.MetadataCollector();
|
---|
569 | }
|
---|
570 | CompilerHostAdapter.prototype.getMetadataFor = function (fileName, containingFile) {
|
---|
571 | var resolvedModule = ts.resolveModuleName(fileName, containingFile, this.options, this.host).resolvedModule;
|
---|
572 | var sourceFile;
|
---|
573 | if (resolvedModule) {
|
---|
574 | var resolvedFileName = resolvedModule.resolvedFileName;
|
---|
575 | if (resolvedModule.extension !== '.ts') {
|
---|
576 | resolvedFileName = resolvedFileName.replace(/(\.d\.ts|\.js)$/, '.ts');
|
---|
577 | }
|
---|
578 | sourceFile = this.host.getSourceFile(resolvedFileName, ts.ScriptTarget.Latest);
|
---|
579 | }
|
---|
580 | else {
|
---|
581 | // If typescript is unable to resolve the file, fallback on old behavior
|
---|
582 | if (!this.host.fileExists(fileName + '.ts'))
|
---|
583 | return undefined;
|
---|
584 | sourceFile = this.host.getSourceFile(fileName + '.ts', ts.ScriptTarget.Latest);
|
---|
585 | }
|
---|
586 | // If there is a metadata cache, use it to get the metadata for this source file. Otherwise,
|
---|
587 | // fall back on the locally created MetadataCollector.
|
---|
588 | if (!sourceFile) {
|
---|
589 | return undefined;
|
---|
590 | }
|
---|
591 | else if (this.cache) {
|
---|
592 | return this.cache.getMetadata(sourceFile);
|
---|
593 | }
|
---|
594 | else {
|
---|
595 | return this.collector.getMetadata(sourceFile);
|
---|
596 | }
|
---|
597 | };
|
---|
598 | return CompilerHostAdapter;
|
---|
599 | }());
|
---|
600 | exports.CompilerHostAdapter = CompilerHostAdapter;
|
---|
601 | function resolveModule(importName, from) {
|
---|
602 | if (importName.startsWith('.') && from) {
|
---|
603 | var normalPath = path.normalize(path.join(path.dirname(from), importName));
|
---|
604 | if (!normalPath.startsWith('.') && from.startsWith('.')) {
|
---|
605 | // path.normalize() preserves leading '../' but not './'. This adds it back.
|
---|
606 | normalPath = "." + path.sep + normalPath;
|
---|
607 | }
|
---|
608 | // Replace windows path delimiters with forward-slashes. Otherwise the paths are not
|
---|
609 | // TypeScript compatible when building the bundle.
|
---|
610 | return normalPath.replace(/\\/g, '/');
|
---|
611 | }
|
---|
612 | return importName;
|
---|
613 | }
|
---|
614 | function isPrimitive(o) {
|
---|
615 | return o === null || (typeof o !== 'function' && typeof o !== 'object');
|
---|
616 | }
|
---|
617 | function getRootExport(symbol) {
|
---|
618 | return symbol.reexportedAs ? getRootExport(symbol.reexportedAs) : symbol;
|
---|
619 | }
|
---|
620 | function getSymbolDeclaration(symbol) {
|
---|
621 | return symbol.exports ? getSymbolDeclaration(symbol.exports) : symbol;
|
---|
622 | }
|
---|
623 | });
|
---|
624 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyLWNsaS9zcmMvbWV0YWRhdGEvYnVuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0lBQUE7Ozs7OztPQU1HO0lBQ0gsMkJBQTZCO0lBQzdCLCtCQUFpQztJQUlqQywwRUFBOEM7SUFDOUMsb0VBQTRsQjtJQUk1bEIsbURBQW1EO0lBQ25ELElBQU0sa0JBQWtCLEdBQUcsNEJBQTRCLENBQUM7SUFrRXhEO1FBU0UseUJBQ1ksSUFBWSxFQUFVLFFBQTBCLEVBQVUsSUFBeUIsRUFDM0YsbUJBQTRCO1lBRHBCLFNBQUksR0FBSixJQUFJLENBQVE7WUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFrQjtZQUFVLFNBQUksR0FBSixJQUFJLENBQXFCO1lBVHZGLGNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztZQUN0QyxrQkFBYSxHQUFHLElBQUksR0FBRyxFQUFvQyxDQUFDO1lBQzVELFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztZQVM1QyxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUcsQ0FBQztZQUM3QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFFRCwyQ0FBaUIsR0FBakI7WUFDRSxnR0FBZ0c7WUFDaEcsZUFBZTtZQUNmLElBQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMxQyx1RUFBdUU7WUFDdkUsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUs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LENBQUM7U0FDdkM7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsU0FBUyxXQUFXLENBQUMsQ0FBTTtRQUN6QixPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxVQUFVLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELFNBQVMsYUFBYSxDQUFDLE1BQWM7UUFDbkMsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDM0UsQ0FBQztJQUVELFNBQVMsb0JBQW9CLENBQUMsTUFBYztRQUMxQyxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3hFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHtNZXRhZGF0YUNhY2hlfSBmcm9tICcuLi90cmFuc2Zvcm1lcnMvbWV0YWRhdGFfY2FjaGUnO1xuXG5pbXBvcnQge01ldGFkYXRhQ29sbGVjdG9yfSBmcm9tICcuL2NvbGxlY3Rvcic7XG5pbXBvcnQge0NsYXNzTWV0YWRhdGEsIENvbnN0cnVjdG9yTWV0YWRhdGEsIEZ1bmN0aW9uTWV0YWRhdGEsIGlzQ2xhc3NNZXRhZGF0YSwgaXNDb25zdHJ1Y3Rvck1ldGFkYXRhLCBpc0Z1bmN0aW9uTWV0YWRhdGEsIGlzSW50ZXJmYWNlTWV0YWRhdGEsIGlzTWV0YWRhdGFFcnJvciwgaXNNZXRhZGF0YUdsb2JhbFJlZmVyZW5jZUV4cHJlc3Npb24sIGlzTWV0YWRhdGFJbXBvcnRlZFN5bWJvbFJlZmVyZW5jZUV4cHJlc3Npb24sIGlzTWV0YWRhdGFNb2R1bGVSZWZlcmVuY2VFeHByZXNzaW9uLCBpc01ldGFkYXRhU3ltYm9saWNDYWxsRXhwcmVzc2lvbiwgaXNNZXRhZGF0YVN5bWJvbGljRXhwcmVzc2lvbiwgaXNNZXRob2RNZXRhZGF0YSwgTWVtYmVyTWV0YWRhdGEsIE1FVEFEQVRBX1ZFUlNJT04sIE1ldGFkYXRhRW50cnksIE1ldGFkYXRhRXJyb3IsIE1ldGFkYXRhTWFwLCBNZXRhZGF0YU9iamVjdCwgTWV0YWRhdGFTeW1ib2xpY0V4cHJlc3Npb24sIE1ldGFkYXRhU3ltYm9saWNSZWZlcmVuY2VFeHByZXNzaW9uLCBNZXRhZGF0YVZhbHVlLCBNZXRob2RNZXRhZGF0YSwgTW9kdWxlRXhwb3J0TWV0YWRhdGEsIE1vZHVsZU1ldGFkYXRhfSBmcm9tICcuL3NjaGVtYSc7XG5cblxuXG4vLyBUaGUgY2hhcmFjdGVyIHNldCB1c2VkIHRvIHByb2R1Y2UgcHJpdmF0ZSBuYW1lcy5cbmNvbnN0IFBSSVZBVEVfTkFNRV9DSEFSUyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eic7XG5cbmludGVyZmFjZSBTeW1ib2wge1xuICBtb2R1bGU6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8vIFByb2R1Y2VkIGJ5IGluZGlyZWN0bHkgYnkgZXhwb3J0QWxsKCkgZm9yIHN5bWJvbHMgcmUtZXhwb3J0IGFub3RoZXIgc3ltYm9sLlxuICBleHBvcnRzPzogU3ltYm9sO1xuXG4gIC8vIFByb2R1Y2VkIGJ5IGluZGlyZWN0bHkgYnkgZXhwb3J0QWxsKCkgZm9yIHN5bWJvbHMgYXJlIHJlLWV4cG9ydGVkIGJ5IGFub3RoZXIgc3ltYm9sLlxuICByZWV4cG9ydGVkQXM/OiBTeW1ib2w7XG5cbiAgLy8gUHJvZHVjZWQgYnkgY2Fub25pY2FsaXplU3ltYm9scygpIGZvciBhbGwgc3ltYm9scy4gQSBzeW1ib2wgaXMgcHJpdmF0ZSBpZiBpdCBpcyBub3RcbiAgLy8gZXhwb3J0ZWQgYnkgdGhlIGluZGV4LlxuICBpc1ByaXZhdGU/OiBib29sZWFuO1xuXG4gIC8vIFByb2R1Y2VkIGJ5IGNhbm9uaWNhbGl6ZVN5bWJvbHMoKSBmb3IgYWxsIHN5bWJvbHMuIFRoaXMgaXMgdGhlIG9uZSBzeW1ib2wgdGhhdFxuICAvLyByZXNwcmVzZW50cyBhbGwgb3RoZXIgc3ltYm9scyBhbmQgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQsIGFtb25nIGFsbCB0aGUgcmUtZXhwb3J0ZWRcbiAgLy8gYWxpYXNlcywgd2hvc2UgZmllbGRzIGNhbiBiZSB0cnVzdGVkIHRvIGNvbnRhaW4gdGhlIGNvcnJlY3QgaW5mb3JtYXRpb24uXG4gIC8vIEZvciBwcml2YXRlIHN5bWJvbHMgdGhpcyBpcyB0aGUgZGVjbGFyYXRpb24gc3ltYm9sLiBGb3IgcHVibGljIHN5bWJvbHMgdGhpcyBpcyB0aGVcbiAgLy8gc3ltYm9sIHRoYXQgaXMgZXhwb3J0ZWQuXG4gIGNhbm9uaWNhbFN5bWJvbD86IFN5bWJvbDtcblxuICAvLyBQcm9kdWNlZCBieSBjYW5vbmljYWxpemVTeW1ib2xzKCkgZm9yIGFsbCBzeW1ib2xzLiBUaGlzIHRoZSBzeW1ib2wgdGhhdCBvcmlnaW5hbGx5XG4gIC8vIGRlY2xhcmVkIHRoZSB2YWx1ZSBhbmQgc2hvdWxkIGJlIHVzZWQgdG8gZmV0Y2ggdGhlIHZhbHVlLlxuICBkZWNsYXJhdGlvbj86IFN5bWJvbDtcblxuICAvLyBBIHN5bWJvbCBpcyByZWZlcmVuY2VkIGlmIGl0IGlzIGV4cG9ydGVkIGZyb20gaW5kZXggb3IgcmVmZXJlbmNlZCBieSB0aGUgdmFsdWUgb2ZcbiAgLy8gYSByZWZlcmVuY2VkIHN5bWJvbCdzIHZhbHVlLlxuICByZWZlcmVuY2VkPzogYm9vbGVhbjtcblxuICAvLyBBIHN5bWJvbCBpcyBtYXJrZWQgYXMgYSByZS1leHBvcnQgdGhlIHN5bWJvbCB3YXMgcmV4cG9ydGVkIGZyb20gYSBtb2R1bGUgdGhhdCBpc1xuICAvLyBub3QgcGFydCBvZiB0aGUgZmxhdCBtb2R1bGUgYnVuZGxlLlxuICByZWV4cG9ydD86IGJvb2xlYW47XG5cbiAgLy8gT25seSB2YWxpZCBmb3IgcmVmZXJlbmNlZCBjYW5vbmljYWwgc3ltYm9scy4gUHJvZHVjZXMgYnkgY29udmVydFN5bWJvbHMoKS5cbiAgdmFsdWU/OiBNZXRhZGF0YUVudHJ5O1xuXG4gIC8vIE9ubHkgdmFsaWQgZm9yIHJlZmVyZW5jZWQgcHJpdmF0ZSBzeW1ib2xzLiBJdCBpcyB0aGUgbmFtZSB0byB1c2UgdG8gaW1wb3J0IHRoZSBzeW1ib2wgZnJvbVxuICAvLyB0aGUgYnVuZGxlIGluZGV4LiBQcm9kdWNlIGJ5IGFzc2lnblByaXZhdGVOYW1lcygpO1xuICBwcml2YXRlTmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdW5kbGVFbnRyaWVzIHtcbiAgW25hbWU6IHN0cmluZ106IE1ldGFkYXRhRW50cnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVuZGxlUHJpdmF0ZUVudHJ5IHtcbiAgcHJpdmF0ZU5hbWU6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBtb2R1bGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdW5kbGVkTW9kdWxlIHtcbiAgbWV0YWRhdGE6IE1vZHVsZU1ldGFkYXRhO1xuICBwcml2YXRlczogQnVuZGxlUHJpdmF0ZUVudHJ5W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWV0YWRhdGFCdW5kbGVySG9zdCB7XG4gIGdldE1ldGFkYXRhRm9yKG1vZHVsZU5hbWU6IHN0cmluZywgY29udGFpbmluZ0ZpbGU6IHN0cmluZyk6IE1vZHVsZU1ldGFkYXRhfHVuZGVmaW5lZDtcbn1cblxudHlwZSBTdGF0aWNzTWV0YWRhdGEgPSB7XG4gIFtuYW1lOiBzdHJpbmddOiBNZXRhZGF0YVZhbHVlfEZ1bmN0aW9uTWV0YWRhdGE7XG59O1xuXG5leHBvcnQgY2xhc3MgTWV0YWRhdGFCdW5kbGVyIHtcbiAgcHJpdmF0ZSBzeW1ib2xNYXAgPSBuZXcgTWFwPHN0cmluZywgU3ltYm9sPigpO1xuICBwcml2YXRlIG1ldGFkYXRhQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgTW9kdWxlTWV0YWRhdGF8dW5kZWZpbmVkPigpO1xuICBwcml2YXRlIGV4cG9ydHMgPSBuZXcgTWFwPHN0cmluZywgU3ltYm9sW10+KCk7XG4gIHByaXZhdGUgcm9vdE1vZHVsZTogc3RyaW5nO1xuICBwcml2YXRlIHByaXZhdGVTeW1ib2xQcmVmaXg6IHN0cmluZztcbiAgLy8gVE9ETyhpc3N1ZS8yNDU3MSk6IHJlbW92ZSAnIScuXG4gIHByaXZhdGUgZXhwb3J0ZWQhOiBTZXQ8U3ltYm9sPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgcm9vdDogc3RyaW5nLCBwcml2YXRlIGltcG9ydEFzOiBzdHJpbmd8dW5kZWZpbmVkLCBwcml2YXRlIGhvc3Q6IE1ldGFkYXRhQnVuZGxlckhvc3QsXG4gICAgICBwcml2YXRlU3ltYm9sUHJlZml4Pzogc3RyaW5nKSB7XG4gICAgdGhpcy5yb290TW9kdWxlID0gYC4vJHtwYXRoLmJhc2VuYW1lKHJvb3QpfWA7XG4gICAgdGhpcy5wcml2YXRlU3ltYm9sUHJlZml4ID0gKHByaXZhdGVTeW1ib2xQcmVmaXggfHwgJycpLnJlcGxhY2UoL1xcVy9nLCAnXycpO1xuICB9XG5cbiAgZ2V0TWV0YWRhdGFCdW5kbGUoKTogQnVuZGxlZE1vZHVsZSB7XG4gICAgLy8gRXhwb3J0IHRoZSByb290IG1vZHVsZS4gVGhpcyBhbHNvIGNvbGxlY3RzIHRoZSB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIHZhbHVlcyByZWZlcmVuY2VkIGJ5XG4gICAgLy8gdGhlIGV4cG9ydHMuXG4gICAgY29uc3QgZXhwb3J0ZWRTeW1ib2xzID0gdGhpcy5leHBvcnRBbGwodGhpcy5yb290TW9kdWxlKTtcbiAgICB0aGlzLmNhbm9uaWNhbGl6ZVN5bWJvbHMoZXhwb3J0ZWRTeW1ib2xzKTtcbiAgICAvLyBUT0RPOiBleHBvcnRzPyBlLmcuIGEgbW9kdWxlIHJlLWV4cG9ydHMgYSBzeW1ib2wgZnJvbSBhbm90aGVyIGJ1bmRsZVxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5nZXRFbnRyaWVzKGV4cG9ydGVkU3ltYm9scyk7XG4gICAgY29uc3QgcHJpdmF0ZXMgPSBBcnJheS5mcm9tKHRoaXMuc3ltYm9sTWFwLnZhbHVlcygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIocyA9PiBzLnJlZmVyZW5jZWQgJiYgcy5pc1ByaXZhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChzID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGVOYW1lOiBzLnByaXZhdGVOYW1lISxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcy5kZWNsYXJhdGlvbiEubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlOiBzLmRlY2xhcmF0aW9uIS5tb2R1bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICBjb25zdCBvcmlnaW5zID0gQXJyYXkuZnJvbSh0aGlzLnN5bWJvbE1hcC52YWx1ZXMoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIocyA9PiBzLnJlZmVyZW5jZWQgJiYgIXMucmVleHBvcnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVkdWNlPHtbbmFtZTogc3RyaW5nXTogc3RyaW5nfT4oKHAsIHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcFtzLmlzUHJpdmF0ZSA/IHMucHJpdmF0ZU5hbWUhIDogcy5uYW1lXSA9IHMuZGVjbGFyYXRpb24hLm1vZHVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSk7XG4gICAgY29uc3QgZXhwb3J0cyA9IHRoaXMuZ2V0UmVFeHBvcnRzKGV4cG9ydGVkU3ltYm9scyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIF9fc3ltYm9saWM6ICdtb2R1bGUnLFxuICAgICAgICB2ZXJzaW9uOiBNRVRBREFUQV9WRVJTSU9OLFxuICAgICAgICBleHBvcnRzOiBleHBvcnRzLmxlbmd0aCA/IGV4cG9ydHMgOiB1bmRlZmluZWQsXG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgICBvcmlnaW5zLFxuICAgICAgICBpbXBvcnRBczogdGhpcy5pbXBvcnRBcyFcbiAgICAgIH0sXG4gICAgICBwcml2YXRlc1xuICAgIH07XG4gIH1cblxuICBzdGF0aWMgcmVzb2x2ZU1vZHVsZShpbXBvcnROYW1lOiBzdHJpbmcsIGZyb206IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVNb2R1bGUoaW1wb3J0TmFtZSwgZnJvbSk7XG4gIH1cblxuICBwcml2YXRlIGdldE1ldGFkYXRhKG1vZHVsZU5hbWU6IHN0cmluZyk6IE1vZHVsZU1ldGFkYXRhfHVuZGVmaW5lZCB7XG4gICAgbGV0IHJlc3VsdCA9IHRoaXMubWV0YWRhdGFDYWNoZS5nZXQobW9kdWxlTmFtZSk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIGlmIChtb2R1bGVOYW1lLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICBjb25zdCBmdWxsTW9kdWxlTmFtZSA9IHJlc29sdmVNb2R1bGUobW9kdWxlTmFtZSwgdGhpcy5yb290KTtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5ob3N0LmdldE1ldGFkYXRhRm9yKGZ1bGxNb2R1bGVOYW1lLCB0aGlzLnJvb3QpO1xuICAgICAgfVxuICAgICAgdGhpcy5tZXRhZGF0YUNhY2hlLnNldChtb2R1bGVOYW1lLCByZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBleHBvcnRBbGwobW9kdWxlTmFtZTogc3RyaW5nKTogU3ltYm9sW10ge1xuICAgIGNvbnN0IG1vZHVsZSA9IHRoaXMuZ2V0TWV0YWRhdGEobW9kdWxlTmFtZSk7XG4gICAgbGV0IHJlc3VsdCA9IHRoaXMuZXhwb3J0cy5nZXQobW9kdWxlTmFtZSk7XG5cbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgY29uc3QgZXhwb3J0U3ltYm9sID0gKGV4cG9ydGVkU3ltYm9sOiBTeW1ib2wsIGV4cG9ydEFzOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHN5bWJvbCA9IHRoaXMuc3ltYm9sT2YobW9kdWxlTmFtZSwgZXhwb3J0QXMpO1xuICAgICAgcmVzdWx0IS5wdXNoKHN5bWJvbCk7XG4gICAgICBleHBvcnRlZFN5bWJvbC5yZWV4cG9ydGVkQXMgPSBzeW1ib2w7XG4gICAgICBzeW1ib2wuZXhwb3J0cyA9IGV4cG9ydGVkU3ltYm9sO1xuICAgIH07XG5cbiAgICAvLyBFeHBvcnQgYWxsIHRoZSBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBtb2R1bGUuXG4gICAgaWYgKG1vZHVsZSAmJiBtb2R1bGUubWV0YWRhdGEpIHtcbiAgICAgIGZvciAobGV0IGtleSBpbiBtb2R1bGUubWV0YWRhdGEpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IG1vZHVsZS5tZXRhZGF0YVtrZXldO1xuICAgICAgICBpZiAoaXNNZXRhZGF0YUltcG9ydGVkU3ltYm9sUmVmZXJlbmNlRXhwcmVzc2lvbihkYXRhKSkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSByZS1leHBvcnQgb2YgYW4gaW1wb3J0ZWQgc3ltYm9sLiBSZWNvcmQgdGhpcyBhcyBhIHJlLWV4cG9ydC5cbiAgICAgICAgICBjb25zdCBleHBvcnRGcm9tID0gcmVzb2x2ZU1vZHVsZShkYXRhLm1vZHVsZSwgbW9kdWxlTmFtZSk7XG4gICAgICAgICAgdGhpcy5leHBvcnRBbGwoZXhwb3J0RnJvbSk7XG4gICAgICAgICAgY29uc3Qgc3ltYm9sID0gdGhpcy5zeW1ib2xPZihleHBvcnRGcm9tLCBkYXRhLm5hbWUpO1xuICAgICAgICAgIGV4cG9ydFN5bWJvbChzeW1ib2wsIGtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVjb3JkIHRoYXQgdGhpcyBzeW1ib2wgaXMgZXhwb3J0ZWQgYnkgdGhpcyBtb2R1bGUuXG4gICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5zeW1ib2xPZihtb2R1bGVOYW1lLCBrZXkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEV4cG9ydCBhbGwgdGhlIHJlLWV4cG9ydHMgZnJvbSB0aGlzIG1vZHVsZVxuICAgIGlmIChtb2R1bGUgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgIGxldCB1bm5hbWVkTW9kdWxlRXhwb3J0c0lkeCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGV4cG9ydERlY2xhcmF0aW9uIG9mIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIGNvbnN0IGV4cG9ydEZyb20gPSByZXNvbHZlTW9kdWxlKGV4cG9ydERlY2xhcmF0aW9uLmZyb20sIG1vZHVsZU5hbWUpO1xuICAgICAgICAvLyBSZWNvcmQgYWxsIHRoZSBleHBvcnRzIGZyb20gdGhlIG1vZHVsZSBldmVuIGlmIHdlIGRvbid0IHVzZSBpdCBkaXJlY3RseS5cbiAgICAgICAgY29uc3QgZXhwb3J0ZWRTeW1ib2xzID0gdGhpcy5leHBvcnRBbGwoZXhwb3J0RnJvbSk7XG4gICAgICAgIGlmIChleHBvcnREZWNsYXJhdGlvbi5leHBvcnQpIHtcbiAgICAgICAgICAvLyBSZS1leHBvcnQgYWxsIHRoZSBuYW1lZCBleHBvcnRzIGZyb20gYSBtb2R1bGUuXG4gICAgICAgICAgZm9yIChjb25zdCBleHBvcnRJdGVtIG9mIGV4cG9ydERlY2xhcmF0aW9uLmV4cG9ydCkge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHR5cGVvZiBleHBvcnRJdGVtID09ICdzdHJpbmcnID8gZXhwb3J0SXRlbSA6IGV4cG9ydEl0ZW0ubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGV4cG9ydEFzID0gdHlwZW9mIGV4cG9ydEl0ZW0gPT0gJ3N0cmluZycgPyBleHBvcnRJdGVtIDogZXhwb3J0SXRlbS5hcztcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbCA9IHRoaXMuc3ltYm9sT2YoZXhwb3J0RnJvbSwgbmFtZSk7XG4gICAgICAgICAgICBpZiAoZXhwb3J0ZWRTeW1ib2xzICYmIGV4cG9ydGVkU3ltYm9scy5sZW5ndGggPT0gMSAmJiBleHBvcnRlZFN5bWJvbHNbMF0ucmVleHBvcnQgJiZcbiAgICAgICAgICAgICAgICBleHBvcnRlZFN5bWJvbHNbMF0ubmFtZSA9PSAnKicpIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG5hbWVkIGV4cG9ydCBmcm9tIGEgbW9kdWxlIHdlIGhhdmUgbm8gbWV0YWRhdGEgYWJvdXQuIFJlY29yZCB0aGUgbmFtZWRcbiAgICAgICAgICAgICAgLy8gZXhwb3J0IGFzIGEgcmUtZXhwb3J0LlxuICAgICAgICAgICAgICBzeW1ib2wucmVleHBvcnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXhwb3J0U3ltYm9sKHRoaXMuc3ltYm9sT2YoZXhwb3J0RnJvbSwgbmFtZSksIGV4cG9ydEFzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmUtZXhwb3J0IGFsbCB0aGUgc3ltYm9scyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgICAgICBjb25zdCBleHBvcnRlZFN5bWJvbHMgPSB0aGlzLmV4cG9ydEFsbChleHBvcnRGcm9tKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGV4cG9ydGVkU3ltYm9sIG9mIGV4cG9ydGVkU3ltYm9scykge1xuICAgICAgICAgICAgLy8gSW4gY2FzZSB0aGUgZXhwb3J0ZWQgc3ltYm9sIGRvZXMgbm90IGhhdmUgYSBuYW1lLCB3ZSBuZWVkIHRvIGdpdmUgaXQgYW4gdW5pcXVlXG4gICAgICAgICAgICAvLyBuYW1lIGZvciB0aGUgY3VycmVudCBtb2R1bGUuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlXG4gICAgICAgICAgICAvLyB1bm5hbWVkIHJlLWV4cG9ydHMgaW4gYSBnaXZlbiBtb2R1bGUuXG4gICAgICAgICAgICBjb25zdCBuYW1lID0gZXhwb3J0ZWRTeW1ib2wubmFtZSA9PT0gJyonID9cbiAgICAgICAgICAgICAgICBgdW5uYW1lZF9yZWV4cG9ydF8ke3VubmFtZWRNb2R1bGVFeHBvcnRzSWR4Kyt9YCA6XG4gICAgICAgICAgICAgICAgZXhwb3J0ZWRTeW1ib2wubmFtZTtcbiAgICAgICAgICAgIGV4cG9ydFN5bWJvbChleHBvcnRlZFN5bWJvbCwgbmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFtb2R1bGUpIHtcbiAgICAgIC8vIElmIG5vIG1ldGFkYXRhIGlzIGZvdW5kIGZvciB0aGlzIGltcG9ydCB0aGVuIGl0IGlzIGNvbnNpZGVyZWQgZXh0ZXJuYWwgdG8gdGhlXG4gICAgICAvLyBsaWJyYXJ5IGFuZCBzaG91bGQgYmUgcmVjb3JkZWQgYXMgYSByZS1leHBvcnQgaW4gdGhlIGZpbmFsIG1ldGFkYXRhIGlmIGl0IGlzXG4gICAgICAvLyBldmVudHVhbGx5IHJlLWV4cG9ydGVkLlxuICAgICAgY29uc3Qgc3ltYm9sID0gdGhpcy5zeW1ib2xPZihtb2R1bGVOYW1lLCAnKicpO1xuICAgICAgc3ltYm9sLnJlZXhwb3J0ID0gdHJ1ZTtcbiAgICAgIHJlc3VsdC5wdXNoKHN5bWJvbCk7XG4gICAgfVxuICAgIHRoaXMuZXhwb3J0cy5zZXQobW9kdWxlTmFtZSwgcmVzdWx0KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmlsbCBpbiB0aGUgY2Fub25pY2FsU3ltYm9sIHdoaWNoIGlzIHRoZSBzeW1ib2wgdGhhdCBzaG91bGQgYmUgaW1wb3J0ZWQgYnkgZmFjdG9yaWVzLlxuICAgKiBUaGUgY2Fub25pY2FsIHN5bWJvbCBpcyB0aGUgb25lIGV4cG9ydGVkIGJ5IHRoZSBpbmRleCBmaWxlIGZvciB0aGUgYnVuZGxlIG9yIGRlZmluaXRpb25cbiAgICogc3ltYm9sIGZvciBwcml2YXRlIHN5bWJvbHMgdGhhdCBhcmUgbm90IGV4cG9ydGVkIGJ5IGJ1bmRsZSBpbmRleC5cbiAgICovXG4gIHByaXZhdGUgY2Fub25pY2FsaXplU3ltYm9scyhleHBvcnRlZFN5bWJvbHM6IFN5bWJvbFtdKSB7XG4gICAgY29uc3Qgc3ltYm9scyA9IEFycmF5LmZyb20odGhpcy5zeW1ib2xNYXAudmFsdWVzKCkpO1xuICAgIHRoaXMuZXhwb3J0ZWQgPSBuZXcgU2V0KGV4cG9ydGVkU3ltYm9scyk7XG4gICAgc3ltYm9scy5mb3JFYWNoKHRoaXMuY2Fub25pY2FsaXplU3ltYm9sLCB0aGlzKTtcbiAgfVxuXG4gIHByaXZhdGUgY2Fub25pY2FsaXplU3ltYm9sKHN5bWJvbDogU3ltYm9sKSB7XG4gICAgY29uc3Qgcm9vdEV4cG9ydCA9IGdldFJvb3RFeHBvcnQoc3ltYm9sKTtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IGdldFN5bWJvbERlY2xhcmF0aW9uKHN5bWJvbCk7XG4gICAgY29uc3QgaXNQcml2YXRlID0gIXRoaXMuZXhwb3J0ZWQuaGFzKHJvb3RFeHBvcnQpO1xuICAgIGNvbnN0IGNhbm9uaWNhbFN5bWJvbCA9IGlzUHJpdmF0ZSA/IGRlY2xhcmF0aW9uIDogcm9vdEV4cG9ydDtcbiAgICBzeW1ib2wuaXNQcml2YXRlID0gaXNQcml2YXRlO1xuICAgIHN5bWJvbC5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uO1xuICAgIHN5bWJvbC5jYW5vbmljYWxTeW1ib2wgPSBjYW5vbmljYWxTeW1ib2w7XG4gICAgc3ltYm9sLnJlZXhwb3J0ID0gZGVjbGFyYXRpb24ucmVleHBvcnQ7XG4gIH1cblxuICBwcml2YXRlIGdldEVudHJpZXMoZXhwb3J0ZWRTeW1ib2xzOiBTeW1ib2xbXSk6IEJ1bmRsZUVudHJpZXMge1xuICAgIGNvbnN0IHJlc3VsdDogQnVuZGxlRW50cmllcyA9IHt9O1xuXG4gICAgY29uc3QgZXhwb3J0ZWROYW1lcyA9IG5ldyBTZXQoZXhwb3J0ZWRTeW1ib2xzLm1hcChzID0+IHMubmFtZSkpO1xuICAgIGxldCBwcml2YXRlTmFtZSA9IDA7XG5cbiAgICBmdW5jdGlvbiBuZXdQcml2YXRlTmFtZShwcmVmaXg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBsZXQgZGlnaXRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgaW5kZXggPSBwcml2YXRlTmFtZSsrO1xuICAgICAgICBsZXQgYmFzZSA9IFBSSVZBVEVfTkFNRV9DSEFSUztcbiAgICAgICAgd2hpbGUgKCFkaWdpdHMubGVuZ3RoIHx8IGluZGV4ID4gMCkge1xuICAgICAgICAgIGRpZ2l0cy51bnNoaWZ0KGJhc2VbaW5kZXggJSBiYXNlLmxlbmd0aF0pO1xuICAgICAgICAgIGluZGV4ID0gTWF0aC5mbG9vcihpbmRleCAvIGJhc2UubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBgXFx1MDI3NSR7cHJlZml4fSR7ZGlnaXRzLmpvaW4oJycpfWA7XG4gICAgICAgIGlmICghZXhwb3J0ZWROYW1lcy5oYXMocmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBleHBvcnRlZFN5bWJvbHMuZm9yRWFjaChzeW1ib2wgPT4gdGhpcy5jb252ZXJ0U3ltYm9sKHN5bWJvbCkpO1xuXG4gICAgY29uc3Qgc3ltYm9sc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgICBBcnJheS5mcm9tKHRoaXMuc3ltYm9sTWFwLnZhbHVlcygpKS5mb3JFYWNoKHN5bWJvbCA9PiB7XG4gICAgICBpZiAoc3ltYm9sLnJlZmVyZW5jZWQgJiYgIXN5bWJvbC5yZWV4cG9ydCkge1xuICAgICAgICBsZXQgbmFtZSA9IHN5bWJvbC5uYW1lO1xuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gYCR7c3ltYm9sLmRlY2xhcmF0aW9uIS5tb2R1bGV9OiR7c3ltYm9sLmRlY2xhcmF0aW9uIS5uYW1lfWA7XG4gICAgICAgIGlmIChzeW1ib2wuaXNQcml2YXRlICYmICFzeW1ib2wucHJpdmF0ZU5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmV3UHJpdmF0ZU5hbWUodGhpcy5wcml2YXRlU3ltYm9sUHJlZml4KTtcbiAgICAgICAgICBzeW1ib2wucHJpdmF0ZU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzeW1ib2xzTWFwLmhhcyhpZGVudGlmaWVyKSkge1xuICAgICAgICAgIGNvbnN0IG5hbWVzID0gc3ltYm9sc01hcC5nZXQoaWRlbnRpZmllcik7XG4gICAgICAgICAgbmFtZXMhLnB1c2gobmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3ltYm9sc01hcC5zZXQoaWRlbnRpZmllciwgW25hbWVdKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbbmFtZV0gPSBzeW1ib2wudmFsdWUhO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZWQgZW50cmllc1xuICAgIHN5bWJvbHNNYXAuZm9yRWFjaCgobmFtZXM6IHN0cmluZ1tdLCBpZGVudGlmaWVyOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChuYW1lcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnN0IFttb2R1bGUsIGRlY2xhcmVkTmFtZV0gPSBpZGVudGlmaWVyLnNwbGl0KCc6Jyk7XG4gICAgICAgIC8vIHByZWZlciB0aGUgZXhwb3J0IHRoYXQgdXNlcyB0aGUgZGVjbGFyZWQgbmFtZSAoaWYgYW55KVxuICAgICAgICBsZXQgcmVmZXJlbmNlID0gbmFtZXMuaW5kZXhPZihkZWNsYXJlZE5hbWUpO1xuICAgICAgICBpZiAocmVmZXJlbmNlID09PSAtMSkge1xuICAgICAgICAgIHJlZmVyZW5jZSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBrZWVwIG9uZSBlbnRyeSBhbmQgcmVwbGFjZSB0aGUgb3RoZXJzIGJ5IHJlZmVyZW5jZXNcbiAgICAgICAgbmFtZXMuZm9yRWFjaCgobmFtZTogc3RyaW5nLCBpOiBudW1iZXIpID0+IHtcbiAgICAgICAgICBpZiAoaSAhPT0gcmVmZXJlbmNlKSB7XG4gICAgICAgICAgICByZXN1bHRbbmFtZV0gPSB7X19zeW1ib2xpYzogJ3JlZmVyZW5jZScsIG5hbWU6IG5hbWVzW3JlZmVyZW5jZV19O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZUV4cG9ydHMoZXhwb3J0ZWRTeW1ib2xzOiBTeW1ib2xbXSk6IE1vZHVsZUV4cG9ydE1ldGFkYXRhW10ge1xuICAgIHR5cGUgRXhwb3J0Q2xhdXNlID0ge25hbWU6IHN0cmluZywgYXM6IHN0cmluZ31bXTtcbiAgICBjb25zdCBtb2R1bGVzID0gbmV3IE1hcDxzdHJpbmcsIEV4cG9ydENsYXVzZT4oKTtcbiAgICBjb25zdCBleHBvcnRBbGxzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBzeW1ib2wgb2YgZXhwb3J0ZWRTeW1ib2xzKSB7XG4gICAgICBpZiAoc3ltYm9sLnJlZXhwb3J0KSB7XG4gICAgICAgIC8vIHN5bWJvbC5kZWNsYXJhdGlvbiBpcyBndWFyYW50ZWVkIHRvIGJlIGRlZmluZWQgZHVyaW5nIHRoZSBwaGFzZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuXG4gICAgICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gc3ltYm9sLmRlY2xhcmF0aW9uITtcbiAgICAgICAgY29uc3QgbW9kdWxlID0gZGVjbGFyYXRpb24ubW9kdWxlO1xuICAgICAgICBpZiAoZGVjbGFyYXRpb24hLm5hbWUgPT0gJyonKSB7XG4gICAgICAgICAgLy8gUmVleHBvcnQgYWxsIHRoZSBzeW1ib2xzLlxuICAgICAgICAgIGV4cG9ydEFsbHMuYWRkKGRlY2xhcmF0aW9uLm1vZHVsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmUtZXhwb3J0IHRoZSBzeW1ib2wgYXMgdGhlIGV4cG9ydGVkIG5hbWUuXG4gICAgICAgICAgbGV0IGVudHJ5ID0gbW9kdWxlcy5nZXQobW9kdWxlKTtcbiAgICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgICBlbnRyeSA9IFtdO1xuICAgICAgICAgICAgbW9kdWxlcy5zZXQobW9kdWxlLCBlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGFzID0gc3ltYm9sLm5hbWU7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGRlY2xhcmF0aW9uLm5hbWU7XG4gICAgICAgICAgZW50cnkucHVzaCh7bmFtZSwgYXN9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgLi4uQXJyYXkuZnJvbShleHBvcnRBbGxzLnZhbHVlcygpKS5tYXAoZnJvbSA9PiAoe2Zyb219KSksXG4gICAgICAuLi5BcnJheS5mcm9tKG1vZHVsZXMuZW50cmllcygpKS5tYXAoKFtmcm9tLCBleHBvcnRzXSkgPT4gKHtleHBvcnQ6IGV4cG9ydHMsIGZyb219KSlcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0U3ltYm9sKHN5bWJvbDogU3ltYm9sKSB7XG4gICAgLy8gY2Fub25pY2FsU3ltYm9sIGlzIGVuc3VyZWQgdG8gYmUgZGVmaW5lZCBiZWZvcmUgdGhpcyBpcyBjYWxsZWQuXG4gICAgY29uc3QgY2Fub25pY2FsU3ltYm9sID0gc3ltYm9sLmNhbm9uaWNhbFN5bWJvbCE7XG5cbiAgICBpZiAoIWNhbm9uaWNhbFN5bWJvbC5yZWZlcmVuY2VkKSB7XG4gICAgICBjYW5vbmljYWxTeW1ib2wucmVmZXJlbmNlZCA9IHRydWU7XG4gICAgICAvLyBkZWNsYXJhdGlvbiBpcyBlbnN1cmVkIHRvIGJlIGRlZmluZGVkIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuXG4gICAgICBjb25zdCBkZWNsYXJhdGlvbiA9IGNhbm9uaWNhbFN5bWJvbC5kZWNsYXJhdGlvbiE7XG4gICAgICBjb25zdCBtb2R1bGUgPSB0aGlzLmdldE1ldGFkYXRhKGRlY2xhcmF0aW9uLm1vZHVsZSk7XG4gICAgICBpZiAobW9kdWxlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbW9kdWxlLm1ldGFkYXRhW2RlY2xhcmF0aW9uLm5hbWVdO1xuICAgICAgICBpZiAodmFsdWUgJiYgIWRlY2xhcmF0aW9uLm5hbWUuc3RhcnRzV2l0aCgnX19fJykpIHtcbiAgICAgICAgICBjYW5vbmljYWxTeW1ib2wudmFsdWUgPSB0aGlzLmNvbnZlcnRFbnRyeShkZWNsYXJhdGlvbi5tb2R1bGUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEVudHJ5KG1vZHVsZU5hbWU6IHN0cmluZywgdmFsdWU6IE1ldGFkYXRhRW50cnkpOiBNZXRhZGF0YUVudHJ5IHtcbiAgICBpZiAoaXNDbGFzc01ldGFkYXRhKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydENsYXNzKG1vZHVsZU5hbWUsIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGlzRnVuY3Rpb25NZXRhZGF0YSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRGdW5jdGlvbihtb2R1bGVOYW1lLCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChpc0ludGVyZmFjZU1ldGFkYXRhKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0VmFsdWUobW9kdWxlTmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Q2xhc3MobW9kdWxlTmFtZTogc3RyaW5nLCB2YWx1ZTogQ2xhc3NNZXRhZGF0YSk6IENsYXNzTWV0YWRhdGEge1xuICAgIHJldHVybiB7XG4gICAgICBfX3N5bWJvbGljOiAnY2xhc3MnLFxuICAgICAgYXJpdHk6IHZhbHVlLmFyaXR5LFxuICAgICAgZXh0ZW5kczogdGhpcy5jb252ZXJ0RXhwcmVzc2lvbihtb2R1bGVOYW1lLCB2YWx1ZS5leHRlbmRzKSAhLFxuICAgICAgZGVjb3JhdG9yczpcbiAgICAgICAgICB2YWx1ZS5kZWNvcmF0b3JzICYmIHZhbHVlLmRlY29yYXRvcnMubWFwKGQgPT4gdGhpcy5jb252ZXJ0RXhwcmVzc2lvbihtb2R1bGVOYW1lLCBkKSAhKSxcbiAgICAgIG1lbWJlcnM6IHRoaXMuY29udmVydE1lbWJlcnMobW9kdWxlTmFtZSwgdmFsdWUubWVtYmVycyAhKSxcbiAgICAgIHN0YXRpY3M6IHZhbHVlLnN0YXRpY3MgJiYgdGhpcy5jb252ZXJ0U3RhdGljcyhtb2R1bGVOYW1lLCB2YWx1ZS5zdGF0aWNzKVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRNZW1iZXJzKG1vZHVsZU5hbWU6IHN0cmluZywgbWVtYmVyczogTWV0YWRhdGFNYXApOiBNZXRhZGF0YU1hcCB7XG4gICAgY29uc3QgcmVzdWx0OiBNZXRhZGF0YU1hcCA9IHt9O1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiBtZW1iZXJzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG1lbWJlcnNbbmFtZV07XG4gICAgICByZXN1bHRbbmFtZV0gPSB2YWx1ZS5tYXAodiA9PiB0aGlzLmNvbnZlcnRNZW1iZXIobW9kdWxlTmFtZSwgdikpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0TWVtYmVyKG1vZHVsZU5hbWU6IHN0cmluZywgbWVtYmVyOiBNZW1iZXJNZXRhZGF0YSkge1xuICAgIGNvbnN0IHJlc3VsdDogTWVtYmVyTWV0YWRhdGEgPSB7X19zeW1ib2xpYzogbWVtYmVyLl9fc3ltYm9saWN9O1xuICAgIHJlc3VsdC5kZWNvcmF0b3JzID1cbiAgICAgICAgbWVtYmVyLmRlY29yYXRvcnMgJiYgbWVtYmVyLmRlY29yYXRvcnMubWFwKGQgPT4gdGhpcy5jb252ZXJ0RXhwcmVzc2lvbihtb2R1bGVOYW1lLCBkKSEpO1xuICAgIGlmIChpc01ldGhvZE1ldGFkYXRhKG1lbWJlcikpIHtcbiAgICAgIChyZXN1bHQgYXMgTWV0aG9kTWV0YWRhdGEpLnBhcmFtZXRlckRlY29yYXRvcnMgPSBtZW1iZXIucGFyYW1ldGVyRGVjb3JhdG9ycyAmJlxuICAgICAgICAgIG1lbWJlci5wYXJhbWV0ZXJEZWNvcmF0b3JzLm1hcChcbiAgICAgICAgICAgICAgZCA9PiBkICYmIGQubWFwKHAgPT4gdGhpcy5jb252ZXJ0RXhwcmVzc2lvbihtb2R1bGVOYW1lLCBwKSEpKTtcbiAgICAgIGlmIChpc0NvbnN0cnVjdG9yTWV0YWRhdGEobWVtYmVyKSkge1xuICAgICAgICBpZiAobWVtYmVyLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAocmVzdWx0IGFzIENvbnN0cnVjdG9yTWV0YWRhdGEpLnBhcmFtZXRlcnMgPVxuICAgICAgICAgICAgICBtZW1iZXIucGFyYW1ldGVycy5tYXAocCA9PiB0aGlzLmNvbnZlcnRFeHByZXNzaW9uKG1vZHVsZU5hbWUsIHApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0U3RhdGljcyhtb2R1bGVOYW1lOiBzdHJpbmcsIHN0YXRpY3M6IFN0YXRpY3NNZXRhZGF0YSk6IFN0YXRpY3NNZXRhZGF0YSB7XG4gICAgbGV0IHJlc3VsdDogU3RhdGljc01ldGFkYXRhID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc3RhdGljcykge1xuICAgICAgY29uc3QgdmFsdWUgPSBzdGF0aWNzW2tleV07XG5cbiAgICAgIGlmIChpc0Z1bmN0aW9uTWV0YWRhdGEodmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5jb252ZXJ0RnVuY3Rpb24obW9kdWxlTmFtZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChpc01ldGFkYXRhU3ltYm9saWNDYWxsRXhwcmVzc2lvbih2YWx1ZSkpIHtcbiAgICAgICAgLy8gQ2xhc3MgbWVtYmVycyBjYW4gYWxzbyBjb250YWluIHN0YXRpYyBtZW1iZXJzIHRoYXQgY2FsbCBhIGZ1bmN0aW9uIHdpdGggbW9kdWxlXG4gICAgICAgIC8vIHJlZmVyZW5jZXMuIGUuZy4gXCJzdGF0aWMgybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoLi4pXCIuIFdlIGFsc28gbmVlZCB0b1xuICAgICAgICAvLyBjb252ZXJ0IHRoZXNlIG1vZHVsZSByZWZlcmVuY2VzIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZXNlIHJlc29sdmUgdG8gbm9uLWV4aXN0ZW50IGZpbGVzLlxuICAgICAgICByZXN1bHRba2V5XSA9IHRoaXMuY29udmVydFZhbHVlKG1vZHVsZU5hbWUsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRGdW5jdGlvbihtb2R1bGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBGdW5jdGlvbk1ldGFkYXRhKTogRnVuY3Rpb25NZXRhZGF0YSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fc3ltYm9saWM6ICdmdW5jdGlvbicsXG4gICAgICBwYXJhbWV0ZXJzOiB2YWx1ZS5wYXJhbWV0ZXJzLFxuICAgICAgZGVmYXVsdHM6IHZhbHVlLmRlZmF1bHRzICYmIHZhbHVlLmRlZmF1bHRzLm1hcCh2ID0+IHRoaXMuY29udmVydFZhbHVlKG1vZHVsZU5hbWUsIHYpKSxcbiAgICAgIHZhbHVlOiB0aGlzLmNvbnZlcnRWYWx1ZShtb2R1bGVOYW1lLCB2YWx1ZS52YWx1ZSlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0VmFsdWUobW9kdWxlTmFtZTogc3RyaW5nLCB2YWx1ZTogTWV0YWRhdGFWYWx1ZSk6IE1ldGFkYXRhVmFsdWUge1xuICAgIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzTWV0YWRhdGFFcnJvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRFcnJvcihtb2R1bGVOYW1lLCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChpc01ldGFkYXRhU3ltYm9saWNFeHByZXNzaW9uKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEV4cHJlc3Npb24obW9kdWxlTmFtZSwgdmFsdWUpITtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUubWFwKHYgPT4gdGhpcy5jb252ZXJ0VmFsdWUobW9kdWxlTmFtZSwgdikpO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSBpdCBpcyBhIG1ldGFkYXRhIG9iamVjdC5cbiAgICBjb25zdCBvYmplY3QgPSB2YWx1ZSBhcyBNZXRhZGF0YU9iamVjdDtcbiAgICBjb25zdCByZXN1bHQ6IE1ldGFkYXRhT2JqZWN0ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICByZXN1bHRba2V5XSA9IHRoaXMuY29udmVydFZhbHVlKG1vZHVsZU5hbWUsIG9iamVjdFtrZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEV4cHJlc3Npb24oXG4gICAgICBtb2R1bGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBNZXRhZGF0YVN5bWJvbGljRXhwcmVzc2lvbnxNZXRhZGF0YUVycm9yfG51bGx8dW5kZWZpbmVkKTpcbiAgICAgIE1ldGFkYXRhU3ltYm9saWNFeHByZXNzaW9ufE1ldGFkYXRhRXJyb3J8dW5kZWZpbmVkfG51bGwge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgc3dpdGNoICh2YWx1ZS5fX3N5bWJvbGljKSB7XG4gICAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RXJyb3IobW9kdWxlTmFtZSwgdmFsdWUgYXMgTWV0YWRhdGFFcnJvcik7XG4gICAgICAgIGNhc2UgJ3JlZmVyZW5jZSc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFJlZmVyZW5jZShtb2R1bGVOYW1lLCB2YWx1ZSBhcyBNZXRhZGF0YVN5bWJvbGljUmVmZXJlbmNlRXhwcmVzc2lvbik7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydEV4cHJlc3Npb25Ob2RlKG1vZHVsZU5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RXJyb3IobW9kdWxlOiBzdHJpbmcsIHZhbHVlOiBNZXRhZGF0YUVycm9yKTogTWV0YWRhdGFFcnJvciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fc3ltYm9saWM6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOiB2YWx1ZS5tZXNzYWdlLFxuICAgICAgbGluZTogdmFsdWUubGluZSxcbiAgICAgIGNoYXJhY3RlcjogdmFsdWUuY2hhcmFjdGVyLFxuICAgICAgY29udGV4dDogdmFsdWUuY29udGV4dCxcbiAgICAgIG1vZHVsZVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRSZWZlcmVuY2UobW9kdWxlTmFtZTogc3RyaW5nLCB2YWx1ZTogTWV0YWRhdGFTeW1ib2xpY1JlZmVyZW5jZUV4cHJlc3Npb24pOlxuICAgICAgTWV0YWRhdGFTeW1ib2xpY1JlZmVyZW5jZUV4cHJlc3Npb258TWV0YWRhdGFFcnJvcnx1bmRlZmluZWQge1xuICAgIGNvbnN0IGNyZWF0ZVJlZmVyZW5jZSA9IChzeW1ib2w6IFN5bWJvbCk6IE1ldGFkYXRhU3ltYm9saWNSZWZlcmVuY2VFeHByZXNzaW9uID0+IHtcbiAgICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gc3ltYm9sLmRlY2xhcmF0aW9uITtcbiAgICAgIGlmIChkZWNsYXJhdGlvbi5tb2R1bGUuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgIC8vIFJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGluIHRoZSBtb2R1bGUuIEVuc3VyZSBpdCBpcyBjb252ZXJ0ZWQgdGhlbiByZXR1cm4gYVxuICAgICAgICAvLyByZWZlcmVuY2VzIHRvIHRoZSBmaW5hbCBzeW1ib2wuXG4gICAgICAgIHRoaXMuY29udmVydFN5bWJvbChzeW1ib2wpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9fc3ltYm9saWM6ICdyZWZlcmVuY2UnLFxuICAgICAgICAgIGdldCBuYW1lKCkge1xuICAgICAgICAgICAgLy8gUmVzb2x2ZWQgbGF6aWx5IGJlY2F1c2UgcHJpdmF0ZSBuYW1lcyBhcmUgYXNzaWduZWQgbGF0ZS5cbiAgICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbFN5bWJvbCA9IHN5bWJvbC5jYW5vbmljYWxTeW1ib2whO1xuICAgICAgICAgICAgaWYgKGNhbm9uaWNhbFN5bWJvbC5pc1ByaXZhdGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBzdGF0ZTogaXNQcml2YXRlIHdhcyBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjYW5vbmljYWxTeW1ib2wuaXNQcml2YXRlID8gY2Fub25pY2FsU3ltYm9sLnByaXZhdGVOYW1lISA6IGNhbm9uaWNhbFN5bWJvbC5uYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZSBzeW1ib2wgd2FzIGEgcmUtZXhwb3J0ZWQgc3ltYm9sIGZyb20gYW5vdGhlciBtb2R1bGUuIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGVcbiAgICAgICAgLy8gb3JpZ2luYWwgaW1wb3J0ZWQgc3ltYm9sLlxuICAgICAgICByZXR1cm4ge19fc3ltYm9saWM6ICdyZWZlcmVuY2UnLCBuYW1lOiBkZWNsYXJhdGlvbi5uYW1lLCBtb2R1bGU6IGRlY2xhcmF0aW9uLm1vZHVsZX07XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChpc01ldGFkYXRhR2xvYmFsUmVmZXJlbmNlRXhwcmVzc2lvbih2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5nZXRNZXRhZGF0YShtb2R1bGVOYW1lKTtcbiAgICAgIGlmIChtZXRhZGF0YSAmJiBtZXRhZGF0YS5tZXRhZGF0YSAmJiBtZXRhZGF0YS5tZXRhZGF0YVt2YWx1ZS5uYW1lXSkge1xuICAgICAgICAvLyBSZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBpbiB0aGUgbW9kdWxlXG4gICAgICAgIHJldHVybiBjcmVhdGVSZWZlcmVuY2UodGhpcy5jYW5vbmljYWxTeW1ib2xPZihtb2R1bGVOYW1lLCB2YWx1ZS5uYW1lKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGEgcmVmZXJlbmNlIGhhcyBhcmd1bWVudHMsIHRoZSBhcmd1bWVudHMgbmVlZCB0byBiZSBjb252ZXJ0ZWQuXG4gICAgICBpZiAodmFsdWUuYXJndW1lbnRzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX19zeW1ib2xpYzogJ3JlZmVyZW5jZScsXG4gICAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICBhcmd1bWVudHM6IHZhbHVlLmFyZ3VtZW50cy5tYXAoYSA9PiB0aGlzLmNvbnZlcnRWYWx1ZShtb2R1bGVOYW1lLCBhKSlcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gR2xvYmFsIHJlZmVyZW5jZXMgd2l0aG91dCBhcmd1bWVudHMgKHN1Y2ggYXMgdG8gTWF0aCBvciBKU09OKSBhcmUgdW5tb2RpZmllZC5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNNZXRhZGF0YUltcG9ydGVkU3ltYm9sUmVmZXJlbmNlRXhwcmVzc2lvbih2YWx1ZSkpIHtcbiAgICAgIC8vIFJlZmVyZW5jZXMgdG8gaW1wb3J0ZWQgc3ltYm9scyBhcmUgc2VwYXJhdGVkIGludG8gdHdvLCByZWZlcmVuY2VzIHRvIGJ1bmRsZWQgbW9kdWxlcyBhbmRcbiAgICAgIC8vIHJlZmVyZW5jZXMgdG8gbW9kdWxlcyBleHRlcm5hbCB0byB0aGUgYnVuZGxlLiBJZiB0aGUgbW9kdWxlIHJlZmVyZW5jZSBpcyByZWxhdGl2ZSBpdCBpc1xuICAgICAgLy8gYXNzdW1lZCB0byBiZSBpbiB0aGUgYnVuZGxlLiBJZiBpdCBpcyBHbG9iYWwgaXQgaXMgYXNzdW1lZCB0byBiZSBvdXRzaWRlIHRoZSBidW5kbGUuXG4gICAgICAvLyBSZWZlcmVuY2VzIHRvIHN5bWJvbHMgb3V0c2lkZSB0aGUgYnVuZGxlIGFyZSBsZWZ0IHVubW9kaWZpZWQuIFJlZmVyZW5jZXMgdG8gc3ltYm9sIGluc2lkZVxuICAgICAgLy8gdGhlIGJ1bmRsZSBuZWVkIHRvIGJlIGNvbnZlcnRlZCB0byBhIGJ1bmRsZSBpbXBvcnQgcmVmZXJlbmNlIHJlYWNoYWJsZSBmcm9tIHRoZSBidW5kbGVcbiAgICAgIC8vIGluZGV4LlxuXG4gICAgICBpZiAodmFsdWUubW9kdWxlLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICAvLyBSZWZlcmVuY2UgaXMgdG8gYSBzeW1ib2wgZGVmaW5lZCBpbnNpZGUgdGhlIG1vZHVsZS4gQ29udmVydCB0aGUgcmVmZXJlbmNlIHRvIGEgcmVmZXJlbmNlXG4gICAgICAgIC8vIHRvIHRoZSBjYW5vbmljYWwgc3ltYm9sLlxuICAgICAgICBjb25zdCByZWZlcmVuY2VkTW9kdWxlID0gcmVzb2x2ZU1vZHVsZSh2YWx1ZS5tb2R1bGUsIG1vZHVsZU5hbWUpO1xuICAgICAgICBjb25zdCByZWZlcmVuY2VkTmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICAgIHJldHVybiBjcmVhdGVSZWZlcmVuY2UodGhpcy5jYW5vbmljYWxTeW1ib2xPZihyZWZlcmVuY2VkTW9kdWxlLCByZWZlcmVuY2VkTmFtZSkpO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWx1ZSBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIG91dHNpZGUgdGhlIG1vZHVsZS5cbiAgICAgIGlmICh2YWx1ZS5hcmd1bWVudHMpIHtcbiAgICAgICAgLy8gSWYgYSByZWZlcmVuY2UgaGFzIGFyZ3VtZW50cyB0aGUgYXJndW1lbnRzIG5lZWQgdG8gYmUgY29udmVydGVkLlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9fc3ltYm9saWM6ICdyZWZlcmVuY2UnLFxuICAgICAgICAgIG5hbWU6IHZhbHVlLm5hbWUsXG4gICAgICAgICAgbW9kdWxlOiB2YWx1ZS5tb2R1bGUsXG4gICAgICAgICAgYXJndW1lbnRzOiB2YWx1ZS5hcmd1bWVudHMubWFwKGEgPT4gdGhpcy5jb252ZXJ0VmFsdWUobW9kdWxlTmFtZSwgYSkpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKGlzTWV0YWRhdGFNb2R1bGVSZWZlcmVuY2VFeHByZXNzaW9uKHZhbHVlKSkge1xuICAgICAgLy8gQ2Fubm90IHN1cHBvcnQgcmVmZXJlbmNlcyB0byBidW5kbGVkIG1vZHVsZXMgYXMgdGhlIGludGVybmFsIG1vZHVsZXMgb2YgYSBidW5kbGUgYXJlIGVyYXNlZFxuICAgICAgLy8gYnkgdGhlIGJ1bmRsZXIuXG4gICAgICBpZiAodmFsdWUubW9kdWxlLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9fc3ltYm9saWM6ICdlcnJvcicsXG4gICAgICAgICAgbWVzc2FnZTogJ1Vuc3VwcG9ydGVkIGJ1bmRsZWQgbW9kdWxlIHJlZmVyZW5jZScsXG4gICAgICAgICAgY29udGV4dDoge21vZHVsZTogdmFsdWUubW9kdWxlfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBSZWZlcmVuY2VzIHRvIHVuYnVuZGxlZCBtb2R1bGVzIGFyZSB1bm1vZGlmaWVkLlxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEV4cHJlc3Npb25Ob2RlKG1vZHVsZU5hbWU6IHN0cmluZywgdmFsdWU6IE1ldGFkYXRhU3ltYm9saWNFeHByZXNzaW9uKTpcbiAgICAgIE1ldGFkYXRhU3ltYm9saWNFeHByZXNzaW9uIHtcbiAgICBjb25zdCByZXN1bHQ6IE1ldGFkYXRhU3ltYm9saWNFeHByZXNzaW9uID0ge19fc3ltYm9saWM6IHZhbHVlLl9fc3ltYm9saWN9IGFzIGFueTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgKHJlc3VsdCBhcyBhbnkpW2tleV0gPSB0aGlzLmNvbnZlcnRWYWx1ZShtb2R1bGVOYW1lLCAodmFsdWUgYXMgYW55KVtrZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgc3ltYm9sT2YobW9kdWxlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFN5bWJvbCB7XG4gICAgY29uc3Qgc3ltYm9sS2V5ID0gYCR7bW9kdWxlfToke25hbWV9YDtcbiAgICBsZXQgc3ltYm9sID0gdGhpcy5zeW1ib2xNYXAuZ2V0KHN5bWJvbEtleSk7XG4gICAgaWYgKCFzeW1ib2wpIHtcbiAgICAgIHN5bWJvbCA9IHttb2R1bGUsIG5hbWV9O1xuICAgICAgdGhpcy5zeW1ib2xNYXAuc2V0KHN5bWJvbEtleSwgc3ltYm9sKTtcbiAgICB9XG4gICAgcmV0dXJuIHN5bWJvbDtcbiAgfVxuXG4gIHByaXZhdGUgY2Fub25pY2FsU3ltYm9sT2YobW9kdWxlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFN5bWJvbCB7XG4gICAgLy8gRW5zdXJlIHRoZSBtb2R1bGUgaGFzIGJlZW4gc2Vlbi5cbiAgICB0aGlzLmV4cG9ydEFsbChtb2R1bGUpO1xuICAgIGNvbnN0IHN5bWJvbCA9IHRoaXMuc3ltYm9sT2YobW9kdWxlLCBuYW1lKTtcbiAgICBpZiAoIXN5bWJvbC5jYW5vbmljYWxTeW1ib2wpIHtcbiAgICAgIHRoaXMuY2Fub25pY2FsaXplU3ltYm9sKHN5bWJvbCk7XG4gICAgfVxuICAgIHJldHVybiBzeW1ib2w7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBpbGVySG9zdEFkYXB0ZXIgaW1wbGVtZW50cyBNZXRhZGF0YUJ1bmRsZXJIb3N0IHtcbiAgcHJpdmF0ZSBjb2xsZWN0b3IgPSBuZXcgTWV0YWRhdGFDb2xsZWN0b3IoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgaG9zdDogdHMuQ29tcGlsZXJIb3N0LCBwcml2YXRlIGNhY2hlOiBNZXRhZGF0YUNhY2hlfG51bGwsXG4gICAgICBwcml2YXRlIG9wdGlvbnM6IHRzLkNvbXBpbGVyT3B0aW9ucykge31cblxuICBnZXRNZXRhZGF0YUZvcihmaWxlTmFtZTogc3RyaW5nLCBjb250YWluaW5nRmlsZTogc3RyaW5nKTogTW9kdWxlTWV0YWRhdGF8dW5kZWZpbmVkIHtcbiAgICBjb25zdCB7cmVzb2x2ZWRNb2R1bGV9ID1cbiAgICAgICAgdHMucmVzb2x2ZU1vZHVsZU5hbWUoZmlsZU5hbWUsIGNvbnRhaW5pbmdGaWxlLCB0aGlzLm9wdGlvbnMsIHRoaXMuaG9zdCk7XG5cbiAgICBsZXQgc291cmNlRmlsZTogdHMuU291cmNlRmlsZXx1bmRlZmluZWQ7XG4gICAgaWYgKHJlc29sdmVkTW9kdWxlKSB7XG4gICAgICBsZXQge3Jlc29sdmVkRmlsZU5hbWV9ID0gcmVzb2x2ZWRNb2R1bGU7XG4gICAgICBpZiAocmVzb2x2ZWRNb2R1bGUuZXh0ZW5zaW9uICE9PSAnLnRzJykge1xuICAgICAgICByZXNvbHZlZEZpbGVOYW1lID0gcmVzb2x2ZWRGaWxlTmFtZS5yZXBsYWNlKC8oXFwuZFxcLnRzfFxcLmpzKSQvLCAnLnRzJyk7XG4gICAgICB9XG4gICAgICBzb3VyY2VGaWxlID0gdGhpcy5ob3N0LmdldFNvdXJjZUZpbGUocmVzb2x2ZWRGaWxlTmFtZSwgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHR5cGVzY3JpcHQgaXMgdW5hYmxlIHRvIHJlc29sdmUgdGhlIGZpbGUsIGZhbGxiYWNrIG9uIG9sZCBiZWhhdmlvclxuICAgICAgaWYgKCF0aGlzLmhvc3QuZmlsZUV4aXN0cyhmaWxlTmFtZSArICcudHMnKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHNvdXJjZUZpbGUgPSB0aGlzLmhvc3QuZ2V0U291cmNlRmlsZShmaWxlTmFtZSArICcudHMnLCB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0KTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhIG1ldGFkYXRhIGNhY2hlLCB1c2UgaXQgdG8gZ2V0IHRoZSBtZXRhZGF0YSBmb3IgdGhpcyBzb3VyY2UgZmlsZS4gT3RoZXJ3aXNlLFxuICAgIC8vIGZhbGwgYmFjayBvbiB0aGUgbG9jYWxseSBjcmVhdGVkIE1ldGFkYXRhQ29sbGVjdG9yLlxuICAgIGlmICghc291cmNlRmlsZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldE1ldGFkYXRhKHNvdXJjZUZpbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5jb2xsZWN0b3IuZ2V0TWV0YWRhdGEoc291cmNlRmlsZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVNb2R1bGUoaW1wb3J0TmFtZTogc3RyaW5nLCBmcm9tOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKCcuJykgJiYgZnJvbSkge1xuICAgIGxldCBub3JtYWxQYXRoID0gcGF0aC5ub3JtYWxpemUocGF0aC5qb2luKHBhdGguZGlybmFtZShmcm9tKSwgaW1wb3J0TmFtZSkpO1xuICAgIGlmICghbm9ybWFsUGF0aC5zdGFydHNXaXRoKCcuJykgJiYgZnJvbS5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgIC8vIHBhdGgubm9ybWFsaXplKCkgcHJlc2VydmVzIGxlYWRpbmcgJy4uLycgYnV0IG5vdCAnLi8nLiBUaGlzIGFkZHMgaXQgYmFjay5cbiAgICAgIG5vcm1hbFBhdGggPSBgLiR7cGF0aC5zZXB9JHtub3JtYWxQYXRofWA7XG4gICAgfVxuICAgIC8vIFJlcGxhY2Ugd2luZG93cyBwYXRoIGRlbGltaXRlcnMgd2l0aCBmb3J3YXJkLXNsYXNoZXMuIE90aGVyd2lzZSB0aGUgcGF0aHMgYXJlIG5vdFxuICAgIC8vIFR5cGVTY3JpcHQgY29tcGF0aWJsZSB3aGVuIGJ1aWxkaW5nIHRoZSBidW5kbGUuXG4gICAgcmV0dXJuIG5vcm1hbFBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICB9XG4gIHJldHVybiBpbXBvcnROYW1lO1xufVxuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShvOiBhbnkpOiBvIGlzIGJvb2xlYW58c3RyaW5nfG51bWJlciB7XG4gIHJldHVybiBvID09PSBudWxsIHx8ICh0eXBlb2YgbyAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbyAhPT0gJ29iamVjdCcpO1xufVxuXG5mdW5jdGlvbiBnZXRSb290RXhwb3J0KHN5bWJvbDogU3ltYm9sKTogU3ltYm9sIHtcbiAgcmV0dXJuIHN5bWJvbC5yZWV4cG9ydGVkQXMgPyBnZXRSb290RXhwb3J0KHN5bWJvbC5yZWV4cG9ydGVkQXMpIDogc3ltYm9sO1xufVxuXG5mdW5jdGlvbiBnZXRTeW1ib2xEZWNsYXJhdGlvbihzeW1ib2w6IFN5bWJvbCk6IFN5bWJvbCB7XG4gIHJldHVybiBzeW1ib2wuZXhwb3J0cyA/IGdldFN5bWJvbERlY2xhcmF0aW9uKHN5bWJvbC5leHBvcnRzKSA6IHN5bWJvbDtcbn1cbiJdfQ== |
---|