1 | ;
|
2 |
|
3 | Object.defineProperty(exports, '__esModule', { value: true });
|
4 |
|
5 | function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
6 |
|
7 | var _ = require('lodash');
|
8 | var semver = require('semver');
|
9 | var Ast = require('ts-simple-ast');
|
10 | var Ast__default = _interopDefault(Ast);
|
11 | var fs = require('fs-extra');
|
12 | var path = require('path');
|
13 | var Handlebars = require('handlebars');
|
14 | var JSON5 = require('json5');
|
15 | var i18next = _interopDefault(require('i18next'));
|
16 | var LiveServer = require('live-server');
|
17 |
|
18 | const __assign = Object.assign || function (target) {
|
19 | for (var source, i = 1; i < arguments.length; i++) {
|
20 | source = arguments[i];
|
21 | for (var prop in source) {
|
22 | if (Object.prototype.hasOwnProperty.call(source, prop)) {
|
23 | target[prop] = source[prop];
|
24 | }
|
25 | }
|
26 | }
|
27 | return target;
|
28 | };
|
29 |
|
30 | function __extends(d, b) {
|
31 | for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
|
32 | function __() { this.constructor = d; }
|
33 | d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
34 | }
|
35 |
|
36 | var log = require('fancy-log');
|
37 | var c = require('chalk');
|
38 | var pkg = require('../package.json');
|
39 | var LEVEL;
|
40 | (function (LEVEL) {
|
41 | LEVEL[LEVEL["INFO"] = 0] = "INFO";
|
42 | LEVEL[LEVEL["DEBUG"] = 1] = "DEBUG";
|
43 | LEVEL[LEVEL["ERROR"] = 2] = "ERROR";
|
44 | LEVEL[LEVEL["WARN"] = 3] = "WARN";
|
45 | })(LEVEL || (LEVEL = {}));
|
46 | var Logger = /** @class */ (function () {
|
47 | function Logger() {
|
48 | this.name = pkg.name;
|
49 | this.version = pkg.version;
|
50 | this.logger = log;
|
51 | this.silent = true;
|
52 | }
|
53 | Logger.prototype.info = function () {
|
54 | var args = [];
|
55 | for (var _i = 0; _i < arguments.length; _i++) {
|
56 | args[_i] = arguments[_i];
|
57 | }
|
58 | if (!this.silent) {
|
59 | return;
|
60 | }
|
61 | this.logger(this.format.apply(this, [LEVEL.INFO].concat(args)));
|
62 | };
|
63 | Logger.prototype.error = function () {
|
64 | var args = [];
|
65 | for (var _i = 0; _i < arguments.length; _i++) {
|
66 | args[_i] = arguments[_i];
|
67 | }
|
68 | if (!this.silent) {
|
69 | return;
|
70 | }
|
71 | this.logger(this.format.apply(this, [LEVEL.ERROR].concat(args)));
|
72 | };
|
73 | Logger.prototype.warn = function () {
|
74 | var args = [];
|
75 | for (var _i = 0; _i < arguments.length; _i++) {
|
76 | args[_i] = arguments[_i];
|
77 | }
|
78 | if (!this.silent) {
|
79 | return;
|
80 | }
|
81 | this.logger(this.format.apply(this, [LEVEL.WARN].concat(args)));
|
82 | };
|
83 | Logger.prototype.debug = function () {
|
84 | var args = [];
|
85 | for (var _i = 0; _i < arguments.length; _i++) {
|
86 | args[_i] = arguments[_i];
|
87 | }
|
88 | if (!this.silent) {
|
89 | return;
|
90 | }
|
91 | this.logger(this.format.apply(this, [LEVEL.DEBUG].concat(args)));
|
92 | };
|
93 | Logger.prototype.format = function (level) {
|
94 | var args = [];
|
95 | for (var _i = 1; _i < arguments.length; _i++) {
|
96 | args[_i - 1] = arguments[_i];
|
97 | }
|
98 | var pad = function (s, l, z) {
|
99 | if (z === void 0) { z = ''; }
|
100 | return s + Array(Math.max(0, l - s.length + 1)).join(z);
|
101 | };
|
102 | var msg = args.join(' ');
|
103 | if (args.length > 1) {
|
104 | msg = pad(args.shift(), 15, ' ') + ": " + args.join(' ');
|
105 | }
|
106 | switch (level) {
|
107 | case LEVEL.INFO:
|
108 | msg = c.green(msg);
|
109 | break;
|
110 | case LEVEL.DEBUG:
|
111 | msg = c.cyan(msg);
|
112 | break;
|
113 | case LEVEL.WARN:
|
114 | msg = c.yellow(msg);
|
115 | break;
|
116 | case LEVEL.ERROR:
|
117 | msg = c.red(msg);
|
118 | break;
|
119 | }
|
120 | return [
|
121 | msg
|
122 | ].join('');
|
123 | };
|
124 | return Logger;
|
125 | }());
|
126 | var logger = new Logger();
|
127 |
|
128 | var CompareHelper = /** @class */ (function () {
|
129 | function CompareHelper() {
|
130 | }
|
131 | CompareHelper.prototype.helperFunc = function (context, a, operator, b, options) {
|
132 | if (arguments.length < 4) {
|
133 | throw new Error('handlebars Helper {{compare}} expects 4 arguments');
|
134 | }
|
135 | var result;
|
136 | switch (operator) {
|
137 | case 'indexof':
|
138 | result = (b.indexOf(a) !== -1);
|
139 | break;
|
140 | case '===':
|
141 | result = a === b;
|
142 | break;
|
143 | case '!==':
|
144 | result = a !== b;
|
145 | break;
|
146 | case '>':
|
147 | result = a > b;
|
148 | break;
|
149 | default: {
|
150 | throw new Error('helper {{compare}}: invalid operator: `' + operator + '`');
|
151 | }
|
152 | }
|
153 | if (result === false) {
|
154 | return options.inverse(context);
|
155 | }
|
156 | return options.fn(context);
|
157 | };
|
158 | return CompareHelper;
|
159 | }());
|
160 |
|
161 | var OrHelper = /** @class */ (function () {
|
162 | function OrHelper() {
|
163 | }
|
164 | OrHelper.prototype.helperFunc = function (context) {
|
165 | var len = arguments.length - 1;
|
166 | var options = arguments[len];
|
167 | // We start at 1 because of options
|
168 | for (var i = 1; i < len; i++) {
|
169 | if (arguments[i]) {
|
170 | return options.fn(context);
|
171 | }
|
172 | }
|
173 | return options.inverse(context);
|
174 | };
|
175 | return OrHelper;
|
176 | }());
|
177 |
|
178 | var AngularAPIs = require('../src/data/api-list.json');
|
179 | var AngularApiUtil = /** @class */ (function () {
|
180 | function AngularApiUtil() {
|
181 | }
|
182 | AngularApiUtil.prototype.findApi = function (type) {
|
183 | var foundedApi;
|
184 | _.forEach(AngularAPIs, function (mainApi) {
|
185 | _.forEach(mainApi.items, function (api) {
|
186 | if (api.title === type) {
|
187 | foundedApi = api;
|
188 | }
|
189 | });
|
190 | });
|
191 | return {
|
192 | source: 'external',
|
193 | data: foundedApi
|
194 | };
|
195 | };
|
196 | return AngularApiUtil;
|
197 | }());
|
198 |
|
199 | var AngularVersionUtil = /** @class */ (function () {
|
200 | function AngularVersionUtil() {
|
201 | }
|
202 | AngularVersionUtil.prototype.cleanVersion = function (version) {
|
203 | return version.replace('~', '')
|
204 | .replace('^', '')
|
205 | .replace('=', '')
|
206 | .replace('<', '')
|
207 | .replace('>', '');
|
208 | };
|
209 | AngularVersionUtil.prototype.getAngularVersionOfProject = function (packageData) {
|
210 | var _result = '';
|
211 | if (packageData.dependencies) {
|
212 | var angularCore = packageData.dependencies[AngularVersionUtil.CorePackage];
|
213 | if (angularCore) {
|
214 | _result = this.cleanVersion(angularCore);
|
215 | }
|
216 | }
|
217 | return _result;
|
218 | };
|
219 | AngularVersionUtil.prototype.isAngularVersionArchived = function (version) {
|
220 | var result;
|
221 | try {
|
222 | result = semver.compare(version, '2.4.10') <= 0;
|
223 | }
|
224 | catch (e) { }
|
225 | return result;
|
226 | };
|
227 | AngularVersionUtil.prototype.prefixOfficialDoc = function (version) {
|
228 | return this.isAngularVersionArchived(version) ? 'v2.' : '';
|
229 | };
|
230 | AngularVersionUtil.prototype.getApiLink = function (api, angularVersion) {
|
231 | var angularDocPrefix = this.prefixOfficialDoc(angularVersion);
|
232 | return "https://" + angularDocPrefix + "angular.io/" + api.path;
|
233 | };
|
234 | AngularVersionUtil.CorePackage = '@angular/core';
|
235 | return AngularVersionUtil;
|
236 | }());
|
237 |
|
238 | var BasicTypes;
|
239 | (function (BasicTypes) {
|
240 | BasicTypes[BasicTypes["number"] = 0] = "number";
|
241 | BasicTypes[BasicTypes["boolean"] = 1] = "boolean";
|
242 | BasicTypes[BasicTypes["string"] = 2] = "string";
|
243 | BasicTypes[BasicTypes["object"] = 3] = "object";
|
244 | BasicTypes[BasicTypes["date"] = 4] = "date";
|
245 | BasicTypes[BasicTypes["function"] = 5] = "function";
|
246 | })(BasicTypes || (BasicTypes = {}));
|
247 | var BasicTypeScriptTypes;
|
248 | (function (BasicTypeScriptTypes) {
|
249 | BasicTypeScriptTypes[BasicTypeScriptTypes["any"] = 0] = "any";
|
250 | BasicTypeScriptTypes[BasicTypeScriptTypes["void"] = 1] = "void";
|
251 | })(BasicTypeScriptTypes || (BasicTypeScriptTypes = {}));
|
252 | var BasicTypeUtil = /** @class */ (function () {
|
253 | function BasicTypeUtil() {
|
254 | }
|
255 | /**
|
256 | * Checks if a given types is a basic javascript type
|
257 | * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects
|
258 | * @param type The type to check
|
259 | */
|
260 | BasicTypeUtil.prototype.isJavascriptType = function (type) {
|
261 | if (typeof type !== 'undefined') {
|
262 | return (type.toLowerCase() in BasicTypes);
|
263 | }
|
264 | else {
|
265 | return false;
|
266 | }
|
267 | };
|
268 | /**
|
269 | * Checks if a given type is a typescript type (That is not a javascript type)
|
270 | * https://www.typescriptlang.org/docs/handbook/basic-types.html
|
271 | * @param type The type to check
|
272 | */
|
273 | BasicTypeUtil.prototype.isTypeScriptType = function (type) {
|
274 | if (typeof type !== 'undefined') {
|
275 | return (type.toLowerCase() in BasicTypeScriptTypes);
|
276 | }
|
277 | else {
|
278 | return false;
|
279 | }
|
280 | };
|
281 | /**
|
282 | * Check if the type is a typescript or javascript type
|
283 | * @param type The type to check
|
284 | */
|
285 | BasicTypeUtil.prototype.isKnownType = function (type) {
|
286 | return this.isJavascriptType(type) || this.isTypeScriptType(type);
|
287 | };
|
288 | /**
|
289 | * Returns a official documentation link to either the javascript or typescript type
|
290 | * @param type The type to check
|
291 | * @returns The documentation link or undefined if type not found
|
292 | */
|
293 | BasicTypeUtil.prototype.getTypeUrl = function (type) {
|
294 | if (this.isJavascriptType(type)) {
|
295 | return "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/" + type;
|
296 | }
|
297 | if (this.isTypeScriptType(type)) {
|
298 | return "https://www.typescriptlang.org/docs/handbook/basic-types.html";
|
299 | }
|
300 | return undefined;
|
301 | };
|
302 | return BasicTypeUtil;
|
303 | }());
|
304 |
|
305 | var JsdocParserUtil = /** @class */ (function () {
|
306 | function JsdocParserUtil() {
|
307 | }
|
308 | JsdocParserUtil.prototype.isVariableLike = function (node) {
|
309 | if (node) {
|
310 | switch (node.kind) {
|
311 | case Ast.SyntaxKind.BindingElement:
|
312 | case Ast.SyntaxKind.EnumMember:
|
313 | case Ast.SyntaxKind.Parameter:
|
314 | case Ast.SyntaxKind.PropertyAssignment:
|
315 | case Ast.SyntaxKind.PropertyDeclaration:
|
316 | case Ast.SyntaxKind.PropertySignature:
|
317 | case Ast.SyntaxKind.ShorthandPropertyAssignment:
|
318 | case Ast.SyntaxKind.VariableDeclaration:
|
319 | return true;
|
320 | }
|
321 | }
|
322 | return false;
|
323 | };
|
324 | JsdocParserUtil.prototype.getMainCommentOfNode = function (node) {
|
325 | var description = '';
|
326 | if (node.jsDoc) {
|
327 | if (node.jsDoc.length > 0) {
|
328 | if (typeof node.jsDoc[0].comment !== 'undefined') {
|
329 | description = node.jsDoc[0].comment;
|
330 | }
|
331 | }
|
332 | }
|
333 | return description;
|
334 | };
|
335 | JsdocParserUtil.prototype.getJSDocTags = function (node, kind) {
|
336 | var docs = this.getJSDocs(node);
|
337 | if (docs) {
|
338 | var result = [];
|
339 | for (var _i = 0, docs_1 = docs; _i < docs_1.length; _i++) {
|
340 | var doc = docs_1[_i];
|
341 | if (Ast.ts.isJSDocParameterTag(doc)) {
|
342 | if (doc.kind === kind) {
|
343 | result.push(doc);
|
344 | }
|
345 | }
|
346 | else if (Ast.ts.isJSDoc(doc)) {
|
347 | result.push.apply(result, _.filter(doc.tags, function (tag) { return tag.kind === kind; }));
|
348 | }
|
349 | else {
|
350 | throw new Error('Unexpected type');
|
351 | }
|
352 | }
|
353 | return result;
|
354 | }
|
355 | };
|
356 | JsdocParserUtil.prototype.getJSDocs = function (node) {
|
357 | // TODO: jsDocCache is internal, see if there's a way around it
|
358 | var cache = node.jsDocCache;
|
359 | if (!cache) {
|
360 | cache = this.getJSDocsWorker(node, []).filter(function (x) { return x; });
|
361 | node.jsDocCache = cache;
|
362 | }
|
363 | return cache;
|
364 | };
|
365 | // Try to recognize this pattern when node is initializer
|
366 | // of variable declaration and JSDoc comments are on containing variable statement.
|
367 | // /**
|
368 | // * @param {number} name
|
369 | // * @returns {number}
|
370 | // */
|
371 | // var x = function(name) { return name.length; }
|
372 | JsdocParserUtil.prototype.getJSDocsWorker = function (node, cache) {
|
373 | var parent = node.parent;
|
374 | var isInitializerOfVariableDeclarationInStatement = this.isVariableLike(parent) &&
|
375 | parent.initializer === node &&
|
376 | Ast.ts.isVariableStatement(parent.parent.parent);
|
377 | var isVariableOfVariableDeclarationStatement = this.isVariableLike(node) && Ast.ts.isVariableStatement(parent.parent);
|
378 | var variableStatementNode = isInitializerOfVariableDeclarationInStatement
|
379 | ? parent.parent.parent
|
380 | : isVariableOfVariableDeclarationStatement
|
381 | ? parent.parent
|
382 | : undefined;
|
383 | if (variableStatementNode) {
|
384 | cache = this.getJSDocsWorker(variableStatementNode, cache);
|
385 | }
|
386 | // Also recognize when the node is the RHS of an assignment expression
|
387 | var isSourceOfAssignmentExpressionStatement = parent &&
|
388 | parent.parent &&
|
389 | Ast.ts.isBinaryExpression(parent) &&
|
390 | parent.operatorToken.kind === Ast.SyntaxKind.EqualsToken &&
|
391 | Ast.ts.isExpressionStatement(parent.parent);
|
392 | if (isSourceOfAssignmentExpressionStatement) {
|
393 | cache = this.getJSDocsWorker(parent.parent, cache);
|
394 | }
|
395 | var isModuleDeclaration = Ast.ts.isModuleDeclaration(node) && parent && Ast.ts.isModuleDeclaration(parent);
|
396 | var isPropertyAssignmentExpression = parent && Ast.ts.isPropertyAssignment(parent);
|
397 | if (isModuleDeclaration || isPropertyAssignmentExpression) {
|
398 | cache = this.getJSDocsWorker(parent, cache);
|
399 | }
|
400 | // Pull parameter comments from declaring function as well
|
401 | if (Ast.ts.isParameter(node)) {
|
402 | cache = _.concat(cache, this.getJSDocParameterTags(node));
|
403 | }
|
404 | if (this.isVariableLike(node) && node.initializer) {
|
405 | cache = _.concat(cache, node.initializer.jsDoc);
|
406 | }
|
407 | cache = _.concat(cache, node.jsDoc);
|
408 | return cache;
|
409 | };
|
410 | JsdocParserUtil.prototype.getJSDocParameterTags = function (param) {
|
411 | var func = param.parent;
|
412 | var tags = this.getJSDocTags(func, Ast.SyntaxKind.JSDocParameterTag);
|
413 | if (!param.name) {
|
414 | // this is an anonymous jsdoc param from a `function(type1, type2): type3` specification
|
415 | var i = func.parameters.indexOf(param);
|
416 | var paramTags = _.filter(tags, function (tag) { return Ast.ts.isJSDocParameterTag(tag); });
|
417 | if (paramTags && 0 <= i && i < paramTags.length) {
|
418 | return [paramTags[i]];
|
419 | }
|
420 | }
|
421 | else if (Ast.ts.isIdentifier(param.name)) {
|
422 | var name_1 = param.name.text;
|
423 | return _.filter(tags, function (tag) {
|
424 | if (Ast.ts && Ast.ts.isJSDocParameterTag(tag)) {
|
425 | var t = tag;
|
426 | if (typeof t.parameterName !== 'undefined') {
|
427 | return t.parameterName.text === name_1;
|
428 | }
|
429 | else if (typeof t.name !== 'undefined') {
|
430 | if (typeof t.name.escapedText !== 'undefined') {
|
431 | return t.name.escapedText === name_1;
|
432 | }
|
433 | }
|
434 | }
|
435 | });
|
436 | }
|
437 | else {
|
438 | // TODO: it's a destructured parameter, so it should look up an "object type" series of multiple lines
|
439 | // But multi-line object types aren't supported yet either
|
440 | return undefined;
|
441 | }
|
442 | };
|
443 | return JsdocParserUtil;
|
444 | }());
|
445 |
|
446 | var FileEngine = /** @class */ (function () {
|
447 | function FileEngine() {
|
448 | }
|
449 | FileEngine.prototype.get = function (filepath) {
|
450 | return new Promise(function (resolve, reject) {
|
451 | fs.readFile(path.resolve(filepath), 'utf8', function (err, data) {
|
452 | if (err) {
|
453 | reject('Error during ' + filepath + ' read');
|
454 | }
|
455 | else {
|
456 | resolve(data);
|
457 | }
|
458 | });
|
459 | });
|
460 | };
|
461 | FileEngine.prototype.write = function (filepath, contents) {
|
462 | return new Promise(function (resolve, reject) {
|
463 | fs.outputFile(path.resolve(filepath), contents, function (err) {
|
464 | if (err) {
|
465 | reject(err);
|
466 | }
|
467 | else {
|
468 | resolve();
|
469 | }
|
470 | });
|
471 | });
|
472 | };
|
473 | FileEngine.prototype.getSync = function (filepath) {
|
474 | return fs.readFileSync(path.resolve(filepath), 'utf8');
|
475 | };
|
476 | /**
|
477 | * @param file The file to check
|
478 | */
|
479 | FileEngine.prototype.existsSync = function (file) {
|
480 | return fs.existsSync(file);
|
481 | };
|
482 | return FileEngine;
|
483 | }());
|
484 |
|
485 | var ast = new Ast__default();
|
486 | var ImportsUtil = /** @class */ (function () {
|
487 | function ImportsUtil() {
|
488 | }
|
489 | /**
|
490 | * Find for a sourceFile a variable value in a local enum
|
491 | * @param srcFile
|
492 | * @param variableName
|
493 | * @param variableValue
|
494 | */
|
495 | ImportsUtil.prototype.findInEnums = function (srcFile, variableName, variableValue) {
|
496 | var res = '';
|
497 | srcFile.getEnum(function (e) {
|
498 | if (e.getName() === variableName) {
|
499 | e.getMember(function (m) {
|
500 | if (m.getName() === variableValue) {
|
501 | res = m.getValue();
|
502 | }
|
503 | });
|
504 | }
|
505 | });
|
506 | return res;
|
507 | };
|
508 | /**
|
509 | * Find for a sourceFile a variable value in a local static class
|
510 | * @param srcFile
|
511 | * @param variableName
|
512 | * @param variableValue
|
513 | */
|
514 | ImportsUtil.prototype.findInClasses = function (srcFile, variableName, variableValue) {
|
515 | var res = '';
|
516 | srcFile.getClass(function (c) {
|
517 | var staticProperty = c.getStaticProperty(variableValue);
|
518 | if (staticProperty) {
|
519 | if (staticProperty.getInitializer()) {
|
520 | res = staticProperty.getInitializer().getText();
|
521 | }
|
522 | }
|
523 | });
|
524 | return res;
|
525 | };
|
526 | /**
|
527 | * Find a value in a local variable declaration like an object
|
528 | * @param variableDeclaration
|
529 | * @param variablesAttributes
|
530 | */
|
531 | ImportsUtil.prototype.findInObjectVariableDeclaration = function (variableDeclaration, variablesAttributes) {
|
532 | var variableKind = variableDeclaration.getKind();
|
533 | if (variableKind && variableKind === Ast.SyntaxKind.VariableDeclaration) {
|
534 | var initializer = variableDeclaration.getInitializer();
|
535 | if (initializer) {
|
536 | var initializerKind = initializer.getKind();
|
537 | if (initializerKind && initializerKind === Ast.SyntaxKind.ObjectLiteralExpression) {
|
538 | var compilerNode = initializer.compilerNode, finalValue_1 = '';
|
539 | // Find thestring from AVAR.BVAR.thestring inside properties
|
540 | var depth_1 = 0;
|
541 | var loopProperties_1 = function (properties) {
|
542 | properties.forEach(function (prop) {
|
543 | if (prop.name) {
|
544 | if (variablesAttributes[depth_1 + 1]) {
|
545 | if (prop.name.getText() === variablesAttributes[depth_1 + 1]) {
|
546 | if (prop.initializer) {
|
547 | if (prop.initializer.properties) {
|
548 | depth_1 += 1;
|
549 | loopProperties_1(prop.initializer.properties);
|
550 | }
|
551 | else {
|
552 | finalValue_1 = prop.initializer.text;
|
553 | }
|
554 | }
|
555 | else {
|
556 | finalValue_1 = prop.initializer.text;
|
557 | }
|
558 | }
|
559 | }
|
560 | }
|
561 | });
|
562 | };
|
563 | loopProperties_1(compilerNode.properties);
|
564 | return finalValue_1;
|
565 | }
|
566 | }
|
567 | }
|
568 | };
|
569 | /**
|
570 | * Find in imports something like myvar
|
571 | * @param {string} inputVariableName like myvar
|
572 | * @return {[type]} myvar value
|
573 | */
|
574 | ImportsUtil.prototype.findValueInImportOrLocalVariables = function (inputVariableName, sourceFile) {
|
575 | var metadataVariableName = inputVariableName, searchedImport, aliasOriginalName = '', foundWithAlias = false;
|
576 | var file = typeof ast.getSourceFile(sourceFile.fileName) !== 'undefined'
|
577 | ? ast.getSourceFile(sourceFile.fileName)
|
578 | : ast.addExistingSourceFileIfExists(sourceFile.fileName); // tslint:disable-line
|
579 | var imports = file.getImportDeclarations();
|
580 | /**
|
581 | * Loop through all imports, and find one matching inputVariableName
|
582 | */
|
583 | imports.forEach(function (i) {
|
584 | var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
|
585 | if (namedImportsLength > 0) {
|
586 | for (j; j < namedImportsLength; j++) {
|
587 | var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
|
588 | if (namedImports[j].getAliasIdentifier()) {
|
589 | importAlias = namedImports[j].getAliasIdentifier().getText();
|
590 | }
|
591 | if (importName === metadataVariableName) {
|
592 | searchedImport = i;
|
593 | break;
|
594 | }
|
595 | if (importAlias === metadataVariableName) {
|
596 | foundWithAlias = true;
|
597 | aliasOriginalName = importName;
|
598 | searchedImport = i;
|
599 | break;
|
600 | }
|
601 | }
|
602 | }
|
603 | });
|
604 | function hasFoundValues(variableDeclaration) {
|
605 | var variableKind = variableDeclaration.getKind();
|
606 | if (variableKind && variableKind === Ast.SyntaxKind.VariableDeclaration) {
|
607 | var initializer = variableDeclaration.getInitializer();
|
608 | if (initializer) {
|
609 | var initializerKind = initializer.getKind();
|
610 | if (initializerKind &&
|
611 | initializerKind === Ast.SyntaxKind.ObjectLiteralExpression) {
|
612 | var compilerNode = initializer.compilerNode;
|
613 | return compilerNode.properties;
|
614 | }
|
615 | }
|
616 | }
|
617 | }
|
618 | if (typeof searchedImport !== 'undefined') {
|
619 | var importPathReference = searchedImport.getModuleSpecifierSourceFile();
|
620 | var importPath = void 0;
|
621 | if (typeof importPathReference !== 'undefined') {
|
622 | importPath = importPathReference.compilerNode.fileName;
|
623 | var sourceFileImport = typeof ast.getSourceFile(importPath) !== 'undefined'
|
624 | ? ast.getSourceFile(importPath)
|
625 | : ast.addExistingSourceFileIfExists(importPath); // tslint:disable-line
|
626 | if (sourceFileImport) {
|
627 | var variableName = foundWithAlias ? aliasOriginalName : metadataVariableName;
|
628 | var variableDeclaration = sourceFileImport.getVariableDeclaration(variableName);
|
629 | if (variableDeclaration) {
|
630 | return hasFoundValues(variableDeclaration);
|
631 | }
|
632 | else {
|
633 | // Try with exports
|
634 | var exportDeclarations = sourceFileImport.getExportDeclarations();
|
635 | if (exportDeclarations && exportDeclarations.length > 0) {
|
636 | var i = 0, len = exportDeclarations.length;
|
637 | for (i; i < len; i++) {
|
638 | var exportDeclaration = exportDeclarations[i];
|
639 | var sourceFileExportedReference = exportDeclaration.getModuleSpecifierSourceFile();
|
640 | if (sourceFileExportedReference) {
|
641 | var sourceFileExportedReferencePath = sourceFileExportedReference.getFilePath();
|
642 | var sourceFileExported = typeof ast.getSourceFile(sourceFileExportedReferencePath) !== 'undefined'
|
643 | ? ast.getSourceFile(sourceFileExportedReferencePath)
|
644 | : ast.addExistingSourceFileIfExists(sourceFileExportedReferencePath);
|
645 | if (sourceFileExported) {
|
646 | variableDeclaration = sourceFileExported.getVariableDeclaration(variableName);
|
647 | if (variableDeclaration) {
|
648 | return hasFoundValues(variableDeclaration);
|
649 | }
|
650 | }
|
651 | }
|
652 | }
|
653 | }
|
654 | }
|
655 | }
|
656 | }
|
657 | }
|
658 | else {
|
659 | // Find in local variables of the file
|
660 | var variableDeclaration = file.getVariableDeclaration(metadataVariableName);
|
661 | if (variableDeclaration) {
|
662 | var variableKind = variableDeclaration.getKind();
|
663 | if (variableKind && variableKind === Ast.SyntaxKind.VariableDeclaration) {
|
664 | var initializer = variableDeclaration.getInitializer();
|
665 | if (initializer) {
|
666 | var initializerKind = initializer.getKind();
|
667 | if (initializerKind &&
|
668 | initializerKind === Ast.SyntaxKind.ObjectLiteralExpression) {
|
669 | var compilerNode = initializer.compilerNode;
|
670 | return compilerNode.properties;
|
671 | }
|
672 | else if (initializerKind) {
|
673 | return variableDeclaration.compilerNode;
|
674 | }
|
675 | }
|
676 | }
|
677 | }
|
678 | }
|
679 | return [];
|
680 | };
|
681 | ImportsUtil.prototype.getFileNameOfImport = function (variableName, sourceFile) {
|
682 | var file = typeof ast.getSourceFile(sourceFile.fileName) !== 'undefined'
|
683 | ? ast.getSourceFile(sourceFile.fileName)
|
684 | : ast.addExistingSourceFile(sourceFile.fileName); // tslint:disable-line
|
685 | var imports = file.getImportDeclarations();
|
686 | var searchedImport, finalPath = '';
|
687 | imports.forEach(function (i) {
|
688 | var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
|
689 | if (namedImportsLength > 0) {
|
690 | for (j; j < namedImportsLength; j++) {
|
691 | var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
|
692 | if (namedImports[j].getAliasIdentifier()) {
|
693 | importAlias = namedImports[j].getAliasIdentifier().getText();
|
694 | }
|
695 | if (importName === variableName) {
|
696 | searchedImport = i;
|
697 | break;
|
698 | }
|
699 | if (importAlias === variableName) {
|
700 | searchedImport = i;
|
701 | break;
|
702 | }
|
703 | }
|
704 | }
|
705 | });
|
706 | if (typeof searchedImport !== 'undefined') {
|
707 | var importPath = path.resolve(path.dirname(sourceFile.fileName) +
|
708 | '/' +
|
709 | searchedImport.getModuleSpecifierValue() +
|
710 | '.ts');
|
711 | var cleaner = (process.cwd() + path.sep).replace(/\\/g, '/');
|
712 | finalPath = importPath.replace(cleaner, '');
|
713 | }
|
714 | return finalPath;
|
715 | };
|
716 | /**
|
717 | * Find the file path of imported variable
|
718 | * @param {string} inputVariableName like thestring
|
719 | * @return {[type]} thestring destination path
|
720 | */
|
721 | ImportsUtil.prototype.findFilePathOfImportedVariable = function (inputVariableName, sourceFilePath) {
|
722 | var searchedImport, finalPath = '';
|
723 | var file = typeof ast.getSourceFile(sourceFilePath) !== 'undefined'
|
724 | ? ast.getSourceFile(sourceFilePath)
|
725 | : ast.addExistingSourceFile(sourceFilePath); // tslint:disable-line
|
726 | var imports = file.getImportDeclarations();
|
727 | /**
|
728 | * Loop through all imports, and find one matching inputVariableName
|
729 | */
|
730 | imports.forEach(function (i) {
|
731 | var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
|
732 | if (namedImportsLength > 0) {
|
733 | for (j; j < namedImportsLength; j++) {
|
734 | var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
|
735 | if (namedImports[j].getAliasIdentifier()) {
|
736 | importAlias = namedImports[j].getAliasIdentifier().getText();
|
737 | }
|
738 | if (importName === inputVariableName) {
|
739 | searchedImport = i;
|
740 | break;
|
741 | }
|
742 | if (importAlias === inputVariableName) {
|
743 | searchedImport = i;
|
744 | break;
|
745 | }
|
746 | }
|
747 | }
|
748 | });
|
749 | if (typeof searchedImport !== 'undefined') {
|
750 | finalPath = path.resolve(path.dirname(sourceFilePath) +
|
751 | '/' +
|
752 | searchedImport.getModuleSpecifierValue() +
|
753 | '.ts');
|
754 | }
|
755 | return finalPath;
|
756 | };
|
757 | /**
|
758 | * Find in imports something like VAR.AVAR.BVAR.thestring
|
759 | * @param {string} inputVariableName like VAR.AVAR.BVAR.thestring
|
760 | * @return {[type]} thestring value
|
761 | */
|
762 | ImportsUtil.prototype.findPropertyValueInImportOrLocalVariables = function (inputVariableName, sourceFile) {
|
763 | var variablesAttributes = inputVariableName.split('.'), metadataVariableName = variablesAttributes[0], searchedImport, aliasOriginalName = '', foundWithAlias = false;
|
764 | var file = typeof ast.getSourceFile(sourceFile.fileName) !== 'undefined'
|
765 | ? ast.getSourceFile(sourceFile.fileName)
|
766 | : ast.addExistingSourceFile(sourceFile.fileName); // tslint:disable-line
|
767 | var imports = file.getImportDeclarations();
|
768 | /**
|
769 | * Loop through all imports, and find one matching inputVariableName
|
770 | */
|
771 | imports.forEach(function (i) {
|
772 | var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
|
773 | if (namedImportsLength > 0) {
|
774 | for (j; j < namedImportsLength; j++) {
|
775 | var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
|
776 | if (namedImports[j].getAliasIdentifier()) {
|
777 | importAlias = namedImports[j].getAliasIdentifier().getText();
|
778 | }
|
779 | if (importName === metadataVariableName) {
|
780 | searchedImport = i;
|
781 | break;
|
782 | }
|
783 | if (importAlias === metadataVariableName) {
|
784 | foundWithAlias = true;
|
785 | aliasOriginalName = importName;
|
786 | searchedImport = i;
|
787 | break;
|
788 | }
|
789 | }
|
790 | }
|
791 | });
|
792 | var fileToSearchIn, variableDeclaration;
|
793 | if (typeof searchedImport !== 'undefined') {
|
794 | var importPath = path.resolve(path.dirname(sourceFile.fileName) +
|
795 | '/' +
|
796 | searchedImport.getModuleSpecifierValue() +
|
797 | '.ts');
|
798 | var sourceFileImport = typeof ast.getSourceFile(importPath) !== 'undefined'
|
799 | ? ast.getSourceFile(importPath)
|
800 | : ast.addExistingSourceFile(importPath); // tslint:disable-line
|
801 | if (sourceFileImport) {
|
802 | fileToSearchIn = sourceFileImport;
|
803 | var variableName = foundWithAlias ? aliasOriginalName : metadataVariableName;
|
804 | variableDeclaration = fileToSearchIn.getVariableDeclaration(variableName);
|
805 | }
|
806 | }
|
807 | else {
|
808 | fileToSearchIn = file;
|
809 | // Find in local variables of the file
|
810 | variableDeclaration = fileToSearchIn.getVariableDeclaration(metadataVariableName);
|
811 | }
|
812 | if (variableDeclaration) {
|
813 | return this.findInObjectVariableDeclaration(variableDeclaration, variablesAttributes);
|
814 | }
|
815 | // Try find it in enums
|
816 | if (variablesAttributes.length > 0) {
|
817 | if (typeof fileToSearchIn !== 'undefined') {
|
818 | var val = this.findInEnums(fileToSearchIn, metadataVariableName, variablesAttributes[1]);
|
819 | if (val !== '') {
|
820 | return val;
|
821 | }
|
822 | val = this.findInClasses(fileToSearchIn, metadataVariableName, variablesAttributes[1]);
|
823 | if (val !== '') {
|
824 | return val;
|
825 | }
|
826 | }
|
827 | }
|
828 | };
|
829 | return ImportsUtil;
|
830 | }());
|
831 |
|
832 | var traverse = require('traverse');
|
833 | var ast$1 = new Ast__default();
|
834 | var RouterParserUtil = /** @class */ (function () {
|
835 | function RouterParserUtil() {
|
836 | this.routes = [];
|
837 | this.incompleteRoutes = [];
|
838 | this.modules = [];
|
839 | this.modulesWithRoutes = [];
|
840 | this.fileEngine = new FileEngine();
|
841 | this.importsUtil = new ImportsUtil();
|
842 | }
|
843 | RouterParserUtil.prototype.addRoute = function (route) {
|
844 | this.routes.push(route);
|
845 | this.routes = _.sortBy(_.uniqWith(this.routes, _.isEqual), ['name']);
|
846 | };
|
847 | RouterParserUtil.prototype.addIncompleteRoute = function (route) {
|
848 | this.incompleteRoutes.push(route);
|
849 | this.incompleteRoutes = _.sortBy(_.uniqWith(this.incompleteRoutes, _.isEqual), ['name']);
|
850 | };
|
851 | RouterParserUtil.prototype.addModuleWithRoutes = function (moduleName, moduleImports, filename) {
|
852 | this.modulesWithRoutes.push({
|
853 | name: moduleName,
|
854 | importsNode: moduleImports,
|
855 | filename: filename
|
856 | });
|
857 | this.modulesWithRoutes = _.sortBy(_.uniqWith(this.modulesWithRoutes, _.isEqual), ['name']);
|
858 | };
|
859 | RouterParserUtil.prototype.addModule = function (moduleName, moduleImports) {
|
860 | this.modules.push({
|
861 | name: moduleName,
|
862 | importsNode: moduleImports
|
863 | });
|
864 | this.modules = _.sortBy(_.uniqWith(this.modules, _.isEqual), ['name']);
|
865 | };
|
866 | RouterParserUtil.prototype.cleanRawRouteParsed = function (route) {
|
867 | var routesWithoutSpaces = route.replace(/ /gm, '');
|
868 | var testTrailingComma = routesWithoutSpaces.indexOf('},]');
|
869 | if (testTrailingComma !== -1) {
|
870 | routesWithoutSpaces = routesWithoutSpaces.replace('},]', '}]');
|
871 | }
|
872 | return JSON5.parse(routesWithoutSpaces);
|
873 | };
|
874 | RouterParserUtil.prototype.cleanRawRoute = function (route) {
|
875 | var routesWithoutSpaces = route.replace(/ /gm, '');
|
876 | var testTrailingComma = routesWithoutSpaces.indexOf('},]');
|
877 | if (testTrailingComma !== -1) {
|
878 | routesWithoutSpaces = routesWithoutSpaces.replace('},]', '}]');
|
879 | }
|
880 | return routesWithoutSpaces;
|
881 | };
|
882 | RouterParserUtil.prototype.setRootModule = function (module) {
|
883 | this.rootModule = module;
|
884 | };
|
885 | RouterParserUtil.prototype.hasRouterModuleInImports = function (imports) {
|
886 | for (var i = 0; i < imports.length; i++) {
|
887 | if (imports[i].name.indexOf('RouterModule.forChild') !== -1 ||
|
888 | imports[i].name.indexOf('RouterModule.forRoot') !== -1 ||
|
889 | imports[i].name.indexOf('RouterModule') !== -1) {
|
890 | return true;
|
891 | }
|
892 | }
|
893 | return false;
|
894 | };
|
895 | RouterParserUtil.prototype.fixIncompleteRoutes = function (miscellaneousVariables) {
|
896 | var matchingVariables = [];
|
897 | // For each incompleteRoute, scan if one misc variable is in code
|
898 | // if ok, try recreating complete route
|
899 | for (var i = 0; i < this.incompleteRoutes.length; i++) {
|
900 | for (var j = 0; j < miscellaneousVariables.length; j++) {
|
901 | if (this.incompleteRoutes[i].data.indexOf(miscellaneousVariables[j].name) !== -1) {
|
902 | console.log('found one misc var inside incompleteRoute');
|
903 | console.log(miscellaneousVariables[j].name);
|
904 | matchingVariables.push(miscellaneousVariables[j]);
|
905 | }
|
906 | }
|
907 | // Clean incompleteRoute
|
908 | this.incompleteRoutes[i].data = this.incompleteRoutes[i].data.replace('[', '');
|
909 | this.incompleteRoutes[i].data = this.incompleteRoutes[i].data.replace(']', '');
|
910 | }
|
911 | };
|
912 | RouterParserUtil.prototype.linkModulesAndRoutes = function () {
|
913 | var _this = this;
|
914 | var i = 0;
|
915 | var len = this.modulesWithRoutes.length;
|
916 | for (i; i < len; i++) {
|
917 | _.forEach(this.modulesWithRoutes[i].importsNode, function (node) {
|
918 | var initializer = node.initializer;
|
919 | if (initializer) {
|
920 | if (initializer.elements) {
|
921 | _.forEach(initializer.elements, function (element) {
|
922 | // find element with arguments
|
923 | if (element.arguments) {
|
924 | _.forEach(element.arguments, function (argument) {
|
925 | _.forEach(_this.routes, function (route) {
|
926 | if (argument.text &&
|
927 | route.name === argument.text &&
|
928 | route.filename === _this.modulesWithRoutes[i].filename) {
|
929 | route.module = _this.modulesWithRoutes[i].name;
|
930 | }
|
931 | else if (argument.text &&
|
932 | route.name === argument.text &&
|
933 | route.filename !== _this.modulesWithRoutes[i].filename) {
|
934 | var argumentImportPath = _this.importsUtil.findFilePathOfImportedVariable(argument.text, _this.modulesWithRoutes[i].filename);
|
935 | var cleaner = (process.cwd() + path.sep).replace(/\\/g, '/');
|
936 | argumentImportPath = argumentImportPath.replace(cleaner, '');
|
937 | if (argument.text &&
|
938 | route.name === argument.text &&
|
939 | route.filename === argumentImportPath) {
|
940 | route.module = _this.modulesWithRoutes[i].name;
|
941 | }
|
942 | }
|
943 | });
|
944 | });
|
945 | }
|
946 | });
|
947 | }
|
948 | }
|
949 | /**
|
950 | * direct support of for example
|
951 | * export const HomeRoutingModule: ModuleWithProviders = RouterModule.forChild(HOME_ROUTES);
|
952 | */
|
953 | if (Ast.ts.isCallExpression(node)) {
|
954 | if (node.arguments) {
|
955 | _.forEach(node.arguments, function (argument) {
|
956 | _.forEach(_this.routes, function (route) {
|
957 | if (argument.text &&
|
958 | route.name === argument.text &&
|
959 | route.filename === _this.modulesWithRoutes[i].filename) {
|
960 | route.module = _this.modulesWithRoutes[i].name;
|
961 | }
|
962 | });
|
963 | });
|
964 | }
|
965 | }
|
966 | });
|
967 | }
|
968 | };
|
969 | RouterParserUtil.prototype.foundRouteWithModuleName = function (moduleName) {
|
970 | return _.find(this.routes, { module: moduleName });
|
971 | };
|
972 | RouterParserUtil.prototype.foundLazyModuleWithPath = function (modulePath) {
|
973 | // path is like app/customers/customers.module#CustomersModule
|
974 | var split = modulePath.split('#');
|
975 | var lazyModulePath = split[0];
|
976 | var lazyModuleName = split[1];
|
977 | return lazyModuleName;
|
978 | };
|
979 | RouterParserUtil.prototype.constructRoutesTree = function () {
|
980 | var _this = this;
|
981 | // routes[] contains routes with module link
|
982 | // modulesTree contains modules tree
|
983 | // make a final routes tree with that
|
984 | traverse(this.modulesTree).forEach(function (node) {
|
985 | if (node) {
|
986 | if (node.parent) {
|
987 | delete node.parent;
|
988 | }
|
989 | if (node.initializer) {
|
990 | delete node.initializer;
|
991 | }
|
992 | if (node.importsNode) {
|
993 | delete node.importsNode;
|
994 | }
|
995 | }
|
996 | });
|
997 | this.cleanModulesTree = _.cloneDeep(this.modulesTree);
|
998 | var routesTree = {
|
999 | name: '<root>',
|
1000 | kind: 'module',
|
1001 | className: this.rootModule,
|
1002 | children: []
|
1003 | };
|
1004 | var loopModulesParser = function (node) {
|
1005 | if (node.children && node.children.length > 0) {
|
1006 | // If module has child modules
|
1007 | for (var i in node.children) {
|
1008 | var route = _this.foundRouteWithModuleName(node.children[i].name);
|
1009 | if (route && route.data) {
|
1010 | try {
|
1011 | route.children = JSON5.parse(route.data);
|
1012 | }
|
1013 | catch (e) {
|
1014 | logger.error('Error during generation of routes JSON file, maybe a trailing comma or an external variable inside one route.');
|
1015 | }
|
1016 | delete route.data;
|
1017 | route.kind = 'module';
|
1018 | routesTree.children.push(route);
|
1019 | }
|
1020 | if (node.children[i].children) {
|
1021 | loopModulesParser(node.children[i]);
|
1022 | }
|
1023 | }
|
1024 | }
|
1025 | else {
|
1026 | // else routes are directly inside the module
|
1027 | var rawRoutes = _this.foundRouteWithModuleName(node.name);
|
1028 | if (rawRoutes) {
|
1029 | var routes = JSON5.parse(rawRoutes.data);
|
1030 | if (routes) {
|
1031 | var i = 0;
|
1032 | var len = routes.length;
|
1033 | var routeAddedOnce = false;
|
1034 | for (i; i < len; i++) {
|
1035 | var route = routes[i];
|
1036 | if (routes[i].component) {
|
1037 | routeAddedOnce = true;
|
1038 | routesTree.children.push({
|
1039 | kind: 'component',
|
1040 | component: routes[i].component,
|
1041 | path: routes[i].path
|
1042 | });
|
1043 | }
|
1044 | }
|
1045 | if (!routeAddedOnce) {
|
1046 | routesTree.children = routesTree.children.concat(routes);
|
1047 | }
|
1048 | }
|
1049 | }
|
1050 | }
|
1051 | };
|
1052 | var startModule = _.find(this.cleanModulesTree, { name: this.rootModule });
|
1053 | if (startModule) {
|
1054 | loopModulesParser(startModule);
|
1055 | // Loop twice for routes with lazy loading
|
1056 | // loopModulesParser(routesTree);
|
1057 | }
|
1058 | var cleanedRoutesTree = undefined;
|
1059 | var cleanRoutesTree = function (route) {
|
1060 | for (var i in route.children) {
|
1061 | var routes = route.children[i].routes;
|
1062 | }
|
1063 | return route;
|
1064 | };
|
1065 | cleanedRoutesTree = cleanRoutesTree(routesTree);
|
1066 | // Try updating routes with lazy loading
|
1067 | var loopInsideModule = function (mod, _rawModule) {
|
1068 | if (mod.children) {
|
1069 | for (var z in mod.children) {
|
1070 | var route = _this.foundRouteWithModuleName(mod.children[z].name);
|
1071 | if (typeof route !== 'undefined') {
|
1072 | if (route.data) {
|
1073 | route.children = JSON5.parse(route.data);
|
1074 | delete route.data;
|
1075 | route.kind = 'module';
|
1076 | _rawModule.children.push(route);
|
1077 | }
|
1078 | }
|
1079 | }
|
1080 | }
|
1081 | else {
|
1082 | var route = _this.foundRouteWithModuleName(mod.name);
|
1083 | if (typeof route !== 'undefined') {
|
1084 | if (route.data) {
|
1085 | route.children = JSON5.parse(route.data);
|
1086 | delete route.data;
|
1087 | route.kind = 'module';
|
1088 | _rawModule.children.push(route);
|
1089 | }
|
1090 | }
|
1091 | }
|
1092 | };
|
1093 | var loopRoutesParser = function (route) {
|
1094 | if (route.children) {
|
1095 | for (var i in route.children) {
|
1096 | if (route.children[i].loadChildren) {
|
1097 | var child = _this.foundLazyModuleWithPath(route.children[i].loadChildren);
|
1098 | var module = _.find(_this.cleanModulesTree, {
|
1099 | name: child
|
1100 | });
|
1101 | if (module) {
|
1102 | var _rawModule = {};
|
1103 | _rawModule.kind = 'module';
|
1104 | _rawModule.children = [];
|
1105 | _rawModule.module = module.name;
|
1106 | loopInsideModule(module, _rawModule);
|
1107 | route.children[i].children = [];
|
1108 | route.children[i].children.push(_rawModule);
|
1109 | }
|
1110 | }
|
1111 | loopRoutesParser(route.children[i]);
|
1112 | }
|
1113 | }
|
1114 | };
|
1115 | loopRoutesParser(cleanedRoutesTree);
|
1116 | return cleanedRoutesTree;
|
1117 | };
|
1118 | RouterParserUtil.prototype.constructModulesTree = function () {
|
1119 | var _this = this;
|
1120 | var getNestedChildren = function (arr, parent) {
|
1121 | var out = [];
|
1122 | for (var i in arr) {
|
1123 | if (arr[i].parent === parent) {
|
1124 | var children = getNestedChildren(arr, arr[i].name);
|
1125 | if (children.length) {
|
1126 | arr[i].children = children;
|
1127 | }
|
1128 | out.push(arr[i]);
|
1129 | }
|
1130 | }
|
1131 | return out;
|
1132 | };
|
1133 | // Scan each module and add parent property
|
1134 | _.forEach(this.modules, function (firstLoopModule) {
|
1135 | _.forEach(firstLoopModule.importsNode, function (importNode) {
|
1136 | _.forEach(_this.modules, function (module) {
|
1137 | if (module.name === importNode.name) {
|
1138 | module.parent = firstLoopModule.name;
|
1139 | }
|
1140 | });
|
1141 | });
|
1142 | });
|
1143 | this.modulesTree = getNestedChildren(this.modules);
|
1144 | };
|
1145 | RouterParserUtil.prototype.generateRoutesIndex = function (outputFolder, routes) {
|
1146 | var _this = this;
|
1147 | return this.fileEngine.get(__dirname + '/../src/templates/partials/routes-index.hbs').then(function (data) {
|
1148 | var template = Handlebars.compile(data);
|
1149 | var result = template({
|
1150 | routes: JSON.stringify(routes)
|
1151 | });
|
1152 | var testOutputDir = outputFolder.match(process.cwd());
|
1153 | if (testOutputDir && testOutputDir.length > 0) {
|
1154 | outputFolder = outputFolder.replace(process.cwd() + path.sep, '');
|
1155 | }
|
1156 | return _this.fileEngine.write(outputFolder + path.sep + '/js/routes/routes_index.js', result);
|
1157 | }, function (err) { return Promise.reject('Error during routes index generation'); });
|
1158 | };
|
1159 | RouterParserUtil.prototype.routesLength = function () {
|
1160 | var _n = 0;
|
1161 | var routesParser = function (route) {
|
1162 | if (typeof route.path !== 'undefined') {
|
1163 | _n += 1;
|
1164 | }
|
1165 | if (route.children) {
|
1166 | for (var j in route.children) {
|
1167 | routesParser(route.children[j]);
|
1168 | }
|
1169 | }
|
1170 | };
|
1171 | for (var i in this.routes) {
|
1172 | routesParser(this.routes[i]);
|
1173 | }
|
1174 | return _n;
|
1175 | };
|
1176 | RouterParserUtil.prototype.printRoutes = function () {
|
1177 | console.log('');
|
1178 | console.log('printRoutes: ');
|
1179 | console.log(this.routes);
|
1180 | };
|
1181 | RouterParserUtil.prototype.printModulesRoutes = function () {
|
1182 | console.log('');
|
1183 | console.log('printModulesRoutes: ');
|
1184 | console.log(this.modulesWithRoutes);
|
1185 | };
|
1186 | RouterParserUtil.prototype.isVariableRoutes = function (node) {
|
1187 | var result = false;
|
1188 | if (node.declarationList && node.declarationList.declarations) {
|
1189 | var i = 0;
|
1190 | var len = node.declarationList.declarations.length;
|
1191 | for (i; i < len; i++) {
|
1192 | if (node.declarationList.declarations[i].type) {
|
1193 | if (node.declarationList.declarations[i].type.typeName &&
|
1194 | node.declarationList.declarations[i].type.typeName.text === 'Routes') {
|
1195 | result = true;
|
1196 | }
|
1197 | }
|
1198 | }
|
1199 | }
|
1200 | return result;
|
1201 | };
|
1202 | RouterParserUtil.prototype.cleanFileIdentifiers = function (sourceFile) {
|
1203 | var _this = this;
|
1204 | var file = sourceFile;
|
1205 | var identifiers = file.getDescendantsOfKind(Ast.SyntaxKind.Identifier).filter(function (p) {
|
1206 | return (Ast.TypeGuards.isArrayLiteralExpression(p.getParentOrThrow()) ||
|
1207 | Ast.TypeGuards.isPropertyAssignment(p.getParentOrThrow()));
|
1208 | });
|
1209 | var identifiersInRoutesVariableStatement = [];
|
1210 | var _loop_1 = function (identifier) {
|
1211 | // Loop through their parents nodes, and if one is a variableStatement and === 'routes'
|
1212 | var foundParentVariableStatement = false;
|
1213 | var parent = identifier.getParentWhile(function (n) {
|
1214 | if (n.getKind() === Ast.SyntaxKind.VariableStatement) {
|
1215 | if (_this.isVariableRoutes(n.compilerNode)) {
|
1216 | foundParentVariableStatement = true;
|
1217 | }
|
1218 | }
|
1219 | return true;
|
1220 | });
|
1221 | if (foundParentVariableStatement) {
|
1222 | identifiersInRoutesVariableStatement.push(identifier);
|
1223 | }
|
1224 | };
|
1225 | for (var _i = 0, identifiers_1 = identifiers; _i < identifiers_1.length; _i++) {
|
1226 | var identifier = identifiers_1[_i];
|
1227 | _loop_1(identifier);
|
1228 | }
|
1229 | // inline the property access expressions
|
1230 | for (var _a = 0, identifiersInRoutesVariableStatement_1 = identifiersInRoutesVariableStatement; _a < identifiersInRoutesVariableStatement_1.length; _a++) {
|
1231 | var identifier = identifiersInRoutesVariableStatement_1[_a];
|
1232 | var identifierDeclaration = identifier
|
1233 | .getSymbolOrThrow()
|
1234 | .getValueDeclarationOrThrow();
|
1235 | if (!Ast.TypeGuards.isPropertyAssignment(identifierDeclaration) &&
|
1236 | Ast.TypeGuards.isVariableDeclaration(identifierDeclaration) &&
|
1237 | (Ast.TypeGuards.isPropertyAssignment(identifierDeclaration) &&
|
1238 | !Ast.TypeGuards.isVariableDeclaration(identifierDeclaration))) {
|
1239 | throw new Error("Not implemented referenced declaration kind: " + identifierDeclaration.getKindName());
|
1240 | }
|
1241 | if (Ast.TypeGuards.isVariableDeclaration(identifierDeclaration)) {
|
1242 | identifier.replaceWithText(identifierDeclaration.getInitializerOrThrow().getText());
|
1243 | }
|
1244 | }
|
1245 | return file;
|
1246 | };
|
1247 | RouterParserUtil.prototype.cleanFileSpreads = function (sourceFile) {
|
1248 | var _this = this;
|
1249 | var file = sourceFile;
|
1250 | var spreadElements = file
|
1251 | .getDescendantsOfKind(Ast.SyntaxKind.SpreadElement)
|
1252 | .filter(function (p) { return Ast.TypeGuards.isArrayLiteralExpression(p.getParentOrThrow()); });
|
1253 | var spreadElementsInRoutesVariableStatement = [];
|
1254 | var _loop_2 = function (spreadElement) {
|
1255 | // Loop through their parents nodes, and if one is a variableStatement and === 'routes'
|
1256 | var foundParentVariableStatement = false;
|
1257 | var parent = spreadElement.getParentWhile(function (n) {
|
1258 | if (n.getKind() === Ast.SyntaxKind.VariableStatement) {
|
1259 | if (_this.isVariableRoutes(n.compilerNode)) {
|
1260 | foundParentVariableStatement = true;
|
1261 | }
|
1262 | }
|
1263 | return true;
|
1264 | });
|
1265 | if (foundParentVariableStatement) {
|
1266 | spreadElementsInRoutesVariableStatement.push(spreadElement);
|
1267 | }
|
1268 | };
|
1269 | for (var _i = 0, spreadElements_1 = spreadElements; _i < spreadElements_1.length; _i++) {
|
1270 | var spreadElement = spreadElements_1[_i];
|
1271 | _loop_2(spreadElement);
|
1272 | }
|
1273 | var _loop_3 = function (spreadElement) {
|
1274 | var spreadElementIdentifier = spreadElement.getExpression().getText(), searchedImport, aliasOriginalName = '', foundWithAliasInImports = false, foundWithAlias = false;
|
1275 | // Try to find it in imports
|
1276 | var imports = file.getImportDeclarations();
|
1277 | imports.forEach(function (i) {
|
1278 | var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
|
1279 | if (namedImportsLength > 0) {
|
1280 | for (j; j < namedImportsLength; j++) {
|
1281 | var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
|
1282 | if (namedImports[j].getAliasIdentifier()) {
|
1283 | importAlias = namedImports[j].getAliasIdentifier().getText();
|
1284 | }
|
1285 | if (importName === spreadElementIdentifier) {
|
1286 | foundWithAliasInImports = true;
|
1287 | searchedImport = i;
|
1288 | break;
|
1289 | }
|
1290 | if (importAlias === spreadElementIdentifier) {
|
1291 | foundWithAliasInImports = true;
|
1292 | foundWithAlias = true;
|
1293 | aliasOriginalName = importName;
|
1294 | searchedImport = i;
|
1295 | break;
|
1296 | }
|
1297 | }
|
1298 | }
|
1299 | });
|
1300 | var referencedDeclaration = void 0;
|
1301 | if (foundWithAliasInImports) {
|
1302 | if (typeof searchedImport !== 'undefined') {
|
1303 | var importPath = path.resolve(path.dirname(file.getFilePath()) +
|
1304 | '/' +
|
1305 | searchedImport.getModuleSpecifierValue() +
|
1306 | '.ts');
|
1307 | var sourceFileImport = typeof ast$1.getSourceFile(importPath) !== 'undefined'
|
1308 | ? ast$1.getSourceFile(importPath)
|
1309 | : ast$1.addExistingSourceFile(importPath);
|
1310 | if (sourceFileImport) {
|
1311 | var variableName = foundWithAlias
|
1312 | ? aliasOriginalName
|
1313 | : spreadElementIdentifier;
|
1314 | referencedDeclaration = sourceFileImport.getVariableDeclaration(variableName);
|
1315 | }
|
1316 | }
|
1317 | }
|
1318 | else {
|
1319 | // if not, try directly in file
|
1320 | referencedDeclaration = spreadElement
|
1321 | .getExpression()
|
1322 | .getSymbolOrThrow()
|
1323 | .getValueDeclarationOrThrow();
|
1324 | }
|
1325 | if (!Ast.TypeGuards.isVariableDeclaration(referencedDeclaration)) {
|
1326 | throw new Error("Not implemented referenced declaration kind: " + referencedDeclaration.getKindName());
|
1327 | }
|
1328 | var referencedArray = referencedDeclaration.getInitializerIfKindOrThrow(Ast.SyntaxKind.ArrayLiteralExpression);
|
1329 | var spreadElementArray = spreadElement.getParentIfKindOrThrow(Ast.SyntaxKind.ArrayLiteralExpression);
|
1330 | var insertIndex = spreadElementArray.getElements().indexOf(spreadElement);
|
1331 | spreadElementArray.removeElement(spreadElement);
|
1332 | spreadElementArray.insertElements(insertIndex, referencedArray.getElements().map(function (e) { return e.getText(); }));
|
1333 | };
|
1334 | // inline the ArrayLiteralExpression SpreadElements
|
1335 | for (var _a = 0, spreadElementsInRoutesVariableStatement_1 = spreadElementsInRoutesVariableStatement; _a < spreadElementsInRoutesVariableStatement_1.length; _a++) {
|
1336 | var spreadElement = spreadElementsInRoutesVariableStatement_1[_a];
|
1337 | _loop_3(spreadElement);
|
1338 | }
|
1339 | return file;
|
1340 | };
|
1341 | RouterParserUtil.prototype.cleanFileDynamics = function (sourceFile) {
|
1342 | var _this = this;
|
1343 | var file = sourceFile;
|
1344 | var propertyAccessExpressions = file
|
1345 | .getDescendantsOfKind(Ast.SyntaxKind.PropertyAccessExpression)
|
1346 | .filter(function (p) { return !Ast.TypeGuards.isPropertyAccessExpression(p.getParentOrThrow()); });
|
1347 | var propertyAccessExpressionsInRoutesVariableStatement = [];
|
1348 | var _loop_4 = function (propertyAccessExpression) {
|
1349 | // Loop through their parents nodes, and if one is a variableStatement and === 'routes'
|
1350 | var foundParentVariableStatement = false;
|
1351 | var parent = propertyAccessExpression.getParentWhile(function (n) {
|
1352 | if (n.getKind() === Ast.SyntaxKind.VariableStatement) {
|
1353 | if (_this.isVariableRoutes(n.compilerNode)) {
|
1354 | foundParentVariableStatement = true;
|
1355 | }
|
1356 | }
|
1357 | return true;
|
1358 | });
|
1359 | if (foundParentVariableStatement) {
|
1360 | propertyAccessExpressionsInRoutesVariableStatement.push(propertyAccessExpression);
|
1361 | }
|
1362 | };
|
1363 | for (var _i = 0, propertyAccessExpressions_1 = propertyAccessExpressions; _i < propertyAccessExpressions_1.length; _i++) {
|
1364 | var propertyAccessExpression = propertyAccessExpressions_1[_i];
|
1365 | _loop_4(propertyAccessExpression);
|
1366 | }
|
1367 | // inline the property access expressions
|
1368 | for (var _a = 0, propertyAccessExpressionsInRoutesVariableStatement_1 = propertyAccessExpressionsInRoutesVariableStatement; _a < propertyAccessExpressionsInRoutesVariableStatement_1.length; _a++) {
|
1369 | var propertyAccessExpression = propertyAccessExpressionsInRoutesVariableStatement_1[_a];
|
1370 | var referencedDeclaration = propertyAccessExpression
|
1371 | .getNameNode()
|
1372 | .getSymbolOrThrow()
|
1373 | .getValueDeclarationOrThrow();
|
1374 | if (!Ast.TypeGuards.isPropertyAssignment(referencedDeclaration) &&
|
1375 | Ast.TypeGuards.isEnumMember(referencedDeclaration) &&
|
1376 | (Ast.TypeGuards.isPropertyAssignment(referencedDeclaration) &&
|
1377 | !Ast.TypeGuards.isEnumMember(referencedDeclaration))) {
|
1378 | throw new Error("Not implemented referenced declaration kind: " + referencedDeclaration.getKindName());
|
1379 | }
|
1380 | if (typeof referencedDeclaration.getInitializerOrThrow !== 'undefined') {
|
1381 | propertyAccessExpression.replaceWithText(referencedDeclaration.getInitializerOrThrow().getText());
|
1382 | }
|
1383 | }
|
1384 | return file;
|
1385 | };
|
1386 | /**
|
1387 | * replace callexpressions with string : utils.doWork() -> 'utils.doWork()' doWork() -> 'doWork()'
|
1388 | * @param sourceFile ts.SourceFile
|
1389 | */
|
1390 | RouterParserUtil.prototype.cleanCallExpressions = function (sourceFile) {
|
1391 | var file = sourceFile;
|
1392 | var variableStatements = sourceFile.getVariableDeclaration(function (v) {
|
1393 | var result = false;
|
1394 | if (typeof v.compilerNode.type !== 'undefined') {
|
1395 | result = v.compilerNode.type.typeName.text === 'Routes';
|
1396 | }
|
1397 | return result;
|
1398 | });
|
1399 | var initializer = variableStatements.getInitializer();
|
1400 | var _loop_5 = function (callExpr) {
|
1401 | if (callExpr.wasForgotten()) {
|
1402 | return "continue";
|
1403 | }
|
1404 | callExpr.replaceWithText(function (writer) { return writer.quote(callExpr.getText()); });
|
1405 | };
|
1406 | for (var _i = 0, _a = initializer.getDescendantsOfKind(Ast.SyntaxKind.CallExpression); _i < _a.length; _i++) {
|
1407 | var callExpr = _a[_i];
|
1408 | _loop_5(callExpr);
|
1409 | }
|
1410 | return file;
|
1411 | };
|
1412 | /**
|
1413 | * Clean routes definition with imported data, for example path, children, or dynamic stuff inside data
|
1414 | *
|
1415 | * const MY_ROUTES: Routes = [
|
1416 | * {
|
1417 | * path: 'home',
|
1418 | * component: HomeComponent
|
1419 | * },
|
1420 | * {
|
1421 | * path: PATHS.home,
|
1422 | * component: HomeComponent
|
1423 | * }
|
1424 | * ];
|
1425 | *
|
1426 | * The initializer is an array (ArrayLiteralExpression - 177 ), it has elements, objects (ObjectLiteralExpression - 178)
|
1427 | * with properties (PropertyAssignment - 261)
|
1428 | *
|
1429 | * For each know property (https://angular.io/api/router/Routes#description), we try to see if we have what we want
|
1430 | *
|
1431 | * Ex: path and pathMatch want a string, component a component reference.
|
1432 | *
|
1433 | * It is an imperative approach, not a generic way, parsing all the tree
|
1434 | * and find something like this which willl break JSON.stringify : MYIMPORT.path
|
1435 | *
|
1436 | * @param {ts.Node} initializer The node of routes definition
|
1437 | * @return {ts.Node} The edited node
|
1438 | */
|
1439 | RouterParserUtil.prototype.cleanRoutesDefinitionWithImport = function (initializer, node, sourceFile) {
|
1440 | var _this = this;
|
1441 | initializer.elements.forEach(function (element) {
|
1442 | element.properties.forEach(function (property) {
|
1443 | var propertyName = property.name.getText(), propertyInitializer = property.initializer;
|
1444 | switch (propertyName) {
|
1445 | case 'path':
|
1446 | case 'redirectTo':
|
1447 | case 'outlet':
|
1448 | case 'pathMatch':
|
1449 | if (propertyInitializer) {
|
1450 | if (propertyInitializer.kind !== Ast.SyntaxKind.StringLiteral) {
|
1451 | // Identifier(71) won't break parsing, but it will be better to retrive them
|
1452 | // PropertyAccessExpression(179) ex: MYIMPORT.path will break it, find it in import
|
1453 | if (propertyInitializer.kind === Ast.SyntaxKind.PropertyAccessExpression) {
|
1454 | var lastObjectLiteralAttributeName = propertyInitializer.name.getText(), firstObjectLiteralAttributeName = void 0;
|
1455 | if (propertyInitializer.expression) {
|
1456 | firstObjectLiteralAttributeName = propertyInitializer.expression.getText();
|
1457 | var result = _this.importsUtil.findPropertyValueInImportOrLocalVariables(firstObjectLiteralAttributeName +
|
1458 | '.' +
|
1459 | lastObjectLiteralAttributeName, sourceFile); // tslint:disable-line
|
1460 | if (result !== '') {
|
1461 | propertyInitializer.kind = 9;
|
1462 | propertyInitializer.text = result;
|
1463 | }
|
1464 | }
|
1465 | }
|
1466 | }
|
1467 | }
|
1468 | break;
|
1469 | }
|
1470 | });
|
1471 | });
|
1472 | return initializer;
|
1473 | };
|
1474 | return RouterParserUtil;
|
1475 | }());
|
1476 |
|
1477 | function isModuleWithProviders(node) {
|
1478 | var result = false;
|
1479 | if (node.declarationList) {
|
1480 | if (node.declarationList.declarations && node.declarationList.declarations.length > 0) {
|
1481 | var i = 0, declarations = node.declarationList.declarations, len = node.declarationList.declarations.length;
|
1482 | for (i; i < len; i++) {
|
1483 | var declaration = node.declarationList.declarations[i];
|
1484 | if (declaration.type) {
|
1485 | var type = declaration.type;
|
1486 | if (type.typeName) {
|
1487 | var text = type.typeName.getText();
|
1488 | if (text === 'ModuleWithProviders') {
|
1489 | result = true;
|
1490 | }
|
1491 | }
|
1492 | }
|
1493 | }
|
1494 | }
|
1495 | }
|
1496 | return result;
|
1497 | }
|
1498 |
|
1499 | function getModuleWithProviders(node) {
|
1500 | var result;
|
1501 | if (node.declarationList) {
|
1502 | if (node.declarationList.declarations && node.declarationList.declarations.length > 0) {
|
1503 | var i = 0, len = node.declarationList.declarations.length;
|
1504 | for (i; i < len; i++) {
|
1505 | var declaration = node.declarationList.declarations[i];
|
1506 | if (declaration.type) {
|
1507 | var type = declaration.type;
|
1508 | if (type.typeName) {
|
1509 | var text = type.typeName.getText();
|
1510 | if (text === 'ModuleWithProviders') {
|
1511 | result = declaration.initializer;
|
1512 | }
|
1513 | }
|
1514 | }
|
1515 | }
|
1516 | }
|
1517 | }
|
1518 | return result;
|
1519 | }
|
1520 |
|
1521 | var uuid = require('uuid/v4');
|
1522 |
|
1523 | function extractLeadingText(string, completeTag) {
|
1524 | var tagIndex = string.indexOf(completeTag);
|
1525 | var leadingText = undefined;
|
1526 | var leadingTextRegExp = /\[(.+?)\]/g;
|
1527 | var leadingTextInfo = leadingTextRegExp.exec(string);
|
1528 | // did we find leading text, and if so, does it immediately precede the tag?
|
1529 | while (leadingTextInfo && leadingTextInfo.length) {
|
1530 | if (leadingTextInfo.index + leadingTextInfo[0].length === tagIndex) {
|
1531 | string = string.replace(leadingTextInfo[0], '');
|
1532 | leadingText = leadingTextInfo[1];
|
1533 | break;
|
1534 | }
|
1535 | leadingTextInfo = leadingTextRegExp.exec(string);
|
1536 | }
|
1537 | return {
|
1538 | leadingText: leadingText,
|
1539 | string: string
|
1540 | };
|
1541 | }
|
1542 | function splitLinkText(text) {
|
1543 | var linkText;
|
1544 | var target;
|
1545 | var splitIndex;
|
1546 | // if a pipe is not present, we split on the first space
|
1547 | splitIndex = text.indexOf('|');
|
1548 | if (splitIndex === -1) {
|
1549 | splitIndex = text.search(/\s/);
|
1550 | }
|
1551 | if (splitIndex !== -1) {
|
1552 | linkText = text.substr(splitIndex + 1);
|
1553 | // Normalize subsequent newlines to a single space.
|
1554 | linkText = linkText.replace(/\n+/, ' ');
|
1555 | target = text.substr(0, splitIndex);
|
1556 | }
|
1557 | return {
|
1558 | linkText: linkText,
|
1559 | target: target || text
|
1560 | };
|
1561 | }
|
1562 | var LinkParser = (function () {
|
1563 | var processTheLink = function (string, tagInfo, leadingText) {
|
1564 | var leading = extractLeadingText(string, tagInfo.completeTag), linkText, split, target, stringtoReplace;
|
1565 | linkText = leadingText ? leadingText : leading.leadingText || '';
|
1566 | split = splitLinkText(tagInfo.text);
|
1567 | target = split.target;
|
1568 | if (leading.leadingText !== undefined) {
|
1569 | stringtoReplace = '[' + leading.leadingText + ']' + tagInfo.completeTag;
|
1570 | }
|
1571 | else if (typeof split.linkText !== 'undefined') {
|
1572 | stringtoReplace = tagInfo.completeTag;
|
1573 | linkText = split.linkText;
|
1574 | }
|
1575 | return string.replace(stringtoReplace, '[' + linkText + '](' + target + ')');
|
1576 | };
|
1577 | /**
|
1578 | * Convert
|
1579 | * {@link http://www.google.com|Google} or {@link https://github.com GitHub} or [Github]{@link https://github.com} to [Github](https://github.com)
|
1580 | */
|
1581 | var replaceLinkTag = function (str) {
|
1582 | if (typeof str === 'undefined') {
|
1583 | return {
|
1584 | newString: ''
|
1585 | };
|
1586 | }
|
1587 | // new RegExp('\\[((?:.|\n)+?)]\\{@link\\s+((?:.|\n)+?)\\}', 'i').exec('ee [TO DO]{@link Todo} fo') -> "[TO DO]{@link Todo}", "TO DO", "Todo"
|
1588 | // new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i').exec('ee [TODO]{@link Todo} fo') -> "{@link Todo}", "Todo"
|
1589 | var tagRegExpLight = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i'), tagRegExpFull = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i'), tagRegExp, matches, previousString;
|
1590 | tagRegExp = str.indexOf(']{') !== -1 ? tagRegExpFull : tagRegExpLight;
|
1591 | function replaceMatch(replacer, tag, match, text, linkText) {
|
1592 | var matchedTag = {
|
1593 | completeTag: match,
|
1594 | tag: tag,
|
1595 | text: text
|
1596 | };
|
1597 | if (linkText) {
|
1598 | return replacer(str, matchedTag, linkText);
|
1599 | }
|
1600 | else {
|
1601 | return replacer(str, matchedTag);
|
1602 | }
|
1603 | }
|
1604 | do {
|
1605 | matches = tagRegExp.exec(str);
|
1606 | if (matches) {
|
1607 | previousString = str;
|
1608 | if (matches.length === 2) {
|
1609 | str = replaceMatch(processTheLink, 'link', matches[0], matches[1]);
|
1610 | }
|
1611 | if (matches.length === 3) {
|
1612 | str = replaceMatch(processTheLink, 'link', matches[0], matches[2], matches[1]);
|
1613 | }
|
1614 | }
|
1615 | } while (matches && previousString !== str);
|
1616 | return {
|
1617 | newString: str
|
1618 | };
|
1619 | };
|
1620 | var _resolveLinks = function (str) {
|
1621 | return replaceLinkTag(str).newString;
|
1622 | };
|
1623 | return {
|
1624 | resolveLinks: _resolveLinks
|
1625 | };
|
1626 | })();
|
1627 |
|
1628 | var AngularLifecycleHooks;
|
1629 | (function (AngularLifecycleHooks) {
|
1630 | AngularLifecycleHooks[AngularLifecycleHooks["ngOnChanges"] = 0] = "ngOnChanges";
|
1631 | AngularLifecycleHooks[AngularLifecycleHooks["ngOnInit"] = 1] = "ngOnInit";
|
1632 | AngularLifecycleHooks[AngularLifecycleHooks["ngDoCheck"] = 2] = "ngDoCheck";
|
1633 | AngularLifecycleHooks[AngularLifecycleHooks["ngAfterContentInit"] = 3] = "ngAfterContentInit";
|
1634 | AngularLifecycleHooks[AngularLifecycleHooks["ngAfterContentChecked"] = 4] = "ngAfterContentChecked";
|
1635 | AngularLifecycleHooks[AngularLifecycleHooks["ngAfterViewInit"] = 5] = "ngAfterViewInit";
|
1636 | AngularLifecycleHooks[AngularLifecycleHooks["ngAfterViewChecked"] = 6] = "ngAfterViewChecked";
|
1637 | AngularLifecycleHooks[AngularLifecycleHooks["ngOnDestroy"] = 7] = "ngOnDestroy";
|
1638 | })(AngularLifecycleHooks || (AngularLifecycleHooks = {}));
|
1639 |
|
1640 | function kindToType(kind) {
|
1641 | var _type = '';
|
1642 | switch (kind) {
|
1643 | case Ast.SyntaxKind.StringKeyword:
|
1644 | case Ast.SyntaxKind.StringLiteral:
|
1645 | _type = 'string';
|
1646 | break;
|
1647 | case Ast.SyntaxKind.NumberKeyword:
|
1648 | case Ast.SyntaxKind.NumericLiteral:
|
1649 | _type = 'number';
|
1650 | break;
|
1651 | case Ast.SyntaxKind.ArrayType:
|
1652 | case Ast.SyntaxKind.ArrayLiteralExpression:
|
1653 | _type = '[]';
|
1654 | break;
|
1655 | case Ast.SyntaxKind.VoidKeyword:
|
1656 | _type = 'void';
|
1657 | break;
|
1658 | case Ast.SyntaxKind.FunctionType:
|
1659 | _type = 'function';
|
1660 | break;
|
1661 | case Ast.SyntaxKind.TypeLiteral:
|
1662 | _type = 'literal type';
|
1663 | break;
|
1664 | case Ast.SyntaxKind.BooleanKeyword:
|
1665 | _type = 'boolean';
|
1666 | break;
|
1667 | case Ast.SyntaxKind.AnyKeyword:
|
1668 | _type = 'any';
|
1669 | break;
|
1670 | case Ast.SyntaxKind.NullKeyword:
|
1671 | _type = 'null';
|
1672 | break;
|
1673 | case Ast.SyntaxKind.NeverKeyword:
|
1674 | _type = 'never';
|
1675 | break;
|
1676 | case Ast.SyntaxKind.UndefinedKeyword:
|
1677 | _type = 'undefined';
|
1678 | break;
|
1679 | case Ast.SyntaxKind.ObjectKeyword:
|
1680 | case Ast.SyntaxKind.ObjectLiteralExpression:
|
1681 | _type = 'object';
|
1682 | break;
|
1683 | }
|
1684 | return _type;
|
1685 | }
|
1686 |
|
1687 | var getCurrentDirectory = Ast.ts.sys.getCurrentDirectory;
|
1688 | var useCaseSensitiveFileNames = Ast.ts.sys.useCaseSensitiveFileNames;
|
1689 | var newLine = Ast.ts.sys.newLine;
|
1690 | var marked = require('marked');
|
1691 | function getNewLine() {
|
1692 | return newLine;
|
1693 | }
|
1694 | function getCanonicalFileName(fileName) {
|
1695 | return useCaseSensitiveFileNames ? fileName : fileName.toLowerCase();
|
1696 | }
|
1697 | var formatDiagnosticsHost = {
|
1698 | getCurrentDirectory: getCurrentDirectory,
|
1699 | getCanonicalFileName: getCanonicalFileName,
|
1700 | getNewLine: getNewLine
|
1701 | };
|
1702 | function markedtags(tags) {
|
1703 | var mtags = tags;
|
1704 | _.forEach(mtags, function (tag) {
|
1705 | tag.comment = marked(LinkParser.resolveLinks(tag.comment));
|
1706 | });
|
1707 | return mtags;
|
1708 | }
|
1709 | function mergeTagsAndArgs(args, jsdoctags) {
|
1710 | var margs = _.cloneDeep(args);
|
1711 | _.forEach(margs, function (arg) {
|
1712 | arg.tagName = {
|
1713 | text: 'param'
|
1714 | };
|
1715 | if (jsdoctags) {
|
1716 | _.forEach(jsdoctags, function (jsdoctag) {
|
1717 | if (jsdoctag.name && jsdoctag.name.text === arg.name) {
|
1718 | arg.tagName = jsdoctag.tagName;
|
1719 | arg.name = jsdoctag.name;
|
1720 | arg.comment = jsdoctag.comment;
|
1721 | arg.typeExpression = jsdoctag.typeExpression;
|
1722 | }
|
1723 | });
|
1724 | }
|
1725 | });
|
1726 | // Add example & returns
|
1727 | if (jsdoctags) {
|
1728 | _.forEach(jsdoctags, function (jsdoctag) {
|
1729 | if (jsdoctag.tagName && jsdoctag.tagName.text === 'example') {
|
1730 | margs.push({
|
1731 | tagName: jsdoctag.tagName,
|
1732 | comment: jsdoctag.comment
|
1733 | });
|
1734 | }
|
1735 | if (jsdoctag.tagName &&
|
1736 | (jsdoctag.tagName.text === 'returns' || jsdoctag.tagName.text === 'return')) {
|
1737 | var ret = {
|
1738 | tagName: jsdoctag.tagName,
|
1739 | comment: jsdoctag.comment
|
1740 | };
|
1741 | if (jsdoctag.typeExpression && jsdoctag.typeExpression.type) {
|
1742 | ret.returnType = kindToType(jsdoctag.typeExpression.type.kind);
|
1743 | }
|
1744 | margs.push(ret);
|
1745 | }
|
1746 | });
|
1747 | }
|
1748 | return margs;
|
1749 | }
|
1750 | function readConfig(configFile) {
|
1751 | var result = Ast.ts.readConfigFile(configFile, Ast.ts.sys.readFile);
|
1752 | if (result.error) {
|
1753 | var message = Ast.ts.formatDiagnostics([result.error], formatDiagnosticsHost);
|
1754 | throw new Error(message);
|
1755 | }
|
1756 | return result.config;
|
1757 | }
|
1758 | function stripBom(source) {
|
1759 | if (source.charCodeAt(0) === 0xfeff) {
|
1760 | return source.slice(1);
|
1761 | }
|
1762 | return source;
|
1763 | }
|
1764 | function hasBom(source) {
|
1765 | return source.charCodeAt(0) === 0xfeff;
|
1766 | }
|
1767 | function handlePath(files, cwd) {
|
1768 | var _files = files;
|
1769 | var i = 0;
|
1770 | var len = files.length;
|
1771 | for (i; i < len; i++) {
|
1772 | if (files[i].indexOf(cwd) === -1) {
|
1773 | files[i] = path.resolve(cwd + path.sep + files[i]);
|
1774 | }
|
1775 | }
|
1776 | return _files;
|
1777 | }
|
1778 | function cleanLifecycleHooksFromMethods(methods) {
|
1779 | var result = [];
|
1780 | if (typeof methods !== 'undefined') {
|
1781 | var i = 0;
|
1782 | var len = methods.length;
|
1783 | for (i; i < len; i++) {
|
1784 | if (!(methods[i].name in AngularLifecycleHooks)) {
|
1785 | result.push(methods[i]);
|
1786 | }
|
1787 | }
|
1788 | }
|
1789 | return result;
|
1790 | }
|
1791 | function cleanSourcesForWatch(list) {
|
1792 | return list.filter(function (element) {
|
1793 | if (fs.existsSync(process.cwd() + path.sep + element)) {
|
1794 | return element;
|
1795 | }
|
1796 | });
|
1797 | }
|
1798 | function getNamesCompareFn(name) {
|
1799 | /**
|
1800 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
1801 | */
|
1802 | name = name || 'name';
|
1803 | var t = function (a, b) {
|
1804 | if (a[name]) {
|
1805 | return a[name].localeCompare(b[name]);
|
1806 | }
|
1807 | else {
|
1808 | return 0;
|
1809 | }
|
1810 | };
|
1811 | return t;
|
1812 | }
|
1813 | function isIgnore(member) {
|
1814 | if (member.jsDoc) {
|
1815 | for (var _i = 0, _a = member.jsDoc; _i < _a.length; _i++) {
|
1816 | var doc = _a[_i];
|
1817 | if (doc.tags) {
|
1818 | for (var _b = 0, _c = doc.tags; _b < _c.length; _b++) {
|
1819 | var tag = _c[_b];
|
1820 | if (tag.tagName.text.indexOf('ignore') > -1) {
|
1821 | return true;
|
1822 | }
|
1823 | }
|
1824 | }
|
1825 | }
|
1826 | }
|
1827 | return false;
|
1828 | }
|
1829 | // https://tc39.github.io/ecma262/#sec-array.prototype.includes
|
1830 | if (!Array.prototype.includes) {
|
1831 | Object.defineProperty(Array.prototype, 'includes', {
|
1832 | value: function (searchElement, fromIndex) {
|
1833 | if (this == null) {
|
1834 | throw new TypeError('"this" is null or not defined');
|
1835 | }
|
1836 | // 1. Let O be ? ToObject(this value).
|
1837 | var o = Object(this);
|
1838 | // 2. Let len be ? ToLength(? Get(O, "length")).
|
1839 | var len = o.length >>> 0;
|
1840 | // 3. If len is 0, return false.
|
1841 | if (len === 0) {
|
1842 | return false;
|
1843 | }
|
1844 | // 4. Let n be ? ToInteger(fromIndex).
|
1845 | // (If fromIndex is undefined, this step produces the value 0.)
|
1846 | var n = fromIndex | 0;
|
1847 | // 5. If n ≥ 0, then
|
1848 | // a. Let k be n.
|
1849 | // 6. Else n < 0,
|
1850 | // a. Let k be len + n.
|
1851 | // b. If k < 0, let k be 0.
|
1852 | var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
|
1853 | function sameValueZero(x, y) {
|
1854 | return (x === y ||
|
1855 | (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y)));
|
1856 | }
|
1857 | // 7. Repeat, while k < len
|
1858 | while (k < len) {
|
1859 | // a. Let elementK be the result of ? Get(O, ! ToString(k)).
|
1860 | // b. If SameValueZero(searchElement, elementK) is true, return true.
|
1861 | if (sameValueZero(o[k], searchElement)) {
|
1862 | return true;
|
1863 | }
|
1864 | // c. Increase k by 1.
|
1865 | k++;
|
1866 | }
|
1867 | // 8. Return false
|
1868 | return false;
|
1869 | }
|
1870 | });
|
1871 | }
|
1872 |
|
1873 | var FunctionSignatureHelper = /** @class */ (function () {
|
1874 | function FunctionSignatureHelper(configuration, dependenciesEngine) {
|
1875 | this.configuration = configuration;
|
1876 | this.dependenciesEngine = dependenciesEngine;
|
1877 | this.angularVersionUtil = new AngularVersionUtil();
|
1878 | this.basicTypeUtil = new BasicTypeUtil();
|
1879 | }
|
1880 | FunctionSignatureHelper.prototype.handleFunction = function (arg) {
|
1881 | var _this = this;
|
1882 | if (arg.function.length === 0) {
|
1883 | return "" + arg.name + this.getOptionalString(arg) + ": () => void";
|
1884 | }
|
1885 | var argums = arg.function.map(function (argu) {
|
1886 | var _result = _this.dependenciesEngine.find(argu.type);
|
1887 | if (_result) {
|
1888 | if (_result.source === 'internal') {
|
1889 | var path$$1 = _result.data.type;
|
1890 | if (_result.data.type === 'class') {
|
1891 | path$$1 = 'classe';
|
1892 | }
|
1893 | return "" + argu.name + _this.getOptionalString(arg) + ": <a href=\"../" + path$$1 + "s/" + _result.data.name + ".html\">" + argu.type + "</a>";
|
1894 | }
|
1895 | else {
|
1896 | var path$$1 = _this.angularVersionUtil.getApiLink(_result.data, _this.configuration.mainData.angularVersion);
|
1897 | return "" + argu.name + _this.getOptionalString(arg) + ": <a href=\"" + path$$1 + "\" target=\"_blank\">" + argu.type + "</a>";
|
1898 | }
|
1899 | }
|
1900 | else if (_this.basicTypeUtil.isKnownType(argu.type)) {
|
1901 | var path$$1 = _this.basicTypeUtil.getTypeUrl(argu.type);
|
1902 | return "" + argu.name + _this.getOptionalString(arg) + ": <a href=\"" + path$$1 + "\" target=\"_blank\">" + argu.type + "</a>";
|
1903 | }
|
1904 | else {
|
1905 | if (argu.name && argu.type) {
|
1906 | return "" + argu.name + _this.getOptionalString(arg) + ": " + argu.type;
|
1907 | }
|
1908 | else {
|
1909 | return "" + argu.name.text;
|
1910 | }
|
1911 | }
|
1912 | });
|
1913 | return "" + arg.name + this.getOptionalString(arg) + ": (" + argums + ") => void";
|
1914 | };
|
1915 | FunctionSignatureHelper.prototype.getOptionalString = function (arg) {
|
1916 | return arg.optional ? '?' : '';
|
1917 | };
|
1918 | FunctionSignatureHelper.prototype.helperFunc = function (context, method) {
|
1919 | var _this = this;
|
1920 | var args = [];
|
1921 | if (method.args) {
|
1922 | args = method.args
|
1923 | .map(function (arg) {
|
1924 | var _result = _this.dependenciesEngine.find(arg.type);
|
1925 | if (_result) {
|
1926 | if (_result.source === 'internal') {
|
1927 | var path$$1 = _result.data.type;
|
1928 | if (_result.data.type === 'class') {
|
1929 | path$$1 = 'classe';
|
1930 | }
|
1931 | return "" + arg.name + _this.getOptionalString(arg) + ": <a href=\"../" + path$$1 + "s/" + _result.data.name + ".html\">" + arg.type + "</a>";
|
1932 | }
|
1933 | else {
|
1934 | var path$$1 = _this.angularVersionUtil.getApiLink(_result.data, _this.configuration.mainData.angularVersion);
|
1935 | return "" + arg.name + _this.getOptionalString(arg) + ": <a href=\"" + path$$1 + "\" target=\"_blank\">" + arg.type + "</a>";
|
1936 | }
|
1937 | }
|
1938 | else if (arg.dotDotDotToken) {
|
1939 | return "..." + arg.name + ": " + arg.type;
|
1940 | }
|
1941 | else if (arg.function) {
|
1942 | return _this.handleFunction(arg);
|
1943 | }
|
1944 | else if (_this.basicTypeUtil.isKnownType(arg.type)) {
|
1945 | var path$$1 = _this.basicTypeUtil.getTypeUrl(arg.type);
|
1946 | return "" + arg.name + _this.getOptionalString(arg) + ": <a href=\"" + path$$1 + "\" target=\"_blank\">" + arg.type + "</a>";
|
1947 | }
|
1948 | else {
|
1949 | return "" + arg.name + _this.getOptionalString(arg) + ": " + arg.type;
|
1950 | }
|
1951 | })
|
1952 | .join(', ');
|
1953 | }
|
1954 | if (method.name) {
|
1955 | return method.name + "(" + args + ")";
|
1956 | }
|
1957 | else {
|
1958 | return "(" + args + ")";
|
1959 | }
|
1960 | };
|
1961 | return FunctionSignatureHelper;
|
1962 | }());
|
1963 |
|
1964 | var IsNotToggleHelper = /** @class */ (function () {
|
1965 | function IsNotToggleHelper(configuration) {
|
1966 | this.configuration = configuration;
|
1967 | }
|
1968 | IsNotToggleHelper.prototype.helperFunc = function (context, type, options) {
|
1969 | var result = this.configuration.mainData.toggleMenuItems.indexOf(type);
|
1970 | if (this.configuration.mainData.toggleMenuItems.indexOf('all') !== -1) {
|
1971 | return options.inverse(context);
|
1972 | }
|
1973 | else if (result === -1) {
|
1974 | return options.fn(context);
|
1975 | }
|
1976 | else {
|
1977 | return options.inverse(context);
|
1978 | }
|
1979 | };
|
1980 | return IsNotToggleHelper;
|
1981 | }());
|
1982 |
|
1983 | var IsInitialTabHelper = /** @class */ (function () {
|
1984 | function IsInitialTabHelper() {
|
1985 | }
|
1986 | IsInitialTabHelper.prototype.helperFunc = function (context, tabs, tabId, options) {
|
1987 | return tabs[0].id === tabId ? options.fn(context) : options.inverse(context);
|
1988 | };
|
1989 | return IsInitialTabHelper;
|
1990 | }());
|
1991 |
|
1992 | var IsTabEnabledHelper = /** @class */ (function () {
|
1993 | function IsTabEnabledHelper() {
|
1994 | }
|
1995 | IsTabEnabledHelper.prototype.helperFunc = function (context, tabs, tabId, options) {
|
1996 | var isTabEnabled = -1 !== _.findIndex(tabs, { id: tabId });
|
1997 | return isTabEnabled ? options.fn(context) : options.inverse(context);
|
1998 | };
|
1999 | return IsTabEnabledHelper;
|
2000 | }());
|
2001 |
|
2002 | var IfStringHelper = /** @class */ (function () {
|
2003 | function IfStringHelper() {
|
2004 | }
|
2005 | IfStringHelper.prototype.helperFunc = function (context, a, options) {
|
2006 | if (typeof a === 'string') {
|
2007 | return options.fn(context);
|
2008 | }
|
2009 | return options.inverse(context);
|
2010 | };
|
2011 | return IfStringHelper;
|
2012 | }());
|
2013 |
|
2014 | var OrLengthHelper = /** @class */ (function () {
|
2015 | function OrLengthHelper() {
|
2016 | }
|
2017 | OrLengthHelper.prototype.helperFunc = function (context) {
|
2018 | var len = arguments.length - 1;
|
2019 | var options = arguments[len];
|
2020 | // We start at 1 because of options
|
2021 | for (var i = 1; i < len; i++) {
|
2022 | if (typeof arguments[i] !== 'undefined') {
|
2023 | if (Object.keys(arguments[i]).length > 0) {
|
2024 | return options.fn(context);
|
2025 | }
|
2026 | }
|
2027 | }
|
2028 | return options.inverse(context);
|
2029 | };
|
2030 | return OrLengthHelper;
|
2031 | }());
|
2032 |
|
2033 | var FilterAngular2ModulesHelper = /** @class */ (function () {
|
2034 | function FilterAngular2ModulesHelper() {
|
2035 | }
|
2036 | FilterAngular2ModulesHelper.prototype.helperFunc = function (context, text, options) {
|
2037 | var NG2_MODULES = [
|
2038 | 'BrowserModule',
|
2039 | 'FormsModule',
|
2040 | 'HttpModule',
|
2041 | 'RouterModule'
|
2042 | ];
|
2043 | var len = NG2_MODULES.length;
|
2044 | var i = 0;
|
2045 | var result = false;
|
2046 | for (i; i < len; i++) {
|
2047 | if (text.indexOf(NG2_MODULES[i]) > -1) {
|
2048 | result = true;
|
2049 | }
|
2050 | }
|
2051 | if (result) {
|
2052 | return options.fn(context);
|
2053 | }
|
2054 | else {
|
2055 | return options.inverse(context);
|
2056 | }
|
2057 | };
|
2058 | return FilterAngular2ModulesHelper;
|
2059 | }());
|
2060 |
|
2061 | var DebugHelper = /** @class */ (function () {
|
2062 | function DebugHelper() {
|
2063 | }
|
2064 | DebugHelper.prototype.helperFunc = function (context, optionalValue) {
|
2065 | console.log('Current Context');
|
2066 | console.log('====================');
|
2067 | console.log(context);
|
2068 | if (optionalValue) {
|
2069 | console.log('OptionalValue');
|
2070 | console.log('====================');
|
2071 | console.log(optionalValue);
|
2072 | }
|
2073 | };
|
2074 | return DebugHelper;
|
2075 | }());
|
2076 |
|
2077 | var BreakLinesHelper = /** @class */ (function () {
|
2078 | function BreakLinesHelper(bars) {
|
2079 | this.bars = bars;
|
2080 | }
|
2081 | BreakLinesHelper.prototype.helperFunc = function (context, text) {
|
2082 | text = this.bars.Utils.escapeExpression(text);
|
2083 | text = text.replace(/(\r\n|\n|\r)/gm, '<br>');
|
2084 | text = text.replace(/ /gm, ' ');
|
2085 | text = text.replace(/ /gm, ' ');
|
2086 | return new Handlebars.SafeString(text);
|
2087 | };
|
2088 | return BreakLinesHelper;
|
2089 | }());
|
2090 |
|
2091 | var CleanParagraphHelper = /** @class */ (function () {
|
2092 | function CleanParagraphHelper() {
|
2093 | }
|
2094 | CleanParagraphHelper.prototype.helperFunc = function (context, text) {
|
2095 | text = text.replace(/<p>/gm, '');
|
2096 | text = text.replace(/<\/p>/gm, '');
|
2097 | return new Handlebars.SafeString(text);
|
2098 | };
|
2099 | return CleanParagraphHelper;
|
2100 | }());
|
2101 |
|
2102 | var EscapeSimpleQuoteHelper = /** @class */ (function () {
|
2103 | function EscapeSimpleQuoteHelper() {
|
2104 | }
|
2105 | EscapeSimpleQuoteHelper.prototype.helperFunc = function (context, text) {
|
2106 | if (!text) {
|
2107 | return;
|
2108 | }
|
2109 | text = text.replace(/'/g, "\\'");
|
2110 | text = text.replace(/(\r\n|\n|\r)/gm, '');
|
2111 | return text;
|
2112 | };
|
2113 | return EscapeSimpleQuoteHelper;
|
2114 | }());
|
2115 |
|
2116 | var BreakCommaHelper = /** @class */ (function () {
|
2117 | function BreakCommaHelper(bars) {
|
2118 | this.bars = bars;
|
2119 | }
|
2120 | BreakCommaHelper.prototype.helperFunc = function (context, text) {
|
2121 | text = this.bars.Utils.escapeExpression(text);
|
2122 | text = text.replace(/,/g, ',<br>');
|
2123 | return new Handlebars.SafeString(text);
|
2124 | };
|
2125 | return BreakCommaHelper;
|
2126 | }());
|
2127 |
|
2128 | var ModifKindHelper = /** @class */ (function () {
|
2129 | function ModifKindHelper() {
|
2130 | }
|
2131 | /**
|
2132 | * Transform SyntaxKind into string
|
2133 | * @param {any} context Handlebars context
|
2134 | * @param {SyntaxKind[]} kind SyntaxKind concatenated
|
2135 | * @return {string} Parsed string
|
2136 | */
|
2137 | ModifKindHelper.prototype.helperFunc = function (context, kind) {
|
2138 | var _kindText = '';
|
2139 | switch (kind) {
|
2140 | case Ast.SyntaxKind.PrivateKeyword:
|
2141 | _kindText = 'Private';
|
2142 | break;
|
2143 | case Ast.SyntaxKind.ReadonlyKeyword:
|
2144 | _kindText = 'Readonly';
|
2145 | break;
|
2146 | case Ast.SyntaxKind.ProtectedKeyword:
|
2147 | _kindText = 'Protected';
|
2148 | break;
|
2149 | case Ast.SyntaxKind.PublicKeyword:
|
2150 | _kindText = 'Public';
|
2151 | break;
|
2152 | case Ast.SyntaxKind.StaticKeyword:
|
2153 | _kindText = 'Static';
|
2154 | break;
|
2155 | case Ast.SyntaxKind.AsyncKeyword:
|
2156 | _kindText = 'Async';
|
2157 | break;
|
2158 | case Ast.SyntaxKind.AbstractKeyword:
|
2159 | _kindText = 'Abstract';
|
2160 | break;
|
2161 | }
|
2162 | return new Handlebars.SafeString(_kindText);
|
2163 | };
|
2164 | return ModifKindHelper;
|
2165 | }());
|
2166 |
|
2167 | var ModifIconHelper = /** @class */ (function () {
|
2168 | function ModifIconHelper() {
|
2169 | }
|
2170 | ModifIconHelper.prototype.helperFunc = function (context, kind) {
|
2171 | var _kindText = '';
|
2172 | switch (kind) {
|
2173 | case Ast.SyntaxKind.PrivateKeyword:
|
2174 | _kindText = 'lock'; // private
|
2175 | break;
|
2176 | case Ast.SyntaxKind.ProtectedKeyword:
|
2177 | _kindText = 'lock'; // protected
|
2178 | break;
|
2179 | case Ast.SyntaxKind.StaticKeyword:
|
2180 | _kindText = 'reset'; // static
|
2181 | break;
|
2182 | case Ast.SyntaxKind.ExportKeyword:
|
2183 | _kindText = 'export'; // export
|
2184 | break;
|
2185 | default:
|
2186 | _kindText = 'reset';
|
2187 | break;
|
2188 | }
|
2189 | return _kindText;
|
2190 | };
|
2191 | return ModifIconHelper;
|
2192 | }());
|
2193 |
|
2194 | var RelativeURLHelper = /** @class */ (function () {
|
2195 | function RelativeURLHelper() {
|
2196 | }
|
2197 | RelativeURLHelper.prototype.helperFunc = function (context, currentDepth, options) {
|
2198 | switch (currentDepth) {
|
2199 | case 0:
|
2200 | return './';
|
2201 | case 1:
|
2202 | case 2:
|
2203 | case 3:
|
2204 | case 4:
|
2205 | case 5:
|
2206 | return '../'.repeat(currentDepth);
|
2207 | }
|
2208 | return '';
|
2209 | };
|
2210 | return RelativeURLHelper;
|
2211 | }());
|
2212 |
|
2213 | var JsdocReturnsCommentHelper = /** @class */ (function () {
|
2214 | function JsdocReturnsCommentHelper() {
|
2215 | }
|
2216 | JsdocReturnsCommentHelper.prototype.helperFunc = function (context, jsdocTags, options) {
|
2217 | var i = 0;
|
2218 | var len = jsdocTags.length;
|
2219 | var result;
|
2220 | for (i; i < len; i++) {
|
2221 | if (jsdocTags[i].tagName) {
|
2222 | if (jsdocTags[i].tagName.text === 'returns' || jsdocTags[i].tagName.text === 'return') {
|
2223 | result = jsdocTags[i].comment;
|
2224 | break;
|
2225 | }
|
2226 | }
|
2227 | }
|
2228 | return result;
|
2229 | };
|
2230 | return JsdocReturnsCommentHelper;
|
2231 | }());
|
2232 |
|
2233 | var JsdocCodeExampleHelper = /** @class */ (function () {
|
2234 | function JsdocCodeExampleHelper() {
|
2235 | }
|
2236 | JsdocCodeExampleHelper.prototype.cleanTag = function (comment) {
|
2237 | if (comment.charAt(0) === '*') {
|
2238 | comment = comment.substring(1, comment.length);
|
2239 | }
|
2240 | if (comment.charAt(0) === ' ') {
|
2241 | comment = comment.substring(1, comment.length);
|
2242 | }
|
2243 | if (comment.indexOf('<p>') === 0) {
|
2244 | comment = comment.substring(3, comment.length);
|
2245 | }
|
2246 | if (comment.substr(-1) === '\n') {
|
2247 | comment = comment.substring(0, comment.length - 1);
|
2248 | }
|
2249 | if (comment.substr(-4) === '</p>') {
|
2250 | comment = comment.substring(0, comment.length - 4);
|
2251 | }
|
2252 | return comment;
|
2253 | };
|
2254 | JsdocCodeExampleHelper.prototype.getHtmlEntities = function (str) {
|
2255 | return String(str).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
2256 | };
|
2257 | JsdocCodeExampleHelper.prototype.helperFunc = function (context, jsdocTags, options) {
|
2258 | var i = 0;
|
2259 | var len = jsdocTags.length;
|
2260 | var tags = [];
|
2261 | var type = 'html';
|
2262 | if (options.hash.type) {
|
2263 | type = options.hash.type;
|
2264 | }
|
2265 | for (i; i < len; i++) {
|
2266 | if (jsdocTags[i].tagName) {
|
2267 | if (jsdocTags[i].tagName.text === 'example') {
|
2268 | var tag = {};
|
2269 | if (jsdocTags[i].comment) {
|
2270 | if (jsdocTags[i].comment.indexOf('<caption>') !== -1) {
|
2271 | tag.comment = jsdocTags[i].comment.replace(/<caption>/g, '<b><i>').replace(/\/caption>/g, '/b></i>');
|
2272 | }
|
2273 | else {
|
2274 | tag.comment = "<pre class=\"line-numbers\"><code class=\"language-" + type + "\">" +
|
2275 | this.getHtmlEntities(this.cleanTag(jsdocTags[i].comment)) + "</code></pre>";
|
2276 | }
|
2277 | tags.push(tag);
|
2278 | }
|
2279 | }
|
2280 | }
|
2281 | }
|
2282 | if (tags.length > 0) {
|
2283 | context.tags = tags;
|
2284 | return options.fn(context);
|
2285 | }
|
2286 | };
|
2287 | return JsdocCodeExampleHelper;
|
2288 | }());
|
2289 |
|
2290 | var JsdocExampleHelper = /** @class */ (function () {
|
2291 | function JsdocExampleHelper() {
|
2292 | }
|
2293 | JsdocExampleHelper.prototype.helperFunc = function (context, jsdocTags, options) {
|
2294 | var i = 0;
|
2295 | var len = jsdocTags.length;
|
2296 | var tags = [];
|
2297 | for (i; i < len; i++) {
|
2298 | if (jsdocTags[i].tagName) {
|
2299 | if (jsdocTags[i].tagName.text === 'example') {
|
2300 | var tag = {};
|
2301 | if (jsdocTags[i].comment) {
|
2302 | tag.comment = jsdocTags[i].comment.replace(/<caption>/g, '<b><i>').replace(/\/caption>/g, '/b></i>');
|
2303 | }
|
2304 | tags.push(tag);
|
2305 | }
|
2306 | }
|
2307 | }
|
2308 | if (tags.length > 0) {
|
2309 | context.tags = tags;
|
2310 | return options.fn(context);
|
2311 | }
|
2312 | };
|
2313 | return JsdocExampleHelper;
|
2314 | }());
|
2315 |
|
2316 | var JsdocParamsHelper = /** @class */ (function () {
|
2317 | function JsdocParamsHelper() {
|
2318 | }
|
2319 | JsdocParamsHelper.prototype.helperFunc = function (context, jsdocTags, options) {
|
2320 | var i = 0;
|
2321 | var len = jsdocTags.length;
|
2322 | var tags = [];
|
2323 | for (i; i < len; i++) {
|
2324 | if (jsdocTags[i].tagName) {
|
2325 | if (jsdocTags[i].tagName.text === 'param') {
|
2326 | var tag = {};
|
2327 | if (jsdocTags[i].typeExpression && jsdocTags[i].typeExpression.type.kind) {
|
2328 | tag.type = kindToType(jsdocTags[i].typeExpression.type.kind);
|
2329 | }
|
2330 | if (jsdocTags[i].typeExpression && jsdocTags[i].typeExpression.type.name) {
|
2331 | tag.type = jsdocTags[i].typeExpression.type.name.text;
|
2332 | }
|
2333 | else {
|
2334 | tag.type = jsdocTags[i].type;
|
2335 | }
|
2336 | if (jsdocTags[i].comment) {
|
2337 | tag.comment = jsdocTags[i].comment;
|
2338 | }
|
2339 | if (jsdocTags[i].defaultValue) {
|
2340 | tag.defaultValue = jsdocTags[i].defaultValue;
|
2341 | }
|
2342 | if (jsdocTags[i].name) {
|
2343 | if (jsdocTags[i].name.text) {
|
2344 | tag.name = jsdocTags[i].name.text;
|
2345 | }
|
2346 | else {
|
2347 | tag.name = jsdocTags[i].name;
|
2348 | }
|
2349 | }
|
2350 | if (jsdocTags[i].optional) {
|
2351 | tag.optional = true;
|
2352 | }
|
2353 | tags.push(tag);
|
2354 | }
|
2355 | }
|
2356 | }
|
2357 | if (tags.length >= 1) {
|
2358 | context.tags = tags;
|
2359 | return options.fn(context);
|
2360 | }
|
2361 | };
|
2362 | return JsdocParamsHelper;
|
2363 | }());
|
2364 |
|
2365 | var JsdocParamsValidHelper = /** @class */ (function () {
|
2366 | function JsdocParamsValidHelper() {
|
2367 | }
|
2368 | JsdocParamsValidHelper.prototype.helperFunc = function (context, jsdocTags, options) {
|
2369 | var i = 0;
|
2370 | var len = jsdocTags.length;
|
2371 | var valid = false;
|
2372 | for (i; i < len; i++) {
|
2373 | if (jsdocTags[i].tagName) {
|
2374 | if (jsdocTags[i].tagName.text === 'param') {
|
2375 | valid = true;
|
2376 | }
|
2377 | }
|
2378 | }
|
2379 | if (valid) {
|
2380 | return options.fn(context);
|
2381 | }
|
2382 | else {
|
2383 | return options.inverse(context);
|
2384 | }
|
2385 | };
|
2386 | return JsdocParamsValidHelper;
|
2387 | }());
|
2388 |
|
2389 | var JsdocDefaultHelper = /** @class */ (function () {
|
2390 | function JsdocDefaultHelper() {
|
2391 | }
|
2392 | JsdocDefaultHelper.prototype.helperFunc = function (context, jsdocTags, options) {
|
2393 | if (jsdocTags) {
|
2394 | var i = 0;
|
2395 | var len = jsdocTags.length;
|
2396 | var tag = {};
|
2397 | var defaultValue = false;
|
2398 | for (i; i < len; i++) {
|
2399 | if (jsdocTags[i].tagName) {
|
2400 | if (jsdocTags[i].tagName.text === 'default') {
|
2401 | defaultValue = true;
|
2402 | if (jsdocTags[i].typeExpression && jsdocTags[i].typeExpression.type.name) {
|
2403 | tag.type = jsdocTags[i].typeExpression.type.name.text;
|
2404 | }
|
2405 | if (jsdocTags[i].comment) {
|
2406 | tag.comment = jsdocTags[i].comment;
|
2407 | }
|
2408 | if (jsdocTags[i].name) {
|
2409 | tag.name = jsdocTags[i].name.text;
|
2410 | }
|
2411 | }
|
2412 | }
|
2413 | }
|
2414 | if (defaultValue) {
|
2415 | context.tag = tag;
|
2416 | return options.fn(context);
|
2417 | }
|
2418 | }
|
2419 | };
|
2420 | return JsdocDefaultHelper;
|
2421 | }());
|
2422 |
|
2423 | var LinkTypeHelper = /** @class */ (function () {
|
2424 | function LinkTypeHelper(configuration, dependenciesEngine) {
|
2425 | this.configuration = configuration;
|
2426 | this.dependenciesEngine = dependenciesEngine;
|
2427 | this.angularVersionUtil = new AngularVersionUtil();
|
2428 | this.basicTypeUtil = new BasicTypeUtil();
|
2429 | }
|
2430 | LinkTypeHelper.prototype.helperFunc = function (context, name, options) {
|
2431 | var _result = this.dependenciesEngine.find(name);
|
2432 | var angularDocPrefix = this.angularVersionUtil.prefixOfficialDoc(this.configuration.mainData.angularVersion);
|
2433 | if (_result) {
|
2434 | context.type = {
|
2435 | raw: name
|
2436 | };
|
2437 | if (_result.source === 'internal') {
|
2438 | if (_result.data.type === 'class') {
|
2439 | _result.data.type = 'classe';
|
2440 | }
|
2441 | context.type.href = '../' + _result.data.type + 's/' + _result.data.name + '.html';
|
2442 | if (_result.data.type === 'miscellaneous' || (_result.data.ctype && _result.data.ctype === 'miscellaneous')) {
|
2443 | var mainpage = '';
|
2444 | switch (_result.data.subtype) {
|
2445 | case 'enum':
|
2446 | mainpage = 'enumerations';
|
2447 | break;
|
2448 | case 'function':
|
2449 | mainpage = 'functions';
|
2450 | break;
|
2451 | case 'typealias':
|
2452 | mainpage = 'typealiases';
|
2453 | break;
|
2454 | case 'variable':
|
2455 | mainpage = 'variables';
|
2456 | }
|
2457 | context.type.href = '../' + _result.data.ctype + '/' + mainpage + '.html#' + _result.data.name;
|
2458 | }
|
2459 | context.type.target = '_self';
|
2460 | }
|
2461 | else {
|
2462 | context.type.href = "https://" + angularDocPrefix + "angular.io/" + _result.data.path;
|
2463 | context.type.target = '_blank';
|
2464 | }
|
2465 | return options.fn(context);
|
2466 | }
|
2467 | else if (this.basicTypeUtil.isKnownType(name)) {
|
2468 | context.type = {
|
2469 | raw: name
|
2470 | };
|
2471 | context.type.target = '_blank';
|
2472 | context.type.href = this.basicTypeUtil.getTypeUrl(name);
|
2473 | return options.fn(context);
|
2474 | }
|
2475 | else {
|
2476 | return options.inverse(context);
|
2477 | }
|
2478 | };
|
2479 | return LinkTypeHelper;
|
2480 | }());
|
2481 |
|
2482 | var IndexableSignatureHelper = /** @class */ (function () {
|
2483 | function IndexableSignatureHelper() {
|
2484 | }
|
2485 | IndexableSignatureHelper.prototype.helperFunc = function (context, method) {
|
2486 | var args = method.args.map(function (arg) { return arg.name + ": " + arg.type; }).join(', ');
|
2487 | if (method.name) {
|
2488 | return method.name + "[" + args + "]";
|
2489 | }
|
2490 | else {
|
2491 | return "[" + args + "]";
|
2492 | }
|
2493 | };
|
2494 | return IndexableSignatureHelper;
|
2495 | }());
|
2496 |
|
2497 | var ObjectHelper = /** @class */ (function () {
|
2498 | function ObjectHelper() {
|
2499 | }
|
2500 | ObjectHelper.prototype.helperFunc = function (context, text) {
|
2501 | text = JSON.stringify(text);
|
2502 | text = text.replace(/{"/, '{<br> "');
|
2503 | text = text.replace(/,"/, ',<br> "');
|
2504 | text = text.replace(/}$/, '<br>}');
|
2505 | return new Handlebars.SafeString(text);
|
2506 | };
|
2507 | return ObjectHelper;
|
2508 | }());
|
2509 |
|
2510 | var ObjectLengthHelper = /** @class */ (function () {
|
2511 | function ObjectLengthHelper() {
|
2512 | }
|
2513 | ObjectLengthHelper.prototype.helperFunc = function (context, obj, operator, length) {
|
2514 | var len = arguments.length - 1;
|
2515 | var options = arguments[len];
|
2516 | if (typeof obj !== 'object') {
|
2517 | return options.inverse(context);
|
2518 | }
|
2519 | var size = 0, key;
|
2520 | for (key in obj) {
|
2521 | if (obj.hasOwnProperty(key)) {
|
2522 | size++;
|
2523 | }
|
2524 | }
|
2525 | var result;
|
2526 | switch (operator) {
|
2527 | case '===':
|
2528 | result = size === length;
|
2529 | break;
|
2530 | case '!==':
|
2531 | result = size !== length;
|
2532 | break;
|
2533 | case '>':
|
2534 | result = size > length;
|
2535 | break;
|
2536 | default: {
|
2537 | throw new Error('helper {{objectLength}}: invalid operator: `' + operator + '`');
|
2538 | }
|
2539 | }
|
2540 | if (result === false) {
|
2541 | return options.inverse(context);
|
2542 | }
|
2543 | return options.fn(context);
|
2544 | };
|
2545 | return ObjectLengthHelper;
|
2546 | }());
|
2547 |
|
2548 | var ParseDescriptionHelper = /** @class */ (function () {
|
2549 | function ParseDescriptionHelper(dependenciesEngine) {
|
2550 | this.dependenciesEngine = dependenciesEngine;
|
2551 | }
|
2552 | ParseDescriptionHelper.prototype.helperFunc = function (context, description, depth) {
|
2553 | var _this = this;
|
2554 | var tagRegExpLight = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i');
|
2555 | var tagRegExpFull = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i');
|
2556 | var tagRegExp;
|
2557 | var matches;
|
2558 | var previousString;
|
2559 | tagRegExp = description.indexOf(']{') !== -1 ? tagRegExpFull : tagRegExpLight;
|
2560 | var processTheLink = function (originalDescription, matchedTag, leadingText) {
|
2561 | var leading = extractLeadingText(originalDescription, matchedTag.completeTag);
|
2562 | var split;
|
2563 | var resultInCompodoc;
|
2564 | var newLink;
|
2565 | var rootPath;
|
2566 | var stringtoReplace;
|
2567 | var anchor = '';
|
2568 | var label;
|
2569 | var pageName;
|
2570 | split = splitLinkText(matchedTag.text);
|
2571 | if (typeof split.linkText !== 'undefined') {
|
2572 | resultInCompodoc = _this.dependenciesEngine.findInCompodoc(split.target);
|
2573 | }
|
2574 | else {
|
2575 | var info = matchedTag.text;
|
2576 | if (matchedTag.text.indexOf('#') !== -1) {
|
2577 | anchor = matchedTag.text.substr(matchedTag.text.indexOf('#'), matchedTag.text.length);
|
2578 | info = matchedTag.text.substr(0, matchedTag.text.indexOf('#'));
|
2579 | }
|
2580 | resultInCompodoc = _this.dependenciesEngine.findInCompodoc(info);
|
2581 | }
|
2582 | if (resultInCompodoc) {
|
2583 | label = resultInCompodoc.name;
|
2584 | pageName = resultInCompodoc.name;
|
2585 | if (leadingText) {
|
2586 | stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
|
2587 | }
|
2588 | else if (leading.leadingText !== undefined) {
|
2589 | stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
|
2590 | }
|
2591 | else if (typeof split.linkText !== 'undefined') {
|
2592 | stringtoReplace = matchedTag.completeTag;
|
2593 | }
|
2594 | else {
|
2595 | stringtoReplace = matchedTag.completeTag;
|
2596 | }
|
2597 | if (resultInCompodoc.type === 'class') {
|
2598 | resultInCompodoc.type = 'classe';
|
2599 | }
|
2600 | else if (resultInCompodoc.type === 'miscellaneous' ||
|
2601 | (resultInCompodoc.ctype && resultInCompodoc.ctype === 'miscellaneous')) {
|
2602 | resultInCompodoc.type = 'miscellaneou';
|
2603 | label = resultInCompodoc.name;
|
2604 | anchor = '#' + resultInCompodoc.name;
|
2605 | if (resultInCompodoc.subtype === 'enum') {
|
2606 | pageName = 'enumerations';
|
2607 | }
|
2608 | else if (resultInCompodoc.subtype === 'function') {
|
2609 | pageName = 'functions';
|
2610 | }
|
2611 | else if (resultInCompodoc.subtype === 'typealias') {
|
2612 | pageName = 'typealiases';
|
2613 | }
|
2614 | else if (resultInCompodoc.subtype === 'variable') {
|
2615 | pageName = 'variables';
|
2616 | }
|
2617 | }
|
2618 | rootPath = '';
|
2619 | switch (depth) {
|
2620 | case 0:
|
2621 | rootPath = './';
|
2622 | break;
|
2623 | case 1:
|
2624 | case 2:
|
2625 | case 3:
|
2626 | case 4:
|
2627 | case 5:
|
2628 | rootPath = '../'.repeat(depth);
|
2629 | break;
|
2630 | }
|
2631 | if (leading.leadingText !== undefined) {
|
2632 | label = leading.leadingText;
|
2633 | }
|
2634 | if (typeof split.linkText !== 'undefined') {
|
2635 | label = split.linkText;
|
2636 | }
|
2637 | newLink = "<a href=\"" + rootPath + resultInCompodoc.type + "s/" + pageName + ".html" + anchor + "\">" + label + "</a>";
|
2638 | return originalDescription.replace(stringtoReplace, newLink);
|
2639 | }
|
2640 | else if (!resultInCompodoc && typeof split.linkText !== 'undefined') {
|
2641 | newLink = "<a href=\"" + split.target + "\">" + split.linkText + "</a>";
|
2642 | if (leadingText) {
|
2643 | stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
|
2644 | }
|
2645 | else if (leading.leadingText !== undefined) {
|
2646 | stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
|
2647 | }
|
2648 | else if (typeof split.linkText !== 'undefined') {
|
2649 | stringtoReplace = matchedTag.completeTag;
|
2650 | }
|
2651 | else {
|
2652 | stringtoReplace = matchedTag.completeTag;
|
2653 | }
|
2654 | return originalDescription.replace(stringtoReplace, newLink);
|
2655 | }
|
2656 | else if (!resultInCompodoc && leading && typeof leading.leadingText !== 'undefined') {
|
2657 | newLink = "<a href=\"" + split.target + "\">" + leading.leadingText + "</a>";
|
2658 | if (leadingText) {
|
2659 | stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
|
2660 | }
|
2661 | else if (leading.leadingText !== undefined) {
|
2662 | stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
|
2663 | }
|
2664 | else if (typeof split.linkText !== 'undefined') {
|
2665 | stringtoReplace = matchedTag.completeTag;
|
2666 | }
|
2667 | else {
|
2668 | stringtoReplace = matchedTag.completeTag;
|
2669 | }
|
2670 | return originalDescription.replace(stringtoReplace, newLink);
|
2671 | }
|
2672 | else if (!resultInCompodoc && typeof split.linkText === 'undefined') {
|
2673 | newLink = "<a href=\"" + split.target + "\">" + split.target + "</a>";
|
2674 | if (leadingText) {
|
2675 | stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
|
2676 | }
|
2677 | else if (leading.leadingText !== undefined) {
|
2678 | stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
|
2679 | }
|
2680 | else {
|
2681 | stringtoReplace = matchedTag.completeTag;
|
2682 | }
|
2683 | return originalDescription.replace(stringtoReplace, newLink);
|
2684 | }
|
2685 | else {
|
2686 | return originalDescription;
|
2687 | }
|
2688 | };
|
2689 | function replaceMatch(replacer, tag, match, text, linkText) {
|
2690 | var matchedTag = {
|
2691 | completeTag: match,
|
2692 | tag: tag,
|
2693 | text: text
|
2694 | };
|
2695 | if (linkText) {
|
2696 | return replacer(description, matchedTag, linkText);
|
2697 | }
|
2698 | else {
|
2699 | return replacer(description, matchedTag);
|
2700 | }
|
2701 | }
|
2702 | // Clean description for marked a tag parsed too early
|
2703 | if (description.indexOf('href=') !== -1) {
|
2704 | var insideMarkedATagResults = description.match(/<a [^>]+>([^<]+)<\/a>/g);
|
2705 | if (insideMarkedATagResults && insideMarkedATagResults.length > 0) {
|
2706 | for (var i = 0; i < insideMarkedATagResults.length; i++) {
|
2707 | var markedATagRegExp = new RegExp('<a [^>]+>([^<]+)</a>', 'gm');
|
2708 | var parsedATag = markedATagRegExp.exec(description);
|
2709 | if (parsedATag && parsedATag.length === 2) {
|
2710 | var insideMarkedATag = parsedATag[1];
|
2711 | description = description.replace("{@link <a href=\"" + encodeURI(insideMarkedATag) + "\">" + insideMarkedATag + "</a>", "{@link " + insideMarkedATag);
|
2712 | }
|
2713 | }
|
2714 | }
|
2715 | }
|
2716 | do {
|
2717 | matches = tagRegExp.exec(description);
|
2718 | // Did we have {@link ?
|
2719 | if (matches) {
|
2720 | previousString = description;
|
2721 | if (matches.length === 2) {
|
2722 | description = replaceMatch(processTheLink, 'link', matches[0], matches[1]);
|
2723 | }
|
2724 | if (matches.length === 3) {
|
2725 | description = replaceMatch(processTheLink, 'link', matches[0], matches[2], matches[1]);
|
2726 | }
|
2727 | }
|
2728 | } while (matches && previousString !== description);
|
2729 | return description;
|
2730 | };
|
2731 | return ParseDescriptionHelper;
|
2732 | }());
|
2733 |
|
2734 | var OneParameterHasHelper = /** @class */ (function () {
|
2735 | function OneParameterHasHelper() {
|
2736 | }
|
2737 | OneParameterHasHelper.prototype.helperFunc = function (context, tags, typeToCheck) {
|
2738 | var result = false;
|
2739 | var len = arguments.length - 1;
|
2740 | var options = arguments[len];
|
2741 | var i = 0, leng = tags.length;
|
2742 | for (i; i < leng; i++) {
|
2743 | if (typeof tags[i][typeToCheck] !== 'undefined' && tags[i][typeToCheck] !== '') {
|
2744 | result = true;
|
2745 | }
|
2746 | }
|
2747 | if (result) {
|
2748 | return options.fn(context);
|
2749 | }
|
2750 | else {
|
2751 | return options.inverse(context);
|
2752 | }
|
2753 | };
|
2754 | return OneParameterHasHelper;
|
2755 | }());
|
2756 |
|
2757 | var ElementAloneHelper = /** @class */ (function () {
|
2758 | function ElementAloneHelper(dependenciesEngine) {
|
2759 | this.dependenciesEngine = dependenciesEngine;
|
2760 | }
|
2761 | ElementAloneHelper.prototype.helperFunc = function (context, elements, elementType, options) {
|
2762 | var alones = [];
|
2763 | var modules = this.dependenciesEngine.modules;
|
2764 | elements.forEach(function (element) {
|
2765 | var foundInOneModule = false;
|
2766 | modules.forEach(function (module) {
|
2767 | module.declarations.forEach(function (declaration) {
|
2768 | if (declaration.id === element.id) {
|
2769 | foundInOneModule = true;
|
2770 | }
|
2771 | if (declaration.file === element.file) {
|
2772 | foundInOneModule = true;
|
2773 | }
|
2774 | });
|
2775 | module.controllers.forEach(function (controller) {
|
2776 | if (controller.id === element.id) {
|
2777 | foundInOneModule = true;
|
2778 | }
|
2779 | if (controller.file === element.file) {
|
2780 | foundInOneModule = true;
|
2781 | }
|
2782 | });
|
2783 | module.providers.forEach(function (provider) {
|
2784 | if (provider.id === element.id) {
|
2785 | foundInOneModule = true;
|
2786 | }
|
2787 | if (provider.file === element.file) {
|
2788 | foundInOneModule = true;
|
2789 | }
|
2790 | });
|
2791 | });
|
2792 | if (!foundInOneModule) {
|
2793 | alones.push(element);
|
2794 | }
|
2795 | });
|
2796 | if (alones.length > 0) {
|
2797 | switch (elementType) {
|
2798 | case 'component':
|
2799 | context.components = alones;
|
2800 | break;
|
2801 | case 'directive':
|
2802 | context.directives = alones;
|
2803 | break;
|
2804 | case 'controller':
|
2805 | context.controllers = alones;
|
2806 | break;
|
2807 | case 'injectable':
|
2808 | context.injectables = alones;
|
2809 | break;
|
2810 | case 'pipe':
|
2811 | context.pipes = alones;
|
2812 | break;
|
2813 | }
|
2814 | return options.fn(context);
|
2815 | }
|
2816 | };
|
2817 | return ElementAloneHelper;
|
2818 | }());
|
2819 |
|
2820 | var HasOwnHelper = /** @class */ (function () {
|
2821 | function HasOwnHelper() {
|
2822 | }
|
2823 | HasOwnHelper.prototype.helperFunc = function (context, entity, key, options) {
|
2824 | if (Object.hasOwnProperty.call(entity, key)) {
|
2825 | return options.fn(context);
|
2826 | }
|
2827 | else {
|
2828 | return options.inverse(context);
|
2829 | }
|
2830 | };
|
2831 | return HasOwnHelper;
|
2832 | }());
|
2833 |
|
2834 | var ShortURLHelper = /** @class */ (function () {
|
2835 | function ShortURLHelper() {
|
2836 | }
|
2837 | ShortURLHelper.prototype.helperFunc = function (context, url, options) {
|
2838 | var newUrl = url;
|
2839 | var firstIndexOfSlash = newUrl.indexOf('/');
|
2840 | var lastIndexOfSlash = newUrl.lastIndexOf('/');
|
2841 | if (firstIndexOfSlash !== -1 || lastIndexOfSlash !== -1) {
|
2842 | newUrl = newUrl.substr(0, firstIndexOfSlash + 1) + '...' + newUrl.substr(lastIndexOfSlash, newUrl.length);
|
2843 | }
|
2844 | return newUrl;
|
2845 | };
|
2846 | return ShortURLHelper;
|
2847 | }());
|
2848 |
|
2849 | var TRANSLATION_EN_US = {
|
2850 | accessors: 'Accessors',
|
2851 | arguments: 'Arguments',
|
2852 | bootstrap: 'Bootstrap',
|
2853 | branches: 'Branches',
|
2854 | browse: 'Browse',
|
2855 | classe: 'Class',
|
2856 | classes: 'Classes',
|
2857 | component: 'Component',
|
2858 | components: 'Components',
|
2859 | constructor: 'Constructor',
|
2860 | controllers: 'Controllers',
|
2861 | controller: 'Controller',
|
2862 | 'coverage-page-title': 'Documentation coverage',
|
2863 | declarations: 'Declarations',
|
2864 | decorators: 'Decorators',
|
2865 | 'default-value': 'Default value',
|
2866 | 'defined-in': 'Defined in',
|
2867 | dependencies: 'Dependencies',
|
2868 | description: 'Description',
|
2869 | directive: 'Directive',
|
2870 | directives: 'Directives',
|
2871 | entrycomponents: 'EntryComponents',
|
2872 | enumerations: 'Enumerations',
|
2873 | enums: 'Enums',
|
2874 | example: 'Example',
|
2875 | exports: 'Exports',
|
2876 | extends: 'Extends',
|
2877 | file: 'File',
|
2878 | functions: 'Functions',
|
2879 | 'generated-using': 'Documentation generated using',
|
2880 | 'getting-started': 'Getting started',
|
2881 | guard: 'Guard',
|
2882 | guards: 'Guards',
|
2883 | hostbindings: 'HostBindings',
|
2884 | hostlisteners: 'HostListeners',
|
2885 | 'html-element': 'Html element',
|
2886 | 'html-element-with-directive': 'Html element with directive',
|
2887 | identifier: 'Identifier',
|
2888 | implements: 'Implements',
|
2889 | imports: 'Imports',
|
2890 | index: 'Index',
|
2891 | indexable: 'Indexable',
|
2892 | 'inherited-from': 'Inherited from',
|
2893 | injectable: 'Injectable',
|
2894 | injectables: 'Injectables',
|
2895 | inputs: 'Inputs',
|
2896 | interceptors: 'Interceptors',
|
2897 | interface: 'Interface',
|
2898 | interfaces: 'Interfaces',
|
2899 | legend: 'Legend',
|
2900 | license: 'License',
|
2901 | lines: 'Lines',
|
2902 | metadata: 'Metadata',
|
2903 | methods: 'Methods',
|
2904 | miscellaneous: 'Miscellaneous',
|
2905 | module: 'Module',
|
2906 | modules: 'Modules',
|
2907 | name: 'Name',
|
2908 | no: 'No',
|
2909 | 'no-graph': 'No graph available.',
|
2910 | 'no-iframe': 'Your browser does not support iframes.',
|
2911 | 'no-result-matching': 'No results matching',
|
2912 | 'no-svg': 'Your browser does not support SVG',
|
2913 | optional: 'Optional',
|
2914 | outputs: 'Outputs',
|
2915 | overview: 'Overview',
|
2916 | parameters: 'Parameters',
|
2917 | 'peer-dependencies': 'Peer dependencies',
|
2918 | pipe: 'Pipe',
|
2919 | pipes: 'Pipes',
|
2920 | prefix: 'Prefix',
|
2921 | properties: 'Properties',
|
2922 | providers: 'Providers',
|
2923 | pure: 'Pure',
|
2924 | readme: 'README',
|
2925 | reset: 'Reset',
|
2926 | 'results-matching': 'results matching',
|
2927 | returns: 'Returns',
|
2928 | route: 'Route',
|
2929 | routes: 'Routes',
|
2930 | schemas: 'Schemas',
|
2931 | 'search-placeholder': 'Type to search',
|
2932 | selector: 'Selector',
|
2933 | signature: 'Signature',
|
2934 | statements: 'Statements',
|
2935 | type: 'Type',
|
2936 | 'type-aliases': 'Type aliases',
|
2937 | 'type-parameters': 'Type parameters',
|
2938 | types: 'Types',
|
2939 | 'unamed-property': 'Unamed property',
|
2940 | 'unit-test-coverage': 'Unit test coverage',
|
2941 | value: 'Value',
|
2942 | variables: 'Variables',
|
2943 | yes: 'Yes',
|
2944 | zoomin: 'Zoom in',
|
2945 | zoomout: 'Zoom out'
|
2946 | };
|
2947 |
|
2948 | var TRANSLATION_FR_FR = {
|
2949 | accessors: 'Accesseurs',
|
2950 | arguments: 'Arguments',
|
2951 | bootstrap: 'Bootstrap',
|
2952 | branches: 'Branches',
|
2953 | browse: 'Parcourir',
|
2954 | classe: 'Class',
|
2955 | classes: 'Classes',
|
2956 | component: 'Composant',
|
2957 | components: 'Composants',
|
2958 | constructor: 'Constructeur',
|
2959 | controllers: 'Contrôleurs',
|
2960 | controller: 'Contrôleur',
|
2961 | 'coverage-page-title': 'Couverture de documentation',
|
2962 | declarations: 'Déclarations',
|
2963 | decorators: 'Décorateurs',
|
2964 | 'default-value': 'Valeur par défaut',
|
2965 | 'defined-in': 'Défini dans',
|
2966 | dependencies: 'Dépendances',
|
2967 | description: 'Description',
|
2968 | directive: 'Directive',
|
2969 | directives: 'Directives',
|
2970 | entrycomponents: "Composants d'entrée",
|
2971 | enumerations: 'Enumérations',
|
2972 | enums: 'Enumérations',
|
2973 | example: 'Example',
|
2974 | exports: 'Exports',
|
2975 | extends: 'Etend',
|
2976 | file: 'Fichier',
|
2977 | functions: 'Fonctions',
|
2978 | 'generated-using': 'Documentation générée avec',
|
2979 | 'getting-started': 'Démarrage',
|
2980 | guard: 'Garde',
|
2981 | guards: 'Gardes',
|
2982 | hostbindings: 'HostBindings',
|
2983 | hostlisteners: 'HostListeners',
|
2984 | 'html-element': 'Elément Html',
|
2985 | 'html-element-with-directive': 'Elément Html avec une directive',
|
2986 | identifier: 'Identifiant',
|
2987 | implements: 'Implémente',
|
2988 | imports: 'Imports',
|
2989 | index: 'Index',
|
2990 | indexable: 'Indexable',
|
2991 | 'inherited-from': 'Hérité de',
|
2992 | injectable: 'Injectable',
|
2993 | injectables: 'Injectables',
|
2994 | inputs: 'Entrées',
|
2995 | interceptors: 'Intercepteurs',
|
2996 | interface: 'Interface',
|
2997 | interfaces: 'Interfaces',
|
2998 | legend: 'Légende',
|
2999 | license: 'License',
|
3000 | lines: 'Lignes',
|
3001 | metadata: 'Métadonnées',
|
3002 | methods: 'Méthodes',
|
3003 | miscellaneous: 'Divers',
|
3004 | module: 'Module',
|
3005 | modules: 'Modules',
|
3006 | name: 'Nom',
|
3007 | no: 'Non',
|
3008 | 'no-graph': 'Aucun graphique disponible.',
|
3009 | 'no-iframe': 'Votre navigateur ne supporte pas les iframes.',
|
3010 | 'no-result-matching': 'Aucun résultat matchant',
|
3011 | 'no-svg': 'Votre navigateur ne supporte pas le SVG',
|
3012 | optional: 'Optionnel',
|
3013 | outputs: 'Sorties',
|
3014 | overview: "Vue d'ensemble",
|
3015 | parameters: 'Paramètres',
|
3016 | 'peer-dependencies': 'Dépendances de pair',
|
3017 | pipe: 'Pipe',
|
3018 | pipes: 'Pipes',
|
3019 | prefix: 'Préfixe',
|
3020 | properties: 'Propriétés',
|
3021 | providers: 'Providers',
|
3022 | pure: 'Pure',
|
3023 | readme: 'README',
|
3024 | reset: 'Remise à zéro',
|
3025 | 'results-matching': 'résultats matchant',
|
3026 | returns: 'Renvoie',
|
3027 | route: 'Route',
|
3028 | routes: 'Routes',
|
3029 | schemas: 'Schémas',
|
3030 | 'search-placeholder': 'Saisissez un texte',
|
3031 | selector: 'Sélecteur',
|
3032 | signature: 'Signature',
|
3033 | statements: 'Déclarations',
|
3034 | type: 'Type',
|
3035 | 'type-aliases': 'Alias de type',
|
3036 | 'type-parameters': 'Paramètres de type',
|
3037 | types: 'Types',
|
3038 | 'unamed-property': 'Propriété non nommée',
|
3039 | 'unit-test-coverage': 'Couverture de test unitaire',
|
3040 | value: 'Valeur',
|
3041 | variables: 'Variables',
|
3042 | yes: 'Oui',
|
3043 | zoomin: 'Zoom avant',
|
3044 | zoomout: 'Zoom arrière'
|
3045 | };
|
3046 |
|
3047 | var TRANSLATION_ZH_CN = {
|
3048 | accessors: '存取器',
|
3049 | arguments: 'Arguments',
|
3050 | bootstrap: '根组件',
|
3051 | branches: '分支',
|
3052 | browse: '浏览',
|
3053 | classe: '类',
|
3054 | classes: '类列表',
|
3055 | component: '组件',
|
3056 | components: '组件列表',
|
3057 | constructor: '构造方法',
|
3058 | controllers: 'Controllers',
|
3059 | controller: 'Controller',
|
3060 | 'coverage-page-title': '文档概览',
|
3061 | declarations: '可声明对象列表',
|
3062 | decorators: '装饰器列表',
|
3063 | 'default-value': '缺省值',
|
3064 | 'defined-in': '被定义在',
|
3065 | dependencies: '依赖项',
|
3066 | description: '描述',
|
3067 | directive: '指令',
|
3068 | directives: '指令列表',
|
3069 | entrycomponents: '入口组件列表',
|
3070 | enumerations: '列举',
|
3071 | enums: '枚举列表',
|
3072 | example: '例子',
|
3073 | exports: '导出',
|
3074 | extends: '继承',
|
3075 | file: '文件',
|
3076 | functions: '函数',
|
3077 | 'generated-using': 'Documentation generated using',
|
3078 | 'getting-started': '入门指南',
|
3079 | guard: '路由守卫',
|
3080 | guards: '路由守卫列表',
|
3081 | hostbindings: '宿主绑定',
|
3082 | hostlisteners: '宿主监听',
|
3083 | 'html-element': 'Html 元素',
|
3084 | 'html-element-with-directive': '带指令的Html元素',
|
3085 | identifier: 'Identifier',
|
3086 | implements: '实现',
|
3087 | imports: '引入',
|
3088 | index: '索引',
|
3089 | indexable: 'Indexable',
|
3090 | 'inherited-from': '继承自',
|
3091 | injectable: '可注入的',
|
3092 | injectables: '可注入的',
|
3093 | inputs: 'Inputs',
|
3094 | interceptors: '拦截器',
|
3095 | interface: '接口',
|
3096 | interfaces: '接口',
|
3097 | legend: 'Legend',
|
3098 | license: '许可协议',
|
3099 | lines: 'Lines',
|
3100 | metadata: '元数据',
|
3101 | methods: '方法',
|
3102 | miscellaneous: '其他',
|
3103 | module: '模块',
|
3104 | modules: '模块',
|
3105 | name: '名称',
|
3106 | no: '否',
|
3107 | 'no-graph': '无图表显示',
|
3108 | 'no-iframe': '你的浏览器不支持iframes',
|
3109 | 'no-result-matching': '无匹配的结果',
|
3110 | 'no-svg': '你的浏览器不支持SVG',
|
3111 | optional: 'Optional',
|
3112 | outputs: '输出',
|
3113 | overview: '概述',
|
3114 | parameters: '参数列表',
|
3115 | 'peer-dependencies': '同级依赖',
|
3116 | pipe: '管道',
|
3117 | pipes: '管道列表',
|
3118 | prefix: '字首',
|
3119 | properties: '属性列表',
|
3120 | providers: '提供商列表',
|
3121 | pure: 'Pure',
|
3122 | readme: '手册',
|
3123 | reset: '重置',
|
3124 | 'results-matching': '匹配的结果',
|
3125 | returns: '返回',
|
3126 | route: '路由',
|
3127 | routes: '路由列表',
|
3128 | schemas: '模式',
|
3129 | 'search-placeholder': '请输入查询关键字',
|
3130 | selector: '选择器',
|
3131 | signature: '签名',
|
3132 | statements: '声明',
|
3133 | type: '类型',
|
3134 | 'type-aliases': '类型别名',
|
3135 | 'type-parameters': '类型参数',
|
3136 | types: '类型',
|
3137 | 'unamed-property': '未命名属性',
|
3138 | 'unit-test-coverage': '单元测试概览',
|
3139 | value: '值',
|
3140 | variables: '变量',
|
3141 | yes: '是',
|
3142 | zoomin: '放大',
|
3143 | zoomout: '缩小'
|
3144 | };
|
3145 |
|
3146 | var I18nEngine = /** @class */ (function () {
|
3147 | function I18nEngine() {
|
3148 | this.availablesLanguages = {
|
3149 | 'en-US': 'en-US',
|
3150 | 'fr-FR': 'fr-FR',
|
3151 | 'zh-CN': 'zh-CN'
|
3152 | };
|
3153 | this.fallbackLanguage = 'en-US';
|
3154 | }
|
3155 | I18nEngine.prototype.init = function (language) {
|
3156 | i18next.init({
|
3157 | lng: language,
|
3158 | fallbackLng: this.fallbackLanguage
|
3159 | });
|
3160 | i18next.addResources('en-US', 'translation', TRANSLATION_EN_US);
|
3161 | i18next.addResources('fr-FR', 'translation', TRANSLATION_FR_FR);
|
3162 | i18next.addResources('zh-CN', 'translation', TRANSLATION_ZH_CN);
|
3163 | };
|
3164 | I18nEngine.prototype.translate = function (key) {
|
3165 | return i18next.t(key);
|
3166 | };
|
3167 | I18nEngine.prototype.supportLanguage = function (language) {
|
3168 | return typeof this.availablesLanguages[language] !== 'undefined';
|
3169 | };
|
3170 | return I18nEngine;
|
3171 | }());
|
3172 | var I18nEngineInstance = new I18nEngine();
|
3173 |
|
3174 | var I18nHelper = /** @class */ (function () {
|
3175 | function I18nHelper() {
|
3176 | }
|
3177 | I18nHelper.prototype.helperFunc = function (context, i18n_key, options) {
|
3178 | var result = I18nEngineInstance.translate(i18n_key);
|
3179 | return new Handlebars.SafeString(result);
|
3180 | };
|
3181 | return I18nHelper;
|
3182 | }());
|
3183 |
|
3184 | var HtmlEngineHelpers = /** @class */ (function () {
|
3185 | function HtmlEngineHelpers() {
|
3186 | }
|
3187 | HtmlEngineHelpers.prototype.registerHelpers = function (bars, configuration, dependenciesEngine) {
|
3188 | this.registerHelper(bars, 'compare', new CompareHelper());
|
3189 | this.registerHelper(bars, 'or', new OrHelper());
|
3190 | this.registerHelper(bars, 'functionSignature', new FunctionSignatureHelper(configuration, dependenciesEngine));
|
3191 | this.registerHelper(bars, 'isNotToggle', new IsNotToggleHelper(configuration));
|
3192 | this.registerHelper(bars, 'isInitialTab', new IsInitialTabHelper());
|
3193 | this.registerHelper(bars, 'isTabEnabled', new IsTabEnabledHelper());
|
3194 | this.registerHelper(bars, 'ifString', new IfStringHelper());
|
3195 | this.registerHelper(bars, 'orLength', new OrLengthHelper());
|
3196 | this.registerHelper(bars, 'filterAngular2Modules', new FilterAngular2ModulesHelper());
|
3197 | this.registerHelper(bars, 'debug', new DebugHelper());
|
3198 | this.registerHelper(bars, 'breaklines', new BreakLinesHelper(bars));
|
3199 | this.registerHelper(bars, 'clean-paragraph', new CleanParagraphHelper());
|
3200 | this.registerHelper(bars, 'escapeSimpleQuote', new EscapeSimpleQuoteHelper());
|
3201 | this.registerHelper(bars, 'breakComma', new BreakCommaHelper(bars));
|
3202 | this.registerHelper(bars, 'modifKind', new ModifKindHelper());
|
3203 | this.registerHelper(bars, 'modifIcon', new ModifIconHelper());
|
3204 | this.registerHelper(bars, 'relativeURL', new RelativeURLHelper());
|
3205 | this.registerHelper(bars, 'jsdoc-returns-comment', new JsdocReturnsCommentHelper());
|
3206 | this.registerHelper(bars, 'jsdoc-code-example', new JsdocCodeExampleHelper());
|
3207 | this.registerHelper(bars, 'jsdoc-example', new JsdocExampleHelper());
|
3208 | this.registerHelper(bars, 'jsdoc-params', new JsdocParamsHelper());
|
3209 | this.registerHelper(bars, 'jsdoc-params-valid', new JsdocParamsValidHelper());
|
3210 | this.registerHelper(bars, 'jsdoc-default', new JsdocDefaultHelper());
|
3211 | this.registerHelper(bars, 'linkType', new LinkTypeHelper(configuration, dependenciesEngine));
|
3212 | this.registerHelper(bars, 'indexableSignature', new IndexableSignatureHelper());
|
3213 | this.registerHelper(bars, 'object', new ObjectHelper());
|
3214 | this.registerHelper(bars, 'objectLength', new ObjectLengthHelper());
|
3215 | this.registerHelper(bars, 'parseDescription', new ParseDescriptionHelper(dependenciesEngine));
|
3216 | this.registerHelper(bars, 'one-parameter-has', new OneParameterHasHelper());
|
3217 | this.registerHelper(bars, 'element-alone', new ElementAloneHelper(dependenciesEngine));
|
3218 | this.registerHelper(bars, 'hasOwn', new HasOwnHelper());
|
3219 | this.registerHelper(bars, 'short-url', new ShortURLHelper());
|
3220 | this.registerHelper(bars, 't', new I18nHelper());
|
3221 | };
|
3222 | HtmlEngineHelpers.prototype.registerHelper = function (bars, key, helper) {
|
3223 | Handlebars.registerHelper(key, function () {
|
3224 | // tslint:disable-next-line:no-invalid-this
|
3225 | return helper.helperFunc.apply(helper, [this].concat(_.slice(arguments)));
|
3226 | });
|
3227 | };
|
3228 | return HtmlEngineHelpers;
|
3229 | }());
|
3230 |
|
3231 | var HtmlEngine = /** @class */ (function () {
|
3232 | function HtmlEngine(configuration, dependenciesEngine, fileEngine) {
|
3233 | if (fileEngine === void 0) { fileEngine = new FileEngine(); }
|
3234 | this.fileEngine = fileEngine;
|
3235 | this.cache = {};
|
3236 | var helper = new HtmlEngineHelpers();
|
3237 | helper.registerHelpers(Handlebars, configuration, dependenciesEngine);
|
3238 | }
|
3239 | HtmlEngine.prototype.init = function (templatePath) {
|
3240 | var _this = this;
|
3241 | var partials = [
|
3242 | 'overview',
|
3243 | 'markdown',
|
3244 | 'modules',
|
3245 | 'module',
|
3246 | 'components',
|
3247 | 'component',
|
3248 | 'controller',
|
3249 | 'component-detail',
|
3250 | 'directives',
|
3251 | 'directive',
|
3252 | 'injectables',
|
3253 | 'injectable',
|
3254 | 'interceptor',
|
3255 | 'guard',
|
3256 | 'pipes',
|
3257 | 'pipe',
|
3258 | 'classes',
|
3259 | 'class',
|
3260 | 'interface',
|
3261 | 'routes',
|
3262 | 'index',
|
3263 | 'index-misc',
|
3264 | 'search-results',
|
3265 | 'search-input',
|
3266 | 'link-type',
|
3267 | 'block-method',
|
3268 | 'block-enum',
|
3269 | 'block-property',
|
3270 | 'block-index',
|
3271 | 'block-constructor',
|
3272 | 'block-typealias',
|
3273 | 'block-accessors',
|
3274 | 'block-input',
|
3275 | 'block-output',
|
3276 | 'coverage-report',
|
3277 | 'unit-test-report',
|
3278 | 'miscellaneous-functions',
|
3279 | 'miscellaneous-variables',
|
3280 | 'miscellaneous-typealiases',
|
3281 | 'miscellaneous-enumerations',
|
3282 | 'additional-page',
|
3283 | 'package-dependencies'
|
3284 | ];
|
3285 | if (templatePath) {
|
3286 | if (this.fileEngine.existsSync(path.resolve(process.cwd() + path.sep + templatePath)) === false) {
|
3287 | logger.warn('Template path specificed but does not exist...using default templates');
|
3288 | //new Error('Template path specified but does not exist');
|
3289 | }
|
3290 | }
|
3291 | return Promise.all(partials.map(function (partial) {
|
3292 | var partialPath = _this.determineTemplatePath(templatePath, 'partials/' + partial + '.hbs');
|
3293 | return _this.fileEngine
|
3294 | .get(partialPath)
|
3295 | .then(function (data) { return Handlebars.registerPartial(partial, data); });
|
3296 | }))
|
3297 | .then(function () {
|
3298 | var pagePath = _this.determineTemplatePath(templatePath, 'page.hbs');
|
3299 | return _this.fileEngine
|
3300 | .get(pagePath)
|
3301 | .then(function (data) {
|
3302 | _this.cache.page = data;
|
3303 | _this.compiledPage = Handlebars.compile(_this.cache.page, {
|
3304 | preventIndent: true,
|
3305 | strict: true
|
3306 | });
|
3307 | });
|
3308 | })
|
3309 | .then(function () {
|
3310 | var menuPath = _this.determineTemplatePath(templatePath, 'partials/menu.hbs');
|
3311 | return _this.fileEngine
|
3312 | .get(menuPath)
|
3313 | .then(function (menuTemplate) {
|
3314 | _this.precompiledMenu = Handlebars.compile(menuTemplate, {
|
3315 | preventIndent: true,
|
3316 | strict: true
|
3317 | });
|
3318 | });
|
3319 | });
|
3320 | };
|
3321 | HtmlEngine.prototype.renderMenu = function (templatePath, data) {
|
3322 | var menuPath = this.determineTemplatePath(templatePath, 'partials/menu.hbs');
|
3323 | return this.fileEngine
|
3324 | .get(menuPath)
|
3325 | .then(function (menuTemplate) {
|
3326 | data.menu = 'normal';
|
3327 | return Handlebars.compile(menuTemplate, {
|
3328 | preventIndent: true,
|
3329 | strict: true
|
3330 | })(__assign({}, data));
|
3331 | });
|
3332 | };
|
3333 | HtmlEngine.prototype.render = function (mainData, page) {
|
3334 | var o = mainData;
|
3335 | Object.assign(o, page);
|
3336 | // let mem = process.memoryUsage();
|
3337 | // console.log(`heapTotal: ${mem.heapTotal} | heapUsed: ${mem.heapUsed}`);
|
3338 | return this.compiledPage({
|
3339 | data: o
|
3340 | });
|
3341 | };
|
3342 | HtmlEngine.prototype.determineTemplatePath = function (templatePath, filePath) {
|
3343 | var outPath = path.resolve(__dirname + '/../src/templates/' + filePath);
|
3344 | if (templatePath) {
|
3345 | var testPath = path.resolve(process.cwd() + path.sep + templatePath + path.sep + filePath);
|
3346 | outPath = (this.fileEngine.existsSync(testPath) ? testPath : outPath);
|
3347 | }
|
3348 | return outPath;
|
3349 | };
|
3350 | HtmlEngine.prototype.generateCoverageBadge = function (outputFolder, label, coverageData) {
|
3351 | var _this = this;
|
3352 | return this.fileEngine
|
3353 | .get(path.resolve(__dirname + '/../src/templates/partials/coverage-badge.hbs'))
|
3354 | .then(function (data) {
|
3355 | var template = Handlebars.compile(data);
|
3356 | coverageData.label = label;
|
3357 | var result = template({
|
3358 | data: coverageData
|
3359 | });
|
3360 | var testOutputDir = outputFolder.match(process.cwd());
|
3361 | if (testOutputDir && testOutputDir.length > 0) {
|
3362 | outputFolder = outputFolder.replace(process.cwd() + path.sep, '');
|
3363 | }
|
3364 | return _this.fileEngine
|
3365 | .write(outputFolder + path.sep + '/images/coverage-badge-' + label + '.svg', result)
|
3366 | .catch(function (err) {
|
3367 | logger.error('Error during coverage badge ' + label + ' file generation ', err);
|
3368 | return Promise.reject(err);
|
3369 | });
|
3370 | }, function (err) { return Promise.reject('Error during coverage badge generation'); });
|
3371 | };
|
3372 | return HtmlEngine;
|
3373 | }());
|
3374 |
|
3375 | var marked$1 = require('marked');
|
3376 | var MarkdownEngine = /** @class */ (function () {
|
3377 | function MarkdownEngine(fileEngine) {
|
3378 | if (fileEngine === void 0) { fileEngine = new FileEngine(); }
|
3379 | var _this = this;
|
3380 | this.fileEngine = fileEngine;
|
3381 | /**
|
3382 | * List of markdown files without .md extension
|
3383 | */
|
3384 | this.markdownFiles = ['README', 'CHANGELOG', 'LICENSE', 'CONTRIBUTING', 'TODO'];
|
3385 | var renderer = new marked$1.Renderer();
|
3386 | renderer.code = function (code, language) {
|
3387 | var highlighted = code;
|
3388 | if (!language) {
|
3389 | language = 'none';
|
3390 | }
|
3391 | highlighted = _this.escape(code);
|
3392 | return "<div><pre class=\"line-numbers\"><code class=\"language-" + language + "\">" + highlighted + "</code></pre></div>";
|
3393 | };
|
3394 | renderer.table = function (header, body) {
|
3395 | return ('<table class="table table-bordered compodoc-table">\n' +
|
3396 | '<thead>\n' +
|
3397 | header +
|
3398 | '</thead>\n' +
|
3399 | '<tbody>\n' +
|
3400 | body +
|
3401 | '</tbody>\n' +
|
3402 | '</table>\n');
|
3403 | };
|
3404 | renderer.image = function (href, title, text) {
|
3405 | var out = '<img src="' + href + '" alt="' + text + '" class="img-responsive"';
|
3406 | if (title) {
|
3407 | out += ' title="' + title + '"';
|
3408 | }
|
3409 | out += '>';
|
3410 | return out;
|
3411 | };
|
3412 | marked$1.setOptions({
|
3413 | renderer: renderer,
|
3414 | breaks: false
|
3415 | });
|
3416 | }
|
3417 | MarkdownEngine.prototype.getTraditionalMarkdown = function (filepath) {
|
3418 | var _this = this;
|
3419 | return this.fileEngine
|
3420 | .get(process.cwd() + path.sep + filepath + '.md')
|
3421 | .catch(function (err) { return _this.fileEngine.get(process.cwd() + path.sep + filepath).then(); })
|
3422 | .then(function (data) { return marked$1(data); });
|
3423 | };
|
3424 | MarkdownEngine.prototype.getTraditionalMarkdownSync = function (filepath) {
|
3425 | return marked$1(this.fileEngine.getSync(process.cwd() + path.sep + filepath));
|
3426 | };
|
3427 | MarkdownEngine.prototype.getReadmeFile = function () {
|
3428 | return this.fileEngine
|
3429 | .get(process.cwd() + path.sep + 'README.md')
|
3430 | .then(function (data) { return marked$1(data); });
|
3431 | };
|
3432 | MarkdownEngine.prototype.readNeighbourReadmeFile = function (file) {
|
3433 | var dirname = path.dirname(file);
|
3434 | var readmeFile = dirname + path.sep + path.basename(file, '.ts') + '.md';
|
3435 | return fs.readFileSync(readmeFile, 'utf8');
|
3436 | };
|
3437 | MarkdownEngine.prototype.hasNeighbourReadmeFile = function (file) {
|
3438 | var dirname = path.dirname(file);
|
3439 | var readmeFile = dirname + path.sep + path.basename(file, '.ts') + '.md';
|
3440 | return this.fileEngine.existsSync(readmeFile);
|
3441 | };
|
3442 | MarkdownEngine.prototype.componentReadmeFile = function (file) {
|
3443 | var dirname = path.dirname(file);
|
3444 | var readmeFile = dirname + path.sep + 'README.md';
|
3445 | var readmeAlternativeFile = dirname + path.sep + path.basename(file, '.ts') + '.md';
|
3446 | var finalPath = '';
|
3447 | if (this.fileEngine.existsSync(readmeFile)) {
|
3448 | finalPath = readmeFile;
|
3449 | }
|
3450 | else {
|
3451 | finalPath = readmeAlternativeFile;
|
3452 | }
|
3453 | return finalPath;
|
3454 | };
|
3455 | /**
|
3456 | * Checks if any of the markdown files is exists with or without endings
|
3457 | */
|
3458 | MarkdownEngine.prototype.hasRootMarkdowns = function () {
|
3459 | var _this = this;
|
3460 | return this.addEndings(this.markdownFiles).some(function (x) {
|
3461 | return _this.fileEngine.existsSync(process.cwd() + path.sep + x);
|
3462 | });
|
3463 | };
|
3464 | MarkdownEngine.prototype.listRootMarkdowns = function () {
|
3465 | var _this = this;
|
3466 | var foundFiles = this.markdownFiles.filter(function (x) {
|
3467 | return _this.fileEngine.existsSync(process.cwd() + path.sep + x + '.md') ||
|
3468 | _this.fileEngine.existsSync(process.cwd() + path.sep + x);
|
3469 | });
|
3470 | return this.addEndings(foundFiles);
|
3471 | };
|
3472 | MarkdownEngine.prototype.escape = function (html) {
|
3473 | return html
|
3474 | .replace(/&/g, '&')
|
3475 | .replace(/</g, '<')
|
3476 | .replace(/>/g, '>')
|
3477 | .replace(/"/g, '"')
|
3478 | .replace(/'/g, ''')
|
3479 | .replace(/@/g, '@');
|
3480 | };
|
3481 | /**
|
3482 | * ['README'] => ['README', 'README.md']
|
3483 | */
|
3484 | MarkdownEngine.prototype.addEndings = function (files) {
|
3485 | return _.flatMap(files, function (x) { return [x, x + '.md']; });
|
3486 | };
|
3487 | return MarkdownEngine;
|
3488 | }());
|
3489 |
|
3490 | var COMPODOC_DEFAULTS = {
|
3491 | title: 'Application documentation',
|
3492 | additionalEntryName: 'Additional documentation',
|
3493 | additionalEntryPath: 'additional-documentation',
|
3494 | folder: './documentation/',
|
3495 | port: 8080,
|
3496 | theme: 'gitbook',
|
3497 | exportFormat: 'html',
|
3498 | exportFormatsSupported: ['html', 'json'],
|
3499 | base: '/',
|
3500 | defaultCoverageThreshold: 70,
|
3501 | defaultCoverageMinimumPerFile: 0,
|
3502 | coverageTestThresholdFail: true,
|
3503 | toggleMenuItems: ['all'],
|
3504 | navTabConfig: [],
|
3505 | disableSourceCode: false,
|
3506 | disableDomTree: false,
|
3507 | disableTemplateTab: false,
|
3508 | disableGraph: false,
|
3509 | disableMainGraph: false,
|
3510 | disableCoverage: false,
|
3511 | disablePrivate: false,
|
3512 | disableProtected: false,
|
3513 | disableInternal: false,
|
3514 | disableLifeCycleHooks: false,
|
3515 | disableRoutesGraph: false,
|
3516 | PAGE_TYPES: {
|
3517 | ROOT: 'root',
|
3518 | INTERNAL: 'internal'
|
3519 | },
|
3520 | gaSite: 'auto',
|
3521 | coverageTestShowOnlyFailed: false,
|
3522 | language: 'en-US'
|
3523 | };
|
3524 |
|
3525 | var Configuration = /** @class */ (function () {
|
3526 | function Configuration() {
|
3527 | this._pages = [];
|
3528 | this._mainData = {
|
3529 | output: COMPODOC_DEFAULTS.folder,
|
3530 | theme: COMPODOC_DEFAULTS.theme,
|
3531 | extTheme: '',
|
3532 | serve: false,
|
3533 | port: COMPODOC_DEFAULTS.port,
|
3534 | open: false,
|
3535 | assetsFolder: '',
|
3536 | documentationMainName: COMPODOC_DEFAULTS.title,
|
3537 | documentationMainDescription: '',
|
3538 | base: COMPODOC_DEFAULTS.base,
|
3539 | hideGenerator: false,
|
3540 | modules: [],
|
3541 | readme: false,
|
3542 | changelog: '',
|
3543 | contributing: '',
|
3544 | license: '',
|
3545 | todo: '',
|
3546 | markdowns: [],
|
3547 | additionalPages: [],
|
3548 | pipes: [],
|
3549 | classes: [],
|
3550 | interfaces: [],
|
3551 | components: [],
|
3552 | directives: [],
|
3553 | injectables: [],
|
3554 | interceptors: [],
|
3555 | guards: [],
|
3556 | miscellaneous: [],
|
3557 | routes: [],
|
3558 | tsconfig: '',
|
3559 | toggleMenuItems: [],
|
3560 | navTabConfig: [],
|
3561 | includes: '',
|
3562 | includesName: COMPODOC_DEFAULTS.additionalEntryName,
|
3563 | includesFolder: COMPODOC_DEFAULTS.additionalEntryPath,
|
3564 | disableSourceCode: COMPODOC_DEFAULTS.disableSourceCode,
|
3565 | disableDomTree: COMPODOC_DEFAULTS.disableDomTree,
|
3566 | disableTemplateTab: COMPODOC_DEFAULTS.disableTemplateTab,
|
3567 | disableGraph: COMPODOC_DEFAULTS.disableGraph,
|
3568 | disableMainGraph: COMPODOC_DEFAULTS.disableMainGraph,
|
3569 | disableCoverage: COMPODOC_DEFAULTS.disableCoverage,
|
3570 | disablePrivate: COMPODOC_DEFAULTS.disablePrivate,
|
3571 | disableInternal: COMPODOC_DEFAULTS.disableInternal,
|
3572 | disableProtected: COMPODOC_DEFAULTS.disableProtected,
|
3573 | disableLifeCycleHooks: COMPODOC_DEFAULTS.disableLifeCycleHooks,
|
3574 | disableRoutesGraph: COMPODOC_DEFAULTS.disableRoutesGraph,
|
3575 | watch: false,
|
3576 | mainGraph: '',
|
3577 | coverageTest: false,
|
3578 | coverageTestThreshold: COMPODOC_DEFAULTS.defaultCoverageThreshold,
|
3579 | coverageTestThresholdFail: COMPODOC_DEFAULTS.coverageTestThresholdFail,
|
3580 | coverageTestPerFile: false,
|
3581 | coverageMinimumPerFile: COMPODOC_DEFAULTS.defaultCoverageMinimumPerFile,
|
3582 | unitTestCoverage: '',
|
3583 | unitTestData: undefined,
|
3584 | coverageTestShowOnlyFailed: COMPODOC_DEFAULTS.coverageTestShowOnlyFailed,
|
3585 | routesLength: 0,
|
3586 | angularVersion: '',
|
3587 | exportFormat: COMPODOC_DEFAULTS.exportFormat,
|
3588 | coverageData: {},
|
3589 | customFavicon: '',
|
3590 | packageDependencies: [],
|
3591 | packagePeerDependencies: [],
|
3592 | gaID: '',
|
3593 | gaSite: '',
|
3594 | angularProject: false,
|
3595 | angularJSProject: false,
|
3596 | language: COMPODOC_DEFAULTS.language
|
3597 | };
|
3598 | }
|
3599 | Configuration.prototype.addPage = function (page) {
|
3600 | var indexPage = _.findIndex(this._pages, { name: page.name });
|
3601 | if (indexPage === -1) {
|
3602 | this._pages.push(page);
|
3603 | }
|
3604 | };
|
3605 | Configuration.prototype.hasPage = function (name) {
|
3606 | var indexPage = _.findIndex(this._pages, { name: name });
|
3607 | return indexPage !== -1;
|
3608 | };
|
3609 | Configuration.prototype.addAdditionalPage = function (page) {
|
3610 | this._mainData.additionalPages.push(page);
|
3611 | };
|
3612 | Configuration.prototype.resetPages = function () {
|
3613 | this._pages = [];
|
3614 | };
|
3615 | Configuration.prototype.resetAdditionalPages = function () {
|
3616 | this._mainData.additionalPages = [];
|
3617 | };
|
3618 | Configuration.prototype.resetRootMarkdownPages = function () {
|
3619 | var indexPage = _.findIndex(this._pages, { name: 'index' });
|
3620 | this._pages.splice(indexPage, 1);
|
3621 | indexPage = _.findIndex(this._pages, { name: 'changelog' });
|
3622 | this._pages.splice(indexPage, 1);
|
3623 | indexPage = _.findIndex(this._pages, { name: 'contributing' });
|
3624 | this._pages.splice(indexPage, 1);
|
3625 | indexPage = _.findIndex(this._pages, { name: 'license' });
|
3626 | this._pages.splice(indexPage, 1);
|
3627 | indexPage = _.findIndex(this._pages, { name: 'todo' });
|
3628 | this._pages.splice(indexPage, 1);
|
3629 | this._mainData.markdowns = [];
|
3630 | };
|
3631 | Object.defineProperty(Configuration.prototype, "pages", {
|
3632 | get: function () {
|
3633 | return this._pages;
|
3634 | },
|
3635 | set: function (pages) {
|
3636 | this._pages = [];
|
3637 | },
|
3638 | enumerable: true,
|
3639 | configurable: true
|
3640 | });
|
3641 | Object.defineProperty(Configuration.prototype, "mainData", {
|
3642 | get: function () {
|
3643 | return this._mainData;
|
3644 | },
|
3645 | set: function (data) {
|
3646 | Object.assign(this._mainData, data);
|
3647 | },
|
3648 | enumerable: true,
|
3649 | configurable: true
|
3650 | });
|
3651 | return Configuration;
|
3652 | }());
|
3653 |
|
3654 | var ngdT = require('@compodoc/ngd-transformer');
|
3655 | var NgdEngine = /** @class */ (function () {
|
3656 | function NgdEngine(dependenciesEngine, fileEngine) {
|
3657 | if (fileEngine === void 0) { fileEngine = new FileEngine(); }
|
3658 | this.dependenciesEngine = dependenciesEngine;
|
3659 | this.fileEngine = fileEngine;
|
3660 | }
|
3661 | NgdEngine.prototype.init = function (outputpath) {
|
3662 | this.engine = new ngdT.DotEngine({
|
3663 | output: outputpath,
|
3664 | displayLegend: true,
|
3665 | outputFormats: 'svg',
|
3666 | silent: true
|
3667 | });
|
3668 | };
|
3669 | NgdEngine.prototype.renderGraph = function (filepath, outputpath, type, name) {
|
3670 | this.engine.updateOutput(outputpath);
|
3671 | if (type === 'f') {
|
3672 | return this.engine.generateGraph([this.dependenciesEngine.getRawModule(name)]);
|
3673 | }
|
3674 | else {
|
3675 | return this.engine.generateGraph(this.dependenciesEngine.rawModulesForOverview);
|
3676 | }
|
3677 | };
|
3678 | NgdEngine.prototype.readGraph = function (filepath, name) {
|
3679 | return this.fileEngine
|
3680 | .get(filepath)
|
3681 | .catch(function (err) { return Promise.reject('Error during graph read ' + name); });
|
3682 | };
|
3683 | return NgdEngine;
|
3684 | }());
|
3685 |
|
3686 | var COMPODOC_CONSTANTS = {
|
3687 | navTabDefinitions: [
|
3688 | {
|
3689 | 'id': 'info',
|
3690 | 'href': '#info',
|
3691 | 'data-link': 'info',
|
3692 | 'label': 'Info',
|
3693 | 'depTypes': ['all']
|
3694 | },
|
3695 | {
|
3696 | 'id': 'readme',
|
3697 | 'href': '#readme',
|
3698 | 'data-link': 'readme',
|
3699 | 'label': 'README',
|
3700 | 'depTypes': ['all']
|
3701 | },
|
3702 | {
|
3703 | 'id': 'source',
|
3704 | 'href': '#source',
|
3705 | 'data-link': 'source',
|
3706 | 'label': 'Source',
|
3707 | 'depTypes': ['all']
|
3708 | },
|
3709 | {
|
3710 | 'id': 'templateData',
|
3711 | 'href': '#templateData',
|
3712 | 'data-link': 'template',
|
3713 | 'label': 'Template',
|
3714 | 'depTypes': ['component']
|
3715 | },
|
3716 | {
|
3717 | 'id': 'tree',
|
3718 | 'href': '#tree',
|
3719 | 'data-link': 'dom-tree',
|
3720 | 'label': 'DOM Tree',
|
3721 | 'depTypes': ['component']
|
3722 | },
|
3723 | {
|
3724 | 'id': 'example',
|
3725 | 'href': '#example',
|
3726 | 'data-link': 'example',
|
3727 | 'label': 'Examples',
|
3728 | 'depTypes': ['component', 'directive', 'injectable', 'pipe']
|
3729 | },
|
3730 | ]
|
3731 | };
|
3732 | /**
|
3733 | * Max length for the string of a file during Lunr search engine indexing.
|
3734 | * Prevent stack size exceeded
|
3735 | */
|
3736 | var MAX_SIZE_FILE_SEARCH_INDEX = 50000;
|
3737 | /**
|
3738 | * Max length for the string of a file during cheerio parsing.
|
3739 | * Prevent stack size exceeded
|
3740 | */
|
3741 | var MAX_SIZE_FILE_CHEERIO_PARSING = 400000000;
|
3742 |
|
3743 | var lunr = require('lunr');
|
3744 | var cheerio = require('cheerio');
|
3745 | var Entities = require('html-entities').AllHtmlEntities;
|
3746 | var Html = new Entities();
|
3747 | var SearchEngine = /** @class */ (function () {
|
3748 | function SearchEngine(configuration, fileEngine) {
|
3749 | if (fileEngine === void 0) { fileEngine = new FileEngine(); }
|
3750 | this.configuration = configuration;
|
3751 | this.fileEngine = fileEngine;
|
3752 | this.searchDocuments = [];
|
3753 | this.documentsStore = {};
|
3754 | this.amountOfMemory = 0;
|
3755 | }
|
3756 | SearchEngine.prototype.indexPage = function (page) {
|
3757 | var text;
|
3758 | this.amountOfMemory += page.rawData.length;
|
3759 | if (this.amountOfMemory < MAX_SIZE_FILE_CHEERIO_PARSING) {
|
3760 | var indexStartContent = page.rawData.indexOf('<!-- START CONTENT -->');
|
3761 | var indexEndContent = page.rawData.indexOf('<!-- END CONTENT -->');
|
3762 | var $ = cheerio.load(page.rawData.substring(indexStartContent + 1, indexEndContent));
|
3763 | text = $('.content').html();
|
3764 | text = Html.decode(text);
|
3765 | text = text.replace(/(<([^>]+)>)/gi, '');
|
3766 | page.url = page.url.replace(this.configuration.mainData.output, '');
|
3767 | var doc = {
|
3768 | url: page.url,
|
3769 | title: page.infos.context + ' - ' + page.infos.name,
|
3770 | body: text
|
3771 | };
|
3772 | if (!this.documentsStore.hasOwnProperty(doc.url) &&
|
3773 | doc.body.length < MAX_SIZE_FILE_SEARCH_INDEX) {
|
3774 | this.documentsStore[doc.url] = doc;
|
3775 | this.searchDocuments.push(doc);
|
3776 | }
|
3777 | }
|
3778 | };
|
3779 | SearchEngine.prototype.generateSearchIndexJson = function (outputFolder) {
|
3780 | var _this = this;
|
3781 | var that = this;
|
3782 | var searchIndex = lunr(function () {
|
3783 | /* tslint:disable:no-invalid-this */
|
3784 | this.ref('url');
|
3785 | this.field('title');
|
3786 | this.field('body');
|
3787 | var i = 0;
|
3788 | var len = that.searchDocuments.length;
|
3789 | for (i; i < len; i++) {
|
3790 | this.add(that.searchDocuments[i]);
|
3791 | }
|
3792 | });
|
3793 | return this.fileEngine.get(__dirname + '/../src/templates/partials/search-index.hbs').then(function (data) {
|
3794 | var template = Handlebars.compile(data);
|
3795 | var result = template({
|
3796 | index: JSON.stringify(searchIndex),
|
3797 | store: JSON.stringify(_this.documentsStore)
|
3798 | });
|
3799 | var testOutputDir = outputFolder.match(process.cwd());
|
3800 | if (testOutputDir && testOutputDir.length > 0) {
|
3801 | outputFolder = outputFolder.replace(process.cwd() + path.sep, '');
|
3802 | }
|
3803 | return _this.fileEngine
|
3804 | .write(outputFolder + path.sep + '/js/search/search_index.js', result)
|
3805 | .catch(function (err) {
|
3806 | logger.error('Error during search index file generation ', err);
|
3807 | return Promise.reject(err);
|
3808 | });
|
3809 | }, function (err) { return Promise.reject('Error during search index generation'); });
|
3810 | };
|
3811 | return SearchEngine;
|
3812 | }());
|
3813 |
|
3814 | var traverse$1 = require('traverse');
|
3815 | var ExportJsonEngine = /** @class */ (function () {
|
3816 | function ExportJsonEngine(configuration, dependenciesEngine, fileEngine) {
|
3817 | if (fileEngine === void 0) { fileEngine = new FileEngine(); }
|
3818 | this.configuration = configuration;
|
3819 | this.dependenciesEngine = dependenciesEngine;
|
3820 | this.fileEngine = fileEngine;
|
3821 | }
|
3822 | ExportJsonEngine.prototype.export = function (outputFolder, data) {
|
3823 | var exportData = {};
|
3824 | traverse$1(data).forEach(function (node) {
|
3825 | if (node) {
|
3826 | if (node.parent)
|
3827 | delete node.parent;
|
3828 | if (node.initializer)
|
3829 | delete node.initializer;
|
3830 | }
|
3831 | });
|
3832 | exportData.pipes = data.pipes;
|
3833 | exportData.interfaces = data.interfaces;
|
3834 | exportData.injectables = data.injectables;
|
3835 | exportData.classes = data.classes;
|
3836 | exportData.directives = data.directives;
|
3837 | exportData.components = data.components;
|
3838 | exportData.modules = this.processModules();
|
3839 | exportData.miscellaneous = data.miscellaneous;
|
3840 | exportData.routes = data.routes;
|
3841 | exportData.coverage = data.coverageData;
|
3842 | return this.fileEngine
|
3843 | .write(outputFolder + path.sep + '/documentation.json', JSON.stringify(exportData, null, 4))
|
3844 | .catch(function (err) {
|
3845 | logger.error('Error during export file generation ', err);
|
3846 | return Promise.reject(err);
|
3847 | });
|
3848 | };
|
3849 | ExportJsonEngine.prototype.processModules = function () {
|
3850 | var modules = this.dependenciesEngine.getModules();
|
3851 | var _resultedModules = [];
|
3852 | for (var moduleNr = 0; moduleNr < modules.length; moduleNr++) {
|
3853 | var moduleElement = {
|
3854 | name: modules[moduleNr].name,
|
3855 | children: [
|
3856 | {
|
3857 | type: 'providers',
|
3858 | elements: []
|
3859 | },
|
3860 | {
|
3861 | type: 'declarations',
|
3862 | elements: []
|
3863 | },
|
3864 | {
|
3865 | type: 'imports',
|
3866 | elements: []
|
3867 | },
|
3868 | {
|
3869 | type: 'exports',
|
3870 | elements: []
|
3871 | },
|
3872 | {
|
3873 | type: 'bootstrap',
|
3874 | elements: []
|
3875 | },
|
3876 | {
|
3877 | type: 'classes',
|
3878 | elements: []
|
3879 | }
|
3880 | ]
|
3881 | };
|
3882 | for (var k = 0; k < modules[moduleNr].providers.length; k++) {
|
3883 | var providerElement = {
|
3884 | name: modules[moduleNr].providers[k].name
|
3885 | };
|
3886 | moduleElement.children[0].elements.push(providerElement);
|
3887 | }
|
3888 | for (var k = 0; k < modules[moduleNr].declarations.length; k++) {
|
3889 | var declarationElement = {
|
3890 | name: modules[moduleNr].declarations[k].name
|
3891 | };
|
3892 | moduleElement.children[1].elements.push(declarationElement);
|
3893 | }
|
3894 | for (var k = 0; k < modules[moduleNr].imports.length; k++) {
|
3895 | var importElement = {
|
3896 | name: modules[moduleNr].imports[k].name
|
3897 | };
|
3898 | moduleElement.children[2].elements.push(importElement);
|
3899 | }
|
3900 | for (var k = 0; k < modules[moduleNr].exports.length; k++) {
|
3901 | var exportElement = {
|
3902 | name: modules[moduleNr].exports[k].name
|
3903 | };
|
3904 | moduleElement.children[3].elements.push(exportElement);
|
3905 | }
|
3906 | for (var k = 0; k < modules[moduleNr].bootstrap.length; k++) {
|
3907 | var bootstrapElement = {
|
3908 | name: modules[moduleNr].bootstrap[k].name
|
3909 | };
|
3910 | moduleElement.children[4].elements.push(bootstrapElement);
|
3911 | }
|
3912 | _resultedModules.push(moduleElement);
|
3913 | }
|
3914 | return _resultedModules;
|
3915 | };
|
3916 | return ExportJsonEngine;
|
3917 | }());
|
3918 |
|
3919 | var ExportEngine = /** @class */ (function () {
|
3920 | function ExportEngine(configuration, dependenciesEngine, fileEngine) {
|
3921 | if (fileEngine === void 0) { fileEngine = new FileEngine(); }
|
3922 | this.configuration = configuration;
|
3923 | this.dependenciesEngine = dependenciesEngine;
|
3924 | this.fileEngine = fileEngine;
|
3925 | }
|
3926 | ExportEngine.prototype.export = function (outputFolder, data) {
|
3927 | switch (this.configuration.mainData.exportFormat) {
|
3928 | case 'json':
|
3929 | this._engine = new ExportJsonEngine(this.configuration, this.dependenciesEngine, this.fileEngine);
|
3930 | return this._engine.export(outputFolder, data);
|
3931 | }
|
3932 | };
|
3933 | return ExportEngine;
|
3934 | }());
|
3935 |
|
3936 | var $ = require('cheerio');
|
3937 | var ComponentsTreeEngine = /** @class */ (function () {
|
3938 | function ComponentsTreeEngine(fileEngine) {
|
3939 | if (fileEngine === void 0) { fileEngine = new FileEngine(); }
|
3940 | this.fileEngine = fileEngine;
|
3941 | this.components = [];
|
3942 | this.componentsForTree = [];
|
3943 | if (ComponentsTreeEngine._instance) {
|
3944 | throw new Error('Error: Instantiation failed: Use ComponentsTreeEngine.getInstance() instead of new.');
|
3945 | }
|
3946 | ComponentsTreeEngine._instance = this;
|
3947 | }
|
3948 | ComponentsTreeEngine.getInstance = function () {
|
3949 | return ComponentsTreeEngine._instance;
|
3950 | };
|
3951 | ComponentsTreeEngine.prototype.addComponent = function (component) {
|
3952 | this.components.push(component);
|
3953 | };
|
3954 | ComponentsTreeEngine.prototype.readTemplates = function () {
|
3955 | var _this = this;
|
3956 | return new Promise(function (resolve, reject) {
|
3957 | var i = 0;
|
3958 | var len = _this.componentsForTree.length;
|
3959 | var loop = function () {
|
3960 | if (i <= len - 1) {
|
3961 | if (_this.componentsForTree[i].templateUrl) {
|
3962 | var filePath = process.cwd() + path.sep + path.dirname(_this.componentsForTree[i].file) + path.sep + _this.componentsForTree[i].templateUrl;
|
3963 | _this.fileEngine.get(filePath)
|
3964 | .then(function (templateData) {
|
3965 | _this.componentsForTree[i].templateData = templateData;
|
3966 | i++;
|
3967 | loop();
|
3968 | }, function (e) {
|
3969 | logger.error(e);
|
3970 | reject();
|
3971 | });
|
3972 | }
|
3973 | else {
|
3974 | _this.componentsForTree[i].templateData = _this.componentsForTree[i].template;
|
3975 | i++;
|
3976 | loop();
|
3977 | }
|
3978 | }
|
3979 | else {
|
3980 | resolve();
|
3981 | }
|
3982 | };
|
3983 | loop();
|
3984 | });
|
3985 | };
|
3986 | ComponentsTreeEngine.prototype.findChildrenAndParents = function () {
|
3987 | var _this = this;
|
3988 | return new Promise(function (resolve, reject) {
|
3989 | _.forEach(_this.componentsForTree, function (component) {
|
3990 | var $component = $(component.templateData);
|
3991 | _.forEach(_this.componentsForTree, function (componentToFind) {
|
3992 | if ($component.find(componentToFind.selector).length > 0) {
|
3993 | console.log(componentToFind.name + ' found in ' + component.name);
|
3994 | component.children.push(componentToFind.name);
|
3995 | }
|
3996 | });
|
3997 | });
|
3998 | resolve();
|
3999 | });
|
4000 | };
|
4001 | ComponentsTreeEngine.prototype.createTreesForComponents = function () {
|
4002 | var _this = this;
|
4003 | return new Promise(function (resolve, reject) {
|
4004 | _.forEach(_this.components, function (component) {
|
4005 | var _component = {
|
4006 | name: component.name,
|
4007 | file: component.file,
|
4008 | selector: component.selector,
|
4009 | children: [],
|
4010 | template: '',
|
4011 | templateUrl: ''
|
4012 | };
|
4013 | if (typeof component.template !== 'undefined') {
|
4014 | _component.template = component.template;
|
4015 | }
|
4016 | if (component.templateUrl.length > 0) {
|
4017 | _component.templateUrl = component.templateUrl[0];
|
4018 | }
|
4019 | _this.componentsForTree.push(_component);
|
4020 | });
|
4021 | _this.readTemplates()
|
4022 | .then(function () {
|
4023 | _this.findChildrenAndParents()
|
4024 | .then(function () {
|
4025 | console.log('this.componentsForTree: ', _this.componentsForTree);
|
4026 | resolve();
|
4027 | }, function (e) {
|
4028 | logger.error(e);
|
4029 | reject();
|
4030 | });
|
4031 | }, function (e) {
|
4032 | logger.error(e);
|
4033 | });
|
4034 | });
|
4035 | };
|
4036 | ComponentsTreeEngine._instance = new ComponentsTreeEngine();
|
4037 | return ComponentsTreeEngine;
|
4038 | }());
|
4039 | var $componentsTreeEngine = ComponentsTreeEngine.getInstance();
|
4040 |
|
4041 | var crypto = require('crypto');
|
4042 | var marked$2 = require('marked');
|
4043 | var ClassHelper = /** @class */ (function () {
|
4044 | function ClassHelper(typeChecker, configuration) {
|
4045 | this.typeChecker = typeChecker;
|
4046 | this.configuration = configuration;
|
4047 | this.jsdocParserUtil = new JsdocParserUtil();
|
4048 | this.importsUtil = new ImportsUtil();
|
4049 | }
|
4050 | /**
|
4051 | * HELPERS
|
4052 | */
|
4053 | ClassHelper.prototype.stringifyDefaultValue = function (node) {
|
4054 | /**
|
4055 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
4056 | */
|
4057 | if (node.getText()) {
|
4058 | return node.getText();
|
4059 | }
|
4060 | else if (node.kind === Ast.SyntaxKind.FalseKeyword) {
|
4061 | return 'false';
|
4062 | }
|
4063 | else if (node.kind === Ast.SyntaxKind.TrueKeyword) {
|
4064 | return 'true';
|
4065 | }
|
4066 | };
|
4067 | ClassHelper.prototype.getDecoratorOfType = function (node, decoratorType) {
|
4068 | var decorators = node.decorators || [];
|
4069 | for (var i = 0; i < decorators.length; i++) {
|
4070 | if (decorators[i].expression.expression) {
|
4071 | if (decorators[i].expression.expression.text === decoratorType) {
|
4072 | return decorators[i];
|
4073 | }
|
4074 | }
|
4075 | }
|
4076 | return undefined;
|
4077 | };
|
4078 | ClassHelper.prototype.formatDecorators = function (decorators) {
|
4079 | var _decorators = [];
|
4080 | _.forEach(decorators, function (decorator) {
|
4081 | if (decorator.expression) {
|
4082 | if (decorator.expression.text) {
|
4083 | _decorators.push({
|
4084 | name: decorator.expression.text
|
4085 | });
|
4086 | }
|
4087 | if (decorator.expression.expression) {
|
4088 | var info = {
|
4089 | name: decorator.expression.expression.text
|
4090 | };
|
4091 | if (decorator.expression.expression.arguments) {
|
4092 | if (decorator.expression.expression.arguments.length > 0) {
|
4093 | info.args = decorator.expression.expression.arguments;
|
4094 | }
|
4095 | }
|
4096 | _decorators.push(info);
|
4097 | }
|
4098 | }
|
4099 | });
|
4100 | return _decorators;
|
4101 | };
|
4102 | ClassHelper.prototype.getPosition = function (node, sourceFile) {
|
4103 | var position;
|
4104 | if (node.name && node.name.end) {
|
4105 | position = Ast.ts.getLineAndCharacterOfPosition(sourceFile, node.name.end);
|
4106 | }
|
4107 | else {
|
4108 | position = Ast.ts.getLineAndCharacterOfPosition(sourceFile, node.pos);
|
4109 | }
|
4110 | return position;
|
4111 | };
|
4112 | ClassHelper.prototype.addAccessor = function (accessors, nodeAccessor, sourceFile) {
|
4113 | var nodeName = '';
|
4114 | if (nodeAccessor.name) {
|
4115 | nodeName = nodeAccessor.name.text;
|
4116 | var jsdoctags = this.jsdocParserUtil.getJSDocs(nodeAccessor);
|
4117 | if (!accessors[nodeName]) {
|
4118 | accessors[nodeName] = {
|
4119 | name: nodeName,
|
4120 | setSignature: undefined,
|
4121 | getSignature: undefined
|
4122 | };
|
4123 | }
|
4124 | if (nodeAccessor.kind === Ast.SyntaxKind.SetAccessor) {
|
4125 | var setSignature = {
|
4126 | name: nodeName,
|
4127 | type: 'void',
|
4128 | args: nodeAccessor.parameters.map(function (param) {
|
4129 | return {
|
4130 | name: param.name.text,
|
4131 | type: param.type ? kindToType(param.type.kind) : ''
|
4132 | };
|
4133 | }),
|
4134 | returnType: nodeAccessor.type ? this.visitType(nodeAccessor.type) : 'void',
|
4135 | line: this.getPosition(nodeAccessor, sourceFile).line + 1
|
4136 | };
|
4137 | if (nodeAccessor.jsDoc && nodeAccessor.jsDoc.length >= 1) {
|
4138 | var comment = nodeAccessor.jsDoc[0].comment;
|
4139 | if (typeof comment !== 'undefined') {
|
4140 | setSignature.description = marked$2(comment);
|
4141 | }
|
4142 | }
|
4143 | if (jsdoctags && jsdoctags.length >= 1) {
|
4144 | if (jsdoctags[0].tags) {
|
4145 | setSignature.jsdoctags = markedtags(jsdoctags[0].tags);
|
4146 | }
|
4147 | }
|
4148 | if (setSignature.jsdoctags && setSignature.jsdoctags.length > 0) {
|
4149 | setSignature.jsdoctags = mergeTagsAndArgs(setSignature.args, setSignature.jsdoctags);
|
4150 | }
|
4151 | else if (setSignature.args && setSignature.args.length > 0) {
|
4152 | setSignature.jsdoctags = mergeTagsAndArgs(setSignature.args);
|
4153 | }
|
4154 | accessors[nodeName].setSignature = setSignature;
|
4155 | }
|
4156 | if (nodeAccessor.kind === Ast.SyntaxKind.GetAccessor) {
|
4157 | var getSignature = {
|
4158 | name: nodeName,
|
4159 | type: nodeAccessor.type ? kindToType(nodeAccessor.type.kind) : '',
|
4160 | returnType: nodeAccessor.type ? this.visitType(nodeAccessor.type) : '',
|
4161 | line: this.getPosition(nodeAccessor, sourceFile).line + 1
|
4162 | };
|
4163 | if (nodeAccessor.jsDoc && nodeAccessor.jsDoc.length >= 1) {
|
4164 | var comment = nodeAccessor.jsDoc[0].comment;
|
4165 | if (typeof comment !== 'undefined') {
|
4166 | getSignature.description = marked$2(comment);
|
4167 | }
|
4168 | }
|
4169 | if (jsdoctags && jsdoctags.length >= 1) {
|
4170 | if (jsdoctags[0].tags) {
|
4171 | getSignature.jsdoctags = markedtags(jsdoctags[0].tags);
|
4172 | }
|
4173 | }
|
4174 | accessors[nodeName].getSignature = getSignature;
|
4175 | }
|
4176 | }
|
4177 | };
|
4178 | ClassHelper.prototype.isDirectiveDecorator = function (decorator) {
|
4179 | if (decorator.expression.expression) {
|
4180 | var decoratorIdentifierText = decorator.expression.expression.text;
|
4181 | return (decoratorIdentifierText === 'Directive' || decoratorIdentifierText === 'Component');
|
4182 | }
|
4183 | else {
|
4184 | return false;
|
4185 | }
|
4186 | };
|
4187 | ClassHelper.prototype.isServiceDecorator = function (decorator) {
|
4188 | return decorator.expression.expression
|
4189 | ? decorator.expression.expression.text === 'Injectable'
|
4190 | : false;
|
4191 | };
|
4192 | ClassHelper.prototype.isPrivate = function (member) {
|
4193 | /**
|
4194 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
4195 | */
|
4196 | if (member.modifiers) {
|
4197 | var isPrivate = member.modifiers.some(function (modifier) { return modifier.kind === Ast.SyntaxKind.PrivateKeyword; });
|
4198 | if (isPrivate) {
|
4199 | return true;
|
4200 | }
|
4201 | }
|
4202 | return this.isHiddenMember(member);
|
4203 | };
|
4204 | ClassHelper.prototype.isProtected = function (member) {
|
4205 | if (member.modifiers) {
|
4206 | var isProtected = member.modifiers.some(function (modifier) { return modifier.kind === Ast.SyntaxKind.ProtectedKeyword; });
|
4207 | if (isProtected) {
|
4208 | return true;
|
4209 | }
|
4210 | }
|
4211 | return this.isHiddenMember(member);
|
4212 | };
|
4213 | ClassHelper.prototype.isInternal = function (member) {
|
4214 | /**
|
4215 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
4216 | */
|
4217 | var internalTags = ['internal'];
|
4218 | if (member.jsDoc) {
|
4219 | for (var _i = 0, _a = member.jsDoc; _i < _a.length; _i++) {
|
4220 | var doc = _a[_i];
|
4221 | if (doc.tags) {
|
4222 | for (var _b = 0, _c = doc.tags; _b < _c.length; _b++) {
|
4223 | var tag = _c[_b];
|
4224 | if (internalTags.indexOf(tag.tagName.text) > -1) {
|
4225 | return true;
|
4226 | }
|
4227 | }
|
4228 | }
|
4229 | }
|
4230 | }
|
4231 | return false;
|
4232 | };
|
4233 | ClassHelper.prototype.isPublic = function (member) {
|
4234 | if (member.modifiers) {
|
4235 | var isPublic = member.modifiers.some(function (modifier) { return modifier.kind === Ast.SyntaxKind.PublicKeyword; });
|
4236 | if (isPublic) {
|
4237 | return true;
|
4238 | }
|
4239 | }
|
4240 | return this.isHiddenMember(member);
|
4241 | };
|
4242 | ClassHelper.prototype.isHiddenMember = function (member) {
|
4243 | /**
|
4244 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
4245 | */
|
4246 | var internalTags = ['hidden'];
|
4247 | if (member.jsDoc) {
|
4248 | for (var _i = 0, _a = member.jsDoc; _i < _a.length; _i++) {
|
4249 | var doc = _a[_i];
|
4250 | if (doc.tags) {
|
4251 | for (var _b = 0, _c = doc.tags; _b < _c.length; _b++) {
|
4252 | var tag = _c[_b];
|
4253 | if (internalTags.indexOf(tag.tagName.text) > -1) {
|
4254 | return true;
|
4255 | }
|
4256 | }
|
4257 | }
|
4258 | }
|
4259 | }
|
4260 | return false;
|
4261 | };
|
4262 | ClassHelper.prototype.isPipeDecorator = function (decorator) {
|
4263 | return decorator.expression.expression
|
4264 | ? decorator.expression.expression.text === 'Pipe'
|
4265 | : false;
|
4266 | };
|
4267 | ClassHelper.prototype.isModuleDecorator = function (decorator) {
|
4268 | return decorator.expression.expression
|
4269 | ? decorator.expression.expression.text === 'NgModule'
|
4270 | : false;
|
4271 | };
|
4272 | /**
|
4273 | * VISITERS
|
4274 | */
|
4275 | ClassHelper.prototype.visitClassDeclaration = function (fileName, classDeclaration, sourceFile) {
|
4276 | var symbol = this.typeChecker.getSymbolAtLocation(classDeclaration.name);
|
4277 | var description = '';
|
4278 | if (symbol) {
|
4279 | description = marked$2(this.jsdocParserUtil.getMainCommentOfNode(classDeclaration));
|
4280 | if (symbol.valueDeclaration && isIgnore(symbol.valueDeclaration)) {
|
4281 | return [
|
4282 | {
|
4283 | ignore: true
|
4284 | }
|
4285 | ];
|
4286 | }
|
4287 | if (symbol.declarations && symbol.declarations.length > 0) {
|
4288 | if (isIgnore(symbol.declarations[0])) {
|
4289 | return [
|
4290 | {
|
4291 | ignore: true
|
4292 | }
|
4293 | ];
|
4294 | }
|
4295 | }
|
4296 | }
|
4297 | var className = classDeclaration.name.text;
|
4298 | var members;
|
4299 | var implementsElements = [];
|
4300 | var extendsElement;
|
4301 | var jsdoctags = [];
|
4302 | if (typeof Ast.ts.getClassImplementsHeritageClauseElements !== 'undefined') {
|
4303 | var implementedTypes = Ast.ts.getClassImplementsHeritageClauseElements(classDeclaration);
|
4304 | if (implementedTypes) {
|
4305 | var i = 0;
|
4306 | var len = implementedTypes.length;
|
4307 | for (i; i < len; i++) {
|
4308 | if (implementedTypes[i].expression) {
|
4309 | implementsElements.push(implementedTypes[i].expression.text);
|
4310 | }
|
4311 | }
|
4312 | }
|
4313 | }
|
4314 | if (typeof Ast.ts.getClassExtendsHeritageClauseElement !== 'undefined') {
|
4315 | var extendsTypes = Ast.ts.getClassExtendsHeritageClauseElement(classDeclaration);
|
4316 | if (extendsTypes) {
|
4317 | if (extendsTypes.expression) {
|
4318 | extendsElement = extendsTypes.expression.text;
|
4319 | }
|
4320 | }
|
4321 | }
|
4322 | if (symbol) {
|
4323 | if (symbol.valueDeclaration) {
|
4324 | jsdoctags = this.jsdocParserUtil.getJSDocs(symbol.valueDeclaration);
|
4325 | }
|
4326 | }
|
4327 | members = this.visitMembers(classDeclaration.members, sourceFile);
|
4328 | if (classDeclaration.decorators) {
|
4329 | for (var i = 0; i < classDeclaration.decorators.length; i++) {
|
4330 | if (this.isDirectiveDecorator(classDeclaration.decorators[i])) {
|
4331 | return {
|
4332 | description: description,
|
4333 | inputs: members.inputs,
|
4334 | outputs: members.outputs,
|
4335 | hostBindings: members.hostBindings,
|
4336 | hostListeners: members.hostListeners,
|
4337 | properties: members.properties,
|
4338 | methods: members.methods,
|
4339 | indexSignatures: members.indexSignatures,
|
4340 | kind: members.kind,
|
4341 | constructor: members.constructor,
|
4342 | jsdoctags: jsdoctags,
|
4343 | extends: extendsElement,
|
4344 | implements: implementsElements,
|
4345 | accessors: members.accessors
|
4346 | };
|
4347 | }
|
4348 | else if (this.isServiceDecorator(classDeclaration.decorators[i])) {
|
4349 | return [
|
4350 | {
|
4351 | fileName: fileName,
|
4352 | className: className,
|
4353 | description: description,
|
4354 | methods: members.methods,
|
4355 | indexSignatures: members.indexSignatures,
|
4356 | properties: members.properties,
|
4357 | kind: members.kind,
|
4358 | constructor: members.constructor,
|
4359 | jsdoctags: jsdoctags,
|
4360 | extends: extendsElement,
|
4361 | implements: implementsElements,
|
4362 | accessors: members.accessors
|
4363 | }
|
4364 | ];
|
4365 | }
|
4366 | else if (this.isPipeDecorator(classDeclaration.decorators[i])) {
|
4367 | return [
|
4368 | {
|
4369 | fileName: fileName,
|
4370 | className: className,
|
4371 | description: description,
|
4372 | jsdoctags: jsdoctags,
|
4373 | properties: members.properties,
|
4374 | methods: members.methods
|
4375 | }
|
4376 | ];
|
4377 | }
|
4378 | else if (this.isModuleDecorator(classDeclaration.decorators[i])) {
|
4379 | return [
|
4380 | {
|
4381 | fileName: fileName,
|
4382 | className: className,
|
4383 | description: description,
|
4384 | jsdoctags: jsdoctags
|
4385 | }
|
4386 | ];
|
4387 | }
|
4388 | else {
|
4389 | return [
|
4390 | {
|
4391 | description: description,
|
4392 | methods: members.methods,
|
4393 | indexSignatures: members.indexSignatures,
|
4394 | properties: members.properties,
|
4395 | kind: members.kind,
|
4396 | constructor: members.constructor,
|
4397 | jsdoctags: jsdoctags,
|
4398 | extends: extendsElement,
|
4399 | implements: implementsElements,
|
4400 | accessors: members.accessors
|
4401 | }
|
4402 | ];
|
4403 | }
|
4404 | }
|
4405 | }
|
4406 | else if (description) {
|
4407 | return [
|
4408 | {
|
4409 | description: description,
|
4410 | inputs: members.inputs,
|
4411 | outputs: members.outputs,
|
4412 | hostBindings: members.hostBindings,
|
4413 | hostListeners: members.hostListeners,
|
4414 | methods: members.methods,
|
4415 | indexSignatures: members.indexSignatures,
|
4416 | properties: members.properties,
|
4417 | kind: members.kind,
|
4418 | constructor: members.constructor,
|
4419 | jsdoctags: jsdoctags,
|
4420 | extends: extendsElement,
|
4421 | implements: implementsElements,
|
4422 | accessors: members.accessors
|
4423 | }
|
4424 | ];
|
4425 | }
|
4426 | else {
|
4427 | return [
|
4428 | {
|
4429 | methods: members.methods,
|
4430 | inputs: members.inputs,
|
4431 | outputs: members.outputs,
|
4432 | hostBindings: members.hostBindings,
|
4433 | hostListeners: members.hostListeners,
|
4434 | indexSignatures: members.indexSignatures,
|
4435 | properties: members.properties,
|
4436 | kind: members.kind,
|
4437 | constructor: members.constructor,
|
4438 | jsdoctags: jsdoctags,
|
4439 | extends: extendsElement,
|
4440 | implements: implementsElements,
|
4441 | accessors: members.accessors
|
4442 | }
|
4443 | ];
|
4444 | }
|
4445 | return [];
|
4446 | };
|
4447 | ClassHelper.prototype.visitMembers = function (members, sourceFile) {
|
4448 | /**
|
4449 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
4450 | */
|
4451 | var inputs = [];
|
4452 | var outputs = [];
|
4453 | var hostBindings = [];
|
4454 | var hostListeners = [];
|
4455 | var methods = [];
|
4456 | var properties = [];
|
4457 | var indexSignatures = [];
|
4458 | var kind;
|
4459 | var inputDecorator;
|
4460 | var hostBinding;
|
4461 | var hostListener;
|
4462 | var constructor;
|
4463 | var outDecorator;
|
4464 | var accessors = {};
|
4465 | var result = {};
|
4466 | for (var i = 0; i < members.length; i++) {
|
4467 | // Allows typescript guess type when using ts.is*
|
4468 | var member = members[i];
|
4469 | inputDecorator = this.getDecoratorOfType(member, 'Input');
|
4470 | outDecorator = this.getDecoratorOfType(member, 'Output');
|
4471 | hostBinding = this.getDecoratorOfType(member, 'HostBinding');
|
4472 | hostListener = this.getDecoratorOfType(member, 'HostListener');
|
4473 | kind = member.kind;
|
4474 | if (isIgnore(member)) {
|
4475 | continue;
|
4476 | }
|
4477 | if (inputDecorator) {
|
4478 | inputs.push(this.visitInputAndHostBinding(member, inputDecorator, sourceFile));
|
4479 | if (Ast.ts.isSetAccessorDeclaration(member)) {
|
4480 | this.addAccessor(accessors, members[i], sourceFile);
|
4481 | }
|
4482 | }
|
4483 | else if (outDecorator) {
|
4484 | outputs.push(this.visitOutput(member, outDecorator, sourceFile));
|
4485 | }
|
4486 | else if (hostBinding) {
|
4487 | hostBindings.push(this.visitInputAndHostBinding(member, hostBinding, sourceFile));
|
4488 | }
|
4489 | else if (hostListener) {
|
4490 | hostListeners.push(this.visitHostListener(member, hostListener, sourceFile));
|
4491 | }
|
4492 | else if (!this.isHiddenMember(member)) {
|
4493 | if (!(this.isPrivate(member) && this.configuration.mainData.disablePrivate)) {
|
4494 | if (!(this.isInternal(member) && this.configuration.mainData.disableInternal)) {
|
4495 | if (!(this.isProtected(member) &&
|
4496 | this.configuration.mainData.disableProtected)) {
|
4497 | if (Ast.ts.isMethodDeclaration(member) || Ast.ts.isMethodSignature(member)) {
|
4498 | methods.push(this.visitMethodDeclaration(member, sourceFile));
|
4499 | }
|
4500 | else if (Ast.ts.isPropertyDeclaration(member) ||
|
4501 | Ast.ts.isPropertySignature(member)) {
|
4502 | properties.push(this.visitProperty(member, sourceFile));
|
4503 | }
|
4504 | else if (Ast.ts.isCallSignatureDeclaration(member)) {
|
4505 | properties.push(this.visitCallDeclaration(member, sourceFile));
|
4506 | }
|
4507 | else if (Ast.ts.isGetAccessorDeclaration(member) ||
|
4508 | Ast.ts.isSetAccessorDeclaration(member)) {
|
4509 | this.addAccessor(accessors, members[i], sourceFile);
|
4510 | }
|
4511 | else if (Ast.ts.isIndexSignatureDeclaration(member)) {
|
4512 | indexSignatures.push(this.visitIndexDeclaration(member, sourceFile));
|
4513 | }
|
4514 | else if (Ast.ts.isConstructorDeclaration(member)) {
|
4515 | var _constructorProperties = this.visitConstructorProperties(member, sourceFile);
|
4516 | var j = 0;
|
4517 | var len = _constructorProperties.length;
|
4518 | for (j; j < len; j++) {
|
4519 | properties.push(_constructorProperties[j]);
|
4520 | }
|
4521 | constructor = this.visitConstructorDeclaration(member, sourceFile);
|
4522 | }
|
4523 | }
|
4524 | }
|
4525 | }
|
4526 | }
|
4527 | }
|
4528 | inputs.sort(getNamesCompareFn());
|
4529 | outputs.sort(getNamesCompareFn());
|
4530 | hostBindings.sort(getNamesCompareFn());
|
4531 | hostListeners.sort(getNamesCompareFn());
|
4532 | properties.sort(getNamesCompareFn());
|
4533 | methods.sort(getNamesCompareFn());
|
4534 | indexSignatures.sort(getNamesCompareFn());
|
4535 | result = {
|
4536 | inputs: inputs,
|
4537 | outputs: outputs,
|
4538 | hostBindings: hostBindings,
|
4539 | hostListeners: hostListeners,
|
4540 | methods: methods,
|
4541 | properties: properties,
|
4542 | indexSignatures: indexSignatures,
|
4543 | kind: kind,
|
4544 | constructor: constructor
|
4545 | };
|
4546 | if (Object.keys(accessors).length) {
|
4547 | result['accessors'] = accessors;
|
4548 | }
|
4549 | return result;
|
4550 | };
|
4551 | ClassHelper.prototype.visitTypeName = function (typeName) {
|
4552 | if (typeName.text) {
|
4553 | return typeName.text;
|
4554 | }
|
4555 | return this.visitTypeName(typeName.left) + "." + this.visitTypeName(typeName.right);
|
4556 | };
|
4557 | ClassHelper.prototype.visitType = function (node) {
|
4558 | var _return = 'void';
|
4559 | if (!node) {
|
4560 | return _return;
|
4561 | }
|
4562 | if (node.typeName) {
|
4563 | _return = this.visitTypeName(node.typeName);
|
4564 | }
|
4565 | else if (node.type) {
|
4566 | if (node.type.kind) {
|
4567 | _return = kindToType(node.type.kind);
|
4568 | }
|
4569 | if (node.type.typeName) {
|
4570 | _return = this.visitTypeName(node.type.typeName);
|
4571 | }
|
4572 | if (node.type.typeArguments) {
|
4573 | _return += '<';
|
4574 | var typeArguments = [];
|
4575 | for (var _i = 0, _a = node.type.typeArguments; _i < _a.length; _i++) {
|
4576 | var argument = _a[_i];
|
4577 | typeArguments.push(this.visitType(argument));
|
4578 | }
|
4579 | _return += typeArguments.join(' | ');
|
4580 | _return += '>';
|
4581 | }
|
4582 | if (node.type.elementType) {
|
4583 | var _firstPart = this.visitType(node.type.elementType);
|
4584 | _return = _firstPart + kindToType(node.type.kind);
|
4585 | if (node.type.elementType.kind === Ast.SyntaxKind.ParenthesizedType) {
|
4586 | _return = '(' + _firstPart + ')' + kindToType(node.type.kind);
|
4587 | }
|
4588 | }
|
4589 | if (node.type.types && Ast.ts.isUnionTypeNode(node.type)) {
|
4590 | _return = '';
|
4591 | var i = 0;
|
4592 | var len = node.type.types.length;
|
4593 | for (i; i < len; i++) {
|
4594 | var type = node.type.types[i];
|
4595 | if (type.elementType) {
|
4596 | var _firstPart = this.visitType(type.elementType);
|
4597 | if (type.elementType.kind === Ast.SyntaxKind.ParenthesizedType) {
|
4598 | _return += '(' + _firstPart + ')' + kindToType(type.kind);
|
4599 | }
|
4600 | else {
|
4601 | _return += _firstPart + kindToType(type.kind);
|
4602 | }
|
4603 | }
|
4604 | else {
|
4605 | _return += kindToType(type.kind);
|
4606 | if (Ast.ts.isLiteralTypeNode(type) && type.literal) {
|
4607 | _return += '"' + type.literal.text + '"';
|
4608 | }
|
4609 | if (type.typeName) {
|
4610 | _return += this.visitTypeName(type.typeName);
|
4611 | }
|
4612 | if (type.typeArguments) {
|
4613 | _return += '<';
|
4614 | var typeArguments = [];
|
4615 | for (var _b = 0, _c = type.typeArguments; _b < _c.length; _b++) {
|
4616 | var argument = _c[_b];
|
4617 | typeArguments.push(this.visitType(argument));
|
4618 | }
|
4619 | _return += typeArguments.join(' | ');
|
4620 | _return += '>';
|
4621 | }
|
4622 | }
|
4623 | if (i < len - 1) {
|
4624 | _return += ' | ';
|
4625 | }
|
4626 | }
|
4627 | }
|
4628 | if (node.type.elementTypes) {
|
4629 | var elementTypes = node.type.elementTypes;
|
4630 | var i = 0;
|
4631 | var len = elementTypes.length;
|
4632 | if (len > 0) {
|
4633 | _return = '[';
|
4634 | for (i; i < len; i++) {
|
4635 | var type = elementTypes[i];
|
4636 | _return += kindToType(type.kind);
|
4637 | if (Ast.ts.isLiteralTypeNode(type) && type.literal) {
|
4638 | _return += '"' + type.literal.text + '"';
|
4639 | }
|
4640 | if (type.typeName) {
|
4641 | _return += this.visitTypeName(type.typeName);
|
4642 | }
|
4643 | if (i < len - 1) {
|
4644 | _return += ', ';
|
4645 | }
|
4646 | }
|
4647 | _return += ']';
|
4648 | }
|
4649 | }
|
4650 | }
|
4651 | else if (node.elementType) {
|
4652 | _return = kindToType(node.elementType.kind) + kindToType(node.kind);
|
4653 | if (node.elementType.typeName) {
|
4654 | _return = this.visitTypeName(node.elementType.typeName) + kindToType(node.kind);
|
4655 | }
|
4656 | }
|
4657 | else if (node.types && Ast.ts.isUnionTypeNode(node)) {
|
4658 | _return = '';
|
4659 | var i = 0;
|
4660 | var len = node.types.length;
|
4661 | for (i; i < len; i++) {
|
4662 | var type = node.types[i];
|
4663 | _return += kindToType(type.kind);
|
4664 | if (Ast.ts.isLiteralTypeNode(type) && type.literal) {
|
4665 | _return += '"' + type.literal.text + '"';
|
4666 | }
|
4667 | if (type.typeName) {
|
4668 | _return += this.visitTypeName(type.typeName);
|
4669 | }
|
4670 | if (i < len - 1) {
|
4671 | _return += ' | ';
|
4672 | }
|
4673 | }
|
4674 | }
|
4675 | else if (node.dotDotDotToken) {
|
4676 | _return = 'any[]';
|
4677 | }
|
4678 | else {
|
4679 | _return = kindToType(node.kind);
|
4680 | if (_return === '' &&
|
4681 | node.initializer &&
|
4682 | node.initializer.kind &&
|
4683 | (node.kind === Ast.SyntaxKind.PropertyDeclaration || node.kind === Ast.SyntaxKind.Parameter)) {
|
4684 | _return = kindToType(node.initializer.kind);
|
4685 | }
|
4686 | if (node.kind === Ast.SyntaxKind.TypeParameter) {
|
4687 | _return = node.name.text;
|
4688 | }
|
4689 | }
|
4690 | if (node.typeArguments && node.typeArguments.length > 0) {
|
4691 | _return += '<';
|
4692 | var i = 0, len = node.typeArguments.length;
|
4693 | for (i; i < len; i++) {
|
4694 | var argument = node.typeArguments[i];
|
4695 | _return += this.visitType(argument);
|
4696 | if (i >= 0 && i < len - 1) {
|
4697 | _return += ', ';
|
4698 | }
|
4699 | }
|
4700 | _return += '>';
|
4701 | }
|
4702 | return _return;
|
4703 | };
|
4704 | ClassHelper.prototype.visitCallDeclaration = function (method, sourceFile) {
|
4705 | var _this = this;
|
4706 | var sourceCode = sourceFile.getText();
|
4707 | var hash = crypto
|
4708 | .createHash('md5')
|
4709 | .update(sourceCode)
|
4710 | .digest('hex');
|
4711 | var result = {
|
4712 | id: 'call-declaration-' + hash,
|
4713 | args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
|
4714 | returnType: this.visitType(method.type),
|
4715 | line: this.getPosition(method, sourceFile).line + 1
|
4716 | };
|
4717 | if (method.jsDoc) {
|
4718 | result.description = marked$2(marked$2(this.jsdocParserUtil.getMainCommentOfNode(method)));
|
4719 | }
|
4720 | var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
|
4721 | if (jsdoctags && jsdoctags.length >= 1) {
|
4722 | if (jsdoctags[0].tags) {
|
4723 | result.jsdoctags = markedtags(jsdoctags[0].tags);
|
4724 | }
|
4725 | }
|
4726 | return result;
|
4727 | };
|
4728 | ClassHelper.prototype.visitIndexDeclaration = function (method, sourceFile) {
|
4729 | var _this = this;
|
4730 | var sourceCode = sourceFile.getText();
|
4731 | var hash = crypto
|
4732 | .createHash('md5')
|
4733 | .update(sourceCode)
|
4734 | .digest('hex');
|
4735 | var result = {
|
4736 | id: 'index-declaration-' + hash,
|
4737 | args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
|
4738 | returnType: this.visitType(method.type),
|
4739 | line: this.getPosition(method, sourceFile).line + 1
|
4740 | };
|
4741 | if (method.jsDoc) {
|
4742 | result.description = marked$2(this.jsdocParserUtil.getMainCommentOfNode(method));
|
4743 | }
|
4744 | return result;
|
4745 | };
|
4746 | ClassHelper.prototype.visitConstructorDeclaration = function (method, sourceFile) {
|
4747 | var _this = this;
|
4748 | /**
|
4749 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
4750 | */
|
4751 | var result = {
|
4752 | name: 'constructor',
|
4753 | description: '',
|
4754 | args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
|
4755 | line: this.getPosition(method, sourceFile).line + 1
|
4756 | };
|
4757 | var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
|
4758 | if (method.jsDoc) {
|
4759 | result.description = marked$2(this.jsdocParserUtil.getMainCommentOfNode(method));
|
4760 | }
|
4761 | if (method.modifiers) {
|
4762 | if (method.modifiers.length > 0) {
|
4763 | var kinds = method.modifiers.map(function (modifier) {
|
4764 | return modifier.kind;
|
4765 | });
|
4766 | if (_.indexOf(kinds, Ast.SyntaxKind.PublicKeyword) !== -1 &&
|
4767 | _.indexOf(kinds, Ast.SyntaxKind.StaticKeyword) !== -1) {
|
4768 | kinds = kinds.filter(function (kind) { return kind !== Ast.SyntaxKind.PublicKeyword; });
|
4769 | }
|
4770 | result.modifierKind = kinds;
|
4771 | }
|
4772 | }
|
4773 | if (jsdoctags && jsdoctags.length >= 1) {
|
4774 | if (jsdoctags[0].tags) {
|
4775 | result.jsdoctags = markedtags(jsdoctags[0].tags);
|
4776 | }
|
4777 | }
|
4778 | if (result.jsdoctags && result.jsdoctags.length > 0) {
|
4779 | result.jsdoctags = mergeTagsAndArgs(result.args, result.jsdoctags);
|
4780 | }
|
4781 | else if (result.args.length > 0) {
|
4782 | result.jsdoctags = mergeTagsAndArgs(result.args);
|
4783 | }
|
4784 | return result;
|
4785 | };
|
4786 | ClassHelper.prototype.visitProperty = function (property, sourceFile) {
|
4787 | var result = {
|
4788 | name: property.name.text,
|
4789 | defaultValue: property.initializer
|
4790 | ? this.stringifyDefaultValue(property.initializer)
|
4791 | : undefined,
|
4792 | type: this.visitType(property),
|
4793 | optional: typeof property.questionToken !== 'undefined',
|
4794 | description: '',
|
4795 | line: this.getPosition(property, sourceFile).line + 1
|
4796 | };
|
4797 | var jsdoctags;
|
4798 | if (typeof result.name === 'undefined' && typeof property.name.expression !== 'undefined') {
|
4799 | result.name = property.name.expression.text;
|
4800 | }
|
4801 | if (property.jsDoc) {
|
4802 | jsdoctags = this.jsdocParserUtil.getJSDocs(property);
|
4803 | result.description = marked$2(this.jsdocParserUtil.getMainCommentOfNode(property));
|
4804 | }
|
4805 | if (property.decorators) {
|
4806 | result.decorators = this.formatDecorators(property.decorators);
|
4807 | }
|
4808 | if (property.modifiers) {
|
4809 | if (property.modifiers.length > 0) {
|
4810 | var kinds = property.modifiers.map(function (modifier) {
|
4811 | return modifier.kind;
|
4812 | });
|
4813 | if (_.indexOf(kinds, Ast.SyntaxKind.PublicKeyword) !== -1 &&
|
4814 | _.indexOf(kinds, Ast.SyntaxKind.StaticKeyword) !== -1) {
|
4815 | kinds = kinds.filter(function (kind) { return kind !== Ast.SyntaxKind.PublicKeyword; });
|
4816 | }
|
4817 | result.modifierKind = kinds;
|
4818 | }
|
4819 | }
|
4820 | if (jsdoctags && jsdoctags.length >= 1) {
|
4821 | if (jsdoctags[0].tags) {
|
4822 | result.jsdoctags = markedtags(jsdoctags[0].tags);
|
4823 | }
|
4824 | }
|
4825 | return result;
|
4826 | };
|
4827 | ClassHelper.prototype.visitConstructorProperties = function (constr, sourceFile) {
|
4828 | if (constr.parameters) {
|
4829 | var _parameters_1 = [];
|
4830 | var i = 0;
|
4831 | var len = constr.parameters.length;
|
4832 | for (i; i < len; i++) {
|
4833 | if (this.isPublic(constr.parameters[i])) {
|
4834 | _parameters_1.push(this.visitProperty(constr.parameters[i], sourceFile));
|
4835 | }
|
4836 | }
|
4837 | /**
|
4838 | * Merge JSDoc tags description from constructor with parameters
|
4839 | */
|
4840 | if (constr.jsDoc) {
|
4841 | if (constr.jsDoc.length > 0) {
|
4842 | var constrTags = constr.jsDoc[0].tags;
|
4843 | if (constrTags && constrTags.length > 0) {
|
4844 | constrTags.forEach(function (tag) {
|
4845 | _parameters_1.forEach(function (param) {
|
4846 | if (tag.tagName &&
|
4847 | tag.tagName.escapedText &&
|
4848 | tag.tagName.escapedText === 'param') {
|
4849 | if (tag.name &&
|
4850 | tag.name.escapedText &&
|
4851 | tag.name.escapedText === param.name) {
|
4852 | param.description = tag.comment;
|
4853 | }
|
4854 | }
|
4855 | });
|
4856 | });
|
4857 | }
|
4858 | }
|
4859 | }
|
4860 | return _parameters_1;
|
4861 | }
|
4862 | else {
|
4863 | return [];
|
4864 | }
|
4865 | };
|
4866 | ClassHelper.prototype.visitInputAndHostBinding = function (property, inDecorator, sourceFile) {
|
4867 | var inArgs = inDecorator.expression.arguments;
|
4868 | var _return = {};
|
4869 | _return.name = inArgs.length > 0 ? inArgs[0].text : property.name.text;
|
4870 | _return.defaultValue = property.initializer
|
4871 | ? this.stringifyDefaultValue(property.initializer)
|
4872 | : undefined;
|
4873 | if (!_return.description) {
|
4874 | if (property.jsDoc) {
|
4875 | if (property.jsDoc.length > 0) {
|
4876 | if (typeof property.jsDoc[0].comment !== 'undefined') {
|
4877 | _return.description = marked$2(property.jsDoc[0].comment);
|
4878 | }
|
4879 | }
|
4880 | }
|
4881 | }
|
4882 | _return.line = this.getPosition(property, sourceFile).line + 1;
|
4883 | if (property.type) {
|
4884 | _return.type = this.visitType(property);
|
4885 | }
|
4886 | else {
|
4887 | // handle NewExpression
|
4888 | if (property.initializer) {
|
4889 | if (Ast.ts.isNewExpression(property.initializer)) {
|
4890 | if (property.initializer.expression) {
|
4891 | _return.type = property.initializer.expression.text;
|
4892 | }
|
4893 | }
|
4894 | }
|
4895 | }
|
4896 | if (property.kind === Ast.SyntaxKind.SetAccessor) {
|
4897 | // For setter accessor, find type in first parameter
|
4898 | if (property.parameters && property.parameters.length === 1) {
|
4899 | if (property.parameters[0].type) {
|
4900 | _return.type = kindToType(property.parameters[0].type.kind);
|
4901 | }
|
4902 | }
|
4903 | }
|
4904 | return _return;
|
4905 | };
|
4906 | ClassHelper.prototype.visitMethodDeclaration = function (method, sourceFile) {
|
4907 | var _this = this;
|
4908 | var result = {
|
4909 | name: method.name.text,
|
4910 | args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
|
4911 | optional: typeof method.questionToken !== 'undefined',
|
4912 | returnType: this.visitType(method.type),
|
4913 | typeParameters: [],
|
4914 | line: this.getPosition(method, sourceFile).line + 1
|
4915 | };
|
4916 | var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
|
4917 | if (typeof method.type === 'undefined') {
|
4918 | // Try to get inferred type
|
4919 | if (method.symbol) {
|
4920 | var symbol = method.symbol;
|
4921 | if (symbol.valueDeclaration) {
|
4922 | var symbolType = this.typeChecker.getTypeOfSymbolAtLocation(symbol, symbol.valueDeclaration);
|
4923 | if (symbolType) {
|
4924 | try {
|
4925 | var signature = this.typeChecker.getSignatureFromDeclaration(method);
|
4926 | var returnType = signature.getReturnType();
|
4927 | result.returnType = this.typeChecker.typeToString(returnType);
|
4928 | // tslint:disable-next-line:no-empty
|
4929 | }
|
4930 | catch (error) { }
|
4931 | }
|
4932 | }
|
4933 | }
|
4934 | }
|
4935 | if (method.typeParameters && method.typeParameters.length > 0) {
|
4936 | result.typeParameters = method.typeParameters.map(function (typeParameter) {
|
4937 | return _this.visitType(typeParameter);
|
4938 | });
|
4939 | }
|
4940 | if (method.jsDoc) {
|
4941 | result.description = marked$2(this.jsdocParserUtil.getMainCommentOfNode(method));
|
4942 | }
|
4943 | if (method.decorators) {
|
4944 | result.decorators = this.formatDecorators(method.decorators);
|
4945 | }
|
4946 | if (method.modifiers) {
|
4947 | if (method.modifiers.length > 0) {
|
4948 | var kinds = method.modifiers.map(function (modifier) {
|
4949 | return modifier.kind;
|
4950 | });
|
4951 | if (_.indexOf(kinds, Ast.SyntaxKind.PublicKeyword) !== -1 &&
|
4952 | _.indexOf(kinds, Ast.SyntaxKind.StaticKeyword) !== -1) {
|
4953 | kinds = kinds.filter(function (kind) { return kind !== Ast.SyntaxKind.PublicKeyword; });
|
4954 | }
|
4955 | result.modifierKind = kinds;
|
4956 | }
|
4957 | }
|
4958 | if (jsdoctags && jsdoctags.length >= 1) {
|
4959 | if (jsdoctags[0].tags) {
|
4960 | result.jsdoctags = markedtags(jsdoctags[0].tags);
|
4961 | }
|
4962 | }
|
4963 | if (result.jsdoctags && result.jsdoctags.length > 0) {
|
4964 | result.jsdoctags = mergeTagsAndArgs(result.args, result.jsdoctags);
|
4965 | }
|
4966 | else if (result.args.length > 0) {
|
4967 | result.jsdoctags = mergeTagsAndArgs(result.args);
|
4968 | }
|
4969 | return result;
|
4970 | };
|
4971 | ClassHelper.prototype.visitOutput = function (property, outDecorator, sourceFile) {
|
4972 | var inArgs = outDecorator.expression.arguments;
|
4973 | var _return = {
|
4974 | name: inArgs.length > 0 ? inArgs[0].text : property.name.text,
|
4975 | defaultValue: property.initializer
|
4976 | ? this.stringifyDefaultValue(property.initializer)
|
4977 | : undefined
|
4978 | };
|
4979 | if (property.jsDoc) {
|
4980 | _return.description = marked$2(marked$2(this.jsdocParserUtil.getMainCommentOfNode(property)));
|
4981 | }
|
4982 | if (!_return.description) {
|
4983 | if (property.jsDoc && property.jsDoc.length > 0) {
|
4984 | if (typeof property.jsDoc[0].comment !== 'undefined') {
|
4985 | _return.description = marked$2(property.jsDoc[0].comment);
|
4986 | }
|
4987 | }
|
4988 | }
|
4989 | _return.line = this.getPosition(property, sourceFile).line + 1;
|
4990 | if (property.type) {
|
4991 | _return.type = this.visitType(property);
|
4992 | }
|
4993 | else {
|
4994 | // handle NewExpression
|
4995 | if (property.initializer) {
|
4996 | if (Ast.ts.isNewExpression(property.initializer)) {
|
4997 | if (property.initializer.expression) {
|
4998 | _return.type = property.initializer.expression.text;
|
4999 | }
|
5000 | }
|
5001 | }
|
5002 | }
|
5003 | return _return;
|
5004 | };
|
5005 | ClassHelper.prototype.visitArgument = function (arg) {
|
5006 | var _this = this;
|
5007 | var _result = {
|
5008 | name: arg.name.text,
|
5009 | type: this.visitType(arg)
|
5010 | };
|
5011 | if (arg.dotDotDotToken) {
|
5012 | _result.dotDotDotToken = true;
|
5013 | }
|
5014 | if (arg.questionToken) {
|
5015 | _result.optional = true;
|
5016 | }
|
5017 | if (arg.type) {
|
5018 | if (arg.type.kind) {
|
5019 | if (Ast.ts.isFunctionTypeNode(arg.type)) {
|
5020 | _result.function = arg.type.parameters
|
5021 | ? arg.type.parameters.map(function (prop) { return _this.visitArgument(prop); })
|
5022 | : [];
|
5023 | }
|
5024 | }
|
5025 | }
|
5026 | if (arg.initializer) {
|
5027 | _result.defaultValue = this.stringifyDefaultValue(arg.initializer);
|
5028 | }
|
5029 | return _result;
|
5030 | };
|
5031 | ClassHelper.prototype.visitHostListener = function (property, hostListenerDecorator, sourceFile) {
|
5032 | var _this = this;
|
5033 | var inArgs = hostListenerDecorator.expression.arguments;
|
5034 | var _return = {};
|
5035 | _return.name = inArgs.length > 0 ? inArgs[0].text : property.name.text;
|
5036 | _return.args = property.parameters
|
5037 | ? property.parameters.map(function (prop) { return _this.visitArgument(prop); })
|
5038 | : [];
|
5039 | _return.argsDecorator =
|
5040 | inArgs.length > 1
|
5041 | ? inArgs[1].elements.map(function (prop) {
|
5042 | return prop.text;
|
5043 | })
|
5044 | : [];
|
5045 | if (property.jsDoc) {
|
5046 | _return.description = marked$2(this.jsdocParserUtil.getMainCommentOfNode(property));
|
5047 | }
|
5048 | if (!_return.description) {
|
5049 | if (property.jsDoc) {
|
5050 | if (property.jsDoc.length > 0) {
|
5051 | if (typeof property.jsDoc[0].comment !== 'undefined') {
|
5052 | _return.description = marked$2(property.jsDoc[0].comment);
|
5053 | }
|
5054 | }
|
5055 | }
|
5056 | }
|
5057 | _return.line = this.getPosition(property, sourceFile).line + 1;
|
5058 | return _return;
|
5059 | };
|
5060 | return ClassHelper;
|
5061 | }());
|
5062 |
|
5063 | var TsPrinterUtil = /** @class */ (function () {
|
5064 | function TsPrinterUtil() {
|
5065 | this.printer = Ast.ts.createPrinter({
|
5066 | newLine: Ast.ts.NewLineKind.LineFeed
|
5067 | });
|
5068 | }
|
5069 | TsPrinterUtil.prototype.print = function (node) {
|
5070 | return this.printer.printNode(Ast.ts.EmitHint.Unspecified, node, Ast.ts.createSourceFile('', '', Ast.ts.ScriptTarget.Latest));
|
5071 | };
|
5072 | return TsPrinterUtil;
|
5073 | }());
|
5074 |
|
5075 | var SymbolHelper = /** @class */ (function () {
|
5076 | function SymbolHelper() {
|
5077 | this.unknown = '???';
|
5078 | this.importsUtil = new ImportsUtil();
|
5079 | }
|
5080 | SymbolHelper.prototype.parseDeepIndentifier = function (name, srcFile) {
|
5081 | var result = {
|
5082 | name: '',
|
5083 | type: ''
|
5084 | };
|
5085 | if (typeof name === 'undefined') {
|
5086 | return result;
|
5087 | }
|
5088 | var nsModule = name.split('.');
|
5089 | var type = this.getType(name);
|
5090 | if (nsModule.length > 1) {
|
5091 | result.ns = nsModule[0];
|
5092 | result.name = name;
|
5093 | result.type = type;
|
5094 | return result;
|
5095 | }
|
5096 | if (typeof srcFile !== 'undefined') {
|
5097 | result.file = this.importsUtil.getFileNameOfImport(name, srcFile);
|
5098 | }
|
5099 | result.name = name;
|
5100 | result.type = type;
|
5101 | return result;
|
5102 | };
|
5103 | SymbolHelper.prototype.getType = function (name) {
|
5104 | var type;
|
5105 | if (name.toLowerCase().indexOf('component') !== -1) {
|
5106 | type = 'component';
|
5107 | }
|
5108 | else if (name.toLowerCase().indexOf('pipe') !== -1) {
|
5109 | type = 'pipe';
|
5110 | }
|
5111 | else if (name.toLowerCase().indexOf('controller') !== -1) {
|
5112 | type = 'controller';
|
5113 | }
|
5114 | else if (name.toLowerCase().indexOf('module') !== -1) {
|
5115 | type = 'module';
|
5116 | }
|
5117 | else if (name.toLowerCase().indexOf('directive') !== -1) {
|
5118 | type = 'directive';
|
5119 | }
|
5120 | return type;
|
5121 | };
|
5122 | /**
|
5123 | * Output
|
5124 | * RouterModule.forRoot 179
|
5125 | */
|
5126 | SymbolHelper.prototype.buildIdentifierName = function (node, name) {
|
5127 | if (Ast.ts.isIdentifier(node) && !Ast.ts.isPropertyAccessExpression(node)) {
|
5128 | return node.text + "." + name;
|
5129 | }
|
5130 | name = name ? "." + name : '';
|
5131 | var nodeName = this.unknown;
|
5132 | if (node.name) {
|
5133 | nodeName = node.name.text;
|
5134 | }
|
5135 | else if (node.text) {
|
5136 | nodeName = node.text;
|
5137 | }
|
5138 | else if (node.expression) {
|
5139 | if (node.expression.text) {
|
5140 | nodeName = node.expression.text;
|
5141 | }
|
5142 | else if (node.expression.elements) {
|
5143 | if (Ast.ts.isArrayLiteralExpression(node.expression)) {
|
5144 | nodeName = node.expression.elements.map(function (el) { return el.text; }).join(', ');
|
5145 | nodeName = "[" + nodeName + "]";
|
5146 | }
|
5147 | }
|
5148 | }
|
5149 | if (Ast.ts.isSpreadElement(node)) {
|
5150 | return "..." + nodeName;
|
5151 | }
|
5152 | return "" + this.buildIdentifierName(node.expression, nodeName) + name;
|
5153 | };
|
5154 | /**
|
5155 | * parse expressions such as:
|
5156 | * { provide: APP_BASE_HREF, useValue: '/' }
|
5157 | * { provide: 'Date', useFactory: (d1, d2) => new Date(), deps: ['d1', 'd2'] }
|
5158 | */
|
5159 | SymbolHelper.prototype.parseProviderConfiguration = function (node) {
|
5160 | if (node.kind && node.kind === Ast.SyntaxKind.ObjectLiteralExpression) {
|
5161 | // Search for provide: HTTP_INTERCEPTORS
|
5162 | // and if true, return type: 'interceptor' + name
|
5163 | var interceptorName_1, hasInterceptor_1;
|
5164 | if (node.properties) {
|
5165 | if (node.properties.length > 0) {
|
5166 | _.forEach(node.properties, function (property) {
|
5167 | if (property.kind && property.kind === Ast.SyntaxKind.PropertyAssignment) {
|
5168 | if (property.name.text === 'provide') {
|
5169 | if (property.initializer.text === 'HTTP_INTERCEPTORS') {
|
5170 | hasInterceptor_1 = true;
|
5171 | }
|
5172 | }
|
5173 | if (property.name.text === 'useClass' ||
|
5174 | property.name.text === 'useExisting') {
|
5175 | interceptorName_1 = property.initializer.text;
|
5176 | }
|
5177 | }
|
5178 | });
|
5179 | }
|
5180 | }
|
5181 | if (hasInterceptor_1) {
|
5182 | return interceptorName_1;
|
5183 | }
|
5184 | else {
|
5185 | return new TsPrinterUtil().print(node);
|
5186 | }
|
5187 | }
|
5188 | else {
|
5189 | return new TsPrinterUtil().print(node);
|
5190 | }
|
5191 | };
|
5192 | /**
|
5193 | * Kind
|
5194 | * 181 CallExpression => "RouterModule.forRoot(args)"
|
5195 | * 71 Identifier => "RouterModule" "TodoStore"
|
5196 | * 9 StringLiteral => "./app.component.css" "./tab.scss"
|
5197 | */
|
5198 | SymbolHelper.prototype.parseSymbolElements = function (node) {
|
5199 | // parse expressions such as: AngularFireModule.initializeApp(firebaseConfig)
|
5200 | // if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression)) {
|
5201 | if ((Ast.ts.isCallExpression(node) && Ast.ts.isPropertyAccessExpression(node.expression)) ||
|
5202 | (Ast.ts.isNewExpression(node) && Ast.ts.isElementAccessExpression(node.expression))) {
|
5203 | var className = this.buildIdentifierName(node.expression);
|
5204 | // function arguments could be really complex. There are so
|
5205 | // many use cases that we can't handle. Just print "args" to indicate
|
5206 | // that we have arguments.
|
5207 | var functionArgs = node.arguments.length > 0 ? 'args' : '';
|
5208 | var text = className + "(" + functionArgs + ")";
|
5209 | return text;
|
5210 | }
|
5211 | else if (Ast.ts.isPropertyAccessExpression(node)) {
|
5212 | // parse expressions such as: Shared.Module
|
5213 | return this.buildIdentifierName(node);
|
5214 | }
|
5215 | else if (Ast.ts.isIdentifier(node)) {
|
5216 | // parse expressions such as: MyComponent
|
5217 | if (node.text) {
|
5218 | return node.text;
|
5219 | }
|
5220 | if (node.escapedText) {
|
5221 | return node.escapedText;
|
5222 | }
|
5223 | }
|
5224 | else if (Ast.ts.isSpreadElement(node)) {
|
5225 | // parse expressions such as: ...MYARRAY
|
5226 | // Resolve MYARRAY in imports or local file variables after full scan, just return the name of the variable
|
5227 | if (node.expression && node.expression.text) {
|
5228 | return node.expression.text;
|
5229 | }
|
5230 | }
|
5231 | return node.text ? node.text : this.parseProviderConfiguration(node);
|
5232 | };
|
5233 | /**
|
5234 | * Kind
|
5235 | * 177 ArrayLiteralExpression
|
5236 | * 122 BooleanKeyword
|
5237 | * 9 StringLiteral
|
5238 | */
|
5239 | SymbolHelper.prototype.parseSymbols = function (node, srcFile) {
|
5240 | var _this = this;
|
5241 | var localNode = node;
|
5242 | if (Ast.ts.isShorthandPropertyAssignment(localNode)) {
|
5243 | localNode = this.importsUtil.findValueInImportOrLocalVariables(node.name.text, srcFile);
|
5244 | }
|
5245 | if (Ast.ts.isArrayLiteralExpression(localNode.initializer)) {
|
5246 | return localNode.initializer.elements.map(function (x) { return _this.parseSymbolElements(x); });
|
5247 | }
|
5248 | else if (Ast.ts.isStringLiteral(localNode.initializer) ||
|
5249 | Ast.ts.isTemplateLiteral(localNode.initializer) ||
|
5250 | (Ast.ts.isPropertyAssignment(localNode) && localNode.initializer.text)) {
|
5251 | return [localNode.initializer.text];
|
5252 | }
|
5253 | else if (localNode.initializer.kind &&
|
5254 | (localNode.initializer.kind === Ast.SyntaxKind.TrueKeyword ||
|
5255 | localNode.initializer.kind === Ast.SyntaxKind.FalseKeyword)) {
|
5256 | return [localNode.initializer.kind === Ast.SyntaxKind.TrueKeyword ? true : false];
|
5257 | }
|
5258 | else if (Ast.ts.isPropertyAccessExpression(localNode.initializer)) {
|
5259 | var identifier = this.parseSymbolElements(localNode.initializer);
|
5260 | return [identifier];
|
5261 | }
|
5262 | else if (Ast.ts.isArrayLiteralExpression(localNode.initializer)) {
|
5263 | return localNode.initializer.elements.map(function (x) { return _this.parseSymbolElements(x); });
|
5264 | }
|
5265 | else if (localNode.initializer &&
|
5266 | localNode.initializer.elements &&
|
5267 | localNode.initializer.elements.length > 0) {
|
5268 | // Node replaced by ts-simple-ast & kind = 265
|
5269 | return localNode.initializer.elements.map(function (x) { return _this.parseSymbolElements(x); });
|
5270 | }
|
5271 | };
|
5272 | SymbolHelper.prototype.getSymbolDeps = function (props, type, srcFile, multiLine) {
|
5273 | var _this = this;
|
5274 | if (props.length === 0) {
|
5275 | return [];
|
5276 | }
|
5277 | var i = 0, len = props.length, filteredProps = [];
|
5278 | for (i; i < len; i++) {
|
5279 | if (props[i].name && props[i].name.text === type) {
|
5280 | filteredProps.push(props[i]);
|
5281 | }
|
5282 | }
|
5283 | return filteredProps.map(function (x) { return _this.parseSymbols(x, srcFile); }).pop() || [];
|
5284 | };
|
5285 | SymbolHelper.prototype.getSymbolDepsRaw = function (props, type, multiLine) {
|
5286 | return props.filter(function (node) { return node.name.text === type; });
|
5287 | };
|
5288 | return SymbolHelper;
|
5289 | }());
|
5290 |
|
5291 | function cleanNameWithoutSpaceAndToLowerCase(name) {
|
5292 | return name.toLowerCase().replace(/ /g, '-');
|
5293 | }
|
5294 | function detectIndent(str, count, indent) {
|
5295 | var stripIndent = function (str) {
|
5296 | var match = str.match(/^[ \t]*(?=\S)/gm);
|
5297 | if (!match) {
|
5298 | return str;
|
5299 | }
|
5300 | // TODO: use spread operator when targeting Node.js 6
|
5301 | var indent = Math.min.apply(Math, match.map(function (x) { return x.length; })); // eslint-disable-line
|
5302 | var re = new RegExp("^[ \\t]{" + indent + "}", 'gm');
|
5303 | return indent > 0 ? str.replace(re, '') : str;
|
5304 | };
|
5305 | var repeating = function (n, str) {
|
5306 | str = str === undefined ? ' ' : str;
|
5307 | if (typeof str !== 'string') {
|
5308 | throw new TypeError("Expected `input` to be a `string`, got `" + typeof str + "`");
|
5309 | }
|
5310 | if (n < 0) {
|
5311 | throw new TypeError("Expected `count` to be a positive finite number, got `" + n + "`");
|
5312 | }
|
5313 | var ret = '';
|
5314 | do {
|
5315 | if (n & 1) {
|
5316 | ret += str;
|
5317 | }
|
5318 | str += str;
|
5319 | } while ((n >>= 1));
|
5320 | return ret;
|
5321 | };
|
5322 | var indentString = function (str, count, indent) {
|
5323 | indent = indent === undefined ? ' ' : indent;
|
5324 | count = count === undefined ? 1 : count;
|
5325 | if (typeof str !== 'string') {
|
5326 | throw new TypeError("Expected `input` to be a `string`, got `" + typeof str + "`");
|
5327 | }
|
5328 | if (typeof count !== 'number') {
|
5329 | throw new TypeError("Expected `count` to be a `number`, got `" + typeof count + "`");
|
5330 | }
|
5331 | if (typeof indent !== 'string') {
|
5332 | throw new TypeError("Expected `indent` to be a `string`, got `" + typeof indent + "`");
|
5333 | }
|
5334 | if (count === 0) {
|
5335 | return str;
|
5336 | }
|
5337 | indent = count > 1 ? repeating(count, indent) : indent;
|
5338 | return str.replace(/^(?!\s*$)/gm, indent);
|
5339 | };
|
5340 | return indentString(stripIndent(str), count || 0, indent);
|
5341 | }
|
5342 | // Create a compilerHost object to allow the compiler to read and write files
|
5343 | function compilerHost(transpileOptions) {
|
5344 | var inputFileName = transpileOptions.fileName || (transpileOptions.jsx ? 'module.tsx' : 'module.ts');
|
5345 | var toReturn = {
|
5346 | getSourceFile: function (fileName) {
|
5347 | if (fileName.lastIndexOf('.ts') !== -1 || fileName.lastIndexOf('.js') !== -1) {
|
5348 | if (fileName === 'lib.d.ts') {
|
5349 | return undefined;
|
5350 | }
|
5351 | if (fileName.substr(-5) === '.d.ts') {
|
5352 | return undefined;
|
5353 | }
|
5354 | if (path.isAbsolute(fileName) === false) {
|
5355 | fileName = path.join(transpileOptions.tsconfigDirectory, fileName);
|
5356 | }
|
5357 | if (!fs.existsSync(fileName)) {
|
5358 | return undefined;
|
5359 | }
|
5360 | var libSource = '';
|
5361 | try {
|
5362 | libSource = fs.readFileSync(fileName).toString();
|
5363 | if (hasBom(libSource)) {
|
5364 | libSource = stripBom(libSource);
|
5365 | }
|
5366 | }
|
5367 | catch (e) {
|
5368 | logger.debug(e, fileName);
|
5369 | }
|
5370 | return Ast.ts.createSourceFile(fileName, libSource, transpileOptions.target, false);
|
5371 | }
|
5372 | return undefined;
|
5373 | },
|
5374 | writeFile: function (name, text) { },
|
5375 | getDefaultLibFileName: function () { return 'lib.d.ts'; },
|
5376 | useCaseSensitiveFileNames: function () { return false; },
|
5377 | getCanonicalFileName: function (fileName) { return fileName; },
|
5378 | getCurrentDirectory: function () { return ''; },
|
5379 | getNewLine: function () { return '\n'; },
|
5380 | fileExists: function (fileName) { return fileName === inputFileName; },
|
5381 | readFile: function () { return ''; },
|
5382 | directoryExists: function () { return true; },
|
5383 | getDirectories: function () { return []; }
|
5384 | };
|
5385 | return toReturn;
|
5386 | }
|
5387 | function findMainSourceFolder(files) {
|
5388 | var mainFolder = '';
|
5389 | var mainFolderCount = 0;
|
5390 | var rawFolders = files.map(function (filepath) {
|
5391 | var shortPath = filepath.replace(process.cwd() + path.sep, '');
|
5392 | return path.dirname(shortPath);
|
5393 | });
|
5394 | var folders = {};
|
5395 | rawFolders = _.uniq(rawFolders);
|
5396 | for (var i = 0; i < rawFolders.length; i++) {
|
5397 | var sep = rawFolders[i].split(path.sep);
|
5398 | sep.map(function (folder) {
|
5399 | if (folders[folder]) {
|
5400 | folders[folder] += 1;
|
5401 | }
|
5402 | else {
|
5403 | folders[folder] = 1;
|
5404 | }
|
5405 | });
|
5406 | }
|
5407 | for (var f in folders) {
|
5408 | if (folders[f] > mainFolderCount) {
|
5409 | mainFolderCount = folders[f];
|
5410 | mainFolder = f;
|
5411 | }
|
5412 | }
|
5413 | return mainFolder;
|
5414 | }
|
5415 |
|
5416 | var ComponentHelper = /** @class */ (function () {
|
5417 | function ComponentHelper(classHelper, symbolHelper) {
|
5418 | if (symbolHelper === void 0) { symbolHelper = new SymbolHelper(); }
|
5419 | this.classHelper = classHelper;
|
5420 | this.symbolHelper = symbolHelper;
|
5421 | }
|
5422 | ComponentHelper.prototype.getComponentChangeDetection = function (props, srcFile) {
|
5423 | return this.symbolHelper.getSymbolDeps(props, 'changeDetection', srcFile).pop();
|
5424 | };
|
5425 | ComponentHelper.prototype.getComponentEncapsulation = function (props, srcFile) {
|
5426 | return this.symbolHelper.getSymbolDeps(props, 'encapsulation', srcFile);
|
5427 | };
|
5428 | ComponentHelper.prototype.getComponentPure = function (props, srcFile) {
|
5429 | return this.symbolHelper.getSymbolDeps(props, 'pure', srcFile).pop();
|
5430 | };
|
5431 | ComponentHelper.prototype.getComponentName = function (props, srcFile) {
|
5432 | return this.symbolHelper.getSymbolDeps(props, 'name', srcFile).pop();
|
5433 | };
|
5434 | ComponentHelper.prototype.getComponentExportAs = function (props, srcFile) {
|
5435 | return this.symbolHelper.getSymbolDeps(props, 'exportAs', srcFile).pop();
|
5436 | };
|
5437 | ComponentHelper.prototype.getComponentHost = function (props) {
|
5438 | return this.getSymbolDepsObject(props, 'host');
|
5439 | };
|
5440 | ComponentHelper.prototype.getComponentInputsMetadata = function (props, srcFile) {
|
5441 | return this.symbolHelper.getSymbolDeps(props, 'inputs', srcFile);
|
5442 | };
|
5443 | ComponentHelper.prototype.getComponentTemplate = function (props, srcFile) {
|
5444 | var t = this.symbolHelper.getSymbolDeps(props, 'template', srcFile, true).pop();
|
5445 | if (t) {
|
5446 | t = detectIndent(t, 0);
|
5447 | t = t.replace(/\n/, '');
|
5448 | t = t.replace(/ +$/gm, '');
|
5449 | }
|
5450 | return t;
|
5451 | };
|
5452 | ComponentHelper.prototype.getComponentStyleUrls = function (props, srcFile) {
|
5453 | return this.sanitizeUrls(this.symbolHelper.getSymbolDeps(props, 'styleUrls', srcFile));
|
5454 | };
|
5455 | ComponentHelper.prototype.getComponentStyles = function (props, srcFile) {
|
5456 | return this.symbolHelper.getSymbolDeps(props, 'styles', srcFile);
|
5457 | };
|
5458 | ComponentHelper.prototype.getComponentModuleId = function (props, srcFile) {
|
5459 | return this.symbolHelper.getSymbolDeps(props, 'moduleId', srcFile).pop();
|
5460 | };
|
5461 | ComponentHelper.prototype.getComponentOutputs = function (props, srcFile) {
|
5462 | return this.symbolHelper.getSymbolDeps(props, 'outputs', srcFile);
|
5463 | };
|
5464 | ComponentHelper.prototype.getComponentProviders = function (props, srcFile) {
|
5465 | var _this = this;
|
5466 | return this.symbolHelper
|
5467 | .getSymbolDeps(props, 'providers', srcFile)
|
5468 | .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
|
5469 | };
|
5470 | ComponentHelper.prototype.getComponentEntryComponents = function (props, srcFile) {
|
5471 | var _this = this;
|
5472 | return this.symbolHelper
|
5473 | .getSymbolDeps(props, 'entryComponents', srcFile)
|
5474 | .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
|
5475 | };
|
5476 | ComponentHelper.prototype.getComponentViewProviders = function (props, srcFile) {
|
5477 | var _this = this;
|
5478 | return this.symbolHelper
|
5479 | .getSymbolDeps(props, 'viewProviders', srcFile)
|
5480 | .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
|
5481 | };
|
5482 | ComponentHelper.prototype.getComponentTemplateUrl = function (props, srcFile) {
|
5483 | return this.symbolHelper.getSymbolDeps(props, 'templateUrl', srcFile);
|
5484 | };
|
5485 | ComponentHelper.prototype.getComponentExampleUrls = function (text) {
|
5486 | var exampleUrlsMatches = text.match(/<example-url>(.*?)<\/example-url>/g);
|
5487 | var exampleUrls = undefined;
|
5488 | if (exampleUrlsMatches && exampleUrlsMatches.length) {
|
5489 | exampleUrls = exampleUrlsMatches.map(function (val) {
|
5490 | return val.replace(/<\/?example-url>/g, '');
|
5491 | });
|
5492 | }
|
5493 | return exampleUrls;
|
5494 | };
|
5495 | ComponentHelper.prototype.getComponentPreserveWhitespaces = function (props, srcFile) {
|
5496 | return this.symbolHelper.getSymbolDeps(props, 'preserveWhitespaces', srcFile).pop();
|
5497 | };
|
5498 | ComponentHelper.prototype.getComponentSelector = function (props, srcFile) {
|
5499 | return this.symbolHelper.getSymbolDeps(props, 'selector', srcFile).pop();
|
5500 | };
|
5501 | ComponentHelper.prototype.parseProperties = function (node) {
|
5502 | var obj = new Map();
|
5503 | var properties = node.initializer.properties || [];
|
5504 | properties.forEach(function (prop) {
|
5505 | obj.set(prop.name.text, prop.initializer.text);
|
5506 | });
|
5507 | return obj;
|
5508 | };
|
5509 | ComponentHelper.prototype.getSymbolDepsObject = function (props, type, multiLine) {
|
5510 | var _this = this;
|
5511 | var i = 0, len = props.length, filteredProps = [];
|
5512 | for (i; i < len; i++) {
|
5513 | if (props[i].name && props[i].name.text === type) {
|
5514 | filteredProps.push(props[i]);
|
5515 | }
|
5516 | }
|
5517 | return filteredProps.map(function (x) { return _this.parseProperties(x); }).pop();
|
5518 | };
|
5519 | ComponentHelper.prototype.getComponentIO = function (filename, sourceFile, node, fileBody) {
|
5520 | var _this = this;
|
5521 | /**
|
5522 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
5523 | */
|
5524 | var reducedSource = fileBody ? fileBody.statements : sourceFile.statements;
|
5525 | var res = reducedSource.reduce(function (directive, statement) {
|
5526 | if (Ast.ts.isClassDeclaration(statement)) {
|
5527 | if (statement.pos === node.pos && statement.end === node.end) {
|
5528 | return directive.concat(_this.classHelper.visitClassDeclaration(filename, statement, sourceFile));
|
5529 | }
|
5530 | }
|
5531 | return directive;
|
5532 | }, []);
|
5533 | return res[0] || {};
|
5534 | };
|
5535 | ComponentHelper.prototype.sanitizeUrls = function (urls) {
|
5536 | return urls.map(function (url) { return url.replace('./', ''); });
|
5537 | };
|
5538 | return ComponentHelper;
|
5539 | }());
|
5540 | var ComponentCache = /** @class */ (function () {
|
5541 | function ComponentCache() {
|
5542 | this.cache = new Map();
|
5543 | }
|
5544 | ComponentCache.prototype.get = function (key) {
|
5545 | return this.cache.get(key);
|
5546 | };
|
5547 | ComponentCache.prototype.set = function (key, value) {
|
5548 | this.cache.set(key, value);
|
5549 | };
|
5550 | return ComponentCache;
|
5551 | }());
|
5552 |
|
5553 | var ExtendsMerger = /** @class */ (function () {
|
5554 | function ExtendsMerger() {
|
5555 | }
|
5556 | ExtendsMerger.prototype.merge = function (deps, configuration) {
|
5557 | var _this = this;
|
5558 | this.components = deps.components;
|
5559 | this.classes = deps.classes;
|
5560 | this.components.forEach(function (component) {
|
5561 | var ext;
|
5562 | if (typeof component.extends !== 'undefined') {
|
5563 | ext = _this.findInDependencies(component.extends);
|
5564 | if (ext) {
|
5565 | // From class to component
|
5566 | if (typeof ext.methods !== 'undefined' && ext.methods.length > 0) {
|
5567 | var newMethods = _.cloneDeep(ext.methods);
|
5568 | newMethods = _this.markInheritance(newMethods, ext);
|
5569 | if (typeof component.methodsClass !== 'undefined') {
|
5570 | component.methodsClass = component.methodsClass.concat(newMethods);
|
5571 | }
|
5572 | }
|
5573 | if (typeof ext.properties !== 'undefined' && ext.properties.length > 0) {
|
5574 | var newProperties = _.cloneDeep(ext.properties);
|
5575 | newProperties = _this.markInheritance(newProperties, ext);
|
5576 | if (typeof component.propertiesClass !== 'undefined') {
|
5577 | component.propertiesClass = component.propertiesClass.concat(newProperties);
|
5578 | }
|
5579 | }
|
5580 | // From component to component
|
5581 | if (typeof ext.inputsClass !== 'undefined' && ext.inputsClass.length > 0) {
|
5582 | var newInputs = _.cloneDeep(ext.inputsClass);
|
5583 | newInputs = _this.markInheritance(newInputs, ext);
|
5584 | if (typeof component.inputsClass !== 'undefined') {
|
5585 | component.inputsClass = component.inputsClass.concat(newInputs);
|
5586 | }
|
5587 | }
|
5588 | if (typeof ext.outputsClass !== 'undefined' && ext.outputsClass.length > 0) {
|
5589 | var newOutputs = _.cloneDeep(ext.outputsClass);
|
5590 | newOutputs = _this.markInheritance(newOutputs, ext);
|
5591 | if (typeof component.outputsClass !== 'undefined') {
|
5592 | component.outputsClass = component.outputsClass.concat(newOutputs);
|
5593 | }
|
5594 | }
|
5595 | if (typeof ext.methodsClass !== 'undefined' && ext.methodsClass.length > 0) {
|
5596 | var newMethods = _.cloneDeep(ext.methodsClass);
|
5597 | newMethods = _this.markInheritance(newMethods, ext);
|
5598 | if (typeof component.methodsClass !== 'undefined') {
|
5599 | component.methodsClass = component.methodsClass.concat(newMethods);
|
5600 | }
|
5601 | }
|
5602 | if (typeof ext.propertiesClass !== 'undefined' &&
|
5603 | ext.propertiesClass.length > 0) {
|
5604 | var newProperties = _.cloneDeep(ext.propertiesClass);
|
5605 | newProperties = _this.markInheritance(newProperties, ext);
|
5606 | if (typeof component.propertiesClass !== 'undefined') {
|
5607 | component.propertiesClass = component.propertiesClass.concat(newProperties);
|
5608 | }
|
5609 | }
|
5610 | if (typeof ext.hostBindings !== 'undefined' && ext.hostBindings.length > 0) {
|
5611 | var newHostBindings = _.cloneDeep(ext.hostBindings);
|
5612 | newHostBindings = _this.markInheritance(newHostBindings, ext);
|
5613 | if (typeof component.hostBindings !== 'undefined') {
|
5614 | component.hostBindings = component.hostBindings.concat(newHostBindings);
|
5615 | }
|
5616 | }
|
5617 | if (typeof ext.hostListeners !== 'undefined' && ext.hostListeners.length > 0) {
|
5618 | var newHostListeners = _.cloneDeep(ext.hostListeners);
|
5619 | newHostListeners = _this.markInheritance(newHostListeners, ext);
|
5620 | if (typeof component.hostListeners !== 'undefined') {
|
5621 | component.hostListeners = component.hostListeners.concat(newHostListeners);
|
5622 | }
|
5623 | }
|
5624 | if (configuration.mainData.disableLifeCycleHooks) {
|
5625 | component.methodsClass = cleanLifecycleHooksFromMethods(component.methodsClass);
|
5626 | }
|
5627 | }
|
5628 | }
|
5629 | });
|
5630 | this.classes.forEach(function (cla) {
|
5631 | var ext;
|
5632 | if (typeof cla.extends !== 'undefined') {
|
5633 | ext = _this.findInDependencies(cla.extends);
|
5634 | if (ext) {
|
5635 | // From class to class
|
5636 | if (typeof ext.methods !== 'undefined' && ext.methods.length > 0) {
|
5637 | var newMethods = _.cloneDeep(ext.methods);
|
5638 | newMethods = _this.markInheritance(newMethods, ext);
|
5639 | if (typeof cla.methods !== 'undefined') {
|
5640 | cla.methods = cla.methods.concat(newMethods);
|
5641 | }
|
5642 | }
|
5643 | if (typeof ext.properties !== 'undefined' && ext.properties.length > 0) {
|
5644 | var newProperties = _.cloneDeep(ext.properties);
|
5645 | newProperties = _this.markInheritance(newProperties, ext);
|
5646 | if (typeof cla.properties !== 'undefined') {
|
5647 | cla.properties = cla.properties.concat(newProperties);
|
5648 | }
|
5649 | }
|
5650 | }
|
5651 | }
|
5652 | });
|
5653 | return deps;
|
5654 | };
|
5655 | ExtendsMerger.prototype.markInheritance = function (data, originalource) {
|
5656 | return data.map(function (el) {
|
5657 | var newElement = el;
|
5658 | newElement.inheritance = {
|
5659 | file: originalource.name
|
5660 | };
|
5661 | return newElement;
|
5662 | });
|
5663 | };
|
5664 | ExtendsMerger.prototype.findInDependencies = function (name) {
|
5665 | var mergedData = _.concat([], this.components, this.classes);
|
5666 | var result = _.find(mergedData, { name: name });
|
5667 | return result || false;
|
5668 | };
|
5669 | return ExtendsMerger;
|
5670 | }());
|
5671 |
|
5672 | var FrameworkDependencies = /** @class */ (function () {
|
5673 | function FrameworkDependencies(files, options, configuration, routerParser) {
|
5674 | this.files = files;
|
5675 | this.configuration = configuration;
|
5676 | this.routerParser = routerParser;
|
5677 | var transpileOptions = {
|
5678 | target: Ast.ts.ScriptTarget.ES5,
|
5679 | module: Ast.ts.ModuleKind.CommonJS,
|
5680 | tsconfigDirectory: options.tsconfigDirectory,
|
5681 | allowJs: true
|
5682 | };
|
5683 | this.program = Ast.ts.createProgram(this.files, transpileOptions, compilerHost(transpileOptions));
|
5684 | this.typeChecker = this.program.getTypeChecker();
|
5685 | this.classHelper = new ClassHelper(this.typeChecker, this.configuration);
|
5686 | this.componentHelper = new ComponentHelper(this.classHelper);
|
5687 | this.extendsMerger = new ExtendsMerger();
|
5688 | }
|
5689 | return FrameworkDependencies;
|
5690 | }());
|
5691 |
|
5692 | var CodeGenerator = /** @class */ (function () {
|
5693 | function CodeGenerator() {
|
5694 | }
|
5695 | CodeGenerator.prototype.generate = function (node) {
|
5696 | return this.visitAndRecognize(node, []).join('');
|
5697 | };
|
5698 | CodeGenerator.prototype.visitAndRecognize = function (node, code, depth) {
|
5699 | var _this = this;
|
5700 | if (depth === void 0) { depth = 0; }
|
5701 | this.recognize(node, code);
|
5702 | node.getChildren().forEach(function (c) { return _this.visitAndRecognize(c, code, depth + 1); });
|
5703 | return code;
|
5704 | };
|
5705 | CodeGenerator.prototype.recognize = function (node, code) {
|
5706 | var _this = this;
|
5707 | var conversion = TsKindConversion.find(function (x) { return x.kinds.some(function (z) { return z === node.kind; }); });
|
5708 | if (conversion) {
|
5709 | var result = conversion.output(node);
|
5710 | result.forEach(function (text) { return _this.gen(text, code); });
|
5711 | }
|
5712 | };
|
5713 | CodeGenerator.prototype.gen = function (token, code) {
|
5714 | if (!token) {
|
5715 | return;
|
5716 | }
|
5717 | if (token === '\n') {
|
5718 | code.push('');
|
5719 | }
|
5720 | else {
|
5721 | code.push(token);
|
5722 | }
|
5723 | };
|
5724 | return CodeGenerator;
|
5725 | }());
|
5726 | var TsKindsToText = /** @class */ (function () {
|
5727 | function TsKindsToText(output, kinds) {
|
5728 | this.output = output;
|
5729 | this.kinds = kinds;
|
5730 | }
|
5731 | return TsKindsToText;
|
5732 | }());
|
5733 | var TsKindConversion = [
|
5734 | new TsKindsToText(function (node) { return ['"', node.text, '"']; }, [
|
5735 | Ast.SyntaxKind.FirstLiteralToken,
|
5736 | Ast.SyntaxKind.Identifier
|
5737 | ]),
|
5738 | new TsKindsToText(function (node) { return ['"', node.text, '"']; }, [Ast.SyntaxKind.StringLiteral]),
|
5739 | new TsKindsToText(function (node) { return []; }, [Ast.SyntaxKind.ArrayLiteralExpression]),
|
5740 | new TsKindsToText(function (node) { return ['import', ' ']; }, [Ast.SyntaxKind.ImportKeyword]),
|
5741 | new TsKindsToText(function (node) { return ['from', ' ']; }, [Ast.SyntaxKind.FromKeyword]),
|
5742 | new TsKindsToText(function (node) { return ['\n', 'export', ' ']; }, [Ast.SyntaxKind.ExportKeyword]),
|
5743 | new TsKindsToText(function (node) { return ['class', ' ']; }, [Ast.SyntaxKind.ClassKeyword]),
|
5744 | new TsKindsToText(function (node) { return ['this']; }, [Ast.SyntaxKind.ThisKeyword]),
|
5745 | new TsKindsToText(function (node) { return ['constructor']; }, [Ast.SyntaxKind.ConstructorKeyword]),
|
5746 | new TsKindsToText(function (node) { return ['false']; }, [Ast.SyntaxKind.FalseKeyword]),
|
5747 | new TsKindsToText(function (node) { return ['true']; }, [Ast.SyntaxKind.TrueKeyword]),
|
5748 | new TsKindsToText(function (node) { return ['null']; }, [Ast.SyntaxKind.NullKeyword]),
|
5749 | new TsKindsToText(function (node) { return []; }, [Ast.SyntaxKind.AtToken]),
|
5750 | new TsKindsToText(function (node) { return ['+']; }, [Ast.SyntaxKind.PlusToken]),
|
5751 | new TsKindsToText(function (node) { return [' => ']; }, [Ast.SyntaxKind.EqualsGreaterThanToken]),
|
5752 | new TsKindsToText(function (node) { return ['(']; }, [Ast.SyntaxKind.OpenParenToken]),
|
5753 | new TsKindsToText(function (node) { return ['{', ' ']; }, [
|
5754 | Ast.SyntaxKind.ImportClause,
|
5755 | Ast.SyntaxKind.ObjectLiteralExpression
|
5756 | ]),
|
5757 | new TsKindsToText(function (node) { return ['{', '\n']; }, [Ast.SyntaxKind.Block]),
|
5758 | new TsKindsToText(function (node) { return ['}']; }, [Ast.SyntaxKind.CloseBraceToken]),
|
5759 | new TsKindsToText(function (node) { return [')']; }, [Ast.SyntaxKind.CloseParenToken]),
|
5760 | new TsKindsToText(function (node) { return ['[']; }, [Ast.SyntaxKind.OpenBracketToken]),
|
5761 | new TsKindsToText(function (node) { return [']']; }, [Ast.SyntaxKind.CloseBracketToken]),
|
5762 | new TsKindsToText(function (node) { return [';', '\n']; }, [Ast.SyntaxKind.SemicolonToken]),
|
5763 | new TsKindsToText(function (node) { return [',', ' ']; }, [Ast.SyntaxKind.CommaToken]),
|
5764 | new TsKindsToText(function (node) { return [' ', ':', ' ']; }, [Ast.SyntaxKind.ColonToken]),
|
5765 | new TsKindsToText(function (node) { return ['.']; }, [Ast.SyntaxKind.DotToken]),
|
5766 | new TsKindsToText(function (node) { return []; }, [Ast.SyntaxKind.DoStatement]),
|
5767 | new TsKindsToText(function (node) { return []; }, [Ast.SyntaxKind.Decorator]),
|
5768 | new TsKindsToText(function (node) { return [' = ']; }, [Ast.SyntaxKind.FirstAssignment]),
|
5769 | new TsKindsToText(function (node) { return [' ']; }, [Ast.SyntaxKind.FirstPunctuation]),
|
5770 | new TsKindsToText(function (node) { return ['private', ' ']; }, [Ast.SyntaxKind.PrivateKeyword]),
|
5771 | new TsKindsToText(function (node) { return ['public', ' ']; }, [Ast.SyntaxKind.PublicKeyword])
|
5772 | ];
|
5773 |
|
5774 | var crypto$1 = require('crypto');
|
5775 | var DirectiveDepFactory = /** @class */ (function () {
|
5776 | function DirectiveDepFactory(helper, configuration) {
|
5777 | this.helper = helper;
|
5778 | this.configuration = configuration;
|
5779 | }
|
5780 | DirectiveDepFactory.prototype.create = function (file, srcFile, name, props, IO) {
|
5781 | var sourceCode = srcFile.getText();
|
5782 | var hash = crypto$1.createHash('md5').update(sourceCode).digest('hex');
|
5783 | var directiveDeps = {
|
5784 | name: name,
|
5785 | id: 'directive-' + name + '-' + hash,
|
5786 | file: file,
|
5787 | type: 'directive',
|
5788 | description: IO.description,
|
5789 | sourceCode: srcFile.getText(),
|
5790 | selector: this.helper.getComponentSelector(props),
|
5791 | providers: this.helper.getComponentProviders(props),
|
5792 | inputsClass: IO.inputs,
|
5793 | outputsClass: IO.outputs,
|
5794 | hostBindings: IO.hostBindings,
|
5795 | hostListeners: IO.hostListeners,
|
5796 | propertiesClass: IO.properties,
|
5797 | methodsClass: IO.methods,
|
5798 | exampleUrls: this.helper.getComponentExampleUrls(srcFile.getText())
|
5799 | };
|
5800 | if (this.configuration.mainData.disableLifeCycleHooks) {
|
5801 | directiveDeps.methodsClass = cleanLifecycleHooksFromMethods(directiveDeps.methodsClass);
|
5802 | }
|
5803 | if (IO.jsdoctags && IO.jsdoctags.length > 0) {
|
5804 | directiveDeps.jsdoctags = IO.jsdoctags[0].tags;
|
5805 | }
|
5806 | if (IO.implements && IO.implements.length > 0) {
|
5807 | directiveDeps.implements = IO.implements;
|
5808 | }
|
5809 | if (IO.constructor) {
|
5810 | directiveDeps.constructorObj = IO.constructor;
|
5811 | }
|
5812 | if (IO.accessors) {
|
5813 | directiveDeps.accessors = IO.accessors;
|
5814 | }
|
5815 | return directiveDeps;
|
5816 | };
|
5817 | return DirectiveDepFactory;
|
5818 | }());
|
5819 |
|
5820 | var crypto$2 = require('crypto');
|
5821 | var ModuleDepFactory = /** @class */ (function () {
|
5822 | function ModuleDepFactory(moduleHelper) {
|
5823 | this.moduleHelper = moduleHelper;
|
5824 | }
|
5825 | ModuleDepFactory.prototype.create = function (file, srcFile, name, properties, IO) {
|
5826 | var sourceCode = srcFile.getText();
|
5827 | var hash = crypto$2
|
5828 | .createHash('md5')
|
5829 | .update(sourceCode)
|
5830 | .digest('hex');
|
5831 | return {
|
5832 | name: name,
|
5833 | id: 'module-' + name + '-' + hash,
|
5834 | file: file,
|
5835 | ngid: this.moduleHelper.getModuleId(properties, srcFile),
|
5836 | providers: this.moduleHelper.getModuleProviders(properties, srcFile),
|
5837 | declarations: this.moduleHelper.getModuleDeclarations(properties, srcFile),
|
5838 | controllers: this.moduleHelper.getModuleControllers(properties, srcFile),
|
5839 | entryComponents: this.moduleHelper.getModuleEntryComponents(properties, srcFile),
|
5840 | imports: this.moduleHelper.getModuleImports(properties, srcFile),
|
5841 | exports: this.moduleHelper.getModuleExports(properties, srcFile),
|
5842 | schemas: this.moduleHelper.getModuleSchemas(properties, srcFile),
|
5843 | bootstrap: this.moduleHelper.getModuleBootstrap(properties, srcFile),
|
5844 | type: 'module',
|
5845 | description: IO.description,
|
5846 | sourceCode: srcFile.text
|
5847 | };
|
5848 | };
|
5849 | return ModuleDepFactory;
|
5850 | }());
|
5851 |
|
5852 | var crypto$3 = require('crypto');
|
5853 | var ComponentDepFactory = /** @class */ (function () {
|
5854 | function ComponentDepFactory(helper, configuration) {
|
5855 | this.helper = helper;
|
5856 | this.configuration = configuration;
|
5857 | }
|
5858 | ComponentDepFactory.prototype.create = function (file, srcFile, name, props, IO) {
|
5859 | // console.log(util.inspect(props, { showHidden: true, depth: 10 }));
|
5860 | var sourceCode = srcFile.getText();
|
5861 | var hash = crypto$3
|
5862 | .createHash('md5')
|
5863 | .update(sourceCode)
|
5864 | .digest('hex');
|
5865 | var componentDep = {
|
5866 | name: name,
|
5867 | id: 'component-' + name + '-' + hash,
|
5868 | file: file,
|
5869 | // animations?: string[]; // TODO
|
5870 | changeDetection: this.helper.getComponentChangeDetection(props, srcFile),
|
5871 | encapsulation: this.helper.getComponentEncapsulation(props, srcFile),
|
5872 | entryComponents: this.helper.getComponentEntryComponents(props, srcFile),
|
5873 | exportAs: this.helper.getComponentExportAs(props, srcFile),
|
5874 | host: this.helper.getComponentHost(props),
|
5875 | inputs: this.helper.getComponentInputsMetadata(props, srcFile),
|
5876 | // interpolation?: string; // TODO waiting doc infos
|
5877 | moduleId: this.helper.getComponentModuleId(props, srcFile),
|
5878 | outputs: this.helper.getComponentOutputs(props, srcFile),
|
5879 | providers: this.helper.getComponentProviders(props, srcFile),
|
5880 | // queries?: Deps[]; // TODO
|
5881 | selector: this.helper.getComponentSelector(props, srcFile),
|
5882 | styleUrls: this.helper.getComponentStyleUrls(props, srcFile),
|
5883 | styles: this.helper.getComponentStyles(props, srcFile),
|
5884 | template: this.helper.getComponentTemplate(props, srcFile),
|
5885 | templateUrl: this.helper.getComponentTemplateUrl(props, srcFile),
|
5886 | viewProviders: this.helper.getComponentViewProviders(props, srcFile),
|
5887 | inputsClass: IO.inputs,
|
5888 | outputsClass: IO.outputs,
|
5889 | propertiesClass: IO.properties,
|
5890 | methodsClass: IO.methods,
|
5891 | hostBindings: IO.hostBindings,
|
5892 | hostListeners: IO.hostListeners,
|
5893 | description: IO.description,
|
5894 | type: 'component',
|
5895 | sourceCode: srcFile.getText(),
|
5896 | exampleUrls: this.helper.getComponentExampleUrls(srcFile.getText())
|
5897 | };
|
5898 | if (typeof this.helper.getComponentPreserveWhitespaces(props, srcFile) !== 'undefined') {
|
5899 | componentDep.preserveWhitespaces = this.helper.getComponentPreserveWhitespaces(props, srcFile);
|
5900 | }
|
5901 | if (this.configuration.mainData.disableLifeCycleHooks) {
|
5902 | componentDep.methodsClass = cleanLifecycleHooksFromMethods(componentDep.methodsClass);
|
5903 | }
|
5904 | if (IO.jsdoctags && IO.jsdoctags.length > 0) {
|
5905 | componentDep.jsdoctags = IO.jsdoctags[0].tags;
|
5906 | }
|
5907 | if (IO.constructor) {
|
5908 | componentDep.constructorObj = IO.constructor;
|
5909 | }
|
5910 | if (IO.extends) {
|
5911 | componentDep.extends = IO.extends;
|
5912 | }
|
5913 | if (IO.implements && IO.implements.length > 0) {
|
5914 | componentDep.implements = IO.implements;
|
5915 | }
|
5916 | if (IO.accessors) {
|
5917 | componentDep.accessors = IO.accessors;
|
5918 | }
|
5919 | return componentDep;
|
5920 | };
|
5921 | return ComponentDepFactory;
|
5922 | }());
|
5923 |
|
5924 | var crypto$4 = require('crypto');
|
5925 | var ControllerDepFactory = /** @class */ (function () {
|
5926 | function ControllerDepFactory() {
|
5927 | }
|
5928 | ControllerDepFactory.prototype.create = function (file, srcFile, name, properties, IO) {
|
5929 | var sourceCode = srcFile.getText();
|
5930 | var hash = crypto$4
|
5931 | .createHash('md5')
|
5932 | .update(sourceCode)
|
5933 | .digest('hex');
|
5934 | var infos = {
|
5935 | name: name,
|
5936 | id: 'controller-' + name + '-' + hash,
|
5937 | file: file,
|
5938 | methods: IO.methods,
|
5939 | type: 'controller',
|
5940 | sourceCode: srcFile.text
|
5941 | };
|
5942 | if (properties && properties.length === 1) {
|
5943 | if (properties[0].text) {
|
5944 | infos.prefix = properties[0].text;
|
5945 | }
|
5946 | }
|
5947 | return infos;
|
5948 | };
|
5949 | return ControllerDepFactory;
|
5950 | }());
|
5951 |
|
5952 | var ModuleHelper = /** @class */ (function () {
|
5953 | function ModuleHelper(cache, symbolHelper) {
|
5954 | if (symbolHelper === void 0) { symbolHelper = new SymbolHelper(); }
|
5955 | this.cache = cache;
|
5956 | this.symbolHelper = symbolHelper;
|
5957 | }
|
5958 | ModuleHelper.prototype.getModuleProviders = function (props, srcFile) {
|
5959 | var _this = this;
|
5960 | return this.symbolHelper
|
5961 | .getSymbolDeps(props, 'providers', srcFile)
|
5962 | .map(function (providerName) { return _this.symbolHelper.parseDeepIndentifier(providerName, srcFile); });
|
5963 | };
|
5964 | ModuleHelper.prototype.getModuleControllers = function (props, srcFile) {
|
5965 | var _this = this;
|
5966 | return this.symbolHelper
|
5967 | .getSymbolDeps(props, 'controllers', srcFile)
|
5968 | .map(function (providerName) { return _this.symbolHelper.parseDeepIndentifier(providerName, srcFile); });
|
5969 | };
|
5970 | ModuleHelper.prototype.getModuleDeclarations = function (props, srcFile) {
|
5971 | var _this = this;
|
5972 | return this.symbolHelper.getSymbolDeps(props, 'declarations', srcFile).map(function (name) {
|
5973 | var component = _this.cache.get(name);
|
5974 | if (component) {
|
5975 | return component;
|
5976 | }
|
5977 | return _this.symbolHelper.parseDeepIndentifier(name, srcFile);
|
5978 | });
|
5979 | };
|
5980 | ModuleHelper.prototype.getModuleEntryComponents = function (props, srcFile) {
|
5981 | var _this = this;
|
5982 | return this.symbolHelper.getSymbolDeps(props, 'entryComponents', srcFile).map(function (name) {
|
5983 | var component = _this.cache.get(name);
|
5984 | if (component) {
|
5985 | return component;
|
5986 | }
|
5987 | return _this.symbolHelper.parseDeepIndentifier(name, srcFile);
|
5988 | });
|
5989 | };
|
5990 | ModuleHelper.prototype.cleanImportForRootForChild = function (name) {
|
5991 | var nsModule = name.split('.');
|
5992 | if (nsModule.length > 0) {
|
5993 | name = nsModule[0];
|
5994 | }
|
5995 | return name;
|
5996 | };
|
5997 | ModuleHelper.prototype.getModuleImports = function (props, srcFile) {
|
5998 | var _this = this;
|
5999 | return this.symbolHelper
|
6000 | .getSymbolDeps(props, 'imports', srcFile)
|
6001 | .map(function (name) { return _this.cleanImportForRootForChild(name); })
|
6002 | .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
|
6003 | };
|
6004 | ModuleHelper.prototype.getModuleExports = function (props, srcFile) {
|
6005 | var _this = this;
|
6006 | return this.symbolHelper
|
6007 | .getSymbolDeps(props, 'exports', srcFile)
|
6008 | .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name, srcFile); });
|
6009 | };
|
6010 | ModuleHelper.prototype.getModuleImportsRaw = function (props, srcFile) {
|
6011 | return this.symbolHelper.getSymbolDepsRaw(props, 'imports');
|
6012 | };
|
6013 | ModuleHelper.prototype.getModuleId = function (props, srcFile) {
|
6014 | var _id = this.symbolHelper.getSymbolDeps(props, 'id', srcFile), id;
|
6015 | if (_id.length === 1) {
|
6016 | id = _id[0];
|
6017 | }
|
6018 | return id;
|
6019 | };
|
6020 | ModuleHelper.prototype.getModuleSchemas = function (props, srcFile) {
|
6021 | var schemas = this.symbolHelper.getSymbolDeps(props, 'schemas', srcFile);
|
6022 | return schemas;
|
6023 | };
|
6024 | ModuleHelper.prototype.getModuleBootstrap = function (props, srcFile) {
|
6025 | var _this = this;
|
6026 | return this.symbolHelper
|
6027 | .getSymbolDeps(props, 'bootstrap', srcFile)
|
6028 | .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name, srcFile); });
|
6029 | };
|
6030 | return ModuleHelper;
|
6031 | }());
|
6032 |
|
6033 | var JsDocHelper = /** @class */ (function () {
|
6034 | function JsDocHelper() {
|
6035 | }
|
6036 | JsDocHelper.prototype.hasJSDocInternalTag = function (filename, sourceFile, node) {
|
6037 | if (typeof sourceFile.statements !== 'undefined') {
|
6038 | return this.checkStatements(sourceFile.statements, node);
|
6039 | }
|
6040 | return false;
|
6041 | };
|
6042 | JsDocHelper.prototype.checkStatements = function (statements, node) {
|
6043 | var _this = this;
|
6044 | return statements.some(function (x) { return _this.checkStatement(x, node); });
|
6045 | };
|
6046 | JsDocHelper.prototype.checkStatement = function (statement, node) {
|
6047 | if (statement.pos === node.pos && statement.end === node.end) {
|
6048 | if (node.jsDoc && node.jsDoc.length > 0) {
|
6049 | return this.checkJsDocs(node.jsDoc);
|
6050 | }
|
6051 | }
|
6052 | return false;
|
6053 | };
|
6054 | JsDocHelper.prototype.checkJsDocs = function (jsDocs) {
|
6055 | var _this = this;
|
6056 | return jsDocs
|
6057 | .filter(function (x) { return x.tags && x.tags.length > 0; })
|
6058 | .some(function (x) { return _this.checkJsDocTags(x.tags); });
|
6059 | };
|
6060 | JsDocHelper.prototype.checkJsDocTags = function (tags) {
|
6061 | return tags.some(function (x) { return x.tagName && x.tagName.text === 'internal'; });
|
6062 | };
|
6063 | return JsDocHelper;
|
6064 | }());
|
6065 |
|
6066 | var crypto$5 = require('crypto');
|
6067 | var marked$3 = require('marked');
|
6068 | var ast$2 = new Ast__default();
|
6069 | // TypeScript reference : https://github.com/Microsoft/TypeScript/blob/master/lib/typescript.d.ts
|
6070 | var AngularDependencies = /** @class */ (function (_super) {
|
6071 | __extends(AngularDependencies, _super);
|
6072 | function AngularDependencies(files, options, configuration, routerParser) {
|
6073 | var _this = _super.call(this, files, options, configuration, routerParser) || this;
|
6074 | _this.cache = new ComponentCache();
|
6075 | _this.moduleHelper = new ModuleHelper(_this.cache);
|
6076 | _this.jsDocHelper = new JsDocHelper();
|
6077 | _this.symbolHelper = new SymbolHelper();
|
6078 | _this.jsdocParserUtil = new JsdocParserUtil();
|
6079 | _this.importsUtil = new ImportsUtil();
|
6080 | return _this;
|
6081 | }
|
6082 | AngularDependencies.prototype.getDependencies = function () {
|
6083 | var _this = this;
|
6084 | var deps = {
|
6085 | modules: [],
|
6086 | modulesForGraph: [],
|
6087 | components: [],
|
6088 | controllers: [],
|
6089 | injectables: [],
|
6090 | interceptors: [],
|
6091 | guards: [],
|
6092 | pipes: [],
|
6093 | directives: [],
|
6094 | routes: [],
|
6095 | classes: [],
|
6096 | interfaces: [],
|
6097 | miscellaneous: {
|
6098 | variables: [],
|
6099 | functions: [],
|
6100 | typealiases: [],
|
6101 | enumerations: []
|
6102 | },
|
6103 | routesTree: undefined
|
6104 | };
|
6105 | var sourceFiles = this.program.getSourceFiles() || [];
|
6106 | sourceFiles.map(function (file) {
|
6107 | var filePath = file.fileName;
|
6108 | if (path.extname(filePath) === '.ts') {
|
6109 | if (!_this.configuration.mainData.angularJSProject &&
|
6110 | path.extname(filePath) === '.js') {
|
6111 | logger.info('parsing', filePath);
|
6112 | _this.getSourceFileDecorators(file, deps);
|
6113 | }
|
6114 | else {
|
6115 | if (filePath.lastIndexOf('.d.ts') === -1 &&
|
6116 | filePath.lastIndexOf('spec.ts') === -1) {
|
6117 | logger.info('parsing', filePath);
|
6118 | _this.getSourceFileDecorators(file, deps);
|
6119 | }
|
6120 | }
|
6121 | }
|
6122 | return deps;
|
6123 | });
|
6124 | // End of file scanning
|
6125 | // Try merging inside the same file declarated variables & modules with imports | exports | declarations | providers
|
6126 | if (deps.miscellaneous.variables.length > 0) {
|
6127 | deps.miscellaneous.variables.forEach(function (_variable) {
|
6128 | var newVar = [];
|
6129 | (function (_var, _newVar) {
|
6130 | // getType pr reconstruire....
|
6131 | if (_var.initializer) {
|
6132 | if (_var.initializer.elements) {
|
6133 | if (_var.initializer.elements.length > 0) {
|
6134 | _var.initializer.elements.forEach(function (element) {
|
6135 | if (element.text) {
|
6136 | newVar.push({
|
6137 | name: element.text,
|
6138 | type: _this.symbolHelper.getType(element.text)
|
6139 | });
|
6140 | }
|
6141 | });
|
6142 | }
|
6143 | }
|
6144 | }
|
6145 | })(_variable, newVar);
|
6146 | var onLink = function (mod) {
|
6147 | var process = function (initialArray, _var) {
|
6148 | var indexToClean = 0;
|
6149 | var found = false;
|
6150 | var findVariableInArray = function (el, index, theArray) {
|
6151 | if (el.name === _var.name) {
|
6152 | indexToClean = index;
|
6153 | found = true;
|
6154 | }
|
6155 | };
|
6156 | initialArray.forEach(findVariableInArray);
|
6157 | // Clean indexes to replace
|
6158 | if (found) {
|
6159 | initialArray.splice(indexToClean, 1);
|
6160 | // Add variable
|
6161 | newVar.forEach(function (newEle) {
|
6162 | if (typeof _.find(initialArray, { name: newEle.name }) ===
|
6163 | 'undefined') {
|
6164 | initialArray.push(newEle);
|
6165 | }
|
6166 | });
|
6167 | }
|
6168 | };
|
6169 | process(mod.imports, _variable);
|
6170 | process(mod.exports, _variable);
|
6171 | process(mod.controllers, _variable);
|
6172 | process(mod.declarations, _variable);
|
6173 | process(mod.providers, _variable);
|
6174 | };
|
6175 | deps.modules.forEach(onLink);
|
6176 | deps.modulesForGraph.forEach(onLink);
|
6177 | });
|
6178 | }
|
6179 | /**
|
6180 | * If one thing extends another, merge them, only for internal sources
|
6181 | * - classes
|
6182 | * - components
|
6183 | * for
|
6184 | * - inputs
|
6185 | * - outputs
|
6186 | * - properties
|
6187 | * - methods
|
6188 | */
|
6189 | deps = this.extendsMerger.merge(deps, this.configuration);
|
6190 | // this.routerParser.printModulesRoutes();
|
6191 | // this.routerParser.printRoutes();
|
6192 | if (!this.configuration.mainData.disableRoutesGraph) {
|
6193 | this.routerParser.linkModulesAndRoutes();
|
6194 | this.routerParser.constructModulesTree();
|
6195 | deps.routesTree = this.routerParser.constructRoutesTree();
|
6196 | }
|
6197 | return deps;
|
6198 | };
|
6199 | AngularDependencies.prototype.processClass = function (node, file, srcFile, outputSymbols, fileBody) {
|
6200 | var name = this.getSymboleName(node);
|
6201 | var IO = this.getClassIO(file, srcFile, node, fileBody);
|
6202 | var sourceCode = srcFile.getText();
|
6203 | var hash = crypto$5
|
6204 | .createHash('md5')
|
6205 | .update(sourceCode)
|
6206 | .digest('hex');
|
6207 | var deps = {
|
6208 | name: name,
|
6209 | id: 'class-' + name + '-' + hash,
|
6210 | file: file,
|
6211 | type: 'class',
|
6212 | sourceCode: srcFile.getText()
|
6213 | };
|
6214 | var excludeFromClassArray = false;
|
6215 | if (IO.constructor) {
|
6216 | deps.constructorObj = IO.constructor;
|
6217 | }
|
6218 | if (IO.properties) {
|
6219 | deps.properties = IO.properties;
|
6220 | }
|
6221 | if (IO.description) {
|
6222 | deps.description = IO.description;
|
6223 | }
|
6224 | if (IO.methods) {
|
6225 | deps.methods = IO.methods;
|
6226 | }
|
6227 | if (IO.indexSignatures) {
|
6228 | deps.indexSignatures = IO.indexSignatures;
|
6229 | }
|
6230 | if (IO.extends) {
|
6231 | deps.extends = IO.extends;
|
6232 | }
|
6233 | if (IO.jsdoctags && IO.jsdoctags.length > 0) {
|
6234 | deps.jsdoctags = IO.jsdoctags[0].tags;
|
6235 | }
|
6236 | if (IO.accessors) {
|
6237 | deps.accessors = IO.accessors;
|
6238 | }
|
6239 | if (IO.inputs) {
|
6240 | deps.inputsClass = IO.inputs;
|
6241 | }
|
6242 | if (IO.outputs) {
|
6243 | deps.outputsClass = IO.outputs;
|
6244 | }
|
6245 | if (IO.hostBindings) {
|
6246 | deps.hostBindings = IO.hostBindings;
|
6247 | }
|
6248 | if (IO.hostListeners) {
|
6249 | deps.hostListeners = IO.hostListeners;
|
6250 | }
|
6251 | if (this.configuration.mainData.disableLifeCycleHooks) {
|
6252 | deps.methods = cleanLifecycleHooksFromMethods(deps.methods);
|
6253 | }
|
6254 | if (IO.implements && IO.implements.length > 0) {
|
6255 | deps.implements = IO.implements;
|
6256 | if (this.isGuard(IO.implements)) {
|
6257 | // We don't want the Guard to show up in the Classes menu
|
6258 | excludeFromClassArray = true;
|
6259 | deps.type = 'guard';
|
6260 | outputSymbols.guards.push(deps);
|
6261 | }
|
6262 | }
|
6263 | if (typeof IO.ignore === 'undefined') {
|
6264 | this.debug(deps);
|
6265 | if (!excludeFromClassArray) {
|
6266 | outputSymbols.classes.push(deps);
|
6267 | }
|
6268 | }
|
6269 | else {
|
6270 | this.ignore(deps);
|
6271 | }
|
6272 | };
|
6273 | AngularDependencies.prototype.getSourceFileDecorators = function (initialSrcFile, outputSymbols) {
|
6274 | var _this = this;
|
6275 | var cleaner = (process.cwd() + path.sep).replace(/\\/g, '/');
|
6276 | var fileName = initialSrcFile.fileName.replace(cleaner, '');
|
6277 | var scannedFile = initialSrcFile;
|
6278 | // Search in file for variable statement as routes definitions
|
6279 | var astFile = typeof ast$2.getSourceFile(initialSrcFile.fileName) !== 'undefined'
|
6280 | ? ast$2.getSourceFile(initialSrcFile.fileName)
|
6281 | : ast$2.addExistingSourceFile(initialSrcFile.fileName);
|
6282 | var variableRoutesStatements = astFile.getVariableStatements();
|
6283 | var hasRoutesStatements = false;
|
6284 | if (variableRoutesStatements.length > 0) {
|
6285 | // Clean file for spread and dynamics inside routes definitions
|
6286 | variableRoutesStatements.forEach(function (s) {
|
6287 | var variableDeclarations = s.getDeclarations();
|
6288 | var len = variableDeclarations.length;
|
6289 | var i = 0;
|
6290 | for (i; i < len; i++) {
|
6291 | if (variableDeclarations[i].compilerNode.type) {
|
6292 | if (variableDeclarations[i].compilerNode.type.typeName &&
|
6293 | variableDeclarations[i].compilerNode.type.typeName.text === 'Routes') {
|
6294 | hasRoutesStatements = true;
|
6295 | }
|
6296 | }
|
6297 | }
|
6298 | });
|
6299 | }
|
6300 | if (hasRoutesStatements && !this.configuration.mainData.disableRoutesGraph) {
|
6301 | // Clean file for spread and dynamics inside routes definitions
|
6302 | logger.info('Analysing routes definitions and clean them if necessary');
|
6303 | // scannedFile = this.routerParser.cleanFileIdentifiers(astFile).compilerNode;
|
6304 | var firstClean = this.routerParser.cleanFileSpreads(astFile).compilerNode;
|
6305 | scannedFile = this.routerParser.cleanCallExpressions(astFile).compilerNode;
|
6306 | scannedFile = this.routerParser.cleanFileDynamics(astFile).compilerNode;
|
6307 | scannedFile.kind = Ast.SyntaxKind.SourceFile;
|
6308 | }
|
6309 | Ast.ts.forEachChild(scannedFile, function (initialNode) {
|
6310 | if (_this.jsDocHelper.hasJSDocInternalTag(fileName, scannedFile, initialNode) &&
|
6311 | _this.configuration.mainData.disableInternal) {
|
6312 | return;
|
6313 | }
|
6314 | var parseNode = function (file, srcFile, node, fileBody) {
|
6315 | var sourceCode = srcFile.getText();
|
6316 | var hash = crypto$5
|
6317 | .createHash('md5')
|
6318 | .update(sourceCode)
|
6319 | .digest('hex');
|
6320 | if (node.decorators) {
|
6321 | var classWithCustomDecorator_1 = false;
|
6322 | var visitDecorator = function (visitedDecorator, index) {
|
6323 | var deps;
|
6324 | var metadata = node.decorators;
|
6325 | var name = _this.getSymboleName(node);
|
6326 | var props = _this.findProperties(visitedDecorator, srcFile);
|
6327 | var IO = _this.componentHelper.getComponentIO(file, srcFile, node, fileBody);
|
6328 | if (_this.isModule(visitedDecorator)) {
|
6329 | var moduleDep = new ModuleDepFactory(_this.moduleHelper).create(file, srcFile, name, props, IO);
|
6330 | if (_this.routerParser.hasRouterModuleInImports(moduleDep.imports)) {
|
6331 | _this.routerParser.addModuleWithRoutes(name, _this.moduleHelper.getModuleImportsRaw(props, srcFile), file);
|
6332 | }
|
6333 | deps = moduleDep;
|
6334 | if (typeof IO.ignore === 'undefined') {
|
6335 | _this.routerParser.addModule(name, moduleDep.imports);
|
6336 | outputSymbols.modules.push(moduleDep);
|
6337 | outputSymbols.modulesForGraph.push(moduleDep);
|
6338 | }
|
6339 | }
|
6340 | else if (_this.isComponent(visitedDecorator)) {
|
6341 | if (props.length === 0) {
|
6342 | return;
|
6343 | }
|
6344 | var componentDep = new ComponentDepFactory(_this.componentHelper, _this.configuration).create(file, srcFile, name, props, IO);
|
6345 | deps = componentDep;
|
6346 | if (typeof IO.ignore === 'undefined') {
|
6347 | $componentsTreeEngine.addComponent(componentDep);
|
6348 | outputSymbols.components.push(componentDep);
|
6349 | }
|
6350 | }
|
6351 | else if (_this.isController(visitedDecorator)) {
|
6352 | var controllerDep = new ControllerDepFactory().create(file, srcFile, name, props, IO);
|
6353 | deps = controllerDep;
|
6354 | if (typeof IO.ignore === 'undefined') {
|
6355 | outputSymbols.controllers.push(controllerDep);
|
6356 | }
|
6357 | }
|
6358 | else if (_this.isInjectable(visitedDecorator)) {
|
6359 | var injectableDeps = {
|
6360 | name: name,
|
6361 | id: 'injectable-' + name + '-' + hash,
|
6362 | file: file,
|
6363 | properties: IO.properties,
|
6364 | methods: IO.methods,
|
6365 | description: IO.description,
|
6366 | sourceCode: srcFile.getText(),
|
6367 | exampleUrls: _this.componentHelper.getComponentExampleUrls(srcFile.getText())
|
6368 | };
|
6369 | if (IO.constructor) {
|
6370 | injectableDeps.constructorObj = IO.constructor;
|
6371 | }
|
6372 | if (IO.jsdoctags && IO.jsdoctags.length > 0) {
|
6373 | injectableDeps.jsdoctags = IO.jsdoctags[0].tags;
|
6374 | }
|
6375 | if (IO.accessors) {
|
6376 | injectableDeps.accessors = IO.accessors;
|
6377 | }
|
6378 | deps = injectableDeps;
|
6379 | if (typeof IO.ignore === 'undefined') {
|
6380 | if (_.includes(IO.implements, 'HttpInterceptor')) {
|
6381 | injectableDeps.type = 'interceptor';
|
6382 | outputSymbols.interceptors.push(injectableDeps);
|
6383 | }
|
6384 | else if (_this.isGuard(IO.implements)) {
|
6385 | injectableDeps.type = 'guard';
|
6386 | outputSymbols.guards.push(injectableDeps);
|
6387 | }
|
6388 | else {
|
6389 | injectableDeps.type = 'injectable';
|
6390 | _this.addNewEntityInStore(injectableDeps, outputSymbols.injectables);
|
6391 | }
|
6392 | }
|
6393 | }
|
6394 | else if (_this.isPipe(visitedDecorator)) {
|
6395 | var pipeDeps = {
|
6396 | name: name,
|
6397 | id: 'pipe-' + name + '-' + hash,
|
6398 | file: file,
|
6399 | type: 'pipe',
|
6400 | description: IO.description,
|
6401 | properties: IO.properties,
|
6402 | methods: IO.methods,
|
6403 | pure: _this.componentHelper.getComponentPure(props, srcFile),
|
6404 | ngname: _this.componentHelper.getComponentName(props, srcFile),
|
6405 | sourceCode: srcFile.getText(),
|
6406 | exampleUrls: _this.componentHelper.getComponentExampleUrls(srcFile.getText())
|
6407 | };
|
6408 | if (IO.jsdoctags && IO.jsdoctags.length > 0) {
|
6409 | pipeDeps.jsdoctags = IO.jsdoctags[0].tags;
|
6410 | }
|
6411 | deps = pipeDeps;
|
6412 | if (typeof IO.ignore === 'undefined') {
|
6413 | outputSymbols.pipes.push(pipeDeps);
|
6414 | }
|
6415 | }
|
6416 | else if (_this.isDirective(visitedDecorator)) {
|
6417 | if (props.length === 0) {
|
6418 | return;
|
6419 | }
|
6420 | var directiveDeps = new DirectiveDepFactory(_this.componentHelper, _this.configuration).create(file, srcFile, name, props, IO);
|
6421 | deps = directiveDeps;
|
6422 | if (typeof IO.ignore === 'undefined') {
|
6423 | outputSymbols.directives.push(directiveDeps);
|
6424 | }
|
6425 | }
|
6426 | else {
|
6427 | var hasMultipleDecoratorsWithInternalOne = _this.hasInternalDecorator(node.decorators);
|
6428 | // Just a class
|
6429 | if (!classWithCustomDecorator_1 &&
|
6430 | !hasMultipleDecoratorsWithInternalOne) {
|
6431 | classWithCustomDecorator_1 = true;
|
6432 | _this.processClass(node, file, srcFile, outputSymbols, fileBody);
|
6433 | }
|
6434 | }
|
6435 | _this.cache.set(name, deps);
|
6436 | if (typeof IO.ignore === 'undefined') {
|
6437 | _this.debug(deps);
|
6438 | }
|
6439 | else {
|
6440 | _this.ignore(deps);
|
6441 | }
|
6442 | };
|
6443 | var filterByDecorators = function (filteredNode) {
|
6444 | if (filteredNode.expression && filteredNode.expression.expression) {
|
6445 | var _test = /(NgModule|Component|Injectable|Pipe|Directive)/.test(filteredNode.expression.expression.text);
|
6446 | if (!_test && Ast.ts.isClassDeclaration(node)) {
|
6447 | _test = true;
|
6448 | }
|
6449 | return _test;
|
6450 | }
|
6451 | if (Ast.ts.isClassDeclaration(node)) {
|
6452 | return true;
|
6453 | }
|
6454 | return false;
|
6455 | };
|
6456 | node.decorators.filter(filterByDecorators).forEach(visitDecorator);
|
6457 | }
|
6458 | else if (node.symbol) {
|
6459 | if (node.symbol.flags === Ast.ts.SymbolFlags.Class) {
|
6460 | _this.processClass(node, file, srcFile, outputSymbols, fileBody);
|
6461 | }
|
6462 | else if (node.symbol.flags === Ast.ts.SymbolFlags.Interface) {
|
6463 | var name = _this.getSymboleName(node);
|
6464 | var IO = _this.getInterfaceIO(file, srcFile, node, fileBody);
|
6465 | var interfaceDeps = {
|
6466 | name: name,
|
6467 | id: 'interface-' + name + '-' + hash,
|
6468 | file: file,
|
6469 | type: 'interface',
|
6470 | sourceCode: srcFile.getText()
|
6471 | };
|
6472 | if (IO.properties) {
|
6473 | interfaceDeps.properties = IO.properties;
|
6474 | }
|
6475 | if (IO.indexSignatures) {
|
6476 | interfaceDeps.indexSignatures = IO.indexSignatures;
|
6477 | }
|
6478 | if (IO.kind) {
|
6479 | interfaceDeps.kind = IO.kind;
|
6480 | }
|
6481 | if (IO.description) {
|
6482 | interfaceDeps.description = IO.description;
|
6483 | }
|
6484 | if (IO.methods) {
|
6485 | interfaceDeps.methods = IO.methods;
|
6486 | }
|
6487 | if (IO.extends) {
|
6488 | interfaceDeps.extends = IO.extends;
|
6489 | }
|
6490 | if (typeof IO.ignore === 'undefined') {
|
6491 | _this.debug(interfaceDeps);
|
6492 | outputSymbols.interfaces.push(interfaceDeps);
|
6493 | }
|
6494 | else {
|
6495 | _this.ignore(interfaceDeps);
|
6496 | }
|
6497 | }
|
6498 | else if (Ast.ts.isFunctionDeclaration(node)) {
|
6499 | var infos = _this.visitFunctionDeclaration(node);
|
6500 | // let tags = this.visitFunctionDeclarationJSDocTags(node);
|
6501 | var name = infos.name;
|
6502 | var functionDep = {
|
6503 | name: name,
|
6504 | file: file,
|
6505 | ctype: 'miscellaneous',
|
6506 | subtype: 'function',
|
6507 | description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
|
6508 | };
|
6509 | if (infos.args) {
|
6510 | functionDep.args = infos.args;
|
6511 | }
|
6512 | if (infos.jsdoctags && infos.jsdoctags.length > 0) {
|
6513 | functionDep.jsdoctags = infos.jsdoctags;
|
6514 | }
|
6515 | if (typeof infos.ignore === 'undefined') {
|
6516 | outputSymbols.miscellaneous.functions.push(functionDep);
|
6517 | }
|
6518 | }
|
6519 | else if (Ast.ts.isEnumDeclaration(node)) {
|
6520 | var infos = _this.visitEnumDeclaration(node);
|
6521 | var name = node.name.text;
|
6522 | var enumDeps = {
|
6523 | name: name,
|
6524 | childs: infos,
|
6525 | ctype: 'miscellaneous',
|
6526 | subtype: 'enum',
|
6527 | description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node),
|
6528 | file: file
|
6529 | };
|
6530 | if (!isIgnore(node)) {
|
6531 | outputSymbols.miscellaneous.enumerations.push(enumDeps);
|
6532 | }
|
6533 | }
|
6534 | else if (Ast.ts.isTypeAliasDeclaration(node)) {
|
6535 | var infos = _this.visitTypeDeclaration(node);
|
6536 | var name = infos.name;
|
6537 | var typeAliasDeps = {
|
6538 | name: name,
|
6539 | ctype: 'miscellaneous',
|
6540 | subtype: 'typealias',
|
6541 | rawtype: _this.classHelper.visitType(node),
|
6542 | file: file,
|
6543 | description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
|
6544 | };
|
6545 | if (node.type) {
|
6546 | typeAliasDeps.kind = node.type.kind;
|
6547 | if (typeAliasDeps.rawtype === '') {
|
6548 | typeAliasDeps.rawtype = kindToType(node.type.kind);
|
6549 | }
|
6550 | }
|
6551 | if (!isIgnore(node)) {
|
6552 | outputSymbols.miscellaneous.typealiases.push(typeAliasDeps);
|
6553 | }
|
6554 | }
|
6555 | else if (Ast.ts.isModuleDeclaration(node)) {
|
6556 | if (node.body) {
|
6557 | if (node.body.statements && node.body.statements.length > 0) {
|
6558 | node.body.statements.forEach(function (statement) {
|
6559 | return parseNode(file, srcFile, statement, node.body);
|
6560 | });
|
6561 | }
|
6562 | }
|
6563 | }
|
6564 | }
|
6565 | else {
|
6566 | var IO = _this.getRouteIO(file, srcFile, node);
|
6567 | if (IO.routes) {
|
6568 | var newRoutes = void 0;
|
6569 | try {
|
6570 | newRoutes = _this.routerParser.cleanRawRouteParsed(IO.routes);
|
6571 | }
|
6572 | catch (e) {
|
6573 | // tslint:disable-next-line:max-line-length
|
6574 | logger.error('Routes parsing error, maybe a trailing comma or an external variable, trying to fix that later after sources scanning.');
|
6575 | newRoutes = IO.routes.replace(/ /gm, '');
|
6576 | _this.routerParser.addIncompleteRoute({
|
6577 | data: newRoutes,
|
6578 | file: file
|
6579 | });
|
6580 | return true;
|
6581 | }
|
6582 | outputSymbols.routes = outputSymbols.routes.concat(newRoutes);
|
6583 | }
|
6584 | if (Ast.ts.isClassDeclaration(node)) {
|
6585 | _this.processClass(node, file, srcFile, outputSymbols, fileBody);
|
6586 | }
|
6587 | if (Ast.ts.isExpressionStatement(node) || Ast.ts.isIfStatement(node)) {
|
6588 | var bootstrapModuleReference = 'bootstrapModule';
|
6589 | // Find the root module with bootstrapModule call
|
6590 | // 1. find a simple call : platformBrowserDynamic().bootstrapModule(AppModule);
|
6591 | // 2. or inside a call :
|
6592 | // () => {
|
6593 | // platformBrowserDynamic().bootstrapModule(AppModule);
|
6594 | // });
|
6595 | // 3. with a catch : platformBrowserDynamic().bootstrapModule(AppModule).catch(error => console.error(error));
|
6596 | // 4. with parameters : platformBrowserDynamic().bootstrapModule(AppModule, {}).catch(error => console.error(error));
|
6597 | // Find recusively in expression nodes one with name 'bootstrapModule'
|
6598 | var rootModule_1;
|
6599 | var resultNode = void 0;
|
6600 | if (srcFile.text.indexOf(bootstrapModuleReference) !== -1) {
|
6601 | if (node.expression) {
|
6602 | resultNode = _this.findExpressionByNameInExpressions(node.expression, 'bootstrapModule');
|
6603 | }
|
6604 | if (typeof node.thenStatement !== 'undefined') {
|
6605 | if (node.thenStatement.statements &&
|
6606 | node.thenStatement.statements.length > 0) {
|
6607 | var firstStatement = node.thenStatement.statements[0];
|
6608 | resultNode = _this.findExpressionByNameInExpressions(firstStatement.expression, 'bootstrapModule');
|
6609 | }
|
6610 | }
|
6611 | if (!resultNode) {
|
6612 | if (node.expression &&
|
6613 | node.expression.arguments &&
|
6614 | node.expression.arguments.length > 0) {
|
6615 | resultNode = _this.findExpressionByNameInExpressionArguments(node.expression.arguments, 'bootstrapModule');
|
6616 | }
|
6617 | }
|
6618 | if (resultNode) {
|
6619 | if (resultNode.arguments.length > 0) {
|
6620 | _.forEach(resultNode.arguments, function (argument) {
|
6621 | if (argument.text) {
|
6622 | rootModule_1 = argument.text;
|
6623 | }
|
6624 | });
|
6625 | }
|
6626 | if (rootModule_1) {
|
6627 | _this.routerParser.setRootModule(rootModule_1);
|
6628 | }
|
6629 | }
|
6630 | }
|
6631 | }
|
6632 | if (Ast.ts.isVariableStatement(node) && !_this.routerParser.isVariableRoutes(node)) {
|
6633 | var infos = _this.visitVariableDeclaration(node);
|
6634 | var name = infos.name;
|
6635 | var deps = {
|
6636 | name: name,
|
6637 | ctype: 'miscellaneous',
|
6638 | subtype: 'variable',
|
6639 | file: file
|
6640 | };
|
6641 | deps.type = infos.type ? infos.type : '';
|
6642 | if (infos.defaultValue) {
|
6643 | deps.defaultValue = infos.defaultValue;
|
6644 | }
|
6645 | if (infos.initializer) {
|
6646 | deps.initializer = infos.initializer;
|
6647 | }
|
6648 | if (node.jsDoc && node.jsDoc.length > 0 && node.jsDoc[0].comment) {
|
6649 | deps.description = marked$3(node.jsDoc[0].comment);
|
6650 | }
|
6651 | if (isModuleWithProviders(node)) {
|
6652 | var routingInitializer = getModuleWithProviders(node);
|
6653 | _this.routerParser.addModuleWithRoutes(name, [routingInitializer], file);
|
6654 | _this.routerParser.addModule(name, [routingInitializer]);
|
6655 | }
|
6656 | if (!isIgnore(node)) {
|
6657 | outputSymbols.miscellaneous.variables.push(deps);
|
6658 | }
|
6659 | }
|
6660 | if (Ast.ts.isTypeAliasDeclaration(node)) {
|
6661 | var infos = _this.visitTypeDeclaration(node);
|
6662 | var name = infos.name;
|
6663 | var deps = {
|
6664 | name: name,
|
6665 | ctype: 'miscellaneous',
|
6666 | subtype: 'typealias',
|
6667 | rawtype: _this.classHelper.visitType(node),
|
6668 | file: file,
|
6669 | description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
|
6670 | };
|
6671 | if (node.type) {
|
6672 | deps.kind = node.type.kind;
|
6673 | }
|
6674 | if (!isIgnore(node)) {
|
6675 | outputSymbols.miscellaneous.typealiases.push(deps);
|
6676 | }
|
6677 | }
|
6678 | if (Ast.ts.isFunctionDeclaration(node)) {
|
6679 | var infos = _this.visitFunctionDeclaration(node);
|
6680 | var name = infos.name;
|
6681 | var functionDep = {
|
6682 | name: name,
|
6683 | ctype: 'miscellaneous',
|
6684 | subtype: 'function',
|
6685 | file: file,
|
6686 | description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
|
6687 | };
|
6688 | if (infos.args) {
|
6689 | functionDep.args = infos.args;
|
6690 | }
|
6691 | if (infos.jsdoctags && infos.jsdoctags.length > 0) {
|
6692 | functionDep.jsdoctags = infos.jsdoctags;
|
6693 | }
|
6694 | if (typeof infos.ignore === 'undefined') {
|
6695 | outputSymbols.miscellaneous.functions.push(functionDep);
|
6696 | }
|
6697 | }
|
6698 | if (Ast.ts.isEnumDeclaration(node)) {
|
6699 | var infos = _this.visitEnumDeclaration(node);
|
6700 | var name = node.name.text;
|
6701 | var enumDeps = {
|
6702 | name: name,
|
6703 | childs: infos,
|
6704 | ctype: 'miscellaneous',
|
6705 | subtype: 'enum',
|
6706 | description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node),
|
6707 | file: file
|
6708 | };
|
6709 | if (!isIgnore(node)) {
|
6710 | outputSymbols.miscellaneous.enumerations.push(enumDeps);
|
6711 | }
|
6712 | }
|
6713 | }
|
6714 | };
|
6715 | parseNode(fileName, scannedFile, initialNode);
|
6716 | });
|
6717 | };
|
6718 | /**
|
6719 | * Function to in a specific store an entity, and check before is there is not the same one
|
6720 | * in that store : same name, id and file
|
6721 | * @param entity Entity to store
|
6722 | * @param store Store
|
6723 | */
|
6724 | AngularDependencies.prototype.addNewEntityInStore = function (entity, store) {
|
6725 | var findSameEntityInStore = _.filter(store, {
|
6726 | name: entity.name,
|
6727 | id: entity.id,
|
6728 | file: entity.file
|
6729 | });
|
6730 | if (findSameEntityInStore.length === 0) {
|
6731 | store.push(entity);
|
6732 | }
|
6733 | };
|
6734 | AngularDependencies.prototype.debug = function (deps) {
|
6735 | if (deps) {
|
6736 | logger.debug('found', "" + deps.name);
|
6737 | }
|
6738 | else {
|
6739 | return;
|
6740 | }
|
6741 | ['imports', 'exports', 'declarations', 'providers', 'bootstrap'].forEach(function (symbols) {
|
6742 | if (deps[symbols] && deps[symbols].length > 0) {
|
6743 | logger.debug('', "- " + symbols + ":");
|
6744 | deps[symbols].map(function (i) { return i.name; }).forEach(function (d) {
|
6745 | logger.debug('', "\t- " + d);
|
6746 | });
|
6747 | }
|
6748 | });
|
6749 | };
|
6750 | AngularDependencies.prototype.ignore = function (deps) {
|
6751 | if (deps) {
|
6752 | logger.warn('ignore', "" + deps.name);
|
6753 | }
|
6754 | else {
|
6755 | return;
|
6756 | }
|
6757 | };
|
6758 | AngularDependencies.prototype.findExpressionByNameInExpressions = function (entryNode, name) {
|
6759 | var result;
|
6760 | var loop = function (node, z) {
|
6761 | if (node.expression && !node.expression.name) {
|
6762 | loop(node.expression, z);
|
6763 | }
|
6764 | if (node.expression && node.expression.name) {
|
6765 | if (node.expression.name.text === z) {
|
6766 | result = node;
|
6767 | }
|
6768 | else {
|
6769 | loop(node.expression, z);
|
6770 | }
|
6771 | }
|
6772 | };
|
6773 | loop(entryNode, name);
|
6774 | return result;
|
6775 | };
|
6776 | AngularDependencies.prototype.findExpressionByNameInExpressionArguments = function (arg, name) {
|
6777 | var result;
|
6778 | var that = this;
|
6779 | var i = 0;
|
6780 | var len = arg.length;
|
6781 | var loop = function (node, z) {
|
6782 | if (node.body) {
|
6783 | if (node.body.statements && node.body.statements.length > 0) {
|
6784 | var j = 0;
|
6785 | var leng = node.body.statements.length;
|
6786 | for (j; j < leng; j++) {
|
6787 | result = that.findExpressionByNameInExpressions(node.body.statements[j], z);
|
6788 | }
|
6789 | }
|
6790 | }
|
6791 | };
|
6792 | for (i; i < len; i++) {
|
6793 | loop(arg[i], name);
|
6794 | }
|
6795 | return result;
|
6796 | };
|
6797 | AngularDependencies.prototype.parseDecorators = function (decorators, type) {
|
6798 | var result = false;
|
6799 | if (decorators.length > 1) {
|
6800 | _.forEach(decorators, function (decorator) {
|
6801 | if (decorator.expression.expression) {
|
6802 | if (decorator.expression.expression.text === type) {
|
6803 | result = true;
|
6804 | }
|
6805 | }
|
6806 | });
|
6807 | }
|
6808 | else {
|
6809 | if (decorators[0].expression.expression) {
|
6810 | if (decorators[0].expression.expression.text === type) {
|
6811 | result = true;
|
6812 | }
|
6813 | }
|
6814 | }
|
6815 | return result;
|
6816 | };
|
6817 | AngularDependencies.prototype.parseDecorator = function (decorator, type) {
|
6818 | var result = false;
|
6819 | if (decorator.expression.expression) {
|
6820 | if (decorator.expression.expression.text === type) {
|
6821 | result = true;
|
6822 | }
|
6823 | }
|
6824 | return result;
|
6825 | };
|
6826 | AngularDependencies.prototype.isController = function (metadata) {
|
6827 | return this.parseDecorator(metadata, 'Controller');
|
6828 | };
|
6829 | AngularDependencies.prototype.isComponent = function (metadata) {
|
6830 | return this.parseDecorator(metadata, 'Component');
|
6831 | };
|
6832 | AngularDependencies.prototype.isPipe = function (metadata) {
|
6833 | return this.parseDecorator(metadata, 'Pipe');
|
6834 | };
|
6835 | AngularDependencies.prototype.isDirective = function (metadata) {
|
6836 | return this.parseDecorator(metadata, 'Directive');
|
6837 | };
|
6838 | AngularDependencies.prototype.isInjectable = function (metadata) {
|
6839 | return this.parseDecorator(metadata, 'Injectable');
|
6840 | };
|
6841 | AngularDependencies.prototype.isModule = function (metadata) {
|
6842 | return this.parseDecorator(metadata, 'NgModule') || this.parseDecorator(metadata, 'Module');
|
6843 | };
|
6844 | AngularDependencies.prototype.hasInternalDecorator = function (metadatas) {
|
6845 | return (this.parseDecorators(metadatas, 'Controller') ||
|
6846 | this.parseDecorators(metadatas, 'Component') ||
|
6847 | this.parseDecorators(metadatas, 'Pipe') ||
|
6848 | this.parseDecorators(metadatas, 'Directive') ||
|
6849 | this.parseDecorators(metadatas, 'Injectable') ||
|
6850 | this.parseDecorators(metadatas, 'NgModule') ||
|
6851 | this.parseDecorators(metadatas, 'Module'));
|
6852 | };
|
6853 | AngularDependencies.prototype.isGuard = function (ioImplements) {
|
6854 | return (_.includes(ioImplements, 'CanActivate') ||
|
6855 | _.includes(ioImplements, 'CanActivateChild') ||
|
6856 | _.includes(ioImplements, 'CanDeactivate') ||
|
6857 | _.includes(ioImplements, 'Resolve') ||
|
6858 | _.includes(ioImplements, 'CanLoad'));
|
6859 | };
|
6860 | AngularDependencies.prototype.getSymboleName = function (node) {
|
6861 | return node.name.text;
|
6862 | };
|
6863 | AngularDependencies.prototype.findProperties = function (visitedNode, sourceFile) {
|
6864 | if (visitedNode.expression &&
|
6865 | visitedNode.expression.arguments &&
|
6866 | visitedNode.expression.arguments.length > 0) {
|
6867 | var pop = visitedNode.expression.arguments[0];
|
6868 | if (pop && pop.properties && pop.properties.length >= 0) {
|
6869 | return pop.properties;
|
6870 | }
|
6871 | else if (pop && pop.kind && pop.kind === Ast.SyntaxKind.StringLiteral) {
|
6872 | return [pop];
|
6873 | }
|
6874 | else {
|
6875 | logger.warn('Empty metadatas, trying to found it with imports.');
|
6876 | return this.importsUtil.findValueInImportOrLocalVariables(pop.text, sourceFile);
|
6877 | }
|
6878 | }
|
6879 | return [];
|
6880 | };
|
6881 | AngularDependencies.prototype.isAngularLifecycleHook = function (methodName) {
|
6882 | /**
|
6883 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
6884 | */
|
6885 | var ANGULAR_LIFECYCLE_METHODS = [
|
6886 | 'ngOnInit',
|
6887 | 'ngOnChanges',
|
6888 | 'ngDoCheck',
|
6889 | 'ngOnDestroy',
|
6890 | 'ngAfterContentInit',
|
6891 | 'ngAfterContentChecked',
|
6892 | 'ngAfterViewInit',
|
6893 | 'ngAfterViewChecked',
|
6894 | 'writeValue',
|
6895 | 'registerOnChange',
|
6896 | 'registerOnTouched',
|
6897 | 'setDisabledState'
|
6898 | ];
|
6899 | return ANGULAR_LIFECYCLE_METHODS.indexOf(methodName) >= 0;
|
6900 | };
|
6901 | AngularDependencies.prototype.visitTypeDeclaration = function (node) {
|
6902 | var result = {
|
6903 | name: node.name.text,
|
6904 | kind: node.kind
|
6905 | };
|
6906 | var jsdoctags = this.jsdocParserUtil.getJSDocs(node);
|
6907 | if (jsdoctags && jsdoctags.length >= 1) {
|
6908 | if (jsdoctags[0].tags) {
|
6909 | result.jsdoctags = markedtags(jsdoctags[0].tags);
|
6910 | }
|
6911 | }
|
6912 | return result;
|
6913 | };
|
6914 | AngularDependencies.prototype.visitArgument = function (arg) {
|
6915 | var result = {
|
6916 | name: arg.name.text,
|
6917 | type: this.classHelper.visitType(arg)
|
6918 | };
|
6919 | if (arg.dotDotDotToken) {
|
6920 | result.dotDotDotToken = true;
|
6921 | }
|
6922 | if (arg.questionToken) {
|
6923 | result.optional = true;
|
6924 | }
|
6925 | if (arg.type) {
|
6926 | result.type = this.mapType(arg.type.kind);
|
6927 | if (arg.type.kind === 157) {
|
6928 | // try replace TypeReference with typeName
|
6929 | if (arg.type.typeName) {
|
6930 | result.type = arg.type.typeName.text;
|
6931 | }
|
6932 | }
|
6933 | }
|
6934 | return result;
|
6935 | };
|
6936 | AngularDependencies.prototype.mapType = function (type) {
|
6937 | switch (type) {
|
6938 | case 95:
|
6939 | return 'null';
|
6940 | case 119:
|
6941 | return 'any';
|
6942 | case 122:
|
6943 | return 'boolean';
|
6944 | case 130:
|
6945 | return 'never';
|
6946 | case 133:
|
6947 | return 'number';
|
6948 | case 136:
|
6949 | return 'string';
|
6950 | case 139:
|
6951 | return 'undefined';
|
6952 | case 159:
|
6953 | return 'typeReference';
|
6954 | }
|
6955 | };
|
6956 | AngularDependencies.prototype.visitFunctionDeclaration = function (method) {
|
6957 | var _this = this;
|
6958 | var result = {
|
6959 | name: method.name.text,
|
6960 | args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : []
|
6961 | };
|
6962 | var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
|
6963 | if (typeof method.type !== 'undefined') {
|
6964 | result.returnType = this.classHelper.visitType(method.type);
|
6965 | }
|
6966 | if (method.modifiers) {
|
6967 | if (method.modifiers.length > 0) {
|
6968 | var kinds = method.modifiers
|
6969 | .map(function (modifier) {
|
6970 | return modifier.kind;
|
6971 | })
|
6972 | .reverse();
|
6973 | if (_.indexOf(kinds, Ast.SyntaxKind.PublicKeyword) !== -1 &&
|
6974 | _.indexOf(kinds, Ast.SyntaxKind.StaticKeyword) !== -1) {
|
6975 | kinds = kinds.filter(function (kind) { return kind !== Ast.SyntaxKind.PublicKeyword; });
|
6976 | }
|
6977 | }
|
6978 | }
|
6979 | if (jsdoctags && jsdoctags.length >= 1) {
|
6980 | if (jsdoctags[0].tags) {
|
6981 | result.jsdoctags = markedtags(jsdoctags[0].tags);
|
6982 | _.forEach(jsdoctags[0].tags, function (tag) {
|
6983 | if (tag.tagName) {
|
6984 | if (tag.tagName.text) {
|
6985 | if (tag.tagName.text.indexOf('ignore') > -1) {
|
6986 | result.ignore = true;
|
6987 | }
|
6988 | }
|
6989 | }
|
6990 | });
|
6991 | }
|
6992 | }
|
6993 | if (result.jsdoctags && result.jsdoctags.length > 0) {
|
6994 | result.jsdoctags = mergeTagsAndArgs(result.args, result.jsdoctags);
|
6995 | }
|
6996 | else if (result.args.length > 0) {
|
6997 | result.jsdoctags = mergeTagsAndArgs(result.args);
|
6998 | }
|
6999 | return result;
|
7000 | };
|
7001 | AngularDependencies.prototype.visitVariableDeclaration = function (node) {
|
7002 | if (node.declarationList.declarations) {
|
7003 | var i = 0;
|
7004 | var len = node.declarationList.declarations.length;
|
7005 | for (i; i < len; i++) {
|
7006 | var result = {
|
7007 | name: node.declarationList.declarations[i].name.text,
|
7008 | defaultValue: node.declarationList.declarations[i].initializer
|
7009 | ? this.classHelper.stringifyDefaultValue(node.declarationList.declarations[i].initializer)
|
7010 | : undefined
|
7011 | };
|
7012 | if (node.declarationList.declarations[i].initializer) {
|
7013 | result.initializer = node.declarationList.declarations[i].initializer;
|
7014 | }
|
7015 | if (node.declarationList.declarations[i].type) {
|
7016 | result.type = this.classHelper.visitType(node.declarationList.declarations[i].type);
|
7017 | }
|
7018 | if (typeof result.type === 'undefined' && result.initializer) {
|
7019 | result.type = kindToType(result.initializer.kind);
|
7020 | }
|
7021 | return result;
|
7022 | }
|
7023 | }
|
7024 | };
|
7025 | AngularDependencies.prototype.visitFunctionDeclarationJSDocTags = function (node) {
|
7026 | var jsdoctags = this.jsdocParserUtil.getJSDocs(node);
|
7027 | var result;
|
7028 | if (jsdoctags && jsdoctags.length >= 1) {
|
7029 | if (jsdoctags[0].tags) {
|
7030 | result = markedtags(jsdoctags[0].tags);
|
7031 | }
|
7032 | }
|
7033 | return result;
|
7034 | };
|
7035 | AngularDependencies.prototype.visitEnumTypeAliasFunctionDeclarationDescription = function (node) {
|
7036 | var description = '';
|
7037 | if (node.jsDoc) {
|
7038 | if (node.jsDoc.length > 0) {
|
7039 | if (typeof node.jsDoc[0].comment !== 'undefined') {
|
7040 | description = marked$3(node.jsDoc[0].comment);
|
7041 | }
|
7042 | }
|
7043 | }
|
7044 | return description;
|
7045 | };
|
7046 | AngularDependencies.prototype.visitEnumDeclaration = function (node) {
|
7047 | var result = [];
|
7048 | if (node.members) {
|
7049 | var i = 0;
|
7050 | var len = node.members.length;
|
7051 | for (i; i < len; i++) {
|
7052 | var member = {
|
7053 | name: node.members[i].name.text
|
7054 | };
|
7055 | if (node.members[i].initializer) {
|
7056 | member.value = node.members[i].initializer.text;
|
7057 | }
|
7058 | result.push(member);
|
7059 | }
|
7060 | }
|
7061 | return result;
|
7062 | };
|
7063 | AngularDependencies.prototype.visitEnumDeclarationForRoutes = function (fileName, node) {
|
7064 | if (node.declarationList.declarations) {
|
7065 | var i = 0;
|
7066 | var len = node.declarationList.declarations.length;
|
7067 | for (i; i < len; i++) {
|
7068 | var routesInitializer = node.declarationList.declarations[i].initializer;
|
7069 | var data = new CodeGenerator().generate(routesInitializer);
|
7070 | this.routerParser.addRoute({
|
7071 | name: node.declarationList.declarations[i].name.text,
|
7072 | data: this.routerParser.cleanRawRoute(data),
|
7073 | filename: fileName
|
7074 | });
|
7075 | return [
|
7076 | {
|
7077 | routes: data
|
7078 | }
|
7079 | ];
|
7080 | }
|
7081 | }
|
7082 | return [];
|
7083 | };
|
7084 | AngularDependencies.prototype.getRouteIO = function (filename, sourceFile, node) {
|
7085 | var _this = this;
|
7086 | var res;
|
7087 | if (sourceFile.statements) {
|
7088 | res = sourceFile.statements.reduce(function (directive, statement) {
|
7089 | if (_this.routerParser.isVariableRoutes(statement)) {
|
7090 | if (statement.pos === node.pos && statement.end === node.end) {
|
7091 | return directive.concat(_this.visitEnumDeclarationForRoutes(filename, statement));
|
7092 | }
|
7093 | }
|
7094 | return directive;
|
7095 | }, []);
|
7096 | return res[0] || {};
|
7097 | }
|
7098 | else {
|
7099 | return {};
|
7100 | }
|
7101 | };
|
7102 | AngularDependencies.prototype.getClassIO = function (filename, sourceFile, node, fileBody) {
|
7103 | var _this = this;
|
7104 | /**
|
7105 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
7106 | */
|
7107 | var reducedSource = fileBody ? fileBody.statements : sourceFile.statements;
|
7108 | var res = reducedSource.reduce(function (directive, statement) {
|
7109 | if (Ast.ts.isClassDeclaration(statement)) {
|
7110 | if (statement.pos === node.pos && statement.end === node.end) {
|
7111 | return directive.concat(_this.classHelper.visitClassDeclaration(filename, statement, sourceFile));
|
7112 | }
|
7113 | }
|
7114 | return directive;
|
7115 | }, []);
|
7116 | return res[0] || {};
|
7117 | };
|
7118 | AngularDependencies.prototype.getInterfaceIO = function (filename, sourceFile, node, fileBody) {
|
7119 | var _this = this;
|
7120 | /**
|
7121 | * Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
7122 | */
|
7123 | var reducedSource = fileBody ? fileBody.statements : sourceFile.statements;
|
7124 | var res = reducedSource.reduce(function (directive, statement) {
|
7125 | if (Ast.ts.isInterfaceDeclaration(statement)) {
|
7126 | if (statement.pos === node.pos && statement.end === node.end) {
|
7127 | return directive.concat(_this.classHelper.visitClassDeclaration(filename, statement, sourceFile));
|
7128 | }
|
7129 | }
|
7130 | return directive;
|
7131 | }, []);
|
7132 | return res[0] || {};
|
7133 | };
|
7134 | return AngularDependencies;
|
7135 | }(FrameworkDependencies));
|
7136 |
|
7137 | var AngularJSDependencies = /** @class */ (function (_super) {
|
7138 | __extends(AngularJSDependencies, _super);
|
7139 | function AngularJSDependencies(files, options, configuration, routerParser) {
|
7140 | var _this = _super.call(this, files, options, configuration, routerParser) || this;
|
7141 | _this.cache = new ComponentCache();
|
7142 | _this.moduleHelper = new ModuleHelper(_this.cache);
|
7143 | _this.jsDocHelper = new JsDocHelper();
|
7144 | _this.symbolHelper = new SymbolHelper();
|
7145 | _this.jsdocParserUtil = new JsdocParserUtil();
|
7146 | _this.importsUtil = new ImportsUtil();
|
7147 | return _this;
|
7148 | }
|
7149 | AngularJSDependencies.prototype.getDependencies = function () {
|
7150 | var deps = {
|
7151 | modules: [],
|
7152 | modulesForGraph: [],
|
7153 | components: [],
|
7154 | injectables: [],
|
7155 | interceptors: [],
|
7156 | pipes: [],
|
7157 | directives: [],
|
7158 | routes: [],
|
7159 | classes: [],
|
7160 | interfaces: [],
|
7161 | miscellaneous: {
|
7162 | variables: [],
|
7163 | functions: [],
|
7164 | typealiases: [],
|
7165 | enumerations: []
|
7166 | },
|
7167 | routesTree: undefined
|
7168 | };
|
7169 | return deps;
|
7170 | };
|
7171 | return AngularJSDependencies;
|
7172 | }(FrameworkDependencies));
|
7173 |
|
7174 | function promiseSequential(promises) {
|
7175 | if (!Array.isArray(promises)) {
|
7176 | throw new Error('First argument need to be an array of Promises');
|
7177 | }
|
7178 | return new Promise(function (resolve, reject) {
|
7179 | var count = 0;
|
7180 | var results = [];
|
7181 | var iterateeFunc = function (previousPromise, currentPromise) {
|
7182 | return previousPromise
|
7183 | .then(function (result) {
|
7184 | if (count++ !== 0) {
|
7185 | results = results.concat(result);
|
7186 | }
|
7187 | return currentPromise(result, results, count);
|
7188 | })
|
7189 | .catch(function (err) {
|
7190 | return reject(err);
|
7191 | });
|
7192 | };
|
7193 | promises = promises.concat(function () { return Promise.resolve(); });
|
7194 | promises
|
7195 | .reduce(iterateeFunc, Promise.resolve(false))
|
7196 | .then(function (res) {
|
7197 | resolve(results);
|
7198 | });
|
7199 | });
|
7200 | }
|
7201 |
|
7202 | var traverse$2 = require('traverse');
|
7203 | var DependenciesEngine = /** @class */ (function () {
|
7204 | function DependenciesEngine() {
|
7205 | this.angularApiUtil = new AngularApiUtil();
|
7206 | }
|
7207 | DependenciesEngine.prototype.cleanModules = function (modules) {
|
7208 | var _m = modules;
|
7209 | var i = 0;
|
7210 | var len = modules.length;
|
7211 | for (i; i < len; i++) {
|
7212 | var j = 0;
|
7213 | var leng = _m[i].declarations.length;
|
7214 | for (j; j < leng; j++) {
|
7215 | var k = 0;
|
7216 | var lengt = void 0;
|
7217 | if (_m[i].declarations[j].jsdoctags) {
|
7218 | lengt = _m[i].declarations[j].jsdoctags.length;
|
7219 | for (k; k < lengt; k++) {
|
7220 | delete _m[i].declarations[j].jsdoctags[k].parent;
|
7221 | }
|
7222 | }
|
7223 | if (_m[i].declarations[j].constructorObj) {
|
7224 | if (_m[i].declarations[j].constructorObj.jsdoctags) {
|
7225 | lengt = _m[i].declarations[j].constructorObj.jsdoctags.length;
|
7226 | for (k; k < lengt; k++) {
|
7227 | delete _m[i].declarations[j].constructorObj.jsdoctags[k].parent;
|
7228 | }
|
7229 | }
|
7230 | }
|
7231 | }
|
7232 | }
|
7233 | return _m;
|
7234 | };
|
7235 | DependenciesEngine.prototype.updateModulesDeclarationsExportsTypes = function () {
|
7236 | var _this = this;
|
7237 | var _m = this.modules, len = this.modules.length;
|
7238 | var mergeTypes = function (entry) {
|
7239 | var directive = _this.findInCompodocDependencies(entry.name, _this.directives, entry.file);
|
7240 | if (typeof directive.data !== 'undefined') {
|
7241 | entry.type = 'directive';
|
7242 | entry.id = directive.data.id;
|
7243 | }
|
7244 | var component = _this.findInCompodocDependencies(entry.name, _this.components, entry.file);
|
7245 | if (typeof component.data !== 'undefined') {
|
7246 | entry.type = 'component';
|
7247 | entry.id = component.data.id;
|
7248 | }
|
7249 | var pipe = _this.findInCompodocDependencies(entry.name, _this.pipes, entry.file);
|
7250 | if (typeof pipe.data !== 'undefined') {
|
7251 | entry.type = 'pipe';
|
7252 | entry.id = pipe.data.id;
|
7253 | }
|
7254 | };
|
7255 | this.modules.forEach(function (module) {
|
7256 | module.declarations.forEach(function (declaration) {
|
7257 | mergeTypes(declaration);
|
7258 | });
|
7259 | module.exports.forEach(function (expt) {
|
7260 | mergeTypes(expt);
|
7261 | });
|
7262 | module.entryComponents.forEach(function (ent) {
|
7263 | mergeTypes(ent);
|
7264 | });
|
7265 | });
|
7266 | };
|
7267 | DependenciesEngine.prototype.init = function (data) {
|
7268 | traverse$2(data).forEach(function (node) {
|
7269 | if (node) {
|
7270 | if (node.parent)
|
7271 | delete node.parent;
|
7272 | if (node.initializer)
|
7273 | delete node.initializer;
|
7274 | }
|
7275 | });
|
7276 | this.rawData = data;
|
7277 | this.modules = _.sortBy(this.rawData.modules, ['name']);
|
7278 | this.rawModulesForOverview = _.sortBy(data.modulesForGraph, ['name']);
|
7279 | this.rawModules = _.sortBy(data.modulesForGraph, ['name']);
|
7280 | this.components = _.sortBy(this.rawData.components, ['name']);
|
7281 | this.controllers = _.sortBy(this.rawData.controllers, ['name']);
|
7282 | this.directives = _.sortBy(this.rawData.directives, ['name']);
|
7283 | this.injectables = _.sortBy(this.rawData.injectables, ['name']);
|
7284 | this.interceptors = _.sortBy(this.rawData.interceptors, ['name']);
|
7285 | this.guards = _.sortBy(this.rawData.guards, ['name']);
|
7286 | this.interfaces = _.sortBy(this.rawData.interfaces, ['name']);
|
7287 | this.pipes = _.sortBy(this.rawData.pipes, ['name']);
|
7288 | this.classes = _.sortBy(this.rawData.classes, ['name']);
|
7289 | this.miscellaneous = this.rawData.miscellaneous;
|
7290 | this.prepareMiscellaneous();
|
7291 | this.updateModulesDeclarationsExportsTypes();
|
7292 | this.routes = this.rawData.routesTree;
|
7293 | this.manageDuplicatesName();
|
7294 | this.cleanRawModulesNames();
|
7295 | };
|
7296 | DependenciesEngine.prototype.cleanRawModulesNames = function () {
|
7297 | this.rawModulesForOverview = this.rawModulesForOverview.map(function (module) {
|
7298 | module.name = module.name.replace('$', '');
|
7299 | return module;
|
7300 | });
|
7301 | };
|
7302 | DependenciesEngine.prototype.findInCompodocDependencies = function (name, data, file) {
|
7303 | var _result = {
|
7304 | source: 'internal',
|
7305 | data: undefined
|
7306 | };
|
7307 | for (var i = 0; i < data.length; i++) {
|
7308 | if (typeof name !== 'undefined') {
|
7309 | if (typeof file !== 'undefined') {
|
7310 | if (name.indexOf(data[i].name) !== -1 && file.replace(/\\/g, '/').indexOf(data[i].file) !== -1) {
|
7311 | _result.data = data[i];
|
7312 | }
|
7313 | }
|
7314 | else {
|
7315 | if (name.indexOf(data[i].name) !== -1) {
|
7316 | _result.data = data[i];
|
7317 | }
|
7318 | }
|
7319 | }
|
7320 | }
|
7321 | return _result;
|
7322 | };
|
7323 | DependenciesEngine.prototype.manageDuplicatesName = function () {
|
7324 | var processDuplicates = function (element, index, array) {
|
7325 | var elementsWithSameName = _.filter(array, { name: element.name });
|
7326 | if (elementsWithSameName.length > 1) {
|
7327 | // First element is the reference for duplicates
|
7328 | for (var i = 1; i < elementsWithSameName.length; i++) {
|
7329 | var elementToEdit = elementsWithSameName[i];
|
7330 | if (typeof elementToEdit.isDuplicate === 'undefined') {
|
7331 | elementToEdit.isDuplicate = true;
|
7332 | elementToEdit.duplicateId = i;
|
7333 | elementToEdit.duplicateName = elementToEdit.name + '-' + elementToEdit.duplicateId;
|
7334 | elementToEdit.id = elementToEdit.id + '-' + elementToEdit.duplicateId;
|
7335 | }
|
7336 | }
|
7337 | }
|
7338 | return element;
|
7339 | };
|
7340 | this.classes = this.classes.map(processDuplicates);
|
7341 | this.interfaces = this.interfaces.map(processDuplicates);
|
7342 | this.injectables = this.injectables.map(processDuplicates);
|
7343 | this.pipes = this.pipes.map(processDuplicates);
|
7344 | this.interceptors = this.interceptors.map(processDuplicates);
|
7345 | this.guards = this.guards.map(processDuplicates);
|
7346 | this.modules = this.modules.map(processDuplicates);
|
7347 | this.components = this.components.map(processDuplicates);
|
7348 | this.controllers = this.controllers.map(processDuplicates);
|
7349 | this.directives = this.directives.map(processDuplicates);
|
7350 | };
|
7351 | DependenciesEngine.prototype.find = function (name) {
|
7352 | var _this = this;
|
7353 | var searchFunctions = [
|
7354 | function () { return _this.findInCompodocDependencies(name, _this.injectables); },
|
7355 | function () { return _this.findInCompodocDependencies(name, _this.interceptors); },
|
7356 | function () { return _this.findInCompodocDependencies(name, _this.guards); },
|
7357 | function () { return _this.findInCompodocDependencies(name, _this.interfaces); },
|
7358 | function () { return _this.findInCompodocDependencies(name, _this.classes); },
|
7359 | function () { return _this.findInCompodocDependencies(name, _this.components); },
|
7360 | function () { return _this.findInCompodocDependencies(name, _this.controllers); },
|
7361 | function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.variables); },
|
7362 | function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.functions); },
|
7363 | function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.typealiases); },
|
7364 | function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.enumerations); },
|
7365 | function () { return _this.angularApiUtil.findApi(name); }
|
7366 | ];
|
7367 | for (var _i = 0, searchFunctions_1 = searchFunctions; _i < searchFunctions_1.length; _i++) {
|
7368 | var searchFunction = searchFunctions_1[_i];
|
7369 | var result = searchFunction();
|
7370 | if (result.data) {
|
7371 | return result;
|
7372 | }
|
7373 | }
|
7374 | return undefined;
|
7375 | };
|
7376 | DependenciesEngine.prototype.update = function (updatedData) {
|
7377 | var _this = this;
|
7378 | if (updatedData.modules.length > 0) {
|
7379 | _.forEach(updatedData.modules, function (module) {
|
7380 | var _index = _.findIndex(_this.modules, { name: module.name });
|
7381 | _this.modules[_index] = module;
|
7382 | });
|
7383 | }
|
7384 | if (updatedData.components.length > 0) {
|
7385 | _.forEach(updatedData.components, function (component) {
|
7386 | var _index = _.findIndex(_this.components, { name: component.name });
|
7387 | _this.components[_index] = component;
|
7388 | });
|
7389 | }
|
7390 | if (updatedData.controllers.length > 0) {
|
7391 | _.forEach(updatedData.controllers, function (controller) {
|
7392 | var _index = _.findIndex(_this.controllers, { name: controller.name });
|
7393 | _this.controllers[_index] = controller;
|
7394 | });
|
7395 | }
|
7396 | if (updatedData.directives.length > 0) {
|
7397 | _.forEach(updatedData.directives, function (directive) {
|
7398 | var _index = _.findIndex(_this.directives, { name: directive.name });
|
7399 | _this.directives[_index] = directive;
|
7400 | });
|
7401 | }
|
7402 | if (updatedData.injectables.length > 0) {
|
7403 | _.forEach(updatedData.injectables, function (injectable) {
|
7404 | var _index = _.findIndex(_this.injectables, { name: injectable.name });
|
7405 | _this.injectables[_index] = injectable;
|
7406 | });
|
7407 | }
|
7408 | if (updatedData.interceptors.length > 0) {
|
7409 | _.forEach(updatedData.interceptors, function (interceptor) {
|
7410 | var _index = _.findIndex(_this.interceptors, { name: interceptor.name });
|
7411 | _this.interceptors[_index] = interceptor;
|
7412 | });
|
7413 | }
|
7414 | if (updatedData.guards.length > 0) {
|
7415 | _.forEach(updatedData.guards, function (guard) {
|
7416 | var _index = _.findIndex(_this.guards, { name: guard.name });
|
7417 | _this.guards[_index] = guard;
|
7418 | });
|
7419 | }
|
7420 | if (updatedData.interfaces.length > 0) {
|
7421 | _.forEach(updatedData.interfaces, function (int) {
|
7422 | var _index = _.findIndex(_this.interfaces, { name: int.name });
|
7423 | _this.interfaces[_index] = int;
|
7424 | });
|
7425 | }
|
7426 | if (updatedData.pipes.length > 0) {
|
7427 | _.forEach(updatedData.pipes, function (pipe) {
|
7428 | var _index = _.findIndex(_this.pipes, { name: pipe.name });
|
7429 | _this.pipes[_index] = pipe;
|
7430 | });
|
7431 | }
|
7432 | if (updatedData.classes.length > 0) {
|
7433 | _.forEach(updatedData.classes, function (classe) {
|
7434 | var _index = _.findIndex(_this.classes, { name: classe.name });
|
7435 | _this.classes[_index] = classe;
|
7436 | });
|
7437 | }
|
7438 | /**
|
7439 | * Miscellaneous update
|
7440 | */
|
7441 | if (updatedData.miscellaneous.variables.length > 0) {
|
7442 | _.forEach(updatedData.miscellaneous.variables, function (variable) {
|
7443 | var _index = _.findIndex(_this.miscellaneous.variables, {
|
7444 | name: variable.name,
|
7445 | file: variable.file
|
7446 | });
|
7447 | _this.miscellaneous.variables[_index] = variable;
|
7448 | });
|
7449 | }
|
7450 | if (updatedData.miscellaneous.functions.length > 0) {
|
7451 | _.forEach(updatedData.miscellaneous.functions, function (func) {
|
7452 | var _index = _.findIndex(_this.miscellaneous.functions, {
|
7453 | name: func.name,
|
7454 | file: func.file
|
7455 | });
|
7456 | _this.miscellaneous.functions[_index] = func;
|
7457 | });
|
7458 | }
|
7459 | if (updatedData.miscellaneous.typealiases.length > 0) {
|
7460 | _.forEach(updatedData.miscellaneous.typealiases, function (typealias) {
|
7461 | var _index = _.findIndex(_this.miscellaneous.typealiases, {
|
7462 | name: typealias.name,
|
7463 | file: typealias.file
|
7464 | });
|
7465 | _this.miscellaneous.typealiases[_index] = typealias;
|
7466 | });
|
7467 | }
|
7468 | if (updatedData.miscellaneous.enumerations.length > 0) {
|
7469 | _.forEach(updatedData.miscellaneous.enumerations, function (enumeration) {
|
7470 | var _index = _.findIndex(_this.miscellaneous.enumerations, {
|
7471 | name: enumeration.name,
|
7472 | file: enumeration.file
|
7473 | });
|
7474 | _this.miscellaneous.enumerations[_index] = enumeration;
|
7475 | });
|
7476 | }
|
7477 | this.prepareMiscellaneous();
|
7478 | };
|
7479 | DependenciesEngine.prototype.findInCompodoc = function (name) {
|
7480 | var mergedData = _.concat([], this.modules, this.components, this.controllers, this.directives, this.injectables, this.interceptors, this.guards, this.interfaces, this.pipes, this.classes, this.miscellaneous.enumerations, this.miscellaneous.typealiases, this.miscellaneous.variables, this.miscellaneous.functions);
|
7481 | var result = _.find(mergedData, { name: name });
|
7482 | return result || false;
|
7483 | };
|
7484 | DependenciesEngine.prototype.prepareMiscellaneous = function () {
|
7485 | this.miscellaneous.variables.sort(getNamesCompareFn());
|
7486 | this.miscellaneous.functions.sort(getNamesCompareFn());
|
7487 | this.miscellaneous.enumerations.sort(getNamesCompareFn());
|
7488 | this.miscellaneous.typealiases.sort(getNamesCompareFn());
|
7489 | // group each subgoup by file
|
7490 | this.miscellaneous.groupedVariables = _.groupBy(this.miscellaneous.variables, 'file');
|
7491 | this.miscellaneous.groupedFunctions = _.groupBy(this.miscellaneous.functions, 'file');
|
7492 | this.miscellaneous.groupedEnumerations = _.groupBy(this.miscellaneous.enumerations, 'file');
|
7493 | this.miscellaneous.groupedTypeAliases = _.groupBy(this.miscellaneous.typealiases, 'file');
|
7494 | };
|
7495 | DependenciesEngine.prototype.getModule = function (name) {
|
7496 | return _.find(this.modules, ['name', name]);
|
7497 | };
|
7498 | DependenciesEngine.prototype.getRawModule = function (name) {
|
7499 | return _.find(this.rawModules, ['name', name]);
|
7500 | };
|
7501 | DependenciesEngine.prototype.getModules = function () {
|
7502 | return this.modules;
|
7503 | };
|
7504 | DependenciesEngine.prototype.getComponents = function () {
|
7505 | return this.components;
|
7506 | };
|
7507 | DependenciesEngine.prototype.getControllers = function () {
|
7508 | return this.controllers;
|
7509 | };
|
7510 | DependenciesEngine.prototype.getDirectives = function () {
|
7511 | return this.directives;
|
7512 | };
|
7513 | DependenciesEngine.prototype.getInjectables = function () {
|
7514 | return this.injectables;
|
7515 | };
|
7516 | DependenciesEngine.prototype.getInterceptors = function () {
|
7517 | return this.interceptors;
|
7518 | };
|
7519 | DependenciesEngine.prototype.getGuards = function () {
|
7520 | return this.guards;
|
7521 | };
|
7522 | DependenciesEngine.prototype.getInterfaces = function () {
|
7523 | return this.interfaces;
|
7524 | };
|
7525 | DependenciesEngine.prototype.getRoutes = function () {
|
7526 | return this.routes;
|
7527 | };
|
7528 | DependenciesEngine.prototype.getPipes = function () {
|
7529 | return this.pipes;
|
7530 | };
|
7531 | DependenciesEngine.prototype.getClasses = function () {
|
7532 | return this.classes;
|
7533 | };
|
7534 | DependenciesEngine.prototype.getMiscellaneous = function () {
|
7535 | return this.miscellaneous;
|
7536 | };
|
7537 | return DependenciesEngine;
|
7538 | }());
|
7539 |
|
7540 | var chokidar = require('chokidar');
|
7541 | var marked$4 = require('marked');
|
7542 | var traverse$3 = require('traverse');
|
7543 | var cwd = process.cwd();
|
7544 | var $markdownengine = new MarkdownEngine();
|
7545 | var startTime = new Date();
|
7546 | var generationPromiseResolve;
|
7547 | var generationPromiseReject;
|
7548 | var generationPromise = new Promise(function (resolve, reject) {
|
7549 | generationPromiseResolve = resolve;
|
7550 | generationPromiseReject = reject;
|
7551 | });
|
7552 | var Application = /** @class */ (function () {
|
7553 | /**
|
7554 | * Create a new compodoc application instance.
|
7555 | *
|
7556 | * @param options An object containing the options that should be used.
|
7557 | */
|
7558 | function Application(options) {
|
7559 | var _this = this;
|
7560 | /**
|
7561 | * Files changed during watch scanning
|
7562 | */
|
7563 | this.watchChangedFiles = [];
|
7564 | /**
|
7565 | * Boolean for watching status
|
7566 | * @type {boolean}
|
7567 | */
|
7568 | this.isWatching = false;
|
7569 | /**
|
7570 | * Store package.json data
|
7571 | */
|
7572 | this.packageJsonData = {};
|
7573 | this.angularVersionUtil = new AngularVersionUtil();
|
7574 | this.fileEngine = new FileEngine();
|
7575 | this.routerParser = new RouterParserUtil();
|
7576 | this.preparePipes = function (somePipes) {
|
7577 | logger.info('Prepare pipes');
|
7578 | _this.configuration.mainData.pipes = somePipes
|
7579 | ? somePipes
|
7580 | : _this.dependenciesEngine.getPipes();
|
7581 | return new Promise(function (resolve, reject) {
|
7582 | var i = 0;
|
7583 | var len = _this.configuration.mainData.pipes.length;
|
7584 | var loop = function () {
|
7585 | if (i < len) {
|
7586 | var pipe = _this.configuration.mainData.pipes[i];
|
7587 | if ($markdownengine.hasNeighbourReadmeFile(pipe.file)) {
|
7588 | logger.info(" " + pipe.name + " has a README file, include it");
|
7589 | var readme = $markdownengine.readNeighbourReadmeFile(pipe.file);
|
7590 | pipe.readme = marked$4(readme);
|
7591 | }
|
7592 | var page = {
|
7593 | path: 'pipes',
|
7594 | name: pipe.name,
|
7595 | id: pipe.id,
|
7596 | navTabs: _this.getNavTabs(pipe),
|
7597 | context: 'pipe',
|
7598 | pipe: pipe,
|
7599 | depth: 1,
|
7600 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
7601 | };
|
7602 | if (pipe.isDuplicate) {
|
7603 | page.name += '-' + pipe.duplicateId;
|
7604 | }
|
7605 | _this.configuration.addPage(page);
|
7606 | i++;
|
7607 | loop();
|
7608 | }
|
7609 | else {
|
7610 | resolve();
|
7611 | }
|
7612 | };
|
7613 | loop();
|
7614 | });
|
7615 | };
|
7616 | this.prepareClasses = function (someClasses) {
|
7617 | logger.info('Prepare classes');
|
7618 | _this.configuration.mainData.classes = someClasses
|
7619 | ? someClasses
|
7620 | : _this.dependenciesEngine.getClasses();
|
7621 | return new Promise(function (resolve, reject) {
|
7622 | var i = 0;
|
7623 | var len = _this.configuration.mainData.classes.length;
|
7624 | var loop = function () {
|
7625 | if (i < len) {
|
7626 | var classe = _this.configuration.mainData.classes[i];
|
7627 | if ($markdownengine.hasNeighbourReadmeFile(classe.file)) {
|
7628 | logger.info(" " + classe.name + " has a README file, include it");
|
7629 | var readme = $markdownengine.readNeighbourReadmeFile(classe.file);
|
7630 | classe.readme = marked$4(readme);
|
7631 | }
|
7632 | var page = {
|
7633 | path: 'classes',
|
7634 | name: classe.name,
|
7635 | id: classe.id,
|
7636 | navTabs: _this.getNavTabs(classe),
|
7637 | context: 'class',
|
7638 | class: classe,
|
7639 | depth: 1,
|
7640 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
7641 | };
|
7642 | if (classe.isDuplicate) {
|
7643 | page.name += '-' + classe.duplicateId;
|
7644 | }
|
7645 | _this.configuration.addPage(page);
|
7646 | i++;
|
7647 | loop();
|
7648 | }
|
7649 | else {
|
7650 | resolve();
|
7651 | }
|
7652 | };
|
7653 | loop();
|
7654 | });
|
7655 | };
|
7656 | this.configuration = new Configuration();
|
7657 | this.dependenciesEngine = new DependenciesEngine();
|
7658 | this.ngdEngine = new NgdEngine(this.dependenciesEngine);
|
7659 | this.htmlEngine = new HtmlEngine(this.configuration, this.dependenciesEngine, this.fileEngine);
|
7660 | this.searchEngine = new SearchEngine(this.configuration, this.fileEngine);
|
7661 | this.exportEngine = new ExportEngine(this.configuration, this.dependenciesEngine, this.fileEngine);
|
7662 | for (var option in options) {
|
7663 | if (typeof this.configuration.mainData[option] !== 'undefined') {
|
7664 | this.configuration.mainData[option] = options[option];
|
7665 | }
|
7666 | // For documentationMainName, process it outside the loop, for handling conflict with pages name
|
7667 | if (option === 'name') {
|
7668 | this.configuration.mainData.documentationMainName = options[option];
|
7669 | }
|
7670 | // For documentationMainName, process it outside the loop, for handling conflict with pages name
|
7671 | if (option === 'silent') {
|
7672 | logger.silent = false;
|
7673 | }
|
7674 | }
|
7675 | }
|
7676 | /**
|
7677 | * Start compodoc process
|
7678 | */
|
7679 | Application.prototype.generate = function () {
|
7680 | var _this = this;
|
7681 | process.on('unhandledRejection', this.unhandledRejectionListener);
|
7682 | process.on('uncaughtException', this.uncaughtExceptionListener);
|
7683 | I18nEngineInstance.init(this.configuration.mainData.language);
|
7684 | if (this.configuration.mainData.output.charAt(this.configuration.mainData.output.length - 1) !== '/') {
|
7685 | this.configuration.mainData.output += '/';
|
7686 | }
|
7687 | if (this.configuration.mainData.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
|
7688 | this.processPackageJson();
|
7689 | }
|
7690 | else {
|
7691 | this.htmlEngine.init(this.configuration.mainData.templates).then(function () { return _this.processPackageJson(); });
|
7692 | }
|
7693 | return generationPromise;
|
7694 | };
|
7695 | Application.prototype.endCallback = function () {
|
7696 | process.removeListener('unhandledRejection', this.unhandledRejectionListener);
|
7697 | process.removeListener('uncaughtException', this.uncaughtExceptionListener);
|
7698 | };
|
7699 | Application.prototype.unhandledRejectionListener = function (err, p) {
|
7700 | console.log('Unhandled Rejection at:', p, 'reason:', err);
|
7701 | logger.error('Sorry, but there was a problem during parsing or generation of the documentation. Please fill an issue on github. (https://github.com/compodoc/compodoc/issues/new)'); // tslint:disable-line
|
7702 | process.exit(1);
|
7703 | };
|
7704 | Application.prototype.uncaughtExceptionListener = function (err) {
|
7705 | logger.error(err);
|
7706 | logger.error('Sorry, but there was a problem during parsing or generation of the documentation. Please fill an issue on github. (https://github.com/compodoc/compodoc/issues/new)'); // tslint:disable-line
|
7707 | process.exit(1);
|
7708 | };
|
7709 | /**
|
7710 | * Start compodoc documentation coverage
|
7711 | */
|
7712 | Application.prototype.testCoverage = function () {
|
7713 | this.getDependenciesData();
|
7714 | };
|
7715 | /**
|
7716 | * Store files for initial processing
|
7717 | * @param {Array<string>} files Files found during source folder and tsconfig scan
|
7718 | */
|
7719 | Application.prototype.setFiles = function (files) {
|
7720 | this.files = files;
|
7721 | };
|
7722 | /**
|
7723 | * Store files for watch processing
|
7724 | * @param {Array<string>} files Files found during source folder and tsconfig scan
|
7725 | */
|
7726 | Application.prototype.setUpdatedFiles = function (files) {
|
7727 | this.updatedFiles = files;
|
7728 | };
|
7729 | /**
|
7730 | * Return a boolean indicating presence of one TypeScript file in updatedFiles list
|
7731 | * @return {boolean} Result of scan
|
7732 | */
|
7733 | Application.prototype.hasWatchedFilesTSFiles = function () {
|
7734 | var result = false;
|
7735 | _.forEach(this.updatedFiles, function (file) {
|
7736 | if (path.extname(file) === '.ts') {
|
7737 | result = true;
|
7738 | }
|
7739 | });
|
7740 | return result;
|
7741 | };
|
7742 | /**
|
7743 | * Return a boolean indicating presence of one root markdown files in updatedFiles list
|
7744 | * @return {boolean} Result of scan
|
7745 | */
|
7746 | Application.prototype.hasWatchedFilesRootMarkdownFiles = function () {
|
7747 | var result = false;
|
7748 | _.forEach(this.updatedFiles, function (file) {
|
7749 | if (path.extname(file) === '.md' && path.dirname(file) === process.cwd()) {
|
7750 | result = true;
|
7751 | }
|
7752 | });
|
7753 | return result;
|
7754 | };
|
7755 | /**
|
7756 | * Clear files for watch processing
|
7757 | */
|
7758 | Application.prototype.clearUpdatedFiles = function () {
|
7759 | this.updatedFiles = [];
|
7760 | this.watchChangedFiles = [];
|
7761 | };
|
7762 | Application.prototype.processPackageJson = function () {
|
7763 | var _this = this;
|
7764 | logger.info('Searching package.json file');
|
7765 | this.fileEngine.get(process.cwd() + path.sep + 'package.json').then(function (packageData) {
|
7766 | var parsedData = JSON.parse(packageData);
|
7767 | _this.packageJsonData = parsedData;
|
7768 | if (typeof parsedData.name !== 'undefined' &&
|
7769 | _this.configuration.mainData.documentationMainName === COMPODOC_DEFAULTS.title) {
|
7770 | _this.configuration.mainData.documentationMainName =
|
7771 | parsedData.name + ' documentation';
|
7772 | }
|
7773 | if (typeof parsedData.description !== 'undefined') {
|
7774 | _this.configuration.mainData.documentationMainDescription =
|
7775 | parsedData.description;
|
7776 | }
|
7777 | _this.configuration.mainData.angularVersion = _this.angularVersionUtil.getAngularVersionOfProject(parsedData);
|
7778 | logger.info('package.json file found');
|
7779 | if (typeof parsedData.dependencies !== 'undefined') {
|
7780 | _this.processPackageDependencies(parsedData.dependencies);
|
7781 | }
|
7782 | if (typeof parsedData.peerDependencies !== 'undefined') {
|
7783 | _this.processPackagePeerDependencies(parsedData.peerDependencies);
|
7784 | }
|
7785 | _this.processMarkdowns().then(function () {
|
7786 | _this.getDependenciesData();
|
7787 | }, function (errorMessage) {
|
7788 | logger.error(errorMessage);
|
7789 | });
|
7790 | }, function (errorMessage) {
|
7791 | logger.error(errorMessage);
|
7792 | logger.error('Continuing without package.json file');
|
7793 | _this.processMarkdowns().then(function () {
|
7794 | _this.getDependenciesData();
|
7795 | }, function (errorMessage1) {
|
7796 | logger.error(errorMessage1);
|
7797 | });
|
7798 | });
|
7799 | };
|
7800 | Application.prototype.processPackagePeerDependencies = function (dependencies) {
|
7801 | logger.info('Processing package.json peerDependencies');
|
7802 | this.configuration.mainData.packagePeerDependencies = dependencies;
|
7803 | if (!this.configuration.hasPage('dependencies')) {
|
7804 | this.configuration.addPage({
|
7805 | name: 'dependencies',
|
7806 | id: 'packageDependencies',
|
7807 | context: 'package-dependencies',
|
7808 | depth: 0,
|
7809 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
7810 | });
|
7811 | }
|
7812 | };
|
7813 | Application.prototype.processPackageDependencies = function (dependencies) {
|
7814 | logger.info('Processing package.json dependencies');
|
7815 | this.configuration.mainData.packageDependencies = dependencies;
|
7816 | this.configuration.addPage({
|
7817 | name: 'dependencies',
|
7818 | id: 'packageDependencies',
|
7819 | context: 'package-dependencies',
|
7820 | depth: 0,
|
7821 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
7822 | });
|
7823 | };
|
7824 | Application.prototype.processMarkdowns = function () {
|
7825 | var _this = this;
|
7826 | logger.info('Searching README.md, CHANGELOG.md, CONTRIBUTING.md, LICENSE.md, TODO.md files');
|
7827 | return new Promise(function (resolve, reject) {
|
7828 | var i = 0;
|
7829 | var markdowns = ['readme', 'changelog', 'contributing', 'license', 'todo'];
|
7830 | var numberOfMarkdowns = 5;
|
7831 | var loop = function () {
|
7832 | if (i < numberOfMarkdowns) {
|
7833 | $markdownengine.getTraditionalMarkdown(markdowns[i].toUpperCase()).then(function (readmeData) {
|
7834 | _this.configuration.addPage({
|
7835 | name: markdowns[i] === 'readme' ? 'index' : markdowns[i],
|
7836 | context: 'getting-started',
|
7837 | id: 'getting-started',
|
7838 | markdown: readmeData,
|
7839 | depth: 0,
|
7840 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
7841 | });
|
7842 | if (markdowns[i] === 'readme') {
|
7843 | _this.configuration.mainData.readme = true;
|
7844 | _this.configuration.addPage({
|
7845 | name: 'overview',
|
7846 | id: 'overview',
|
7847 | context: 'overview',
|
7848 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
7849 | });
|
7850 | }
|
7851 | else {
|
7852 | _this.configuration.mainData.markdowns.push({
|
7853 | name: markdowns[i],
|
7854 | uppername: markdowns[i].toUpperCase(),
|
7855 | depth: 0,
|
7856 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
7857 | });
|
7858 | }
|
7859 | logger.info(markdowns[i].toUpperCase() + ".md file found");
|
7860 | i++;
|
7861 | loop();
|
7862 | }, function (errorMessage) {
|
7863 | logger.warn(errorMessage);
|
7864 | logger.warn("Continuing without " + markdowns[i].toUpperCase() + ".md file");
|
7865 | if (markdowns[i] === 'readme') {
|
7866 | _this.configuration.addPage({
|
7867 | name: 'index',
|
7868 | id: 'index',
|
7869 | context: 'overview',
|
7870 | depth: 0,
|
7871 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
7872 | });
|
7873 | }
|
7874 | i++;
|
7875 | loop();
|
7876 | });
|
7877 | }
|
7878 | else {
|
7879 | resolve();
|
7880 | }
|
7881 | };
|
7882 | loop();
|
7883 | });
|
7884 | };
|
7885 | Application.prototype.rebuildRootMarkdowns = function () {
|
7886 | var _this = this;
|
7887 | logger.info('Regenerating README.md, CHANGELOG.md, CONTRIBUTING.md, LICENSE.md, TODO.md pages');
|
7888 | var actions = [];
|
7889 | this.configuration.resetRootMarkdownPages();
|
7890 | actions.push(function () {
|
7891 | return _this.processMarkdowns();
|
7892 | });
|
7893 | promiseSequential(actions)
|
7894 | .then(function (res) {
|
7895 | _this.processPages();
|
7896 | _this.clearUpdatedFiles();
|
7897 | })
|
7898 | .catch(function (errorMessage) {
|
7899 | logger.error(errorMessage);
|
7900 | });
|
7901 | };
|
7902 | /**
|
7903 | * Get dependency data for small group of updated files during watch process
|
7904 | */
|
7905 | Application.prototype.getMicroDependenciesData = function () {
|
7906 | logger.info('Get diff dependencies data');
|
7907 | var crawler = new Dependencies(this.updatedFiles, {
|
7908 | tsconfigDirectory: path.dirname(this.configuration.mainData.tsconfig)
|
7909 | }, this.configuration, this.routerParser);
|
7910 | var dependenciesData = crawler.getDependencies();
|
7911 | this.dependenciesEngine.update(dependenciesData);
|
7912 | this.prepareJustAFewThings(dependenciesData);
|
7913 | };
|
7914 | /**
|
7915 | * Rebuild external documentation during watch process
|
7916 | */
|
7917 | Application.prototype.rebuildExternalDocumentation = function () {
|
7918 | var _this = this;
|
7919 | logger.info('Rebuild external documentation');
|
7920 | var actions = [];
|
7921 | this.configuration.resetAdditionalPages();
|
7922 | if (this.configuration.mainData.includes !== '') {
|
7923 | actions.push(function () {
|
7924 | return _this.prepareExternalIncludes();
|
7925 | });
|
7926 | }
|
7927 | promiseSequential(actions)
|
7928 | .then(function (res) {
|
7929 | _this.processPages();
|
7930 | _this.clearUpdatedFiles();
|
7931 | })
|
7932 | .catch(function (errorMessage) {
|
7933 | logger.error(errorMessage);
|
7934 | });
|
7935 | };
|
7936 | Application.prototype.getDependenciesData = function () {
|
7937 | logger.info('Get dependencies data');
|
7938 | /**
|
7939 | * AngularJS detection strategy :
|
7940 | * - if in package.json
|
7941 | * - if 75% of scanned files are *.js files
|
7942 | */
|
7943 | var dependenciesClass = AngularDependencies;
|
7944 | this.configuration.mainData.angularProject = true;
|
7945 | if (typeof this.packageJsonData.dependencies !== 'undefined') {
|
7946 | if (typeof this.packageJsonData.dependencies.angular !== 'undefined') {
|
7947 | logger.info('AngularJS project detected');
|
7948 | this.configuration.mainData.angularProject = false;
|
7949 | this.configuration.mainData.angularJSProject = true;
|
7950 | dependenciesClass = AngularJSDependencies;
|
7951 | }
|
7952 | else {
|
7953 | var countJSFiles_1 = 0;
|
7954 | this.files.forEach(function (file) {
|
7955 | if (path.extname(file) === '.js') {
|
7956 | countJSFiles_1 += 1;
|
7957 | }
|
7958 | });
|
7959 | var percentOfJSFiles = (countJSFiles_1 * 100) / this.files.length;
|
7960 | if (percentOfJSFiles >= 75) {
|
7961 | logger.info('AngularJS project detected');
|
7962 | this.configuration.mainData.angularProject = false;
|
7963 | this.configuration.mainData.angularJSProject = true;
|
7964 | dependenciesClass = AngularJSDependencies;
|
7965 | }
|
7966 | }
|
7967 | }
|
7968 | var crawler = new dependenciesClass(this.files, {
|
7969 | tsconfigDirectory: path.dirname(this.configuration.mainData.tsconfig)
|
7970 | }, this.configuration, this.routerParser);
|
7971 | var dependenciesData = crawler.getDependencies();
|
7972 | this.dependenciesEngine.init(dependenciesData);
|
7973 | this.configuration.mainData.routesLength = this.routerParser.routesLength();
|
7974 | this.printStatistics();
|
7975 | this.prepareEverything();
|
7976 | };
|
7977 | Application.prototype.prepareJustAFewThings = function (diffCrawledData) {
|
7978 | var _this = this;
|
7979 | var actions = [];
|
7980 | this.configuration.resetPages();
|
7981 | if (!this.configuration.mainData.disableRoutesGraph) {
|
7982 | actions.push(function () { return _this.prepareRoutes(); });
|
7983 | }
|
7984 | if (diffCrawledData.components.length > 0) {
|
7985 | actions.push(function () { return _this.prepareComponents(); });
|
7986 | }
|
7987 | if (diffCrawledData.controllers.length > 0) {
|
7988 | actions.push(function () { return _this.prepareControllers(); });
|
7989 | }
|
7990 | if (diffCrawledData.modules.length > 0) {
|
7991 | actions.push(function () { return _this.prepareModules(); });
|
7992 | }
|
7993 | if (diffCrawledData.directives.length > 0) {
|
7994 | actions.push(function () { return _this.prepareDirectives(); });
|
7995 | }
|
7996 | if (diffCrawledData.injectables.length > 0) {
|
7997 | actions.push(function () { return _this.prepareInjectables(); });
|
7998 | }
|
7999 | if (diffCrawledData.interceptors.length > 0) {
|
8000 | actions.push(function () { return _this.prepareInterceptors(); });
|
8001 | }
|
8002 | if (diffCrawledData.guards.length > 0) {
|
8003 | actions.push(function () { return _this.prepareGuards(); });
|
8004 | }
|
8005 | if (diffCrawledData.pipes.length > 0) {
|
8006 | actions.push(function () { return _this.preparePipes(); });
|
8007 | }
|
8008 | if (diffCrawledData.classes.length > 0) {
|
8009 | actions.push(function () { return _this.prepareClasses(); });
|
8010 | }
|
8011 | if (diffCrawledData.interfaces.length > 0) {
|
8012 | actions.push(function () { return _this.prepareInterfaces(); });
|
8013 | }
|
8014 | if (diffCrawledData.miscellaneous.variables.length > 0 ||
|
8015 | diffCrawledData.miscellaneous.functions.length > 0 ||
|
8016 | diffCrawledData.miscellaneous.typealiases.length > 0 ||
|
8017 | diffCrawledData.miscellaneous.enumerations.length > 0) {
|
8018 | actions.push(function () { return _this.prepareMiscellaneous(); });
|
8019 | }
|
8020 | if (!this.configuration.mainData.disableCoverage) {
|
8021 | actions.push(function () { return _this.prepareCoverage(); });
|
8022 | }
|
8023 | promiseSequential(actions)
|
8024 | .then(function (res) {
|
8025 | _this.processGraphs();
|
8026 | _this.clearUpdatedFiles();
|
8027 | })
|
8028 | .catch(function (errorMessage) {
|
8029 | logger.error(errorMessage);
|
8030 | });
|
8031 | };
|
8032 | Application.prototype.printStatistics = function () {
|
8033 | logger.info('-------------------');
|
8034 | logger.info('Project statistics ');
|
8035 | if (this.dependenciesEngine.modules.length > 0) {
|
8036 | logger.info("- files : " + this.files.length);
|
8037 | }
|
8038 | if (this.dependenciesEngine.modules.length > 0) {
|
8039 | logger.info("- module : " + this.dependenciesEngine.modules.length);
|
8040 | }
|
8041 | if (this.dependenciesEngine.components.length > 0) {
|
8042 | logger.info("- component : " + this.dependenciesEngine.components.length);
|
8043 | }
|
8044 | if (this.dependenciesEngine.controllers.length > 0) {
|
8045 | logger.info("- controller : " + this.dependenciesEngine.controllers.length);
|
8046 | }
|
8047 | if (this.dependenciesEngine.directives.length > 0) {
|
8048 | logger.info("- directive : " + this.dependenciesEngine.directives.length);
|
8049 | }
|
8050 | if (this.dependenciesEngine.injectables.length > 0) {
|
8051 | logger.info("- injectable : " + this.dependenciesEngine.injectables.length);
|
8052 | }
|
8053 | if (this.dependenciesEngine.interceptors.length > 0) {
|
8054 | logger.info("- injector : " + this.dependenciesEngine.interceptors.length);
|
8055 | }
|
8056 | if (this.dependenciesEngine.guards.length > 0) {
|
8057 | logger.info("- guard : " + this.dependenciesEngine.guards.length);
|
8058 | }
|
8059 | if (this.dependenciesEngine.pipes.length > 0) {
|
8060 | logger.info("- pipe : " + this.dependenciesEngine.pipes.length);
|
8061 | }
|
8062 | if (this.dependenciesEngine.classes.length > 0) {
|
8063 | logger.info("- class : " + this.dependenciesEngine.classes.length);
|
8064 | }
|
8065 | if (this.dependenciesEngine.interfaces.length > 0) {
|
8066 | logger.info("- interface : " + this.dependenciesEngine.interfaces.length);
|
8067 | }
|
8068 | if (this.configuration.mainData.routesLength > 0) {
|
8069 | logger.info("- route : " + this.configuration.mainData.routesLength);
|
8070 | }
|
8071 | logger.info('-------------------');
|
8072 | };
|
8073 | Application.prototype.prepareEverything = function () {
|
8074 | var _this = this;
|
8075 | var actions = [];
|
8076 | actions.push(function () {
|
8077 | return _this.prepareComponents();
|
8078 | });
|
8079 | actions.push(function () {
|
8080 | return _this.prepareModules();
|
8081 | });
|
8082 | if (this.dependenciesEngine.directives.length > 0) {
|
8083 | actions.push(function () {
|
8084 | return _this.prepareDirectives();
|
8085 | });
|
8086 | }
|
8087 | if (this.dependenciesEngine.controllers.length > 0) {
|
8088 | actions.push(function () {
|
8089 | return _this.prepareControllers();
|
8090 | });
|
8091 | }
|
8092 | if (this.dependenciesEngine.injectables.length > 0) {
|
8093 | actions.push(function () {
|
8094 | return _this.prepareInjectables();
|
8095 | });
|
8096 | }
|
8097 | if (this.dependenciesEngine.interceptors.length > 0) {
|
8098 | actions.push(function () {
|
8099 | return _this.prepareInterceptors();
|
8100 | });
|
8101 | }
|
8102 | if (this.dependenciesEngine.guards.length > 0) {
|
8103 | actions.push(function () {
|
8104 | return _this.prepareGuards();
|
8105 | });
|
8106 | }
|
8107 | if (this.dependenciesEngine.routes &&
|
8108 | this.dependenciesEngine.routes.children.length > 0 &&
|
8109 | !this.configuration.mainData.disableRoutesGraph) {
|
8110 | actions.push(function () {
|
8111 | return _this.prepareRoutes();
|
8112 | });
|
8113 | }
|
8114 | if (this.dependenciesEngine.pipes.length > 0) {
|
8115 | actions.push(function () {
|
8116 | return _this.preparePipes();
|
8117 | });
|
8118 | }
|
8119 | if (this.dependenciesEngine.classes.length > 0) {
|
8120 | actions.push(function () {
|
8121 | return _this.prepareClasses();
|
8122 | });
|
8123 | }
|
8124 | if (this.dependenciesEngine.interfaces.length > 0) {
|
8125 | actions.push(function () {
|
8126 | return _this.prepareInterfaces();
|
8127 | });
|
8128 | }
|
8129 | if (this.dependenciesEngine.miscellaneous.variables.length > 0 ||
|
8130 | this.dependenciesEngine.miscellaneous.functions.length > 0 ||
|
8131 | this.dependenciesEngine.miscellaneous.typealiases.length > 0 ||
|
8132 | this.dependenciesEngine.miscellaneous.enumerations.length > 0) {
|
8133 | actions.push(function () {
|
8134 | return _this.prepareMiscellaneous();
|
8135 | });
|
8136 | }
|
8137 | if (!this.configuration.mainData.disableCoverage) {
|
8138 | actions.push(function () {
|
8139 | return _this.prepareCoverage();
|
8140 | });
|
8141 | }
|
8142 | if (this.configuration.mainData.unitTestCoverage !== '') {
|
8143 | actions.push(function () {
|
8144 | return _this.prepareUnitTestCoverage();
|
8145 | });
|
8146 | }
|
8147 | if (this.configuration.mainData.includes !== '') {
|
8148 | actions.push(function () {
|
8149 | return _this.prepareExternalIncludes();
|
8150 | });
|
8151 | }
|
8152 | promiseSequential(actions)
|
8153 | .then(function (res) {
|
8154 | if (_this.configuration.mainData.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
|
8155 | if (COMPODOC_DEFAULTS.exportFormatsSupported.indexOf(_this.configuration.mainData.exportFormat) > -1) {
|
8156 | logger.info("Generating documentation in export format " + _this.configuration.mainData.exportFormat);
|
8157 | _this.exportEngine
|
8158 | .export(_this.configuration.mainData.output, _this.configuration.mainData)
|
8159 | .then(function () {
|
8160 | generationPromiseResolve();
|
8161 | _this.endCallback();
|
8162 | logger.info('Documentation generated in ' +
|
8163 | _this.configuration.mainData.output +
|
8164 | ' in ' +
|
8165 | _this.getElapsedTime() +
|
8166 | ' seconds');
|
8167 | });
|
8168 | }
|
8169 | else {
|
8170 | logger.warn("Exported format not supported");
|
8171 | }
|
8172 | }
|
8173 | else {
|
8174 | _this.processGraphs();
|
8175 | }
|
8176 | })
|
8177 | .catch(function (errorMessage) {
|
8178 | logger.error(errorMessage);
|
8179 | });
|
8180 | };
|
8181 | Application.prototype.getIncludedPathForFile = function (file) {
|
8182 | return path.join(this.configuration.mainData.includes, file);
|
8183 | };
|
8184 | Application.prototype.prepareExternalIncludes = function () {
|
8185 | var _this = this;
|
8186 | logger.info('Adding external markdown files');
|
8187 | // Scan include folder for files detailed in summary.json
|
8188 | // For each file, add to this.configuration.mainData.additionalPages
|
8189 | // Each file will be converted to html page, inside COMPODOC_DEFAULTS.additionalEntryPath
|
8190 | return new Promise(function (resolve, reject) {
|
8191 | _this.fileEngine.get(_this.getIncludedPathForFile('summary.json')).then(function (summaryData) {
|
8192 | logger.info('Additional documentation: summary.json file found');
|
8193 | var parsedSummaryData = JSON.parse(summaryData);
|
8194 | var that = _this;
|
8195 | traverse$3(parsedSummaryData).forEach(function () {
|
8196 | if (this.notRoot && typeof this.node === 'object') {
|
8197 | var rawPath = this.path;
|
8198 | var file = this.node['file'];
|
8199 | var title = this.node['title'];
|
8200 | var finalPath_1 = that.configuration.mainData.includesFolder;
|
8201 | var finalDepth = rawPath.filter(function (el) {
|
8202 | return !isNaN(parseInt(el));
|
8203 | });
|
8204 | if (typeof file !== 'undefined' && typeof title !== 'undefined') {
|
8205 | var url = cleanNameWithoutSpaceAndToLowerCase(title);
|
8206 | var lastElementRootTree_1 = null;
|
8207 | finalDepth.forEach(function (el) {
|
8208 | var elementTree = lastElementRootTree_1 === null
|
8209 | ? parsedSummaryData
|
8210 | : lastElementRootTree_1;
|
8211 | if (typeof elementTree.children !== 'undefined') {
|
8212 | elementTree = elementTree['children'][el];
|
8213 | }
|
8214 | else {
|
8215 | elementTree = elementTree[el];
|
8216 | }
|
8217 | finalPath_1 +=
|
8218 | '/' +
|
8219 | cleanNameWithoutSpaceAndToLowerCase(elementTree.title);
|
8220 | lastElementRootTree_1 = elementTree;
|
8221 | });
|
8222 | finalPath_1 = finalPath_1.replace('/' + url, '');
|
8223 | var markdownFile = $markdownengine.getTraditionalMarkdownSync(that.getIncludedPathForFile(file));
|
8224 | if (finalDepth.length > 5) {
|
8225 | logger.error('Only 5 levels of depth are supported');
|
8226 | }
|
8227 | else {
|
8228 | that.configuration.addAdditionalPage({
|
8229 | name: title,
|
8230 | id: title,
|
8231 | filename: url,
|
8232 | context: 'additional-page',
|
8233 | path: finalPath_1,
|
8234 | additionalPage: markdownFile,
|
8235 | depth: finalDepth.length,
|
8236 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
8237 | });
|
8238 | }
|
8239 | }
|
8240 | }
|
8241 | });
|
8242 | resolve();
|
8243 | }, function (errorMessage) {
|
8244 | logger.error(errorMessage);
|
8245 | reject('Error during Additional documentation generation');
|
8246 | });
|
8247 | });
|
8248 | };
|
8249 | Application.prototype.prepareModules = function (someModules) {
|
8250 | var _this = this;
|
8251 | logger.info('Prepare modules');
|
8252 | var i = 0;
|
8253 | var _modules = someModules ? someModules : this.dependenciesEngine.getModules();
|
8254 | return new Promise(function (resolve, reject) {
|
8255 | _this.configuration.mainData.modules = _modules.map(function (ngModule) {
|
8256 | ngModule.compodocLinks = {
|
8257 | components: [],
|
8258 | controllers: [],
|
8259 | directives: [],
|
8260 | injectables: [],
|
8261 | pipes: []
|
8262 | };
|
8263 | ['declarations', 'bootstrap', 'imports', 'exports', 'controllers'].forEach(function (metadataType) {
|
8264 | ngModule[metadataType] = ngModule[metadataType].filter(function (metaDataItem) {
|
8265 | switch (metaDataItem.type) {
|
8266 | case 'directive':
|
8267 | return _this.dependenciesEngine.getDirectives().some(function (directive) {
|
8268 | var selectedDirective;
|
8269 | if (typeof metaDataItem.id !== 'undefined') {
|
8270 | selectedDirective =
|
8271 | directive.id === metaDataItem.id;
|
8272 | }
|
8273 | else {
|
8274 | selectedDirective =
|
8275 | directive.name === metaDataItem.name;
|
8276 | }
|
8277 | if (selectedDirective &&
|
8278 | !ngModule.compodocLinks.directives.includes(directive)) {
|
8279 | ngModule.compodocLinks.directives.push(directive);
|
8280 | }
|
8281 | return selectedDirective;
|
8282 | });
|
8283 | case 'component':
|
8284 | return _this.dependenciesEngine.getComponents().some(function (component) {
|
8285 | var selectedComponent;
|
8286 | if (typeof metaDataItem.id !== 'undefined') {
|
8287 | selectedComponent =
|
8288 | component.id === metaDataItem.id;
|
8289 | }
|
8290 | else {
|
8291 | selectedComponent =
|
8292 | component.name === metaDataItem.name;
|
8293 | }
|
8294 | if (selectedComponent &&
|
8295 | !ngModule.compodocLinks.components.includes(component)) {
|
8296 | ngModule.compodocLinks.components.push(component);
|
8297 | }
|
8298 | return selectedComponent;
|
8299 | });
|
8300 | case 'controller':
|
8301 | return _this.dependenciesEngine.getControllers().some(function (controller) {
|
8302 | var selectedController;
|
8303 | if (typeof metaDataItem.id !== 'undefined') {
|
8304 | selectedController =
|
8305 | controller.id === metaDataItem.id;
|
8306 | }
|
8307 | else {
|
8308 | selectedController =
|
8309 | controller.name === metaDataItem.name;
|
8310 | }
|
8311 | if (selectedController &&
|
8312 | !ngModule.compodocLinks.controllers.includes(controller)) {
|
8313 | ngModule.compodocLinks.controllers.push(controller);
|
8314 | }
|
8315 | return selectedController;
|
8316 | });
|
8317 | case 'module':
|
8318 | return _this.dependenciesEngine
|
8319 | .getModules()
|
8320 | .some(function (module) { return module.name === metaDataItem.name; });
|
8321 | case 'pipe':
|
8322 | return _this.dependenciesEngine.getPipes().some(function (pipe) {
|
8323 | var selectedPipe;
|
8324 | if (typeof metaDataItem.id !== 'undefined') {
|
8325 | selectedPipe = pipe.id === metaDataItem.id;
|
8326 | }
|
8327 | else {
|
8328 | selectedPipe = pipe.name === metaDataItem.name;
|
8329 | }
|
8330 | if (selectedPipe &&
|
8331 | !ngModule.compodocLinks.pipes.includes(pipe)) {
|
8332 | ngModule.compodocLinks.pipes.push(pipe);
|
8333 | }
|
8334 | return selectedPipe;
|
8335 | });
|
8336 | default:
|
8337 | return true;
|
8338 | }
|
8339 | });
|
8340 | });
|
8341 | ngModule.providers = ngModule.providers.filter(function (provider) {
|
8342 | return (_this.dependenciesEngine.getInjectables().some(function (injectable) {
|
8343 | var selectedInjectable = injectable.name === provider.name;
|
8344 | if (selectedInjectable &&
|
8345 | !ngModule.compodocLinks.injectables.includes(injectable)) {
|
8346 | ngModule.compodocLinks.injectables.push(injectable);
|
8347 | }
|
8348 | return selectedInjectable;
|
8349 | }) ||
|
8350 | _this.dependenciesEngine
|
8351 | .getInterceptors()
|
8352 | .some(function (interceptor) { return interceptor.name === provider.name; }));
|
8353 | });
|
8354 | // Try fixing type undefined for each providers
|
8355 | _.forEach(ngModule.providers, function (provider) {
|
8356 | if (_this.dependenciesEngine
|
8357 | .getInjectables()
|
8358 | .find(function (injectable) { return injectable.name === provider.name; })) {
|
8359 | provider.type = 'injectable';
|
8360 | }
|
8361 | if (_this.dependenciesEngine
|
8362 | .getInterceptors()
|
8363 | .find(function (interceptor) { return interceptor.name === provider.name; })) {
|
8364 | provider.type = 'interceptor';
|
8365 | }
|
8366 | });
|
8367 | // Order things
|
8368 | ngModule.compodocLinks.components = _.sortBy(ngModule.compodocLinks.components, [
|
8369 | 'name'
|
8370 | ]);
|
8371 | ngModule.compodocLinks.controllers = _.sortBy(ngModule.compodocLinks.controllers, [
|
8372 | 'name'
|
8373 | ]);
|
8374 | ngModule.compodocLinks.directives = _.sortBy(ngModule.compodocLinks.directives, [
|
8375 | 'name'
|
8376 | ]);
|
8377 | ngModule.compodocLinks.injectables = _.sortBy(ngModule.compodocLinks.injectables, [
|
8378 | 'name'
|
8379 | ]);
|
8380 | ngModule.compodocLinks.pipes = _.sortBy(ngModule.compodocLinks.pipes, ['name']);
|
8381 | ngModule.declarations = _.sortBy(ngModule.declarations, ['name']);
|
8382 | ngModule.entryComponents = _.sortBy(ngModule.entryComponents, ['name']);
|
8383 | ngModule.providers = _.sortBy(ngModule.providers, ['name']);
|
8384 | ngModule.imports = _.sortBy(ngModule.imports, ['name']);
|
8385 | ngModule.exports = _.sortBy(ngModule.exports, ['name']);
|
8386 | return ngModule;
|
8387 | });
|
8388 | _this.configuration.addPage({
|
8389 | name: 'modules',
|
8390 | id: 'modules',
|
8391 | context: 'modules',
|
8392 | depth: 0,
|
8393 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
8394 | });
|
8395 | var len = _this.configuration.mainData.modules.length;
|
8396 | var loop = function () {
|
8397 | if (i < len) {
|
8398 | if ($markdownengine.hasNeighbourReadmeFile(_this.configuration.mainData.modules[i].file)) {
|
8399 | logger.info(" " + _this.configuration.mainData.modules[i].name + " has a README file, include it");
|
8400 | var readme = $markdownengine.readNeighbourReadmeFile(_this.configuration.mainData.modules[i].file);
|
8401 | _this.configuration.mainData.modules[i].readme = marked$4(readme);
|
8402 | }
|
8403 | _this.configuration.addPage({
|
8404 | path: 'modules',
|
8405 | name: _this.configuration.mainData.modules[i].name,
|
8406 | id: _this.configuration.mainData.modules[i].id,
|
8407 | navTabs: _this.getNavTabs(_this.configuration.mainData.modules[i]),
|
8408 | context: 'module',
|
8409 | module: _this.configuration.mainData.modules[i],
|
8410 | depth: 1,
|
8411 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
8412 | });
|
8413 | i++;
|
8414 | loop();
|
8415 | }
|
8416 | else {
|
8417 | resolve();
|
8418 | }
|
8419 | };
|
8420 | loop();
|
8421 | });
|
8422 | };
|
8423 | Application.prototype.prepareInterfaces = function (someInterfaces) {
|
8424 | var _this = this;
|
8425 | logger.info('Prepare interfaces');
|
8426 | this.configuration.mainData.interfaces = someInterfaces
|
8427 | ? someInterfaces
|
8428 | : this.dependenciesEngine.getInterfaces();
|
8429 | return new Promise(function (resolve, reject) {
|
8430 | var i = 0;
|
8431 | var len = _this.configuration.mainData.interfaces.length;
|
8432 | var loop = function () {
|
8433 | if (i < len) {
|
8434 | var interf = _this.configuration.mainData.interfaces[i];
|
8435 | if ($markdownengine.hasNeighbourReadmeFile(interf.file)) {
|
8436 | logger.info(" " + interf.name + " has a README file, include it");
|
8437 | var readme = $markdownengine.readNeighbourReadmeFile(interf.file);
|
8438 | interf.readme = marked$4(readme);
|
8439 | }
|
8440 | var page = {
|
8441 | path: 'interfaces',
|
8442 | name: interf.name,
|
8443 | id: interf.id,
|
8444 | navTabs: _this.getNavTabs(interf),
|
8445 | context: 'interface',
|
8446 | interface: interf,
|
8447 | depth: 1,
|
8448 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
8449 | };
|
8450 | if (interf.isDuplicate) {
|
8451 | page.name += '-' + interf.duplicateId;
|
8452 | }
|
8453 | _this.configuration.addPage(page);
|
8454 | i++;
|
8455 | loop();
|
8456 | }
|
8457 | else {
|
8458 | resolve();
|
8459 | }
|
8460 | };
|
8461 | loop();
|
8462 | });
|
8463 | };
|
8464 | Application.prototype.prepareMiscellaneous = function (someMisc) {
|
8465 | var _this = this;
|
8466 | logger.info('Prepare miscellaneous');
|
8467 | this.configuration.mainData.miscellaneous = someMisc
|
8468 | ? someMisc
|
8469 | : this.dependenciesEngine.getMiscellaneous();
|
8470 | return new Promise(function (resolve, reject) {
|
8471 | if (_this.configuration.mainData.miscellaneous.functions.length > 0) {
|
8472 | _this.configuration.addPage({
|
8473 | path: 'miscellaneous',
|
8474 | name: 'functions',
|
8475 | id: 'miscellaneous-functions',
|
8476 | context: 'miscellaneous-functions',
|
8477 | depth: 1,
|
8478 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
8479 | });
|
8480 | }
|
8481 | if (_this.configuration.mainData.miscellaneous.variables.length > 0) {
|
8482 | _this.configuration.addPage({
|
8483 | path: 'miscellaneous',
|
8484 | name: 'variables',
|
8485 | id: 'miscellaneous-variables',
|
8486 | context: 'miscellaneous-variables',
|
8487 | depth: 1,
|
8488 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
8489 | });
|
8490 | }
|
8491 | if (_this.configuration.mainData.miscellaneous.typealiases.length > 0) {
|
8492 | _this.configuration.addPage({
|
8493 | path: 'miscellaneous',
|
8494 | name: 'typealiases',
|
8495 | id: 'miscellaneous-typealiases',
|
8496 | context: 'miscellaneous-typealiases',
|
8497 | depth: 1,
|
8498 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
8499 | });
|
8500 | }
|
8501 | if (_this.configuration.mainData.miscellaneous.enumerations.length > 0) {
|
8502 | _this.configuration.addPage({
|
8503 | path: 'miscellaneous',
|
8504 | name: 'enumerations',
|
8505 | id: 'miscellaneous-enumerations',
|
8506 | context: 'miscellaneous-enumerations',
|
8507 | depth: 1,
|
8508 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
8509 | });
|
8510 | }
|
8511 | resolve();
|
8512 | });
|
8513 | };
|
8514 | Application.prototype.handleTemplateurl = function (component) {
|
8515 | var dirname = path.dirname(component.file);
|
8516 | var templatePath = path.resolve(dirname + path.sep + component.templateUrl);
|
8517 | if (!this.fileEngine.existsSync(templatePath)) {
|
8518 | var err = "Cannot read template for " + component.name;
|
8519 | logger.error(err);
|
8520 | return new Promise(function (resolve, reject) { });
|
8521 | }
|
8522 | return this.fileEngine.get(templatePath).then(function (data) { return (component.templateData = data); }, function (err) {
|
8523 | logger.error(err);
|
8524 | return Promise.reject('');
|
8525 | });
|
8526 | };
|
8527 | Application.prototype.getNavTabs = function (dependency) {
|
8528 | var _this = this;
|
8529 | var navTabConfig = this.configuration.mainData.navTabConfig;
|
8530 | navTabConfig = navTabConfig.length === 0 ? _.cloneDeep(COMPODOC_CONSTANTS.navTabDefinitions) : navTabConfig;
|
8531 | var matchDepType = function (depType) {
|
8532 | return depType === 'all' || depType === dependency.type;
|
8533 | };
|
8534 | var navTabs = [];
|
8535 | _.forEach(navTabConfig, function (customTab) {
|
8536 | var navTab = _.find(COMPODOC_CONSTANTS.navTabDefinitions, { 'id': customTab.id });
|
8537 | if (!navTab) {
|
8538 | throw new Error("Invalid tab ID '" + customTab.id + "' specified in tab configuration");
|
8539 | }
|
8540 | navTab.label = customTab.label;
|
8541 | // is tab applicable to target dependency?
|
8542 | if (-1 === _.findIndex(navTab.depTypes, matchDepType)) {
|
8543 | return;
|
8544 | }
|
8545 | // global config
|
8546 | if (customTab.id === 'tree' && _this.configuration.mainData.disableDomTree) {
|
8547 | return;
|
8548 | }
|
8549 | if (customTab.id === 'source' && _this.configuration.mainData.disableSourceCode) {
|
8550 | return;
|
8551 | }
|
8552 | if (customTab.id === 'templateData' && _this.configuration.mainData.disableTemplateTab) {
|
8553 | return;
|
8554 | }
|
8555 | // per dependency config
|
8556 | if (customTab.id === 'readme' && !dependency.readme) {
|
8557 | return;
|
8558 | }
|
8559 | if (customTab.id === 'example' && !dependency.exampleUrls) {
|
8560 | return;
|
8561 | }
|
8562 | if (customTab.id === 'templateData' && (!dependency.templateUrl || dependency.templateUrl.length === 0)) {
|
8563 | return;
|
8564 | }
|
8565 | navTabs.push(navTab);
|
8566 | });
|
8567 | if (navTabs.length === 0) {
|
8568 | throw new Error("No valid navigation tabs have been defined for dependency type '" + dependency.type + "'. Specify at least one config for the 'info' or 'source' tab in --navTabConfig.");
|
8569 | }
|
8570 | return navTabs;
|
8571 | };
|
8572 | Application.prototype.prepareControllers = function (someControllers) {
|
8573 | var _this = this;
|
8574 | logger.info('Prepare controllers');
|
8575 | this.configuration.mainData.controllers = someControllers
|
8576 | ? someControllers
|
8577 | : this.dependenciesEngine.getControllers();
|
8578 | return new Promise(function (resolve, reject) {
|
8579 | var i = 0;
|
8580 | var len = _this.configuration.mainData.controllers.length;
|
8581 | var loop = function () {
|
8582 | if (i < len) {
|
8583 | var controller = _this.configuration.mainData.controllers[i];
|
8584 | var page = {
|
8585 | path: 'controllers',
|
8586 | name: controller.name,
|
8587 | id: controller.id,
|
8588 | navTabs: _this.getNavTabs(controller),
|
8589 | context: 'controller',
|
8590 | controller: controller,
|
8591 | depth: 1,
|
8592 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
8593 | };
|
8594 | if (controller.isDuplicate) {
|
8595 | page.name += '-' + controller.duplicateId;
|
8596 | }
|
8597 | _this.configuration.addPage(page);
|
8598 | i++;
|
8599 | loop();
|
8600 | }
|
8601 | else {
|
8602 | resolve();
|
8603 | }
|
8604 | };
|
8605 | loop();
|
8606 | });
|
8607 | };
|
8608 | Application.prototype.prepareComponents = function (someComponents) {
|
8609 | var _this = this;
|
8610 | logger.info('Prepare components');
|
8611 | this.configuration.mainData.components = someComponents
|
8612 | ? someComponents
|
8613 | : this.dependenciesEngine.getComponents();
|
8614 | return new Promise(function (mainResolve, reject) {
|
8615 | var i = 0;
|
8616 | var len = _this.configuration.mainData.components.length;
|
8617 | var loop = function () {
|
8618 | if (i <= len - 1) {
|
8619 | var component = _this.configuration.mainData.components[i];
|
8620 | if ($markdownengine.hasNeighbourReadmeFile(component.file)) {
|
8621 | logger.info(" " + component.name + " has a README file, include it");
|
8622 | var readmeFile = $markdownengine.readNeighbourReadmeFile(component.file);
|
8623 | component.readme = marked$4(readmeFile);
|
8624 | var page = {
|
8625 | path: 'components',
|
8626 | name: component.name,
|
8627 | id: component.id,
|
8628 | navTabs: _this.getNavTabs(component),
|
8629 | context: 'component',
|
8630 | component: component,
|
8631 | depth: 1,
|
8632 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
8633 | };
|
8634 | if (component.isDuplicate) {
|
8635 | page.name += '-' + component.duplicateId;
|
8636 | }
|
8637 | _this.configuration.addPage(page);
|
8638 | if (component.templateUrl.length > 0) {
|
8639 | logger.info(" " + component.name + " has a templateUrl, include it");
|
8640 | _this.handleTemplateurl(component).then(function () {
|
8641 | i++;
|
8642 | loop();
|
8643 | }, function (e) {
|
8644 | logger.error(e);
|
8645 | });
|
8646 | }
|
8647 | else {
|
8648 | i++;
|
8649 | loop();
|
8650 | }
|
8651 | }
|
8652 | else {
|
8653 | var page = {
|
8654 | path: 'components',
|
8655 | name: component.name,
|
8656 | id: component.id,
|
8657 | navTabs: _this.getNavTabs(component),
|
8658 | context: 'component',
|
8659 | component: component,
|
8660 | depth: 1,
|
8661 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
8662 | };
|
8663 | if (component.isDuplicate) {
|
8664 | page.name += '-' + component.duplicateId;
|
8665 | }
|
8666 | _this.configuration.addPage(page);
|
8667 | if (component.templateUrl.length > 0) {
|
8668 | logger.info(" " + component.name + " has a templateUrl, include it");
|
8669 | _this.handleTemplateurl(component).then(function () {
|
8670 | i++;
|
8671 | loop();
|
8672 | }, function (e) {
|
8673 | logger.error(e);
|
8674 | });
|
8675 | }
|
8676 | else {
|
8677 | i++;
|
8678 | loop();
|
8679 | }
|
8680 | }
|
8681 | }
|
8682 | else {
|
8683 | mainResolve();
|
8684 | }
|
8685 | };
|
8686 | loop();
|
8687 | });
|
8688 | };
|
8689 | Application.prototype.prepareDirectives = function (someDirectives) {
|
8690 | var _this = this;
|
8691 | logger.info('Prepare directives');
|
8692 | this.configuration.mainData.directives = someDirectives
|
8693 | ? someDirectives
|
8694 | : this.dependenciesEngine.getDirectives();
|
8695 | return new Promise(function (resolve, reject) {
|
8696 | var i = 0;
|
8697 | var len = _this.configuration.mainData.directives.length;
|
8698 | var loop = function () {
|
8699 | if (i < len) {
|
8700 | var directive = _this.configuration.mainData.directives[i];
|
8701 | if ($markdownengine.hasNeighbourReadmeFile(directive.file)) {
|
8702 | logger.info(" " + directive.name + " has a README file, include it");
|
8703 | var readme = $markdownengine.readNeighbourReadmeFile(directive.file);
|
8704 | directive.readme = marked$4(readme);
|
8705 | }
|
8706 | var page = {
|
8707 | path: 'directives',
|
8708 | name: directive.name,
|
8709 | id: directive.id,
|
8710 | navTabs: _this.getNavTabs(directive),
|
8711 | context: 'directive',
|
8712 | directive: directive,
|
8713 | depth: 1,
|
8714 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
8715 | };
|
8716 | if (directive.isDuplicate) {
|
8717 | page.name += '-' + directive.duplicateId;
|
8718 | }
|
8719 | _this.configuration.addPage(page);
|
8720 | i++;
|
8721 | loop();
|
8722 | }
|
8723 | else {
|
8724 | resolve();
|
8725 | }
|
8726 | };
|
8727 | loop();
|
8728 | });
|
8729 | };
|
8730 | Application.prototype.prepareInjectables = function (someInjectables) {
|
8731 | var _this = this;
|
8732 | logger.info('Prepare injectables');
|
8733 | this.configuration.mainData.injectables = someInjectables
|
8734 | ? someInjectables
|
8735 | : this.dependenciesEngine.getInjectables();
|
8736 | return new Promise(function (resolve, reject) {
|
8737 | var i = 0;
|
8738 | var len = _this.configuration.mainData.injectables.length;
|
8739 | var loop = function () {
|
8740 | if (i < len) {
|
8741 | var injec = _this.configuration.mainData.injectables[i];
|
8742 | if ($markdownengine.hasNeighbourReadmeFile(injec.file)) {
|
8743 | logger.info(" " + injec.name + " has a README file, include it");
|
8744 | var readme = $markdownengine.readNeighbourReadmeFile(injec.file);
|
8745 | injec.readme = marked$4(readme);
|
8746 | }
|
8747 | var page = {
|
8748 | path: 'injectables',
|
8749 | name: injec.name,
|
8750 | id: injec.id,
|
8751 | navTabs: _this.getNavTabs(injec),
|
8752 | context: 'injectable',
|
8753 | injectable: injec,
|
8754 | depth: 1,
|
8755 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
8756 | };
|
8757 | if (injec.isDuplicate) {
|
8758 | page.name += '-' + injec.duplicateId;
|
8759 | }
|
8760 | _this.configuration.addPage(page);
|
8761 | i++;
|
8762 | loop();
|
8763 | }
|
8764 | else {
|
8765 | resolve();
|
8766 | }
|
8767 | };
|
8768 | loop();
|
8769 | });
|
8770 | };
|
8771 | Application.prototype.prepareInterceptors = function (someInterceptors) {
|
8772 | var _this = this;
|
8773 | logger.info('Prepare interceptors');
|
8774 | this.configuration.mainData.interceptors = someInterceptors
|
8775 | ? someInterceptors
|
8776 | : this.dependenciesEngine.getInterceptors();
|
8777 | return new Promise(function (resolve, reject) {
|
8778 | var i = 0;
|
8779 | var len = _this.configuration.mainData.interceptors.length;
|
8780 | var loop = function () {
|
8781 | if (i < len) {
|
8782 | var interceptor = _this.configuration.mainData.interceptors[i];
|
8783 | if ($markdownengine.hasNeighbourReadmeFile(interceptor.file)) {
|
8784 | logger.info(" " + interceptor.name + " has a README file, include it");
|
8785 | var readme = $markdownengine.readNeighbourReadmeFile(interceptor.file);
|
8786 | interceptor.readme = marked$4(readme);
|
8787 | }
|
8788 | var page = {
|
8789 | path: 'interceptors',
|
8790 | name: interceptor.name,
|
8791 | id: interceptor.id,
|
8792 | navTabs: _this.getNavTabs(interceptor),
|
8793 | context: 'interceptor',
|
8794 | injectable: interceptor,
|
8795 | depth: 1,
|
8796 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
8797 | };
|
8798 | if (interceptor.isDuplicate) {
|
8799 | page.name += '-' + interceptor.duplicateId;
|
8800 | }
|
8801 | _this.configuration.addPage(page);
|
8802 | i++;
|
8803 | loop();
|
8804 | }
|
8805 | else {
|
8806 | resolve();
|
8807 | }
|
8808 | };
|
8809 | loop();
|
8810 | });
|
8811 | };
|
8812 | Application.prototype.prepareGuards = function (someGuards) {
|
8813 | var _this = this;
|
8814 | logger.info('Prepare guards');
|
8815 | this.configuration.mainData.guards = someGuards
|
8816 | ? someGuards
|
8817 | : this.dependenciesEngine.getGuards();
|
8818 | return new Promise(function (resolve, reject) {
|
8819 | var i = 0;
|
8820 | var len = _this.configuration.mainData.guards.length;
|
8821 | var loop = function () {
|
8822 | if (i < len) {
|
8823 | var guard = _this.configuration.mainData.guards[i];
|
8824 | if ($markdownengine.hasNeighbourReadmeFile(guard.file)) {
|
8825 | logger.info(" " + guard.name + " has a README file, include it");
|
8826 | var readme = $markdownengine.readNeighbourReadmeFile(guard.file);
|
8827 | guard.readme = marked$4(readme);
|
8828 | }
|
8829 | var page = {
|
8830 | path: 'guards',
|
8831 | name: guard.name,
|
8832 | id: guard.id,
|
8833 | navTabs: _this.getNavTabs(guard),
|
8834 | context: 'guard',
|
8835 | injectable: guard,
|
8836 | depth: 1,
|
8837 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
8838 | };
|
8839 | if (guard.isDuplicate) {
|
8840 | page.name += '-' + guard.duplicateId;
|
8841 | }
|
8842 | _this.configuration.addPage(page);
|
8843 | i++;
|
8844 | loop();
|
8845 | }
|
8846 | else {
|
8847 | resolve();
|
8848 | }
|
8849 | };
|
8850 | loop();
|
8851 | });
|
8852 | };
|
8853 | Application.prototype.prepareRoutes = function () {
|
8854 | var _this = this;
|
8855 | logger.info('Process routes');
|
8856 | this.configuration.mainData.routes = this.dependenciesEngine.getRoutes();
|
8857 | return new Promise(function (resolve, reject) {
|
8858 | _this.configuration.addPage({
|
8859 | name: 'routes',
|
8860 | id: 'routes',
|
8861 | context: 'routes',
|
8862 | depth: 0,
|
8863 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
8864 | });
|
8865 | if (_this.configuration.mainData.exportFormat === COMPODOC_DEFAULTS.exportFormat) {
|
8866 | _this.routerParser
|
8867 | .generateRoutesIndex(_this.configuration.mainData.output, _this.configuration.mainData.routes)
|
8868 | .then(function () {
|
8869 | logger.info(' Routes index generated');
|
8870 | resolve();
|
8871 | }, function (e) {
|
8872 | logger.error(e);
|
8873 | reject();
|
8874 | });
|
8875 | }
|
8876 | else {
|
8877 | resolve();
|
8878 | }
|
8879 | });
|
8880 | };
|
8881 | Application.prototype.prepareCoverage = function () {
|
8882 | var _this = this;
|
8883 | logger.info('Process documentation coverage report');
|
8884 | return new Promise(function (resolve, reject) {
|
8885 | /*
|
8886 | * loop with components, directives, classes, injectables, interfaces, pipes, misc functions variables
|
8887 | */
|
8888 | var files = [];
|
8889 | var totalProjectStatementDocumented = 0;
|
8890 | var getStatus = function (percent) {
|
8891 | var status;
|
8892 | if (percent <= 25) {
|
8893 | status = 'low';
|
8894 | }
|
8895 | else if (percent > 25 && percent <= 50) {
|
8896 | status = 'medium';
|
8897 | }
|
8898 | else if (percent > 50 && percent <= 75) {
|
8899 | status = 'good';
|
8900 | }
|
8901 | else {
|
8902 | status = 'very-good';
|
8903 | }
|
8904 | return status;
|
8905 | };
|
8906 | var processComponentsAndDirectives = function (list) {
|
8907 | _.forEach(list, function (el) {
|
8908 | var element = Object.assign({}, el);
|
8909 | if (!element.propertiesClass) {
|
8910 | element.propertiesClass = [];
|
8911 | }
|
8912 | if (!element.methodsClass) {
|
8913 | element.methodsClass = [];
|
8914 | }
|
8915 | if (!element.hostBindings) {
|
8916 | element.hostBindings = [];
|
8917 | }
|
8918 | if (!element.hostListeners) {
|
8919 | element.hostListeners = [];
|
8920 | }
|
8921 | if (!element.inputsClass) {
|
8922 | element.inputsClass = [];
|
8923 | }
|
8924 | if (!element.outputsClass) {
|
8925 | element.outputsClass = [];
|
8926 | }
|
8927 | var cl = {
|
8928 | filePath: element.file,
|
8929 | type: element.type,
|
8930 | linktype: element.type,
|
8931 | name: element.name
|
8932 | };
|
8933 | var totalStatementDocumented = 0;
|
8934 | var totalStatements = element.propertiesClass.length +
|
8935 | element.methodsClass.length +
|
8936 | element.inputsClass.length +
|
8937 | element.hostBindings.length +
|
8938 | element.hostListeners.length +
|
8939 | element.outputsClass.length +
|
8940 | 1; // +1 for element decorator comment
|
8941 | if (element.constructorObj) {
|
8942 | totalStatements += 1;
|
8943 | if (element.constructorObj &&
|
8944 | element.constructorObj.description &&
|
8945 | element.constructorObj.description !== '') {
|
8946 | totalStatementDocumented += 1;
|
8947 | }
|
8948 | }
|
8949 | if (element.description && element.description !== '') {
|
8950 | totalStatementDocumented += 1;
|
8951 | }
|
8952 | _.forEach(element.propertiesClass, function (property) {
|
8953 | if (property.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
|
8954 | // Doesn't handle private for coverage
|
8955 | totalStatements -= 1;
|
8956 | }
|
8957 | if (property.description &&
|
8958 | property.description !== '' &&
|
8959 | property.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
|
8960 | totalStatementDocumented += 1;
|
8961 | }
|
8962 | });
|
8963 | _.forEach(element.methodsClass, function (method) {
|
8964 | if (method.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
|
8965 | // Doesn't handle private for coverage
|
8966 | totalStatements -= 1;
|
8967 | }
|
8968 | if (method.description &&
|
8969 | method.description !== '' &&
|
8970 | method.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
|
8971 | totalStatementDocumented += 1;
|
8972 | }
|
8973 | });
|
8974 | _.forEach(element.hostBindings, function (property) {
|
8975 | if (property.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
|
8976 | // Doesn't handle private for coverage
|
8977 | totalStatements -= 1;
|
8978 | }
|
8979 | if (property.description &&
|
8980 | property.description !== '' &&
|
8981 | property.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
|
8982 | totalStatementDocumented += 1;
|
8983 | }
|
8984 | });
|
8985 | _.forEach(element.hostListeners, function (method) {
|
8986 | if (method.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
|
8987 | // Doesn't handle private for coverage
|
8988 | totalStatements -= 1;
|
8989 | }
|
8990 | if (method.description &&
|
8991 | method.description !== '' &&
|
8992 | method.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
|
8993 | totalStatementDocumented += 1;
|
8994 | }
|
8995 | });
|
8996 | _.forEach(element.inputsClass, function (input) {
|
8997 | if (input.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
|
8998 | // Doesn't handle private for coverage
|
8999 | totalStatements -= 1;
|
9000 | }
|
9001 | if (input.description &&
|
9002 | input.description !== '' &&
|
9003 | input.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
|
9004 | totalStatementDocumented += 1;
|
9005 | }
|
9006 | });
|
9007 | _.forEach(element.outputsClass, function (output) {
|
9008 | if (output.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
|
9009 | // Doesn't handle private for coverage
|
9010 | totalStatements -= 1;
|
9011 | }
|
9012 | if (output.description &&
|
9013 | output.description !== '' &&
|
9014 | output.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
|
9015 | totalStatementDocumented += 1;
|
9016 | }
|
9017 | });
|
9018 | cl.coveragePercent = Math.floor(totalStatementDocumented / totalStatements * 100);
|
9019 | if (totalStatements === 0) {
|
9020 | cl.coveragePercent = 0;
|
9021 | }
|
9022 | cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
|
9023 | cl.status = getStatus(cl.coveragePercent);
|
9024 | totalProjectStatementDocumented += cl.coveragePercent;
|
9025 | files.push(cl);
|
9026 | });
|
9027 | };
|
9028 | var processCoveragePerFile = function () {
|
9029 | logger.info('Process documentation coverage per file');
|
9030 | logger.info('-------------------');
|
9031 | var overFiles = files.filter(function (f) {
|
9032 | var overTest = f.coveragePercent >= _this.configuration.mainData.coverageMinimumPerFile;
|
9033 | if (overTest && !_this.configuration.mainData.coverageTestShowOnlyFailed) {
|
9034 | logger.info(f.coveragePercent + " % for file " + f.filePath + " - over minimum per file");
|
9035 | }
|
9036 | return overTest;
|
9037 | });
|
9038 | var underFiles = files.filter(function (f) {
|
9039 | var underTest = f.coveragePercent < _this.configuration.mainData.coverageMinimumPerFile;
|
9040 | if (underTest) {
|
9041 | logger.error(f.coveragePercent + " % for file " + f.filePath + " - under minimum per file");
|
9042 | }
|
9043 | return underTest;
|
9044 | });
|
9045 | logger.info('-------------------');
|
9046 | return {
|
9047 | overFiles: overFiles,
|
9048 | underFiles: underFiles
|
9049 | };
|
9050 | };
|
9051 | var processFunctionsAndVariables = function (id, type) {
|
9052 | _.forEach(id, function (el) {
|
9053 | var cl = {
|
9054 | filePath: el.file,
|
9055 | type: type,
|
9056 | linktype: el.type,
|
9057 | linksubtype: el.subtype,
|
9058 | name: el.name
|
9059 | };
|
9060 | if (type === 'variable') {
|
9061 | cl.linktype = 'miscellaneous';
|
9062 | }
|
9063 | var totalStatementDocumented = 0;
|
9064 | var totalStatements = 1;
|
9065 | if (el.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
|
9066 | // Doesn't handle private for coverage
|
9067 | totalStatements -= 1;
|
9068 | }
|
9069 | if (el.description &&
|
9070 | el.description !== '' &&
|
9071 | el.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
|
9072 | totalStatementDocumented += 1;
|
9073 | }
|
9074 | cl.coveragePercent = Math.floor(totalStatementDocumented / totalStatements * 100);
|
9075 | cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
|
9076 | cl.status = getStatus(cl.coveragePercent);
|
9077 | totalProjectStatementDocumented += cl.coveragePercent;
|
9078 | files.push(cl);
|
9079 | });
|
9080 | };
|
9081 | processComponentsAndDirectives(_this.configuration.mainData.components);
|
9082 | processComponentsAndDirectives(_this.configuration.mainData.directives);
|
9083 | _.forEach(_this.configuration.mainData.classes, function (cl) {
|
9084 | var classe = Object.assign({}, cl);
|
9085 | if (!classe.properties) {
|
9086 | classe.properties = [];
|
9087 | }
|
9088 | if (!classe.methods) {
|
9089 | classe.methods = [];
|
9090 | }
|
9091 | var cla = {
|
9092 | filePath: classe.file,
|
9093 | type: 'class',
|
9094 | linktype: 'classe',
|
9095 | name: classe.name
|
9096 | };
|
9097 | var totalStatementDocumented = 0;
|
9098 | var totalStatements = classe.properties.length + classe.methods.length + 1; // +1 for class itself
|
9099 | if (classe.constructorObj) {
|
9100 | totalStatements += 1;
|
9101 | if (classe.constructorObj &&
|
9102 | classe.constructorObj.description &&
|
9103 | classe.constructorObj.description !== '') {
|
9104 | totalStatementDocumented += 1;
|
9105 | }
|
9106 | }
|
9107 | if (classe.description && classe.description !== '') {
|
9108 | totalStatementDocumented += 1;
|
9109 | }
|
9110 | _.forEach(classe.properties, function (property) {
|
9111 | if (property.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
|
9112 | // Doesn't handle private for coverage
|
9113 | totalStatements -= 1;
|
9114 | }
|
9115 | if (property.description &&
|
9116 | property.description !== '' &&
|
9117 | property.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
|
9118 | totalStatementDocumented += 1;
|
9119 | }
|
9120 | });
|
9121 | _.forEach(classe.methods, function (method) {
|
9122 | if (method.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
|
9123 | // Doesn't handle private for coverage
|
9124 | totalStatements -= 1;
|
9125 | }
|
9126 | if (method.description &&
|
9127 | method.description !== '' &&
|
9128 | method.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
|
9129 | totalStatementDocumented += 1;
|
9130 | }
|
9131 | });
|
9132 | cla.coveragePercent = Math.floor(totalStatementDocumented / totalStatements * 100);
|
9133 | if (totalStatements === 0) {
|
9134 | cla.coveragePercent = 0;
|
9135 | }
|
9136 | cla.coverageCount = totalStatementDocumented + '/' + totalStatements;
|
9137 | cla.status = getStatus(cla.coveragePercent);
|
9138 | totalProjectStatementDocumented += cla.coveragePercent;
|
9139 | files.push(cla);
|
9140 | });
|
9141 | _.forEach(_this.configuration.mainData.injectables, function (inj) {
|
9142 | var injectable = Object.assign({}, inj);
|
9143 | if (!injectable.properties) {
|
9144 | injectable.properties = [];
|
9145 | }
|
9146 | if (!injectable.methods) {
|
9147 | injectable.methods = [];
|
9148 | }
|
9149 | var cl = {
|
9150 | filePath: injectable.file,
|
9151 | type: injectable.type,
|
9152 | linktype: injectable.type,
|
9153 | name: injectable.name
|
9154 | };
|
9155 | var totalStatementDocumented = 0;
|
9156 | var totalStatements = injectable.properties.length + injectable.methods.length + 1; // +1 for injectable itself
|
9157 | if (injectable.constructorObj) {
|
9158 | totalStatements += 1;
|
9159 | if (injectable.constructorObj &&
|
9160 | injectable.constructorObj.description &&
|
9161 | injectable.constructorObj.description !== '') {
|
9162 | totalStatementDocumented += 1;
|
9163 | }
|
9164 | }
|
9165 | if (injectable.description && injectable.description !== '') {
|
9166 | totalStatementDocumented += 1;
|
9167 | }
|
9168 | _.forEach(injectable.properties, function (property) {
|
9169 | if (property.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
|
9170 | // Doesn't handle private for coverage
|
9171 | totalStatements -= 1;
|
9172 | }
|
9173 | if (property.description &&
|
9174 | property.description !== '' &&
|
9175 | property.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
|
9176 | totalStatementDocumented += 1;
|
9177 | }
|
9178 | });
|
9179 | _.forEach(injectable.methods, function (method) {
|
9180 | if (method.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
|
9181 | // Doesn't handle private for coverage
|
9182 | totalStatements -= 1;
|
9183 | }
|
9184 | if (method.description &&
|
9185 | method.description !== '' &&
|
9186 | method.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
|
9187 | totalStatementDocumented += 1;
|
9188 | }
|
9189 | });
|
9190 | cl.coveragePercent = Math.floor(totalStatementDocumented / totalStatements * 100);
|
9191 | if (totalStatements === 0) {
|
9192 | cl.coveragePercent = 0;
|
9193 | }
|
9194 | cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
|
9195 | cl.status = getStatus(cl.coveragePercent);
|
9196 | totalProjectStatementDocumented += cl.coveragePercent;
|
9197 | files.push(cl);
|
9198 | });
|
9199 | _.forEach(_this.configuration.mainData.interfaces, function (inte) {
|
9200 | var inter = Object.assign({}, inte);
|
9201 | if (!inter.properties) {
|
9202 | inter.properties = [];
|
9203 | }
|
9204 | if (!inter.methods) {
|
9205 | inter.methods = [];
|
9206 | }
|
9207 | var cl = {
|
9208 | filePath: inter.file,
|
9209 | type: inter.type,
|
9210 | linktype: inter.type,
|
9211 | name: inter.name
|
9212 | };
|
9213 | var totalStatementDocumented = 0;
|
9214 | var totalStatements = inter.properties.length + inter.methods.length + 1; // +1 for interface itself
|
9215 | if (inter.constructorObj) {
|
9216 | totalStatements += 1;
|
9217 | if (inter.constructorObj &&
|
9218 | inter.constructorObj.description &&
|
9219 | inter.constructorObj.description !== '') {
|
9220 | totalStatementDocumented += 1;
|
9221 | }
|
9222 | }
|
9223 | if (inter.description && inter.description !== '') {
|
9224 | totalStatementDocumented += 1;
|
9225 | }
|
9226 | _.forEach(inter.properties, function (property) {
|
9227 | if (property.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
|
9228 | // Doesn't handle private for coverage
|
9229 | totalStatements -= 1;
|
9230 | }
|
9231 | if (property.description &&
|
9232 | property.description !== '' &&
|
9233 | property.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
|
9234 | totalStatementDocumented += 1;
|
9235 | }
|
9236 | });
|
9237 | _.forEach(inter.methods, function (method) {
|
9238 | if (method.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
|
9239 | // Doesn't handle private for coverage
|
9240 | totalStatements -= 1;
|
9241 | }
|
9242 | if (method.description &&
|
9243 | method.description !== '' &&
|
9244 | method.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
|
9245 | totalStatementDocumented += 1;
|
9246 | }
|
9247 | });
|
9248 | cl.coveragePercent = Math.floor(totalStatementDocumented / totalStatements * 100);
|
9249 | if (totalStatements === 0) {
|
9250 | cl.coveragePercent = 0;
|
9251 | }
|
9252 | cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
|
9253 | cl.status = getStatus(cl.coveragePercent);
|
9254 | totalProjectStatementDocumented += cl.coveragePercent;
|
9255 | files.push(cl);
|
9256 | });
|
9257 | _.forEach(_this.configuration.mainData.pipes, function (pipe) {
|
9258 | var cl = {
|
9259 | filePath: pipe.file,
|
9260 | type: pipe.type,
|
9261 | linktype: pipe.type,
|
9262 | name: pipe.name
|
9263 | };
|
9264 | var totalStatementDocumented = 0;
|
9265 | var totalStatements = 1;
|
9266 | if (pipe.description && pipe.description !== '') {
|
9267 | totalStatementDocumented += 1;
|
9268 | }
|
9269 | cl.coveragePercent = Math.floor(totalStatementDocumented / totalStatements * 100);
|
9270 | cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
|
9271 | cl.status = getStatus(cl.coveragePercent);
|
9272 | totalProjectStatementDocumented += cl.coveragePercent;
|
9273 | files.push(cl);
|
9274 | });
|
9275 | processFunctionsAndVariables(_this.configuration.mainData.miscellaneous.functions, 'function');
|
9276 | processFunctionsAndVariables(_this.configuration.mainData.miscellaneous.variables, 'variable');
|
9277 | files = _.sortBy(files, ['filePath']);
|
9278 | var coverageData = {
|
9279 | count: files.length > 0
|
9280 | ? Math.floor(totalProjectStatementDocumented / files.length)
|
9281 | : 0,
|
9282 | status: '',
|
9283 | files: files
|
9284 | };
|
9285 | coverageData.status = getStatus(coverageData.count);
|
9286 | _this.configuration.addPage({
|
9287 | name: 'coverage',
|
9288 | id: 'coverage',
|
9289 | context: 'coverage',
|
9290 | files: files,
|
9291 | data: coverageData,
|
9292 | depth: 0,
|
9293 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
9294 | });
|
9295 | coverageData.files = files;
|
9296 | _this.configuration.mainData.coverageData = coverageData;
|
9297 | if (_this.configuration.mainData.exportFormat === COMPODOC_DEFAULTS.exportFormat) {
|
9298 | _this.htmlEngine.generateCoverageBadge(_this.configuration.mainData.output, 'documentation', coverageData);
|
9299 | }
|
9300 | files = _.sortBy(files, ['coveragePercent']);
|
9301 | var coverageTestPerFileResults;
|
9302 | if (_this.configuration.mainData.coverageTest &&
|
9303 | !_this.configuration.mainData.coverageTestPerFile) {
|
9304 | // Global coverage test and not per file
|
9305 | if (coverageData.count >= _this.configuration.mainData.coverageTestThreshold) {
|
9306 | logger.info("Documentation coverage (" + coverageData.count + "%) is over threshold (" + _this.configuration.mainData.coverageTestThreshold + "%)");
|
9307 | generationPromiseResolve();
|
9308 | process.exit(0);
|
9309 | }
|
9310 | else {
|
9311 | var message = "Documentation coverage (" + coverageData.count + "%) is not over threshold (" + _this.configuration.mainData.coverageTestThreshold + "%)";
|
9312 | generationPromiseReject();
|
9313 | if (_this.configuration.mainData.coverageTestThresholdFail) {
|
9314 | logger.error(message);
|
9315 | process.exit(1);
|
9316 | }
|
9317 | else {
|
9318 | logger.warn(message);
|
9319 | process.exit(0);
|
9320 | }
|
9321 | }
|
9322 | }
|
9323 | else if (!_this.configuration.mainData.coverageTest &&
|
9324 | _this.configuration.mainData.coverageTestPerFile) {
|
9325 | coverageTestPerFileResults = processCoveragePerFile();
|
9326 | // Per file coverage test and not global
|
9327 | if (coverageTestPerFileResults.underFiles.length > 0) {
|
9328 | var message = "Documentation coverage per file is not over threshold (" + _this.configuration.mainData.coverageMinimumPerFile + "%)";
|
9329 | generationPromiseReject();
|
9330 | if (_this.configuration.mainData.coverageTestThresholdFail) {
|
9331 | logger.error(message);
|
9332 | process.exit(1);
|
9333 | }
|
9334 | else {
|
9335 | logger.warn(message);
|
9336 | process.exit(0);
|
9337 | }
|
9338 | }
|
9339 | else {
|
9340 | logger.info("Documentation coverage per file is over threshold (" + _this.configuration.mainData.coverageMinimumPerFile + "%)");
|
9341 | generationPromiseResolve();
|
9342 | process.exit(0);
|
9343 | }
|
9344 | }
|
9345 | else if (_this.configuration.mainData.coverageTest &&
|
9346 | _this.configuration.mainData.coverageTestPerFile) {
|
9347 | // Per file coverage test and global
|
9348 | coverageTestPerFileResults = processCoveragePerFile();
|
9349 | if (coverageData.count >= _this.configuration.mainData.coverageTestThreshold &&
|
9350 | coverageTestPerFileResults.underFiles.length === 0) {
|
9351 | logger.info("Documentation coverage (" + coverageData.count + "%) is over threshold (" + _this.configuration.mainData.coverageTestThreshold + "%)");
|
9352 | logger.info("Documentation coverage per file is over threshold (" + _this.configuration.mainData.coverageMinimumPerFile + "%)");
|
9353 | generationPromiseResolve();
|
9354 | process.exit(0);
|
9355 | }
|
9356 | else if (coverageData.count >= _this.configuration.mainData.coverageTestThreshold &&
|
9357 | coverageTestPerFileResults.underFiles.length > 0) {
|
9358 | logger.info("Documentation coverage (" + coverageData.count + "%) is over threshold (" + _this.configuration.mainData.coverageTestThreshold + "%)");
|
9359 | var message = "Documentation coverage per file is not over threshold (" + _this.configuration.mainData.coverageMinimumPerFile + "%)";
|
9360 | generationPromiseReject();
|
9361 | if (_this.configuration.mainData.coverageTestThresholdFail) {
|
9362 | logger.error(message);
|
9363 | process.exit(1);
|
9364 | }
|
9365 | else {
|
9366 | logger.warn(message);
|
9367 | process.exit(0);
|
9368 | }
|
9369 | }
|
9370 | else if (coverageData.count < _this.configuration.mainData.coverageTestThreshold &&
|
9371 | coverageTestPerFileResults.underFiles.length > 0) {
|
9372 | var messageGlobal = "Documentation coverage (" + coverageData.count + "%) is not over threshold (" + _this.configuration.mainData.coverageTestThreshold + "%)", messagePerFile = "Documentation coverage per file is not over threshold (" + _this.configuration.mainData.coverageMinimumPerFile + "%)";
|
9373 | generationPromiseReject();
|
9374 | if (_this.configuration.mainData.coverageTestThresholdFail) {
|
9375 | logger.error(messageGlobal);
|
9376 | logger.error(messagePerFile);
|
9377 | process.exit(1);
|
9378 | }
|
9379 | else {
|
9380 | logger.warn(messageGlobal);
|
9381 | logger.warn(messagePerFile);
|
9382 | process.exit(0);
|
9383 | }
|
9384 | }
|
9385 | else {
|
9386 | var message = "Documentation coverage (" + coverageData.count + "%) is not over threshold (" + _this.configuration.mainData.coverageTestThreshold + "%)", messagePerFile = "Documentation coverage per file is over threshold (" + _this.configuration.mainData.coverageMinimumPerFile + "%)";
|
9387 | generationPromiseReject();
|
9388 | if (_this.configuration.mainData.coverageTestThresholdFail) {
|
9389 | logger.error(message);
|
9390 | logger.info(messagePerFile);
|
9391 | process.exit(1);
|
9392 | }
|
9393 | else {
|
9394 | logger.warn(message);
|
9395 | logger.info(messagePerFile);
|
9396 | process.exit(0);
|
9397 | }
|
9398 | }
|
9399 | }
|
9400 | else {
|
9401 | resolve();
|
9402 | }
|
9403 | });
|
9404 | };
|
9405 | Application.prototype.prepareUnitTestCoverage = function () {
|
9406 | var _this = this;
|
9407 | logger.info('Process unit test coverage report');
|
9408 | return new Promise(function (resolve, reject) {
|
9409 | var covDat, covFileNames;
|
9410 | if (!_this.configuration.mainData.coverageData['files']) {
|
9411 | logger.warn('Missing documentation coverage data');
|
9412 | }
|
9413 | else {
|
9414 | covDat = {};
|
9415 | covFileNames = _.map(_this.configuration.mainData.coverageData['files'], function (el) {
|
9416 | var fileName = el.filePath;
|
9417 | covDat[fileName] = { type: el.type, linktype: el.linktype, linksubtype: el.linksubtype, name: el.name };
|
9418 | return fileName;
|
9419 | });
|
9420 | }
|
9421 | // read coverage summary file and data
|
9422 | var unitTestSummary = {};
|
9423 | var fileDat = _this.fileEngine.getSync(_this.configuration.mainData.unitTestCoverage);
|
9424 | if (fileDat) {
|
9425 | unitTestSummary = JSON.parse(fileDat);
|
9426 | }
|
9427 | else {
|
9428 | return Promise.reject('Error reading unit test coverage file');
|
9429 | }
|
9430 | var getCovStatus = function (percent, totalLines) {
|
9431 | var status;
|
9432 | if (totalLines === 0) {
|
9433 | status = 'uncovered';
|
9434 | }
|
9435 | else if (percent <= 25) {
|
9436 | status = 'low';
|
9437 | }
|
9438 | else if (percent > 25 && percent <= 50) {
|
9439 | status = 'medium';
|
9440 | }
|
9441 | else if (percent > 50 && percent <= 75) {
|
9442 | status = 'good';
|
9443 | }
|
9444 | else {
|
9445 | status = 'very-good';
|
9446 | }
|
9447 | return status;
|
9448 | };
|
9449 | var getCoverageData = function (data, fileName) {
|
9450 | var out = {};
|
9451 | if (fileName !== 'total') {
|
9452 | if (covDat === undefined) {
|
9453 | // need a name to include in output but this isn't visible
|
9454 | out = { name: fileName, filePath: fileName };
|
9455 | }
|
9456 | else {
|
9457 | var findMatch = _.filter(covFileNames, function (el) {
|
9458 | return (el.includes(fileName) || fileName.includes(el));
|
9459 | });
|
9460 | if (findMatch.length > 0) {
|
9461 | out = _.clone(covDat[findMatch[0]]);
|
9462 | out['filePath'] = fileName;
|
9463 | } //else {
|
9464 | //out = {name: fileName, filePath: fileName};
|
9465 | //}
|
9466 | }
|
9467 | }
|
9468 | var keysToGet = ['statements', 'branches', 'functions', 'lines'];
|
9469 | _.forEach(keysToGet, function (key) {
|
9470 | if (data[key]) {
|
9471 | var t = data[key];
|
9472 | out[key] = { coveragePercent: Math.round(t.pct),
|
9473 | coverageCount: '' + t.covered + '/' + t.total,
|
9474 | status: getCovStatus(t.pct, t.total) };
|
9475 | }
|
9476 | });
|
9477 | return out;
|
9478 | };
|
9479 | var unitTestData = {};
|
9480 | var files = [];
|
9481 | for (var file in unitTestSummary) {
|
9482 | var dat = getCoverageData(unitTestSummary[file], file);
|
9483 | if (file === 'total') {
|
9484 | unitTestData['total'] = dat;
|
9485 | }
|
9486 | else {
|
9487 | files.push(dat);
|
9488 | }
|
9489 | }
|
9490 | unitTestData['files'] = files;
|
9491 | unitTestData['idColumn'] = (covDat !== undefined); // should we include the id column
|
9492 | _this.configuration.mainData.unitTestData = unitTestData;
|
9493 | _this.configuration.addPage({
|
9494 | name: 'unit-test',
|
9495 | id: 'unit-test',
|
9496 | context: 'unit-test',
|
9497 | files: files,
|
9498 | data: unitTestData,
|
9499 | depth: 0,
|
9500 | pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
9501 | });
|
9502 | if (_this.configuration.mainData.exportFormat === COMPODOC_DEFAULTS.exportFormat) {
|
9503 | var keysToGet = ['statements', 'branches', 'functions', 'lines'];
|
9504 | _.forEach(keysToGet, function (key) {
|
9505 | if (unitTestData['total'][key]) {
|
9506 | _this.htmlEngine.generateCoverageBadge(_this.configuration.mainData.output, key, { count: unitTestData['total'][key]['coveragePercent'],
|
9507 | status: unitTestData['total'][key]['status'] });
|
9508 | }
|
9509 | });
|
9510 | }
|
9511 | resolve();
|
9512 | });
|
9513 | };
|
9514 | Application.prototype.processPage = function (page) {
|
9515 | logger.info('Process page', page.name);
|
9516 | var htmlData = this.htmlEngine.render(this.configuration.mainData, page);
|
9517 | var finalPath = this.configuration.mainData.output;
|
9518 | if (this.configuration.mainData.output.lastIndexOf('/') === -1) {
|
9519 | finalPath += '/';
|
9520 | }
|
9521 | if (page.path) {
|
9522 | finalPath += page.path + '/';
|
9523 | }
|
9524 | if (page.filename) {
|
9525 | finalPath += page.filename + '.html';
|
9526 | }
|
9527 | else {
|
9528 | finalPath += page.name + '.html';
|
9529 | }
|
9530 | if (!this.configuration.mainData.disableSearch) {
|
9531 | this.searchEngine.indexPage({
|
9532 | infos: page,
|
9533 | rawData: htmlData,
|
9534 | url: finalPath
|
9535 | });
|
9536 | }
|
9537 | return this.fileEngine.write(finalPath, htmlData).catch(function (err) {
|
9538 | logger.error('Error during ' + page.name + ' page generation');
|
9539 | return Promise.reject('');
|
9540 | });
|
9541 | };
|
9542 | Application.prototype.processPages = function () {
|
9543 | var _this = this;
|
9544 | var pages = _.sortBy(this.configuration.pages, ['name']);
|
9545 | logger.info('Process pages');
|
9546 | Promise.all(pages.map(function (page) { return _this.processPage(page); }))
|
9547 | .then(function () {
|
9548 | var callbacksAfterGenerateSearchIndexJson = function () {
|
9549 | if (_this.configuration.mainData.additionalPages.length > 0) {
|
9550 | _this.processAdditionalPages();
|
9551 | }
|
9552 | else {
|
9553 | if (_this.configuration.mainData.assetsFolder !== '') {
|
9554 | _this.processAssetsFolder();
|
9555 | }
|
9556 | _this.processResources();
|
9557 | }
|
9558 | };
|
9559 | if (!_this.configuration.mainData.disableSearch) {
|
9560 | _this.searchEngine.generateSearchIndexJson(_this.configuration.mainData.output).then(function () {
|
9561 | callbacksAfterGenerateSearchIndexJson();
|
9562 | }, function (e) {
|
9563 | logger.error(e);
|
9564 | });
|
9565 | }
|
9566 | else {
|
9567 | callbacksAfterGenerateSearchIndexJson();
|
9568 | }
|
9569 | })
|
9570 | .then(function () {
|
9571 | return _this.processMenu(_this.configuration.mainData);
|
9572 | })
|
9573 | .catch(function (e) {
|
9574 | logger.error(e);
|
9575 | });
|
9576 | };
|
9577 | Application.prototype.processMenu = function (mainData) {
|
9578 | var _this = this;
|
9579 | logger.info('Process menu...');
|
9580 | return this.htmlEngine.renderMenu(this.configuration.mainData.templates, mainData).then(function (htmlData) {
|
9581 | var finalPath = mainData.output + "/js/menu-wc.js";
|
9582 | return _this.fileEngine.write(finalPath, htmlData).catch(function (err) {
|
9583 | logger.error('Error during ' + finalPath + ' page generation');
|
9584 | return Promise.reject('');
|
9585 | });
|
9586 | });
|
9587 | };
|
9588 | Application.prototype.processAdditionalPages = function () {
|
9589 | var _this = this;
|
9590 | logger.info('Process additional pages');
|
9591 | var pages = this.configuration.mainData.additionalPages;
|
9592 | Promise.all(pages.map(function (page, i) { return _this.processPage(page); }))
|
9593 | .then(function () {
|
9594 | _this.searchEngine
|
9595 | .generateSearchIndexJson(_this.configuration.mainData.output)
|
9596 | .then(function () {
|
9597 | if (_this.configuration.mainData.assetsFolder !== '') {
|
9598 | _this.processAssetsFolder();
|
9599 | }
|
9600 | _this.processResources();
|
9601 | });
|
9602 | })
|
9603 | .catch(function (e) {
|
9604 | logger.error(e);
|
9605 | return Promise.reject(e);
|
9606 | });
|
9607 | };
|
9608 | Application.prototype.processAssetsFolder = function () {
|
9609 | logger.info('Copy assets folder');
|
9610 | if (!this.fileEngine.existsSync(this.configuration.mainData.assetsFolder)) {
|
9611 | logger.error("Provided assets folder " + this.configuration.mainData.assetsFolder + " did not exist");
|
9612 | }
|
9613 | else {
|
9614 | var finalOutput = this.configuration.mainData.output;
|
9615 | var testOutputDir = this.configuration.mainData.output.match(process.cwd());
|
9616 | if (testOutputDir && testOutputDir.length > 0) {
|
9617 | finalOutput = this.configuration.mainData.output.replace(process.cwd() + path.sep, '');
|
9618 | }
|
9619 | var destination = path.join(finalOutput, path.basename(this.configuration.mainData.assetsFolder));
|
9620 | fs.copy(path.resolve(this.configuration.mainData.assetsFolder), path.resolve(destination), function (err) {
|
9621 | if (err) {
|
9622 | logger.error('Error during resources copy ', err);
|
9623 | }
|
9624 | });
|
9625 | }
|
9626 | };
|
9627 | Application.prototype.processResources = function () {
|
9628 | var _this = this;
|
9629 | logger.info('Copy main resources');
|
9630 | var onComplete = function () {
|
9631 | logger.info('Documentation generated in ' +
|
9632 | _this.configuration.mainData.output +
|
9633 | ' in ' +
|
9634 | _this.getElapsedTime() +
|
9635 | ' seconds using ' +
|
9636 | _this.configuration.mainData.theme +
|
9637 | ' theme');
|
9638 | if (_this.configuration.mainData.serve) {
|
9639 | logger.info("Serving documentation from " + _this.configuration.mainData.output + " at http://127.0.0.1:" + _this.configuration.mainData.port);
|
9640 | _this.runWebServer(_this.configuration.mainData.output);
|
9641 | }
|
9642 | else {
|
9643 | generationPromiseResolve();
|
9644 | _this.endCallback();
|
9645 | }
|
9646 | };
|
9647 | var finalOutput = this.configuration.mainData.output;
|
9648 | var testOutputDir = this.configuration.mainData.output.match(process.cwd());
|
9649 | if (testOutputDir && testOutputDir.length > 0) {
|
9650 | finalOutput = this.configuration.mainData.output.replace(process.cwd() + path.sep, '');
|
9651 | }
|
9652 | fs.copy(path.resolve(__dirname + '/../src/resources/'), path.resolve(finalOutput), function (errorCopy) {
|
9653 | if (errorCopy) {
|
9654 | logger.error('Error during resources copy ', errorCopy);
|
9655 | }
|
9656 | else {
|
9657 | if (_this.configuration.mainData.extTheme) {
|
9658 | fs.copy(path.resolve(process.cwd() + path.sep + _this.configuration.mainData.extTheme), path.resolve(finalOutput + '/styles/'), function (errorCopyTheme) {
|
9659 | if (errorCopyTheme) {
|
9660 | logger.error('Error during external styling theme copy ', errorCopyTheme);
|
9661 | }
|
9662 | else {
|
9663 | logger.info('External styling theme copy succeeded');
|
9664 | onComplete();
|
9665 | }
|
9666 | });
|
9667 | }
|
9668 | else {
|
9669 | if (_this.configuration.mainData.customFavicon !== '') {
|
9670 | logger.info("Custom favicon supplied");
|
9671 | fs.copy(path.resolve(process.cwd() +
|
9672 | path.sep +
|
9673 | _this.configuration.mainData.customFavicon), path.resolve(finalOutput + '/images/favicon.ico'), function (errorCopyFavicon) {
|
9674 | // tslint:disable-line
|
9675 | if (errorCopyFavicon) {
|
9676 | logger.error('Error during resources copy ', errorCopyFavicon);
|
9677 | }
|
9678 | else {
|
9679 | onComplete();
|
9680 | }
|
9681 | });
|
9682 | }
|
9683 | else {
|
9684 | onComplete();
|
9685 | }
|
9686 | }
|
9687 | }
|
9688 | });
|
9689 | };
|
9690 | /**
|
9691 | * Calculates the elapsed time since the program was started.
|
9692 | *
|
9693 | * @returns {number}
|
9694 | */
|
9695 | Application.prototype.getElapsedTime = function () {
|
9696 | return (new Date().valueOf() - startTime.valueOf()) / 1000;
|
9697 | };
|
9698 | Application.prototype.processGraphs = function () {
|
9699 | var _this = this;
|
9700 | if (this.configuration.mainData.disableGraph) {
|
9701 | logger.info('Graph generation disabled');
|
9702 | this.processPages();
|
9703 | }
|
9704 | else {
|
9705 | logger.info('Process main graph');
|
9706 | var modules_1 = this.configuration.mainData.modules;
|
9707 | var i_1 = 0;
|
9708 | var len_1 = modules_1.length;
|
9709 | var loop_1 = function () {
|
9710 | if (i_1 <= len_1 - 1) {
|
9711 | logger.info('Process module graph', modules_1[i_1].name);
|
9712 | var finalPath_2 = _this.configuration.mainData.output;
|
9713 | if (_this.configuration.mainData.output.lastIndexOf('/') === -1) {
|
9714 | finalPath_2 += '/';
|
9715 | }
|
9716 | finalPath_2 += 'modules/' + modules_1[i_1].name;
|
9717 | var _rawModule = _this.dependenciesEngine.getRawModule(modules_1[i_1].name);
|
9718 | if (_rawModule.declarations.length > 0 ||
|
9719 | _rawModule.bootstrap.length > 0 ||
|
9720 | _rawModule.imports.length > 0 ||
|
9721 | _rawModule.exports.length > 0 ||
|
9722 | _rawModule.providers.length > 0) {
|
9723 | _this.ngdEngine
|
9724 | .renderGraph(modules_1[i_1].file, finalPath_2, 'f', modules_1[i_1].name)
|
9725 | .then(function () {
|
9726 | _this.ngdEngine
|
9727 | .readGraph(path.resolve(finalPath_2 + path.sep + 'dependencies.svg'), modules_1[i_1].name)
|
9728 | .then(function (data) {
|
9729 | modules_1[i_1].graph = data;
|
9730 | i_1++;
|
9731 | loop_1();
|
9732 | }, function (err) {
|
9733 | logger.error('Error during graph read: ', err);
|
9734 | });
|
9735 | }, function (errorMessage) {
|
9736 | logger.error(errorMessage);
|
9737 | });
|
9738 | }
|
9739 | else {
|
9740 | i_1++;
|
9741 | loop_1();
|
9742 | }
|
9743 | }
|
9744 | else {
|
9745 | _this.processPages();
|
9746 | }
|
9747 | };
|
9748 | var finalMainGraphPath_1 = this.configuration.mainData.output;
|
9749 | if (finalMainGraphPath_1.lastIndexOf('/') === -1) {
|
9750 | finalMainGraphPath_1 += '/';
|
9751 | }
|
9752 | finalMainGraphPath_1 += 'graph';
|
9753 | this.ngdEngine.init(path.resolve(finalMainGraphPath_1));
|
9754 | this.ngdEngine
|
9755 | .renderGraph(this.configuration.mainData.tsconfig, path.resolve(finalMainGraphPath_1), 'p')
|
9756 | .then(function () {
|
9757 | _this.ngdEngine
|
9758 | .readGraph(path.resolve(finalMainGraphPath_1 + path.sep + 'dependencies.svg'), 'Main graph')
|
9759 | .then(function (data) {
|
9760 | _this.configuration.mainData.mainGraph = data;
|
9761 | loop_1();
|
9762 | }, function (err) {
|
9763 | logger.error('Error during main graph reading : ', err);
|
9764 | _this.configuration.mainData.disableMainGraph = true;
|
9765 | loop_1();
|
9766 | });
|
9767 | }, function (err) {
|
9768 | logger.error('Ooops error during main graph generation, moving on next part with main graph disabled : ', err);
|
9769 | _this.configuration.mainData.disableMainGraph = true;
|
9770 | loop_1();
|
9771 | });
|
9772 | }
|
9773 | };
|
9774 | Application.prototype.runWebServer = function (folder) {
|
9775 | if (!this.isWatching) {
|
9776 | LiveServer.start({
|
9777 | root: folder,
|
9778 | open: this.configuration.mainData.open,
|
9779 | quiet: true,
|
9780 | logLevel: 0,
|
9781 | wait: 1000,
|
9782 | port: this.configuration.mainData.port
|
9783 | });
|
9784 | }
|
9785 | if (this.configuration.mainData.watch && !this.isWatching) {
|
9786 | if (typeof this.files === 'undefined') {
|
9787 | logger.error('No sources files available, please use -p flag');
|
9788 | generationPromiseReject();
|
9789 | process.exit(1);
|
9790 | }
|
9791 | else {
|
9792 | this.runWatch();
|
9793 | }
|
9794 | }
|
9795 | else if (this.configuration.mainData.watch && this.isWatching) {
|
9796 | var srcFolder = findMainSourceFolder(this.files);
|
9797 | logger.info("Already watching sources in " + srcFolder + " folder");
|
9798 | }
|
9799 | };
|
9800 | Application.prototype.runWatch = function () {
|
9801 | var _this = this;
|
9802 | var sources = [findMainSourceFolder(this.files)];
|
9803 | var watcherReady = false;
|
9804 | this.isWatching = true;
|
9805 | logger.info("Watching sources in " + findMainSourceFolder(this.files) + " folder");
|
9806 | if ($markdownengine.hasRootMarkdowns()) {
|
9807 | sources = sources.concat($markdownengine.listRootMarkdowns());
|
9808 | }
|
9809 | if (this.configuration.mainData.includes !== '') {
|
9810 | sources = sources.concat(this.configuration.mainData.includes);
|
9811 | }
|
9812 | // Check all elements of sources list exist
|
9813 | sources = cleanSourcesForWatch(sources);
|
9814 | var watcher = chokidar.watch(sources, {
|
9815 | awaitWriteFinish: true,
|
9816 | ignoreInitial: true,
|
9817 | ignored: /(spec|\.d)\.ts/
|
9818 | });
|
9819 | var timerAddAndRemoveRef;
|
9820 | var timerChangeRef;
|
9821 | var runnerAddAndRemove = function () {
|
9822 | startTime = new Date();
|
9823 | _this.generate();
|
9824 | };
|
9825 | var waiterAddAndRemove = function () {
|
9826 | clearTimeout(timerAddAndRemoveRef);
|
9827 | timerAddAndRemoveRef = setTimeout(runnerAddAndRemove, 1000);
|
9828 | };
|
9829 | var runnerChange = function () {
|
9830 | startTime = new Date();
|
9831 | _this.setUpdatedFiles(_this.watchChangedFiles);
|
9832 | if (_this.hasWatchedFilesTSFiles()) {
|
9833 | _this.getMicroDependenciesData();
|
9834 | }
|
9835 | else if (_this.hasWatchedFilesRootMarkdownFiles()) {
|
9836 | _this.rebuildRootMarkdowns();
|
9837 | }
|
9838 | else {
|
9839 | _this.rebuildExternalDocumentation();
|
9840 | }
|
9841 | };
|
9842 | var waiterChange = function () {
|
9843 | clearTimeout(timerChangeRef);
|
9844 | timerChangeRef = setTimeout(runnerChange, 1000);
|
9845 | };
|
9846 | watcher.on('ready', function () {
|
9847 | if (!watcherReady) {
|
9848 | watcherReady = true;
|
9849 | watcher
|
9850 | .on('add', function (file) {
|
9851 | logger.debug("File " + file + " has been added");
|
9852 | // Test extension, if ts
|
9853 | // rescan everything
|
9854 | if (path.extname(file) === '.ts') {
|
9855 | waiterAddAndRemove();
|
9856 | }
|
9857 | })
|
9858 | .on('change', function (file) {
|
9859 | logger.debug("File " + file + " has been changed");
|
9860 | // Test extension, if ts
|
9861 | // rescan only file
|
9862 | if (path.extname(file) === '.ts' ||
|
9863 | path.extname(file) === '.md' ||
|
9864 | path.extname(file) === '.json') {
|
9865 | _this.watchChangedFiles.push(path.join(process.cwd() + path.sep + file));
|
9866 | waiterChange();
|
9867 | }
|
9868 | })
|
9869 | .on('unlink', function (file) {
|
9870 | logger.debug("File " + file + " has been removed");
|
9871 | // Test extension, if ts
|
9872 | // rescan everything
|
9873 | if (path.extname(file) === '.ts') {
|
9874 | waiterAddAndRemove();
|
9875 | }
|
9876 | });
|
9877 | }
|
9878 | });
|
9879 | };
|
9880 | Object.defineProperty(Application.prototype, "application", {
|
9881 | /**
|
9882 | * Return the application / root component instance.
|
9883 | */
|
9884 | get: function () {
|
9885 | return this;
|
9886 | },
|
9887 | enumerable: true,
|
9888 | configurable: true
|
9889 | });
|
9890 | Object.defineProperty(Application.prototype, "isCLI", {
|
9891 | get: function () {
|
9892 | return false;
|
9893 | },
|
9894 | enumerable: true,
|
9895 | configurable: true
|
9896 | });
|
9897 | return Application;
|
9898 | }());
|
9899 |
|
9900 | var glob = require('glob');
|
9901 | var ParserUtil = /** @class */ (function () {
|
9902 | function ParserUtil() {
|
9903 | this._globFiles = [];
|
9904 | }
|
9905 | ParserUtil.prototype.init = function (exclude, cwd) {
|
9906 | this._files = exclude;
|
9907 | this._cwd = cwd;
|
9908 | var i = 0;
|
9909 | var len = exclude.length;
|
9910 | for (i; i < len; i++) {
|
9911 | this._globFiles = this._globFiles.concat(glob.sync(exclude[i], { cwd: this._cwd }));
|
9912 | }
|
9913 | };
|
9914 | ParserUtil.prototype.testFilesWithCwdDepth = function () {
|
9915 | var i = 0;
|
9916 | var len = this._files.length;
|
9917 | var result = {
|
9918 | status: true,
|
9919 | level: 0
|
9920 | };
|
9921 | for (i; i < len; i++) {
|
9922 | var elementPath = path.resolve(this._cwd + path.sep, this._files[i]);
|
9923 | if (elementPath.indexOf(this._cwd) === -1) {
|
9924 | result.status = false;
|
9925 | var level = this._files[i].match(/\..\//g).length;
|
9926 | if (level > result.level) {
|
9927 | result.level = level;
|
9928 | }
|
9929 | }
|
9930 | }
|
9931 | return result;
|
9932 | };
|
9933 | ParserUtil.prototype.updateCwd = function (cwd, level) {
|
9934 | var _cwd = cwd, _rewind = '';
|
9935 | for (var i = 0; i < level; i++) {
|
9936 | _rewind += '../';
|
9937 | }
|
9938 | _cwd = path.resolve(_cwd, _rewind);
|
9939 | return _cwd;
|
9940 | };
|
9941 | ParserUtil.prototype.testFile = function (file) {
|
9942 | var _this = this;
|
9943 | var i = 0;
|
9944 | var len = this._files.length;
|
9945 | var fileBasename = path.basename(file);
|
9946 | var fileNameInCwd = file.replace(this._cwd + path.sep, '');
|
9947 | var result = false;
|
9948 | if (path.sep === '\\') {
|
9949 | fileNameInCwd = fileNameInCwd.replace(new RegExp('\\' + path.sep, 'g'), '/');
|
9950 | }
|
9951 | for (i; i < len; i++) {
|
9952 | if (glob.hasMagic(this._files[i]) && this._globFiles.length > 0) {
|
9953 | var resultGlobSearch = this._globFiles.findIndex(function (element) {
|
9954 | var elementPath = path.resolve(_this._cwd + path.sep, element);
|
9955 | var elementPathInCwd = elementPath.replace(_this._cwd + path.sep, '');
|
9956 | elementPathInCwd = elementPathInCwd.replace(new RegExp('\\' + path.sep, 'g'), '/');
|
9957 | return elementPathInCwd === fileNameInCwd;
|
9958 | });
|
9959 | result = resultGlobSearch !== -1;
|
9960 | }
|
9961 | else {
|
9962 | result = fileNameInCwd === this._files[i];
|
9963 | }
|
9964 | if (result) {
|
9965 | break;
|
9966 | }
|
9967 | }
|
9968 | return result;
|
9969 | };
|
9970 | return ParserUtil;
|
9971 | }());
|
9972 |
|
9973 | var pkg$1 = require('../package.json');
|
9974 | var program = require('commander');
|
9975 | var os = require('os');
|
9976 | var osName = require('os-name');
|
9977 | var cosmiconfig = require('cosmiconfig');
|
9978 | var cosmiconfigModuleName = 'compodoc';
|
9979 | var scannedFiles = [];
|
9980 | var excludeFiles;
|
9981 | var includeFiles;
|
9982 | var cwd$1 = process.cwd();
|
9983 | process.setMaxListeners(0);
|
9984 | var CliApplication = /** @class */ (function (_super) {
|
9985 | __extends(CliApplication, _super);
|
9986 | function CliApplication() {
|
9987 | return _super !== null && _super.apply(this, arguments) || this;
|
9988 | }
|
9989 | /**
|
9990 | * Run compodoc from the command line.
|
9991 | */
|
9992 | CliApplication.prototype.generate = function () {
|
9993 | var _this = this;
|
9994 | function list(val) {
|
9995 | return val.split(',');
|
9996 | }
|
9997 | program
|
9998 | .version(pkg$1.version)
|
9999 | .usage('<src> [options]')
|
10000 | .option('-c, --config [config]', 'A configuration file : .compodocrc, .compodocrc.json, .compodocrc.yaml or compodoc property in package.json')
|
10001 | .option('-p, --tsconfig [config]', 'A tsconfig.json file')
|
10002 | .option('-d, --output [folder]', 'Where to store the generated documentation', COMPODOC_DEFAULTS.folder)
|
10003 | .option('-y, --extTheme [file]', 'External styling theme file')
|
10004 | .option('-n, --name [name]', 'Title documentation', COMPODOC_DEFAULTS.title)
|
10005 | .option('-a, --assetsFolder [folder]', 'External assets folder to copy in generated documentation folder')
|
10006 | .option('-o, --open [value]', 'Open the generated documentation')
|
10007 | .option('-t, --silent', "In silent mode, log messages aren't logged in the console", false)
|
10008 | .option('-s, --serve', 'Serve generated documentation (default http://localhost:8080/)', false)
|
10009 | .option('-r, --port [port]', 'Change default serving port', COMPODOC_DEFAULTS.port)
|
10010 | .option('-w, --watch', 'Watch source files after serve and force documentation rebuild', false)
|
10011 | .option('-e, --exportFormat [format]', 'Export in specified format (json, html)', COMPODOC_DEFAULTS.exportFormat)
|
10012 | .option('--language [language]', 'Language used for the generated documentation (en-US, fr-FR, zh-CN)', COMPODOC_DEFAULTS.language)
|
10013 | .option('--theme [theme]', "Choose one of available themes, default is 'gitbook' (laravel, original, material, postmark, readthedocs, stripe, vagrant)")
|
10014 | .option('--hideGenerator', 'Do not print the Compodoc link at the bottom of the page', false)
|
10015 | .option('--toggleMenuItems <items>', "Close by default items in the menu values : ['all'] or one of these ['modules','components','directives','classes','injectables','interfaces','pipes','additionalPages']", list, COMPODOC_DEFAULTS.toggleMenuItems)
|
10016 | .option('--navTabConfig <tab configs>', "List navigation tab objects in the desired order with two string properties (\"id\" and \"label\"). Double-quotes must be escaped with '\\'. Available tab IDs are \"info\", \"readme\", \"source\", \"templateData\", \"tree\", and \"example\". Note: Certain tabs will only be shown if applicable to a given dependency", list, JSON.stringify(COMPODOC_DEFAULTS.navTabConfig))
|
10017 | .option('--templates [folder]', 'Path to directory of Handlebars templates to override built-in templates')
|
10018 | .option('--includes [path]', 'Path of external markdown files to include')
|
10019 | .option('--includesName [name]', 'Name of item menu of externals markdown files', COMPODOC_DEFAULTS.additionalEntryName)
|
10020 | .option('--coverageTest [threshold]', 'Test command of documentation coverage with a threshold (default 70)')
|
10021 | .option('--coverageMinimumPerFile [minimum]', 'Test command of documentation coverage per file with a minimum (default 0)')
|
10022 | .option('--coverageTestThresholdFail [true|false]', 'Test command of documentation coverage (global or per file) will fail with error or just warn user (true: error, false: warn)', COMPODOC_DEFAULTS.coverageTestThresholdFail)
|
10023 | .option('--coverageTestShowOnlyFailed', 'Display only failed files for a coverage test')
|
10024 | .option('--unitTestCoverage [json-summary]', 'To include unit test coverage, specify istanbul JSON coverage summary file')
|
10025 | .option('--disableSourceCode', 'Do not add source code tab and links to source code', false)
|
10026 | .option('--disableDomTree', 'Do not add dom tree tab', false)
|
10027 | .option('--disableTemplateTab', 'Do not add template tab', false)
|
10028 | .option('--disableGraph', 'Do not add the dependency graph', false)
|
10029 | .option('--disableCoverage', 'Do not add the documentation coverage report', false)
|
10030 | .option('--disablePrivate', 'Do not show private in generated documentation', false)
|
10031 | .option('--disableProtected', 'Do not show protected in generated documentation', false)
|
10032 | .option('--disableInternal', 'Do not show @internal in generated documentation', false)
|
10033 | .option('--disableLifeCycleHooks', 'Do not show Angular lifecycle hooks in generated documentation', false)
|
10034 | .option('--disableRoutesGraph', 'Do not add the routes graph', COMPODOC_DEFAULTS.disableRoutesGraph)
|
10035 | .option('--disableSearch', 'Do not add the search input', false)
|
10036 | .option('--minimal', 'Minimal mode with only documentation. No search, no graph, no coverage.', false)
|
10037 | .option('--customFavicon [path]', 'Use a custom favicon')
|
10038 | .option('--gaID [id]', 'Google Analytics tracking ID')
|
10039 | .option('--gaSite [site]', 'Google Analytics site name', COMPODOC_DEFAULTS.gaSite)
|
10040 | .parse(process.argv);
|
10041 | var outputHelp = function () {
|
10042 | program.outputHelp();
|
10043 | process.exit(1);
|
10044 | };
|
10045 | var configExplorer = cosmiconfig(cosmiconfigModuleName);
|
10046 | var configExplorerResult;
|
10047 | var configFile = {};
|
10048 | if (program.config) {
|
10049 | var configFilePath = program.config;
|
10050 | var testConfigFilePath = configFilePath.match(process.cwd());
|
10051 | if (testConfigFilePath && testConfigFilePath.length > 0) {
|
10052 | configFilePath = configFilePath.replace(process.cwd() + path.sep, '');
|
10053 | }
|
10054 | configExplorerResult = configExplorer.loadSync(path.resolve(configFilePath));
|
10055 | }
|
10056 | else {
|
10057 | configExplorerResult = configExplorer.searchSync();
|
10058 | }
|
10059 | if (configExplorerResult) {
|
10060 | if (typeof configExplorerResult.config !== 'undefined') {
|
10061 | configFile = configExplorerResult.config;
|
10062 | }
|
10063 | }
|
10064 | if (configFile.output) {
|
10065 | this.configuration.mainData.output = configFile.output;
|
10066 | }
|
10067 | if (program.output && program.output !== COMPODOC_DEFAULTS.folder) {
|
10068 | this.configuration.mainData.output = program.output;
|
10069 | }
|
10070 | if (configFile.extTheme) {
|
10071 | this.configuration.mainData.extTheme = configFile.extTheme;
|
10072 | }
|
10073 | if (program.extTheme) {
|
10074 | this.configuration.mainData.extTheme = program.extTheme;
|
10075 | }
|
10076 | if (configFile.language) {
|
10077 | this.configuration.mainData.language = configFile.language;
|
10078 | }
|
10079 | if (program.language) {
|
10080 | this.configuration.mainData.language = program.language;
|
10081 | }
|
10082 | if (configFile.theme) {
|
10083 | this.configuration.mainData.theme = configFile.theme;
|
10084 | }
|
10085 | if (program.theme) {
|
10086 | this.configuration.mainData.theme = program.theme;
|
10087 | }
|
10088 | if (configFile.name) {
|
10089 | this.configuration.mainData.documentationMainName = configFile.name;
|
10090 | }
|
10091 | if (program.name && program.name !== COMPODOC_DEFAULTS.title) {
|
10092 | this.configuration.mainData.documentationMainName = program.name;
|
10093 | }
|
10094 | if (configFile.assetsFolder) {
|
10095 | this.configuration.mainData.assetsFolder = configFile.assetsFolder;
|
10096 | }
|
10097 | if (program.assetsFolder) {
|
10098 | this.configuration.mainData.assetsFolder = program.assetsFolder;
|
10099 | }
|
10100 | if (configFile.open) {
|
10101 | this.configuration.mainData.open = configFile.open;
|
10102 | }
|
10103 | if (program.open) {
|
10104 | this.configuration.mainData.open = program.open;
|
10105 | }
|
10106 | if (configFile.toggleMenuItems) {
|
10107 | this.configuration.mainData.toggleMenuItems = configFile.toggleMenuItems;
|
10108 | }
|
10109 | if (program.toggleMenuItems &&
|
10110 | program.toggleMenuItems !== COMPODOC_DEFAULTS.toggleMenuItems) {
|
10111 | this.configuration.mainData.toggleMenuItems = program.toggleMenuItems;
|
10112 | }
|
10113 | if (configFile.templates) {
|
10114 | this.configuration.mainData.templates = configFile.templates;
|
10115 | }
|
10116 | if (program.templates) {
|
10117 | this.configuration.mainData.templates = program.templates;
|
10118 | }
|
10119 | if (configFile.navTabConfig) {
|
10120 | this.configuration.mainData.navTabConfig = configFile.navTabConfig;
|
10121 | }
|
10122 | if (program.navTabConfig &&
|
10123 | JSON.parse(program.navTabConfig).length !== COMPODOC_DEFAULTS.navTabConfig.length) {
|
10124 | this.configuration.mainData.navTabConfig = JSON.parse(program.navTabConfig);
|
10125 | }
|
10126 | if (configFile.includes) {
|
10127 | this.configuration.mainData.includes = configFile.includes;
|
10128 | }
|
10129 | if (program.includes) {
|
10130 | this.configuration.mainData.includes = program.includes;
|
10131 | }
|
10132 | if (configFile.includesName) {
|
10133 | this.configuration.mainData.includesName = configFile.includesName;
|
10134 | }
|
10135 | if (program.includesName &&
|
10136 | program.includesName !== COMPODOC_DEFAULTS.additionalEntryName) {
|
10137 | this.configuration.mainData.includesName = program.includesName;
|
10138 | }
|
10139 | if (configFile.silent) {
|
10140 | logger.silent = false;
|
10141 | }
|
10142 | if (program.silent) {
|
10143 | logger.silent = false;
|
10144 | }
|
10145 | if (configFile.serve) {
|
10146 | this.configuration.mainData.serve = configFile.serve;
|
10147 | }
|
10148 | if (program.serve) {
|
10149 | this.configuration.mainData.serve = program.serve;
|
10150 | }
|
10151 | if (configFile.port) {
|
10152 | this.configuration.mainData.port = configFile.port;
|
10153 | }
|
10154 | if (program.port && program.port !== COMPODOC_DEFAULTS.port) {
|
10155 | this.configuration.mainData.port = program.port;
|
10156 | }
|
10157 | if (configFile.watch) {
|
10158 | this.configuration.mainData.watch = configFile.watch;
|
10159 | }
|
10160 | if (program.watch) {
|
10161 | this.configuration.mainData.watch = program.watch;
|
10162 | }
|
10163 | if (configFile.exportFormat) {
|
10164 | this.configuration.mainData.exportFormat = configFile.exportFormat;
|
10165 | }
|
10166 | if (program.exportFormat && program.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
|
10167 | this.configuration.mainData.exportFormat = program.exportFormat;
|
10168 | }
|
10169 | if (configFile.hideGenerator) {
|
10170 | this.configuration.mainData.hideGenerator = configFile.hideGenerator;
|
10171 | }
|
10172 | if (program.hideGenerator) {
|
10173 | this.configuration.mainData.hideGenerator = program.hideGenerator;
|
10174 | }
|
10175 | if (configFile.coverageTest) {
|
10176 | this.configuration.mainData.coverageTest = true;
|
10177 | this.configuration.mainData.coverageTestThreshold =
|
10178 | typeof configFile.coverageTest === 'string'
|
10179 | ? parseInt(configFile.coverageTest, 10)
|
10180 | : COMPODOC_DEFAULTS.defaultCoverageThreshold;
|
10181 | }
|
10182 | if (program.coverageTest) {
|
10183 | this.configuration.mainData.coverageTest = true;
|
10184 | this.configuration.mainData.coverageTestThreshold =
|
10185 | typeof program.coverageTest === 'string'
|
10186 | ? parseInt(program.coverageTest, 10)
|
10187 | : COMPODOC_DEFAULTS.defaultCoverageThreshold;
|
10188 | }
|
10189 | if (configFile.coverageMinimumPerFile) {
|
10190 | this.configuration.mainData.coverageTestPerFile = true;
|
10191 | this.configuration.mainData.coverageMinimumPerFile =
|
10192 | typeof configFile.coverageMinimumPerFile === 'string'
|
10193 | ? parseInt(configFile.coverageMinimumPerFile, 10)
|
10194 | : COMPODOC_DEFAULTS.defaultCoverageMinimumPerFile;
|
10195 | }
|
10196 | if (program.coverageMinimumPerFile) {
|
10197 | this.configuration.mainData.coverageTestPerFile = true;
|
10198 | this.configuration.mainData.coverageMinimumPerFile =
|
10199 | typeof program.coverageMinimumPerFile === 'string'
|
10200 | ? parseInt(program.coverageMinimumPerFile, 10)
|
10201 | : COMPODOC_DEFAULTS.defaultCoverageMinimumPerFile;
|
10202 | }
|
10203 | if (configFile.coverageTestThresholdFail) {
|
10204 | this.configuration.mainData.coverageTestThresholdFail =
|
10205 | configFile.coverageTestThresholdFail === 'false' ? false : true;
|
10206 | }
|
10207 | if (program.coverageTestThresholdFail) {
|
10208 | this.configuration.mainData.coverageTestThresholdFail =
|
10209 | program.coverageTestThresholdFail === 'false' ? false : true;
|
10210 | }
|
10211 | if (configFile.coverageTestShowOnlyFailed) {
|
10212 | this.configuration.mainData.coverageTestShowOnlyFailed =
|
10213 | configFile.coverageTestShowOnlyFailed;
|
10214 | }
|
10215 | if (program.coverageTestShowOnlyFailed) {
|
10216 | this.configuration.mainData.coverageTestShowOnlyFailed =
|
10217 | program.coverageTestShowOnlyFailed;
|
10218 | }
|
10219 | if (configFile.unitTestCoverage) {
|
10220 | this.configuration.mainData.unitTestCoverage = configFile.unitTestCoverage;
|
10221 | }
|
10222 | if (program.unitTestCoverage) {
|
10223 | this.configuration.mainData.unitTestCoverage = program.unitTestCoverage;
|
10224 | }
|
10225 | if (configFile.disableSourceCode) {
|
10226 | this.configuration.mainData.disableSourceCode = configFile.disableSourceCode;
|
10227 | }
|
10228 | if (program.disableSourceCode) {
|
10229 | this.configuration.mainData.disableSourceCode = program.disableSourceCode;
|
10230 | }
|
10231 | if (configFile.disableDomTree) {
|
10232 | this.configuration.mainData.disableDomTree = configFile.disableDomTree;
|
10233 | }
|
10234 | if (program.disableDomTree) {
|
10235 | this.configuration.mainData.disableDomTree = program.disableDomTree;
|
10236 | }
|
10237 | if (configFile.disableTemplateTab) {
|
10238 | this.configuration.mainData.disableTemplateTab = configFile.disableTemplateTab;
|
10239 | }
|
10240 | if (program.disableTemplateTab) {
|
10241 | this.configuration.mainData.disableTemplateTab = program.disableTemplateTab;
|
10242 | }
|
10243 | if (configFile.disableGraph) {
|
10244 | this.configuration.mainData.disableGraph = configFile.disableGraph;
|
10245 | }
|
10246 | if (program.disableGraph) {
|
10247 | this.configuration.mainData.disableGraph = program.disableGraph;
|
10248 | }
|
10249 | if (configFile.disableCoverage) {
|
10250 | this.configuration.mainData.disableCoverage = configFile.disableCoverage;
|
10251 | }
|
10252 | if (program.disableCoverage) {
|
10253 | this.configuration.mainData.disableCoverage = program.disableCoverage;
|
10254 | }
|
10255 | if (configFile.disablePrivate) {
|
10256 | this.configuration.mainData.disablePrivate = configFile.disablePrivate;
|
10257 | }
|
10258 | if (program.disablePrivate) {
|
10259 | this.configuration.mainData.disablePrivate = program.disablePrivate;
|
10260 | }
|
10261 | if (configFile.disableProtected) {
|
10262 | this.configuration.mainData.disableProtected = configFile.disableProtected;
|
10263 | }
|
10264 | if (program.disableProtected) {
|
10265 | this.configuration.mainData.disableProtected = program.disableProtected;
|
10266 | }
|
10267 | if (configFile.disableInternal) {
|
10268 | this.configuration.mainData.disableInternal = configFile.disableInternal;
|
10269 | }
|
10270 | if (program.disableInternal) {
|
10271 | this.configuration.mainData.disableInternal = program.disableInternal;
|
10272 | }
|
10273 | if (configFile.disableLifeCycleHooks) {
|
10274 | this.configuration.mainData.disableLifeCycleHooks = configFile.disableLifeCycleHooks;
|
10275 | }
|
10276 | if (program.disableLifeCycleHooks) {
|
10277 | this.configuration.mainData.disableLifeCycleHooks = program.disableLifeCycleHooks;
|
10278 | }
|
10279 | if (configFile.disableRoutesGraph) {
|
10280 | this.configuration.mainData.disableRoutesGraph = configFile.disableRoutesGraph;
|
10281 | }
|
10282 | if (program.disableRoutesGraph) {
|
10283 | this.configuration.mainData.disableRoutesGraph = program.disableRoutesGraph;
|
10284 | }
|
10285 | if (configFile.disableSearch) {
|
10286 | this.configuration.mainData.disableSearch = configFile.disableSearch;
|
10287 | }
|
10288 | if (program.disableSearch) {
|
10289 | this.configuration.mainData.disableSearch = program.disableSearch;
|
10290 | }
|
10291 | if (configFile.minimal) {
|
10292 | this.configuration.mainData.disableSearch = true;
|
10293 | this.configuration.mainData.disableRoutesGraph = true;
|
10294 | this.configuration.mainData.disableGraph = true;
|
10295 | this.configuration.mainData.disableCoverage = true;
|
10296 | }
|
10297 | if (program.minimal) {
|
10298 | this.configuration.mainData.disableSearch = true;
|
10299 | this.configuration.mainData.disableRoutesGraph = true;
|
10300 | this.configuration.mainData.disableGraph = true;
|
10301 | this.configuration.mainData.disableCoverage = true;
|
10302 | }
|
10303 | if (configFile.customFavicon) {
|
10304 | this.configuration.mainData.customFavicon = configFile.customFavicon;
|
10305 | }
|
10306 | if (program.customFavicon) {
|
10307 | this.configuration.mainData.customFavicon = program.customFavicon;
|
10308 | }
|
10309 | if (configFile.gaID) {
|
10310 | this.configuration.mainData.gaID = configFile.gaID;
|
10311 | }
|
10312 | if (program.gaID) {
|
10313 | this.configuration.mainData.gaID = program.gaID;
|
10314 | }
|
10315 | if (configFile.gaSite) {
|
10316 | this.configuration.mainData.gaSite = configFile.gaSite;
|
10317 | }
|
10318 | if (program.gaSite && program.gaSite !== COMPODOC_DEFAULTS.gaSite) {
|
10319 | this.configuration.mainData.gaSite = program.gaSite;
|
10320 | }
|
10321 | if (!this.isWatching) {
|
10322 | console.log(fs.readFileSync(path.join(__dirname, '../src/banner')).toString());
|
10323 | console.log(pkg$1.version);
|
10324 | console.log('');
|
10325 | console.log("Typescript version : " + Ast.ts.version);
|
10326 | console.log('');
|
10327 | console.log("Node.js version : " + process.version);
|
10328 | console.log('');
|
10329 | console.log("Operating system : " + osName(os.platform(), os.release()));
|
10330 | console.log('');
|
10331 | }
|
10332 | if (configExplorerResult) {
|
10333 | if (typeof configExplorerResult.config !== 'undefined') {
|
10334 | logger.info("Using configuration file : " + configExplorerResult.filepath);
|
10335 | }
|
10336 | }
|
10337 | if (!configExplorerResult) {
|
10338 | logger.warn("No configuration file found, switching to CLI flags.");
|
10339 | }
|
10340 | if (program.language && !I18nEngineInstance.supportLanguage(program.language)) {
|
10341 | logger.warn("The language " + program.language + " is not available, falling back to " + I18nEngineInstance.fallbackLanguage);
|
10342 | }
|
10343 | if (program.tsconfig && typeof program.tsconfig === 'boolean') {
|
10344 | logger.error("Please provide a tsconfig file.");
|
10345 | process.exit(1);
|
10346 | }
|
10347 | if (configFile.tsconfig) {
|
10348 | this.configuration.mainData.tsconfig = configFile.tsconfig;
|
10349 | }
|
10350 | if (program.tsconfig) {
|
10351 | this.configuration.mainData.tsconfig = program.tsconfig;
|
10352 | }
|
10353 | if (configFile.files) {
|
10354 | scannedFiles = configFile.files;
|
10355 | }
|
10356 | if (configFile.exclude) {
|
10357 | excludeFiles = configFile.exclude;
|
10358 | }
|
10359 | if (configFile.include) {
|
10360 | includeFiles = configFile.include;
|
10361 | }
|
10362 | if (program.serve && !this.configuration.mainData.tsconfig && program.output) {
|
10363 | // if -s & -d, serve it
|
10364 | if (!this.fileEngine.existsSync(program.output)) {
|
10365 | logger.error(program.output + " folder doesn't exist");
|
10366 | process.exit(1);
|
10367 | }
|
10368 | else {
|
10369 | logger.info("Serving documentation from " + program.output + " at http://127.0.0.1:" + program.port);
|
10370 | _super.prototype.runWebServer.call(this, program.output);
|
10371 | }
|
10372 | }
|
10373 | else if (program.serve && !this.configuration.mainData.tsconfig && !program.output) {
|
10374 | // if only -s find ./documentation, if ok serve, else error provide -d
|
10375 | if (!this.fileEngine.existsSync(program.output)) {
|
10376 | logger.error('Provide output generated folder with -d flag');
|
10377 | process.exit(1);
|
10378 | }
|
10379 | else {
|
10380 | logger.info("Serving documentation from " + program.output + " at http://127.0.0.1:" + program.port);
|
10381 | _super.prototype.runWebServer.call(this, program.output);
|
10382 | }
|
10383 | }
|
10384 | else {
|
10385 | if (program.hideGenerator) {
|
10386 | this.configuration.mainData.hideGenerator = true;
|
10387 | }
|
10388 | if (this.configuration.mainData.tsconfig && program.args.length === 0) {
|
10389 | /**
|
10390 | * tsconfig file provided only
|
10391 | */
|
10392 | var testTsConfigPath = this.configuration.mainData.tsconfig.indexOf(process.cwd());
|
10393 | if (testTsConfigPath !== -1) {
|
10394 | this.configuration.mainData.tsconfig = this.configuration.mainData.tsconfig.replace(process.cwd() + path.sep, '');
|
10395 | }
|
10396 | if (!this.fileEngine.existsSync(this.configuration.mainData.tsconfig)) {
|
10397 | logger.error("\"" + this.configuration.mainData.tsconfig + "\" file was not found in the current directory");
|
10398 | process.exit(1);
|
10399 | }
|
10400 | else {
|
10401 | var _file = path.join(path.join(process.cwd(), path.dirname(this.configuration.mainData.tsconfig)), path.basename(this.configuration.mainData.tsconfig));
|
10402 | // use the current directory of tsconfig.json as a working directory
|
10403 | cwd$1 = _file
|
10404 | .split(path.sep)
|
10405 | .slice(0, -1)
|
10406 | .join(path.sep);
|
10407 | logger.info('Using tsconfig file ', _file);
|
10408 | var tsConfigFile = readConfig(_file);
|
10409 | scannedFiles = tsConfigFile.files;
|
10410 | if (scannedFiles) {
|
10411 | scannedFiles = handlePath(scannedFiles, cwd$1);
|
10412 | }
|
10413 | if (typeof scannedFiles === 'undefined') {
|
10414 | excludeFiles = tsConfigFile.exclude || [];
|
10415 | includeFiles = tsConfigFile.include || [];
|
10416 | scannedFiles = [];
|
10417 | var excludeParser_1 = new ParserUtil(), includeParser_1 = new ParserUtil();
|
10418 | excludeParser_1.init(excludeFiles, cwd$1);
|
10419 | includeParser_1.init(includeFiles, cwd$1);
|
10420 | var startCwd = cwd$1;
|
10421 | var excludeParserTestFilesWithCwdDepth = excludeParser_1.testFilesWithCwdDepth();
|
10422 | if (!excludeParserTestFilesWithCwdDepth.status) {
|
10423 | startCwd = excludeParser_1.updateCwd(cwd$1, excludeParserTestFilesWithCwdDepth.level);
|
10424 | }
|
10425 | var includeParserTestFilesWithCwdDepth = includeParser_1.testFilesWithCwdDepth();
|
10426 | if (!includeParser_1.testFilesWithCwdDepth().status) {
|
10427 | startCwd = includeParser_1.updateCwd(cwd$1, includeParserTestFilesWithCwdDepth.level);
|
10428 | }
|
10429 | var finder = require('findit2')(startCwd || '.');
|
10430 | finder.on('directory', function (dir, stat, stop) {
|
10431 | var base = path.basename(dir);
|
10432 | if (base === '.git' || base === 'node_modules') {
|
10433 | stop();
|
10434 | }
|
10435 | });
|
10436 | finder.on('file', function (file, stat) {
|
10437 | if (/(spec|\.d)\.ts/.test(file)) {
|
10438 | logger.warn('Ignoring', file);
|
10439 | }
|
10440 | else if (excludeParser_1.testFile(file) &&
|
10441 | path.extname(file) === '.ts') {
|
10442 | logger.warn('Excluding', file);
|
10443 | }
|
10444 | else if (includeFiles.length > 0) {
|
10445 | /**
|
10446 | * If include provided in tsconfig, use only this source,
|
10447 | * and not files found with global findit scan in working directory
|
10448 | */
|
10449 | if (path.extname(file) === '.ts' && includeParser_1.testFile(file)) {
|
10450 | logger.debug('Including', file);
|
10451 | scannedFiles.push(file);
|
10452 | }
|
10453 | else {
|
10454 | if (path.extname(file) === '.ts') {
|
10455 | logger.warn('Excluding', file);
|
10456 | }
|
10457 | }
|
10458 | }
|
10459 | else {
|
10460 | logger.debug('Including', file);
|
10461 | scannedFiles.push(file);
|
10462 | }
|
10463 | });
|
10464 | finder.on('end', function () {
|
10465 | _super.prototype.setFiles.call(_this, scannedFiles);
|
10466 | if (program.coverageTest || program.coverageTestPerFile) {
|
10467 | logger.info('Run documentation coverage test');
|
10468 | _super.prototype.testCoverage.call(_this);
|
10469 | }
|
10470 | else {
|
10471 | _super.prototype.generate.call(_this);
|
10472 | }
|
10473 | });
|
10474 | }
|
10475 | else {
|
10476 | _super.prototype.setFiles.call(this, scannedFiles);
|
10477 | if (program.coverageTest || program.coverageTestPerFile) {
|
10478 | logger.info('Run documentation coverage test');
|
10479 | _super.prototype.testCoverage.call(this);
|
10480 | }
|
10481 | else {
|
10482 | _super.prototype.generate.call(this);
|
10483 | }
|
10484 | }
|
10485 | }
|
10486 | }
|
10487 | else if (this.configuration.mainData.tsconfig && program.args.length > 0) {
|
10488 | /**
|
10489 | * tsconfig file provided with source folder in arg
|
10490 | */
|
10491 | var testTsConfigPath = this.configuration.mainData.tsconfig.indexOf(process.cwd());
|
10492 | if (testTsConfigPath !== -1) {
|
10493 | this.configuration.mainData.tsconfig = this.configuration.mainData.tsconfig.replace(process.cwd() + path.sep, '');
|
10494 | }
|
10495 | var sourceFolder = program.args[0];
|
10496 | if (!this.fileEngine.existsSync(sourceFolder)) {
|
10497 | logger.error("Provided source folder " + sourceFolder + " was not found in the current directory");
|
10498 | process.exit(1);
|
10499 | }
|
10500 | else {
|
10501 | logger.info('Using provided source folder');
|
10502 | if (!this.fileEngine.existsSync(this.configuration.mainData.tsconfig)) {
|
10503 | logger.error("\"" + this.configuration.mainData.tsconfig + "\" file was not found in the current directory");
|
10504 | process.exit(1);
|
10505 | }
|
10506 | else {
|
10507 | var _file = path.join(path.join(process.cwd(), path.dirname(this.configuration.mainData.tsconfig)), path.basename(this.configuration.mainData.tsconfig));
|
10508 | // use the current directory of tsconfig.json as a working directory
|
10509 | cwd$1 = _file
|
10510 | .split(path.sep)
|
10511 | .slice(0, -1)
|
10512 | .join(path.sep);
|
10513 | logger.info('Using tsconfig file ', _file);
|
10514 | var tsConfigFile = readConfig(_file);
|
10515 | scannedFiles = tsConfigFile.files;
|
10516 | if (scannedFiles) {
|
10517 | scannedFiles = handlePath(scannedFiles, cwd$1);
|
10518 | }
|
10519 | if (typeof scannedFiles === 'undefined') {
|
10520 | excludeFiles = tsConfigFile.exclude || [];
|
10521 | includeFiles = tsConfigFile.include || [];
|
10522 | scannedFiles = [];
|
10523 | var excludeParser_2 = new ParserUtil(), includeParser_2 = new ParserUtil();
|
10524 | excludeParser_2.init(excludeFiles, cwd$1);
|
10525 | includeParser_2.init(includeFiles, cwd$1);
|
10526 | var startCwd = sourceFolder;
|
10527 | var excludeParserTestFilesWithCwdDepth = excludeParser_2.testFilesWithCwdDepth();
|
10528 | if (!excludeParserTestFilesWithCwdDepth.status) {
|
10529 | startCwd = excludeParser_2.updateCwd(cwd$1, excludeParserTestFilesWithCwdDepth.level);
|
10530 | }
|
10531 | var includeParserTestFilesWithCwdDepth = includeParser_2.testFilesWithCwdDepth();
|
10532 | if (!includeParser_2.testFilesWithCwdDepth().status) {
|
10533 | startCwd = includeParser_2.updateCwd(cwd$1, includeParserTestFilesWithCwdDepth.level);
|
10534 | }
|
10535 | var finder = require('findit2')(path.resolve(startCwd));
|
10536 | finder.on('directory', function (dir, stat, stop) {
|
10537 | var base = path.basename(dir);
|
10538 | if (base === '.git' || base === 'node_modules') {
|
10539 | stop();
|
10540 | }
|
10541 | });
|
10542 | finder.on('file', function (file, stat) {
|
10543 | if (/(spec|\.d)\.ts/.test(file)) {
|
10544 | logger.warn('Ignoring', file);
|
10545 | }
|
10546 | else if (excludeParser_2.testFile(file)) {
|
10547 | logger.warn('Excluding', file);
|
10548 | }
|
10549 | else if (includeFiles.length > 0) {
|
10550 | /**
|
10551 | * If include provided in tsconfig, use only this source,
|
10552 | * and not files found with global findit scan in working directory
|
10553 | */
|
10554 | if (path.extname(file) === '.ts' &&
|
10555 | includeParser_2.testFile(file)) {
|
10556 | logger.debug('Including', file);
|
10557 | scannedFiles.push(file);
|
10558 | }
|
10559 | else {
|
10560 | if (path.extname(file) === '.ts') {
|
10561 | logger.warn('Excluding', file);
|
10562 | }
|
10563 | }
|
10564 | }
|
10565 | else {
|
10566 | logger.debug('Including', file);
|
10567 | scannedFiles.push(file);
|
10568 | }
|
10569 | });
|
10570 | finder.on('end', function () {
|
10571 | _super.prototype.setFiles.call(_this, scannedFiles);
|
10572 | if (program.coverageTest || program.coverageTestPerFile) {
|
10573 | logger.info('Run documentation coverage test');
|
10574 | _super.prototype.testCoverage.call(_this);
|
10575 | }
|
10576 | else {
|
10577 | _super.prototype.generate.call(_this);
|
10578 | }
|
10579 | });
|
10580 | }
|
10581 | else {
|
10582 | _super.prototype.setFiles.call(this, scannedFiles);
|
10583 | if (program.coverageTest || program.coverageTestPerFile) {
|
10584 | logger.info('Run documentation coverage test');
|
10585 | _super.prototype.testCoverage.call(this);
|
10586 | }
|
10587 | else {
|
10588 | _super.prototype.generate.call(this);
|
10589 | }
|
10590 | }
|
10591 | }
|
10592 | }
|
10593 | }
|
10594 | else {
|
10595 | logger.error('tsconfig.json file was not found, please use -p flag');
|
10596 | outputHelp();
|
10597 | }
|
10598 | }
|
10599 | };
|
10600 | return CliApplication;
|
10601 | }(Application));
|
10602 |
|
10603 | exports.Application = Application;
|
10604 | exports.CliApplication = CliApplication;
|
10605 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9jb21wYXJlLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL29yLmhlbHBlci50cyIsIi4uL3NyYy91dGlscy9hbmd1bGFyLWFwaS51dGlsLnRzIiwiLi4vc3JjL3V0aWxzL2FuZ3VsYXItdmVyc2lvbi51dGlsLnRzIiwiLi4vc3JjL3V0aWxzL2Jhc2ljLXR5cGUudXRpbC50cyIsIi4uL3NyYy91dGlscy9qc2RvYy1wYXJzZXIudXRpbC50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9maWxlLmVuZ2luZS50cyIsIi4uL3NyYy91dGlscy9pbXBvcnRzLnV0aWwudHMiLCIuLi9zcmMvdXRpbHMvcm91dGVyLXBhcnNlci51dGlsLnRzIiwiLi4vc3JjL3V0aWxzL2lzLW1vZHVsZS13aXRoLXByb3ZpZGVycy50cyIsIi4uL3NyYy91dGlscy9nZXQtbW9kdWxlLXdpdGgtcHJvdmlkZXJzLnRzIiwiLi4vc3JjL3V0aWxzL3VuaXFpZC50cyIsIi4uL3NyYy91dGlscy9saW5rLXBhcnNlci50cyIsIi4uL3NyYy91dGlscy9hbmd1bGFyLWxpZmVjeWNsZXMtaG9va3MudHMiLCIuLi9zcmMvdXRpbHMva2luZC10by10eXBlLnRzIiwiLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvZnVuY3Rpb24tc2lnbmF0dXJlLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2lzLW5vdC10b2dnbGUuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvaXMtaW5pdGlhbC10YWIuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvaXMtdGFiLWVuYWJsZWQuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvaWYtc3RyaW5nLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL29yLWxlbmd0aC5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9maWx0ZXItYW5ndWxhcjItbW9kdWxlcy5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9kZWJ1Zy5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9icmVhay1saW5lcy5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9jbGVhbi1wYXJhZ3JhcGguaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvZXNjYXBlLXNpbXBsZS1xdW90ZS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9icmVhay1jb21tYS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9tb2RpZi1raW5kLWhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL21vZGlmLWljb24uaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvcmVsYXRpdmUtdXJsLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLXJldHVybnMtY29tbWVudC5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1jb2RlLWV4YW1wbGUuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvanNkb2MtZXhhbXBsZS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1wYXJhbXMuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvanNkb2MtcGFyYW1zLXZhbGlkLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLWRlZmF1bHQuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvbGluay10eXBlLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2luZGV4YWJsZS1zaWduYXR1cmUuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvb2JqZWN0LmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL29iamVjdC1sZW5ndGguaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvcGFyc2UtZGVzY3JpcHRpb24uaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvb25lLXBhcmFtZXRlci1oYXMuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvZWxlbWVudC1hbG9uZS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9oYXMtb3duLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL3Nob3J0LXVybC5oZWxwZXIudHMiLCIuLi9zcmMvbG9jYWxlcy9lbi1VUy50cyIsIi4uL3NyYy9sb2NhbGVzL2ZyLUZSLnRzIiwiLi4vc3JjL2xvY2FsZXMvemgtQ04udHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaTE4bi5lbmdpbmUudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9pMThuLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLmVuZ2luZS5oZWxwZXJzLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwuZW5naW5lLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL21hcmtkb3duLmVuZ2luZS50cyIsIi4uL3NyYy91dGlscy9kZWZhdWx0cy50cyIsIi4uL3NyYy9hcHAvY29uZmlndXJhdGlvbi50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9uZ2QuZW5naW5lLnRzIiwiLi4vc3JjL3V0aWxzL2NvbnN0YW50cy50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9zZWFyY2guZW5naW5lLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2V4cG9ydC1qc29uLmVuZ2luZS50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9leHBvcnQuZW5naW5lLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2NvbXBvbmVudHMtdHJlZS5lbmdpbmUudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL2NsYXNzLWhlbHBlci50cyIsIi4uL3NyYy91dGlscy90cy1wcmludGVyLnV0aWwudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL3N5bWJvbC1oZWxwZXIudHMiLCIuLi9zcmMvdXRpbGl0aWVzLnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2RlcHMvaGVscGVycy9jb21wb25lbnQtaGVscGVyLnRzIiwiLi4vc3JjL3V0aWxzL2V4dGVuZHMtbWVyZ2VyLnV0aWwudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2ZyYW1ld29yay1kZXBlbmRlbmNpZXMudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvY29kZS1nZW5lcmF0b3IudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9kaXJlY3RpdmUtZGVwLmZhY3RvcnkudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9tb2R1bGUtZGVwLmZhY3RvcnkudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9jb21wb25lbnQtZGVwLmZhY3RvcnkudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9jb250cm9sbGVyLWRlcC5mYWN0b3J5LnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2RlcHMvaGVscGVycy9tb2R1bGUtaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2RlcHMvaGVscGVycy9qcy1kb2MtaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyLWRlcGVuZGVuY2llcy50cyIsIi4uL3NyYy9hcHAvY29tcGlsZXIvYW5ndWxhcmpzLWRlcGVuZGVuY2llcy50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlLXNlcXVlbnRpYWwudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvZGVwZW5kZW5jaWVzLmVuZ2luZS50cyIsIi4uL3NyYy9hcHAvYXBwbGljYXRpb24udHMiLCIuLi9zcmMvdXRpbHMvcGFyc2VyLnV0aWwuY2xhc3MudHMiLCIuLi9zcmMvaW5kZXgtY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImxldCBsb2cgPSByZXF1aXJlKCdmYW5jeS1sb2cnKTtcbmxldCBjID0gcmVxdWlyZSgnY2hhbGsnKTtcbmxldCBwa2cgPSByZXF1aXJlKCcuLi9wYWNrYWdlLmpzb24nKTtcblxuZW51bSBMRVZFTCB7XG5cdElORk8sXG5cdERFQlVHLFxuXHRFUlJPUixcblx0V0FSTlxufVxuXG5jbGFzcyBMb2dnZXIge1xuXG5cdHB1YmxpYyBuYW1lO1xuXHRwdWJsaWMgbG9nZ2VyO1xuXHRwdWJsaWMgdmVyc2lvbjtcblx0cHVibGljIHNpbGVudDtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLm5hbWUgPSBwa2cubmFtZTtcblx0XHR0aGlzLnZlcnNpb24gPSBwa2cudmVyc2lvbjtcblx0XHR0aGlzLmxvZ2dlciA9IGxvZztcblx0XHR0aGlzLnNpbGVudCA9IHRydWU7XG5cdH1cblxuXHRwdWJsaWMgaW5mbyguLi5hcmdzKSB7XG5cdFx0aWYgKCF0aGlzLnNpbGVudCkgeyByZXR1cm47IH1cblx0XHR0aGlzLmxvZ2dlcihcblx0XHRcdHRoaXMuZm9ybWF0KExFVkVMLklORk8sIC4uLmFyZ3MpXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBlcnJvciguLi5hcmdzKSB7XG5cdFx0aWYgKCF0aGlzLnNpbGVudCkgeyByZXR1cm47IH1cblx0XHR0aGlzLmxvZ2dlcihcblx0XHRcdHRoaXMuZm9ybWF0KExFVkVMLkVSUk9SLCAuLi5hcmdzKVxuICAgICAgICApO1xuXHR9XG5cblx0cHVibGljIHdhcm4oLi4uYXJncykge1xuXHRcdGlmICghdGhpcy5zaWxlbnQpIHsgcmV0dXJuOyB9XG5cdFx0dGhpcy5sb2dnZXIoXG5cdFx0XHR0aGlzLmZvcm1hdChMRVZFTC5XQVJOLCAuLi5hcmdzKVxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZGVidWcoLi4uYXJncykge1xuXHRcdGlmICghdGhpcy5zaWxlbnQpIHsgcmV0dXJuOyB9XG5cdFx0dGhpcy5sb2dnZXIoXG5cdFx0XHR0aGlzLmZvcm1hdChMRVZFTC5ERUJVRywgLi4uYXJncylcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBmb3JtYXQobGV2ZWwsIC4uLmFyZ3MpIHtcblxuXHRcdGxldCBwYWQgPSAocywgbCwgeiA9ICcnKSA9PiB7XG5cdFx0XHRyZXR1cm4gcyArIEFycmF5KE1hdGgubWF4KDAsIGwgLSBzLmxlbmd0aCArIDEpKS5qb2luKHopO1xuXHRcdH07XG5cblx0XHRsZXQgbXNnID0gYXJncy5qb2luKCcgJyk7XG5cdFx0aWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuXHRcdFx0bXNnID0gYCR7cGFkKGFyZ3Muc2hpZnQoKSwgMTUsICcgJyl9OiAke2FyZ3Muam9pbignICcpfWA7XG5cdFx0fVxuXG5cblx0XHRzd2l0Y2ggKGxldmVsKSB7XG5cdFx0XHRjYXNlIExFVkVMLklORk86XG5cdFx0XHRcdG1zZyA9IGMuZ3JlZW4obXNnKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgTEVWRUwuREVCVUc6XG5cdFx0XHRcdG1zZyA9IGMuY3lhbihtc2cpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBMRVZFTC5XQVJOOlxuXHRcdFx0XHRtc2cgPSBjLnllbGxvdyhtc2cpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBMRVZFTC5FUlJPUjpcblx0XHRcdFx0bXNnID0gYy5yZWQobXNnKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFtcblx0XHRcdG1zZ1xuXHRcdF0uam9pbignJyk7XG5cdH1cbn1cblxuZXhwb3J0IGxldCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIENvbXBhcmVIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBhOiBhbnksIG9wZXJhdG9yOiBzdHJpbmcsIGI6IGFueSwgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCA0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hhbmRsZWJhcnMgSGVscGVyIHt7Y29tcGFyZX19IGV4cGVjdHMgNCBhcmd1bWVudHMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgICAgIGNhc2UgJ2luZGV4b2YnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IChiLmluZGV4T2YoYSkgIT09IC0xKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJz09PSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYSA9PT0gYjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJyE9PSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYSAhPT0gYjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGEgPiBiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaGVscGVyIHt7Y29tcGFyZX19OiBpbnZhbGlkIG9wZXJhdG9yOiBgJyArIG9wZXJhdG9yICsgJ2AnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIE9ySGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgLyogYW55LCBhbnksIC4uLiwgb3B0aW9ucyAqLykge1xuICAgICAgICBsZXQgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICAgIGxldCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMgPSBhcmd1bWVudHNbbGVuXTtcblxuICAgICAgICAvLyBXZSBzdGFydCBhdCAxIGJlY2F1c2Ugb2Ygb3B0aW9uc1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgIH1cbn0iLCJpbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBJQXBpU291cmNlUmVzdWx0IH0gZnJvbSAnLi9hcGktc291cmNlLXJlc3VsdC5pbnRlcmZhY2UnO1xuXG5jb25zdCBBbmd1bGFyQVBJczogQXJyYXk8SUFuZ3VsYXJNYWluQXBpPiA9IHJlcXVpcmUoJy4uL3NyYy9kYXRhL2FwaS1saXN0Lmpzb24nKTtcblxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJBcGlVdGlsIHtcbiAgICBwdWJsaWMgZmluZEFwaSh0eXBlOiBzdHJpbmcpOiBJQXBpU291cmNlUmVzdWx0PElBbmd1bGFyTWFpbkFwaT4ge1xuICAgICAgICBsZXQgZm91bmRlZEFwaTtcbiAgICAgICAgXy5mb3JFYWNoKEFuZ3VsYXJBUElzLCBtYWluQXBpID0+IHtcbiAgICAgICAgICAgIF8uZm9yRWFjaChtYWluQXBpLml0ZW1zLCBhcGkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhcGkudGl0bGUgPT09IHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmRlZEFwaSA9IGFwaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzb3VyY2U6ICdleHRlcm5hbCcsXG4gICAgICAgICAgICBkYXRhOiBmb3VuZGVkQXBpXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBbmd1bGFyTWFpbkFwaSB7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgaXRlbXM6IElBbmd1bGFyQXBpW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFuZ3VsYXJBcGkge1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIGRvY1R5cGU6IHN0cmluZztcbiAgICBzdGFiaWxpdHk6IHN0cmluZztcbiAgICBzZWN1cmU6IHN0cmluZztcbiAgICBiYXJyZWw6IHN0cmluZztcbn1cbiIsImltcG9ydCAqIGFzIHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHsgSUFuZ3VsYXJBcGkgfSBmcm9tICcuL2FuZ3VsYXItYXBpLnV0aWwnO1xuXG5cbmV4cG9ydCBjbGFzcyBBbmd1bGFyVmVyc2lvblV0aWwge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENvcmVQYWNrYWdlID0gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4gICAgcHVibGljIGNsZWFuVmVyc2lvbih2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdmVyc2lvbi5yZXBsYWNlKCd+JywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgnXicsICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoJz0nLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKCc8JywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgnPicsICcnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QW5ndWxhclZlcnNpb25PZlByb2plY3QocGFja2FnZURhdGEpOiBzdHJpbmcge1xuICAgICAgICBsZXQgX3Jlc3VsdCA9ICcnO1xuXG4gICAgICAgIGlmIChwYWNrYWdlRGF0YS5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgIGxldCBhbmd1bGFyQ29yZSA9IHBhY2thZ2VEYXRhLmRlcGVuZGVuY2llc1tBbmd1bGFyVmVyc2lvblV0aWwuQ29yZVBhY2thZ2VdO1xuICAgICAgICAgICAgaWYgKGFuZ3VsYXJDb3JlKSB7XG4gICAgICAgICAgICAgICAgX3Jlc3VsdCA9IHRoaXMuY2xlYW5WZXJzaW9uKGFuZ3VsYXJDb3JlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNBbmd1bGFyVmVyc2lvbkFyY2hpdmVkKHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzdWx0O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSBzZW12ZXIuY29tcGFyZSh2ZXJzaW9uLCAnMi40LjEwJykgPD0gMDtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlZml4T2ZmaWNpYWxEb2ModmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNBbmd1bGFyVmVyc2lvbkFyY2hpdmVkKHZlcnNpb24pID8gJ3YyLicgOiAnJztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QXBpTGluayhhcGk6IElBbmd1bGFyQXBpLCBhbmd1bGFyVmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGFuZ3VsYXJEb2NQcmVmaXggPSB0aGlzLnByZWZpeE9mZmljaWFsRG9jKGFuZ3VsYXJWZXJzaW9uKTtcbiAgICAgICAgcmV0dXJuIGBodHRwczovLyR7YW5ndWxhckRvY1ByZWZpeH1hbmd1bGFyLmlvLyR7YXBpLnBhdGh9YDtcbiAgICB9XG59XG4iLCJlbnVtIEJhc2ljVHlwZXMge1xuICAgIG51bWJlcixcbiAgICBib29sZWFuLFxuICAgIHN0cmluZyxcbiAgICBvYmplY3QsXG4gICAgZGF0ZSxcbiAgICBmdW5jdGlvblxufVxuXG5lbnVtIEJhc2ljVHlwZVNjcmlwdFR5cGVzIHtcbiAgICBhbnksXG4gICAgdm9pZFxufVxuXG5leHBvcnQgY2xhc3MgQmFzaWNUeXBlVXRpbCB7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBnaXZlbiB0eXBlcyBpcyBhIGJhc2ljIGphdmFzY3JpcHQgdHlwZVxuICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgdG8gY2hlY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNKYXZhc2NyaXB0VHlwZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuICh0eXBlLnRvTG93ZXJDYXNlKCkgaW4gQmFzaWNUeXBlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBnaXZlbiB0eXBlIGlzIGEgdHlwZXNjcmlwdCB0eXBlIChUaGF0IGlzIG5vdCBhIGphdmFzY3JpcHQgdHlwZSlcbiAgICAgKiBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9iYXNpYy10eXBlcy5odG1sXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgdG8gY2hlY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNUeXBlU2NyaXB0VHlwZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuICh0eXBlLnRvTG93ZXJDYXNlKCkgaW4gQmFzaWNUeXBlU2NyaXB0VHlwZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIHR5cGUgaXMgYSB0eXBlc2NyaXB0IG9yIGphdmFzY3JpcHQgdHlwZVxuICAgICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIHRvIGNoZWNrXG4gICAgICovXG4gICAgcHVibGljIGlzS25vd25UeXBlKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0phdmFzY3JpcHRUeXBlKHR5cGUpIHx8IHRoaXMuaXNUeXBlU2NyaXB0VHlwZSh0eXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgb2ZmaWNpYWwgZG9jdW1lbnRhdGlvbiBsaW5rIHRvIGVpdGhlciB0aGUgamF2YXNjcmlwdCBvciB0eXBlc2NyaXB0IHR5cGVcbiAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIFRoZSBkb2N1bWVudGF0aW9uIGxpbmsgb3IgdW5kZWZpbmVkIGlmIHR5cGUgbm90IGZvdW5kXG4gICAgICovXG4gICAgcHVibGljIGdldFR5cGVVcmwodHlwZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNKYXZhc2NyaXB0VHlwZSh0eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy8ke3R5cGV9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzVHlwZVNjcmlwdFR5cGUodHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svYmFzaWMtdHlwZXMuaHRtbGA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IHRzLCBTeW50YXhLaW5kIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IEpTRG9jUGFyYW1ldGVyVGFnRXh0IH0gZnJvbSAnLi4vYXBwL25vZGVzL2pzZG9jLXBhcmFtZXRlci10YWcubm9kZSc7XG5cbmV4cG9ydCBjbGFzcyBKc2RvY1BhcnNlclV0aWwge1xuICAgIHB1YmxpYyBpc1ZhcmlhYmxlTGlrZShub2RlOiB0cy5Ob2RlKTogbm9kZSBpcyB0cy5WYXJpYWJsZUxpa2VEZWNsYXJhdGlvbiB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKG5vZGUua2luZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5CaW5kaW5nRWxlbWVudDpcbiAgICAgICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuRW51bU1lbWJlcjpcbiAgICAgICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuUGFyYW1ldGVyOlxuICAgICAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5Qcm9wZXJ0eUFzc2lnbm1lbnQ6XG4gICAgICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByb3BlcnR5RGVjbGFyYXRpb246XG4gICAgICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByb3BlcnR5U2lnbmF0dXJlOlxuICAgICAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5TaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQ6XG4gICAgICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlZhcmlhYmxlRGVjbGFyYXRpb246XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TWFpbkNvbW1lbnRPZk5vZGUobm9kZTogdHMuTm9kZSk6IHN0cmluZyB7XG4gICAgICAgIGxldCBkZXNjcmlwdGlvbjogc3RyaW5nID0gJyc7XG4gICAgICAgIGlmIChub2RlLmpzRG9jKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5qc0RvYy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBub2RlLmpzRG9jWzBdLmNvbW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbm9kZS5qc0RvY1swXS5jb21tZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRKU0RvY1RhZ3Mobm9kZTogdHMuTm9kZSwga2luZDogU3ludGF4S2luZCk6IHRzLkpTRG9jVGFnW10ge1xuICAgICAgICBjb25zdCBkb2NzID0gdGhpcy5nZXRKU0RvY3Mobm9kZSk7XG4gICAgICAgIGlmIChkb2NzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IHRzLkpTRG9jVGFnW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZG9jIG9mIGRvY3MpIHtcbiAgICAgICAgICAgICAgICBpZiAodHMuaXNKU0RvY1BhcmFtZXRlclRhZyhkb2MpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb2Mua2luZCA9PT0ga2luZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZG9jKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHMuaXNKU0RvYyhkb2MpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLl8uZmlsdGVyKGRvYy50YWdzLCB0YWcgPT4gdGFnLmtpbmQgPT09IGtpbmQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgdHlwZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SlNEb2NzKG5vZGU6IHRzLk5vZGUpOiBSZWFkb25seUFycmF5PHRzLkpTRG9jIHwgdHMuSlNEb2NUYWc+IHtcbiAgICAgICAgLy8gVE9ETzoganNEb2NDYWNoZSBpcyBpbnRlcm5hbCwgc2VlIGlmIHRoZXJlJ3MgYSB3YXkgYXJvdW5kIGl0XG4gICAgICAgIGxldCBjYWNoZTogUmVhZG9ubHlBcnJheTx0cy5KU0RvYyB8IHRzLkpTRG9jVGFnPiA9IChub2RlIGFzIGFueSkuanNEb2NDYWNoZTtcbiAgICAgICAgaWYgKCFjYWNoZSkge1xuICAgICAgICAgICAgY2FjaGUgPSB0aGlzLmdldEpTRG9jc1dvcmtlcihub2RlLCBbXSkuZmlsdGVyKHggPT4geCk7XG4gICAgICAgICAgICAobm9kZSBhcyBhbnkpLmpzRG9jQ2FjaGUgPSBjYWNoZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FjaGU7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIHJlY29nbml6ZSB0aGlzIHBhdHRlcm4gd2hlbiBub2RlIGlzIGluaXRpYWxpemVyXG4gICAgLy8gb2YgdmFyaWFibGUgZGVjbGFyYXRpb24gYW5kIEpTRG9jIGNvbW1lbnRzIGFyZSBvbiBjb250YWluaW5nIHZhcmlhYmxlIHN0YXRlbWVudC5cbiAgICAvLyAvKipcbiAgICAvLyAgICogQHBhcmFtIHtudW1iZXJ9IG5hbWVcbiAgICAvLyAgICogQHJldHVybnMge251bWJlcn1cbiAgICAvLyAgICovXG4gICAgLy8gdmFyIHggPSBmdW5jdGlvbihuYW1lKSB7IHJldHVybiBuYW1lLmxlbmd0aDsgfVxuICAgIHByaXZhdGUgZ2V0SlNEb2NzV29ya2VyKG5vZGU6IHRzLk5vZGUsIGNhY2hlKTogUmVhZG9ubHlBcnJheTxhbnk+IHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XG4gICAgICAgIGNvbnN0IGlzSW5pdGlhbGl6ZXJPZlZhcmlhYmxlRGVjbGFyYXRpb25JblN0YXRlbWVudCA9XG4gICAgICAgICAgICB0aGlzLmlzVmFyaWFibGVMaWtlKHBhcmVudCkgJiZcbiAgICAgICAgICAgIHBhcmVudC5pbml0aWFsaXplciA9PT0gbm9kZSAmJlxuICAgICAgICAgICAgdHMuaXNWYXJpYWJsZVN0YXRlbWVudChwYXJlbnQucGFyZW50LnBhcmVudCk7XG4gICAgICAgIGNvbnN0IGlzVmFyaWFibGVPZlZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPVxuICAgICAgICAgICAgdGhpcy5pc1ZhcmlhYmxlTGlrZShub2RlKSAmJiB0cy5pc1ZhcmlhYmxlU3RhdGVtZW50KHBhcmVudC5wYXJlbnQpO1xuICAgICAgICBjb25zdCB2YXJpYWJsZVN0YXRlbWVudE5vZGUgPSBpc0luaXRpYWxpemVyT2ZWYXJpYWJsZURlY2xhcmF0aW9uSW5TdGF0ZW1lbnRcbiAgICAgICAgICAgID8gcGFyZW50LnBhcmVudC5wYXJlbnRcbiAgICAgICAgICAgIDogaXNWYXJpYWJsZU9mVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudFxuICAgICAgICAgICAgICAgID8gcGFyZW50LnBhcmVudFxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAodmFyaWFibGVTdGF0ZW1lbnROb2RlKSB7XG4gICAgICAgICAgICBjYWNoZSA9IHRoaXMuZ2V0SlNEb2NzV29ya2VyKHZhcmlhYmxlU3RhdGVtZW50Tm9kZSwgY2FjaGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxzbyByZWNvZ25pemUgd2hlbiB0aGUgbm9kZSBpcyB0aGUgUkhTIG9mIGFuIGFzc2lnbm1lbnQgZXhwcmVzc2lvblxuICAgICAgICBjb25zdCBpc1NvdXJjZU9mQXNzaWdubWVudEV4cHJlc3Npb25TdGF0ZW1lbnQgPVxuICAgICAgICAgICAgcGFyZW50ICYmXG4gICAgICAgICAgICBwYXJlbnQucGFyZW50ICYmXG4gICAgICAgICAgICB0cy5pc0JpbmFyeUV4cHJlc3Npb24ocGFyZW50KSAmJlxuICAgICAgICAgICAgcGFyZW50Lm9wZXJhdG9yVG9rZW4ua2luZCA9PT0gU3ludGF4S2luZC5FcXVhbHNUb2tlbiAmJlxuICAgICAgICAgICAgdHMuaXNFeHByZXNzaW9uU3RhdGVtZW50KHBhcmVudC5wYXJlbnQpO1xuICAgICAgICBpZiAoaXNTb3VyY2VPZkFzc2lnbm1lbnRFeHByZXNzaW9uU3RhdGVtZW50KSB7XG4gICAgICAgICAgICBjYWNoZSA9IHRoaXMuZ2V0SlNEb2NzV29ya2VyKHBhcmVudC5wYXJlbnQsIGNhY2hlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzTW9kdWxlRGVjbGFyYXRpb24gPVxuICAgICAgICAgICAgdHMuaXNNb2R1bGVEZWNsYXJhdGlvbihub2RlKSAmJiBwYXJlbnQgJiYgdHMuaXNNb2R1bGVEZWNsYXJhdGlvbihwYXJlbnQpO1xuICAgICAgICBjb25zdCBpc1Byb3BlcnR5QXNzaWdubWVudEV4cHJlc3Npb24gPSBwYXJlbnQgJiYgdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocGFyZW50KTtcbiAgICAgICAgaWYgKGlzTW9kdWxlRGVjbGFyYXRpb24gfHwgaXNQcm9wZXJ0eUFzc2lnbm1lbnRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBjYWNoZSA9IHRoaXMuZ2V0SlNEb2NzV29ya2VyKHBhcmVudCwgY2FjaGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHVsbCBwYXJhbWV0ZXIgY29tbWVudHMgZnJvbSBkZWNsYXJpbmcgZnVuY3Rpb24gYXMgd2VsbFxuICAgICAgICBpZiAodHMuaXNQYXJhbWV0ZXIobm9kZSkpIHtcbiAgICAgICAgICAgIGNhY2hlID0gXy5jb25jYXQoY2FjaGUsIHRoaXMuZ2V0SlNEb2NQYXJhbWV0ZXJUYWdzKG5vZGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzVmFyaWFibGVMaWtlKG5vZGUpICYmIG5vZGUuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgIGNhY2hlID0gXy5jb25jYXQoY2FjaGUsIG5vZGUuaW5pdGlhbGl6ZXIuanNEb2MpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FjaGUgPSBfLmNvbmNhdChjYWNoZSwgbm9kZS5qc0RvYyk7XG5cbiAgICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0SlNEb2NQYXJhbWV0ZXJUYWdzKFxuICAgICAgICBwYXJhbTogdHMuUGFyYW1ldGVyRGVjbGFyYXRpb25cbiAgICApOiBSZWFkb25seUFycmF5PHRzLkpTRG9jUGFyYW1ldGVyVGFnPiB7XG4gICAgICAgIGNvbnN0IGZ1bmMgPSBwYXJhbS5wYXJlbnQgYXMgdHMuRnVuY3Rpb25MaWtlRGVjbGFyYXRpb247XG4gICAgICAgIGNvbnN0IHRhZ3MgPSB0aGlzLmdldEpTRG9jVGFncyhcbiAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICBTeW50YXhLaW5kLkpTRG9jUGFyYW1ldGVyVGFnXG4gICAgICAgICkgYXMgdHMuSlNEb2NQYXJhbWV0ZXJUYWdbXTtcblxuICAgICAgICBpZiAoIXBhcmFtLm5hbWUpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgYW4gYW5vbnltb3VzIGpzZG9jIHBhcmFtIGZyb20gYSBgZnVuY3Rpb24odHlwZTEsIHR5cGUyKTogdHlwZTNgIHNwZWNpZmljYXRpb25cbiAgICAgICAgICAgIGNvbnN0IGkgPSBmdW5jLnBhcmFtZXRlcnMuaW5kZXhPZihwYXJhbSk7XG4gICAgICAgICAgICBjb25zdCBwYXJhbVRhZ3MgPSBfLmZpbHRlcih0YWdzLCB0YWcgPT4gdHMuaXNKU0RvY1BhcmFtZXRlclRhZyh0YWcpKTtcblxuICAgICAgICAgICAgaWYgKHBhcmFtVGFncyAmJiAwIDw9IGkgJiYgaSA8IHBhcmFtVGFncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3BhcmFtVGFnc1tpXV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHMuaXNJZGVudGlmaWVyKHBhcmFtLm5hbWUpKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gcGFyYW0ubmFtZS50ZXh0O1xuICAgICAgICAgICAgcmV0dXJuIF8uZmlsdGVyKHRhZ3MsIHRhZyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRzICYmIHRzLmlzSlNEb2NQYXJhbWV0ZXJUYWcodGFnKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdDogSlNEb2NQYXJhbWV0ZXJUYWdFeHQgPSB0YWc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdC5wYXJhbWV0ZXJOYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucGFyYW1ldGVyTmFtZS50ZXh0ID09PSBuYW1lO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0Lm5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQubmFtZS5lc2NhcGVkVGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5uYW1lLmVzY2FwZWRUZXh0ID09PSBuYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBpdCdzIGEgZGVzdHJ1Y3R1cmVkIHBhcmFtZXRlciwgc28gaXQgc2hvdWxkIGxvb2sgdXAgYW4gXCJvYmplY3QgdHlwZVwiIHNlcmllcyBvZiBtdWx0aXBsZSBsaW5lc1xuICAgICAgICAgICAgLy8gQnV0IG11bHRpLWxpbmUgb2JqZWN0IHR5cGVzIGFyZW4ndCBzdXBwb3J0ZWQgeWV0IGVpdGhlclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmV4cG9ydCBjbGFzcyBGaWxlRW5naW5lIHtcbiAgICBwdWJsaWMgZ2V0KGZpbGVwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgZnMucmVhZEZpbGUocGF0aC5yZXNvbHZlKGZpbGVwYXRoKSwgJ3V0ZjgnLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0Vycm9yIGR1cmluZyAnICsgZmlsZXBhdGggKyAnIHJlYWQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGUoZmlsZXBhdGg6IHN0cmluZywgY29udGVudHM6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgZnMub3V0cHV0RmlsZShwYXRoLnJlc29sdmUoZmlsZXBhdGgpLCBjb250ZW50cywgZXJyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN5bmMoZmlsZXBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKGZpbGVwYXRoKSwgJ3V0ZjgnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBjaGVja1xuICAgICAqL1xuICAgIHB1YmxpYyBleGlzdHNTeW5jKGZpbGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhmaWxlKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgQXN0LCB7IFByb3BlcnR5RGVjbGFyYXRpb24sIHRzLCBTeW50YXhLaW5kIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5cbmNvbnN0IGFzdCA9IG5ldyBBc3QoKTtcblxuZXhwb3J0IGNsYXNzIEltcG9ydHNVdGlsIHtcbiAgICAvKipcbiAgICAgKiBGaW5kIGZvciBhIHNvdXJjZUZpbGUgYSB2YXJpYWJsZSB2YWx1ZSBpbiBhIGxvY2FsIGVudW1cbiAgICAgKiBAcGFyYW0gc3JjRmlsZVxuICAgICAqIEBwYXJhbSB2YXJpYWJsZU5hbWVcbiAgICAgKiBAcGFyYW0gdmFyaWFibGVWYWx1ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZmluZEluRW51bXMoc3JjRmlsZSwgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IHN0cmluZykge1xuICAgICAgICBsZXQgcmVzID0gJyc7XG4gICAgICAgIHNyY0ZpbGUuZ2V0RW51bShlID0+IHtcbiAgICAgICAgICAgIGlmIChlLmdldE5hbWUoKSA9PT0gdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgZS5nZXRNZW1iZXIobSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtLmdldE5hbWUoKSA9PT0gdmFyaWFibGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gbS5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmQgZm9yIGEgc291cmNlRmlsZSBhIHZhcmlhYmxlIHZhbHVlIGluIGEgbG9jYWwgc3RhdGljIGNsYXNzXG4gICAgICogQHBhcmFtIHNyY0ZpbGVcbiAgICAgKiBAcGFyYW0gdmFyaWFibGVOYW1lXG4gICAgICogQHBhcmFtIHZhcmlhYmxlVmFsdWVcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRJbkNsYXNzZXMoc3JjRmlsZSwgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IHN0cmluZykge1xuICAgICAgICBsZXQgcmVzID0gJyc7XG4gICAgICAgIHNyY0ZpbGUuZ2V0Q2xhc3MoYyA9PiB7XG4gICAgICAgICAgICBsZXQgc3RhdGljUHJvcGVydHk6IFByb3BlcnR5RGVjbGFyYXRpb24gPSBjLmdldFN0YXRpY1Byb3BlcnR5KHZhcmlhYmxlVmFsdWUpO1xuICAgICAgICAgICAgaWYgKHN0YXRpY1Byb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRpY1Byb3BlcnR5LmdldEluaXRpYWxpemVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gc3RhdGljUHJvcGVydHkuZ2V0SW5pdGlhbGl6ZXIoKS5nZXRUZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGEgdmFsdWUgaW4gYSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBsaWtlIGFuIG9iamVjdFxuICAgICAqIEBwYXJhbSB2YXJpYWJsZURlY2xhcmF0aW9uXG4gICAgICogQHBhcmFtIHZhcmlhYmxlc0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRJbk9iamVjdFZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGVEZWNsYXJhdGlvbiwgdmFyaWFibGVzQXR0cmlidXRlcykge1xuICAgICAgICBsZXQgdmFyaWFibGVLaW5kID0gdmFyaWFibGVEZWNsYXJhdGlvbi5nZXRLaW5kKCk7XG4gICAgICAgIGlmICh2YXJpYWJsZUtpbmQgJiYgdmFyaWFibGVLaW5kID09PSBTeW50YXhLaW5kLlZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIGxldCBpbml0aWFsaXplciA9IHZhcmlhYmxlRGVjbGFyYXRpb24uZ2V0SW5pdGlhbGl6ZXIoKTtcbiAgICAgICAgICAgIGlmIChpbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgIGxldCBpbml0aWFsaXplcktpbmQgPSBpbml0aWFsaXplci5nZXRLaW5kKCk7XG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVyS2luZCAmJiBpbml0aWFsaXplcktpbmQgPT09IFN5bnRheEtpbmQuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBpbGVyTm9kZSA9IGluaXRpYWxpemVyLmNvbXBpbGVyTm9kZSBhcyB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgLy8gRmluZCB0aGVzdHJpbmcgZnJvbSBBVkFSLkJWQVIudGhlc3RyaW5nIGluc2lkZSBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgIGxldCBkZXB0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsb29wUHJvcGVydGllcyA9IHByb3BlcnRpZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlc0F0dHJpYnV0ZXNbZGVwdGggKyAxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AubmFtZS5nZXRUZXh0KCkgPT09IHZhcmlhYmxlc0F0dHJpYnV0ZXNbZGVwdGggKyAxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLmluaXRpYWxpemVyLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wUHJvcGVydGllcyhwcm9wLmluaXRpYWxpemVyLnByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxWYWx1ZSA9IHByb3AuaW5pdGlhbGl6ZXIudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUgPSBwcm9wLmluaXRpYWxpemVyLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGxvb3BQcm9wZXJ0aWVzKGNvbXBpbGVyTm9kZS5wcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmFsVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCBpbiBpbXBvcnRzIHNvbWV0aGluZyBsaWtlIG15dmFyXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBpbnB1dFZhcmlhYmxlTmFtZSAgICAgICAgICAgICAgbGlrZSBteXZhclxuICAgICAqIEByZXR1cm4ge1t0eXBlXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15dmFyIHZhbHVlXG4gICAgICovXG4gICAgcHVibGljIGZpbmRWYWx1ZUluSW1wb3J0T3JMb2NhbFZhcmlhYmxlcyhpbnB1dFZhcmlhYmxlTmFtZTogc3RyaW5nLCBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKSB7XG4gICAgICAgIGxldCBtZXRhZGF0YVZhcmlhYmxlTmFtZSA9IGlucHV0VmFyaWFibGVOYW1lLFxuICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQsXG4gICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9ICcnLFxuICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBmaWxlID1cbiAgICAgICAgICAgIHR5cGVvZiBhc3QuZ2V0U291cmNlRmlsZShzb3VyY2VGaWxlLmZpbGVOYW1lKSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/IGFzdC5nZXRTb3VyY2VGaWxlKHNvdXJjZUZpbGUuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgOiBhc3QuYWRkRXhpc3RpbmdTb3VyY2VGaWxlSWZFeGlzdHMoc291cmNlRmlsZS5maWxlTmFtZSk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IGZpbGUuZ2V0SW1wb3J0RGVjbGFyYXRpb25zKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvb3AgdGhyb3VnaCBhbGwgaW1wb3J0cywgYW5kIGZpbmQgb25lIG1hdGNoaW5nIGlucHV0VmFyaWFibGVOYW1lXG4gICAgICAgICAqL1xuICAgICAgICBpbXBvcnRzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBsZXQgbmFtZWRJbXBvcnRzID0gaS5nZXROYW1lZEltcG9ydHMoKSxcbiAgICAgICAgICAgICAgICBuYW1lZEltcG9ydHNMZW5ndGggPSBuYW1lZEltcG9ydHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGogPSAwO1xuXG4gICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoajsgaiA8IG5hbWVkSW1wb3J0c0xlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnROYW1lID0gbmFtZWRJbXBvcnRzW2pdLmdldE5hbWVOb2RlKCkuZ2V0VGV4dCgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNJZGVudGlmaWVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzID0gbmFtZWRJbXBvcnRzW2pdLmdldEFsaWFzSWRlbnRpZmllcigpLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0TmFtZSA9PT0gbWV0YWRhdGFWYXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRBbGlhcyA9PT0gbWV0YWRhdGFWYXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzT3JpZ2luYWxOYW1lID0gaW1wb3J0TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBmdW5jdGlvbiBoYXNGb3VuZFZhbHVlcyh2YXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBsZXQgdmFyaWFibGVLaW5kID0gdmFyaWFibGVEZWNsYXJhdGlvbi5nZXRLaW5kKCk7XG5cbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUtpbmQgJiYgdmFyaWFibGVLaW5kID09PSBTeW50YXhLaW5kLlZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5pdGlhbGl6ZXIgPSB2YXJpYWJsZURlY2xhcmF0aW9uLmdldEluaXRpYWxpemVyKCk7XG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbml0aWFsaXplcktpbmQgPSBpbml0aWFsaXplci5nZXRLaW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVyS2luZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXJLaW5kID09PSBTeW50YXhLaW5kLk9iamVjdExpdGVyYWxFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBpbGVyTm9kZSA9IGluaXRpYWxpemVyLmNvbXBpbGVyTm9kZSBhcyB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21waWxlck5vZGUucHJvcGVydGllcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoZWRJbXBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBsZXQgaW1wb3J0UGF0aFJlZmVyZW5jZSA9IHNlYXJjaGVkSW1wb3J0LmdldE1vZHVsZVNwZWNpZmllclNvdXJjZUZpbGUoKTtcbiAgICAgICAgICAgIGxldCBpbXBvcnRQYXRoO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbXBvcnRQYXRoUmVmZXJlbmNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGltcG9ydFBhdGggPSBpbXBvcnRQYXRoUmVmZXJlbmNlLmNvbXBpbGVyTm9kZS5maWxlTmFtZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpbGVJbXBvcnQgPVxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgYXN0LmdldFNvdXJjZUZpbGUoaW1wb3J0UGF0aCkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGFzdC5nZXRTb3VyY2VGaWxlKGltcG9ydFBhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFzdC5hZGRFeGlzdGluZ1NvdXJjZUZpbGVJZkV4aXN0cyhpbXBvcnRQYXRoKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuXG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGVJbXBvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhcmlhYmxlTmFtZSA9IGZvdW5kV2l0aEFsaWFzID8gYWxpYXNPcmlnaW5hbE5hbWUgOiBtZXRhZGF0YVZhcmlhYmxlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhcmlhYmxlRGVjbGFyYXRpb24gPSBzb3VyY2VGaWxlSW1wb3J0LmdldFZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGVOYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc0ZvdW5kVmFsdWVzKHZhcmlhYmxlRGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHdpdGggZXhwb3J0c1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwb3J0RGVjbGFyYXRpb25zID0gc291cmNlRmlsZUltcG9ydC5nZXRFeHBvcnREZWNsYXJhdGlvbnMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBvcnREZWNsYXJhdGlvbnMgJiYgZXhwb3J0RGVjbGFyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IGV4cG9ydERlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpOyBpPGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBleHBvcnREZWNsYXJhdGlvbiA9IGV4cG9ydERlY2xhcmF0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZUZpbGVFeHBvcnRlZFJlZmVyZW5jZSA9IGV4cG9ydERlY2xhcmF0aW9uLmdldE1vZHVsZVNwZWNpZmllclNvdXJjZUZpbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGVFeHBvcnRlZFJlZmVyZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZUZpbGVFeHBvcnRlZFJlZmVyZW5jZVBhdGggPSBzb3VyY2VGaWxlRXhwb3J0ZWRSZWZlcmVuY2UuZ2V0RmlsZVBhdGgoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRmlsZUV4cG9ydGVkID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgYXN0LmdldFNvdXJjZUZpbGUoc291cmNlRmlsZUV4cG9ydGVkUmVmZXJlbmNlUGF0aCkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYXN0LmdldFNvdXJjZUZpbGUoc291cmNlRmlsZUV4cG9ydGVkUmVmZXJlbmNlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhc3QuYWRkRXhpc3RpbmdTb3VyY2VGaWxlSWZFeGlzdHMoc291cmNlRmlsZUV4cG9ydGVkUmVmZXJlbmNlUGF0aCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VGaWxlRXhwb3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZURlY2xhcmF0aW9uID0gc291cmNlRmlsZUV4cG9ydGVkLmdldFZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzRm91bmRWYWx1ZXModmFyaWFibGVEZWNsYXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmluZCBpbiBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIGZpbGVcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlRGVjbGFyYXRpb24gPSBmaWxlLmdldFZhcmlhYmxlRGVjbGFyYXRpb24obWV0YWRhdGFWYXJpYWJsZU5hbWUpO1xuICAgICAgICAgICAgaWYgKHZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFyaWFibGVLaW5kID0gdmFyaWFibGVEZWNsYXJhdGlvbi5nZXRLaW5kKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVLaW5kICYmIHZhcmlhYmxlS2luZCA9PT0gU3ludGF4S2luZC5WYXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbml0aWFsaXplciA9IHZhcmlhYmxlRGVjbGFyYXRpb24uZ2V0SW5pdGlhbGl6ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5pdGlhbGl6ZXJLaW5kID0gaW5pdGlhbGl6ZXIuZ2V0S2luZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVyS2luZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVyS2luZCA9PT0gU3ludGF4S2luZC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBpbGVyTm9kZSA9IGluaXRpYWxpemVyLmNvbXBpbGVyTm9kZSBhcyB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGlsZXJOb2RlLnByb3BlcnRpZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluaXRpYWxpemVyS2luZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YXJpYWJsZURlY2xhcmF0aW9uLmNvbXBpbGVyTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RmlsZU5hbWVPZkltcG9ydCh2YXJpYWJsZU5hbWU6IHN0cmluZywgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSkge1xuICAgICAgICBjb25zdCBmaWxlID1cbiAgICAgICAgICAgIHR5cGVvZiBhc3QuZ2V0U291cmNlRmlsZShzb3VyY2VGaWxlLmZpbGVOYW1lKSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/IGFzdC5nZXRTb3VyY2VGaWxlKHNvdXJjZUZpbGUuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgOiBhc3QuYWRkRXhpc3RpbmdTb3VyY2VGaWxlKHNvdXJjZUZpbGUuZmlsZU5hbWUpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgIGNvbnN0IGltcG9ydHMgPSBmaWxlLmdldEltcG9ydERlY2xhcmF0aW9ucygpO1xuICAgICAgICBsZXQgc2VhcmNoZWRJbXBvcnQsXG4gICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9ICcnLFxuICAgICAgICAgICAgZmluYWxQYXRoID0gJycsXG4gICAgICAgICAgICBmb3VuZFdpdGhBbGlhcyA9IGZhbHNlO1xuICAgICAgICBpbXBvcnRzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBsZXQgbmFtZWRJbXBvcnRzID0gaS5nZXROYW1lZEltcG9ydHMoKSxcbiAgICAgICAgICAgICAgICBuYW1lZEltcG9ydHNMZW5ndGggPSBuYW1lZEltcG9ydHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGogPSAwO1xuXG4gICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoajsgaiA8IG5hbWVkSW1wb3J0c0xlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnROYW1lID0gbmFtZWRJbXBvcnRzW2pdLmdldE5hbWVOb2RlKCkuZ2V0VGV4dCgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNJZGVudGlmaWVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzID0gbmFtZWRJbXBvcnRzW2pdLmdldEFsaWFzSWRlbnRpZmllcigpLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0TmFtZSA9PT0gdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0QWxpYXMgPT09IHZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNPcmlnaW5hbE5hbWUgPSBpbXBvcnROYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaGVkSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbGV0IGltcG9ydFBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgcGF0aC5kaXJuYW1lKHNvdXJjZUZpbGUuZmlsZU5hbWUpICtcbiAgICAgICAgICAgICAgICAgICAgJy8nICtcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKSArXG4gICAgICAgICAgICAgICAgICAgICcudHMnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGV0IGNsZWFuZXIgPSAocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgICAgICBmaW5hbFBhdGggPSBpbXBvcnRQYXRoLnJlcGxhY2UoY2xlYW5lciwgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaW5hbFBhdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgZmlsZSBwYXRoIG9mIGltcG9ydGVkIHZhcmlhYmxlXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBpbnB1dFZhcmlhYmxlTmFtZSAgbGlrZSB0aGVzdHJpbmdcbiAgICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgICAgICAgICB0aGVzdHJpbmcgZGVzdGluYXRpb24gcGF0aFxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kRmlsZVBhdGhPZkltcG9ydGVkVmFyaWFibGUoaW5wdXRWYXJpYWJsZU5hbWUsIHNvdXJjZUZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IHNlYXJjaGVkSW1wb3J0LFxuICAgICAgICAgICAgZmluYWxQYXRoID0gJycsXG4gICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9ICcnLFxuICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgZmlsZSA9XG4gICAgICAgICAgICB0eXBlb2YgYXN0LmdldFNvdXJjZUZpbGUoc291cmNlRmlsZVBhdGgpICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gYXN0LmdldFNvdXJjZUZpbGUoc291cmNlRmlsZVBhdGgpXG4gICAgICAgICAgICAgICAgOiBhc3QuYWRkRXhpc3RpbmdTb3VyY2VGaWxlKHNvdXJjZUZpbGVQYXRoKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICBjb25zdCBpbXBvcnRzID0gZmlsZS5nZXRJbXBvcnREZWNsYXJhdGlvbnMoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9vcCB0aHJvdWdoIGFsbCBpbXBvcnRzLCBhbmQgZmluZCBvbmUgbWF0Y2hpbmcgaW5wdXRWYXJpYWJsZU5hbWVcbiAgICAgICAgICovXG4gICAgICAgIGltcG9ydHMuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgIGxldCBuYW1lZEltcG9ydHMgPSBpLmdldE5hbWVkSW1wb3J0cygpLFxuICAgICAgICAgICAgICAgIG5hbWVkSW1wb3J0c0xlbmd0aCA9IG5hbWVkSW1wb3J0cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgaiA9IDA7XG5cbiAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChqOyBqIDwgbmFtZWRJbXBvcnRzTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydE5hbWUgPSBuYW1lZEltcG9ydHNbal0uZ2V0TmFtZU5vZGUoKS5nZXRUZXh0KCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0QWxpYXM7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVkSW1wb3J0c1tqXS5nZXRBbGlhc0lkZW50aWZpZXIoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0QWxpYXMgPSBuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNJZGVudGlmaWVyKCkuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnROYW1lID09PSBpbnB1dFZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcG9ydEFsaWFzID09PSBpbnB1dFZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNPcmlnaW5hbE5hbWUgPSBpbXBvcnROYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaGVkSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgZmluYWxQYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgIHBhdGguZGlybmFtZShzb3VyY2VGaWxlUGF0aCkgK1xuICAgICAgICAgICAgICAgICAgICAnLycgK1xuICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpICtcbiAgICAgICAgICAgICAgICAgICAgJy50cydcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbmFsUGF0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGluIGltcG9ydHMgc29tZXRoaW5nIGxpa2UgVkFSLkFWQVIuQlZBUi50aGVzdHJpbmdcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGlucHV0VmFyaWFibGVOYW1lICAgICAgICAgICAgICAgICAgIGxpa2UgVkFSLkFWQVIuQlZBUi50aGVzdHJpbmdcbiAgICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVzdHJpbmcgdmFsdWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZmluZFByb3BlcnR5VmFsdWVJbkltcG9ydE9yTG9jYWxWYXJpYWJsZXMoaW5wdXRWYXJpYWJsZU5hbWUsIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpIHtcbiAgICAgICAgbGV0IHZhcmlhYmxlc0F0dHJpYnV0ZXMgPSBpbnB1dFZhcmlhYmxlTmFtZS5zcGxpdCgnLicpLFxuICAgICAgICAgICAgbWV0YWRhdGFWYXJpYWJsZU5hbWUgPSB2YXJpYWJsZXNBdHRyaWJ1dGVzWzBdLFxuICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQsXG4gICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9ICcnLFxuICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBmaWxlID1cbiAgICAgICAgICAgIHR5cGVvZiBhc3QuZ2V0U291cmNlRmlsZShzb3VyY2VGaWxlLmZpbGVOYW1lKSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/IGFzdC5nZXRTb3VyY2VGaWxlKHNvdXJjZUZpbGUuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgOiBhc3QuYWRkRXhpc3RpbmdTb3VyY2VGaWxlKHNvdXJjZUZpbGUuZmlsZU5hbWUpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgIGNvbnN0IGltcG9ydHMgPSBmaWxlLmdldEltcG9ydERlY2xhcmF0aW9ucygpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb29wIHRocm91Z2ggYWxsIGltcG9ydHMsIGFuZCBmaW5kIG9uZSBtYXRjaGluZyBpbnB1dFZhcmlhYmxlTmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgaW1wb3J0cy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgbGV0IG5hbWVkSW1wb3J0cyA9IGkuZ2V0TmFtZWRJbXBvcnRzKCksXG4gICAgICAgICAgICAgICAgbmFtZWRJbXBvcnRzTGVuZ3RoID0gbmFtZWRJbXBvcnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBqID0gMDtcblxuICAgICAgICAgICAgaWYgKG5hbWVkSW1wb3J0c0xlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGo7IGogPCBuYW1lZEltcG9ydHNMZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW1wb3J0TmFtZSA9IG5hbWVkSW1wb3J0c1tqXS5nZXROYW1lTm9kZSgpLmdldFRleHQoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRBbGlhcztcblxuICAgICAgICAgICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzW2pdLmdldEFsaWFzSWRlbnRpZmllcigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRBbGlhcyA9IG5hbWVkSW1wb3J0c1tqXS5nZXRBbGlhc0lkZW50aWZpZXIoKS5nZXRUZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcG9ydE5hbWUgPT09IG1ldGFkYXRhVmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0QWxpYXMgPT09IG1ldGFkYXRhVmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdpdGhBbGlhcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9IGltcG9ydE5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IGZpbGVUb1NlYXJjaEluLCB2YXJpYWJsZURlY2xhcmF0aW9uO1xuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaGVkSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbGV0IGltcG9ydFBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgcGF0aC5kaXJuYW1lKHNvdXJjZUZpbGUuZmlsZU5hbWUpICtcbiAgICAgICAgICAgICAgICAgICAgJy8nICtcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKSArXG4gICAgICAgICAgICAgICAgICAgICcudHMnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlRmlsZUltcG9ydCA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIGFzdC5nZXRTb3VyY2VGaWxlKGltcG9ydFBhdGgpICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgICAgICA/IGFzdC5nZXRTb3VyY2VGaWxlKGltcG9ydFBhdGgpXG4gICAgICAgICAgICAgICAgICAgIDogYXN0LmFkZEV4aXN0aW5nU291cmNlRmlsZShpbXBvcnRQYXRoKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGVJbXBvcnQpIHtcbiAgICAgICAgICAgICAgICBmaWxlVG9TZWFyY2hJbiA9IHNvdXJjZUZpbGVJbXBvcnQ7XG4gICAgICAgICAgICAgICAgbGV0IHZhcmlhYmxlTmFtZSA9IGZvdW5kV2l0aEFsaWFzID8gYWxpYXNPcmlnaW5hbE5hbWUgOiBtZXRhZGF0YVZhcmlhYmxlTmFtZTtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZURlY2xhcmF0aW9uID0gZmlsZVRvU2VhcmNoSW4uZ2V0VmFyaWFibGVEZWNsYXJhdGlvbih2YXJpYWJsZU5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmlsZVRvU2VhcmNoSW4gPSBmaWxlO1xuICAgICAgICAgICAgLy8gRmluZCBpbiBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIGZpbGVcbiAgICAgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRpb24gPSBmaWxlVG9TZWFyY2hJbi5nZXRWYXJpYWJsZURlY2xhcmF0aW9uKG1ldGFkYXRhVmFyaWFibGVOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kSW5PYmplY3RWYXJpYWJsZURlY2xhcmF0aW9uKHZhcmlhYmxlRGVjbGFyYXRpb24sIHZhcmlhYmxlc0F0dHJpYnV0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyeSBmaW5kIGl0IGluIGVudW1zXG4gICAgICAgIGlmICh2YXJpYWJsZXNBdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZmlsZVRvU2VhcmNoSW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IHRoaXMuZmluZEluRW51bXMoXG4gICAgICAgICAgICAgICAgICAgIGZpbGVUb1NlYXJjaEluLFxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVZhcmlhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzQXR0cmlidXRlc1sxXVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsID0gdGhpcy5maW5kSW5DbGFzc2VzKFxuICAgICAgICAgICAgICAgICAgICBmaWxlVG9TZWFyY2hJbixcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFWYXJpYWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlc0F0dHJpYnV0ZXNbMV1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICh2YWwgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgdXRpbCBmcm9tICd1dGlsJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBIYW5kbGViYXJzIGZyb20gJ2hhbmRsZWJhcnMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgSlNPTjUgZnJvbSAnanNvbjUnO1xuaW1wb3J0IEFzdCwgeyBUeXBlR3VhcmRzLCBTb3VyY2VGaWxlLCB0cywgU3ludGF4S2luZCB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuXG5pbXBvcnQgeyBGaWxlRW5naW5lIH0gZnJvbSAnLi4vYXBwL2VuZ2luZXMvZmlsZS5lbmdpbmUnO1xuaW1wb3J0IHsgUm91dGluZ0dyYXBoTm9kZSB9IGZyb20gJy4uL2FwcC9ub2Rlcy9yb3V0aW5nLWdyYXBoLW5vZGUnO1xuaW1wb3J0IHsgSW1wb3J0c1V0aWwgfSBmcm9tICcuL2ltcG9ydHMudXRpbCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXInO1xuXG5jb25zdCB0cmF2ZXJzZSA9IHJlcXVpcmUoJ3RyYXZlcnNlJyk7XG5cbmNvbnN0IGFzdCA9IG5ldyBBc3QoKTtcblxuZXhwb3J0IGNsYXNzIFJvdXRlclBhcnNlclV0aWwge1xuICAgIHByaXZhdGUgcm91dGVzOiBhbnlbXSA9IFtdO1xuICAgIHByaXZhdGUgaW5jb21wbGV0ZVJvdXRlcyA9IFtdO1xuICAgIHByaXZhdGUgbW9kdWxlcyA9IFtdO1xuICAgIHByaXZhdGUgbW9kdWxlc1RyZWU7XG4gICAgcHJpdmF0ZSByb290TW9kdWxlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBjbGVhbk1vZHVsZXNUcmVlO1xuICAgIHByaXZhdGUgbW9kdWxlc1dpdGhSb3V0ZXMgPSBbXTtcblxuICAgIHByaXZhdGUgZmlsZUVuZ2luZSA9IG5ldyBGaWxlRW5naW5lKCk7XG4gICAgcHJpdmF0ZSBpbXBvcnRzVXRpbCA9IG5ldyBJbXBvcnRzVXRpbCgpO1xuXG4gICAgcHVibGljIGFkZFJvdXRlKHJvdXRlKTogdm9pZCB7XG4gICAgICAgIHRoaXMucm91dGVzLnB1c2gocm91dGUpO1xuICAgICAgICB0aGlzLnJvdXRlcyA9IF8uc29ydEJ5KF8udW5pcVdpdGgodGhpcy5yb3V0ZXMsIF8uaXNFcXVhbCksIFsnbmFtZSddKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkSW5jb21wbGV0ZVJvdXRlKHJvdXRlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5jb21wbGV0ZVJvdXRlcy5wdXNoKHJvdXRlKTtcbiAgICAgICAgdGhpcy5pbmNvbXBsZXRlUm91dGVzID0gXy5zb3J0QnkoXy51bmlxV2l0aCh0aGlzLmluY29tcGxldGVSb3V0ZXMsIF8uaXNFcXVhbCksIFsnbmFtZSddKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkTW9kdWxlV2l0aFJvdXRlcyhtb2R1bGVOYW1lLCBtb2R1bGVJbXBvcnRzLCBmaWxlbmFtZSk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vZHVsZXNXaXRoUm91dGVzLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogbW9kdWxlTmFtZSxcbiAgICAgICAgICAgIGltcG9ydHNOb2RlOiBtb2R1bGVJbXBvcnRzLFxuICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVuYW1lXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm1vZHVsZXNXaXRoUm91dGVzID0gXy5zb3J0QnkoXy51bmlxV2l0aCh0aGlzLm1vZHVsZXNXaXRoUm91dGVzLCBfLmlzRXF1YWwpLCBbJ25hbWUnXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZE1vZHVsZShtb2R1bGVOYW1lOiBzdHJpbmcsIG1vZHVsZUltcG9ydHMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tb2R1bGVzLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogbW9kdWxlTmFtZSxcbiAgICAgICAgICAgIGltcG9ydHNOb2RlOiBtb2R1bGVJbXBvcnRzXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm1vZHVsZXMgPSBfLnNvcnRCeShfLnVuaXFXaXRoKHRoaXMubW9kdWxlcywgXy5pc0VxdWFsKSwgWyduYW1lJ10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhblJhd1JvdXRlUGFyc2VkKHJvdXRlOiBzdHJpbmcpOiBvYmplY3Qge1xuICAgICAgICBsZXQgcm91dGVzV2l0aG91dFNwYWNlcyA9IHJvdXRlLnJlcGxhY2UoLyAvZ20sICcnKTtcbiAgICAgICAgbGV0IHRlc3RUcmFpbGluZ0NvbW1hID0gcm91dGVzV2l0aG91dFNwYWNlcy5pbmRleE9mKCd9LF0nKTtcbiAgICAgICAgaWYgKHRlc3RUcmFpbGluZ0NvbW1hICE9PSAtMSkge1xuICAgICAgICAgICAgcm91dGVzV2l0aG91dFNwYWNlcyA9IHJvdXRlc1dpdGhvdXRTcGFjZXMucmVwbGFjZSgnfSxdJywgJ31dJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT041LnBhcnNlKHJvdXRlc1dpdGhvdXRTcGFjZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhblJhd1JvdXRlKHJvdXRlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcm91dGVzV2l0aG91dFNwYWNlcyA9IHJvdXRlLnJlcGxhY2UoLyAvZ20sICcnKTtcbiAgICAgICAgbGV0IHRlc3RUcmFpbGluZ0NvbW1hID0gcm91dGVzV2l0aG91dFNwYWNlcy5pbmRleE9mKCd9LF0nKTtcbiAgICAgICAgaWYgKHRlc3RUcmFpbGluZ0NvbW1hICE9PSAtMSkge1xuICAgICAgICAgICAgcm91dGVzV2l0aG91dFNwYWNlcyA9IHJvdXRlc1dpdGhvdXRTcGFjZXMucmVwbGFjZSgnfSxdJywgJ31dJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvdXRlc1dpdGhvdXRTcGFjZXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFJvb3RNb2R1bGUobW9kdWxlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yb290TW9kdWxlID0gbW9kdWxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNSb3V0ZXJNb2R1bGVJbkltcG9ydHMoaW1wb3J0czogQXJyYXk8YW55Pik6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBpbXBvcnRzW2ldLm5hbWUuaW5kZXhPZignUm91dGVyTW9kdWxlLmZvckNoaWxkJykgIT09IC0xIHx8XG4gICAgICAgICAgICAgICAgaW1wb3J0c1tpXS5uYW1lLmluZGV4T2YoJ1JvdXRlck1vZHVsZS5mb3JSb290JykgIT09IC0xIHx8XG4gICAgICAgICAgICAgICAgaW1wb3J0c1tpXS5uYW1lLmluZGV4T2YoJ1JvdXRlck1vZHVsZScpICE9PSAtMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGZpeEluY29tcGxldGVSb3V0ZXMobWlzY2VsbGFuZW91c1ZhcmlhYmxlczogQXJyYXk8YW55Pik6IHZvaWQge1xuICAgICAgICBsZXQgbWF0Y2hpbmdWYXJpYWJsZXMgPSBbXTtcbiAgICAgICAgLy8gRm9yIGVhY2ggaW5jb21wbGV0ZVJvdXRlLCBzY2FuIGlmIG9uZSBtaXNjIHZhcmlhYmxlIGlzIGluIGNvZGVcbiAgICAgICAgLy8gaWYgb2ssIHRyeSByZWNyZWF0aW5nIGNvbXBsZXRlIHJvdXRlXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbmNvbXBsZXRlUm91dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG1pc2NlbGxhbmVvdXNWYXJpYWJsZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbmNvbXBsZXRlUm91dGVzW2ldLmRhdGEuaW5kZXhPZihtaXNjZWxsYW5lb3VzVmFyaWFibGVzW2pdLm5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZm91bmQgb25lIG1pc2MgdmFyIGluc2lkZSBpbmNvbXBsZXRlUm91dGUnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobWlzY2VsbGFuZW91c1ZhcmlhYmxlc1tqXS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdWYXJpYWJsZXMucHVzaChtaXNjZWxsYW5lb3VzVmFyaWFibGVzW2pdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDbGVhbiBpbmNvbXBsZXRlUm91dGVcbiAgICAgICAgICAgIHRoaXMuaW5jb21wbGV0ZVJvdXRlc1tpXS5kYXRhID0gdGhpcy5pbmNvbXBsZXRlUm91dGVzW2ldLmRhdGEucmVwbGFjZSgnWycsICcnKTtcbiAgICAgICAgICAgIHRoaXMuaW5jb21wbGV0ZVJvdXRlc1tpXS5kYXRhID0gdGhpcy5pbmNvbXBsZXRlUm91dGVzW2ldLmRhdGEucmVwbGFjZSgnXScsICcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsaW5rTW9kdWxlc0FuZFJvdXRlcygpOiB2b2lkIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgbGVuID0gdGhpcy5tb2R1bGVzV2l0aFJvdXRlcy5sZW5ndGg7XG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godGhpcy5tb2R1bGVzV2l0aFJvdXRlc1tpXS5pbXBvcnRzTm9kZSwgKG5vZGU6IHRzLlByb3BlcnR5RGVjbGFyYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaW5pdGlhbGl6ZXIgPSBub2RlLmluaXRpYWxpemVyIGFzIHRzLkFycmF5TGl0ZXJhbEV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbml0aWFsaXplci5lbGVtZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGluaXRpYWxpemVyLmVsZW1lbnRzLCAoZWxlbWVudDogdHMuQ2FsbEV4cHJlc3Npb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIGVsZW1lbnQgd2l0aCBhcmd1bWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5hcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGVsZW1lbnQuYXJndW1lbnRzLCAoYXJndW1lbnQ6IHRzLklkZW50aWZpZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLnJvdXRlcywgcm91dGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQudGV4dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5uYW1lID09PSBhcmd1bWVudC50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLmZpbGVuYW1lID09PSB0aGlzLm1vZHVsZXNXaXRoUm91dGVzW2ldLmZpbGVuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1vZHVsZSA9IHRoaXMubW9kdWxlc1dpdGhSb3V0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudC50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm5hbWUgPT09IGFyZ3VtZW50LnRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuZmlsZW5hbWUgIT09IHRoaXMubW9kdWxlc1dpdGhSb3V0ZXNbaV0uZmlsZW5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFyZ3VtZW50SW1wb3J0UGF0aCA9IHRoaXMuaW1wb3J0c1V0aWwuZmluZEZpbGVQYXRoT2ZJbXBvcnRlZFZhcmlhYmxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlc1dpdGhSb3V0ZXNbaV0uZmlsZW5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsZWFuZXIgPSAocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwKS5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1xcXFwvZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudEltcG9ydFBhdGggPSBhcmd1bWVudEltcG9ydFBhdGgucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudC50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5uYW1lID09PSBhcmd1bWVudC50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5maWxlbmFtZSA9PT0gYXJndW1lbnRJbXBvcnRQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubW9kdWxlID0gdGhpcy5tb2R1bGVzV2l0aFJvdXRlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIGRpcmVjdCBzdXBwb3J0IG9mIGZvciBleGFtcGxlXG4gICAgICAgICAgICAgICAgICogZXhwb3J0IGNvbnN0IEhvbWVSb3V0aW5nTW9kdWxlOiBNb2R1bGVXaXRoUHJvdmlkZXJzID0gUm91dGVyTW9kdWxlLmZvckNoaWxkKEhPTUVfUk9VVEVTKTtcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBpZiAodHMuaXNDYWxsRXhwcmVzc2lvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5hcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChub2RlLmFyZ3VtZW50cywgKGFyZ3VtZW50OiB0cy5JZGVudGlmaWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMucm91dGVzLCByb3V0ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50LnRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm5hbWUgPT09IGFyZ3VtZW50LnRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLmZpbGVuYW1lID09PSB0aGlzLm1vZHVsZXNXaXRoUm91dGVzW2ldLmZpbGVuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubW9kdWxlID0gdGhpcy5tb2R1bGVzV2l0aFJvdXRlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGZvdW5kUm91dGVXaXRoTW9kdWxlTmFtZShtb2R1bGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgICAgICByZXR1cm4gXy5maW5kKHRoaXMucm91dGVzLCB7IG1vZHVsZTogbW9kdWxlTmFtZSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm91bmRMYXp5TW9kdWxlV2l0aFBhdGgobW9kdWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgLy8gcGF0aCBpcyBsaWtlIGFwcC9jdXN0b21lcnMvY3VzdG9tZXJzLm1vZHVsZSNDdXN0b21lcnNNb2R1bGVcbiAgICAgICAgbGV0IHNwbGl0ID0gbW9kdWxlUGF0aC5zcGxpdCgnIycpO1xuICAgICAgICBsZXQgbGF6eU1vZHVsZVBhdGggPSBzcGxpdFswXTtcbiAgICAgICAgbGV0IGxhenlNb2R1bGVOYW1lID0gc3BsaXRbMV07XG4gICAgICAgIHJldHVybiBsYXp5TW9kdWxlTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29uc3RydWN0Um91dGVzVHJlZSgpIHtcbiAgICAgICAgLy8gcm91dGVzW10gY29udGFpbnMgcm91dGVzIHdpdGggbW9kdWxlIGxpbmtcbiAgICAgICAgLy8gbW9kdWxlc1RyZWUgY29udGFpbnMgbW9kdWxlcyB0cmVlXG4gICAgICAgIC8vIG1ha2UgYSBmaW5hbCByb3V0ZXMgdHJlZSB3aXRoIHRoYXRcbiAgICAgICAgdHJhdmVyc2UodGhpcy5tb2R1bGVzVHJlZSkuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbm9kZS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub2RlLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLmluaXRpYWxpemVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5pbXBvcnRzTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbm9kZS5pbXBvcnRzTm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2xlYW5Nb2R1bGVzVHJlZSA9IF8uY2xvbmVEZWVwKHRoaXMubW9kdWxlc1RyZWUpO1xuXG4gICAgICAgIGxldCByb3V0ZXNUcmVlID0ge1xuICAgICAgICAgICAgbmFtZTogJzxyb290PicsXG4gICAgICAgICAgICBraW5kOiAnbW9kdWxlJyxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogdGhpcy5yb290TW9kdWxlLFxuICAgICAgICAgICAgY2hpbGRyZW46IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGxvb3BNb2R1bGVzUGFyc2VyID0gbm9kZSA9PiB7XG4gICAgICAgICAgICBpZiAobm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBtb2R1bGUgaGFzIGNoaWxkIG1vZHVsZXNcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpIGluIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvdXRlID0gdGhpcy5mb3VuZFJvdXRlV2l0aE1vZHVsZU5hbWUobm9kZS5jaGlsZHJlbltpXS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlICYmIHJvdXRlLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuY2hpbGRyZW4gPSBKU09ONS5wYXJzZShyb3V0ZS5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFcnJvciBkdXJpbmcgZ2VuZXJhdGlvbiBvZiByb3V0ZXMgSlNPTiBmaWxlLCBtYXliZSBhIHRyYWlsaW5nIGNvbW1hIG9yIGFuIGV4dGVybmFsIHZhcmlhYmxlIGluc2lkZSBvbmUgcm91dGUuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcm91dGUuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLmtpbmQgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlc1RyZWUuY2hpbGRyZW4ucHVzaChyb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW5baV0uY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BNb2R1bGVzUGFyc2VyKG5vZGUuY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBlbHNlIHJvdXRlcyBhcmUgZGlyZWN0bHkgaW5zaWRlIHRoZSBtb2R1bGVcbiAgICAgICAgICAgICAgICBsZXQgcmF3Um91dGVzID0gdGhpcy5mb3VuZFJvdXRlV2l0aE1vZHVsZU5hbWUobm9kZS5uYW1lKTtcblxuICAgICAgICAgICAgICAgIGlmIChyYXdSb3V0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvdXRlcyA9IEpTT041LnBhcnNlKHJhd1JvdXRlcy5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxlbiA9IHJvdXRlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm91dGVBZGRlZE9uY2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvdXRlID0gcm91dGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZXNbaV0uY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlQWRkZWRPbmNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVzVHJlZS5jaGlsZHJlbi5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6ICdjb21wb25lbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiByb3V0ZXNbaV0uY29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogcm91dGVzW2ldLnBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyb3V0ZUFkZGVkT25jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlc1RyZWUuY2hpbGRyZW4gPSBbLi4ucm91dGVzVHJlZS5jaGlsZHJlbiwgLi4ucm91dGVzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgc3RhcnRNb2R1bGUgPSBfLmZpbmQodGhpcy5jbGVhbk1vZHVsZXNUcmVlLCB7IG5hbWU6IHRoaXMucm9vdE1vZHVsZSB9KTtcblxuICAgICAgICBpZiAoc3RhcnRNb2R1bGUpIHtcbiAgICAgICAgICAgIGxvb3BNb2R1bGVzUGFyc2VyKHN0YXJ0TW9kdWxlKTtcbiAgICAgICAgICAgIC8vIExvb3AgdHdpY2UgZm9yIHJvdXRlcyB3aXRoIGxhenkgbG9hZGluZ1xuICAgICAgICAgICAgLy8gbG9vcE1vZHVsZXNQYXJzZXIocm91dGVzVHJlZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2xlYW5lZFJvdXRlc1RyZWUgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IGNsZWFuUm91dGVzVHJlZSA9IHJvdXRlID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgaW4gcm91dGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBsZXQgcm91dGVzID0gcm91dGUuY2hpbGRyZW5baV0ucm91dGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJvdXRlO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsZWFuZWRSb3V0ZXNUcmVlID0gY2xlYW5Sb3V0ZXNUcmVlKHJvdXRlc1RyZWUpO1xuXG4gICAgICAgIC8vIFRyeSB1cGRhdGluZyByb3V0ZXMgd2l0aCBsYXp5IGxvYWRpbmdcblxuICAgICAgICBsZXQgbG9vcEluc2lkZU1vZHVsZSA9IChtb2QsIF9yYXdNb2R1bGUpID0+IHtcbiAgICAgICAgICAgIGlmIChtb2QuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB6IGluIG1vZC5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm91dGUgPSB0aGlzLmZvdW5kUm91dGVXaXRoTW9kdWxlTmFtZShtb2QuY2hpbGRyZW5bel0ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygcm91dGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLmNoaWxkcmVuID0gSlNPTjUucGFyc2Uocm91dGUuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJvdXRlLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUua2luZCA9ICdtb2R1bGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yYXdNb2R1bGUuY2hpbGRyZW4ucHVzaChyb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCByb3V0ZSA9IHRoaXMuZm91bmRSb3V0ZVdpdGhNb2R1bGVOYW1lKG1vZC5uYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJvdXRlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuY2hpbGRyZW4gPSBKU09ONS5wYXJzZShyb3V0ZS5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByb3V0ZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUua2luZCA9ICdtb2R1bGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5jaGlsZHJlbi5wdXNoKHJvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgbG9vcFJvdXRlc1BhcnNlciA9IHJvdXRlID0+IHtcbiAgICAgICAgICAgIGlmIChyb3V0ZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgaW4gcm91dGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlLmNoaWxkcmVuW2ldLmxvYWRDaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5mb3VuZExhenlNb2R1bGVXaXRoUGF0aChyb3V0ZS5jaGlsZHJlbltpXS5sb2FkQ2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1vZHVsZTogUm91dGluZ0dyYXBoTm9kZSA9IF8uZmluZCh0aGlzLmNsZWFuTW9kdWxlc1RyZWUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjaGlsZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kdWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IF9yYXdNb2R1bGU6IFJvdXRpbmdHcmFwaE5vZGUgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmF3TW9kdWxlLmtpbmQgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmF3TW9kdWxlLmNoaWxkcmVuID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5tb2R1bGUgPSBtb2R1bGUubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSW5zaWRlTW9kdWxlKG1vZHVsZSwgX3Jhd01vZHVsZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5jaGlsZHJlbltpXS5jaGlsZHJlbiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLmNoaWxkcmVuW2ldLmNoaWxkcmVuLnB1c2goX3Jhd01vZHVsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbG9vcFJvdXRlc1BhcnNlcihyb3V0ZS5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBsb29wUm91dGVzUGFyc2VyKGNsZWFuZWRSb3V0ZXNUcmVlKTtcblxuICAgICAgICByZXR1cm4gY2xlYW5lZFJvdXRlc1RyZWU7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbnN0cnVjdE1vZHVsZXNUcmVlKCk6IHZvaWQge1xuICAgICAgICBsZXQgZ2V0TmVzdGVkQ2hpbGRyZW4gPSAoYXJyLCBwYXJlbnQ/KSA9PiB7XG4gICAgICAgICAgICBsZXQgb3V0ID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpIGluIGFycikge1xuICAgICAgICAgICAgICAgIGlmIChhcnJbaV0ucGFyZW50ID09PSBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0TmVzdGVkQ2hpbGRyZW4oYXJyLCBhcnJbaV0ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycltpXS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKGFycltpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTY2FuIGVhY2ggbW9kdWxlIGFuZCBhZGQgcGFyZW50IHByb3BlcnR5XG4gICAgICAgIF8uZm9yRWFjaCh0aGlzLm1vZHVsZXMsIGZpcnN0TG9vcE1vZHVsZSA9PiB7XG4gICAgICAgICAgICBfLmZvckVhY2goZmlyc3RMb29wTW9kdWxlLmltcG9ydHNOb2RlLCBpbXBvcnROb2RlID0+IHtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2godGhpcy5tb2R1bGVzLCBtb2R1bGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kdWxlLm5hbWUgPT09IGltcG9ydE5vZGUubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLnBhcmVudCA9IGZpcnN0TG9vcE1vZHVsZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubW9kdWxlc1RyZWUgPSBnZXROZXN0ZWRDaGlsZHJlbih0aGlzLm1vZHVsZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZW5lcmF0ZVJvdXRlc0luZGV4KG91dHB1dEZvbGRlcjogc3RyaW5nLCByb3V0ZXM6IEFycmF5PGFueT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZUVuZ2luZS5nZXQoX19kaXJuYW1lICsgJy8uLi9zcmMvdGVtcGxhdGVzL3BhcnRpYWxzL3JvdXRlcy1pbmRleC5oYnMnKS50aGVuKFxuICAgICAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRlbXBsYXRlOiBhbnkgPSBIYW5kbGViYXJzLmNvbXBpbGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRlbXBsYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgcm91dGVzOiBKU09OLnN0cmluZ2lmeShyb3V0ZXMpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IHRlc3RPdXRwdXREaXIgPSBvdXRwdXRGb2xkZXIubWF0Y2gocHJvY2Vzcy5jd2QoKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGVzdE91dHB1dERpciAmJiB0ZXN0T3V0cHV0RGlyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0Rm9sZGVyID0gb3V0cHV0Rm9sZGVyLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZUVuZ2luZS53cml0ZShcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0Rm9sZGVyICsgcGF0aC5zZXAgKyAnL2pzL3JvdXRlcy9yb3V0ZXNfaW5kZXguanMnLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVyciA9PiBQcm9taXNlLnJlamVjdCgnRXJyb3IgZHVyaW5nIHJvdXRlcyBpbmRleCBnZW5lcmF0aW9uJylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcm91dGVzTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIGxldCBfbiA9IDA7XG4gICAgICAgIGxldCByb3V0ZXNQYXJzZXIgPSByb3V0ZSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJvdXRlLnBhdGggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgX24gKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyb3V0ZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogaW4gcm91dGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcm91dGVzUGFyc2VyKHJvdXRlLmNoaWxkcmVuW2pdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLnJvdXRlcykge1xuICAgICAgICAgICAgcm91dGVzUGFyc2VyKHRoaXMucm91dGVzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJpbnRSb3V0ZXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3ByaW50Um91dGVzOiAnKTtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5yb3V0ZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmludE1vZHVsZXNSb3V0ZXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3ByaW50TW9kdWxlc1JvdXRlczogJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMubW9kdWxlc1dpdGhSb3V0ZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1ZhcmlhYmxlUm91dGVzKG5vZGUpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBpZiAobm9kZS5kZWNsYXJhdGlvbkxpc3QgJiYgbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zKSB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS50eXBlLnR5cGVOYW1lICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV0udHlwZS50eXBlTmFtZS50ZXh0ID09PSAnUm91dGVzJ1xuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYW5GaWxlSWRlbnRpZmllcnMoc291cmNlRmlsZTogU291cmNlRmlsZSk6IFNvdXJjZUZpbGUge1xuICAgICAgICBsZXQgZmlsZSA9IHNvdXJjZUZpbGU7XG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXJzID0gZmlsZS5nZXREZXNjZW5kYW50c09mS2luZChTeW50YXhLaW5kLklkZW50aWZpZXIpLmZpbHRlcihwID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgVHlwZUd1YXJkcy5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24ocC5nZXRQYXJlbnRPclRocm93KCkpIHx8XG4gICAgICAgICAgICAgICAgVHlwZUd1YXJkcy5pc1Byb3BlcnR5QXNzaWdubWVudChwLmdldFBhcmVudE9yVGhyb3coKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBpZGVudGlmaWVyc0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgaWRlbnRpZmllcnMpIHtcbiAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGVpciBwYXJlbnRzIG5vZGVzLCBhbmQgaWYgb25lIGlzIGEgdmFyaWFibGVTdGF0ZW1lbnQgYW5kID09PSAncm91dGVzJ1xuICAgICAgICAgICAgbGV0IGZvdW5kUGFyZW50VmFyaWFibGVTdGF0ZW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBpZGVudGlmaWVyLmdldFBhcmVudFdoaWxlKG4gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChuLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5WYXJpYWJsZVN0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhcmlhYmxlUm91dGVzKG4uY29tcGlsZXJOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRQYXJlbnRWYXJpYWJsZVN0YXRlbWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChmb3VuZFBhcmVudFZhcmlhYmxlU3RhdGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcnNJblJvdXRlc1ZhcmlhYmxlU3RhdGVtZW50LnB1c2goaWRlbnRpZmllcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbmxpbmUgdGhlIHByb3BlcnR5IGFjY2VzcyBleHByZXNzaW9uc1xuICAgICAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgaWRlbnRpZmllcnNJblJvdXRlc1ZhcmlhYmxlU3RhdGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyRGVjbGFyYXRpb24gPSBpZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgLmdldFN5bWJvbE9yVGhyb3coKVxuICAgICAgICAgICAgICAgIC5nZXRWYWx1ZURlY2xhcmF0aW9uT3JUaHJvdygpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFUeXBlR3VhcmRzLmlzUHJvcGVydHlBc3NpZ25tZW50KGlkZW50aWZpZXJEZWNsYXJhdGlvbikgJiZcbiAgICAgICAgICAgICAgICBUeXBlR3VhcmRzLmlzVmFyaWFibGVEZWNsYXJhdGlvbihpZGVudGlmaWVyRGVjbGFyYXRpb24pICYmXG4gICAgICAgICAgICAgICAgKFR5cGVHdWFyZHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQoaWRlbnRpZmllckRlY2xhcmF0aW9uKSAmJlxuICAgICAgICAgICAgICAgICAgICAhVHlwZUd1YXJkcy5pc1ZhcmlhYmxlRGVjbGFyYXRpb24oaWRlbnRpZmllckRlY2xhcmF0aW9uKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYE5vdCBpbXBsZW1lbnRlZCByZWZlcmVuY2VkIGRlY2xhcmF0aW9uIGtpbmQ6ICR7aWRlbnRpZmllckRlY2xhcmF0aW9uLmdldEtpbmROYW1lKCl9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoVHlwZUd1YXJkcy5pc1ZhcmlhYmxlRGVjbGFyYXRpb24oaWRlbnRpZmllckRlY2xhcmF0aW9uKSkge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXIucmVwbGFjZVdpdGhUZXh0KGlkZW50aWZpZXJEZWNsYXJhdGlvbi5nZXRJbml0aWFsaXplck9yVGhyb3coKS5nZXRUZXh0KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFuRmlsZVNwcmVhZHMoc291cmNlRmlsZTogU291cmNlRmlsZSk6IFNvdXJjZUZpbGUge1xuICAgICAgICBsZXQgZmlsZSA9IHNvdXJjZUZpbGU7XG4gICAgICAgIGNvbnN0IHNwcmVhZEVsZW1lbnRzID0gZmlsZVxuICAgICAgICAgICAgLmdldERlc2NlbmRhbnRzT2ZLaW5kKFN5bnRheEtpbmQuU3ByZWFkRWxlbWVudClcbiAgICAgICAgICAgIC5maWx0ZXIocCA9PiBUeXBlR3VhcmRzLmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihwLmdldFBhcmVudE9yVGhyb3coKSkpO1xuXG4gICAgICAgIGxldCBzcHJlYWRFbGVtZW50c0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHNwcmVhZEVsZW1lbnQgb2Ygc3ByZWFkRWxlbWVudHMpIHtcbiAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGVpciBwYXJlbnRzIG5vZGVzLCBhbmQgaWYgb25lIGlzIGEgdmFyaWFibGVTdGF0ZW1lbnQgYW5kID09PSAncm91dGVzJ1xuICAgICAgICAgICAgbGV0IGZvdW5kUGFyZW50VmFyaWFibGVTdGF0ZW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBzcHJlYWRFbGVtZW50LmdldFBhcmVudFdoaWxlKG4gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChuLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5WYXJpYWJsZVN0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhcmlhYmxlUm91dGVzKG4uY29tcGlsZXJOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRQYXJlbnRWYXJpYWJsZVN0YXRlbWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChmb3VuZFBhcmVudFZhcmlhYmxlU3RhdGVtZW50KSB7XG4gICAgICAgICAgICAgICAgc3ByZWFkRWxlbWVudHNJblJvdXRlc1ZhcmlhYmxlU3RhdGVtZW50LnB1c2goc3ByZWFkRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbmxpbmUgdGhlIEFycmF5TGl0ZXJhbEV4cHJlc3Npb24gU3ByZWFkRWxlbWVudHNcbiAgICAgICAgZm9yIChjb25zdCBzcHJlYWRFbGVtZW50IG9mIHNwcmVhZEVsZW1lbnRzSW5Sb3V0ZXNWYXJpYWJsZVN0YXRlbWVudCkge1xuICAgICAgICAgICAgbGV0IHNwcmVhZEVsZW1lbnRJZGVudGlmaWVyID0gc3ByZWFkRWxlbWVudC5nZXRFeHByZXNzaW9uKCkuZ2V0VGV4dCgpLFxuICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0LFxuICAgICAgICAgICAgICAgIGFsaWFzT3JpZ2luYWxOYW1lID0gJycsXG4gICAgICAgICAgICAgICAgZm91bmRXaXRoQWxpYXNJbkltcG9ydHMgPSBmYWxzZSxcbiAgICAgICAgICAgICAgICBmb3VuZFdpdGhBbGlhcyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBUcnkgdG8gZmluZCBpdCBpbiBpbXBvcnRzXG4gICAgICAgICAgICBjb25zdCBpbXBvcnRzID0gZmlsZS5nZXRJbXBvcnREZWNsYXJhdGlvbnMoKTtcblxuICAgICAgICAgICAgaW1wb3J0cy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBuYW1lZEltcG9ydHMgPSBpLmdldE5hbWVkSW1wb3J0cygpLFxuICAgICAgICAgICAgICAgICAgICBuYW1lZEltcG9ydHNMZW5ndGggPSBuYW1lZEltcG9ydHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBqID0gMDtcblxuICAgICAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoajsgaiA8IG5hbWVkSW1wb3J0c0xlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wb3J0TmFtZSA9IG5hbWVkSW1wb3J0c1tqXS5nZXROYW1lTm9kZSgpLmdldFRleHQoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0QWxpYXM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNJZGVudGlmaWVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRBbGlhcyA9IG5hbWVkSW1wb3J0c1tqXS5nZXRBbGlhc0lkZW50aWZpZXIoKS5nZXRUZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnROYW1lID09PSBzcHJlYWRFbGVtZW50SWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzSW5JbXBvcnRzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0QWxpYXMgPT09IHNwcmVhZEVsZW1lbnRJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRXaXRoQWxpYXNJbkltcG9ydHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9IGltcG9ydE5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCByZWZlcmVuY2VkRGVjbGFyYXRpb247XG5cbiAgICAgICAgICAgIGlmIChmb3VuZFdpdGhBbGlhc0luSW1wb3J0cykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoZWRJbXBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnRQYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5kaXJuYW1lKGZpbGUuZ2V0RmlsZVBhdGgoKSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJy50cydcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRmlsZUltcG9ydCA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgYXN0LmdldFNvdXJjZUZpbGUoaW1wb3J0UGF0aCkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhc3QuZ2V0U291cmNlRmlsZShpbXBvcnRQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXN0LmFkZEV4aXN0aW5nU291cmNlRmlsZShpbXBvcnRQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGVJbXBvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YXJpYWJsZU5hbWUgPSBmb3VuZFdpdGhBbGlhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWxpYXNPcmlnaW5hbE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNwcmVhZEVsZW1lbnRJZGVudGlmaWVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZERlY2xhcmF0aW9uID0gc291cmNlRmlsZUltcG9ydC5nZXRWYXJpYWJsZURlY2xhcmF0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgbm90LCB0cnkgZGlyZWN0bHkgaW4gZmlsZVxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWREZWNsYXJhdGlvbiA9IHNwcmVhZEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgLmdldEV4cHJlc3Npb24oKVxuICAgICAgICAgICAgICAgICAgICAuZ2V0U3ltYm9sT3JUaHJvdygpXG4gICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZURlY2xhcmF0aW9uT3JUaHJvdygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIVR5cGVHdWFyZHMuaXNWYXJpYWJsZURlY2xhcmF0aW9uKHJlZmVyZW5jZWREZWNsYXJhdGlvbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBOb3QgaW1wbGVtZW50ZWQgcmVmZXJlbmNlZCBkZWNsYXJhdGlvbiBraW5kOiAke3JlZmVyZW5jZWREZWNsYXJhdGlvbi5nZXRLaW5kTmFtZSgpfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZWZlcmVuY2VkQXJyYXkgPSByZWZlcmVuY2VkRGVjbGFyYXRpb24uZ2V0SW5pdGlhbGl6ZXJJZktpbmRPclRocm93KFxuICAgICAgICAgICAgICAgIFN5bnRheEtpbmQuQXJyYXlMaXRlcmFsRXhwcmVzc2lvblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHNwcmVhZEVsZW1lbnRBcnJheSA9IHNwcmVhZEVsZW1lbnQuZ2V0UGFyZW50SWZLaW5kT3JUaHJvdyhcbiAgICAgICAgICAgICAgICBTeW50YXhLaW5kLkFycmF5TGl0ZXJhbEV4cHJlc3Npb25cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IHNwcmVhZEVsZW1lbnRBcnJheS5nZXRFbGVtZW50cygpLmluZGV4T2Yoc3ByZWFkRWxlbWVudCk7XG4gICAgICAgICAgICBzcHJlYWRFbGVtZW50QXJyYXkucmVtb3ZlRWxlbWVudChzcHJlYWRFbGVtZW50KTtcbiAgICAgICAgICAgIHNwcmVhZEVsZW1lbnRBcnJheS5pbnNlcnRFbGVtZW50cyhcbiAgICAgICAgICAgICAgICBpbnNlcnRJbmRleCxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VkQXJyYXkuZ2V0RWxlbWVudHMoKS5tYXAoZSA9PiBlLmdldFRleHQoKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYW5GaWxlRHluYW1pY3Moc291cmNlRmlsZTogU291cmNlRmlsZSk6IFNvdXJjZUZpbGUge1xuICAgICAgICBsZXQgZmlsZSA9IHNvdXJjZUZpbGU7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbnMgPSBmaWxlXG4gICAgICAgICAgICAuZ2V0RGVzY2VuZGFudHNPZktpbmQoU3ludGF4S2luZC5Qcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24pXG4gICAgICAgICAgICAuZmlsdGVyKHAgPT4gIVR5cGVHdWFyZHMuaXNQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24ocC5nZXRQYXJlbnRPclRocm93KCkpKTtcblxuICAgICAgICBsZXQgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uc0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbiBvZiBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlaXIgcGFyZW50cyBub2RlcywgYW5kIGlmIG9uZSBpcyBhIHZhcmlhYmxlU3RhdGVtZW50IGFuZCA9PT0gJ3JvdXRlcydcbiAgICAgICAgICAgIGxldCBmb3VuZFBhcmVudFZhcmlhYmxlU3RhdGVtZW50ID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uLmdldFBhcmVudFdoaWxlKG4gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChuLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5WYXJpYWJsZVN0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhcmlhYmxlUm91dGVzKG4uY29tcGlsZXJOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRQYXJlbnRWYXJpYWJsZVN0YXRlbWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChmb3VuZFBhcmVudFZhcmlhYmxlU3RhdGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uc0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQucHVzaChwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW5saW5lIHRoZSBwcm9wZXJ0eSBhY2Nlc3MgZXhwcmVzc2lvbnNcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24gb2YgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uc0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZWREZWNsYXJhdGlvbiA9IHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIC5nZXROYW1lTm9kZSgpXG4gICAgICAgICAgICAgICAgLmdldFN5bWJvbE9yVGhyb3coKVxuICAgICAgICAgICAgICAgIC5nZXRWYWx1ZURlY2xhcmF0aW9uT3JUaHJvdygpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFUeXBlR3VhcmRzLmlzUHJvcGVydHlBc3NpZ25tZW50KHJlZmVyZW5jZWREZWNsYXJhdGlvbikgJiZcbiAgICAgICAgICAgICAgICBUeXBlR3VhcmRzLmlzRW51bU1lbWJlcihyZWZlcmVuY2VkRGVjbGFyYXRpb24pICYmXG4gICAgICAgICAgICAgICAgKFR5cGVHdWFyZHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocmVmZXJlbmNlZERlY2xhcmF0aW9uKSAmJlxuICAgICAgICAgICAgICAgICAgICAhVHlwZUd1YXJkcy5pc0VudW1NZW1iZXIocmVmZXJlbmNlZERlY2xhcmF0aW9uKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYE5vdCBpbXBsZW1lbnRlZCByZWZlcmVuY2VkIGRlY2xhcmF0aW9uIGtpbmQ6ICR7cmVmZXJlbmNlZERlY2xhcmF0aW9uLmdldEtpbmROYW1lKCl9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlZmVyZW5jZWREZWNsYXJhdGlvbi5nZXRJbml0aWFsaXplck9yVGhyb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uLnJlcGxhY2VXaXRoVGV4dChcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZERlY2xhcmF0aW9uLmdldEluaXRpYWxpemVyT3JUaHJvdygpLmdldFRleHQoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXBsYWNlIGNhbGxleHByZXNzaW9ucyB3aXRoIHN0cmluZyA6IHV0aWxzLmRvV29yaygpIC0+ICd1dGlscy5kb1dvcmsoKScgZG9Xb3JrKCkgLT4gJ2RvV29yaygpJ1xuICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlIHRzLlNvdXJjZUZpbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYW5DYWxsRXhwcmVzc2lvbnMoc291cmNlRmlsZTogU291cmNlRmlsZSk6IFNvdXJjZUZpbGUge1xuICAgICAgICBsZXQgZmlsZSA9IHNvdXJjZUZpbGU7XG5cbiAgICAgICAgY29uc3QgdmFyaWFibGVTdGF0ZW1lbnRzID0gc291cmNlRmlsZS5nZXRWYXJpYWJsZURlY2xhcmF0aW9uKHYgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2LmNvbXBpbGVyTm9kZS50eXBlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHYuY29tcGlsZXJOb2RlLnR5cGUudHlwZU5hbWUudGV4dCA9PT0gJ1JvdXRlcyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBpbml0aWFsaXplciA9IHZhcmlhYmxlU3RhdGVtZW50cy5nZXRJbml0aWFsaXplcigpO1xuXG4gICAgICAgIGZvciAoY29uc3QgY2FsbEV4cHIgb2YgaW5pdGlhbGl6ZXIuZ2V0RGVzY2VuZGFudHNPZktpbmQoU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIGlmIChjYWxsRXhwci53YXNGb3Jnb3R0ZW4oKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbEV4cHIucmVwbGFjZVdpdGhUZXh0KHdyaXRlciA9PiB3cml0ZXIucXVvdGUoY2FsbEV4cHIuZ2V0VGV4dCgpKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhbiByb3V0ZXMgZGVmaW5pdGlvbiB3aXRoIGltcG9ydGVkIGRhdGEsIGZvciBleGFtcGxlIHBhdGgsIGNoaWxkcmVuLCBvciBkeW5hbWljIHN0dWZmIGluc2lkZSBkYXRhXG4gICAgICpcbiAgICAgKiBjb25zdCBNWV9ST1VURVM6IFJvdXRlcyA9IFtcbiAgICAgKiAgICAge1xuICAgICAqICAgICAgICAgcGF0aDogJ2hvbWUnLFxuICAgICAqICAgICAgICAgY29tcG9uZW50OiBIb21lQ29tcG9uZW50XG4gICAgICogICAgIH0sXG4gICAgICogICAgIHtcbiAgICAgKiAgICAgICAgIHBhdGg6IFBBVEhTLmhvbWUsXG4gICAgICogICAgICAgICBjb21wb25lbnQ6IEhvbWVDb21wb25lbnRcbiAgICAgKiAgICAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBUaGUgaW5pdGlhbGl6ZXIgaXMgYW4gYXJyYXkgKEFycmF5TGl0ZXJhbEV4cHJlc3Npb24gLSAxNzcgKSwgaXQgaGFzIGVsZW1lbnRzLCBvYmplY3RzIChPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiAtIDE3OClcbiAgICAgKiB3aXRoIHByb3BlcnRpZXMgKFByb3BlcnR5QXNzaWdubWVudCAtIDI2MSlcbiAgICAgKlxuICAgICAqIEZvciBlYWNoIGtub3cgcHJvcGVydHkgKGh0dHBzOi8vYW5ndWxhci5pby9hcGkvcm91dGVyL1JvdXRlcyNkZXNjcmlwdGlvbiksIHdlIHRyeSB0byBzZWUgaWYgd2UgaGF2ZSB3aGF0IHdlIHdhbnRcbiAgICAgKlxuICAgICAqIEV4OiBwYXRoIGFuZCBwYXRoTWF0Y2ggd2FudCBhIHN0cmluZywgY29tcG9uZW50IGEgY29tcG9uZW50IHJlZmVyZW5jZS5cbiAgICAgKlxuICAgICAqIEl0IGlzIGFuIGltcGVyYXRpdmUgYXBwcm9hY2gsIG5vdCBhIGdlbmVyaWMgd2F5LCBwYXJzaW5nIGFsbCB0aGUgdHJlZVxuICAgICAqIGFuZCBmaW5kIHNvbWV0aGluZyBsaWtlIHRoaXMgd2hpY2ggd2lsbGwgYnJlYWsgSlNPTi5zdHJpbmdpZnkgOiBNWUlNUE9SVC5wYXRoXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHt0cy5Ob2RlfSBpbml0aWFsaXplciBUaGUgbm9kZSBvZiByb3V0ZXMgZGVmaW5pdGlvblxuICAgICAqIEByZXR1cm4ge3RzLk5vZGV9ICAgICAgICAgICAgIFRoZSBlZGl0ZWQgbm9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhblJvdXRlc0RlZmluaXRpb25XaXRoSW1wb3J0KFxuICAgICAgICBpbml0aWFsaXplcjogdHMuQXJyYXlMaXRlcmFsRXhwcmVzc2lvbixcbiAgICAgICAgbm9kZTogdHMuTm9kZSxcbiAgICAgICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHRzLk5vZGUge1xuICAgICAgICBpbml0aWFsaXplci5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbikgPT4ge1xuICAgICAgICAgICAgZWxlbWVudC5wcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5OiB0cy5Qcm9wZXJ0eUFzc2lnbm1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcHJvcGVydHlOYW1lID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KCksXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SW5pdGlhbGl6ZXIgPSBwcm9wZXJ0eS5pbml0aWFsaXplcjtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdwYXRoJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncmVkaXJlY3RUbyc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ291dGxldCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3BhdGhNYXRjaCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlJbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUluaXRpYWxpemVyLmtpbmQgIT09IFN5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZGVudGlmaWVyKDcxKSB3b24ndCBicmVhayBwYXJzaW5nLCBidXQgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gcmV0cml2ZSB0aGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbigxNzkpIGV4OiBNWUlNUE9SVC5wYXRoIHdpbGwgYnJlYWsgaXQsIGZpbmQgaXQgaW4gaW1wb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SW5pdGlhbGl6ZXIua2luZCA9PT0gU3ludGF4S2luZC5Qcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdE9iamVjdExpdGVyYWxBdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlJbml0aWFsaXplci5uYW1lLmdldFRleHQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdE9iamVjdExpdGVyYWxBdHRyaWJ1dGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0T2JqZWN0TGl0ZXJhbEF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluaXRpYWxpemVyLmV4cHJlc3Npb24uZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmltcG9ydHNVdGlsLmZpbmRQcm9wZXJ0eVZhbHVlSW5JbXBvcnRPckxvY2FsVmFyaWFibGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdE9iamVjdExpdGVyYWxBdHRyaWJ1dGVOYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0T2JqZWN0TGl0ZXJhbEF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJbml0aWFsaXplci5raW5kID0gOTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJbml0aWFsaXplci50ZXh0ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGluaXRpYWxpemVyO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IHRzIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01vZHVsZVdpdGhQcm92aWRlcnMobm9kZTogdHMuVmFyaWFibGVTdGF0ZW1lbnQpOiBib29sZWFuIHtcbiAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgaWYgKG5vZGUuZGVjbGFyYXRpb25MaXN0KSB7XG4gICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMgJiYgbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBpID0gMCxcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnMgPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMsXG4gICAgICAgICAgICAgICAgbGVuID0gbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLmxlbmd0aDtcblxuICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVjbGFyYXRpb24gPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV07XG5cbiAgICAgICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZTogdHMuVHlwZVJlZmVyZW5jZU5vZGUgPSBkZWNsYXJhdGlvbi50eXBlIGFzIHRzLlR5cGVSZWZlcmVuY2VOb2RlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHQgPSB0eXBlLnR5cGVOYW1lLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0ID09PSAnTW9kdWxlV2l0aFByb3ZpZGVycycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCJpbXBvcnQgeyB0cyB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kdWxlV2l0aFByb3ZpZGVycyhub2RlOiB0cy5WYXJpYWJsZVN0YXRlbWVudCkge1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKG5vZGUuZGVjbGFyYXRpb25MaXN0KSB7XG4gICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMgJiYgbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBpID0gMCxcbiAgICAgICAgICAgICAgICBsZW4gPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMubGVuZ3RoO1xuXG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBkZWNsYXJhdGlvbiA9IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXTtcblxuICAgICAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbi50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlOiB0cy5UeXBlUmVmZXJlbmNlTm9kZSA9IGRlY2xhcmF0aW9uLnR5cGUgYXMgdHMuVHlwZVJlZmVyZW5jZU5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLnR5cGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IHR5cGUudHlwZU5hbWUuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQgPT09ICdNb2R1bGVXaXRoUHJvdmlkZXJzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlY2xhcmF0aW9uLmluaXRpYWxpemVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCJjb25zdCB1dWlkID0gcmVxdWlyZSgndXVpZC92NCcpO1xuXG5leHBvcnQgZnVuY3Rpb24gdW5pcWlkKCkge1xuICAgIHJldHVybiB1dWlkKCk7XG59IiwiZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RMZWFkaW5nVGV4dChzdHJpbmcsIGNvbXBsZXRlVGFnKSB7XG4gICAgbGV0IHRhZ0luZGV4ID0gc3RyaW5nLmluZGV4T2YoY29tcGxldGVUYWcpO1xuICAgIGxldCBsZWFkaW5nVGV4dCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgbGVhZGluZ1RleHRSZWdFeHAgPSAvXFxbKC4rPylcXF0vZztcbiAgICBsZXQgbGVhZGluZ1RleHRJbmZvID0gbGVhZGluZ1RleHRSZWdFeHAuZXhlYyhzdHJpbmcpO1xuXG4gICAgLy8gZGlkIHdlIGZpbmQgbGVhZGluZyB0ZXh0LCBhbmQgaWYgc28sIGRvZXMgaXQgaW1tZWRpYXRlbHkgcHJlY2VkZSB0aGUgdGFnP1xuICAgIHdoaWxlIChsZWFkaW5nVGV4dEluZm8gJiYgbGVhZGluZ1RleHRJbmZvLmxlbmd0aCkge1xuICAgICAgICBpZiAobGVhZGluZ1RleHRJbmZvLmluZGV4ICsgbGVhZGluZ1RleHRJbmZvWzBdLmxlbmd0aCA9PT0gdGFnSW5kZXgpIHtcbiAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGxlYWRpbmdUZXh0SW5mb1swXSwgJycpO1xuICAgICAgICAgICAgbGVhZGluZ1RleHQgPSBsZWFkaW5nVGV4dEluZm9bMV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGxlYWRpbmdUZXh0SW5mbyA9IGxlYWRpbmdUZXh0UmVnRXhwLmV4ZWMoc3RyaW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBsZWFkaW5nVGV4dDogbGVhZGluZ1RleHQsXG4gICAgICAgIHN0cmluZzogc3RyaW5nXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0TGlua1RleHQodGV4dCkge1xuICAgIGxldCBsaW5rVGV4dDtcbiAgICBsZXQgdGFyZ2V0O1xuICAgIGxldCBzcGxpdEluZGV4O1xuXG4gICAgLy8gaWYgYSBwaXBlIGlzIG5vdCBwcmVzZW50LCB3ZSBzcGxpdCBvbiB0aGUgZmlyc3Qgc3BhY2VcbiAgICBzcGxpdEluZGV4ID0gdGV4dC5pbmRleE9mKCd8Jyk7XG4gICAgaWYgKHNwbGl0SW5kZXggPT09IC0xKSB7XG4gICAgICAgIHNwbGl0SW5kZXggPSB0ZXh0LnNlYXJjaCgvXFxzLyk7XG4gICAgfVxuXG4gICAgaWYgKHNwbGl0SW5kZXggIT09IC0xKSB7XG4gICAgICAgIGxpbmtUZXh0ID0gdGV4dC5zdWJzdHIoc3BsaXRJbmRleCArIDEpO1xuICAgICAgICAvLyBOb3JtYWxpemUgc3Vic2VxdWVudCBuZXdsaW5lcyB0byBhIHNpbmdsZSBzcGFjZS5cbiAgICAgICAgbGlua1RleHQgPSBsaW5rVGV4dC5yZXBsYWNlKC9cXG4rLywgJyAnKTtcbiAgICAgICAgdGFyZ2V0ID0gdGV4dC5zdWJzdHIoMCwgc3BsaXRJbmRleCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGlua1RleHQ6IGxpbmtUZXh0LFxuICAgICAgICB0YXJnZXQ6IHRhcmdldCB8fCB0ZXh0XG4gICAgfTtcbn1cblxuZXhwb3J0IGxldCBMaW5rUGFyc2VyID0gKGZ1bmN0aW9uKCkge1xuICAgIGxldCBwcm9jZXNzVGhlTGluayA9IGZ1bmN0aW9uKHN0cmluZywgdGFnSW5mbywgbGVhZGluZ1RleHQpIHtcbiAgICAgICAgbGV0IGxlYWRpbmcgPSBleHRyYWN0TGVhZGluZ1RleHQoc3RyaW5nLCB0YWdJbmZvLmNvbXBsZXRlVGFnKSxcbiAgICAgICAgICAgIGxpbmtUZXh0LFxuICAgICAgICAgICAgc3BsaXQsXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2U7XG5cbiAgICAgICAgbGlua1RleHQgPSBsZWFkaW5nVGV4dCA/IGxlYWRpbmdUZXh0IDogbGVhZGluZy5sZWFkaW5nVGV4dCB8fCAnJztcblxuICAgICAgICBzcGxpdCA9IHNwbGl0TGlua1RleHQodGFnSW5mby50ZXh0KTtcbiAgICAgICAgdGFyZ2V0ID0gc3BsaXQudGFyZ2V0O1xuXG4gICAgICAgIGlmIChsZWFkaW5nLmxlYWRpbmdUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9ICdbJyArIGxlYWRpbmcubGVhZGluZ1RleHQgKyAnXScgKyB0YWdJbmZvLmNvbXBsZXRlVGFnO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcGxpdC5saW5rVGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9IHRhZ0luZm8uY29tcGxldGVUYWc7XG4gICAgICAgICAgICBsaW5rVGV4dCA9IHNwbGl0LmxpbmtUZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHN0cmluZ3RvUmVwbGFjZSwgJ1snICsgbGlua1RleHQgKyAnXSgnICsgdGFyZ2V0ICsgJyknKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydFxuICAgICAqIHtAbGluayBodHRwOi8vd3d3Lmdvb2dsZS5jb218R29vZ2xlfSBvciB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tIEdpdEh1Yn0gb3IgW0dpdGh1Yl17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tfSB0byBbR2l0aHViXShodHRwczovL2dpdGh1Yi5jb20pXG4gICAgICovXG5cbiAgICBsZXQgcmVwbGFjZUxpbmtUYWcgPSBmdW5jdGlvbihzdHI6IHN0cmluZykge1xuICAgICAgICBpZiAodHlwZW9mIHN0ciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmV3U3RyaW5nOiAnJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5ldyBSZWdFeHAoJ1xcXFxbKCg/Oi58XFxuKSs/KV1cXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKS5leGVjKCdlZSBbVE8gRE9de0BsaW5rIFRvZG99IGZvJykgLT4gXCJbVE8gRE9de0BsaW5rIFRvZG99XCIsIFwiVE8gRE9cIiwgXCJUb2RvXCJcbiAgICAgICAgLy8gbmV3IFJlZ0V4cCgnXFxcXHtAbGlua1xcXFxzKygoPzoufFxcbikrPylcXFxcfScsICdpJykuZXhlYygnZWUgW1RPRE9de0BsaW5rIFRvZG99IGZvJykgLT4gXCJ7QGxpbmsgVG9kb31cIiwgXCJUb2RvXCJcblxuICAgICAgICBsZXQgdGFnUmVnRXhwTGlnaHQgPSBuZXcgUmVnRXhwKCdcXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKSxcbiAgICAgICAgICAgIHRhZ1JlZ0V4cEZ1bGwgPSBuZXcgUmVnRXhwKCdcXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKSxcbiAgICAgICAgICAgIHRhZ1JlZ0V4cCxcbiAgICAgICAgICAgIG1hdGNoZXMsXG4gICAgICAgICAgICBwcmV2aW91c1N0cmluZyxcbiAgICAgICAgICAgIHRhZ0luZm8gPSBbXTtcblxuICAgICAgICB0YWdSZWdFeHAgPSBzdHIuaW5kZXhPZignXXsnKSAhPT0gLTEgPyB0YWdSZWdFeHBGdWxsIDogdGFnUmVnRXhwTGlnaHQ7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVwbGFjZU1hdGNoKHJlcGxhY2VyLCB0YWcsIG1hdGNoLCB0ZXh0LCBsaW5rVGV4dD8pIHtcbiAgICAgICAgICAgIGxldCBtYXRjaGVkVGFnID0ge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlVGFnOiBtYXRjaCxcbiAgICAgICAgICAgICAgICB0YWc6IHRhZyxcbiAgICAgICAgICAgICAgICB0ZXh0OiB0ZXh0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGFnSW5mby5wdXNoKG1hdGNoZWRUYWcpO1xuICAgICAgICAgICAgaWYgKGxpbmtUZXh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VyKHN0ciwgbWF0Y2hlZFRhZywgbGlua1RleHQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVwbGFjZXIoc3RyLCBtYXRjaGVkVGFnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIG1hdGNoZXMgPSB0YWdSZWdFeHAuZXhlYyhzdHIpO1xuICAgICAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c1N0cmluZyA9IHN0cjtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gcmVwbGFjZU1hdGNoKHByb2Nlc3NUaGVMaW5rLCAnbGluaycsIG1hdGNoZXNbMF0sIG1hdGNoZXNbMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gcmVwbGFjZU1hdGNoKHByb2Nlc3NUaGVMaW5rLCAnbGluaycsIG1hdGNoZXNbMF0sIG1hdGNoZXNbMl0sIG1hdGNoZXNbMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAobWF0Y2hlcyAmJiBwcmV2aW91c1N0cmluZyAhPT0gc3RyKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmV3U3RyaW5nOiBzdHJcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgbGV0IF9yZXNvbHZlTGlua3MgPSBmdW5jdGlvbihzdHI6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gcmVwbGFjZUxpbmtUYWcoc3RyKS5uZXdTdHJpbmc7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHJlc29sdmVMaW5rczogX3Jlc29sdmVMaW5rc1xuICAgIH07XG59KSgpO1xuIiwiZXhwb3J0IGVudW0gQW5ndWxhckxpZmVjeWNsZUhvb2tzIHtcbiAgICBuZ09uQ2hhbmdlcyxcbiAgICBuZ09uSW5pdCxcbiAgICBuZ0RvQ2hlY2ssXG4gICAgbmdBZnRlckNvbnRlbnRJbml0LFxuICAgIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCxcbiAgICBuZ0FmdGVyVmlld0luaXQsXG4gICAgbmdBZnRlclZpZXdDaGVja2VkLFxuICAgIG5nT25EZXN0cm95XG59XG4iLCJpbXBvcnQgeyB0cywgU3ludGF4S2luZCB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuXG5leHBvcnQgZnVuY3Rpb24ga2luZFRvVHlwZShraW5kOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGxldCBfdHlwZSA9ICcnO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuU3RyaW5nS2V5d29yZDpcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLlN0cmluZ0xpdGVyYWw6XG4gICAgICAgICAgICBfdHlwZSA9ICdzdHJpbmcnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5OdW1iZXJLZXl3b3JkOlxuICAgICAgICBjYXNlIFN5bnRheEtpbmQuTnVtZXJpY0xpdGVyYWw6XG4gICAgICAgICAgICBfdHlwZSA9ICdudW1iZXInO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5BcnJheVR5cGU6XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5BcnJheUxpdGVyYWxFeHByZXNzaW9uOlxuICAgICAgICAgICAgX3R5cGUgPSAnW10nO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5Wb2lkS2V5d29yZDpcbiAgICAgICAgICAgIF90eXBlID0gJ3ZvaWQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5GdW5jdGlvblR5cGU6XG4gICAgICAgICAgICBfdHlwZSA9ICdmdW5jdGlvbic7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLlR5cGVMaXRlcmFsOlxuICAgICAgICAgICAgX3R5cGUgPSAnbGl0ZXJhbCB0eXBlJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuQm9vbGVhbktleXdvcmQ6XG4gICAgICAgICAgICBfdHlwZSA9ICdib29sZWFuJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuQW55S2V5d29yZDpcbiAgICAgICAgICAgIF90eXBlID0gJ2FueSc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLk51bGxLZXl3b3JkOlxuICAgICAgICAgICAgX3R5cGUgPSAnbnVsbCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLk5ldmVyS2V5d29yZDpcbiAgICAgICAgICAgIF90eXBlID0gJ25ldmVyJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZDpcbiAgICAgICAgICAgIF90eXBlID0gJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLk9iamVjdEtleXdvcmQ6XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjpcbiAgICAgICAgICAgIF90eXBlID0gJ29iamVjdCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIF90eXBlO1xufVxuIiwiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IHRzIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IExpbmtQYXJzZXIgfSBmcm9tICcuL2xpbmstcGFyc2VyJztcblxuaW1wb3J0IHsgQW5ndWxhckxpZmVjeWNsZUhvb2tzIH0gZnJvbSAnLi9hbmd1bGFyLWxpZmVjeWNsZXMtaG9va3MnO1xuaW1wb3J0IHsga2luZFRvVHlwZSB9IGZyb20gJy4va2luZC10by10eXBlJztcblxuY29uc3QgZ2V0Q3VycmVudERpcmVjdG9yeSA9IHRzLnN5cy5nZXRDdXJyZW50RGlyZWN0b3J5O1xuY29uc3QgdXNlQ2FzZVNlbnNpdGl2ZUZpbGVOYW1lcyA9IHRzLnN5cy51c2VDYXNlU2Vuc2l0aXZlRmlsZU5hbWVzO1xuY29uc3QgbmV3TGluZSA9IHRzLnN5cy5uZXdMaW5lO1xuY29uc3QgbWFya2VkID0gcmVxdWlyZSgnbWFya2VkJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXdMaW5lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ld0xpbmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDYW5vbmljYWxGaWxlTmFtZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXNlQ2FzZVNlbnNpdGl2ZUZpbGVOYW1lcyA/IGZpbGVOYW1lIDogZmlsZU5hbWUudG9Mb3dlckNhc2UoKTtcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1hdERpYWdub3N0aWNzSG9zdDogdHMuRm9ybWF0RGlhZ25vc3RpY3NIb3N0ID0ge1xuICAgIGdldEN1cnJlbnREaXJlY3RvcnksXG4gICAgZ2V0Q2Fub25pY2FsRmlsZU5hbWUsXG4gICAgZ2V0TmV3TGluZVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlZHRhZ3ModGFnczogQXJyYXk8YW55Pikge1xuICAgIGxldCBtdGFncyA9IHRhZ3M7XG4gICAgXy5mb3JFYWNoKG10YWdzLCB0YWcgPT4ge1xuICAgICAgICB0YWcuY29tbWVudCA9IG1hcmtlZChMaW5rUGFyc2VyLnJlc29sdmVMaW5rcyh0YWcuY29tbWVudCkpO1xuICAgIH0pO1xuICAgIHJldHVybiBtdGFncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlVGFnc0FuZEFyZ3MoYXJnczogQXJyYXk8YW55PiwganNkb2N0YWdzPzogQXJyYXk8YW55Pik6IEFycmF5PGFueT4ge1xuICAgIGxldCBtYXJncyA9IF8uY2xvbmVEZWVwKGFyZ3MpO1xuICAgIF8uZm9yRWFjaChtYXJncywgYXJnID0+IHtcbiAgICAgICAgYXJnLnRhZ05hbWUgPSB7XG4gICAgICAgICAgICB0ZXh0OiAncGFyYW0nXG4gICAgICAgIH07XG4gICAgICAgIGlmIChqc2RvY3RhZ3MpIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaChqc2RvY3RhZ3MsIGpzZG9jdGFnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoanNkb2N0YWcubmFtZSAmJiBqc2RvY3RhZy5uYW1lLnRleHQgPT09IGFyZy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZy50YWdOYW1lID0ganNkb2N0YWcudGFnTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgYXJnLm5hbWUgPSBqc2RvY3RhZy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBhcmcuY29tbWVudCA9IGpzZG9jdGFnLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGFyZy50eXBlRXhwcmVzc2lvbiA9IGpzZG9jdGFnLnR5cGVFeHByZXNzaW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy8gQWRkIGV4YW1wbGUgJiByZXR1cm5zXG4gICAgaWYgKGpzZG9jdGFncykge1xuICAgICAgICBfLmZvckVhY2goanNkb2N0YWdzLCBqc2RvY3RhZyA9PiB7XG4gICAgICAgICAgICBpZiAoanNkb2N0YWcudGFnTmFtZSAmJiBqc2RvY3RhZy50YWdOYW1lLnRleHQgPT09ICdleGFtcGxlJykge1xuICAgICAgICAgICAgICAgIG1hcmdzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0YWdOYW1lOiBqc2RvY3RhZy50YWdOYW1lLFxuICAgICAgICAgICAgICAgICAgICBjb21tZW50OiBqc2RvY3RhZy5jb21tZW50XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAganNkb2N0YWcudGFnTmFtZSAmJlxuICAgICAgICAgICAgICAgIChqc2RvY3RhZy50YWdOYW1lLnRleHQgPT09ICdyZXR1cm5zJyB8fCBqc2RvY3RhZy50YWdOYW1lLnRleHQgPT09ICdyZXR1cm4nKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJldCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGFnTmFtZToganNkb2N0YWcudGFnTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudDoganNkb2N0YWcuY29tbWVudFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKGpzZG9jdGFnLnR5cGVFeHByZXNzaW9uICYmIGpzZG9jdGFnLnR5cGVFeHByZXNzaW9uLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0LnJldHVyblR5cGUgPSBraW5kVG9UeXBlKGpzZG9jdGFnLnR5cGVFeHByZXNzaW9uLnR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcmdzLnB1c2gocmV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBtYXJncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRDb25maWcoY29uZmlnRmlsZTogc3RyaW5nKTogYW55IHtcbiAgICBsZXQgcmVzdWx0ID0gdHMucmVhZENvbmZpZ0ZpbGUoY29uZmlnRmlsZSwgdHMuc3lzLnJlYWRGaWxlKTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdHMuZm9ybWF0RGlhZ25vc3RpY3MoW3Jlc3VsdC5lcnJvcl0sIGZvcm1hdERpYWdub3N0aWNzSG9zdCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5jb25maWc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcEJvbShzb3VyY2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHNvdXJjZS5jaGFyQ29kZUF0KDApID09PSAweGZlZmYpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zbGljZSgxKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0JvbShzb3VyY2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzb3VyY2UuY2hhckNvZGVBdCgwKSA9PT0gMHhmZWZmO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUGF0aChmaWxlczogQXJyYXk8c3RyaW5nPiwgY3dkOiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBsZXQgX2ZpbGVzID0gZmlsZXM7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBsZW4gPSBmaWxlcy5sZW5ndGg7XG5cbiAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZmlsZXNbaV0uaW5kZXhPZihjd2QpID09PSAtMSkge1xuICAgICAgICAgICAgZmlsZXNbaV0gPSBwYXRoLnJlc29sdmUoY3dkICsgcGF0aC5zZXAgKyBmaWxlc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gX2ZpbGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzKG1ldGhvZHM6IEFycmF5PGFueT4pOiBBcnJheTxhbnk+IHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgaWYgKHR5cGVvZiBtZXRob2RzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBtZXRob2RzLmxlbmd0aDtcbiAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghKG1ldGhvZHNbaV0ubmFtZSBpbiBBbmd1bGFyTGlmZWN5Y2xlSG9va3MpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobWV0aG9kc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuU291cmNlc0ZvcldhdGNoKGxpc3QpIHtcbiAgICByZXR1cm4gbGlzdC5maWx0ZXIoZWxlbWVudCA9PiB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCArIGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZXNDb21wYXJlRm4obmFtZT8pIHtcbiAgICAvKipcbiAgICAgKiBDb3B5cmlnaHQgaHR0cHM6Ly9naXRodWIuY29tL25nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcbiAgICAgKi9cbiAgICBuYW1lID0gbmFtZSB8fCAnbmFtZSc7XG4gICAgY29uc3QgdCA9IChhLCBiKSA9PiB7XG4gICAgICAgIGlmIChhW25hbWVdKSB7XG4gICAgICAgICAgICByZXR1cm4gYVtuYW1lXS5sb2NhbGVDb21wYXJlKGJbbmFtZV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJZ25vcmUobWVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKG1lbWJlci5qc0RvYykge1xuICAgICAgICBmb3IgKGNvbnN0IGRvYyBvZiBtZW1iZXIuanNEb2MpIHtcbiAgICAgICAgICAgIGlmIChkb2MudGFncykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIGRvYy50YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcudGFnTmFtZS50ZXh0LmluZGV4T2YoJ2lnbm9yZScpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG5pZiAoIUFycmF5LnByb3RvdHlwZS5pbmNsdWRlcykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsICdpbmNsdWRlcycsIHtcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHNlYXJjaEVsZW1lbnQsIGZyb21JbmRleCkge1xuICAgICAgICAgICAgaWYgKHRoaXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widGhpc1wiIGlzIG51bGwgb3Igbm90IGRlZmluZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gMS4gTGV0IE8gYmUgPyBUb09iamVjdCh0aGlzIHZhbHVlKS5cbiAgICAgICAgICAgIHZhciBvID0gT2JqZWN0KHRoaXMpO1xuXG4gICAgICAgICAgICAvLyAyLiBMZXQgbGVuIGJlID8gVG9MZW5ndGgoPyBHZXQoTywgXCJsZW5ndGhcIikpLlxuICAgICAgICAgICAgdmFyIGxlbiA9IG8ubGVuZ3RoID4+PiAwO1xuXG4gICAgICAgICAgICAvLyAzLiBJZiBsZW4gaXMgMCwgcmV0dXJuIGZhbHNlLlxuICAgICAgICAgICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gNC4gTGV0IG4gYmUgPyBUb0ludGVnZXIoZnJvbUluZGV4KS5cbiAgICAgICAgICAgIC8vICAgIChJZiBmcm9tSW5kZXggaXMgdW5kZWZpbmVkLCB0aGlzIHN0ZXAgcHJvZHVjZXMgdGhlIHZhbHVlIDAuKVxuICAgICAgICAgICAgdmFyIG4gPSBmcm9tSW5kZXggfCAwO1xuXG4gICAgICAgICAgICAvLyA1LiBJZiBuIOKJpSAwLCB0aGVuXG4gICAgICAgICAgICAvLyAgYS4gTGV0IGsgYmUgbi5cbiAgICAgICAgICAgIC8vIDYuIEVsc2UgbiA8IDAsXG4gICAgICAgICAgICAvLyAgYS4gTGV0IGsgYmUgbGVuICsgbi5cbiAgICAgICAgICAgIC8vICBiLiBJZiBrIDwgMCwgbGV0IGsgYmUgMC5cbiAgICAgICAgICAgIHZhciBrID0gTWF0aC5tYXgobiA+PSAwID8gbiA6IGxlbiAtIE1hdGguYWJzKG4pLCAwKTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gc2FtZVZhbHVlWmVybyh4LCB5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgeCA9PT0geSB8fFxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHggPT09ICdudW1iZXInICYmIHR5cGVvZiB5ID09PSAnbnVtYmVyJyAmJiBpc05hTih4KSAmJiBpc05hTih5KSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyA3LiBSZXBlYXQsIHdoaWxlIGsgPCBsZW5cbiAgICAgICAgICAgIHdoaWxlIChrIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgLy8gYS4gTGV0IGVsZW1lbnRLIGJlIHRoZSByZXN1bHQgb2YgPyBHZXQoTywgISBUb1N0cmluZyhrKSkuXG4gICAgICAgICAgICAgICAgLy8gYi4gSWYgU2FtZVZhbHVlWmVybyhzZWFyY2hFbGVtZW50LCBlbGVtZW50SykgaXMgdHJ1ZSwgcmV0dXJuIHRydWUuXG4gICAgICAgICAgICAgICAgaWYgKHNhbWVWYWx1ZVplcm8ob1trXSwgc2VhcmNoRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGMuIEluY3JlYXNlIGsgYnkgMS5cbiAgICAgICAgICAgICAgICBrKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIDguIFJldHVybiBmYWxzZVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmltcG9ydCB7IERlcGVuZGVuY2llc0VuZ2luZSB9IGZyb20gJy4uL2RlcGVuZGVuY2llcy5lbmdpbmUnO1xuaW1wb3J0IHsgQW5ndWxhclZlcnNpb25VdGlsLCBCYXNpY1R5cGVVdGlsIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkludGVyZmFjZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyB0cyB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25TaWduYXR1cmVIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHJpdmF0ZSBhbmd1bGFyVmVyc2lvblV0aWwgPSBuZXcgQW5ndWxhclZlcnNpb25VdGlsKCk7XG4gICAgcHJpdmF0ZSBiYXNpY1R5cGVVdGlsID0gbmV3IEJhc2ljVHlwZVV0aWwoKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UsXG4gICAgICAgIHByaXZhdGUgZGVwZW5kZW5jaWVzRW5naW5lOiBEZXBlbmRlbmNpZXNFbmdpbmVcbiAgICApIHt9XG5cbiAgICBwcml2YXRlIGhhbmRsZUZ1bmN0aW9uKGFyZyk6IHN0cmluZyB7XG4gICAgICAgIGlmIChhcmcuZnVuY3Rpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7YXJnLm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKGFyZyl9OiAoKSA9PiB2b2lkYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhcmd1bXMgPSBhcmcuZnVuY3Rpb24ubWFwKGFyZ3UgPT4ge1xuICAgICAgICAgICAgbGV0IF9yZXN1bHQgPSB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5maW5kKGFyZ3UudHlwZSk7XG4gICAgICAgICAgICBpZiAoX3Jlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0LnNvdXJjZSA9PT0gJ2ludGVybmFsJykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IF9yZXN1bHQuZGF0YS50eXBlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoX3Jlc3VsdC5kYXRhLnR5cGUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAnY2xhc3NlJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJndS5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhhcmcpfTogPGEgaHJlZj1cIi4uLyR7cGF0aH1zLyR7XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEubmFtZVxuICAgICAgICAgICAgICAgICAgICB9Lmh0bWxcIj4ke2FyZ3UudHlwZX08L2E+YDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IHRoaXMuYW5ndWxhclZlcnNpb25VdGlsLmdldEFwaUxpbmsoXG4gICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYW5ndWxhclZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2FyZ3UubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdcbiAgICAgICAgICAgICAgICAgICAgKX06IDxhIGhyZWY9XCIke3BhdGh9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHthcmd1LnR5cGV9PC9hPmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmJhc2ljVHlwZVV0aWwuaXNLbm93blR5cGUoYXJndS50eXBlKSkge1xuICAgICAgICAgICAgICAgIGxldCBwYXRoID0gdGhpcy5iYXNpY1R5cGVVdGlsLmdldFR5cGVVcmwoYXJndS50eXBlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJndS5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgYXJnXG4gICAgICAgICAgICAgICAgKX06IDxhIGhyZWY9XCIke3BhdGh9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHthcmd1LnR5cGV9PC9hPmA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChhcmd1Lm5hbWUgJiYgYXJndS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmd1Lm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKGFyZyl9OiAke2FyZ3UudHlwZX1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmd1Lm5hbWUudGV4dH1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBgJHthcmcubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKX06ICgke2FyZ3Vtc30pID0+IHZvaWRgO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGFyZy5vcHRpb25hbCA/ICc/JyA6ICcnO1xuICAgIH1cblxuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgbWV0aG9kKSB7XG4gICAgICAgIGxldCBhcmdzID0gW107XG5cbiAgICAgICAgaWYgKG1ldGhvZC5hcmdzKSB7XG4gICAgICAgICAgICBhcmdzID0gbWV0aG9kLmFyZ3NcbiAgICAgICAgICAgICAgICAubWFwKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBfcmVzdWx0ID0gdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZmluZChhcmcudHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3Jlc3VsdC5zb3VyY2UgPT09ICdpbnRlcm5hbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IF9yZXN1bHQuZGF0YS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0LmRhdGEudHlwZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gJ2NsYXNzZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmcubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9OiA8YSBocmVmPVwiLi4vJHtwYXRofXMvJHtfcmVzdWx0LmRhdGEubmFtZX0uaHRtbFwiPiR7YXJnLnR5cGV9PC9hPmA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gdGhpcy5hbmd1bGFyVmVyc2lvblV0aWwuZ2V0QXBpTGluayhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYW5ndWxhclZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmcubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9OiA8YSBocmVmPVwiJHtwYXRofVwiIHRhcmdldD1cIl9ibGFua1wiPiR7YXJnLnR5cGV9PC9hPmA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmRvdERvdERvdFRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYC4uLiR7YXJnLm5hbWV9OiAke2FyZy50eXBlfWA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVGdW5jdGlvbihhcmcpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYmFzaWNUeXBlVXRpbC5pc0tub3duVHlwZShhcmcudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gdGhpcy5iYXNpY1R5cGVVdGlsLmdldFR5cGVVcmwoYXJnLnR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2FyZy5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdcbiAgICAgICAgICAgICAgICAgICAgICAgICl9OiA8YSBocmVmPVwiJHtwYXRofVwiIHRhcmdldD1cIl9ibGFua1wiPiR7YXJnLnR5cGV9PC9hPmA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJnLm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKGFyZyl9OiAke2FyZy50eXBlfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRob2QubmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGAke21ldGhvZC5uYW1lfSgke2FyZ3N9KWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYCgke2FyZ3N9KWA7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9jb25maWd1cmF0aW9uLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBJc05vdFRvZ2dsZUhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdHlwZSwgb3B0aW9ucykge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnRvZ2dsZU1lbnVJdGVtcy5pbmRleE9mKHR5cGUpO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudG9nZ2xlTWVudUl0ZW1zLmluZGV4T2YoJ2FsbCcpICE9PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBJc0luaXRpYWxUYWJIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCB0YWJzOiBBcnJheTxhbnk+LCB0YWJJZDogU3RyaW5nLCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRhYnNbMF0uaWQgPT09IHRhYklkID8gb3B0aW9ucy5mbihjb250ZXh0KSA6IG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGNsYXNzIElzVGFiRW5hYmxlZEhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHRhYnM6IEFycmF5PGFueT4sIHRhYklkOiBTdHJpbmcsIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBsZXQgaXNUYWJFbmFibGVkID0gLTEgIT09IF8uZmluZEluZGV4KHRhYnMsIHsgaWQ6IHRhYklkIH0pO1xuICAgICAgICByZXR1cm4gaXNUYWJFbmFibGVkID8gb3B0aW9ucy5mbihjb250ZXh0KSA6IG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIElmU3RyaW5nSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgYTogYW55LCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpOiBzdHJpbmcge1xuICAgICAgICBpZiAodHlwZW9mIGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIE9yTGVuZ3RoSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgLyogYW55LCBhbnksIC4uLiwgb3B0aW9ucyAqLykge1xuICAgICAgICBsZXQgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICAgIGxldCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMgPSBhcmd1bWVudHNbbGVuXTtcblxuICAgICAgICAvLyBXZSBzdGFydCBhdCAxIGJlY2F1c2Ugb2Ygb3B0aW9uc1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoYXJndW1lbnRzW2ldKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UoY29udGV4dCk7XG4gICAgfVxufSIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgRmlsdGVyQW5ndWxhcjJNb2R1bGVzSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGV4dDogc3RyaW5nLCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgTkcyX01PRFVMRVM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ0Jyb3dzZXJNb2R1bGUnLFxuICAgICAgICAgICAgJ0Zvcm1zTW9kdWxlJyxcbiAgICAgICAgICAgICdIdHRwTW9kdWxlJyxcbiAgICAgICAgICAgICdSb3V0ZXJNb2R1bGUnXG4gICAgICAgIF07XG4gICAgICAgIGxldCBsZW4gPSBORzJfTU9EVUxFUy5sZW5ndGg7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKHRleHQuaW5kZXhPZihORzJfTU9EVUxFU1tpXSkgPiAtMSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufSIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIERlYnVnSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgb3B0aW9uYWxWYWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDdXJyZW50IENvbnRleHQnKTtcbiAgICAgICAgY29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT09Jyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNvbnRleHQpO1xuXG4gICAgICAgIGlmIChvcHRpb25hbFZhbHVlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnT3B0aW9uYWxWYWx1ZScpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT09Jyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhvcHRpb25hbFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5pbXBvcnQgKiBhcyBIYW5kbGViYXJzIGZyb20gJ2hhbmRsZWJhcnMnO1xuXG5leHBvcnQgY2xhc3MgQnJlYWtMaW5lc0hlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJhcnMpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHRleHQgPSB0aGlzLmJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbih0ZXh0KTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvKFxcclxcbnxcXG58XFxyKS9nbSwgJzxicj4nKTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvIC9nbSwgJyZuYnNwOycpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cdC9nbSwgJyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOycpO1xuICAgICAgICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuU2FmZVN0cmluZyh0ZXh0KTtcbiAgICB9XG59IiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0ICogYXMgSGFuZGxlYmFycyBmcm9tICdoYW5kbGViYXJzJztcblxuZXhwb3J0IGNsYXNzIENsZWFuUGFyYWdyYXBoSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLzxwPi9nbSwgJycpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC88XFwvcD4vZ20sICcnKTtcbiAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGViYXJzLlNhZmVTdHJpbmcodGV4dCk7XG4gICAgfVxufSIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEVzY2FwZVNpbXBsZVF1b3RlSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvKFxcclxcbnxcXG58XFxyKS9nbSwgJycpO1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG59IiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0ICogYXMgSGFuZGxlYmFycyBmcm9tICdoYW5kbGViYXJzJztcblxuZXhwb3J0IGNsYXNzIEJyZWFrQ29tbWFIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBiYXJzKSB7IH1cblxuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHRleHQgPSB0aGlzLmJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbih0ZXh0KTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvLC9nLCAnLDxicj4nKTtcbiAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGViYXJzLlNhZmVTdHJpbmcodGV4dCk7XG4gICAgfVxufSIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCAqIGFzIEhhbmRsZWJhcnMgZnJvbSAnaGFuZGxlYmFycyc7XG5cbmltcG9ydCB7IHRzLCBTeW50YXhLaW5kIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5cbmV4cG9ydCBjbGFzcyBNb2RpZktpbmRIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIFN5bnRheEtpbmQgaW50byBzdHJpbmdcbiAgICAgKiBAcGFyYW0gIHthbnl9ICAgICAgICAgICBjb250ZXh0IEhhbmRsZWJhcnMgY29udGV4dFxuICAgICAqIEBwYXJhbSAge1N5bnRheEtpbmRbXX0ga2luZCAgU3ludGF4S2luZCBjb25jYXRlbmF0ZWRcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAgIFBhcnNlZCBzdHJpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGtpbmQ6IFN5bnRheEtpbmRbXSkge1xuICAgICAgICBsZXQgX2tpbmRUZXh0ID0gJyc7XG4gICAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkOlxuICAgICAgICAgICAgICAgIF9raW5kVGV4dCA9ICdQcml2YXRlJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5SZWFkb25seUtleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ1JlYWRvbmx5JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5Qcm90ZWN0ZWRLZXl3b3JkOlxuICAgICAgICAgICAgICAgIF9raW5kVGV4dCA9ICdQcm90ZWN0ZWQnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlB1YmxpY0tleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ1B1YmxpYyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuU3RhdGljS2V5d29yZDpcbiAgICAgICAgICAgICAgICBfa2luZFRleHQgPSAnU3RhdGljJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5Bc3luY0tleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ0FzeW5jJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5BYnN0cmFjdEtleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ0Fic3RyYWN0JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuU2FmZVN0cmluZyhfa2luZFRleHQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuaW1wb3J0IHsgdHMsIFN5bnRheEtpbmQgfSBmcm9tICd0cy1zaW1wbGUtYXN0JztcblxuZXhwb3J0IGNsYXNzIE1vZGlmSWNvbkhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGtpbmQ6IFN5bnRheEtpbmQpOiBzdHJpbmcge1xuICAgICAgICBsZXQgX2tpbmRUZXh0ID0gJyc7XG4gICAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkOlxuICAgICAgICAgICAgICAgIF9raW5kVGV4dCA9ICdsb2NrJzsgLy8gcHJpdmF0ZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ2xvY2snOyAvLyBwcm90ZWN0ZWRcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5TdGF0aWNLZXl3b3JkOlxuICAgICAgICAgICAgICAgIF9raW5kVGV4dCA9ICdyZXNldCc7IC8vIHN0YXRpY1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLkV4cG9ydEtleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ2V4cG9ydCc7IC8vIGV4cG9ydFxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBfa2luZFRleHQgPSAncmVzZXQnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfa2luZFRleHQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgUmVsYXRpdmVVUkxIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBjdXJyZW50RGVwdGg6IG51bWJlciwgb3B0aW9ucyk6IHN0cmluZyB7XG4gICAgICAgIHN3aXRjaCAoY3VycmVudERlcHRoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgcmV0dXJuICcuLyc7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICcuLi8nLnJlcGVhdChjdXJyZW50RGVwdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEpzZG9jUmV0dXJuc0NvbW1lbnRIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBqc2RvY1RhZ3M6IEFycmF5PGFueT4sIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBqc2RvY1RhZ3MubGVuZ3RoO1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50YWdOYW1lLnRleHQgPT09ICdyZXR1cm5zJyB8fCBqc2RvY1RhZ3NbaV0udGFnTmFtZS50ZXh0ID09PSAncmV0dXJuJykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqc2RvY1RhZ3NbaV0uY29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufSIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSnNkb2NUYWdJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2pzZG9jLXRhZy5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgSnNkb2NDb2RlRXhhbXBsZUhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcblxuICAgIHByaXZhdGUgY2xlYW5UYWcoY29tbWVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGNvbW1lbnQuY2hhckF0KDApID09PSAnKicpIHtcbiAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tZW50LnN1YnN0cmluZygxLCBjb21tZW50Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1lbnQuY2hhckF0KDApID09PSAnICcpIHtcbiAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tZW50LnN1YnN0cmluZygxLCBjb21tZW50Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1lbnQuaW5kZXhPZignPHA+JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tZW50LnN1YnN0cmluZygzLCBjb21tZW50Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1lbnQuc3Vic3RyKC0xKSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tZW50LnN1YnN0cmluZygwLCBjb21tZW50Lmxlbmd0aCAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tZW50LnN1YnN0cigtNCkgPT09ICc8L3A+Jykge1xuICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnQuc3Vic3RyaW5nKDAsIGNvbW1lbnQubGVuZ3RoIC0gNCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRIdG1sRW50aXRpZXMoc3RyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhzdHIpLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBqc2RvY1RhZ3M6IEpzZG9jVGFnSW50ZXJmYWNlW10sIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBqc2RvY1RhZ3MubGVuZ3RoO1xuICAgICAgICBsZXQgdGFncyA9IFtdO1xuICAgICAgICBsZXQgdHlwZSA9ICdodG1sJztcblxuICAgICAgICBpZiAob3B0aW9ucy5oYXNoLnR5cGUpIHtcbiAgICAgICAgICAgIHR5cGUgPSBvcHRpb25zLmhhc2gudHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUudGV4dCA9PT0gJ2V4YW1wbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWcgPSB7fSBhcyBKc2RvY1RhZ0ludGVyZmFjZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLmNvbW1lbnQuaW5kZXhPZignPGNhcHRpb24+JykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLmNvbW1lbnQgPSBqc2RvY1RhZ3NbaV0uY29tbWVudC5yZXBsYWNlKC88Y2FwdGlvbj4vZywgJzxiPjxpPicpLnJlcGxhY2UoL1xcL2NhcHRpb24+L2csICcvYj48L2k+Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5jb21tZW50ID0gYDxwcmUgY2xhc3M9XCJsaW5lLW51bWJlcnNcIj48Y29kZSBjbGFzcz1cImxhbmd1YWdlLSR7dHlwZX1cIj5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRIdG1sRW50aXRpZXModGhpcy5jbGVhblRhZyhqc2RvY1RhZ3NbaV0uY29tbWVudCkpICsgYDwvY29kZT48L3ByZT5gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFncy5wdXNoKHRhZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb250ZXh0LnRhZ3MgPSB0YWdzO1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiaW1wb3J0IHsgSnNkb2NUYWdJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2pzZG9jLXRhZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBKc2RvY0V4YW1wbGVIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBqc2RvY1RhZ3M6IEpzZG9jVGFnSW50ZXJmYWNlW10sIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBqc2RvY1RhZ3MubGVuZ3RoO1xuICAgICAgICBsZXQgdGFncyA9IFtdO1xuXG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUudGV4dCA9PT0gJ2V4YW1wbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWcgPSB7fSBhcyBKc2RvY1RhZ0ludGVyZmFjZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWcuY29tbWVudCA9IGpzZG9jVGFnc1tpXS5jb21tZW50LnJlcGxhY2UoLzxjYXB0aW9uPi9nLCAnPGI+PGk+JykucmVwbGFjZSgvXFwvY2FwdGlvbj4vZywgJy9iPjwvaT4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0YWdzLnB1c2godGFnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29udGV4dC50YWdzID0gdGFncztcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufSIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSnNkb2NUYWdJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2pzZG9jLXRhZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsga2luZFRvVHlwZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2tpbmQtdG8tdHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBKc2RvY1BhcmFtc0hlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhcbiAgICAgICAgY29udGV4dDogYW55LFxuICAgICAgICBqc2RvY1RhZ3M6IEFycmF5PEpzZG9jVGFnSW50ZXJmYWNlIHwgYW55PixcbiAgICAgICAgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zXG4gICAgKSB7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgbGV0IGxlbiA9IGpzZG9jVGFncy5sZW5ndGg7XG4gICAgICAgIGxldCB0YWdzID0gW107XG5cbiAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udGFnTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udGFnTmFtZS50ZXh0ID09PSAncGFyYW0nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWcgPSB7fSBhcyBKc2RvY1RhZ0ludGVyZmFjZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50eXBlRXhwcmVzc2lvbiAmJiBqc2RvY1RhZ3NbaV0udHlwZUV4cHJlc3Npb24udHlwZS5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWcudHlwZSA9IGtpbmRUb1R5cGUoanNkb2NUYWdzW2ldLnR5cGVFeHByZXNzaW9uLnR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50eXBlRXhwcmVzc2lvbiAmJiBqc2RvY1RhZ3NbaV0udHlwZUV4cHJlc3Npb24udHlwZS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWcudHlwZSA9IGpzZG9jVGFnc1tpXS50eXBlRXhwcmVzc2lvbi50eXBlLm5hbWUudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy50eXBlID0ganNkb2NUYWdzW2ldLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWcuY29tbWVudCA9IGpzZG9jVGFnc1tpXS5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0uZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWcuZGVmYXVsdFZhbHVlID0ganNkb2NUYWdzW2ldLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0ubmFtZS50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLm5hbWUgPSBqc2RvY1RhZ3NbaV0ubmFtZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcubmFtZSA9IGpzZG9jVGFnc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0ub3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICh0YWcgYXMgYW55KS5vcHRpb25hbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGFncy5wdXNoKHRhZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0YWdzLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICBjb250ZXh0LnRhZ3MgPSB0YWdzO1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IEpzZG9jVGFnSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9qc2RvYy10YWcuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEpzZG9jUGFyYW1zVmFsaWRIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBqc2RvY1RhZ3M6IEpzZG9jVGFnSW50ZXJmYWNlW10sIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBqc2RvY1RhZ3MubGVuZ3RoO1xuICAgICAgICBsZXQgdGFncyA9IFtdO1xuICAgICAgICBsZXQgdmFsaWQgPSBmYWxzZTtcblxuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50YWdOYW1lLnRleHQgPT09ICdwYXJhbScpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IEpzZG9jVGFnSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9qc2RvYy10YWcuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEpzZG9jRGVmYXVsdEhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGpzZG9jVGFnczogSnNkb2NUYWdJbnRlcmZhY2VbXSwgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zKSB7XG4gICAgICAgIGlmIChqc2RvY1RhZ3MpIHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSBqc2RvY1RhZ3MubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IHRhZyA9IHt9IGFzIEpzZG9jVGFnSW50ZXJmYWNlO1xuICAgICAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udGFnTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUudGV4dCA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50eXBlRXhwcmVzc2lvbiAmJiBqc2RvY1RhZ3NbaV0udHlwZUV4cHJlc3Npb24udHlwZS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnR5cGUgPSBqc2RvY1RhZ3NbaV0udHlwZUV4cHJlc3Npb24udHlwZS5uYW1lLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcuY29tbWVudCA9IGpzZG9jVGFnc1tpXS5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLm5hbWUgPSBqc2RvY1RhZ3NbaV0ubmFtZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQudGFnID0gdGFnO1xuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRGVwZW5kZW5jaWVzRW5naW5lIH0gZnJvbSAnLi4vZGVwZW5kZW5jaWVzLmVuZ2luZSc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9jb25maWd1cmF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBBbmd1bGFyVmVyc2lvblV0aWwsIEJhc2ljVHlwZVV0aWwgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBMaW5rVHlwZUhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwcml2YXRlIGFuZ3VsYXJWZXJzaW9uVXRpbCA9IG5ldyBBbmd1bGFyVmVyc2lvblV0aWwoKTtcbiAgICBwcml2YXRlIGJhc2ljVHlwZVV0aWwgPSBuZXcgQmFzaWNUeXBlVXRpbCgpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbkludGVyZmFjZSxcbiAgICAgICAgcHJpdmF0ZSBkZXBlbmRlbmNpZXNFbmdpbmU6IERlcGVuZGVuY2llc0VuZ2luZSkge1xuXG4gICAgfVxuXG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBsZXQgX3Jlc3VsdCA9IHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmZpbmQobmFtZSk7XG4gICAgICAgIGxldCBhbmd1bGFyRG9jUHJlZml4ID0gdGhpcy5hbmd1bGFyVmVyc2lvblV0aWwucHJlZml4T2ZmaWNpYWxEb2ModGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJWZXJzaW9uKTtcbiAgICAgICAgaWYgKF9yZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbnRleHQudHlwZSA9IHtcbiAgICAgICAgICAgICAgICByYXc6IG5hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoX3Jlc3VsdC5zb3VyY2UgPT09ICdpbnRlcm5hbCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoX3Jlc3VsdC5kYXRhLnR5cGUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5kYXRhLnR5cGUgPSAnY2xhc3NlJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGV4dC50eXBlLmhyZWYgPSAnLi4vJyArIF9yZXN1bHQuZGF0YS50eXBlICsgJ3MvJyArIF9yZXN1bHQuZGF0YS5uYW1lICsgJy5odG1sJztcbiAgICAgICAgICAgICAgICBpZiAoX3Jlc3VsdC5kYXRhLnR5cGUgPT09ICdtaXNjZWxsYW5lb3VzJyB8fCAoX3Jlc3VsdC5kYXRhLmN0eXBlICYmIF9yZXN1bHQuZGF0YS5jdHlwZSA9PT0gJ21pc2NlbGxhbmVvdXMnKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFpbnBhZ2UgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfcmVzdWx0LmRhdGEuc3VidHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW51bSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBhZ2UgPSAnZW51bWVyYXRpb25zJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucGFnZSA9ICdmdW5jdGlvbnMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndHlwZWFsaWFzJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucGFnZSA9ICd0eXBlYWxpYXNlcyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2YXJpYWJsZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBhZ2UgPSAndmFyaWFibGVzJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnR5cGUuaHJlZiA9ICcuLi8nICsgX3Jlc3VsdC5kYXRhLmN0eXBlICsgJy8nICsgbWFpbnBhZ2UgKyAnLmh0bWwjJyArIF9yZXN1bHQuZGF0YS5uYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250ZXh0LnR5cGUudGFyZ2V0ID0gJ19zZWxmJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC50eXBlLmhyZWYgPSBgaHR0cHM6Ly8ke2FuZ3VsYXJEb2NQcmVmaXh9YW5ndWxhci5pby8ke19yZXN1bHQuZGF0YS5wYXRofWA7XG4gICAgICAgICAgICAgICAgY29udGV4dC50eXBlLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmJhc2ljVHlwZVV0aWwuaXNLbm93blR5cGUobmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnRleHQudHlwZSA9IHtcbiAgICAgICAgICAgICAgICByYXc6IG5hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb250ZXh0LnR5cGUudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICBjb250ZXh0LnR5cGUuaHJlZiA9IHRoaXMuYmFzaWNUeXBlVXRpbC5nZXRUeXBlVXJsKG5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgSW5kZXhhYmxlU2lnbmF0dXJlSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgbWV0aG9kKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBtZXRob2QuYXJncy5tYXAoYXJnID0+IGAke2FyZy5uYW1lfTogJHthcmcudHlwZX1gKS5qb2luKCcsICcpO1xuICAgICAgICBpZiAobWV0aG9kLm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHttZXRob2QubmFtZX1bJHthcmdzfV1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHthcmdzfV1gO1xuICAgICAgICB9XG4gICAgfVxufSIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCAqIGFzIEhhbmRsZWJhcnMgZnJvbSAnaGFuZGxlYmFycyc7XG5cbmV4cG9ydCBjbGFzcyBPYmplY3RIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgdGV4dCA9IEpTT04uc3RyaW5naWZ5KHRleHQpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC97XCIvLCAnezxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcIicpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8sXCIvLCAnLDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcIicpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC99JC8sICc8YnI+fScpO1xuICAgICAgICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuU2FmZVN0cmluZyh0ZXh0KTtcbiAgICB9XG59IiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBPYmplY3RMZW5ndGhIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBvYmo6IE9iamVjdCwgb3BlcmF0b3I6IHN0cmluZywgbGVuZ3RoOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO1xuICAgICAgICBsZXQgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zID0gYXJndW1lbnRzW2xlbl07XG5cbiAgICAgICAgaWYoIHR5cGVvZiBvYmogIT09ICdvYmplY3QnICkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzaXplID0gMCxcbiAgICAgICAgICAgIGtleTtcbiAgICAgICAgZm9yIChrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBzaXplKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICBjYXNlICc9PT0nOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNpemUgPT09IGxlbmd0aDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJyE9PSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gc2l6ZSAhPT0gbGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gc2l6ZSA+IGxlbmd0aDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hlbHBlciB7e29iamVjdExlbmd0aH19OiBpbnZhbGlkIG9wZXJhdG9yOiBgJyArIG9wZXJhdG9yICsgJ2AnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBleHRyYWN0TGVhZGluZ1RleHQsIHNwbGl0TGlua1RleHQgfSBmcm9tICcuLi8uLi8uLi91dGlscy9saW5rLXBhcnNlcic7XG5pbXBvcnQgeyBEZXBlbmRlbmNpZXNFbmdpbmUgfSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuZW5naW5lJztcblxuZXhwb3J0IGNsYXNzIFBhcnNlRGVzY3JpcHRpb25IZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBkZXBlbmRlbmNpZXNFbmdpbmU6IERlcGVuZGVuY2llc0VuZ2luZSkge31cblxuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgZGVzY3JpcHRpb246IHN0cmluZywgZGVwdGg6IG51bWJlcikge1xuICAgICAgICBsZXQgdGFnUmVnRXhwTGlnaHQgPSBuZXcgUmVnRXhwKCdcXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKTtcbiAgICAgICAgbGV0IHRhZ1JlZ0V4cEZ1bGwgPSBuZXcgUmVnRXhwKCdcXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKTtcbiAgICAgICAgbGV0IHRhZ1JlZ0V4cDtcbiAgICAgICAgbGV0IG1hdGNoZXM7XG4gICAgICAgIGxldCBwcmV2aW91c1N0cmluZztcbiAgICAgICAgbGV0IHRhZ0luZm8gPSBbXTtcblxuICAgICAgICB0YWdSZWdFeHAgPSBkZXNjcmlwdGlvbi5pbmRleE9mKCddeycpICE9PSAtMSA/IHRhZ1JlZ0V4cEZ1bGwgOiB0YWdSZWdFeHBMaWdodDtcblxuICAgICAgICBjb25zdCBwcm9jZXNzVGhlTGluayA9IChvcmlnaW5hbERlc2NyaXB0aW9uLCBtYXRjaGVkVGFnLCBsZWFkaW5nVGV4dCkgPT4ge1xuICAgICAgICAgICAgbGV0IGxlYWRpbmcgPSBleHRyYWN0TGVhZGluZ1RleHQob3JpZ2luYWxEZXNjcmlwdGlvbiwgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZyk7XG4gICAgICAgICAgICBsZXQgc3BsaXQ7XG4gICAgICAgICAgICBsZXQgcmVzdWx0SW5Db21wb2RvYztcbiAgICAgICAgICAgIGxldCBuZXdMaW5rO1xuICAgICAgICAgICAgbGV0IHJvb3RQYXRoO1xuICAgICAgICAgICAgbGV0IHN0cmluZ3RvUmVwbGFjZTtcbiAgICAgICAgICAgIGxldCBhbmNob3IgPSAnJztcbiAgICAgICAgICAgIGxldCBsYWJlbDtcbiAgICAgICAgICAgIGxldCBwYWdlTmFtZTtcblxuICAgICAgICAgICAgc3BsaXQgPSBzcGxpdExpbmtUZXh0KG1hdGNoZWRUYWcudGV4dCk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3BsaXQubGlua1RleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0SW5Db21wb2RvYyA9IHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmZpbmRJbkNvbXBvZG9jKHNwbGl0LnRhcmdldCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBpbmZvID0gbWF0Y2hlZFRhZy50ZXh0O1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkVGFnLnRleHQuaW5kZXhPZignIycpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBhbmNob3IgPSBtYXRjaGVkVGFnLnRleHQuc3Vic3RyKG1hdGNoZWRUYWcudGV4dC5pbmRleE9mKCcjJyksIG1hdGNoZWRUYWcudGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBpbmZvID0gbWF0Y2hlZFRhZy50ZXh0LnN1YnN0cigwLCBtYXRjaGVkVGFnLnRleHQuaW5kZXhPZignIycpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0SW5Db21wb2RvYyA9IHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmZpbmRJbkNvbXBvZG9jKGluZm8pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVzdWx0SW5Db21wb2RvYykge1xuICAgICAgICAgICAgICAgIGxhYmVsID0gcmVzdWx0SW5Db21wb2RvYy5uYW1lO1xuICAgICAgICAgICAgICAgIHBhZ2VOYW1lID0gcmVzdWx0SW5Db21wb2RvYy5uYW1lO1xuXG4gICAgICAgICAgICAgICAgaWYgKGxlYWRpbmdUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9ICdbJyArIGxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlYWRpbmcubGVhZGluZ1RleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSAnWycgKyBsZWFkaW5nLmxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcGxpdC5saW5rVGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRJbkNvbXBvZG9jLnR5cGUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0SW5Db21wb2RvYy50eXBlID0gJ2NsYXNzZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0SW5Db21wb2RvYy50eXBlID09PSAnbWlzY2VsbGFuZW91cycgfHxcbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdEluQ29tcG9kb2MuY3R5cGUgJiYgcmVzdWx0SW5Db21wb2RvYy5jdHlwZSA9PT0gJ21pc2NlbGxhbmVvdXMnKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRJbkNvbXBvZG9jLnR5cGUgPSAnbWlzY2VsbGFuZW91JztcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSByZXN1bHRJbkNvbXBvZG9jLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGFuY2hvciA9ICcjJyArIHJlc3VsdEluQ29tcG9kb2MubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdEluQ29tcG9kb2Muc3VidHlwZSA9PT0gJ2VudW0nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlTmFtZSA9ICdlbnVtZXJhdGlvbnMnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdEluQ29tcG9kb2Muc3VidHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU5hbWUgPSAnZnVuY3Rpb25zJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHRJbkNvbXBvZG9jLnN1YnR5cGUgPT09ICd0eXBlYWxpYXMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlTmFtZSA9ICd0eXBlYWxpYXNlcyc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0SW5Db21wb2RvYy5zdWJ0eXBlID09PSAndmFyaWFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlTmFtZSA9ICd2YXJpYWJsZXMnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcm9vdFBhdGggPSAnJztcblxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFBhdGggPSAnLi8nO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFBhdGggPSAnLi4vJy5yZXBlYXQoZGVwdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGxlYWRpbmcubGVhZGluZ1RleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGxlYWRpbmcubGVhZGluZ1RleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3BsaXQubGlua1RleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gc3BsaXQubGlua1RleHQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbmV3TGluayA9IGA8YSBocmVmPVwiJHtyb290UGF0aH0ke1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRJbkNvbXBvZG9jLnR5cGVcbiAgICAgICAgICAgICAgICB9cy8ke3BhZ2VOYW1lfS5odG1sJHthbmNob3J9XCI+JHtsYWJlbH08L2E+YDtcblxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbERlc2NyaXB0aW9uLnJlcGxhY2Uoc3RyaW5ndG9SZXBsYWNlLCBuZXdMaW5rKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJlc3VsdEluQ29tcG9kb2MgJiYgdHlwZW9mIHNwbGl0LmxpbmtUZXh0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIG5ld0xpbmsgPSBgPGEgaHJlZj1cIiR7c3BsaXQudGFyZ2V0fVwiPiR7c3BsaXQubGlua1RleHR9PC9hPmA7XG4gICAgICAgICAgICAgICAgaWYgKGxlYWRpbmdUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9ICdbJyArIGxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlYWRpbmcubGVhZGluZ1RleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSAnWycgKyBsZWFkaW5nLmxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcGxpdC5saW5rVGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxEZXNjcmlwdGlvbi5yZXBsYWNlKHN0cmluZ3RvUmVwbGFjZSwgbmV3TGluayk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFyZXN1bHRJbkNvbXBvZG9jICYmIGxlYWRpbmcgJiYgdHlwZW9mIGxlYWRpbmcubGVhZGluZ1RleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbmV3TGluayA9IGA8YSBocmVmPVwiJHtzcGxpdC50YXJnZXR9XCI+JHtsZWFkaW5nLmxlYWRpbmdUZXh0fTwvYT5gO1xuICAgICAgICAgICAgICAgIGlmIChsZWFkaW5nVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSAnWycgKyBsZWFkaW5nVGV4dCArICddJyArIG1hdGNoZWRUYWcuY29tcGxldGVUYWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZWFkaW5nLmxlYWRpbmdUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gJ1snICsgbGVhZGluZy5sZWFkaW5nVGV4dCArICddJyArIG1hdGNoZWRUYWcuY29tcGxldGVUYWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc3BsaXQubGlua1RleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9IG1hdGNoZWRUYWcuY29tcGxldGVUYWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRGVzY3JpcHRpb24ucmVwbGFjZShzdHJpbmd0b1JlcGxhY2UsIG5ld0xpbmspO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghcmVzdWx0SW5Db21wb2RvYyAmJiB0eXBlb2Ygc3BsaXQubGlua1RleHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbmV3TGluayA9IGA8YSBocmVmPVwiJHtzcGxpdC50YXJnZXR9XCI+JHtzcGxpdC50YXJnZXR9PC9hPmA7XG4gICAgICAgICAgICAgICAgaWYgKGxlYWRpbmdUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9ICdbJyArIGxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlYWRpbmcubGVhZGluZ1RleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSAnWycgKyBsZWFkaW5nLmxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxEZXNjcmlwdGlvbi5yZXBsYWNlKHN0cmluZ3RvUmVwbGFjZSwgbmV3TGluayk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbERlc2NyaXB0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIHJlcGxhY2VNYXRjaChyZXBsYWNlciwgdGFnLCBtYXRjaCwgdGV4dCwgbGlua1RleHQ/KSB7XG4gICAgICAgICAgICBsZXQgbWF0Y2hlZFRhZyA9IHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZVRhZzogbWF0Y2gsXG4gICAgICAgICAgICAgICAgdGFnOiB0YWcsXG4gICAgICAgICAgICAgICAgdGV4dDogdGV4dFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRhZ0luZm8ucHVzaChtYXRjaGVkVGFnKTtcblxuICAgICAgICAgICAgaWYgKGxpbmtUZXh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VyKGRlc2NyaXB0aW9uLCBtYXRjaGVkVGFnLCBsaW5rVGV4dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXBsYWNlcihkZXNjcmlwdGlvbiwgbWF0Y2hlZFRhZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhbiBkZXNjcmlwdGlvbiBmb3IgbWFya2VkIGEgdGFnIHBhcnNlZCB0b28gZWFybHlcblxuICAgICAgICBpZiAoZGVzY3JpcHRpb24uaW5kZXhPZignaHJlZj0nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGxldCBpbnNpZGVNYXJrZWRBVGFnUmVzdWx0cyA9IGRlc2NyaXB0aW9uLm1hdGNoKC88YSBbXj5dKz4oW148XSspPFxcL2E+L2cpO1xuXG4gICAgICAgICAgICBpZiAoaW5zaWRlTWFya2VkQVRhZ1Jlc3VsdHMgJiYgaW5zaWRlTWFya2VkQVRhZ1Jlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5zaWRlTWFya2VkQVRhZ1Jlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hcmtlZEFUYWdSZWdFeHAgPSBuZXcgUmVnRXhwKCc8YSBbXj5dKz4oW148XSspPC9hPicsICdnbScpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyc2VkQVRhZyA9IG1hcmtlZEFUYWdSZWdFeHAuZXhlYyhkZXNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWRBVGFnICYmIHBhcnNlZEFUYWcubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5zaWRlTWFya2VkQVRhZyA9IHBhcnNlZEFUYWdbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYHtAbGluayA8YSBocmVmPVwiJHtlbmNvZGVVUkkoaW5zaWRlTWFya2VkQVRhZyl9XCI+JHtpbnNpZGVNYXJrZWRBVGFnfTwvYT5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB7QGxpbmsgJHtpbnNpZGVNYXJrZWRBVGFnfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBtYXRjaGVzID0gdGFnUmVnRXhwLmV4ZWMoZGVzY3JpcHRpb24pO1xuXG4gICAgICAgICAgICAvLyBEaWQgd2UgaGF2ZSB7QGxpbmsgP1xuICAgICAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c1N0cmluZyA9IGRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHJlcGxhY2VNYXRjaChwcm9jZXNzVGhlTGluaywgJ2xpbmsnLCBtYXRjaGVzWzBdLCBtYXRjaGVzWzFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gcmVwbGFjZU1hdGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1RoZUxpbmssXG4gICAgICAgICAgICAgICAgICAgICAgICAnbGluaycsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc1syXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXNbMV1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKG1hdGNoZXMgJiYgcHJldmlvdXNTdHJpbmcgIT09IGRlc2NyaXB0aW9uKTtcblxuICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBPbmVQYXJhbWV0ZXJIYXNIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCB0YWdzLCB0eXBlVG9DaGVjayk6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO1xuICAgICAgICBsZXQgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zID0gYXJndW1lbnRzW2xlbl07XG5cbiAgICAgICAgbGV0IGkgPSAwLFxuICAgICAgICAgICAgbGVuZyA9IHRhZ3MubGVuZ3RoO1xuXG4gICAgICAgIGZvcihpOyBpPGxlbmc7IGkrKykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YWdzW2ldW3R5cGVUb0NoZWNrXSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGFnc1tpXVt0eXBlVG9DaGVja10gIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IGV4dHJhY3RMZWFkaW5nVGV4dCwgc3BsaXRMaW5rVGV4dCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2xpbmstcGFyc2VyJztcbmltcG9ydCB7IERlcGVuZGVuY2llc0VuZ2luZSB9IGZyb20gJy4uL2RlcGVuZGVuY2llcy5lbmdpbmUnO1xuXG5leHBvcnQgY2xhc3MgRWxlbWVudEFsb25lSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZGVwZW5kZW5jaWVzRW5naW5lOiBEZXBlbmRlbmNpZXNFbmdpbmUpIHt9XG5cbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGVsZW1lbnRzLCBlbGVtZW50VHlwZTogc3RyaW5nLCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpIHtcbiAgICAgICAgbGV0IGFsb25lcyA9IFtdO1xuICAgICAgICBsZXQgbW9kdWxlcyA9IHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLm1vZHVsZXM7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGxldCBmb3VuZEluT25lTW9kdWxlID0gZmFsc2U7XG4gICAgICAgICAgICBtb2R1bGVzLmZvckVhY2gobW9kdWxlID0+IHtcbiAgICAgICAgICAgICAgICBtb2R1bGUuZGVjbGFyYXRpb25zLmZvckVhY2goZGVjbGFyYXRpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24uaWQgPT09IGVsZW1lbnQuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSW5PbmVNb2R1bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbi5maWxlID09PSBlbGVtZW50LmZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSW5PbmVNb2R1bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbW9kdWxlLmNvbnRyb2xsZXJzLmZvckVhY2goY29udHJvbGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLmlkID09PSBlbGVtZW50LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEluT25lTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlci5maWxlID09PSBlbGVtZW50LmZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSW5PbmVNb2R1bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbW9kdWxlLnByb3ZpZGVycy5mb3JFYWNoKHByb3ZpZGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyLmlkID09PSBlbGVtZW50LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEluT25lTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIuZmlsZSA9PT0gZWxlbWVudC5maWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEluT25lTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWZvdW5kSW5PbmVNb2R1bGUpIHtcbiAgICAgICAgICAgICAgICBhbG9uZXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGFsb25lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tcG9uZW50JzpcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jb21wb25lbnRzID0gYWxvbmVzO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdkaXJlY3RpdmUnOlxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmRpcmVjdGl2ZXMgPSBhbG9uZXM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbnRyb2xsZXInOlxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNvbnRyb2xsZXJzID0gYWxvbmVzO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdpbmplY3RhYmxlJzpcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5pbmplY3RhYmxlcyA9IGFsb25lcztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAncGlwZSc6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQucGlwZXMgPSBhbG9uZXM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEhhc093bkhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGVudGl0eSwga2V5OiBhbnksIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlbnRpdHksIGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBTaG9ydFVSTEhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHVybDogc3RyaW5nLCBvcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IG5ld1VybCA9IHVybDtcbiAgICAgICAgbGV0IGZpcnN0SW5kZXhPZlNsYXNoID0gbmV3VXJsLmluZGV4T2YoJy8nKTtcbiAgICAgICAgbGV0IGxhc3RJbmRleE9mU2xhc2ggPSBuZXdVcmwubGFzdEluZGV4T2YoJy8nKTtcbiAgICAgICAgaWYgKGZpcnN0SW5kZXhPZlNsYXNoICE9PSAtMSB8fCBsYXN0SW5kZXhPZlNsYXNoICE9PSAtMSkge1xuICAgICAgICAgICAgbmV3VXJsID0gbmV3VXJsLnN1YnN0cigwLCBmaXJzdEluZGV4T2ZTbGFzaCArIDEpICsgJy4uLicgKyBuZXdVcmwuc3Vic3RyKGxhc3RJbmRleE9mU2xhc2gsIG5ld1VybC5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdVcmw7XG4gICAgfVxufSIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9FTl9VUyA9IHtcbiAgICBhY2Nlc3NvcnM6ICdBY2Nlc3NvcnMnLFxuICAgIGFyZ3VtZW50czogJ0FyZ3VtZW50cycsXG4gICAgYm9vdHN0cmFwOiAnQm9vdHN0cmFwJyxcbiAgICBicmFuY2hlczogJ0JyYW5jaGVzJyxcbiAgICBicm93c2U6ICdCcm93c2UnLFxuICAgIGNsYXNzZTogJ0NsYXNzJyxcbiAgICBjbGFzc2VzOiAnQ2xhc3NlcycsXG4gICAgY29tcG9uZW50OiAnQ29tcG9uZW50JyxcbiAgICBjb21wb25lbnRzOiAnQ29tcG9uZW50cycsXG4gICAgY29uc3RydWN0b3I6ICdDb25zdHJ1Y3RvcicsXG4gICAgY29udHJvbGxlcnM6ICdDb250cm9sbGVycycsXG4gICAgY29udHJvbGxlcjogJ0NvbnRyb2xsZXInLFxuICAgICdjb3ZlcmFnZS1wYWdlLXRpdGxlJzogJ0RvY3VtZW50YXRpb24gY292ZXJhZ2UnLFxuICAgIGRlY2xhcmF0aW9uczogJ0RlY2xhcmF0aW9ucycsXG4gICAgZGVjb3JhdG9yczogJ0RlY29yYXRvcnMnLFxuICAgICdkZWZhdWx0LXZhbHVlJzogJ0RlZmF1bHQgdmFsdWUnLFxuICAgICdkZWZpbmVkLWluJzogJ0RlZmluZWQgaW4nLFxuICAgIGRlcGVuZGVuY2llczogJ0RlcGVuZGVuY2llcycsXG4gICAgZGVzY3JpcHRpb246ICdEZXNjcmlwdGlvbicsXG4gICAgZGlyZWN0aXZlOiAnRGlyZWN0aXZlJyxcbiAgICBkaXJlY3RpdmVzOiAnRGlyZWN0aXZlcycsXG4gICAgZW50cnljb21wb25lbnRzOiAnRW50cnlDb21wb25lbnRzJyxcbiAgICBlbnVtZXJhdGlvbnM6ICdFbnVtZXJhdGlvbnMnLFxuICAgIGVudW1zOiAnRW51bXMnLFxuICAgIGV4YW1wbGU6ICdFeGFtcGxlJyxcbiAgICBleHBvcnRzOiAnRXhwb3J0cycsXG4gICAgZXh0ZW5kczogJ0V4dGVuZHMnLFxuICAgIGZpbGU6ICdGaWxlJyxcbiAgICBmdW5jdGlvbnM6ICdGdW5jdGlvbnMnLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAnRG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgdXNpbmcnLFxuICAgICdnZXR0aW5nLXN0YXJ0ZWQnOiAnR2V0dGluZyBzdGFydGVkJyxcbiAgICBndWFyZDogJ0d1YXJkJyxcbiAgICBndWFyZHM6ICdHdWFyZHMnLFxuICAgIGhvc3RiaW5kaW5nczogJ0hvc3RCaW5kaW5ncycsXG4gICAgaG9zdGxpc3RlbmVyczogJ0hvc3RMaXN0ZW5lcnMnLFxuICAgICdodG1sLWVsZW1lbnQnOiAnSHRtbCBlbGVtZW50JyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ0h0bWwgZWxlbWVudCB3aXRoIGRpcmVjdGl2ZScsXG4gICAgaWRlbnRpZmllcjogJ0lkZW50aWZpZXInLFxuICAgIGltcGxlbWVudHM6ICdJbXBsZW1lbnRzJyxcbiAgICBpbXBvcnRzOiAnSW1wb3J0cycsXG4gICAgaW5kZXg6ICdJbmRleCcsXG4gICAgaW5kZXhhYmxlOiAnSW5kZXhhYmxlJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAnSW5oZXJpdGVkIGZyb20nLFxuICAgIGluamVjdGFibGU6ICdJbmplY3RhYmxlJyxcbiAgICBpbmplY3RhYmxlczogJ0luamVjdGFibGVzJyxcbiAgICBpbnB1dHM6ICdJbnB1dHMnLFxuICAgIGludGVyY2VwdG9yczogJ0ludGVyY2VwdG9ycycsXG4gICAgaW50ZXJmYWNlOiAnSW50ZXJmYWNlJyxcbiAgICBpbnRlcmZhY2VzOiAnSW50ZXJmYWNlcycsXG4gICAgbGVnZW5kOiAnTGVnZW5kJyxcbiAgICBsaWNlbnNlOiAnTGljZW5zZScsXG4gICAgbGluZXM6ICdMaW5lcycsXG4gICAgbWV0YWRhdGE6ICdNZXRhZGF0YScsXG4gICAgbWV0aG9kczogJ01ldGhvZHMnLFxuICAgIG1pc2NlbGxhbmVvdXM6ICdNaXNjZWxsYW5lb3VzJyxcbiAgICBtb2R1bGU6ICdNb2R1bGUnLFxuICAgIG1vZHVsZXM6ICdNb2R1bGVzJyxcbiAgICBuYW1lOiAnTmFtZScsXG4gICAgbm86ICdObycsXG4gICAgJ25vLWdyYXBoJzogJ05vIGdyYXBoIGF2YWlsYWJsZS4nLFxuICAgICduby1pZnJhbWUnOiAnWW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgaWZyYW1lcy4nLFxuICAgICduby1yZXN1bHQtbWF0Y2hpbmcnOiAnTm8gcmVzdWx0cyBtYXRjaGluZycsXG4gICAgJ25vLXN2Zyc6ICdZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBTVkcnLFxuICAgIG9wdGlvbmFsOiAnT3B0aW9uYWwnLFxuICAgIG91dHB1dHM6ICdPdXRwdXRzJyxcbiAgICBvdmVydmlldzogJ092ZXJ2aWV3JyxcbiAgICBwYXJhbWV0ZXJzOiAnUGFyYW1ldGVycycsXG4gICAgJ3BlZXItZGVwZW5kZW5jaWVzJzogJ1BlZXIgZGVwZW5kZW5jaWVzJyxcbiAgICBwaXBlOiAnUGlwZScsXG4gICAgcGlwZXM6ICdQaXBlcycsXG4gICAgcHJlZml4OiAnUHJlZml4JyxcbiAgICBwcm9wZXJ0aWVzOiAnUHJvcGVydGllcycsXG4gICAgcHJvdmlkZXJzOiAnUHJvdmlkZXJzJyxcbiAgICBwdXJlOiAnUHVyZScsXG4gICAgcmVhZG1lOiAnUkVBRE1FJyxcbiAgICByZXNldDogJ1Jlc2V0JyxcbiAgICAncmVzdWx0cy1tYXRjaGluZyc6ICdyZXN1bHRzIG1hdGNoaW5nJyxcbiAgICByZXR1cm5zOiAnUmV0dXJucycsXG4gICAgcm91dGU6ICdSb3V0ZScsXG4gICAgcm91dGVzOiAnUm91dGVzJyxcbiAgICBzY2hlbWFzOiAnU2NoZW1hcycsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICdUeXBlIHRvIHNlYXJjaCcsXG4gICAgc2VsZWN0b3I6ICdTZWxlY3RvcicsXG4gICAgc2lnbmF0dXJlOiAnU2lnbmF0dXJlJyxcbiAgICBzdGF0ZW1lbnRzOiAnU3RhdGVtZW50cycsXG4gICAgdHlwZTogJ1R5cGUnLFxuICAgICd0eXBlLWFsaWFzZXMnOiAnVHlwZSBhbGlhc2VzJyxcbiAgICAndHlwZS1wYXJhbWV0ZXJzJzogJ1R5cGUgcGFyYW1ldGVycycsXG4gICAgdHlwZXM6ICdUeXBlcycsXG4gICAgJ3VuYW1lZC1wcm9wZXJ0eSc6ICdVbmFtZWQgcHJvcGVydHknLFxuICAgICd1bml0LXRlc3QtY292ZXJhZ2UnOiAnVW5pdCB0ZXN0IGNvdmVyYWdlJyxcbiAgICB2YWx1ZTogJ1ZhbHVlJyxcbiAgICB2YXJpYWJsZXM6ICdWYXJpYWJsZXMnLFxuICAgIHllczogJ1llcycsXG4gICAgem9vbWluOiAnWm9vbSBpbicsXG4gICAgem9vbW91dDogJ1pvb20gb3V0J1xufTtcbiIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9GUl9GUiA9IHtcbiAgICBhY2Nlc3NvcnM6ICdBY2Nlc3NldXJzJyxcbiAgICBhcmd1bWVudHM6ICdBcmd1bWVudHMnLFxuICAgIGJvb3RzdHJhcDogJ0Jvb3RzdHJhcCcsXG4gICAgYnJhbmNoZXM6ICdCcmFuY2hlcycsXG4gICAgYnJvd3NlOiAnUGFyY291cmlyJyxcbiAgICBjbGFzc2U6ICdDbGFzcycsXG4gICAgY2xhc3NlczogJ0NsYXNzZXMnLFxuICAgIGNvbXBvbmVudDogJ0NvbXBvc2FudCcsXG4gICAgY29tcG9uZW50czogJ0NvbXBvc2FudHMnLFxuICAgIGNvbnN0cnVjdG9yOiAnQ29uc3RydWN0ZXVyJyxcbiAgICBjb250cm9sbGVyczogJ0NvbnRyw7RsZXVycycsXG4gICAgY29udHJvbGxlcjogJ0NvbnRyw7RsZXVyJyxcbiAgICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICdDb3V2ZXJ0dXJlIGRlIGRvY3VtZW50YXRpb24nLFxuICAgIGRlY2xhcmF0aW9uczogJ0TDqWNsYXJhdGlvbnMnLFxuICAgIGRlY29yYXRvcnM6ICdEw6ljb3JhdGV1cnMnLFxuICAgICdkZWZhdWx0LXZhbHVlJzogJ1ZhbGV1ciBwYXIgZMOpZmF1dCcsXG4gICAgJ2RlZmluZWQtaW4nOiAnRMOpZmluaSBkYW5zJyxcbiAgICBkZXBlbmRlbmNpZXM6ICdEw6lwZW5kYW5jZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnRGVzY3JpcHRpb24nLFxuICAgIGRpcmVjdGl2ZTogJ0RpcmVjdGl2ZScsXG4gICAgZGlyZWN0aXZlczogJ0RpcmVjdGl2ZXMnLFxuICAgIGVudHJ5Y29tcG9uZW50czogXCJDb21wb3NhbnRzIGQnZW50csOpZVwiLFxuICAgIGVudW1lcmF0aW9uczogJ0VudW3DqXJhdGlvbnMnLFxuICAgIGVudW1zOiAnRW51bcOpcmF0aW9ucycsXG4gICAgZXhhbXBsZTogJ0V4YW1wbGUnLFxuICAgIGV4cG9ydHM6ICdFeHBvcnRzJyxcbiAgICBleHRlbmRzOiAnRXRlbmQnLFxuICAgIGZpbGU6ICdGaWNoaWVyJyxcbiAgICBmdW5jdGlvbnM6ICdGb25jdGlvbnMnLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAnRG9jdW1lbnRhdGlvbiBnw6luw6lyw6llIGF2ZWMnLFxuICAgICdnZXR0aW5nLXN0YXJ0ZWQnOiAnRMOpbWFycmFnZScsXG4gICAgZ3VhcmQ6ICdHYXJkZScsXG4gICAgZ3VhcmRzOiAnR2FyZGVzJyxcbiAgICBob3N0YmluZGluZ3M6ICdIb3N0QmluZGluZ3MnLFxuICAgIGhvc3RsaXN0ZW5lcnM6ICdIb3N0TGlzdGVuZXJzJyxcbiAgICAnaHRtbC1lbGVtZW50JzogJ0Vsw6ltZW50IEh0bWwnLFxuICAgICdodG1sLWVsZW1lbnQtd2l0aC1kaXJlY3RpdmUnOiAnRWzDqW1lbnQgSHRtbCBhdmVjIHVuZSBkaXJlY3RpdmUnLFxuICAgIGlkZW50aWZpZXI6ICdJZGVudGlmaWFudCcsXG4gICAgaW1wbGVtZW50czogJ0ltcGzDqW1lbnRlJyxcbiAgICBpbXBvcnRzOiAnSW1wb3J0cycsXG4gICAgaW5kZXg6ICdJbmRleCcsXG4gICAgaW5kZXhhYmxlOiAnSW5kZXhhYmxlJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAnSMOpcml0w6kgZGUnLFxuICAgIGluamVjdGFibGU6ICdJbmplY3RhYmxlJyxcbiAgICBpbmplY3RhYmxlczogJ0luamVjdGFibGVzJyxcbiAgICBpbnB1dHM6ICdFbnRyw6llcycsXG4gICAgaW50ZXJjZXB0b3JzOiAnSW50ZXJjZXB0ZXVycycsXG4gICAgaW50ZXJmYWNlOiAnSW50ZXJmYWNlJyxcbiAgICBpbnRlcmZhY2VzOiAnSW50ZXJmYWNlcycsXG4gICAgbGVnZW5kOiAnTMOpZ2VuZGUnLFxuICAgIGxpY2Vuc2U6ICdMaWNlbnNlJyxcbiAgICBsaW5lczogJ0xpZ25lcycsXG4gICAgbWV0YWRhdGE6ICdNw6l0YWRvbm7DqWVzJyxcbiAgICBtZXRob2RzOiAnTcOpdGhvZGVzJyxcbiAgICBtaXNjZWxsYW5lb3VzOiAnRGl2ZXJzJyxcbiAgICBtb2R1bGU6ICdNb2R1bGUnLFxuICAgIG1vZHVsZXM6ICdNb2R1bGVzJyxcbiAgICBuYW1lOiAnTm9tJyxcbiAgICBubzogJ05vbicsXG4gICAgJ25vLWdyYXBoJzogJ0F1Y3VuIGdyYXBoaXF1ZSBkaXNwb25pYmxlLicsXG4gICAgJ25vLWlmcmFtZSc6ICdWb3RyZSBuYXZpZ2F0ZXVyIG5lIHN1cHBvcnRlIHBhcyBsZXMgaWZyYW1lcy4nLFxuICAgICduby1yZXN1bHQtbWF0Y2hpbmcnOiAnQXVjdW4gcsOpc3VsdGF0IG1hdGNoYW50JyxcbiAgICAnbm8tc3ZnJzogJ1ZvdHJlIG5hdmlnYXRldXIgbmUgc3VwcG9ydGUgcGFzIGxlIFNWRycsXG4gICAgb3B0aW9uYWw6ICdPcHRpb25uZWwnLFxuICAgIG91dHB1dHM6ICdTb3J0aWVzJyxcbiAgICBvdmVydmlldzogXCJWdWUgZCdlbnNlbWJsZVwiLFxuICAgIHBhcmFtZXRlcnM6ICdQYXJhbcOodHJlcycsXG4gICAgJ3BlZXItZGVwZW5kZW5jaWVzJzogJ0TDqXBlbmRhbmNlcyBkZSBwYWlyJyxcbiAgICBwaXBlOiAnUGlwZScsXG4gICAgcGlwZXM6ICdQaXBlcycsXG4gICAgcHJlZml4OiAnUHLDqWZpeGUnLFxuICAgIHByb3BlcnRpZXM6ICdQcm9wcmnDqXTDqXMnLFxuICAgIHByb3ZpZGVyczogJ1Byb3ZpZGVycycsXG4gICAgcHVyZTogJ1B1cmUnLFxuICAgIHJlYWRtZTogJ1JFQURNRScsXG4gICAgcmVzZXQ6ICdSZW1pc2Ugw6AgesOpcm8nLFxuICAgICdyZXN1bHRzLW1hdGNoaW5nJzogJ3LDqXN1bHRhdHMgbWF0Y2hhbnQnLFxuICAgIHJldHVybnM6ICdSZW52b2llJyxcbiAgICByb3V0ZTogJ1JvdXRlJyxcbiAgICByb3V0ZXM6ICdSb3V0ZXMnLFxuICAgIHNjaGVtYXM6ICdTY2jDqW1hcycsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICdTYWlzaXNzZXogdW4gdGV4dGUnLFxuICAgIHNlbGVjdG9yOiAnU8OpbGVjdGV1cicsXG4gICAgc2lnbmF0dXJlOiAnU2lnbmF0dXJlJyxcbiAgICBzdGF0ZW1lbnRzOiAnRMOpY2xhcmF0aW9ucycsXG4gICAgdHlwZTogJ1R5cGUnLFxuICAgICd0eXBlLWFsaWFzZXMnOiAnQWxpYXMgZGUgdHlwZScsXG4gICAgJ3R5cGUtcGFyYW1ldGVycyc6ICdQYXJhbcOodHJlcyBkZSB0eXBlJyxcbiAgICB0eXBlczogJ1R5cGVzJyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ1Byb3ByacOpdMOpIG5vbiBub21tw6llJyxcbiAgICAndW5pdC10ZXN0LWNvdmVyYWdlJzogJ0NvdXZlcnR1cmUgZGUgdGVzdCB1bml0YWlyZScsXG4gICAgdmFsdWU6ICdWYWxldXInLFxuICAgIHZhcmlhYmxlczogJ1ZhcmlhYmxlcycsXG4gICAgeWVzOiAnT3VpJyxcbiAgICB6b29taW46ICdab29tIGF2YW50JyxcbiAgICB6b29tb3V0OiAnWm9vbSBhcnJpw6hyZSdcbn07XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fWkhfQ04gPSB7XG4gICAgYWNjZXNzb3JzOiAn5a2Y5Y+W5ZmoJyxcbiAgICBhcmd1bWVudHM6ICdBcmd1bWVudHMnLFxuICAgIGJvb3RzdHJhcDogJ+aguee7hOS7ticsXG4gICAgYnJhbmNoZXM6ICfliIbmlK8nLFxuICAgIGJyb3dzZTogJ+a1j+iniCcsXG4gICAgY2xhc3NlOiAn57G7JyxcbiAgICBjbGFzc2VzOiAn57G75YiX6KGoJyxcbiAgICBjb21wb25lbnQ6ICfnu4Tku7YnLFxuICAgIGNvbXBvbmVudHM6ICfnu4Tku7bliJfooagnLFxuICAgIGNvbnN0cnVjdG9yOiAn5p6E6YCg5pa55rOVJyxcbiAgICBjb250cm9sbGVyczogJ0NvbnRyb2xsZXJzJyxcbiAgICBjb250cm9sbGVyOiAnQ29udHJvbGxlcicsXG4gICAgJ2NvdmVyYWdlLXBhZ2UtdGl0bGUnOiAn5paH5qGj5qaC6KeIJyxcbiAgICBkZWNsYXJhdGlvbnM6ICflj6/lo7DmmI7lr7nosaHliJfooagnLFxuICAgIGRlY29yYXRvcnM6ICfoo4XppbDlmajliJfooagnLFxuICAgICdkZWZhdWx0LXZhbHVlJzogJ+e8uuecgeWAvCcsXG4gICAgJ2RlZmluZWQtaW4nOiAn6KKr5a6a5LmJ5ZyoJyxcbiAgICBkZXBlbmRlbmNpZXM6ICfkvp3otZbpobknLFxuICAgIGRlc2NyaXB0aW9uOiAn5o+P6L+wJyxcbiAgICBkaXJlY3RpdmU6ICfmjIfku6QnLFxuICAgIGRpcmVjdGl2ZXM6ICfmjIfku6TliJfooagnLFxuICAgIGVudHJ5Y29tcG9uZW50czogJ+WFpeWPo+e7hOS7tuWIl+ihqCcsXG4gICAgZW51bWVyYXRpb25zOiAn5YiX5Li+JyxcbiAgICBlbnVtczogJ+aemuS4vuWIl+ihqCcsXG4gICAgZXhhbXBsZTogJ+S+i+WtkCcsXG4gICAgZXhwb3J0czogJ+WvvOWHuicsXG4gICAgZXh0ZW5kczogJ+e7p+aJvycsXG4gICAgZmlsZTogJ+aWh+S7ticsXG4gICAgZnVuY3Rpb25zOiAn5Ye95pWwJyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ0RvY3VtZW50YXRpb24gZ2VuZXJhdGVkIHVzaW5nJyxcbiAgICAnZ2V0dGluZy1zdGFydGVkJzogJ+WFpemXqOaMh+WNlycsXG4gICAgZ3VhcmQ6ICfot6/nlLHlrojljasnLFxuICAgIGd1YXJkczogJ+i3r+eUseWuiOWNq+WIl+ihqCcsXG4gICAgaG9zdGJpbmRpbmdzOiAn5a6/5Li757uR5a6aJyxcbiAgICBob3N0bGlzdGVuZXJzOiAn5a6/5Li755uR5ZCsJyxcbiAgICAnaHRtbC1lbGVtZW50JzogJ0h0bWwg5YWD57SgJyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ+W4puaMh+S7pOeahEh0bWzlhYPntKAnLFxuICAgIGlkZW50aWZpZXI6ICdJZGVudGlmaWVyJyxcbiAgICBpbXBsZW1lbnRzOiAn5a6e546wJyxcbiAgICBpbXBvcnRzOiAn5byV5YWlJyxcbiAgICBpbmRleDogJ+e0ouW8lScsXG4gICAgaW5kZXhhYmxlOiAnSW5kZXhhYmxlJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAn57un5om/6IeqJyxcbiAgICBpbmplY3RhYmxlOiAn5Y+v5rOo5YWl55qEJyxcbiAgICBpbmplY3RhYmxlczogJ+WPr+azqOWFpeeahCcsXG4gICAgaW5wdXRzOiAnSW5wdXRzJyxcbiAgICBpbnRlcmNlcHRvcnM6ICfmi6bmiKrlmagnLFxuICAgIGludGVyZmFjZTogJ+aOpeWPoycsXG4gICAgaW50ZXJmYWNlczogJ+aOpeWPoycsXG4gICAgbGVnZW5kOiAnTGVnZW5kJyxcbiAgICBsaWNlbnNlOiAn6K645Y+v5Y2P6K6uJyxcbiAgICBsaW5lczogJ0xpbmVzJyxcbiAgICBtZXRhZGF0YTogJ+WFg+aVsOaNricsXG4gICAgbWV0aG9kczogJ+aWueazlScsXG4gICAgbWlzY2VsbGFuZW91czogJ+WFtuS7licsXG4gICAgbW9kdWxlOiAn5qih5Z2XJyxcbiAgICBtb2R1bGVzOiAn5qih5Z2XJyxcbiAgICBuYW1lOiAn5ZCN56ewJyxcbiAgICBubzogJ+WQpicsXG4gICAgJ25vLWdyYXBoJzogJ+aXoOWbvuihqOaYvuekuicsXG4gICAgJ25vLWlmcmFtZSc6ICfkvaDnmoTmtY/op4jlmajkuI3mlK/mjIFpZnJhbWVzJyxcbiAgICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ+aXoOWMuemFjeeahOe7k+aenCcsXG4gICAgJ25vLXN2Zyc6ICfkvaDnmoTmtY/op4jlmajkuI3mlK/mjIFTVkcnLFxuICAgIG9wdGlvbmFsOiAnT3B0aW9uYWwnLFxuICAgIG91dHB1dHM6ICfovpPlh7onLFxuICAgIG92ZXJ2aWV3OiAn5qaC6L+wJyxcbiAgICBwYXJhbWV0ZXJzOiAn5Y+C5pWw5YiX6KGoJyxcbiAgICAncGVlci1kZXBlbmRlbmNpZXMnOiAn5ZCM57qn5L6d6LWWJyxcbiAgICBwaXBlOiAn566h6YGTJyxcbiAgICBwaXBlczogJ+euoemBk+WIl+ihqCcsXG4gICAgcHJlZml4OiAn5a2X6aaWJyxcbiAgICBwcm9wZXJ0aWVzOiAn5bGe5oCn5YiX6KGoJyxcbiAgICBwcm92aWRlcnM6ICfmj5DkvpvllYbliJfooagnLFxuICAgIHB1cmU6ICdQdXJlJyxcbiAgICByZWFkbWU6ICfmiYvlhownLFxuICAgIHJlc2V0OiAn6YeN572uJyxcbiAgICAncmVzdWx0cy1tYXRjaGluZyc6ICfljLnphY3nmoTnu5PmnpwnLFxuICAgIHJldHVybnM6ICfov5Tlm54nLFxuICAgIHJvdXRlOiAn6Lev55SxJyxcbiAgICByb3V0ZXM6ICfot6/nlLHliJfooagnLFxuICAgIHNjaGVtYXM6ICfmqKHlvI8nLFxuICAgICdzZWFyY2gtcGxhY2Vob2xkZXInOiAn6K+36L6T5YWl5p+l6K+i5YWz6ZSu5a2XJyxcbiAgICBzZWxlY3RvcjogJ+mAieaLqeWZqCcsXG4gICAgc2lnbmF0dXJlOiAn562+5ZCNJyxcbiAgICBzdGF0ZW1lbnRzOiAn5aOw5piOJyxcbiAgICB0eXBlOiAn57G75Z6LJyxcbiAgICAndHlwZS1hbGlhc2VzJzogJ+exu+Wei+WIq+WQjScsXG4gICAgJ3R5cGUtcGFyYW1ldGVycyc6ICfnsbvlnovlj4LmlbAnLFxuICAgIHR5cGVzOiAn57G75Z6LJyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ+acquWRveWQjeWxnuaApycsXG4gICAgJ3VuaXQtdGVzdC1jb3ZlcmFnZSc6ICfljZXlhYPmtYvor5XmpoLop4gnLFxuICAgIHZhbHVlOiAn5YC8JyxcbiAgICB2YXJpYWJsZXM6ICflj5jph48nLFxuICAgIHllczogJ+aYrycsXG4gICAgem9vbWluOiAn5pS+5aSnJyxcbiAgICB6b29tb3V0OiAn57yp5bCPJ1xufTtcbiIsImltcG9ydCBpMThuZXh0IGZyb20gJ2kxOG5leHQnO1xuXG5pbXBvcnQgeyBUUkFOU0xBVElPTl9FTl9VUywgVFJBTlNMQVRJT05fRlJfRlIsIFRSQU5TTEFUSU9OX1pIX0NOIH0gZnJvbSAnLi4vLi4vbG9jYWxlcyc7XG5cbmNsYXNzIEkxOG5FbmdpbmUge1xuICAgIGNvbnN0cnVjdG9yKCkge31cblxuICAgIHByaXZhdGUgYXZhaWxhYmxlc0xhbmd1YWdlcyA9IHtcbiAgICAgICAgJ2VuLVVTJzogJ2VuLVVTJyxcbiAgICAgICAgJ2ZyLUZSJzogJ2ZyLUZSJyxcbiAgICAgICAgJ3poLUNOJzogJ3poLUNOJ1xuICAgIH07XG5cbiAgICBwdWJsaWMgZmFsbGJhY2tMYW5ndWFnZSA9ICdlbi1VUyc7XG5cbiAgICBwdWJsaWMgaW5pdChsYW5ndWFnZTogc3RyaW5nKSB7XG4gICAgICAgIGkxOG5leHQuaW5pdCh7XG4gICAgICAgICAgICBsbmc6IGxhbmd1YWdlLFxuICAgICAgICAgICAgZmFsbGJhY2tMbmc6IHRoaXMuZmFsbGJhY2tMYW5ndWFnZVxuICAgICAgICB9KTtcbiAgICAgICAgaTE4bmV4dC5hZGRSZXNvdXJjZXMoJ2VuLVVTJywgJ3RyYW5zbGF0aW9uJywgVFJBTlNMQVRJT05fRU5fVVMpO1xuICAgICAgICBpMThuZXh0LmFkZFJlc291cmNlcygnZnItRlInLCAndHJhbnNsYXRpb24nLCBUUkFOU0xBVElPTl9GUl9GUik7XG4gICAgICAgIGkxOG5leHQuYWRkUmVzb3VyY2VzKCd6aC1DTicsICd0cmFuc2xhdGlvbicsIFRSQU5TTEFUSU9OX1pIX0NOKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJhbnNsYXRlKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGkxOG5leHQudChrZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdXBwb3J0TGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMuYXZhaWxhYmxlc0xhbmd1YWdlc1tsYW5ndWFnZV0gIT09ICd1bmRlZmluZWQnO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IEkxOG5FbmdpbmUoKTtcbiIsImltcG9ydCAqIGFzIEhhbmRsZWJhcnMgZnJvbSAnaGFuZGxlYmFycyc7XG5cbmltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgSTE4bkVuZ2luZUluc3RhbmNlIGZyb20gJy4uL2kxOG4uZW5naW5lJztcblxuZXhwb3J0IGNsYXNzIEkxOG5IZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBpMThuX2tleTogc3RyaW5nLCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gSTE4bkVuZ2luZUluc3RhbmNlLnRyYW5zbGF0ZShpMThuX2tleSk7XG4gICAgICAgIHJldHVybiBuZXcgSGFuZGxlYmFycy5TYWZlU3RyaW5nKHJlc3VsdCk7XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgSGFuZGxlYmFycyBmcm9tICdoYW5kbGViYXJzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgRGVwZW5kZW5jaWVzRW5naW5lIH0gZnJvbSAnLi9kZXBlbmRlbmNpZXMuZW5naW5lJztcbmltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29tcGFyZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9jb21wYXJlLmhlbHBlcic7XG5pbXBvcnQgeyBPckhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9vci5oZWxwZXInO1xuaW1wb3J0IHsgRnVuY3Rpb25TaWduYXR1cmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvZnVuY3Rpb24tc2lnbmF0dXJlLmhlbHBlcic7XG5pbXBvcnQgeyBJc05vdFRvZ2dsZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pcy1ub3QtdG9nZ2xlLmhlbHBlcic7XG5pbXBvcnQgeyBJc0luaXRpYWxUYWJIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvaXMtaW5pdGlhbC10YWIuaGVscGVyJztcbmltcG9ydCB7IElzVGFiRW5hYmxlZEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pcy10YWItZW5hYmxlZC5oZWxwZXInO1xuaW1wb3J0IHsgSWZTdHJpbmdIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvaWYtc3RyaW5nLmhlbHBlcic7XG5pbXBvcnQgeyBPckxlbmd0aEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9vci1sZW5ndGguaGVscGVyJztcbmltcG9ydCB7IEZpbHRlckFuZ3VsYXIyTW9kdWxlc0hlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9maWx0ZXItYW5ndWxhcjItbW9kdWxlcy5oZWxwZXInO1xuaW1wb3J0IHsgRGVidWdIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvZGVidWcuaGVscGVyJztcbmltcG9ydCB7IEJyZWFrTGluZXNIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvYnJlYWstbGluZXMuaGVscGVyJztcbmltcG9ydCB7IENsZWFuUGFyYWdyYXBoSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2NsZWFuLXBhcmFncmFwaC5oZWxwZXInO1xuaW1wb3J0IHsgRXNjYXBlU2ltcGxlUXVvdGVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvZXNjYXBlLXNpbXBsZS1xdW90ZS5oZWxwZXInO1xuaW1wb3J0IHsgQnJlYWtDb21tYUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9icmVhay1jb21tYS5oZWxwZXInO1xuaW1wb3J0IHsgTW9kaWZLaW5kSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL21vZGlmLWtpbmQtaGVscGVyJztcbmltcG9ydCB7IE1vZGlmSWNvbkhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9tb2RpZi1pY29uLmhlbHBlcic7XG5pbXBvcnQgeyBSZWxhdGl2ZVVSTEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9yZWxhdGl2ZS11cmwuaGVscGVyJztcbmltcG9ydCB7IEpzZG9jUmV0dXJuc0NvbW1lbnRIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvanNkb2MtcmV0dXJucy1jb21tZW50LmhlbHBlcic7XG5pbXBvcnQgeyBKc2RvY0NvZGVFeGFtcGxlSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLWNvZGUtZXhhbXBsZS5oZWxwZXInO1xuaW1wb3J0IHsgSnNkb2NFeGFtcGxlSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLWV4YW1wbGUuaGVscGVyJztcbmltcG9ydCB7IEpzZG9jUGFyYW1zSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLXBhcmFtcy5oZWxwZXInO1xuaW1wb3J0IHsgSnNkb2NQYXJhbXNWYWxpZEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1wYXJhbXMtdmFsaWQuaGVscGVyJztcbmltcG9ydCB7IEpzZG9jRGVmYXVsdEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1kZWZhdWx0LmhlbHBlcic7XG5pbXBvcnQgeyBMaW5rVHlwZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9saW5rLXR5cGUuaGVscGVyJztcbmltcG9ydCB7IEluZGV4YWJsZVNpZ25hdHVyZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pbmRleGFibGUtc2lnbmF0dXJlLmhlbHBlcic7XG5pbXBvcnQgeyBPYmplY3RIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvb2JqZWN0LmhlbHBlcic7XG5pbXBvcnQgeyBPYmplY3RMZW5ndGhIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvb2JqZWN0LWxlbmd0aC5oZWxwZXInO1xuaW1wb3J0IHsgUGFyc2VEZXNjcmlwdGlvbkhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9wYXJzZS1kZXNjcmlwdGlvbi5oZWxwZXInO1xuaW1wb3J0IHsgT25lUGFyYW1ldGVySGFzSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL29uZS1wYXJhbWV0ZXItaGFzLmhlbHBlcic7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb25maWd1cmF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBFbGVtZW50QWxvbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvZWxlbWVudC1hbG9uZS5oZWxwZXInO1xuaW1wb3J0IHsgSGFzT3duSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2hhcy1vd24uaGVscGVyJztcbmltcG9ydCB7IFNob3J0VVJMSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL3Nob3J0LXVybC5oZWxwZXInO1xuaW1wb3J0IHsgSTE4bkhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pMThuLmhlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBIdG1sRW5naW5lSGVscGVycyB7XG4gICAgcHVibGljIHJlZ2lzdGVySGVscGVycyhcbiAgICAgICAgYmFycyxcbiAgICAgICAgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbkludGVyZmFjZSxcbiAgICAgICAgZGVwZW5kZW5jaWVzRW5naW5lOiBEZXBlbmRlbmNpZXNFbmdpbmVcbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnY29tcGFyZScsIG5ldyBDb21wYXJlSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdvcicsIG5ldyBPckhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihcbiAgICAgICAgICAgIGJhcnMsXG4gICAgICAgICAgICAnZnVuY3Rpb25TaWduYXR1cmUnLFxuICAgICAgICAgICAgbmV3IEZ1bmN0aW9uU2lnbmF0dXJlSGVscGVyKGNvbmZpZ3VyYXRpb24sIGRlcGVuZGVuY2llc0VuZ2luZSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnaXNOb3RUb2dnbGUnLCBuZXcgSXNOb3RUb2dnbGVIZWxwZXIoY29uZmlndXJhdGlvbikpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdpc0luaXRpYWxUYWInLCBuZXcgSXNJbml0aWFsVGFiSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdpc1RhYkVuYWJsZWQnLCBuZXcgSXNUYWJFbmFibGVkSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdpZlN0cmluZycsIG5ldyBJZlN0cmluZ0hlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnb3JMZW5ndGgnLCBuZXcgT3JMZW5ndGhIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2ZpbHRlckFuZ3VsYXIyTW9kdWxlcycsIG5ldyBGaWx0ZXJBbmd1bGFyMk1vZHVsZXNIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2RlYnVnJywgbmV3IERlYnVnSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdicmVha2xpbmVzJywgbmV3IEJyZWFrTGluZXNIZWxwZXIoYmFycykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdjbGVhbi1wYXJhZ3JhcGgnLCBuZXcgQ2xlYW5QYXJhZ3JhcGhIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2VzY2FwZVNpbXBsZVF1b3RlJywgbmV3IEVzY2FwZVNpbXBsZVF1b3RlSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdicmVha0NvbW1hJywgbmV3IEJyZWFrQ29tbWFIZWxwZXIoYmFycykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdtb2RpZktpbmQnLCBuZXcgTW9kaWZLaW5kSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdtb2RpZkljb24nLCBuZXcgTW9kaWZJY29uSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdyZWxhdGl2ZVVSTCcsIG5ldyBSZWxhdGl2ZVVSTEhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnanNkb2MtcmV0dXJucy1jb21tZW50JywgbmV3IEpzZG9jUmV0dXJuc0NvbW1lbnRIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2pzZG9jLWNvZGUtZXhhbXBsZScsIG5ldyBKc2RvY0NvZGVFeGFtcGxlSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdqc2RvYy1leGFtcGxlJywgbmV3IEpzZG9jRXhhbXBsZUhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnanNkb2MtcGFyYW1zJywgbmV3IEpzZG9jUGFyYW1zSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdqc2RvYy1wYXJhbXMtdmFsaWQnLCBuZXcgSnNkb2NQYXJhbXNWYWxpZEhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnanNkb2MtZGVmYXVsdCcsIG5ldyBKc2RvY0RlZmF1bHRIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoXG4gICAgICAgICAgICBiYXJzLFxuICAgICAgICAgICAgJ2xpbmtUeXBlJyxcbiAgICAgICAgICAgIG5ldyBMaW5rVHlwZUhlbHBlcihjb25maWd1cmF0aW9uLCBkZXBlbmRlbmNpZXNFbmdpbmUpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2luZGV4YWJsZVNpZ25hdHVyZScsIG5ldyBJbmRleGFibGVTaWduYXR1cmVIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ29iamVjdCcsIG5ldyBPYmplY3RIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ29iamVjdExlbmd0aCcsIG5ldyBPYmplY3RMZW5ndGhIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoXG4gICAgICAgICAgICBiYXJzLFxuICAgICAgICAgICAgJ3BhcnNlRGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgbmV3IFBhcnNlRGVzY3JpcHRpb25IZWxwZXIoZGVwZW5kZW5jaWVzRW5naW5lKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdvbmUtcGFyYW1ldGVyLWhhcycsIG5ldyBPbmVQYXJhbWV0ZXJIYXNIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2VsZW1lbnQtYWxvbmUnLCBuZXcgRWxlbWVudEFsb25lSGVscGVyKGRlcGVuZGVuY2llc0VuZ2luZSkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdoYXNPd24nLCBuZXcgSGFzT3duSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdzaG9ydC11cmwnLCBuZXcgU2hvcnRVUkxIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ3QnLCBuZXcgSTE4bkhlbHBlcigpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVySGVscGVyKGJhcnMsIGtleTogc3RyaW5nLCBoZWxwZXI6IElIdG1sRW5naW5lSGVscGVyKSB7XG4gICAgICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoa2V5LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnZhbGlkLXRoaXNcbiAgICAgICAgICAgIHJldHVybiBoZWxwZXIuaGVscGVyRnVuYy5hcHBseShoZWxwZXIsIFt0aGlzLCAuLi5fLnNsaWNlKGFyZ3VtZW50cyBhcyBhbnkpXSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBIYW5kbGViYXJzIGZyb20gJ2hhbmRsZWJhcnMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi9sb2dnZXInO1xuaW1wb3J0IHsgSHRtbEVuZ2luZUhlbHBlcnMgfSBmcm9tICcuL2h0bWwuZW5naW5lLmhlbHBlcnMnO1xuaW1wb3J0IHsgRGVwZW5kZW5jaWVzRW5naW5lIH0gZnJvbSAnLi9kZXBlbmRlbmNpZXMuZW5naW5lJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbmZpZ3VyYXRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IEZpbGVFbmdpbmUgfSBmcm9tICcuL2ZpbGUuZW5naW5lJztcblxuZXhwb3J0IGNsYXNzIEh0bWxFbmdpbmUge1xuICAgIHByaXZhdGUgY2FjaGU6IHsgcGFnZTogc3RyaW5nIH0gPSB7fSBhcyBhbnk7XG4gICAgcHJpdmF0ZSBjb21waWxlZFBhZ2U7XG5cbiAgICBwcml2YXRlIHByZWNvbXBpbGVkTWVudTtcbiAgICBwcml2YXRlIGNvbXBpbGVkTW9iaWxlTWVudTtcbiAgICBwcml2YXRlIGNvbXBpbGVkTWVudTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uSW50ZXJmYWNlLFxuICAgICAgICBkZXBlbmRlbmNpZXNFbmdpbmU6IERlcGVuZGVuY2llc0VuZ2luZSxcbiAgICAgICAgcHJpdmF0ZSBmaWxlRW5naW5lOiBGaWxlRW5naW5lID0gbmV3IEZpbGVFbmdpbmUoKVxuICAgICkge1xuICAgICAgICBjb25zdCBoZWxwZXIgPSBuZXcgSHRtbEVuZ2luZUhlbHBlcnMoKTtcbiAgICAgICAgaGVscGVyLnJlZ2lzdGVySGVscGVycyhIYW5kbGViYXJzLCBjb25maWd1cmF0aW9uLCBkZXBlbmRlbmNpZXNFbmdpbmUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0KHRlbXBsYXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBwYXJ0aWFscyA9IFtcbiAgICAgICAgICAgICdvdmVydmlldycsXG4gICAgICAgICAgICAnbWFya2Rvd24nLFxuICAgICAgICAgICAgJ21vZHVsZXMnLFxuICAgICAgICAgICAgJ21vZHVsZScsXG4gICAgICAgICAgICAnY29tcG9uZW50cycsXG4gICAgICAgICAgICAnY29tcG9uZW50JyxcbiAgICAgICAgICAgICdjb250cm9sbGVyJyxcbiAgICAgICAgICAgICdjb21wb25lbnQtZGV0YWlsJyxcbiAgICAgICAgICAgICdkaXJlY3RpdmVzJyxcbiAgICAgICAgICAgICdkaXJlY3RpdmUnLFxuICAgICAgICAgICAgJ2luamVjdGFibGVzJyxcbiAgICAgICAgICAgICdpbmplY3RhYmxlJyxcbiAgICAgICAgICAgICdpbnRlcmNlcHRvcicsXG4gICAgICAgICAgICAnZ3VhcmQnLFxuICAgICAgICAgICAgJ3BpcGVzJyxcbiAgICAgICAgICAgICdwaXBlJyxcbiAgICAgICAgICAgICdjbGFzc2VzJyxcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnaW50ZXJmYWNlJyxcbiAgICAgICAgICAgICdyb3V0ZXMnLFxuICAgICAgICAgICAgJ2luZGV4JyxcbiAgICAgICAgICAgICdpbmRleC1taXNjJyxcbiAgICAgICAgICAgICdzZWFyY2gtcmVzdWx0cycsXG4gICAgICAgICAgICAnc2VhcmNoLWlucHV0JyxcbiAgICAgICAgICAgICdsaW5rLXR5cGUnLFxuICAgICAgICAgICAgJ2Jsb2NrLW1ldGhvZCcsXG4gICAgICAgICAgICAnYmxvY2stZW51bScsXG4gICAgICAgICAgICAnYmxvY2stcHJvcGVydHknLFxuICAgICAgICAgICAgJ2Jsb2NrLWluZGV4JyxcbiAgICAgICAgICAgICdibG9jay1jb25zdHJ1Y3RvcicsXG4gICAgICAgICAgICAnYmxvY2stdHlwZWFsaWFzJyxcbiAgICAgICAgICAgICdibG9jay1hY2Nlc3NvcnMnLFxuICAgICAgICAgICAgJ2Jsb2NrLWlucHV0JyxcbiAgICAgICAgICAgICdibG9jay1vdXRwdXQnLFxuICAgICAgICAgICAgJ2NvdmVyYWdlLXJlcG9ydCcsXG5cdFx0XHRcdFx0XHQndW5pdC10ZXN0LXJlcG9ydCcsXG4gICAgICAgICAgICAnbWlzY2VsbGFuZW91cy1mdW5jdGlvbnMnLFxuICAgICAgICAgICAgJ21pc2NlbGxhbmVvdXMtdmFyaWFibGVzJyxcbiAgICAgICAgICAgICdtaXNjZWxsYW5lb3VzLXR5cGVhbGlhc2VzJyxcbiAgICAgICAgICAgICdtaXNjZWxsYW5lb3VzLWVudW1lcmF0aW9ucycsXG4gICAgICAgICAgICAnYWRkaXRpb25hbC1wYWdlJyxcbiAgICAgICAgICAgICdwYWNrYWdlLWRlcGVuZGVuY2llcydcbiAgICAgICAgXTtcbiAgICAgICAgaWYodGVtcGxhdGVQYXRoKXtcbiAgICAgICAgICBpZih0aGlzLmZpbGVFbmdpbmUuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKStwYXRoLnNlcCt0ZW1wbGF0ZVBhdGgpKT09PWZhbHNlKXtcbiAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ1RlbXBsYXRlIHBhdGggc3BlY2lmaWNlZCBidXQgZG9lcyBub3QgZXhpc3QuLi51c2luZyBkZWZhdWx0IHRlbXBsYXRlcycpO1xuICAgICAgICAgICAgICAvL25ldyBFcnJvcignVGVtcGxhdGUgcGF0aCBzcGVjaWZpZWQgYnV0IGRvZXMgbm90IGV4aXN0Jyk7XG4gICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHBhcnRpYWxzLm1hcChwYXJ0aWFsID0+IHtcbiAgICAgICAgICAgIGxldCBwYXJ0aWFsUGF0aCA9IHRoaXMuZGV0ZXJtaW5lVGVtcGxhdGVQYXRoKHRlbXBsYXRlUGF0aCwgJ3BhcnRpYWxzLycrcGFydGlhbCsnLmhicycpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbGVFbmdpbmVcbiAgICAgICAgICAgICAgICAgICAgLmdldChwYXJ0aWFsUGF0aClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZGF0YSA9PiBIYW5kbGViYXJzLnJlZ2lzdGVyUGFydGlhbChwYXJ0aWFsLCBkYXRhKSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgbGV0IHBhZ2VQYXRoID0gdGhpcy5kZXRlcm1pbmVUZW1wbGF0ZVBhdGgodGVtcGxhdGVQYXRoLCAncGFnZS5oYnMnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlRW5naW5lXG4gICAgICAgICAgICAgICAgICAgIC5nZXQocGFnZVBhdGgpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZS5wYWdlID0gZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGlsZWRQYWdlID0gSGFuZGxlYmFycy5jb21waWxlKHRoaXMuY2FjaGUucGFnZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnRJbmRlbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0OiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgIGxldCBtZW51UGF0aCA9IHRoaXMuZGV0ZXJtaW5lVGVtcGxhdGVQYXRoKHRlbXBsYXRlUGF0aCwgJ3BhcnRpYWxzL21lbnUuaGJzJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZUVuZ2luZVxuICAgICAgICAgICAgICAgICAgICAuZ2V0KG1lbnVQYXRoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihtZW51VGVtcGxhdGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVjb21waWxlZE1lbnUgPSBIYW5kbGViYXJzLmNvbXBpbGUobWVudVRlbXBsYXRlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmVudEluZGVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Q6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVyTWVudSh0ZW1wbGF0ZVBhdGgsIGRhdGEpIHtcbiAgICAgICAgbGV0IG1lbnVQYXRoID0gdGhpcy5kZXRlcm1pbmVUZW1wbGF0ZVBhdGgodGVtcGxhdGVQYXRoLCAncGFydGlhbHMvbWVudS5oYnMnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZUVuZ2luZVxuICAgICAgICAgICAgLmdldChtZW51UGF0aClcbiAgICAgICAgICAgIC50aGVuKG1lbnVUZW1wbGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgZGF0YS5tZW51ID0gJ25vcm1hbCc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEhhbmRsZWJhcnMuY29tcGlsZShtZW51VGVtcGxhdGUsIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldmVudEluZGVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3RyaWN0OiB0cnVlXG4gICAgICAgICAgICAgICAgfSkoeyAuLi5kYXRhIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbmRlcihtYWluRGF0YTogYW55LCBwYWdlOiBhbnkpOiBzdHJpbmcge1xuICAgICAgICBsZXQgbyA9IG1haW5EYXRhO1xuICAgICAgICAoT2JqZWN0IGFzIGFueSkuYXNzaWduKG8sIHBhZ2UpO1xuXG4gICAgICAgIC8vIGxldCBtZW0gPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBoZWFwVG90YWw6ICR7bWVtLmhlYXBUb3RhbH0gfCBoZWFwVXNlZDogJHttZW0uaGVhcFVzZWR9YCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZWRQYWdlKHtcbiAgICAgICAgICAgIGRhdGE6IG9cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHByaXZhdGUgZGV0ZXJtaW5lVGVtcGxhdGVQYXRoKHRlbXBsYXRlUGF0aDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIGxldCBvdXRQYXRoID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSArICcvLi4vc3JjL3RlbXBsYXRlcy8nK2ZpbGVQYXRoKTtcbiAgICAgIGlmKHRlbXBsYXRlUGF0aCl7XG4gICAgICAgICBsZXQgdGVzdFBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwICsgdGVtcGxhdGVQYXRoICsgcGF0aC5zZXAgKyBmaWxlUGF0aCk7XG4gICAgICAgIG91dFBhdGggPSAodGhpcy5maWxlRW5naW5lLmV4aXN0c1N5bmModGVzdFBhdGgpID8gdGVzdFBhdGggOiBvdXRQYXRoKTsgXG4gICAgICB9XG4gICAgIHJldHVybiBvdXRQYXRoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZW5lcmF0ZUNvdmVyYWdlQmFkZ2Uob3V0cHV0Rm9sZGVyLCBsYWJlbCwgY292ZXJhZ2VEYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbGVFbmdpbmVcbiAgICAgICAgICAgIC5nZXQocGF0aC5yZXNvbHZlKF9fZGlybmFtZSArICcvLi4vc3JjL3RlbXBsYXRlcy9wYXJ0aWFscy9jb3ZlcmFnZS1iYWRnZS5oYnMnKSlcbiAgICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcGxhdGU6IGFueSA9IEhhbmRsZWJhcnMuY29tcGlsZShkYXRhKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y292ZXJhZ2VEYXRhLmxhYmVsID0gbGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0ZW1wbGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBjb3ZlcmFnZURhdGFcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXN0T3V0cHV0RGlyID0gb3V0cHV0Rm9sZGVyLm1hdGNoKHByb2Nlc3MuY3dkKCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGVzdE91dHB1dERpciAmJiB0ZXN0T3V0cHV0RGlyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZvbGRlciA9IG91dHB1dEZvbGRlci5yZXBsYWNlKHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCwgJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZUVuZ2luZVxuICAgICAgICAgICAgICAgICAgICAgICAgLndyaXRlKG91dHB1dEZvbGRlciArIHBhdGguc2VwICsgJy9pbWFnZXMvY292ZXJhZ2UtYmFkZ2UtJyArIGxhYmVsICsgJy5zdmcnLCByZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGR1cmluZyBjb3ZlcmFnZSBiYWRnZSAnICsgbGFiZWwgKyAnIGZpbGUgZ2VuZXJhdGlvbiAnLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnIgPT4gUHJvbWlzZS5yZWplY3QoJ0Vycm9yIGR1cmluZyBjb3ZlcmFnZSBiYWRnZSBnZW5lcmF0aW9uJylcbiAgICAgICAgICAgICk7XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEZpbGVFbmdpbmUgfSBmcm9tICcuL2ZpbGUuZW5naW5lJztcblxuY29uc3QgbWFya2VkID0gcmVxdWlyZSgnbWFya2VkJyk7XG5cbmV4cG9ydCBjbGFzcyBNYXJrZG93bkVuZ2luZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBtYXJrZG93biBmaWxlcyB3aXRob3V0IC5tZCBleHRlbnNpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IG1hcmtkb3duRmlsZXMgPSBbJ1JFQURNRScsICdDSEFOR0VMT0cnLCAnTElDRU5TRScsICdDT05UUklCVVRJTkcnLCAnVE9ETyddO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBmaWxlRW5naW5lID0gbmV3IEZpbGVFbmdpbmUoKSkge1xuICAgICAgICBjb25zdCByZW5kZXJlciA9IG5ldyBtYXJrZWQuUmVuZGVyZXIoKTtcbiAgICAgICAgcmVuZGVyZXIuY29kZSA9IChjb2RlLCBsYW5ndWFnZSkgPT4ge1xuICAgICAgICAgICAgbGV0IGhpZ2hsaWdodGVkID0gY29kZTtcbiAgICAgICAgICAgIGlmICghbGFuZ3VhZ2UpIHtcbiAgICAgICAgICAgICAgICBsYW5ndWFnZSA9ICdub25lJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaGlnaGxpZ2h0ZWQgPSB0aGlzLmVzY2FwZShjb2RlKTtcbiAgICAgICAgICAgIHJldHVybiBgPGRpdj48cHJlIGNsYXNzPVwibGluZS1udW1iZXJzXCI+PGNvZGUgY2xhc3M9XCJsYW5ndWFnZS0ke2xhbmd1YWdlfVwiPiR7aGlnaGxpZ2h0ZWR9PC9jb2RlPjwvcHJlPjwvZGl2PmA7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmVuZGVyZXIudGFibGUgPSAoaGVhZGVyLCBib2R5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICc8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ib3JkZXJlZCBjb21wb2RvYy10YWJsZVwiPlxcbicgK1xuICAgICAgICAgICAgICAgICc8dGhlYWQ+XFxuJyArXG4gICAgICAgICAgICAgICAgaGVhZGVyICtcbiAgICAgICAgICAgICAgICAnPC90aGVhZD5cXG4nICtcbiAgICAgICAgICAgICAgICAnPHRib2R5PlxcbicgK1xuICAgICAgICAgICAgICAgIGJvZHkgK1xuICAgICAgICAgICAgICAgICc8L3Rib2R5PlxcbicgK1xuICAgICAgICAgICAgICAgICc8L3RhYmxlPlxcbidcbiAgICAgICAgICAgICk7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICAgICByZW5kZXJlci5pbWFnZSA9IGZ1bmN0aW9uKGhyZWY6IHN0cmluZywgdGl0bGU6IHN0cmluZywgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgICAgICBsZXQgb3V0ID0gJzxpbWcgc3JjPVwiJyArIGhyZWYgKyAnXCIgYWx0PVwiJyArIHRleHQgKyAnXCIgY2xhc3M9XCJpbWctcmVzcG9uc2l2ZVwiJztcbiAgICAgICAgICAgIGlmICh0aXRsZSkge1xuICAgICAgICAgICAgICAgIG91dCArPSAnIHRpdGxlPVwiJyArIHRpdGxlICsgJ1wiJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnPic7XG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9O1xuXG4gICAgICAgIG1hcmtlZC5zZXRPcHRpb25zKHtcbiAgICAgICAgICAgIHJlbmRlcmVyOiByZW5kZXJlcixcbiAgICAgICAgICAgIGJyZWFrczogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRyYWRpdGlvbmFsTWFya2Rvd24oZmlsZXBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbGVFbmdpbmVcbiAgICAgICAgICAgIC5nZXQocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwICsgZmlsZXBhdGggKyAnLm1kJylcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5maWxlRW5naW5lLmdldChwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyBmaWxlcGF0aCkudGhlbigpKVxuICAgICAgICAgICAgLnRoZW4oZGF0YSA9PiBtYXJrZWQoZGF0YSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUcmFkaXRpb25hbE1hcmtkb3duU3luYyhmaWxlcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIG1hcmtlZCh0aGlzLmZpbGVFbmdpbmUuZ2V0U3luYyhwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyBmaWxlcGF0aCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UmVhZG1lRmlsZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5maWxlRW5naW5lXG4gICAgICAgICAgICAuZ2V0KHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCArICdSRUFETUUubWQnKVxuICAgICAgICAgICAgLnRoZW4oZGF0YSA9PiBtYXJrZWQoZGF0YSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkTmVpZ2hib3VyUmVhZG1lRmlsZShmaWxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlKTtcbiAgICAgICAgbGV0IHJlYWRtZUZpbGUgPSBkaXJuYW1lICsgcGF0aC5zZXAgKyBwYXRoLmJhc2VuYW1lKGZpbGUsICcudHMnKSArICcubWQnO1xuICAgICAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHJlYWRtZUZpbGUsICd1dGY4Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc05laWdoYm91clJlYWRtZUZpbGUoZmlsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBkaXJuYW1lID0gcGF0aC5kaXJuYW1lKGZpbGUpO1xuICAgICAgICBsZXQgcmVhZG1lRmlsZSA9IGRpcm5hbWUgKyBwYXRoLnNlcCArIHBhdGguYmFzZW5hbWUoZmlsZSwgJy50cycpICsgJy5tZCc7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbGVFbmdpbmUuZXhpc3RzU3luYyhyZWFkbWVGaWxlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXBvbmVudFJlYWRtZUZpbGUoZmlsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGRpcm5hbWUgPSBwYXRoLmRpcm5hbWUoZmlsZSk7XG4gICAgICAgIGxldCByZWFkbWVGaWxlID0gZGlybmFtZSArIHBhdGguc2VwICsgJ1JFQURNRS5tZCc7XG4gICAgICAgIGxldCByZWFkbWVBbHRlcm5hdGl2ZUZpbGUgPSBkaXJuYW1lICsgcGF0aC5zZXAgKyBwYXRoLmJhc2VuYW1lKGZpbGUsICcudHMnKSArICcubWQnO1xuICAgICAgICBsZXQgZmluYWxQYXRoID0gJyc7XG4gICAgICAgIGlmICh0aGlzLmZpbGVFbmdpbmUuZXhpc3RzU3luYyhyZWFkbWVGaWxlKSkge1xuICAgICAgICAgICAgZmluYWxQYXRoID0gcmVhZG1lRmlsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpbmFsUGF0aCA9IHJlYWRtZUFsdGVybmF0aXZlRmlsZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmluYWxQYXRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbnkgb2YgdGhlIG1hcmtkb3duIGZpbGVzIGlzIGV4aXN0cyB3aXRoIG9yIHdpdGhvdXQgZW5kaW5nc1xuICAgICAqL1xuICAgIHB1YmxpYyBoYXNSb290TWFya2Rvd25zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRFbmRpbmdzKHRoaXMubWFya2Rvd25GaWxlcykuc29tZSh4ID0+XG4gICAgICAgICAgICB0aGlzLmZpbGVFbmdpbmUuZXhpc3RzU3luYyhwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyB4KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0Um9vdE1hcmtkb3ducygpOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCBmb3VuZEZpbGVzID0gdGhpcy5tYXJrZG93bkZpbGVzLmZpbHRlcihcbiAgICAgICAgICAgIHggPT5cbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVFbmdpbmUuZXhpc3RzU3luYyhwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyB4ICsgJy5tZCcpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlRW5naW5lLmV4aXN0c1N5bmMocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwICsgeClcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hZGRFbmRpbmdzKGZvdW5kRmlsZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZXNjYXBlKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBodG1sXG4gICAgICAgICAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKVxuICAgICAgICAgICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKVxuICAgICAgICAgICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKVxuICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgJyYjMzk7JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9AL2csICcmIzY0OycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFsnUkVBRE1FJ10gPT4gWydSRUFETUUnLCAnUkVBRE1FLm1kJ11cbiAgICAgKi9cbiAgICBwcml2YXRlIGFkZEVuZGluZ3MoZmlsZXM6IEFycmF5PHN0cmluZz4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIF8uZmxhdE1hcChmaWxlcywgeCA9PiBbeCwgeCArICcubWQnXSk7XG4gICAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IENPTVBPRE9DX0RFRkFVTFRTID0ge1xuICAgIHRpdGxlOiAnQXBwbGljYXRpb24gZG9jdW1lbnRhdGlvbicsXG4gICAgYWRkaXRpb25hbEVudHJ5TmFtZTogJ0FkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbicsXG4gICAgYWRkaXRpb25hbEVudHJ5UGF0aDogJ2FkZGl0aW9uYWwtZG9jdW1lbnRhdGlvbicsXG4gICAgZm9sZGVyOiAnLi9kb2N1bWVudGF0aW9uLycsXG4gICAgcG9ydDogODA4MCxcbiAgICB0aGVtZTogJ2dpdGJvb2snLFxuICAgIGV4cG9ydEZvcm1hdDogJ2h0bWwnLFxuICAgIGV4cG9ydEZvcm1hdHNTdXBwb3J0ZWQ6IFsnaHRtbCcsICdqc29uJ10sXG4gICAgYmFzZTogJy8nLFxuICAgIGRlZmF1bHRDb3ZlcmFnZVRocmVzaG9sZDogNzAsXG4gICAgZGVmYXVsdENvdmVyYWdlTWluaW11bVBlckZpbGU6IDAsXG4gICAgY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbDogdHJ1ZSxcbiAgICB0b2dnbGVNZW51SXRlbXM6IFsnYWxsJ10sXG4gICAgbmF2VGFiQ29uZmlnOiBbXSxcbiAgICBkaXNhYmxlU291cmNlQ29kZTogZmFsc2UsXG4gICAgZGlzYWJsZURvbVRyZWU6IGZhbHNlLFxuICAgIGRpc2FibGVUZW1wbGF0ZVRhYjogZmFsc2UsXG4gICAgZGlzYWJsZUdyYXBoOiBmYWxzZSxcbiAgICBkaXNhYmxlTWFpbkdyYXBoOiBmYWxzZSxcbiAgICBkaXNhYmxlQ292ZXJhZ2U6IGZhbHNlLFxuICAgIGRpc2FibGVQcml2YXRlOiBmYWxzZSxcbiAgICBkaXNhYmxlUHJvdGVjdGVkOiBmYWxzZSxcbiAgICBkaXNhYmxlSW50ZXJuYWw6IGZhbHNlLFxuICAgIGRpc2FibGVMaWZlQ3ljbGVIb29rczogZmFsc2UsXG4gICAgZGlzYWJsZVJvdXRlc0dyYXBoOiBmYWxzZSxcbiAgICBQQUdFX1RZUEVTOiB7XG4gICAgICAgIFJPT1Q6ICdyb290JyxcbiAgICAgICAgSU5URVJOQUw6ICdpbnRlcm5hbCdcbiAgICB9LFxuICAgIGdhU2l0ZTogJ2F1dG8nLFxuICAgIGNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkOiBmYWxzZSxcbiAgICBsYW5ndWFnZTogJ2VuLVVTJ1xufTtcbiIsImltcG9ydCB7IENPTVBPRE9DX0RFRkFVTFRTIH0gZnJvbSAnLi4vdXRpbHMvZGVmYXVsdHMnO1xuaW1wb3J0IHsgUGFnZUludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9wYWdlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBNYWluRGF0YUludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9tYWluLWRhdGEuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIENvbmZpZ3VyYXRpb25JbnRlcmZhY2Uge1xuICAgIHByaXZhdGUgX3BhZ2VzOiBQYWdlSW50ZXJmYWNlW10gPSBbXTtcbiAgICBwcml2YXRlIF9tYWluRGF0YTogTWFpbkRhdGFJbnRlcmZhY2UgPSB7XG4gICAgICAgIG91dHB1dDogQ09NUE9ET0NfREVGQVVMVFMuZm9sZGVyLFxuICAgICAgICB0aGVtZTogQ09NUE9ET0NfREVGQVVMVFMudGhlbWUsXG4gICAgICAgIGV4dFRoZW1lOiAnJyxcbiAgICAgICAgc2VydmU6IGZhbHNlLFxuICAgICAgICBwb3J0OiBDT01QT0RPQ19ERUZBVUxUUy5wb3J0LFxuICAgICAgICBvcGVuOiBmYWxzZSxcbiAgICAgICAgYXNzZXRzRm9sZGVyOiAnJyxcbiAgICAgICAgZG9jdW1lbnRhdGlvbk1haW5OYW1lOiBDT01QT0RPQ19ERUZBVUxUUy50aXRsZSxcbiAgICAgICAgZG9jdW1lbnRhdGlvbk1haW5EZXNjcmlwdGlvbjogJycsXG4gICAgICAgIGJhc2U6IENPTVBPRE9DX0RFRkFVTFRTLmJhc2UsXG4gICAgICAgIGhpZGVHZW5lcmF0b3I6IGZhbHNlLFxuICAgICAgICBtb2R1bGVzOiBbXSxcbiAgICAgICAgcmVhZG1lOiBmYWxzZSxcbiAgICAgICAgY2hhbmdlbG9nOiAnJyxcbiAgICAgICAgY29udHJpYnV0aW5nOiAnJyxcbiAgICAgICAgbGljZW5zZTogJycsXG4gICAgICAgIHRvZG86ICcnLFxuICAgICAgICBtYXJrZG93bnM6IFtdLFxuICAgICAgICBhZGRpdGlvbmFsUGFnZXM6IFtdLFxuICAgICAgICBwaXBlczogW10sXG4gICAgICAgIGNsYXNzZXM6IFtdLFxuICAgICAgICBpbnRlcmZhY2VzOiBbXSxcbiAgICAgICAgY29tcG9uZW50czogW10sXG4gICAgICAgIGRpcmVjdGl2ZXM6IFtdLFxuICAgICAgICBpbmplY3RhYmxlczogW10sXG4gICAgICAgIGludGVyY2VwdG9yczogW10sXG4gICAgICAgIGd1YXJkczogW10sXG4gICAgICAgIG1pc2NlbGxhbmVvdXM6IFtdLFxuICAgICAgICByb3V0ZXM6IFtdLFxuICAgICAgICB0c2NvbmZpZzogJycsXG4gICAgICAgIHRvZ2dsZU1lbnVJdGVtczogW10sXG4gICAgICAgIG5hdlRhYkNvbmZpZzogW10sXG4gICAgICAgIGluY2x1ZGVzOiAnJyxcbiAgICAgICAgaW5jbHVkZXNOYW1lOiBDT01QT0RPQ19ERUZBVUxUUy5hZGRpdGlvbmFsRW50cnlOYW1lLFxuICAgICAgICBpbmNsdWRlc0ZvbGRlcjogQ09NUE9ET0NfREVGQVVMVFMuYWRkaXRpb25hbEVudHJ5UGF0aCxcbiAgICAgICAgZGlzYWJsZVNvdXJjZUNvZGU6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVTb3VyY2VDb2RlLFxuICAgICAgICBkaXNhYmxlRG9tVHJlZTogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZURvbVRyZWUsXG4gICAgICAgIGRpc2FibGVUZW1wbGF0ZVRhYjogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZVRlbXBsYXRlVGFiLFxuICAgICAgICBkaXNhYmxlR3JhcGg6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVHcmFwaCxcbiAgICAgICAgZGlzYWJsZU1haW5HcmFwaDogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZU1haW5HcmFwaCxcbiAgICAgICAgZGlzYWJsZUNvdmVyYWdlOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlQ292ZXJhZ2UsXG4gICAgICAgIGRpc2FibGVQcml2YXRlOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlUHJpdmF0ZSxcbiAgICAgICAgZGlzYWJsZUludGVybmFsOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlSW50ZXJuYWwsXG4gICAgICAgIGRpc2FibGVQcm90ZWN0ZWQ6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVQcm90ZWN0ZWQsXG4gICAgICAgIGRpc2FibGVMaWZlQ3ljbGVIb29rczogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZUxpZmVDeWNsZUhvb2tzLFxuICAgICAgICBkaXNhYmxlUm91dGVzR3JhcGg6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVSb3V0ZXNHcmFwaCxcbiAgICAgICAgd2F0Y2g6IGZhbHNlLFxuICAgICAgICBtYWluR3JhcGg6ICcnLFxuICAgICAgICBjb3ZlcmFnZVRlc3Q6IGZhbHNlLFxuICAgICAgICBjb3ZlcmFnZVRlc3RUaHJlc2hvbGQ6IENPTVBPRE9DX0RFRkFVTFRTLmRlZmF1bHRDb3ZlcmFnZVRocmVzaG9sZCxcbiAgICAgICAgY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbDogQ09NUE9ET0NfREVGQVVMVFMuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCxcbiAgICAgICAgY292ZXJhZ2VUZXN0UGVyRmlsZTogZmFsc2UsXG4gICAgICAgIGNvdmVyYWdlTWluaW11bVBlckZpbGU6IENPTVBPRE9DX0RFRkFVTFRTLmRlZmF1bHRDb3ZlcmFnZU1pbmltdW1QZXJGaWxlLFxuICAgICAgICB1bml0VGVzdENvdmVyYWdlOiAnJyxcbiAgICAgICAgdW5pdFRlc3REYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkOiBDT01QT0RPQ19ERUZBVUxUUy5jb3ZlcmFnZVRlc3RTaG93T25seUZhaWxlZCxcbiAgICAgICAgcm91dGVzTGVuZ3RoOiAwLFxuICAgICAgICBhbmd1bGFyVmVyc2lvbjogJycsXG4gICAgICAgIGV4cG9ydEZvcm1hdDogQ09NUE9ET0NfREVGQVVMVFMuZXhwb3J0Rm9ybWF0LFxuICAgICAgICBjb3ZlcmFnZURhdGE6IHt9LFxuICAgICAgICBjdXN0b21GYXZpY29uOiAnJyxcbiAgICAgICAgcGFja2FnZURlcGVuZGVuY2llczogW10sXG4gICAgICAgIHBhY2thZ2VQZWVyRGVwZW5kZW5jaWVzOiBbXSxcbiAgICAgICAgZ2FJRDogJycsXG4gICAgICAgIGdhU2l0ZTogJycsXG4gICAgICAgIGFuZ3VsYXJQcm9qZWN0OiBmYWxzZSxcbiAgICAgICAgYW5ndWxhckpTUHJvamVjdDogZmFsc2UsXG4gICAgICAgIGxhbmd1YWdlOiBDT01QT0RPQ19ERUZBVUxUUy5sYW5ndWFnZVxuICAgIH07XG5cbiAgICBwdWJsaWMgYWRkUGFnZShwYWdlOiBQYWdlSW50ZXJmYWNlKSB7XG4gICAgICAgIGxldCBpbmRleFBhZ2UgPSBfLmZpbmRJbmRleCh0aGlzLl9wYWdlcywgeyBuYW1lOiBwYWdlLm5hbWUgfSk7XG4gICAgICAgIGlmIChpbmRleFBhZ2UgPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLl9wYWdlcy5wdXNoKHBhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGhhc1BhZ2UobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBpbmRleFBhZ2UgPSBfLmZpbmRJbmRleCh0aGlzLl9wYWdlcywgeyBuYW1lOiBuYW1lIH0pO1xuICAgICAgICByZXR1cm4gaW5kZXhQYWdlICE9PSAtMTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQWRkaXRpb25hbFBhZ2UocGFnZTogUGFnZUludGVyZmFjZSkge1xuICAgICAgICB0aGlzLl9tYWluRGF0YS5hZGRpdGlvbmFsUGFnZXMucHVzaChwYWdlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRQYWdlcygpIHtcbiAgICAgICAgdGhpcy5fcGFnZXMgPSBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRBZGRpdGlvbmFsUGFnZXMoKSB7XG4gICAgICAgIHRoaXMuX21haW5EYXRhLmFkZGl0aW9uYWxQYWdlcyA9IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNldFJvb3RNYXJrZG93blBhZ2VzKCkge1xuICAgICAgICBsZXQgaW5kZXhQYWdlID0gXy5maW5kSW5kZXgodGhpcy5fcGFnZXMsIHsgbmFtZTogJ2luZGV4JyB9KTtcbiAgICAgICAgdGhpcy5fcGFnZXMuc3BsaWNlKGluZGV4UGFnZSwgMSk7XG4gICAgICAgIGluZGV4UGFnZSA9IF8uZmluZEluZGV4KHRoaXMuX3BhZ2VzLCB7IG5hbWU6ICdjaGFuZ2Vsb2cnIH0pO1xuICAgICAgICB0aGlzLl9wYWdlcy5zcGxpY2UoaW5kZXhQYWdlLCAxKTtcbiAgICAgICAgaW5kZXhQYWdlID0gXy5maW5kSW5kZXgodGhpcy5fcGFnZXMsIHsgbmFtZTogJ2NvbnRyaWJ1dGluZycgfSk7XG4gICAgICAgIHRoaXMuX3BhZ2VzLnNwbGljZShpbmRleFBhZ2UsIDEpO1xuICAgICAgICBpbmRleFBhZ2UgPSBfLmZpbmRJbmRleCh0aGlzLl9wYWdlcywgeyBuYW1lOiAnbGljZW5zZScgfSk7XG4gICAgICAgIHRoaXMuX3BhZ2VzLnNwbGljZShpbmRleFBhZ2UsIDEpO1xuICAgICAgICBpbmRleFBhZ2UgPSBfLmZpbmRJbmRleCh0aGlzLl9wYWdlcywgeyBuYW1lOiAndG9kbycgfSk7XG4gICAgICAgIHRoaXMuX3BhZ2VzLnNwbGljZShpbmRleFBhZ2UsIDEpO1xuICAgICAgICB0aGlzLl9tYWluRGF0YS5tYXJrZG93bnMgPSBbXTtcbiAgICB9XG5cbiAgICBnZXQgcGFnZXMoKTogUGFnZUludGVyZmFjZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VzO1xuICAgIH1cbiAgICBzZXQgcGFnZXMocGFnZXM6IFBhZ2VJbnRlcmZhY2VbXSkge1xuICAgICAgICB0aGlzLl9wYWdlcyA9IFtdO1xuICAgIH1cblxuICAgIGdldCBtYWluRGF0YSgpOiBNYWluRGF0YUludGVyZmFjZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYWluRGF0YTtcbiAgICB9XG4gICAgc2V0IG1haW5EYXRhKGRhdGE6IE1haW5EYXRhSW50ZXJmYWNlKSB7XG4gICAgICAgIChPYmplY3QgYXMgYW55KS5hc3NpZ24odGhpcy5fbWFpbkRhdGEsIGRhdGEpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERlcGVuZGVuY2llc0VuZ2luZSB9IGZyb20gJy4vZGVwZW5kZW5jaWVzLmVuZ2luZSc7XG5pbXBvcnQgeyBGaWxlRW5naW5lIH0gZnJvbSAnLi9maWxlLmVuZ2luZSc7XG5cbmNvbnN0IG5nZFQgPSByZXF1aXJlKCdAY29tcG9kb2MvbmdkLXRyYW5zZm9ybWVyJyk7XG5cbmV4cG9ydCBjbGFzcyBOZ2RFbmdpbmUge1xuICAgIHB1YmxpYyBlbmdpbmU7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBkZXBlbmRlbmNpZXNFbmdpbmU6IERlcGVuZGVuY2llc0VuZ2luZSxcbiAgICAgICAgcHJpdmF0ZSBmaWxlRW5naW5lOiBGaWxlRW5naW5lID0gbmV3IEZpbGVFbmdpbmUoKVxuICAgICkge31cblxuICAgIHB1YmxpYyBpbml0KG91dHB1dHBhdGg6IHN0cmluZykge1xuICAgICAgICB0aGlzLmVuZ2luZSA9IG5ldyBuZ2RULkRvdEVuZ2luZSh7XG4gICAgICAgICAgICBvdXRwdXQ6IG91dHB1dHBhdGgsXG4gICAgICAgICAgICBkaXNwbGF5TGVnZW5kOiB0cnVlLFxuICAgICAgICAgICAgb3V0cHV0Rm9ybWF0czogJ3N2ZycsXG4gICAgICAgICAgICBzaWxlbnQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbmRlckdyYXBoKGZpbGVwYXRoOiBzdHJpbmcsIG91dHB1dHBhdGg6IHN0cmluZywgdHlwZTogc3RyaW5nLCBuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZW5naW5lLnVwZGF0ZU91dHB1dChvdXRwdXRwYXRoKTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gJ2YnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbmdpbmUuZ2VuZXJhdGVHcmFwaChbdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZ2V0UmF3TW9kdWxlKG5hbWUpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbmdpbmUuZ2VuZXJhdGVHcmFwaCh0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5yYXdNb2R1bGVzRm9yT3ZlcnZpZXcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRHcmFwaChmaWxlcGF0aDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5maWxlRW5naW5lXG4gICAgICAgICAgICAuZ2V0KGZpbGVwYXRoKVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiBQcm9taXNlLnJlamVjdCgnRXJyb3IgZHVyaW5nIGdyYXBoIHJlYWQgJyArIG5hbWUpKTtcbiAgICB9XG59XG4iLCJleHBvcnQgY29uc3QgQ09NUE9ET0NfQ09OU1RBTlRTID0ge1xuICAgIG5hdlRhYkRlZmluaXRpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgICdpZCc6ICdpbmZvJyxcbiAgICAgICAgICAgICdocmVmJzogJyNpbmZvJyxcbiAgICAgICAgICAgICdkYXRhLWxpbmsnOiAnaW5mbycsXG4gICAgICAgICAgICAnbGFiZWwnOiAnSW5mbycsXG4gICAgICAgICAgICAnZGVwVHlwZXMnOiBbJ2FsbCddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgICdpZCc6ICdyZWFkbWUnLFxuICAgICAgICAgICAgJ2hyZWYnOiAnI3JlYWRtZScsXG4gICAgICAgICAgICAnZGF0YS1saW5rJzogJ3JlYWRtZScsXG4gICAgICAgICAgICAnbGFiZWwnOiAnUkVBRE1FJyxcbiAgICAgICAgICAgICdkZXBUeXBlcyc6IFsnYWxsJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgJ2lkJzogJ3NvdXJjZScsXG4gICAgICAgICAgICAnaHJlZic6ICcjc291cmNlJyxcbiAgICAgICAgICAgICdkYXRhLWxpbmsnOiAnc291cmNlJyxcbiAgICAgICAgICAgICdsYWJlbCc6ICdTb3VyY2UnLFxuICAgICAgICAgICAgJ2RlcFR5cGVzJzogWydhbGwnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICAnaWQnOiAndGVtcGxhdGVEYXRhJyxcbiAgICAgICAgICAgICdocmVmJzogJyN0ZW1wbGF0ZURhdGEnLFxuICAgICAgICAgICAgJ2RhdGEtbGluayc6ICd0ZW1wbGF0ZScsXG4gICAgICAgICAgICAnbGFiZWwnOiAnVGVtcGxhdGUnLFxuICAgICAgICAgICAgJ2RlcFR5cGVzJzogWydjb21wb25lbnQnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICAnaWQnOiAndHJlZScsXG4gICAgICAgICAgICAnaHJlZic6ICcjdHJlZScsXG4gICAgICAgICAgICAnZGF0YS1saW5rJzogJ2RvbS10cmVlJyxcbiAgICAgICAgICAgICdsYWJlbCc6ICdET00gVHJlZScsXG4gICAgICAgICAgICAnZGVwVHlwZXMnOiBbJ2NvbXBvbmVudCddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgICdpZCc6ICdleGFtcGxlJyxcbiAgICAgICAgICAgICdocmVmJzogJyNleGFtcGxlJyxcbiAgICAgICAgICAgICdkYXRhLWxpbmsnOiAnZXhhbXBsZScsXG4gICAgICAgICAgICAnbGFiZWwnOiAnRXhhbXBsZXMnLFxuICAgICAgICAgICAgJ2RlcFR5cGVzJzogWydjb21wb25lbnQnLCAnZGlyZWN0aXZlJywgJ2luamVjdGFibGUnLCAncGlwZSddXG4gICAgICAgIH0sXG4gICAgXVxufTtcblxuLyoqXG4gKiBNYXggbGVuZ3RoIGZvciB0aGUgc3RyaW5nIG9mIGEgZmlsZSBkdXJpbmcgTHVuciBzZWFyY2ggZW5naW5lIGluZGV4aW5nLlxuICogUHJldmVudCBzdGFjayBzaXplIGV4Y2VlZGVkXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfU0laRV9GSUxFX1NFQVJDSF9JTkRFWCA9IDUwMDAwO1xuXG4vKipcbiAqIE1heCBsZW5ndGggZm9yIHRoZSBzdHJpbmcgb2YgYSBmaWxlIGR1cmluZyBjaGVlcmlvIHBhcnNpbmcuXG4gKiBQcmV2ZW50IHN0YWNrIHNpemUgZXhjZWVkZWRcbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9TSVpFX0ZJTEVfQ0hFRVJJT19QQVJTSU5HID0gNDAwMDAwMDAwO1xuIiwiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIEhhbmRsZWJhcnMgZnJvbSAnaGFuZGxlYmFycyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi9sb2dnZXInO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRmlsZUVuZ2luZSB9IGZyb20gJy4vZmlsZS5lbmdpbmUnO1xuaW1wb3J0IHsgTUFYX1NJWkVfRklMRV9TRUFSQ0hfSU5ERVgsIE1BWF9TSVpFX0ZJTEVfQ0hFRVJJT19QQVJTSU5HIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29uc3RhbnRzJztcblxuY29uc3QgbHVucjogYW55ID0gcmVxdWlyZSgnbHVucicpO1xuY29uc3QgY2hlZXJpbzogYW55ID0gcmVxdWlyZSgnY2hlZXJpbycpO1xuY29uc3QgRW50aXRpZXM6IGFueSA9IHJlcXVpcmUoJ2h0bWwtZW50aXRpZXMnKS5BbGxIdG1sRW50aXRpZXM7XG5jb25zdCBIdG1sID0gbmV3IEVudGl0aWVzKCk7XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hFbmdpbmUge1xuICAgIHB1YmxpYyBzZWFyY2hJbmRleDogYW55O1xuICAgIHByaXZhdGUgc2VhcmNoRG9jdW1lbnRzID0gW107XG4gICAgcHVibGljIGRvY3VtZW50c1N0b3JlOiBPYmplY3QgPSB7fTtcbiAgICBwdWJsaWMgaW5kZXhTaXplOiBudW1iZXI7XG4gICAgcHVibGljIGFtb3VudE9mTWVtb3J5ID0gMDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UsXG4gICAgICAgIHByaXZhdGUgZmlsZUVuZ2luZTogRmlsZUVuZ2luZSA9IG5ldyBGaWxlRW5naW5lKClcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgaW5kZXhQYWdlKHBhZ2UpIHtcbiAgICAgICAgbGV0IHRleHQ7XG4gICAgICAgIHRoaXMuYW1vdW50T2ZNZW1vcnkgKz0gcGFnZS5yYXdEYXRhLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuYW1vdW50T2ZNZW1vcnkgPCBNQVhfU0laRV9GSUxFX0NIRUVSSU9fUEFSU0lORykge1xuICAgICAgICAgICAgbGV0IGluZGV4U3RhcnRDb250ZW50ID0gcGFnZS5yYXdEYXRhLmluZGV4T2YoJzwhLS0gU1RBUlQgQ09OVEVOVCAtLT4nKTtcbiAgICAgICAgICAgIGxldCBpbmRleEVuZENvbnRlbnQgPSBwYWdlLnJhd0RhdGEuaW5kZXhPZignPCEtLSBFTkQgQ09OVEVOVCAtLT4nKTtcblxuICAgICAgICAgICAgbGV0ICQgPSBjaGVlcmlvLmxvYWQocGFnZS5yYXdEYXRhLnN1YnN0cmluZyhpbmRleFN0YXJ0Q29udGVudCArIDEsIGluZGV4RW5kQ29udGVudCkpO1xuXG4gICAgICAgICAgICB0ZXh0ID0gJCgnLmNvbnRlbnQnKS5odG1sKCk7XG4gICAgICAgICAgICB0ZXh0ID0gSHRtbC5kZWNvZGUodGV4dCk7XG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8oPChbXj5dKyk+KS9naSwgJycpO1xuXG4gICAgICAgICAgICBwYWdlLnVybCA9IHBhZ2UudXJsLnJlcGxhY2UodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCwgJycpO1xuXG4gICAgICAgICAgICBsZXQgZG9jID0ge1xuICAgICAgICAgICAgICAgIHVybDogcGFnZS51cmwsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHBhZ2UuaW5mb3MuY29udGV4dCArICcgLSAnICsgcGFnZS5pbmZvcy5uYW1lLFxuICAgICAgICAgICAgICAgIGJvZHk6IHRleHRcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhdGhpcy5kb2N1bWVudHNTdG9yZS5oYXNPd25Qcm9wZXJ0eShkb2MudXJsKSAmJlxuICAgICAgICAgICAgICAgIGRvYy5ib2R5Lmxlbmd0aCA8IE1BWF9TSVpFX0ZJTEVfU0VBUkNIX0lOREVYXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50c1N0b3JlW2RvYy51cmxdID0gZG9jO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoRG9jdW1lbnRzLnB1c2goZG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZW5lcmF0ZVNlYXJjaEluZGV4SnNvbihvdXRwdXRGb2xkZXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgdGhhdCA9IHRoaXM7XG4gICAgICAgIGxldCBzZWFyY2hJbmRleCA9IGx1bnIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZTpuby1pbnZhbGlkLXRoaXMgKi9cbiAgICAgICAgICAgIHRoaXMucmVmKCd1cmwnKTtcbiAgICAgICAgICAgIHRoaXMuZmllbGQoJ3RpdGxlJyk7XG4gICAgICAgICAgICB0aGlzLmZpZWxkKCdib2R5Jyk7XG5cbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGF0LnNlYXJjaERvY3VtZW50cy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkKHRoYXQuc2VhcmNoRG9jdW1lbnRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbGVFbmdpbmUuZ2V0KF9fZGlybmFtZSArICcvLi4vc3JjL3RlbXBsYXRlcy9wYXJ0aWFscy9zZWFyY2gtaW5kZXguaGJzJykudGhlbihcbiAgICAgICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0ZW1wbGF0ZTogYW55ID0gSGFuZGxlYmFycy5jb21waWxlKGRhdGEpO1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0ZW1wbGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBKU09OLnN0cmluZ2lmeShzZWFyY2hJbmRleCksXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlOiBKU09OLnN0cmluZ2lmeSh0aGlzLmRvY3VtZW50c1N0b3JlKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxldCB0ZXN0T3V0cHV0RGlyID0gb3V0cHV0Rm9sZGVyLm1hdGNoKHByb2Nlc3MuY3dkKCkpO1xuICAgICAgICAgICAgICAgIGlmICh0ZXN0T3V0cHV0RGlyICYmIHRlc3RPdXRwdXREaXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb2xkZXIgPSBvdXRwdXRGb2xkZXIucmVwbGFjZShwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAsICcnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlRW5naW5lXG4gICAgICAgICAgICAgICAgICAgIC53cml0ZShvdXRwdXRGb2xkZXIgKyBwYXRoLnNlcCArICcvanMvc2VhcmNoL3NlYXJjaF9pbmRleC5qcycsIHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGR1cmluZyBzZWFyY2ggaW5kZXggZmlsZSBnZW5lcmF0aW9uICcsIGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyID0+IFByb21pc2UucmVqZWN0KCdFcnJvciBkdXJpbmcgc2VhcmNoIGluZGV4IGdlbmVyYXRpb24nKVxuICAgICAgICApO1xuICAgIH1cbn1cbiIsImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBEZXBlbmRlbmNpZXNFbmdpbmUgfSBmcm9tICcuL2RlcGVuZGVuY2llcy5lbmdpbmUnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRmlsZUVuZ2luZSB9IGZyb20gJy4vZmlsZS5lbmdpbmUnO1xuXG5pbXBvcnQgeyBFeHBvcnREYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9leHBvcnQtZGF0YS5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyBBbmd1bGFyTmdNb2R1bGVOb2RlIH0gZnJvbSAnLi4vbm9kZXMvYW5ndWxhci1uZ21vZHVsZS1ub2RlJztcblxuY29uc3QgdHJhdmVyc2UgPSByZXF1aXJlKCd0cmF2ZXJzZScpO1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0SnNvbkVuZ2luZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbkludGVyZmFjZSxcbiAgICAgICAgcHJpdmF0ZSBkZXBlbmRlbmNpZXNFbmdpbmU6IERlcGVuZGVuY2llc0VuZ2luZSxcbiAgICAgICAgcHJpdmF0ZSBmaWxlRW5naW5lOiBGaWxlRW5naW5lID0gbmV3IEZpbGVFbmdpbmUoKVxuICAgICkge31cblxuICAgIGV4cG9ydChvdXRwdXRGb2xkZXIsIGRhdGEpIHtcbiAgICAgICAgbGV0IGV4cG9ydERhdGE6IEV4cG9ydERhdGEgPSB7fTtcblxuICAgICAgICB0cmF2ZXJzZShkYXRhKS5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50KSBkZWxldGUgbm9kZS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIpIGRlbGV0ZSBub2RlLmluaXRpYWxpemVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBleHBvcnREYXRhLnBpcGVzID0gZGF0YS5waXBlcztcbiAgICAgICAgZXhwb3J0RGF0YS5pbnRlcmZhY2VzID0gZGF0YS5pbnRlcmZhY2VzO1xuICAgICAgICBleHBvcnREYXRhLmluamVjdGFibGVzID0gZGF0YS5pbmplY3RhYmxlcztcbiAgICAgICAgZXhwb3J0RGF0YS5jbGFzc2VzID0gZGF0YS5jbGFzc2VzO1xuICAgICAgICBleHBvcnREYXRhLmRpcmVjdGl2ZXMgPSBkYXRhLmRpcmVjdGl2ZXM7XG4gICAgICAgIGV4cG9ydERhdGEuY29tcG9uZW50cyA9IGRhdGEuY29tcG9uZW50cztcbiAgICAgICAgZXhwb3J0RGF0YS5tb2R1bGVzID0gdGhpcy5wcm9jZXNzTW9kdWxlcygpO1xuICAgICAgICBleHBvcnREYXRhLm1pc2NlbGxhbmVvdXMgPSBkYXRhLm1pc2NlbGxhbmVvdXM7XG4gICAgICAgIGV4cG9ydERhdGEucm91dGVzID0gZGF0YS5yb3V0ZXM7XG4gICAgICAgIGV4cG9ydERhdGEuY292ZXJhZ2UgPSBkYXRhLmNvdmVyYWdlRGF0YTtcblxuICAgICAgICByZXR1cm4gdGhpcy5maWxlRW5naW5lXG4gICAgICAgICAgICAud3JpdGUoXG4gICAgICAgICAgICAgICAgb3V0cHV0Rm9sZGVyICsgcGF0aC5zZXAgKyAnL2RvY3VtZW50YXRpb24uanNvbicsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZXhwb3J0RGF0YSwgbnVsbCwgNClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgZHVyaW5nIGV4cG9ydCBmaWxlIGdlbmVyYXRpb24gJywgZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb2Nlc3NNb2R1bGVzKCkge1xuICAgICAgICBjb25zdCBtb2R1bGVzOiBBbmd1bGFyTmdNb2R1bGVOb2RlW10gPSB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5nZXRNb2R1bGVzKCk7XG5cbiAgICAgICAgbGV0IF9yZXN1bHRlZE1vZHVsZXMgPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBtb2R1bGVOciA9IDA7IG1vZHVsZU5yIDwgbW9kdWxlcy5sZW5ndGg7IG1vZHVsZU5yKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZUVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogbW9kdWxlc1ttb2R1bGVOcl0ubmFtZSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncHJvdmlkZXJzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVjbGFyYXRpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW1wb3J0cycsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50czogW11cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2V4cG9ydHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdib290c3RyYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjbGFzc2VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtb2R1bGVzW21vZHVsZU5yXS5wcm92aWRlcnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm92aWRlckVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZXNbbW9kdWxlTnJdLnByb3ZpZGVyc1trXS5uYW1lXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtb2R1bGVFbGVtZW50LmNoaWxkcmVuWzBdLmVsZW1lbnRzLnB1c2gocHJvdmlkZXJFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbW9kdWxlc1ttb2R1bGVOcl0uZGVjbGFyYXRpb25zLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVjbGFyYXRpb25FbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBtb2R1bGVzW21vZHVsZU5yXS5kZWNsYXJhdGlvbnNba10ubmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5jaGlsZHJlblsxXS5lbGVtZW50cy5wdXNoKGRlY2xhcmF0aW9uRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1vZHVsZXNbbW9kdWxlTnJdLmltcG9ydHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbXBvcnRFbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBtb2R1bGVzW21vZHVsZU5yXS5pbXBvcnRzW2tdLm5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1vZHVsZUVsZW1lbnQuY2hpbGRyZW5bMl0uZWxlbWVudHMucHVzaChpbXBvcnRFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbW9kdWxlc1ttb2R1bGVOcl0uZXhwb3J0cy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cG9ydEVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZXNbbW9kdWxlTnJdLmV4cG9ydHNba10ubmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5jaGlsZHJlblszXS5lbGVtZW50cy5wdXNoKGV4cG9ydEVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtb2R1bGVzW21vZHVsZU5yXS5ib290c3RyYXAubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBib290c3RyYXBFbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBtb2R1bGVzW21vZHVsZU5yXS5ib290c3RyYXBba10ubmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5jaGlsZHJlbls0XS5lbGVtZW50cy5wdXNoKGJvb3RzdHJhcEVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfcmVzdWx0ZWRNb2R1bGVzLnB1c2gobW9kdWxlRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX3Jlc3VsdGVkTW9kdWxlcztcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBEZXBlbmRlbmNpZXNFbmdpbmUgfSBmcm9tICcuL2RlcGVuZGVuY2llcy5lbmdpbmUnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRmlsZUVuZ2luZSB9IGZyb20gJy4vZmlsZS5lbmdpbmUnO1xuXG5pbXBvcnQgeyBFeHBvcnRKc29uRW5naW5lIH0gZnJvbSAnLi9leHBvcnQtanNvbi5lbmdpbmUnO1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0RW5naW5lIHtcbiAgICBwcml2YXRlIF9lbmdpbmU7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uSW50ZXJmYWNlLFxuICAgICAgICBwcml2YXRlIGRlcGVuZGVuY2llc0VuZ2luZTogRGVwZW5kZW5jaWVzRW5naW5lLFxuICAgICAgICBwcml2YXRlIGZpbGVFbmdpbmU6IEZpbGVFbmdpbmUgPSBuZXcgRmlsZUVuZ2luZSgpXG4gICAgKSB7fVxuXG4gICAgZXhwb3J0KG91dHB1dEZvbGRlciwgZGF0YSkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICAgICAgICAgIHRoaXMuX2VuZ2luZSA9IG5ldyBFeHBvcnRKc29uRW5naW5lKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVFbmdpbmVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmdpbmUuZXhwb3J0KG91dHB1dEZvbGRlciwgZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgRmlsZUVuZ2luZSB9IGZyb20gJy4vZmlsZS5lbmdpbmUnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vbG9nZ2VyJztcblxuY29uc3QgJDogYW55ID0gcmVxdWlyZSgnY2hlZXJpbycpO1xuXG5jbGFzcyBDb21wb25lbnRzVHJlZUVuZ2luZSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBDb21wb25lbnRzVHJlZUVuZ2luZSA9IG5ldyBDb21wb25lbnRzVHJlZUVuZ2luZSgpO1xuICAgIHByaXZhdGUgY29tcG9uZW50czogYW55W10gPSBbXTtcbiAgICBwcml2YXRlIGNvbXBvbmVudHNGb3JUcmVlOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZmlsZUVuZ2luZTogRmlsZUVuZ2luZSA9IG5ldyBGaWxlRW5naW5lKCkpIHtcbiAgICAgICAgaWYgKENvbXBvbmVudHNUcmVlRW5naW5lLl9pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvcjogSW5zdGFudGlhdGlvbiBmYWlsZWQ6IFVzZSBDb21wb25lbnRzVHJlZUVuZ2luZS5nZXRJbnN0YW5jZSgpIGluc3RlYWQgb2YgbmV3LicpO1xuICAgICAgICB9XG4gICAgICAgIENvbXBvbmVudHNUcmVlRW5naW5lLl9pbnN0YW5jZSA9IHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBDb21wb25lbnRzVHJlZUVuZ2luZSB7XG4gICAgICAgIHJldHVybiBDb21wb25lbnRzVHJlZUVuZ2luZS5faW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZENvbXBvbmVudChjb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRUZW1wbGF0ZXMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5jb21wb25lbnRzRm9yVHJlZS5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8PSBsZW4gLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudHNGb3JUcmVlW2ldLnRlbXBsYXRlVXJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZVBhdGggPSBwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyBwYXRoLmRpcm5hbWUodGhpcy5jb21wb25lbnRzRm9yVHJlZVtpXS5maWxlKSArIHBhdGguc2VwICsgdGhpcy5jb21wb25lbnRzRm9yVHJlZVtpXS50ZW1wbGF0ZVVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZUVuZ2luZS5nZXQoZmlsZVBhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHRlbXBsYXRlRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNGb3JUcmVlW2ldLnRlbXBsYXRlRGF0YSA9IHRlbXBsYXRlRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0ZvclRyZWVbaV0udGVtcGxhdGVEYXRhID0gdGhpcy5jb21wb25lbnRzRm9yVHJlZVtpXS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRDaGlsZHJlbkFuZFBhcmVudHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBfLmZvckVhY2godGhpcy5jb21wb25lbnRzRm9yVHJlZSwgKGNvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCAkY29tcG9uZW50ID0gJChjb21wb25lbnQudGVtcGxhdGVEYXRhKTtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2godGhpcy5jb21wb25lbnRzRm9yVHJlZSwgKGNvbXBvbmVudFRvRmluZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoJGNvbXBvbmVudC5maW5kKGNvbXBvbmVudFRvRmluZC5zZWxlY3RvcikubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY29tcG9uZW50VG9GaW5kLm5hbWUgKyAnIGZvdW5kIGluICcgKyBjb21wb25lbnQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuY2hpbGRyZW4ucHVzaChjb21wb25lbnRUb0ZpbmQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVRyZWVzRm9yQ29tcG9uZW50cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLmNvbXBvbmVudHMsIChjb21wb25lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgX2NvbXBvbmVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZpbGU6IGNvbXBvbmVudC5maWxlLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogY29tcG9uZW50LnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC50ZW1wbGF0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudC50ZW1wbGF0ZSA9IGNvbXBvbmVudC50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC50ZW1wbGF0ZVVybC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQudGVtcGxhdGVVcmwgPSBjb21wb25lbnQudGVtcGxhdGVVcmxbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0ZvclRyZWUucHVzaChfY29tcG9uZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZWFkVGVtcGxhdGVzKClcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZENoaWxkcmVuQW5kUGFyZW50cygpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuY29tcG9uZW50c0ZvclRyZWU6ICcsIHRoaXMuY29tcG9uZW50c0ZvclRyZWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCAkY29tcG9uZW50c1RyZWVFbmdpbmUgPSBDb21wb25lbnRzVHJlZUVuZ2luZS5nZXRJbnN0YW5jZSgpO1xuIiwiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICd1dGlsJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IHRzLCBTeW50YXhLaW5kIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5cbmltcG9ydCB7IGdldE5hbWVzQ29tcGFyZUZuLCBtZXJnZVRhZ3NBbmRBcmdzLCBtYXJrZWR0YWdzIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHsga2luZFRvVHlwZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWxzL2tpbmQtdG8tdHlwZSc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vaW50ZXJmYWNlcy9jb25maWd1cmF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBKc2RvY1BhcnNlclV0aWwgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscy9qc2RvYy1wYXJzZXIudXRpbCc7XG5pbXBvcnQgeyBJbXBvcnRzVXRpbCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWxzL2ltcG9ydHMudXRpbCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9sb2dnZXInO1xuaW1wb3J0IHsgaXNJZ25vcmUgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscyc7XG5cbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuY29uc3QgbWFya2VkID0gcmVxdWlyZSgnbWFya2VkJyk7XG5cbmV4cG9ydCBjbGFzcyBDbGFzc0hlbHBlciB7XG4gICAgcHJpdmF0ZSBqc2RvY1BhcnNlclV0aWwgPSBuZXcgSnNkb2NQYXJzZXJVdGlsKCk7XG4gICAgcHJpdmF0ZSBpbXBvcnRzVXRpbCA9IG5ldyBJbXBvcnRzVXRpbCgpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLFxuICAgICAgICBwcml2YXRlIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb25JbnRlcmZhY2VcbiAgICApIHt9XG5cbiAgICAvKipcbiAgICAgKiBIRUxQRVJTXG4gICAgICovXG5cbiAgICBwdWJsaWMgc3RyaW5naWZ5RGVmYXVsdFZhbHVlKG5vZGU6IHRzLk5vZGUpOiBzdHJpbmcge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBpZiAobm9kZS5nZXRUZXh0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlLmdldFRleHQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT09IFN5bnRheEtpbmQuRmFsc2VLZXl3b3JkKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ZhbHNlJztcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT09IFN5bnRheEtpbmQuVHJ1ZUtleXdvcmQpIHtcbiAgICAgICAgICAgIHJldHVybiAndHJ1ZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERlY29yYXRvck9mVHlwZShub2RlLCBkZWNvcmF0b3JUeXBlKSB7XG4gICAgICAgIGxldCBkZWNvcmF0b3JzID0gbm9kZS5kZWNvcmF0b3JzIHx8IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVjb3JhdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGRlY29yYXRvcnNbaV0uZXhwcmVzc2lvbi5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlY29yYXRvcnNbaV0uZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHQgPT09IGRlY29yYXRvclR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29yYXRvcnNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZvcm1hdERlY29yYXRvcnMoZGVjb3JhdG9ycykge1xuICAgICAgICBsZXQgX2RlY29yYXRvcnMgPSBbXTtcblxuICAgICAgICBfLmZvckVhY2goZGVjb3JhdG9ycywgKGRlY29yYXRvcjogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBfZGVjb3JhdG9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGRlY29yYXRvci5leHByZXNzaW9uLnRleHRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmZvOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHRcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb24uYXJndW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYXJncyA9IGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb24uYXJndW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF9kZWNvcmF0b3JzLnB1c2goaW5mbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gX2RlY29yYXRvcnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQb3NpdGlvbihub2RlOiB0cy5Ob2RlLCBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKTogdHMuTGluZUFuZENoYXJhY3RlciB7XG4gICAgICAgIGxldCBwb3NpdGlvbjogdHMuTGluZUFuZENoYXJhY3RlcjtcbiAgICAgICAgaWYgKG5vZGUubmFtZSAmJiBub2RlLm5hbWUuZW5kKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IHRzLmdldExpbmVBbmRDaGFyYWN0ZXJPZlBvc2l0aW9uKHNvdXJjZUZpbGUsIG5vZGUubmFtZS5lbmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9zaXRpb24gPSB0cy5nZXRMaW5lQW5kQ2hhcmFjdGVyT2ZQb3NpdGlvbihzb3VyY2VGaWxlLCBub2RlLnBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkQWNjZXNzb3IoYWNjZXNzb3JzLCBub2RlQWNjZXNzb3IsIHNvdXJjZUZpbGUpIHtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gJyc7XG4gICAgICAgIGlmIChub2RlQWNjZXNzb3IubmFtZSkge1xuICAgICAgICAgICAgbm9kZU5hbWUgPSBub2RlQWNjZXNzb3IubmFtZS50ZXh0O1xuICAgICAgICAgICAgbGV0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhub2RlQWNjZXNzb3IpO1xuXG4gICAgICAgICAgICBpZiAoIWFjY2Vzc29yc1tub2RlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICBhY2Nlc3NvcnNbbm9kZU5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBub2RlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGdldFNpZ25hdHVyZTogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5vZGVBY2Nlc3Nvci5raW5kID09PSBTeW50YXhLaW5kLlNldEFjY2Vzc29yKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNldFNpZ25hdHVyZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbm9kZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2b2lkJyxcbiAgICAgICAgICAgICAgICAgICAgYXJnczogbm9kZUFjY2Vzc29yLnBhcmFtZXRlcnMubWFwKHBhcmFtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcGFyYW0ubmFtZS50ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHBhcmFtLnR5cGUgPyBraW5kVG9UeXBlKHBhcmFtLnR5cGUua2luZCkgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGU6IG5vZGVBY2Nlc3Nvci50eXBlID8gdGhpcy52aXNpdFR5cGUobm9kZUFjY2Vzc29yLnR5cGUpIDogJ3ZvaWQnLFxuICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmdldFBvc2l0aW9uKG5vZGVBY2Nlc3Nvciwgc291cmNlRmlsZSkubGluZSArIDFcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGVBY2Nlc3Nvci5qc0RvYyAmJiBub2RlQWNjZXNzb3IuanNEb2MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbW1lbnQgPSBub2RlQWNjZXNzb3IuanNEb2NbMF0uY29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21tZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlLmRlc2NyaXB0aW9uID0gbWFya2VkKGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGpzZG9jdGFncyAmJiBqc2RvY3RhZ3MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmUuanNkb2N0YWdzID0gbWFya2VkdGFncyhqc2RvY3RhZ3NbMF0udGFncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNldFNpZ25hdHVyZS5qc2RvY3RhZ3MgJiYgc2V0U2lnbmF0dXJlLmpzZG9jdGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZS5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlLmFyZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmUuanNkb2N0YWdzXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZXRTaWduYXR1cmUuYXJncyAmJiBzZXRTaWduYXR1cmUuYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZS5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKHNldFNpZ25hdHVyZS5hcmdzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhY2Nlc3NvcnNbbm9kZU5hbWVdLnNldFNpZ25hdHVyZSA9IHNldFNpZ25hdHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlQWNjZXNzb3Iua2luZCA9PT0gU3ludGF4S2luZC5HZXRBY2Nlc3Nvcikge1xuICAgICAgICAgICAgICAgIGxldCBnZXRTaWduYXR1cmUgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG5vZGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBub2RlQWNjZXNzb3IudHlwZSA/IGtpbmRUb1R5cGUobm9kZUFjY2Vzc29yLnR5cGUua2luZCkgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZTogbm9kZUFjY2Vzc29yLnR5cGUgPyB0aGlzLnZpc2l0VHlwZShub2RlQWNjZXNzb3IudHlwZSkgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5nZXRQb3NpdGlvbihub2RlQWNjZXNzb3IsIHNvdXJjZUZpbGUpLmxpbmUgKyAxXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlQWNjZXNzb3IuanNEb2MgJiYgbm9kZUFjY2Vzc29yLmpzRG9jLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21tZW50ID0gbm9kZUFjY2Vzc29yLmpzRG9jWzBdLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFNpZ25hdHVyZS5kZXNjcmlwdGlvbiA9IG1hcmtlZChjb21tZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY3RhZ3NbMF0udGFncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2lnbmF0dXJlLmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2N0YWdzWzBdLnRhZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYWNjZXNzb3JzW25vZGVOYW1lXS5nZXRTaWduYXR1cmUgPSBnZXRTaWduYXR1cmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRGlyZWN0aXZlRGVjb3JhdG9yKGRlY29yYXRvcjogdHMuRGVjb3JhdG9yKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICBsZXQgZGVjb3JhdG9ySWRlbnRpZmllclRleHQgPSBkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHQ7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIGRlY29yYXRvcklkZW50aWZpZXJUZXh0ID09PSAnRGlyZWN0aXZlJyB8fCBkZWNvcmF0b3JJZGVudGlmaWVyVGV4dCA9PT0gJ0NvbXBvbmVudCdcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzU2VydmljZURlY29yYXRvcihkZWNvcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb25cbiAgICAgICAgICAgID8gZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbi50ZXh0ID09PSAnSW5qZWN0YWJsZSdcbiAgICAgICAgICAgIDogZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1ByaXZhdGUobWVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb3B5cmlnaHQgaHR0cHM6Ly9naXRodWIuY29tL25nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcbiAgICAgICAgICovXG4gICAgICAgIGlmIChtZW1iZXIubW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBpc1ByaXZhdGU6IGJvb2xlYW4gPSBtZW1iZXIubW9kaWZpZXJzLnNvbWUoXG4gICAgICAgICAgICAgICAgbW9kaWZpZXIgPT4gbW9kaWZpZXIua2luZCA9PT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChpc1ByaXZhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pc0hpZGRlbk1lbWJlcihtZW1iZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNQcm90ZWN0ZWQobWVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChtZW1iZXIubW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBpc1Byb3RlY3RlZDogYm9vbGVhbiA9IG1lbWJlci5tb2RpZmllcnMuc29tZShcbiAgICAgICAgICAgICAgICBtb2RpZmllciA9PiBtb2RpZmllci5raW5kID09PSBTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoaXNQcm90ZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pc0hpZGRlbk1lbWJlcihtZW1iZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNJbnRlcm5hbChtZW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgaW50ZXJuYWxUYWdzOiBzdHJpbmdbXSA9IFsnaW50ZXJuYWwnXTtcbiAgICAgICAgaWYgKG1lbWJlci5qc0RvYykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkb2Mgb2YgbWVtYmVyLmpzRG9jKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRvYy50YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIGRvYy50YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxUYWdzLmluZGV4T2YodGFnLnRhZ05hbWUudGV4dCkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUHVibGljKG1lbWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAobWVtYmVyLm1vZGlmaWVycykge1xuICAgICAgICAgICAgY29uc3QgaXNQdWJsaWM6IGJvb2xlYW4gPSBtZW1iZXIubW9kaWZpZXJzLnNvbWUoXG4gICAgICAgICAgICAgICAgbW9kaWZpZXIgPT4gbW9kaWZpZXIua2luZCA9PT0gU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGlzUHVibGljKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNIaWRkZW5NZW1iZXIobWVtYmVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSGlkZGVuTWVtYmVyKG1lbWJlcik6IGJvb2xlYW4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBpbnRlcm5hbFRhZ3M6IHN0cmluZ1tdID0gWydoaWRkZW4nXTtcbiAgICAgICAgaWYgKG1lbWJlci5qc0RvYykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkb2Mgb2YgbWVtYmVyLmpzRG9jKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRvYy50YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIGRvYy50YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxUYWdzLmluZGV4T2YodGFnLnRhZ05hbWUudGV4dCkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUGlwZURlY29yYXRvcihkZWNvcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb25cbiAgICAgICAgICAgID8gZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbi50ZXh0ID09PSAnUGlwZSdcbiAgICAgICAgICAgIDogZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc01vZHVsZURlY29yYXRvcihkZWNvcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb25cbiAgICAgICAgICAgID8gZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbi50ZXh0ID09PSAnTmdNb2R1bGUnXG4gICAgICAgICAgICA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZJU0lURVJTXG4gICAgICovXG5cbiAgICBwdWJsaWMgdmlzaXRDbGFzc0RlY2xhcmF0aW9uKFxuICAgICAgICBmaWxlTmFtZTogc3RyaW5nLFxuICAgICAgICBjbGFzc0RlY2xhcmF0aW9uOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuSW50ZXJmYWNlRGVjbGFyYXRpb24sXG4gICAgICAgIHNvdXJjZUZpbGU/OiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogYW55IHtcbiAgICAgICAgbGV0IHN5bWJvbCA9IHRoaXMudHlwZUNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihjbGFzc0RlY2xhcmF0aW9uLm5hbWUpO1xuICAgICAgICBsZXQgZGVzY3JpcHRpb24gPSAnJztcbiAgICAgICAgaWYgKHN5bWJvbCkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBtYXJrZWQodGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0TWFpbkNvbW1lbnRPZk5vZGUoY2xhc3NEZWNsYXJhdGlvbikpO1xuICAgICAgICAgICAgaWYgKHN5bWJvbC52YWx1ZURlY2xhcmF0aW9uICYmIGlzSWdub3JlKHN5bWJvbC52YWx1ZURlY2xhcmF0aW9uKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzeW1ib2wuZGVjbGFyYXRpb25zICYmIHN5bWJvbC5kZWNsYXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmIChpc0lnbm9yZShzeW1ib2wuZGVjbGFyYXRpb25zWzBdKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgY2xhc3NOYW1lID0gY2xhc3NEZWNsYXJhdGlvbi5uYW1lLnRleHQ7XG4gICAgICAgIGxldCBtZW1iZXJzO1xuICAgICAgICBsZXQgaW1wbGVtZW50c0VsZW1lbnRzID0gW107XG4gICAgICAgIGxldCBleHRlbmRzRWxlbWVudDtcbiAgICAgICAgbGV0IGpzZG9jdGFncyA9IFtdO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdHMuZ2V0Q2xhc3NJbXBsZW1lbnRzSGVyaXRhZ2VDbGF1c2VFbGVtZW50cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGxldCBpbXBsZW1lbnRlZFR5cGVzID0gdHMuZ2V0Q2xhc3NJbXBsZW1lbnRzSGVyaXRhZ2VDbGF1c2VFbGVtZW50cyhjbGFzc0RlY2xhcmF0aW9uKTtcbiAgICAgICAgICAgIGlmIChpbXBsZW1lbnRlZFR5cGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBsZW4gPSBpbXBsZW1lbnRlZFR5cGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wbGVtZW50ZWRUeXBlc1tpXS5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzRWxlbWVudHMucHVzaChpbXBsZW1lbnRlZFR5cGVzW2ldLmV4cHJlc3Npb24udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRzLmdldENsYXNzRXh0ZW5kc0hlcml0YWdlQ2xhdXNlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGxldCBleHRlbmRzVHlwZXMgPSB0cy5nZXRDbGFzc0V4dGVuZHNIZXJpdGFnZUNsYXVzZUVsZW1lbnQoY2xhc3NEZWNsYXJhdGlvbik7XG4gICAgICAgICAgICBpZiAoZXh0ZW5kc1R5cGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4dGVuZHNUeXBlcy5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZHNFbGVtZW50ID0gZXh0ZW5kc1R5cGVzLmV4cHJlc3Npb24udGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3ltYm9sKSB7XG4gICAgICAgICAgICBpZiAoc3ltYm9sLnZhbHVlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3Moc3ltYm9sLnZhbHVlRGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbWVtYmVycyA9IHRoaXMudmlzaXRNZW1iZXJzKGNsYXNzRGVjbGFyYXRpb24ubWVtYmVycywgc291cmNlRmlsZSk7XG5cbiAgICAgICAgaWYgKGNsYXNzRGVjbGFyYXRpb24uZGVjb3JhdG9ycykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc0RlY2xhcmF0aW9uLmRlY29yYXRvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0RpcmVjdGl2ZURlY29yYXRvcihjbGFzc0RlY2xhcmF0aW9uLmRlY29yYXRvcnNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0czogbWVtYmVycy5pbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBtZW1iZXJzLm91dHB1dHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBob3N0QmluZGluZ3M6IG1lbWJlcnMuaG9zdEJpbmRpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgaG9zdExpc3RlbmVyczogbWVtYmVycy5ob3N0TGlzdGVuZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogbWVtYmVycy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kczogbWVtYmVycy5tZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhTaWduYXR1cmVzOiBtZW1iZXJzLmluZGV4U2lnbmF0dXJlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6IG1lbWJlcnMua2luZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBtZW1iZXJzLmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAganNkb2N0YWdzOiBqc2RvY3RhZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRzOiBleHRlbmRzRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNFbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc29yczogbWVtYmVycy5hY2Nlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNTZXJ2aWNlRGVjb3JhdG9yKGNsYXNzRGVjbGFyYXRpb24uZGVjb3JhdG9yc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kczogbWVtYmVycy5tZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4U2lnbmF0dXJlczogbWVtYmVycy5pbmRleFNpZ25hdHVyZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogbWVtYmVycy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6IG1lbWJlcnMua2luZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogbWVtYmVycy5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc2RvY3RhZ3M6IGpzZG9jdGFncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRzOiBleHRlbmRzRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzOiBpbXBsZW1lbnRzRWxlbWVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzb3JzOiBtZW1iZXJzLmFjY2Vzc29yc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1BpcGVEZWNvcmF0b3IoY2xhc3NEZWNsYXJhdGlvbi5kZWNvcmF0b3JzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc2RvY3RhZ3M6IGpzZG9jdGFncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBtZW1iZXJzLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kczogbWVtYmVycy5tZXRob2RzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTW9kdWxlRGVjb3JhdG9yKGNsYXNzRGVjbGFyYXRpb24uZGVjb3JhdG9yc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganNkb2N0YWdzOiBqc2RvY3RhZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IG1lbWJlcnMubWV0aG9kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFNpZ25hdHVyZXM6IG1lbWJlcnMuaW5kZXhTaWduYXR1cmVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IG1lbWJlcnMucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kOiBtZW1iZXJzLmtpbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IG1lbWJlcnMuY29uc3RydWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganNkb2N0YWdzOiBqc2RvY3RhZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kczogZXh0ZW5kc0VsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50czogaW1wbGVtZW50c0VsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc29yczogbWVtYmVycy5hY2Nlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBtZW1iZXJzLmlucHV0cyxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogbWVtYmVycy5vdXRwdXRzLFxuICAgICAgICAgICAgICAgICAgICBob3N0QmluZGluZ3M6IG1lbWJlcnMuaG9zdEJpbmRpbmdzLFxuICAgICAgICAgICAgICAgICAgICBob3N0TGlzdGVuZXJzOiBtZW1iZXJzLmhvc3RMaXN0ZW5lcnMsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IG1lbWJlcnMubWV0aG9kcyxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhTaWduYXR1cmVzOiBtZW1iZXJzLmluZGV4U2lnbmF0dXJlcyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogbWVtYmVycy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICBraW5kOiBtZW1iZXJzLmtpbmQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBtZW1iZXJzLmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBqc2RvY3RhZ3M6IGpzZG9jdGFncyxcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kczogZXh0ZW5kc0VsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNFbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzb3JzOiBtZW1iZXJzLmFjY2Vzc29yc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kczogbWVtYmVycy5tZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IG1lbWJlcnMuaW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBtZW1iZXJzLm91dHB1dHMsXG4gICAgICAgICAgICAgICAgICAgIGhvc3RCaW5kaW5nczogbWVtYmVycy5ob3N0QmluZGluZ3MsXG4gICAgICAgICAgICAgICAgICAgIGhvc3RMaXN0ZW5lcnM6IG1lbWJlcnMuaG9zdExpc3RlbmVycyxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhTaWduYXR1cmVzOiBtZW1iZXJzLmluZGV4U2lnbmF0dXJlcyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogbWVtYmVycy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICBraW5kOiBtZW1iZXJzLmtpbmQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBtZW1iZXJzLmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBqc2RvY3RhZ3M6IGpzZG9jdGFncyxcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kczogZXh0ZW5kc0VsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNFbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzb3JzOiBtZW1iZXJzLmFjY2Vzc29yc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdE1lbWJlcnMobWVtYmVycywgc291cmNlRmlsZSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBsZXQgaW5wdXRzID0gW107XG4gICAgICAgIGxldCBvdXRwdXRzID0gW107XG4gICAgICAgIGxldCBob3N0QmluZGluZ3MgPSBbXTtcbiAgICAgICAgbGV0IGhvc3RMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgbGV0IG1ldGhvZHMgPSBbXTtcbiAgICAgICAgbGV0IHByb3BlcnRpZXMgPSBbXTtcbiAgICAgICAgbGV0IGluZGV4U2lnbmF0dXJlcyA9IFtdO1xuICAgICAgICBsZXQga2luZDtcbiAgICAgICAgbGV0IGlucHV0RGVjb3JhdG9yO1xuICAgICAgICBsZXQgaG9zdEJpbmRpbmc7XG4gICAgICAgIGxldCBob3N0TGlzdGVuZXI7XG4gICAgICAgIGxldCBjb25zdHJ1Y3RvcjtcbiAgICAgICAgbGV0IG91dERlY29yYXRvcjtcbiAgICAgICAgbGV0IGFjY2Vzc29ycyA9IHt9O1xuICAgICAgICBsZXQgcmVzdWx0ID0ge307XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBBbGxvd3MgdHlwZXNjcmlwdCBndWVzcyB0eXBlIHdoZW4gdXNpbmcgdHMuaXMqXG4gICAgICAgICAgICBsZXQgbWVtYmVyID0gbWVtYmVyc1tpXTtcblxuICAgICAgICAgICAgaW5wdXREZWNvcmF0b3IgPSB0aGlzLmdldERlY29yYXRvck9mVHlwZShtZW1iZXIsICdJbnB1dCcpO1xuICAgICAgICAgICAgb3V0RGVjb3JhdG9yID0gdGhpcy5nZXREZWNvcmF0b3JPZlR5cGUobWVtYmVyLCAnT3V0cHV0Jyk7XG4gICAgICAgICAgICBob3N0QmluZGluZyA9IHRoaXMuZ2V0RGVjb3JhdG9yT2ZUeXBlKG1lbWJlciwgJ0hvc3RCaW5kaW5nJyk7XG4gICAgICAgICAgICBob3N0TGlzdGVuZXIgPSB0aGlzLmdldERlY29yYXRvck9mVHlwZShtZW1iZXIsICdIb3N0TGlzdGVuZXInKTtcblxuICAgICAgICAgICAga2luZCA9IG1lbWJlci5raW5kO1xuXG4gICAgICAgICAgICBpZiAoaXNJZ25vcmUobWVtYmVyKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaW5wdXREZWNvcmF0b3IpIHtcbiAgICAgICAgICAgICAgICBpbnB1dHMucHVzaCh0aGlzLnZpc2l0SW5wdXRBbmRIb3N0QmluZGluZyhtZW1iZXIsIGlucHV0RGVjb3JhdG9yLCBzb3VyY2VGaWxlKSk7XG4gICAgICAgICAgICAgICAgaWYgKHRzLmlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbihtZW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQWNjZXNzb3IoYWNjZXNzb3JzLCBtZW1iZXJzW2ldLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG91dERlY29yYXRvcikge1xuICAgICAgICAgICAgICAgIG91dHB1dHMucHVzaCh0aGlzLnZpc2l0T3V0cHV0KG1lbWJlciwgb3V0RGVjb3JhdG9yLCBzb3VyY2VGaWxlKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvc3RCaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgaG9zdEJpbmRpbmdzLnB1c2godGhpcy52aXNpdElucHV0QW5kSG9zdEJpbmRpbmcobWVtYmVyLCBob3N0QmluZGluZywgc291cmNlRmlsZSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3N0TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBob3N0TGlzdGVuZXJzLnB1c2godGhpcy52aXNpdEhvc3RMaXN0ZW5lcihtZW1iZXIsIGhvc3RMaXN0ZW5lciwgc291cmNlRmlsZSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pc0hpZGRlbk1lbWJlcihtZW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEodGhpcy5pc1ByaXZhdGUobWVtYmVyKSAmJiB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVByaXZhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuaXNJbnRlcm5hbChtZW1iZXIpICYmIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlSW50ZXJuYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1Byb3RlY3RlZChtZW1iZXIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUHJvdGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRzLmlzTWV0aG9kRGVjbGFyYXRpb24obWVtYmVyKSB8fCB0cy5pc01ldGhvZFNpZ25hdHVyZShtZW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMucHVzaCh0aGlzLnZpc2l0TWV0aG9kRGVjbGFyYXRpb24obWVtYmVyLCBzb3VyY2VGaWxlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMuaXNQcm9wZXJ0eURlY2xhcmF0aW9uKG1lbWJlcikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMuaXNQcm9wZXJ0eVNpZ25hdHVyZShtZW1iZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaCh0aGlzLnZpc2l0UHJvcGVydHkobWVtYmVyLCBzb3VyY2VGaWxlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0cy5pc0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvbihtZW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaCh0aGlzLnZpc2l0Q2FsbERlY2xhcmF0aW9uKG1lbWJlciwgc291cmNlRmlsZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLmlzR2V0QWNjZXNzb3JEZWNsYXJhdGlvbihtZW1iZXIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLmlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbihtZW1iZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQWNjZXNzb3IoYWNjZXNzb3JzLCBtZW1iZXJzW2ldLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRzLmlzSW5kZXhTaWduYXR1cmVEZWNsYXJhdGlvbihtZW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4U2lnbmF0dXJlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aXNpdEluZGV4RGVjbGFyYXRpb24obWVtYmVyLCBzb3VyY2VGaWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHMuaXNDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKG1lbWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IF9jb25zdHJ1Y3RvclByb3BlcnRpZXMgPSB0aGlzLnZpc2l0Q29uc3RydWN0b3JQcm9wZXJ0aWVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsZW4gPSBfY29uc3RydWN0b3JQcm9wZXJ0aWVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaChfY29uc3RydWN0b3JQcm9wZXJ0aWVzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciA9IHRoaXMudmlzaXRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKG1lbWJlciwgc291cmNlRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXRzLnNvcnQoZ2V0TmFtZXNDb21wYXJlRm4oKSk7XG4gICAgICAgIG91dHB1dHMuc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcbiAgICAgICAgaG9zdEJpbmRpbmdzLnNvcnQoZ2V0TmFtZXNDb21wYXJlRm4oKSk7XG4gICAgICAgIGhvc3RMaXN0ZW5lcnMuc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcbiAgICAgICAgcHJvcGVydGllcy5zb3J0KGdldE5hbWVzQ29tcGFyZUZuKCkpO1xuICAgICAgICBtZXRob2RzLnNvcnQoZ2V0TmFtZXNDb21wYXJlRm4oKSk7XG4gICAgICAgIGluZGV4U2lnbmF0dXJlcy5zb3J0KGdldE5hbWVzQ29tcGFyZUZuKCkpO1xuXG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICAgIG91dHB1dHMsXG4gICAgICAgICAgICBob3N0QmluZGluZ3MsXG4gICAgICAgICAgICBob3N0TGlzdGVuZXJzLFxuICAgICAgICAgICAgbWV0aG9kcyxcbiAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgICBpbmRleFNpZ25hdHVyZXMsXG4gICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgY29uc3RydWN0b3JcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoYWNjZXNzb3JzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlc3VsdFsnYWNjZXNzb3JzJ10gPSBhY2Nlc3NvcnM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRUeXBlTmFtZSh0eXBlTmFtZTogdHMuSWRlbnRpZmllcikge1xuICAgICAgICBpZiAodHlwZU5hbWUudGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVOYW1lLnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3RoaXMudmlzaXRUeXBlTmFtZSh0eXBlTmFtZS5sZWZ0KX0uJHt0aGlzLnZpc2l0VHlwZU5hbWUodHlwZU5hbWUucmlnaHQpfWA7XG4gICAgfVxuXG4gICAgcHVibGljIHZpc2l0VHlwZShub2RlKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IF9yZXR1cm4gPSAndm9pZCc7XG5cbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gX3JldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlLnR5cGVOYW1lKSB7XG4gICAgICAgICAgICBfcmV0dXJuID0gdGhpcy52aXNpdFR5cGVOYW1lKG5vZGUudHlwZU5hbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS5raW5kKSB7XG4gICAgICAgICAgICAgICAgX3JldHVybiA9IGtpbmRUb1R5cGUobm9kZS50eXBlLmtpbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgIF9yZXR1cm4gPSB0aGlzLnZpc2l0VHlwZU5hbWUobm9kZS50eXBlLnR5cGVOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUudHlwZUFyZ3VtZW50cykge1xuICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJzwnO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVBcmd1bWVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFyZ3VtZW50IG9mIG5vZGUudHlwZS50eXBlQXJndW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudHMucHVzaCh0aGlzLnZpc2l0VHlwZShhcmd1bWVudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfcmV0dXJuICs9IHR5cGVBcmd1bWVudHMuam9pbignIHwgJyk7XG4gICAgICAgICAgICAgICAgX3JldHVybiArPSAnPic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2ZpcnN0UGFydCA9IHRoaXMudmlzaXRUeXBlKG5vZGUudHlwZS5lbGVtZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgX3JldHVybiA9IF9maXJzdFBhcnQgKyBraW5kVG9UeXBlKG5vZGUudHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlLmVsZW1lbnRUeXBlLmtpbmQgPT09IFN5bnRheEtpbmQuUGFyZW50aGVzaXplZFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3JldHVybiA9ICcoJyArIF9maXJzdFBhcnQgKyAnKScgKyBraW5kVG9UeXBlKG5vZGUudHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlLnR5cGVzICYmIHRzLmlzVW5pb25UeXBlTm9kZShub2RlLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgX3JldHVybiA9ICcnO1xuICAgICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gbm9kZS50eXBlLnR5cGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IG5vZGUudHlwZS50eXBlc1tpXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5lbGVtZW50VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX2ZpcnN0UGFydCA9IHRoaXMudmlzaXRUeXBlKHR5cGUuZWxlbWVudFR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuZWxlbWVudFR5cGUua2luZCA9PT0gU3ludGF4S2luZC5QYXJlbnRoZXNpemVkVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJygnICsgX2ZpcnN0UGFydCArICcpJyArIGtpbmRUb1R5cGUodHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSBfZmlyc3RQYXJ0ICsga2luZFRvVHlwZSh0eXBlLmtpbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSBraW5kVG9UeXBlKHR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHMuaXNMaXRlcmFsVHlwZU5vZGUodHlwZSkgJiYgdHlwZS5saXRlcmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSAnXCInICsgdHlwZS5saXRlcmFsLnRleHQgKyAnXCInO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUudHlwZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9IHRoaXMudmlzaXRUeXBlTmFtZSh0eXBlLnR5cGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLnR5cGVBcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICc8JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlQXJndW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhcmd1bWVudCBvZiB0eXBlLnR5cGVBcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cy5wdXNoKHRoaXMudmlzaXRUeXBlKGFyZ3VtZW50KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gdHlwZUFyZ3VtZW50cy5qb2luKCcgfCAnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICc+JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJyB8ICc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlLmVsZW1lbnRUeXBlcykge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50VHlwZXMgPSBub2RlLnR5cGUuZWxlbWVudFR5cGVzO1xuICAgICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gZWxlbWVudFR5cGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBfcmV0dXJuID0gJ1snO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBlbGVtZW50VHlwZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9IGtpbmRUb1R5cGUodHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cy5pc0xpdGVyYWxUeXBlTm9kZSh0eXBlKSAmJiB0eXBlLmxpdGVyYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICdcIicgKyB0eXBlLmxpdGVyYWwudGV4dCArICdcIic7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gdGhpcy52aXNpdFR5cGVOYW1lKHR5cGUudHlwZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4gLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSAnLCAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJ10nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICBfcmV0dXJuID0ga2luZFRvVHlwZShub2RlLmVsZW1lbnRUeXBlLmtpbmQpICsga2luZFRvVHlwZShub2RlLmtpbmQpO1xuICAgICAgICAgICAgaWYgKG5vZGUuZWxlbWVudFR5cGUudHlwZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBfcmV0dXJuID0gdGhpcy52aXNpdFR5cGVOYW1lKG5vZGUuZWxlbWVudFR5cGUudHlwZU5hbWUpICsga2luZFRvVHlwZShub2RlLmtpbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG5vZGUudHlwZXMgJiYgdHMuaXNVbmlvblR5cGVOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgICBfcmV0dXJuID0gJyc7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gbm9kZS50eXBlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gbm9kZS50eXBlc1tpXTtcbiAgICAgICAgICAgICAgICBfcmV0dXJuICs9IGtpbmRUb1R5cGUodHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICBpZiAodHMuaXNMaXRlcmFsVHlwZU5vZGUodHlwZSkgJiYgdHlwZS5saXRlcmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJ1wiJyArIHR5cGUubGl0ZXJhbC50ZXh0ICsgJ1wiJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUudHlwZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSB0aGlzLnZpc2l0VHlwZU5hbWUodHlwZS50eXBlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICcgfCAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlLmRvdERvdERvdFRva2VuKSB7XG4gICAgICAgICAgICBfcmV0dXJuID0gJ2FueVtdJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9yZXR1cm4gPSBraW5kVG9UeXBlKG5vZGUua2luZCk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgX3JldHVybiA9PT0gJycgJiZcbiAgICAgICAgICAgICAgICBub2RlLmluaXRpYWxpemVyICYmXG4gICAgICAgICAgICAgICAgbm9kZS5pbml0aWFsaXplci5raW5kICYmXG4gICAgICAgICAgICAgICAgKG5vZGUua2luZCA9PT0gU3ludGF4S2luZC5Qcm9wZXJ0eURlY2xhcmF0aW9uIHx8IG5vZGUua2luZCA9PT0gU3ludGF4S2luZC5QYXJhbWV0ZXIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBfcmV0dXJuID0ga2luZFRvVHlwZShub2RlLmluaXRpYWxpemVyLmtpbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUua2luZCA9PT0gU3ludGF4S2luZC5UeXBlUGFyYW1ldGVyKSB7XG4gICAgICAgICAgICAgICAgX3JldHVybiA9IG5vZGUubmFtZS50ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMgJiYgbm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF9yZXR1cm4gKz0gJzwnO1xuICAgICAgICAgICAgbGV0IGkgPSAwLFxuICAgICAgICAgICAgICAgIGxlbiA9IG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhcmd1bWVudCA9IG5vZGUudHlwZUFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgICAgICBfcmV0dXJuICs9IHRoaXMudmlzaXRUeXBlKGFyZ3VtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoaSA+PSAwICYmIGkgPCBsZW4gLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJywgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfcmV0dXJuICs9ICc+JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3JldHVybjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0Q2FsbERlY2xhcmF0aW9uKG1ldGhvZDogdHMuQ2FsbFNpZ25hdHVyZURlY2xhcmF0aW9uLCBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKSB7XG4gICAgICAgIGxldCBzb3VyY2VDb2RlID0gc291cmNlRmlsZS5nZXRUZXh0KCk7XG4gICAgICAgIGxldCBoYXNoID0gY3J5cHRvXG4gICAgICAgICAgICAuY3JlYXRlSGFzaCgnbWQ1JylcbiAgICAgICAgICAgIC51cGRhdGUoc291cmNlQ29kZSlcbiAgICAgICAgICAgIC5kaWdlc3QoJ2hleCcpO1xuICAgICAgICBsZXQgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBpZDogJ2NhbGwtZGVjbGFyYXRpb24tJyArIGhhc2gsXG4gICAgICAgICAgICBhcmdzOiBtZXRob2QucGFyYW1ldGVycyA/IG1ldGhvZC5wYXJhbWV0ZXJzLm1hcChwcm9wID0+IHRoaXMudmlzaXRBcmd1bWVudChwcm9wKSkgOiBbXSxcbiAgICAgICAgICAgIHJldHVyblR5cGU6IHRoaXMudmlzaXRUeXBlKG1ldGhvZC50eXBlKSxcbiAgICAgICAgICAgIGxpbmU6IHRoaXMuZ2V0UG9zaXRpb24obWV0aG9kLCBzb3VyY2VGaWxlKS5saW5lICsgMVxuICAgICAgICB9O1xuICAgICAgICBpZiAobWV0aG9kLmpzRG9jKSB7XG4gICAgICAgICAgICByZXN1bHQuZGVzY3JpcHRpb24gPSBtYXJrZWQobWFya2VkKHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldE1haW5Db21tZW50T2ZOb2RlKG1ldGhvZCkpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQganNkb2N0YWdzID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0SlNEb2NzKG1ldGhvZCk7XG4gICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICBpZiAoanNkb2N0YWdzWzBdLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuanNkb2N0YWdzID0gbWFya2VkdGFncyhqc2RvY3RhZ3NbMF0udGFncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0SW5kZXhEZWNsYXJhdGlvbihcbiAgICAgICAgbWV0aG9kOiB0cy5JbmRleFNpZ25hdHVyZURlY2xhcmF0aW9uLFxuICAgICAgICBzb3VyY2VGaWxlPzogdHMuU291cmNlRmlsZVxuICAgICkge1xuICAgICAgICBsZXQgc291cmNlQ29kZSA9IHNvdXJjZUZpbGUuZ2V0VGV4dCgpO1xuICAgICAgICBsZXQgaGFzaCA9IGNyeXB0b1xuICAgICAgICAgICAgLmNyZWF0ZUhhc2goJ21kNScpXG4gICAgICAgICAgICAudXBkYXRlKHNvdXJjZUNvZGUpXG4gICAgICAgICAgICAuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGlkOiAnaW5kZXgtZGVjbGFyYXRpb24tJyArIGhhc2gsXG4gICAgICAgICAgICBhcmdzOiBtZXRob2QucGFyYW1ldGVycyA/IG1ldGhvZC5wYXJhbWV0ZXJzLm1hcChwcm9wID0+IHRoaXMudmlzaXRBcmd1bWVudChwcm9wKSkgOiBbXSxcbiAgICAgICAgICAgIHJldHVyblR5cGU6IHRoaXMudmlzaXRUeXBlKG1ldGhvZC50eXBlKSxcbiAgICAgICAgICAgIGxpbmU6IHRoaXMuZ2V0UG9zaXRpb24obWV0aG9kLCBzb3VyY2VGaWxlKS5saW5lICsgMVxuICAgICAgICB9O1xuICAgICAgICBpZiAobWV0aG9kLmpzRG9jKSB7XG4gICAgICAgICAgICByZXN1bHQuZGVzY3JpcHRpb24gPSBtYXJrZWQodGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0TWFpbkNvbW1lbnRPZk5vZGUobWV0aG9kKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0Q29uc3RydWN0b3JEZWNsYXJhdGlvbihcbiAgICAgICAgbWV0aG9kOiB0cy5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLFxuICAgICAgICBzb3VyY2VGaWxlPzogdHMuU291cmNlRmlsZVxuICAgICkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBsZXQgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBuYW1lOiAnY29uc3RydWN0b3InLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgYXJnczogbWV0aG9kLnBhcmFtZXRlcnMgPyBtZXRob2QucGFyYW1ldGVycy5tYXAocHJvcCA9PiB0aGlzLnZpc2l0QXJndW1lbnQocHJvcCkpIDogW10sXG4gICAgICAgICAgICBsaW5lOiB0aGlzLmdldFBvc2l0aW9uKG1ldGhvZCwgc291cmNlRmlsZSkubGluZSArIDFcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhtZXRob2QpO1xuXG4gICAgICAgIGlmIChtZXRob2QuanNEb2MpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kZXNjcmlwdGlvbiA9IG1hcmtlZCh0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRNYWluQ29tbWVudE9mTm9kZShtZXRob2QpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBpZiAobWV0aG9kLm1vZGlmaWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGtpbmRzID0gbWV0aG9kLm1vZGlmaWVycy5tYXAobW9kaWZpZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kaWZpZXIua2luZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIF8uaW5kZXhPZihraW5kcywgU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgXy5pbmRleE9mKGtpbmRzLCBTeW50YXhLaW5kLlN0YXRpY0tleXdvcmQpICE9PSAtMVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBraW5kcyA9IGtpbmRzLmZpbHRlcihraW5kID0+IGtpbmQgIT09IFN5bnRheEtpbmQuUHVibGljS2V5d29yZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5tb2RpZmllcktpbmQgPSBraW5kcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgaWYgKGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2N0YWdzWzBdLnRhZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuanNkb2N0YWdzICYmIHJlc3VsdC5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1lcmdlVGFnc0FuZEFyZ3MocmVzdWx0LmFyZ3MsIHJlc3VsdC5qc2RvY3RhZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5hcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKHJlc3VsdC5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRQcm9wZXJ0eShwcm9wZXJ0eTogdHMuUHJvcGVydHlEZWNsYXJhdGlvbiwgc291cmNlRmlsZSkge1xuICAgICAgICBsZXQgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBuYW1lOiBwcm9wZXJ0eS5uYW1lLnRleHQsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHByb3BlcnR5LmluaXRpYWxpemVyXG4gICAgICAgICAgICAgICAgPyB0aGlzLnN0cmluZ2lmeURlZmF1bHRWYWx1ZShwcm9wZXJ0eS5pbml0aWFsaXplcilcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudmlzaXRUeXBlKHByb3BlcnR5KSxcbiAgICAgICAgICAgIG9wdGlvbmFsOiB0eXBlb2YgcHJvcGVydHkucXVlc3Rpb25Ub2tlbiAhPT0gJ3VuZGVmaW5lZCcsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICBsaW5lOiB0aGlzLmdldFBvc2l0aW9uKHByb3BlcnR5LCBzb3VyY2VGaWxlKS5saW5lICsgMVxuICAgICAgICB9O1xuICAgICAgICBsZXQganNkb2N0YWdzO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0Lm5hbWUgPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwcm9wZXJ0eS5uYW1lLmV4cHJlc3Npb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXN1bHQubmFtZSA9IHByb3BlcnR5Lm5hbWUuZXhwcmVzc2lvbi50ZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BlcnR5LmpzRG9jKSB7XG4gICAgICAgICAgICBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3MocHJvcGVydHkpO1xuICAgICAgICAgICAgcmVzdWx0LmRlc2NyaXB0aW9uID0gbWFya2VkKHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldE1haW5Db21tZW50T2ZOb2RlKHByb3BlcnR5KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHkuZGVjb3JhdG9ycykge1xuICAgICAgICAgICAgcmVzdWx0LmRlY29yYXRvcnMgPSB0aGlzLmZvcm1hdERlY29yYXRvcnMocHJvcGVydHkuZGVjb3JhdG9ycyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHkubW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBpZiAocHJvcGVydHkubW9kaWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQga2luZHMgPSBwcm9wZXJ0eS5tb2RpZmllcnMubWFwKG1vZGlmaWVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGlmaWVyLmtpbmQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBfLmluZGV4T2Yoa2luZHMsIFN5bnRheEtpbmQuUHVibGljS2V5d29yZCkgIT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIF8uaW5kZXhPZihraW5kcywgU3ludGF4S2luZC5TdGF0aWNLZXl3b3JkKSAhPT0gLTFcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAga2luZHMgPSBraW5kcy5maWx0ZXIoa2luZCA9PiBraW5kICE9PSBTeW50YXhLaW5kLlB1YmxpY0tleXdvcmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQubW9kaWZpZXJLaW5kID0ga2luZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGpzZG9jdGFncyAmJiBqc2RvY3RhZ3MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgIGlmIChqc2RvY3RhZ3NbMF0udGFncykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtYXJrZWR0YWdzKGpzZG9jdGFnc1swXS50YWdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdENvbnN0cnVjdG9yUHJvcGVydGllcyhjb25zdHIsIHNvdXJjZUZpbGUpIHtcbiAgICAgICAgbGV0IHRoYXQgPSB0aGlzO1xuICAgICAgICBpZiAoY29uc3RyLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIGxldCBfcGFyYW1ldGVycyA9IFtdO1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IGNvbnN0ci5wYXJhbWV0ZXJzLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQdWJsaWMoY29uc3RyLnBhcmFtZXRlcnNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIF9wYXJhbWV0ZXJzLnB1c2godGhpcy52aXNpdFByb3BlcnR5KGNvbnN0ci5wYXJhbWV0ZXJzW2ldLCBzb3VyY2VGaWxlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBNZXJnZSBKU0RvYyB0YWdzIGRlc2NyaXB0aW9uIGZyb20gY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChjb25zdHIuanNEb2MpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uc3RyLmpzRG9jLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnN0clRhZ3MgPSBjb25zdHIuanNEb2NbMF0udGFncztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnN0clRhZ3MgJiYgY29uc3RyVGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJUYWdzLmZvckVhY2godGFnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcGFyYW1ldGVycy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnRhZ05hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy50YWdOYW1lLmVzY2FwZWRUZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcudGFnTmFtZS5lc2NhcGVkVGV4dCA9PT0gJ3BhcmFtJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcubmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5uYW1lLmVzY2FwZWRUZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLm5hbWUuZXNjYXBlZFRleHQgPT09IHBhcmFtLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmRlc2NyaXB0aW9uID0gdGFnLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF9wYXJhbWV0ZXJzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdElucHV0QW5kSG9zdEJpbmRpbmcocHJvcGVydHksIGluRGVjb3JhdG9yLCBzb3VyY2VGaWxlPykge1xuICAgICAgICBsZXQgaW5BcmdzID0gaW5EZWNvcmF0b3IuZXhwcmVzc2lvbi5hcmd1bWVudHM7XG4gICAgICAgIGxldCBfcmV0dXJuOiBhbnkgPSB7fTtcbiAgICAgICAgX3JldHVybi5uYW1lID0gaW5BcmdzLmxlbmd0aCA+IDAgPyBpbkFyZ3NbMF0udGV4dCA6IHByb3BlcnR5Lm5hbWUudGV4dDtcbiAgICAgICAgX3JldHVybi5kZWZhdWx0VmFsdWUgPSBwcm9wZXJ0eS5pbml0aWFsaXplclxuICAgICAgICAgICAgPyB0aGlzLnN0cmluZ2lmeURlZmF1bHRWYWx1ZShwcm9wZXJ0eS5pbml0aWFsaXplcilcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIV9yZXR1cm4uZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5qc0RvYykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5qc0RvYy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkuanNEb2NbMF0uY29tbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4uZGVzY3JpcHRpb24gPSBtYXJrZWQocHJvcGVydHkuanNEb2NbMF0uY29tbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX3JldHVybi5saW5lID0gdGhpcy5nZXRQb3NpdGlvbihwcm9wZXJ0eSwgc291cmNlRmlsZSkubGluZSArIDE7XG4gICAgICAgIGlmIChwcm9wZXJ0eS50eXBlKSB7XG4gICAgICAgICAgICBfcmV0dXJuLnR5cGUgPSB0aGlzLnZpc2l0VHlwZShwcm9wZXJ0eSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgTmV3RXhwcmVzc2lvblxuICAgICAgICAgICAgaWYgKHByb3BlcnR5LmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRzLmlzTmV3RXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplcikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LmluaXRpYWxpemVyLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4udHlwZSA9IHByb3BlcnR5LmluaXRpYWxpemVyLmV4cHJlc3Npb24udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHkua2luZCA9PT0gU3ludGF4S2luZC5TZXRBY2Nlc3Nvcikge1xuICAgICAgICAgICAgLy8gRm9yIHNldHRlciBhY2Nlc3NvciwgZmluZCB0eXBlIGluIGZpcnN0IHBhcmFtZXRlclxuICAgICAgICAgICAgaWYgKHByb3BlcnR5LnBhcmFtZXRlcnMgJiYgcHJvcGVydHkucGFyYW1ldGVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkucGFyYW1ldGVyc1swXS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIF9yZXR1cm4udHlwZSA9IGtpbmRUb1R5cGUocHJvcGVydHkucGFyYW1ldGVyc1swXS50eXBlLmtpbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3JldHVybjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0TWV0aG9kRGVjbGFyYXRpb24obWV0aG9kOiB0cy5NZXRob2REZWNsYXJhdGlvbiwgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSkge1xuICAgICAgICBsZXQgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBuYW1lOiBtZXRob2QubmFtZS50ZXh0LFxuICAgICAgICAgICAgYXJnczogbWV0aG9kLnBhcmFtZXRlcnMgPyBtZXRob2QucGFyYW1ldGVycy5tYXAocHJvcCA9PiB0aGlzLnZpc2l0QXJndW1lbnQocHJvcCkpIDogW10sXG4gICAgICAgICAgICBvcHRpb25hbDogdHlwZW9mIG1ldGhvZC5xdWVzdGlvblRva2VuICE9PSAndW5kZWZpbmVkJyxcbiAgICAgICAgICAgIHJldHVyblR5cGU6IHRoaXMudmlzaXRUeXBlKG1ldGhvZC50eXBlKSxcbiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgICAgIGxpbmU6IHRoaXMuZ2V0UG9zaXRpb24obWV0aG9kLCBzb3VyY2VGaWxlKS5saW5lICsgMVxuICAgICAgICB9O1xuICAgICAgICBsZXQganNkb2N0YWdzID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0SlNEb2NzKG1ldGhvZCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QudHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIFRyeSB0byBnZXQgaW5mZXJyZWQgdHlwZVxuICAgICAgICAgICAgaWYgKG1ldGhvZC5zeW1ib2wpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3ltYm9sOiB0cy5TeW1ib2wgPSBtZXRob2Quc3ltYm9sO1xuICAgICAgICAgICAgICAgIGlmIChzeW1ib2wudmFsdWVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3ltYm9sVHlwZSA9IHRoaXMudHlwZUNoZWNrZXIuZ2V0VHlwZU9mU3ltYm9sQXRMb2NhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbC52YWx1ZURlY2xhcmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2xUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRoaXMudHlwZUNoZWNrZXIuZ2V0U2lnbmF0dXJlRnJvbURlY2xhcmF0aW9uKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuVHlwZSA9IHNpZ25hdHVyZS5nZXRSZXR1cm5UeXBlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJldHVyblR5cGUgPSB0aGlzLnR5cGVDaGVja2VyLnR5cGVUb1N0cmluZyhyZXR1cm5UeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tZW1wdHlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldGhvZC50eXBlUGFyYW1ldGVycyAmJiBtZXRob2QudHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LnR5cGVQYXJhbWV0ZXJzID0gbWV0aG9kLnR5cGVQYXJhbWV0ZXJzLm1hcCh0eXBlUGFyYW1ldGVyID0+XG4gICAgICAgICAgICAgICAgdGhpcy52aXNpdFR5cGUodHlwZVBhcmFtZXRlcilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0aG9kLmpzRG9jKSB7XG4gICAgICAgICAgICByZXN1bHQuZGVzY3JpcHRpb24gPSBtYXJrZWQodGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0TWFpbkNvbW1lbnRPZk5vZGUobWV0aG9kKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0aG9kLmRlY29yYXRvcnMpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kZWNvcmF0b3JzID0gdGhpcy5mb3JtYXREZWNvcmF0b3JzKG1ldGhvZC5kZWNvcmF0b3JzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBpZiAobWV0aG9kLm1vZGlmaWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGtpbmRzID0gbWV0aG9kLm1vZGlmaWVycy5tYXAobW9kaWZpZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kaWZpZXIua2luZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIF8uaW5kZXhPZihraW5kcywgU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgXy5pbmRleE9mKGtpbmRzLCBTeW50YXhLaW5kLlN0YXRpY0tleXdvcmQpICE9PSAtMVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBraW5kcyA9IGtpbmRzLmZpbHRlcihraW5kID0+IGtpbmQgIT09IFN5bnRheEtpbmQuUHVibGljS2V5d29yZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5tb2RpZmllcktpbmQgPSBraW5kcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgaWYgKGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2N0YWdzWzBdLnRhZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuanNkb2N0YWdzICYmIHJlc3VsdC5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1lcmdlVGFnc0FuZEFyZ3MocmVzdWx0LmFyZ3MsIHJlc3VsdC5qc2RvY3RhZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5hcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKHJlc3VsdC5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRPdXRwdXQoXG4gICAgICAgIHByb3BlcnR5OiB0cy5Qcm9wZXJ0eURlY2xhcmF0aW9uLFxuICAgICAgICBvdXREZWNvcmF0b3I6IHRzLkRlY29yYXRvcixcbiAgICAgICAgc291cmNlRmlsZT86IHRzLlNvdXJjZUZpbGVcbiAgICApIHtcbiAgICAgICAgbGV0IGluQXJncyA9IG91dERlY29yYXRvci5leHByZXNzaW9uLmFyZ3VtZW50cztcbiAgICAgICAgbGV0IF9yZXR1cm46IGFueSA9IHtcbiAgICAgICAgICAgIG5hbWU6IGluQXJncy5sZW5ndGggPiAwID8gaW5BcmdzWzBdLnRleHQgOiBwcm9wZXJ0eS5uYW1lLnRleHQsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHByb3BlcnR5LmluaXRpYWxpemVyXG4gICAgICAgICAgICAgICAgPyB0aGlzLnN0cmluZ2lmeURlZmF1bHRWYWx1ZShwcm9wZXJ0eS5pbml0aWFsaXplcilcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgICBpZiAocHJvcGVydHkuanNEb2MpIHtcbiAgICAgICAgICAgIF9yZXR1cm4uZGVzY3JpcHRpb24gPSBtYXJrZWQoXG4gICAgICAgICAgICAgICAgbWFya2VkKHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldE1haW5Db21tZW50T2ZOb2RlKHByb3BlcnR5KSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFfcmV0dXJuLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBpZiAocHJvcGVydHkuanNEb2MgJiYgcHJvcGVydHkuanNEb2MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkuanNEb2NbMF0uY29tbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgX3JldHVybi5kZXNjcmlwdGlvbiA9IG1hcmtlZChwcm9wZXJ0eS5qc0RvY1swXS5jb21tZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX3JldHVybi5saW5lID0gdGhpcy5nZXRQb3NpdGlvbihwcm9wZXJ0eSwgc291cmNlRmlsZSkubGluZSArIDE7XG5cbiAgICAgICAgaWYgKHByb3BlcnR5LnR5cGUpIHtcbiAgICAgICAgICAgIF9yZXR1cm4udHlwZSA9IHRoaXMudmlzaXRUeXBlKHByb3BlcnR5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBOZXdFeHByZXNzaW9uXG4gICAgICAgICAgICBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAodHMuaXNOZXdFeHByZXNzaW9uKHByb3BlcnR5LmluaXRpYWxpemVyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybi50eXBlID0gcHJvcGVydHkuaW5pdGlhbGl6ZXIuZXhwcmVzc2lvbi50ZXh0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfcmV0dXJuO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRBcmd1bWVudChhcmc6IHRzLlBhcmFtZXRlckRlY2xhcmF0aW9uKSB7XG4gICAgICAgIGxldCBfcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBuYW1lOiBhcmcubmFtZS50ZXh0LFxuICAgICAgICAgICAgdHlwZTogdGhpcy52aXNpdFR5cGUoYXJnKVxuICAgICAgICB9O1xuICAgICAgICBpZiAoYXJnLmRvdERvdERvdFRva2VuKSB7XG4gICAgICAgICAgICBfcmVzdWx0LmRvdERvdERvdFRva2VuID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJnLnF1ZXN0aW9uVG9rZW4pIHtcbiAgICAgICAgICAgIF9yZXN1bHQub3B0aW9uYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmcudHlwZSkge1xuICAgICAgICAgICAgaWYgKGFyZy50eXBlLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAodHMuaXNGdW5jdGlvblR5cGVOb2RlKGFyZy50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmZ1bmN0aW9uID0gYXJnLnR5cGUucGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBhcmcudHlwZS5wYXJhbWV0ZXJzLm1hcChwcm9wID0+IHRoaXMudmlzaXRBcmd1bWVudChwcm9wKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhcmcuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgIF9yZXN1bHQuZGVmYXVsdFZhbHVlID0gdGhpcy5zdHJpbmdpZnlEZWZhdWx0VmFsdWUoYXJnLmluaXRpYWxpemVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3Jlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0SG9zdExpc3RlbmVyKHByb3BlcnR5LCBob3N0TGlzdGVuZXJEZWNvcmF0b3IsIHNvdXJjZUZpbGU/KSB7XG4gICAgICAgIGxldCBpbkFyZ3MgPSBob3N0TGlzdGVuZXJEZWNvcmF0b3IuZXhwcmVzc2lvbi5hcmd1bWVudHM7XG4gICAgICAgIGxldCBfcmV0dXJuOiBhbnkgPSB7fTtcbiAgICAgICAgX3JldHVybi5uYW1lID0gaW5BcmdzLmxlbmd0aCA+IDAgPyBpbkFyZ3NbMF0udGV4dCA6IHByb3BlcnR5Lm5hbWUudGV4dDtcbiAgICAgICAgX3JldHVybi5hcmdzID0gcHJvcGVydHkucGFyYW1ldGVyc1xuICAgICAgICAgICAgPyBwcm9wZXJ0eS5wYXJhbWV0ZXJzLm1hcChwcm9wID0+IHRoaXMudmlzaXRBcmd1bWVudChwcm9wKSlcbiAgICAgICAgICAgIDogW107XG4gICAgICAgIF9yZXR1cm4uYXJnc0RlY29yYXRvciA9XG4gICAgICAgICAgICBpbkFyZ3MubGVuZ3RoID4gMVxuICAgICAgICAgICAgICAgID8gaW5BcmdzWzFdLmVsZW1lbnRzLm1hcChwcm9wID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcC50ZXh0O1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IFtdO1xuICAgICAgICBpZiAocHJvcGVydHkuanNEb2MpIHtcbiAgICAgICAgICAgIF9yZXR1cm4uZGVzY3JpcHRpb24gPSBtYXJrZWQodGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0TWFpbkNvbW1lbnRPZk5vZGUocHJvcGVydHkpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIV9yZXR1cm4uZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5qc0RvYykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5qc0RvYy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkuanNEb2NbMF0uY29tbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4uZGVzY3JpcHRpb24gPSBtYXJrZWQocHJvcGVydHkuanNEb2NbMF0uY29tbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX3JldHVybi5saW5lID0gdGhpcy5nZXRQb3NpdGlvbihwcm9wZXJ0eSwgc291cmNlRmlsZSkubGluZSArIDE7XG4gICAgICAgIHJldHVybiBfcmV0dXJuO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IHRzIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5cbmV4cG9ydCBjbGFzcyBUc1ByaW50ZXJVdGlsIHtcbiAgICBwcml2YXRlIHByaW50ZXI6IHRzLlByaW50ZXI7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5wcmludGVyID0gdHMuY3JlYXRlUHJpbnRlcih7XG4gICAgICAgICAgICBuZXdMaW5lOiB0cy5OZXdMaW5lS2luZC5MaW5lRmVlZFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJpbnQobm9kZTogdHMuTm9kZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnByaW50ZXIucHJpbnROb2RlKFxuICAgICAgICAgICAgdHMuRW1pdEhpbnQuVW5zcGVjaWZpZWQsXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgdHMuY3JlYXRlU291cmNlRmlsZSgnJywgJycsIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QpXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyB0cywgU3ludGF4S2luZCB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuXG5pbXBvcnQgeyBUc1ByaW50ZXJVdGlsIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbHMvdHMtcHJpbnRlci51dGlsJztcblxuaW1wb3J0IHsgSW1wb3J0c1V0aWwgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscy9pbXBvcnRzLnV0aWwnO1xuXG5leHBvcnQgY2xhc3MgU3ltYm9sSGVscGVyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVua25vd24gPSAnPz8/JztcbiAgICBwcml2YXRlIGltcG9ydHNVdGlsID0gbmV3IEltcG9ydHNVdGlsKCk7XG5cbiAgICBwdWJsaWMgcGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZTogc3RyaW5nLCBzcmNGaWxlPzogdHMuU291cmNlRmlsZSk6IElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgICAgdHlwZTogJydcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGxldCBuc01vZHVsZSA9IG5hbWUuc3BsaXQoJy4nKTtcbiAgICAgICAgbGV0IHR5cGUgPSB0aGlzLmdldFR5cGUobmFtZSk7XG5cbiAgICAgICAgaWYgKG5zTW9kdWxlLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdC5ucyA9IG5zTW9kdWxlWzBdO1xuICAgICAgICAgICAgcmVzdWx0Lm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgcmVzdWx0LnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNyY0ZpbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXN1bHQuZmlsZSA9IHRoaXMuaW1wb3J0c1V0aWwuZ2V0RmlsZU5hbWVPZkltcG9ydChuYW1lLCBzcmNGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQubmFtZSA9IG5hbWU7XG4gICAgICAgIHJlc3VsdC50eXBlID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VHlwZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdjb21wb25lbnQnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnY29tcG9uZW50JztcbiAgICAgICAgfSBlbHNlIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigncGlwZScpICE9PSAtMSkge1xuICAgICAgICAgICAgdHlwZSA9ICdwaXBlJztcbiAgICAgICAgfSBlbHNlIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignY29udHJvbGxlcicpICE9PSAtMSkge1xuICAgICAgICAgICAgdHlwZSA9ICdjb250cm9sbGVyJztcbiAgICAgICAgfSBlbHNlIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignbW9kdWxlJykgIT09IC0xKSB7XG4gICAgICAgICAgICB0eXBlID0gJ21vZHVsZSc7XG4gICAgICAgIH0gZWxzZSBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2RpcmVjdGl2ZScpICE9PSAtMSkge1xuICAgICAgICAgICAgdHlwZSA9ICdkaXJlY3RpdmUnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE91dHB1dFxuICAgICAqIFJvdXRlck1vZHVsZS5mb3JSb290IDE3OVxuICAgICAqL1xuICAgIHB1YmxpYyBidWlsZElkZW50aWZpZXJOYW1lKFxuICAgICAgICBub2RlOiB0cy5JZGVudGlmaWVyIHwgdHMuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uIHwgdHMuU3ByZWFkRWxlbWVudCxcbiAgICAgICAgbmFtZVxuICAgICkge1xuICAgICAgICBpZiAodHMuaXNJZGVudGlmaWVyKG5vZGUpICYmICF0cy5pc1Byb3BlcnR5QWNjZXNzRXhwcmVzc2lvbihub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGAke25vZGUudGV4dH0uJHtuYW1lfWA7XG4gICAgICAgIH1cblxuICAgICAgICBuYW1lID0gbmFtZSA/IGAuJHtuYW1lfWAgOiAnJztcblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSB0aGlzLnVua25vd247XG4gICAgICAgIGlmIChub2RlLm5hbWUpIHtcbiAgICAgICAgICAgIG5vZGVOYW1lID0gbm9kZS5uYW1lLnRleHQ7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS50ZXh0KSB7XG4gICAgICAgICAgICBub2RlTmFtZSA9IG5vZGUudGV4dDtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIGlmIChub2RlLmV4cHJlc3Npb24udGV4dCkge1xuICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gbm9kZS5leHByZXNzaW9uLnRleHQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZXhwcmVzc2lvbi5lbGVtZW50cykge1xuICAgICAgICAgICAgICAgIGlmICh0cy5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSA9IG5vZGUuZXhwcmVzc2lvbi5lbGVtZW50cy5tYXAoZWwgPT4gZWwudGV4dCkuam9pbignLCAnKTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBgWyR7bm9kZU5hbWV9XWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRzLmlzU3ByZWFkRWxlbWVudChub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGAuLi4ke25vZGVOYW1lfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3RoaXMuYnVpbGRJZGVudGlmaWVyTmFtZShub2RlLmV4cHJlc3Npb24sIG5vZGVOYW1lKX0ke25hbWV9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBwYXJzZSBleHByZXNzaW9ucyBzdWNoIGFzOlxuICAgICAqIHsgcHJvdmlkZTogQVBQX0JBU0VfSFJFRiwgdXNlVmFsdWU6ICcvJyB9XG4gICAgICogeyBwcm92aWRlOiAnRGF0ZScsIHVzZUZhY3Rvcnk6IChkMSwgZDIpID0+IG5ldyBEYXRlKCksIGRlcHM6IFsnZDEnLCAnZDInXSB9XG4gICAgICovXG4gICAgcHVibGljIHBhcnNlUHJvdmlkZXJDb25maWd1cmF0aW9uKG5vZGU6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKG5vZGUua2luZCAmJiBub2RlLmtpbmQgPT09IFN5bnRheEtpbmQuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIC8vIFNlYXJjaCBmb3IgcHJvdmlkZTogSFRUUF9JTlRFUkNFUFRPUlNcbiAgICAgICAgICAgIC8vIGFuZCBpZiB0cnVlLCByZXR1cm4gdHlwZTogJ2ludGVyY2VwdG9yJyArIG5hbWVcbiAgICAgICAgICAgIGxldCBpbnRlcmNlcHRvck5hbWUsIGhhc0ludGVyY2VwdG9yO1xuICAgICAgICAgICAgaWYgKG5vZGUucHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2gobm9kZS5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkua2luZCAmJiBwcm9wZXJ0eS5raW5kID09PSBTeW50YXhLaW5kLlByb3BlcnR5QXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5uYW1lLnRleHQgPT09ICdwcm92aWRlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIudGV4dCA9PT0gJ0hUVFBfSU5URVJDRVBUT1JTJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSW50ZXJjZXB0b3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkubmFtZS50ZXh0ID09PSAndXNlQ2xhc3MnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Lm5hbWUudGV4dCA9PT0gJ3VzZUV4aXN0aW5nJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmNlcHRvck5hbWUgPSBwcm9wZXJ0eS5pbml0aWFsaXplci50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhc0ludGVyY2VwdG9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGludGVyY2VwdG9yTmFtZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUc1ByaW50ZXJVdGlsKCkucHJpbnQobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRzUHJpbnRlclV0aWwoKS5wcmludChub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEtpbmRcbiAgICAgKiAgMTgxIENhbGxFeHByZXNzaW9uID0+IFwiUm91dGVyTW9kdWxlLmZvclJvb3QoYXJncylcIlxuICAgICAqICAgNzEgSWRlbnRpZmllciAgICAgPT4gXCJSb3V0ZXJNb2R1bGVcIiBcIlRvZG9TdG9yZVwiXG4gICAgICogICAgOSBTdHJpbmdMaXRlcmFsICA9PiBcIi4vYXBwLmNvbXBvbmVudC5jc3NcIiBcIi4vdGFiLnNjc3NcIlxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJzZVN5bWJvbEVsZW1lbnRzKFxuICAgICAgICBub2RlOlxuICAgICAgICAgICAgfCB0cy5DYWxsRXhwcmVzc2lvblxuICAgICAgICAgICAgfCB0cy5JZGVudGlmaWVyXG4gICAgICAgICAgICB8IHRzLlN0cmluZ0xpdGVyYWxcbiAgICAgICAgICAgIHwgdHMuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uXG4gICAgICAgICAgICB8IHRzLlNwcmVhZEVsZW1lbnRcbiAgICApOiBzdHJpbmcge1xuICAgICAgICAvLyBwYXJzZSBleHByZXNzaW9ucyBzdWNoIGFzOiBBbmd1bGFyRmlyZU1vZHVsZS5pbml0aWFsaXplQXBwKGZpcmViYXNlQ29uZmlnKVxuICAgICAgICAvLyBpZiAodHMuaXNDYWxsRXhwcmVzc2lvbihub2RlKSAmJiB0cy5pc1Byb3BlcnR5QWNjZXNzRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24pKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICh0cy5pc0NhbGxFeHByZXNzaW9uKG5vZGUpICYmIHRzLmlzUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbikpIHx8XG4gICAgICAgICAgICAodHMuaXNOZXdFeHByZXNzaW9uKG5vZGUpICYmIHRzLmlzRWxlbWVudEFjY2Vzc0V4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gdGhpcy5idWlsZElkZW50aWZpZXJOYW1lKG5vZGUuZXhwcmVzc2lvbik7XG5cbiAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGFyZ3VtZW50cyBjb3VsZCBiZSByZWFsbHkgY29tcGxleC4gVGhlcmUgYXJlIHNvXG4gICAgICAgICAgICAvLyBtYW55IHVzZSBjYXNlcyB0aGF0IHdlIGNhbid0IGhhbmRsZS4gSnVzdCBwcmludCBcImFyZ3NcIiB0byBpbmRpY2F0ZVxuICAgICAgICAgICAgLy8gdGhhdCB3ZSBoYXZlIGFyZ3VtZW50cy5cblxuICAgICAgICAgICAgbGV0IGZ1bmN0aW9uQXJncyA9IG5vZGUuYXJndW1lbnRzLmxlbmd0aCA+IDAgPyAnYXJncycgOiAnJztcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gYCR7Y2xhc3NOYW1lfSgke2Z1bmN0aW9uQXJnc30pYDtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKHRzLmlzUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBwYXJzZSBleHByZXNzaW9ucyBzdWNoIGFzOiBTaGFyZWQuTW9kdWxlXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZElkZW50aWZpZXJOYW1lKG5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRzLmlzSWRlbnRpZmllcihub2RlKSkge1xuICAgICAgICAgICAgLy8gcGFyc2UgZXhwcmVzc2lvbnMgc3VjaCBhczogTXlDb21wb25lbnRcbiAgICAgICAgICAgIGlmIChub2RlLnRleHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS50ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUuZXNjYXBlZFRleHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5lc2NhcGVkVGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0cy5pc1NwcmVhZEVsZW1lbnQobm9kZSkpIHtcbiAgICAgICAgICAgIC8vIHBhcnNlIGV4cHJlc3Npb25zIHN1Y2ggYXM6IC4uLk1ZQVJSQVlcbiAgICAgICAgICAgIC8vIFJlc29sdmUgTVlBUlJBWSBpbiBpbXBvcnRzIG9yIGxvY2FsIGZpbGUgdmFyaWFibGVzIGFmdGVyIGZ1bGwgc2NhbiwganVzdCByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlXG4gICAgICAgICAgICBpZiAobm9kZS5leHByZXNzaW9uICYmIG5vZGUuZXhwcmVzc2lvbi50ZXh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuZXhwcmVzc2lvbi50ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vZGUudGV4dCA/IG5vZGUudGV4dCA6IHRoaXMucGFyc2VQcm92aWRlckNvbmZpZ3VyYXRpb24obm9kZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogS2luZFxuICAgICAqICAxNzcgQXJyYXlMaXRlcmFsRXhwcmVzc2lvblxuICAgICAqICAxMjIgQm9vbGVhbktleXdvcmRcbiAgICAgKiAgICA5IFN0cmluZ0xpdGVyYWxcbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlU3ltYm9scyhcbiAgICAgICAgbm9kZTogdHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnQsXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxzdHJpbmcgfCBib29sZWFuPiB7XG4gICAgICAgIGxldCBsb2NhbE5vZGUgPSBub2RlO1xuXG4gICAgICAgIGlmICh0cy5pc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudChsb2NhbE5vZGUpKSB7XG4gICAgICAgICAgICBsb2NhbE5vZGUgPSB0aGlzLmltcG9ydHNVdGlsLmZpbmRWYWx1ZUluSW1wb3J0T3JMb2NhbFZhcmlhYmxlcyhub2RlLm5hbWUudGV4dCwgc3JjRmlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHMuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKGxvY2FsTm9kZS5pbml0aWFsaXplcikpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIuZWxlbWVudHMubWFwKHggPT4gdGhpcy5wYXJzZVN5bWJvbEVsZW1lbnRzKHgpKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHRzLmlzU3RyaW5nTGl0ZXJhbChsb2NhbE5vZGUuaW5pdGlhbGl6ZXIpIHx8XG4gICAgICAgICAgICB0cy5pc1RlbXBsYXRlTGl0ZXJhbChsb2NhbE5vZGUuaW5pdGlhbGl6ZXIpIHx8XG4gICAgICAgICAgICAodHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQobG9jYWxOb2RlKSAmJiBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIudGV4dClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gW2xvY2FsTm9kZS5pbml0aWFsaXplci50ZXh0XTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGxvY2FsTm9kZS5pbml0aWFsaXplci5raW5kICYmXG4gICAgICAgICAgICAobG9jYWxOb2RlLmluaXRpYWxpemVyLmtpbmQgPT09IFN5bnRheEtpbmQuVHJ1ZUtleXdvcmQgfHxcbiAgICAgICAgICAgICAgICBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIua2luZCA9PT0gU3ludGF4S2luZC5GYWxzZUtleXdvcmQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIFtsb2NhbE5vZGUuaW5pdGlhbGl6ZXIua2luZCA9PT0gU3ludGF4S2luZC5UcnVlS2V5d29yZCA/IHRydWUgOiBmYWxzZV07XG4gICAgICAgIH0gZWxzZSBpZiAodHMuaXNQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24obG9jYWxOb2RlLmluaXRpYWxpemVyKSkge1xuICAgICAgICAgICAgbGV0IGlkZW50aWZpZXIgPSB0aGlzLnBhcnNlU3ltYm9sRWxlbWVudHMobG9jYWxOb2RlLmluaXRpYWxpemVyKTtcbiAgICAgICAgICAgIHJldHVybiBbaWRlbnRpZmllcl07XG4gICAgICAgIH0gZWxzZSBpZiAodHMuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKGxvY2FsTm9kZS5pbml0aWFsaXplcikpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIuZWxlbWVudHMubWFwKHggPT4gdGhpcy5wYXJzZVN5bWJvbEVsZW1lbnRzKHgpKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGxvY2FsTm9kZS5pbml0aWFsaXplciAmJlxuICAgICAgICAgICAgbG9jYWxOb2RlLmluaXRpYWxpemVyLmVsZW1lbnRzICYmXG4gICAgICAgICAgICBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIuZWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIE5vZGUgcmVwbGFjZWQgYnkgdHMtc2ltcGxlLWFzdCAmIGtpbmQgPSAyNjVcbiAgICAgICAgICAgIHJldHVybiBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIuZWxlbWVudHMubWFwKHggPT4gdGhpcy5wYXJzZVN5bWJvbEVsZW1lbnRzKHgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTeW1ib2xEZXBzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgICAgIG11bHRpTGluZT86IGJvb2xlYW5cbiAgICApOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgaWYgKHByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGkgPSAwLFxuICAgICAgICAgICAgbGVuID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgICAgZmlsdGVyZWRQcm9wcyA9IFtdO1xuXG4gICAgICAgIGZvciAoaTsgaTxsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKHByb3BzW2ldLm5hbWUgJiYgcHJvcHNbaV0ubmFtZS50ZXh0ID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyZWRQcm9wcy5wdXNoKHByb3BzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWx0ZXJlZFByb3BzLm1hcCh4ID0+IHRoaXMucGFyc2VTeW1ib2xzKHgsIHNyY0ZpbGUpKS5wb3AoKSB8fCBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3ltYm9sRGVwc1JhdyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICBtdWx0aUxpbmU/OiBib29sZWFuXG4gICAgKTogQXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPiB7XG4gICAgICAgIHJldHVybiBwcm9wcy5maWx0ZXIobm9kZSA9PiBub2RlLm5hbWUudGV4dCA9PT0gdHlwZSk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0IHtcbiAgICBucz86IGFueTtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZmlsZT86IHN0cmluZztcbiAgICB0eXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1zaW1wbGUtYXN0JztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuXG5pbXBvcnQgeyBzdHJpcEJvbSwgaGFzQm9tIH0gZnJvbSAnLi91dGlscy91dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbk5hbWVXaXRob3V0U3BhY2VBbmRUb0xvd2VyQ2FzZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvIC9nLCAnLScpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0SW5kZW50KHN0ciwgY291bnQsIGluZGVudD8pOiBzdHJpbmcge1xuICAgIGxldCBzdHJpcEluZGVudCA9IChzdHI6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHN0ci5tYXRjaCgvXlsgXFx0XSooPz1cXFMpL2dtKTtcblxuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogdXNlIHNwcmVhZCBvcGVyYXRvciB3aGVuIHRhcmdldGluZyBOb2RlLmpzIDZcbiAgICAgICAgY29uc3QgaW5kZW50ID0gTWF0aC5taW4uYXBwbHkoTWF0aCwgbWF0Y2gubWFwKHggPT4geC5sZW5ndGgpKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoYF5bIFxcXFx0XXske2luZGVudH19YCwgJ2dtJyk7XG5cbiAgICAgICAgcmV0dXJuIGluZGVudCA+IDAgPyBzdHIucmVwbGFjZShyZSwgJycpIDogc3RyO1xuICAgIH07XG5cbiAgICBsZXQgcmVwZWF0aW5nID0gKG4sIHN0cikgPT4ge1xuICAgICAgICBzdHIgPSBzdHIgPT09IHVuZGVmaW5lZCA/ICcgJyA6IHN0cjtcblxuICAgICAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxcYGlucHV0XFxgIHRvIGJlIGEgXFxgc3RyaW5nXFxgLCBnb3QgXFxgJHt0eXBlb2Ygc3RyfVxcYGApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG4gPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcXGBjb3VudFxcYCB0byBiZSBhIHBvc2l0aXZlIGZpbml0ZSBudW1iZXIsIGdvdCBcXGAke259XFxgYCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0ID0gJyc7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKG4gJiAxKSB7XG4gICAgICAgICAgICAgICAgcmV0ICs9IHN0cjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RyICs9IHN0cjtcbiAgICAgICAgfSB3aGlsZSAoKG4gPj49IDEpKTtcblxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH07XG5cbiAgICBsZXQgaW5kZW50U3RyaW5nID0gKHN0ciwgY291bnQsIGluZGVudCkgPT4ge1xuICAgICAgICBpbmRlbnQgPSBpbmRlbnQgPT09IHVuZGVmaW5lZCA/ICcgJyA6IGluZGVudDtcbiAgICAgICAgY291bnQgPSBjb3VudCA9PT0gdW5kZWZpbmVkID8gMSA6IGNvdW50O1xuXG4gICAgICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgaW5wdXRcXGAgdG8gYmUgYSBcXGBzdHJpbmdcXGAsIGdvdCBcXGAke3R5cGVvZiBzdHJ9XFxgYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvdW50ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgY291bnRcXGAgdG8gYmUgYSBcXGBudW1iZXJcXGAsIGdvdCBcXGAke3R5cGVvZiBjb3VudH1cXGBgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5kZW50ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgaW5kZW50XFxgIHRvIGJlIGEgXFxgc3RyaW5nXFxgLCBnb3QgXFxgJHt0eXBlb2YgaW5kZW50fVxcYGApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5kZW50ID0gY291bnQgPiAxID8gcmVwZWF0aW5nKGNvdW50LCBpbmRlbnQpIDogaW5kZW50O1xuXG4gICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvXig/IVxccyokKS9nbSwgaW5kZW50KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGluZGVudFN0cmluZyhzdHJpcEluZGVudChzdHIpLCBjb3VudCB8fCAwLCBpbmRlbnQpO1xufVxuXG4vLyBDcmVhdGUgYSBjb21waWxlckhvc3Qgb2JqZWN0IHRvIGFsbG93IHRoZSBjb21waWxlciB0byByZWFkIGFuZCB3cml0ZSBmaWxlc1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVySG9zdCh0cmFuc3BpbGVPcHRpb25zOiBhbnkpOiB0cy5Db21waWxlckhvc3Qge1xuICAgIGNvbnN0IGlucHV0RmlsZU5hbWUgPVxuICAgICAgICB0cmFuc3BpbGVPcHRpb25zLmZpbGVOYW1lIHx8ICh0cmFuc3BpbGVPcHRpb25zLmpzeCA/ICdtb2R1bGUudHN4JyA6ICdtb2R1bGUudHMnKTtcblxuICAgIGNvbnN0IHRvUmV0dXJuOiB0cy5Db21waWxlckhvc3QgPSB7XG4gICAgICAgIGdldFNvdXJjZUZpbGU6IChmaWxlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy50cycpICE9PSAtMSB8fCBmaWxlTmFtZS5sYXN0SW5kZXhPZignLmpzJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lID09PSAnbGliLmQudHMnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZS5zdWJzdHIoLTUpID09PSAnLmQudHMnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZShmaWxlTmFtZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gcGF0aC5qb2luKHRyYW5zcGlsZU9wdGlvbnMudHNjb25maWdEaXJlY3RvcnksIGZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBsaWJTb3VyY2UgPSAnJztcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxpYlNvdXJjZSA9IGZzLnJlYWRGaWxlU3luYyhmaWxlTmFtZSkudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQm9tKGxpYlNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpYlNvdXJjZSA9IHN0cmlwQm9tKGxpYlNvdXJjZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhlLCBmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRzLmNyZWF0ZVNvdXJjZUZpbGUoZmlsZU5hbWUsIGxpYlNvdXJjZSwgdHJhbnNwaWxlT3B0aW9ucy50YXJnZXQsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdyaXRlRmlsZTogKG5hbWUsIHRleHQpID0+IHt9LFxuICAgICAgICBnZXREZWZhdWx0TGliRmlsZU5hbWU6ICgpID0+ICdsaWIuZC50cycsXG4gICAgICAgIHVzZUNhc2VTZW5zaXRpdmVGaWxlTmFtZXM6ICgpID0+IGZhbHNlLFxuICAgICAgICBnZXRDYW5vbmljYWxGaWxlTmFtZTogZmlsZU5hbWUgPT4gZmlsZU5hbWUsXG4gICAgICAgIGdldEN1cnJlbnREaXJlY3Rvcnk6ICgpID0+ICcnLFxuICAgICAgICBnZXROZXdMaW5lOiAoKSA9PiAnXFxuJyxcbiAgICAgICAgZmlsZUV4aXN0czogKGZpbGVOYW1lKTogYm9vbGVhbiA9PiBmaWxlTmFtZSA9PT0gaW5wdXRGaWxlTmFtZSxcbiAgICAgICAgcmVhZEZpbGU6ICgpID0+ICcnLFxuICAgICAgICBkaXJlY3RvcnlFeGlzdHM6ICgpID0+IHRydWUsXG4gICAgICAgIGdldERpcmVjdG9yaWVzOiAoKSA9PiBbXVxuICAgIH07XG5cbiAgICByZXR1cm4gdG9SZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTWFpblNvdXJjZUZvbGRlcihmaWxlczogc3RyaW5nW10pIHtcbiAgICBsZXQgbWFpbkZvbGRlciA9ICcnO1xuICAgIGxldCBtYWluRm9sZGVyQ291bnQgPSAwO1xuICAgIGxldCByYXdGb2xkZXJzID0gZmlsZXMubWFwKGZpbGVwYXRoID0+IHtcbiAgICAgICAgbGV0IHNob3J0UGF0aCA9IGZpbGVwYXRoLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLCAnJyk7XG4gICAgICAgIHJldHVybiBwYXRoLmRpcm5hbWUoc2hvcnRQYXRoKTtcbiAgICB9KTtcbiAgICBsZXQgZm9sZGVycyA9IHt9O1xuICAgIHJhd0ZvbGRlcnMgPSBfLnVuaXEocmF3Rm9sZGVycyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0ZvbGRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHNlcCA9IHJhd0ZvbGRlcnNbaV0uc3BsaXQocGF0aC5zZXApO1xuICAgICAgICBzZXAubWFwKGZvbGRlciA9PiB7XG4gICAgICAgICAgICBpZiAoZm9sZGVyc1tmb2xkZXJdKSB7XG4gICAgICAgICAgICAgICAgZm9sZGVyc1tmb2xkZXJdICs9IDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvbGRlcnNbZm9sZGVyXSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmb3IgKGxldCBmIGluIGZvbGRlcnMpIHtcbiAgICAgICAgaWYgKGZvbGRlcnNbZl0gPiBtYWluRm9sZGVyQ291bnQpIHtcbiAgICAgICAgICAgIG1haW5Gb2xkZXJDb3VudCA9IGZvbGRlcnNbZl07XG4gICAgICAgICAgICBtYWluRm9sZGVyID0gZjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFpbkZvbGRlcjtcbn1cbiIsImltcG9ydCB7IHRzIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5pbXBvcnQgeyBTeW1ib2xIZWxwZXIsIElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0IH0gZnJvbSAnLi9zeW1ib2wtaGVscGVyJztcbmltcG9ydCB7IGRldGVjdEluZGVudCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBJRGVwLCBEZXBzIH0gZnJvbSAnLi4vLi4vZGVwZW5kZW5jaWVzLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ2xhc3NIZWxwZXIgfSBmcm9tICcuL2NsYXNzLWhlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRIZWxwZXIge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGNsYXNzSGVscGVyOiBDbGFzc0hlbHBlcixcbiAgICAgICAgcHJpdmF0ZSBzeW1ib2xIZWxwZXI6IFN5bWJvbEhlbHBlciA9IG5ldyBTeW1ib2xIZWxwZXIoKVxuICAgICkge31cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRDaGFuZ2VEZXRlY3Rpb24oXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2NoYW5nZURldGVjdGlvbicsIHNyY0ZpbGUpLnBvcCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRFbmNhcHN1bGF0aW9uKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnZW5jYXBzdWxhdGlvbicsIHNyY0ZpbGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRQdXJlKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdwdXJlJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudE5hbWUoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ25hbWUnLCBzcmNGaWxlKS5wb3AoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50RXhwb3J0QXMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2V4cG9ydEFzJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudEhvc3QoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT5cbiAgICApOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3ltYm9sRGVwc09iamVjdChwcm9wcywgJ2hvc3QnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50SW5wdXRzTWV0YWRhdGEoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdpbnB1dHMnLCBzcmNGaWxlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50VGVtcGxhdGUoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICBsZXQgdCA9IHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICd0ZW1wbGF0ZScsIHNyY0ZpbGUsIHRydWUpLnBvcCgpO1xuICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgdCA9IGRldGVjdEluZGVudCh0LCAwKTtcbiAgICAgICAgICAgIHQgPSB0LnJlcGxhY2UoL1xcbi8sICcnKTtcbiAgICAgICAgICAgIHQgPSB0LnJlcGxhY2UoLyArJC9nbSwgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRTdHlsZVVybHMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhbml0aXplVXJscyh0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnc3R5bGVVcmxzJywgc3JjRmlsZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRTdHlsZXMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnc3R5bGVzJywgc3JjRmlsZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudE1vZHVsZUlkKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdtb2R1bGVJZCcsIHNyY0ZpbGUpLnBvcCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRPdXRwdXRzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ291dHB1dHMnLCBzcmNGaWxlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50UHJvdmlkZXJzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8SVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyXG4gICAgICAgICAgICAuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3Byb3ZpZGVycycsIHNyY0ZpbGUpXG4gICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRFbnRyeUNvbXBvbmVudHMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXJcbiAgICAgICAgICAgIC5nZXRTeW1ib2xEZXBzKHByb3BzLCAnZW50cnlDb21wb25lbnRzJywgc3JjRmlsZSlcbiAgICAgICAgICAgIC5tYXAobmFtZSA9PiB0aGlzLnN5bWJvbEhlbHBlci5wYXJzZURlZXBJbmRlbnRpZmllcihuYW1lKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFZpZXdQcm92aWRlcnMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXJcbiAgICAgICAgICAgIC5nZXRTeW1ib2xEZXBzKHByb3BzLCAndmlld1Byb3ZpZGVycycsIHNyY0ZpbGUpXG4gICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRUZW1wbGF0ZVVybChcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3RlbXBsYXRlVXJsJywgc3JjRmlsZSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRFeGFtcGxlVXJscyh0ZXh0OiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IGV4YW1wbGVVcmxzTWF0Y2hlcyA9IHRleHQubWF0Y2goLzxleGFtcGxlLXVybD4oLio/KTxcXC9leGFtcGxlLXVybD4vZyk7XG4gICAgICAgIGxldCBleGFtcGxlVXJscyA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGV4YW1wbGVVcmxzTWF0Y2hlcyAmJiBleGFtcGxlVXJsc01hdGNoZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBleGFtcGxlVXJscyA9IGV4YW1wbGVVcmxzTWF0Y2hlcy5tYXAoZnVuY3Rpb24odmFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbC5yZXBsYWNlKC88XFwvP2V4YW1wbGUtdXJsPi9nLCAnJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhhbXBsZVVybHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFByZXNlcnZlV2hpdGVzcGFjZXMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3ByZXNlcnZlV2hpdGVzcGFjZXMnLCBzcmNGaWxlKS5wb3AoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50U2VsZWN0b3IoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3NlbGVjdG9yJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZVByb3BlcnRpZXMobm9kZTogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+KTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIGxldCBvYmogPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgICBsZXQgcHJvcGVydGllcyA9IG5vZGUuaW5pdGlhbGl6ZXIucHJvcGVydGllcyB8fCBbXTtcbiAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgb2JqLnNldChwcm9wLm5hbWUudGV4dCwgcHJvcC5pbml0aWFsaXplci50ZXh0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN5bWJvbERlcHNPYmplY3QoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHR5cGU6IHN0cmluZyxcbiAgICAgICAgbXVsdGlMaW5lPzogYm9vbGVhblxuICAgICk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBsZXQgaSA9IDAsXG4gICAgICAgICAgICBsZW4gPSBwcm9wcy5sZW5ndGgsXG4gICAgICAgICAgICBmaWx0ZXJlZFByb3BzID0gW107XG5cbiAgICAgICAgZm9yIChpOyBpPGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocHJvcHNbaV0ubmFtZSAmJiBwcm9wc1tpXS5uYW1lLnRleHQgPT09IHR5cGUpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZFByb3BzLnB1c2gocHJvcHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZFByb3BzLm1hcCh4ID0+IHRoaXMucGFyc2VQcm9wZXJ0aWVzKHgpKS5wb3AoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50SU8oXG4gICAgICAgIGZpbGVuYW1lOiBzdHJpbmcsXG4gICAgICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgICAgIG5vZGU6IHRzLk5vZGUsXG4gICAgICAgIGZpbGVCb2R5XG4gICAgKTogYW55IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IHJlZHVjZWRTb3VyY2UgPSBmaWxlQm9keSA/IGZpbGVCb2R5LnN0YXRlbWVudHMgOiBzb3VyY2VGaWxlLnN0YXRlbWVudHM7XG4gICAgICAgIGxldCByZXMgPSByZWR1Y2VkU291cmNlLnJlZHVjZSgoZGlyZWN0aXZlLCBzdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0cy5pc0NsYXNzRGVjbGFyYXRpb24oc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQucG9zID09PSBub2RlLnBvcyAmJiBzdGF0ZW1lbnQuZW5kID09PSBub2RlLmVuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NIZWxwZXIudmlzaXRDbGFzc0RlY2xhcmF0aW9uKGZpbGVuYW1lLCBzdGF0ZW1lbnQsIHNvdXJjZUZpbGUpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc1swXSB8fCB7fTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNhbml0aXplVXJscyh1cmxzOiBBcnJheTxzdHJpbmc+KTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB1cmxzLm1hcCh1cmwgPT4gdXJsLnJlcGxhY2UoJy4vJywgJycpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRDYWNoZSB7XG4gICAgcHJpdmF0ZSBjYWNoZTogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcblxuICAgIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IGZpbmQsIGNvbmNhdCwgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UgfSBmcm9tICcuLi9hcHAvaW50ZXJmYWNlcy9jb25maWd1cmF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBjbGVhbkxpZmVjeWNsZUhvb2tzRnJvbU1ldGhvZHMgfSBmcm9tICcuJztcblxuZXhwb3J0IGNsYXNzIEV4dGVuZHNNZXJnZXIge1xuICAgIHByaXZhdGUgY29tcG9uZW50cztcbiAgICBwcml2YXRlIGNsYXNzZXM7XG5cbiAgICBwdWJsaWMgbWVyZ2UoZGVwcywgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbkludGVyZmFjZSkge1xuICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSBkZXBzLmNvbXBvbmVudHM7XG4gICAgICAgIHRoaXMuY2xhc3NlcyA9IGRlcHMuY2xhc3NlcztcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMuZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgbGV0IGV4dDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LmV4dGVuZHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZXh0ID0gdGhpcy5maW5kSW5EZXBlbmRlbmNpZXMoY29tcG9uZW50LmV4dGVuZHMpO1xuICAgICAgICAgICAgICAgIGlmIChleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRnJvbSBjbGFzcyB0byBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleHQubWV0aG9kcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZXh0Lm1ldGhvZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld01ldGhvZHMgPSBjbG9uZURlZXAoZXh0Lm1ldGhvZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWV0aG9kcyA9IHRoaXMubWFya0luaGVyaXRhbmNlKG5ld01ldGhvZHMsIGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5tZXRob2RzQ2xhc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Lm1ldGhvZHNDbGFzcyA9IFsuLi5jb21wb25lbnQubWV0aG9kc0NsYXNzLCAuLi5uZXdNZXRob2RzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4dC5wcm9wZXJ0aWVzICE9PSAndW5kZWZpbmVkJyAmJiBleHQucHJvcGVydGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UHJvcGVydGllcyA9IGNsb25lRGVlcChleHQucHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0aWVzID0gdGhpcy5tYXJrSW5oZXJpdGFuY2UobmV3UHJvcGVydGllcywgZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnByb3BlcnRpZXNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucHJvcGVydGllc0NsYXNzID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jb21wb25lbnQucHJvcGVydGllc0NsYXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5uZXdQcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBGcm9tIGNvbXBvbmVudCB0byBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleHQuaW5wdXRzQ2xhc3MgIT09ICd1bmRlZmluZWQnICYmIGV4dC5pbnB1dHNDbGFzcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3SW5wdXRzID0gY2xvbmVEZWVwKGV4dC5pbnB1dHNDbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdJbnB1dHMgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdJbnB1dHMsIGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5pbnB1dHNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5wdXRzQ2xhc3MgPSBbLi4uY29tcG9uZW50LmlucHV0c0NsYXNzLCAuLi5uZXdJbnB1dHNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXh0Lm91dHB1dHNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZXh0Lm91dHB1dHNDbGFzcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3T3V0cHV0cyA9IGNsb25lRGVlcChleHQub3V0cHV0c0NsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld091dHB1dHMgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdPdXRwdXRzLCBleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQub3V0cHV0c0NsYXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5vdXRwdXRzQ2xhc3MgPSBbLi4uY29tcG9uZW50Lm91dHB1dHNDbGFzcywgLi4ubmV3T3V0cHV0c107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleHQubWV0aG9kc0NsYXNzICE9PSAndW5kZWZpbmVkJyAmJiBleHQubWV0aG9kc0NsYXNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdNZXRob2RzID0gY2xvbmVEZWVwKGV4dC5tZXRob2RzQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWV0aG9kcyA9IHRoaXMubWFya0luaGVyaXRhbmNlKG5ld01ldGhvZHMsIGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5tZXRob2RzQ2xhc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Lm1ldGhvZHNDbGFzcyA9IFsuLi5jb21wb25lbnQubWV0aG9kc0NsYXNzLCAuLi5uZXdNZXRob2RzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZXh0LnByb3BlcnRpZXNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dC5wcm9wZXJ0aWVzQ2xhc3MubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdQcm9wZXJ0aWVzID0gY2xvbmVEZWVwKGV4dC5wcm9wZXJ0aWVzQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydGllcyA9IHRoaXMubWFya0luaGVyaXRhbmNlKG5ld1Byb3BlcnRpZXMsIGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5wcm9wZXJ0aWVzQ2xhc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnByb3BlcnRpZXNDbGFzcyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY29tcG9uZW50LnByb3BlcnRpZXNDbGFzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubmV3UHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleHQuaG9zdEJpbmRpbmdzICE9PSAndW5kZWZpbmVkJyAmJiBleHQuaG9zdEJpbmRpbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdIb3N0QmluZGluZ3MgPSBjbG9uZURlZXAoZXh0Lmhvc3RCaW5kaW5ncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdIb3N0QmluZGluZ3MgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdIb3N0QmluZGluZ3MsIGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5ob3N0QmluZGluZ3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Lmhvc3RCaW5kaW5ncyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY29tcG9uZW50Lmhvc3RCaW5kaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubmV3SG9zdEJpbmRpbmdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4dC5ob3N0TGlzdGVuZXJzICE9PSAndW5kZWZpbmVkJyAmJiBleHQuaG9zdExpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3SG9zdExpc3RlbmVycyA9IGNsb25lRGVlcChleHQuaG9zdExpc3RlbmVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdIb3N0TGlzdGVuZXJzID0gdGhpcy5tYXJrSW5oZXJpdGFuY2UobmV3SG9zdExpc3RlbmVycywgZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50Lmhvc3RMaXN0ZW5lcnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Lmhvc3RMaXN0ZW5lcnMgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmNvbXBvbmVudC5ob3N0TGlzdGVuZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5uZXdIb3N0TGlzdGVuZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5tZXRob2RzQ2xhc3MgPSBjbGVhbkxpZmVjeWNsZUhvb2tzRnJvbU1ldGhvZHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Lm1ldGhvZHNDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jbGFzc2VzLmZvckVhY2goY2xhID0+IHtcbiAgICAgICAgICAgIGxldCBleHQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNsYS5leHRlbmRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGV4dCA9IHRoaXMuZmluZEluRGVwZW5kZW5jaWVzKGNsYS5leHRlbmRzKTtcbiAgICAgICAgICAgICAgICBpZiAoZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZyb20gY2xhc3MgdG8gY2xhc3NcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleHQubWV0aG9kcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZXh0Lm1ldGhvZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld01ldGhvZHMgPSBjbG9uZURlZXAoZXh0Lm1ldGhvZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWV0aG9kcyA9IHRoaXMubWFya0luaGVyaXRhbmNlKG5ld01ldGhvZHMsIGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNsYS5tZXRob2RzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYS5tZXRob2RzID0gWy4uLmNsYS5tZXRob2RzLCAuLi5uZXdNZXRob2RzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4dC5wcm9wZXJ0aWVzICE9PSAndW5kZWZpbmVkJyAmJiBleHQucHJvcGVydGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UHJvcGVydGllcyA9IGNsb25lRGVlcChleHQucHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0aWVzID0gdGhpcy5tYXJrSW5oZXJpdGFuY2UobmV3UHJvcGVydGllcywgZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2xhLnByb3BlcnRpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhLnByb3BlcnRpZXMgPSBbLi4uY2xhLnByb3BlcnRpZXMsIC4uLm5ld1Byb3BlcnRpZXNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGVwcztcbiAgICB9XG5cbiAgICBwcml2YXRlIG1hcmtJbmhlcml0YW5jZShkYXRhLCBvcmlnaW5hbG91cmNlKSB7XG4gICAgICAgIHJldHVybiBkYXRhLm1hcChlbCA9PiB7XG4gICAgICAgICAgICBsZXQgbmV3RWxlbWVudCA9IGVsO1xuICAgICAgICAgICAgbmV3RWxlbWVudC5pbmhlcml0YW5jZSA9IHtcbiAgICAgICAgICAgICAgICBmaWxlOiBvcmlnaW5hbG91cmNlLm5hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gbmV3RWxlbWVudDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kSW5EZXBlbmRlbmNpZXMobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBtZXJnZWREYXRhID0gY29uY2F0KFtdLCB0aGlzLmNvbXBvbmVudHMsIHRoaXMuY2xhc3Nlcyk7XG4gICAgICAgIGxldCByZXN1bHQgPSBmaW5kKG1lcmdlZERhdGEsIHsgbmFtZTogbmFtZSB9IGFzIGFueSk7XG4gICAgICAgIHJldHVybiByZXN1bHQgfHwgZmFsc2U7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1zaW1wbGUtYXN0JztcblxuaW1wb3J0IHsgQ2xhc3NIZWxwZXIgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL2NsYXNzLWhlbHBlcic7XG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IHsgQ29udHJvbGxlckhlbHBlciB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2hlbHBlcnMvY29udHJvbGxlci1oZWxwZXInO1xuXG5pbXBvcnQgeyBFeHRlbmRzTWVyZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvZXh0ZW5kcy1tZXJnZXIudXRpbCc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb25maWd1cmF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSb3V0ZXJQYXJzZXJVdGlsIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgY29tcGlsZXJIb3N0IH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzJztcblxuZXhwb3J0IGNsYXNzIEZyYW1ld29ya0RlcGVuZGVuY2llcyB7XG4gICAgcHJpdmF0ZSBmaWxlczogc3RyaW5nW107XG4gICAgcHJpdmF0ZSBwcm9ncmFtOiB0cy5Qcm9ncmFtO1xuICAgIHByaXZhdGUgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyO1xuICAgIHByaXZhdGUgY2xhc3NIZWxwZXI6IENsYXNzSGVscGVyO1xuICAgIHB1YmxpYyBjb21wb25lbnRIZWxwZXI6IENvbXBvbmVudEhlbHBlcjtcbiAgICBwdWJsaWMgY29udHJvbGxlckhlbHBlcjogQ29udHJvbGxlckhlbHBlcjtcbiAgICBwdWJsaWMgZXh0ZW5kc01lcmdlcjogRXh0ZW5kc01lcmdlcjtcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbkludGVyZmFjZTtcbiAgICBwdWJsaWMgcm91dGVyUGFyc2VyO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGZpbGVzOiBzdHJpbmdbXSxcbiAgICAgICAgb3B0aW9uczogYW55LFxuICAgICAgICBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uSW50ZXJmYWNlLFxuICAgICAgICByb3V0ZXJQYXJzZXI6IFJvdXRlclBhcnNlclV0aWxcbiAgICApIHtcbiAgICAgICAgdGhpcy5maWxlcyA9IGZpbGVzO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgICAgICB0aGlzLnJvdXRlclBhcnNlciA9IHJvdXRlclBhcnNlcjtcblxuICAgICAgICBjb25zdCB0cmFuc3BpbGVPcHRpb25zID0ge1xuICAgICAgICAgICAgdGFyZ2V0OiB0cy5TY3JpcHRUYXJnZXQuRVM1LFxuICAgICAgICAgICAgbW9kdWxlOiB0cy5Nb2R1bGVLaW5kLkNvbW1vbkpTLFxuICAgICAgICAgICAgdHNjb25maWdEaXJlY3Rvcnk6IG9wdGlvbnMudHNjb25maWdEaXJlY3RvcnksXG4gICAgICAgICAgICBhbGxvd0pzOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IHRzLmNyZWF0ZVByb2dyYW0oXG4gICAgICAgICAgICB0aGlzLmZpbGVzLFxuICAgICAgICAgICAgdHJhbnNwaWxlT3B0aW9ucyxcbiAgICAgICAgICAgIGNvbXBpbGVySG9zdCh0cmFuc3BpbGVPcHRpb25zKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnR5cGVDaGVja2VyID0gdGhpcy5wcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gICAgICAgIHRoaXMuY2xhc3NIZWxwZXIgPSBuZXcgQ2xhc3NIZWxwZXIodGhpcy50eXBlQ2hlY2tlciwgdGhpcy5jb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRIZWxwZXIgPSBuZXcgQ29tcG9uZW50SGVscGVyKHRoaXMuY2xhc3NIZWxwZXIpO1xuICAgICAgICB0aGlzLmV4dGVuZHNNZXJnZXIgPSBuZXcgRXh0ZW5kc01lcmdlcigpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IHRzLCBTeW50YXhLaW5kIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5cbmV4cG9ydCBjbGFzcyBDb2RlR2VuZXJhdG9yIHtcbiAgICBwdWJsaWMgZ2VuZXJhdGUobm9kZTogdHMuTm9kZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0QW5kUmVjb2duaXplKG5vZGUsIFtdKS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0QW5kUmVjb2duaXplKG5vZGU6IHRzLk5vZGUsIGNvZGU6IEFycmF5PHN0cmluZz4sIGRlcHRoID0gMCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICB0aGlzLnJlY29nbml6ZShub2RlLCBjb2RlKTtcbiAgICAgICAgbm9kZS5nZXRDaGlsZHJlbigpLmZvckVhY2goYyA9PiB0aGlzLnZpc2l0QW5kUmVjb2duaXplKGMsIGNvZGUsIGRlcHRoICsgMSkpO1xuICAgICAgICByZXR1cm4gY29kZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlY29nbml6ZShub2RlOiB0cy5Ob2RlLCBjb2RlOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIGNvbnN0IGNvbnZlcnNpb24gPSBUc0tpbmRDb252ZXJzaW9uLmZpbmQoeCA9PiB4LmtpbmRzLnNvbWUoeiA9PiB6ID09PSBub2RlLmtpbmQpKTtcblxuICAgICAgICBpZiAoY29udmVyc2lvbikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVyc2lvbi5vdXRwdXQobm9kZSk7XG4gICAgICAgICAgICByZXN1bHQuZm9yRWFjaCh0ZXh0ID0+IHRoaXMuZ2VuKHRleHQsIGNvZGUpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuKHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNvZGU6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRva2VuID09PSAnXFxuJykge1xuICAgICAgICAgICAgY29kZS5wdXNoKCcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvZGUucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFRzS2luZHNUb1RleHQge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBvdXRwdXQ6IChub2RlOiB0cy5Ob2RlKSA9PiBBcnJheTxzdHJpbmc+LCBwdWJsaWMga2luZHM6IEFycmF5PFN5bnRheEtpbmQ+KSB7fVxufVxuXG5jb25zdCBUc0tpbmRDb252ZXJzaW9uOiBBcnJheTxUc0tpbmRzVG9UZXh0PiA9IFtcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnXCInLCBub2RlLnRleHQsICdcIiddLCBbXG4gICAgICAgIFN5bnRheEtpbmQuRmlyc3RMaXRlcmFsVG9rZW4sXG4gICAgICAgIFN5bnRheEtpbmQuSWRlbnRpZmllclxuICAgIF0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWydcIicsIG5vZGUudGV4dCwgJ1wiJ10sIFtTeW50YXhLaW5kLlN0cmluZ0xpdGVyYWxdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFtdLCBbU3ludGF4S2luZC5BcnJheUxpdGVyYWxFeHByZXNzaW9uXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ2ltcG9ydCcsICcgJ10sIFtTeW50YXhLaW5kLkltcG9ydEtleXdvcmRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnZnJvbScsICcgJ10sIFtTeW50YXhLaW5kLkZyb21LZXl3b3JkXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ1xcbicsICdleHBvcnQnLCAnICddLCBbU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ2NsYXNzJywgJyAnXSwgW1N5bnRheEtpbmQuQ2xhc3NLZXl3b3JkXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ3RoaXMnXSwgW1N5bnRheEtpbmQuVGhpc0tleXdvcmRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnY29uc3RydWN0b3InXSwgW1N5bnRheEtpbmQuQ29uc3RydWN0b3JLZXl3b3JkXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ2ZhbHNlJ10sIFtTeW50YXhLaW5kLkZhbHNlS2V5d29yZF0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWyd0cnVlJ10sIFtTeW50YXhLaW5kLlRydWVLZXl3b3JkXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ251bGwnXSwgW1N5bnRheEtpbmQuTnVsbEtleXdvcmRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFtdLCBbU3ludGF4S2luZC5BdFRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJysnXSwgW1N5bnRheEtpbmQuUGx1c1Rva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJyA9PiAnXSwgW1N5bnRheEtpbmQuRXF1YWxzR3JlYXRlclRoYW5Ub2tlbl0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWycoJ10sIFtTeW50YXhLaW5kLk9wZW5QYXJlblRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ3snLCAnICddLCBbXG4gICAgICAgIFN5bnRheEtpbmQuSW1wb3J0Q2xhdXNlLFxuICAgICAgICBTeW50YXhLaW5kLk9iamVjdExpdGVyYWxFeHByZXNzaW9uXG4gICAgXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ3snLCAnXFxuJ10sIFtTeW50YXhLaW5kLkJsb2NrXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ30nXSwgW1N5bnRheEtpbmQuQ2xvc2VCcmFjZVRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJyknXSwgW1N5bnRheEtpbmQuQ2xvc2VQYXJlblRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ1snXSwgW1N5bnRheEtpbmQuT3BlbkJyYWNrZXRUb2tlbl0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWyddJ10sIFtTeW50YXhLaW5kLkNsb3NlQnJhY2tldFRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJzsnLCAnXFxuJ10sIFtTeW50YXhLaW5kLlNlbWljb2xvblRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJywnLCAnICddLCBbU3ludGF4S2luZC5Db21tYVRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJyAnLCAnOicsICcgJ10sIFtTeW50YXhLaW5kLkNvbG9uVG9rZW5dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnLiddLCBbU3ludGF4S2luZC5Eb3RUb2tlbl0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gW10sIFtTeW50YXhLaW5kLkRvU3RhdGVtZW50XSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbXSwgW1N5bnRheEtpbmQuRGVjb3JhdG9yXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJyA9ICddLCBbU3ludGF4S2luZC5GaXJzdEFzc2lnbm1lbnRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnICddLCBbU3ludGF4S2luZC5GaXJzdFB1bmN0dWF0aW9uXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ3ByaXZhdGUnLCAnICddLCBbU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZF0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWydwdWJsaWMnLCAnICddLCBbU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkXSlcbl07XG4iLCJpbXBvcnQgeyBJRGVwIH0gZnJvbSAnLi4vZGVwZW5kZW5jaWVzLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29tcG9uZW50SGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMnO1xuXG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcblxuZXhwb3J0IGNsYXNzIERpcmVjdGl2ZURlcEZhY3Rvcnkge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGhlbHBlcjogQ29tcG9uZW50SGVscGVyLFxuICAgICAgICBwcml2YXRlIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGUoZmlsZTogYW55LCBzcmNGaWxlOiBhbnksIG5hbWU6IGFueSwgcHJvcHM6IGFueSwgSU86IGFueSk6IElEaXJlY3RpdmVEZXAge1xuICAgICAgICBsZXQgc291cmNlQ29kZSA9IHNyY0ZpbGUuZ2V0VGV4dCgpO1xuICAgICAgICBsZXQgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdtZDUnKS51cGRhdGUoc291cmNlQ29kZSkuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgbGV0IGRpcmVjdGl2ZURlcHM6IElEaXJlY3RpdmVEZXAgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgaWQ6ICdkaXJlY3RpdmUtJyArIG5hbWUgKyAnLScgKyBoYXNoLFxuICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgIHR5cGU6ICdkaXJlY3RpdmUnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IElPLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgc291cmNlQ29kZTogc3JjRmlsZS5nZXRUZXh0KCksXG4gICAgICAgICAgICBzZWxlY3RvcjogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50U2VsZWN0b3IocHJvcHMpLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRQcm92aWRlcnMocHJvcHMpLFxuXG4gICAgICAgICAgICBpbnB1dHNDbGFzczogSU8uaW5wdXRzLFxuICAgICAgICAgICAgb3V0cHV0c0NsYXNzOiBJTy5vdXRwdXRzLFxuXG4gICAgICAgICAgICBob3N0QmluZGluZ3M6IElPLmhvc3RCaW5kaW5ncyxcbiAgICAgICAgICAgIGhvc3RMaXN0ZW5lcnM6IElPLmhvc3RMaXN0ZW5lcnMsXG5cbiAgICAgICAgICAgIHByb3BlcnRpZXNDbGFzczogSU8ucHJvcGVydGllcyxcbiAgICAgICAgICAgIG1ldGhvZHNDbGFzczogSU8ubWV0aG9kcyxcbiAgICAgICAgICAgIGV4YW1wbGVVcmxzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRFeGFtcGxlVXJscyhzcmNGaWxlLmdldFRleHQoKSlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MpIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZURlcHMubWV0aG9kc0NsYXNzID0gY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzKGRpcmVjdGl2ZURlcHMubWV0aG9kc0NsYXNzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uanNkb2N0YWdzICYmIElPLmpzZG9jdGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkaXJlY3RpdmVEZXBzLmpzZG9jdGFncyA9IElPLmpzZG9jdGFnc1swXS50YWdzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5pbXBsZW1lbnRzICYmIElPLmltcGxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGlyZWN0aXZlRGVwcy5pbXBsZW1lbnRzID0gSU8uaW1wbGVtZW50cztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZURlcHMuY29uc3RydWN0b3JPYmogPSBJTy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uYWNjZXNzb3JzKSB7XG4gICAgICAgICAgICBkaXJlY3RpdmVEZXBzLmFjY2Vzc29ycyA9IElPLmFjY2Vzc29ycztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlyZWN0aXZlRGVwcztcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURpcmVjdGl2ZURlcCBleHRlbmRzIElEZXAge1xuICAgIGZpbGU6IGFueTtcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHNvdXJjZUNvZGU6IHN0cmluZztcblxuICAgIHNlbGVjdG9yOiBzdHJpbmc7XG4gICAgcHJvdmlkZXJzOiBBcnJheTxhbnk+O1xuXG4gICAgaW5wdXRzQ2xhc3M6IGFueTtcbiAgICBvdXRwdXRzQ2xhc3M6IGFueTtcblxuICAgIGhvc3RCaW5kaW5nczogYW55O1xuICAgIGhvc3RMaXN0ZW5lcnM6IGFueTtcblxuICAgIHByb3BlcnRpZXNDbGFzczogYW55O1xuICAgIG1ldGhvZHNDbGFzczogYW55O1xuICAgIGV4YW1wbGVVcmxzOiBBcnJheTxzdHJpbmc+O1xuXG4gICAgY29uc3RydWN0b3JPYmo/OiBPYmplY3Q7XG4gICAganNkb2N0YWdzPzogQXJyYXk8c3RyaW5nPjtcbiAgICBpbXBsZW1lbnRzPzogYW55O1xuICAgIGFjY2Vzc29ycz86IE9iamVjdDtcbn1cbiIsImltcG9ydCB7IElEZXAgfSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNb2R1bGVIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvbW9kdWxlLWhlbHBlcic7XG5pbXBvcnQgeyB0cyB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuXG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcblxuZXhwb3J0IGNsYXNzIE1vZHVsZURlcEZhY3Rvcnkge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9kdWxlSGVscGVyOiBNb2R1bGVIZWxwZXIpIHt9XG5cbiAgICBwdWJsaWMgY3JlYXRlKFxuICAgICAgICBmaWxlOiBhbnksXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHJvcGVydGllczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBJTzogYW55XG4gICAgKTogSU1vZHVsZURlcCB7XG4gICAgICAgIGxldCBzb3VyY2VDb2RlID0gc3JjRmlsZS5nZXRUZXh0KCk7XG4gICAgICAgIGxldCBoYXNoID0gY3J5cHRvXG4gICAgICAgICAgICAuY3JlYXRlSGFzaCgnbWQ1JylcbiAgICAgICAgICAgIC51cGRhdGUoc291cmNlQ29kZSlcbiAgICAgICAgICAgIC5kaWdlc3QoJ2hleCcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGlkOiAnbW9kdWxlLScgKyBuYW1lICsgJy0nICsgaGFzaCxcbiAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICBuZ2lkOiB0aGlzLm1vZHVsZUhlbHBlci5nZXRNb2R1bGVJZChwcm9wZXJ0aWVzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHByb3ZpZGVyczogdGhpcy5tb2R1bGVIZWxwZXIuZ2V0TW9kdWxlUHJvdmlkZXJzKHByb3BlcnRpZXMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgZGVjbGFyYXRpb25zOiB0aGlzLm1vZHVsZUhlbHBlci5nZXRNb2R1bGVEZWNsYXJhdGlvbnMocHJvcGVydGllcywgc3JjRmlsZSksXG4gICAgICAgICAgICBjb250cm9sbGVyczogdGhpcy5tb2R1bGVIZWxwZXIuZ2V0TW9kdWxlQ29udHJvbGxlcnMocHJvcGVydGllcywgc3JjRmlsZSksXG4gICAgICAgICAgICBlbnRyeUNvbXBvbmVudHM6IHRoaXMubW9kdWxlSGVscGVyLmdldE1vZHVsZUVudHJ5Q29tcG9uZW50cyhwcm9wZXJ0aWVzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGltcG9ydHM6IHRoaXMubW9kdWxlSGVscGVyLmdldE1vZHVsZUltcG9ydHMocHJvcGVydGllcywgc3JjRmlsZSksXG4gICAgICAgICAgICBleHBvcnRzOiB0aGlzLm1vZHVsZUhlbHBlci5nZXRNb2R1bGVFeHBvcnRzKHByb3BlcnRpZXMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgc2NoZW1hczogdGhpcy5tb2R1bGVIZWxwZXIuZ2V0TW9kdWxlU2NoZW1hcyhwcm9wZXJ0aWVzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGJvb3RzdHJhcDogdGhpcy5tb2R1bGVIZWxwZXIuZ2V0TW9kdWxlQm9vdHN0cmFwKHByb3BlcnRpZXMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgdHlwZTogJ21vZHVsZScsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogSU8uZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBzb3VyY2VDb2RlOiBzcmNGaWxlLnRleHRcbiAgICAgICAgfSBhcyBJTW9kdWxlRGVwO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTW9kdWxlRGVwIGV4dGVuZHMgSURlcCB7XG4gICAgZmlsZTogYW55O1xuICAgIHByb3ZpZGVyczogQXJyYXk8YW55PjtcbiAgICBkZWNsYXJhdGlvbnM6IEFycmF5PGFueT47XG4gICAgY29udHJvbGxlcnM6IEFycmF5PGFueT47XG4gICAgZW50cnlDb21wb25lbnRzOiBBcnJheTxhbnk+O1xuICAgIGltcG9ydHM6IEFycmF5PGFueT47XG4gICAgZXhwb3J0czogQXJyYXk8YW55PjtcbiAgICBib290c3RyYXA6IGFueTtcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHNvdXJjZUNvZGU6IHN0cmluZztcbn1cbiIsImltcG9ydCB7IElEZXAgfSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvY29tcG9uZW50LWhlbHBlcic7XG5pbXBvcnQgeyBjbGVhbkxpZmVjeWNsZUhvb2tzRnJvbU1ldGhvZHMgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcy9jb25maWd1cmF0aW9uLmludGVyZmFjZSc7XG5cbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50RGVwRmFjdG9yeSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBoZWxwZXI6IENvbXBvbmVudEhlbHBlciwgcHJpdmF0ZSBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uSW50ZXJmYWNlKSB7fVxuXG4gICAgcHVibGljIGNyZWF0ZShmaWxlOiBhbnksIHNyY0ZpbGU6IGFueSwgbmFtZTogYW55LCBwcm9wczogYW55LCBJTzogYW55KTogSUNvbXBvbmVudERlcCB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHV0aWwuaW5zcGVjdChwcm9wcywgeyBzaG93SGlkZGVuOiB0cnVlLCBkZXB0aDogMTAgfSkpO1xuICAgICAgICBsZXQgc291cmNlQ29kZSA9IHNyY0ZpbGUuZ2V0VGV4dCgpO1xuICAgICAgICBsZXQgaGFzaCA9IGNyeXB0b1xuICAgICAgICAgICAgLmNyZWF0ZUhhc2goJ21kNScpXG4gICAgICAgICAgICAudXBkYXRlKHNvdXJjZUNvZGUpXG4gICAgICAgICAgICAuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgbGV0IGNvbXBvbmVudERlcDogSUNvbXBvbmVudERlcCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBpZDogJ2NvbXBvbmVudC0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgLy8gYW5pbWF0aW9ucz86IHN0cmluZ1tdOyAvLyBUT0RPXG4gICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IHRoaXMuaGVscGVyLmdldENvbXBvbmVudENoYW5nZURldGVjdGlvbihwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICBlbmNhcHN1bGF0aW9uOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRFbmNhcHN1bGF0aW9uKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGVudHJ5Q29tcG9uZW50czogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50RW50cnlDb21wb25lbnRzKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGV4cG9ydEFzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRFeHBvcnRBcyhwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICBob3N0OiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRIb3N0KHByb3BzKSxcbiAgICAgICAgICAgIGlucHV0czogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50SW5wdXRzTWV0YWRhdGEocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgLy8gaW50ZXJwb2xhdGlvbj86IHN0cmluZzsgLy8gVE9ETyB3YWl0aW5nIGRvYyBpbmZvc1xuICAgICAgICAgICAgbW9kdWxlSWQ6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudE1vZHVsZUlkKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIG91dHB1dHM6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudE91dHB1dHMocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRQcm92aWRlcnMocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgLy8gcXVlcmllcz86IERlcHNbXTsgLy8gVE9ET1xuICAgICAgICAgICAgc2VsZWN0b3I6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudFNlbGVjdG9yKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHN0eWxlVXJsczogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50U3R5bGVVcmxzKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHN0eWxlczogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50U3R5bGVzKHByb3BzLCBzcmNGaWxlKSwgLy8gVE9ETyBmaXggYXJnc1xuICAgICAgICAgICAgdGVtcGxhdGU6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudFRlbXBsYXRlKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRUZW1wbGF0ZVVybChwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICB2aWV3UHJvdmlkZXJzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRWaWV3UHJvdmlkZXJzKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGlucHV0c0NsYXNzOiBJTy5pbnB1dHMsXG4gICAgICAgICAgICBvdXRwdXRzQ2xhc3M6IElPLm91dHB1dHMsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzQ2xhc3M6IElPLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBtZXRob2RzQ2xhc3M6IElPLm1ldGhvZHMsXG5cbiAgICAgICAgICAgIGhvc3RCaW5kaW5nczogSU8uaG9zdEJpbmRpbmdzLFxuICAgICAgICAgICAgaG9zdExpc3RlbmVyczogSU8uaG9zdExpc3RlbmVycyxcblxuICAgICAgICAgICAgZGVzY3JpcHRpb246IElPLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXG4gICAgICAgICAgICBzb3VyY2VDb2RlOiBzcmNGaWxlLmdldFRleHQoKSxcbiAgICAgICAgICAgIGV4YW1wbGVVcmxzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRFeGFtcGxlVXJscyhzcmNGaWxlLmdldFRleHQoKSlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRQcmVzZXJ2ZVdoaXRlc3BhY2VzKHByb3BzLCBzcmNGaWxlKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudERlcC5wcmVzZXJ2ZVdoaXRlc3BhY2VzID0gdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50UHJlc2VydmVXaGl0ZXNwYWNlcyhcbiAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICBzcmNGaWxlXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUxpZmVDeWNsZUhvb2tzKSB7XG4gICAgICAgICAgICBjb21wb25lbnREZXAubWV0aG9kc0NsYXNzID0gY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzKGNvbXBvbmVudERlcC5tZXRob2RzQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5qc2RvY3RhZ3MgJiYgSU8uanNkb2N0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbXBvbmVudERlcC5qc2RvY3RhZ3MgPSBJTy5qc2RvY3RhZ3NbMF0udGFncztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudERlcC5jb25zdHJ1Y3Rvck9iaiA9IElPLmNvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5leHRlbmRzKSB7XG4gICAgICAgICAgICBjb21wb25lbnREZXAuZXh0ZW5kcyA9IElPLmV4dGVuZHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmltcGxlbWVudHMgJiYgSU8uaW1wbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb21wb25lbnREZXAuaW1wbGVtZW50cyA9IElPLmltcGxlbWVudHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmFjY2Vzc29ycykge1xuICAgICAgICAgICAgY29tcG9uZW50RGVwLmFjY2Vzc29ycyA9IElPLmFjY2Vzc29ycztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21wb25lbnREZXA7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnREZXAgZXh0ZW5kcyBJRGVwIHtcbiAgICBmaWxlOiBhbnk7XG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBhbnk7XG4gICAgZW5jYXBzdWxhdGlvbjogYW55O1xuICAgIGV4cG9ydEFzOiBhbnk7XG4gICAgaG9zdDogYW55O1xuICAgIGlucHV0czogQXJyYXk8YW55PjtcbiAgICBvdXRwdXRzOiBBcnJheTxhbnk+O1xuICAgIHByb3ZpZGVyczogQXJyYXk8YW55PjtcbiAgICBtb2R1bGVJZDogc3RyaW5nO1xuICAgIHNlbGVjdG9yOiBzdHJpbmc7XG4gICAgc3R5bGVVcmxzOiBBcnJheTxzdHJpbmc+O1xuICAgIHN0eWxlczogQXJyYXk8c3RyaW5nPjtcbiAgICB0ZW1wbGF0ZTogc3RyaW5nO1xuICAgIHRlbXBsYXRlVXJsOiBBcnJheTxzdHJpbmc+O1xuICAgIHZpZXdQcm92aWRlcnM6IEFycmF5PGFueT47XG4gICAgaW5wdXRzQ2xhc3M6IEFycmF5PGFueT47XG4gICAgb3V0cHV0c0NsYXNzOiBBcnJheTxhbnk+O1xuICAgIHByb3BlcnRpZXNDbGFzczogQXJyYXk8YW55PjtcbiAgICBtZXRob2RzQ2xhc3M6IEFycmF5PGFueT47XG5cbiAgICBlbnRyeUNvbXBvbmVudHM6IEFycmF5PGFueT47XG5cbiAgICBob3N0QmluZGluZ3M6IEFycmF5PGFueT47XG4gICAgaG9zdExpc3RlbmVyczogQXJyYXk8YW55PjtcblxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgc291cmNlQ29kZTogc3RyaW5nO1xuICAgIGV4YW1wbGVVcmxzOiBBcnJheTxzdHJpbmc+O1xuXG4gICAgY29uc3RydWN0b3JPYmo/OiBPYmplY3Q7XG4gICAganNkb2N0YWdzPzogQXJyYXk8c3RyaW5nPjtcbiAgICBleHRlbmRzPzogYW55O1xuICAgIGltcGxlbWVudHM/OiBhbnk7XG4gICAgYWNjZXNzb3JzPzogT2JqZWN0O1xuXG4gICAgcHJlc2VydmVXaGl0ZXNwYWNlcz86IGFueTtcbn1cbiIsImltcG9ydCB7IElEZXAgfSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB0cyB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuXG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcblxuZXhwb3J0IGNsYXNzIENvbnRyb2xsZXJEZXBGYWN0b3J5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgICBwdWJsaWMgY3JlYXRlKFxuICAgICAgICBmaWxlOiBhbnksXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHJvcGVydGllczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBJTzogYW55XG4gICAgKTogSUNvbnRyb2xsZXJEZXAge1xuICAgICAgICBsZXQgc291cmNlQ29kZSA9IHNyY0ZpbGUuZ2V0VGV4dCgpO1xuICAgICAgICBsZXQgaGFzaCA9IGNyeXB0b1xuICAgICAgICAgICAgLmNyZWF0ZUhhc2goJ21kNScpXG4gICAgICAgICAgICAudXBkYXRlKHNvdXJjZUNvZGUpXG4gICAgICAgICAgICAuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgbGV0IGluZm9zOiBJQ29udHJvbGxlckRlcCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBpZDogJ2NvbnRyb2xsZXItJyArIG5hbWUgKyAnLScgKyBoYXNoLFxuICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgIG1ldGhvZHM6IElPLm1ldGhvZHMsXG4gICAgICAgICAgICB0eXBlOiAnY29udHJvbGxlcicsXG4gICAgICAgICAgICBzb3VyY2VDb2RlOiBzcmNGaWxlLnRleHRcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHByb3BlcnRpZXMgJiYgcHJvcGVydGllcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzWzBdLnRleHQpIHtcbiAgICAgICAgICAgICAgICBpbmZvcy5wcmVmaXggPSBwcm9wZXJ0aWVzWzBdLnRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZm9zO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbGxlckRlcCBleHRlbmRzIElEZXAge1xuICAgIGZpbGU6IGFueTtcbiAgICBzb3VyY2VDb2RlOiBzdHJpbmc7XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIG1ldGhvZHM6IEFycmF5PGFueT47XG59XG4iLCJpbXBvcnQgeyBTeW1ib2xIZWxwZXIsIElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0IH0gZnJvbSAnLi9zeW1ib2wtaGVscGVyJztcbmltcG9ydCB7IENvbXBvbmVudENhY2hlIH0gZnJvbSAnLi9jb21wb25lbnQtaGVscGVyJztcbmltcG9ydCB7IERlcHMgfSBmcm9tICcuLi8uLi9kZXBlbmRlbmNpZXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB0cyB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuXG5leHBvcnQgY2xhc3MgTW9kdWxlSGVscGVyIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBjYWNoZTogQ29tcG9uZW50Q2FjaGUsXG4gICAgICAgIHByaXZhdGUgc3ltYm9sSGVscGVyOiBTeW1ib2xIZWxwZXIgPSBuZXcgU3ltYm9sSGVscGVyKClcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgZ2V0TW9kdWxlUHJvdmlkZXJzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8SVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyXG4gICAgICAgICAgICAuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3Byb3ZpZGVycycsIHNyY0ZpbGUpXG4gICAgICAgICAgICAubWFwKHByb3ZpZGVyTmFtZSA9PiB0aGlzLnN5bWJvbEhlbHBlci5wYXJzZURlZXBJbmRlbnRpZmllcihwcm92aWRlck5hbWUsIHNyY0ZpbGUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TW9kdWxlQ29udHJvbGxlcnMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXJcbiAgICAgICAgICAgIC5nZXRTeW1ib2xEZXBzKHByb3BzLCAnY29udHJvbGxlcnMnLCBzcmNGaWxlKVxuICAgICAgICAgICAgLm1hcChwcm92aWRlck5hbWUgPT4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIocHJvdmlkZXJOYW1lLCBzcmNGaWxlKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZURlY2xhcmF0aW9ucyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IERlcHNbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnZGVjbGFyYXRpb25zJywgc3JjRmlsZSkubWFwKG5hbWUgPT4ge1xuICAgICAgICAgICAgbGV0IGNvbXBvbmVudCA9IHRoaXMuY2FjaGUuZ2V0KG5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLnBhcnNlRGVlcEluZGVudGlmaWVyKG5hbWUsIHNyY0ZpbGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TW9kdWxlRW50cnlDb21wb25lbnRzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogRGVwc1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdlbnRyeUNvbXBvbmVudHMnLCBzcmNGaWxlKS5tYXAobmFtZSA9PiB7XG4gICAgICAgICAgICBsZXQgY29tcG9uZW50ID0gdGhpcy5jYWNoZS5nZXQobmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZSwgc3JjRmlsZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYW5JbXBvcnRGb3JSb290Rm9yQ2hpbGQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IG5zTW9kdWxlID0gbmFtZS5zcGxpdCgnLicpO1xuICAgICAgICBpZiAobnNNb2R1bGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbmFtZSA9IG5zTW9kdWxlWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNb2R1bGVJbXBvcnRzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8SVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyXG4gICAgICAgICAgICAuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2ltcG9ydHMnLCBzcmNGaWxlKVxuICAgICAgICAgICAgLm1hcChuYW1lID0+IHRoaXMuY2xlYW5JbXBvcnRGb3JSb290Rm9yQ2hpbGQobmFtZSkpXG4gICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNb2R1bGVFeHBvcnRzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8SVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyXG4gICAgICAgICAgICAuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2V4cG9ydHMnLCBzcmNGaWxlKVxuICAgICAgICAgICAgLm1hcChuYW1lID0+IHRoaXMuc3ltYm9sSGVscGVyLnBhcnNlRGVlcEluZGVudGlmaWVyKG5hbWUsIHNyY0ZpbGUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TW9kdWxlSW1wb3J0c1JhdyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IEFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwc1Jhdyhwcm9wcywgJ2ltcG9ydHMnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TW9kdWxlSWQoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdD4ge1xuICAgICAgICBsZXQgX2lkID0gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2lkJywgc3JjRmlsZSksXG4gICAgICAgICAgICBpZDtcbiAgICAgICAgaWYgKF9pZC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGlkID0gX2lkWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TW9kdWxlU2NoZW1hcyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICkge1xuICAgICAgICBsZXQgc2NoZW1hcyA9IHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdzY2hlbWFzJywgc3JjRmlsZSk7XG4gICAgICAgIHJldHVybiBzY2hlbWFzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNb2R1bGVCb290c3RyYXAoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXJcbiAgICAgICAgICAgIC5nZXRTeW1ib2xEZXBzKHByb3BzLCAnYm9vdHN0cmFwJywgc3JjRmlsZSlcbiAgICAgICAgICAgIC5tYXAobmFtZSA9PiB0aGlzLnN5bWJvbEhlbHBlci5wYXJzZURlZXBJbmRlbnRpZmllcihuYW1lLCBzcmNGaWxlKSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1zaW1wbGUtYXN0JztcblxuZXhwb3J0IGNsYXNzIEpzRG9jSGVscGVyIHtcbiAgICBwdWJsaWMgaGFzSlNEb2NJbnRlcm5hbFRhZyhcbiAgICAgICAgZmlsZW5hbWU6IHN0cmluZyxcbiAgICAgICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICAgICAgbm9kZTogdHMuTm9kZVxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZUZpbGUuc3RhdGVtZW50cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoZWNrU3RhdGVtZW50cyhzb3VyY2VGaWxlLnN0YXRlbWVudHMsIG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tTdGF0ZW1lbnRzKHN0YXRlbWVudHM6IFJlYWRvbmx5QXJyYXk8dHMuU3RhdGVtZW50Piwgbm9kZTogdHMuTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gc3RhdGVtZW50cy5zb21lKHggPT4gdGhpcy5jaGVja1N0YXRlbWVudCh4LCBub2RlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja1N0YXRlbWVudChzdGF0ZW1lbnQ6IHRzLlN0YXRlbWVudCwgbm9kZTogdHMuTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoc3RhdGVtZW50LnBvcyA9PT0gbm9kZS5wb3MgJiYgc3RhdGVtZW50LmVuZCA9PT0gbm9kZS5lbmQpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmpzRG9jICYmIG5vZGUuanNEb2MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoZWNrSnNEb2NzKG5vZGUuanNEb2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tKc0RvY3MoanNEb2NzOiBSZWFkb25seUFycmF5PHRzLkpTRG9jPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4ganNEb2NzXG4gICAgICAgICAgICAuZmlsdGVyKHggPT4geC50YWdzICYmIHgudGFncy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgLnNvbWUoeCA9PiB0aGlzLmNoZWNrSnNEb2NUYWdzKHgudGFncykpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tKc0RvY1RhZ3ModGFnczogUmVhZG9ubHlBcnJheTx0cy5KU0RvY1RhZz4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRhZ3Muc29tZSh4ID0+IHgudGFnTmFtZSAmJiB4LnRhZ05hbWUudGV4dCA9PT0gJ2ludGVybmFsJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEFzdCwgeyB0cywgU3ludGF4S2luZCB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi9sb2dnZXInO1xuaW1wb3J0IHsgbWFya2VkdGFncywgbWVyZ2VUYWdzQW5kQXJncywgY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHsga2luZFRvVHlwZSB9IGZyb20gJy4uLy4uL3V0aWxzL2tpbmQtdG8tdHlwZSc7XG5pbXBvcnQgeyAkY29tcG9uZW50c1RyZWVFbmdpbmUgfSBmcm9tICcuLi9lbmdpbmVzL2NvbXBvbmVudHMtdHJlZS5lbmdpbmUnO1xuXG5pbXBvcnQgeyBGcmFtZXdvcmtEZXBlbmRlbmNpZXMgfSBmcm9tICcuL2ZyYW1ld29yay1kZXBlbmRlbmNpZXMnO1xuXG5pbXBvcnQge1xuICAgIEpzZG9jUGFyc2VyVXRpbCxcbiAgICBSb3V0ZXJQYXJzZXJVdGlsLFxuICAgIEltcG9ydHNVdGlsLFxuICAgIGlzTW9kdWxlV2l0aFByb3ZpZGVycyxcbiAgICBnZXRNb2R1bGVXaXRoUHJvdmlkZXJzLFxuICAgIGlzSWdub3JlXG59IGZyb20gJy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IHsgQ29kZUdlbmVyYXRvciB9IGZyb20gJy4vYW5ndWxhci9jb2RlLWdlbmVyYXRvcic7XG5cbmltcG9ydCB7IERpcmVjdGl2ZURlcEZhY3RvcnkgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9kaXJlY3RpdmUtZGVwLmZhY3RvcnknO1xuaW1wb3J0IHsgQ29tcG9uZW50Q2FjaGUgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IHsgTW9kdWxlRGVwRmFjdG9yeSB9IGZyb20gJy4vYW5ndWxhci9kZXBzL21vZHVsZS1kZXAuZmFjdG9yeSc7XG5pbXBvcnQgeyBDb21wb25lbnREZXBGYWN0b3J5IH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvY29tcG9uZW50LWRlcC5mYWN0b3J5JztcbmltcG9ydCB7IENvbnRyb2xsZXJEZXBGYWN0b3J5IH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvY29udHJvbGxlci1kZXAuZmFjdG9yeSc7XG5pbXBvcnQgeyBNb2R1bGVIZWxwZXIgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL21vZHVsZS1oZWxwZXInO1xuaW1wb3J0IHsgSnNEb2NIZWxwZXIgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL2pzLWRvYy1oZWxwZXInO1xuaW1wb3J0IHsgU3ltYm9sSGVscGVyIH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvaGVscGVycy9zeW1ib2wtaGVscGVyJztcblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuXG5pbXBvcnQge1xuICAgIElJbmplY3RhYmxlRGVwLFxuICAgIElQaXBlRGVwLFxuICAgIElEZXAsXG4gICAgSUludGVyZmFjZURlcCxcbiAgICBJRnVuY3Rpb25EZWNEZXAsXG4gICAgSUVudW1EZWNEZXAsXG4gICAgSVR5cGVBbGlhc0RlY0RlcFxufSBmcm9tICcuL2FuZ3VsYXIvZGVwZW5kZW5jaWVzLmludGVyZmFjZXMnO1xuXG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbmNvbnN0IG1hcmtlZCA9IHJlcXVpcmUoJ21hcmtlZCcpO1xuY29uc3QgYXN0ID0gbmV3IEFzdCgpO1xuXG4vLyBUeXBlU2NyaXB0IHJlZmVyZW5jZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9ibG9iL21hc3Rlci9saWIvdHlwZXNjcmlwdC5kLnRzXG5cbmV4cG9ydCBjbGFzcyBBbmd1bGFyRGVwZW5kZW5jaWVzIGV4dGVuZHMgRnJhbWV3b3JrRGVwZW5kZW5jaWVzIHtcbiAgICBwcml2YXRlIGVuZ2luZTogYW55O1xuICAgIHByaXZhdGUgY2FjaGU6IENvbXBvbmVudENhY2hlID0gbmV3IENvbXBvbmVudENhY2hlKCk7XG4gICAgcHJpdmF0ZSBtb2R1bGVIZWxwZXIgPSBuZXcgTW9kdWxlSGVscGVyKHRoaXMuY2FjaGUpO1xuICAgIHByaXZhdGUganNEb2NIZWxwZXIgPSBuZXcgSnNEb2NIZWxwZXIoKTtcbiAgICBwcml2YXRlIHN5bWJvbEhlbHBlciA9IG5ldyBTeW1ib2xIZWxwZXIoKTtcbiAgICBwcml2YXRlIGpzZG9jUGFyc2VyVXRpbCA9IG5ldyBKc2RvY1BhcnNlclV0aWwoKTtcbiAgICBwcml2YXRlIGltcG9ydHNVdGlsID0gbmV3IEltcG9ydHNVdGlsKCk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZmlsZXM6IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zOiBhbnksXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UsXG4gICAgICAgIHJvdXRlclBhcnNlcjogUm91dGVyUGFyc2VyVXRpbFxuICAgICkge1xuICAgICAgICBzdXBlcihmaWxlcywgb3B0aW9ucywgY29uZmlndXJhdGlvbiwgcm91dGVyUGFyc2VyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVwZW5kZW5jaWVzKCkge1xuICAgICAgICBsZXQgZGVwcyA9IHtcbiAgICAgICAgICAgIG1vZHVsZXM6IFtdLFxuICAgICAgICAgICAgbW9kdWxlc0ZvckdyYXBoOiBbXSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IFtdLFxuICAgICAgICAgICAgY29udHJvbGxlcnM6IFtdLFxuICAgICAgICAgICAgaW5qZWN0YWJsZXM6IFtdLFxuICAgICAgICAgICAgaW50ZXJjZXB0b3JzOiBbXSxcbiAgICAgICAgICAgIGd1YXJkczogW10sXG4gICAgICAgICAgICBwaXBlczogW10sXG4gICAgICAgICAgICBkaXJlY3RpdmVzOiBbXSxcbiAgICAgICAgICAgIHJvdXRlczogW10sXG4gICAgICAgICAgICBjbGFzc2VzOiBbXSxcbiAgICAgICAgICAgIGludGVyZmFjZXM6IFtdLFxuICAgICAgICAgICAgbWlzY2VsbGFuZW91czoge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlczogW10sXG4gICAgICAgICAgICAgICAgZnVuY3Rpb25zOiBbXSxcbiAgICAgICAgICAgICAgICB0eXBlYWxpYXNlczogW10sXG4gICAgICAgICAgICAgICAgZW51bWVyYXRpb25zOiBbXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJvdXRlc1RyZWU6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBzb3VyY2VGaWxlcyA9IHRoaXMucHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpIHx8IFtdO1xuXG4gICAgICAgIHNvdXJjZUZpbGVzLm1hcCgoZmlsZTogdHMuU291cmNlRmlsZSkgPT4ge1xuICAgICAgICAgICAgbGV0IGZpbGVQYXRoID0gZmlsZS5maWxlTmFtZTtcblxuICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlUGF0aCkgPT09ICcudHMnKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJKU1Byb2plY3QgJiZcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5leHRuYW1lKGZpbGVQYXRoKSA9PT0gJy5qcydcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ3BhcnNpbmcnLCBmaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0U291cmNlRmlsZURlY29yYXRvcnMoZmlsZSwgZGVwcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGgubGFzdEluZGV4T2YoJy5kLnRzJykgPT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aC5sYXN0SW5kZXhPZignc3BlYy50cycpID09PSAtMVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdwYXJzaW5nJywgZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRTb3VyY2VGaWxlRGVjb3JhdG9ycyhmaWxlLCBkZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRlcHM7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEVuZCBvZiBmaWxlIHNjYW5uaW5nXG4gICAgICAgIC8vIFRyeSBtZXJnaW5nIGluc2lkZSB0aGUgc2FtZSBmaWxlIGRlY2xhcmF0ZWQgdmFyaWFibGVzICYgbW9kdWxlcyB3aXRoIGltcG9ydHMgfCBleHBvcnRzIHwgZGVjbGFyYXRpb25zIHwgcHJvdmlkZXJzXG5cbiAgICAgICAgaWYgKGRlcHMubWlzY2VsbGFuZW91cy52YXJpYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGVwcy5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5mb3JFYWNoKF92YXJpYWJsZSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld1ZhciA9IFtdO1xuICAgICAgICAgICAgICAgICgoX3ZhciwgX25ld1ZhcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBnZXRUeXBlIHByIHJlY29uc3RydWlyZS4uLi5cbiAgICAgICAgICAgICAgICAgICAgaWYgKF92YXIuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdmFyLmluaXRpYWxpemVyLmVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF92YXIuaW5pdGlhbGl6ZXIuZWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdmFyLmluaXRpYWxpemVyLmVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFyLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbGVtZW50LnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMuc3ltYm9sSGVscGVyLmdldFR5cGUoZWxlbWVudC50ZXh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KShfdmFyaWFibGUsIG5ld1Zhcik7XG5cbiAgICAgICAgICAgICAgICBsZXQgb25MaW5rID0gbW9kID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb2Nlc3MgPSAoaW5pdGlhbEFycmF5LCBfdmFyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXhUb0NsZWFuID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbmRWYXJpYWJsZUluQXJyYXkgPSAoZWwsIGluZGV4LCB0aGVBcnJheSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbC5uYW1lID09PSBfdmFyLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhUb0NsZWFuID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbEFycmF5LmZvckVhY2goZmluZFZhcmlhYmxlSW5BcnJheSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhbiBpbmRleGVzIHRvIHJlcGxhY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxBcnJheS5zcGxpY2UoaW5kZXhUb0NsZWFuLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdmFyaWFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWYXIuZm9yRWFjaChuZXdFbGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgXy5maW5kKGluaXRpYWxBcnJheSwgeyBuYW1lOiBuZXdFbGUubmFtZSB9KSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbEFycmF5LnB1c2gobmV3RWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKG1vZC5pbXBvcnRzLCBfdmFyaWFibGUpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKG1vZC5leHBvcnRzLCBfdmFyaWFibGUpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKG1vZC5jb250cm9sbGVycywgX3ZhcmlhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcyhtb2QuZGVjbGFyYXRpb25zLCBfdmFyaWFibGUpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKG1vZC5wcm92aWRlcnMsIF92YXJpYWJsZSk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGRlcHMubW9kdWxlcy5mb3JFYWNoKG9uTGluayk7XG4gICAgICAgICAgICAgICAgZGVwcy5tb2R1bGVzRm9yR3JhcGguZm9yRWFjaChvbkxpbmspO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgb25lIHRoaW5nIGV4dGVuZHMgYW5vdGhlciwgbWVyZ2UgdGhlbSwgb25seSBmb3IgaW50ZXJuYWwgc291cmNlc1xuICAgICAgICAgKiAtIGNsYXNzZXNcbiAgICAgICAgICogLSBjb21wb25lbnRzXG4gICAgICAgICAqIGZvclxuICAgICAgICAgKiAtIGlucHV0c1xuICAgICAgICAgKiAtIG91dHB1dHNcbiAgICAgICAgICogLSBwcm9wZXJ0aWVzXG4gICAgICAgICAqIC0gbWV0aG9kc1xuICAgICAgICAgKi9cbiAgICAgICAgZGVwcyA9IHRoaXMuZXh0ZW5kc01lcmdlci5tZXJnZShkZXBzLCB0aGlzLmNvbmZpZ3VyYXRpb24pO1xuXG4gICAgICAgIC8vIHRoaXMucm91dGVyUGFyc2VyLnByaW50TW9kdWxlc1JvdXRlcygpO1xuICAgICAgICAvLyB0aGlzLnJvdXRlclBhcnNlci5wcmludFJvdXRlcygpO1xuXG4gICAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaCkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXJQYXJzZXIubGlua01vZHVsZXNBbmRSb3V0ZXMoKTtcbiAgICAgICAgICAgIHRoaXMucm91dGVyUGFyc2VyLmNvbnN0cnVjdE1vZHVsZXNUcmVlKCk7XG5cbiAgICAgICAgICAgIGRlcHMucm91dGVzVHJlZSA9IHRoaXMucm91dGVyUGFyc2VyLmNvbnN0cnVjdFJvdXRlc1RyZWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXBzO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc0NsYXNzKG5vZGUsIGZpbGUsIHNyY0ZpbGUsIG91dHB1dFN5bWJvbHMsIGZpbGVCb2R5KSB7XG4gICAgICAgIGxldCBuYW1lID0gdGhpcy5nZXRTeW1ib2xlTmFtZShub2RlKTtcbiAgICAgICAgbGV0IElPID0gdGhpcy5nZXRDbGFzc0lPKGZpbGUsIHNyY0ZpbGUsIG5vZGUsIGZpbGVCb2R5KTtcbiAgICAgICAgbGV0IHNvdXJjZUNvZGUgPSBzcmNGaWxlLmdldFRleHQoKTtcbiAgICAgICAgbGV0IGhhc2ggPSBjcnlwdG9cbiAgICAgICAgICAgIC5jcmVhdGVIYXNoKCdtZDUnKVxuICAgICAgICAgICAgLnVwZGF0ZShzb3VyY2VDb2RlKVxuICAgICAgICAgICAgLmRpZ2VzdCgnaGV4Jyk7XG4gICAgICAgIGxldCBkZXBzOiBhbnkgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgaWQ6ICdjbGFzcy0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgdHlwZTogJ2NsYXNzJyxcbiAgICAgICAgICAgIHNvdXJjZUNvZGU6IHNyY0ZpbGUuZ2V0VGV4dCgpXG4gICAgICAgIH07XG4gICAgICAgIGxldCBleGNsdWRlRnJvbUNsYXNzQXJyYXkgPSBmYWxzZTtcblxuICAgICAgICBpZiAoSU8uY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGRlcHMuY29uc3RydWN0b3JPYmogPSBJTy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8ucHJvcGVydGllcykge1xuICAgICAgICAgICAgZGVwcy5wcm9wZXJ0aWVzID0gSU8ucHJvcGVydGllcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIGRlcHMuZGVzY3JpcHRpb24gPSBJTy5kZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8ubWV0aG9kcykge1xuICAgICAgICAgICAgZGVwcy5tZXRob2RzID0gSU8ubWV0aG9kcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uaW5kZXhTaWduYXR1cmVzKSB7XG4gICAgICAgICAgICBkZXBzLmluZGV4U2lnbmF0dXJlcyA9IElPLmluZGV4U2lnbmF0dXJlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uZXh0ZW5kcykge1xuICAgICAgICAgICAgZGVwcy5leHRlbmRzID0gSU8uZXh0ZW5kcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uanNkb2N0YWdzICYmIElPLmpzZG9jdGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkZXBzLmpzZG9jdGFncyA9IElPLmpzZG9jdGFnc1swXS50YWdzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5hY2Nlc3NvcnMpIHtcbiAgICAgICAgICAgIGRlcHMuYWNjZXNzb3JzID0gSU8uYWNjZXNzb3JzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5pbnB1dHMpIHtcbiAgICAgICAgICAgIGRlcHMuaW5wdXRzQ2xhc3MgPSBJTy5pbnB1dHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLm91dHB1dHMpIHtcbiAgICAgICAgICAgIGRlcHMub3V0cHV0c0NsYXNzID0gSU8ub3V0cHV0cztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uaG9zdEJpbmRpbmdzKSB7XG4gICAgICAgICAgICBkZXBzLmhvc3RCaW5kaW5ncyA9IElPLmhvc3RCaW5kaW5ncztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uaG9zdExpc3RlbmVycykge1xuICAgICAgICAgICAgZGVwcy5ob3N0TGlzdGVuZXJzID0gSU8uaG9zdExpc3RlbmVycztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVMaWZlQ3ljbGVIb29rcykge1xuICAgICAgICAgICAgZGVwcy5tZXRob2RzID0gY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzKGRlcHMubWV0aG9kcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmltcGxlbWVudHMgJiYgSU8uaW1wbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkZXBzLmltcGxlbWVudHMgPSBJTy5pbXBsZW1lbnRzO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pc0d1YXJkKElPLmltcGxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0aGUgR3VhcmQgdG8gc2hvdyB1cCBpbiB0aGUgQ2xhc3NlcyBtZW51XG4gICAgICAgICAgICAgICAgZXhjbHVkZUZyb21DbGFzc0FycmF5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkZXBzLnR5cGUgPSAnZ3VhcmQnO1xuXG4gICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5ndWFyZHMucHVzaChkZXBzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIElPLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoZGVwcyk7XG5cbiAgICAgICAgICAgIGlmICghZXhjbHVkZUZyb21DbGFzc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5jbGFzc2VzLnB1c2goZGVwcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlnbm9yZShkZXBzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U291cmNlRmlsZURlY29yYXRvcnMoaW5pdGlhbFNyY0ZpbGU6IHRzLlNvdXJjZUZpbGUsIG91dHB1dFN5bWJvbHM6IGFueSk6IHZvaWQge1xuICAgICAgICBsZXQgY2xlYW5lciA9IChwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXApLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gaW5pdGlhbFNyY0ZpbGUuZmlsZU5hbWUucmVwbGFjZShjbGVhbmVyLCAnJyk7XG4gICAgICAgIGxldCBzY2FubmVkRmlsZSA9IGluaXRpYWxTcmNGaWxlO1xuXG4gICAgICAgIC8vIFNlYXJjaCBpbiBmaWxlIGZvciB2YXJpYWJsZSBzdGF0ZW1lbnQgYXMgcm91dGVzIGRlZmluaXRpb25zXG5cbiAgICAgICAgY29uc3QgYXN0RmlsZSA9XG4gICAgICAgICAgICB0eXBlb2YgYXN0LmdldFNvdXJjZUZpbGUoaW5pdGlhbFNyY0ZpbGUuZmlsZU5hbWUpICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gYXN0LmdldFNvdXJjZUZpbGUoaW5pdGlhbFNyY0ZpbGUuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgOiBhc3QuYWRkRXhpc3RpbmdTb3VyY2VGaWxlKGluaXRpYWxTcmNGaWxlLmZpbGVOYW1lKTtcblxuICAgICAgICBjb25zdCB2YXJpYWJsZVJvdXRlc1N0YXRlbWVudHMgPSBhc3RGaWxlLmdldFZhcmlhYmxlU3RhdGVtZW50cygpO1xuICAgICAgICBsZXQgaGFzUm91dGVzU3RhdGVtZW50cyA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh2YXJpYWJsZVJvdXRlc1N0YXRlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gQ2xlYW4gZmlsZSBmb3Igc3ByZWFkIGFuZCBkeW5hbWljcyBpbnNpZGUgcm91dGVzIGRlZmluaXRpb25zXG4gICAgICAgICAgICB2YXJpYWJsZVJvdXRlc1N0YXRlbWVudHMuZm9yRWFjaChzID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YXJpYWJsZURlY2xhcmF0aW9ucyA9IHMuZ2V0RGVjbGFyYXRpb25zKCk7XG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IHZhcmlhYmxlRGVjbGFyYXRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlRGVjbGFyYXRpb25zW2ldLmNvbXBpbGVyTm9kZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVEZWNsYXJhdGlvbnNbaV0uY29tcGlsZXJOb2RlLnR5cGUudHlwZU5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZURlY2xhcmF0aW9uc1tpXS5jb21waWxlck5vZGUudHlwZS50eXBlTmFtZS50ZXh0ID09PSAnUm91dGVzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUm91dGVzU3RhdGVtZW50cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNSb3V0ZXNTdGF0ZW1lbnRzICYmICF0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVJvdXRlc0dyYXBoKSB7XG4gICAgICAgICAgICAvLyBDbGVhbiBmaWxlIGZvciBzcHJlYWQgYW5kIGR5bmFtaWNzIGluc2lkZSByb3V0ZXMgZGVmaW5pdGlvbnNcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdBbmFseXNpbmcgcm91dGVzIGRlZmluaXRpb25zIGFuZCBjbGVhbiB0aGVtIGlmIG5lY2Vzc2FyeScpO1xuXG4gICAgICAgICAgICAvLyBzY2FubmVkRmlsZSA9IHRoaXMucm91dGVyUGFyc2VyLmNsZWFuRmlsZUlkZW50aWZpZXJzKGFzdEZpbGUpLmNvbXBpbGVyTm9kZTtcbiAgICAgICAgICAgIGxldCBmaXJzdENsZWFuID0gdGhpcy5yb3V0ZXJQYXJzZXIuY2xlYW5GaWxlU3ByZWFkcyhhc3RGaWxlKS5jb21waWxlck5vZGU7XG4gICAgICAgICAgICBzY2FubmVkRmlsZSA9IHRoaXMucm91dGVyUGFyc2VyLmNsZWFuQ2FsbEV4cHJlc3Npb25zKGFzdEZpbGUpLmNvbXBpbGVyTm9kZTtcbiAgICAgICAgICAgIHNjYW5uZWRGaWxlID0gdGhpcy5yb3V0ZXJQYXJzZXIuY2xlYW5GaWxlRHluYW1pY3MoYXN0RmlsZSkuY29tcGlsZXJOb2RlO1xuXG4gICAgICAgICAgICBzY2FubmVkRmlsZS5raW5kID0gU3ludGF4S2luZC5Tb3VyY2VGaWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHMuZm9yRWFjaENoaWxkKHNjYW5uZWRGaWxlLCAoaW5pdGlhbE5vZGU6IHRzLk5vZGUpID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmpzRG9jSGVscGVyLmhhc0pTRG9jSW50ZXJuYWxUYWcoZmlsZU5hbWUsIHNjYW5uZWRGaWxlLCBpbml0aWFsTm9kZSkgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUludGVybmFsXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcGFyc2VOb2RlID0gKGZpbGUsIHNyY0ZpbGUsIG5vZGUsIGZpbGVCb2R5KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZUNvZGUgPSBzcmNGaWxlLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICBsZXQgaGFzaCA9IGNyeXB0b1xuICAgICAgICAgICAgICAgICAgICAuY3JlYXRlSGFzaCgnbWQ1JylcbiAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZShzb3VyY2VDb2RlKVxuICAgICAgICAgICAgICAgICAgICAuZGlnZXN0KCdoZXgnKTtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlLmRlY29yYXRvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsYXNzV2l0aEN1c3RvbURlY29yYXRvciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmlzaXREZWNvcmF0b3IgPSAodmlzaXRlZERlY29yYXRvciwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZXBzOiBJRGVwO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWV0YWRhdGEgPSBub2RlLmRlY29yYXRvcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IHRoaXMuZ2V0U3ltYm9sZU5hbWUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcHMgPSB0aGlzLmZpbmRQcm9wZXJ0aWVzKHZpc2l0ZWREZWNvcmF0b3IsIHNyY0ZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IElPID0gdGhpcy5jb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50SU8oZmlsZSwgc3JjRmlsZSwgbm9kZSwgZmlsZUJvZHkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc01vZHVsZSh2aXNpdGVkRGVjb3JhdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZURlcCA9IG5ldyBNb2R1bGVEZXBGYWN0b3J5KHRoaXMubW9kdWxlSGVscGVyKS5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucm91dGVyUGFyc2VyLmhhc1JvdXRlck1vZHVsZUluSW1wb3J0cyhtb2R1bGVEZXAuaW1wb3J0cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXJQYXJzZXIuYWRkTW9kdWxlV2l0aFJvdXRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZUhlbHBlci5nZXRNb2R1bGVJbXBvcnRzUmF3KHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcyA9IG1vZHVsZURlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIElPLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXJQYXJzZXIuYWRkTW9kdWxlKG5hbWUsIG1vZHVsZURlcC5pbXBvcnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5tb2R1bGVzLnB1c2gobW9kdWxlRGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5tb2R1bGVzRm9yR3JhcGgucHVzaChtb2R1bGVEZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NvbXBvbmVudCh2aXNpdGVkRGVjb3JhdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnREZXAgPSBuZXcgQ29tcG9uZW50RGVwRmFjdG9yeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRIZWxwZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuY3JlYXRlKGZpbGUsIHNyY0ZpbGUsIG5hbWUsIHByb3BzLCBJTyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcyA9IGNvbXBvbmVudERlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIElPLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbXBvbmVudHNUcmVlRW5naW5lLmFkZENvbXBvbmVudChjb21wb25lbnREZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnREZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NvbnRyb2xsZXIodmlzaXRlZERlY29yYXRvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sbGVyRGVwID0gbmV3IENvbnRyb2xsZXJEZXBGYWN0b3J5KCkuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNGaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMgPSBjb250cm9sbGVyRGVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgSU8uaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLmNvbnRyb2xsZXJzLnB1c2goY29udHJvbGxlckRlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzSW5qZWN0YWJsZSh2aXNpdGVkRGVjb3JhdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmplY3RhYmxlRGVwczogSUluamVjdGFibGVEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnaW5qZWN0YWJsZS0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IElPLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IElPLm1ldGhvZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBJTy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ29kZTogc3JjRmlsZS5nZXRUZXh0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1wbGVVcmxzOiB0aGlzLmNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRFeGFtcGxlVXJscyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ZpbGUuZ2V0VGV4dCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5jb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlRGVwcy5jb25zdHJ1Y3Rvck9iaiA9IElPLmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSU8uanNkb2N0YWdzICYmIElPLmpzZG9jdGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVEZXBzLmpzZG9jdGFncyA9IElPLmpzZG9jdGFnc1swXS50YWdzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSU8uYWNjZXNzb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVEZXBzLmFjY2Vzc29ycyA9IElPLmFjY2Vzc29ycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcyA9IGluamVjdGFibGVEZXBzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgSU8uaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXy5pbmNsdWRlcyhJTy5pbXBsZW1lbnRzLCAnSHR0cEludGVyY2VwdG9yJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVEZXBzLnR5cGUgPSAnaW50ZXJjZXB0b3InO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5pbnRlcmNlcHRvcnMucHVzaChpbmplY3RhYmxlRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0d1YXJkKElPLmltcGxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlRGVwcy50eXBlID0gJ2d1YXJkJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMuZ3VhcmRzLnB1c2goaW5qZWN0YWJsZURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZURlcHMudHlwZSA9ICdpbmplY3RhYmxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTmV3RW50aXR5SW5TdG9yZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlRGVwcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLmluamVjdGFibGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzUGlwZSh2aXNpdGVkRGVjb3JhdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwaXBlRGVwczogSVBpcGVEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAncGlwZS0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdwaXBlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IElPLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBJTy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzOiBJTy5tZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJlOiB0aGlzLmNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRQdXJlKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmduYW1lOiB0aGlzLmNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnROYW1lKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ29kZTogc3JjRmlsZS5nZXRUZXh0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1wbGVVcmxzOiB0aGlzLmNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRFeGFtcGxlVXJscyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ZpbGUuZ2V0VGV4dCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5qc2RvY3RhZ3MgJiYgSU8uanNkb2N0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZURlcHMuanNkb2N0YWdzID0gSU8uanNkb2N0YWdzWzBdLnRhZ3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMgPSBwaXBlRGVwcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIElPLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5waXBlcy5wdXNoKHBpcGVEZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNEaXJlY3RpdmUodmlzaXRlZERlY29yYXRvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpcmVjdGl2ZURlcHMgPSBuZXcgRGlyZWN0aXZlRGVwRmFjdG9yeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRIZWxwZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuY3JlYXRlKGZpbGUsIHNyY0ZpbGUsIG5hbWUsIHByb3BzLCBJTyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcyA9IGRpcmVjdGl2ZURlcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBJTy5pZ25vcmUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMuZGlyZWN0aXZlcy5wdXNoKGRpcmVjdGl2ZURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhc011bHRpcGxlRGVjb3JhdG9yc1dpdGhJbnRlcm5hbE9uZSA9IHRoaXMuaGFzSW50ZXJuYWxEZWNvcmF0b3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGVjb3JhdG9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCBhIGNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY2xhc3NXaXRoQ3VzdG9tRGVjb3JhdG9yICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFoYXNNdWx0aXBsZURlY29yYXRvcnNXaXRoSW50ZXJuYWxPbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NXaXRoQ3VzdG9tRGVjb3JhdG9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2xhc3Mobm9kZSwgZmlsZSwgc3JjRmlsZSwgb3V0cHV0U3ltYm9scywgZmlsZUJvZHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KG5hbWUsIGRlcHMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIElPLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGRlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlnbm9yZShkZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgZmlsdGVyQnlEZWNvcmF0b3JzID0gZmlsdGVyZWROb2RlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJlZE5vZGUuZXhwcmVzc2lvbiAmJiBmaWx0ZXJlZE5vZGUuZXhwcmVzc2lvbi5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IF90ZXN0ID0gLyhOZ01vZHVsZXxDb21wb25lbnR8SW5qZWN0YWJsZXxQaXBlfERpcmVjdGl2ZSkvLnRlc3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkTm9kZS5leHByZXNzaW9uLmV4cHJlc3Npb24udGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfdGVzdCAmJiB0cy5pc0NsYXNzRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Rlc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3Rlc3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHMuaXNDbGFzc0RlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgbm9kZS5kZWNvcmF0b3JzLmZpbHRlcihmaWx0ZXJCeURlY29yYXRvcnMpLmZvckVhY2godmlzaXREZWNvcmF0b3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5zeW1ib2wpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuc3ltYm9sLmZsYWdzID09PSB0cy5TeW1ib2xGbGFncy5DbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2xhc3Mobm9kZSwgZmlsZSwgc3JjRmlsZSwgb3V0cHV0U3ltYm9scywgZmlsZUJvZHkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuc3ltYm9sLmZsYWdzID09PSB0cy5TeW1ib2xGbGFncy5JbnRlcmZhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gdGhpcy5nZXRTeW1ib2xlTmFtZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBJTyA9IHRoaXMuZ2V0SW50ZXJmYWNlSU8oZmlsZSwgc3JjRmlsZSwgbm9kZSwgZmlsZUJvZHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGludGVyZmFjZURlcHM6IElJbnRlcmZhY2VEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2ludGVyZmFjZS0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW50ZXJmYWNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDb2RlOiBzcmNGaWxlLmdldFRleHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlRGVwcy5wcm9wZXJ0aWVzID0gSU8ucHJvcGVydGllcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5pbmRleFNpZ25hdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VEZXBzLmluZGV4U2lnbmF0dXJlcyA9IElPLmluZGV4U2lnbmF0dXJlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlRGVwcy5raW5kID0gSU8ua2luZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZURlcHMuZGVzY3JpcHRpb24gPSBJTy5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5tZXRob2RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlRGVwcy5tZXRob2RzID0gSU8ubWV0aG9kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5leHRlbmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlRGVwcy5leHRlbmRzID0gSU8uZXh0ZW5kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgSU8uaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoaW50ZXJmYWNlRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5pbnRlcmZhY2VzLnB1c2goaW50ZXJmYWNlRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWdub3JlKGludGVyZmFjZURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRzLmlzRnVuY3Rpb25EZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZm9zID0gdGhpcy52aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24obm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXQgdGFncyA9IHRoaXMudmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uSlNEb2NUYWdzKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBpbmZvcy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZ1bmN0aW9uRGVwOiBJRnVuY3Rpb25EZWNEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZTogJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy52aXNpdEVudW1UeXBlQWxpYXNGdW5jdGlvbkRlY2xhcmF0aW9uRGVzY3JpcHRpb24obm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mb3MuYXJncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uRGVwLmFyZ3MgPSBpbmZvcy5hcmdzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9zLmpzZG9jdGFncyAmJiBpbmZvcy5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uRGVwLmpzZG9jdGFncyA9IGluZm9zLmpzZG9jdGFncztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5mb3MuaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMucHVzaChmdW5jdGlvbkRlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHMuaXNFbnVtRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmZvcyA9IHRoaXMudmlzaXRFbnVtRGVjbGFyYXRpb24obm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IG5vZGUubmFtZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVudW1EZXBzOiBJRW51bURlY0RlcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkczogaW5mb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGU6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlOiAnZW51bScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMudmlzaXRFbnVtVHlwZUFsaWFzRnVuY3Rpb25EZWNsYXJhdGlvbkRlc2NyaXB0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0lnbm9yZShub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubWlzY2VsbGFuZW91cy5lbnVtZXJhdGlvbnMucHVzaChlbnVtRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHMuaXNUeXBlQWxpYXNEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZm9zID0gdGhpcy52aXNpdFR5cGVEZWNsYXJhdGlvbihub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gaW5mb3MubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eXBlQWxpYXNEZXBzOiBJVHlwZUFsaWFzRGVjRGVwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGU6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlOiAndHlwZWFsaWFzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXd0eXBlOiB0aGlzLmNsYXNzSGVscGVyLnZpc2l0VHlwZShub2RlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnZpc2l0RW51bVR5cGVBbGlhc0Z1bmN0aW9uRGVjbGFyYXRpb25EZXNjcmlwdGlvbihub2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQWxpYXNEZXBzLmtpbmQgPSBub2RlLnR5cGUua2luZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZUFsaWFzRGVwcy5yYXd0eXBlID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQWxpYXNEZXBzLnJhd3R5cGUgPSBraW5kVG9UeXBlKG5vZGUudHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSWdub3JlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzLnB1c2godHlwZUFsaWFzRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHMuaXNNb2R1bGVEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuYm9keSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmJvZHkuc3RhdGVtZW50cyAmJiBub2RlLmJvZHkuc3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYm9keS5zdGF0ZW1lbnRzLmZvckVhY2goc3RhdGVtZW50ID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZU5vZGUoZmlsZSwgc3JjRmlsZSwgc3RhdGVtZW50LCBub2RlLmJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IElPID0gdGhpcy5nZXRSb3V0ZUlPKGZpbGUsIHNyY0ZpbGUsIG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoSU8ucm91dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3Um91dGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdSb3V0ZXMgPSB0aGlzLnJvdXRlclBhcnNlci5jbGVhblJhd1JvdXRlUGFyc2VkKElPLnJvdXRlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JvdXRlcyBwYXJzaW5nIGVycm9yLCBtYXliZSBhIHRyYWlsaW5nIGNvbW1hIG9yIGFuIGV4dGVybmFsIHZhcmlhYmxlLCB0cnlpbmcgdG8gZml4IHRoYXQgbGF0ZXIgYWZ0ZXIgc291cmNlcyBzY2FubmluZy4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdSb3V0ZXMgPSBJTy5yb3V0ZXMucmVwbGFjZSgvIC9nbSwgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVyUGFyc2VyLmFkZEluY29tcGxldGVSb3V0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IG5ld1JvdXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5yb3V0ZXMgPSBbLi4ub3V0cHV0U3ltYm9scy5yb3V0ZXMsIC4uLm5ld1JvdXRlc107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRzLmlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2xhc3Mobm9kZSwgZmlsZSwgc3JjRmlsZSwgb3V0cHV0U3ltYm9scywgZmlsZUJvZHkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cy5pc0V4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSkgfHwgdHMuaXNJZlN0YXRlbWVudChub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJvb3RzdHJhcE1vZHVsZVJlZmVyZW5jZSA9ICdib290c3RyYXBNb2R1bGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgcm9vdCBtb2R1bGUgd2l0aCBib290c3RyYXBNb2R1bGUgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS4gZmluZCBhIHNpbXBsZSBjYWxsIDogcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gb3IgaW5zaWRlIGEgY2FsbCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAzLiB3aXRoIGEgY2F0Y2ggOiBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljKCkuYm9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSkuY2F0Y2goZXJyb3IgPT4gY29uc29sZS5lcnJvcihlcnJvcikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gNC4gd2l0aCBwYXJhbWV0ZXJzIDogcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUsIHt9KS5jYXRjaChlcnJvciA9PiBjb25zb2xlLmVycm9yKGVycm9yKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIHJlY3VzaXZlbHkgaW4gZXhwcmVzc2lvbiBub2RlcyBvbmUgd2l0aCBuYW1lICdib290c3RyYXBNb2R1bGUnXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm9vdE1vZHVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHROb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY0ZpbGUudGV4dC5pbmRleE9mKGJvb3RzdHJhcE1vZHVsZVJlZmVyZW5jZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHROb2RlID0gdGhpcy5maW5kRXhwcmVzc2lvbkJ5TmFtZUluRXhwcmVzc2lvbnMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm9vdHN0cmFwTW9kdWxlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5vZGUudGhlblN0YXRlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS50aGVuU3RhdGVtZW50LnN0YXRlbWVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudGhlblN0YXRlbWVudC5zdGF0ZW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3RTdGF0ZW1lbnQgPSBub2RlLnRoZW5TdGF0ZW1lbnQuc3RhdGVtZW50c1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdE5vZGUgPSB0aGlzLmZpbmRFeHByZXNzaW9uQnlOYW1lSW5FeHByZXNzaW9ucyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFN0YXRlbWVudC5leHByZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib290c3RyYXBNb2R1bGUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmV4cHJlc3Npb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZXhwcmVzc2lvbi5hcmd1bWVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdE5vZGUgPSB0aGlzLmZpbmRFeHByZXNzaW9uQnlOYW1lSW5FeHByZXNzaW9uQXJndW1lbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZXhwcmVzc2lvbi5hcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jvb3RzdHJhcE1vZHVsZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdE5vZGUuYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChyZXN1bHROb2RlLmFyZ3VtZW50cywgKGFyZ3VtZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnQudGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290TW9kdWxlID0gYXJndW1lbnQudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9vdE1vZHVsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXJQYXJzZXIuc2V0Um9vdE1vZHVsZShyb290TW9kdWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHMuaXNWYXJpYWJsZVN0YXRlbWVudChub2RlKSAmJiAhdGhpcy5yb3V0ZXJQYXJzZXIuaXNWYXJpYWJsZVJvdXRlcyhub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZm9zOiBhbnkgPSB0aGlzLnZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gaW5mb3MubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZXBzOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZTogJ21pc2NlbGxhbmVvdXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGU6ICd2YXJpYWJsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMudHlwZSA9IGluZm9zLnR5cGUgPyBpbmZvcy50eXBlIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mb3MuZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy5kZWZhdWx0VmFsdWUgPSBpbmZvcy5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mb3MuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzLmluaXRpYWxpemVyID0gaW5mb3MuaW5pdGlhbGl6ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5qc0RvYyAmJiBub2RlLmpzRG9jLmxlbmd0aCA+IDAgJiYgbm9kZS5qc0RvY1swXS5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy5kZXNjcmlwdGlvbiA9IG1hcmtlZChub2RlLmpzRG9jWzBdLmNvbW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTW9kdWxlV2l0aFByb3ZpZGVycyhub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3V0aW5nSW5pdGlhbGl6ZXIgPSBnZXRNb2R1bGVXaXRoUHJvdmlkZXJzKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVyUGFyc2VyLmFkZE1vZHVsZVdpdGhSb3V0ZXMobmFtZSwgW3JvdXRpbmdJbml0aWFsaXplcl0sIGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVyUGFyc2VyLmFkZE1vZHVsZShuYW1lLCBbcm91dGluZ0luaXRpYWxpemVyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSWdub3JlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5wdXNoKGRlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cy5pc1R5cGVBbGlhc0RlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5mb3MgPSB0aGlzLnZpc2l0VHlwZURlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBpbmZvcy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlcHM6IElUeXBlQWxpYXNEZWNEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZTogJ21pc2NlbGxhbmVvdXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGU6ICd0eXBlYWxpYXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd3R5cGU6IHRoaXMuY2xhc3NIZWxwZXIudmlzaXRUeXBlKG5vZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMudmlzaXRFbnVtVHlwZUFsaWFzRnVuY3Rpb25EZWNsYXJhdGlvbkRlc2NyaXB0aW9uKG5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMua2luZCA9IG5vZGUudHlwZS5raW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0lnbm9yZShub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcy5wdXNoKGRlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cy5pc0Z1bmN0aW9uRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmZvcyA9IHRoaXMudmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBpbmZvcy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZ1bmN0aW9uRGVwOiBJRnVuY3Rpb25EZWNEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZTogJ21pc2NlbGxhbmVvdXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGU6ICdmdW5jdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy52aXNpdEVudW1UeXBlQWxpYXNGdW5jdGlvbkRlY2xhcmF0aW9uRGVzY3JpcHRpb24obm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mb3MuYXJncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uRGVwLmFyZ3MgPSBpbmZvcy5hcmdzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9zLmpzZG9jdGFncyAmJiBpbmZvcy5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uRGVwLmpzZG9jdGFncyA9IGluZm9zLmpzZG9jdGFncztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5mb3MuaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMucHVzaChmdW5jdGlvbkRlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRzLmlzRW51bURlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5mb3MgPSB0aGlzLnZpc2l0RW51bURlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBub2RlLm5hbWUudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbnVtRGVwczogSUVudW1EZWNEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHM6IGluZm9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZTogJ2VudW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnZpc2l0RW51bVR5cGVBbGlhc0Z1bmN0aW9uRGVjbGFyYXRpb25EZXNjcmlwdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNJZ25vcmUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLnB1c2goZW51bURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcGFyc2VOb2RlKGZpbGVOYW1lLCBzY2FubmVkRmlsZSwgaW5pdGlhbE5vZGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byBpbiBhIHNwZWNpZmljIHN0b3JlIGFuIGVudGl0eSwgYW5kIGNoZWNrIGJlZm9yZSBpcyB0aGVyZSBpcyBub3QgdGhlIHNhbWUgb25lXG4gICAgICogaW4gdGhhdCBzdG9yZSA6IHNhbWUgbmFtZSwgaWQgYW5kIGZpbGVcbiAgICAgKiBAcGFyYW0gZW50aXR5IEVudGl0eSB0byBzdG9yZVxuICAgICAqIEBwYXJhbSBzdG9yZSBTdG9yZVxuICAgICAqL1xuICAgIHByaXZhdGUgYWRkTmV3RW50aXR5SW5TdG9yZShlbnRpdHksIHN0b3JlKSB7XG4gICAgICAgIGxldCBmaW5kU2FtZUVudGl0eUluU3RvcmUgPSBfLmZpbHRlcihzdG9yZSwge1xuICAgICAgICAgICAgbmFtZTogZW50aXR5Lm5hbWUsXG4gICAgICAgICAgICBpZDogZW50aXR5LmlkLFxuICAgICAgICAgICAgZmlsZTogZW50aXR5LmZpbGVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChmaW5kU2FtZUVudGl0eUluU3RvcmUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBzdG9yZS5wdXNoKGVudGl0eSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGRlYnVnKGRlcHM6IElEZXApIHtcbiAgICAgICAgaWYgKGRlcHMpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnZm91bmQnLCBgJHtkZXBzLm5hbWV9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgWydpbXBvcnRzJywgJ2V4cG9ydHMnLCAnZGVjbGFyYXRpb25zJywgJ3Byb3ZpZGVycycsICdib290c3RyYXAnXS5mb3JFYWNoKHN5bWJvbHMgPT4ge1xuICAgICAgICAgICAgaWYgKGRlcHNbc3ltYm9sc10gJiYgZGVwc1tzeW1ib2xzXS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCcnLCBgLSAke3N5bWJvbHN9OmApO1xuICAgICAgICAgICAgICAgIGRlcHNbc3ltYm9sc10ubWFwKGkgPT4gaS5uYW1lKS5mb3JFYWNoKGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJycsIGBcXHQtICR7ZH1gKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpZ25vcmUoZGVwczogSURlcCkge1xuICAgICAgICBpZiAoZGVwcykge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2lnbm9yZScsIGAke2RlcHMubmFtZX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZmluZEV4cHJlc3Npb25CeU5hbWVJbkV4cHJlc3Npb25zKGVudHJ5Tm9kZSwgbmFtZSkge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBsZXQgbG9vcCA9IGZ1bmN0aW9uKG5vZGUsIHopIHtcbiAgICAgICAgICAgIGlmIChub2RlLmV4cHJlc3Npb24gJiYgIW5vZGUuZXhwcmVzc2lvbi5uYW1lKSB7XG4gICAgICAgICAgICAgICAgbG9vcChub2RlLmV4cHJlc3Npb24sIHopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUuZXhwcmVzc2lvbiAmJiBub2RlLmV4cHJlc3Npb24ubmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmV4cHJlc3Npb24ubmFtZS50ZXh0ID09PSB6KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5vZGU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9vcChub2RlLmV4cHJlc3Npb24sIHopO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbG9vcChlbnRyeU5vZGUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZEV4cHJlc3Npb25CeU5hbWVJbkV4cHJlc3Npb25Bcmd1bWVudHMoYXJnLCBuYW1lKSB7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCB0aGF0ID0gdGhpcztcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgbGVuID0gYXJnLmxlbmd0aDtcbiAgICAgICAgbGV0IGxvb3AgPSBmdW5jdGlvbihub2RlLCB6KSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ib2R5KSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuYm9keS5zdGF0ZW1lbnRzICYmIG5vZGUuYm9keS5zdGF0ZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGogPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGVuZyA9IG5vZGUuYm9keS5zdGF0ZW1lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChqOyBqIDwgbGVuZzsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGF0LmZpbmRFeHByZXNzaW9uQnlOYW1lSW5FeHByZXNzaW9ucyhub2RlLmJvZHkuc3RhdGVtZW50c1tqXSwgeik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBsb29wKGFyZ1tpXSwgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlRGVjb3JhdG9ycyhkZWNvcmF0b3JzLCB0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBpZiAoZGVjb3JhdG9ycy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBfLmZvckVhY2goZGVjb3JhdG9ycywgZnVuY3Rpb24oZGVjb3JhdG9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbi50ZXh0ID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZGVjb3JhdG9yc1swXS5leHByZXNzaW9uLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yc1swXS5leHByZXNzaW9uLmV4cHJlc3Npb24udGV4dCA9PT0gdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VEZWNvcmF0b3IoZGVjb3JhdG9yLCB0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgaWYgKGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb24udGV4dCA9PT0gdHlwZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQ29udHJvbGxlcihtZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURlY29yYXRvcihtZXRhZGF0YSwgJ0NvbnRyb2xsZXInKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQ29tcG9uZW50KG1ldGFkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGVjb3JhdG9yKG1ldGFkYXRhLCAnQ29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1BpcGUobWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEZWNvcmF0b3IobWV0YWRhdGEsICdQaXBlJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0RpcmVjdGl2ZShtZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURlY29yYXRvcihtZXRhZGF0YSwgJ0RpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNJbmplY3RhYmxlKG1ldGFkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGVjb3JhdG9yKG1ldGFkYXRhLCAnSW5qZWN0YWJsZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNNb2R1bGUobWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEZWNvcmF0b3IobWV0YWRhdGEsICdOZ01vZHVsZScpIHx8IHRoaXMucGFyc2VEZWNvcmF0b3IobWV0YWRhdGEsICdNb2R1bGUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc0ludGVybmFsRGVjb3JhdG9yKG1ldGFkYXRhcykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5wYXJzZURlY29yYXRvcnMobWV0YWRhdGFzLCAnQ29udHJvbGxlcicpIHx8XG4gICAgICAgICAgICB0aGlzLnBhcnNlRGVjb3JhdG9ycyhtZXRhZGF0YXMsICdDb21wb25lbnQnKSB8fFxuICAgICAgICAgICAgdGhpcy5wYXJzZURlY29yYXRvcnMobWV0YWRhdGFzLCAnUGlwZScpIHx8XG4gICAgICAgICAgICB0aGlzLnBhcnNlRGVjb3JhdG9ycyhtZXRhZGF0YXMsICdEaXJlY3RpdmUnKSB8fFxuICAgICAgICAgICAgdGhpcy5wYXJzZURlY29yYXRvcnMobWV0YWRhdGFzLCAnSW5qZWN0YWJsZScpIHx8XG4gICAgICAgICAgICB0aGlzLnBhcnNlRGVjb3JhdG9ycyhtZXRhZGF0YXMsICdOZ01vZHVsZScpIHx8XG4gICAgICAgICAgICB0aGlzLnBhcnNlRGVjb3JhdG9ycyhtZXRhZGF0YXMsICdNb2R1bGUnKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNHdWFyZChpb0ltcGxlbWVudHM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBfLmluY2x1ZGVzKGlvSW1wbGVtZW50cywgJ0NhbkFjdGl2YXRlJykgfHxcbiAgICAgICAgICAgIF8uaW5jbHVkZXMoaW9JbXBsZW1lbnRzLCAnQ2FuQWN0aXZhdGVDaGlsZCcpIHx8XG4gICAgICAgICAgICBfLmluY2x1ZGVzKGlvSW1wbGVtZW50cywgJ0NhbkRlYWN0aXZhdGUnKSB8fFxuICAgICAgICAgICAgXy5pbmNsdWRlcyhpb0ltcGxlbWVudHMsICdSZXNvbHZlJykgfHxcbiAgICAgICAgICAgIF8uaW5jbHVkZXMoaW9JbXBsZW1lbnRzLCAnQ2FuTG9hZCcpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTeW1ib2xlTmFtZShub2RlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIG5vZGUubmFtZS50ZXh0O1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZFByb3BlcnRpZXMoXG4gICAgICAgIHZpc2l0ZWROb2RlOiB0cy5EZWNvcmF0b3IsXG4gICAgICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB2aXNpdGVkTm9kZS5leHByZXNzaW9uICYmXG4gICAgICAgICAgICB2aXNpdGVkTm9kZS5leHByZXNzaW9uLmFyZ3VtZW50cyAmJlxuICAgICAgICAgICAgdmlzaXRlZE5vZGUuZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCBwb3AgPSB2aXNpdGVkTm9kZS5leHByZXNzaW9uLmFyZ3VtZW50c1swXTtcblxuICAgICAgICAgICAgaWYgKHBvcCAmJiBwb3AucHJvcGVydGllcyAmJiBwb3AucHJvcGVydGllcy5sZW5ndGggPj0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwb3AucHJvcGVydGllcztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocG9wICYmIHBvcC5raW5kICYmIHBvcC5raW5kID09PSBTeW50YXhLaW5kLlN0cmluZ0xpdGVyYWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3BvcF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdFbXB0eSBtZXRhZGF0YXMsIHRyeWluZyB0byBmb3VuZCBpdCB3aXRoIGltcG9ydHMuJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0c1V0aWwuZmluZFZhbHVlSW5JbXBvcnRPckxvY2FsVmFyaWFibGVzKHBvcC50ZXh0LCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQW5ndWxhckxpZmVjeWNsZUhvb2sobWV0aG9kTmFtZSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBBTkdVTEFSX0xJRkVDWUNMRV9NRVRIT0RTID0gW1xuICAgICAgICAgICAgJ25nT25Jbml0JyxcbiAgICAgICAgICAgICduZ09uQ2hhbmdlcycsXG4gICAgICAgICAgICAnbmdEb0NoZWNrJyxcbiAgICAgICAgICAgICduZ09uRGVzdHJveScsXG4gICAgICAgICAgICAnbmdBZnRlckNvbnRlbnRJbml0JyxcbiAgICAgICAgICAgICduZ0FmdGVyQ29udGVudENoZWNrZWQnLFxuICAgICAgICAgICAgJ25nQWZ0ZXJWaWV3SW5pdCcsXG4gICAgICAgICAgICAnbmdBZnRlclZpZXdDaGVja2VkJyxcbiAgICAgICAgICAgICd3cml0ZVZhbHVlJyxcbiAgICAgICAgICAgICdyZWdpc3Rlck9uQ2hhbmdlJyxcbiAgICAgICAgICAgICdyZWdpc3Rlck9uVG91Y2hlZCcsXG4gICAgICAgICAgICAnc2V0RGlzYWJsZWRTdGF0ZSdcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIEFOR1VMQVJfTElGRUNZQ0xFX01FVEhPRFMuaW5kZXhPZihtZXRob2ROYW1lKSA+PSAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRUeXBlRGVjbGFyYXRpb24obm9kZTogdHMuVHlwZUFsaWFzRGVjbGFyYXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdDogYW55ID0ge1xuICAgICAgICAgICAgbmFtZTogbm9kZS5uYW1lLnRleHQsXG4gICAgICAgICAgICBraW5kOiBub2RlLmtpbmRcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhub2RlKTtcblxuICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgaWYgKGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2N0YWdzWzBdLnRhZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdEFyZ3VtZW50KGFyZykge1xuICAgICAgICBsZXQgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBuYW1lOiBhcmcubmFtZS50ZXh0LFxuICAgICAgICAgICAgdHlwZTogdGhpcy5jbGFzc0hlbHBlci52aXNpdFR5cGUoYXJnKVxuICAgICAgICB9O1xuICAgICAgICBpZiAoYXJnLmRvdERvdERvdFRva2VuKSB7XG4gICAgICAgICAgICByZXN1bHQuZG90RG90RG90VG9rZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmcucXVlc3Rpb25Ub2tlbikge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJnLnR5cGUpIHtcbiAgICAgICAgICAgIHJlc3VsdC50eXBlID0gdGhpcy5tYXBUeXBlKGFyZy50eXBlLmtpbmQpO1xuICAgICAgICAgICAgaWYgKGFyZy50eXBlLmtpbmQgPT09IDE1Nykge1xuICAgICAgICAgICAgICAgIC8vIHRyeSByZXBsYWNlIFR5cGVSZWZlcmVuY2Ugd2l0aCB0eXBlTmFtZVxuICAgICAgICAgICAgICAgIGlmIChhcmcudHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQudHlwZSA9IGFyZy50eXBlLnR5cGVOYW1lLnRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYXBUeXBlKHR5cGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgOTU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICAgICAgICAgIGNhc2UgMTE5OlxuICAgICAgICAgICAgICAgIHJldHVybiAnYW55JztcbiAgICAgICAgICAgIGNhc2UgMTIyOlxuICAgICAgICAgICAgICAgIHJldHVybiAnYm9vbGVhbic7XG4gICAgICAgICAgICBjYXNlIDEzMDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ25ldmVyJztcbiAgICAgICAgICAgIGNhc2UgMTMzOlxuICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICAgICAgICAgIGNhc2UgMTM2OlxuICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJztcbiAgICAgICAgICAgIGNhc2UgMTM5OlxuICAgICAgICAgICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICAgICAgICAgIGNhc2UgMTU5OlxuICAgICAgICAgICAgICAgIHJldHVybiAndHlwZVJlZmVyZW5jZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihtZXRob2Q6IHRzLkZ1bmN0aW9uRGVjbGFyYXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdDogYW55ID0ge1xuICAgICAgICAgICAgbmFtZTogbWV0aG9kLm5hbWUudGV4dCxcbiAgICAgICAgICAgIGFyZ3M6IG1ldGhvZC5wYXJhbWV0ZXJzID8gbWV0aG9kLnBhcmFtZXRlcnMubWFwKHByb3AgPT4gdGhpcy52aXNpdEFyZ3VtZW50KHByb3ApKSA6IFtdXG4gICAgICAgIH07XG4gICAgICAgIGxldCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3MobWV0aG9kKTtcblxuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC50eXBlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmVzdWx0LnJldHVyblR5cGUgPSB0aGlzLmNsYXNzSGVscGVyLnZpc2l0VHlwZShtZXRob2QudHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0aG9kLm1vZGlmaWVycykge1xuICAgICAgICAgICAgaWYgKG1ldGhvZC5tb2RpZmllcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBraW5kcyA9IG1ldGhvZC5tb2RpZmllcnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcChtb2RpZmllciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kaWZpZXIua2luZDtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIF8uaW5kZXhPZihraW5kcywgU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgXy5pbmRleE9mKGtpbmRzLCBTeW50YXhLaW5kLlN0YXRpY0tleXdvcmQpICE9PSAtMVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBraW5kcyA9IGtpbmRzLmZpbHRlcihraW5kID0+IGtpbmQgIT09IFN5bnRheEtpbmQuUHVibGljS2V5d29yZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICBpZiAoanNkb2N0YWdzWzBdLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuanNkb2N0YWdzID0gbWFya2VkdGFncyhqc2RvY3RhZ3NbMF0udGFncyk7XG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKGpzZG9jdGFnc1swXS50YWdzLCB0YWcgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFnLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWcudGFnTmFtZS50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZy50YWdOYW1lLnRleHQuaW5kZXhPZignaWdub3JlJykgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuaWdub3JlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmpzZG9jdGFncyAmJiByZXN1bHQuanNkb2N0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKHJlc3VsdC5hcmdzLCByZXN1bHQuanNkb2N0YWdzKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXN1bHQuanNkb2N0YWdzID0gbWVyZ2VUYWdzQW5kQXJncyhyZXN1bHQuYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS5uYW1lLnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLmluaXRpYWxpemVyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuY2xhc3NIZWxwZXIuc3RyaW5naWZ5RGVmYXVsdFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLmluaXRpYWxpemVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5pbml0aWFsaXplciA9IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS5pbml0aWFsaXplcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC50eXBlID0gdGhpcy5jbGFzc0hlbHBlci52aXNpdFR5cGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV0udHlwZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdC50eXBlID09PSAndW5kZWZpbmVkJyAmJiByZXN1bHQuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnR5cGUgPSBraW5kVG9UeXBlKHJlc3VsdC5pbml0aWFsaXplci5raW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uSlNEb2NUYWdzKG5vZGU6IHRzLkZ1bmN0aW9uRGVjbGFyYXRpb24pOiBzdHJpbmcge1xuICAgICAgICBsZXQganNkb2N0YWdzID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0SlNEb2NzKG5vZGUpO1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgaWYgKGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbWFya2VkdGFncyhqc2RvY3RhZ3NbMF0udGFncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0RW51bVR5cGVBbGlhc0Z1bmN0aW9uRGVjbGFyYXRpb25EZXNjcmlwdGlvbihub2RlKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGRlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJztcbiAgICAgICAgaWYgKG5vZGUuanNEb2MpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmpzRG9jLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5vZGUuanNEb2NbMF0uY29tbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBtYXJrZWQobm9kZS5qc0RvY1swXS5jb21tZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRFbnVtRGVjbGFyYXRpb24obm9kZTogdHMuRW51bURlY2xhcmF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgaWYgKG5vZGUubWVtYmVycykge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IG5vZGUubWVtYmVycy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBtZW1iZXI6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbm9kZS5tZW1iZXJzW2ldLm5hbWUudGV4dFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubWVtYmVyc1tpXS5pbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICBtZW1iZXIudmFsdWUgPSBub2RlLm1lbWJlcnNbaV0uaW5pdGlhbGl6ZXIudGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobWVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRFbnVtRGVjbGFyYXRpb25Gb3JSb3V0ZXMoZmlsZU5hbWUsIG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCByb3V0ZXNJbml0aWFsaXplciA9IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS5pbml0aWFsaXplcjtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IG5ldyBDb2RlR2VuZXJhdG9yKCkuZ2VuZXJhdGUocm91dGVzSW5pdGlhbGl6ZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyUGFyc2VyLmFkZFJvdXRlKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLm5hbWUudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogdGhpcy5yb3V0ZXJQYXJzZXIuY2xlYW5SYXdSb3V0ZShkYXRhKSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVOYW1lXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVzOiBkYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFJvdXRlSU8oZmlsZW5hbWU6IHN0cmluZywgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSwgbm9kZTogdHMuTm9kZSkge1xuICAgICAgICBsZXQgcmVzO1xuICAgICAgICBpZiAoc291cmNlRmlsZS5zdGF0ZW1lbnRzKSB7XG4gICAgICAgICAgICByZXMgPSBzb3VyY2VGaWxlLnN0YXRlbWVudHMucmVkdWNlKChkaXJlY3RpdmUsIHN0YXRlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvdXRlclBhcnNlci5pc1ZhcmlhYmxlUm91dGVzKHN0YXRlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlbWVudC5wb3MgPT09IG5vZGUucG9zICYmIHN0YXRlbWVudC5lbmQgPT09IG5vZGUuZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpc2l0RW51bURlY2xhcmF0aW9uRm9yUm91dGVzKGZpbGVuYW1lLCBzdGF0ZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICAgICAgICAgIH0sIFtdKTtcbiAgICAgICAgICAgIHJldHVybiByZXNbMF0gfHwge307XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENsYXNzSU8oZmlsZW5hbWU6IHN0cmluZywgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSwgbm9kZTogdHMuTm9kZSwgZmlsZUJvZHkpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IHJlZHVjZWRTb3VyY2UgPSBmaWxlQm9keSA/IGZpbGVCb2R5LnN0YXRlbWVudHMgOiBzb3VyY2VGaWxlLnN0YXRlbWVudHM7XG4gICAgICAgIGxldCByZXMgPSByZWR1Y2VkU291cmNlLnJlZHVjZSgoZGlyZWN0aXZlLCBzdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0cy5pc0NsYXNzRGVjbGFyYXRpb24oc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQucG9zID09PSBub2RlLnBvcyAmJiBzdGF0ZW1lbnQuZW5kID09PSBub2RlLmVuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NIZWxwZXIudmlzaXRDbGFzc0RlY2xhcmF0aW9uKGZpbGVuYW1lLCBzdGF0ZW1lbnQsIHNvdXJjZUZpbGUpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc1swXSB8fCB7fTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEludGVyZmFjZUlPKGZpbGVuYW1lOiBzdHJpbmcsIHNvdXJjZUZpbGUsIG5vZGUsIGZpbGVCb2R5KSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb3B5cmlnaHQgaHR0cHM6Ly9naXRodWIuY29tL25nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcbiAgICAgICAgICovXG4gICAgICAgIGxldCByZWR1Y2VkU291cmNlID0gZmlsZUJvZHkgPyBmaWxlQm9keS5zdGF0ZW1lbnRzIDogc291cmNlRmlsZS5zdGF0ZW1lbnRzO1xuICAgICAgICBsZXQgcmVzID0gcmVkdWNlZFNvdXJjZS5yZWR1Y2UoKGRpcmVjdGl2ZSwgc3RhdGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodHMuaXNJbnRlcmZhY2VEZWNsYXJhdGlvbihzdGF0ZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlbWVudC5wb3MgPT09IG5vZGUucG9zICYmIHN0YXRlbWVudC5lbmQgPT09IG5vZGUuZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXJlY3RpdmUuY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGFzc0hlbHBlci52aXNpdENsYXNzRGVjbGFyYXRpb24oZmlsZW5hbWUsIHN0YXRlbWVudCwgc291cmNlRmlsZSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICByZXR1cm4gcmVzWzBdIHx8IHt9O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbmZpZ3VyYXRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFJvdXRlclBhcnNlclV0aWwsIEpzZG9jUGFyc2VyVXRpbCwgSW1wb3J0c1V0aWwgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBGcmFtZXdvcmtEZXBlbmRlbmNpZXMgfSBmcm9tICcuL2ZyYW1ld29yay1kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHsgQ29tcG9uZW50Q2FjaGUgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IHsgTW9kdWxlSGVscGVyIH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvaGVscGVycy9tb2R1bGUtaGVscGVyJztcbmltcG9ydCB7IEpzRG9jSGVscGVyIH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvaGVscGVycy9qcy1kb2MtaGVscGVyJztcbmltcG9ydCB7IFN5bWJvbEhlbHBlciB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2hlbHBlcnMvc3ltYm9sLWhlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBBbmd1bGFySlNEZXBlbmRlbmNpZXMgZXh0ZW5kcyBGcmFtZXdvcmtEZXBlbmRlbmNpZXMge1xuXG4gICAgcHJpdmF0ZSBlbmdpbmU6IGFueTtcbiAgICBwcml2YXRlIGNhY2hlOiBDb21wb25lbnRDYWNoZSA9IG5ldyBDb21wb25lbnRDYWNoZSgpO1xuICAgIHByaXZhdGUgbW9kdWxlSGVscGVyID0gbmV3IE1vZHVsZUhlbHBlcih0aGlzLmNhY2hlKTtcbiAgICBwcml2YXRlIGpzRG9jSGVscGVyID0gbmV3IEpzRG9jSGVscGVyKCk7XG4gICAgcHJpdmF0ZSBzeW1ib2xIZWxwZXIgPSBuZXcgU3ltYm9sSGVscGVyKCk7XG4gICAgcHJpdmF0ZSBqc2RvY1BhcnNlclV0aWwgPSBuZXcgSnNkb2NQYXJzZXJVdGlsKCk7XG4gICAgcHJpdmF0ZSBpbXBvcnRzVXRpbCA9IG5ldyBJbXBvcnRzVXRpbCgpO1xuXG4gICAgY29uc3RydWN0b3IoZmlsZXM6IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zOiBhbnksXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UsXG4gICAgICAgIHJvdXRlclBhcnNlcjogUm91dGVyUGFyc2VyVXRpbCkge1xuICAgICAgICBzdXBlcihmaWxlcyxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgcm91dGVyUGFyc2VyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVwZW5kZW5jaWVzKCkge1xuICAgICAgICBsZXQgZGVwcyA9IHtcbiAgICAgICAgICAgIG1vZHVsZXM6IFtdLFxuICAgICAgICAgICAgbW9kdWxlc0ZvckdyYXBoOiBbXSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IFtdLFxuICAgICAgICAgICAgaW5qZWN0YWJsZXM6IFtdLFxuICAgICAgICAgICAgaW50ZXJjZXB0b3JzOiBbXSxcbiAgICAgICAgICAgIHBpcGVzOiBbXSxcbiAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtdLFxuICAgICAgICAgICAgcm91dGVzOiBbXSxcbiAgICAgICAgICAgIGNsYXNzZXM6IFtdLFxuICAgICAgICAgICAgaW50ZXJmYWNlczogW10sXG4gICAgICAgICAgICBtaXNjZWxsYW5lb3VzOiB7XG4gICAgICAgICAgICAgICAgdmFyaWFibGVzOiBbXSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbnM6IFtdLFxuICAgICAgICAgICAgICAgIHR5cGVhbGlhc2VzOiBbXSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhdGlvbnM6IFtdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcm91dGVzVHJlZTogdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBkZXBzO1xuICAgIH1cbn0iLCJleHBvcnQgZnVuY3Rpb24gcHJvbWlzZVNlcXVlbnRpYWwocHJvbWlzZXMpIHtcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9taXNlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCBuZWVkIHRvIGJlIGFuIGFycmF5IG9mIFByb21pc2VzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICBsZXQgcmVzdWx0cyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGl0ZXJhdGVlRnVuYyA9IChwcmV2aW91c1Byb21pc2UsIGN1cnJlbnRQcm9taXNlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQrKyAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRQcm9taXNlKHJlc3VsdCwgcmVzdWx0cywgY291bnQpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIHByb21pc2VzID0gcHJvbWlzZXMuY29uY2F0KCgpID0+IFByb21pc2UucmVzb2x2ZSgpKTtcblxuICAgICAgICBwcm9taXNlc1xuICAgICAgICAgICAgLnJlZHVjZShpdGVyYXRlZUZ1bmMsIFByb21pc2UucmVzb2x2ZShmYWxzZSkpXG4gICAgICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHRzKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgfSk7XG59XG4iLCJpbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IFBhcnNlZERhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3BhcnNlZC1kYXRhLmludGVyZmFjZSc7XG5pbXBvcnQgeyBNaXNjZWxsYW5lb3VzRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMvbWlzY2VsbGFuZW91cy1kYXRhLmludGVyZmFjZSc7XG5cbmltcG9ydCB7IGdldE5hbWVzQ29tcGFyZUZuIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHsgSU1vZHVsZURlcCB9IGZyb20gJy4uL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9tb2R1bGUtZGVwLmZhY3RvcnknO1xuaW1wb3J0IHsgSUNvbXBvbmVudERlcCB9IGZyb20gJy4uL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9jb21wb25lbnQtZGVwLmZhY3RvcnknO1xuaW1wb3J0IHsgSURpcmVjdGl2ZURlcCB9IGZyb20gJy4uL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9kaXJlY3RpdmUtZGVwLmZhY3RvcnknO1xuaW1wb3J0IHsgSUFwaVNvdXJjZVJlc3VsdCB9IGZyb20gJy4uLy4uL3V0aWxzL2FwaS1zb3VyY2UtcmVzdWx0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBSb3V0ZUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcm91dGVzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBBbmd1bGFyQXBpVXRpbCB9IGZyb20gJy4uLy4uL3V0aWxzL2FuZ3VsYXItYXBpLnV0aWwnO1xuaW1wb3J0IHtcbiAgICBJSW5qZWN0YWJsZURlcCxcbiAgICBJSW50ZXJmYWNlRGVwLFxuICAgIElQaXBlRGVwLFxuICAgIElUeXBlQWxpYXNEZWNEZXAsXG4gICAgSUZ1bmN0aW9uRGVjRGVwLFxuICAgIElFbnVtRGVjRGVwLFxuICAgIElJbnRlcmNlcHRvckRlcCxcbiAgICBJR3VhcmREZXBcbn0gZnJvbSAnLi4vY29tcGlsZXIvYW5ndWxhci9kZXBlbmRlbmNpZXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJQ29udHJvbGxlckRlcCB9IGZyb20gJy4uL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9jb250cm9sbGVyLWRlcC5mYWN0b3J5JztcblxuY29uc3QgdHJhdmVyc2UgPSByZXF1aXJlKCd0cmF2ZXJzZScpO1xuXG5leHBvcnQgY2xhc3MgRGVwZW5kZW5jaWVzRW5naW5lIHtcbiAgICBwdWJsaWMgcmF3RGF0YTogUGFyc2VkRGF0YTtcbiAgICBwdWJsaWMgbW9kdWxlczogT2JqZWN0W107XG4gICAgcHVibGljIHJhd01vZHVsZXM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyByYXdNb2R1bGVzRm9yT3ZlcnZpZXc6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBjb21wb25lbnRzOiBPYmplY3RbXTtcbiAgICBwdWJsaWMgY29udHJvbGxlcnM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBkaXJlY3RpdmVzOiBPYmplY3RbXTtcbiAgICBwdWJsaWMgaW5qZWN0YWJsZXM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBpbnRlcmNlcHRvcnM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBndWFyZHM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBpbnRlcmZhY2VzOiBPYmplY3RbXTtcbiAgICBwdWJsaWMgcm91dGVzOiBSb3V0ZUludGVyZmFjZTtcbiAgICBwdWJsaWMgcGlwZXM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBjbGFzc2VzOiBPYmplY3RbXTtcbiAgICBwdWJsaWMgbWlzY2VsbGFuZW91czogTWlzY2VsbGFuZW91c0RhdGE7XG5cbiAgICBwcml2YXRlIGFuZ3VsYXJBcGlVdGlsOiBBbmd1bGFyQXBpVXRpbCA9IG5ldyBBbmd1bGFyQXBpVXRpbCgpO1xuXG4gICAgcHJpdmF0ZSBjbGVhbk1vZHVsZXMobW9kdWxlcykge1xuICAgICAgICBsZXQgX20gPSBtb2R1bGVzO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBtb2R1bGVzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgbGV0IGogPSAwO1xuICAgICAgICAgICAgbGV0IGxlbmcgPSBfbVtpXS5kZWNsYXJhdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChqOyBqIDwgbGVuZzsgaisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGsgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBsZW5ndDtcbiAgICAgICAgICAgICAgICBpZiAoX21baV0uZGVjbGFyYXRpb25zW2pdLmpzZG9jdGFncykge1xuICAgICAgICAgICAgICAgICAgICBsZW5ndCA9IF9tW2ldLmRlY2xhcmF0aW9uc1tqXS5qc2RvY3RhZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGs7IGsgPCBsZW5ndDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgX21baV0uZGVjbGFyYXRpb25zW2pdLmpzZG9jdGFnc1trXS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF9tW2ldLmRlY2xhcmF0aW9uc1tqXS5jb25zdHJ1Y3Rvck9iaikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX21baV0uZGVjbGFyYXRpb25zW2pdLmNvbnN0cnVjdG9yT2JqLmpzZG9jdGFncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3QgPSBfbVtpXS5kZWNsYXJhdGlvbnNbal0uY29uc3RydWN0b3JPYmouanNkb2N0YWdzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoazsgayA8IGxlbmd0OyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgX21baV0uZGVjbGFyYXRpb25zW2pdLmNvbnN0cnVjdG9yT2JqLmpzZG9jdGFnc1trXS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9tO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlTW9kdWxlc0RlY2xhcmF0aW9uc0V4cG9ydHNUeXBlcygpIHtcbiAgICAgICAgbGV0IF9tID0gdGhpcy5tb2R1bGVzLFxuICAgICAgICAgICAgaSA9IDAsXG4gICAgICAgICAgICBsZW4gPSB0aGlzLm1vZHVsZXMubGVuZ3RoO1xuXG4gICAgICAgIGxldCBtZXJnZVR5cGVzID0gZW50cnkgPT4ge1xuICAgICAgICAgICAgbGV0IGRpcmVjdGl2ZSA9IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMoZW50cnkubmFtZSwgdGhpcy5kaXJlY3RpdmVzLCBlbnRyeS5maWxlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGlyZWN0aXZlLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZW50cnkudHlwZSA9ICdkaXJlY3RpdmUnO1xuICAgICAgICAgICAgICAgIGVudHJ5LmlkID0gZGlyZWN0aXZlLmRhdGEuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY29tcG9uZW50ID0gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhlbnRyeS5uYW1lLCB0aGlzLmNvbXBvbmVudHMsIGVudHJ5LmZpbGUpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBlbnRyeS50eXBlID0gJ2NvbXBvbmVudCc7XG4gICAgICAgICAgICAgICAgZW50cnkuaWQgPSBjb21wb25lbnQuZGF0YS5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBwaXBlID0gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhlbnRyeS5uYW1lLCB0aGlzLnBpcGVzLCBlbnRyeS5maWxlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGlwZS5kYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGVudHJ5LnR5cGUgPSAncGlwZSc7XG4gICAgICAgICAgICAgICAgZW50cnkuaWQgPSBwaXBlLmRhdGEuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5tb2R1bGVzLmZvckVhY2gobW9kdWxlID0+IHtcbiAgICAgICAgICAgIG1vZHVsZS5kZWNsYXJhdGlvbnMuZm9yRWFjaChkZWNsYXJhdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgbWVyZ2VUeXBlcyhkZWNsYXJhdGlvbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzLmZvckVhY2goZXhwdCA9PiB7XG4gICAgICAgICAgICAgICAgbWVyZ2VUeXBlcyhleHB0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbW9kdWxlLmVudHJ5Q29tcG9uZW50cy5mb3JFYWNoKGVudCA9PiB7XG4gICAgICAgICAgICAgICAgbWVyZ2VUeXBlcyhlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0KGRhdGE6IFBhcnNlZERhdGEpIHtcbiAgICAgICAgdHJhdmVyc2UoZGF0YSkuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnBhcmVudCkgZGVsZXRlIG5vZGUucGFyZW50O1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmluaXRpYWxpemVyKSBkZWxldGUgbm9kZS5pbml0aWFsaXplcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmF3RGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMubW9kdWxlcyA9IF8uc29ydEJ5KHRoaXMucmF3RGF0YS5tb2R1bGVzLCBbJ25hbWUnXSk7XG4gICAgICAgIHRoaXMucmF3TW9kdWxlc0Zvck92ZXJ2aWV3ID0gXy5zb3J0QnkoZGF0YS5tb2R1bGVzRm9yR3JhcGgsIFsnbmFtZSddKTtcbiAgICAgICAgdGhpcy5yYXdNb2R1bGVzID0gXy5zb3J0QnkoZGF0YS5tb2R1bGVzRm9yR3JhcGgsIFsnbmFtZSddKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRzID0gXy5zb3J0QnkodGhpcy5yYXdEYXRhLmNvbXBvbmVudHMsIFsnbmFtZSddKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVycyA9IF8uc29ydEJ5KHRoaXMucmF3RGF0YS5jb250cm9sbGVycywgWyduYW1lJ10pO1xuICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBfLnNvcnRCeSh0aGlzLnJhd0RhdGEuZGlyZWN0aXZlcywgWyduYW1lJ10pO1xuICAgICAgICB0aGlzLmluamVjdGFibGVzID0gXy5zb3J0QnkodGhpcy5yYXdEYXRhLmluamVjdGFibGVzLCBbJ25hbWUnXSk7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzID0gXy5zb3J0QnkodGhpcy5yYXdEYXRhLmludGVyY2VwdG9ycywgWyduYW1lJ10pO1xuICAgICAgICB0aGlzLmd1YXJkcyA9IF8uc29ydEJ5KHRoaXMucmF3RGF0YS5ndWFyZHMsIFsnbmFtZSddKTtcbiAgICAgICAgdGhpcy5pbnRlcmZhY2VzID0gXy5zb3J0QnkodGhpcy5yYXdEYXRhLmludGVyZmFjZXMsIFsnbmFtZSddKTtcbiAgICAgICAgdGhpcy5waXBlcyA9IF8uc29ydEJ5KHRoaXMucmF3RGF0YS5waXBlcywgWyduYW1lJ10pO1xuICAgICAgICB0aGlzLmNsYXNzZXMgPSBfLnNvcnRCeSh0aGlzLnJhd0RhdGEuY2xhc3NlcywgWyduYW1lJ10pO1xuICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMgPSB0aGlzLnJhd0RhdGEubWlzY2VsbGFuZW91cztcbiAgICAgICAgdGhpcy5wcmVwYXJlTWlzY2VsbGFuZW91cygpO1xuICAgICAgICB0aGlzLnVwZGF0ZU1vZHVsZXNEZWNsYXJhdGlvbnNFeHBvcnRzVHlwZXMoKTtcbiAgICAgICAgdGhpcy5yb3V0ZXMgPSB0aGlzLnJhd0RhdGEucm91dGVzVHJlZTtcbiAgICAgICAgdGhpcy5tYW5hZ2VEdXBsaWNhdGVzTmFtZSgpO1xuICAgICAgICB0aGlzLmNsZWFuUmF3TW9kdWxlc05hbWVzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhblJhd01vZHVsZXNOYW1lcygpIHtcbiAgICAgICAgdGhpcy5yYXdNb2R1bGVzRm9yT3ZlcnZpZXcgPSB0aGlzLnJhd01vZHVsZXNGb3JPdmVydmlldy5tYXAobW9kdWxlID0+IHtcbiAgICAgICAgICAgIG1vZHVsZS5uYW1lID0gbW9kdWxlLm5hbWUucmVwbGFjZSgnJCcsICcnKTtcbiAgICAgICAgICAgIHJldHVybiBtb2R1bGU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgZGF0YSwgZmlsZT8pOiBJQXBpU291cmNlUmVzdWx0PGFueT4ge1xuICAgICAgICBsZXQgX3Jlc3VsdCA9IHtcbiAgICAgICAgICAgIHNvdXJjZTogJ2ludGVybmFsJyxcbiAgICAgICAgICAgIGRhdGE6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoZGF0YVtpXS5uYW1lKSAhPT0gLTEgJiYgZmlsZS5yZXBsYWNlKC9cXFxcL2csICcvJykuaW5kZXhPZihkYXRhW2ldLmZpbGUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5kYXRhID0gZGF0YVtpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoZGF0YVtpXS5uYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yZXN1bHQuZGF0YSA9IGRhdGFbaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9yZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYW5hZ2VEdXBsaWNhdGVzTmFtZSgpIHtcbiAgICAgICAgbGV0IHByb2Nlc3NEdXBsaWNhdGVzID0gKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgPT4ge1xuICAgICAgICAgICAgbGV0IGVsZW1lbnRzV2l0aFNhbWVOYW1lID0gXy5maWx0ZXIoYXJyYXksIHtuYW1lOiBlbGVtZW50Lm5hbWV9KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50c1dpdGhTYW1lTmFtZS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlyc3QgZWxlbWVudCBpcyB0aGUgcmVmZXJlbmNlIGZvciBkdXBsaWNhdGVzXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBlbGVtZW50c1dpdGhTYW1lTmFtZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudFRvRWRpdCA9IGVsZW1lbnRzV2l0aFNhbWVOYW1lW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZWxlbWVudFRvRWRpdC5pc0R1cGxpY2F0ZSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9FZGl0LmlzRHVwbGljYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0VkaXQuZHVwbGljYXRlSWQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvRWRpdC5kdXBsaWNhdGVOYW1lID0gZWxlbWVudFRvRWRpdC5uYW1lICsgJy0nICsgZWxlbWVudFRvRWRpdC5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0VkaXQuaWQgPSBlbGVtZW50VG9FZGl0LmlkICsgJy0nICsgZWxlbWVudFRvRWRpdC5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNsYXNzZXMgPSB0aGlzLmNsYXNzZXMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5pbnRlcmZhY2VzID0gdGhpcy5pbnRlcmZhY2VzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgICAgIHRoaXMuaW5qZWN0YWJsZXMgPSB0aGlzLmluamVjdGFibGVzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgICAgIHRoaXMucGlwZXMgPSB0aGlzLnBpcGVzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzID0gdGhpcy5pbnRlcmNlcHRvcnMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5ndWFyZHMgPSB0aGlzLmd1YXJkcy5tYXAocHJvY2Vzc0R1cGxpY2F0ZXMpO1xuICAgICAgICB0aGlzLm1vZHVsZXMgPSB0aGlzLm1vZHVsZXMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlcnMgPSB0aGlzLmNvbnRyb2xsZXJzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IHRoaXMuZGlyZWN0aXZlcy5tYXAocHJvY2Vzc0R1cGxpY2F0ZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5kKG5hbWU6IHN0cmluZyk6IElBcGlTb3VyY2VSZXN1bHQ8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCBzZWFyY2hGdW5jdGlvbnM6IEFycmF5PCgpID0+IElBcGlTb3VyY2VSZXN1bHQ8YW55Pj4gPSBbXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIHRoaXMuaW5qZWN0YWJsZXMpLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLmludGVyY2VwdG9ycyksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIHRoaXMuZ3VhcmRzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5pbnRlcmZhY2VzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5jbGFzc2VzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5jb250cm9sbGVycyksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIHRoaXMubWlzY2VsbGFuZW91cy52YXJpYWJsZXMpLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucyksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmFuZ3VsYXJBcGlVdGlsLmZpbmRBcGkobmFtZSlcbiAgICAgICAgXTtcblxuICAgICAgICBmb3IgKGxldCBzZWFyY2hGdW5jdGlvbiBvZiBzZWFyY2hGdW5jdGlvbnMpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBzZWFyY2hGdW5jdGlvbigpO1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0LmRhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlKHVwZGF0ZWREYXRhKTogdm9pZCB7XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5tb2R1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5tb2R1bGVzLCAobW9kdWxlOiBJTW9kdWxlRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMubW9kdWxlcywgeyBuYW1lOiBtb2R1bGUubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZXNbX2luZGV4XSA9IG1vZHVsZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5jb21wb25lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5jb21wb25lbnRzLCAoY29tcG9uZW50OiBJQ29tcG9uZW50RGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMuY29tcG9uZW50cywgeyBuYW1lOiBjb21wb25lbnQubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbX2luZGV4XSA9IGNvbXBvbmVudDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5jb250cm9sbGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEuY29udHJvbGxlcnMsIChjb250cm9sbGVyOiBJQ29udHJvbGxlckRlcCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLmNvbnRyb2xsZXJzLCB7IG5hbWU6IGNvbnRyb2xsZXIubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzW19pbmRleF0gPSBjb250cm9sbGVyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLmRpcmVjdGl2ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgXy5mb3JFYWNoKHVwZGF0ZWREYXRhLmRpcmVjdGl2ZXMsIChkaXJlY3RpdmU6IElEaXJlY3RpdmVEZXApID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5kaXJlY3RpdmVzLCB7IG5hbWU6IGRpcmVjdGl2ZS5uYW1lIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlc1tfaW5kZXhdID0gZGlyZWN0aXZlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLmluamVjdGFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5pbmplY3RhYmxlcywgKGluamVjdGFibGU6IElJbmplY3RhYmxlRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMuaW5qZWN0YWJsZXMsIHsgbmFtZTogaW5qZWN0YWJsZS5uYW1lIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5qZWN0YWJsZXNbX2luZGV4XSA9IGluamVjdGFibGU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZERhdGEuaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5pbnRlcmNlcHRvcnMsIChpbnRlcmNlcHRvcjogSUludGVyY2VwdG9yRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMuaW50ZXJjZXB0b3JzLCB7IG5hbWU6IGludGVyY2VwdG9yLm5hbWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcmNlcHRvcnNbX2luZGV4XSA9IGludGVyY2VwdG9yO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLmd1YXJkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEuZ3VhcmRzLCAoZ3VhcmQ6IElHdWFyZERlcCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLmd1YXJkcywgeyBuYW1lOiBndWFyZC5uYW1lIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3VhcmRzW19pbmRleF0gPSBndWFyZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5pbnRlcmZhY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5pbnRlcmZhY2VzLCAoaW50OiBJSW50ZXJmYWNlRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMuaW50ZXJmYWNlcywgeyBuYW1lOiBpbnQubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmludGVyZmFjZXNbX2luZGV4XSA9IGludDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5waXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEucGlwZXMsIChwaXBlOiBJUGlwZURlcCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLnBpcGVzLCB7IG5hbWU6IHBpcGUubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnBpcGVzW19pbmRleF0gPSBwaXBlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLmNsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgXy5mb3JFYWNoKHVwZGF0ZWREYXRhLmNsYXNzZXMsIChjbGFzc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLmNsYXNzZXMsIHsgbmFtZTogY2xhc3NlLm5hbWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGFzc2VzW19pbmRleF0gPSBjbGFzc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogTWlzY2VsbGFuZW91cyB1cGRhdGVcbiAgICAgICAgICovXG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEubWlzY2VsbGFuZW91cy52YXJpYWJsZXMsICh2YXJpYWJsZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMubWlzY2VsbGFuZW91cy52YXJpYWJsZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdmFyaWFibGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZTogdmFyaWFibGUuZmlsZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy52YXJpYWJsZXNbX2luZGV4XSA9IHZhcmlhYmxlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5taXNjZWxsYW5lb3VzLmZ1bmN0aW9ucywgKGZ1bmM6IElGdW5jdGlvbkRlY0RlcCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zLCB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGZ1bmMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZTogZnVuYy5maWxlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmZ1bmN0aW9uc1tfaW5kZXhdID0gZnVuYztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzLCAodHlwZWFsaWFzOiBJVHlwZUFsaWFzRGVjRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcywge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiB0eXBlYWxpYXMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZTogdHlwZWFsaWFzLmZpbGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXNbX2luZGV4XSA9IHR5cGVhbGlhcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEubWlzY2VsbGFuZW91cy5lbnVtZXJhdGlvbnMsIChlbnVtZXJhdGlvbjogSUVudW1EZWNEZXApID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucywge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbnVtZXJhdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBmaWxlOiBlbnVtZXJhdGlvbi5maWxlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9uc1tfaW5kZXhdID0gZW51bWVyYXRpb247XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXBhcmVNaXNjZWxsYW5lb3VzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbmRJbkNvbXBvZG9jKG5hbWU6IHN0cmluZykge1xuICAgICAgICBsZXQgbWVyZ2VkRGF0YSA9IF8uY29uY2F0KFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgICB0aGlzLm1vZHVsZXMsXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzLFxuICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzLFxuICAgICAgICAgICAgdGhpcy5pbmplY3RhYmxlcyxcbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzLFxuICAgICAgICAgICAgdGhpcy5ndWFyZHMsXG4gICAgICAgICAgICB0aGlzLmludGVyZmFjZXMsXG4gICAgICAgICAgICB0aGlzLnBpcGVzLFxuICAgICAgICAgICAgdGhpcy5jbGFzc2VzLFxuICAgICAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucyxcbiAgICAgICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcyxcbiAgICAgICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy52YXJpYWJsZXMsXG4gICAgICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zXG4gICAgICAgICk7XG4gICAgICAgIGxldCByZXN1bHQgPSBfLmZpbmQobWVyZ2VkRGF0YSwgeyBuYW1lOiBuYW1lIH0gYXMgYW55KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXBhcmVNaXNjZWxsYW5lb3VzKCkge1xuICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMudmFyaWFibGVzLnNvcnQoZ2V0TmFtZXNDb21wYXJlRm4oKSk7XG4gICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMuc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucy5zb3J0KGdldE5hbWVzQ29tcGFyZUZuKCkpO1xuICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMuc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcbiAgICAgICAgLy8gZ3JvdXAgZWFjaCBzdWJnb3VwIGJ5IGZpbGVcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmdyb3VwZWRWYXJpYWJsZXMgPSBfLmdyb3VwQnkodGhpcy5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcywgJ2ZpbGUnKTtcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmdyb3VwZWRGdW5jdGlvbnMgPSBfLmdyb3VwQnkodGhpcy5taXNjZWxsYW5lb3VzLmZ1bmN0aW9ucywgJ2ZpbGUnKTtcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmdyb3VwZWRFbnVtZXJhdGlvbnMgPSBfLmdyb3VwQnkodGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucywgJ2ZpbGUnKTtcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmdyb3VwZWRUeXBlQWxpYXNlcyA9IF8uZ3JvdXBCeSh0aGlzLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMsICdmaWxlJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZShuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIF8uZmluZCh0aGlzLm1vZHVsZXMsIFsnbmFtZScsIG5hbWVdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmF3TW9kdWxlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIHJldHVybiBfLmZpbmQodGhpcy5yYXdNb2R1bGVzLCBbJ25hbWUnLCBuYW1lXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZHVsZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbnRyb2xsZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGlyZWN0aXZlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0aXZlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SW5qZWN0YWJsZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluamVjdGFibGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJbnRlcmNlcHRvcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVyY2VwdG9ycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0R3VhcmRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ndWFyZHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEludGVyZmFjZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVyZmFjZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJvdXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm91dGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQaXBlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGlwZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENsYXNzZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsYXNzZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1pc2NlbGxhbmVvdXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pc2NlbGxhbmVvdXM7XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIExpdmVTZXJ2ZXIgZnJvbSAnbGl2ZS1zZXJ2ZXInO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyBTeW50YXhLaW5kIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5cbmNvbnN0IGNob2tpZGFyID0gcmVxdWlyZSgnY2hva2lkYXInKTtcbmNvbnN0IG1hcmtlZCA9IHJlcXVpcmUoJ21hcmtlZCcpO1xuY29uc3QgdHJhdmVyc2UgPSByZXF1aXJlKCd0cmF2ZXJzZScpO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgSHRtbEVuZ2luZSB9IGZyb20gJy4vZW5naW5lcy9odG1sLmVuZ2luZSc7XG5pbXBvcnQgeyBNYXJrZG93bkVuZ2luZSB9IGZyb20gJy4vZW5naW5lcy9tYXJrZG93bi5lbmdpbmUnO1xuaW1wb3J0IHsgRmlsZUVuZ2luZSB9IGZyb20gJy4vZW5naW5lcy9maWxlLmVuZ2luZSc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTmdkRW5naW5lIH0gZnJvbSAnLi9lbmdpbmVzL25nZC5lbmdpbmUnO1xuaW1wb3J0IHsgU2VhcmNoRW5naW5lIH0gZnJvbSAnLi9lbmdpbmVzL3NlYXJjaC5lbmdpbmUnO1xuaW1wb3J0IHsgRXhwb3J0RW5naW5lIH0gZnJvbSAnLi9lbmdpbmVzL2V4cG9ydC5lbmdpbmUnO1xuaW1wb3J0IEkxOG5FbmdpbmVJbnN0YW5jZSBmcm9tICcuL2VuZ2luZXMvaTE4bi5lbmdpbmUnO1xuXG5pbXBvcnQgeyBBbmd1bGFyRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi9jb21waWxlci9hbmd1bGFyLWRlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBBbmd1bGFySlNEZXBlbmRlbmNpZXMgfSBmcm9tICcuL2NvbXBpbGVyL2FuZ3VsYXJqcy1kZXBlbmRlbmNpZXMnO1xuXG5pbXBvcnQgeyBDT01QT0RPQ19ERUZBVUxUUyB9IGZyb20gJy4uL3V0aWxzL2RlZmF1bHRzJztcbmltcG9ydCB7IENPTVBPRE9DX0NPTlNUQU5UUyB9IGZyb20gJy4uL3V0aWxzL2NvbnN0YW50cyc7XG5cbmltcG9ydCB7IGNsZWFuU291cmNlc0ZvcldhdGNoIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuXG5pbXBvcnQgeyBjbGVhbk5hbWVXaXRob3V0U3BhY2VBbmRUb0xvd2VyQ2FzZSwgZmluZE1haW5Tb3VyY2VGb2xkZXIgfSBmcm9tICcuLi91dGlsaXRpZXMnO1xuXG5pbXBvcnQgeyBwcm9taXNlU2VxdWVudGlhbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2Utc2VxdWVudGlhbCc7XG5pbXBvcnQgeyBEZXBlbmRlbmNpZXNFbmdpbmUgfSBmcm9tICcuL2VuZ2luZXMvZGVwZW5kZW5jaWVzLmVuZ2luZSc7XG5pbXBvcnQgeyBBbmd1bGFyVmVyc2lvblV0aWwsIFJvdXRlclBhcnNlclV0aWwgfSBmcm9tICcuLi91dGlscyc7XG5cbmxldCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xubGV0ICRtYXJrZG93bmVuZ2luZSA9IG5ldyBNYXJrZG93bkVuZ2luZSgpO1xubGV0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XG5sZXQgZ2VuZXJhdGlvblByb21pc2VSZXNvbHZlO1xubGV0IGdlbmVyYXRpb25Qcm9taXNlUmVqZWN0O1xubGV0IGdlbmVyYXRpb25Qcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGdlbmVyYXRpb25Qcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgZ2VuZXJhdGlvblByb21pc2VSZWplY3QgPSByZWplY3Q7XG59KTtcblxuZXhwb3J0IGNsYXNzIEFwcGxpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBGaWxlcyBwcm9jZXNzZWQgZHVyaW5nIGluaXRpYWwgc2Nhbm5pbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsZXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogRmlsZXMgcHJvY2Vzc2VkIGR1cmluZyB3YXRjaCBzY2FubmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVkRmlsZXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogRmlsZXMgY2hhbmdlZCBkdXJpbmcgd2F0Y2ggc2Nhbm5pbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hDaGFuZ2VkRmlsZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICAvKipcbiAgICAgKiBDb21wb2RvYyBjb25maWd1cmF0aW9uIGxvY2FsIHJlZmVyZW5jZVxuICAgICAqL1xuICAgIHB1YmxpYyBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uSW50ZXJmYWNlO1xuICAgIC8qKlxuICAgICAqIEJvb2xlYW4gZm9yIHdhdGNoaW5nIHN0YXR1c1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHB1YmxpYyBpc1dhdGNoaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBTdG9yZSBwYWNrYWdlLmpzb24gZGF0YVxuICAgICAqL1xuICAgIHByaXZhdGUgcGFja2FnZUpzb25EYXRhID0ge307XG5cbiAgICBwcml2YXRlIGFuZ3VsYXJWZXJzaW9uVXRpbCA9IG5ldyBBbmd1bGFyVmVyc2lvblV0aWwoKTtcbiAgICBwcml2YXRlIGRlcGVuZGVuY2llc0VuZ2luZTogRGVwZW5kZW5jaWVzRW5naW5lO1xuICAgIHByaXZhdGUgbmdkRW5naW5lOiBOZ2RFbmdpbmU7XG4gICAgcHJpdmF0ZSBodG1sRW5naW5lOiBIdG1sRW5naW5lO1xuICAgIHByaXZhdGUgc2VhcmNoRW5naW5lOiBTZWFyY2hFbmdpbmU7XG4gICAgcHJpdmF0ZSBleHBvcnRFbmdpbmU6IEV4cG9ydEVuZ2luZTtcbiAgICBwcm90ZWN0ZWQgZmlsZUVuZ2luZTogRmlsZUVuZ2luZSA9IG5ldyBGaWxlRW5naW5lKCk7XG4gICAgcHJpdmF0ZSByb3V0ZXJQYXJzZXIgPSBuZXcgUm91dGVyUGFyc2VyVXRpbCgpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGNvbXBvZG9jIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgdXNlZC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lID0gbmV3IERlcGVuZGVuY2llc0VuZ2luZSgpO1xuICAgICAgICB0aGlzLm5nZEVuZ2luZSA9IG5ldyBOZ2RFbmdpbmUodGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUpO1xuICAgICAgICB0aGlzLmh0bWxFbmdpbmUgPSBuZXcgSHRtbEVuZ2luZShcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLFxuICAgICAgICAgICAgdGhpcy5maWxlRW5naW5lXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2VhcmNoRW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZSh0aGlzLmNvbmZpZ3VyYXRpb24sIHRoaXMuZmlsZUVuZ2luZSk7XG4gICAgICAgIHRoaXMuZXhwb3J0RW5naW5lID0gbmV3IEV4cG9ydEVuZ2luZShcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLFxuICAgICAgICAgICAgdGhpcy5maWxlRW5naW5lXG4gICAgICAgICk7XG5cbiAgICAgICAgZm9yIChsZXQgb3B0aW9uIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhW29wdGlvbl0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhW29wdGlvbl0gPSBvcHRpb25zW29wdGlvbl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGb3IgZG9jdW1lbnRhdGlvbk1haW5OYW1lLCBwcm9jZXNzIGl0IG91dHNpZGUgdGhlIGxvb3AsIGZvciBoYW5kbGluZyBjb25mbGljdCB3aXRoIHBhZ2VzIG5hbWVcbiAgICAgICAgICAgIGlmIChvcHRpb24gPT09ICduYW1lJykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kb2N1bWVudGF0aW9uTWFpbk5hbWUgPSBvcHRpb25zW29wdGlvbl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGb3IgZG9jdW1lbnRhdGlvbk1haW5OYW1lLCBwcm9jZXNzIGl0IG91dHNpZGUgdGhlIGxvb3AsIGZvciBoYW5kbGluZyBjb25mbGljdCB3aXRoIHBhZ2VzIG5hbWVcbiAgICAgICAgICAgIGlmIChvcHRpb24gPT09ICdzaWxlbnQnKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnNpbGVudCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgY29tcG9kb2MgcHJvY2Vzc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZW5lcmF0ZSgpOiBQcm9taXNlPHt9PiB7XG4gICAgICAgIHByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIHRoaXMudW5oYW5kbGVkUmVqZWN0aW9uTGlzdGVuZXIpO1xuICAgICAgICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIHRoaXMudW5jYXVnaHRFeGNlcHRpb25MaXN0ZW5lcik7XG5cbiAgICAgICAgSTE4bkVuZ2luZUluc3RhbmNlLmluaXQodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmxhbmd1YWdlKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LmNoYXJBdChcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0Lmxlbmd0aCAtIDFcbiAgICAgICAgICAgICkgIT09ICcvJ1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQgKz0gJy8nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXQgIT09IENPTVBPRE9DX0RFRkFVTFRTLmV4cG9ydEZvcm1hdCkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUGFja2FnZUpzb24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaHRtbEVuZ2luZS5pbml0KHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50ZW1wbGF0ZXMpLnRoZW4oKCkgPT4gdGhpcy5wcm9jZXNzUGFja2FnZUpzb24oKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdlbmVyYXRpb25Qcm9taXNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5kQ2FsbGJhY2soKSB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHRoaXMudW5oYW5kbGVkUmVqZWN0aW9uTGlzdGVuZXIpO1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCd1bmNhdWdodEV4Y2VwdGlvbicsIHRoaXMudW5jYXVnaHRFeGNlcHRpb25MaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1bmhhbmRsZWRSZWplY3Rpb25MaXN0ZW5lcihlcnIsIHApIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1VuaGFuZGxlZCBSZWplY3Rpb24gYXQ6JywgcCwgJ3JlYXNvbjonLCBlcnIpO1xuICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAnU29ycnksIGJ1dCB0aGVyZSB3YXMgYSBwcm9ibGVtIGR1cmluZyBwYXJzaW5nIG9yIGdlbmVyYXRpb24gb2YgdGhlIGRvY3VtZW50YXRpb24uIFBsZWFzZSBmaWxsIGFuIGlzc3VlIG9uIGdpdGh1Yi4gKGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb2RvYy9jb21wb2RvYy9pc3N1ZXMvbmV3KSdcbiAgICAgICAgKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1bmNhdWdodEV4Y2VwdGlvbkxpc3RlbmVyKGVycikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgJ1NvcnJ5LCBidXQgdGhlcmUgd2FzIGEgcHJvYmxlbSBkdXJpbmcgcGFyc2luZyBvciBnZW5lcmF0aW9uIG9mIHRoZSBkb2N1bWVudGF0aW9uLiBQbGVhc2UgZmlsbCBhbiBpc3N1ZSBvbiBnaXRodWIuIChodHRwczovL2dpdGh1Yi5jb20vY29tcG9kb2MvY29tcG9kb2MvaXNzdWVzL25ldyknXG4gICAgICAgICk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0YXJ0IGNvbXBvZG9jIGRvY3VtZW50YXRpb24gY292ZXJhZ2VcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdGVzdENvdmVyYWdlKCkge1xuICAgICAgICB0aGlzLmdldERlcGVuZGVuY2llc0RhdGEoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9yZSBmaWxlcyBmb3IgaW5pdGlhbCBwcm9jZXNzaW5nXG4gICAgICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gZmlsZXMgRmlsZXMgZm91bmQgZHVyaW5nIHNvdXJjZSBmb2xkZXIgYW5kIHRzY29uZmlnIHNjYW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmlsZXMoZmlsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgdGhpcy5maWxlcyA9IGZpbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3JlIGZpbGVzIGZvciB3YXRjaCBwcm9jZXNzaW5nXG4gICAgICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gZmlsZXMgRmlsZXMgZm91bmQgZHVyaW5nIHNvdXJjZSBmb2xkZXIgYW5kIHRzY29uZmlnIHNjYW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0VXBkYXRlZEZpbGVzKGZpbGVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIHRoaXMudXBkYXRlZEZpbGVzID0gZmlsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIG9uZSBUeXBlU2NyaXB0IGZpbGUgaW4gdXBkYXRlZEZpbGVzIGxpc3RcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXN1bHQgb2Ygc2NhblxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNXYXRjaGVkRmlsZXNUU0ZpbGVzKCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICAgICAgXy5mb3JFYWNoKHRoaXMudXBkYXRlZEZpbGVzLCBmaWxlID0+IHtcbiAgICAgICAgICAgIGlmIChwYXRoLmV4dG5hbWUoZmlsZSkgPT09ICcudHMnKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygb25lIHJvb3QgbWFya2Rvd24gZmlsZXMgaW4gdXBkYXRlZEZpbGVzIGxpc3RcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXN1bHQgb2Ygc2NhblxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNXYXRjaGVkRmlsZXNSb290TWFya2Rvd25GaWxlcygpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuXG4gICAgICAgIF8uZm9yRWFjaCh0aGlzLnVwZGF0ZWRGaWxlcywgZmlsZSA9PiB7XG4gICAgICAgICAgICBpZiAocGF0aC5leHRuYW1lKGZpbGUpID09PSAnLm1kJyAmJiBwYXRoLmRpcm5hbWUoZmlsZSkgPT09IHByb2Nlc3MuY3dkKCkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIGZpbGVzIGZvciB3YXRjaCBwcm9jZXNzaW5nXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyVXBkYXRlZEZpbGVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZWRGaWxlcyA9IFtdO1xuICAgICAgICB0aGlzLndhdGNoQ2hhbmdlZEZpbGVzID0gW107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzUGFja2FnZUpzb24oKTogdm9pZCB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdTZWFyY2hpbmcgcGFja2FnZS5qc29uIGZpbGUnKTtcbiAgICAgICAgdGhpcy5maWxlRW5naW5lLmdldChwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyAncGFja2FnZS5qc29uJykudGhlbihcbiAgICAgICAgICAgIHBhY2thZ2VEYXRhID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyc2VkRGF0YSA9IEpTT04ucGFyc2UocGFja2FnZURhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMucGFja2FnZUpzb25EYXRhID0gcGFyc2VkRGF0YTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwYXJzZWREYXRhLm5hbWUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kb2N1bWVudGF0aW9uTWFpbk5hbWUgPT09IENPTVBPRE9DX0RFRkFVTFRTLnRpdGxlXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kb2N1bWVudGF0aW9uTWFpbk5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0YS5uYW1lICsgJyBkb2N1bWVudGF0aW9uJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWREYXRhLmRlc2NyaXB0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZG9jdW1lbnRhdGlvbk1haW5EZXNjcmlwdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWREYXRhLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYW5ndWxhclZlcnNpb24gPSB0aGlzLmFuZ3VsYXJWZXJzaW9uVXRpbC5nZXRBbmd1bGFyVmVyc2lvbk9mUHJvamVjdChcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0YVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ3BhY2thZ2UuanNvbiBmaWxlIGZvdW5kJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcnNlZERhdGEuZGVwZW5kZW5jaWVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NQYWNrYWdlRGVwZW5kZW5jaWVzKHBhcnNlZERhdGEuZGVwZW5kZW5jaWVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWREYXRhLnBlZXJEZXBlbmRlbmNpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BhY2thZ2VQZWVyRGVwZW5kZW5jaWVzKHBhcnNlZERhdGEucGVlckRlcGVuZGVuY2llcyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTWFya2Rvd25zKCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREZXBlbmRlbmNpZXNEYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NvbnRpbnVpbmcgd2l0aG91dCBwYWNrYWdlLmpzb24gZmlsZScpO1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc01hcmtkb3ducygpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGVwZW5kZW5jaWVzRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UxID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzUGFja2FnZVBlZXJEZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzKTogdm9pZCB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzaW5nIHBhY2thZ2UuanNvbiBwZWVyRGVwZW5kZW5jaWVzJyk7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5wYWNrYWdlUGVlckRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcztcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24uaGFzUGFnZSgnZGVwZW5kZW5jaWVzJykpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgICAgICBpZDogJ3BhY2thZ2VEZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdwYWNrYWdlLWRlcGVuZGVuY2llcycsXG4gICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NQYWNrYWdlRGVwZW5kZW5jaWVzKGRlcGVuZGVuY2llcyk6IHZvaWQge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2Vzc2luZyBwYWNrYWdlLmpzb24gZGVwZW5kZW5jaWVzJyk7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5wYWNrYWdlRGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICBuYW1lOiAnZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgIGlkOiAncGFja2FnZURlcGVuZGVuY2llcycsXG4gICAgICAgICAgICBjb250ZXh0OiAncGFja2FnZS1kZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5ST09UXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc01hcmtkb3ducygpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICdTZWFyY2hpbmcgUkVBRE1FLm1kLCBDSEFOR0VMT0cubWQsIENPTlRSSUJVVElORy5tZCwgTElDRU5TRS5tZCwgVE9ETy5tZCBmaWxlcydcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IG1hcmtkb3ducyA9IFsncmVhZG1lJywgJ2NoYW5nZWxvZycsICdjb250cmlidXRpbmcnLCAnbGljZW5zZScsICd0b2RvJ107XG4gICAgICAgICAgICBsZXQgbnVtYmVyT2ZNYXJrZG93bnMgPSA1O1xuICAgICAgICAgICAgbGV0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBudW1iZXJPZk1hcmtkb3ducykge1xuICAgICAgICAgICAgICAgICAgICAkbWFya2Rvd25lbmdpbmUuZ2V0VHJhZGl0aW9uYWxNYXJrZG93bihtYXJrZG93bnNbaV0udG9VcHBlckNhc2UoKSkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkbWVEYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG1hcmtkb3duc1tpXSA9PT0gJ3JlYWRtZScgPyAnaW5kZXgnIDogbWFya2Rvd25zW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnZ2V0dGluZy1zdGFydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdnZXR0aW5nLXN0YXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZG93bjogcmVhZG1lRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLlJPT1RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFya2Rvd25zW2ldID09PSAncmVhZG1lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEucmVhZG1lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ292ZXJ2aWV3JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnb3ZlcnZpZXcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ292ZXJ2aWV3JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLlJPT1RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm1hcmtkb3ducy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG1hcmtkb3duc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVybmFtZTogbWFya2Rvd25zW2ldLnRvVXBwZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLlJPT1RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAke21hcmtkb3duc1tpXS50b1VwcGVyQ2FzZSgpfS5tZCBmaWxlIGZvdW5kYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYENvbnRpbnVpbmcgd2l0aG91dCAke21hcmtkb3duc1tpXS50b1VwcGVyQ2FzZSgpfS5tZCBmaWxlYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmtkb3duc1tpXSA9PT0gJ3JlYWRtZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2luZGV4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnaW5kZXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ292ZXJ2aWV3JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWJ1aWxkUm9vdE1hcmtkb3ducygpOiB2b2lkIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAnUmVnZW5lcmF0aW5nIFJFQURNRS5tZCwgQ0hBTkdFTE9HLm1kLCBDT05UUklCVVRJTkcubWQsIExJQ0VOU0UubWQsIFRPRE8ubWQgcGFnZXMnXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IGFjdGlvbnMgPSBbXTtcblxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ucmVzZXRSb290TWFya2Rvd25QYWdlcygpO1xuXG4gICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTWFya2Rvd25zKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHByb21pc2VTZXF1ZW50aWFsKGFjdGlvbnMpXG4gICAgICAgICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BhZ2VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclVwZGF0ZWRGaWxlcygpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvck1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGRlcGVuZGVuY3kgZGF0YSBmb3Igc21hbGwgZ3JvdXAgb2YgdXBkYXRlZCBmaWxlcyBkdXJpbmcgd2F0Y2ggcHJvY2Vzc1xuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0TWljcm9EZXBlbmRlbmNpZXNEYXRhKCk6IHZvaWQge1xuICAgICAgICBsb2dnZXIuaW5mbygnR2V0IGRpZmYgZGVwZW5kZW5jaWVzIGRhdGEnKTtcbiAgICAgICAgbGV0IGNyYXdsZXIgPSBuZXcgRGVwZW5kZW5jaWVzKFxuICAgICAgICAgICAgdGhpcy51cGRhdGVkRmlsZXMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHNjb25maWdEaXJlY3Rvcnk6IHBhdGguZGlybmFtZSh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgdGhpcy5yb3V0ZXJQYXJzZXJcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgZGVwZW5kZW5jaWVzRGF0YSA9IGNyYXdsZXIuZ2V0RGVwZW5kZW5jaWVzKCk7XG5cbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUudXBkYXRlKGRlcGVuZGVuY2llc0RhdGEpO1xuXG4gICAgICAgIHRoaXMucHJlcGFyZUp1c3RBRmV3VGhpbmdzKGRlcGVuZGVuY2llc0RhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYnVpbGQgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiBkdXJpbmcgd2F0Y2ggcHJvY2Vzc1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVidWlsZEV4dGVybmFsRG9jdW1lbnRhdGlvbigpOiB2b2lkIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1JlYnVpbGQgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbicpO1xuXG4gICAgICAgIGxldCBhY3Rpb25zID0gW107XG5cbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnJlc2V0QWRkaXRpb25hbFBhZ2VzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlcyAhPT0gJycpIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUV4dGVybmFsSW5jbHVkZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvbWlzZVNlcXVlbnRpYWwoYWN0aW9ucylcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUGFnZXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyVXBkYXRlZEZpbGVzKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yTWVzc2FnZSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERlcGVuZGVuY2llc0RhdGEoKTogdm9pZCB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdHZXQgZGVwZW5kZW5jaWVzIGRhdGEnKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQW5ndWxhckpTIGRldGVjdGlvbiBzdHJhdGVneSA6XG4gICAgICAgICAqIC0gaWYgaW4gcGFja2FnZS5qc29uXG4gICAgICAgICAqIC0gaWYgNzUlIG9mIHNjYW5uZWQgZmlsZXMgYXJlICouanMgZmlsZXNcbiAgICAgICAgICovXG4gICAgICAgIGxldCBkZXBlbmRlbmNpZXNDbGFzczogQW5ndWxhckRlcGVuZGVuY2llcyB8IEFuZ3VsYXJKU0RlcGVuZGVuY2llcyA9IEFuZ3VsYXJEZXBlbmRlbmNpZXM7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFyUHJvamVjdCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhY2thZ2VKc29uRGF0YS5kZXBlbmRlbmNpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucGFja2FnZUpzb25EYXRhLmRlcGVuZGVuY2llcy5hbmd1bGFyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdBbmd1bGFySlMgcHJvamVjdCBkZXRlY3RlZCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFyUHJvamVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFySlNQcm9qZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXNDbGFzcyA9IEFuZ3VsYXJKU0RlcGVuZGVuY2llcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvdW50SlNGaWxlcyA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLmV4dG5hbWUoZmlsZSkgPT09ICcuanMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudEpTRmlsZXMgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxldCBwZXJjZW50T2ZKU0ZpbGVzID0gKGNvdW50SlNGaWxlcyAqIDEwMCkgLyB0aGlzLmZpbGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAocGVyY2VudE9mSlNGaWxlcyA+PSA3NSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnQW5ndWxhckpTIHByb2plY3QgZGV0ZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJQcm9qZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFySlNQcm9qZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzQ2xhc3MgPSBBbmd1bGFySlNEZXBlbmRlbmNpZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNyYXdsZXIgPSBuZXcgZGVwZW5kZW5jaWVzQ2xhc3MoXG4gICAgICAgICAgICB0aGlzLmZpbGVzLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRzY29uZmlnRGlyZWN0b3J5OiBwYXRoLmRpcm5hbWUodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgICAgIHRoaXMucm91dGVyUGFyc2VyXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IGRlcGVuZGVuY2llc0RhdGEgPSBjcmF3bGVyLmdldERlcGVuZGVuY2llcygpO1xuXG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmluaXQoZGVwZW5kZW5jaWVzRGF0YSk7XG5cbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnJvdXRlc0xlbmd0aCA9IHRoaXMucm91dGVyUGFyc2VyLnJvdXRlc0xlbmd0aCgpO1xuXG4gICAgICAgIHRoaXMucHJpbnRTdGF0aXN0aWNzKCk7XG5cbiAgICAgICAgdGhpcy5wcmVwYXJlRXZlcnl0aGluZygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJlcGFyZUp1c3RBRmV3VGhpbmdzKGRpZmZDcmF3bGVkRGF0YSk6IHZvaWQge1xuICAgICAgICBsZXQgYWN0aW9ucyA9IFtdO1xuXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5yZXNldFBhZ2VzKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVJvdXRlc0dyYXBoKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlUm91dGVzKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpZmZDcmF3bGVkRGF0YS5jb21wb25lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB0aGlzLnByZXBhcmVDb21wb25lbnRzKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuY29udHJvbGxlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZUNvbnRyb2xsZXJzKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEubW9kdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlTW9kdWxlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuZGlyZWN0aXZlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlRGlyZWN0aXZlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuaW5qZWN0YWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZUluamVjdGFibGVzKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpZmZDcmF3bGVkRGF0YS5pbnRlcmNlcHRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZUludGVyY2VwdG9ycygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuZ3VhcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB0aGlzLnByZXBhcmVHdWFyZHMoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlmZkNyYXdsZWREYXRhLnBpcGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB0aGlzLnByZXBhcmVQaXBlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuY2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlQ2xhc3NlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlSW50ZXJmYWNlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGRpZmZDcmF3bGVkRGF0YS5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICBkaWZmQ3Jhd2xlZERhdGEubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgZGlmZkNyYXdsZWREYXRhLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgZGlmZkNyYXdsZWREYXRhLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlTWlzY2VsbGFuZW91cygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVDb3ZlcmFnZSkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZUNvdmVyYWdlKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvbWlzZVNlcXVlbnRpYWwoYWN0aW9ucylcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzR3JhcGhzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclVwZGF0ZWRGaWxlcygpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvck1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmludFN0YXRpc3RpY3MoKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCctLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcm9qZWN0IHN0YXRpc3RpY3MgJyk7XG4gICAgICAgIGlmICh0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5tb2R1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGZpbGVzICAgICAgOiAke3RoaXMuZmlsZXMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5tb2R1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIG1vZHVsZSAgICAgOiAke3RoaXMuZGVwZW5kZW5jaWVzRW5naW5lLm1vZHVsZXMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5jb21wb25lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGNvbXBvbmVudCAgOiAke3RoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmNvbXBvbmVudHMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5jb250cm9sbGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSBjb250cm9sbGVyIDogJHt0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5jb250cm9sbGVycy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmRpcmVjdGl2ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYC0gZGlyZWN0aXZlICA6ICR7dGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZGlyZWN0aXZlcy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmluamVjdGFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGluamVjdGFibGUgOiAke3RoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmluamVjdGFibGVzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGluamVjdG9yICAgOiAke3RoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmludGVyY2VwdG9ycy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmd1YXJkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSBndWFyZCAgICAgIDogJHt0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5ndWFyZHMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5waXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSBwaXBlICAgICAgIDogJHt0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5waXBlcy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmNsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYC0gY2xhc3MgICAgICA6ICR7dGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuY2xhc3Nlcy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmludGVyZmFjZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYC0gaW50ZXJmYWNlICA6ICR7dGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuaW50ZXJmYWNlcy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5yb3V0ZXNMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSByb3V0ZSAgICAgIDogJHt0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEucm91dGVzTGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5pbmZvKCctLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmVwYXJlRXZlcnl0aGluZygpIHtcbiAgICAgICAgbGV0IGFjdGlvbnMgPSBbXTtcblxuICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUNvbXBvbmVudHMoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlTW9kdWxlcygpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZGlyZWN0aXZlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVEaXJlY3RpdmVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5jb250cm9sbGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVDb250cm9sbGVycygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuaW5qZWN0YWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlSW5qZWN0YWJsZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmludGVyY2VwdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVJbnRlcmNlcHRvcnMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmd1YXJkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVHdWFyZHMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUucm91dGVzICYmXG4gICAgICAgICAgICB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5yb3V0ZXMuY2hpbGRyZW4ubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgIXRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUm91dGVzR3JhcGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVSb3V0ZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLnBpcGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZVBpcGVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5jbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUNsYXNzZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmludGVyZmFjZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlSW50ZXJmYWNlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5taXNjZWxsYW5lb3VzLmZ1bmN0aW9ucy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVNaXNjZWxsYW5lb3VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVDb3ZlcmFnZSkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlQ292ZXJhZ2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cblx0XHRcdFx0aWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS51bml0VGVzdENvdmVyYWdlICE9PSAnJyl7XG5cdFx0XHRcdFx0YWN0aW9ucy5wdXNoKCgpPT57XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5wcmVwYXJlVW5pdFRlc3RDb3ZlcmFnZSgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlcyAhPT0gJycpIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUV4dGVybmFsSW5jbHVkZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvbWlzZVNlcXVlbnRpYWwoYWN0aW9ucylcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXQgIT09IENPTVBPRE9DX0RFRkFVTFRTLmV4cG9ydEZvcm1hdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy5leHBvcnRGb3JtYXRzU3VwcG9ydGVkLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmV4cG9ydEZvcm1hdFxuICAgICAgICAgICAgICAgICAgICAgICAgKSA+IC0xXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEdlbmVyYXRpbmcgZG9jdW1lbnRhdGlvbiBpbiBleHBvcnQgZm9ybWF0ICR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9YFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwb3J0RW5naW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4cG9ydCh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LCB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRDYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBpbiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGluICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RWxhcHNlZFRpbWUoKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBzZWNvbmRzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEV4cG9ydGVkIGZvcm1hdCBub3Qgc3VwcG9ydGVkYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NHcmFwaHMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yTWVzc2FnZSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEluY2x1ZGVkUGF0aEZvckZpbGUoZmlsZSkge1xuICAgICAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlcywgZmlsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmVwYXJlRXh0ZXJuYWxJbmNsdWRlcygpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0FkZGluZyBleHRlcm5hbCBtYXJrZG93biBmaWxlcycpO1xuICAgICAgICAvLyBTY2FuIGluY2x1ZGUgZm9sZGVyIGZvciBmaWxlcyBkZXRhaWxlZCBpbiBzdW1tYXJ5Lmpzb25cbiAgICAgICAgLy8gRm9yIGVhY2ggZmlsZSwgYWRkIHRvIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hZGRpdGlvbmFsUGFnZXNcbiAgICAgICAgLy8gRWFjaCBmaWxlIHdpbGwgYmUgY29udmVydGVkIHRvIGh0bWwgcGFnZSwgaW5zaWRlIENPTVBPRE9DX0RFRkFVTFRTLmFkZGl0aW9uYWxFbnRyeVBhdGhcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmlsZUVuZ2luZS5nZXQodGhpcy5nZXRJbmNsdWRlZFBhdGhGb3JGaWxlKCdzdW1tYXJ5Lmpzb24nKSkudGhlbihcbiAgICAgICAgICAgICAgICBzdW1tYXJ5RGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdBZGRpdGlvbmFsIGRvY3VtZW50YXRpb246IHN1bW1hcnkuanNvbiBmaWxlIGZvdW5kJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkU3VtbWFyeURhdGEgPSBKU09OLnBhcnNlKHN1bW1hcnlEYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2UocGFyc2VkU3VtbWFyeURhdGEpLmZvckVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub3RSb290ICYmIHR5cGVvZiB0aGlzLm5vZGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJhd1BhdGggPSB0aGlzLnBhdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGUgPSB0aGlzLm5vZGVbJ2ZpbGUnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSB0aGlzLm5vZGVbJ3RpdGxlJ107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbmFsUGF0aCA9IHRoYXQuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlc0ZvbGRlcjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbERlcHRoID0gcmF3UGF0aC5maWx0ZXIoZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzTmFOKHBhcnNlSW50KGVsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB0aXRsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gY2xlYW5OYW1lV2l0aG91dFNwYWNlQW5kVG9Mb3dlckNhc2UodGl0bGUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYXN0RWxlbWVudFJvb3RUcmVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxEZXB0aC5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50VHJlZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEVsZW1lbnRSb290VHJlZSA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBhcnNlZFN1bW1hcnlEYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGFzdEVsZW1lbnRSb290VHJlZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudFRyZWUuY2hpbGRyZW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRyZWUgPSBlbGVtZW50VHJlZVsnY2hpbGRyZW4nXVtlbF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUcmVlID0gZWxlbWVudFRyZWVbZWxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxQYXRoICs9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbk5hbWVXaXRob3V0U3BhY2VBbmRUb0xvd2VyQ2FzZShlbGVtZW50VHJlZS50aXRsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RWxlbWVudFJvb3RUcmVlID0gZWxlbWVudFRyZWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsUGF0aCA9IGZpbmFsUGF0aC5yZXBsYWNlKCcvJyArIHVybCwgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWFya2Rvd25GaWxlID0gJG1hcmtkb3duZW5naW5lLmdldFRyYWRpdGlvbmFsTWFya2Rvd25TeW5jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5nZXRJbmNsdWRlZFBhdGhGb3JGaWxlKGZpbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsRGVwdGgubGVuZ3RoID4gNSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdPbmx5IDUgbGV2ZWxzIG9mIGRlcHRoIGFyZSBzdXBwb3J0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuY29uZmlndXJhdGlvbi5hZGRBZGRpdGlvbmFsUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiB1cmwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2FkZGl0aW9uYWwtcGFnZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZmluYWxQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxQYWdlOiBtYXJrZG93bkZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGZpbmFsRGVwdGgubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgnRXJyb3IgZHVyaW5nIEFkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVNb2R1bGVzKHNvbWVNb2R1bGVzPyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIG1vZHVsZXMnKTtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgX21vZHVsZXMgPSBzb21lTW9kdWxlcyA/IHNvbWVNb2R1bGVzIDogdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZ2V0TW9kdWxlcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlcyA9IF9tb2R1bGVzLm1hcChuZ01vZHVsZSA9PiB7XG4gICAgICAgICAgICAgICAgbmdNb2R1bGUuY29tcG9kb2NMaW5rcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50czogW10sXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW10sXG4gICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgcGlwZXM6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBbJ2RlY2xhcmF0aW9ucycsICdib290c3RyYXAnLCAnaW1wb3J0cycsICdleHBvcnRzJywgJ2NvbnRyb2xsZXJzJ10uZm9yRWFjaChtZXRhZGF0YVR5cGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZVttZXRhZGF0YVR5cGVdID0gbmdNb2R1bGVbbWV0YWRhdGFUeXBlXS5maWx0ZXIobWV0YURhdGFJdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobWV0YURhdGFJdGVtLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkaXJlY3RpdmUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZ2V0RGlyZWN0aXZlcygpLnNvbWUoZGlyZWN0aXZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZERpcmVjdGl2ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbWV0YURhdGFJdGVtLmlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGlyZWN0aXZlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGl2ZSBhcyBhbnkpLmlkID09PSBtZXRhRGF0YUl0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGlyZWN0aXZlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGl2ZSBhcyBhbnkpLm5hbWUgPT09IG1ldGFEYXRhSXRlbS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGlyZWN0aXZlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW5nTW9kdWxlLmNvbXBvZG9jTGlua3MuZGlyZWN0aXZlcy5pbmNsdWRlcyhkaXJlY3RpdmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmRpcmVjdGl2ZXMucHVzaChkaXJlY3RpdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkRGlyZWN0aXZlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbXBvbmVudCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5nZXRDb21wb25lbnRzKCkuc29tZShjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRhRGF0YUl0ZW0uaWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb21wb25lbnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuaWQgPT09IG1ldGFEYXRhSXRlbS5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb21wb25lbnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkubmFtZSA9PT0gbWV0YURhdGFJdGVtLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb21wb25lbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbmdNb2R1bGUuY29tcG9kb2NMaW5rcy5jb21wb25lbnRzLmluY2x1ZGVzKGNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29udHJvbGxlcic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5nZXRDb250cm9sbGVycygpLnNvbWUoY29udHJvbGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRDb250cm9sbGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRhRGF0YUl0ZW0uaWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb250cm9sbGVyID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRyb2xsZXIgYXMgYW55KS5pZCA9PT0gbWV0YURhdGFJdGVtLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENvbnRyb2xsZXIgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udHJvbGxlciBhcyBhbnkpLm5hbWUgPT09IG1ldGFEYXRhSXRlbS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29udHJvbGxlciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmNvbnRyb2xsZXJzLmluY2x1ZGVzKGNvbnRyb2xsZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmNvbnRyb2xsZXJzLnB1c2goY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRDb250cm9sbGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21vZHVsZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1vZHVsZXMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvbWUobW9kdWxlID0+IChtb2R1bGUgYXMgYW55KS5uYW1lID09PSBtZXRhRGF0YUl0ZW0ubmFtZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwaXBlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmdldFBpcGVzKCkuc29tZShwaXBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZFBpcGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1ldGFEYXRhSXRlbS5pZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBpcGUgPSAocGlwZSBhcyBhbnkpLmlkID09PSBtZXRhRGF0YUl0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUGlwZSA9IChwaXBlIGFzIGFueSkubmFtZSA9PT0gbWV0YURhdGFJdGVtLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQaXBlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW5nTW9kdWxlLmNvbXBvZG9jTGlua3MucGlwZXMuaW5jbHVkZXMocGlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nTW9kdWxlLmNvbXBvZG9jTGlua3MucGlwZXMucHVzaChwaXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFBpcGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlLnByb3ZpZGVycyA9IG5nTW9kdWxlLnByb3ZpZGVycy5maWx0ZXIocHJvdmlkZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZ2V0SW5qZWN0YWJsZXMoKS5zb21lKGluamVjdGFibGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZEluamVjdGFibGUgPSAoaW5qZWN0YWJsZSBhcyBhbnkpLm5hbWUgPT09IHByb3ZpZGVyLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluamVjdGFibGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW5nTW9kdWxlLmNvbXBvZG9jTGlua3MuaW5qZWN0YWJsZXMuaW5jbHVkZXMoaW5qZWN0YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdNb2R1bGUuY29tcG9kb2NMaW5rcy5pbmplY3RhYmxlcy5wdXNoKGluamVjdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRJbmplY3RhYmxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEludGVyY2VwdG9ycygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvbWUoaW50ZXJjZXB0b3IgPT4gKGludGVyY2VwdG9yIGFzIGFueSkubmFtZSA9PT0gcHJvdmlkZXIubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBUcnkgZml4aW5nIHR5cGUgdW5kZWZpbmVkIGZvciBlYWNoIHByb3ZpZGVyc1xuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChuZ01vZHVsZS5wcm92aWRlcnMsIHByb3ZpZGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW5qZWN0YWJsZXMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKGluamVjdGFibGUgPT4gKGluamVjdGFibGUgYXMgYW55KS5uYW1lID09PSBwcm92aWRlci5uYW1lKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLnR5cGUgPSAnaW5qZWN0YWJsZSc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW50ZXJjZXB0b3JzKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZChpbnRlcmNlcHRvciA9PiAoaW50ZXJjZXB0b3IgYXMgYW55KS5uYW1lID09PSBwcm92aWRlci5uYW1lKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLnR5cGUgPSAnaW50ZXJjZXB0b3InO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gT3JkZXIgdGhpbmdzXG4gICAgICAgICAgICAgICAgbmdNb2R1bGUuY29tcG9kb2NMaW5rcy5jb21wb25lbnRzID0gXy5zb3J0QnkobmdNb2R1bGUuY29tcG9kb2NMaW5rcy5jb21wb25lbnRzLCBbXG4gICAgICAgICAgICAgICAgICAgICduYW1lJ1xuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuY29udHJvbGxlcnMgPSBfLnNvcnRCeShuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmNvbnRyb2xsZXJzLCBbXG4gICAgICAgICAgICAgICAgICAgICduYW1lJ1xuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuZGlyZWN0aXZlcyA9IF8uc29ydEJ5KG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuZGlyZWN0aXZlcywgW1xuICAgICAgICAgICAgICAgICAgICAnbmFtZSdcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmluamVjdGFibGVzID0gXy5zb3J0QnkobmdNb2R1bGUuY29tcG9kb2NMaW5rcy5pbmplY3RhYmxlcywgW1xuICAgICAgICAgICAgICAgICAgICAnbmFtZSdcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzLnBpcGVzID0gXy5zb3J0QnkobmdNb2R1bGUuY29tcG9kb2NMaW5rcy5waXBlcywgWyduYW1lJ10pO1xuXG4gICAgICAgICAgICAgICAgbmdNb2R1bGUuZGVjbGFyYXRpb25zID0gXy5zb3J0QnkobmdNb2R1bGUuZGVjbGFyYXRpb25zLCBbJ25hbWUnXSk7XG4gICAgICAgICAgICAgICAgbmdNb2R1bGUuZW50cnlDb21wb25lbnRzID0gXy5zb3J0QnkobmdNb2R1bGUuZW50cnlDb21wb25lbnRzLCBbJ25hbWUnXSk7XG4gICAgICAgICAgICAgICAgbmdNb2R1bGUucHJvdmlkZXJzID0gXy5zb3J0QnkobmdNb2R1bGUucHJvdmlkZXJzLCBbJ25hbWUnXSk7XG4gICAgICAgICAgICAgICAgbmdNb2R1bGUuaW1wb3J0cyA9IF8uc29ydEJ5KG5nTW9kdWxlLmltcG9ydHMsIFsnbmFtZSddKTtcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5leHBvcnRzID0gXy5zb3J0QnkobmdNb2R1bGUuZXhwb3J0cywgWyduYW1lJ10pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5nTW9kdWxlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnbW9kdWxlcycsXG4gICAgICAgICAgICAgICAgaWQ6ICdtb2R1bGVzJyxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAnbW9kdWxlcycsXG4gICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAkbWFya2Rvd25lbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlc1tpXS5maWxlXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlc1tpXS5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBoYXMgYSBSRUFETUUgZmlsZSwgaW5jbHVkZSBpdGBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhZG1lID0gJG1hcmtkb3duZW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5tb2R1bGVzW2ldLmZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlc1tpXS5yZWFkbWUgPSBtYXJrZWQocmVhZG1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnbW9kdWxlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlc1tpXS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5tb2R1bGVzW2ldLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2VGFiczogdGhpcy5nZXROYXZUYWJzKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5tb2R1bGVzW2ldKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdtb2R1bGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlcGFyZVBpcGVzID0gKHNvbWVQaXBlcz8pID0+IHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1ByZXBhcmUgcGlwZXMnKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnBpcGVzID0gc29tZVBpcGVzXG4gICAgICAgICAgICA/IHNvbWVQaXBlc1xuICAgICAgICAgICAgOiB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5nZXRQaXBlcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnBpcGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwaXBlID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnBpcGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoJG1hcmtkb3duZW5naW5lLmhhc05laWdoYm91clJlYWRtZUZpbGUocGlwZS5maWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCAke3BpcGUubmFtZX0gaGFzIGEgUkVBRE1FIGZpbGUsIGluY2x1ZGUgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWFkbWUgPSAkbWFya2Rvd25lbmdpbmUucmVhZE5laWdoYm91clJlYWRtZUZpbGUocGlwZS5maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBpcGUucmVhZG1lID0gbWFya2VkKHJlYWRtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAncGlwZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcGlwZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHBpcGUuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMocGlwZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAncGlwZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBwaXBlOiBwaXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAocGlwZS5pc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5uYW1lICs9ICctJyArIHBpcGUuZHVwbGljYXRlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmFkZFBhZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHVibGljIHByZXBhcmVDbGFzc2VzID0gKHNvbWVDbGFzc2VzPykgPT4ge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJlcGFyZSBjbGFzc2VzJyk7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jbGFzc2VzID0gc29tZUNsYXNzZXNcbiAgICAgICAgICAgID8gc29tZUNsYXNzZXNcbiAgICAgICAgICAgIDogdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZ2V0Q2xhc3NlcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNsYXNzZXMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsYXNzZSA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jbGFzc2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoJG1hcmtkb3duZW5naW5lLmhhc05laWdoYm91clJlYWRtZUZpbGUoY2xhc3NlLmZpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgICR7Y2xhc3NlLm5hbWV9IGhhcyBhIFJFQURNRSBmaWxlLCBpbmNsdWRlIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhZG1lID0gJG1hcmtkb3duZW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKGNsYXNzZS5maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZS5yZWFkbWUgPSBtYXJrZWQocmVhZG1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdjbGFzc2VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNsYXNzZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGNsYXNzZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdlRhYnM6IHRoaXMuZ2V0TmF2VGFicyhjbGFzc2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2NsYXNzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiBjbGFzc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc2UuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UubmFtZSArPSAnLScgKyBjbGFzc2UuZHVwbGljYXRlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmFkZFBhZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHVibGljIHByZXBhcmVJbnRlcmZhY2VzKHNvbWVJbnRlcmZhY2VzPykge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJlcGFyZSBpbnRlcmZhY2VzJyk7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbnRlcmZhY2VzID0gc29tZUludGVyZmFjZXNcbiAgICAgICAgICAgID8gc29tZUludGVyZmFjZXNcbiAgICAgICAgICAgIDogdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZ2V0SW50ZXJmYWNlcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmludGVyZmFjZXMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGludGVyZiA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbnRlcmZhY2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoJG1hcmtkb3duZW5naW5lLmhhc05laWdoYm91clJlYWRtZUZpbGUoaW50ZXJmLmZpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgICR7aW50ZXJmLm5hbWV9IGhhcyBhIFJFQURNRSBmaWxlLCBpbmNsdWRlIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhZG1lID0gJG1hcmtkb3duZW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKGludGVyZi5maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZi5yZWFkbWUgPSBtYXJrZWQocmVhZG1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdpbnRlcmZhY2VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGludGVyZi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGludGVyZi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdlRhYnM6IHRoaXMuZ2V0TmF2VGFicyhpbnRlcmYpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2ludGVyZmFjZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2U6IGludGVyZixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyZi5pc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5uYW1lICs9ICctJyArIGludGVyZi5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZShwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlTWlzY2VsbGFuZW91cyhzb21lTWlzYz8pIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1ByZXBhcmUgbWlzY2VsbGFuZW91cycpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubWlzY2VsbGFuZW91cyA9IHNvbWVNaXNjXG4gICAgICAgICAgICA/IHNvbWVNaXNjXG4gICAgICAgICAgICA6IHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmdldE1pc2NlbGxhbmVvdXMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5taXNjZWxsYW5lb3VzLmZ1bmN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdmdW5jdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICBpZDogJ21pc2NlbGxhbmVvdXMtZnVuY3Rpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ21pc2NlbGxhbmVvdXMtZnVuY3Rpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm1pc2NlbGxhbmVvdXMudmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3ZhcmlhYmxlcycsXG4gICAgICAgICAgICAgICAgICAgIGlkOiAnbWlzY2VsbGFuZW91cy12YXJpYWJsZXMnLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnbWlzY2VsbGFuZW91cy12YXJpYWJsZXMnLFxuICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICd0eXBlYWxpYXNlcycsXG4gICAgICAgICAgICAgICAgICAgIGlkOiAnbWlzY2VsbGFuZW91cy10eXBlYWxpYXNlcycsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdtaXNjZWxsYW5lb3VzLXR5cGVhbGlhc2VzJyxcbiAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VudW1lcmF0aW9ucycsXG4gICAgICAgICAgICAgICAgICAgIGlkOiAnbWlzY2VsbGFuZW91cy1lbnVtZXJhdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnbWlzY2VsbGFuZW91cy1lbnVtZXJhdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVRlbXBsYXRldXJsKGNvbXBvbmVudCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGxldCBkaXJuYW1lID0gcGF0aC5kaXJuYW1lKGNvbXBvbmVudC5maWxlKTtcbiAgICAgICAgbGV0IHRlbXBsYXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJuYW1lICsgcGF0aC5zZXAgKyBjb21wb25lbnQudGVtcGxhdGVVcmwpO1xuXG4gICAgICAgIGlmICghdGhpcy5maWxlRW5naW5lLmV4aXN0c1N5bmModGVtcGxhdGVQYXRoKSkge1xuICAgICAgICAgICAgbGV0IGVyciA9IGBDYW5ub3QgcmVhZCB0ZW1wbGF0ZSBmb3IgJHtjb21wb25lbnQubmFtZX1gO1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge30pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZUVuZ2luZS5nZXQodGVtcGxhdGVQYXRoKS50aGVuKFxuICAgICAgICAgICAgZGF0YSA9PiAoY29tcG9uZW50LnRlbXBsYXRlRGF0YSA9IGRhdGEpLFxuICAgICAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TmF2VGFicyhkZXBlbmRlbmN5KTogQXJyYXk8YW55PiB7XG4gICAgICAgIGxldCBuYXZUYWJDb25maWcgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubmF2VGFiQ29uZmlnO1xuICAgICAgICBuYXZUYWJDb25maWcgPSBuYXZUYWJDb25maWcubGVuZ3RoID09PSAwID8gXy5jbG9uZURlZXAoQ09NUE9ET0NfQ09OU1RBTlRTLm5hdlRhYkRlZmluaXRpb25zKSA6IG5hdlRhYkNvbmZpZztcbiAgICAgICAgbGV0IG1hdGNoRGVwVHlwZSA9IChkZXBUeXBlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBkZXBUeXBlID09PSAnYWxsJyB8fCBkZXBUeXBlID09PSBkZXBlbmRlbmN5LnR5cGU7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IG5hdlRhYnMgPSBbXTtcbiAgICAgICAgXy5mb3JFYWNoKG5hdlRhYkNvbmZpZywgKGN1c3RvbVRhYikgPT4ge1xuICAgICAgICAgICAgbGV0IG5hdlRhYiA9IF8uZmluZChDT01QT0RPQ19DT05TVEFOVFMubmF2VGFiRGVmaW5pdGlvbnMsIHsgJ2lkJzogY3VzdG9tVGFiLmlkIH0pO1xuICAgICAgICAgICAgaWYgKCFuYXZUYWIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGFiIElEICcke2N1c3RvbVRhYi5pZH0nIHNwZWNpZmllZCBpbiB0YWIgY29uZmlndXJhdGlvbmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuYXZUYWIubGFiZWwgPSBjdXN0b21UYWIubGFiZWw7XG5cbiAgICAgICAgICAgIC8vIGlzIHRhYiBhcHBsaWNhYmxlIHRvIHRhcmdldCBkZXBlbmRlbmN5P1xuICAgICAgICAgICAgaWYgKC0xID09PSBfLmZpbmRJbmRleChuYXZUYWIuZGVwVHlwZXMsIG1hdGNoRGVwVHlwZSkpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgIC8vIGdsb2JhbCBjb25maWdcbiAgICAgICAgICAgIGlmIChjdXN0b21UYWIuaWQgPT09ICd0cmVlJyAmJiB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZURvbVRyZWUpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICBpZiAoY3VzdG9tVGFiLmlkID09PSAnc291cmNlJyAmJiB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNvdXJjZUNvZGUpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICBpZiAoY3VzdG9tVGFiLmlkID09PSAndGVtcGxhdGVEYXRhJyAmJiB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVRlbXBsYXRlVGFiKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgICAvLyBwZXIgZGVwZW5kZW5jeSBjb25maWdcbiAgICAgICAgICAgIGlmIChjdXN0b21UYWIuaWQgPT09ICdyZWFkbWUnICYmICFkZXBlbmRlbmN5LnJlYWRtZSkgeyByZXR1cm47IH1cbiAgICAgICAgICAgIGlmIChjdXN0b21UYWIuaWQgPT09ICdleGFtcGxlJyAmJiAhZGVwZW5kZW5jeS5leGFtcGxlVXJscykgeyByZXR1cm47IH1cbiAgICAgICAgICAgIGlmIChjdXN0b21UYWIuaWQgPT09ICd0ZW1wbGF0ZURhdGEnICYmICghZGVwZW5kZW5jeS50ZW1wbGF0ZVVybCB8fCBkZXBlbmRlbmN5LnRlbXBsYXRlVXJsLmxlbmd0aCA9PT0gMCkpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgIG5hdlRhYnMucHVzaChuYXZUYWIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobmF2VGFicy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gdmFsaWQgbmF2aWdhdGlvbiB0YWJzIGhhdmUgYmVlbiBkZWZpbmVkIGZvciBkZXBlbmRlbmN5IHR5cGUgJyR7ZGVwZW5kZW5jeS50eXBlfScuIFNwZWNpZnkgXFxcbmF0IGxlYXN0IG9uZSBjb25maWcgZm9yIHRoZSAnaW5mbycgb3IgJ3NvdXJjZScgdGFiIGluIC0tbmF2VGFiQ29uZmlnLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5hdlRhYnM7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVDb250cm9sbGVycyhzb21lQ29udHJvbGxlcnM/KSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGNvbnRyb2xsZXJzJyk7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb250cm9sbGVycyA9IHNvbWVDb250cm9sbGVyc1xuICAgICAgICAgICAgPyBzb21lQ29udHJvbGxlcnNcbiAgICAgICAgICAgIDogdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZ2V0Q29udHJvbGxlcnMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb250cm9sbGVycy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbGxlciA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb250cm9sbGVyc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnY29udHJvbGxlcnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY29udHJvbGxlci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbnRyb2xsZXIuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoY29udHJvbGxlciksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnY29udHJvbGxlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlci5pc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5uYW1lICs9ICctJyArIGNvbnRyb2xsZXIuZHVwbGljYXRlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmFkZFBhZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlcGFyZUNvbXBvbmVudHMoc29tZUNvbXBvbmVudHM/KSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGNvbXBvbmVudHMnKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvbXBvbmVudHMgPSBzb21lQ29tcG9uZW50c1xuICAgICAgICAgICAgPyBzb21lQ29tcG9uZW50c1xuICAgICAgICAgICAgOiB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5nZXRDb21wb25lbnRzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChtYWluUmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvbXBvbmVudHMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPD0gbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29tcG9uZW50ID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvbXBvbmVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICgkbWFya2Rvd25lbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShjb21wb25lbnQuZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAgJHtjb21wb25lbnQubmFtZX0gaGFzIGEgUkVBRE1FIGZpbGUsIGluY2x1ZGUgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWFkbWVGaWxlID0gJG1hcmtkb3duZW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKGNvbXBvbmVudC5maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWFkbWUgPSBtYXJrZWQocmVhZG1lRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnY29tcG9uZW50cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbXBvbmVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoY29tcG9uZW50KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnY29tcG9uZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlLm5hbWUgKz0gJy0nICsgY29tcG9uZW50LmR1cGxpY2F0ZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmFkZFBhZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LnRlbXBsYXRlVXJsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgICR7Y29tcG9uZW50Lm5hbWV9IGhhcyBhIHRlbXBsYXRlVXJsLCBpbmNsdWRlIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUZW1wbGF0ZXVybChjb21wb25lbnQpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJ2NvbXBvbmVudHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbXBvbmVudC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBjb21wb25lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2VGFiczogdGhpcy5nZXROYXZUYWJzKGNvbXBvbmVudCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2NvbXBvbmVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5uYW1lICs9ICctJyArIGNvbXBvbmVudC5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5hZGRQYWdlKHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC50ZW1wbGF0ZVVybC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCAke2NvbXBvbmVudC5uYW1lfSBoYXMgYSB0ZW1wbGF0ZVVybCwgaW5jbHVkZSBpdGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVGVtcGxhdGV1cmwoY29tcG9uZW50KS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1haW5SZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVEaXJlY3RpdmVzKHNvbWVEaXJlY3RpdmVzPykge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJlcGFyZSBkaXJlY3RpdmVzJyk7XG5cbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpcmVjdGl2ZXMgPSBzb21lRGlyZWN0aXZlc1xuICAgICAgICAgICAgPyBzb21lRGlyZWN0aXZlc1xuICAgICAgICAgICAgOiB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5nZXREaXJlY3RpdmVzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlyZWN0aXZlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGlyZWN0aXZlID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpcmVjdGl2ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICgkbWFya2Rvd25lbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShkaXJlY3RpdmUuZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAgJHtkaXJlY3RpdmUubmFtZX0gaGFzIGEgUkVBRE1FIGZpbGUsIGluY2x1ZGUgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWFkbWUgPSAkbWFya2Rvd25lbmdpbmUucmVhZE5laWdoYm91clJlYWRtZUZpbGUoZGlyZWN0aXZlLmZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlLnJlYWRtZSA9IG1hcmtlZChyZWFkbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJ2RpcmVjdGl2ZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZGlyZWN0aXZlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogZGlyZWN0aXZlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2VGFiczogdGhpcy5nZXROYXZUYWJzKGRpcmVjdGl2ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnZGlyZWN0aXZlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZTogZGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aXZlLmlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlLm5hbWUgKz0gJy0nICsgZGlyZWN0aXZlLmR1cGxpY2F0ZUlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5hZGRQYWdlKHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVJbmplY3RhYmxlcyhzb21lSW5qZWN0YWJsZXM/KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGluamVjdGFibGVzJyk7XG5cbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmluamVjdGFibGVzID0gc29tZUluamVjdGFibGVzXG4gICAgICAgICAgICA/IHNvbWVJbmplY3RhYmxlc1xuICAgICAgICAgICAgOiB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5nZXRJbmplY3RhYmxlcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmluamVjdGFibGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmplYyA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmplY3RhYmxlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCRtYXJrZG93bmVuZ2luZS5oYXNOZWlnaGJvdXJSZWFkbWVGaWxlKGluamVjLmZpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgICR7aW5qZWMubmFtZX0gaGFzIGEgUkVBRE1FIGZpbGUsIGluY2x1ZGUgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWFkbWUgPSAkbWFya2Rvd25lbmdpbmUucmVhZE5laWdoYm91clJlYWRtZUZpbGUoaW5qZWMuZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmplYy5yZWFkbWUgPSBtYXJrZWQocmVhZG1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdpbmplY3RhYmxlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBpbmplYy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGluamVjLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2VGFiczogdGhpcy5nZXROYXZUYWJzKGluamVjKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdpbmplY3RhYmxlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGU6IGluamVjLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5qZWMuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UubmFtZSArPSAnLScgKyBpbmplYy5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZShwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlSW50ZXJjZXB0b3JzKHNvbWVJbnRlcmNlcHRvcnM/KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGludGVyY2VwdG9ycycpO1xuXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbnRlcmNlcHRvcnMgPSBzb21lSW50ZXJjZXB0b3JzXG4gICAgICAgICAgICA/IHNvbWVJbnRlcmNlcHRvcnNcbiAgICAgICAgICAgIDogdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZ2V0SW50ZXJjZXB0b3JzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW50ZXJjZXB0b3JzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnRlcmNlcHRvciA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbnRlcmNlcHRvcnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICgkbWFya2Rvd25lbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShpbnRlcmNlcHRvci5maWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCAke2ludGVyY2VwdG9yLm5hbWV9IGhhcyBhIFJFQURNRSBmaWxlLCBpbmNsdWRlIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhZG1lID0gJG1hcmtkb3duZW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKGludGVyY2VwdG9yLmZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJjZXB0b3IucmVhZG1lID0gbWFya2VkKHJlYWRtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnaW50ZXJjZXB0b3JzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGludGVyY2VwdG9yLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogaW50ZXJjZXB0b3IuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoaW50ZXJjZXB0b3IpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2ludGVyY2VwdG9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGU6IGludGVyY2VwdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJjZXB0b3IuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UubmFtZSArPSAnLScgKyBpbnRlcmNlcHRvci5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZShwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlR3VhcmRzKHNvbWVHdWFyZHM/KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGd1YXJkcycpO1xuXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5ndWFyZHMgPSBzb21lR3VhcmRzXG4gICAgICAgICAgICA/IHNvbWVHdWFyZHNcbiAgICAgICAgICAgIDogdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZ2V0R3VhcmRzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZ3VhcmRzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBndWFyZCA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5ndWFyZHNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICgkbWFya2Rvd25lbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShndWFyZC5maWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCAke2d1YXJkLm5hbWV9IGhhcyBhIFJFQURNRSBmaWxlLCBpbmNsdWRlIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhZG1lID0gJG1hcmtkb3duZW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKGd1YXJkLmZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3VhcmQucmVhZG1lID0gbWFya2VkKHJlYWRtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnZ3VhcmRzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGd1YXJkLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogZ3VhcmQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoZ3VhcmQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2d1YXJkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGU6IGd1YXJkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3VhcmQuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UubmFtZSArPSAnLScgKyBndWFyZC5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZShwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlUm91dGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyByb3V0ZXMnKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnJvdXRlcyA9IHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmdldFJvdXRlcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3JvdXRlcycsXG4gICAgICAgICAgICAgICAgaWQ6ICdyb3V0ZXMnLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdyb3V0ZXMnLFxuICAgICAgICAgICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLlJPT1RcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmV4cG9ydEZvcm1hdCA9PT0gQ09NUE9ET0NfREVGQVVMVFMuZXhwb3J0Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXJQYXJzZXJcbiAgICAgICAgICAgICAgICAgICAgLmdlbmVyYXRlUm91dGVzSW5kZXgoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnJvdXRlc1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCcgUm91dGVzIGluZGV4IGdlbmVyYXRlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVDb3ZlcmFnZSgpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1Byb2Nlc3MgZG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSByZXBvcnQnKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAqIGxvb3Agd2l0aCBjb21wb25lbnRzLCBkaXJlY3RpdmVzLCBjbGFzc2VzLCBpbmplY3RhYmxlcywgaW50ZXJmYWNlcywgcGlwZXMsIG1pc2MgZnVuY3Rpb25zIHZhcmlhYmxlc1xuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBsZXQgZmlsZXMgPSBbXTtcbiAgICAgICAgICAgIGxldCB0b3RhbFByb2plY3RTdGF0ZW1lbnREb2N1bWVudGVkID0gMDtcbiAgICAgICAgICAgIGxldCBnZXRTdGF0dXMgPSBmdW5jdGlvbihwZXJjZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXR1cztcbiAgICAgICAgICAgICAgICBpZiAocGVyY2VudCA8PSAyNSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAnbG93JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlcmNlbnQgPiAyNSAmJiBwZXJjZW50IDw9IDUwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdtZWRpdW0nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGVyY2VudCA+IDUwICYmIHBlcmNlbnQgPD0gNzUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gJ2dvb2QnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICd2ZXJ5LWdvb2QnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBwcm9jZXNzQ29tcG9uZW50c0FuZERpcmVjdGl2ZXMgPSBsaXN0ID0+IHtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2gobGlzdCwgKGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSAoT2JqZWN0IGFzIGFueSkuYXNzaWduKHt9LCBlbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5wcm9wZXJ0aWVzQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucHJvcGVydGllc0NsYXNzID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50Lm1ldGhvZHNDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5tZXRob2RzQ2xhc3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQuaG9zdEJpbmRpbmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lmhvc3RCaW5kaW5ncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5ob3N0TGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lmhvc3RMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQuaW5wdXRzQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5wdXRzQ2xhc3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQub3V0cHV0c0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lm91dHB1dHNDbGFzcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBjbDogYW55ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGg6IGVsZW1lbnQuZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbGVtZW50Lm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudHMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5wcm9wZXJ0aWVzQ2xhc3MubGVuZ3RoICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQubWV0aG9kc0NsYXNzLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmlucHV0c0NsYXNzLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lmhvc3RCaW5kaW5ncy5sZW5ndGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5ob3N0TGlzdGVuZXJzLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lm91dHB1dHNDbGFzcy5sZW5ndGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgMTsgLy8gKzEgZm9yIGVsZW1lbnQgZGVjb3JhdG9yIGNvbW1lbnRcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jb25zdHJ1Y3Rvck9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jb25zdHJ1Y3Rvck9iaiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY29uc3RydWN0b3JPYmouZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNvbnN0cnVjdG9yT2JqLmRlc2NyaXB0aW9uICE9PSAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGVzY3JpcHRpb24gJiYgZWxlbWVudC5kZXNjcmlwdGlvbiAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGVsZW1lbnQucHJvcGVydGllc0NsYXNzLCAocHJvcGVydHk6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm1vZGlmaWVyS2luZCA9PT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgaGFuZGxlIHByaXZhdGUgZm9yIGNvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5kZXNjcmlwdGlvbiAhPT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5tb2RpZmllcktpbmQgIT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGVsZW1lbnQubWV0aG9kc0NsYXNzLCAobWV0aG9kOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9lc24ndCBoYW5kbGUgcHJpdmF0ZSBmb3IgY292ZXJhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLm1vZGlmaWVyS2luZCAhPT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goZWxlbWVudC5ob3N0QmluZGluZ3MsIChwcm9wZXJ0eTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9lc24ndCBoYW5kbGUgcHJpdmF0ZSBmb3IgY292ZXJhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmRlc2NyaXB0aW9uICE9PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Lm1vZGlmaWVyS2luZCAhPT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goZWxlbWVudC5ob3N0TGlzdGVuZXJzLCAobWV0aG9kOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9lc24ndCBoYW5kbGUgcHJpdmF0ZSBmb3IgY292ZXJhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLm1vZGlmaWVyS2luZCAhPT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goZWxlbWVudC5pbnB1dHNDbGFzcywgKGlucHV0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5tb2RpZmllcktpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50cyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChlbGVtZW50Lm91dHB1dHNDbGFzcywgKG91dHB1dDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0Lm1vZGlmaWVyS2luZCA9PT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgaGFuZGxlIHByaXZhdGUgZm9yIGNvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmRlc2NyaXB0aW9uICE9PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5tb2RpZmllcktpbmQgIT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjbC5jb3ZlcmFnZVBlcmNlbnQgPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkIC8gdG90YWxTdGF0ZW1lbnRzICogMTAwXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbFN0YXRlbWVudHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2wuY292ZXJhZ2VDb3VudCA9IHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArICcvJyArIHRvdGFsU3RhdGVtZW50cztcbiAgICAgICAgICAgICAgICAgICAgY2wuc3RhdHVzID0gZ2V0U3RhdHVzKGNsLmNvdmVyYWdlUGVyY2VudCk7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsUHJvamVjdFN0YXRlbWVudERvY3VtZW50ZWQgKz0gY2wuY292ZXJhZ2VQZXJjZW50O1xuICAgICAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKGNsKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgcHJvY2Vzc0NvdmVyYWdlUGVyRmlsZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyBkb2N1bWVudGF0aW9uIGNvdmVyYWdlIHBlciBmaWxlJyk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJy0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcblxuICAgICAgICAgICAgICAgIGxldCBvdmVyRmlsZXMgPSBmaWxlcy5maWx0ZXIoZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvdmVyVGVzdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBmLmNvdmVyYWdlUGVyY2VudCA+PSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJUZXN0ICYmICF0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0U2hvd09ubHlGYWlsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2YuY292ZXJhZ2VQZXJjZW50fSAlIGZvciBmaWxlICR7Zi5maWxlUGF0aH0gLSBvdmVyIG1pbmltdW0gcGVyIGZpbGVgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvdmVyVGVzdDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsZXQgdW5kZXJGaWxlcyA9IGZpbGVzLmZpbHRlcihmID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVuZGVyVGVzdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBmLmNvdmVyYWdlUGVyY2VudCA8IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodW5kZXJUZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7Zi5jb3ZlcmFnZVBlcmNlbnR9ICUgZm9yIGZpbGUgJHtmLmZpbGVQYXRofSAtIHVuZGVyIG1pbmltdW0gcGVyIGZpbGVgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlclRlc3Q7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG92ZXJGaWxlczogb3ZlckZpbGVzLFxuICAgICAgICAgICAgICAgICAgICB1bmRlckZpbGVzOiB1bmRlckZpbGVzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgcHJvY2Vzc0Z1bmN0aW9uc0FuZFZhcmlhYmxlcyA9IChpZCwgdHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChpZCwgKGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aDogZWwuZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rdHlwZTogZWwudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtzdWJ0eXBlOiBlbC5zdWJ0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZWwubmFtZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3ZhcmlhYmxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2wubGlua3R5cGUgPSAnbWlzY2VsbGFuZW91cyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudHMgPSAxO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5tb2RpZmllcktpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgaGFuZGxlIHByaXZhdGUgZm9yIGNvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5tb2RpZmllcktpbmQgIT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgLyB0b3RhbFN0YXRlbWVudHMgKiAxMDBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY2wuY292ZXJhZ2VDb3VudCA9IHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArICcvJyArIHRvdGFsU3RhdGVtZW50cztcbiAgICAgICAgICAgICAgICAgICAgY2wuc3RhdHVzID0gZ2V0U3RhdHVzKGNsLmNvdmVyYWdlUGVyY2VudCk7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsUHJvamVjdFN0YXRlbWVudERvY3VtZW50ZWQgKz0gY2wuY292ZXJhZ2VQZXJjZW50O1xuICAgICAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKGNsKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHByb2Nlc3NDb21wb25lbnRzQW5kRGlyZWN0aXZlcyh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY29tcG9uZW50cyk7XG4gICAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50c0FuZERpcmVjdGl2ZXModGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpcmVjdGl2ZXMpO1xuXG4gICAgICAgICAgICBfLmZvckVhY2godGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNsYXNzZXMsIChjbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGNsYXNzZSA9IChPYmplY3QgYXMgYW55KS5hc3NpZ24oe30sIGNsKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXNzZS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZS5wcm9wZXJ0aWVzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY2xhc3NlLm1ldGhvZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NlLm1ldGhvZHMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGNsYTogYW55ID0ge1xuICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aDogY2xhc3NlLmZpbGUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjbGFzcycsXG4gICAgICAgICAgICAgICAgICAgIGxpbmt0eXBlOiAnY2xhc3NlJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogY2xhc3NlLm5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudHMgPSBjbGFzc2UucHJvcGVydGllcy5sZW5ndGggKyBjbGFzc2UubWV0aG9kcy5sZW5ndGggKyAxOyAvLyArMSBmb3IgY2xhc3MgaXRzZWxmXG5cbiAgICAgICAgICAgICAgICBpZiAoY2xhc3NlLmNvbnN0cnVjdG9yT2JqKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50cyArPSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2UuY29uc3RydWN0b3JPYmogJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZS5jb25zdHJ1Y3Rvck9iai5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NlLmNvbnN0cnVjdG9yT2JqLmRlc2NyaXB0aW9uICE9PSAnJ1xuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjbGFzc2UuZGVzY3JpcHRpb24gJiYgY2xhc3NlLmRlc2NyaXB0aW9uICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBfLmZvckVhY2goY2xhc3NlLnByb3BlcnRpZXMsIChwcm9wZXJ0eTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5tb2RpZmllcktpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgaGFuZGxlIHByaXZhdGUgZm9yIGNvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5tb2RpZmllcktpbmQgIT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChjbGFzc2UubWV0aG9kcywgKG1ldGhvZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNsYS5jb3ZlcmFnZVBlcmNlbnQgPSBNYXRoLmZsb29yKHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCAvIHRvdGFsU3RhdGVtZW50cyAqIDEwMCk7XG4gICAgICAgICAgICAgICAgaWYgKHRvdGFsU3RhdGVtZW50cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjbGEuY292ZXJhZ2VQZXJjZW50ID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2xhLmNvdmVyYWdlQ291bnQgPSB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKyAnLycgKyB0b3RhbFN0YXRlbWVudHM7XG4gICAgICAgICAgICAgICAgY2xhLnN0YXR1cyA9IGdldFN0YXR1cyhjbGEuY292ZXJhZ2VQZXJjZW50KTtcbiAgICAgICAgICAgICAgICB0b3RhbFByb2plY3RTdGF0ZW1lbnREb2N1bWVudGVkICs9IGNsYS5jb3ZlcmFnZVBlcmNlbnQ7XG4gICAgICAgICAgICAgICAgZmlsZXMucHVzaChjbGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBfLmZvckVhY2godGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmluamVjdGFibGVzLCAoaW5qOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaW5qZWN0YWJsZSA9IChPYmplY3QgYXMgYW55KS5hc3NpZ24oe30sIGluaik7XG4gICAgICAgICAgICAgICAgaWYgKCFpbmplY3RhYmxlLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZS5wcm9wZXJ0aWVzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghaW5qZWN0YWJsZS5tZXRob2RzKSB7XG4gICAgICAgICAgICAgICAgICAgIGluamVjdGFibGUubWV0aG9kcyA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgY2w6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGg6IGluamVjdGFibGUuZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogaW5qZWN0YWJsZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBsaW5rdHlwZTogaW5qZWN0YWJsZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBpbmplY3RhYmxlLm5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudHMgPSBpbmplY3RhYmxlLnByb3BlcnRpZXMubGVuZ3RoICsgaW5qZWN0YWJsZS5tZXRob2RzLmxlbmd0aCArIDE7IC8vICsxIGZvciBpbmplY3RhYmxlIGl0c2VsZlxuXG4gICAgICAgICAgICAgICAgaWYgKGluamVjdGFibGUuY29uc3RydWN0b3JPYmopIHtcbiAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGUuY29uc3RydWN0b3JPYmogJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGUuY29uc3RydWN0b3JPYmouZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGUuY29uc3RydWN0b3JPYmouZGVzY3JpcHRpb24gIT09ICcnXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGluamVjdGFibGUuZGVzY3JpcHRpb24gJiYgaW5qZWN0YWJsZS5kZXNjcmlwdGlvbiAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKGluamVjdGFibGUucHJvcGVydGllcywgKHByb3BlcnR5OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm1vZGlmaWVyS2luZCA9PT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9lc24ndCBoYW5kbGUgcHJpdmF0ZSBmb3IgY292ZXJhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50cyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5kZXNjcmlwdGlvbiAhPT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Lm1vZGlmaWVyS2luZCAhPT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKGluamVjdGFibGUubWV0aG9kcywgKG1ldGhvZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IE1hdGguZmxvb3IodG90YWxTdGF0ZW1lbnREb2N1bWVudGVkIC8gdG90YWxTdGF0ZW1lbnRzICogMTAwKTtcbiAgICAgICAgICAgICAgICBpZiAodG90YWxTdGF0ZW1lbnRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlQ291bnQgPSB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKyAnLycgKyB0b3RhbFN0YXRlbWVudHM7XG4gICAgICAgICAgICAgICAgY2wuc3RhdHVzID0gZ2V0U3RhdHVzKGNsLmNvdmVyYWdlUGVyY2VudCk7XG4gICAgICAgICAgICAgICAgdG90YWxQcm9qZWN0U3RhdGVtZW50RG9jdW1lbnRlZCArPSBjbC5jb3ZlcmFnZVBlcmNlbnQ7XG4gICAgICAgICAgICAgICAgZmlsZXMucHVzaChjbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW50ZXJmYWNlcywgKGludGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpbnRlciA9IChPYmplY3QgYXMgYW55KS5hc3NpZ24oe30sIGludGUpO1xuICAgICAgICAgICAgICAgIGlmICghaW50ZXIucHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICBpbnRlci5wcm9wZXJ0aWVzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghaW50ZXIubWV0aG9kcykge1xuICAgICAgICAgICAgICAgICAgICBpbnRlci5tZXRob2RzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBjbDogYW55ID0ge1xuICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aDogaW50ZXIuZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogaW50ZXIudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgbGlua3R5cGU6IGludGVyLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGludGVyLm5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudHMgPSBpbnRlci5wcm9wZXJ0aWVzLmxlbmd0aCArIGludGVyLm1ldGhvZHMubGVuZ3RoICsgMTsgLy8gKzEgZm9yIGludGVyZmFjZSBpdHNlbGZcblxuICAgICAgICAgICAgICAgIGlmIChpbnRlci5jb25zdHJ1Y3Rvck9iaikge1xuICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXIuY29uc3RydWN0b3JPYmogJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyLmNvbnN0cnVjdG9yT2JqLmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlci5jb25zdHJ1Y3Rvck9iai5kZXNjcmlwdGlvbiAhPT0gJydcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW50ZXIuZGVzY3JpcHRpb24gJiYgaW50ZXIuZGVzY3JpcHRpb24gIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChpbnRlci5wcm9wZXJ0aWVzLCAocHJvcGVydHk6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmRlc2NyaXB0aW9uICE9PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2goaW50ZXIubWV0aG9kcywgKG1ldGhvZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IE1hdGguZmxvb3IodG90YWxTdGF0ZW1lbnREb2N1bWVudGVkIC8gdG90YWxTdGF0ZW1lbnRzICogMTAwKTtcbiAgICAgICAgICAgICAgICBpZiAodG90YWxTdGF0ZW1lbnRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlQ291bnQgPSB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKyAnLycgKyB0b3RhbFN0YXRlbWVudHM7XG4gICAgICAgICAgICAgICAgY2wuc3RhdHVzID0gZ2V0U3RhdHVzKGNsLmNvdmVyYWdlUGVyY2VudCk7XG4gICAgICAgICAgICAgICAgdG90YWxQcm9qZWN0U3RhdGVtZW50RG9jdW1lbnRlZCArPSBjbC5jb3ZlcmFnZVBlcmNlbnQ7XG4gICAgICAgICAgICAgICAgZmlsZXMucHVzaChjbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEucGlwZXMsIChwaXBlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgY2w6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGg6IHBpcGUuZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogcGlwZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBsaW5rdHlwZTogcGlwZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBwaXBlLm5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudHMgPSAxO1xuICAgICAgICAgICAgICAgIGlmIChwaXBlLmRlc2NyaXB0aW9uICYmIHBpcGUuZGVzY3JpcHRpb24gIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IE1hdGguZmxvb3IodG90YWxTdGF0ZW1lbnREb2N1bWVudGVkIC8gdG90YWxTdGF0ZW1lbnRzICogMTAwKTtcbiAgICAgICAgICAgICAgICBjbC5jb3ZlcmFnZUNvdW50ID0gdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICsgJy8nICsgdG90YWxTdGF0ZW1lbnRzO1xuICAgICAgICAgICAgICAgIGNsLnN0YXR1cyA9IGdldFN0YXR1cyhjbC5jb3ZlcmFnZVBlcmNlbnQpO1xuICAgICAgICAgICAgICAgIHRvdGFsUHJvamVjdFN0YXRlbWVudERvY3VtZW50ZWQgKz0gY2wuY292ZXJhZ2VQZXJjZW50O1xuICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goY2wpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHByb2Nlc3NGdW5jdGlvbnNBbmRWYXJpYWJsZXMoXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zLFxuICAgICAgICAgICAgICAgICdmdW5jdGlvbidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwcm9jZXNzRnVuY3Rpb25zQW5kVmFyaWFibGVzKFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcyxcbiAgICAgICAgICAgICAgICAndmFyaWFibGUnXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBmaWxlcyA9IF8uc29ydEJ5KGZpbGVzLCBbJ2ZpbGVQYXRoJ10pO1xuICAgICAgICAgICAgbGV0IGNvdmVyYWdlRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBjb3VudDpcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBNYXRoLmZsb29yKHRvdGFsUHJvamVjdFN0YXRlbWVudERvY3VtZW50ZWQgLyBmaWxlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IDAsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnJyxcbiAgICAgICAgICAgICAgICBmaWxlc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvdmVyYWdlRGF0YS5zdGF0dXMgPSBnZXRTdGF0dXMoY292ZXJhZ2VEYXRhLmNvdW50KTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnY292ZXJhZ2UnLFxuICAgICAgICAgICAgICAgIGlkOiAnY292ZXJhZ2UnLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdjb3ZlcmFnZScsXG4gICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLFxuICAgICAgICAgICAgICAgIGRhdGE6IGNvdmVyYWdlRGF0YSxcbiAgICAgICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5ST09UXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvdmVyYWdlRGF0YS5maWxlcyA9IGZpbGVzO1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlRGF0YSA9IGNvdmVyYWdlRGF0YTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0ID09PSBDT01QT0RPQ19ERUZBVUxUUy5leHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmh0bWxFbmdpbmUuZ2VuZXJhdGVDb3ZlcmFnZUJhZGdlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQnZG9jdW1lbnRhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlRGF0YVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWxlcyA9IF8uc29ydEJ5KGZpbGVzLCBbJ2NvdmVyYWdlUGVyY2VudCddKTtcblxuICAgICAgICAgICAgbGV0IGNvdmVyYWdlVGVzdFBlckZpbGVSZXN1bHRzO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3QgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFBlckZpbGVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIEdsb2JhbCBjb3ZlcmFnZSB0ZXN0IGFuZCBub3QgcGVyIGZpbGVcbiAgICAgICAgICAgICAgICBpZiAoY292ZXJhZ2VEYXRhLmNvdW50ID49IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICBgRG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSAoJHtjb3ZlcmFnZURhdGEuY291bnR9JSkgaXMgb3ZlciB0aHJlc2hvbGQgKCR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSUpYFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gYERvY3VtZW50YXRpb24gY292ZXJhZ2UgKCR7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZURhdGEuY291bnRcbiAgICAgICAgICAgICAgICAgICAgfSUpIGlzIG5vdCBvdmVyIHRocmVzaG9sZCAoJHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRcbiAgICAgICAgICAgICAgICAgICAgfSUpYDtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgIXRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3QgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0UGVyRmlsZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY292ZXJhZ2VUZXN0UGVyRmlsZVJlc3VsdHMgPSBwcm9jZXNzQ292ZXJhZ2VQZXJGaWxlKCk7XG4gICAgICAgICAgICAgICAgLy8gUGVyIGZpbGUgY292ZXJhZ2UgdGVzdCBhbmQgbm90IGdsb2JhbFxuICAgICAgICAgICAgICAgIGlmIChjb3ZlcmFnZVRlc3RQZXJGaWxlUmVzdWx0cy51bmRlckZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgRG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSBwZXIgZmlsZSBpcyBub3Qgb3ZlciB0aHJlc2hvbGQgKCR7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZVxuICAgICAgICAgICAgICAgICAgICB9JSlgO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICBgRG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSBwZXIgZmlsZSBpcyBvdmVyIHRocmVzaG9sZCAoJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSUpYFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RQZXJGaWxlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBQZXIgZmlsZSBjb3ZlcmFnZSB0ZXN0IGFuZCBnbG9iYWxcbiAgICAgICAgICAgICAgICBjb3ZlcmFnZVRlc3RQZXJGaWxlUmVzdWx0cyA9IHByb2Nlc3NDb3ZlcmFnZVBlckZpbGUoKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlRGF0YS5jb3VudCA+PSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkICYmXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlVGVzdFBlckZpbGVSZXN1bHRzLnVuZGVyRmlsZXMubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgYERvY3VtZW50YXRpb24gY292ZXJhZ2UgKCR7Y292ZXJhZ2VEYXRhLmNvdW50fSUpIGlzIG92ZXIgdGhyZXNob2xkICgke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0lKWBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICBgRG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSBwZXIgZmlsZSBpcyBvdmVyIHRocmVzaG9sZCAoJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSUpYFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlRGF0YS5jb3VudCA+PSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkICYmXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlVGVzdFBlckZpbGVSZXN1bHRzLnVuZGVyRmlsZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlICgke2NvdmVyYWdlRGF0YS5jb3VudH0lKSBpcyBvdmVyIHRocmVzaG9sZCAoJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkXG4gICAgICAgICAgICAgICAgICAgICAgICB9JSlgXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gYERvY3VtZW50YXRpb24gY292ZXJhZ2UgcGVyIGZpbGUgaXMgbm90IG92ZXIgdGhyZXNob2xkICgke1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlTWluaW11bVBlckZpbGVcbiAgICAgICAgICAgICAgICAgICAgfSUpYDtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlRGF0YS5jb3VudCA8IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgY292ZXJhZ2VUZXN0UGVyRmlsZVJlc3VsdHMudW5kZXJGaWxlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlR2xvYmFsID0gYERvY3VtZW50YXRpb24gY292ZXJhZ2UgKCR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY292ZXJhZ2VEYXRhLmNvdW50XG4gICAgICAgICAgICAgICAgICAgICAgICB9JSkgaXMgbm90IG92ZXIgdGhyZXNob2xkICgke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0lKWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGVyRmlsZSA9IGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlIHBlciBmaWxlIGlzIG5vdCBvdmVyIHRocmVzaG9sZCAoJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSUpYDtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZUdsb2JhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZVBlckZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4obWVzc2FnZUdsb2JhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihtZXNzYWdlUGVyRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlICgke1xuICAgICAgICAgICAgICAgICAgICAgICAgY292ZXJhZ2VEYXRhLmNvdW50XG4gICAgICAgICAgICAgICAgICAgIH0lKSBpcyBub3Qgb3ZlciB0aHJlc2hvbGQgKCR7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkXG4gICAgICAgICAgICAgICAgICAgIH0lKWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQZXJGaWxlID0gYERvY3VtZW50YXRpb24gY292ZXJhZ2UgcGVyIGZpbGUgaXMgb3ZlciB0aHJlc2hvbGQgKCR7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZVxuICAgICAgICAgICAgICAgICAgICB9JSlgO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKG1lc3NhZ2VQZXJGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8obWVzc2FnZVBlckZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblx0XHRwdWJsaWMgcHJlcGFyZVVuaXRUZXN0Q292ZXJhZ2UoKSB7XG5cdFx0XHRsb2dnZXIuaW5mbygnUHJvY2VzcyB1bml0IHRlc3QgY292ZXJhZ2UgcmVwb3J0Jyk7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk9Pntcblx0XHRcdFx0bGV0IGNvdkRhdCwgY292RmlsZU5hbWVzO1xuXG5cdFx0XHRcdGlmICghdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlRGF0YVsnZmlsZXMnXSl7XG5cdFx0XHRcdFx0bG9nZ2VyLndhcm4oJ01pc3NpbmcgZG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSBkYXRhJyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb3ZEYXQgPSB7fTtcblx0XHRcdFx0XHRcdGNvdkZpbGVOYW1lcyA9IF8ubWFwKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZURhdGFbJ2ZpbGVzJ10sIChlbCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRsZXQgZmlsZU5hbWUgPSBlbC5maWxlUGF0aDtcblx0XHRcdFx0XHRcdFx0Y292RGF0W2ZpbGVOYW1lXSA9IHt0eXBlOiBlbC50eXBlLCBsaW5rdHlwZTogZWwubGlua3R5cGUsIGxpbmtzdWJ0eXBlOiBlbC5saW5rc3VidHlwZSwgbmFtZTogZWwubmFtZX07XG4gICAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHJlYWQgY292ZXJhZ2Ugc3VtbWFyeSBmaWxlIGFuZCBkYXRhXG5cdFx0XHRcdGxldCB1bml0VGVzdFN1bW1hcnkgPSB7fTtcblx0XHRcdFx0bGV0IGZpbGVEYXQgPSB0aGlzLmZpbGVFbmdpbmUuZ2V0U3luYyh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudW5pdFRlc3RDb3ZlcmFnZSk7XG5cdFx0XHRcdGlmKGZpbGVEYXQpe1xuXHRcdFx0XHRcdHVuaXRUZXN0U3VtbWFyeSA9IEpTT04ucGFyc2UoZmlsZURhdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KCdFcnJvciByZWFkaW5nIHVuaXQgdGVzdCBjb3ZlcmFnZSBmaWxlJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bGV0IGdldENvdlN0YXR1cyA9IGZ1bmN0aW9uKHBlcmNlbnQsIHRvdGFsTGluZXMpe1xuXHRcdFx0XHRcdGxldCBzdGF0dXM7XG5cdFx0XHRcdFx0aWYodG90YWxMaW5lcyA9PT0gMCl7XG5cdFx0XHRcdFx0XHRzdGF0dXMgPSAndW5jb3ZlcmVkJ1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAocGVyY2VudCA8PSAyNSl7XG5cdFx0XHRcdFx0XHRzdGF0dXMgPSAnbG93Jztcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHBlcmNlbnQgPiAyNSAmJiBwZXJjZW50IDw9IDUwKXtcblx0XHRcdFx0XHRcdHN0YXR1cyA9ICdtZWRpdW0nO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAocGVyY2VudCA+IDUwICYmIHBlcmNlbnQgPD0gNzUpe1xuXHRcdFx0XHRcdFx0c3RhdHVzID0gJ2dvb2QnXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHN0YXR1cyA9ICd2ZXJ5LWdvb2QnO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gc3RhdHVzO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxldCBnZXRDb3ZlcmFnZURhdGEgPSBmdW5jdGlvbihkYXRhLCBmaWxlTmFtZSkge1xuXHRcdFx0XHRcdGxldCBvdXQgPSB7fTtcblx0XHRcdFx0XHRpZiAoZmlsZU5hbWUgIT09ICd0b3RhbCcpe1xuXHRcdFx0XHRcdFx0aWYoY292RGF0ID09PSB1bmRlZmluZWQpe1xuXHRcdFx0XHRcdFx0XHQvLyBuZWVkIGEgbmFtZSB0byBpbmNsdWRlIGluIG91dHB1dCBidXQgdGhpcyBpc24ndCB2aXNpYmxlXG5cdFx0XHRcdFx0XHRcdG91dCA9IHtuYW1lOiBmaWxlTmFtZSwgZmlsZVBhdGg6IGZpbGVOYW1lfTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7IC8vaWYgKGNvdkRhdFtmaWxlTmFtZV0pe1xuICAgICAgICAgICAgICBsZXQgZmluZE1hdGNoID0gXy5maWx0ZXIoY292RmlsZU5hbWVzLCAoZWwpPT57XG4gICAgICAgICAgICAgICAgcmV0dXJuIChlbC5pbmNsdWRlcyhmaWxlTmFtZSkgfHwgZmlsZU5hbWUuaW5jbHVkZXMoZWwpKVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYoZmluZE1hdGNoLmxlbmd0aCA+IDApe1xuXHRcdFx0XHRcdFx0XHQgICBvdXQgPSBfLmNsb25lKGNvdkRhdFtmaW5kTWF0Y2hbMF1dKTtcbiAgICAgICAgICAgICAgICBvdXRbJ2ZpbGVQYXRoJ10gPSBmaWxlTmFtZTtcbiAgICAgICAgICAgICAgfSAvL2Vsc2Uge1xuICAgICAgICAgICAgICAgIC8vb3V0ID0ge25hbWU6IGZpbGVOYW1lLCBmaWxlUGF0aDogZmlsZU5hbWV9O1xuICAgICAgICAgICAgICAvL31cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bGV0IGtleXNUb0dldCA9IFsnc3RhdGVtZW50cycsICdicmFuY2hlcycsICdmdW5jdGlvbnMnLCAnbGluZXMnXTtcblx0XHRcdFx0XHRfLmZvckVhY2goa2V5c1RvR2V0LCAoa2V5KT0+e1xuXHRcdFx0XHRcdFx0aWYoZGF0YVtrZXldKXtcblx0XHRcdFx0XHRcdFx0bGV0IHQgPSBkYXRhW2tleV07XG5cdFx0XHRcdFx0XHRcdG91dFtrZXldID0ge2NvdmVyYWdlUGVyY2VudDogTWF0aC5yb3VuZCh0LnBjdCksXG5cdFx0XHRcdFx0XHRcdFx0Y292ZXJhZ2VDb3VudDogJycgKyB0LmNvdmVyZWQgKyAnLycgKyB0LnRvdGFsLFxuXHRcdFx0XHRcdFx0XHRcdHN0YXR1czogZ2V0Q292U3RhdHVzKHQucGN0LCB0LnRvdGFsKX07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0cmV0dXJuIG91dDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCB1bml0VGVzdERhdGEgPSB7fTtcblx0XHRcdFx0bGV0IGZpbGVzID0gW107XG5cdFx0XHRcdGZvcihsZXQgZmlsZSBpbiB1bml0VGVzdFN1bW1hcnkpe1xuXHRcdFx0XHRcdGxldCBkYXQgPSBnZXRDb3ZlcmFnZURhdGEodW5pdFRlc3RTdW1tYXJ5W2ZpbGVdLCBmaWxlKTtcblx0XHRcdFx0XHRpZiAoZmlsZSA9PT0gJ3RvdGFsJyl7XG5cdFx0XHRcdFx0XHR1bml0VGVzdERhdGFbJ3RvdGFsJ10gPSBkYXQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGZpbGVzLnB1c2goZGF0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dW5pdFRlc3REYXRhWydmaWxlcyddID0gZmlsZXM7XG5cdFx0XHRcdHVuaXRUZXN0RGF0YVsnaWRDb2x1bW4nXSA9IChjb3ZEYXQgIT09IHVuZGVmaW5lZCk7IC8vIHNob3VsZCB3ZSBpbmNsdWRlIHRoZSBpZCBjb2x1bW5cblx0XHRcdFx0dGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnVuaXRUZXN0RGF0YSA9IHVuaXRUZXN0RGF0YTtcblx0XHRcdFx0dGhpcy5jb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuXHRcdFx0XHRcdG5hbWU6ICd1bml0LXRlc3QnLFxuICAgICAgICAgIGlkOiAndW5pdC10ZXN0JyxcbiAgICAgICAgICBjb250ZXh0OiAndW5pdC10ZXN0JyxcbiAgICAgICAgICBmaWxlczogZmlsZXMsXG4gICAgICAgICAgZGF0YTogdW5pdFRlc3REYXRhLFxuICAgICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLlJPT1Rcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmV4cG9ydEZvcm1hdCA9PT0gQ09NUE9ET0NfREVGQVVMVFMuZXhwb3J0Rm9ybWF0KXtcblx0XHRcdFx0XHRsZXQga2V5c1RvR2V0ID0gWydzdGF0ZW1lbnRzJywgJ2JyYW5jaGVzJywgJ2Z1bmN0aW9ucycsICdsaW5lcyddO1xuXHRcdFx0XHRcdF8uZm9yRWFjaChrZXlzVG9HZXQsIChrZXkpPT57XG5cdFx0XHRcdFx0XHRpZih1bml0VGVzdERhdGFbJ3RvdGFsJ11ba2V5XSl7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaHRtbEVuZ2luZS5nZW5lcmF0ZUNvdmVyYWdlQmFkZ2UoXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCxcblx0XHRcdFx0XHRcdFx0XHRrZXksXG5cdFx0XHRcdFx0XHRcdFx0e2NvdW50OiB1bml0VGVzdERhdGFbJ3RvdGFsJ11ba2V5XVsnY292ZXJhZ2VQZXJjZW50J10sXG5cdFx0XHRcdFx0XHRcdFx0XHRzdGF0dXM6IHVuaXRUZXN0RGF0YVsndG90YWwnXVtrZXldWydzdGF0dXMnXX1cblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc1BhZ2UocGFnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyBwYWdlJywgcGFnZS5uYW1lKTtcblxuICAgICAgICBsZXQgaHRtbERhdGEgPSB0aGlzLmh0bWxFbmdpbmUucmVuZGVyKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YSwgcGFnZSk7XG4gICAgICAgIGxldCBmaW5hbFBhdGggPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0O1xuXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0Lmxhc3RJbmRleE9mKCcvJykgPT09IC0xKSB7XG4gICAgICAgICAgICBmaW5hbFBhdGggKz0gJy8nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWdlLnBhdGgpIHtcbiAgICAgICAgICAgIGZpbmFsUGF0aCArPSBwYWdlLnBhdGggKyAnLyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFnZS5maWxlbmFtZSkge1xuICAgICAgICAgICAgZmluYWxQYXRoICs9IHBhZ2UuZmlsZW5hbWUgKyAnLmh0bWwnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmluYWxQYXRoICs9IHBhZ2UubmFtZSArICcuaHRtbCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlU2VhcmNoKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaEVuZ2luZS5pbmRleFBhZ2Uoe1xuICAgICAgICAgICAgICAgIGluZm9zOiBwYWdlLFxuICAgICAgICAgICAgICAgIHJhd0RhdGE6IGh0bWxEYXRhLFxuICAgICAgICAgICAgICAgIHVybDogZmluYWxQYXRoXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZpbGVFbmdpbmUud3JpdGUoZmluYWxQYXRoLCBodG1sRGF0YSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgZHVyaW5nICcgKyBwYWdlLm5hbWUgKyAnIHBhZ2UgZ2VuZXJhdGlvbicpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCcnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByb2Nlc3NQYWdlcygpIHtcbiAgICAgICAgbGV0IHBhZ2VzID0gXy5zb3J0QnkodGhpcy5jb25maWd1cmF0aW9uLnBhZ2VzLCBbJ25hbWUnXSk7XG5cbiAgICAgICAgbG9nZ2VyLmluZm8oJ1Byb2Nlc3MgcGFnZXMnKTtcbiAgICAgICAgUHJvbWlzZS5hbGwocGFnZXMubWFwKHBhZ2UgPT4gdGhpcy5wcm9jZXNzUGFnZShwYWdlKSkpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGNhbGxiYWNrc0FmdGVyR2VuZXJhdGVTZWFyY2hJbmRleEpzb24gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYWRkaXRpb25hbFBhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0FkZGl0aW9uYWxQYWdlcygpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hc3NldHNGb2xkZXIgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQXNzZXRzRm9sZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXNvdXJjZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNlYXJjaCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaEVuZ2luZS5nZW5lcmF0ZVNlYXJjaEluZGV4SnNvbih0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0KS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrc0FmdGVyR2VuZXJhdGVTZWFyY2hJbmRleEpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzQWZ0ZXJHZW5lcmF0ZVNlYXJjaEluZGV4SnNvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc01lbnUodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzTWVudShtYWluRGF0YSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyBtZW51Li4uJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHRtbEVuZ2luZS5yZW5kZXJNZW51KHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50ZW1wbGF0ZXMsIG1haW5EYXRhKS50aGVuKGh0bWxEYXRhID0+IHtcbiAgICAgICAgICAgIGxldCBmaW5hbFBhdGggPSBgJHttYWluRGF0YS5vdXRwdXR9L2pzL21lbnUtd2MuanNgO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZUVuZ2luZS53cml0ZShmaW5hbFBhdGgsIGh0bWxEYXRhKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgZHVyaW5nICcgKyBmaW5hbFBhdGggKyAnIHBhZ2UgZ2VuZXJhdGlvbicpO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByb2Nlc3NBZGRpdGlvbmFsUGFnZXMoKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzIGFkZGl0aW9uYWwgcGFnZXMnKTtcbiAgICAgICAgbGV0IHBhZ2VzID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmFkZGl0aW9uYWxQYWdlcztcbiAgICAgICAgUHJvbWlzZS5hbGwocGFnZXMubWFwKChwYWdlLCBpKSA9PiB0aGlzLnByb2Nlc3NQYWdlKHBhZ2UpKSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaEVuZ2luZVxuICAgICAgICAgICAgICAgICAgICAuZ2VuZXJhdGVTZWFyY2hJbmRleEpzb24odGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hc3NldHNGb2xkZXIgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQXNzZXRzRm9sZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXNvdXJjZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJvY2Vzc0Fzc2V0c0ZvbGRlcigpOiB2b2lkIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0NvcHkgYXNzZXRzIGZvbGRlcicpO1xuXG4gICAgICAgIGlmICghdGhpcy5maWxlRW5naW5lLmV4aXN0c1N5bmModGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmFzc2V0c0ZvbGRlcikpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICBgUHJvdmlkZWQgYXNzZXRzIGZvbGRlciAke3RoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hc3NldHNGb2xkZXJ9IGRpZCBub3QgZXhpc3RgXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZpbmFsT3V0cHV0ID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dDtcblxuICAgICAgICAgICAgbGV0IHRlc3RPdXRwdXREaXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0Lm1hdGNoKHByb2Nlc3MuY3dkKCkpO1xuXG4gICAgICAgICAgICBpZiAodGVzdE91dHB1dERpciAmJiB0ZXN0T3V0cHV0RGlyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmaW5hbE91dHB1dCA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLFxuICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIGZpbmFsT3V0cHV0LFxuICAgICAgICAgICAgICAgIHBhdGguYmFzZW5hbWUodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmFzc2V0c0ZvbGRlcilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmcy5jb3B5KFxuICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZSh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYXNzZXRzRm9sZGVyKSxcbiAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoZGVzdGluYXRpb24pLFxuICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgZHVyaW5nIHJlc291cmNlcyBjb3B5ICcsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHByb2Nlc3NSZXNvdXJjZXMoKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdDb3B5IG1haW4gcmVzb3VyY2VzJyk7XG5cbiAgICAgICAgY29uc3Qgb25Db21wbGV0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICdEb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBpbiAnICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCArXG4gICAgICAgICAgICAgICAgICAgICcgaW4gJyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RWxhcHNlZFRpbWUoKSArXG4gICAgICAgICAgICAgICAgICAgICcgc2Vjb25kcyB1c2luZyAnICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnRoZW1lICtcbiAgICAgICAgICAgICAgICAgICAgJyB0aGVtZSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnNlcnZlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgIGBTZXJ2aW5nIGRvY3VtZW50YXRpb24gZnJvbSAke1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dFxuICAgICAgICAgICAgICAgICAgICB9IGF0IGh0dHA6Ly8xMjcuMC4wLjE6JHt0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEucG9ydH1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bldlYlNlcnZlcih0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRDYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBmaW5hbE91dHB1dCA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQ7XG5cbiAgICAgICAgbGV0IHRlc3RPdXRwdXREaXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0Lm1hdGNoKHByb2Nlc3MuY3dkKCkpO1xuXG4gICAgICAgIGlmICh0ZXN0T3V0cHV0RGlyICYmIHRlc3RPdXRwdXREaXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmluYWxPdXRwdXQgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LnJlcGxhY2UocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLCAnJyk7XG4gICAgICAgIH1cblxuICAgICAgICBmcy5jb3B5KFxuICAgICAgICAgICAgcGF0aC5yZXNvbHZlKF9fZGlybmFtZSArICcvLi4vc3JjL3Jlc291cmNlcy8nKSxcbiAgICAgICAgICAgIHBhdGgucmVzb2x2ZShmaW5hbE91dHB1dCksXG4gICAgICAgICAgICBlcnJvckNvcHkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvckNvcHkpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBkdXJpbmcgcmVzb3VyY2VzIGNvcHkgJywgZXJyb3JDb3B5KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmV4dFRoZW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcy5jb3B5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwICsgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmV4dFRoZW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoZmluYWxPdXRwdXQgKyAnL3N0eWxlcy8nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihlcnJvckNvcHlUaGVtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JDb3B5VGhlbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRXJyb3IgZHVyaW5nIGV4dGVybmFsIHN0eWxpbmcgdGhlbWUgY29weSAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29weVRoZW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0V4dGVybmFsIHN0eWxpbmcgdGhlbWUgY29weSBzdWNjZWVkZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmN1c3RvbUZhdmljb24gIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEN1c3RvbSBmYXZpY29uIHN1cHBsaWVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuY29weShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5zZXAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jdXN0b21GYXZpY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShmaW5hbE91dHB1dCArICcvaW1hZ2VzL2Zhdmljb24uaWNvJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29weUZhdmljb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yQ29weUZhdmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFcnJvciBkdXJpbmcgcmVzb3VyY2VzIGNvcHkgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3B5RmF2aWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBlbGFwc2VkIHRpbWUgc2luY2UgdGhlIHByb2dyYW0gd2FzIHN0YXJ0ZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0RWxhcHNlZFRpbWUoKSB7XG4gICAgICAgIHJldHVybiAobmV3IERhdGUoKS52YWx1ZU9mKCkgLSBzdGFydFRpbWUudmFsdWVPZigpKSAvIDEwMDA7XG4gICAgfVxuXG4gICAgcHVibGljIHByb2Nlc3NHcmFwaHMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUdyYXBoKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbygnR3JhcGggZ2VuZXJhdGlvbiBkaXNhYmxlZCcpO1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUGFnZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzIG1haW4gZ3JhcGgnKTtcbiAgICAgICAgICAgIGxldCBtb2R1bGVzID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm1vZHVsZXM7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gbW9kdWxlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8PSBsZW4gLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzIG1vZHVsZSBncmFwaCcsIG1vZHVsZXNbaV0ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbFBhdGggPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dC5sYXN0SW5kZXhPZignLycpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxQYXRoICs9ICcvJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbFBhdGggKz0gJ21vZHVsZXMvJyArIG1vZHVsZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IF9yYXdNb2R1bGUgPSB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5nZXRSYXdNb2R1bGUobW9kdWxlc1tpXS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5kZWNsYXJhdGlvbnMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5ib290c3RyYXAubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5pbXBvcnRzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yYXdNb2R1bGUuZXhwb3J0cy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmF3TW9kdWxlLnByb3ZpZGVycy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ2RFbmdpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVuZGVyR3JhcGgobW9kdWxlc1tpXS5maWxlLCBmaW5hbFBhdGgsICdmJywgbW9kdWxlc1tpXS5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5nZEVuZ2luZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWFkR3JhcGgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShmaW5hbFBhdGggKyBwYXRoLnNlcCArICdkZXBlbmRlbmNpZXMuc3ZnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXNbaV0ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzW2ldLmdyYXBoID0gZGF0YSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGR1cmluZyBncmFwaCByZWFkOiAnLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BhZ2VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBmaW5hbE1haW5HcmFwaFBhdGggPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0O1xuICAgICAgICAgICAgaWYgKGZpbmFsTWFpbkdyYXBoUGF0aC5sYXN0SW5kZXhPZignLycpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGZpbmFsTWFpbkdyYXBoUGF0aCArPSAnLyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbE1haW5HcmFwaFBhdGggKz0gJ2dyYXBoJztcbiAgICAgICAgICAgIHRoaXMubmdkRW5naW5lLmluaXQocGF0aC5yZXNvbHZlKGZpbmFsTWFpbkdyYXBoUGF0aCkpO1xuXG4gICAgICAgICAgICB0aGlzLm5nZEVuZ2luZVxuICAgICAgICAgICAgICAgIC5yZW5kZXJHcmFwaChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoZmluYWxNYWluR3JhcGhQYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgJ3AnXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5nZEVuZ2luZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWFkR3JhcGgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShmaW5hbE1haW5HcmFwaFBhdGggKyBwYXRoLnNlcCArICdkZXBlbmRlbmNpZXMuc3ZnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNYWluIGdyYXBoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubWFpbkdyYXBoID0gZGF0YSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGR1cmluZyBtYWluIGdyYXBoIHJlYWRpbmcgOiAnLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVNYWluR3JhcGggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT29vcHMgZXJyb3IgZHVyaW5nIG1haW4gZ3JhcGggZ2VuZXJhdGlvbiwgbW92aW5nIG9uIG5leHQgcGFydCB3aXRoIG1haW4gZ3JhcGggZGlzYWJsZWQgOiAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlTWFpbkdyYXBoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcnVuV2ViU2VydmVyKGZvbGRlcikge1xuICAgICAgICBpZiAoIXRoaXMuaXNXYXRjaGluZykge1xuICAgICAgICAgICAgTGl2ZVNlcnZlci5zdGFydCh7XG4gICAgICAgICAgICAgICAgcm9vdDogZm9sZGVyLFxuICAgICAgICAgICAgICAgIG9wZW46IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5vcGVuLFxuICAgICAgICAgICAgICAgIHF1aWV0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGxvZ0xldmVsOiAwLFxuICAgICAgICAgICAgICAgIHdhaXQ6IDEwMDAsXG4gICAgICAgICAgICAgICAgcG9ydDogdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnBvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEud2F0Y2ggJiYgIXRoaXMuaXNXYXRjaGluZykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZpbGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignTm8gc291cmNlcyBmaWxlcyBhdmFpbGFibGUsIHBsZWFzZSB1c2UgLXAgZmxhZycpO1xuICAgICAgICAgICAgICAgIGdlbmVyYXRpb25Qcm9taXNlUmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bldhdGNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLndhdGNoICYmIHRoaXMuaXNXYXRjaGluZykge1xuICAgICAgICAgICAgbGV0IHNyY0ZvbGRlciA9IGZpbmRNYWluU291cmNlRm9sZGVyKHRoaXMuZmlsZXMpO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEFscmVhZHkgd2F0Y2hpbmcgc291cmNlcyBpbiAke3NyY0ZvbGRlcn0gZm9sZGVyYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcnVuV2F0Y2goKSB7XG4gICAgICAgIGxldCBzb3VyY2VzID0gW2ZpbmRNYWluU291cmNlRm9sZGVyKHRoaXMuZmlsZXMpXTtcbiAgICAgICAgbGV0IHdhdGNoZXJSZWFkeSA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuaXNXYXRjaGluZyA9IHRydWU7XG5cbiAgICAgICAgbG9nZ2VyLmluZm8oYFdhdGNoaW5nIHNvdXJjZXMgaW4gJHtmaW5kTWFpblNvdXJjZUZvbGRlcih0aGlzLmZpbGVzKX0gZm9sZGVyYCk7XG5cbiAgICAgICAgaWYgKCRtYXJrZG93bmVuZ2luZS5oYXNSb290TWFya2Rvd25zKCkpIHtcbiAgICAgICAgICAgIHNvdXJjZXMgPSBzb3VyY2VzLmNvbmNhdCgkbWFya2Rvd25lbmdpbmUubGlzdFJvb3RNYXJrZG93bnMoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmluY2x1ZGVzICE9PSAnJykge1xuICAgICAgICAgICAgc291cmNlcyA9IHNvdXJjZXMuY29uY2F0KHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBhbGwgZWxlbWVudHMgb2Ygc291cmNlcyBsaXN0IGV4aXN0XG4gICAgICAgIHNvdXJjZXMgPSBjbGVhblNvdXJjZXNGb3JXYXRjaChzb3VyY2VzKTtcblxuICAgICAgICBsZXQgd2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKHNvdXJjZXMsIHtcbiAgICAgICAgICAgIGF3YWl0V3JpdGVGaW5pc2g6IHRydWUsXG4gICAgICAgICAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgICAgICAgICAgaWdub3JlZDogLyhzcGVjfFxcLmQpXFwudHMvXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgdGltZXJBZGRBbmRSZW1vdmVSZWY7XG4gICAgICAgIGxldCB0aW1lckNoYW5nZVJlZjtcbiAgICAgICAgbGV0IHJ1bm5lckFkZEFuZFJlbW92ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlKCk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCB3YWl0ZXJBZGRBbmRSZW1vdmUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJBZGRBbmRSZW1vdmVSZWYpO1xuICAgICAgICAgICAgdGltZXJBZGRBbmRSZW1vdmVSZWYgPSBzZXRUaW1lb3V0KHJ1bm5lckFkZEFuZFJlbW92ZSwgMTAwMCk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCBydW5uZXJDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5zZXRVcGRhdGVkRmlsZXModGhpcy53YXRjaENoYW5nZWRGaWxlcyk7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNXYXRjaGVkRmlsZXNUU0ZpbGVzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdldE1pY3JvRGVwZW5kZW5jaWVzRGF0YSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc1dhdGNoZWRGaWxlc1Jvb3RNYXJrZG93bkZpbGVzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYnVpbGRSb290TWFya2Rvd25zKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVidWlsZEV4dGVybmFsRG9jdW1lbnRhdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBsZXQgd2FpdGVyQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyQ2hhbmdlUmVmKTtcbiAgICAgICAgICAgIHRpbWVyQ2hhbmdlUmVmID0gc2V0VGltZW91dChydW5uZXJDaGFuZ2UsIDEwMDApO1xuICAgICAgICB9O1xuXG4gICAgICAgIHdhdGNoZXIub24oJ3JlYWR5JywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF3YXRjaGVyUmVhZHkpIHtcbiAgICAgICAgICAgICAgICB3YXRjaGVyUmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHdhdGNoZXJcbiAgICAgICAgICAgICAgICAgICAgLm9uKCdhZGQnLCBmaWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmlsZSAke2ZpbGV9IGhhcyBiZWVuIGFkZGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXN0IGV4dGVuc2lvbiwgaWYgdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2NhbiBldmVyeXRoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5leHRuYW1lKGZpbGUpID09PSAnLnRzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRlckFkZEFuZFJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAub24oJ2NoYW5nZScsIGZpbGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBGaWxlICR7ZmlsZX0gaGFzIGJlZW4gY2hhbmdlZGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVzdCBleHRlbnNpb24sIGlmIHRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNjYW4gb25seSBmaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5leHRuYW1lKGZpbGUpID09PSAnLnRzJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy5tZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmV4dG5hbWUoZmlsZSkgPT09ICcuanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2F0Y2hDaGFuZ2VkRmlsZXMucHVzaChwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwICsgZmlsZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRlckNoYW5nZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAub24oJ3VubGluaycsIGZpbGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBGaWxlICR7ZmlsZX0gaGFzIGJlZW4gcmVtb3ZlZGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVzdCBleHRlbnNpb24sIGlmIHRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNjYW4gZXZlcnl0aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0ZXJBZGRBbmRSZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgYXBwbGljYXRpb24gLyByb290IGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBnZXQgYXBwbGljYXRpb24oKTogQXBwbGljYXRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBnZXQgaXNDTEkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5jb25zdCBnbG9iID0gcmVxdWlyZSgnZ2xvYicpO1xuXG5leHBvcnQgY2xhc3MgUGFyc2VyVXRpbCB7XG4gICAgcHJpdmF0ZSBfZmlsZXM7XG4gICAgcHJpdmF0ZSBfY3dkO1xuICAgIHByaXZhdGUgX2dsb2JGaWxlcyA9IFtdO1xuXG4gICAgcHVibGljIGluaXQoZXhjbHVkZTogc3RyaW5nW10sIGN3ZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2ZpbGVzID0gZXhjbHVkZTtcbiAgICAgICAgdGhpcy5fY3dkID0gY3dkO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBleGNsdWRlLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fZ2xvYkZpbGVzID0gWy4uLnRoaXMuX2dsb2JGaWxlcywgLi4uZ2xvYi5zeW5jKGV4Y2x1ZGVbaV0sIHsgY3dkOiB0aGlzLl9jd2QgfSldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRlc3RGaWxlc1dpdGhDd2REZXB0aCgpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgbGVuID0gdGhpcy5fZmlsZXMubGVuZ3RoO1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAgc3RhdHVzOiB0cnVlLFxuICAgICAgICAgICAgbGV2ZWw6IDBcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBlbGVtZW50UGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLl9jd2QgKyBwYXRoLnNlcCwgdGhpcy5fZmlsZXNbaV0pO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnRQYXRoLmluZGV4T2YodGhpcy5fY3dkKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbGV0IGxldmVsID0gdGhpcy5fZmlsZXNbaV0ubWF0Y2goL1xcLi5cXC8vZykubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChsZXZlbCA+IHJlc3VsdC5sZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQubGV2ZWwgPSBsZXZlbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlQ3dkKGN3ZCwgbGV2ZWwpIHtcbiAgICAgICAgbGV0IF9jd2QgPSBjd2QsXG4gICAgICAgICAgICBfcmV3aW5kID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGV2ZWw7IGkrKykge1xuICAgICAgICAgICAgX3Jld2luZCArPSAnLi4vJztcbiAgICAgICAgfVxuICAgICAgICBfY3dkID0gcGF0aC5yZXNvbHZlKF9jd2QsIF9yZXdpbmQpO1xuICAgICAgICByZXR1cm4gX2N3ZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdGVzdEZpbGUoZmlsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgbGV0IGxlbiA9IHRoaXMuX2ZpbGVzLmxlbmd0aDtcbiAgICAgICAgbGV0IGZpbGVCYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZSk7XG4gICAgICAgIGxldCBmaWxlTmFtZUluQ3dkID0gZmlsZS5yZXBsYWNlKHRoaXMuX2N3ZCArIHBhdGguc2VwLCAnJyk7XG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcblxuICAgICAgICBpZiAocGF0aC5zZXAgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgZmlsZU5hbWVJbkN3ZCA9IGZpbGVOYW1lSW5Dd2QucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcJyArIHBhdGguc2VwLCAnZycpLCAnLycpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChnbG9iLmhhc01hZ2ljKHRoaXMuX2ZpbGVzW2ldKSAmJiB0aGlzLl9nbG9iRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHRHbG9iU2VhcmNoID0gdGhpcy5fZ2xvYkZpbGVzLmZpbmRJbmRleChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuX2N3ZCArIHBhdGguc2VwLCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRQYXRoSW5Dd2QgPSBlbGVtZW50UGF0aC5yZXBsYWNlKHRoaXMuX2N3ZCArIHBhdGguc2VwLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQYXRoSW5Dd2QgPSBlbGVtZW50UGF0aEluQ3dkLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxcXCcgKyBwYXRoLnNlcCwgJ2cnKSwgJy8nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRQYXRoSW5Dd2QgPT09IGZpbGVOYW1lSW5Dd2Q7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0R2xvYlNlYXJjaCAhPT0gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZpbGVOYW1lSW5Dd2QgPT09IHRoaXMuX2ZpbGVzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufSIsImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IEFwcGxpY2F0aW9uIH0gZnJvbSAnLi9hcHAvYXBwbGljYXRpb24nO1xuXG5pbXBvcnQgeyBDT01QT0RPQ19ERUZBVUxUUyB9IGZyb20gJy4vdXRpbHMvZGVmYXVsdHMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgcmVhZENvbmZpZywgaGFuZGxlUGF0aCB9IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuXG5pbXBvcnQgeyB0cyB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuaW1wb3J0IHsgUGFyc2VyVXRpbCB9IGZyb20gJy4vdXRpbHMvcGFyc2VyLnV0aWwuY2xhc3MnO1xuXG5pbXBvcnQgSTE4bkVuZ2luZUluc3RhbmNlIGZyb20gJy4vYXBwL2VuZ2luZXMvaTE4bi5lbmdpbmUnO1xuXG5jb25zdCBwa2cgPSByZXF1aXJlKCcuLi9wYWNrYWdlLmpzb24nKTtcbmNvbnN0IHByb2dyYW0gPSByZXF1aXJlKCdjb21tYW5kZXInKTtcbmNvbnN0IG9zID0gcmVxdWlyZSgnb3MnKTtcbmNvbnN0IG9zTmFtZSA9IHJlcXVpcmUoJ29zLW5hbWUnKTtcbmNvbnN0IGNvc21pY29uZmlnID0gcmVxdWlyZSgnY29zbWljb25maWcnKTtcblxuY29uc3QgY29zbWljb25maWdNb2R1bGVOYW1lID0gJ2NvbXBvZG9jJztcblxubGV0IHNjYW5uZWRGaWxlcyA9IFtdO1xubGV0IGV4Y2x1ZGVGaWxlcztcbmxldCBpbmNsdWRlRmlsZXM7XG5sZXQgY3dkID0gcHJvY2Vzcy5jd2QoKTtcblxucHJvY2Vzcy5zZXRNYXhMaXN0ZW5lcnMoMCk7XG5cbmV4cG9ydCBjbGFzcyBDbGlBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBSdW4gY29tcG9kb2MgZnJvbSB0aGUgY29tbWFuZCBsaW5lLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZW5lcmF0ZSgpOiBhbnkge1xuICAgICAgICBmdW5jdGlvbiBsaXN0KHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCgnLCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvZ3JhbVxuICAgICAgICAgICAgLnZlcnNpb24ocGtnLnZlcnNpb24pXG4gICAgICAgICAgICAudXNhZ2UoJzxzcmM+IFtvcHRpb25zXScpXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctYywgLS1jb25maWcgW2NvbmZpZ10nLFxuICAgICAgICAgICAgICAgICdBIGNvbmZpZ3VyYXRpb24gZmlsZSA6IC5jb21wb2RvY3JjLCAuY29tcG9kb2NyYy5qc29uLCAuY29tcG9kb2NyYy55YW1sIG9yIGNvbXBvZG9jIHByb3BlcnR5IGluIHBhY2thZ2UuanNvbidcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy1wLCAtLXRzY29uZmlnIFtjb25maWddJywgJ0EgdHNjb25maWcuanNvbiBmaWxlJylcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy1kLCAtLW91dHB1dCBbZm9sZGVyXScsXG4gICAgICAgICAgICAgICAgJ1doZXJlIHRvIHN0b3JlIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbicsXG4gICAgICAgICAgICAgICAgQ09NUE9ET0NfREVGQVVMVFMuZm9sZGVyXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKCcteSwgLS1leHRUaGVtZSBbZmlsZV0nLCAnRXh0ZXJuYWwgc3R5bGluZyB0aGVtZSBmaWxlJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1uLCAtLW5hbWUgW25hbWVdJywgJ1RpdGxlIGRvY3VtZW50YXRpb24nLCBDT01QT0RPQ19ERUZBVUxUUy50aXRsZSlcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy1hLCAtLWFzc2V0c0ZvbGRlciBbZm9sZGVyXScsXG4gICAgICAgICAgICAgICAgJ0V4dGVybmFsIGFzc2V0cyBmb2xkZXIgdG8gY29weSBpbiBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBmb2xkZXInXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKCctbywgLS1vcGVuIFt2YWx1ZV0nLCAnT3BlbiB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24nKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLXQsIC0tc2lsZW50JyxcbiAgICAgICAgICAgICAgICBcIkluIHNpbGVudCBtb2RlLCBsb2cgbWVzc2FnZXMgYXJlbid0IGxvZ2dlZCBpbiB0aGUgY29uc29sZVwiLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctcywgLS1zZXJ2ZScsXG4gICAgICAgICAgICAgICAgJ1NlcnZlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIChkZWZhdWx0IGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8pJyxcbiAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbignLXIsIC0tcG9ydCBbcG9ydF0nLCAnQ2hhbmdlIGRlZmF1bHQgc2VydmluZyBwb3J0JywgQ09NUE9ET0NfREVGQVVMVFMucG9ydClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy13LCAtLXdhdGNoJyxcbiAgICAgICAgICAgICAgICAnV2F0Y2ggc291cmNlIGZpbGVzIGFmdGVyIHNlcnZlIGFuZCBmb3JjZSBkb2N1bWVudGF0aW9uIHJlYnVpbGQnLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctZSwgLS1leHBvcnRGb3JtYXQgW2Zvcm1hdF0nLFxuICAgICAgICAgICAgICAgICdFeHBvcnQgaW4gc3BlY2lmaWVkIGZvcm1hdCAoanNvbiwgaHRtbCknLFxuICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLmV4cG9ydEZvcm1hdFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbignLS1sYW5ndWFnZSBbbGFuZ3VhZ2VdJywgJ0xhbmd1YWdlIHVzZWQgZm9yIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiAoZW4tVVMsIGZyLUZSLCB6aC1DTiknLCBDT01QT0RPQ19ERUZBVUxUUy5sYW5ndWFnZSlcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tdGhlbWUgW3RoZW1lXScsXG4gICAgICAgICAgICAgICAgXCJDaG9vc2Ugb25lIG9mIGF2YWlsYWJsZSB0aGVtZXMsIGRlZmF1bHQgaXMgJ2dpdGJvb2snIChsYXJhdmVsLCBvcmlnaW5hbCwgbWF0ZXJpYWwsIHBvc3RtYXJrLCByZWFkdGhlZG9jcywgc3RyaXBlLCB2YWdyYW50KVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWhpZGVHZW5lcmF0b3InLFxuICAgICAgICAgICAgICAgICdEbyBub3QgcHJpbnQgdGhlIENvbXBvZG9jIGxpbmsgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZScsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tdG9nZ2xlTWVudUl0ZW1zIDxpdGVtcz4nLFxuICAgICAgICAgICAgICAgIFwiQ2xvc2UgYnkgZGVmYXVsdCBpdGVtcyBpbiB0aGUgbWVudSB2YWx1ZXMgOiBbJ2FsbCddIG9yIG9uZSBvZiB0aGVzZSBbJ21vZHVsZXMnLCdjb21wb25lbnRzJywnZGlyZWN0aXZlcycsJ2NsYXNzZXMnLCdpbmplY3RhYmxlcycsJ2ludGVyZmFjZXMnLCdwaXBlcycsJ2FkZGl0aW9uYWxQYWdlcyddXCIsXG4gICAgICAgICAgICAgICAgbGlzdCxcbiAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy50b2dnbGVNZW51SXRlbXNcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tbmF2VGFiQ29uZmlnIDx0YWIgY29uZmlncz4nLFxuICAgICAgICAgICAgICAgIGBMaXN0IG5hdmlnYXRpb24gdGFiIG9iamVjdHMgaW4gdGhlIGRlc2lyZWQgb3JkZXIgd2l0aCB0d28gc3RyaW5nIHByb3BlcnRpZXMgKFwiaWRcIiBhbmQgXCJsYWJlbFwiKS4gXFxcbkRvdWJsZS1xdW90ZXMgbXVzdCBiZSBlc2NhcGVkIHdpdGggJ1xcXFwnLiBcXFxuQXZhaWxhYmxlIHRhYiBJRHMgYXJlIFwiaW5mb1wiLCBcInJlYWRtZVwiLCBcInNvdXJjZVwiLCBcInRlbXBsYXRlRGF0YVwiLCBcInRyZWVcIiwgYW5kIFwiZXhhbXBsZVwiLiBcXFxuTm90ZTogQ2VydGFpbiB0YWJzIHdpbGwgb25seSBiZSBzaG93biBpZiBhcHBsaWNhYmxlIHRvIGEgZ2l2ZW4gZGVwZW5kZW5jeWAsXG4gICAgICAgICAgICAgICAgbGlzdCxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShDT01QT0RPQ19ERUZBVUxUUy5uYXZUYWJDb25maWcpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLXRlbXBsYXRlcyBbZm9sZGVyXScsXG4gICAgICAgICAgICAgICAgJ1BhdGggdG8gZGlyZWN0b3J5IG9mIEhhbmRsZWJhcnMgdGVtcGxhdGVzIHRvIG92ZXJyaWRlIGJ1aWx0LWluIHRlbXBsYXRlcydcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy0taW5jbHVkZXMgW3BhdGhdJywgJ1BhdGggb2YgZXh0ZXJuYWwgbWFya2Rvd24gZmlsZXMgdG8gaW5jbHVkZScpXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWluY2x1ZGVzTmFtZSBbbmFtZV0nLFxuICAgICAgICAgICAgICAgICdOYW1lIG9mIGl0ZW0gbWVudSBvZiBleHRlcm5hbHMgbWFya2Rvd24gZmlsZXMnLFxuICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLmFkZGl0aW9uYWxFbnRyeU5hbWVcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tY292ZXJhZ2VUZXN0IFt0aHJlc2hvbGRdJyxcbiAgICAgICAgICAgICAgICAnVGVzdCBjb21tYW5kIG9mIGRvY3VtZW50YXRpb24gY292ZXJhZ2Ugd2l0aCBhIHRocmVzaG9sZCAoZGVmYXVsdCA3MCknXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWNvdmVyYWdlTWluaW11bVBlckZpbGUgW21pbmltdW1dJyxcbiAgICAgICAgICAgICAgICAnVGVzdCBjb21tYW5kIG9mIGRvY3VtZW50YXRpb24gY292ZXJhZ2UgcGVyIGZpbGUgd2l0aCBhIG1pbmltdW0gKGRlZmF1bHQgMCknXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWwgW3RydWV8ZmFsc2VdJyxcbiAgICAgICAgICAgICAgICAnVGVzdCBjb21tYW5kIG9mIGRvY3VtZW50YXRpb24gY292ZXJhZ2UgKGdsb2JhbCBvciBwZXIgZmlsZSkgd2lsbCBmYWlsIHdpdGggZXJyb3Igb3IganVzdCB3YXJuIHVzZXIgKHRydWU6IGVycm9yLCBmYWxzZTogd2FybiknLFxuICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLmNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY292ZXJhZ2VUZXN0U2hvd09ubHlGYWlsZWQnLCAnRGlzcGxheSBvbmx5IGZhaWxlZCBmaWxlcyBmb3IgYSBjb3ZlcmFnZSB0ZXN0JylcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tdW5pdFRlc3RDb3ZlcmFnZSBbanNvbi1zdW1tYXJ5XScsXG4gICAgICAgICAgICAgICAgJ1RvIGluY2x1ZGUgdW5pdCB0ZXN0IGNvdmVyYWdlLCBzcGVjaWZ5IGlzdGFuYnVsIEpTT04gY292ZXJhZ2Ugc3VtbWFyeSBmaWxlJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS1kaXNhYmxlU291cmNlQ29kZScsXG4gICAgICAgICAgICAgICAgJ0RvIG5vdCBhZGQgc291cmNlIGNvZGUgdGFiIGFuZCBsaW5rcyB0byBzb3VyY2UgY29kZScsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZURvbVRyZWUnLCAnRG8gbm90IGFkZCBkb20gdHJlZSB0YWInLCBmYWxzZSlcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZVRlbXBsYXRlVGFiJywgJ0RvIG5vdCBhZGQgdGVtcGxhdGUgdGFiJywgZmFsc2UpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGVHcmFwaCcsICdEbyBub3QgYWRkIHRoZSBkZXBlbmRlbmN5IGdyYXBoJywgZmFsc2UpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGVDb3ZlcmFnZScsICdEbyBub3QgYWRkIHRoZSBkb2N1bWVudGF0aW9uIGNvdmVyYWdlIHJlcG9ydCcsIGZhbHNlKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlUHJpdmF0ZScsICdEbyBub3Qgc2hvdyBwcml2YXRlIGluIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uJywgZmFsc2UpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGVQcm90ZWN0ZWQnLCAnRG8gbm90IHNob3cgcHJvdGVjdGVkIGluIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uJywgZmFsc2UpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGVJbnRlcm5hbCcsICdEbyBub3Qgc2hvdyBAaW50ZXJuYWwgaW4gZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24nLCBmYWxzZSlcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tZGlzYWJsZUxpZmVDeWNsZUhvb2tzJyxcbiAgICAgICAgICAgICAgICAnRG8gbm90IHNob3cgQW5ndWxhciBsaWZlY3ljbGUgaG9va3MgaW4gZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24nLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWRpc2FibGVSb3V0ZXNHcmFwaCcsXG4gICAgICAgICAgICAgICAgJ0RvIG5vdCBhZGQgdGhlIHJvdXRlcyBncmFwaCcsXG4gICAgICAgICAgICAgICAgQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZVJvdXRlc0dyYXBoXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGVTZWFyY2gnLCAnRG8gbm90IGFkZCB0aGUgc2VhcmNoIGlucHV0JywgZmFsc2UpXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLW1pbmltYWwnLFxuICAgICAgICAgICAgICAgICdNaW5pbWFsIG1vZGUgd2l0aCBvbmx5IGRvY3VtZW50YXRpb24uIE5vIHNlYXJjaCwgbm8gZ3JhcGgsIG5vIGNvdmVyYWdlLicsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY3VzdG9tRmF2aWNvbiBbcGF0aF0nLCAnVXNlIGEgY3VzdG9tIGZhdmljb24nKVxuICAgICAgICAgICAgLm9wdGlvbignLS1nYUlEIFtpZF0nLCAnR29vZ2xlIEFuYWx5dGljcyB0cmFja2luZyBJRCcpXG4gICAgICAgICAgICAub3B0aW9uKCctLWdhU2l0ZSBbc2l0ZV0nLCAnR29vZ2xlIEFuYWx5dGljcyBzaXRlIG5hbWUnLCBDT01QT0RPQ19ERUZBVUxUUy5nYVNpdGUpXG4gICAgICAgICAgICAucGFyc2UocHJvY2Vzcy5hcmd2KTtcblxuICAgICAgICBsZXQgb3V0cHV0SGVscCA9ICgpID0+IHtcbiAgICAgICAgICAgIHByb2dyYW0ub3V0cHV0SGVscCgpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGNvbmZpZ0V4cGxvcmVyID0gY29zbWljb25maWcoY29zbWljb25maWdNb2R1bGVOYW1lKTtcblxuICAgICAgICBsZXQgY29uZmlnRXhwbG9yZXJSZXN1bHQ7XG5cbiAgICAgICAgbGV0IGNvbmZpZ0ZpbGUgPSB7fTtcblxuICAgICAgICBpZiAocHJvZ3JhbS5jb25maWcpIHtcbiAgICAgICAgICAgIGxldCBjb25maWdGaWxlUGF0aCA9IHByb2dyYW0uY29uZmlnO1xuICAgICAgICAgICAgbGV0IHRlc3RDb25maWdGaWxlUGF0aCA9IGNvbmZpZ0ZpbGVQYXRoLm1hdGNoKHByb2Nlc3MuY3dkKCkpO1xuICAgICAgICAgICAgaWYgKHRlc3RDb25maWdGaWxlUGF0aCAmJiB0ZXN0Q29uZmlnRmlsZVBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGVQYXRoID0gY29uZmlnRmlsZVBhdGgucmVwbGFjZShwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAsICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZ0V4cGxvcmVyUmVzdWx0ID0gY29uZmlnRXhwbG9yZXIubG9hZFN5bmMocGF0aC5yZXNvbHZlKGNvbmZpZ0ZpbGVQYXRoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWdFeHBsb3JlclJlc3VsdCA9IGNvbmZpZ0V4cGxvcmVyLnNlYXJjaFN5bmMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnRXhwbG9yZXJSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnRXhwbG9yZXJSZXN1bHQuY29uZmlnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGUgPSBjb25maWdFeHBsb3JlclJlc3VsdC5jb25maWc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5vdXRwdXQpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQgPSBjb25maWdGaWxlLm91dHB1dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5vdXRwdXQgJiYgcHJvZ3JhbS5vdXRwdXQgIT09IENPTVBPRE9DX0RFRkFVTFRTLmZvbGRlcikge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCA9IHByb2dyYW0ub3V0cHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZXh0VGhlbWUpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5leHRUaGVtZSA9IGNvbmZpZ0ZpbGUuZXh0VGhlbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0uZXh0VGhlbWUpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5leHRUaGVtZSA9IHByb2dyYW0uZXh0VGhlbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5sYW5ndWFnZSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmxhbmd1YWdlID0gY29uZmlnRmlsZS5sYW5ndWFnZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5sYW5ndWFnZSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmxhbmd1YWdlID0gcHJvZ3JhbS5sYW5ndWFnZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLnRoZW1lKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudGhlbWUgPSBjb25maWdGaWxlLnRoZW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLnRoZW1lKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudGhlbWUgPSBwcm9ncmFtLnRoZW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUubmFtZSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRvY3VtZW50YXRpb25NYWluTmFtZSA9IGNvbmZpZ0ZpbGUubmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5uYW1lICYmIHByb2dyYW0ubmFtZSAhPT0gQ09NUE9ET0NfREVGQVVMVFMudGl0bGUpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kb2N1bWVudGF0aW9uTWFpbk5hbWUgPSBwcm9ncmFtLm5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5hc3NldHNGb2xkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hc3NldHNGb2xkZXIgPSBjb25maWdGaWxlLmFzc2V0c0ZvbGRlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5hc3NldHNGb2xkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hc3NldHNGb2xkZXIgPSBwcm9ncmFtLmFzc2V0c0ZvbGRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLm9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5vcGVuID0gY29uZmlnRmlsZS5vcGVuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLm9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5vcGVuID0gcHJvZ3JhbS5vcGVuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUudG9nZ2xlTWVudUl0ZW1zKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudG9nZ2xlTWVudUl0ZW1zID0gY29uZmlnRmlsZS50b2dnbGVNZW51SXRlbXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcHJvZ3JhbS50b2dnbGVNZW51SXRlbXMgJiZcbiAgICAgICAgICAgIHByb2dyYW0udG9nZ2xlTWVudUl0ZW1zICE9PSBDT01QT0RPQ19ERUZBVUxUUy50b2dnbGVNZW51SXRlbXNcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudG9nZ2xlTWVudUl0ZW1zID0gcHJvZ3JhbS50b2dnbGVNZW51SXRlbXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS50ZW1wbGF0ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50ZW1wbGF0ZXMgPSBjb25maWdGaWxlLnRlbXBsYXRlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS50ZW1wbGF0ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50ZW1wbGF0ZXMgPSBwcm9ncmFtLnRlbXBsYXRlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLm5hdlRhYkNvbmZpZykge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm5hdlRhYkNvbmZpZyA9IGNvbmZpZ0ZpbGUubmF2VGFiQ29uZmlnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb2dyYW0ubmF2VGFiQ29uZmlnICYmXG4gICAgICAgICAgICBKU09OLnBhcnNlKHByb2dyYW0ubmF2VGFiQ29uZmlnKS5sZW5ndGggIT09IENPTVBPRE9DX0RFRkFVTFRTLm5hdlRhYkNvbmZpZy5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubmF2VGFiQ29uZmlnID0gSlNPTi5wYXJzZShwcm9ncmFtLm5hdlRhYkNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5pbmNsdWRlcykge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmluY2x1ZGVzID0gY29uZmlnRmlsZS5pbmNsdWRlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5pbmNsdWRlcykge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmluY2x1ZGVzID0gcHJvZ3JhbS5pbmNsdWRlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmluY2x1ZGVzTmFtZSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmluY2x1ZGVzTmFtZSA9IGNvbmZpZ0ZpbGUuaW5jbHVkZXNOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb2dyYW0uaW5jbHVkZXNOYW1lICYmXG4gICAgICAgICAgICBwcm9ncmFtLmluY2x1ZGVzTmFtZSAhPT0gQ09NUE9ET0NfREVGQVVMVFMuYWRkaXRpb25hbEVudHJ5TmFtZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlc05hbWUgPSBwcm9ncmFtLmluY2x1ZGVzTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLnNpbGVudCkge1xuICAgICAgICAgICAgbG9nZ2VyLnNpbGVudCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLnNpbGVudCkge1xuICAgICAgICAgICAgbG9nZ2VyLnNpbGVudCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuc2VydmUpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5zZXJ2ZSA9IGNvbmZpZ0ZpbGUuc2VydmU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0uc2VydmUpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5zZXJ2ZSA9IHByb2dyYW0uc2VydmU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5wb3J0KSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEucG9ydCA9IGNvbmZpZ0ZpbGUucG9ydDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5wb3J0ICYmIHByb2dyYW0ucG9ydCAhPT0gQ09NUE9ET0NfREVGQVVMVFMucG9ydCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnBvcnQgPSBwcm9ncmFtLnBvcnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS53YXRjaCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLndhdGNoID0gY29uZmlnRmlsZS53YXRjaDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS53YXRjaCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLndhdGNoID0gcHJvZ3JhbS53YXRjaDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmV4cG9ydEZvcm1hdCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmV4cG9ydEZvcm1hdCA9IGNvbmZpZ0ZpbGUuZXhwb3J0Rm9ybWF0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLmV4cG9ydEZvcm1hdCAmJiBwcm9ncmFtLmV4cG9ydEZvcm1hdCAhPT0gQ09NUE9ET0NfREVGQVVMVFMuZXhwb3J0Rm9ybWF0KSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0ID0gcHJvZ3JhbS5leHBvcnRGb3JtYXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5oaWRlR2VuZXJhdG9yKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaGlkZUdlbmVyYXRvciA9IGNvbmZpZ0ZpbGUuaGlkZUdlbmVyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5oaWRlR2VuZXJhdG9yKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaGlkZUdlbmVyYXRvciA9IHByb2dyYW0uaGlkZUdlbmVyYXRvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmNvdmVyYWdlVGVzdCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgY29uZmlnRmlsZS5jb3ZlcmFnZVRlc3QgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQoY29uZmlnRmlsZS5jb3ZlcmFnZVRlc3QsIDEwKVxuICAgICAgICAgICAgICAgICAgICA6IENPTVBPRE9DX0RFRkFVTFRTLmRlZmF1bHRDb3ZlcmFnZVRocmVzaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5jb3ZlcmFnZVRlc3QpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3QgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZCA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIHByb2dyYW0uY292ZXJhZ2VUZXN0ID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSW50KHByb2dyYW0uY292ZXJhZ2VUZXN0LCAxMClcbiAgICAgICAgICAgICAgICAgICAgOiBDT01QT0RPQ19ERUZBVUxUUy5kZWZhdWx0Q292ZXJhZ2VUaHJlc2hvbGQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0UGVyRmlsZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZSA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIGNvbmZpZ0ZpbGUuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludChjb25maWdGaWxlLmNvdmVyYWdlTWluaW11bVBlckZpbGUsIDEwKVxuICAgICAgICAgICAgICAgICAgICA6IENPTVBPRE9DX0RFRkFVTFRTLmRlZmF1bHRDb3ZlcmFnZU1pbmltdW1QZXJGaWxlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLmNvdmVyYWdlTWluaW11bVBlckZpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RQZXJGaWxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgcHJvZ3JhbS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSW50KHByb2dyYW0uY292ZXJhZ2VNaW5pbXVtUGVyRmlsZSwgMTApXG4gICAgICAgICAgICAgICAgICAgIDogQ09NUE9ET0NfREVGQVVMVFMuZGVmYXVsdENvdmVyYWdlTWluaW11bVBlckZpbGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCA9XG4gICAgICAgICAgICAgICAgY29uZmlnRmlsZS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsID09PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLmNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsID1cbiAgICAgICAgICAgICAgICBwcm9ncmFtLmNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWwgPT09ICdmYWxzZScgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5jb3ZlcmFnZVRlc3RTaG93T25seUZhaWxlZCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkID1cbiAgICAgICAgICAgICAgICBjb25maWdGaWxlLmNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLmNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0U2hvd09ubHlGYWlsZWQgPVxuICAgICAgICAgICAgICAgIHByb2dyYW0uY292ZXJhZ2VUZXN0U2hvd09ubHlGYWlsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS51bml0VGVzdENvdmVyYWdlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudW5pdFRlc3RDb3ZlcmFnZSA9IGNvbmZpZ0ZpbGUudW5pdFRlc3RDb3ZlcmFnZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS51bml0VGVzdENvdmVyYWdlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudW5pdFRlc3RDb3ZlcmFnZSA9IHByb2dyYW0udW5pdFRlc3RDb3ZlcmFnZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVTb3VyY2VDb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNvdXJjZUNvZGUgPSBjb25maWdGaWxlLmRpc2FibGVTb3VyY2VDb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLmRpc2FibGVTb3VyY2VDb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNvdXJjZUNvZGUgPSBwcm9ncmFtLmRpc2FibGVTb3VyY2VDb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZGlzYWJsZURvbVRyZWUpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlRG9tVHJlZSA9IGNvbmZpZ0ZpbGUuZGlzYWJsZURvbVRyZWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0uZGlzYWJsZURvbVRyZWUpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlRG9tVHJlZSA9IHByb2dyYW0uZGlzYWJsZURvbVRyZWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlVGVtcGxhdGVUYWIpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlVGVtcGxhdGVUYWIgPSBjb25maWdGaWxlLmRpc2FibGVUZW1wbGF0ZVRhYjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5kaXNhYmxlVGVtcGxhdGVUYWIpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlVGVtcGxhdGVUYWIgPSBwcm9ncmFtLmRpc2FibGVUZW1wbGF0ZVRhYjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVHcmFwaCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVHcmFwaCA9IGNvbmZpZ0ZpbGUuZGlzYWJsZUdyYXBoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLmRpc2FibGVHcmFwaCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVHcmFwaCA9IHByb2dyYW0uZGlzYWJsZUdyYXBoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZGlzYWJsZUNvdmVyYWdlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUNvdmVyYWdlID0gY29uZmlnRmlsZS5kaXNhYmxlQ292ZXJhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0uZGlzYWJsZUNvdmVyYWdlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUNvdmVyYWdlID0gcHJvZ3JhbS5kaXNhYmxlQ292ZXJhZ2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlUHJpdmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVQcml2YXRlID0gY29uZmlnRmlsZS5kaXNhYmxlUHJpdmF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5kaXNhYmxlUHJpdmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVQcml2YXRlID0gcHJvZ3JhbS5kaXNhYmxlUHJpdmF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVQcm90ZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUHJvdGVjdGVkID0gY29uZmlnRmlsZS5kaXNhYmxlUHJvdGVjdGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLmRpc2FibGVQcm90ZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUHJvdGVjdGVkID0gcHJvZ3JhbS5kaXNhYmxlUHJvdGVjdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZGlzYWJsZUludGVybmFsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUludGVybmFsID0gY29uZmlnRmlsZS5kaXNhYmxlSW50ZXJuYWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0uZGlzYWJsZUludGVybmFsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUludGVybmFsID0gcHJvZ3JhbS5kaXNhYmxlSW50ZXJuYWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MgPSBjb25maWdGaWxlLmRpc2FibGVMaWZlQ3ljbGVIb29rcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MgPSBwcm9ncmFtLmRpc2FibGVMaWZlQ3ljbGVIb29rcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVSb3V0ZXNHcmFwaCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaCA9IGNvbmZpZ0ZpbGUuZGlzYWJsZVJvdXRlc0dyYXBoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLmRpc2FibGVSb3V0ZXNHcmFwaCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaCA9IHByb2dyYW0uZGlzYWJsZVJvdXRlc0dyYXBoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZGlzYWJsZVNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTZWFyY2ggPSBjb25maWdGaWxlLmRpc2FibGVTZWFyY2g7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0uZGlzYWJsZVNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTZWFyY2ggPSBwcm9ncmFtLmRpc2FibGVTZWFyY2g7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5taW5pbWFsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNlYXJjaCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVJvdXRlc0dyYXBoID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlR3JhcGggPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVDb3ZlcmFnZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0ubWluaW1hbCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTZWFyY2ggPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUdyYXBoID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlQ292ZXJhZ2UgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuY3VzdG9tRmF2aWNvbikge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmN1c3RvbUZhdmljb24gPSBjb25maWdGaWxlLmN1c3RvbUZhdmljb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0uY3VzdG9tRmF2aWNvbikge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmN1c3RvbUZhdmljb24gPSBwcm9ncmFtLmN1c3RvbUZhdmljb247XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5nYUlEKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZ2FJRCA9IGNvbmZpZ0ZpbGUuZ2FJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5nYUlEKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZ2FJRCA9IHByb2dyYW0uZ2FJRDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmdhU2l0ZSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmdhU2l0ZSA9IGNvbmZpZ0ZpbGUuZ2FTaXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLmdhU2l0ZSAmJiBwcm9ncmFtLmdhU2l0ZSAhPT0gQ09NUE9ET0NfREVGQVVMVFMuZ2FTaXRlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZ2FTaXRlID0gcHJvZ3JhbS5nYVNpdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaXNXYXRjaGluZykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9zcmMvYmFubmVyJykpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgY29uc29sZS5sb2cocGtnLnZlcnNpb24pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFR5cGVzY3JpcHQgdmVyc2lvbiA6ICR7dHMudmVyc2lvbn1gKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBOb2RlLmpzIHZlcnNpb24gOiAke3Byb2Nlc3MudmVyc2lvbn1gKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBPcGVyYXRpbmcgc3lzdGVtIDogJHtvc05hbWUob3MucGxhdGZvcm0oKSwgb3MucmVsZWFzZSgpKX1gKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdFeHBsb3JlclJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25maWdFeHBsb3JlclJlc3VsdC5jb25maWcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFVzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZSA6ICR7Y29uZmlnRXhwbG9yZXJSZXN1bHQuZmlsZXBhdGh9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbmZpZ0V4cGxvcmVyUmVzdWx0KSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgTm8gY29uZmlndXJhdGlvbiBmaWxlIGZvdW5kLCBzd2l0Y2hpbmcgdG8gQ0xJIGZsYWdzLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb2dyYW0ubGFuZ3VhZ2UgJiYgIUkxOG5FbmdpbmVJbnN0YW5jZS5zdXBwb3J0TGFuZ3VhZ2UocHJvZ3JhbS5sYW5ndWFnZSkpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBUaGUgbGFuZ3VhZ2UgJHtwcm9ncmFtLmxhbmd1YWdlfSBpcyBub3QgYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgdG8gJHtJMThuRW5naW5lSW5zdGFuY2UuZmFsbGJhY2tMYW5ndWFnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9ncmFtLnRzY29uZmlnICYmIHR5cGVvZiBwcm9ncmFtLnRzY29uZmlnID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUGxlYXNlIHByb3ZpZGUgYSB0c2NvbmZpZyBmaWxlLmApO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUudHNjb25maWcpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZyA9IGNvbmZpZ0ZpbGUudHNjb25maWc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0udHNjb25maWcpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZyA9IHByb2dyYW0udHNjb25maWc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5maWxlcykge1xuICAgICAgICAgICAgc2Nhbm5lZEZpbGVzID0gY29uZmlnRmlsZS5maWxlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnRmlsZS5leGNsdWRlKSB7XG4gICAgICAgICAgICBleGNsdWRlRmlsZXMgPSBjb25maWdGaWxlLmV4Y2x1ZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuaW5jbHVkZSkge1xuICAgICAgICAgICAgaW5jbHVkZUZpbGVzID0gY29uZmlnRmlsZS5pbmNsdWRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb2dyYW0uc2VydmUgJiYgIXRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZyAmJiBwcm9ncmFtLm91dHB1dCkge1xuICAgICAgICAgICAgLy8gaWYgLXMgJiAtZCwgc2VydmUgaXRcbiAgICAgICAgICAgIGlmICghdGhpcy5maWxlRW5naW5lLmV4aXN0c1N5bmMocHJvZ3JhbS5vdXRwdXQpKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGAke3Byb2dyYW0ub3V0cHV0fSBmb2xkZXIgZG9lc24ndCBleGlzdGApO1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgIGBTZXJ2aW5nIGRvY3VtZW50YXRpb24gZnJvbSAke3Byb2dyYW0ub3V0cHV0fSBhdCBodHRwOi8vMTI3LjAuMC4xOiR7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLnBvcnRcbiAgICAgICAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHN1cGVyLnJ1bldlYlNlcnZlcihwcm9ncmFtLm91dHB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocHJvZ3JhbS5zZXJ2ZSAmJiAhdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnICYmICFwcm9ncmFtLm91dHB1dCkge1xuICAgICAgICAgICAgLy8gaWYgb25seSAtcyBmaW5kIC4vZG9jdW1lbnRhdGlvbiwgaWYgb2sgc2VydmUsIGVsc2UgZXJyb3IgcHJvdmlkZSAtZFxuICAgICAgICAgICAgaWYgKCF0aGlzLmZpbGVFbmdpbmUuZXhpc3RzU3luYyhwcm9ncmFtLm91dHB1dCkpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1Byb3ZpZGUgb3V0cHV0IGdlbmVyYXRlZCBmb2xkZXIgd2l0aCAtZCBmbGFnJyk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgYFNlcnZpbmcgZG9jdW1lbnRhdGlvbiBmcm9tICR7cHJvZ3JhbS5vdXRwdXR9IGF0IGh0dHA6Ly8xMjcuMC4wLjE6JHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0ucG9ydFxuICAgICAgICAgICAgICAgICAgICB9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgc3VwZXIucnVuV2ViU2VydmVyKHByb2dyYW0ub3V0cHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwcm9ncmFtLmhpZGVHZW5lcmF0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaGlkZUdlbmVyYXRvciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcgJiYgcHJvZ3JhbS5hcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIHRzY29uZmlnIGZpbGUgcHJvdmlkZWQgb25seVxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGxldCB0ZXN0VHNDb25maWdQYXRoID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnLmluZGV4T2YocHJvY2Vzcy5jd2QoKSk7XG4gICAgICAgICAgICAgICAgaWYgKHRlc3RUc0NvbmZpZ1BhdGggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZyA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZy5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLFxuICAgICAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZmlsZUVuZ2luZS5leGlzdHNTeW5jKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZykpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYFwiJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIiBmaWxlIHdhcyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5YFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IF9maWxlID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5kaXJuYW1lKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZylcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmJhc2VuYW1lKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBvZiB0c2NvbmZpZy5qc29uIGFzIGEgd29ya2luZyBkaXJlY3RvcnlcbiAgICAgICAgICAgICAgICAgICAgY3dkID0gX2ZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdChwYXRoLnNlcClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZSgwLCAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKHBhdGguc2VwKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1VzaW5nIHRzY29uZmlnIGZpbGUgJywgX2ZpbGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCB0c0NvbmZpZ0ZpbGUgPSByZWFkQ29uZmlnKF9maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgc2Nhbm5lZEZpbGVzID0gdHNDb25maWdGaWxlLmZpbGVzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2Nhbm5lZEZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVkRmlsZXMgPSBoYW5kbGVQYXRoKHNjYW5uZWRGaWxlcywgY3dkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2Nhbm5lZEZpbGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZUZpbGVzID0gdHNDb25maWdGaWxlLmV4Y2x1ZGUgfHwgW107XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlRmlsZXMgPSB0c0NvbmZpZ0ZpbGUuaW5jbHVkZSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZWRGaWxlcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXhjbHVkZVBhcnNlciA9IG5ldyBQYXJzZXJVdGlsKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVBhcnNlciA9IG5ldyBQYXJzZXJVdGlsKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVQYXJzZXIuaW5pdChleGNsdWRlRmlsZXMsIGN3ZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUGFyc2VyLmluaXQoaW5jbHVkZUZpbGVzLCBjd2QpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRDd2QgPSBjd2Q7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBleGNsdWRlUGFyc2VyVGVzdEZpbGVzV2l0aEN3ZERlcHRoID0gZXhjbHVkZVBhcnNlci50ZXN0RmlsZXNXaXRoQ3dkRGVwdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhjbHVkZVBhcnNlclRlc3RGaWxlc1dpdGhDd2REZXB0aC5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEN3ZCA9IGV4Y2x1ZGVQYXJzZXIudXBkYXRlQ3dkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVQYXJzZXJUZXN0RmlsZXNXaXRoQ3dkRGVwdGgubGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluY2x1ZGVQYXJzZXJUZXN0RmlsZXNXaXRoQ3dkRGVwdGggPSBpbmNsdWRlUGFyc2VyLnRlc3RGaWxlc1dpdGhDd2REZXB0aCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmNsdWRlUGFyc2VyLnRlc3RGaWxlc1dpdGhDd2REZXB0aCgpLnN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q3dkID0gaW5jbHVkZVBhcnNlci51cGRhdGVDd2QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVBhcnNlclRlc3RGaWxlc1dpdGhDd2REZXB0aC5sZXZlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaW5kZXIgPSByZXF1aXJlKCdmaW5kaXQyJykoc3RhcnRDd2QgfHwgJy4nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZmluZGVyLm9uKCdkaXJlY3RvcnknLCBmdW5jdGlvbihkaXIsIHN0YXQsIHN0b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmFzZSA9IHBhdGguYmFzZW5hbWUoZGlyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZSA9PT0gJy5naXQnIHx8IGJhc2UgPT09ICdub2RlX21vZHVsZXMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZmluZGVyLm9uKCdmaWxlJywgKGZpbGUsIHN0YXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLyhzcGVjfFxcLmQpXFwudHMvLnRlc3QoZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0lnbm9yaW5nJywgZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZVBhcnNlci50ZXN0RmlsZShmaWxlKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmV4dG5hbWUoZmlsZSkgPT09ICcudHMnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdFeGNsdWRpbmcnLCBmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluY2x1ZGVGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBpbmNsdWRlIHByb3ZpZGVkIGluIHRzY29uZmlnLCB1c2Ugb25seSB0aGlzIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIG5vdCBmaWxlcyBmb3VuZCB3aXRoIGdsb2JhbCBmaW5kaXQgc2NhbiBpbiB3b3JraW5nIGRpcmVjdG9yeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycgJiYgaW5jbHVkZVBhcnNlci50ZXN0RmlsZShmaWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdJbmNsdWRpbmcnLCBmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRXhjbHVkaW5nJywgZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0luY2x1ZGluZycsIGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZmluZGVyLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc2V0RmlsZXMoc2Nhbm5lZEZpbGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3JhbS5jb3ZlcmFnZVRlc3QgfHwgcHJvZ3JhbS5jb3ZlcmFnZVRlc3RQZXJGaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdSdW4gZG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSB0ZXN0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnRlc3RDb3ZlcmFnZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmdlbmVyYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5zZXRGaWxlcyhzY2FubmVkRmlsZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2dyYW0uY292ZXJhZ2VUZXN0IHx8IHByb2dyYW0uY292ZXJhZ2VUZXN0UGVyRmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdSdW4gZG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSB0ZXN0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIudGVzdENvdmVyYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmdlbmVyYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZyAmJiBwcm9ncmFtLmFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIHRzY29uZmlnIGZpbGUgcHJvdmlkZWQgd2l0aCBzb3VyY2UgZm9sZGVyIGluIGFyZ1xuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGxldCB0ZXN0VHNDb25maWdQYXRoID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnLmluZGV4T2YocHJvY2Vzcy5jd2QoKSk7XG4gICAgICAgICAgICAgICAgaWYgKHRlc3RUc0NvbmZpZ1BhdGggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZyA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZy5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLFxuICAgICAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc291cmNlRm9sZGVyID0gcHJvZ3JhbS5hcmdzWzBdO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5maWxlRW5naW5lLmV4aXN0c1N5bmMoc291cmNlRm9sZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgUHJvdmlkZWQgc291cmNlIGZvbGRlciAke3NvdXJjZUZvbGRlcn0gd2FzIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnlgXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnVXNpbmcgcHJvdmlkZWQgc291cmNlIGZvbGRlcicpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5maWxlRW5naW5lLmV4aXN0c1N5bmModGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIiR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiBmaWxlIHdhcyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5YFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBfZmlsZSA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguZGlybmFtZSh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmJhc2VuYW1lKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZylcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IG9mIHRzY29uZmlnLmpzb24gYXMgYSB3b3JraW5nIGRpcmVjdG9yeVxuICAgICAgICAgICAgICAgICAgICAgICAgY3dkID0gX2ZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQocGF0aC5zZXApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNsaWNlKDAsIC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKHBhdGguc2VwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdVc2luZyB0c2NvbmZpZyBmaWxlICcsIF9maWxlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRzQ29uZmlnRmlsZSA9IHJlYWRDb25maWcoX2ZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbm5lZEZpbGVzID0gdHNDb25maWdGaWxlLmZpbGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjYW5uZWRGaWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZWRGaWxlcyA9IGhhbmRsZVBhdGgoc2Nhbm5lZEZpbGVzLCBjd2QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNjYW5uZWRGaWxlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlRmlsZXMgPSB0c0NvbmZpZ0ZpbGUuZXhjbHVkZSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlRmlsZXMgPSB0c0NvbmZpZ0ZpbGUuaW5jbHVkZSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVkRmlsZXMgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBleGNsdWRlUGFyc2VyID0gbmV3IFBhcnNlclV0aWwoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVBhcnNlciA9IG5ldyBQYXJzZXJVdGlsKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlUGFyc2VyLmluaXQoZXhjbHVkZUZpbGVzLCBjd2QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVQYXJzZXIuaW5pdChpbmNsdWRlRmlsZXMsIGN3ZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRDd2QgPSBzb3VyY2VGb2xkZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXhjbHVkZVBhcnNlclRlc3RGaWxlc1dpdGhDd2REZXB0aCA9IGV4Y2x1ZGVQYXJzZXIudGVzdEZpbGVzV2l0aEN3ZERlcHRoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGNsdWRlUGFyc2VyVGVzdEZpbGVzV2l0aEN3ZERlcHRoLnN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEN3ZCA9IGV4Y2x1ZGVQYXJzZXIudXBkYXRlQ3dkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZVBhcnNlclRlc3RGaWxlc1dpdGhDd2REZXB0aC5sZXZlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5jbHVkZVBhcnNlclRlc3RGaWxlc1dpdGhDd2REZXB0aCA9IGluY2x1ZGVQYXJzZXIudGVzdEZpbGVzV2l0aEN3ZERlcHRoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmNsdWRlUGFyc2VyLnRlc3RGaWxlc1dpdGhDd2REZXB0aCgpLnN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEN3ZCA9IGluY2x1ZGVQYXJzZXIudXBkYXRlQ3dkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVBhcnNlclRlc3RGaWxlc1dpdGhDd2REZXB0aC5sZXZlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaW5kZXIgPSByZXF1aXJlKCdmaW5kaXQyJykocGF0aC5yZXNvbHZlKHN0YXJ0Q3dkKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kZXIub24oJ2RpcmVjdG9yeScsIGZ1bmN0aW9uKGRpciwgc3RhdCwgc3RvcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmFzZSA9IHBhdGguYmFzZW5hbWUoZGlyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2UgPT09ICcuZ2l0JyB8fCBiYXNlID09PSAnbm9kZV9tb2R1bGVzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kZXIub24oJ2ZpbGUnLCAoZmlsZSwgc3RhdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLyhzcGVjfFxcLmQpXFwudHMvLnRlc3QoZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdJZ25vcmluZycsIGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4Y2x1ZGVQYXJzZXIudGVzdEZpbGUoZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdFeGNsdWRpbmcnLCBmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmNsdWRlRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBpbmNsdWRlIHByb3ZpZGVkIGluIHRzY29uZmlnLCB1c2Ugb25seSB0aGlzIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBub3QgZmlsZXMgZm91bmQgd2l0aCBnbG9iYWwgZmluZGl0IHNjYW4gaW4gd29ya2luZyBkaXJlY3RvcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUGFyc2VyLnRlc3RGaWxlKGZpbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0luY2x1ZGluZycsIGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5leHRuYW1lKGZpbGUpID09PSAnLnRzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRXhjbHVkaW5nJywgZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdJbmNsdWRpbmcnLCBmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kZXIub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc2V0RmlsZXMoc2Nhbm5lZEZpbGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2dyYW0uY292ZXJhZ2VUZXN0IHx8IHByb2dyYW0uY292ZXJhZ2VUZXN0UGVyRmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1J1biBkb2N1bWVudGF0aW9uIGNvdmVyYWdlIHRlc3QnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnRlc3RDb3ZlcmFnZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuZ2VuZXJhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5zZXRGaWxlcyhzY2FubmVkRmlsZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9ncmFtLmNvdmVyYWdlVGVzdCB8fCBwcm9ncmFtLmNvdmVyYWdlVGVzdFBlckZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1J1biBkb2N1bWVudGF0aW9uIGNvdmVyYWdlIHRlc3QnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIudGVzdENvdmVyYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuZ2VuZXJhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigndHNjb25maWcuanNvbiBmaWxlIHdhcyBub3QgZm91bmQsIHBsZWFzZSB1c2UgLXAgZmxhZycpO1xuICAgICAgICAgICAgICAgIG91dHB1dEhlbHAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJfLmZvckVhY2giLCJzZW12ZXIuY29tcGFyZSIsIlN5bnRheEtpbmQiLCJ0cyIsIl8uZmlsdGVyIiwiXy5jb25jYXQiLCJmcy5yZWFkRmlsZSIsInBhdGgucmVzb2x2ZSIsImZzLm91dHB1dEZpbGUiLCJmcy5yZWFkRmlsZVN5bmMiLCJmcy5leGlzdHNTeW5jIiwiQXN0IiwicGF0aC5kaXJuYW1lIiwicGF0aC5zZXAiLCJhc3QiLCJfLnNvcnRCeSIsIl8udW5pcVdpdGgiLCJfLmlzRXF1YWwiLCJKU09ONS5wYXJzZSIsIl8uZmluZCIsIl8uY2xvbmVEZWVwIiwiSGFuZGxlYmFycy5jb21waWxlIiwiVHlwZUd1YXJkcyIsInBhdGgiLCJfLmZpbmRJbmRleCIsIkhhbmRsZWJhcnMuU2FmZVN0cmluZyIsIkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIiLCJfLnNsaWNlIiwiSGFuZGxlYmFycy5yZWdpc3RlclBhcnRpYWwiLCJtYXJrZWQiLCJwYXRoLmJhc2VuYW1lIiwiXy5mbGF0TWFwIiwidHJhdmVyc2UiLCJfLmluZGV4T2YiLCJwYXRoLmlzQWJzb2x1dGUiLCJwYXRoLmpvaW4iLCJfLnVuaXEiLCJjbG9uZURlZXAiLCJjb25jYXQiLCJmaW5kIiwiY3J5cHRvIiwicGF0aC5leHRuYW1lIiwiXy5pbmNsdWRlcyIsIl8uZ3JvdXBCeSIsIl8ubWFwIiwiXy5jbG9uZSIsImZzLmNvcHkiLCJMaXZlU2VydmVyLnN0YXJ0IiwicGtnIiwiY3dkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUMvQixJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekIsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFckMsSUFBSyxLQUtKO0FBTEQsV0FBSyxLQUFLO0lBQ1QsaUNBQUksQ0FBQTtJQUNKLG1DQUFLLENBQUE7SUFDTCxtQ0FBSyxDQUFBO0lBQ0wsaUNBQUksQ0FBQTtDQUNKLEVBTEksS0FBSyxLQUFMLEtBQUssUUFLVDtBQUVEO0lBT0M7UUFDQyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0tBQ25CO0lBRU0scUJBQUksR0FBWDtRQUFZLGNBQU87YUFBUCxVQUFPLEVBQVAscUJBQU8sRUFBUCxJQUFPO1lBQVAseUJBQU87O1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQzdCLElB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
|