@angular/compiler-cli 7.2.4 → 7.2.8
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/index.js +1 -1
- package/package.json +4 -4
- package/src/diagnostics/expression_diagnostics.js +98 -151
- package/src/diagnostics/expression_type.js +122 -139
- package/src/diagnostics/translate_diagnostics.js +12 -12
- package/src/diagnostics/typescript_symbols.js +296 -514
- package/src/diagnostics/typescript_version.js +8 -8
- package/src/extract_i18n.js +11 -13
- package/src/main.js +80 -78
- package/src/metadata/bundle_index_host.js +39 -51
- package/src/metadata/bundler.js +214 -256
- package/src/metadata/collector.js +235 -317
- package/src/metadata/evaluator.js +146 -162
- package/src/metadata/index.js +1 -1
- package/src/metadata/index_writer.js +25 -47
- package/src/metadata/symbols.js +44 -62
- package/src/ngcc/src/packages/build_marker.d.ts +1 -1
- package/src/ngcc/src/packages/build_marker.js +1 -1
- package/src/ngtools_api.js +29 -44
- package/src/ngtools_api2.js +9 -11
- package/src/ngtsc/program.js +122 -162
- package/src/ngtsc/resource_loader.js +35 -50
- package/src/perform_compile.js +87 -93
- package/src/perform_watch.js +50 -51
- package/src/transformers/compiler_host.js +158 -171
- package/src/transformers/inline_resources.js +54 -57
- package/src/transformers/lower_expressions.js +87 -101
- package/src/transformers/metadata_cache.js +21 -50
- package/src/transformers/metadata_reader.js +17 -18
- package/src/transformers/nocollapse_hack.js +9 -9
- package/src/transformers/node_emitter.js +214 -237
- package/src/transformers/node_emitter_transform.js +25 -21
- package/src/transformers/program.js +336 -440
- package/src/transformers/r3_metadata_transform.js +21 -34
- package/src/transformers/r3_strip_decorators.js +29 -31
- package/src/transformers/r3_transform.js +7 -8
- package/src/transformers/tsc_pass_through.js +33 -37
- package/src/transformers/util.js +18 -30
- package/src/version.js +3 -3
|
@@ -11,17 +11,16 @@
|
|
|
11
11
|
if (v !== undefined) module.exports = v;
|
|
12
12
|
}
|
|
13
13
|
else if (typeof define === "function" && define.amd) {
|
|
14
|
-
define("@angular/compiler-cli/src/transformers/lower_expressions", ["require", "exports", "
|
|
14
|
+
define("@angular/compiler-cli/src/transformers/lower_expressions", ["require", "exports", "@angular/compiler", "typescript", "@angular/compiler-cli/src/metadata/index"], factory);
|
|
15
15
|
}
|
|
16
16
|
})(function (require, exports) {
|
|
17
17
|
"use strict";
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
var index_1 = require("@angular/compiler-cli/src/metadata/index");
|
|
19
|
+
const compiler_1 = require("@angular/compiler");
|
|
20
|
+
const ts = require("typescript");
|
|
21
|
+
const index_1 = require("@angular/compiler-cli/src/metadata/index");
|
|
23
22
|
function toMap(items, select) {
|
|
24
|
-
return new Map(items.map(
|
|
23
|
+
return new Map(items.map(i => [select(i), i]));
|
|
25
24
|
}
|
|
26
25
|
// We will never lower expressions in a nested lexical scope so avoid entering them.
|
|
27
26
|
// This also avoids a bug in TypeScript 2.3 where the lexical scopes get out of sync
|
|
@@ -41,35 +40,35 @@
|
|
|
41
40
|
return false;
|
|
42
41
|
}
|
|
43
42
|
function transformSourceFile(sourceFile, requests, context) {
|
|
44
|
-
|
|
43
|
+
const inserts = [];
|
|
45
44
|
// Calculate the range of interesting locations. The transform will only visit nodes in this
|
|
46
45
|
// range to improve the performance on large files.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
const locations = Array.from(requests.keys());
|
|
47
|
+
const min = Math.min(...locations);
|
|
48
|
+
const max = Math.max(...locations);
|
|
50
49
|
// Visit nodes matching the request and synthetic nodes added by tsickle
|
|
51
50
|
function shouldVisit(pos, end) {
|
|
52
51
|
return (pos <= max && end >= min) || pos == -1;
|
|
53
52
|
}
|
|
54
53
|
function visitSourceFile(sourceFile) {
|
|
55
54
|
function topLevelStatement(node) {
|
|
56
|
-
|
|
55
|
+
const declarations = [];
|
|
57
56
|
function visitNode(node) {
|
|
58
57
|
// Get the original node before tsickle
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
const { pos, end, kind, parent: originalParent } = ts.getOriginalNode(node);
|
|
59
|
+
const nodeRequest = requests.get(pos);
|
|
61
60
|
if (nodeRequest && nodeRequest.kind == kind && nodeRequest.end == end) {
|
|
62
61
|
// This node is requested to be rewritten as a reference to the exported name.
|
|
63
62
|
if (originalParent && originalParent.kind === ts.SyntaxKind.VariableDeclaration) {
|
|
64
63
|
// As the value represents the whole initializer of a variable declaration,
|
|
65
64
|
// just refer to that variable. This e.g. helps to preserve closure comments
|
|
66
65
|
// at the right place.
|
|
67
|
-
|
|
66
|
+
const varParent = originalParent;
|
|
68
67
|
if (varParent.name.kind === ts.SyntaxKind.Identifier) {
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
const varName = varParent.name.text;
|
|
69
|
+
const exportName = nodeRequest.name;
|
|
71
70
|
declarations.push({
|
|
72
|
-
name:
|
|
71
|
+
name: exportName,
|
|
73
72
|
node: ts.createIdentifier(varName),
|
|
74
73
|
order: 1 /* AfterStmt */
|
|
75
74
|
});
|
|
@@ -77,19 +76,19 @@
|
|
|
77
76
|
}
|
|
78
77
|
}
|
|
79
78
|
// Record that the node needs to be moved to an exported variable with the given name
|
|
80
|
-
|
|
81
|
-
declarations.push({ name: exportName, node
|
|
79
|
+
const exportName = nodeRequest.name;
|
|
80
|
+
declarations.push({ name: exportName, node, order: 0 /* BeforeStmt */ });
|
|
82
81
|
return ts.createIdentifier(exportName);
|
|
83
82
|
}
|
|
84
|
-
|
|
83
|
+
let result = node;
|
|
85
84
|
if (shouldVisit(pos, end) && !isLexicalScope(node)) {
|
|
86
85
|
result = ts.visitEachChild(node, visitNode, context);
|
|
87
86
|
}
|
|
88
87
|
return result;
|
|
89
88
|
}
|
|
90
89
|
// Get the original node before tsickle
|
|
91
|
-
|
|
92
|
-
|
|
90
|
+
const { pos, end } = ts.getOriginalNode(node);
|
|
91
|
+
let resultStmt;
|
|
93
92
|
if (shouldVisit(pos, end)) {
|
|
94
93
|
resultStmt = ts.visitEachChild(node, visitNode, context);
|
|
95
94
|
}
|
|
@@ -97,45 +96,45 @@
|
|
|
97
96
|
resultStmt = node;
|
|
98
97
|
}
|
|
99
98
|
if (declarations.length) {
|
|
100
|
-
inserts.push({ relativeTo: resultStmt, declarations
|
|
99
|
+
inserts.push({ relativeTo: resultStmt, declarations });
|
|
101
100
|
}
|
|
102
101
|
return resultStmt;
|
|
103
102
|
}
|
|
104
|
-
|
|
103
|
+
let newStatements = sourceFile.statements.map(topLevelStatement);
|
|
105
104
|
if (inserts.length) {
|
|
106
105
|
// Insert the declarations relative to the rewritten statement that references them.
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
newStatements.forEach(
|
|
110
|
-
|
|
106
|
+
const insertMap = toMap(inserts, i => i.relativeTo);
|
|
107
|
+
const tmpStatements = [];
|
|
108
|
+
newStatements.forEach(statement => {
|
|
109
|
+
const insert = insertMap.get(statement);
|
|
111
110
|
if (insert) {
|
|
112
|
-
|
|
111
|
+
const before = insert.declarations.filter(d => d.order === 0 /* BeforeStmt */);
|
|
113
112
|
if (before.length) {
|
|
114
|
-
|
|
113
|
+
tmpStatements.push(createVariableStatementForDeclarations(before));
|
|
115
114
|
}
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
tmpStatements.push(statement);
|
|
116
|
+
const after = insert.declarations.filter(d => d.order === 1 /* AfterStmt */);
|
|
118
117
|
if (after.length) {
|
|
119
|
-
|
|
118
|
+
tmpStatements.push(createVariableStatementForDeclarations(after));
|
|
120
119
|
}
|
|
121
120
|
}
|
|
122
121
|
else {
|
|
123
|
-
|
|
122
|
+
tmpStatements.push(statement);
|
|
124
123
|
}
|
|
125
124
|
});
|
|
126
125
|
// Insert an exports clause to export the declarations
|
|
127
|
-
|
|
126
|
+
tmpStatements.push(ts.createExportDeclaration(
|
|
128
127
|
/* decorators */ undefined,
|
|
129
128
|
/* modifiers */ undefined, ts.createNamedExports(inserts
|
|
130
|
-
.reduce(
|
|
131
|
-
.map(
|
|
132
|
-
/* propertyName */ undefined, declaration.name)
|
|
133
|
-
newStatements =
|
|
129
|
+
.reduce((accumulator, insert) => [...accumulator, ...insert.declarations], [])
|
|
130
|
+
.map(declaration => ts.createExportSpecifier(
|
|
131
|
+
/* propertyName */ undefined, declaration.name)))));
|
|
132
|
+
newStatements = tmpStatements;
|
|
134
133
|
}
|
|
135
134
|
// Note: We cannot use ts.updateSourcefile here as
|
|
136
135
|
// it does not work well with decorators.
|
|
137
136
|
// See https://github.com/Microsoft/TypeScript/issues/17384
|
|
138
|
-
|
|
137
|
+
const newSf = ts.getMutableClone(sourceFile);
|
|
139
138
|
if (!(sourceFile.flags & ts.NodeFlags.Synthesized)) {
|
|
140
139
|
newSf.flags &= ~ts.NodeFlags.Synthesized;
|
|
141
140
|
}
|
|
@@ -145,23 +144,23 @@
|
|
|
145
144
|
return visitSourceFile(sourceFile);
|
|
146
145
|
}
|
|
147
146
|
function createVariableStatementForDeclarations(declarations) {
|
|
148
|
-
|
|
147
|
+
const varDecls = declarations.map(i => ts.createVariableDeclaration(i.name, /* type */ undefined, i.node));
|
|
149
148
|
return ts.createVariableStatement(
|
|
150
149
|
/* modifiers */ undefined, ts.createVariableDeclarationList(varDecls, ts.NodeFlags.Const));
|
|
151
150
|
}
|
|
152
151
|
function getExpressionLoweringTransformFactory(requestsMap, program) {
|
|
153
152
|
// Return the factory
|
|
154
|
-
return
|
|
153
|
+
return (context) => (sourceFile) => {
|
|
155
154
|
// We need to use the original SourceFile for reading metadata, and not the transformed one.
|
|
156
|
-
|
|
155
|
+
const originalFile = program.getSourceFile(sourceFile.fileName);
|
|
157
156
|
if (originalFile) {
|
|
158
|
-
|
|
157
|
+
const requests = requestsMap.getRequests(originalFile);
|
|
159
158
|
if (requests && requests.size) {
|
|
160
159
|
return transformSourceFile(sourceFile, requests, context);
|
|
161
160
|
}
|
|
162
161
|
}
|
|
163
162
|
return sourceFile;
|
|
164
|
-
};
|
|
163
|
+
};
|
|
165
164
|
}
|
|
166
165
|
exports.getExpressionLoweringTransformFactory = getExpressionLoweringTransformFactory;
|
|
167
166
|
function isEligibleForLowering(node) {
|
|
@@ -195,23 +194,23 @@
|
|
|
195
194
|
}
|
|
196
195
|
function isLiteralFieldNamed(node, names) {
|
|
197
196
|
if (node.parent && node.parent.kind == ts.SyntaxKind.PropertyAssignment) {
|
|
198
|
-
|
|
197
|
+
const property = node.parent;
|
|
199
198
|
if (property.parent && property.parent.kind == ts.SyntaxKind.ObjectLiteralExpression &&
|
|
200
199
|
property.name && property.name.kind == ts.SyntaxKind.Identifier) {
|
|
201
|
-
|
|
200
|
+
const propertyName = property.name;
|
|
202
201
|
return names.has(propertyName.text);
|
|
203
202
|
}
|
|
204
203
|
}
|
|
205
204
|
return false;
|
|
206
205
|
}
|
|
207
|
-
|
|
208
|
-
|
|
206
|
+
class LowerMetadataTransform {
|
|
207
|
+
constructor(lowerableFieldNames) {
|
|
209
208
|
this.requests = new Map();
|
|
210
209
|
this.lowerableFieldNames = new Set(lowerableFieldNames);
|
|
211
210
|
}
|
|
212
211
|
// RequestMap
|
|
213
|
-
|
|
214
|
-
|
|
212
|
+
getRequests(sourceFile) {
|
|
213
|
+
let result = this.requests.get(sourceFile.fileName);
|
|
215
214
|
if (!result) {
|
|
216
215
|
// Force the metadata for this source file to be collected which
|
|
217
216
|
// will recursively call start() populating the request map;
|
|
@@ -221,25 +220,24 @@
|
|
|
221
220
|
result = this.requests.get(sourceFile.fileName) || new Map();
|
|
222
221
|
}
|
|
223
222
|
return result;
|
|
224
|
-
}
|
|
223
|
+
}
|
|
225
224
|
// MetadataTransformer
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
var requests = new Map();
|
|
225
|
+
connect(cache) { this.cache = cache; }
|
|
226
|
+
start(sourceFile) {
|
|
227
|
+
let identNumber = 0;
|
|
228
|
+
const freshIdent = () => compiler_1.createLoweredSymbol(identNumber++);
|
|
229
|
+
const requests = new Map();
|
|
232
230
|
this.requests.set(sourceFile.fileName, requests);
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
requests.set(node.pos, { name
|
|
236
|
-
return { __symbolic: 'reference', name
|
|
231
|
+
const replaceNode = (node) => {
|
|
232
|
+
const name = freshIdent();
|
|
233
|
+
requests.set(node.pos, { name, kind: node.kind, location: node.pos, end: node.end });
|
|
234
|
+
return { __symbolic: 'reference', name };
|
|
237
235
|
};
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
return
|
|
236
|
+
const isExportedSymbol = (() => {
|
|
237
|
+
let exportTable;
|
|
238
|
+
return (node) => {
|
|
241
239
|
if (node.kind == ts.SyntaxKind.Identifier) {
|
|
242
|
-
|
|
240
|
+
const ident = node;
|
|
243
241
|
if (!exportTable) {
|
|
244
242
|
exportTable = createExportTableFor(sourceFile);
|
|
245
243
|
}
|
|
@@ -248,33 +246,33 @@
|
|
|
248
246
|
return false;
|
|
249
247
|
};
|
|
250
248
|
})();
|
|
251
|
-
|
|
249
|
+
const isExportedPropertyAccess = (node) => {
|
|
252
250
|
if (node.kind === ts.SyntaxKind.PropertyAccessExpression) {
|
|
253
|
-
|
|
251
|
+
const pae = node;
|
|
254
252
|
if (isExportedSymbol(pae.expression)) {
|
|
255
253
|
return true;
|
|
256
254
|
}
|
|
257
255
|
}
|
|
258
256
|
return false;
|
|
259
257
|
};
|
|
260
|
-
|
|
261
|
-
|
|
258
|
+
const hasLowerableParentCache = new Map();
|
|
259
|
+
const shouldBeLowered = (node) => {
|
|
262
260
|
if (node === undefined) {
|
|
263
261
|
return false;
|
|
264
262
|
}
|
|
265
|
-
|
|
263
|
+
let lowerable = false;
|
|
266
264
|
if ((node.kind === ts.SyntaxKind.ArrowFunction ||
|
|
267
265
|
node.kind === ts.SyntaxKind.FunctionExpression) &&
|
|
268
266
|
isEligibleForLowering(node)) {
|
|
269
267
|
lowerable = true;
|
|
270
268
|
}
|
|
271
|
-
else if (isLiteralFieldNamed(node,
|
|
269
|
+
else if (isLiteralFieldNamed(node, this.lowerableFieldNames) && isEligibleForLowering(node) &&
|
|
272
270
|
!isExportedSymbol(node) && !isExportedPropertyAccess(node)) {
|
|
273
271
|
lowerable = true;
|
|
274
272
|
}
|
|
275
273
|
return lowerable;
|
|
276
274
|
};
|
|
277
|
-
|
|
275
|
+
const hasLowerableParent = (node) => {
|
|
278
276
|
if (node === undefined) {
|
|
279
277
|
return false;
|
|
280
278
|
}
|
|
@@ -283,71 +281,59 @@
|
|
|
283
281
|
}
|
|
284
282
|
return hasLowerableParentCache.get(node);
|
|
285
283
|
};
|
|
286
|
-
|
|
284
|
+
const isLowerable = (node) => {
|
|
287
285
|
if (node === undefined) {
|
|
288
286
|
return false;
|
|
289
287
|
}
|
|
290
288
|
return shouldBeLowered(node) && !hasLowerableParent(node);
|
|
291
289
|
};
|
|
292
|
-
return
|
|
290
|
+
return (value, node) => {
|
|
293
291
|
if (!isPrimitive(value) && !isRewritten(value) && isLowerable(node)) {
|
|
294
292
|
return replaceNode(node);
|
|
295
293
|
}
|
|
296
294
|
return value;
|
|
297
295
|
};
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
}());
|
|
296
|
+
}
|
|
297
|
+
}
|
|
301
298
|
exports.LowerMetadataTransform = LowerMetadataTransform;
|
|
302
299
|
function createExportTableFor(sourceFile) {
|
|
303
|
-
|
|
300
|
+
const exportTable = new Set();
|
|
304
301
|
// Lazily collect all the exports from the source file
|
|
305
302
|
ts.forEachChild(sourceFile, function scan(node) {
|
|
306
|
-
var e_1, _a;
|
|
307
303
|
switch (node.kind) {
|
|
308
304
|
case ts.SyntaxKind.ClassDeclaration:
|
|
309
305
|
case ts.SyntaxKind.FunctionDeclaration:
|
|
310
306
|
case ts.SyntaxKind.InterfaceDeclaration:
|
|
311
307
|
if ((ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Export) != 0) {
|
|
312
|
-
|
|
313
|
-
|
|
308
|
+
const classDeclaration = node;
|
|
309
|
+
const name = classDeclaration.name;
|
|
314
310
|
if (name)
|
|
315
311
|
exportTable.add(name.text);
|
|
316
312
|
}
|
|
317
313
|
break;
|
|
318
314
|
case ts.SyntaxKind.VariableStatement:
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
var declaration = _c.value;
|
|
323
|
-
scan(declaration);
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
327
|
-
finally {
|
|
328
|
-
try {
|
|
329
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
330
|
-
}
|
|
331
|
-
finally { if (e_1) throw e_1.error; }
|
|
315
|
+
const variableStatement = node;
|
|
316
|
+
for (const declaration of variableStatement.declarationList.declarations) {
|
|
317
|
+
scan(declaration);
|
|
332
318
|
}
|
|
333
319
|
break;
|
|
334
320
|
case ts.SyntaxKind.VariableDeclaration:
|
|
335
|
-
|
|
321
|
+
const variableDeclaration = node;
|
|
336
322
|
if ((ts.getCombinedModifierFlags(variableDeclaration) & ts.ModifierFlags.Export) != 0 &&
|
|
337
323
|
variableDeclaration.name.kind == ts.SyntaxKind.Identifier) {
|
|
338
|
-
|
|
324
|
+
const name = variableDeclaration.name;
|
|
339
325
|
exportTable.add(name.text);
|
|
340
326
|
}
|
|
341
327
|
break;
|
|
342
328
|
case ts.SyntaxKind.ExportDeclaration:
|
|
343
|
-
|
|
344
|
-
|
|
329
|
+
const exportDeclaration = node;
|
|
330
|
+
const { moduleSpecifier, exportClause } = exportDeclaration;
|
|
345
331
|
if (!moduleSpecifier && exportClause) {
|
|
346
|
-
exportClause.elements.forEach(
|
|
332
|
+
exportClause.elements.forEach(spec => { exportTable.add(spec.name.text); });
|
|
347
333
|
}
|
|
348
334
|
}
|
|
349
335
|
});
|
|
350
336
|
return exportTable;
|
|
351
337
|
}
|
|
352
338
|
});
|
|
353
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG93ZXJfZXhwcmVzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci1jbGkvc3JjL3RyYW5zZm9ybWVycy9sb3dlcl9leHByZXNzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7SUFFSCw4Q0FBdUU7SUFDdkUsK0JBQWlDO0lBRWpDLGtFQUEwSTtJQXlCMUksU0FBUyxLQUFLLENBQU8sS0FBVSxFQUFFLE1BQXNCO1FBQ3JELE9BQU8sSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBUyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFkLENBQWMsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELG9GQUFvRjtJQUNwRixvRkFBb0Y7SUFDcEYsNkJBQTZCO0lBQzdCLFNBQVMsY0FBYyxDQUFDLElBQWE7UUFDbkMsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2pCLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7WUFDakMsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDO1lBQ3RDLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQztZQUN2QyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDO1lBQ25DLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNwQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDO1lBQ2hDLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7WUFDL0IsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVM7Z0JBQzFCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENB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QUFVLENBQUMsbUJBQW1CO29CQUNwQyxJQUFNLG1CQUFtQixHQUFHLElBQThCLENBQUM7b0JBQzNELElBQUksQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsbUJBQW1CLENBQUMsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7d0JBQ2pGLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUU7d0JBQzdELElBQU0sSUFBSSxHQUFHLG1CQUFtQixDQUFDLElBQXFCLENBQUM7d0JBQ3ZELFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUM1QjtvQkFDRCxNQUFNO2dCQUNSLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUI7b0JBQ2xDLElBQU0saUJBQWlCLEdBQUcsSUFBNEIsQ0FBQztvQkFDaEQsSUFBQSxtREFBZSxFQUFFLDZDQUFZLENBQXNCO29CQUMxRCxJQUFJLENBQUMsZUFBZSxJQUFJLFlBQVksRUFBRTt3QkFDcEMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBQSxJQUFJLElBQU0sV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQzdFO2FBQ0o7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7Y3JlYXRlTG93ZXJlZFN5bWJvbCwgaXNMb3dlcmVkU3ltYm9sfSBmcm9tICdAYW5ndWxhci9jb21waWxlcic7XG5pbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHtDb2xsZWN0b3JPcHRpb25zLCBNZXRhZGF0YUNvbGxlY3RvciwgTWV0YWRhdGFWYWx1ZSwgTW9kdWxlTWV0YWRhdGEsIGlzTWV0YWRhdGFHbG9iYWxSZWZlcmVuY2VFeHByZXNzaW9ufSBmcm9tICcuLi9tZXRhZGF0YS9pbmRleCc7XG5pbXBvcnQge01ldGFkYXRhQ2FjaGUsIE1ldGFkYXRhVHJhbnNmb3JtZXIsIFZhbHVlVHJhbnNmb3JtfSBmcm9tICcuL21ldGFkYXRhX2NhY2hlJztcblxuZXhwb3J0IGludGVyZmFjZSBMb3dlcmluZ1JlcXVlc3Qge1xuICBraW5kOiB0cy5TeW50YXhLaW5kO1xuICBsb2NhdGlvbjogbnVtYmVyO1xuICBlbmQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBSZXF1ZXN0TG9jYXRpb25NYXAgPSBNYXA8bnVtYmVyLCBMb3dlcmluZ1JlcXVlc3Q+O1xuXG5jb25zdCBlbnVtIERlY2xhcmF0aW9uT3JkZXIgeyBCZWZvcmVTdG10LCBBZnRlclN0bXQgfVxuXG5pbnRlcmZhY2UgRGVjbGFyYXRpb24ge1xuICBuYW1lOiBzdHJpbmc7XG4gIG5vZGU6IHRzLk5vZGU7XG4gIG9yZGVyOiBEZWNsYXJhdGlvbk9yZGVyO1xufVxuXG5pbnRlcmZhY2UgRGVjbGFyYXRpb25JbnNlcnQge1xuICBkZWNsYXJhdGlvbnM6IERlY2xhcmF0aW9uW107XG4gIHJlbGF0aXZlVG86IHRzLk5vZGU7XG59XG5cbmZ1bmN0aW9uIHRvTWFwPFQsIEs+KGl0ZW1zOiBUW10sIHNlbGVjdDogKGl0ZW06IFQpID0+IEspOiBNYXA8SywgVD4ge1xuICByZXR1cm4gbmV3IE1hcChpdGVtcy5tYXA8W0ssIFRdPihpID0+IFtzZWxlY3QoaSksIGldKSk7XG59XG5cbi8vIFdlIHdpbGwgbmV2ZXIgbG93ZXIgZXhwcmVzc2lvbnMgaW4gYSBuZXN0ZWQgbGV4aWNhbCBzY29wZSBzbyBhdm9pZCBlbnRlcmluZyB0aGVtLlxuLy8gVGhpcyBhbHNvIGF2b2lkcyBhIGJ1ZyBpbiBUeXBlU2NyaXB0IDIuMyB3aGVyZSB0aGUgbGV4aWNhbCBzY29wZXMgZ2V0IG91dCBvZiBzeW5jXG4vLyB3aGVuIHVzaW5nIHZpc2l0RWFjaENoaWxkLlxuZnVuY3Rpb24gaXNMZXhpY2FsU2NvcGUobm9kZTogdHMuTm9kZSk6IGJvb2xlYW4ge1xuICBzd2l0Y2ggKG5vZGUua2luZCkge1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5BcnJvd0Z1bmN0aW9uOlxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5GdW5jdGlvbkV4cHJlc3Npb246XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkZ1bmN0aW9uRGVjbGFyYXRpb246XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkNsYXNzRXhwcmVzc2lvbjpcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuQ2xhc3NEZWNsYXJhdGlvbjpcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuRnVuY3Rpb25UeXBlOlxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5UeXBlTGl0ZXJhbDpcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuQXJyYXlUeXBlOlxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Tb3VyY2VGaWxlKFxuICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsIHJlcXVlc3RzOiBSZXF1ZXN0TG9jYXRpb25NYXAsXG4gICAgY29udGV4dDogdHMuVHJhbnNmb3JtYXRpb25Db250ZXh0KTogdHMuU291cmNlRmlsZSB7XG4gIGNvbnN0IGluc2VydHM6IERlY2xhcmF0aW9uSW5zZXJ0W10gPSBbXTtcblxuICAvLyBDYWxjdWxhdGUgdGhlIHJhbmdlIG9mIGludGVyZXN0aW5nIGxvY2F0aW9ucy4gVGhlIHRyYW5zZm9ybSB3aWxsIG9ubHkgdmlzaXQgbm9kZXMgaW4gdGhpc1xuICAvLyByYW5nZSB0byBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvbiBsYXJnZSBmaWxlcy5cbiAgY29uc3QgbG9jYXRpb25zID0gQXJyYXkuZnJvbShyZXF1ZXN0cy5rZXlzKCkpO1xuICBjb25zdCBtaW4gPSBNYXRoLm1pbiguLi5sb2NhdGlvbnMpO1xuICBjb25zdCBtYXggPSBNYXRoLm1heCguLi5sb2NhdGlvbnMpO1xuXG4gIC8vIFZpc2l0IG5vZGVzIG1hdGNoaW5nIHRoZSByZXF1ZXN0IGFuZCBzeW50aGV0aWMgbm9kZXMgYWRkZWQgYnkgdHNpY2tsZVxuICBmdW5jdGlvbiBzaG91bGRWaXNpdChwb3M6IG51bWJlciwgZW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHBvcyA8PSBtYXggJiYgZW5kID49IG1pbikgfHwgcG9zID09IC0xO1xuICB9XG5cbiAgZnVuY3Rpb24gdmlzaXRTb3VyY2VGaWxlKHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpOiB0cy5Tb3VyY2VGaWxlIHtcbiAgICBmdW5jdGlvbiB0b3BMZXZlbFN0YXRlbWVudChub2RlOiB0cy5TdGF0ZW1lbnQpOiB0cy5TdGF0ZW1lbnQge1xuICAgICAgY29uc3QgZGVjbGFyYXRpb25zOiBEZWNsYXJhdGlvbltdID0gW107XG5cbiAgICAgIGZ1bmN0aW9uIHZpc2l0Tm9kZShub2RlOiB0cy5Ob2RlKTogdHMuTm9kZSB7XG4gICAgICAgIC8vIEdldCB0aGUgb3JpZ2luYWwgbm9kZSBiZWZvcmUgdHNpY2tsZVxuICAgICAgICBjb25zdCB7cG9zLCBlbmQsIGtpbmQsIHBhcmVudDogb3JpZ2luYWxQYXJlbnR9ID0gdHMuZ2V0T3JpZ2luYWxOb2RlKG5vZGUpO1xuICAgICAgICBjb25zdCBub2RlUmVxdWVzdCA9IHJlcXVlc3RzLmdldChwb3MpO1xuICAgICAgICBpZiAobm9kZVJlcXVlc3QgJiYgbm9kZVJlcXVlc3Qua2luZCA9PSBraW5kICYmIG5vZGVSZXF1ZXN0LmVuZCA9PSBlbmQpIHtcbiAgICAgICAgICAvLyBUaGlzIG5vZGUgaXMgcmVxdWVzdGVkIHRvIGJlIHJld3JpdHRlbiBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZXhwb3J0ZWQgbmFtZS5cbiAgICAgICAgICBpZiAob3JpZ2luYWxQYXJlbnQgJiYgb3JpZ2luYWxQYXJlbnQua2luZCA9PT0gdHMuU3ludGF4S2luZC5WYXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAvLyBBcyB0aGUgdmFsdWUgcmVwcmVzZW50cyB0aGUgd2hvbGUgaW5pdGlhbGl6ZXIgb2YgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbixcbiAgICAgICAgICAgIC8vIGp1c3QgcmVmZXIgdG8gdGhhdCB2YXJpYWJsZS4gVGhpcyBlLmcuIGhlbHBzIHRvIHByZXNlcnZlIGNsb3N1cmUgY29tbWVudHNcbiAgICAgICAgICAgIC8vIGF0IHRoZSByaWdodCBwbGFjZS5cbiAgICAgICAgICAgIGNvbnN0IHZhclBhcmVudCA9IG9yaWdpbmFsUGFyZW50IGFzIHRzLlZhcmlhYmxlRGVjbGFyYXRpb247XG4gICAgICAgICAgICBpZiAodmFyUGFyZW50Lm5hbWUua2luZCA9PT0gdHMuU3ludGF4S2luZC5JZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhck5hbWUgPSB2YXJQYXJlbnQubmFtZS50ZXh0O1xuICAgICAgICAgICAgICBjb25zdCBleHBvcnROYW1lID0gbm9kZVJlcXVlc3QubmFtZTtcbiAgICAgICAgICAgICAgZGVjbGFyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6IGV4cG9ydE5hbWUsXG4gICAgICAgICAgICAgICAgbm9kZTogdHMuY3JlYXRlSWRlbnRpZmllcih2YXJOYW1lKSxcbiAgICAgICAgICAgICAgICBvcmRlcjogRGVjbGFyYXRpb25PcmRlci5BZnRlclN0bXRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBSZWNvcmQgdGhhdCB0aGUgbm9kZSBuZWVkcyB0byBiZSBtb3ZlZCB0byBhbiBleHBvcnRlZCB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lXG4gICAgICAgICAgY29uc3QgZXhwb3J0TmFtZSA9IG5vZGVSZXF1ZXN0Lm5hbWU7XG4gICAgICAgICAgZGVjbGFyYXRpb25zLnB1c2goe25hbWU6IGV4cG9ydE5hbWUsIG5vZGUsIG9yZGVyOiBEZWNsYXJhdGlvbk9yZGVyLkJlZm9yZVN0bXR9KTtcbiAgICAgICAgICByZXR1cm4gdHMuY3JlYXRlSWRlbnRpZmllcihleHBvcnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gbm9kZTtcbiAgICAgICAgaWYgKHNob3VsZFZpc2l0KHBvcywgZW5kKSAmJiAhaXNMZXhpY2FsU2NvcGUobm9kZSkpIHtcbiAgICAgICAgICByZXN1bHQgPSB0cy52aXNpdEVhY2hDaGlsZChub2RlLCB2aXNpdE5vZGUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB0aGUgb3JpZ2luYWwgbm9kZSBiZWZvcmUgdHNpY2tsZVxuICAgICAgY29uc3Qge3BvcywgZW5kfSA9IHRzLmdldE9yaWdpbmFsTm9kZShub2RlKTtcbiAgICAgIGxldCByZXN1bHRTdG10OiB0cy5TdGF0ZW1lbnQ7XG4gICAgICBpZiAoc2hvdWxkVmlzaXQocG9zLCBlbmQpKSB7XG4gICAgICAgIHJlc3VsdFN0bXQgPSB0cy52aXNpdEVhY2hDaGlsZChub2RlLCB2aXNpdE5vZGUsIGNvbnRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0U3RtdCA9IG5vZGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGluc2VydHMucHVzaCh7cmVsYXRpdmVUbzogcmVzdWx0U3RtdCwgZGVjbGFyYXRpb25zfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0U3RtdDtcbiAgICB9XG5cbiAgICBsZXQgbmV3U3RhdGVtZW50cyA9IHNvdXJjZUZpbGUuc3RhdGVtZW50cy5tYXAodG9wTGV2ZWxTdGF0ZW1lbnQpO1xuXG4gICAgaWYgKGluc2VydHMubGVuZ3RoKSB7XG4gICAgICAvLyBJbnNlcnQgdGhlIGRlY2xhcmF0aW9ucyByZWxhdGl2ZSB0byB0aGUgcmV3cml0dGVuIHN0YXRlbWVudCB0aGF0IHJlZmVyZW5jZXMgdGhlbS5cbiAgICAgIGNvbnN0IGluc2VydE1hcCA9IHRvTWFwKGluc2VydHMsIGkgPT4gaS5yZWxhdGl2ZVRvKTtcbiAgICAgIGNvbnN0IHRtcFN0YXRlbWVudHM6IHRzLlN0YXRlbWVudFtdID0gW107XG4gICAgICBuZXdTdGF0ZW1lbnRzLmZvckVhY2goc3RhdGVtZW50ID0+IHtcbiAgICAgICAgY29uc3QgaW5zZXJ0ID0gaW5zZXJ0TWFwLmdldChzdGF0ZW1lbnQpO1xuICAgICAgICBpZiAoaW5zZXJ0KSB7XG4gICAgICAgICAgY29uc3QgYmVmb3JlID0gaW5zZXJ0LmRlY2xhcmF0aW9ucy5maWx0ZXIoZCA9PiBkLm9yZGVyID09PSBEZWNsYXJhdGlvbk9yZGVyLkJlZm9yZVN0bXQpO1xuICAgICAgICAgIGlmIChiZWZvcmUubGVuZ3RoKSB7XG4gICAgICAgICAgICB0bXBTdGF0ZW1lbnRzLnB1c2goY3JlYXRlVmFyaWFibGVTdGF0ZW1lbnRGb3JEZWNsYXJhdGlvbnMoYmVmb3JlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRtcFN0YXRlbWVudHMucHVzaChzdGF0ZW1lbnQpO1xuICAgICAgICAgIGNvbnN0IGFmdGVyID0gaW5zZXJ0LmRlY2xhcmF0aW9ucy5maWx0ZXIoZCA9PiBkLm9yZGVyID09PSBEZWNsYXJhdGlvbk9yZGVyLkFmdGVyU3RtdCk7XG4gICAgICAgICAgaWYgKGFmdGVyLmxlbmd0aCkge1xuICAgICAgICAgICAgdG1wU3RhdGVtZW50cy5wdXNoKGNyZWF0ZVZhcmlhYmxlU3RhdGVtZW50Rm9yRGVjbGFyYXRpb25zKGFmdGVyKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRtcFN0YXRlbWVudHMucHVzaChzdGF0ZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gSW5zZXJ0IGFuIGV4cG9ydHMgY2xhdXNlIHRvIGV4cG9ydCB0aGUgZGVjbGFyYXRpb25zXG4gICAgICB0bXBTdGF0ZW1lbnRzLnB1c2godHMuY3JlYXRlRXhwb3J0RGVjbGFyYXRpb24oXG4gICAgICAgICAgLyogZGVjb3JhdG9ycyAqLyB1bmRlZmluZWQsXG4gICAgICAgICAgLyogbW9kaWZpZXJzICovIHVuZGVmaW5lZCxcbiAgICAgICAgICB0cy5jcmVhdGVOYW1lZEV4cG9ydHMoXG4gICAgICAgICAgICAgIGluc2VydHNcbiAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAgICAgKGFjY3VtdWxhdG9yLCBpbnNlcnQpID0+IFsuLi5hY2N1bXVsYXRvciwgLi4uaW5zZXJ0LmRlY2xhcmF0aW9uc10sXG4gICAgICAgICAgICAgICAgICAgICAgW10gYXMgRGVjbGFyYXRpb25bXSlcbiAgICAgICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb24gPT4gdHMuY3JlYXRlRXhwb3J0U3BlY2lmaWVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9wZXJ0eU5hbWUgKi8gdW5kZWZpbmVkLCBkZWNsYXJhdGlvbi5uYW1lKSkpKSk7XG5cbiAgICAgIG5ld1N0YXRlbWVudHMgPSB0bXBTdGF0ZW1lbnRzO1xuICAgIH1cbiAgICAvLyBOb3RlOiBXZSBjYW5ub3QgdXNlIHRzLnVwZGF0ZVNvdXJjZWZpbGUgaGVyZSBhc1xuICAgIC8vIGl0IGRvZXMgbm90IHdvcmsgd2VsbCB3aXRoIGRlY29yYXRvcnMuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTczODRcbiAgICBjb25zdCBuZXdTZiA9IHRzLmdldE11dGFibGVDbG9uZShzb3VyY2VGaWxlKTtcbiAgICBpZiAoIShzb3VyY2VGaWxlLmZsYWdzICYgdHMuTm9kZUZsYWdzLlN5bnRoZXNpemVkKSkge1xuICAgICAgbmV3U2YuZmxhZ3MgJj0gfnRzLk5vZGVGbGFncy5TeW50aGVzaXplZDtcbiAgICB9XG4gICAgbmV3U2Yuc3RhdGVtZW50cyA9IHRzLnNldFRleHRSYW5nZSh0cy5jcmVhdGVOb2RlQXJyYXkobmV3U3RhdGVtZW50cyksIHNvdXJjZUZpbGUuc3RhdGVtZW50cyk7XG4gICAgcmV0dXJuIG5ld1NmO1xuICB9XG5cbiAgcmV0dXJuIHZpc2l0U291cmNlRmlsZShzb3VyY2VGaWxlKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVmFyaWFibGVTdGF0ZW1lbnRGb3JEZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zOiBEZWNsYXJhdGlvbltdKTogdHMuVmFyaWFibGVTdGF0ZW1lbnQge1xuICBjb25zdCB2YXJEZWNscyA9IGRlY2xhcmF0aW9ucy5tYXAoXG4gICAgICBpID0+IHRzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb24oaS5uYW1lLCAvKiB0eXBlICovIHVuZGVmaW5lZCwgaS5ub2RlIGFzIHRzLkV4cHJlc3Npb24pKTtcbiAgcmV0dXJuIHRzLmNyZWF0ZVZhcmlhYmxlU3RhdGVtZW50KFxuICAgICAgLyogbW9kaWZpZXJzICovIHVuZGVmaW5lZCwgdHMuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QodmFyRGVjbHMsIHRzLk5vZGVGbGFncy5Db25zdCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvbkxvd2VyaW5nVHJhbnNmb3JtRmFjdG9yeShcbiAgICByZXF1ZXN0c01hcDogUmVxdWVzdHNNYXAsIHByb2dyYW06IHRzLlByb2dyYW0pOiAoY29udGV4dDogdHMuVHJhbnNmb3JtYXRpb25Db250ZXh0KSA9PlxuICAgIChzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKSA9PiB0cy5Tb3VyY2VGaWxlIHtcbiAgLy8gUmV0dXJuIHRoZSBmYWN0b3J5XG4gIHJldHVybiAoY29udGV4dDogdHMuVHJhbnNmb3JtYXRpb25Db250ZXh0KSA9PiAoc291cmNlRmlsZTogdHMuU291cmNlRmlsZSk6IHRzLlNvdXJjZUZpbGUgPT4ge1xuICAgIC8vIFdlIG5lZWQgdG8gdXNlIHRoZSBvcmlnaW5hbCBTb3VyY2VGaWxlIGZvciByZWFkaW5nIG1ldGFkYXRhLCBhbmQgbm90IHRoZSB0cmFuc2Zvcm1lZCBvbmUuXG4gICAgY29uc3Qgb3JpZ2luYWxGaWxlID0gcHJvZ3JhbS5nZXRTb3VyY2VGaWxlKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICAgIGlmIChvcmlnaW5hbEZpbGUpIHtcbiAgICAgIGNvbnN0IHJlcXVlc3RzID0gcmVxdWVzdHNNYXAuZ2V0UmVxdWVzdHMob3JpZ2luYWxGaWxlKTtcbiAgICAgIGlmIChyZXF1ZXN0cyAmJiByZXF1ZXN0cy5zaXplKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1Tb3VyY2VGaWxlKHNvdXJjZUZpbGUsIHJlcXVlc3RzLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZUZpbGU7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdHNNYXAgeyBnZXRSZXF1ZXN0cyhzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKTogUmVxdWVzdExvY2F0aW9uTWFwOyB9XG5cbmludGVyZmFjZSBNZXRhZGF0YUFuZExvd2VyaW5nUmVxdWVzdHMge1xuICBtZXRhZGF0YTogTW9kdWxlTWV0YWRhdGF8dW5kZWZpbmVkO1xuICByZXF1ZXN0czogUmVxdWVzdExvY2F0aW9uTWFwO1xufVxuXG5mdW5jdGlvbiBpc0VsaWdpYmxlRm9yTG93ZXJpbmcobm9kZTogdHMuTm9kZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAobm9kZSkge1xuICAgIHN3aXRjaCAobm9kZS5raW5kKSB7XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuU291cmNlRmlsZTpcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5EZWNvcmF0b3I6XG4gICAgICAgIC8vIExvd2VyIGV4cHJlc3Npb25zIHRoYXQgYXJlIGxvY2FsIHRvIHRoZSBtb2R1bGUgc2NvcGUgb3JcbiAgICAgICAgLy8gaW4gYSBkZWNvcmF0b3IuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkNsYXNzRGVjbGFyYXRpb246XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuSW50ZXJmYWNlRGVjbGFyYXRpb246XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuRW51bURlY2xhcmF0aW9uOlxuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkZ1bmN0aW9uRGVjbGFyYXRpb246XG4gICAgICAgIC8vIERvbid0IGxvd2VyIGV4cHJlc3Npb25zIGluIGEgZGVjbGFyYXRpb24uXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5WYXJpYWJsZURlY2xhcmF0aW9uOlxuICAgICAgICAvLyBBdm9pZCBsb3dlcmluZyBleHByZXNzaW9ucyBhbHJlYWR5IGluIGFuIGV4cG9ydGVkIHZhcmlhYmxlIGRlY2xhcmF0aW9uXG4gICAgICAgIHJldHVybiAodHMuZ2V0Q29tYmluZWRNb2RpZmllckZsYWdzKG5vZGUgYXMgdHMuVmFyaWFibGVEZWNsYXJhdGlvbikgJlxuICAgICAgICAgICAgICAgIHRzLk1vZGlmaWVyRmxhZ3MuRXhwb3J0KSA9PSAwO1xuICAgIH1cbiAgICByZXR1cm4gaXNFbGlnaWJsZUZvckxvd2VyaW5nKG5vZGUucGFyZW50KTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNQcmltaXRpdmUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0KHZhbHVlKSAhPT0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzUmV3cml0dGVuKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzTWV0YWRhdGFHbG9iYWxSZWZlcmVuY2VFeHByZXNzaW9uKHZhbHVlKSAmJiBpc0xvd2VyZWRTeW1ib2wodmFsdWUubmFtZSk7XG59XG5cbmZ1bmN0aW9uIGlzTGl0ZXJhbEZpZWxkTmFtZWQobm9kZTogdHMuTm9kZSwgbmFtZXM6IFNldDxzdHJpbmc+KTogYm9vbGVhbiB7XG4gIGlmIChub2RlLnBhcmVudCAmJiBub2RlLnBhcmVudC5raW5kID09IHRzLlN5bnRheEtpbmQuUHJvcGVydHlBc3NpZ25tZW50KSB7XG4gICAgY29uc3QgcHJvcGVydHkgPSBub2RlLnBhcmVudCBhcyB0cy5Qcm9wZXJ0eUFzc2lnbm1lbnQ7XG4gICAgaWYgKHByb3BlcnR5LnBhcmVudCAmJiBwcm9wZXJ0eS5wYXJlbnQua2luZCA9PSB0cy5TeW50YXhLaW5kLk9iamVjdExpdGVyYWxFeHByZXNzaW9uICYmXG4gICAgICAgIHByb3BlcnR5Lm5hbWUgJiYgcHJvcGVydHkubmFtZS5raW5kID09IHRzLlN5bnRheEtpbmQuSWRlbnRpZmllcikge1xuICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gcHJvcGVydHkubmFtZSBhcyB0cy5JZGVudGlmaWVyO1xuICAgICAgcmV0dXJuIG5hbWVzLmhhcyhwcm9wZXJ0eU5hbWUudGV4dCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNsYXNzIExvd2VyTWV0YWRhdGFUcmFuc2Zvcm0gaW1wbGVtZW50cyBSZXF1ZXN0c01hcCwgTWV0YWRhdGFUcmFuc2Zvcm1lciB7XG4gIC8vIFRPRE8oaXNzdWUvMjQ1NzEpOiByZW1vdmUgJyEnLlxuICBwcml2YXRlIGNhY2hlICE6IE1ldGFkYXRhQ2FjaGU7XG4gIHByaXZhdGUgcmVxdWVzdHMgPSBuZXcgTWFwPHN0cmluZywgUmVxdWVzdExvY2F0aW9uTWFwPigpO1xuICBwcml2YXRlIGxvd2VyYWJsZUZpZWxkTmFtZXM6IFNldDxzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKGxvd2VyYWJsZUZpZWxkTmFtZXM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5sb3dlcmFibGVGaWVsZE5hbWVzID0gbmV3IFNldDxzdHJpbmc+KGxvd2VyYWJsZUZpZWxkTmFtZXMpO1xuICB9XG5cbiAgLy8gUmVxdWVzdE1hcFxuICBnZXRSZXF1ZXN0cyhzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKTogUmVxdWVzdExvY2F0aW9uTWFwIHtcbiAgICBsZXQgcmVzdWx0ID0gdGhpcy5yZXF1ZXN0cy5nZXQoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIC8vIEZvcmNlIHRoZSBtZXRhZGF0YSBmb3IgdGhpcyBzb3VyY2UgZmlsZSB0byBiZSBjb2xsZWN0ZWQgd2hpY2hcbiAgICAgIC8vIHdpbGwgcmVjdXJzaXZlbHkgY2FsbCBzdGFydCgpIHBvcHVsYXRpbmcgdGhlIHJlcXVlc3QgbWFwO1xuICAgICAgdGhpcy5jYWNoZS5nZXRNZXRhZGF0YShzb3VyY2VGaWxlKTtcblxuICAgICAgLy8gSWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSB0aGUgcmVxdWVzdGVkIG1ldGFkYXRhLCB0aGUgZmlsZSBpcyBub3QgYSBtb2R1bGVcbiAgICAgIC8vIG9yIGlzIGEgZGVjbGFyYXRpb24gZmlsZSBzbyByZXR1cm4gYW4gZW1wdHkgbWFwLlxuICAgICAgcmVzdWx0ID0gdGhpcy5yZXF1ZXN0cy5nZXQoc291cmNlRmlsZS5maWxlTmFtZSkgfHwgbmV3IE1hcDxudW1iZXIsIExvd2VyaW5nUmVxdWVzdD4oKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIE1ldGFkYXRhVHJhbnNmb3JtZXJcbiAgY29ubmVjdChjYWNoZTogTWV0YWRhdGFDYWNoZSk6IHZvaWQgeyB0aGlzLmNhY2hlID0gY2FjaGU7IH1cblxuICBzdGFydChzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKTogVmFsdWVUcmFuc2Zvcm18dW5kZWZpbmVkIHtcbiAgICBsZXQgaWRlbnROdW1iZXIgPSAwO1xuICAgIGNvbnN0IGZyZXNoSWRlbnQgPSAoKSA9PiBjcmVhdGVMb3dlcmVkU3ltYm9sKGlkZW50TnVtYmVyKyspO1xuICAgIGNvbnN0IHJlcXVlc3RzID0gbmV3IE1hcDxudW1iZXIsIExvd2VyaW5nUmVxdWVzdD4oKTtcbiAgICB0aGlzLnJlcXVlc3RzLnNldChzb3VyY2VGaWxlLmZpbGVOYW1lLCByZXF1ZXN0cyk7XG5cbiAgICBjb25zdCByZXBsYWNlTm9kZSA9IChub2RlOiB0cy5Ob2RlKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gZnJlc2hJZGVudCgpO1xuICAgICAgcmVxdWVzdHMuc2V0KG5vZGUucG9zLCB7bmFtZSwga2luZDogbm9kZS5raW5kLCBsb2NhdGlvbjogbm9kZS5wb3MsIGVuZDogbm9kZS5lbmR9KTtcbiAgICAgIHJldHVybiB7X19zeW1ib2xpYzogJ3JlZmVyZW5jZScsIG5hbWV9O1xuICAgIH07XG5cbiAgICBjb25zdCBpc0V4cG9ydGVkU3ltYm9sID0gKCgpID0+IHtcbiAgICAgIGxldCBleHBvcnRUYWJsZTogU2V0PHN0cmluZz47XG4gICAgICByZXR1cm4gKG5vZGU6IHRzLk5vZGUpID0+IHtcbiAgICAgICAgaWYgKG5vZGUua2luZCA9PSB0cy5TeW50YXhLaW5kLklkZW50aWZpZXIpIHtcbiAgICAgICAgICBjb25zdCBpZGVudCA9IG5vZGUgYXMgdHMuSWRlbnRpZmllcjtcblxuICAgICAgICAgIGlmICghZXhwb3J0VGFibGUpIHtcbiAgICAgICAgICAgIGV4cG9ydFRhYmxlID0gY3JlYXRlRXhwb3J0VGFibGVGb3Ioc291cmNlRmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBleHBvcnRUYWJsZS5oYXMoaWRlbnQudGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfTtcbiAgICB9KSgpO1xuXG4gICAgY29uc3QgaXNFeHBvcnRlZFByb3BlcnR5QWNjZXNzID0gKG5vZGU6IHRzLk5vZGUpID0+IHtcbiAgICAgIGlmIChub2RlLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKSB7XG4gICAgICAgIGNvbnN0IHBhZSA9IG5vZGUgYXMgdHMuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uO1xuICAgICAgICBpZiAoaXNFeHBvcnRlZFN5bWJvbChwYWUuZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICBjb25zdCBoYXNMb3dlcmFibGVQYXJlbnRDYWNoZSA9IG5ldyBNYXA8dHMuTm9kZSwgYm9vbGVhbj4oKTtcblxuICAgIGNvbnN0IHNob3VsZEJlTG93ZXJlZCA9IChub2RlOiB0cy5Ob2RlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PiB7XG4gICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGxldCBsb3dlcmFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgIGlmICgobm9kZS5raW5kID09PSB0cy5TeW50YXhLaW5kLkFycm93RnVuY3Rpb24gfHxcbiAgICAgICAgICAgbm9kZS5raW5kID09PSB0cy5TeW50YXhLaW5kLkZ1bmN0aW9uRXhwcmVzc2lvbikgJiZcbiAgICAgICAgICBpc0VsaWdpYmxlRm9yTG93ZXJpbmcobm9kZSkpIHtcbiAgICAgICAgbG93ZXJhYmxlID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgaXNMaXRlcmFsRmllbGROYW1lZChub2RlLCB0aGlzLmxvd2VyYWJsZUZpZWxkTmFtZXMpICYmIGlzRWxpZ2libGVGb3JMb3dlcmluZyhub2RlKSAmJlxuICAgICAgICAgICFpc0V4cG9ydGVkU3ltYm9sKG5vZGUpICYmICFpc0V4cG9ydGVkUHJvcGVydHlBY2Nlc3Mobm9kZSkpIHtcbiAgICAgICAgbG93ZXJhYmxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsb3dlcmFibGU7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhc0xvd2VyYWJsZVBhcmVudCA9IChub2RlOiB0cy5Ob2RlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PiB7XG4gICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghaGFzTG93ZXJhYmxlUGFyZW50Q2FjaGUuaGFzKG5vZGUpKSB7XG4gICAgICAgIGhhc0xvd2VyYWJsZVBhcmVudENhY2hlLnNldChcbiAgICAgICAgICAgIG5vZGUsIHNob3VsZEJlTG93ZXJlZChub2RlLnBhcmVudCkgfHwgaGFzTG93ZXJhYmxlUGFyZW50KG5vZGUucGFyZW50KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzTG93ZXJhYmxlUGFyZW50Q2FjaGUuZ2V0KG5vZGUpICE7XG4gICAgfTtcblxuICAgIGNvbnN0IGlzTG93ZXJhYmxlID0gKG5vZGU6IHRzLk5vZGUgfCB1bmRlZmluZWQpOiBib29sZWFuID0+IHtcbiAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNob3VsZEJlTG93ZXJlZChub2RlKSAmJiAhaGFzTG93ZXJhYmxlUGFyZW50KG5vZGUpO1xuICAgIH07XG5cbiAgICByZXR1cm4gKHZhbHVlOiBNZXRhZGF0YVZhbHVlLCBub2RlOiB0cy5Ob2RlKTogTWV0YWRhdGFWYWx1ZSA9PiB7XG4gICAgICBpZiAoIWlzUHJpbWl0aXZlKHZhbHVlKSAmJiAhaXNSZXdyaXR0ZW4odmFsdWUpICYmIGlzTG93ZXJhYmxlKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiByZXBsYWNlTm9kZShub2RlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUV4cG9ydFRhYmxlRm9yKHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpOiBTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IGV4cG9ydFRhYmxlID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIExhemlseSBjb2xsZWN0IGFsbCB0aGUgZXhwb3J0cyBmcm9tIHRoZSBzb3VyY2UgZmlsZVxuICB0cy5mb3JFYWNoQ2hpbGQoc291cmNlRmlsZSwgZnVuY3Rpb24gc2Nhbihub2RlKSB7XG4gICAgc3dpdGNoIChub2RlLmtpbmQpIHtcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5DbGFzc0RlY2xhcmF0aW9uOlxuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkZ1bmN0aW9uRGVjbGFyYXRpb246XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuSW50ZXJmYWNlRGVjbGFyYXRpb246XG4gICAgICAgIGlmICgodHMuZ2V0Q29tYmluZWRNb2RpZmllckZsYWdzKG5vZGUgYXMgdHMuRGVjbGFyYXRpb24pICYgdHMuTW9kaWZpZXJGbGFncy5FeHBvcnQpICE9IDApIHtcbiAgICAgICAgICBjb25zdCBjbGFzc0RlY2xhcmF0aW9uID1cbiAgICAgICAgICAgICAgbm9kZSBhcyh0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuRnVuY3Rpb25EZWNsYXJhdGlvbiB8IHRzLkludGVyZmFjZURlY2xhcmF0aW9uKTtcbiAgICAgICAgICBjb25zdCBuYW1lID0gY2xhc3NEZWNsYXJhdGlvbi5uYW1lO1xuICAgICAgICAgIGlmIChuYW1lKSBleHBvcnRUYWJsZS5hZGQobmFtZS50ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5WYXJpYWJsZVN0YXRlbWVudDpcbiAgICAgICAgY29uc3QgdmFyaWFibGVTdGF0ZW1lbnQgPSBub2RlIGFzIHRzLlZhcmlhYmxlU3RhdGVtZW50O1xuICAgICAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHZhcmlhYmxlU3RhdGVtZW50LmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICBzY2FuKGRlY2xhcmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5WYXJpYWJsZURlY2xhcmF0aW9uOlxuICAgICAgICBjb25zdCB2YXJpYWJsZURlY2xhcmF0aW9uID0gbm9kZSBhcyB0cy5WYXJpYWJsZURlY2xhcmF0aW9uO1xuICAgICAgICBpZiAoKHRzLmdldENvbWJpbmVkTW9kaWZpZXJGbGFncyh2YXJpYWJsZURlY2xhcmF0aW9uKSAmIHRzLk1vZGlmaWVyRmxhZ3MuRXhwb3J0KSAhPSAwICYmXG4gICAgICAgICAgICB2YXJpYWJsZURlY2xhcmF0aW9uLm5hbWUua2luZCA9PSB0cy5TeW50YXhLaW5kLklkZW50aWZpZXIpIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gdmFyaWFibGVEZWNsYXJhdGlvbi5uYW1lIGFzIHRzLklkZW50aWZpZXI7XG4gICAgICAgICAgZXhwb3J0VGFibGUuYWRkKG5hbWUudGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuRXhwb3J0RGVjbGFyYXRpb246XG4gICAgICAgIGNvbnN0IGV4cG9ydERlY2xhcmF0aW9uID0gbm9kZSBhcyB0cy5FeHBvcnREZWNsYXJhdGlvbjtcbiAgICAgICAgY29uc3Qge21vZHVsZVNwZWNpZmllciwgZXhwb3J0Q2xhdXNlfSA9IGV4cG9ydERlY2xhcmF0aW9uO1xuICAgICAgICBpZiAoIW1vZHVsZVNwZWNpZmllciAmJiBleHBvcnRDbGF1c2UpIHtcbiAgICAgICAgICBleHBvcnRDbGF1c2UuZWxlbWVudHMuZm9yRWFjaChzcGVjID0+IHsgZXhwb3J0VGFibGUuYWRkKHNwZWMubmFtZS50ZXh0KTsgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZXhwb3J0VGFibGU7XG59XG4iXX0=
|
|
339
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG93ZXJfZXhwcmVzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci1jbGkvc3JjL3RyYW5zZm9ybWVycy9sb3dlcl9leHByZXNzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILGdEQUF1RTtJQUN2RSxpQ0FBaUM7SUFFakMsb0VBQTBJO0lBeUIxSSxTQUFTLEtBQUssQ0FBTyxLQUFVLEVBQUUsTUFBc0I7UUFDckQsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxvRkFBb0Y7SUFDcEYsb0ZBQW9GO0lBQ3BGLDZCQUE2QjtJQUM3QixTQUFTLGNBQWMsQ0FBQyxJQUFhO1FBQ25DLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNqQixLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1lBQ2pDLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQztZQUN0QyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUM7WUFDdkMsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztZQUNuQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUM7WUFDcEMsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztZQUNoQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO1lBQy9CLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTO2dCQUMxQixPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsU0FB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QUFtQixHQUFHLElBQThCLENBQUM7b0JBQzNELElBQUksQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsbUJBQW1CLENBQUMsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7d0JBQ2pGLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUU7d0JBQzdELE1BQU0sSUFBSSxHQUFHLG1CQUFtQixDQUFDLElBQXFCLENBQUM7d0JBQ3ZELFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUM1QjtvQkFDRCxNQUFNO2dCQUNSLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUI7b0JBQ2xDLE1BQU0saUJBQWlCLEdBQUcsSUFBNEIsQ0FBQztvQkFDdkQsTUFBTSxFQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUMsR0FBRyxpQkFBaUIsQ0FBQztvQkFDMUQsSUFBSSxDQUFDLGVBQWUsSUFBSSxZQUFZLEVBQUU7d0JBQ3BDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQzdFO2FBQ0o7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7Y3JlYXRlTG93ZXJlZFN5bWJvbCwgaXNMb3dlcmVkU3ltYm9sfSBmcm9tICdAYW5ndWxhci9jb21waWxlcic7XG5pbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHtDb2xsZWN0b3JPcHRpb25zLCBNZXRhZGF0YUNvbGxlY3RvciwgTWV0YWRhdGFWYWx1ZSwgTW9kdWxlTWV0YWRhdGEsIGlzTWV0YWRhdGFHbG9iYWxSZWZlcmVuY2VFeHByZXNzaW9ufSBmcm9tICcuLi9tZXRhZGF0YS9pbmRleCc7XG5pbXBvcnQge01ldGFkYXRhQ2FjaGUsIE1ldGFkYXRhVHJhbnNmb3JtZXIsIFZhbHVlVHJhbnNmb3JtfSBmcm9tICcuL21ldGFkYXRhX2NhY2hlJztcblxuZXhwb3J0IGludGVyZmFjZSBMb3dlcmluZ1JlcXVlc3Qge1xuICBraW5kOiB0cy5TeW50YXhLaW5kO1xuICBsb2NhdGlvbjogbnVtYmVyO1xuICBlbmQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBSZXF1ZXN0TG9jYXRpb25NYXAgPSBNYXA8bnVtYmVyLCBMb3dlcmluZ1JlcXVlc3Q+O1xuXG5jb25zdCBlbnVtIERlY2xhcmF0aW9uT3JkZXIgeyBCZWZvcmVTdG10LCBBZnRlclN0bXQgfVxuXG5pbnRlcmZhY2UgRGVjbGFyYXRpb24ge1xuICBuYW1lOiBzdHJpbmc7XG4gIG5vZGU6IHRzLk5vZGU7XG4gIG9yZGVyOiBEZWNsYXJhdGlvbk9yZGVyO1xufVxuXG5pbnRlcmZhY2UgRGVjbGFyYXRpb25JbnNlcnQge1xuICBkZWNsYXJhdGlvbnM6IERlY2xhcmF0aW9uW107XG4gIHJlbGF0aXZlVG86IHRzLk5vZGU7XG59XG5cbmZ1bmN0aW9uIHRvTWFwPFQsIEs+KGl0ZW1zOiBUW10sIHNlbGVjdDogKGl0ZW06IFQpID0+IEspOiBNYXA8SywgVD4ge1xuICByZXR1cm4gbmV3IE1hcChpdGVtcy5tYXA8W0ssIFRdPihpID0+IFtzZWxlY3QoaSksIGldKSk7XG59XG5cbi8vIFdlIHdpbGwgbmV2ZXIgbG93ZXIgZXhwcmVzc2lvbnMgaW4gYSBuZXN0ZWQgbGV4aWNhbCBzY29wZSBzbyBhdm9pZCBlbnRlcmluZyB0aGVtLlxuLy8gVGhpcyBhbHNvIGF2b2lkcyBhIGJ1ZyBpbiBUeXBlU2NyaXB0IDIuMyB3aGVyZSB0aGUgbGV4aWNhbCBzY29wZXMgZ2V0IG91dCBvZiBzeW5jXG4vLyB3aGVuIHVzaW5nIHZpc2l0RWFjaENoaWxkLlxuZnVuY3Rpb24gaXNMZXhpY2FsU2NvcGUobm9kZTogdHMuTm9kZSk6IGJvb2xlYW4ge1xuICBzd2l0Y2ggKG5vZGUua2luZCkge1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5BcnJvd0Z1bmN0aW9uOlxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5GdW5jdGlvbkV4cHJlc3Npb246XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkZ1bmN0aW9uRGVjbGFyYXRpb246XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkNsYXNzRXhwcmVzc2lvbjpcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuQ2xhc3NEZWNsYXJhdGlvbjpcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuRnVuY3Rpb25UeXBlOlxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5UeXBlTGl0ZXJhbDpcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuQXJyYXlUeXBlOlxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Tb3VyY2VGaWxlKFxuICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsIHJlcXVlc3RzOiBSZXF1ZXN0TG9jYXRpb25NYXAsXG4gICAgY29udGV4dDogdHMuVHJhbnNmb3JtYXRpb25Db250ZXh0KTogdHMuU291cmNlRmlsZSB7XG4gIGNvbnN0IGluc2VydHM6IERlY2xhcmF0aW9uSW5zZXJ0W10gPSBbXTtcblxuICAvLyBDYWxjdWxhdGUgdGhlIHJhbmdlIG9mIGludGVyZXN0aW5nIGxvY2F0aW9ucy4gVGhlIHRyYW5zZm9ybSB3aWxsIG9ubHkgdmlzaXQgbm9kZXMgaW4gdGhpc1xuICAvLyByYW5nZSB0byBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvbiBsYXJnZSBmaWxlcy5cbiAgY29uc3QgbG9jYXRpb25zID0gQXJyYXkuZnJvbShyZXF1ZXN0cy5rZXlzKCkpO1xuICBjb25zdCBtaW4gPSBNYXRoLm1pbiguLi5sb2NhdGlvbnMpO1xuICBjb25zdCBtYXggPSBNYXRoLm1heCguLi5sb2NhdGlvbnMpO1xuXG4gIC8vIFZpc2l0IG5vZGVzIG1hdGNoaW5nIHRoZSByZXF1ZXN0IGFuZCBzeW50aGV0aWMgbm9kZXMgYWRkZWQgYnkgdHNpY2tsZVxuICBmdW5jdGlvbiBzaG91bGRWaXNpdChwb3M6IG51bWJlciwgZW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHBvcyA8PSBtYXggJiYgZW5kID49IG1pbikgfHwgcG9zID09IC0xO1xuICB9XG5cbiAgZnVuY3Rpb24gdmlzaXRTb3VyY2VGaWxlKHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpOiB0cy5Tb3VyY2VGaWxlIHtcbiAgICBmdW5jdGlvbiB0b3BMZXZlbFN0YXRlbWVudChub2RlOiB0cy5TdGF0ZW1lbnQpOiB0cy5TdGF0ZW1lbnQge1xuICAgICAgY29uc3QgZGVjbGFyYXRpb25zOiBEZWNsYXJhdGlvbltdID0gW107XG5cbiAgICAgIGZ1bmN0aW9uIHZpc2l0Tm9kZShub2RlOiB0cy5Ob2RlKTogdHMuTm9kZSB7XG4gICAgICAgIC8vIEdldCB0aGUgb3JpZ2luYWwgbm9kZSBiZWZvcmUgdHNpY2tsZVxuICAgICAgICBjb25zdCB7cG9zLCBlbmQsIGtpbmQsIHBhcmVudDogb3JpZ2luYWxQYXJlbnR9ID0gdHMuZ2V0T3JpZ2luYWxOb2RlKG5vZGUpO1xuICAgICAgICBjb25zdCBub2RlUmVxdWVzdCA9IHJlcXVlc3RzLmdldChwb3MpO1xuICAgICAgICBpZiAobm9kZVJlcXVlc3QgJiYgbm9kZVJlcXVlc3Qua2luZCA9PSBraW5kICYmIG5vZGVSZXF1ZXN0LmVuZCA9PSBlbmQpIHtcbiAgICAgICAgICAvLyBUaGlzIG5vZGUgaXMgcmVxdWVzdGVkIHRvIGJlIHJld3JpdHRlbiBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZXhwb3J0ZWQgbmFtZS5cbiAgICAgICAgICBpZiAob3JpZ2luYWxQYXJlbnQgJiYgb3JpZ2luYWxQYXJlbnQua2luZCA9PT0gdHMuU3ludGF4S2luZC5WYXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAvLyBBcyB0aGUgdmFsdWUgcmVwcmVzZW50cyB0aGUgd2hvbGUgaW5pdGlhbGl6ZXIgb2YgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbixcbiAgICAgICAgICAgIC8vIGp1c3QgcmVmZXIgdG8gdGhhdCB2YXJpYWJsZS4gVGhpcyBlLmcuIGhlbHBzIHRvIHByZXNlcnZlIGNsb3N1cmUgY29tbWVudHNcbiAgICAgICAgICAgIC8vIGF0IHRoZSByaWdodCBwbGFjZS5cbiAgICAgICAgICAgIGNvbnN0IHZhclBhcmVudCA9IG9yaWdpbmFsUGFyZW50IGFzIHRzLlZhcmlhYmxlRGVjbGFyYXRpb247XG4gICAgICAgICAgICBpZiAodmFyUGFyZW50Lm5hbWUua2luZCA9PT0gdHMuU3ludGF4S2luZC5JZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhck5hbWUgPSB2YXJQYXJlbnQubmFtZS50ZXh0O1xuICAgICAgICAgICAgICBjb25zdCBleHBvcnROYW1lID0gbm9kZVJlcXVlc3QubmFtZTtcbiAgICAgICAgICAgICAgZGVjbGFyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6IGV4cG9ydE5hbWUsXG4gICAgICAgICAgICAgICAgbm9kZTogdHMuY3JlYXRlSWRlbnRpZmllcih2YXJOYW1lKSxcbiAgICAgICAgICAgICAgICBvcmRlcjogRGVjbGFyYXRpb25PcmRlci5BZnRlclN0bXRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBSZWNvcmQgdGhhdCB0aGUgbm9kZSBuZWVkcyB0byBiZSBtb3ZlZCB0byBhbiBleHBvcnRlZCB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lXG4gICAgICAgICAgY29uc3QgZXhwb3J0TmFtZSA9IG5vZGVSZXF1ZXN0Lm5hbWU7XG4gICAgICAgICAgZGVjbGFyYXRpb25zLnB1c2goe25hbWU6IGV4cG9ydE5hbWUsIG5vZGUsIG9yZGVyOiBEZWNsYXJhdGlvbk9yZGVyLkJlZm9yZVN0bXR9KTtcbiAgICAgICAgICByZXR1cm4gdHMuY3JlYXRlSWRlbnRpZmllcihleHBvcnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gbm9kZTtcbiAgICAgICAgaWYgKHNob3VsZFZpc2l0KHBvcywgZW5kKSAmJiAhaXNMZXhpY2FsU2NvcGUobm9kZSkpIHtcbiAgICAgICAgICByZXN1bHQgPSB0cy52aXNpdEVhY2hDaGlsZChub2RlLCB2aXNpdE5vZGUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB0aGUgb3JpZ2luYWwgbm9kZSBiZWZvcmUgdHNpY2tsZVxuICAgICAgY29uc3Qge3BvcywgZW5kfSA9IHRzLmdldE9yaWdpbmFsTm9kZShub2RlKTtcbiAgICAgIGxldCByZXN1bHRTdG10OiB0cy5TdGF0ZW1lbnQ7XG4gICAgICBpZiAoc2hvdWxkVmlzaXQocG9zLCBlbmQpKSB7XG4gICAgICAgIHJlc3VsdFN0bXQgPSB0cy52aXNpdEVhY2hDaGlsZChub2RlLCB2aXNpdE5vZGUsIGNvbnRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0U3RtdCA9IG5vZGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGluc2VydHMucHVzaCh7cmVsYXRpdmVUbzogcmVzdWx0U3RtdCwgZGVjbGFyYXRpb25zfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0U3RtdDtcbiAgICB9XG5cbiAgICBsZXQgbmV3U3RhdGVtZW50cyA9IHNvdXJjZUZpbGUuc3RhdGVtZW50cy5tYXAodG9wTGV2ZWxTdGF0ZW1lbnQpO1xuXG4gICAgaWYgKGluc2VydHMubGVuZ3RoKSB7XG4gICAgICAvLyBJbnNlcnQgdGhlIGRlY2xhcmF0aW9ucyByZWxhdGl2ZSB0byB0aGUgcmV3cml0dGVuIHN0YXRlbWVudCB0aGF0IHJlZmVyZW5jZXMgdGhlbS5cbiAgICAgIGNvbnN0IGluc2VydE1hcCA9IHRvTWFwKGluc2VydHMsIGkgPT4gaS5yZWxhdGl2ZVRvKTtcbiAgICAgIGNvbnN0IHRtcFN0YXRlbWVudHM6IHRzLlN0YXRlbWVudFtdID0gW107XG4gICAgICBuZXdTdGF0ZW1lbnRzLmZvckVhY2goc3RhdGVtZW50ID0+IHtcbiAgICAgICAgY29uc3QgaW5zZXJ0ID0gaW5zZXJ0TWFwLmdldChzdGF0ZW1lbnQpO1xuICAgICAgICBpZiAoaW5zZXJ0KSB7XG4gICAgICAgICAgY29uc3QgYmVmb3JlID0gaW5zZXJ0LmRlY2xhcmF0aW9ucy5maWx0ZXIoZCA9PiBkLm9yZGVyID09PSBEZWNsYXJhdGlvbk9yZGVyLkJlZm9yZVN0bXQpO1xuICAgICAgICAgIGlmIChiZWZvcmUubGVuZ3RoKSB7XG4gICAgICAgICAgICB0bXBTdGF0ZW1lbnRzLnB1c2goY3JlYXRlVmFyaWFibGVTdGF0ZW1lbnRGb3JEZWNsYXJhdGlvbnMoYmVmb3JlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRtcFN0YXRlbWVudHMucHVzaChzdGF0ZW1lbnQpO1xuICAgICAgICAgIGNvbnN0IGFmdGVyID0gaW5zZXJ0LmRlY2xhcmF0aW9ucy5maWx0ZXIoZCA9PiBkLm9yZGVyID09PSBEZWNsYXJhdGlvbk9yZGVyLkFmdGVyU3RtdCk7XG4gICAgICAgICAgaWYgKGFmdGVyLmxlbmd0aCkge1xuICAgICAgICAgICAgdG1wU3RhdGVtZW50cy5wdXNoKGNyZWF0ZVZhcmlhYmxlU3RhdGVtZW50Rm9yRGVjbGFyYXRpb25zKGFmdGVyKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRtcFN0YXRlbWVudHMucHVzaChzdGF0ZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gSW5zZXJ0IGFuIGV4cG9ydHMgY2xhdXNlIHRvIGV4cG9ydCB0aGUgZGVjbGFyYXRpb25zXG4gICAgICB0bXBTdGF0ZW1lbnRzLnB1c2godHMuY3JlYXRlRXhwb3J0RGVjbGFyYXRpb24oXG4gICAgICAgICAgLyogZGVjb3JhdG9ycyAqLyB1bmRlZmluZWQsXG4gICAgICAgICAgLyogbW9kaWZpZXJzICovIHVuZGVmaW5lZCxcbiAgICAgICAgICB0cy5jcmVhdGVOYW1lZEV4cG9ydHMoXG4gICAgICAgICAgICAgIGluc2VydHNcbiAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAgICAgKGFjY3VtdWxhdG9yLCBpbnNlcnQpID0+IFsuLi5hY2N1bXVsYXRvciwgLi4uaW5zZXJ0LmRlY2xhcmF0aW9uc10sXG4gICAgICAgICAgICAgICAgICAgICAgW10gYXMgRGVjbGFyYXRpb25bXSlcbiAgICAgICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb24gPT4gdHMuY3JlYXRlRXhwb3J0U3BlY2lmaWVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9wZXJ0eU5hbWUgKi8gdW5kZWZpbmVkLCBkZWNsYXJhdGlvbi5uYW1lKSkpKSk7XG5cbiAgICAgIG5ld1N0YXRlbWVudHMgPSB0bXBTdGF0ZW1lbnRzO1xuICAgIH1cbiAgICAvLyBOb3RlOiBXZSBjYW5ub3QgdXNlIHRzLnVwZGF0ZVNvdXJjZWZpbGUgaGVyZSBhc1xuICAgIC8vIGl0IGRvZXMgbm90IHdvcmsgd2VsbCB3aXRoIGRlY29yYXRvcnMuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTczODRcbiAgICBjb25zdCBuZXdTZiA9IHRzLmdldE11dGFibGVDbG9uZShzb3VyY2VGaWxlKTtcbiAgICBpZiAoIShzb3VyY2VGaWxlLmZsYWdzICYgdHMuTm9kZUZsYWdzLlN5bnRoZXNpemVkKSkge1xuICAgICAgbmV3U2YuZmxhZ3MgJj0gfnRzLk5vZGVGbGFncy5TeW50aGVzaXplZDtcbiAgICB9XG4gICAgbmV3U2Yuc3RhdGVtZW50cyA9IHRzLnNldFRleHRSYW5nZSh0cy5jcmVhdGVOb2RlQXJyYXkobmV3U3RhdGVtZW50cyksIHNvdXJjZUZpbGUuc3RhdGVtZW50cyk7XG4gICAgcmV0dXJuIG5ld1NmO1xuICB9XG5cbiAgcmV0dXJuIHZpc2l0U291cmNlRmlsZShzb3VyY2VGaWxlKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVmFyaWFibGVTdGF0ZW1lbnRGb3JEZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zOiBEZWNsYXJhdGlvbltdKTogdHMuVmFyaWFibGVTdGF0ZW1lbnQge1xuICBjb25zdCB2YXJEZWNscyA9IGRlY2xhcmF0aW9ucy5tYXAoXG4gICAgICBpID0+IHRzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb24oaS5uYW1lLCAvKiB0eXBlICovIHVuZGVmaW5lZCwgaS5ub2RlIGFzIHRzLkV4cHJlc3Npb24pKTtcbiAgcmV0dXJuIHRzLmNyZWF0ZVZhcmlhYmxlU3RhdGVtZW50KFxuICAgICAgLyogbW9kaWZpZXJzICovIHVuZGVmaW5lZCwgdHMuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QodmFyRGVjbHMsIHRzLk5vZGVGbGFncy5Db25zdCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvbkxvd2VyaW5nVHJhbnNmb3JtRmFjdG9yeShcbiAgICByZXF1ZXN0c01hcDogUmVxdWVzdHNNYXAsIHByb2dyYW06IHRzLlByb2dyYW0pOiAoY29udGV4dDogdHMuVHJhbnNmb3JtYXRpb25Db250ZXh0KSA9PlxuICAgIChzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKSA9PiB0cy5Tb3VyY2VGaWxlIHtcbiAgLy8gUmV0dXJuIHRoZSBmYWN0b3J5XG4gIHJldHVybiAoY29udGV4dDogdHMuVHJhbnNmb3JtYXRpb25Db250ZXh0KSA9PiAoc291cmNlRmlsZTogdHMuU291cmNlRmlsZSk6IHRzLlNvdXJjZUZpbGUgPT4ge1xuICAgIC8vIFdlIG5lZWQgdG8gdXNlIHRoZSBvcmlnaW5hbCBTb3VyY2VGaWxlIGZvciByZWFkaW5nIG1ldGFkYXRhLCBhbmQgbm90IHRoZSB0cmFuc2Zvcm1lZCBvbmUuXG4gICAgY29uc3Qgb3JpZ2luYWxGaWxlID0gcHJvZ3JhbS5nZXRTb3VyY2VGaWxlKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICAgIGlmIChvcmlnaW5hbEZpbGUpIHtcbiAgICAgIGNvbnN0IHJlcXVlc3RzID0gcmVxdWVzdHNNYXAuZ2V0UmVxdWVzdHMob3JpZ2luYWxGaWxlKTtcbiAgICAgIGlmIChyZXF1ZXN0cyAmJiByZXF1ZXN0cy5zaXplKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1Tb3VyY2VGaWxlKHNvdXJjZUZpbGUsIHJlcXVlc3RzLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZUZpbGU7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdHNNYXAgeyBnZXRSZXF1ZXN0cyhzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKTogUmVxdWVzdExvY2F0aW9uTWFwOyB9XG5cbmludGVyZmFjZSBNZXRhZGF0YUFuZExvd2VyaW5nUmVxdWVzdHMge1xuICBtZXRhZGF0YTogTW9kdWxlTWV0YWRhdGF8dW5kZWZpbmVkO1xuICByZXF1ZXN0czogUmVxdWVzdExvY2F0aW9uTWFwO1xufVxuXG5mdW5jdGlvbiBpc0VsaWdpYmxlRm9yTG93ZXJpbmcobm9kZTogdHMuTm9kZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAobm9kZSkge1xuICAgIHN3aXRjaCAobm9kZS5raW5kKSB7XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuU291cmNlRmlsZTpcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5EZWNvcmF0b3I6XG4gICAgICAgIC8vIExvd2VyIGV4cHJlc3Npb25zIHRoYXQgYXJlIGxvY2FsIHRvIHRoZSBtb2R1bGUgc2NvcGUgb3JcbiAgICAgICAgLy8gaW4gYSBkZWNvcmF0b3IuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkNsYXNzRGVjbGFyYXRpb246XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuSW50ZXJmYWNlRGVjbGFyYXRpb246XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuRW51bURlY2xhcmF0aW9uOlxuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkZ1bmN0aW9uRGVjbGFyYXRpb246XG4gICAgICAgIC8vIERvbid0IGxvd2VyIGV4cHJlc3Npb25zIGluIGEgZGVjbGFyYXRpb24uXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5WYXJpYWJsZURlY2xhcmF0aW9uOlxuICAgICAgICAvLyBBdm9pZCBsb3dlcmluZyBleHByZXNzaW9ucyBhbHJlYWR5IGluIGFuIGV4cG9ydGVkIHZhcmlhYmxlIGRlY2xhcmF0aW9uXG4gICAgICAgIHJldHVybiAodHMuZ2V0Q29tYmluZWRNb2RpZmllckZsYWdzKG5vZGUgYXMgdHMuVmFyaWFibGVEZWNsYXJhdGlvbikgJlxuICAgICAgICAgICAgICAgIHRzLk1vZGlmaWVyRmxhZ3MuRXhwb3J0KSA9PSAwO1xuICAgIH1cbiAgICByZXR1cm4gaXNFbGlnaWJsZUZvckxvd2VyaW5nKG5vZGUucGFyZW50KTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNQcmltaXRpdmUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0KHZhbHVlKSAhPT0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzUmV3cml0dGVuKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzTWV0YWRhdGFHbG9iYWxSZWZlcmVuY2VFeHByZXNzaW9uKHZhbHVlKSAmJiBpc0xvd2VyZWRTeW1ib2wodmFsdWUubmFtZSk7XG59XG5cbmZ1bmN0aW9uIGlzTGl0ZXJhbEZpZWxkTmFtZWQobm9kZTogdHMuTm9kZSwgbmFtZXM6IFNldDxzdHJpbmc+KTogYm9vbGVhbiB7XG4gIGlmIChub2RlLnBhcmVudCAmJiBub2RlLnBhcmVudC5raW5kID09IHRzLlN5bnRheEtpbmQuUHJvcGVydHlBc3NpZ25tZW50KSB7XG4gICAgY29uc3QgcHJvcGVydHkgPSBub2RlLnBhcmVudCBhcyB0cy5Qcm9wZXJ0eUFzc2lnbm1lbnQ7XG4gICAgaWYgKHByb3BlcnR5LnBhcmVudCAmJiBwcm9wZXJ0eS5wYXJlbnQua2luZCA9PSB0cy5TeW50YXhLaW5kLk9iamVjdExpdGVyYWxFeHByZXNzaW9uICYmXG4gICAgICAgIHByb3BlcnR5Lm5hbWUgJiYgcHJvcGVydHkubmFtZS5raW5kID09IHRzLlN5bnRheEtpbmQuSWRlbnRpZmllcikge1xuICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gcHJvcGVydHkubmFtZSBhcyB0cy5JZGVudGlmaWVyO1xuICAgICAgcmV0dXJuIG5hbWVzLmhhcyhwcm9wZXJ0eU5hbWUudGV4dCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNsYXNzIExvd2VyTWV0YWRhdGFUcmFuc2Zvcm0gaW1wbGVtZW50cyBSZXF1ZXN0c01hcCwgTWV0YWRhdGFUcmFuc2Zvcm1lciB7XG4gIC8vIFRPRE8oaXNzdWUvMjQ1NzEpOiByZW1vdmUgJyEnLlxuICBwcml2YXRlIGNhY2hlICE6IE1ldGFkYXRhQ2FjaGU7XG4gIHByaXZhdGUgcmVxdWVzdHMgPSBuZXcgTWFwPHN0cmluZywgUmVxdWVzdExvY2F0aW9uTWFwPigpO1xuICBwcml2YXRlIGxvd2VyYWJsZUZpZWxkTmFtZXM6IFNldDxzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKGxvd2VyYWJsZUZpZWxkTmFtZXM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5sb3dlcmFibGVGaWVsZE5hbWVzID0gbmV3IFNldDxzdHJpbmc+KGxvd2VyYWJsZUZpZWxkTmFtZXMpO1xuICB9XG5cbiAgLy8gUmVxdWVzdE1hcFxuICBnZXRSZXF1ZXN0cyhzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKTogUmVxdWVzdExvY2F0aW9uTWFwIHtcbiAgICBsZXQgcmVzdWx0ID0gdGhpcy5yZXF1ZXN0cy5nZXQoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIC8vIEZvcmNlIHRoZSBtZXRhZGF0YSBmb3IgdGhpcyBzb3VyY2UgZmlsZSB0byBiZSBjb2xsZWN0ZWQgd2hpY2hcbiAgICAgIC8vIHdpbGwgcmVjdXJzaXZlbHkgY2FsbCBzdGFydCgpIHBvcHVsYXRpbmcgdGhlIHJlcXVlc3QgbWFwO1xuICAgICAgdGhpcy5jYWNoZS5nZXRNZXRhZGF0YShzb3VyY2VGaWxlKTtcblxuICAgICAgLy8gSWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSB0aGUgcmVxdWVzdGVkIG1ldGFkYXRhLCB0aGUgZmlsZSBpcyBub3QgYSBtb2R1bGVcbiAgICAgIC8vIG9yIGlzIGEgZGVjbGFyYXRpb24gZmlsZSBzbyByZXR1cm4gYW4gZW1wdHkgbWFwLlxuICAgICAgcmVzdWx0ID0gdGhpcy5yZXF1ZXN0cy5nZXQoc291cmNlRmlsZS5maWxlTmFtZSkgfHwgbmV3IE1hcDxudW1iZXIsIExvd2VyaW5nUmVxdWVzdD4oKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIE1ldGFkYXRhVHJhbnNmb3JtZXJcbiAgY29ubmVjdChjYWNoZTogTWV0YWRhdGFDYWNoZSk6IHZvaWQgeyB0aGlzLmNhY2hlID0gY2FjaGU7IH1cblxuICBzdGFydChzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKTogVmFsdWVUcmFuc2Zvcm18dW5kZWZpbmVkIHtcbiAgICBsZXQgaWRlbnROdW1iZXIgPSAwO1xuICAgIGNvbnN0IGZyZXNoSWRlbnQgPSAoKSA9PiBjcmVhdGVMb3dlcmVkU3ltYm9sKGlkZW50TnVtYmVyKyspO1xuICAgIGNvbnN0IHJlcXVlc3RzID0gbmV3IE1hcDxudW1iZXIsIExvd2VyaW5nUmVxdWVzdD4oKTtcbiAgICB0aGlzLnJlcXVlc3RzLnNldChzb3VyY2VGaWxlLmZpbGVOYW1lLCByZXF1ZXN0cyk7XG5cbiAgICBjb25zdCByZXBsYWNlTm9kZSA9IChub2RlOiB0cy5Ob2RlKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gZnJlc2hJZGVudCgpO1xuICAgICAgcmVxdWVzdHMuc2V0KG5vZGUucG9zLCB7bmFtZSwga2luZDogbm9kZS5raW5kLCBsb2NhdGlvbjogbm9kZS5wb3MsIGVuZDogbm9kZS5lbmR9KTtcbiAgICAgIHJldHVybiB7X19zeW1ib2xpYzogJ3JlZmVyZW5jZScsIG5hbWV9O1xuICAgIH07XG5cbiAgICBjb25zdCBpc0V4cG9ydGVkU3ltYm9sID0gKCgpID0+IHtcbiAgICAgIGxldCBleHBvcnRUYWJsZTogU2V0PHN0cmluZz47XG4gICAgICByZXR1cm4gKG5vZGU6IHRzLk5vZGUpID0+IHtcbiAgICAgICAgaWYgKG5vZGUua2luZCA9PSB0cy5TeW50YXhLaW5kLklkZW50aWZpZXIpIHtcbiAgICAgICAgICBjb25zdCBpZGVudCA9IG5vZGUgYXMgdHMuSWRlbnRpZmllcjtcblxuICAgICAgICAgIGlmICghZXhwb3J0VGFibGUpIHtcbiAgICAgICAgICAgIGV4cG9ydFRhYmxlID0gY3JlYXRlRXhwb3J0VGFibGVGb3Ioc291cmNlRmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBleHBvcnRUYWJsZS5oYXMoaWRlbnQudGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfTtcbiAgICB9KSgpO1xuXG4gICAgY29uc3QgaXNFeHBvcnRlZFByb3BlcnR5QWNjZXNzID0gKG5vZGU6IHRzLk5vZGUpID0+IHtcbiAgICAgIGlmIChub2RlLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKSB7XG4gICAgICAgIGNvbnN0IHBhZSA9IG5vZGUgYXMgdHMuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uO1xuICAgICAgICBpZiAoaXNFeHBvcnRlZFN5bWJvbChwYWUuZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICBjb25zdCBoYXNMb3dlcmFibGVQYXJlbnRDYWNoZSA9IG5ldyBNYXA8dHMuTm9kZSwgYm9vbGVhbj4oKTtcblxuICAgIGNvbnN0IHNob3VsZEJlTG93ZXJlZCA9IChub2RlOiB0cy5Ob2RlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PiB7XG4gICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGxldCBsb3dlcmFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgIGlmICgobm9kZS5raW5kID09PSB0cy5TeW50YXhLaW5kLkFycm93RnVuY3Rpb24gfHxcbiAgICAgICAgICAgbm9kZS5raW5kID09PSB0cy5TeW50YXhLaW5kLkZ1bmN0aW9uRXhwcmVzc2lvbikgJiZcbiAgICAgICAgICBpc0VsaWdpYmxlRm9yTG93ZXJpbmcobm9kZSkpIHtcbiAgICAgICAgbG93ZXJhYmxlID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgaXNMaXRlcmFsRmllbGROYW1lZChub2RlLCB0aGlzLmxvd2VyYWJsZUZpZWxkTmFtZXMpICYmIGlzRWxpZ2libGVGb3JMb3dlcmluZyhub2RlKSAmJlxuICAgICAgICAgICFpc0V4cG9ydGVkU3ltYm9sKG5vZGUpICYmICFpc0V4cG9ydGVkUHJvcGVydHlBY2Nlc3Mobm9kZSkpIHtcbiAgICAgICAgbG93ZXJhYmxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsb3dlcmFibGU7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhc0xvd2VyYWJsZVBhcmVudCA9IChub2RlOiB0cy5Ob2RlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PiB7XG4gICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghaGFzTG93ZXJhYmxlUGFyZW50Q2FjaGUuaGFzKG5vZGUpKSB7XG4gICAgICAgIGhhc0xvd2VyYWJsZVBhcmVudENhY2hlLnNldChcbiAgICAgICAgICAgIG5vZGUsIHNob3VsZEJlTG93ZXJlZChub2RlLnBhcmVudCkgfHwgaGFzTG93ZXJhYmxlUGFyZW50KG5vZGUucGFyZW50KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzTG93ZXJhYmxlUGFyZW50Q2FjaGUuZ2V0KG5vZGUpICE7XG4gICAgfTtcblxuICAgIGNvbnN0IGlzTG93ZXJhYmxlID0gKG5vZGU6IHRzLk5vZGUgfCB1bmRlZmluZWQpOiBib29sZWFuID0+IHtcbiAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNob3VsZEJlTG93ZXJlZChub2RlKSAmJiAhaGFzTG93ZXJhYmxlUGFyZW50KG5vZGUpO1xuICAgIH07XG5cbiAgICByZXR1cm4gKHZhbHVlOiBNZXRhZGF0YVZhbHVlLCBub2RlOiB0cy5Ob2RlKTogTWV0YWRhdGFWYWx1ZSA9PiB7XG4gICAgICBpZiAoIWlzUHJpbWl0aXZlKHZhbHVlKSAmJiAhaXNSZXdyaXR0ZW4odmFsdWUpICYmIGlzTG93ZXJhYmxlKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiByZXBsYWNlTm9kZShub2RlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUV4cG9ydFRhYmxlRm9yKHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpOiBTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IGV4cG9ydFRhYmxlID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIExhemlseSBjb2xsZWN0IGFsbCB0aGUgZXhwb3J0cyBmcm9tIHRoZSBzb3VyY2UgZmlsZVxuICB0cy5mb3JFYWNoQ2hpbGQoc291cmNlRmlsZSwgZnVuY3Rpb24gc2Nhbihub2RlKSB7XG4gICAgc3dpdGNoIChub2RlLmtpbmQpIHtcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5DbGFzc0RlY2xhcmF0aW9uOlxuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkZ1bmN0aW9uRGVjbGFyYXRpb246XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuSW50ZXJmYWNlRGVjbGFyYXRpb246XG4gICAgICAgIGlmICgodHMuZ2V0Q29tYmluZWRNb2RpZmllckZsYWdzKG5vZGUgYXMgdHMuRGVjbGFyYXRpb24pICYgdHMuTW9kaWZpZXJGbGFncy5FeHBvcnQpICE9IDApIHtcbiAgICAgICAgICBjb25zdCBjbGFzc0RlY2xhcmF0aW9uID1cbiAgICAgICAgICAgICAgbm9kZSBhcyh0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuRnVuY3Rpb25EZWNsYXJhdGlvbiB8IHRzLkludGVyZmFjZURlY2xhcmF0aW9uKTtcbiAgICAgICAgICBjb25zdCBuYW1lID0gY2xhc3NEZWNsYXJhdGlvbi5uYW1lO1xuICAgICAgICAgIGlmIChuYW1lKSBleHBvcnRUYWJsZS5hZGQobmFtZS50ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5WYXJpYWJsZVN0YXRlbWVudDpcbiAgICAgICAgY29uc3QgdmFyaWFibGVTdGF0ZW1lbnQgPSBub2RlIGFzIHRzLlZhcmlhYmxlU3RhdGVtZW50O1xuICAgICAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHZhcmlhYmxlU3RhdGVtZW50LmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICBzY2FuKGRlY2xhcmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5WYXJpYWJsZURlY2xhcmF0aW9uOlxuICAgICAgICBjb25zdCB2YXJpYWJsZURlY2xhcmF0aW9uID0gbm9kZSBhcyB0cy5WYXJpYWJsZURlY2xhcmF0aW9uO1xuICAgICAgICBpZiAoKHRzLmdldENvbWJpbmVkTW9kaWZpZXJGbGFncyh2YXJpYWJsZURlY2xhcmF0aW9uKSAmIHRzLk1vZGlmaWVyRmxhZ3MuRXhwb3J0KSAhPSAwICYmXG4gICAgICAgICAgICB2YXJpYWJsZURlY2xhcmF0aW9uLm5hbWUua2luZCA9PSB0cy5TeW50YXhLaW5kLklkZW50aWZpZXIpIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gdmFyaWFibGVEZWNsYXJhdGlvbi5uYW1lIGFzIHRzLklkZW50aWZpZXI7XG4gICAgICAgICAgZXhwb3J0VGFibGUuYWRkKG5hbWUudGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuRXhwb3J0RGVjbGFyYXRpb246XG4gICAgICAgIGNvbnN0IGV4cG9ydERlY2xhcmF0aW9uID0gbm9kZSBhcyB0cy5FeHBvcnREZWNsYXJhdGlvbjtcbiAgICAgICAgY29uc3Qge21vZHVsZVNwZWNpZmllciwgZXhwb3J0Q2xhdXNlfSA9IGV4cG9ydERlY2xhcmF0aW9uO1xuICAgICAgICBpZiAoIW1vZHVsZVNwZWNpZmllciAmJiBleHBvcnRDbGF1c2UpIHtcbiAgICAgICAgICBleHBvcnRDbGF1c2UuZWxlbWVudHMuZm9yRWFjaChzcGVjID0+IHsgZXhwb3J0VGFibGUuYWRkKHNwZWMubmFtZS50ZXh0KTsgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZXhwb3J0VGFibGU7XG59XG4iXX0=
|