velocious 1.0.468 → 1.0.470
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/build/configuration-types.js +9 -1
- package/build/configuration.js +6 -1
- package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +139 -4
- package/build/error-reporting/request-details.js +308 -0
- package/build/frontend-model-controller.js +3 -1
- package/build/src/configuration-types.d.ts +23 -1
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +9 -2
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +7 -2
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +43 -0
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +127 -5
- package/build/src/error-reporting/request-details.d.ts +7 -0
- package/build/src/error-reporting/request-details.d.ts.map +1 -0
- package/build/src/error-reporting/request-details.js +278 -0
- package/build/src/frontend-model-controller.d.ts.map +1 -1
- package/build/src/frontend-model-controller.js +4 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/configuration-types.js +9 -1
- package/src/configuration.js +6 -1
- package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +139 -4
- package/src/error-reporting/request-details.js +308 -0
- package/src/frontend-model-controller.js +3 -1
|
@@ -1301,9 +1301,14 @@ export default class DbGenerateFrontendModels extends BaseCommand {
|
|
|
1301
1301
|
const returnType = metadata.returnType || "Record<string, FrontendModelAttributeValue>";
|
|
1302
1302
|
if (metadata.args.length > 0) {
|
|
1303
1303
|
const parameterNames = metadata.args.map((arg) => arg.name);
|
|
1304
|
+
// A single args object whose every field is optional accepts `{}`, so default
|
|
1305
|
+
// the parameter and mark it optional — callers can then omit it entirely
|
|
1306
|
+
// (`record.command()` instead of `record.command({})`). Required-field args keep
|
|
1307
|
+
// the mandatory parameter (a `{}` default wouldn't satisfy their type).
|
|
1308
|
+
const defaultsToEmptyObject = metadata.args.length === 1 && this.argTypeAcceptsEmptyObject(metadata.args[0].type);
|
|
1304
1309
|
return {
|
|
1305
|
-
paramDocs: metadata.args.map((arg) => ` * @param {${arg.type}} ${arg.name} - Command argument.\n`).join(""),
|
|
1306
|
-
parameters: parameterNames.join(", "),
|
|
1310
|
+
paramDocs: metadata.args.map((arg) => ` * @param {${arg.type}} ${defaultsToEmptyObject ? `[${arg.name}]` : arg.name} - Command argument.\n`).join(""),
|
|
1311
|
+
parameters: defaultsToEmptyObject ? `${parameterNames[0]} = {}` : parameterNames.join(", "),
|
|
1307
1312
|
payloadArguments: `[${parameterNames.join(", ")}]`,
|
|
1308
1313
|
returnType
|
|
1309
1314
|
};
|
|
@@ -1315,6 +1320,112 @@ export default class DbGenerateFrontendModels extends BaseCommand {
|
|
|
1315
1320
|
returnType
|
|
1316
1321
|
};
|
|
1317
1322
|
}
|
|
1323
|
+
/**
|
|
1324
|
+
* Whether a single command-args JSDoc type is known to accept an empty object `{}`:
|
|
1325
|
+
* a single balanced object literal whose top-level members are all optional (`name?:`)
|
|
1326
|
+
* or index signatures (`[k: ...]:`). Anything else returns false so the parameter stays
|
|
1327
|
+
* required — including a required member, a non-object-literal (a positional `number`,
|
|
1328
|
+
* a `Record<...>` / `Partial<...>` whose key/wrapper may still require data), and any
|
|
1329
|
+
* intersection/union (e.g. `{a?: x} & {b: string}`), where `{}` is not assignable.
|
|
1330
|
+
* @param {string} type - The arg's JSDoc type string.
|
|
1331
|
+
* @returns {boolean} - Whether the generated parameter can default to `{}`.
|
|
1332
|
+
*/
|
|
1333
|
+
argTypeAcceptsEmptyObject(type) {
|
|
1334
|
+
const trimmedType = type.trim();
|
|
1335
|
+
// Must be a single balanced object literal: starts with `{`, ends with `}`, and the
|
|
1336
|
+
// opening brace closes only at the final character. This rejects intersections/unions
|
|
1337
|
+
// like `{a?: x} & {b: string}` that merely happen to start `{` and end `}`.
|
|
1338
|
+
if (!(trimmedType.startsWith("{") && trimmedType.endsWith("}")))
|
|
1339
|
+
return false;
|
|
1340
|
+
if (!this.isSingleBalancedObjectLiteral(trimmedType))
|
|
1341
|
+
return false;
|
|
1342
|
+
const inner = trimmedType.slice(1, -1);
|
|
1343
|
+
for (const member of this.splitTopLevelTypeMembers(inner)) {
|
|
1344
|
+
const colonIndex = this.topLevelColonIndex(member);
|
|
1345
|
+
// No top-level colon: a call/construct/mapped signature or malformed member —
|
|
1346
|
+
// can't confirm it's optional, so treat the type as not empty-defaultable.
|
|
1347
|
+
if (colonIndex < 0)
|
|
1348
|
+
return false;
|
|
1349
|
+
const key = member.slice(0, colonIndex).trim();
|
|
1350
|
+
// Index signatures (`[k: string]`) don't require a value; optional props end in `?`.
|
|
1351
|
+
// Anything else is a required property, so `{}` would not satisfy the type.
|
|
1352
|
+
if (!key.startsWith("[") && !key.endsWith("?"))
|
|
1353
|
+
return false;
|
|
1354
|
+
}
|
|
1355
|
+
return true;
|
|
1356
|
+
}
|
|
1357
|
+
/**
|
|
1358
|
+
* Splits the inner body of an object-literal type into its top-level members,
|
|
1359
|
+
* respecting nested `{}` / `[]` / `<>` / `()` so field types like `string[] | null`
|
|
1360
|
+
* or `{a: b}` aren't split mid-type. Members are separated by `,` or `;`.
|
|
1361
|
+
* @param {string} inner - Object-literal body (without the outer braces).
|
|
1362
|
+
* @returns {string[]} - Trimmed non-empty top-level members.
|
|
1363
|
+
*/
|
|
1364
|
+
splitTopLevelTypeMembers(inner) {
|
|
1365
|
+
const members = [];
|
|
1366
|
+
let depth = 0;
|
|
1367
|
+
let start = 0;
|
|
1368
|
+
for (let index = 0; index < inner.length; index += 1) {
|
|
1369
|
+
const character = inner[index];
|
|
1370
|
+
if (character === "{" || character === "[" || character === "<" || character === "(") {
|
|
1371
|
+
depth += 1;
|
|
1372
|
+
}
|
|
1373
|
+
else if (character === "}" || character === "]" || character === ">" || character === ")") {
|
|
1374
|
+
depth -= 1;
|
|
1375
|
+
}
|
|
1376
|
+
else if ((character === "," || character === ";") && depth === 0) {
|
|
1377
|
+
members.push(inner.slice(start, index));
|
|
1378
|
+
start = index + 1;
|
|
1379
|
+
}
|
|
1380
|
+
}
|
|
1381
|
+
members.push(inner.slice(start));
|
|
1382
|
+
return members.map((member) => member.trim()).filter((member) => member.length > 0);
|
|
1383
|
+
}
|
|
1384
|
+
/**
|
|
1385
|
+
* Index of the first top-level `:` in an object-literal member, ignoring colons
|
|
1386
|
+
* nested inside `{}` / `[]` / `<>` / `()` (e.g. an index signature `[k: string]`).
|
|
1387
|
+
* @param {string} member - A single object-literal member.
|
|
1388
|
+
* @returns {number} - The colon index, or -1 when none is found at the top level.
|
|
1389
|
+
*/
|
|
1390
|
+
topLevelColonIndex(member) {
|
|
1391
|
+
let depth = 0;
|
|
1392
|
+
for (let index = 0; index < member.length; index += 1) {
|
|
1393
|
+
const character = member[index];
|
|
1394
|
+
if (character === "{" || character === "[" || character === "<" || character === "(") {
|
|
1395
|
+
depth += 1;
|
|
1396
|
+
}
|
|
1397
|
+
else if (character === "}" || character === "]" || character === ">" || character === ")") {
|
|
1398
|
+
depth -= 1;
|
|
1399
|
+
}
|
|
1400
|
+
else if (character === ":" && depth === 0) {
|
|
1401
|
+
return index;
|
|
1402
|
+
}
|
|
1403
|
+
}
|
|
1404
|
+
return -1;
|
|
1405
|
+
}
|
|
1406
|
+
/**
|
|
1407
|
+
* Whether the type is a single balanced object literal — its leading `{` closes only
|
|
1408
|
+
* at the final character. Rejects top-level intersections/unions like `{a?: x} & {b: y}`
|
|
1409
|
+
* or `{a?: x} | string` whose brace depth returns to 0 before the end.
|
|
1410
|
+
* @param {string} type - A trimmed type string that starts with `{` and ends with `}`.
|
|
1411
|
+
* @returns {boolean} - Whether the braces wrap the whole type.
|
|
1412
|
+
*/
|
|
1413
|
+
isSingleBalancedObjectLiteral(type) {
|
|
1414
|
+
let depth = 0;
|
|
1415
|
+
for (let index = 0; index < type.length; index += 1) {
|
|
1416
|
+
const character = type[index];
|
|
1417
|
+
if (character === "{" || character === "[" || character === "<" || character === "(") {
|
|
1418
|
+
depth += 1;
|
|
1419
|
+
}
|
|
1420
|
+
else if (character === "}" || character === "]" || character === ">" || character === ")") {
|
|
1421
|
+
depth -= 1;
|
|
1422
|
+
// The opening brace balanced before the end, so something follows the literal.
|
|
1423
|
+
if (depth === 0 && index < type.length - 1)
|
|
1424
|
+
return false;
|
|
1425
|
+
}
|
|
1426
|
+
}
|
|
1427
|
+
return depth === 0;
|
|
1428
|
+
}
|
|
1318
1429
|
/**
|
|
1319
1430
|
* Enriches custom-command metadata by deriving a command's typed args and return
|
|
1320
1431
|
* type from the backend resource method's `@param`/`@returns` JSDoc when they are
|
|
@@ -1605,12 +1716,23 @@ export default class DbGenerateFrontendModels extends BaseCommand {
|
|
|
1605
1716
|
if (typeCloseIndex == null) {
|
|
1606
1717
|
throw new Error(`Could not parse JSDoc return type from: ${jsDocText}`);
|
|
1607
1718
|
}
|
|
1608
|
-
const returnType = jsDocText.slice(typeOpenIndex + 1, typeCloseIndex)
|
|
1719
|
+
const returnType = this.normalizeJsDocType(jsDocText.slice(typeOpenIndex + 1, typeCloseIndex));
|
|
1609
1720
|
if (returnType.length < 1) {
|
|
1610
1721
|
throw new Error(`Expected non-empty JSDoc return type in: ${jsDocText}`);
|
|
1611
1722
|
}
|
|
1612
1723
|
return returnType;
|
|
1613
1724
|
}
|
|
1725
|
+
/**
|
|
1726
|
+
* Collapses a JSDoc type spanning multiple comment lines into a single line so it can
|
|
1727
|
+
* be emitted into an inline type-assertion cast. A multiline backend return type keeps
|
|
1728
|
+
* its leading continuation asterisks in the captured substring, which are invalid inside
|
|
1729
|
+
* an inline cast and make TypeScript read the asserted type as `undefined`.
|
|
1730
|
+
* @param {string} jsDocType - Raw captured JSDoc type, possibly multiline.
|
|
1731
|
+
* @returns {string} - Single-line JSDoc type.
|
|
1732
|
+
*/
|
|
1733
|
+
normalizeJsDocType(jsDocType) {
|
|
1734
|
+
return jsDocType.replace(/\s*\n\s*\*?[ \t]*/g, " ").trim();
|
|
1735
|
+
}
|
|
1614
1736
|
/**
|
|
1615
1737
|
* Runs js doc parameters.
|
|
1616
1738
|
* @param {string} jsDocText - JSDoc text inside comment markers.
|
|
@@ -1626,7 +1748,7 @@ export default class DbGenerateFrontendModels extends BaseCommand {
|
|
|
1626
1748
|
if (typeCloseIndex == null) {
|
|
1627
1749
|
throw new Error(`Could not parse JSDoc parameter type from: ${jsDocText}`);
|
|
1628
1750
|
}
|
|
1629
|
-
const type = jsDocText.slice(typeOpenIndex + 1, typeCloseIndex)
|
|
1751
|
+
const type = this.normalizeJsDocType(jsDocText.slice(typeOpenIndex + 1, typeCloseIndex));
|
|
1630
1752
|
if (type.length < 1) {
|
|
1631
1753
|
throw new Error(`Expected non-empty JSDoc parameter type in: ${jsDocText}`);
|
|
1632
1754
|
}
|
|
@@ -1837,4 +1959,4 @@ export default class DbGenerateFrontendModels extends BaseCommand {
|
|
|
1837
1959
|
};
|
|
1838
1960
|
}
|
|
1839
1961
|
}
|
|
1840
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtbW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Vudmlyb25tZW50LWhhbmRsZXJzL25vZGUvY2xpL2NvbW1hbmRzL2dlbmVyYXRlL2Zyb250ZW5kLW1vZGVscy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFdBQVcsTUFBTSxvQ0FBb0MsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDNUIsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sRUFBQyw4QkFBOEIsRUFBRSxtREFBbUQsRUFBQyxNQUFNLHNEQUFzRCxDQUFBO0FBQ3hKLE9BQU8sRUFBQyx3Q0FBd0MsRUFBRSxnREFBZ0QsRUFBQyxNQUFNLHVEQUF1RCxDQUFBO0FBRWhLOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSDs7O0dBR0c7QUFFSCxtR0FBbUc7QUFDbkcsTUFBTSxDQUFDLE9BQU8sT0FBTyx3QkFBeUIsU0FBUSxXQUFXO0lBQy9ELHlDQUF5QztJQUN6QywwQkFBMEIsR0FBRyxJQUFJLENBQUE7SUFFakMsNkVBQTZFO0lBQzdFLDZCQUE2QixHQUFHLElBQUksQ0FBQTtJQUVwQzs7O09BR0c7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBQzdDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO1FBRTFELE1BQU0sYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUE7UUFFdEMsTUFBTSxrQkFBa0IsR0FBRyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQTtRQUVoRSxJQUFJLE9BQU8sa0JBQWtCLENBQUMscUJBQXFCLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDbkUsTUFBTSxrQkFBa0IsQ0FBQyxxQkFB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QixnQkFBZ0IsNkJBQTZCLENBQUMsQ0FBQTtZQUN0RyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU87WUFDTCxRQUFRLEVBQUUsWUFBWSxDQUFDLFdBQVcsRUFBRTtZQUNwQyxnQkFBZ0I7WUFDaEIsZUFBZTtZQUNmLGNBQWMsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDNUUsSUFBSSxFQUFFLGdCQUFnQjtTQUN2QixDQUFBO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2VDb21tYW5kIGZyb20gXCIuLi8uLi8uLi8uLi8uLi9jbGkvYmFzZS1jb21tYW5kLmpzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCB7ZnJvbnRlbmRNb2RlbFJlc291cmNlSXNCdWlsdEluLCBmcm9udGVuZE1vZGVsUmVzb3VyY2VzV2l0aEJ1aWx0SW5zRm9yQmFja2VuZFByb2plY3R9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9mcm9udGVuZC1tb2RlbHMvYnVpbHQtaW4tcmVzb3VyY2VzLmpzXCJcbmltcG9ydCB7ZnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NGcm9tRGVmaW5pdGlvbiwgZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZyb21EZWZpbml0aW9ufSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vZnJvbnRlbmQtbW9kZWxzL3Jlc291cmNlLWRlZmluaXRpb24uanNcIlxuXG4vKipcbiAqIEF0dHJpYnV0ZSBtZXRhZGF0YSB1c2VkIGZvciBnZW5lcmF0ZWQgZnJvbnRlbmQtbW9kZWwgSlNEb2MuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0eXBlXSAtIENvbHVtbiB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2x1bW5UeXBlXSAtIENvbHVtbiB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzcWxUeXBlXSAtIFNRTCB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkYXRhVHlwZV0gLSBEYXRhIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2pzRG9jVHlwZV0gLSBFeGFjdCBKU0RvYyB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSAtIEF0dHJpYnV0ZSBuYW1lIHdoZW4gY29uZmlndXJlZCBhcyBhbiBhcnJheSBlbnRyeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW251bGxdIC0gV2hldGhlciBudWxsIGlzIGFsbG93ZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzZWxlY3RlZEJ5RGVmYXVsdF0gLSBXaGV0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgc2VsZWN0ZWQgYnkgZGVmYXVsdC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBbZ2V0VHlwZV0gLSBSZXR1cm5zIGNvbHVtbiB0eXBlLlxuICogQHByb3BlcnR5IHsoKSA9PiBib29sZWFufSBbZ2V0TnVsbF0gLSBSZXR1cm5zIHdoZXRoZXIgbnVsbCBpcyBhbGxvd2VkLlxuICovXG4vKipcbiAqIFBlcm1pdCBzcGVjIHJldHVybmVkIGJ5IGZyb250ZW5kLW1vZGVsIHJlc291cmNlcyBkdXJpbmcgZ2VuZXJhdGlvbi5cbiAqIEB0eXBlZGVmIHtBcnJheTxzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsR2VuZXJhdG9yUGVybWl0U3BlYz4+fSBGcm9udGVuZE1vZGVsR2VuZXJhdG9yUGVybWl0U3BlY1xuICovXG5cbi8qKiBOb2RlIENMSSBjb21tYW5kIHRoYXQgZ2VuZXJhdGVzIGZyb250ZW5kIG1vZGVsIGNsYXNzZXMgZnJvbSBiYWNrZW5kIHByb2plY3QgcmVzb3VyY2UgY29uZmlnLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGJHZW5lcmF0ZUZyb250ZW5kTW9kZWxzIGV4dGVuZHMgQmFzZUNvbW1hbmQge1xuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHN0cmluZz4gfCBudWxsfSAqL1xuICBfcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlcyA9IG51bGxcblxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIEFycmF5PHtuYW1lOiBzdHJpbmcgfCBudWxsLCB0eXBlOiBzdHJpbmd9Pj4gfCBudWxsfSAqL1xuICBfcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlcyA9IG51bGxcblxuICAvKipcbiAgICogUnVucyBleGVjdXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGZpbGVzIGFyZSBnZW5lcmF0ZWQuXG4gICAqL1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IGJhY2tlbmRQcm9qZWN0cyA9IGNvbmZpZ3VyYXRpb24uZ2V0QmFja2VuZFByb2plY3RzKClcblxuICAgIGF3YWl0IGNvbmZpZ3VyYXRpb24uaW5pdGlhbGl6ZU1vZGVscygpXG5cbiAgICBjb25zdCBlbnZpcm9ubWVudEhhbmRsZXIgPSBjb25maWd1cmF0aW9uLmdldEVudmlyb25tZW50SGFuZGxlcigpXG5cbiAgICBpZiAodHlwZW9mIGVudmlyb25tZW50SGFuZGxlci5hdXRvRGlzY292ZXJSZXNvdXJjZXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgYXdhaXQgZW52aXJvbm1lbnRIYW5kbGVyLmF1dG9EaXNjb3ZlclJlc291cmNlcyhjb25maWd1cmF0aW9uKVxuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShiYWNrZW5kUHJvamVjdHMpIHx8IGJhY2tlbmRQcm9qZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGJhY2tlbmQgcHJvamVjdHMgY29uZmlndXJlZC4gQ29uZmlndXJlICdiYWNrZW5kUHJvamVjdHMnIGluIHlvdXIgY29uZmlndXJhdGlvbiBmaXJzdFwiKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuc3VyZWQgZGlyZWN0b3JpZXMuXG4gICAgICogQHR5cGUge1NldDxzdHJpbmc+fSAqL1xuICAgIGNvbnN0IGVuc3VyZWREaXJlY3RvcmllcyA9IG5ldyBTZXQoKVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlZCBtb2RlbCBuYW1lcyBieSBkaXJlY3RvcnkuXG4gICAgICogQHR5cGUge01hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pn0gKi9cbiAgICBjb25zdCBnZW5lcmF0ZWRNb2RlbE5hbWVzQnlEaXJlY3RvcnkgPSBuZXcgTWFwKClcbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZWQgZmlsZXMgYnkgZGlyZWN0b3J5LlxuICAgICAqIEB0eXBlIHtNYXA8c3RyaW5nLCBBcnJheTx7Y2xhc3NOYW1lOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmd9Pj59ICovXG4gICAgY29uc3QgZ2VuZXJhdGVkRmlsZXNCeURpcmVjdG9yeSA9IG5ldyBNYXAoKVxuXG4gICAgZm9yIChjb25zdCBiYWNrZW5kUHJvamVjdCBvZiBiYWNrZW5kUHJvamVjdHMpIHtcbiAgICAgIC8vIENhbm9uaWNhbGl6ZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSBzbyBlcXVpdmFsZW50IHNwZWxsaW5ncyAoYSB0cmFpbGluZ1xuICAgICAgLy8gc2xhc2gsIGAuYC9gLi5gIHNlZ21lbnRzLCBkdXBsaWNhdGUgc2VwYXJhdG9ycywgcmVsYXRpdmUgdnMgYWJzb2x1dGUpXG4gICAgICAvLyByZXNvbHZlIHRvIGEgc2luZ2xlIGtleS4gT3RoZXJ3aXNlIHRoZSBwZXItZGlyZWN0b3J5IG1hcHMgYmVsb3cgdHJlYXRcbiAgICAgIC8vIHRoZW0gYXMgZGlmZmVyZW50IGRpcmVjdG9yaWVzLCBkdXBsaWNhdGUgY2xhc3MgbmFtZXMgc2xpcCBwYXN0IGRldGVjdGlvbixcbiAgICAgIC8vIGFuZCB0aGUgc3BsaXQgYnVja2V0cyB3cml0ZSBpbmNvbXBsZXRlIGluZGV4LmpzL3NldHVwLmpzIGZvciBmaWxlcyB0aGF0XG4gICAgICAvLyBhY3R1YWxseSBsYW5kIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBvbiBkaXNrLlxuICAgICAgY29uc3QgZnJvbnRlbmRNb2RlbHNEaXIgPSBwYXRoLnJlc29sdmUodGhpcy5mcm9udGVuZE1vZGVsc0RpcmVjdG9yeUZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KSlcbiAgICAgIGNvbnN0IGltcG9ydFBhdGggPSB0aGlzLmltcG9ydFBhdGhGb3JGcm9udGVuZE1vZGVsc0RpcmVjdG9yeShmcm9udGVuZE1vZGVsc0RpcilcblxuICAgICAgaWYgKCFlbnN1cmVkRGlyZWN0b3JpZXMuaGFzKGZyb250ZW5kTW9kZWxzRGlyKSkge1xuICAgICAgICBhd2FpdCBmcy5ta2Rpcihmcm9udGVuZE1vZGVsc0Rpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG4gICAgICAgIGVuc3VyZWREaXJlY3Rvcmllcy5hZGQoZnJvbnRlbmRNb2RlbHNEaXIpXG4gICAgICB9XG5cbiAgICAgIGlmICghZ2VuZXJhdGVkRmlsZXNCeURpcmVjdG9yeS5oYXMoZnJvbnRlbmRNb2RlbHNEaXIpKSB7XG4gICAgICAgIGdlbmVyYXRlZEZpbGVzQnlEaXJlY3Rvcnkuc2V0KGZyb250ZW5kTW9kZWxzRGlyLCBbXSlcbiAgICAgIH1cblxuICAgICAgaWYgKCFnZW5lcmF0ZWRNb2RlbE5hbWVzQnlEaXJlY3RvcnkuaGFzKGZyb250ZW5kTW9kZWxzRGlyKSkge1xuICAgICAgICBnZW5lcmF0ZWRNb2RlbE5hbWVzQnlEaXJlY3Rvcnkuc2V0KGZyb250ZW5kTW9kZWxzRGlyLCBuZXcgU2V0KCkpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGdlbmVyYXRlZEZpbGVzID0gZ2VuZXJhdGVkRmlsZXNCeURpcmVjdG9yeS5nZXQoZnJvbnRlbmRNb2RlbHNEaXIpXG4gICAgICBjb25zdCBnZW5lcmF0ZWRNb2RlbE5hbWVzID0gZ2VuZXJhdGVkTW9kZWxOYW1lc0J5RGlyZWN0b3J5LmdldChmcm9udGVuZE1vZGVsc0RpcilcblxuICAgICAgaWYgKCFnZW5lcmF0ZWRGaWxlcykgdGhyb3cgbmV3IEVycm9yKGBHZW5lcmF0ZWQgZmlsZXMgbGlzdCBtaXNzaW5nIGZvciAke2Zyb250ZW5kTW9kZWxzRGlyfWApXG4gICAgICBpZiAoIWdlbmVyYXRlZE1vZGVsTmFtZXMpIHRocm93IG5ldyBFcnJvcihgR2VuZXJhdGVkIG1vZGVsIG5hbWVzIHNldCBtaXNzaW5nIGZvciAke2Zyb250ZW5kTW9kZWxzRGlyfWApXG4gICAgICBjb25zdCByZXNvdXJjZXMgPSB0aGlzLnJlc291cmNlc0ZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KVxuICAgICAgY29uc3QgYXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMgPSB0aGlzLmF2YWlsYWJsZUZyb250ZW5kTW9kZWxDbGFzc05hbWVzKHJlc291cmNlcylcblxuICAgICAgZm9yIChjb25zdCBtb2RlbENsYXNzTmFtZSBpbiByZXNvdXJjZXMpIHtcbiAgICAgICAgY29uc3QgbW9kZWxDb25maWcgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRnJvbURlZmluaXRpb24ocmVzb3VyY2VzW21vZGVsQ2xhc3NOYW1lXSlcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShtb2RlbENsYXNzTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikpXG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gYCR7aW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGNsYXNzTmFtZSkpfS5qc2BcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBgJHtmcm9udGVuZE1vZGVsc0Rpcn0vJHtmaWxlTmFtZX1gXG5cbiAgICAgICAgaWYgKCFtb2RlbENvbmZpZykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBkZWZpbml0aW9uIGZvciAnJHtjbGFzc05hbWV9J2ApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvbHZlZFJlc291cmNlQ2xhc3MgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc0Zyb21EZWZpbml0aW9uKHJlc291cmNlc1ttb2RlbENsYXNzTmFtZV0pXG4gICAgICAgIC8vIEFuIGFic3RyYWN0IGJhc2UgcmVzb3VyY2UgKG5vIHN0YXRpYyBNb2RlbENsYXNzIOKAlCBlLmcuIGFuIGFwcCdzIHNoYXJlZFxuICAgICAgICAvLyBgQmFzZVJlc291cmNlYCB0aGF0IG90aGVyIHJlc291cmNlcyBleHRlbmQpIGNhbid0IGJhY2sgYSBnZW5lcmF0ZWRcbiAgICAgICAgLy8gZnJvbnRlbmQgbW9kZWwuIFRyZWF0IGl0IGFzIHJlc291cmNlLWxlc3Mgc28gdGhlIGdlbmVyYXRvciBmYWxscyBiYWNrXG4gICAgICAgIC8vIHRvIGJ5LW5hbWUgbW9kZWwgbG9va3VwICsgZW1wdHkgd3JpdGUgcGFyYW1zIGluc3RlYWQgb2YgdGhyb3dpbmcgd2hlblxuICAgICAgICAvLyBpdCBlYWdlcmx5IGNhbGxzIGBtb2RlbENsYXNzKClgIC8gYHBlcm1pdHRlZFBhcmFtcygpYCBvbiBpdC5cbiAgICAgICAgY29uc3QgcmVzb3VyY2VDbGFzcyA9IHJlc29sdmVkUmVzb3VyY2VDbGFzcyAmJiByZXNvbHZlZFJlc291cmNlQ2xhc3MuTW9kZWxDbGFzcyA/IHJlc29sdmVkUmVzb3VyY2VDbGFzcyA6IG51bGxcblxuICAgICAgICB0aGlzLnZhbGlkYXRlTW9kZWxDb25maWcoe2F2YWlsYWJsZUZyb250ZW5kTW9kZWxDbGFzc05hbWVzLCBjbGFzc05hbWUsIG1vZGVsQ29uZmlnLCByZXNvdXJjZUNsYXNzfSlcblxuICAgICAgICBpZiAoZ2VuZXJhdGVkTW9kZWxOYW1lcy5oYXMoY2xhc3NOYW1lKSkge1xuICAgICAgICAgIGlmIChmcm9udGVuZE1vZGVsUmVzb3VyY2VJc0J1aWx0SW4oe21vZGVsTmFtZTogbW9kZWxDbGFzc05hbWUsIHJlc291cmNlRGVmaW5pdGlvbjogcmVzb3VyY2VzW21vZGVsQ2xhc3NOYW1lXX0pKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIGZyb250ZW5kIG1vZGVsIGRlZmluaXRpb24gZm9yICcke2NsYXNzTmFtZX0nYClcbiAgICAgICAgfVxuXG4gICAgICAgIGdlbmVyYXRlZE1vZGVsTmFtZXMuYWRkKGNsYXNzTmFtZSlcblxuICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IHRoaXMuYnVpbGRNb2RlbEZpbGVDb250ZW50KHtcbiAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgaW1wb3J0UGF0aCxcbiAgICAgICAgICBtb2RlbENsYXNzOiByZXNvdXJjZUNsYXNzID8gcmVzb3VyY2VDbGFzcy5tb2RlbENsYXNzKCkgOiBjb25maWd1cmF0aW9uLmdldE1vZGVsQ2xhc3NlcygpW2NsYXNzTmFtZV0sXG4gICAgICAgICAgbW9kZWxDb25maWcsXG4gICAgICAgICAgcmVzb3VyY2VDbGFzc1xuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgZmlsZUNvbnRlbnQpXG4gICAgICAgIGdlbmVyYXRlZEZpbGVzLnB1c2goe2NsYXNzTmFtZSwgZmlsZU5hbWV9KVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBjcmVhdGUgc3JjL2Zyb250ZW5kLW1vZGVscy8ke2ZpbGVOYW1lfWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZnJvbnRlbmRNb2RlbHNEaXIsIGdlbmVyYXRlZEZpbGVzXSBvZiBnZW5lcmF0ZWRGaWxlc0J5RGlyZWN0b3J5KSB7XG4gICAgICBjb25zdCBpbmRleENvbnRlbnQgPSB0aGlzLmJ1aWxkSW5kZXhGaWxlQ29udGVudChnZW5lcmF0ZWRGaWxlcylcblxuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGAke2Zyb250ZW5kTW9kZWxzRGlyfS9pbmRleC5qc2AsIGluZGV4Q29udGVudClcblxuICAgICAgY29uc29sZS5sb2coXCJjcmVhdGUgc3JjL2Zyb250ZW5kLW1vZGVscy9pbmRleC5qc1wiKVxuXG4gICAgICBjb25zdCBzZXR1cENvbnRlbnQgPSB0aGlzLmJ1aWxkU2V0dXBGaWxlQ29udGVudChnZW5lcmF0ZWRGaWxlcylcblxuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGAke2Zyb250ZW5kTW9kZWxzRGlyfS9zZXR1cC5qc2AsIHNldHVwQ29udGVudClcblxuICAgICAgY29uc29sZS5sb2coXCJjcmVhdGUgc3JjL2Zyb250ZW5kLW1vZGVscy9zZXR1cC5qc1wiKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHZhbGlkYXRlIG1vZGVsIGNvbmZpZy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7U2V0PHN0cmluZz59IGFyZ3MuYXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMgLSBBdmFpbGFibGUgZnJvbnRlbmQgbW9kZWwgY2xhc3MgbmFtZXMgaW4gYmFja2VuZCBwcm9qZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jbGFzc05hbWUgLSBNb2RlbCBjbGFzcyBuYW1lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259IGFyZ3MubW9kZWxDb25maWcgLSBNb2RlbCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbH0gW2FyZ3MucmVzb3VyY2VDbGFzc10gLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdmFsaWRhdGVNb2RlbENvbmZpZyh7YXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMsIGNsYXNzTmFtZSwgbW9kZWxDb25maWcsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgY29uc3QgYWJpbGl0aWVzID0gbW9kZWxDb25maWcuYWJpbGl0aWVzXG5cbiAgICBpZiAoIWFiaWxpdGllcyB8fCB0eXBlb2YgYWJpbGl0aWVzICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICcke2NsYXNzTmFtZX0nIGlzIG1pc3NpbmcgcmVxdWlyZWQgJ2FiaWxpdGllcycgY29uZmlnYClcbiAgICB9XG5cbiAgICBjb25zdCByZWFkQWN0aW9ucyA9IFtcbiAgICAgIHthY3Rpb246IFwiaW5kZXhcIiwgYWJpbGl0eUFjdGlvbjogYWJpbGl0aWVzLmluZGV4fSxcbiAgICAgIHthY3Rpb246IFwiZmluZFwiLCBhYmlsaXR5QWN0aW9uOiBhYmlsaXRpZXMuZmluZH1cbiAgICBdXG5cbiAgICBmb3IgKGNvbnN0IHthY3Rpb24sIGFiaWxpdHlBY3Rpb259IG9mIHJlYWRBY3Rpb25zKSB7XG4gICAgICBpZiAodHlwZW9mIGFiaWxpdHlBY3Rpb24gIT09IFwic3RyaW5nXCIgfHwgYWJpbGl0eUFjdGlvbi5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgJyR7Y2xhc3NOYW1lfScgaXMgbWlzc2luZyByZXF1aXJlZCBhYmlsaXRpZXMuJHthY3Rpb259IGNvbmZpZ2ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IG1vZGVsQ29uZmlnLnJlbGF0aW9uc2hpcHNcblxuICAgIGlmIChyZWxhdGlvbnNoaXBzID09PSB1bmRlZmluZWQpIHJldHVyblxuXG4gICAgY29uc3Qgbm9ybWFsaXplZFJlbGF0aW9uc2hpcHMgPSB0aGlzLnJlbGF0aW9uc2hpcHNGb3JNb2RlbCh7Y2xhc3NOYW1lLCBtb2RlbENvbmZpZywgcmVzb3VyY2VDbGFzc30pXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcCBvZiBub3JtYWxpemVkUmVsYXRpb25zaGlwcykge1xuICAgICAgaWYgKCFhdmFpbGFibGVGcm9udGVuZE1vZGVsQ2xhc3NOYW1lcy5oYXMocmVsYXRpb25zaGlwLnRhcmdldENsYXNzTmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyByZWxhdGlvbnNoaXAgJyR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9JyByZWZlcmVuY2VzICcke3JlbGF0aW9uc2hpcC50YXJnZXRDbGFzc05hbWV9JywgYnV0IG5vIGZyb250ZW5kIG1vZGVsIHJlc291cmNlIGV4aXN0cyBmb3IgdGhhdCB0YXJnZXQgaW4gdGhpcyBiYWNrZW5kIHByb2plY3RgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc291cmNlcyBmb3IgYmFja2VuZCBwcm9qZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuQmFja2VuZFByb2plY3RDb25maWd1cmF0aW9ufSBiYWNrZW5kUHJvamVjdCAtIEJhY2tlbmQgcHJvamVjdCBjb25maWcuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZURlZmluaXRpb24+fSAtIFJlc291cmNlIGRlZmluaXRpb25zIGtleWVkIGJ5IG1vZGVsIGNsYXNzIG5hbWUuXG4gICAqL1xuICByZXNvdXJjZXNGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdCkge1xuICAgIHJldHVybiBmcm9udGVuZE1vZGVsUmVzb3VyY2VzV2l0aEJ1aWx0SW5zRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhdmFpbGFibGUgZnJvbnRlbmQgbW9kZWwgY2xhc3MgbmFtZXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VEZWZpbml0aW9uPn0gcmVzb3VyY2VzIC0gUmVzb3VyY2UgY29uZmlndXJhdGlvbiBrZXllZCBieSBtb2RlbCBuYW1lLlxuICAgKiBAcmV0dXJucyB7U2V0PHN0cmluZz59IC0gQXZhaWxhYmxlIGZyb250ZW5kIG1vZGVsIGNsYXNzIG5hbWVzLlxuICAgKi9cbiAgYXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMocmVzb3VyY2VzKSB7XG4gICAgLyoqXG4gICAgICogQ2xhc3MgbmFtZXMuXG4gICAgICogQHR5cGUge1NldDxzdHJpbmc+fSAqL1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBuZXcgU2V0KClcblxuICAgIGZvciAoY29uc3QgcmVzb3VyY2VNb2RlbE5hbWUgaW4gcmVzb3VyY2VzKSB7XG4gICAgICBjbGFzc05hbWVzLmFkZChpbmZsZWN0aW9uLmNhbWVsaXplKHJlc291cmNlTW9kZWxOYW1lLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNsYXNzTmFtZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVscyBkaXJlY3RvcnkgZm9yIGJhY2tlbmQgcHJvamVjdC5cbiAgICogQHBhcmFtIHt7ZnJvbnRlbmRNb2RlbHNPdXRwdXRQYXRoPzogc3RyaW5nfX0gYmFja2VuZFByb2plY3QgLSBCYWNrZW5kIHByb2plY3QgY29uZmlnLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEFic29sdXRlIGZyb250ZW5kIG1vZGVscyBvdXRwdXQgZGlyZWN0b3J5LlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbHNEaXJlY3RvcnlGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdCkge1xuICAgIGNvbnN0IG91dHB1dFBhdGggPSBiYWNrZW5kUHJvamVjdC5mcm9udGVuZE1vZGVsc091dHB1dFBhdGggfHwgdGhpcy5kaXJlY3RvcnkoKVxuXG4gICAgcmV0dXJuIGAke291dHB1dFBhdGh9L3NyYy9mcm9udGVuZC1tb2RlbHNgXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpbXBvcnQgcGF0aCBmb3IgZnJvbnRlbmQgbW9kZWxzIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZyb250ZW5kTW9kZWxzRGlyIC0gRnJvbnRlbmQgbW9kZWxzIG91dHB1dCBkaXJlY3RvcnkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQmFzZSBjbGFzcyBpbXBvcnQgcGF0aC5cbiAgICovXG4gIGltcG9ydFBhdGhGb3JGcm9udGVuZE1vZGVsc0RpcmVjdG9yeShmcm9udGVuZE1vZGVsc0Rpcikge1xuICAgIGNvbnN0IGRldk1vZGUgPSBmcm9udGVuZE1vZGVsc0Rpci5pbmNsdWRlcyhcIi9zcGVjL2R1bW15L3NyYy9mcm9udGVuZC1tb2RlbHNcIilcblxuICAgIGlmIChkZXZNb2RlKSB7XG4gICAgICByZXR1cm4gXCIuLi8uLi8uLi8uLi9zcmMvZnJvbnRlbmQtbW9kZWxzL2Jhc2UuanNcIlxuICAgIH1cblxuICAgIHJldHVybiBcInZlbG9jaW91cy9idWlsZC9zcmMvZnJvbnRlbmQtbW9kZWxzL2Jhc2UuanNcIlxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYnVpbGQgbW9kZWwgZmlsZSBjb250ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE1ldGhvZCBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jbGFzc05hbWUgLSBNb2RlbCBjbGFzcyBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5pbXBvcnRQYXRoIC0gQmFzZSBjbGFzcyBpbXBvcnQgcGF0aC5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MubW9kZWxDbGFzcyAtIEJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbn0gYXJncy5tb2RlbENvbmZpZyAtIE1vZGVsIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsfSBbYXJncy5yZXNvdXJjZUNsYXNzXSAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIEdlbmVyYXRlZCBmaWxlIGNvbnRlbnQuXG4gICAqL1xuICBhc3luYyBidWlsZE1vZGVsRmlsZUNvbnRlbnQoe2NsYXNzTmFtZSwgaW1wb3J0UGF0aCwgbW9kZWxDbGFzcywgbW9kZWxDb25maWcsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGF3YWl0IHRoaXMuYXR0cmlidXRlRGVmaW5pdGlvbnNGb3JNb2RlbCh7Y2xhc3NOYW1lLCBtb2RlbENsYXNzLCBtb2RlbENvbmZpZywgcmVzb3VyY2VDbGFzc30pXG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IHRoaXMucmVsYXRpb25zaGlwc0Zvck1vZGVsKHtjbGFzc05hbWUsIG1vZGVsQ29uZmlnLCByZXNvdXJjZUNsYXNzfSlcbiAgICBjb25zdCBhdHRhY2htZW50cyA9IG1vZGVsQ29uZmlnLmF0dGFjaG1lbnRzICYmIHR5cGVvZiBtb2RlbENvbmZpZy5hdHRhY2htZW50cyA9PT0gXCJvYmplY3RcIlxuICAgICAgPyBtb2RlbENvbmZpZy5hdHRhY2htZW50c1xuICAgICAgOiB7fVxuICAgIGNvbnN0IGF0dHJpYnV0ZXNUeXBlTmFtZSA9IGAke2NsYXNzTmFtZX1BdHRyaWJ1dGVzYFxuICAgIGNvbnN0IGNyZWF0ZUF0dHJpYnV0ZXNUeXBlTmFtZSA9IGAke2NsYXNzTmFtZX1DcmVhdGVBdHRyaWJ1dGVzYFxuICAgIGNvbnN0IHVwZGF0ZUF0dHJpYnV0ZXNUeXBlTmFtZSA9IGAke2NsYXNzTmFtZX1VcGRhdGVBdHRyaWJ1dGVzYFxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVzID0gYXR0cmlidXRlcy5tYXAoKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLm5hbWUpXG4gICAgY29uc3QgcGVybWl0dGVkQ3JlYXRlUGFyYW1zID0gdGhpcy5wZXJtaXR0ZWRQYXJhbXNGb3JHZW5lcmF0b3IocmVzb3VyY2VDbGFzcyB8fCBudWxsLCBcImNyZWF0ZVwiKVxuICAgIGNvbnN0IHBlcm1pdHRlZFVwZGF0ZVBhcmFtcyA9IHRoaXMucGVybWl0dGVkUGFyYW1zRm9yR2VuZXJhdG9yKHJlc291cmNlQ2xhc3MgfHwgbnVsbCwgXCJ1cGRhdGVcIilcbiAgICBjb25zdCBuZXN0ZWRXcml0ZVR5cGVzID0gdGhpcy5uZXN0ZWRXcml0ZVR5cGVzRm9yTW9kZWwoe2NsYXNzTmFtZSwgcGVybWl0dGVkUGFyYW1zOiBwZXJtaXR0ZWRDcmVhdGVQYXJhbXMuY29uY2F0KHBlcm1pdHRlZFVwZGF0ZVBhcmFtcyksIHJlbGF0aW9uc2hpcHN9KVxuICAgIGNvbnN0IHVzZXNUcmFuc3BvcnRWYWx1ZSA9IGF0dHJpYnV0ZXMuc29tZSgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUuanNEb2NUeXBlLmluY2x1ZGVzKFwiRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlXCIpKVxuICAgICAgfHwgbmVzdGVkV3JpdGVUeXBlcy5zb21lKChuZXN0ZWRXcml0ZVR5cGUpID0+IG5lc3RlZFdyaXRlVHlwZS5hdHRyaWJ1dGVzLnNvbWUoKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLnR5cGUuaW5jbHVkZXMoXCJGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWVcIikpKVxuICAgIGNvbnN0IGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMgPSB7XG4gICAgICBjcmVhdGU6IG1vZGVsQ29uZmlnLmJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMuY3JlYXRlIHx8IFwiY3JlYXRlXCIsXG4gICAgICBpbmRleDogbW9kZWxDb25maWcuYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcy5pbmRleCB8fCBcImluZGV4XCJcbiAgICB9XG4gICAgY29uc3QgYnVpbHRJbk1lbWJlckNvbW1hbmRzID0ge1xuICAgICAgYXR0YWNoOiBtb2RlbENvbmZpZy5idWlsdEluTWVtYmVyQ29tbWFuZHMuYXR0YWNoIHx8IFwiYXR0YWNoXCIsXG4gICAgICBkZXN0cm95OiBtb2RlbENvbmZpZy5idWlsdEluTWVtYmVyQ29tbWFuZHMuZGVzdHJveSB8fCBcImRlc3Ryb3lcIixcbiAgICAgIGRvd25sb2FkOiBtb2RlbENvbmZpZy5idWlsdEluTWVtYmVyQ29tbWFuZHMuZG93bmxvYWQgfHwgXCJkb3dubG9hZFwiLFxuICAgICAgZmluZDogbW9kZWxDb25maWcuYnVpbHRJbk1lbWJlckNvbW1hbmRzLmZpbmQgfHwgXCJmaW5kXCIsXG4gICAgICB1cGRhdGU6IG1vZGVsQ29uZmlnLmJ1aWx0SW5NZW1iZXJDb21tYW5kcy51cGRhdGUgfHwgXCJ1cGRhdGVcIixcbiAgICAgIHVybDogbW9kZWxDb25maWcuYnVpbHRJbk1lbWJlckNvbW1hbmRzLnVybCB8fCBcInVybFwiXG4gICAgfVxuICAgIGNvbnN0IGNvbGxlY3Rpb25Db21tYW5kcyA9IG1vZGVsQ29uZmlnLmNvbGxlY3Rpb25Db21tYW5kc1xuICAgIGNvbnN0IG1lbWJlckNvbW1hbmRzID0gbW9kZWxDb25maWcubWVtYmVyQ29tbWFuZHNcbiAgICBjb25zdCBkZWNsYXJlZENvbW1hbmRNZXRhZGF0YSA9IG1vZGVsQ29uZmlnLmNvbW1hbmRNZXRhZGF0YSB8fCB7fVxuICAgIGNvbnN0IGNvbW1hbmRNZXRhZGF0YSA9IGF3YWl0IHRoaXMuY29tbWFuZE1ldGFkYXRhV2l0aFJlc291cmNlSnNEb2Moe1xuICAgICAgY29tbWFuZE1ldGFkYXRhOiBkZWNsYXJlZENvbW1hbmRNZXRhZGF0YSxcbiAgICAgIGNvbW1hbmROYW1lczogWy4uLk9iamVjdC5rZXlzKGNvbGxlY3Rpb25Db21tYW5kcyksIC4uLk9iamVjdC5rZXlzKG1lbWJlckNvbW1hbmRzKV0sXG4gICAgICByZXNvdXJjZUNsYXNzXG4gICAgfSlcbiAgICBjb25zdCBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzQXJlRGVmYXVsdCA9IGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMuY3JlYXRlID09PSBcImNyZWF0ZVwiICYmIGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMuaW5kZXggPT09IFwiaW5kZXhcIlxuICAgIGNvbnN0IGJ1aWx0SW5NZW1iZXJDb21tYW5kc0FyZURlZmF1bHQgPSBidWlsdEluTWVtYmVyQ29tbWFuZHMuYXR0YWNoID09PSBcImF0dGFjaFwiXG4gICAgICAmJiBidWlsdEluTWVtYmVyQ29tbWFuZHMuZGVzdHJveSA9PT0gXCJkZXN0cm95XCJcbiAgICAgICYmIGJ1aWx0SW5NZW1iZXJDb21tYW5kcy5kb3dubG9hZCA9PT0gXCJkb3dubG9hZFwiXG4gICAgICAmJiBidWlsdEluTWVtYmVyQ29tbWFuZHMuZmluZCA9PT0gXCJmaW5kXCJcbiAgICAgICYmIGJ1aWx0SW5NZW1iZXJDb21tYW5kcy51cGRhdGUgPT09IFwidXBkYXRlXCJcbiAgICAgICYmIGJ1aWx0SW5NZW1iZXJDb21tYW5kcy51cmwgPT09IFwidXJsXCJcblxuICAgIGxldCBmaWxlQ29udGVudCA9IFwiXCJcblxuICAgIGZpbGVDb250ZW50ICs9IGBpbXBvcnQgRnJvbnRlbmRNb2RlbEJhc2UgZnJvbSBcIiR7aW1wb3J0UGF0aH1cIlxcbmBcblxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqIEZyb250ZW5kIG1vZGVsIHJlc291cmNlIGNvbmZpZy5cXG5gXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqIEB0eXBlZGVmIHtpbXBvcnQoXCIke2ltcG9ydFBhdGh9XCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ30gRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlnXFxuYFxuICAgIGZpbGVDb250ZW50ICs9IFwiICovXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIgKiBGYWxsYmFjayBhdHRyaWJ1dGUgdmFsdWUgdHlwZSBmb3IgZ2VuZXJhdGVkIGZpZWxkcyB3aXRob3V0IG5hcnJvd2VyIG1ldGFkYXRhLlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqIEB0eXBlZGVmIHtpbXBvcnQoXCIke2ltcG9ydFBhdGh9XCIpLkZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZX0gRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlXFxuYFxuICAgIGZpbGVDb250ZW50ICs9IFwiICovXFxuXCJcbiAgICBpZiAodXNlc1RyYW5zcG9ydFZhbHVlKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAqIFZhbHVlIHN1cHBvcnRlZCBieSBmcm9udGVuZC1tb2RlbCB0cmFuc3BvcnQgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICogQHR5cGVkZWYge2ltcG9ydChcIiR7aW1wb3J0UGF0aH1cIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlfSBGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWVcXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAqL1xcblwiXG4gICAgfVxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqICR7YXR0cmlidXRlc1R5cGVOYW1lfSB0eXBlLlxcbmBcbiAgICBmaWxlQ29udGVudCArPSBgICogQHR5cGVkZWYge29iamVjdH0gJHthdHRyaWJ1dGVzVHlwZU5hbWV9XFxuYFxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBAcHJvcGVydHkgeyR7YXR0cmlidXRlLmpzRG9jVHlwZX19ICR7YXR0cmlidXRlLm5hbWV9IC0gQXR0cmlidXRlIHZhbHVlLlxcbmBcbiAgICB9XG4gICAgZmlsZUNvbnRlbnQgKz0gXCIgKi9cXG5cIlxuICAgIGZvciAoY29uc3QgbmVzdGVkV3JpdGVUeXBlIG9mIG5lc3RlZFdyaXRlVHlwZXMpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiLyoqXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBBdHRyaWJ1dGVzIGFjY2VwdGVkIGZvciBuZXN0ZWQgJHtuZXN0ZWRXcml0ZVR5cGUucmVsYXRpb25zaGlwTmFtZX0gd3JpdGVzLlxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBAdHlwZWRlZiB7b2JqZWN0fSAke25lc3RlZFdyaXRlVHlwZS50eXBlTmFtZX1cXG5gXG4gICAgICBmb3IgKGNvbnN0IG5lc3RlZEF0dHJpYnV0ZSBvZiBuZXN0ZWRXcml0ZVR5cGUuYXR0cmlidXRlcykge1xuICAgICAgICBmaWxlQ29udGVudCArPSBgICogQHByb3BlcnR5IHske25lc3RlZEF0dHJpYnV0ZS50eXBlfX0gWyR7bmVzdGVkQXR0cmlidXRlLm5hbWV9XSAtIE5lc3RlZCAke25lc3RlZEF0dHJpYnV0ZS5uYW1lfSB2YWx1ZS5cXG5gXG4gICAgICB9XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAqL1xcblwiXG4gICAgfVxuICAgIGZpbGVDb250ZW50ICs9IGF3YWl0IHRoaXMud3JpdGVBdHRyaWJ1dGVzVHlwZWRlZih7YXR0cmlidXRlcywgYXR0cmlidXRlc1R5cGVOYW1lLCBtb2RlbENsYXNzLCBuZXN0ZWRXcml0ZVR5cGVzLCBwZXJtaXR0ZWRQYXJhbXM6IHBlcm1pdHRlZENyZWF0ZVBhcmFtcywgcmVzb3VyY2VDbGFzcywgdHlwZU5hbWU6IGNyZWF0ZUF0dHJpYnV0ZXNUeXBlTmFtZX0pXG4gICAgZmlsZUNvbnRlbnQgKz0gYXdhaXQgdGhpcy53cml0ZUF0dHJpYnV0ZXNUeXBlZGVmKHthdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzVHlwZU5hbWUsIG1vZGVsQ2xhc3MsIG5lc3RlZFdyaXRlVHlwZXMsIHBlcm1pdHRlZFBhcmFtczogcGVybWl0dGVkVXBkYXRlUGFyYW1zLCByZXNvdXJjZUNsYXNzLCB0eXBlTmFtZTogdXBkYXRlQXR0cmlidXRlc1R5cGVOYW1lfSlcbiAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqIEZyb250ZW5kIG1vZGVsIGZvciAke2NsYXNzTmFtZX0uXFxuYFxuICAgIGZpbGVDb250ZW50ICs9IGAgKiBAYXVnbWVudHMge0Zyb250ZW5kTW9kZWxCYXNlPCR7YXR0cmlidXRlc1R5cGVOYW1lfSwgJHtjcmVhdGVBdHRyaWJ1dGVzVHlwZU5hbWV9LCAke3VwZGF0ZUF0dHJpYnV0ZXNUeXBlTmFtZX0+fVxcbmBcbiAgICBmaWxlQ29udGVudCArPSBcIiAqL1xcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYGNsYXNzICR7Y2xhc3NOYW1lfSBleHRlbmRzIEZyb250ZW5kTW9kZWxCYXNlIHtcXG5gXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlnfSAtIFJlc291cmNlIGNvbmZpZy4gKi9cXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiICBzdGF0aWMgcmVzb3VyY2VDb25maWcoKSB7XFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIiAgICByZXR1cm4ge1xcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIG1vZGVsTmFtZTogJHtKU09OLnN0cmluZ2lmeShjbGFzc05hbWUpfSxcXG5gXG4gICAgaWYgKE9iamVjdC5rZXlzKGF0dGFjaG1lbnRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICAgIGF0dGFjaG1lbnRzOiB7XFxuXCJcbiAgICAgIGZvciAoY29uc3QgW2F0dGFjaG1lbnROYW1lLCBhdHRhY2htZW50Q29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhhdHRhY2htZW50cykpIHtcbiAgICAgICAgY29uc3QgYXR0YWNobWVudFR5cGUgPSBhdHRhY2htZW50Q29uZmlnICYmIHR5cGVvZiBhdHRhY2htZW50Q29uZmlnID09PSBcIm9iamVjdFwiICYmIGF0dGFjaG1lbnRDb25maWcudHlwZSA9PT0gXCJoYXNNYW55XCJcbiAgICAgICAgICA/IFwiaGFzTWFueVwiXG4gICAgICAgICAgOiBcImhhc09uZVwiXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgICAgJHthdHRhY2htZW50TmFtZX06IHt0eXBlOiAke0pTT04uc3RyaW5naWZ5KGF0dGFjaG1lbnRUeXBlKX19LFxcbmBcbiAgICAgIH1cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgICAgfSxcXG5cIlxuICAgIH1cbiAgICBmaWxlQ29udGVudCArPSB0aGlzLmZvcm1hdHRlZEFycmF5UHJvcGVydHkoe1xuICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgcHJvcGVydHlOYW1lOiBcImF0dHJpYnV0ZXNcIixcbiAgICAgIHZhbHVlczogYXR0cmlidXRlTmFtZXNcbiAgICB9KVxuICAgIGlmICghYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kc0FyZURlZmF1bHQpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IHRoaXMuZm9ybWF0dGVkT2JqZWN0UHJvcGVydHkoe1xuICAgICAgICBmaWx0ZXJEZWZhdWx0VmFsdWVzOiB7Y3JlYXRlOiBcImNyZWF0ZVwiLCBpbmRleDogXCJpbmRleFwifSxcbiAgICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IFwiYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kc1wiLFxuICAgICAgICB2YWx1ZXM6IGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmICghYnVpbHRJbk1lbWJlckNvbW1hbmRzQXJlRGVmYXVsdCkge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gdGhpcy5mb3JtYXR0ZWRPYmplY3RQcm9wZXJ0eSh7XG4gICAgICAgIGZpbHRlckRlZmF1bHRWYWx1ZXM6IHtcbiAgICAgICAgICBhdHRhY2g6IFwiYXR0YWNoXCIsXG4gICAgICAgICAgZGVzdHJveTogXCJkZXN0cm95XCIsXG4gICAgICAgICAgZG93bmxvYWQ6IFwiZG93bmxvYWRcIixcbiAgICAgICAgICBmaW5kOiBcImZpbmRcIixcbiAgICAgICAgICB1cGRhdGU6IFwidXBkYXRlXCIsXG4gICAgICAgICAgdXJsOiBcInVybFwiXG4gICAgICAgIH0sXG4gICAgICAgIGluZGVudDogXCIgICAgICBcIixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBcImJ1aWx0SW5NZW1iZXJDb21tYW5kc1wiLFxuICAgICAgICB2YWx1ZXM6IGJ1aWx0SW5NZW1iZXJDb21tYW5kc1xuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKGNvbGxlY3Rpb25Db21tYW5kcykubGVuZ3RoID4gMCkge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gdGhpcy5mb3JtYXR0ZWRDb21tYW5kc1Byb3BlcnR5KHtcbiAgICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IFwiY29sbGVjdGlvbkNvbW1hbmRzXCIsXG4gICAgICAgIHZhbHVlczogY29sbGVjdGlvbkNvbW1hbmRzXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMobWVtYmVyQ29tbWFuZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IHRoaXMuZm9ybWF0dGVkQ29tbWFuZHNQcm9wZXJ0eSh7XG4gICAgICAgIGluZGVudDogXCIgICAgICBcIixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBcIm1lbWJlckNvbW1hbmRzXCIsXG4gICAgICAgIHZhbHVlczogbWVtYmVyQ29tbWFuZHNcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSB0aGlzLmZyb250ZW5kTW9kZWxQcmltYXJ5S2V5Rm9yUmVzb3VyY2Uoe2F0dHJpYnV0ZU5hbWVzLCBtb2RlbENsYXNzLCBtb2RlbENvbmZpZ30pXG5cbiAgICBpZiAocHJpbWFyeUtleSAhPT0gXCJpZFwiKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBgICAgICAgcHJpbWFyeUtleTogJHtKU09OLnN0cmluZ2lmeShwcmltYXJ5S2V5KX0sXFxuYFxuICAgIH1cbiAgICBjb25zdCBuZXN0ZWRSZWxhdGlvbnNoaXBOYW1lcyA9IHRoaXMubmVzdGVkUmVsYXRpb25zaGlwTmFtZXNGb3JHZW5lcmF0b3IocmVzb3VyY2VDbGFzcyB8fCBudWxsKVxuICAgIGlmIChuZXN0ZWRSZWxhdGlvbnNoaXBOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICAgIG5lc3RlZEF0dHJpYnV0ZXM6IHtcXG5cIlxuICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIG9mIG5lc3RlZFJlbGF0aW9uc2hpcE5hbWVzKSB7XG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICAgICR7cmVsYXRpb25zaGlwTmFtZX06IHt9LFxcbmBcbiAgICAgIH1cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgICAgfSxcXG5cIlxuICAgIH1cbiAgICBmaWxlQ29udGVudCArPSBcIiAgICB9XFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIiAgfVxcblwiXG5cbiAgICBpZiAocmVsYXRpb25zaGlwcy5sZW5ndGggPiAwKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB7dHlwZTogXFxcImJlbG9uZ3NUb1xcXCIgfCBcXFwiaGFzT25lXFxcIiB8IFxcXCJoYXNNYW55XFxcIiwgYXV0b2xvYWQ/OiBib29sZWFufT59IC0gUmVsYXRpb25zaGlwIGRlZmluaXRpb25zLiAqL1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgc3RhdGljIHJlbGF0aW9uc2hpcERlZmluaXRpb25zKCkge1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICByZXR1cm4ge1xcblwiXG4gICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcCBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gW2B0eXBlOiAke0pTT04uc3RyaW5naWZ5KHJlbGF0aW9uc2hpcC50eXBlKX1gXVxuXG4gICAgICAgIGlmIChyZWxhdGlvbnNoaXAuYXV0b2xvYWQgPT09IGZhbHNlKSBwYXJ0cy5wdXNoKFwiYXV0b2xvYWQ6IGZhbHNlXCIpXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9OiB7JHtwYXJ0cy5qb2luKFwiLCBcIil9fSxcXG5gXG4gICAgICB9XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICB9XFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICB9XFxuXCJcblxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gLSBSZWxhdGlvbnNoaXAgbW9kZWwgY2xhc3MgbmFtZXMuICovXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICBzdGF0aWMgcmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzKCkge1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICByZXR1cm4ge1xcblwiXG4gICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcCBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfTogJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnNoaXAudGFyZ2V0Q2xhc3NOYW1lKX0sXFxuYFxuICAgICAgfVxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgfVxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgfVxcblwiXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgY29uc3QgY2FtZWxpemVkQXR0cmlidXRlID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhdHRyaWJ1dGUubmFtZSwgdHJ1ZSlcbiAgICAgIGNvbnN0IGNhbWVsaXplZEF0dHJpYnV0ZVVwcGVyID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhdHRyaWJ1dGUubmFtZSlcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZVR5cGUgPSBgJHthdHRyaWJ1dGVzVHlwZU5hbWV9WyR7SlNPTi5zdHJpbmdpZnkoYXR0cmlidXRlLm5hbWUpfV1gXG4gICAgICBjb25zdCBzZXR0ZXJBdHRyaWJ1dGVUeXBlID0gYXdhaXQgdGhpcy5mcm9udGVuZFdyaXRlQXR0cmlidXRlVHlwZSh7XG4gICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgYXR0cmlidXRlTmFtZTogYXR0cmlidXRlLm5hbWUsXG4gICAgICAgIGF0dHJpYnV0ZXNUeXBlTmFtZSxcbiAgICAgICAgcmVzb3VyY2VDbGFzc1xuICAgICAgfSlcblxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgLyoqIEByZXR1cm5zIHske2F0dHJpYnV0ZVR5cGV9fSAtIEF0dHJpYnV0ZSB2YWx1ZS4gKi9cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBgICAke2NhbWVsaXplZEF0dHJpYnV0ZX0oKSB7IHJldHVybiAvKiogQHR5cGUgeyR7YXR0cmlidXRlVHlwZX19ICovICh0aGlzLnJlYWRBdHRyaWJ1dGUoJHtKU09OLnN0cmluZ2lmeShhdHRyaWJ1dGUubmFtZSl9KSkgfVxcbmBcblxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcGFyYW0geyR7c2V0dGVyQXR0cmlidXRlVHlwZX19IG5ld1ZhbHVlIC0gTmV3IGF0dHJpYnV0ZSB2YWx1ZS5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7JHtzZXR0ZXJBdHRyaWJ1dGVUeXBlfX0gLSBBc3NpZ25lZCB2YWx1ZS5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgIHNldCR7Y2FtZWxpemVkQXR0cmlidXRlVXBwZXJ9KG5ld1ZhbHVlKSB7IHJldHVybiAvKiogQHR5cGUgeyR7c2V0dGVyQXR0cmlidXRlVHlwZX19ICovICh0aGlzLnNldEF0dHJpYnV0ZSgke0pTT04uc3RyaW5naWZ5KGF0dHJpYnV0ZS5uYW1lKX0sIG5ld1ZhbHVlKSkgfVxcbmBcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgb2YgT2JqZWN0LmtleXMoY29sbGVjdGlvbkNvbW1hbmRzKSkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gdGhpcy5jdXN0b21Db21tYW5kTWV0aG9kU2lnbmF0dXJlKHtjb21tYW5kTWV0YWRhdGEsIG1ldGhvZE5hbWV9KVxuXG4gICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIFJ1bnMgJHttZXRob2ROYW1lfS5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBzaWduYXR1cmUucGFyYW1Eb2NzXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7UHJvbWlzZTwke3NpZ25hdHVyZS5yZXR1cm5UeXBlfT59IC0gQ29tbWFuZCByZXNwb25zZS5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgIHN0YXRpYyBhc3luYyAke21ldGhvZE5hbWV9KCR7c2lnbmF0dXJlLnBhcmFtZXRlcnN9KSB7XFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICByZXR1cm4gLyoqIEB0eXBlIHske3NpZ25hdHVyZS5yZXR1cm5UeXBlfX0gKi8gKGF3YWl0IHRoaXMuZXhlY3V0ZUN1c3RvbUNvbW1hbmQoe1xcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICBjb21tYW5kTmFtZTogJHtKU09OLnN0cmluZ2lmeShjb2xsZWN0aW9uQ29tbWFuZHNbbWV0aG9kTmFtZV0pfSxcXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgICAgY29tbWFuZFR5cGU6ICR7SlNPTi5zdHJpbmdpZnkoY29sbGVjdGlvbkNvbW1hbmRzW21ldGhvZE5hbWVdKX0sXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIHBheWxvYWQ6ICR7Y2xhc3NOYW1lfS5ub3JtYWxpemVDdXN0b21Db21tYW5kUGF5bG9hZEFyZ3VtZW50cygke3NpZ25hdHVyZS5wYXlsb2FkQXJndW1lbnRzfSksXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgICByZXNvdXJjZVBhdGg6IHRoaXMucmVzb3VyY2VQYXRoKClcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgfSkpXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICB9XFxuXCJcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgb2YgT2JqZWN0LmtleXMobWVtYmVyQ29tbWFuZHMpKSB7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSB0aGlzLmN1c3RvbUNvbW1hbmRNZXRob2RTaWduYXR1cmUoe2NvbW1hbmRNZXRhZGF0YSwgbWV0aG9kTmFtZX0pXG5cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogUnVucyAke21ldGhvZE5hbWV9LlxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IHNpZ25hdHVyZS5wYXJhbURvY3NcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtQcm9taXNlPCR7c2lnbmF0dXJlLnJldHVyblR5cGV9Pn0gLSBDb21tYW5kIHJlc3BvbnNlLlxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYXN5bmMgJHttZXRob2ROYW1lfSgke3NpZ25hdHVyZS5wYXJhbWV0ZXJzfSkge1xcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgcmV0dXJuIC8qKiBAdHlwZSB7JHtzaWduYXR1cmUucmV0dXJuVHlwZX19ICovIChhd2FpdCAke2NsYXNzTmFtZX0uZXhlY3V0ZUN1c3RvbUNvbW1hbmQoe1xcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICBjb21tYW5kTmFtZTogJHtKU09OLnN0cmluZ2lmeShtZW1iZXJDb21tYW5kc1ttZXRob2ROYW1lXSl9LFxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICBjb21tYW5kVHlwZTogJHtKU09OLnN0cmluZ2lmeShtZW1iZXJDb21tYW5kc1ttZXRob2ROYW1lXSl9LFxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgICAgbWVtYmVySWQ6IHRoaXMucHJpbWFyeUtleVZhbHVlKCksXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICBwYXlsb2FkOiAke2NsYXNzTmFtZX0ubm9ybWFsaXplQ3VzdG9tQ29tbWFuZFBheWxvYWRBcmd1bWVudHMoJHtzaWduYXR1cmUucGF5bG9hZEFyZ3VtZW50c30pLFxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICByZXNvdXJjZVBhdGg6ICR7Y2xhc3NOYW1lfS5yZXNvdXJjZVBhdGgoKVxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgIH0pKVxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgfVxcblwiXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXAgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgY29uc3QgcmVsYXRpb25zaGlwTmFtZUNhbWVsaXplZCA9IGluZmxlY3Rpb24uY2FtZWxpemUocmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWUpXG4gICAgICBjb25zdCB0YXJnZXRJbXBvcnRQYXRoID0gYC4vJHtyZWxhdGlvbnNoaXAudGFyZ2V0RmlsZU5hbWV9LmpzYFxuICAgICAgY29uc3QgdGFyZ2V0SW5zdGFuY2VUeXBlID0gYGltcG9ydCgke0pTT04uc3RyaW5naWZ5KHRhcmdldEltcG9ydFBhdGgpfSkuJHtyZWxhdGlvbnNoaXAudGFyZ2V0Q2xhc3NOYW1lfWBcbiAgICAgIGNvbnN0IHRhcmdldENyZWF0ZUF0dHJpYnV0ZXNUeXBlID0gYGltcG9ydCgke0pTT04uc3RyaW5naWZ5KHRhcmdldEltcG9ydFBhdGgpfSkuJHtyZWxhdGlvbnNoaXAudGFyZ2V0Q2xhc3NOYW1lfUNyZWF0ZUF0dHJpYnV0ZXNgXG5cbiAgICAgIGlmIChyZWxhdGlvbnNoaXAudHlwZSA9PSBcImhhc01hbnlcIikge1xuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBSZXR1cm5zICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9IHJlbGF0aW9uc2hpcCBoZWxwZXIuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkoaW1wb3J0UGF0aCl9KS5Gcm9udGVuZE1vZGVsSGFzTWFueVJlbGF0aW9uc2hpcDwke2NsYXNzTmFtZX0sICR7dGFyZ2V0SW5zdGFuY2VUeXBlfSwgJHt0YXJnZXRDcmVhdGVBdHRyaWJ1dGVzVHlwZX0+fSAtIFJlbGF0aW9uc2hpcCBoZWxwZXIuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1SZWxhdGlvbnNoaXAoKSB7IHJldHVybiAvKiogQHR5cGUge2ltcG9ydCgke0pTT04uc3RyaW5naWZ5KGltcG9ydFBhdGgpfSkuRnJvbnRlbmRNb2RlbEhhc01hbnlSZWxhdGlvbnNoaXA8JHtjbGFzc05hbWV9LCAke3RhcmdldEluc3RhbmNlVHlwZX0sICR7dGFyZ2V0Q3JlYXRlQXR0cmlidXRlc1R5cGV9Pn0gKi8gKHRoaXMuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKCR7SlNPTi5zdHJpbmdpZnkocmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWUpfSkpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogUmV0dXJucyAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfS5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtpbXBvcnQoJHtKU09OLnN0cmluZ2lmeShpbXBvcnRQYXRoKX0pLkZyb250ZW5kTW9kZWxIYXNNYW55UmVsYXRpb25zaGlwPCR7Y2xhc3NOYW1lfSwgJHt0YXJnZXRJbnN0YW5jZVR5cGV9LCAke3RhcmdldENyZWF0ZUF0dHJpYnV0ZXNUeXBlfT59IC0gUmVsYXRpb25zaGlwIGhlbHBlci5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfSgpIHsgcmV0dXJuIHRoaXMuJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1SZWxhdGlvbnNoaXAoKSB9XFxuYFxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIFJldHVybnMgbG9hZGVkICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge0FycmF5PCR7dGFyZ2V0SW5zdGFuY2VUeXBlfT59IC0gTG9hZGVkIHJlbGF0ZWQgbW9kZWxzLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9TG9hZGVkKCkgeyByZXR1cm4gdGhpcy4ke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfVJlbGF0aW9uc2hpcCgpLmxvYWRlZCgpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogTG9hZHMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0uXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTwke3RhcmdldEluc3RhbmNlVHlwZX0+Pn0gLSBMb2FkZWQgcmVsYXRlZCBtb2RlbHMuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYXN5bmMgbG9hZCR7cmVsYXRpb25zaGlwTmFtZUNhbWVsaXplZH0oKSB7IHJldHVybiBhd2FpdCB0aGlzLiR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkubG9hZCgpIH1cXG5gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBSZXR1cm5zICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9IHJlbGF0aW9uc2hpcCBoZWxwZXIuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkoaW1wb3J0UGF0aCl9KS5Gcm9udGVuZE1vZGVsU2luZ3VsYXJSZWxhdGlvbnNoaXA8JHtjbGFzc05hbWV9LCAke3RhcmdldEluc3RhbmNlVHlwZX0sICR7dGFyZ2V0Q3JlYXRlQXR0cmlidXRlc1R5cGV9Pn0gLSBSZWxhdGlvbnNoaXAgaGVscGVyLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkgeyByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoJHtKU09OLnN0cmluZ2lmeShpbXBvcnRQYXRoKX0pLkZyb250ZW5kTW9kZWxTaW5ndWxhclJlbGF0aW9uc2hpcDwke2NsYXNzTmFtZX0sICR7dGFyZ2V0SW5zdGFuY2VUeXBlfSwgJHt0YXJnZXRDcmVhdGVBdHRyaWJ1dGVzVHlwZX0+fSAqLyAodGhpcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZSl9KSkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBSZXR1cm5zICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMgeyR7dGFyZ2V0SW5zdGFuY2VUeXBlfSB8IG51bGx9IC0gTG9hZGVkIHJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0oKSB7IHJldHVybiB0aGlzLiR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkubG9hZGVkKCkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBCdWlsZHMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0uXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcGFyYW0geyR7dGFyZ2V0Q3JlYXRlQXR0cmlidXRlc1R5cGV9fSBbYXR0cmlidXRlc10gLSBBdHRyaWJ1dGVzIGZvciB0aGUgbmV3IHJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7JHt0YXJnZXRJbnN0YW5jZVR5cGV9fSAtIEJ1aWx0IHJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYnVpbGQke3JlbGF0aW9uc2hpcE5hbWVDYW1lbGl6ZWR9KGF0dHJpYnV0ZXMgPSB7fSkgeyByZXR1cm4gdGhpcy4ke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfVJlbGF0aW9uc2hpcCgpLmJ1aWxkKGF0dHJpYnV0ZXMpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogTG9hZHMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0uXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7UHJvbWlzZTwke3RhcmdldEluc3RhbmNlVHlwZX0gfCBudWxsPn0gLSBMb2FkZWQgcmVsYXRlZCBtb2RlbC5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICBhc3luYyBsb2FkJHtyZWxhdGlvbnNoaXBOYW1lQ2FtZWxpemVkfSgpIHsgcmV0dXJuIGF3YWl0IHRoaXMuJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1SZWxhdGlvbnNoaXAoKS5sb2FkKCkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBSZXR1cm5zIG9yIGxvYWRzICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge1Byb21pc2U8JHt0YXJnZXRJbnN0YW5jZVR5cGV9IHwgbnVsbD59IC0gTG9hZGVkIHJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYXN5bmMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1PckxvYWQoKSB7IHJldHVybiBhd2FpdCB0aGlzLiR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkub3JMb2FkKCkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBTZXRzICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHBhcmFtIHske3RhcmdldEluc3RhbmNlVHlwZX0gfCBudWxsfSBtb2RlbCAtIFJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQHJldHVybnMge3ZvaWR9XFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIHNldCR7cmVsYXRpb25zaGlwTmFtZUNhbWVsaXplZH0obW9kZWwpIHsgdGhpcy4ke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfVJlbGF0aW9uc2hpcCgpLnNldExvYWRlZChtb2RlbCkgfVxcbmBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWxlQ29udGVudCArPSBcIn1cXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgRnJvbnRlbmRNb2RlbEJhc2UucmVnaXN0ZXJNb2RlbCgke2NsYXNzTmFtZX0pXFxuYFxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgZXhwb3J0IHske2NsYXNzTmFtZX19XFxuYFxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgZXhwb3J0IGRlZmF1bHQgJHtjbGFzc05hbWV9XFxuYFxuXG4gICAgcmV0dXJuIGZpbGVDb250ZW50XG4gIH1cblxuICAvKipcbiAgICogUnVucyBidWlsZCBpbmRleCBmaWxlIGNvbnRlbnQuXG4gICAqIEBwYXJhbSB7QXJyYXk8e2NsYXNzTmFtZTogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nfT59IGdlbmVyYXRlZEZpbGVzIC0gR2VuZXJhdGVkIG1vZGVsIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEluZGV4IGZpbGUgY29udGVudCB0aGF0IGltcG9ydHMgYW5kIHJlLWV4cG9ydHMgYWxsIG1vZGVscy5cbiAgICovXG4gIGJ1aWxkSW5kZXhGaWxlQ29udGVudChnZW5lcmF0ZWRGaWxlcykge1xuICAgIGxldCBjb250ZW50ID0gXCJcIlxuXG4gICAgZm9yIChjb25zdCB7Y2xhc3NOYW1lLCBmaWxlTmFtZX0gb2YgZ2VuZXJhdGVkRmlsZXMpIHtcbiAgICAgIGNvbnRlbnQgKz0gYGV4cG9ydCB7ZGVmYXVsdCBhcyAke2NsYXNzTmFtZX19IGZyb20gXCIuLyR7ZmlsZU5hbWV9XCJcXG5gXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGJ1aWxkIHNldHVwIGZpbGUgY29udGVudC5cbiAgICogQHBhcmFtIHtBcnJheTx7Y2xhc3NOYW1lOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmd9Pn0gZ2VuZXJhdGVkRmlsZXMgLSBHZW5lcmF0ZWQgbW9kZWwgZmlsZXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU2V0dXAgZmlsZSBjb250ZW50IHdpdGggc2lkZS1lZmZlY3QgaW1wb3J0cyBmb3IgbW9kZWwgcmVnaXN0cmF0aW9uLlxuICAgKi9cbiAgYnVpbGRTZXR1cEZpbGVDb250ZW50KGdlbmVyYXRlZEZpbGVzKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBcIi8vIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZCBieSBWZWxvY2lvdXMuIERvIG5vdCBlZGl0IG1hbnVhbGx5LlxcblwiXG5cbiAgICBjb250ZW50ICs9IFwiLy8gUnVuIGB2ZWxvY2lvdXMgZzpmcm9udGVuZC1tb2RlbHNgIHRvIHJlZ2VuZXJhdGUuXFxuXCJcblxuICAgIGZvciAoY29uc3Qge2ZpbGVOYW1lfSBvZiBnZW5lcmF0ZWRGaWxlcykge1xuICAgICAgY29udGVudCArPSBgaW1wb3J0IFwiLi8ke2ZpbGVOYW1lfVwiXFxuYFxuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50XG4gIH1cblxuICAvKipcbiAgICogUnVucyB3cml0ZSBhdHRyaWJ1dGVzIHR5cGVkZWYuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge0FycmF5PHtqc0RvY1R5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nfT59IGFyZ3MuYXR0cmlidXRlcyAtIEdlbmVyYXRlZCByZWFkIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZXNUeXBlTmFtZSAtIEdlbmVyYXRlZCByZWFkIGF0dHJpYnV0ZXMgdHlwZWRlZiBuYW1lLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYXJncy5tb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtBcnJheTx7YXR0cmlidXRlczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgdHlwZU5hbWU6IHN0cmluZ30+fSBhcmdzLm5lc3RlZFdyaXRlVHlwZXMgLSBOZXN0ZWQgd3JpdGUgdHlwZWRlZnMuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbEdlbmVyYXRvclBlcm1pdFNwZWN9IGFyZ3MucGVybWl0dGVkUGFyYW1zIC0gUmVzb3VyY2UgcGVybWl0dGVkIHBhcmFtcyBzcGVjLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5yZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnR5cGVOYW1lIC0gVHlwZWRlZiBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIEdlbmVyYXRlZCB0eXBlZGVmIHNvdXJjZS5cbiAgICovXG4gIGFzeW5jIHdyaXRlQXR0cmlidXRlc1R5cGVkZWYoe2F0dHJpYnV0ZXMsIGF0dHJpYnV0ZXNUeXBlTmFtZSwgbW9kZWxDbGFzcywgbmVzdGVkV3JpdGVUeXBlcywgcGVybWl0dGVkUGFyYW1zLCByZXNvdXJjZUNsYXNzLCB0eXBlTmFtZX0pIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVMaW5lcyA9IFtdXG5cbiAgICBsZXQgb3V0cHV0ID0gXCIvKipcXG5cIlxuXG4gICAgY29uc3QgYXR0cmlidXRlc0J5TmFtZSA9IG5ldyBNYXAoYXR0cmlidXRlcy5tYXAoKGF0dHJpYnV0ZSkgPT4gW2F0dHJpYnV0ZS5uYW1lLCBhdHRyaWJ1dGVdKSlcbiAgICBjb25zdCBuZXN0ZWRXcml0ZVR5cGVzQnlLZXkgPSBuZXcgTWFwKG5lc3RlZFdyaXRlVHlwZXMubWFwKChuZXN0ZWRXcml0ZVR5cGUpID0+IFtgJHtuZXN0ZWRXcml0ZVR5cGUucmVsYXRpb25zaGlwTmFtZX1BdHRyaWJ1dGVzYCwgbmVzdGVkV3JpdGVUeXBlXSkpXG4gICAgY29uc3QgZW1pdHRlZEF0dHJpYnV0ZU5hbWVzID0gbmV3IFNldCgpXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlcm1pdHRlZFBhcmFtcykge1xuICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSB0aGlzLmZyb250ZW5kV3JpdGVBdHRyaWJ1dGVOYW1lKHthdHRyaWJ1dGVOYW1lOiBlbnRyeSwgYXR0cmlidXRlc0J5TmFtZSwgbW9kZWxDbGFzc30pXG5cbiAgICAgICAgaWYgKGVtaXR0ZWRBdHRyaWJ1dGVOYW1lcy5oYXMoYXR0cmlidXRlTmFtZSkpIGNvbnRpbnVlXG5cbiAgICAgICAgZW1pdHRlZEF0dHJpYnV0ZU5hbWVzLmFkZChhdHRyaWJ1dGVOYW1lKVxuXG4gICAgICAgIGNvbnN0IHR5cGUgPSBhd2FpdCB0aGlzLmZyb250ZW5kV3JpdGVBdHRyaWJ1dGVUeXBlKHtcbiAgICAgICAgICBhdHRyaWJ1dGU6IGF0dHJpYnV0ZXNCeU5hbWUuZ2V0KGF0dHJpYnV0ZU5hbWUpLFxuICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgYXR0cmlidXRlc1R5cGVOYW1lLFxuICAgICAgICAgIHJlc291cmNlQ2xhc3NcbiAgICAgICAgfSlcblxuICAgICAgICBhdHRyaWJ1dGVMaW5lcy5wdXNoKGAgKiBAcHJvcGVydHkgeyR7dHlwZX19IFske2F0dHJpYnV0ZU5hbWV9XSAtIFBlcm1pdHRlZCAke2F0dHJpYnV0ZU5hbWV9IHZhbHVlLlxcbmApXG4gICAgICB9IGVsc2UgaWYgKGVudHJ5ICYmIHR5cGVvZiBlbnRyeSA9PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnRyeSkpIHtcbiAgICAgICAgICBjb25zdCBuZXN0ZWRXcml0ZVR5cGUgPSBuZXN0ZWRXcml0ZVR5cGVzQnlLZXkuZ2V0KGtleSlcbiAgICAgICAgICBjb25zdCB0eXBlID0gbmVzdGVkV3JpdGVUeXBlID8gYEFycmF5PCR7bmVzdGVkV3JpdGVUeXBlLnR5cGVOYW1lfT5gIDogXCJBcnJheTxvYmplY3Q+XCJcblxuICAgICAgICAgIGF0dHJpYnV0ZUxpbmVzLnB1c2goYCAqIEBwcm9wZXJ0eSB7JHt0eXBlfX0gWyR7a2V5fV0gLSBQZXJtaXR0ZWQgbmVzdGVkICR7a2V5fSB2YWx1ZXMuXFxuYClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG91dHB1dCArPSBgICogQXR0cmlidXRlcyBhY2NlcHRlZCBieSAke3R5cGVOYW1lfS5cXG5gXG4gICAgaWYgKGF0dHJpYnV0ZUxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgb3V0cHV0ICs9IGAgKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgbmV2ZXI+fSAke3R5cGVOYW1lfVxcbmBcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0ICs9IGAgKiBAdHlwZWRlZiB7b2JqZWN0fSAke3R5cGVOYW1lfVxcbmBcbiAgICAgIG91dHB1dCArPSBhdHRyaWJ1dGVMaW5lcy5qb2luKFwiXCIpXG4gICAgfVxuICAgIG91dHB1dCArPSBcIiAqL1xcblwiXG5cbiAgICByZXR1cm4gb3V0cHV0XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCB3cml0ZSBhdHRyaWJ1dGUgdHlwZS5cbiAgICogQHBhcmFtIHt7YXR0cmlidXRlOiB7anNEb2NUeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ30gfCB1bmRlZmluZWQsIGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgYXR0cmlidXRlc1R5cGVOYW1lOiBzdHJpbmcsIHJlc291cmNlQ2xhc3M6IGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZH19IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gSlNEb2MgdHlwZSBmb3IgdGhlIHBlcm1pdHRlZCB3cml0ZSBmaWVsZC5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kV3JpdGVBdHRyaWJ1dGVUeXBlKHthdHRyaWJ1dGUsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZXNUeXBlTmFtZSwgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBjb25zdCBzZXR0ZXJQYXJhbWV0ZXJUeXBlID0gYXdhaXQgdGhpcy5mcm9udGVuZFdyaXRlQXR0cmlidXRlU2V0dGVyUGFyYW1ldGVyVHlwZSh7YXR0cmlidXRlTmFtZSwgcmVzb3VyY2VDbGFzc30pXG5cbiAgICBpZiAoc2V0dGVyUGFyYW1ldGVyVHlwZSkgcmV0dXJuIGAke3NldHRlclBhcmFtZXRlclR5cGV9IHwgbnVsbGBcblxuICAgIGlmICghYXR0cmlidXRlKSByZXR1cm4gXCJGcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWVcIlxuXG4gICAgaWYgKGF0dHJpYnV0ZS5qc0RvY1R5cGUudHJpbSgpID09PSBcIm51bGxcIikgcmV0dXJuIFwiRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlXCJcblxuICAgIHJldHVybiBgJHthdHRyaWJ1dGVzVHlwZU5hbWV9WyR7SlNPTi5zdHJpbmdpZnkoYXR0cmlidXRlLm5hbWUpfV0gfCBudWxsYFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgd3JpdGUgYXR0cmlidXRlIHNldHRlciBwYXJhbWV0ZXIgdHlwZS5cbiAgICogQHBhcmFtIHt7YXR0cmlidXRlTmFtZTogc3RyaW5nLCByZXNvdXJjZUNsYXNzOiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGwgfCB1bmRlZmluZWR9fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsPn0gLSBTZXR0ZXIgdmFsdWUgcGFyYW1ldGVyIHR5cGUgd2hlbiBpdCBpcyB1c2VmdWwgZm9yIGdlbmVyYXRpb24uXG4gICAqL1xuICBhc3luYyBmcm9udGVuZFdyaXRlQXR0cmlidXRlU2V0dGVyUGFyYW1ldGVyVHlwZSh7YXR0cmlidXRlTmFtZSwgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBpZiAoIXJlc291cmNlQ2xhc3M/Lm5hbWUpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBtZXRob2ROYW1lID0gYHNldCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhdHRyaWJ1dGVOYW1lKX1BdHRyaWJ1dGVgXG4gICAgY29uc3QgcGFyYW1ldGVyVHlwZSA9IGF3YWl0IHRoaXMucmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlKHtcbiAgICAgIG1ldGhvZE5hbWUsXG4gICAgICBwYXJhbWV0ZXJJbmRleDogMSxcbiAgICAgIHNvdXJjZUNsYXNzTmFtZTogcmVzb3VyY2VDbGFzcy5uYW1lXG4gICAgfSlcblxuICAgIGlmICghcGFyYW1ldGVyVHlwZSkgcmV0dXJuIG51bGxcbiAgICBpZiAodGhpcy5pc0Jyb2FkR2VuZXJhdGVkVHlwZShwYXJhbWV0ZXJUeXBlKSkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiBwYXJhbWV0ZXJUeXBlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpcyBicm9hZCBnZW5lcmF0ZWQgdHlwZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGpzRG9jVHlwZSAtIEpTRG9jIHR5cGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIHR5cGUgaXMgdG9vIGJyb2FkIHRvIGltcHJvdmUgZ2VuZXJhdGVkIHdyaXRlIHR5cGluZy5cbiAgICovXG4gIGlzQnJvYWRHZW5lcmF0ZWRUeXBlKGpzRG9jVHlwZSkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0ganNEb2NUeXBlLnRyaW0oKVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRUeXBlID09PSBcIj9cIlxuICAgICAgfHwgbm9ybWFsaXplZFR5cGUgPT09IFwiYW55XCJcbiAgICAgIHx8IG5vcm1hbGl6ZWRUeXBlID09PSBcIm9iamVjdFwiXG4gICAgICB8fCBub3JtYWxpemVkVHlwZSA9PT0gXCJ1bmtub3duXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIHBlcm1pdHRlZCB3cml0ZSBhdHRyaWJ1dGUgdG8gdGhlIGdlbmVyYXRlZCBmcm9udGVuZCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHt7YXR0cmlidXRlTmFtZTogc3RyaW5nLCBhdHRyaWJ1dGVzQnlOYW1lOiBNYXA8c3RyaW5nLCB7anNEb2NUeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ30+LCBtb2RlbENsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZyb250ZW5kIGF0dHJpYnV0ZSBuYW1lIHVzZWQgYnkgZ2VuZXJhdGVkIGFjY2Vzc29ycy5cbiAgICovXG4gIGZyb250ZW5kV3JpdGVBdHRyaWJ1dGVOYW1lKHthdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVzQnlOYW1lLCBtb2RlbENsYXNzfSkge1xuICAgIGlmIChhdHRyaWJ1dGVzQnlOYW1lLmhhcyhhdHRyaWJ1dGVOYW1lKSkgcmV0dXJuIGF0dHJpYnV0ZU5hbWVcblxuICAgIGlmIChtb2RlbENsYXNzKSB7XG4gICAgICBjb25zdCByZXNvbHZlZEF0dHJpYnV0ZU5hbWUgPSBtb2RlbENsYXNzLnJlc29sdmVBdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICAgIGlmIChyZXNvbHZlZEF0dHJpYnV0ZU5hbWUgJiYgYXR0cmlidXRlc0J5TmFtZS5oYXMocmVzb2x2ZWRBdHRyaWJ1dGVOYW1lKSkgcmV0dXJuIHJlc29sdmVkQXR0cmlidXRlTmFtZVxuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRBdHRyaWJ1dGVOYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhdHRyaWJ1dGVOYW1lLCB0cnVlKS50b0xvd2VyQ2FzZSgpXG4gICAgY29uc3QgbWF0Y2hpbmdBdHRyaWJ1dGVOYW1lID0gQXJyYXkuZnJvbShhdHRyaWJ1dGVzQnlOYW1lLmtleXMoKSkuZmluZCgoY2FuZGlkYXRlTmFtZSkgPT4gY2FuZGlkYXRlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub3JtYWxpemVkQXR0cmlidXRlTmFtZSlcblxuICAgIGlmIChtYXRjaGluZ0F0dHJpYnV0ZU5hbWUpIHJldHVybiBtYXRjaGluZ0F0dHJpYnV0ZU5hbWVcblxuICAgIC8vIFdyaXRlLW9ubHkgdmlydHVhbCBwYXJhbXMgYXJlIHZhbGlkIHBlcm1pdHRlZCBwYXJhbXMgZXZlbiB3aGVuIHRoZXkgaGF2ZSBubyByZWFkIGF0dHJpYnV0ZS5cbiAgICByZXR1cm4gYXR0cmlidXRlTmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbmVzdGVkIHdyaXRlIHR5cGVzIGZvciBtb2RlbC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIEZyb250ZW5kIG1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbEdlbmVyYXRvclBlcm1pdFNwZWN9IGFyZ3MucGVybWl0dGVkUGFyYW1zIC0gQ29tYmluZWQgcGVybWl0dGVkIHBhcmFtcyBzcGVjcy5cbiAgICogQHBhcmFtIHtBcnJheTx7YXV0b2xvYWQ6IGJvb2xlYW4sIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgdGFyZ2V0Q2xhc3NOYW1lOiBzdHJpbmcsIHRhcmdldEZpbGVOYW1lOiBzdHJpbmcsIHR5cGU6IFwiYmVsb25nc1RvXCIgfCBcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9Pn0gYXJncy5yZWxhdGlvbnNoaXBzIC0gR2VuZXJhdGVkIHJlbGF0aW9uc2hpcHMuXG4gICAqIEByZXR1cm5zIHtBcnJheTx7YXR0cmlidXRlczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgdHlwZU5hbWU6IHN0cmluZ30+fSAtIE5lc3RlZCB3cml0ZSB0eXBlZGVmcy5cbiAgICovXG4gIG5lc3RlZFdyaXRlVHlwZXNGb3JNb2RlbCh7Y2xhc3NOYW1lLCBwZXJtaXR0ZWRQYXJhbXMsIHJlbGF0aW9uc2hpcHN9KSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwc0J5TmFtZSA9IG5ldyBNYXAocmVsYXRpb25zaGlwcy5tYXAoKHJlbGF0aW9uc2hpcCkgPT4gW3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lLCByZWxhdGlvbnNoaXBdKSlcbiAgICBjb25zdCBuZXN0ZWRXcml0ZVR5cGVzQnlOYW1lID0gbmV3IE1hcCgpXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlcm1pdHRlZFBhcmFtcykge1xuICAgICAgaWYgKCFlbnRyeSB8fCB0eXBlb2YgZW50cnkgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGVudHJ5KSkgY29udGludWVcblxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW50cnkpKSB7XG4gICAgICAgIGlmICgha2V5LmVuZHNXaXRoKFwiQXR0cmlidXRlc1wiKSkgY29udGludWVcbiAgICAgICAgY29uc3QgcmVsYXRpb25zaGlwTmFtZSA9IGtleS5zbGljZSgwLCAtXCJBdHRyaWJ1dGVzXCIubGVuZ3RoKVxuICAgICAgICBjb25zdCBuZXN0ZWRTcGVjID0gZW50cnlba2V5XVxuICAgICAgICBjb25zdCByZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXBzQnlOYW1lLmdldChyZWxhdGlvbnNoaXBOYW1lKVxuICAgICAgICBsZXQgdGFyZ2V0TW9kZWxDbGFzc1xuXG4gICAgICAgIGlmIChyZWxhdGlvbnNoaXApIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGFyZ2V0TW9kZWxDbGFzcyA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldE1vZGVsQ2xhc3MocmVsYXRpb25zaGlwLnRhcmdldENsYXNzTmFtZSlcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRhcmdldE1vZGVsQ2xhc3MgPSB1bmRlZmluZWRcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmVzdGVkV3JpdGVUeXBlc0J5TmFtZS5oYXMocmVsYXRpb25zaGlwTmFtZSkpIGNvbnRpbnVlXG5cbiAgICAgICAgbmVzdGVkV3JpdGVUeXBlc0J5TmFtZS5zZXQocmVsYXRpb25zaGlwTmFtZSwge1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IHRoaXMubmVzdGVkV3JpdGVBdHRyaWJ1dGVzRm9yU3BlYyh7bmVzdGVkU3BlYywgdGFyZ2V0TW9kZWxDbGFzc30pLFxuICAgICAgICAgIHJlbGF0aW9uc2hpcE5hbWUsXG4gICAgICAgICAgdHlwZU5hbWU6IGAke2NsYXNzTmFtZX0ke2luZmxlY3Rpb24uY2FtZWxpemUocmVsYXRpb25zaGlwTmFtZSl9TmVzdGVkQXR0cmlidXRlc2BcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXN0ZWRXcml0ZVR5cGVzQnlOYW1lLnZhbHVlcygpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbmVzdGVkIHdyaXRlIGF0dHJpYnV0ZXMgZm9yIHNwZWMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIG9iamVjdD4+IHwgb2JqZWN0IHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5uZXN0ZWRTcGVjIC0gTmVzdGVkIHBlcm1pdCBzcGVjLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYXJncy50YXJnZXRNb2RlbENsYXNzIC0gVGFyZ2V0IGJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9Pn0gLSBOZXN0ZWQgd3JpdGUgYXR0cmlidXRlcy5cbiAgICovXG4gIG5lc3RlZFdyaXRlQXR0cmlidXRlc0ZvclNwZWMoe25lc3RlZFNwZWMsIHRhcmdldE1vZGVsQ2xhc3N9KSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5lc3RlZFNwZWMpKSByZXR1cm4gW11cblxuICAgIHJldHVybiBuZXN0ZWRTcGVjLmZpbHRlcigoZW50cnkpID0+IHR5cGVvZiBlbnRyeSA9PSBcInN0cmluZ1wiKS5tYXAoKGF0dHJpYnV0ZU5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHJlc29sdmVkQXR0cmlidXRlTmFtZSA9IHRhcmdldE1vZGVsQ2xhc3M/LnJlc29sdmVBdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZU5hbWUpIHx8IGF0dHJpYnV0ZU5hbWVcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZUNvbmZpZyA9IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JNb2RlbEF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZTogcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzOiB0YXJnZXRNb2RlbENsYXNzfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lLFxuICAgICAgICB0eXBlOiBhdHRyaWJ1dGVDb25maWcgPyB0aGlzLmpzRG9jVHlwZUZvckZyb250ZW5kQXR0cmlidXRlKHthdHRyaWJ1dGVDb25maWd9KSA6IFwiRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlXCJcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcGVybWl0dGVkIHBhcmFtcyBmb3IgZ2VuZXJhdG9yLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbH0gcmVzb3VyY2VDbGFzcyAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcGFyYW0ge1wiY3JlYXRlXCIgfCBcInVwZGF0ZVwifSBhY3Rpb24gLSBXcml0ZSBhY3Rpb24uXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsR2VuZXJhdG9yUGVybWl0U3BlY30gLSBQZXJtaXR0ZWQgcGFyYW1zIHNwZWMuXG4gICAqL1xuICBwZXJtaXR0ZWRQYXJhbXNGb3JHZW5lcmF0b3IocmVzb3VyY2VDbGFzcywgYWN0aW9uKSB7XG4gICAgaWYgKCFyZXNvdXJjZUNsYXNzKSByZXR1cm4gW11cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBtb2RlbENsYXNzID0gcmVzb3VyY2VDbGFzcy5tb2RlbENsYXNzKClcblxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgcmVzb3VyY2VDbGFzcyh7XG4gICAgICAgIGFiaWxpdHk6IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGV4dDoge30sXG4gICAgICAgIGxvY2Fsczoge30sXG4gICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgIG1vZGVsTmFtZTogbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKSxcbiAgICAgICAgcGFyYW1zOiB7fSxcbiAgICAgICAgcmVzb3VyY2VDb25maWd1cmF0aW9uOiAvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbn0gKi8gKHthdHRyaWJ1dGVzOiBbXX0pXG4gICAgICB9KVxuICAgICAgY29uc3Qgc3BlYyA9IGluc3RhbmNlLnBlcm1pdHRlZFBhcmFtcyh7YWN0aW9uLCBhYmlsaXR5OiB1bmRlZmluZWQsIGxvY2Fsczoge30sIHBhcmFtczoge319KVxuXG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShzcGVjKSA/IHNwZWMgOiBbXVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBpbnZva2UgJHtyZXNvdXJjZUNsYXNzLm5hbWV9LnBlcm1pdHRlZFBhcmFtcygpIHdoaWxlIGdlbmVyYXRpbmcgZnJvbnRlbmQgbW9kZWwgd3JpdGUgdHlwZXM6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsIHtjYXVzZTogZXJyb3J9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VzIGEgYmFja2VuZCByZXNvdXJjZSdzIGBwZXJtaXR0ZWRQYXJhbXMoKWAgaW5zdGFuY2UgbWV0aG9kIGF0XG4gICAqIGdlbmVyYXRpb24gdGltZSBhbmQgZXh0cmFjdHMgdGhlIHJlbGF0aW9uc2hpcCBuYW1lcyB0aGF0IGFjY2VwdFxuICAgKiBuZXN0ZWQgd3JpdGVzIChge2Zvb0F0dHJpYnV0ZXM6IFsuLi5dfWAgZW50cmllcykuIFRoZSBnZW5lcmF0b3JcbiAgICogZW1pdHMgdGhvc2UgbmFtZXMgaW50byB0aGUgZnJvbnRlbmQgbW9kZWwncyBgcmVzb3VyY2VDb25maWcoKWAgc29cbiAgICogdGhlIGNsaWVudCBgc2F2ZSgpYCB3YWxrZXIga25vd3Mgd2hpY2ggcmVsYXRpb25zaGlwcyB0byBzaGlwLlxuICAgKlxuICAgKiBDb25zdHJ1Y3RlZCB3aXRoIG5vIGNvbnRyb2xsZXIvYWJpbGl0eSBzbyByZXNvdXJjZSBvdmVycmlkZXMgbXVzdFxuICAgKiBzdXBwb3J0IGJlaW5nIGNhbGxlZCB3aXRob3V0IGEgcmVxdWVzdCBjb250ZXh0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbH0gcmVzb3VyY2VDbGFzcyAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IC0gUmVsYXRpb25zaGlwIG5hbWVzIHRoYXQgYWNjZXB0IG5lc3RlZCB3cml0ZXMgKGVtcHR5IHdoZW4gbm9uZSkuXG4gICAqL1xuICBuZXN0ZWRSZWxhdGlvbnNoaXBOYW1lc0ZvckdlbmVyYXRvcihyZXNvdXJjZUNsYXNzKSB7XG4gICAgaWYgKCFyZXNvdXJjZUNsYXNzKSByZXR1cm4gW11cblxuICAgIGxldCBzcGVjXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbW9kZWxDbGFzcyA9IHJlc291cmNlQ2xhc3MubW9kZWxDbGFzcygpXG5cbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHJlc291cmNlQ2xhc3Moe1xuICAgICAgICBhYmlsaXR5OiB1bmRlZmluZWQsXG4gICAgICAgIGNvbnRleHQ6IHt9LFxuICAgICAgICBsb2NhbHM6IHt9LFxuICAgICAgICBtb2RlbENsYXNzLFxuICAgICAgICBtb2RlbE5hbWU6IG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCksXG4gICAgICAgIHBhcmFtczoge30sXG4gICAgICAgIHJlc291cmNlQ29uZmlndXJhdGlvbjogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259ICovICh7YXR0cmlidXRlczogW119KVxuICAgICAgfSlcbiAgICAgIHNwZWMgPSBpbnN0YW5jZS5wZXJtaXR0ZWRQYXJhbXMoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBpbnZva2UgJHtyZXNvdXJjZUNsYXNzLm5hbWV9LnBlcm1pdHRlZFBhcmFtcygpIHdoaWxlIGdlbmVyYXRpbmcgZnJvbnRlbmQgbW9kZWxzOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLCB7Y2F1c2U6IGVycm9yfSlcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3BlYykpIHJldHVybiBbXVxuXG4gICAgLyoqXG4gICAgICogUmVsYXRpb25zaGlwIG5hbWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCByZWxhdGlvbnNoaXBOYW1lcyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNwZWMpIHtcbiAgICAgIGlmICghZW50cnkgfHwgdHlwZW9mIGVudHJ5ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZW50cnkpKSBjb250aW51ZVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnRyeSkpIHtcbiAgICAgICAgaWYgKCFrZXkuZW5kc1dpdGgoXCJBdHRyaWJ1dGVzXCIpKSBjb250aW51ZVxuICAgICAgICBjb25zdCBuYW1lID0ga2V5LnNsaWNlKDAsIC1cIkF0dHJpYnV0ZXNcIi5sZW5ndGgpXG4gICAgICAgIGlmIChuYW1lKSByZWxhdGlvbnNoaXBOYW1lcy5wdXNoKG5hbWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbGF0aW9uc2hpcE5hbWVzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmb3JtYXR0ZWQgYXJyYXkgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gRm9ybWF0dGluZyBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5pbmRlbnQgLSBCYXNlIGluZGVudGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wcm9wZXJ0eU5hbWUgLSBPYmplY3QgcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy52YWx1ZXMgLSBTdHJpbmcgdmFsdWVzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZvcm1hdHRlZCBtdWx0aWxpbmUgYXJyYXkgcHJvcGVydHkuXG4gICAqL1xuICBmb3JtYXR0ZWRBcnJheVByb3BlcnR5KHtpbmRlbnQsIHByb3BlcnR5TmFtZSwgdmFsdWVzfSkge1xuICAgIGxldCBvdXRwdXQgPSBgJHtpbmRlbnR9JHtwcm9wZXJ0eU5hbWV9OiBbXFxuYFxuXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIG91dHB1dCArPSBgJHtpbmRlbnR9ICAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0sXFxuYFxuICAgIH1cblxuICAgIG91dHB1dCArPSBgJHtpbmRlbnR9XSxcXG5gXG5cbiAgICByZXR1cm4gb3V0cHV0XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmb3JtYXR0ZWQgY29tbWFuZHMgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gRm9ybWF0dGluZyBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5pbmRlbnQgLSBCYXNlIGluZGVudGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wcm9wZXJ0eU5hbWUgLSBPYmplY3QgcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBhcmdzLnZhbHVlcyAtIENvbW1hbmQga2V5LXZhbHVlcy5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBGb3JtYXR0ZWQgbXVsdGlsaW5lIGFycmF5IHByb3BlcnR5LiBBbHdheXMgZW1pdHNcbiAgICogICB0aGUgY2FtZWxDYXNlIG1ldGhvZC1uYW1lIGFycmF5IGZvcm0gKGBtZW1iZXJDb21tYW5kczogW1widXBkYXRlQWNjZXNzXCJdYClcbiAgICogICBzbyB0aGUgZ2VuZXJhdGVkIGNvbmZpZyBtYXRjaGVzIHRoZSBjYW5vbmljYWxcbiAgICogICBgRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlnLntjb2xsZWN0aW9uLG1lbWJlcn1Db21tYW5kczogc3RyaW5nW11gXG4gICAqICAgc2hhcGUuIFRoZSBydW50aW1lIGRlcml2ZXMgdGhlIGNvbW1hbmQgc2x1ZyBmcm9tIHRoZSBjYW1lbENhc2VcbiAgICogICBtZXRob2QgbmFtZTsgY29uc3VtZXJzIG5ldmVyIG5lZWQgdG8gd3JpdGUgb3V0XG4gICAqICAgYHt1cGRhdGVBY2Nlc3M6IFwidXBkYXRlLWFjY2Vzc1wifWAgYnkgaGFuZC5cbiAgICovXG4gIGZvcm1hdHRlZENvbW1hbmRzUHJvcGVydHkoe2luZGVudCwgcHJvcGVydHlOYW1lLCB2YWx1ZXN9KSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0dGVkQXJyYXlQcm9wZXJ0eSh7aW5kZW50LCBwcm9wZXJ0eU5hbWUsIHZhbHVlczogT2JqZWN0LmtleXModmFsdWVzKX0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmb3JtYXR0ZWQgb2JqZWN0IHByb3BlcnR5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEZvcm1hdHRpbmcgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuaW5kZW50IC0gQmFzZSBpbmRlbnRhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucHJvcGVydHlOYW1lIC0gT2JqZWN0IHByb3BlcnR5IG5hbWUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gYXJncy52YWx1ZXMgLSBPYmplY3Qga2V5LXZhbHVlcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbYXJncy5maWx0ZXJEZWZhdWx0VmFsdWVzXSAtIERlZmF1bHQgdmFsdWVzIHRvIG9taXQgZnJvbSBvdXRwdXQuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gRm9ybWF0dGVkIG11bHRpbGluZSBvYmplY3QgcHJvcGVydHkuXG4gICAqL1xuICBmb3JtYXR0ZWRPYmplY3RQcm9wZXJ0eSh7ZmlsdGVyRGVmYXVsdFZhbHVlcywgaW5kZW50LCBwcm9wZXJ0eU5hbWUsIHZhbHVlc30pIHtcbiAgICBsZXQgb3V0cHV0ID0gYCR7aW5kZW50fSR7cHJvcGVydHlOYW1lfToge1xcbmBcblxuICAgIGZvciAoY29uc3Qgb2JqZWN0S2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlcykpIHtcbiAgICAgIGlmIChmaWx0ZXJEZWZhdWx0VmFsdWVzICYmIGZpbHRlckRlZmF1bHRWYWx1ZXNbb2JqZWN0S2V5XSA9PT0gdmFsdWVzW29iamVjdEtleV0pIGNvbnRpbnVlXG5cbiAgICAgIG91dHB1dCArPSBgJHtpbmRlbnR9ICAke29iamVjdEtleX06ICR7SlNPTi5zdHJpbmdpZnkodmFsdWVzW29iamVjdEtleV0pfSxcXG5gXG4gICAgfVxuXG4gICAgb3V0cHV0ICs9IGAke2luZGVudH19LFxcbmBcblxuICAgIHJldHVybiBvdXRwdXRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyBmb3IgbW9kZWwuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jbGFzc05hbWUgLSBGcm9udGVuZCBtb2RlbCBjbGFzcyBuYW1lLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYXJncy5tb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSBhcmdzLm1vZGVsQ29uZmlnIC0gTW9kZWwgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGx9IFthcmdzLnJlc291cmNlQ2xhc3NdIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PHtqc0RvY1R5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nfT4+fSAtIEF0dHJpYnV0ZSBkZWZpbml0aW9ucy5cbiAgICovXG4gIGFzeW5jIGF0dHJpYnV0ZURlZmluaXRpb25zRm9yTW9kZWwoe2NsYXNzTmFtZSwgbW9kZWxDbGFzcywgbW9kZWxDb25maWcsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgbGV0IGF0dHJpYnV0ZXMgPSBtb2RlbENvbmZpZy5hdHRyaWJ1dGVzXG5cbiAgICAvLyBBdXRvLWRlcml2ZSBhdHRyaWJ1dGVzIGZyb20gbW9kZWwgY29sdW1ucyB3aGVuIG5vdCBleHBsaWNpdGx5IGRlZmluZWRcbiAgICBpZiAoKCFhdHRyaWJ1dGVzIHx8IChBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXMpICYmIGF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKSkgJiYgbW9kZWxDbGFzcykge1xuICAgICAgY29uc3QgY29sdW1ucyA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1ucygpXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbHVtbnMpKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMgPSBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBpbmZsZWN0aW9uLmNhbWVsaXplKGNvbHVtbi5nZXROYW1lKCksIHRydWUpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXMpKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVEZWZpbml0aW9ucyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgYXR0cmlidXRlRGVmaW5pdGlvbiBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIC8qKiBAdHlwZSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsfSAqL1xuICAgICAgICBsZXQgY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZyA9IG51bGxcbiAgICAgICAgbGV0IGF0dHJpYnV0ZU5hbWVcblxuICAgICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZURlZmluaXRpb24gPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVEZWZpbml0aW9uXG4gICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlRGVmaW5pdGlvbiAmJiB0eXBlb2YgYXR0cmlidXRlRGVmaW5pdGlvbiA9PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGF0dHJpYnV0ZURlZmluaXRpb24pKSB7XG4gICAgICAgICAgY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZyA9IC8qKiBAdHlwZSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWd9ICovIChhdHRyaWJ1dGVEZWZpbml0aW9uKVxuICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnLm5hbWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlTmFtZSAhPSBcInN0cmluZ1wiIHx8IGF0dHJpYnV0ZU5hbWUubGVuZ3RoIDwgMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZnJvbnRlbmQgbW9kZWwgYXR0cmlidXRlIGFycmF5IGVudHJpZXMgdG8gYmUgc3RyaW5ncyBvciBvYmplY3RzIHdpdGggYSBuYW1lLCBnb3Q6ICR7SlNPTi5zdHJpbmdpZnkoYXR0cmlidXRlRGVmaW5pdGlvbil9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZUNvbmZpZyA9IGF3YWl0IHRoaXMucmVzb2x2ZWRGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyh7XG4gICAgICAgICAgYXR0cmlidXRlTmFtZSxcbiAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZyxcbiAgICAgICAgICBtb2RlbENsYXNzLFxuICAgICAgICAgIHJlc291cmNlQ2xhc3NcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyA9IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JHZW5lcmF0ZWRBdHRyaWJ1dGUoe1xuICAgICAgICAgIGF0dHJpYnV0ZUNvbmZpZyxcbiAgICAgICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgIG1vZGVsQ2xhc3NcbiAgICAgICAgfSlcblxuICAgICAgICBhdHRyaWJ1dGVEZWZpbml0aW9ucy5wdXNoKHtcbiAgICAgICAgICBqc0RvY1R5cGU6IHRoaXMuanNEb2NUeXBlRm9yRnJvbnRlbmRBdHRyaWJ1dGUoe2F0dHJpYnV0ZUNvbmZpZzogZnJvbnRlbmRBdHRyaWJ1dGVDb25maWd9KSxcbiAgICAgICAgICBuYW1lOiBhdHRyaWJ1dGVOYW1lXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhdHRyaWJ1dGVEZWZpbml0aW9uc1xuICAgIH1cblxuICAgIGlmICghYXR0cmlidXRlcyB8fCB0eXBlb2YgYXR0cmlidXRlcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAnYXR0cmlidXRlcycgYXMgYXJyYXkgb3Igb2JqZWN0IGJ1dCBnb3Q6ICR7YXR0cmlidXRlc31gKVxuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZURlZmluaXRpb25zID0gW11cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKSkge1xuICAgICAgY29uc3QgYXR0cmlidXRlQ29uZmlnID0gYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXVxuICAgICAgY29uc3QgY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZyA9IGF0dHJpYnV0ZUNvbmZpZyAmJiB0eXBlb2YgYXR0cmlidXRlQ29uZmlnID09PSBcIm9iamVjdFwiXG4gICAgICAgID8gLyoqIEB0eXBlIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ30gKi8gKGF0dHJpYnV0ZUNvbmZpZylcbiAgICAgICAgOiBudWxsXG4gICAgICBjb25zdCBub3JtYWxpemVkQXR0cmlidXRlQ29uZmlnID0gYXdhaXQgdGhpcy5yZXNvbHZlZEZyb250ZW5kQXR0cmlidXRlQ29uZmlnKHtcbiAgICAgICAgYXR0cmlidXRlTmFtZSxcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnLFxuICAgICAgICBtb2RlbENsYXNzLFxuICAgICAgICByZXNvdXJjZUNsYXNzXG4gICAgICB9KVxuICAgICAgY29uc3QgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgPSB0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yR2VuZXJhdGVkQXR0cmlidXRlKHtcbiAgICAgICAgYXR0cmlidXRlQ29uZmlnOiBub3JtYWxpemVkQXR0cmlidXRlQ29uZmlnLFxuICAgICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICBtb2RlbENsYXNzXG4gICAgICB9KVxuXG4gICAgICBhdHRyaWJ1dGVEZWZpbml0aW9ucy5wdXNoKHtcbiAgICAgICAganNEb2NUeXBlOiB0aGlzLmpzRG9jVHlwZUZvckZyb250ZW5kQXR0cmlidXRlKHthdHRyaWJ1dGVDb25maWc6IGZyb250ZW5kQXR0cmlidXRlQ29uZmlnfSksXG4gICAgICAgIG5hbWU6IGF0dHJpYnV0ZU5hbWVcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZURlZmluaXRpb25zXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgY29uZmlnIGZvciBnZW5lcmF0ZWQgYXR0cmlidXRlLlxuICAgKiBAcGFyYW0ge3thdHRyaWJ1dGVDb25maWc6IEZyb250ZW5kQXR0cmlidXRlQ29uZmlnLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH19IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ30gLSBBdHRyaWJ1dGUgY29uZmlnIHVzZWQgZm9yIGdlbmVyYXRlZCBKU0RvYy5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yR2VuZXJhdGVkQXR0cmlidXRlKHthdHRyaWJ1dGVDb25maWcsIGF0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3N9KSB7XG4gICAgaWYgKCF0aGlzLmZyb250ZW5kQXR0cmlidXRlSXNNb2RlbFByaW1hcnlLZXkoe2F0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3N9KSkgcmV0dXJuIGF0dHJpYnV0ZUNvbmZpZ1xuICAgIGlmICh0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnSGFzTnVsbGFiaWxpdHkoYXR0cmlidXRlQ29uZmlnKSkgcmV0dXJuIGF0dHJpYnV0ZUNvbmZpZ1xuXG4gICAgcmV0dXJuIHsuLi5hdHRyaWJ1dGVDb25maWcsIG51bGw6IGZhbHNlfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGlzIG1vZGVsIHByaW1hcnkga2V5LlxuICAgKiBAcGFyYW0ge3thdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH19IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyB0aGUgbW9kZWwgcHJpbWFyeSBrZXkuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUlzTW9kZWxQcmltYXJ5S2V5KHthdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzfSkge1xuICAgIGlmICghbW9kZWxDbGFzcykgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBwcmltYXJ5S2V5ID0gbW9kZWxDbGFzcy5wcmltYXJ5S2V5KClcblxuICAgIGlmICh0eXBlb2YgcHJpbWFyeUtleSAhPSBcInN0cmluZ1wiIHx8IHByaW1hcnlLZXkubGVuZ3RoIDwgMSkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWUgPT09IHByaW1hcnlLZXkpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gbW9kZWxDbGFzcy5yZXNvbHZlQXR0cmlidXRlTmFtZShwcmltYXJ5S2V5KSA9PT0gYXR0cmlidXRlTmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBwcmltYXJ5IGtleSBmcm9tIGV4cGxpY2l0IHJlc291cmNlIGNvbmZpZyBvciB0aGUgYmFja2VuZCBtb2RlbC5cbiAgICogQHBhcmFtIHt7YXR0cmlidXRlTmFtZXM6IEFycmF5PHN0cmluZz4sIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZCwgbW9kZWxDb25maWc6IGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259fSBhcmdzIC0gUHJpbWFyeSBrZXkgcmVzb2x1dGlvbiBhcmdzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nPn0gLSBGcm9udGVuZC1tb2RlbCBwcmltYXJ5IGtleSBhdHRyaWJ1dGUgbmFtZS5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxQcmltYXJ5S2V5Rm9yUmVzb3VyY2Uoe2F0dHJpYnV0ZU5hbWVzLCBtb2RlbENsYXNzLCBtb2RlbENvbmZpZ30pIHtcbiAgICBpZiAobW9kZWxDb25maWcucHJpbWFyeUtleSkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVkQ29uZmlndXJlZFByaW1hcnlLZXkoe2F0dHJpYnV0ZU5hbWVzLCBwcmltYXJ5S2V5OiBtb2RlbENvbmZpZy5wcmltYXJ5S2V5fSlcbiAgICB9XG5cbiAgICBpZiAoIW1vZGVsQ2xhc3MpIHJldHVybiBcImlkXCJcblxuICAgIHJldHVybiB0aGlzLmZyb250ZW5kTW9kZWxQcmltYXJ5S2V5Rm9yTW9kZWxDbGFzcyh7YXR0cmlidXRlTmFtZXMsIG1vZGVsQ2xhc3N9KVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhbiBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgZnJvbnRlbmQtbW9kZWwgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7e2F0dHJpYnV0ZU5hbWVzOiBBcnJheTxzdHJpbmc+LCBwcmltYXJ5S2V5OiBzdHJpbmd9fSBhcmdzIC0gQ29uZmlndXJlZCBwcmltYXJ5IGtleSBhcmdzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIENvbmZpZ3VyZWQgcHJpbWFyeSBrZXkuXG4gICAqL1xuICB2YWxpZGF0ZWRDb25maWd1cmVkUHJpbWFyeUtleSh7YXR0cmlidXRlTmFtZXMsIHByaW1hcnlLZXl9KSB7XG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVzLmluY2x1ZGVzKHByaW1hcnlLZXkpKSByZXR1cm4gcHJpbWFyeUtleVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb25maWd1cmVkIGZyb250ZW5kIG1vZGVsIHByaW1hcnkga2V5IFwiJHtwcmltYXJ5S2V5fVwiIGlzIG5vdCBhIGdlbmVyYXRlZCBmcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUuYClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgYmFja2VuZCBwcmltYXJ5IGtleSB0byBnZW5lcmF0ZWQgZnJvbnRlbmQtbW9kZWwgYXR0cmlidXRlIG5hbWVzLlxuICAgKiBAcGFyYW0ge3thdHRyaWJ1dGVOYW1lczogQXJyYXk8c3RyaW5nPiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fX0gYXJncyAtIFByaW1hcnkga2V5IHJlc29sdXRpb24gYXJncy5cbiAgICogQHJldHVybnMge3N0cmluZyB8IEFycmF5PHN0cmluZz59IC0gRnJvbnRlbmQtbW9kZWwgcHJpbWFyeSBrZXkgYXR0cmlidXRlIG5hbWUuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsUHJpbWFyeUtleUZvck1vZGVsQ2xhc3Moe2F0dHJpYnV0ZU5hbWVzLCBtb2RlbENsYXNzfSkge1xuICAgIGNvbnN0IHByaW1hcnlLZXkgPSBtb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuXG4gICAgaWYgKHByaW1hcnlLZXkgPT09IFwiaWRcIikgcmV0dXJuIFwiaWRcIlxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJpbWFyeUtleSkpIHtcbiAgICAgIHJldHVybiBwcmltYXJ5S2V5Lm1hcCgoY29sdW1uTmFtZSkgPT4gdGhpcy5mcm9udGVuZE1vZGVsUHJpbWFyeUtleUF0dHJpYnV0ZU5hbWUoe2F0dHJpYnV0ZU5hbWVzLCBjb2x1bW5OYW1lLCBtb2RlbENsYXNzfSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbFByaW1hcnlLZXlBdHRyaWJ1dGVOYW1lKHthdHRyaWJ1dGVOYW1lcywgY29sdW1uTmFtZTogcHJpbWFyeUtleSwgbW9kZWxDbGFzc30pXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIGJhY2tlbmQgcHJpbWFyeSBrZXkgY29sdW1uIHRvIGEgZ2VuZXJhdGVkIGZyb250ZW5kLW1vZGVsIGF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcGFyYW0ge3thdHRyaWJ1dGVOYW1lczogQXJyYXk8c3RyaW5nPiwgY29sdW1uTmFtZTogc3RyaW5nLCBtb2RlbENsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9fSBhcmdzIC0gUHJpbWFyeSBrZXkgYXJncy5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBGcm9udGVuZC1tb2RlbCBwcmltYXJ5IGtleSBhdHRyaWJ1dGUgbmFtZS5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxQcmltYXJ5S2V5QXR0cmlidXRlTmFtZSh7YXR0cmlidXRlTmFtZXMsIGNvbHVtbk5hbWUsIG1vZGVsQ2xhc3N9KSB7XG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVzLmluY2x1ZGVzKGNvbHVtbk5hbWUpKSByZXR1cm4gY29sdW1uTmFtZVxuXG4gICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IG1vZGVsQ2xhc3MucmVzb2x2ZUF0dHJpYnV0ZU5hbWUoY29sdW1uTmFtZSlcblxuICAgIGlmIChhdHRyaWJ1dGVOYW1lICYmIGF0dHJpYnV0ZU5hbWVzLmluY2x1ZGVzKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICByZXR1cm4gYXR0cmlidXRlTmFtZVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbENsYXNzLm5hbWV9LnByaW1hcnlLZXkoKSBjb2x1bW4gXCIke2NvbHVtbk5hbWV9XCIgZG9lcyBub3QgcmVzb2x2ZSB0byBhIGdlbmVyYXRlZCBmcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUuYClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBmcm9udGVuZCBhdHRyaWJ1dGUgY29uZmlnIGZyb20gZXhwbGljaXQgbWV0YWRhdGEsIHJlc291cmNlIG1ldGhvZHMsIG1vZGVsIGNvbHVtbnMsIHRyYW5zbGF0ZWQgY29sdW1ucywgb3IgbW9kZWwgYWNjZXNzb3IgSlNEb2MuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdHRyaWJ1dGVOYW1lIC0gRnJvbnRlbmQgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIEZyb250ZW5kIG1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsfSBhcmdzLmNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWcgLSBSZXNvdXJjZS1wcm92aWRlZCBhdHRyaWJ1dGUgY29uZmlnLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYXJncy5tb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGwgfCB1bmRlZmluZWR9IGFyZ3MucmVzb3VyY2VDbGFzcyAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZz59IC0gUmVzb2x2ZWQgZnJvbnRlbmQgYXR0cmlidXRlIGNvbmZpZy5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVkRnJvbnRlbmRBdHRyaWJ1dGVDb25maWcoe2F0dHJpYnV0ZU5hbWUsIGNsYXNzTmFtZSwgY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZywgbW9kZWxDbGFzcywgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBjb25zdCBpbmZlcnJlZFJlc291cmNlQ29uZmlnID0gYXdhaXQgdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0ZvclJlc291cmNlQXR0cmlidXRlKHthdHRyaWJ1dGVOYW1lLCByZXNvdXJjZUNsYXNzfSlcbiAgICBjb25zdCBpbmZlcnJlZENvbHVtbkNvbmZpZyA9IGluZmVycmVkUmVzb3VyY2VDb25maWdcbiAgICAgID8gbnVsbFxuICAgICAgOiB0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yTW9kZWxBdHRyaWJ1dGUoe2F0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3N9KVxuICAgIGNvbnN0IGluZmVycmVkVHJhbnNsYXRlZENvbmZpZyA9IGluZmVycmVkUmVzb3VyY2VDb25maWcgfHwgaW5mZXJyZWRDb2x1bW5Db25maWdcbiAgICAgID8gbnVsbFxuICAgICAgOiB0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yVHJhbnNsYXRlZEF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzcywgcmVzb3VyY2VDbGFzc30pXG4gICAgY29uc3QgaW5mZXJyZWRNb2RlbEFjY2Vzc29yQ29uZmlnID0gaW5mZXJyZWRSZXNvdXJjZUNvbmZpZyB8fCBpbmZlcnJlZENvbHVtbkNvbmZpZyB8fCBpbmZlcnJlZFRyYW5zbGF0ZWRDb25maWdcbiAgICAgID8gbnVsbFxuICAgICAgOiBhd2FpdCB0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yTW9kZWxBY2Nlc3Nvcih7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pXG4gICAgY29uc3QgaW5mZXJyZWRDb25maWcgPSBpbmZlcnJlZFJlc291cmNlQ29uZmlnIHx8IGluZmVycmVkQ29sdW1uQ29uZmlnIHx8IGluZmVycmVkVHJhbnNsYXRlZENvbmZpZyB8fCBpbmZlcnJlZE1vZGVsQWNjZXNzb3JDb25maWdcblxuICAgIGlmIChjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnICYmIHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdIYXNUeXBlKGNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWcpKSB7XG4gICAgICByZXR1cm4gaW5mZXJyZWRDb25maWdcbiAgICAgICAgPyB7Li4uaW5mZXJyZWRDb25maWcsIC4uLmNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWd9XG4gICAgICAgIDogY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZ1xuICAgIH1cblxuICAgIGlmIChpbmZlcnJlZENvbmZpZykge1xuICAgICAgcmV0dXJuIGNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWdcbiAgICAgICAgPyB7Li4uaW5mZXJyZWRDb25maWcsIC4uLmNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWd9XG4gICAgICAgIDogaW5mZXJyZWRDb25maWdcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBpbmZlciBKU0RvYyB0eXBlIGZvciBmcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgJyR7Y2xhc3NOYW1lfSMke2F0dHJpYnV0ZU5hbWV9Jy4gQWRkIGEgYmFja2VuZCBtb2RlbCBjb2x1bW4sIHRyYW5zbGF0aW9uIHRhYmxlIGNvbHVtbiwgZXhwbGljaXQgcmVzb3VyY2UgbWV0YWRhdGEsIG9yIGEgQHJldHVybnMgSlNEb2MgdHlwZSBvbiAke3Jlc291cmNlQ2xhc3M/Lm5hbWUgfHwgXCJ0aGUgcmVzb3VyY2VcIn0uJHthdHRyaWJ1dGVOYW1lfUF0dHJpYnV0ZSgpLmApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgY29uZmlnIGhhcyB0eXBlLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXR0cmlidXRlQ29uZmlnIC0gQXR0cmlidXRlIGNvbmZpZy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgY29uZmlnIGRlY2xhcmVzIGEgdHlwZSBzb3VyY2UuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0hhc1R5cGUoYXR0cmlidXRlQ29uZmlnKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLmZyb250ZW5kQXR0cmlidXRlVHlwZVZhbHVlKGF0dHJpYnV0ZUNvbmZpZykgPT0gXCJzdHJpbmdcIlxuICAgICAgfHwgdHlwZW9mIGF0dHJpYnV0ZUNvbmZpZz8uanNEb2NUeXBlID09IFwic3RyaW5nXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgaGFzIG51bGxhYmlsaXR5LlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXR0cmlidXRlQ29uZmlnIC0gQXR0cmlidXRlIGNvbmZpZy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgY29uZmlnIGRlY2xhcmVzIG51bGxhYmlsaXR5LlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdIYXNOdWxsYWJpbGl0eShhdHRyaWJ1dGVDb25maWcpIHtcbiAgICBpZiAoIWF0dHJpYnV0ZUNvbmZpZyB8fCB0eXBlb2YgYXR0cmlidXRlQ29uZmlnICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGF0dHJpYnV0ZUNvbmZpZywgXCJudWxsXCIpKSByZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIHR5cGVvZiBhdHRyaWJ1dGVDb25maWcuZ2V0TnVsbCA9PSBcImZ1bmN0aW9uXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGpzIGRvYyB0eXBlIGZvciBmcm9udGVuZCBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5hdHRyaWJ1dGVDb25maWcgLSBBdHRyaWJ1dGUgY29uZmlndXJhdGlvbiB2YWx1ZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBKU0RvYyB0eXBlLlxuICAgKi9cbiAganNEb2NUeXBlRm9yRnJvbnRlbmRBdHRyaWJ1dGUoe2F0dHJpYnV0ZUNvbmZpZ30pIHtcbiAgICBpZiAoYXR0cmlidXRlQ29uZmlnICYmIHR5cGVvZiBhdHRyaWJ1dGVDb25maWcuanNEb2NUeXBlID09IFwic3RyaW5nXCIgJiYgYXR0cmlidXRlQ29uZmlnLmpzRG9jVHlwZS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYXR0cmlidXRlQ29uZmlnLmpzRG9jVHlwZVxuICAgIH1cblxuICAgIGNvbnN0IGpzRG9jVHlwZSA9IHRoaXMuanNEb2NUeXBlRm9yRnJvbnRlbmRBdHRyaWJ1dGVCYXNlVHlwZShhdHRyaWJ1dGVDb25maWcpXG5cbiAgICBpZiAoIXRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDYW5CZU51bGwoYXR0cmlidXRlQ29uZmlnKSkge1xuICAgICAgcmV0dXJuIGpzRG9jVHlwZVxuICAgIH1cblxuICAgIHJldHVybiBgJHtqc0RvY1R5cGV9IHwgbnVsbGBcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGpzIGRvYyB0eXBlIGZvciBmcm9udGVuZCBhdHRyaWJ1dGUgYmFzZSB0eXBlLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXR0cmlidXRlQ29uZmlnIC0gQXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gTm9uLW51bGxhYmxlIEpTRG9jIHR5cGUuXG4gICAqL1xuICBqc0RvY1R5cGVGb3JGcm9udGVuZEF0dHJpYnV0ZUJhc2VUeXBlKGF0dHJpYnV0ZUNvbmZpZykge1xuICAgIGlmICghYXR0cmlidXRlQ29uZmlnIHx8IHR5cGVvZiBhdHRyaWJ1dGVDb25maWcgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBcIkZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZVwiXG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVUeXBlVmFsdWUoYXR0cmlidXRlQ29uZmlnKVxuXG4gICAgaWYgKHR5cGUgPT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiBcImJvb2xlYW5cIlxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImpzb25cIiB8fCB0eXBlID09IFwianNvbmJcIikge1xuICAgICAgcmV0dXJuIFwiRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlXCJcbiAgICB9IGVsc2UgaWYgKHR5cGUgJiYgW1wiYmxvYlwiLCBcImNoYXJcIiwgXCJudmFyY2hhclwiLCBcInZhcmNoYXJcIiwgXCJ0ZXh0XCIsIFwibG9uZ3RleHRcIiwgXCJtZWRpdW10ZXh0XCIsIFwidGlueXRleHRcIiwgXCJ1dWlkXCIsIFwiY2hhcmFjdGVyIHZhcnlpbmdcIl0uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgIHJldHVybiBcInN0cmluZ1wiXG4gICAgfSBlbHNlIGlmICh0eXBlICYmIFtcImJpdFwiLCBcImJpZ2ludFwiLCBcImRlY2ltYWxcIiwgXCJkb3VibGVcIiwgXCJkb3VibGUgcHJlY2lzaW9uXCIsIFwiZmxvYXRcIiwgXCJpbnRcIiwgXCJpbnRlZ2VyXCIsIFwibnVtZXJpY1wiLCBcInJlYWxcIiwgXCJzbWFsbGludFwiLCBcInRpbnlpbnRcIl0uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgIHJldHVybiBcIm51bWJlclwiXG4gICAgfSBlbHNlIGlmICh0eXBlICYmIFtcImRhdGVcIiwgXCJkYXRldGltZVwiLCBcInRpbWVzdGFtcFwiLCBcInRpbWVzdGFtcCB3aXRob3V0IHRpbWUgem9uZVwiLCBcInRpbWVzdGFtcHR6XCJdLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICByZXR1cm4gXCJEYXRlXCJcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwiRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlXCJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgY2FuIGJlIG51bGwuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkfSBhdHRyaWJ1dGVDb25maWcgLSBBdHRyaWJ1dGUgY29uZmlndXJhdGlvbiB2YWx1ZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgYXR0cmlidXRlIGFsbG93cyBudWxsIHZhbHVlcy5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlQ2FuQmVOdWxsKGF0dHJpYnV0ZUNvbmZpZykge1xuICAgIGlmICghYXR0cmlidXRlQ29uZmlnIHx8IHR5cGVvZiBhdHRyaWJ1dGVDb25maWcgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYXR0cmlidXRlQ29uZmlnLmdldE51bGwgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gYXR0cmlidXRlQ29uZmlnLmdldE51bGwoKSA9PT0gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBhdHRyaWJ1dGVDb25maWcubnVsbCA9PT0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIHR5cGUgdmFsdWUuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkfSBhdHRyaWJ1dGVDb25maWcgLSBBdHRyaWJ1dGUgY29uZmlndXJhdGlvbiB2YWx1ZS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gTm9ybWFsaXplZCBjb2x1bW4gdHlwZS5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlVHlwZVZhbHVlKGF0dHJpYnV0ZUNvbmZpZykge1xuICAgIGlmICghYXR0cmlidXRlQ29uZmlnIHx8IHR5cGVvZiBhdHRyaWJ1dGVDb25maWcgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVDb25maWcuZ2V0VHlwZSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBTdHJpbmcoYXR0cmlidXRlQ29uZmlnLmdldFR5cGUoKSlcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlVmFsdWUgPSBhdHRyaWJ1dGVDb25maWcudHlwZSB8fCBhdHRyaWJ1dGVDb25maWcuY29sdW1uVHlwZSB8fCBhdHRyaWJ1dGVDb25maWcuc3FsVHlwZSB8fCBhdHRyaWJ1dGVDb25maWcuZGF0YVR5cGVcblxuICAgIGlmICh0eXBlb2YgdHlwZVZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHJldHVybiB0eXBlVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgZm9yIHJlc291cmNlIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZU5hbWUgLSBGcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGwgfCB1bmRlZmluZWR9IGFyZ3MucmVzb3VyY2VDbGFzcyAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGw+fSAtIEF0dHJpYnV0ZSBjb25maWcgaW5mZXJyZWQgZnJvbSByZXNvdXJjZSBtZXRob2QgSlNEb2MuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0ZvclJlc291cmNlQXR0cmlidXRlKHthdHRyaWJ1dGVOYW1lLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGlmICghcmVzb3VyY2VDbGFzcykgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBgJHthdHRyaWJ1dGVOYW1lfUF0dHJpYnV0ZWBcbiAgICBjb25zdCBvd25lckNsYXNzTmFtZSA9IHRoaXMubWV0aG9kT3duZXJDbGFzc05hbWUoe21ldGhvZE5hbWUsIHRhcmdldENsYXNzOiByZXNvdXJjZUNsYXNzfSlcblxuICAgIGlmICghb3duZXJDbGFzc05hbWUpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBqc0RvY1R5cGUgPSBhd2FpdCB0aGlzLnJlc291cmNlTWV0aG9kUmV0dXJuVHlwZSh7XG4gICAgICBtZXRob2ROYW1lLFxuICAgICAgc291cmNlQ2xhc3NOYW1lOiBvd25lckNsYXNzTmFtZVxuICAgIH0pXG5cbiAgICByZXR1cm4ganNEb2NUeXBlID8ge2pzRG9jVHlwZTogdGhpcy51bndyYXBwZWRQcm9taXNlSnNEb2NUeXBlKHtqc0RvY1R5cGV9KX0gOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgY29uZmlnIGZvciB0cmFuc2xhdGVkIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZU5hbWUgLSBGcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MubW9kZWxDbGFzcyAtIEJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsIHwgdW5kZWZpbmVkfSBhcmdzLnJlc291cmNlQ2xhc3MgLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbH0gLSBBdHRyaWJ1dGUgY29uZmlnIGluZmVycmVkIGZyb20gdHJhbnNsYXRlZCBhdHRyaWJ1dGUgY29sdW1ucy5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yVHJhbnNsYXRlZEF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzcywgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBpZiAoIW1vZGVsQ2xhc3MpIHJldHVybiBudWxsXG4gICAgaWYgKCF0aGlzLmZyb250ZW5kQXR0cmlidXRlSXNUcmFuc2xhdGVkKHthdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzLCByZXNvdXJjZUNsYXNzfSkpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBUcmFuc2xhdGlvbkNsYXNzID0gbW9kZWxDbGFzcy5nZXRUcmFuc2xhdGlvbkNsYXNzKClcbiAgICBjb25zdCBjb2x1bW5OYW1lID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICBsZXQgY29sdW1uXG5cbiAgICB0cnkge1xuICAgICAgY29sdW1uID0gVHJhbnNsYXRpb25DbGFzcy5nZXRDb2x1bW5zSGFzaCgpW2NvbHVtbk5hbWVdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XCIpIHx8IGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJ1c2VkIGJlZm9yZSBpbml0aWFsaXphdGlvblwiKSkpIHJldHVybiBudWxsXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHVtbiA/IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JDb2x1bW4oe2NvbHVtbn0pIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGlzIHRyYW5zbGF0ZWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdHRyaWJ1dGVOYW1lIC0gRnJvbnRlbmQgbW9kZWwgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBCYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5yZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGZyb250ZW5kIGF0dHJpYnV0ZSBpcyB0cmFuc2xhdGVkLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVJc1RyYW5zbGF0ZWQoe2F0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3MsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgaWYgKHJlc291cmNlQ2xhc3MpIHtcbiAgICAgIGNvbnN0IHRyYW5zbGF0ZWRBdHRyaWJ1dGVzID0gcmVzb3VyY2VDbGFzcy50cmFuc2xhdGVkQXR0cmlidXRlc1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0cmFuc2xhdGVkQXR0cmlidXRlcykgJiYgdHJhbnNsYXRlZEF0dHJpYnV0ZXMuaW5jbHVkZXMoYXR0cmlidXRlTmFtZSkpIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNsYXRpb25zID0gbW9kZWxDbGFzcy5fdHJhbnNsYXRpb25zXG5cbiAgICByZXR1cm4gQm9vbGVhbih0cmFuc2xhdGlvbnMgJiYgdHlwZW9mIHRyYW5zbGF0aW9ucyA9PSBcIm9iamVjdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0cmFuc2xhdGlvbnMsIGF0dHJpYnV0ZU5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGNvbmZpZyBmb3IgbW9kZWwgYWNjZXNzb3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdHRyaWJ1dGVOYW1lIC0gRnJvbnRlbmQgbW9kZWwgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLm1vZGVsQ2xhc3MgLSBCYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGw+fSAtIEF0dHJpYnV0ZSBjb25maWcgaW5mZXJyZWQgZnJvbSBtb2RlbCBhY2Nlc3NvciBKU0RvYy5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yTW9kZWxBY2Nlc3Nvcih7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pIHtcbiAgICBpZiAoIW1vZGVsQ2xhc3MpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBvd25lckNsYXNzTmFtZSA9IHRoaXMubWV0aG9kT3duZXJDbGFzc05hbWUoe21ldGhvZE5hbWU6IGF0dHJpYnV0ZU5hbWUsIHRhcmdldENsYXNzOiBtb2RlbENsYXNzfSlcblxuICAgIGlmICghb3duZXJDbGFzc05hbWUpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBqc0RvY1R5cGUgPSBhd2FpdCB0aGlzLnJlc291cmNlTWV0aG9kUmV0dXJuVHlwZSh7XG4gICAgICBtZXRob2ROYW1lOiBhdHRyaWJ1dGVOYW1lLFxuICAgICAgc291cmNlQ2xhc3NOYW1lOiBvd25lckNsYXNzTmFtZVxuICAgIH0pXG5cbiAgICAvLyBGcm9udGVuZCBhdHRyaWJ1dGVzIGhvbGQgdGhlIHNlcmlhbGl6ZWQgKHJlc29sdmVkKSB2YWx1ZSwgc28gYW4gYXN5bmNcbiAgICAvLyBiYWNrZW5kIGFjY2Vzc29yIHR5cGVkIGBQcm9taXNlPG51bWJlcj5gIG11c3Qgc3VyZmFjZSBhcyBgbnVtYmVyYCDigJQgdGhlXG4gICAgLy8gc2FtZSB1bndyYXBwaW5nIHRoZSByZXNvdXJjZS1tZXRob2QgaW5mZXJlbmNlIHBhdGggYXBwbGllcy5cbiAgICByZXR1cm4ganNEb2NUeXBlXG4gICAgICA/IHtqc0RvY1R5cGU6IHRoaXMuZnJvbnRlbmRSZXNvbHZhYmxlQXR0cmlidXRlSnNEb2NUeXBlKHRoaXMudW53cmFwcGVkUHJvbWlzZUpzRG9jVHlwZSh7anNEb2NUeXBlfSkpfVxuICAgICAgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQSBiYWNrZW5kIGFjY2Vzc29yJ3MgYEByZXR1cm5zYCBjYW4gcmVmZXJlbmNlIHR5cGVzIHRoYXQgZXhpc3Qgb25seSBvbiB0aGVcbiAgICogYmFja2VuZCAoZS5nLiBhIG1vZGVsLWxvY2FsIGBAdHlwZWRlZiBBZ2VudFJ1blBsYW5uaW5nQXJ0aWZhY3RgKS4gVGhlIGZyb250ZW5kXG4gICAqIG1vZGVsIGNhbid0IHJlc29sdmUgdGhvc2UsIHNvIGZhbGwgYmFjayB0byBgYW55YCByYXRoZXIgdGhhbiBlbWl0dGluZyBhblxuICAgKiB1bmRlZmluZWQgdHlwZSBuYW1lLiBUeXBlcyBidWlsdCBvbmx5IGZyb20gcHJpbWl0aXZlcyBhbmQga25vd24gZ2VuZXJpY1xuICAgKiBidWlsdGlucyBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ganNEb2NUeXBlIC0gUmVzb2x2ZWQgKFByb21pc2UtdW53cmFwcGVkKSBhdHRyaWJ1dGUgdHlwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBBIGZyb250ZW5kLXJlc29sdmFibGUgYXR0cmlidXRlIHR5cGUuXG4gICAqL1xuICBmcm9udGVuZFJlc29sdmFibGVBdHRyaWJ1dGVKc0RvY1R5cGUoanNEb2NUeXBlKSB7XG4gICAgY29uc3Qgc2FmZVR5cGVJZGVudGlmaWVycyA9IHRoaXMuZnJvbnRlbmRSZXNvbHZhYmxlVHlwZUlkZW50aWZpZXJzKClcbiAgICBjb25zdCByZWZlcmVuY2VkSWRlbnRpZmllcnMgPSBqc0RvY1R5cGUubWF0Y2goL1tBLVpdW0EtWmEtejAtOV8kXSovZykgfHwgW11cblxuICAgIGlmIChyZWZlcmVuY2VkSWRlbnRpZmllcnMuc29tZSgoaWRlbnRpZmllcikgPT4gIXNhZmVUeXBlSWRlbnRpZmllcnMuaGFzKGlkZW50aWZpZXIpKSkge1xuICAgICAgcmV0dXJuIFwiYW55XCJcbiAgICB9XG5cbiAgICByZXR1cm4ganNEb2NUeXBlXG4gIH1cblxuICAvKipcbiAgICogQ2FwaXRhbGl6ZWQgaWRlbnRpZmllcnMgYSBnZW5lcmF0ZWQgZnJvbnRlbmQgbW9kZWwgY2FuIHJlc29sdmUgb24gaXRzIG93blxuICAgKiAocHJpbWl0aXZlcyBhcmUgbG93ZXItY2FzZSBhbmQgbWF0Y2hlZCBzZXBhcmF0ZWx5KSwgc28gb25seSBmcmFtZXdvcmstb3duZWRcbiAgICogYW5kIGJ1aWx0aW4gZ2VuZXJpYyB0eXBlcyBhcmUgbGlzdGVkLlxuICAgKiBAcmV0dXJucyB7U2V0PHN0cmluZz59IC0gRnJvbnRlbmQtcmVzb2x2YWJsZSB0eXBlIGlkZW50aWZpZXJzLlxuICAgKi9cbiAgZnJvbnRlbmRSZXNvbHZhYmxlVHlwZUlkZW50aWZpZXJzKCkge1xuICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgIFwiQXJyYXlcIiwgXCJEYXRlXCIsIFwiRXhjbHVkZVwiLCBcIkV4dHJhY3RcIiwgXCJGcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWVcIiwgXCJGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWVcIixcbiAgICAgIFwiTWFwXCIsIFwiTm9uTnVsbGFibGVcIiwgXCJPbWl0XCIsIFwiUGFydGlhbFwiLCBcIlBpY2tcIiwgXCJQcm9taXNlXCIsIFwiUmVhZG9ubHlcIiwgXCJSZWFkb25seUFycmF5XCIsIFwiUmVjb3JkXCIsXG4gICAgICBcIlJlcXVpcmVkXCIsIFwiUmV0dXJuVHlwZVwiLCBcIlNldFwiXG4gICAgXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXdyaXRlcyBhIGN1c3RvbS1jb21tYW5kIHBhcmFtL3JldHVybiBKU0RvYyB0eXBlIHNvIGl0IHJlc29sdmVzIGluIHRoZSBnZW5lcmF0ZWRcbiAgICogZnJvbnRlbmQgbW9kZWw6IGVhY2ggbW9kZWwtY2xhc3MgKG9yIG90aGVyd2lzZSBub24tZnJvbnRlbmQtcmVzb2x2YWJsZSkgaWRlbnRpZmllclxuICAgKiBiZWNvbWVzIGBhbnlgIGluIHBsYWNlLCBrZWVwaW5nIHRoZSBzdXJyb3VuZGluZyBvYmplY3QgZmllbGRzIHR5cGVkLiBBIGNvbW1hbmQtcmVzdWx0XG4gICAqIGZpZWxkIGhvbGRpbmcgYSBtb2RlbCBhcnJpdmVzIGFzIGEgc2VyaWFsaXplZCB0cmFuc3BvcnQgdmFsdWUsIHNvIHRoZSBjb25zdW1lciBoeWRyYXRlc1xuICAgKiBpdCB3aXRoIGBNb2RlbC5pbnN0YW50aWF0ZUZyb21SZXNwb25zZSguLi4pYC4gVGhlIHdvcmQgYm91bmRhcnkgYXZvaWRzIG1hdGNoaW5nIHRoZVxuICAgKiBjYXBpdGFsaXplZCBtaWRkbGUgb2YgYSBjYW1lbENhc2UgcHJvcGVydHkgbmFtZSAoZS5nLiBgYWRqdXN0ZWRUb3RhbENlbnRzYCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqc0RvY1R5cGUgLSBSZXNvbHZlZCAoUHJvbWlzZS11bndyYXBwZWQpIEpTRG9jIHR5cGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQSBmcm9udGVuZC1yZXNvbHZhYmxlIEpTRG9jIHR5cGUuXG4gICAqL1xuICBmcm9udGVuZFJlc29sdmFibGVDb21tYW5kSnNEb2NUeXBlKGpzRG9jVHlwZSkge1xuICAgIGNvbnN0IHNhZmVUeXBlSWRlbnRpZmllcnMgPSB0aGlzLmZyb250ZW5kUmVzb2x2YWJsZVR5cGVJZGVudGlmaWVycygpXG5cbiAgICByZXR1cm4ganNEb2NUeXBlXG4gICAgICAvLyBBIHR5cGUgdGhhdCByZWFjaGVzIGludG8gYSBiYWNrZW5kIHNvdXJjZSBmaWxlIHZpYSBgaW1wb3J0KFwiLi4uXCIpYCAob3B0aW9uYWxseVxuICAgICAgLy8gYC5NZW1iZXJgIGFuZCBgW11gKSBjYW4ndCByZXNvbHZlIGZyb20gdGhlIGdlbmVyYXRlZCBmcm9udGVuZCBtb2RlbCBhbmQgd291bGQgdHlwZVxuICAgICAgLy8gYSBzZXJpYWxpemVkIHJlc3VsdCBhcyBhIGJhY2tlbmQgbW9kZWwgaW5zdGFuY2UsIHNvIGNvbGxhcHNlIGl0IHRvIGBhbnlgLlxuICAgICAgLnJlcGxhY2UoL2ltcG9ydFxcKFxccypbXCInXVteXCInXSpbXCInXVxccypcXCkoXFxzKlxcLlxccypbQS1aYS16XyRdW1xcdyRdKikqKFxccypcXFtcXHMqXFxdKSovZywgXCJhbnlcIilcbiAgICAgIC8vIFJlbWFpbmluZyBjYXBpdGFsaXplZCBpZGVudGlmaWVycyBhcmUgbW9kZWwgY2xhc3NlcyBvciBvdGhlcndpc2Ugbm9uLXJlc29sdmFibGVcbiAgICAgIC8vIHR5cGVzOyBkb3duZ3JhZGUgZWFjaCBpbiBwbGFjZSBzbyBzaWJsaW5nIHNjYWxhciBmaWVsZHMga2VlcCB0aGVpciByZWFsIHR5cGVzLlxuICAgICAgLnJlcGxhY2UoL1xcYltBLVpdW0EtWmEtejAtOV8kXSovZywgKGlkZW50aWZpZXIpID0+IHNhZmVUeXBlSWRlbnRpZmllcnMuaGFzKGlkZW50aWZpZXIpID8gaWRlbnRpZmllciA6IFwiYW55XCIpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBKU0RvYyBwYXJhbSBibG9jaywgcGFyYW1ldGVyIGxpc3QsIHBheWxvYWQtYXJndW1lbnQgZXhwcmVzc2lvbiwgYW5kXG4gICAqIHJldHVybiB0eXBlIGZvciBhIGN1c3RvbSBjb21tYW5kIG1ldGhvZC4gV2l0aCBkZWNsYXJlZCBgYXJnc2AgZWFjaCBiZWNvbWVzIGFcbiAgICogbmFtZWQsIHR5cGVkIHBhcmFtZXRlciBtYXBwZWQgcG9zaXRpb25hbGx5IGludG8gdGhlIGNvbW1hbmQgcGF5bG9hZDsgd2l0aG91dFxuICAgKiB0aGVtIHRoZSBtZXRob2Qgc3RheXMgdmFyaWFkaWMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHthcmdzOiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiwgcmV0dXJuVHlwZTogc3RyaW5nIHwgbnVsbH0+fSBhcmdzLmNvbW1hbmRNZXRhZGF0YSAtIFBlci1jb21tYW5kIG1ldGFkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tZXRob2ROYW1lIC0gQ29tbWFuZCBtZXRob2QgbmFtZS5cbiAgICogQHJldHVybnMge3twYXJhbURvY3M6IHN0cmluZywgcGFyYW1ldGVyczogc3RyaW5nLCBwYXlsb2FkQXJndW1lbnRzOiBzdHJpbmcsIHJldHVyblR5cGU6IHN0cmluZ319IC0gR2VuZXJhdGlvbiBwaWVjZXMuXG4gICAqL1xuICBjdXN0b21Db21tYW5kTWV0aG9kU2lnbmF0dXJlKHtjb21tYW5kTWV0YWRhdGEsIG1ldGhvZE5hbWV9KSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBjb21tYW5kTWV0YWRhdGFbbWV0aG9kTmFtZV0gfHwge2FyZ3M6IFtdLCByZXR1cm5UeXBlOiBudWxsfVxuICAgIGNvbnN0IHJldHVyblR5cGUgPSBtZXRhZGF0YS5yZXR1cm5UeXBlIHx8IFwiUmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlPlwiXG5cbiAgICBpZiAobWV0YWRhdGEuYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJOYW1lcyA9IG1ldGFkYXRhLmFyZ3MubWFwKChhcmcpID0+IGFyZy5uYW1lKVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXJhbURvY3M6IG1ldGFkYXRhLmFyZ3MubWFwKChhcmcpID0+IGAgICAqIEBwYXJhbSB7JHthcmcudHlwZX19ICR7YXJnLm5hbWV9IC0gQ29tbWFuZCBhcmd1bWVudC5cXG5gKS5qb2luKFwiXCIpLFxuICAgICAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJOYW1lcy5qb2luKFwiLCBcIiksXG4gICAgICAgIHBheWxvYWRBcmd1bWVudHM6IGBbJHtwYXJhbWV0ZXJOYW1lcy5qb2luKFwiLCBcIil9XWAsXG4gICAgICAgIHJldHVyblR5cGVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGFyYW1Eb2NzOiBcIiAgICogQHBhcmFtIHsuLi5Gcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWV9IGNvbW1hbmRBcmd1bWVudHMgLSBDdXN0b20gY29tbWFuZCBhcmd1bWVudHMuXFxuXCIsXG4gICAgICBwYXJhbWV0ZXJzOiBcIi4uLmNvbW1hbmRBcmd1bWVudHNcIixcbiAgICAgIHBheWxvYWRBcmd1bWVudHM6IFwiY29tbWFuZEFyZ3VtZW50c1wiLFxuICAgICAgcmV0dXJuVHlwZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnJpY2hlcyBjdXN0b20tY29tbWFuZCBtZXRhZGF0YSBieSBkZXJpdmluZyBhIGNvbW1hbmQncyB0eXBlZCBhcmdzIGFuZCByZXR1cm5cbiAgICogdHlwZSBmcm9tIHRoZSBiYWNrZW5kIHJlc291cmNlIG1ldGhvZCdzIGBAcGFyYW1gL2BAcmV0dXJuc2AgSlNEb2Mgd2hlbiB0aGV5IGFyZVxuICAgKiBub3QgYWxyZWFkeSBkZWNsYXJlZCBpbiBgcmVzb3VyY2VDb25maWdgLiBQcmVjZWRlbmNlOiBleHBsaWNpdCBgcmVzb3VyY2VDb25maWdgXG4gICAqIGB7YXJncywgcmV0dXJuVHlwZX1gIHdpbnMsIHRoZW4gdGhlIGRlcml2ZWQgYmFja2VuZC1tZXRob2QgSlNEb2MsIHRoZW4gdGhlIGdlbmVyaWNcbiAgICogZGVmYXVsdC4gTW9kZWwtY2xhc3MgaWRlbnRpZmllcnMgaW4gdGhlIGRlcml2ZWQgdHlwZXMgYXJlIGRvd25ncmFkZWQgdG8gYGFueWBcbiAgICogYmVjYXVzZSB0aGUgZnJvbnRlbmQgcmVjZWl2ZXMgYSBzZXJpYWxpemVkIHJlY29yZCwgbm90IGEgbW9kZWwgaW5zdGFuY2UsIHdoaWNoIHRoZVxuICAgKiBjb25zdW1lciBoeWRyYXRlcyB3aXRoIGBNb2RlbC5pbnN0YW50aWF0ZUZyb21SZXNwb25zZSguLi4pYC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywge2FyZ3M6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+LCByZXR1cm5UeXBlOiBzdHJpbmcgfCBudWxsfT59IGFyZ3MuY29tbWFuZE1ldGFkYXRhIC0gRGVjbGFyZWQgcGVyLWNvbW1hbmQgbWV0YWRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MuY29tbWFuZE5hbWVzIC0gQ29tbWFuZCBtZXRob2QgbmFtZXMgdG8gcmVzb2x2ZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGwgfCB1bmRlZmluZWR9IGFyZ3MucmVzb3VyY2VDbGFzcyAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB7YXJnczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJldHVyblR5cGU6IHN0cmluZyB8IG51bGx9Pj59IC0gRW5yaWNoZWQgbWV0YWRhdGEuXG4gICAqL1xuICBhc3luYyBjb21tYW5kTWV0YWRhdGFXaXRoUmVzb3VyY2VKc0RvYyh7Y29tbWFuZE1ldGFkYXRhLCBjb21tYW5kTmFtZXMsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgaWYgKCFyZXNvdXJjZUNsYXNzKSByZXR1cm4gY29tbWFuZE1ldGFkYXRhXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHthcmdzOiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiwgcmV0dXJuVHlwZTogc3RyaW5nIHwgbnVsbH0+fSAqL1xuICAgIGNvbnN0IGVucmljaGVkID0gey4uLmNvbW1hbmRNZXRhZGF0YX1cblxuICAgIGZvciAoY29uc3QgY29tbWFuZE5hbWUgb2YgY29tbWFuZE5hbWVzKSB7XG4gICAgICBjb25zdCBkZWNsYXJlZCA9IGNvbW1hbmRNZXRhZGF0YVtjb21tYW5kTmFtZV0gfHwge2FyZ3M6IFtdLCByZXR1cm5UeXBlOiBudWxsfVxuICAgICAgY29uc3Qgc291cmNlQ2xhc3NOYW1lID0gdGhpcy5tZXRob2RPd25lckNsYXNzTmFtZSh7bWV0aG9kTmFtZTogY29tbWFuZE5hbWUsIHRhcmdldENsYXNzOiByZXNvdXJjZUNsYXNzfSlcblxuICAgICAgaWYgKCFzb3VyY2VDbGFzc05hbWUpIHtcbiAgICAgICAgZW5yaWNoZWRbY29tbWFuZE5hbWVdID0gZGVjbGFyZWRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBsZXQgcmV0dXJuVHlwZSA9IGRlY2xhcmVkLnJldHVyblR5cGVcblxuICAgICAgaWYgKCFyZXR1cm5UeXBlKSB7XG4gICAgICAgIGNvbnN0IGpzRG9jUmV0dXJuVHlwZSA9IGF3YWl0IHRoaXMucmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlKHttZXRob2ROYW1lOiBjb21tYW5kTmFtZSwgc291cmNlQ2xhc3NOYW1lfSlcblxuICAgICAgICBpZiAoanNEb2NSZXR1cm5UeXBlKSB7XG4gICAgICAgICAgcmV0dXJuVHlwZSA9IHRoaXMuZnJvbnRlbmRSZXNvbHZhYmxlQ29tbWFuZEpzRG9jVHlwZSh0aGlzLnVud3JhcHBlZFByb21pc2VKc0RvY1R5cGUoe2pzRG9jVHlwZToganNEb2NSZXR1cm5UeXBlfSkpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGFyZ3MgPSBkZWNsYXJlZC5hcmdzXG5cbiAgICAgIGlmICghYXJncyB8fCBhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zdCBqc0RvY1BhcmFtZXRlcnMgPSBhd2FpdCB0aGlzLnJlc291cmNlTWV0aG9kUGFyYW1ldGVycyh7bWV0aG9kTmFtZTogY29tbWFuZE5hbWUsIHNvdXJjZUNsYXNzTmFtZX0pXG4gICAgICAgIC8vIFNraXAgb2JqZWN0LXByb3BlcnR5IHRhZ3MgKGBAcGFyYW0ge3N0cmluZ30gYXJncy5tZXNzYWdlYCk7IG9ubHkgdGhlXG4gICAgICAgIC8vIHRvcC1sZXZlbCBwYXJhbWV0ZXJzIG1hcCB0byBtZXRob2QgYXJndW1lbnRzLCBvdGhlcndpc2UgdGhlIHNoYXJlZFxuICAgICAgICAvLyBgQHBhcmFtIHtvYmplY3R9IGFyZ3NgICsgcHJvcGVydHkgc3R5bGUgd291bGQgZW1pdCBgbmFtZShhcmdzLCBhcmdzKWAuXG4gICAgICAgIGNvbnN0IHRvcExldmVsUGFyYW1ldGVycyA9IChqc0RvY1BhcmFtZXRlcnMgfHwgW10pLmZpbHRlcigocGFyYW1ldGVyKSA9PiB0eXBlb2YgcGFyYW1ldGVyLm5hbWUgPT09IFwic3RyaW5nXCIgJiYgIXBhcmFtZXRlci5uYW1lLmluY2x1ZGVzKFwiLlwiKSlcblxuICAgICAgICBpZiAodG9wTGV2ZWxQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhcmdzID0gdG9wTGV2ZWxQYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PiAoe1xuICAgICAgICAgICAgbmFtZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYXJhbWV0ZXIubmFtZSksXG4gICAgICAgICAgICB0eXBlOiB0aGlzLmZyb250ZW5kUmVzb2x2YWJsZUNvbW1hbmRKc0RvY1R5cGUocGFyYW1ldGVyLnR5cGUpXG4gICAgICAgICAgfSkpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZW5yaWNoZWRbY29tbWFuZE5hbWVdID0ge2FyZ3M6IGFyZ3MgfHwgW10sIHJldHVyblR5cGU6IHJldHVyblR5cGUgfHwgbnVsbH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW5yaWNoZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHVud3JhcHBlZCBwcm9taXNlIGpzIGRvYyB0eXBlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuanNEb2NUeXBlIC0gSlNEb2MgdHlwZSB0byBub3JtYWxpemUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHJlc29sdmVkIHZhbHVlIHR5cGUgZm9yIHNlcmlhbGl6ZWQgZnJvbnRlbmQgYXR0cmlidXRlcy5cbiAgICovXG4gIHVud3JhcHBlZFByb21pc2VKc0RvY1R5cGUoe2pzRG9jVHlwZX0pIHtcbiAgICBjb25zdCBwcm9taXNlUHJlZml4ID0gXCJQcm9taXNlPFwiXG5cbiAgICBpZiAoIWpzRG9jVHlwZS5zdGFydHNXaXRoKHByb21pc2VQcmVmaXgpKSByZXR1cm4ganNEb2NUeXBlXG5cbiAgICBpZiAoIWpzRG9jVHlwZS5lbmRzV2l0aChcIj5cIikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgUHJvbWlzZSBKU0RvYyB0eXBlIHRvIGVuZCB3aXRoICc+JzogJHtqc0RvY1R5cGV9YClcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZFR5cGUgPSBqc0RvY1R5cGUuc2xpY2UocHJvbWlzZVByZWZpeC5sZW5ndGgsIC0xKS50cmltKClcblxuICAgIGlmIChyZXNvbHZlZFR5cGUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBQcm9taXNlIEpTRG9jIHR5cGUgdG8gY29udGFpbiBhIHJlc29sdmVkIHR5cGU6ICR7anNEb2NUeXBlfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmVkVHlwZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbWV0aG9kIG93bmVyIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tZXRob2ROYW1lIC0gTWV0aG9kIG5hbWUuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9IGFyZ3MudGFyZ2V0Q2xhc3MgLSBUYXJnZXQgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSAtIENsYXNzIG5hbWUgdGhhdCBkZWNsYXJlcyB0aGUgbWV0aG9kLlxuICAgKi9cbiAgbWV0aG9kT3duZXJDbGFzc05hbWUoe21ldGhvZE5hbWUsIHRhcmdldENsYXNzfSkge1xuICAgIGxldCBwcm90b3R5cGUgPSB0YXJnZXRDbGFzcy5wcm90b3R5cGVcblxuICAgIHdoaWxlIChwcm90b3R5cGUgJiYgcHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvdHlwZSwgbWV0aG9kTmFtZSkpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG90eXBlLCBtZXRob2ROYW1lKVxuXG4gICAgICAgIGlmICh0eXBlb2YgZGVzY3JpcHRvcj8udmFsdWUgIT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbFxuXG4gICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IHByb3RvdHlwZS5jb25zdHJ1Y3Rvcj8ubmFtZVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3JOYW1lID09IFwic3RyaW5nXCIgJiYgY29uc3RydWN0b3JOYW1lLmxlbmd0aCA+IDApIHJldHVybiBjb25zdHJ1Y3Rvck5hbWVcblxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXNvdXJjZSBtZXRob2QgcmV0dXJuIHR5cGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tZXRob2ROYW1lIC0gTWV0aG9kIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNvdXJjZUNsYXNzTmFtZSAtIFNvdXJjZSBjbGFzcyBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsPn0gLSBKU0RvYyByZXR1cm4gdHlwZSB3aGVuIGRvY3VtZW50ZWQuXG4gICAqL1xuICBhc3luYyByZXNvdXJjZU1ldGhvZFJldHVyblR5cGUoe21ldGhvZE5hbWUsIHNvdXJjZUNsYXNzTmFtZX0pIHtcbiAgICBjb25zdCByZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzID0gYXdhaXQgdGhpcy5yZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzKClcbiAgICBjb25zdCByZXR1cm5UeXBlS2V5ID0gYCR7c291cmNlQ2xhc3NOYW1lfS4ke21ldGhvZE5hbWV9YFxuXG4gICAgaWYgKCFyZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzLmhhcyhyZXR1cm5UeXBlS2V5KSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHJldHVyblR5cGUgPSByZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzLmdldChyZXR1cm5UeXBlS2V5KVxuXG4gICAgaWYgKHR5cGVvZiByZXR1cm5UeXBlICE9IFwic3RyaW5nXCIgfHwgcmV0dXJuVHlwZS5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5vbi1lbXB0eSBKU0RvYyByZXR1cm4gdHlwZSBmb3IgJHtyZXR1cm5UeXBlS2V5fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblR5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc291cmNlIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZS5cbiAgICogQHBhcmFtIHt7bWV0aG9kTmFtZTogc3RyaW5nLCBwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCBzb3VyY2VDbGFzc05hbWU6IHN0cmluZ319IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IG51bGw+fSAtIEpTRG9jIHBhcmFtZXRlciB0eXBlIHdoZW4gZG9jdW1lbnRlZC5cbiAgICovXG4gIGFzeW5jIHJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZSh7bWV0aG9kTmFtZSwgcGFyYW1ldGVySW5kZXgsIHNvdXJjZUNsYXNzTmFtZX0pIHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gYXdhaXQgdGhpcy5yZXNvdXJjZU1ldGhvZFBhcmFtZXRlcnMoe21ldGhvZE5hbWUsIHNvdXJjZUNsYXNzTmFtZX0pXG5cbiAgICBpZiAoIXBhcmFtZXRlcnMpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJzW3BhcmFtZXRlckluZGV4XVxuXG4gICAgaWYgKHBhcmFtZXRlciA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbFxuXG4gICAgaWYgKHBhcmFtZXRlci50eXBlLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbm9uLWVtcHR5IEpTRG9jIHBhcmFtZXRlciB0eXBlIGZvciAke3NvdXJjZUNsYXNzTmFtZX0uJHttZXRob2ROYW1lfSBwYXJhbWV0ZXIgJHtwYXJhbWV0ZXJJbmRleH1gKVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbWV0ZXIudHlwZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7e21ldGhvZE5hbWU6IHN0cmluZywgc291cmNlQ2xhc3NOYW1lOiBzdHJpbmd9fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTx7bmFtZTogc3RyaW5nIHwgbnVsbCwgdHlwZTogc3RyaW5nfT4gfCBudWxsPn0gLSBKU0RvYyBwYXJhbWV0ZXJzIChuYW1lICsgdHlwZSkgd2hlbiBkb2N1bWVudGVkLlxuICAgKi9cbiAgYXN5bmMgcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJzKHttZXRob2ROYW1lLCBzb3VyY2VDbGFzc05hbWV9KSB7XG4gICAgY29uc3QgcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlcyA9IGF3YWl0IHRoaXMucmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlcygpXG4gICAgY29uc3QgcGFyYW1ldGVyVHlwZXNLZXkgPSBgJHtzb3VyY2VDbGFzc05hbWV9LiR7bWV0aG9kTmFtZX1gXG5cbiAgICBpZiAoIXJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXMuaGFzKHBhcmFtZXRlclR5cGVzS2V5KSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSByZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzLmdldChwYXJhbWV0ZXJUeXBlc0tleSlcblxuICAgIGlmICghcGFyYW1ldGVycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBKU0RvYyBwYXJhbWV0ZXJzIGZvciAke3BhcmFtZXRlclR5cGVzS2V5fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtZXRlcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc291cmNlIG1ldGhvZCByZXR1cm4gdHlwZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE1hcDxzdHJpbmcsIHN0cmluZz4+fSAtIFJlc291cmNlIG1ldGhvZCByZXR1cm4gdHlwZXMga2V5ZWQgYnkgQ2xhc3NOYW1lLm1ldGhvZE5hbWUuXG4gICAqL1xuICBhc3luYyByZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzKCkge1xuICAgIGlmICh0aGlzLl9yZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzKSByZXR1cm4gdGhpcy5fcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlc1xuXG4gICAgY29uc3Qgc291cmNlRmlsZXMgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxKc0RvY1NvdXJjZUZpbGVzKClcbiAgICBjb25zdCByZXR1cm5UeXBlcyA9IG5ldyBNYXAoKVxuXG4gICAgZm9yIChjb25zdCBzb3VyY2VGaWxlIG9mIHNvdXJjZUZpbGVzKSB7XG4gICAgICBjb25zdCBzb3VyY2VUZXh0ID0gYXdhaXQgZnMucmVhZEZpbGUoc291cmNlRmlsZSwgXCJ1dGY4XCIpXG5cbiAgICAgIHRoaXMuYWRkUmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlc0Zyb21Tb3VyY2Uoe3JldHVyblR5cGVzLCBzb3VyY2VUZXh0fSlcbiAgICB9XG5cbiAgICB0aGlzLl9yZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzID0gcmV0dXJuVHlwZXNcblxuICAgIHJldHVybiByZXR1cm5UeXBlc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlciB0eXBlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8TWFwPHN0cmluZywgQXJyYXk8e25hbWU6IHN0cmluZyB8IG51bGwsIHR5cGU6IHN0cmluZ30+Pj59IC0gUmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlcnMga2V5ZWQgYnkgQ2xhc3NOYW1lLm1ldGhvZE5hbWUuXG4gICAqL1xuICBhc3luYyByZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzKCkge1xuICAgIGlmICh0aGlzLl9yZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzKSByZXR1cm4gdGhpcy5fcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlc1xuXG4gICAgY29uc3Qgc291cmNlRmlsZXMgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxKc0RvY1NvdXJjZUZpbGVzKClcbiAgICBjb25zdCBwYXJhbWV0ZXJUeXBlcyA9IG5ldyBNYXAoKVxuXG4gICAgZm9yIChjb25zdCBzb3VyY2VGaWxlIG9mIHNvdXJjZUZpbGVzKSB7XG4gICAgICBjb25zdCBzb3VyY2VUZXh0ID0gYXdhaXQgZnMucmVhZEZpbGUoc291cmNlRmlsZSwgXCJ1dGY4XCIpXG5cbiAgICAgIHRoaXMuYWRkUmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlc0Zyb21Tb3VyY2Uoe3BhcmFtZXRlclR5cGVzLCBzb3VyY2VUZXh0fSlcbiAgICB9XG5cbiAgICB0aGlzLl9yZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzID0gcGFyYW1ldGVyVHlwZXNcblxuICAgIHJldHVybiBwYXJhbWV0ZXJUeXBlc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgSlNEb2Mgc291cmNlIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gSmF2YVNjcmlwdCBzb3VyY2UgZmlsZXMgdGhhdCBjYW4gZGVmaW5lIGZyb250ZW5kLW1vZGVsIHJlc291cmNlcyBhbmQgbW9kZWwgYWNjZXNzb3JzLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRNb2RlbEpzRG9jU291cmNlRmlsZXMoKSB7XG4gICAgY29uc3Qgc291cmNlRmlsZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBzb3VyY2VEaXJlY3Rvcnkgb2YgdGhpcy5mcm9udGVuZE1vZGVsSnNEb2NTb3VyY2VEaXJlY3RvcmllcygpKSB7XG4gICAgICBzb3VyY2VGaWxlcy5wdXNoKC4uLmF3YWl0IHRoaXMuamF2YXNjcmlwdEZpbGVzSW5EaXJlY3Rvcnkoc291cmNlRGlyZWN0b3J5KSlcbiAgICB9XG5cbiAgICByZXR1cm4gc291cmNlRmlsZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIEpTRG9jIHNvdXJjZSBkaXJlY3Rvcmllcy5cbiAgICogQHJldHVybnMge3N0cmluZ1tdfSAtIFNvdXJjZSBkaXJlY3RvcmllcyB0byBzY2FuIGZvciBnZW5lcmF0ZWQgZnJvbnRlbmQtbW9kZWwgSlNEb2MuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsSnNEb2NTb3VyY2VEaXJlY3RvcmllcygpIHtcbiAgICBjb25zdCBzb3VyY2VEaXJlY3RvcmllcyA9IG5ldyBTZXQoW3BhdGguam9pbih0aGlzLmRpcmVjdG9yeSgpLCBcInNyY1wiKV0pXG5cbiAgICBmb3IgKGNvbnN0IGJhY2tlbmRQcm9qZWN0IG9mIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldEJhY2tlbmRQcm9qZWN0cygpKSB7XG4gICAgICBpZiAodHlwZW9mIGJhY2tlbmRQcm9qZWN0LnBhdGggPT0gXCJzdHJpbmdcIiAmJiBiYWNrZW5kUHJvamVjdC5wYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc291cmNlRGlyZWN0b3JpZXMuYWRkKHBhdGguam9pbihiYWNrZW5kUHJvamVjdC5wYXRoLCBcInNyY1wiKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShzb3VyY2VEaXJlY3RvcmllcylcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHJlc291cmNlIG1ldGhvZCByZXR1cm4gdHlwZXMgZnJvbSBzb3VyY2UuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsIHN0cmluZz59IGFyZ3MucmV0dXJuVHlwZXMgLSBNdXRhYmxlIHJldHVybiB0eXBlcyBtYXAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNvdXJjZVRleHQgLSBTb3VyY2UgdGV4dC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhZGRSZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzRnJvbVNvdXJjZSh7cmV0dXJuVHlwZXMsIHNvdXJjZVRleHR9KSB7XG4gICAgY29uc3QgY2xhc3NSZWdleCA9IC9jbGFzc1xccysoW0EtWmEtel8kXVtcXHckXSopXFxzKyg/OmV4dGVuZHNcXHMrW157XSspP1xcey9nXG4gICAgbGV0IGNsYXNzTWF0Y2hcblxuICAgIHdoaWxlICgoY2xhc3NNYXRjaCA9IGNsYXNzUmVnZXguZXhlYyhzb3VyY2VUZXh0KSkpIHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGNsYXNzTWF0Y2hbMV1cbiAgICAgIGNvbnN0IGNsYXNzQm9keVN0YXJ0ID0gY2xhc3NSZWdleC5sYXN0SW5kZXhcbiAgICAgIGNvbnN0IGNsYXNzQm9keUVuZCA9IHRoaXMubWF0Y2hpbmdCcmFjZUluZGV4KHtvcGVuSW5kZXg6IGNsYXNzQm9keVN0YXJ0IC0gMSwgc291cmNlVGV4dH0pXG5cbiAgICAgIGlmIChjbGFzc0JvZHlFbmQgPT0gbnVsbCkge1xuICAgICAgICAvLyBUaGUgYnJhY2UgbWF0Y2hlciBjYW4ndCB0b2tlbml6ZSBldmVyeSBjb25zdHJ1Y3QgKGUuZy4gYSByZWdleCBsaXRlcmFsXG4gICAgICAgIC8vIHdob3NlIHF1b3RlcyBsb29rIGxpa2Ugc3RyaW5nIGRlbGltaXRlcnMpLCBzbyBpdCBjYW4gZmFpbCB0byBsb2NhdGUgYVxuICAgICAgICAvLyBjbGFzcyBib2R5LiBTa2lwIG1ldGFkYXRhIGV4dHJhY3Rpb24gZm9yIHRoYXQgY2xhc3MgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gYWJvcnRpbmcgdGhlIHdob2xlIGZyb250ZW5kLW1vZGVsIGdlbmVyYXRpb247IHJlc291cmNlcyB0aGF0IHBhcnNlXG4gICAgICAgIC8vIGNsZWFubHkgc3RpbGwgZ2V0IHRoZWlyIEpTRG9jLWRlcml2ZWQgcmV0dXJuL3BhcmFtIHR5cGVzLlxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjbGFzc0JvZHkgPSBzb3VyY2VUZXh0LnNsaWNlKGNsYXNzQm9keVN0YXJ0LCBjbGFzc0JvZHlFbmQpXG4gICAgICBjb25zdCBqc0RvY1JlZ2V4ID0gL1xcL1xcKlxcKihbXFxzXFxTXSo/KVxcKlxcLy9nXG4gICAgICBsZXQganNEb2NNYXRjaFxuXG4gICAgICB3aGlsZSAoKGpzRG9jTWF0Y2ggPSBqc0RvY1JlZ2V4LmV4ZWMoY2xhc3NCb2R5KSkpIHtcbiAgICAgICAgY29uc3Qgc291cmNlQWZ0ZXJKc0RvYyA9IGNsYXNzQm9keS5zbGljZShqc0RvY1JlZ2V4Lmxhc3RJbmRleClcbiAgICAgICAgY29uc3QgbWV0aG9kTWF0Y2ggPSBzb3VyY2VBZnRlckpzRG9jLm1hdGNoKC9eXFxzKig/OmFzeW5jXFxzKyk/KFtBLVphLXpfJF1bXFx3JF0qKVxccypcXCgvKVxuXG4gICAgICAgIGlmICghbWV0aG9kTWF0Y2gpIGNvbnRpbnVlXG5cbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IG1ldGhvZE1hdGNoWzFdXG5cbiAgICAgICAgY29uc3QgcmV0dXJuVHlwZSA9IHRoaXMuanNEb2NSZXR1cm5UeXBlKGpzRG9jTWF0Y2hbMV0pXG5cbiAgICAgICAgaWYgKHJldHVyblR5cGUpIHtcbiAgICAgICAgICByZXR1cm5UeXBlcy5zZXQoYCR7Y2xhc3NOYW1lfS4ke21ldGhvZE5hbWV9YCwgcmV0dXJuVHlwZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjbGFzc1JlZ2V4Lmxhc3RJbmRleCA9IGNsYXNzQm9keUVuZCArIDFcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyByZXNvdXJjZSBtZXRob2QgcGFyYW1ldGVyIHR5cGVzIGZyb20gc291cmNlLlxuICAgKiBAcGFyYW0ge3twYXJhbWV0ZXJUeXBlczogTWFwPHN0cmluZywgQXJyYXk8e25hbWU6IHN0cmluZyB8IG51bGwsIHR5cGU6IHN0cmluZ30+Piwgc291cmNlVGV4dDogc3RyaW5nfX0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhZGRSZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzRnJvbVNvdXJjZSh7cGFyYW1ldGVyVHlwZXMsIHNvdXJjZVRleHR9KSB7XG4gICAgY29uc3QgY2xhc3NSZWdleCA9IC9jbGFzc1xccysoW0EtWmEtel8kXVtcXHckXSopXFxzKyg/OmV4dGVuZHNcXHMrW157XSspP1xcey9nXG4gICAgbGV0IGNsYXNzTWF0Y2hcblxuICAgIHdoaWxlICgoY2xhc3NNYXRjaCA9IGNsYXNzUmVnZXguZXhlYyhzb3VyY2VUZXh0KSkpIHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGNsYXNzTWF0Y2hbMV1cbiAgICAgIGNvbnN0IGNsYXNzQm9keVN0YXJ0ID0gY2xhc3NSZWdleC5sYXN0SW5kZXhcbiAgICAgIGNvbnN0IGNsYXNzQm9keUVuZCA9IHRoaXMubWF0Y2hpbmdCcmFjZUluZGV4KHtvcGVuSW5kZXg6IGNsYXNzQm9keVN0YXJ0IC0gMSwgc291cmNlVGV4dH0pXG5cbiAgICAgIGlmIChjbGFzc0JvZHlFbmQgPT0gbnVsbCkge1xuICAgICAgICAvLyBUaGUgYnJhY2UgbWF0Y2hlciBjYW4ndCB0b2tlbml6ZSBldmVyeSBjb25zdHJ1Y3QgKGUuZy4gYSByZWdleCBsaXRlcmFsXG4gICAgICAgIC8vIHdob3NlIHF1b3RlcyBsb29rIGxpa2Ugc3RyaW5nIGRlbGltaXRlcnMpLCBzbyBpdCBjYW4gZmFpbCB0byBsb2NhdGUgYVxuICAgICAgICAvLyBjbGFzcyBib2R5LiBTa2lwIG1ldGFkYXRhIGV4dHJhY3Rpb24gZm9yIHRoYXQgY2xhc3MgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gYWJvcnRpbmcgdGhlIHdob2xlIGZyb250ZW5kLW1vZGVsIGdlbmVyYXRpb247IHJlc291cmNlcyB0aGF0IHBhcnNlXG4gICAgICAgIC8vIGNsZWFubHkgc3RpbGwgZ2V0IHRoZWlyIEpTRG9jLWRlcml2ZWQgcmV0dXJuL3BhcmFtIHR5cGVzLlxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjbGFzc0JvZHkgPSBzb3VyY2VUZXh0LnNsaWNlKGNsYXNzQm9keVN0YXJ0LCBjbGFzc0JvZHlFbmQpXG4gICAgICBjb25zdCBqc0RvY1JlZ2V4ID0gL1xcL1xcKlxcKihbXFxzXFxTXSo/KVxcKlxcLy9nXG4gICAgICBsZXQganNEb2NNYXRjaFxuXG4gICAgICB3aGlsZSAoKGpzRG9jTWF0Y2ggPSBqc0RvY1JlZ2V4LmV4ZWMoY2xhc3NCb2R5KSkpIHtcbiAgICAgICAgY29uc3Qgc291cmNlQWZ0ZXJKc0RvYyA9IGNsYXNzQm9keS5zbGljZShqc0RvY1JlZ2V4Lmxhc3RJbmRleClcbiAgICAgICAgY29uc3QgbWV0aG9kTWF0Y2ggPSBzb3VyY2VBZnRlckpzRG9jLm1hdGNoKC9eXFxzKig/OmFzeW5jXFxzKyk/KFtBLVphLXpfJF1bXFx3JF0qKVxccypcXCgvKVxuXG4gICAgICAgIGlmICghbWV0aG9kTWF0Y2gpIGNvbnRpbnVlXG5cbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IG1ldGhvZE1hdGNoWzFdXG4gICAgICAgIGNvbnN0IGpzRG9jUGFyYW1ldGVycyA9IHRoaXMuanNEb2NQYXJhbWV0ZXJzKGpzRG9jTWF0Y2hbMV0pXG5cbiAgICAgICAgaWYgKGpzRG9jUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcGFyYW1ldGVyVHlwZXMuc2V0KGAke2NsYXNzTmFtZX0uJHttZXRob2ROYW1lfWAsIGpzRG9jUGFyYW1ldGVycylcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjbGFzc1JlZ2V4Lmxhc3RJbmRleCA9IGNsYXNzQm9keUVuZCArIDFcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBqcyBkb2MgcmV0dXJuIHR5cGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqc0RvY1RleHQgLSBKU0RvYyB0ZXh0IGluc2lkZSBjb21tZW50IG1hcmtlcnMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSAtIEpTRG9jIHJldHVybiB0eXBlIHdoZW4gcHJlc2VudC5cbiAgICovXG4gIGpzRG9jUmV0dXJuVHlwZShqc0RvY1RleHQpIHtcbiAgICBjb25zdCByZXR1cm5zTWF0Y2ggPSBqc0RvY1RleHQubWF0Y2goL0ByZXR1cm5zP1xccypcXHsvKVxuXG4gICAgaWYgKCFyZXR1cm5zTWF0Y2ggfHwgcmV0dXJuc01hdGNoLmluZGV4ID09IG51bGwpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCB0eXBlT3BlbkluZGV4ID0gcmV0dXJuc01hdGNoLmluZGV4ICsgcmV0dXJuc01hdGNoWzBdLmxlbmd0aCAtIDFcbiAgICBjb25zdCB0eXBlQ2xvc2VJbmRleCA9IHRoaXMubWF0Y2hpbmdCcmFjZUluZGV4KHtvcGVuSW5kZXg6IHR5cGVPcGVuSW5kZXgsIHNvdXJjZVRleHQ6IGpzRG9jVGV4dH0pXG5cbiAgICBpZiAodHlwZUNsb3NlSW5kZXggPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcGFyc2UgSlNEb2MgcmV0dXJuIHR5cGUgZnJvbTogJHtqc0RvY1RleHR9YClcbiAgICB9XG5cbiAgICBjb25zdCByZXR1cm5UeXBlID0ganNEb2NUZXh0LnNsaWNlKHR5cGVPcGVuSW5kZXggKyAxLCB0eXBlQ2xvc2VJbmRleCkudHJpbSgpXG5cbiAgICBpZiAocmV0dXJuVHlwZS5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5vbi1lbXB0eSBKU0RvYyByZXR1cm4gdHlwZSBpbjogJHtqc0RvY1RleHR9YClcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0dXJuVHlwZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMganMgZG9jIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqc0RvY1RleHQgLSBKU0RvYyB0ZXh0IGluc2lkZSBjb21tZW50IG1hcmtlcnMuXG4gICAqIEByZXR1cm5zIHtBcnJheTx7bmFtZTogc3RyaW5nIHwgbnVsbCwgdHlwZTogc3RyaW5nfT59IC0gSlNEb2MgcGFyYW1ldGVycyAobmFtZSArIHR5cGUpIGluIGRlY2xhcmF0aW9uIG9yZGVyLlxuICAgKi9cbiAganNEb2NQYXJhbWV0ZXJzKGpzRG9jVGV4dCkge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBbXVxuICAgIGNvbnN0IHBhcmFtUmVnZXggPSAvQHBhcmFtXFxzKlxcey9nXG4gICAgbGV0IF9wYXJhbU1hdGNoXG5cbiAgICB3aGlsZSAoKF9wYXJhbU1hdGNoID0gcGFyYW1SZWdleC5leGVjKGpzRG9jVGV4dCkpKSB7XG4gICAgICBjb25zdCB0eXBlT3BlbkluZGV4ID0gcGFyYW1SZWdleC5sYXN0SW5kZXggLSAxXG4gICAgICBjb25zdCB0eXBlQ2xvc2VJbmRleCA9IHRoaXMubWF0Y2hpbmdCcmFjZUluZGV4KHtvcGVuSW5kZXg6IHR5cGVPcGVuSW5kZXgsIHNvdXJjZVRleHQ6IGpzRG9jVGV4dH0pXG5cbiAgICAgIGlmICh0eXBlQ2xvc2VJbmRleCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHBhcnNlIEpTRG9jIHBhcmFtZXRlciB0eXBlIGZyb206ICR7anNEb2NUZXh0fWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGUgPSBqc0RvY1RleHQuc2xpY2UodHlwZU9wZW5JbmRleCArIDEsIHR5cGVDbG9zZUluZGV4KS50cmltKClcblxuICAgICAgaWYgKHR5cGUubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5vbi1lbXB0eSBKU0RvYyBwYXJhbWV0ZXIgdHlwZSBpbjogJHtqc0RvY1RleHR9YClcbiAgICAgIH1cblxuICAgICAgLy8gQWZ0ZXIgdGhlIGNsb3NpbmcgYnJhY2UgdGhlIHBhcmFtZXRlciBuYW1lIGZvbGxvd3MgKG9wdGlvbmFsbHkgYnJhY2tldGVkXG4gICAgICAvLyBmb3IgYEBwYXJhbSB7dHlwZX0gW25hbWVdYCkuIENhcHR1cmUgdGhlIGxlYWRpbmcgbmFtZSB0b2tlbiDigJQgaW5jbHVkaW5nIGFueVxuICAgICAgLy8gZG90dGVkIHBhdGggc28gb2JqZWN0LXByb3BlcnR5IHRhZ3MgbGlrZSBgQHBhcmFtIHtzdHJpbmd9IGFyZ3MubWVzc2FnZWAgc3RheVxuICAgICAgLy8gZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIHRvcC1sZXZlbCBgQHBhcmFtIHtvYmplY3R9IGFyZ3NgIHBhcmFtZXRlci5cbiAgICAgIGNvbnN0IG5hbWVNYXRjaCA9IGpzRG9jVGV4dC5zbGljZSh0eXBlQ2xvc2VJbmRleCArIDEpLm1hdGNoKC9eXFxzKlxcWz9cXHMqKFtBLVphLXpfJF1bXFx3JC5dKikvKVxuXG4gICAgICBwYXJhbWV0ZXJzLnB1c2goe25hbWU6IG5hbWVNYXRjaCA/IG5hbWVNYXRjaFsxXSA6IG51bGwsIHR5cGV9KVxuICAgICAgcGFyYW1SZWdleC5sYXN0SW5kZXggPSB0eXBlQ2xvc2VJbmRleCArIDFcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1ldGVyc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgamF2YXNjcmlwdCBmaWxlcyBpbiBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkaXJlY3RvcnkgLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIEphdmFTY3JpcHQgc291cmNlIGZpbGUgcGF0aHMuXG4gICAqL1xuICBhc3luYyBqYXZhc2NyaXB0RmlsZXNJbkRpcmVjdG9yeShkaXJlY3RvcnkpIHtcbiAgICBsZXQgZW50cmllc1xuXG4gICAgdHJ5IHtcbiAgICAgIGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpcmVjdG9yeSwge3dpdGhGaWxlVHlwZXM6IHRydWV9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yID09IFwib2JqZWN0XCIgJiYgXCJjb2RlXCIgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuIFtdXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGhzID0gW11cblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3QgZW50cnlQYXRoID0gcGF0aC5qb2luKGRpcmVjdG9yeSwgZW50cnkubmFtZSlcblxuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgZmlsZVBhdGhzLnB1c2goLi4uYXdhaXQgdGhpcy5qYXZhc2NyaXB0RmlsZXNJbkRpcmVjdG9yeShlbnRyeVBhdGgpKVxuICAgICAgfSBlbHNlIGlmIChlbnRyeS5pc0ZpbGUoKSAmJiAvXFwuKG1qc3xqc3xqc3h8dHMpJC8udGVzdChlbnRyeS5uYW1lKSkge1xuICAgICAgICBmaWxlUGF0aHMucHVzaChlbnRyeVBhdGgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbGVQYXRoc1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgbWF0Y2hpbmcgY2xvc2luZyBicmFjZSB3aGlsZSByZXNwZWN0aW5nIEphdmFTY3JpcHQgc3RyaW5ncyBhbmQgY29tbWVudHMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5vcGVuSW5kZXggLSBPcGVuaW5nIGJyYWNlIGluZGV4LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zb3VyY2VUZXh0IC0gU291cmNlIHRleHQuXG4gICAqIEByZXR1cm5zIHtudW1iZXIgfCBudWxsfSAtIENsb3NpbmcgYnJhY2UgaW5kZXggd2hlbiBmb3VuZC5cbiAgICovXG4gIG1hdGNoaW5nQnJhY2VJbmRleCh7b3BlbkluZGV4LCBzb3VyY2VUZXh0fSkge1xuICAgIGlmIChzb3VyY2VUZXh0W29wZW5JbmRleF0gIT09IFwie1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG9wZW5pbmcgYnJhY2UgYXQgaW5kZXggJHtvcGVuSW5kZXh9YClcbiAgICB9XG5cbiAgICBsZXQgZGVwdGggPSAwXG4gICAgbGV0IGluQmxvY2tDb21tZW50ID0gZmFsc2VcbiAgICBsZXQgaW5MaW5lQ29tbWVudCA9IGZhbHNlXG4gICAgbGV0IGluU3RyaW5nID0gXCJcIlxuXG4gICAgZm9yIChsZXQgaW5kZXggPSBvcGVuSW5kZXg7IGluZGV4IDwgc291cmNlVGV4dC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGNoYXIgPSBzb3VyY2VUZXh0W2luZGV4XVxuICAgICAgY29uc3QgbmV4dENoYXIgPSBzb3VyY2VUZXh0W2luZGV4ICsgMV1cbiAgICAgIGNvbnN0IHByZXZpb3VzQ2hhciA9IHNvdXJjZVRleHRbaW5kZXggLSAxXVxuXG4gICAgICBpZiAoaW5MaW5lQ29tbWVudCkge1xuICAgICAgICBpZiAoY2hhciA9PT0gXCJcXG5cIikgaW5MaW5lQ29tbWVudCA9IGZhbHNlXG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGluQmxvY2tDb21tZW50KSB7XG4gICAgICAgIGlmIChjaGFyID09PSBcIipcIiAmJiBuZXh0Q2hhciA9PT0gXCIvXCIpIHtcbiAgICAgICAgICBpbkJsb2NrQ29tbWVudCA9IGZhbHNlXG4gICAgICAgICAgaW5kZXgrK1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGluU3RyaW5nKSB7XG4gICAgICAgIGlmIChjaGFyID09PSBpblN0cmluZyAmJiBwcmV2aW91c0NoYXIgIT09IFwiXFxcXFwiKSBpblN0cmluZyA9IFwiXCJcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gXCIvXCIgJiYgbmV4dENoYXIgPT09IFwiL1wiKSB7XG4gICAgICAgIGluTGluZUNvbW1lbnQgPSB0cnVlXG4gICAgICAgIGluZGV4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09IFwiL1wiICYmIG5leHRDaGFyID09PSBcIipcIikge1xuICAgICAgICBpbkJsb2NrQ29tbWVudCA9IHRydWVcbiAgICAgICAgaW5kZXgrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gXCJcXFwiXCIgfHwgY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gXCJgXCIpIHtcbiAgICAgICAgaW5TdHJpbmcgPSBjaGFyXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBcIntcIikge1xuICAgICAgICBkZXB0aCsrXG4gICAgICB9IGVsc2UgaWYgKGNoYXIgPT09IFwifVwiKSB7XG4gICAgICAgIGRlcHRoLS1cblxuICAgICAgICBpZiAoZGVwdGggPT09IDApIHJldHVybiBpbmRleFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgY29uZmlnIGZvciBtb2RlbCBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdHRyaWJ1dGVOYW1lIC0gRnJvbnRlbmQgbW9kZWwgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLm1vZGVsQ2xhc3MgLSBCYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsfSAtIEF0dHJpYnV0ZSBjb25maWcgaW5mZXJyZWQgZnJvbSB0aGUgYmFja2VuZCBtb2RlbCB3aGVuIGF2YWlsYWJsZS5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yTW9kZWxBdHRyaWJ1dGUoe2F0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3N9KSB7XG4gICAgaWYgKCFtb2RlbENsYXNzKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkQXR0cmlidXRlTmFtZSA9IG1vZGVsQ2xhc3MucmVzb2x2ZUF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlTmFtZSlcblxuICAgIGlmICghcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lKSByZXR1cm4gbnVsbFxuXG4gICAgbGV0IGNvbHVtbk5hbWVcblxuICAgIHRyeSB7XG4gICAgICBjb2x1bW5OYW1lID0gbW9kZWxDbGFzcy5nZXRBdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lTWFwKClbcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lXVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwidXNlZCBiZWZvcmUgaW5pdGlhbGl6YXRpb25cIikpIHJldHVybiBudWxsXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKCFjb2x1bW5OYW1lKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGxldCBjb2x1bW5cblxuICAgIHRyeSB7XG4gICAgICBjb2x1bW4gPSBtb2RlbENsYXNzLmdldENvbHVtbnNIYXNoKClbY29sdW1uTmFtZV1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcInVzZWQgYmVmb3JlIGluaXRpYWxpemF0aW9uXCIpKSByZXR1cm4gbnVsbFxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiBjb2x1bW4gPyB0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yQ29sdW1uKHtjb2x1bW59KSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgZm9yIGNvbHVtbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLWNvbHVtbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbHVtbiAtIERhdGFiYXNlIGNvbHVtbi5cbiAgICogQHJldHVybnMge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnfSAtIEF0dHJpYnV0ZSBjb25maWcgaW5mZXJyZWQgZnJvbSB0aGUgZGF0YWJhc2UgY29sdW1uLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JDb2x1bW4oe2NvbHVtbn0pIHtcbiAgICBjb25zdCB0eXBlID0gY29sdW1uLmdldFR5cGUoKVxuXG4gICAgaWYgKHR5cGVvZiB0eXBlICE9IFwic3RyaW5nXCIgfHwgdHlwZS5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5vbi1lbXB0eSBjb2x1bW4gdHlwZSBmb3IgZnJvbnRlbmQgbW9kZWwgYXR0cmlidXRlIGluZmVyZW5jZSwgZ290OiAke3R5cGV9YClcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbnVsbDogY29sdW1uLmdldE51bGwoKSxcbiAgICAgIHR5cGVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZWxhdGlvbnNoaXBzIGZvciBtb2RlbC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIE1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbn0gYXJncy5tb2RlbENvbmZpZyAtIE1vZGVsIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsfSBbYXJncy5yZXNvdXJjZUNsYXNzXSAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7QXJyYXk8e2F1dG9sb2FkOiBib29sZWFuLCByZWxhdGlvbnNoaXBOYW1lOiBzdHJpbmcsIHRhcmdldENsYXNzTmFtZTogc3RyaW5nLCB0YXJnZXRGaWxlTmFtZTogc3RyaW5nLCB0eXBlOiBcImJlbG9uZ3NUb1wiIHwgXCJoYXNPbmVcIiB8IFwiaGFzTWFueVwifT59IC0gUmVsYXRpb25zaGlwcy5cbiAgICovXG4gIHJlbGF0aW9uc2hpcHNGb3JNb2RlbCh7Y2xhc3NOYW1lLCBtb2RlbENvbmZpZywgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXBzID0gbW9kZWxDb25maWcucmVsYXRpb25zaGlwc1xuXG4gICAgaWYgKHJlbGF0aW9uc2hpcHMgPT09IHVuZGVmaW5lZCB8fCByZWxhdGlvbnNoaXBzID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVsYXRpb25zaGlwcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgJyR7Y2xhc3NOYW1lfScgaGFzIGludmFsaWQgcmVsYXRpb25zaGlwcyBjb25maWcg4oCUIG11c3QgYmUgYW4gYXJyYXkgb2YgcmVsYXRpb25zaGlwIG5hbWVzLCBnb3QgJHt0eXBlb2YgcmVsYXRpb25zaGlwc31gKVxuICAgIH1cblxuICAgIHJldHVybiByZWxhdGlvbnNoaXBzLm1hcCgocmVsYXRpb25zaGlwTmFtZSkgPT4gdGhpcy5pbmZlcnJlZFJlbGF0aW9uc2hpcERlZmluaXRpb24oe2NsYXNzTmFtZSwgcmVsYXRpb25zaGlwTmFtZSwgcmVzb3VyY2VDbGFzc30pKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW5mZXJyZWQgcmVsYXRpb25zaGlwIGRlZmluaXRpb24uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jbGFzc05hbWUgLSBNb2RlbCBjbGFzcyBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZWxhdGlvbnNoaXBOYW1lIC0gUmVsYXRpb25zaGlwIG5hbWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsfSBbYXJncy5yZXNvdXJjZUNsYXNzXSAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7e2F1dG9sb2FkOiBib29sZWFuLCByZWxhdGlvbnNoaXBOYW1lOiBzdHJpbmcsIHRhcmdldENsYXNzTmFtZTogc3RyaW5nLCB0YXJnZXRGaWxlTmFtZTogc3RyaW5nLCB0eXBlOiBcImJlbG9uZ3NUb1wiIHwgXCJoYXNPbmVcIiB8IFwiaGFzTWFueVwifX0gSW5mZXJyZWQgcmVsYXRpb25zaGlwIGRlZmluaXRpb24uXG4gICAqL1xuICBpbmZlcnJlZFJlbGF0aW9uc2hpcERlZmluaXRpb24oe2NsYXNzTmFtZSwgcmVsYXRpb25zaGlwTmFtZSwgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBjb25zdCBtb2RlbENsYXNzID0gcmVzb3VyY2VDbGFzcyA/IHJlc291cmNlQ2xhc3MubW9kZWxDbGFzcygpIDogdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0TW9kZWxDbGFzcyhjbGFzc05hbWUpXG5cbiAgICBjb25zdCByZWxhdGlvbnNoaXAgPSBtb2RlbENsYXNzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShyZWxhdGlvbnNoaXBOYW1lKVxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcFR5cGUgPSByZWxhdGlvbnNoaXAuZ2V0VHlwZSgpXG5cbiAgICBpZiAocmVsYXRpb25zaGlwVHlwZSAhPT0gXCJiZWxvbmdzVG9cIiAmJiByZWxhdGlvbnNoaXBUeXBlICE9PSBcImhhc09uZVwiICYmIHJlbGF0aW9uc2hpcFR5cGUgIT09IFwiaGFzTWFueVwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICcke2NsYXNzTmFtZX0nIHJlbGF0aW9uc2hpcCAnJHtyZWxhdGlvbnNoaXBOYW1lfScgaGFzIHVuc3VwcG9ydGVkIHR5cGUgJyR7cmVsYXRpb25zaGlwVHlwZX0nYClcbiAgICB9XG5cbiAgICBsZXQgdGFyZ2V0Q2xhc3NOYW1lXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHJlbGF0aW9uc2hpcC5nZXRUYXJnZXRNb2RlbENsYXNzKClcblxuICAgICAgdGFyZ2V0Q2xhc3NOYW1lID0gdGFyZ2V0TW9kZWxDbGFzcz8uZ2V0TW9kZWxOYW1lKClcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1vZGVsIGNsYXNzIG5vdCByZWdpc3RlcmVkIHlldCDigJQgZmFsbCBiYWNrIHRvIGNsYXNzTmFtZSBmcm9tIHJlbGF0aW9uc2hpcCBkZWZpbml0aW9uXG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXRDbGFzc05hbWUpIHtcbiAgICAgIHRhcmdldENsYXNzTmFtZSA9IHJlbGF0aW9uc2hpcC5jbGFzc05hbWVcblxuICAgICAgaWYgKCF0YXJnZXRDbGFzc05hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyByZWxhdGlvbnNoaXAgJyR7cmVsYXRpb25zaGlwTmFtZX0nIGhhcyBubyB0YXJnZXQgbW9kZWwgY2xhc3NgKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhdXRvbG9hZDogcmVsYXRpb25zaGlwLmdldEF1dG9sb2FkKCksXG4gICAgICByZWxhdGlvbnNoaXBOYW1lLFxuICAgICAgdGFyZ2V0Q2xhc3NOYW1lLFxuICAgICAgdGFyZ2V0RmlsZU5hbWU6IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZSh0YXJnZXRDbGFzc05hbWUpKSxcbiAgICAgIHR5cGU6IHJlbGF0aW9uc2hpcFR5cGVcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
1962
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtbW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Vudmlyb25tZW50LWhhbmRsZXJzL25vZGUvY2xpL2NvbW1hbmRzL2dlbmVyYXRlL2Zyb250ZW5kLW1vZGVscy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFdBQVcsTUFBTSxvQ0FBb0MsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDNUIsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sRUFBQyw4QkFBOEIsRUFBRSxtREFBbUQsRUFBQyxNQUFNLHNEQUFzRCxDQUFBO0FBQ3hKLE9BQU8sRUFBQyx3Q0FBd0MsRUFBRSxnREFBZ0QsRUFBQyxNQUFNLHVEQUF1RCxDQUFBO0FBRWhLOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSDs7O0dBR0c7QUFFSCxtR0FBbUc7QUFDbkcsTUFBTSxDQUFDLE9BQU8sT0FBTyx3QkFBeUIsU0FBUSxXQUFXO0lBQy9ELHlDQUF5QztJQUN6QywwQkFBMEIsR0FBRyxJQUFJLENBQUE7SUFFakMsNkVBQTZFO0lBQzdFLDZCQUE2QixHQUFHLElBQUksQ0FBQTtJQUVwQzs7O09BR0c7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBQzdDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO1FBRTFELE1BQU0sYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUE7UUFFdEMsTUFBTSxrQkFBa0IsR0FBRyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQTtRQUVoRSxJQUFJLE9BQU8sa0JBQWtCLENBQUMscUJBQXFCLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDbkUsTUFBTSxrQkFBa0IsQ0FBQyxxQkFB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QUFnQjtZQUNoQixlQUFlO1lBQ2YsY0FBYyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM1RSxJQUFJLEVBQUUsZ0JBQWdCO1NBQ3ZCLENBQUE7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFzZUNvbW1hbmQgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IHtmcm9udGVuZE1vZGVsUmVzb3VyY2VJc0J1aWx0SW4sIGZyb250ZW5kTW9kZWxSZXNvdXJjZXNXaXRoQnVpbHRJbnNGb3JCYWNrZW5kUHJvamVjdH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2Zyb250ZW5kLW1vZGVscy9idWlsdC1pbi1yZXNvdXJjZXMuanNcIlxuaW1wb3J0IHtmcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc0Zyb21EZWZpbml0aW9uLCBmcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRnJvbURlZmluaXRpb259IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9mcm9udGVuZC1tb2RlbHMvcmVzb3VyY2UtZGVmaW5pdGlvbi5qc1wiXG5cbi8qKlxuICogQXR0cmlidXRlIG1ldGFkYXRhIHVzZWQgZm9yIGdlbmVyYXRlZCBmcm9udGVuZC1tb2RlbCBKU0RvYy5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kQXR0cmlidXRlQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3R5cGVdIC0gQ29sdW1uIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbHVtblR5cGVdIC0gQ29sdW1uIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NxbFR5cGVdIC0gU1FMIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFUeXBlXSAtIERhdGEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbanNEb2NUeXBlXSAtIEV4YWN0IEpTRG9jIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gQXR0cmlidXRlIG5hbWUgd2hlbiBjb25maWd1cmVkIGFzIGFuIGFycmF5IGVudHJ5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbnVsbF0gLSBXaGV0aGVyIG51bGwgaXMgYWxsb3dlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3NlbGVjdGVkQnlEZWZhdWx0XSAtIFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyBzZWxlY3RlZCBieSBkZWZhdWx0LlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IFtnZXRUeXBlXSAtIFJldHVybnMgY29sdW1uIHR5cGUuXG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW59IFtnZXROdWxsXSAtIFJldHVybnMgd2hldGhlciBudWxsIGlzIGFsbG93ZWQuXG4gKi9cbi8qKlxuICogUGVybWl0IHNwZWMgcmV0dXJuZWQgYnkgZnJvbnRlbmQtbW9kZWwgcmVzb3VyY2VzIGR1cmluZyBnZW5lcmF0aW9uLlxuICogQHR5cGVkZWYge0FycmF5PHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIEZyb250ZW5kTW9kZWxHZW5lcmF0b3JQZXJtaXRTcGVjPj59IEZyb250ZW5kTW9kZWxHZW5lcmF0b3JQZXJtaXRTcGVjXG4gKi9cblxuLyoqIE5vZGUgQ0xJIGNvbW1hbmQgdGhhdCBnZW5lcmF0ZXMgZnJvbnRlbmQgbW9kZWwgY2xhc3NlcyBmcm9tIGJhY2tlbmQgcHJvamVjdCByZXNvdXJjZSBjb25maWcuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYkdlbmVyYXRlRnJvbnRlbmRNb2RlbHMgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7XG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgc3RyaW5nPiB8IG51bGx9ICovXG4gIF9yZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzID0gbnVsbFxuXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgQXJyYXk8e25hbWU6IHN0cmluZyB8IG51bGwsIHR5cGU6IHN0cmluZ30+PiB8IG51bGx9ICovXG4gIF9yZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzID0gbnVsbFxuXG4gIC8qKlxuICAgKiBSdW5zIGV4ZWN1dGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gZmlsZXMgYXJlIGdlbmVyYXRlZC5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpXG4gICAgY29uc3QgYmFja2VuZFByb2plY3RzID0gY29uZmlndXJhdGlvbi5nZXRCYWNrZW5kUHJvamVjdHMoKVxuXG4gICAgYXdhaXQgY29uZmlndXJhdGlvbi5pbml0aWFsaXplTW9kZWxzKClcblxuICAgIGNvbnN0IGVudmlyb25tZW50SGFuZGxlciA9IGNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnRIYW5kbGVyKClcblxuICAgIGlmICh0eXBlb2YgZW52aXJvbm1lbnRIYW5kbGVyLmF1dG9EaXNjb3ZlclJlc291cmNlcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBhd2FpdCBlbnZpcm9ubWVudEhhbmRsZXIuYXV0b0Rpc2NvdmVyUmVzb3VyY2VzKGNvbmZpZ3VyYXRpb24pXG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGJhY2tlbmRQcm9qZWN0cykgfHwgYmFja2VuZFByb2plY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gYmFja2VuZCBwcm9qZWN0cyBjb25maWd1cmVkLiBDb25maWd1cmUgJ2JhY2tlbmRQcm9qZWN0cycgaW4geW91ciBjb25maWd1cmF0aW9uIGZpcnN0XCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5zdXJlZCBkaXJlY3Rvcmllcy5cbiAgICAgKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3QgZW5zdXJlZERpcmVjdG9yaWVzID0gbmV3IFNldCgpXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVkIG1vZGVsIG5hbWVzIGJ5IGRpcmVjdG9yeS5cbiAgICAgKiBAdHlwZSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSAqL1xuICAgIGNvbnN0IGdlbmVyYXRlZE1vZGVsTmFtZXNCeURpcmVjdG9yeSA9IG5ldyBNYXAoKVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlZCBmaWxlcyBieSBkaXJlY3RvcnkuXG4gICAgICogQHR5cGUge01hcDxzdHJpbmcsIEFycmF5PHtjbGFzc05hbWU6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZ30+Pn0gKi9cbiAgICBjb25zdCBnZW5lcmF0ZWRGaWxlc0J5RGlyZWN0b3J5ID0gbmV3IE1hcCgpXG5cbiAgICBmb3IgKGNvbnN0IGJhY2tlbmRQcm9qZWN0IG9mIGJhY2tlbmRQcm9qZWN0cykge1xuICAgICAgLy8gQ2Fub25pY2FsaXplIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHNvIGVxdWl2YWxlbnQgc3BlbGxpbmdzIChhIHRyYWlsaW5nXG4gICAgICAvLyBzbGFzaCwgYC5gL2AuLmAgc2VnbWVudHMsIGR1cGxpY2F0ZSBzZXBhcmF0b3JzLCByZWxhdGl2ZSB2cyBhYnNvbHV0ZSlcbiAgICAgIC8vIHJlc29sdmUgdG8gYSBzaW5nbGUga2V5LiBPdGhlcndpc2UgdGhlIHBlci1kaXJlY3RvcnkgbWFwcyBiZWxvdyB0cmVhdFxuICAgICAgLy8gdGhlbSBhcyBkaWZmZXJlbnQgZGlyZWN0b3JpZXMsIGR1cGxpY2F0ZSBjbGFzcyBuYW1lcyBzbGlwIHBhc3QgZGV0ZWN0aW9uLFxuICAgICAgLy8gYW5kIHRoZSBzcGxpdCBidWNrZXRzIHdyaXRlIGluY29tcGxldGUgaW5kZXguanMvc2V0dXAuanMgZm9yIGZpbGVzIHRoYXRcbiAgICAgIC8vIGFjdHVhbGx5IGxhbmQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IG9uIGRpc2suXG4gICAgICBjb25zdCBmcm9udGVuZE1vZGVsc0RpciA9IHBhdGgucmVzb2x2ZSh0aGlzLmZyb250ZW5kTW9kZWxzRGlyZWN0b3J5Rm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpKVxuICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IHRoaXMuaW1wb3J0UGF0aEZvckZyb250ZW5kTW9kZWxzRGlyZWN0b3J5KGZyb250ZW5kTW9kZWxzRGlyKVxuXG4gICAgICBpZiAoIWVuc3VyZWREaXJlY3Rvcmllcy5oYXMoZnJvbnRlbmRNb2RlbHNEaXIpKSB7XG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKGZyb250ZW5kTW9kZWxzRGlyLCB7cmVjdXJzaXZlOiB0cnVlfSlcbiAgICAgICAgZW5zdXJlZERpcmVjdG9yaWVzLmFkZChmcm9udGVuZE1vZGVsc0RpcilcbiAgICAgIH1cblxuICAgICAgaWYgKCFnZW5lcmF0ZWRGaWxlc0J5RGlyZWN0b3J5Lmhhcyhmcm9udGVuZE1vZGVsc0RpcikpIHtcbiAgICAgICAgZ2VuZXJhdGVkRmlsZXNCeURpcmVjdG9yeS5zZXQoZnJvbnRlbmRNb2RlbHNEaXIsIFtdKVxuICAgICAgfVxuXG4gICAgICBpZiAoIWdlbmVyYXRlZE1vZGVsTmFtZXNCeURpcmVjdG9yeS5oYXMoZnJvbnRlbmRNb2RlbHNEaXIpKSB7XG4gICAgICAgIGdlbmVyYXRlZE1vZGVsTmFtZXNCeURpcmVjdG9yeS5zZXQoZnJvbnRlbmRNb2RlbHNEaXIsIG5ldyBTZXQoKSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2VuZXJhdGVkRmlsZXMgPSBnZW5lcmF0ZWRGaWxlc0J5RGlyZWN0b3J5LmdldChmcm9udGVuZE1vZGVsc0RpcilcbiAgICAgIGNvbnN0IGdlbmVyYXRlZE1vZGVsTmFtZXMgPSBnZW5lcmF0ZWRNb2RlbE5hbWVzQnlEaXJlY3RvcnkuZ2V0KGZyb250ZW5kTW9kZWxzRGlyKVxuXG4gICAgICBpZiAoIWdlbmVyYXRlZEZpbGVzKSB0aHJvdyBuZXcgRXJyb3IoYEdlbmVyYXRlZCBmaWxlcyBsaXN0IG1pc3NpbmcgZm9yICR7ZnJvbnRlbmRNb2RlbHNEaXJ9YClcbiAgICAgIGlmICghZ2VuZXJhdGVkTW9kZWxOYW1lcykgdGhyb3cgbmV3IEVycm9yKGBHZW5lcmF0ZWQgbW9kZWwgbmFtZXMgc2V0IG1pc3NpbmcgZm9yICR7ZnJvbnRlbmRNb2RlbHNEaXJ9YClcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMucmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpXG4gICAgICBjb25zdCBhdmFpbGFibGVGcm9udGVuZE1vZGVsQ2xhc3NOYW1lcyA9IHRoaXMuYXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMocmVzb3VyY2VzKVxuXG4gICAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3NOYW1lIGluIHJlc291cmNlcykge1xuICAgICAgICBjb25zdCBtb2RlbENvbmZpZyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbihyZXNvdXJjZXNbbW9kZWxDbGFzc05hbWVdKVxuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKG1vZGVsQ2xhc3NOYW1lLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKSlcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBgJHtpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoY2xhc3NOYW1lKSl9LmpzYFxuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGAke2Zyb250ZW5kTW9kZWxzRGlyfS8ke2ZpbGVOYW1lfWBcblxuICAgICAgICBpZiAoIW1vZGVsQ29uZmlnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZyb250ZW5kIG1vZGVsIHJlc291cmNlIGRlZmluaXRpb24gZm9yICcke2NsYXNzTmFtZX0nYClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc29sdmVkUmVzb3VyY2VDbGFzcyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzRnJvbURlZmluaXRpb24ocmVzb3VyY2VzW21vZGVsQ2xhc3NOYW1lXSlcbiAgICAgICAgLy8gQW4gYWJzdHJhY3QgYmFzZSByZXNvdXJjZSAobm8gc3RhdGljIE1vZGVsQ2xhc3Mg4oCUIGUuZy4gYW4gYXBwJ3Mgc2hhcmVkXG4gICAgICAgIC8vIGBCYXNlUmVzb3VyY2VgIHRoYXQgb3RoZXIgcmVzb3VyY2VzIGV4dGVuZCkgY2FuJ3QgYmFjayBhIGdlbmVyYXRlZFxuICAgICAgICAvLyBmcm9udGVuZCBtb2RlbC4gVHJlYXQgaXQgYXMgcmVzb3VyY2UtbGVzcyBzbyB0aGUgZ2VuZXJhdG9yIGZhbGxzIGJhY2tcbiAgICAgICAgLy8gdG8gYnktbmFtZSBtb2RlbCBsb29rdXAgKyBlbXB0eSB3cml0ZSBwYXJhbXMgaW5zdGVhZCBvZiB0aHJvd2luZyB3aGVuXG4gICAgICAgIC8vIGl0IGVhZ2VybHkgY2FsbHMgYG1vZGVsQ2xhc3MoKWAgLyBgcGVybWl0dGVkUGFyYW1zKClgIG9uIGl0LlxuICAgICAgICBjb25zdCByZXNvdXJjZUNsYXNzID0gcmVzb2x2ZWRSZXNvdXJjZUNsYXNzICYmIHJlc29sdmVkUmVzb3VyY2VDbGFzcy5Nb2RlbENsYXNzID8gcmVzb2x2ZWRSZXNvdXJjZUNsYXNzIDogbnVsbFxuXG4gICAgICAgIHRoaXMudmFsaWRhdGVNb2RlbENvbmZpZyh7YXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMsIGNsYXNzTmFtZSwgbW9kZWxDb25maWcsIHJlc291cmNlQ2xhc3N9KVxuXG4gICAgICAgIGlmIChnZW5lcmF0ZWRNb2RlbE5hbWVzLmhhcyhjbGFzc05hbWUpKSB7XG4gICAgICAgICAgaWYgKGZyb250ZW5kTW9kZWxSZXNvdXJjZUlzQnVpbHRJbih7bW9kZWxOYW1lOiBtb2RlbENsYXNzTmFtZSwgcmVzb3VyY2VEZWZpbml0aW9uOiByZXNvdXJjZXNbbW9kZWxDbGFzc05hbWVdfSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgZnJvbnRlbmQgbW9kZWwgZGVmaW5pdGlvbiBmb3IgJyR7Y2xhc3NOYW1lfSdgKVxuICAgICAgICB9XG5cbiAgICAgICAgZ2VuZXJhdGVkTW9kZWxOYW1lcy5hZGQoY2xhc3NOYW1lKVxuXG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgdGhpcy5idWlsZE1vZGVsRmlsZUNvbnRlbnQoe1xuICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICBpbXBvcnRQYXRoLFxuICAgICAgICAgIG1vZGVsQ2xhc3M6IHJlc291cmNlQ2xhc3MgPyByZXNvdXJjZUNsYXNzLm1vZGVsQ2xhc3MoKSA6IGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxDbGFzc2VzKClbY2xhc3NOYW1lXSxcbiAgICAgICAgICBtb2RlbENvbmZpZyxcbiAgICAgICAgICByZXNvdXJjZUNsYXNzXG4gICAgICAgIH0pXG5cbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVQYXRoLCBmaWxlQ29udGVudClcbiAgICAgICAgZ2VuZXJhdGVkRmlsZXMucHVzaCh7Y2xhc3NOYW1lLCBmaWxlTmFtZX0pXG5cbiAgICAgICAgY29uc29sZS5sb2coYGNyZWF0ZSBzcmMvZnJvbnRlbmQtbW9kZWxzLyR7ZmlsZU5hbWV9YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmcm9udGVuZE1vZGVsc0RpciwgZ2VuZXJhdGVkRmlsZXNdIG9mIGdlbmVyYXRlZEZpbGVzQnlEaXJlY3RvcnkpIHtcbiAgICAgIGNvbnN0IGluZGV4Q29udGVudCA9IHRoaXMuYnVpbGRJbmRleEZpbGVDb250ZW50KGdlbmVyYXRlZEZpbGVzKVxuXG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoYCR7ZnJvbnRlbmRNb2RlbHNEaXJ9L2luZGV4LmpzYCwgaW5kZXhDb250ZW50KVxuXG4gICAgICBjb25zb2xlLmxvZyhcImNyZWF0ZSBzcmMvZnJvbnRlbmQtbW9kZWxzL2luZGV4LmpzXCIpXG5cbiAgICAgIGNvbnN0IHNldHVwQ29udGVudCA9IHRoaXMuYnVpbGRTZXR1cEZpbGVDb250ZW50KGdlbmVyYXRlZEZpbGVzKVxuXG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoYCR7ZnJvbnRlbmRNb2RlbHNEaXJ9L3NldHVwLmpzYCwgc2V0dXBDb250ZW50KVxuXG4gICAgICBjb25zb2xlLmxvZyhcImNyZWF0ZSBzcmMvZnJvbnRlbmQtbW9kZWxzL3NldHVwLmpzXCIpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdmFsaWRhdGUgbW9kZWwgY29uZmlnLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gYXJncy5hdmFpbGFibGVGcm9udGVuZE1vZGVsQ2xhc3NOYW1lcyAtIEF2YWlsYWJsZSBmcm9udGVuZCBtb2RlbCBjbGFzcyBuYW1lcyBpbiBiYWNrZW5kIHByb2plY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIE1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbn0gYXJncy5tb2RlbENvbmZpZyAtIE1vZGVsIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsfSBbYXJncy5yZXNvdXJjZUNsYXNzXSAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICB2YWxpZGF0ZU1vZGVsQ29uZmlnKHthdmFpbGFibGVGcm9udGVuZE1vZGVsQ2xhc3NOYW1lcywgY2xhc3NOYW1lLCBtb2RlbENvbmZpZywgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBjb25zdCBhYmlsaXRpZXMgPSBtb2RlbENvbmZpZy5hYmlsaXRpZXNcblxuICAgIGlmICghYWJpbGl0aWVzIHx8IHR5cGVvZiBhYmlsaXRpZXMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgJyR7Y2xhc3NOYW1lfScgaXMgbWlzc2luZyByZXF1aXJlZCAnYWJpbGl0aWVzJyBjb25maWdgKVxuICAgIH1cblxuICAgIGNvbnN0IHJlYWRBY3Rpb25zID0gW1xuICAgICAge2FjdGlvbjogXCJpbmRleFwiLCBhYmlsaXR5QWN0aW9uOiBhYmlsaXRpZXMuaW5kZXh9LFxuICAgICAge2FjdGlvbjogXCJmaW5kXCIsIGFiaWxpdHlBY3Rpb246IGFiaWxpdGllcy5maW5kfVxuICAgIF1cblxuICAgIGZvciAoY29uc3Qge2FjdGlvbiwgYWJpbGl0eUFjdGlvbn0gb2YgcmVhZEFjdGlvbnMpIHtcbiAgICAgIGlmICh0eXBlb2YgYWJpbGl0eUFjdGlvbiAhPT0gXCJzdHJpbmdcIiB8fCBhYmlsaXR5QWN0aW9uLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyBpcyBtaXNzaW5nIHJlcXVpcmVkIGFiaWxpdGllcy4ke2FjdGlvbn0gY29uZmlnYClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGlvbnNoaXBzID0gbW9kZWxDb25maWcucmVsYXRpb25zaGlwc1xuXG4gICAgaWYgKHJlbGF0aW9uc2hpcHMgPT09IHVuZGVmaW5lZCkgcmV0dXJuXG5cbiAgICBjb25zdCBub3JtYWxpemVkUmVsYXRpb25zaGlwcyA9IHRoaXMucmVsYXRpb25zaGlwc0Zvck1vZGVsKHtjbGFzc05hbWUsIG1vZGVsQ29uZmlnLCByZXNvdXJjZUNsYXNzfSlcblxuICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwIG9mIG5vcm1hbGl6ZWRSZWxhdGlvbnNoaXBzKSB7XG4gICAgICBpZiAoIWF2YWlsYWJsZUZyb250ZW5kTW9kZWxDbGFzc05hbWVzLmhhcyhyZWxhdGlvbnNoaXAudGFyZ2V0Q2xhc3NOYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICcke2NsYXNzTmFtZX0nIHJlbGF0aW9uc2hpcCAnJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0nIHJlZmVyZW5jZXMgJyR7cmVsYXRpb25zaGlwLnRhcmdldENsYXNzTmFtZX0nLCBidXQgbm8gZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgZXhpc3RzIGZvciB0aGF0IHRhcmdldCBpbiB0aGlzIGJhY2tlbmQgcHJvamVjdGApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb3VyY2VzIGZvciBiYWNrZW5kIHByb2plY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5CYWNrZW5kUHJvamVjdENvbmZpZ3VyYXRpb259IGJhY2tlbmRQcm9qZWN0IC0gQmFja2VuZCBwcm9qZWN0IGNvbmZpZy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlRGVmaW5pdGlvbj59IC0gUmVzb3VyY2UgZGVmaW5pdGlvbnMga2V5ZWQgYnkgbW9kZWwgY2xhc3MgbmFtZS5cbiAgICovXG4gIHJlc291cmNlc0ZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KSB7XG4gICAgcmV0dXJuIGZyb250ZW5kTW9kZWxSZXNvdXJjZXNXaXRoQnVpbHRJbnNGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGF2YWlsYWJsZSBmcm9udGVuZCBtb2RlbCBjbGFzcyBuYW1lcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZURlZmluaXRpb24+fSByZXNvdXJjZXMgLSBSZXNvdXJjZSBjb25maWd1cmF0aW9uIGtleWVkIGJ5IG1vZGVsIG5hbWUuXG4gICAqIEByZXR1cm5zIHtTZXQ8c3RyaW5nPn0gLSBBdmFpbGFibGUgZnJvbnRlbmQgbW9kZWwgY2xhc3MgbmFtZXMuXG4gICAqL1xuICBhdmFpbGFibGVGcm9udGVuZE1vZGVsQ2xhc3NOYW1lcyhyZXNvdXJjZXMpIHtcbiAgICAvKipcbiAgICAgKiBDbGFzcyBuYW1lcy5cbiAgICAgKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCByZXNvdXJjZU1vZGVsTmFtZSBpbiByZXNvdXJjZXMpIHtcbiAgICAgIGNsYXNzTmFtZXMuYWRkKGluZmxlY3Rpb24uY2FtZWxpemUocmVzb3VyY2VNb2RlbE5hbWUucmVwbGFjZUFsbChcIi1cIiwgXCJfXCIpKSlcbiAgICB9XG5cbiAgICByZXR1cm4gY2xhc3NOYW1lc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWxzIGRpcmVjdG9yeSBmb3IgYmFja2VuZCBwcm9qZWN0LlxuICAgKiBAcGFyYW0ge3tmcm9udGVuZE1vZGVsc091dHB1dFBhdGg/OiBzdHJpbmd9fSBiYWNrZW5kUHJvamVjdCAtIEJhY2tlbmQgcHJvamVjdCBjb25maWcuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQWJzb2x1dGUgZnJvbnRlbmQgbW9kZWxzIG91dHB1dCBkaXJlY3RvcnkuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsc0RpcmVjdG9yeUZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KSB7XG4gICAgY29uc3Qgb3V0cHV0UGF0aCA9IGJhY2tlbmRQcm9qZWN0LmZyb250ZW5kTW9kZWxzT3V0cHV0UGF0aCB8fCB0aGlzLmRpcmVjdG9yeSgpXG5cbiAgICByZXR1cm4gYCR7b3V0cHV0UGF0aH0vc3JjL2Zyb250ZW5kLW1vZGVsc2BcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGltcG9ydCBwYXRoIGZvciBmcm9udGVuZCBtb2RlbHMgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbnRlbmRNb2RlbHNEaXIgLSBGcm9udGVuZCBtb2RlbHMgb3V0cHV0IGRpcmVjdG9yeS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBCYXNlIGNsYXNzIGltcG9ydCBwYXRoLlxuICAgKi9cbiAgaW1wb3J0UGF0aEZvckZyb250ZW5kTW9kZWxzRGlyZWN0b3J5KGZyb250ZW5kTW9kZWxzRGlyKSB7XG4gICAgY29uc3QgZGV2TW9kZSA9IGZyb250ZW5kTW9kZWxzRGlyLmluY2x1ZGVzKFwiL3NwZWMvZHVtbXkvc3JjL2Zyb250ZW5kLW1vZGVsc1wiKVxuXG4gICAgaWYgKGRldk1vZGUpIHtcbiAgICAgIHJldHVybiBcIi4uLy4uLy4uLy4uL3NyYy9mcm9udGVuZC1tb2RlbHMvYmFzZS5qc1wiXG4gICAgfVxuXG4gICAgcmV0dXJuIFwidmVsb2Npb3VzL2J1aWxkL3NyYy9mcm9udGVuZC1tb2RlbHMvYmFzZS5qc1wiXG4gIH1cblxuICAvKipcbiAgICogUnVucyBidWlsZCBtb2RlbCBmaWxlIGNvbnRlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gTWV0aG9kIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIE1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmltcG9ydFBhdGggLSBCYXNlIGNsYXNzIGltcG9ydCBwYXRoLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYXJncy5tb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSBhcmdzLm1vZGVsQ29uZmlnIC0gTW9kZWwgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGx9IFthcmdzLnJlc291cmNlQ2xhc3NdIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gR2VuZXJhdGVkIGZpbGUgY29udGVudC5cbiAgICovXG4gIGFzeW5jIGJ1aWxkTW9kZWxGaWxlQ29udGVudCh7Y2xhc3NOYW1lLCBpbXBvcnRQYXRoLCBtb2RlbENsYXNzLCBtb2RlbENvbmZpZywgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gYXdhaXQgdGhpcy5hdHRyaWJ1dGVEZWZpbml0aW9uc0Zvck1vZGVsKHtjbGFzc05hbWUsIG1vZGVsQ2xhc3MsIG1vZGVsQ29uZmlnLCByZXNvdXJjZUNsYXNzfSlcbiAgICBjb25zdCByZWxhdGlvbnNoaXBzID0gdGhpcy5yZWxhdGlvbnNoaXBzRm9yTW9kZWwoe2NsYXNzTmFtZSwgbW9kZWxDb25maWcsIHJlc291cmNlQ2xhc3N9KVxuICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gbW9kZWxDb25maWcuYXR0YWNobWVudHMgJiYgdHlwZW9mIG1vZGVsQ29uZmlnLmF0dGFjaG1lbnRzID09PSBcIm9iamVjdFwiXG4gICAgICA/IG1vZGVsQ29uZmlnLmF0dGFjaG1lbnRzXG4gICAgICA6IHt9XG4gICAgY29uc3QgYXR0cmlidXRlc1R5cGVOYW1lID0gYCR7Y2xhc3NOYW1lfUF0dHJpYnV0ZXNgXG4gICAgY29uc3QgY3JlYXRlQXR0cmlidXRlc1R5cGVOYW1lID0gYCR7Y2xhc3NOYW1lfUNyZWF0ZUF0dHJpYnV0ZXNgXG4gICAgY29uc3QgdXBkYXRlQXR0cmlidXRlc1R5cGVOYW1lID0gYCR7Y2xhc3NOYW1lfVVwZGF0ZUF0dHJpYnV0ZXNgXG4gICAgY29uc3QgYXR0cmlidXRlTmFtZXMgPSBhdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUubmFtZSlcbiAgICBjb25zdCBwZXJtaXR0ZWRDcmVhdGVQYXJhbXMgPSB0aGlzLnBlcm1pdHRlZFBhcmFtc0ZvckdlbmVyYXRvcihyZXNvdXJjZUNsYXNzIHx8IG51bGwsIFwiY3JlYXRlXCIpXG4gICAgY29uc3QgcGVybWl0dGVkVXBkYXRlUGFyYW1zID0gdGhpcy5wZXJtaXR0ZWRQYXJhbXNGb3JHZW5lcmF0b3IocmVzb3VyY2VDbGFzcyB8fCBudWxsLCBcInVwZGF0ZVwiKVxuICAgIGNvbnN0IG5lc3RlZFdyaXRlVHlwZXMgPSB0aGlzLm5lc3RlZFdyaXRlVHlwZXNGb3JNb2RlbCh7Y2xhc3NOYW1lLCBwZXJtaXR0ZWRQYXJhbXM6IHBlcm1pdHRlZENyZWF0ZVBhcmFtcy5jb25jYXQocGVybWl0dGVkVXBkYXRlUGFyYW1zKSwgcmVsYXRpb25zaGlwc30pXG4gICAgY29uc3QgdXNlc1RyYW5zcG9ydFZhbHVlID0gYXR0cmlidXRlcy5zb21lKChhdHRyaWJ1dGUpID0+IGF0dHJpYnV0ZS5qc0RvY1R5cGUuaW5jbHVkZXMoXCJGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWVcIikpXG4gICAgICB8fCBuZXN0ZWRXcml0ZVR5cGVzLnNvbWUoKG5lc3RlZFdyaXRlVHlwZSkgPT4gbmVzdGVkV3JpdGVUeXBlLmF0dHJpYnV0ZXMuc29tZSgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUudHlwZS5pbmNsdWRlcyhcIkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZVwiKSkpXG4gICAgY29uc3QgYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcyA9IHtcbiAgICAgIGNyZWF0ZTogbW9kZWxDb25maWcuYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcy5jcmVhdGUgfHwgXCJjcmVhdGVcIixcbiAgICAgIGluZGV4OiBtb2RlbENvbmZpZy5idWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzLmluZGV4IHx8IFwiaW5kZXhcIlxuICAgIH1cbiAgICBjb25zdCBidWlsdEluTWVtYmVyQ29tbWFuZHMgPSB7XG4gICAgICBhdHRhY2g6IG1vZGVsQ29uZmlnLmJ1aWx0SW5NZW1iZXJDb21tYW5kcy5hdHRhY2ggfHwgXCJhdHRhY2hcIixcbiAgICAgIGRlc3Ryb3k6IG1vZGVsQ29uZmlnLmJ1aWx0SW5NZW1iZXJDb21tYW5kcy5kZXN0cm95IHx8IFwiZGVzdHJveVwiLFxuICAgICAgZG93bmxvYWQ6IG1vZGVsQ29uZmlnLmJ1aWx0SW5NZW1iZXJDb21tYW5kcy5kb3dubG9hZCB8fCBcImRvd25sb2FkXCIsXG4gICAgICBmaW5kOiBtb2RlbENvbmZpZy5idWlsdEluTWVtYmVyQ29tbWFuZHMuZmluZCB8fCBcImZpbmRcIixcbiAgICAgIHVwZGF0ZTogbW9kZWxDb25maWcuYnVpbHRJbk1lbWJlckNvbW1hbmRzLnVwZGF0ZSB8fCBcInVwZGF0ZVwiLFxuICAgICAgdXJsOiBtb2RlbENvbmZpZy5idWlsdEluTWVtYmVyQ29tbWFuZHMudXJsIHx8IFwidXJsXCJcbiAgICB9XG4gICAgY29uc3QgY29sbGVjdGlvbkNvbW1hbmRzID0gbW9kZWxDb25maWcuY29sbGVjdGlvbkNvbW1hbmRzXG4gICAgY29uc3QgbWVtYmVyQ29tbWFuZHMgPSBtb2RlbENvbmZpZy5tZW1iZXJDb21tYW5kc1xuICAgIGNvbnN0IGRlY2xhcmVkQ29tbWFuZE1ldGFkYXRhID0gbW9kZWxDb25maWcuY29tbWFuZE1ldGFkYXRhIHx8IHt9XG4gICAgY29uc3QgY29tbWFuZE1ldGFkYXRhID0gYXdhaXQgdGhpcy5jb21tYW5kTWV0YWRhdGFXaXRoUmVzb3VyY2VKc0RvYyh7XG4gICAgICBjb21tYW5kTWV0YWRhdGE6IGRlY2xhcmVkQ29tbWFuZE1ldGFkYXRhLFxuICAgICAgY29tbWFuZE5hbWVzOiBbLi4uT2JqZWN0LmtleXMoY29sbGVjdGlvbkNvbW1hbmRzKSwgLi4uT2JqZWN0LmtleXMobWVtYmVyQ29tbWFuZHMpXSxcbiAgICAgIHJlc291cmNlQ2xhc3NcbiAgICB9KVxuICAgIGNvbnN0IGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNBcmVEZWZhdWx0ID0gYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcy5jcmVhdGUgPT09IFwiY3JlYXRlXCIgJiYgYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcy5pbmRleCA9PT0gXCJpbmRleFwiXG4gICAgY29uc3QgYnVpbHRJbk1lbWJlckNvbW1hbmRzQXJlRGVmYXVsdCA9IGJ1aWx0SW5NZW1iZXJDb21tYW5kcy5hdHRhY2ggPT09IFwiYXR0YWNoXCJcbiAgICAgICYmIGJ1aWx0SW5NZW1iZXJDb21tYW5kcy5kZXN0cm95ID09PSBcImRlc3Ryb3lcIlxuICAgICAgJiYgYnVpbHRJbk1lbWJlckNvbW1hbmRzLmRvd25sb2FkID09PSBcImRvd25sb2FkXCJcbiAgICAgICYmIGJ1aWx0SW5NZW1iZXJDb21tYW5kcy5maW5kID09PSBcImZpbmRcIlxuICAgICAgJiYgYnVpbHRJbk1lbWJlckNvbW1hbmRzLnVwZGF0ZSA9PT0gXCJ1cGRhdGVcIlxuICAgICAgJiYgYnVpbHRJbk1lbWJlckNvbW1hbmRzLnVybCA9PT0gXCJ1cmxcIlxuXG4gICAgbGV0IGZpbGVDb250ZW50ID0gXCJcIlxuXG4gICAgZmlsZUNvbnRlbnQgKz0gYGltcG9ydCBGcm9udGVuZE1vZGVsQmFzZSBmcm9tIFwiJHtpbXBvcnRQYXRofVwiXFxuYFxuXG4gICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiLyoqXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgICogRnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgY29uZmlnLlxcbmBcbiAgICBmaWxlQ29udGVudCArPSBgICogQHR5cGVkZWYge2ltcG9ydChcIiR7aW1wb3J0UGF0aH1cIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlnfSBGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWdcXG5gXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIgKi9cXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiLyoqXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIiAqIEZhbGxiYWNrIGF0dHJpYnV0ZSB2YWx1ZSB0eXBlIGZvciBnZW5lcmF0ZWQgZmllbGRzIHdpdGhvdXQgbmFycm93ZXIgbWV0YWRhdGEuXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgICogQHR5cGVkZWYge2ltcG9ydChcIiR7aW1wb3J0UGF0aH1cIikuRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlfSBGcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWVcXG5gXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIgKi9cXG5cIlxuICAgIGlmICh1c2VzVHJhbnNwb3J0VmFsdWUpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiLyoqXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICogVmFsdWUgc3VwcG9ydGVkIGJ5IGZyb250ZW5kLW1vZGVsIHRyYW5zcG9ydCBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24uXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBAdHlwZWRlZiB7aW1wb3J0KFwiJHtpbXBvcnRQYXRofVwiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWV9IEZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZVxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICovXFxuXCJcbiAgICB9XG4gICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiLyoqXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgICogJHthdHRyaWJ1dGVzVHlwZU5hbWV9IHR5cGUuXFxuYFxuICAgIGZpbGVDb250ZW50ICs9IGAgKiBAdHlwZWRlZiB7b2JqZWN0fSAke2F0dHJpYnV0ZXNUeXBlTmFtZX1cXG5gXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAqIEBwcm9wZXJ0eSB7JHthdHRyaWJ1dGUuanNEb2NUeXBlfX0gJHthdHRyaWJ1dGUubmFtZX0gLSBBdHRyaWJ1dGUgdmFsdWUuXFxuYFxuICAgIH1cbiAgICBmaWxlQ29udGVudCArPSBcIiAqL1xcblwiXG4gICAgZm9yIChjb25zdCBuZXN0ZWRXcml0ZVR5cGUgb2YgbmVzdGVkV3JpdGVUeXBlcykge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIvKipcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAqIEF0dHJpYnV0ZXMgYWNjZXB0ZWQgZm9yIG5lc3RlZCAke25lc3RlZFdyaXRlVHlwZS5yZWxhdGlvbnNoaXBOYW1lfSB3cml0ZXMuXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAqIEB0eXBlZGVmIHtvYmplY3R9ICR7bmVzdGVkV3JpdGVUeXBlLnR5cGVOYW1lfVxcbmBcbiAgICAgIGZvciAoY29uc3QgbmVzdGVkQXR0cmlidXRlIG9mIG5lc3RlZFdyaXRlVHlwZS5hdHRyaWJ1dGVzKSB7XG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBAcHJvcGVydHkgeyR7bmVzdGVkQXR0cmlidXRlLnR5cGV9fSBbJHtuZXN0ZWRBdHRyaWJ1dGUubmFtZX1dIC0gTmVzdGVkICR7bmVzdGVkQXR0cmlidXRlLm5hbWV9IHZhbHVlLlxcbmBcbiAgICAgIH1cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICovXFxuXCJcbiAgICB9XG4gICAgZmlsZUNvbnRlbnQgKz0gYXdhaXQgdGhpcy53cml0ZUF0dHJpYnV0ZXNUeXBlZGVmKHthdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzVHlwZU5hbWUsIG1vZGVsQ2xhc3MsIG5lc3RlZFdyaXRlVHlwZXMsIHBlcm1pdHRlZFBhcmFtczogcGVybWl0dGVkQ3JlYXRlUGFyYW1zLCByZXNvdXJjZUNsYXNzLCB0eXBlTmFtZTogY3JlYXRlQXR0cmlidXRlc1R5cGVOYW1lfSlcbiAgICBmaWxlQ29udGVudCArPSBhd2FpdCB0aGlzLndyaXRlQXR0cmlidXRlc1R5cGVkZWYoe2F0dHJpYnV0ZXMsIGF0dHJpYnV0ZXNUeXBlTmFtZSwgbW9kZWxDbGFzcywgbmVzdGVkV3JpdGVUeXBlcywgcGVybWl0dGVkUGFyYW1zOiBwZXJtaXR0ZWRVcGRhdGVQYXJhbXMsIHJlc291cmNlQ2xhc3MsIHR5cGVOYW1lOiB1cGRhdGVBdHRyaWJ1dGVzVHlwZU5hbWV9KVxuICAgIGZpbGVDb250ZW50ICs9IFwiLyoqXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgICogRnJvbnRlbmQgbW9kZWwgZm9yICR7Y2xhc3NOYW1lfS5cXG5gXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqIEBhdWdtZW50cyB7RnJvbnRlbmRNb2RlbEJhc2U8JHthdHRyaWJ1dGVzVHlwZU5hbWV9LCAke2NyZWF0ZUF0dHJpYnV0ZXNUeXBlTmFtZX0sICR7dXBkYXRlQXR0cmlidXRlc1R5cGVOYW1lfT59XFxuYFxuICAgIGZpbGVDb250ZW50ICs9IFwiICovXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgY2xhc3MgJHtjbGFzc05hbWV9IGV4dGVuZHMgRnJvbnRlbmRNb2RlbEJhc2Uge1xcbmBcbiAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd9IC0gUmVzb3VyY2UgY29uZmlnLiAqL1xcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIgIHN0YXRpYyByZXNvdXJjZUNvbmZpZygpIHtcXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiICAgIHJldHVybiB7XFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgICAgICAgbW9kZWxOYW1lOiAke0pTT04uc3RyaW5naWZ5KGNsYXNzTmFtZSl9LFxcbmBcbiAgICBpZiAoT2JqZWN0LmtleXMoYXR0YWNobWVudHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgICAgYXR0YWNobWVudHM6IHtcXG5cIlxuICAgICAgZm9yIChjb25zdCBbYXR0YWNobWVudE5hbWUsIGF0dGFjaG1lbnRDb25maWddIG9mIE9iamVjdC5lbnRyaWVzKGF0dGFjaG1lbnRzKSkge1xuICAgICAgICBjb25zdCBhdHRhY2htZW50VHlwZSA9IGF0dGFjaG1lbnRDb25maWcgJiYgdHlwZW9mIGF0dGFjaG1lbnRDb25maWcgPT09IFwib2JqZWN0XCIgJiYgYXR0YWNobWVudENvbmZpZy50eXBlID09PSBcImhhc01hbnlcIlxuICAgICAgICAgID8gXCJoYXNNYW55XCJcbiAgICAgICAgICA6IFwiaGFzT25lXCJcblxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgICAgICAke2F0dGFjaG1lbnROYW1lfToge3R5cGU6ICR7SlNPTi5zdHJpbmdpZnkoYXR0YWNobWVudFR5cGUpfX0sXFxuYFxuICAgICAgfVxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgICB9LFxcblwiXG4gICAgfVxuICAgIGZpbGVDb250ZW50ICs9IHRoaXMuZm9ybWF0dGVkQXJyYXlQcm9wZXJ0eSh7XG4gICAgICBpbmRlbnQ6IFwiICAgICAgXCIsXG4gICAgICBwcm9wZXJ0eU5hbWU6IFwiYXR0cmlidXRlc1wiLFxuICAgICAgdmFsdWVzOiBhdHRyaWJ1dGVOYW1lc1xuICAgIH0pXG4gICAgaWYgKCFidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzQXJlRGVmYXVsdCkge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gdGhpcy5mb3JtYXR0ZWRPYmplY3RQcm9wZXJ0eSh7XG4gICAgICAgIGZpbHRlckRlZmF1bHRWYWx1ZXM6IHtjcmVhdGU6IFwiY3JlYXRlXCIsIGluZGV4OiBcImluZGV4XCJ9LFxuICAgICAgICBpbmRlbnQ6IFwiICAgICAgXCIsXG4gICAgICAgIHByb3BlcnR5TmFtZTogXCJidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzXCIsXG4gICAgICAgIHZhbHVlczogYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kc1xuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKCFidWlsdEluTWVtYmVyQ29tbWFuZHNBcmVEZWZhdWx0KSB7XG4gICAgICBmaWxlQ29udGVudCArPSB0aGlzLmZvcm1hdHRlZE9iamVjdFByb3BlcnR5KHtcbiAgICAgICAgZmlsdGVyRGVmYXVsdFZhbHVlczoge1xuICAgICAgICAgIGF0dGFjaDogXCJhdHRhY2hcIixcbiAgICAgICAgICBkZXN0cm95OiBcImRlc3Ryb3lcIixcbiAgICAgICAgICBkb3dubG9hZDogXCJkb3dubG9hZFwiLFxuICAgICAgICAgIGZpbmQ6IFwiZmluZFwiLFxuICAgICAgICAgIHVwZGF0ZTogXCJ1cGRhdGVcIixcbiAgICAgICAgICB1cmw6IFwidXJsXCJcbiAgICAgICAgfSxcbiAgICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IFwiYnVpbHRJbk1lbWJlckNvbW1hbmRzXCIsXG4gICAgICAgIHZhbHVlczogYnVpbHRJbk1lbWJlckNvbW1hbmRzXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMoY29sbGVjdGlvbkNvbW1hbmRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBmaWxlQ29udGVudCArPSB0aGlzLmZvcm1hdHRlZENvbW1hbmRzUHJvcGVydHkoe1xuICAgICAgICBpbmRlbnQ6IFwiICAgICAgXCIsXG4gICAgICAgIHByb3BlcnR5TmFtZTogXCJjb2xsZWN0aW9uQ29tbWFuZHNcIixcbiAgICAgICAgdmFsdWVzOiBjb2xsZWN0aW9uQ29tbWFuZHNcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhtZW1iZXJDb21tYW5kcykubGVuZ3RoID4gMCkge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gdGhpcy5mb3JtYXR0ZWRDb21tYW5kc1Byb3BlcnR5KHtcbiAgICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IFwibWVtYmVyQ29tbWFuZHNcIixcbiAgICAgICAgdmFsdWVzOiBtZW1iZXJDb21tYW5kc1xuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3QgcHJpbWFyeUtleSA9IHRoaXMuZnJvbnRlbmRNb2RlbFByaW1hcnlLZXlGb3JSZXNvdXJjZSh7YXR0cmlidXRlTmFtZXMsIG1vZGVsQ2xhc3MsIG1vZGVsQ29uZmlnfSlcblxuICAgIGlmIChwcmltYXJ5S2V5ICE9PSBcImlkXCIpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICBwcmltYXJ5S2V5OiAke0pTT04uc3RyaW5naWZ5KHByaW1hcnlLZXkpfSxcXG5gXG4gICAgfVxuICAgIGNvbnN0IG5lc3RlZFJlbGF0aW9uc2hpcE5hbWVzID0gdGhpcy5uZXN0ZWRSZWxhdGlvbnNoaXBOYW1lc0ZvckdlbmVyYXRvcihyZXNvdXJjZUNsYXNzIHx8IG51bGwpXG4gICAgaWYgKG5lc3RlZFJlbGF0aW9uc2hpcE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgICAgbmVzdGVkQXR0cmlidXRlczoge1xcblwiXG4gICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgb2YgbmVzdGVkUmVsYXRpb25zaGlwTmFtZXMpIHtcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgICAgJHtyZWxhdGlvbnNoaXBOYW1lfToge30sXFxuYFxuICAgICAgfVxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgICB9LFxcblwiXG4gICAgfVxuICAgIGZpbGVDb250ZW50ICs9IFwiICAgIH1cXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiICB9XFxuXCJcblxuICAgIGlmIChyZWxhdGlvbnNoaXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKiogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHt0eXBlOiBcXFwiYmVsb25nc1RvXFxcIiB8IFxcXCJoYXNPbmVcXFwiIHwgXFxcImhhc01hbnlcXFwiLCBhdXRvbG9hZD86IGJvb2xlYW59Pn0gLSBSZWxhdGlvbnNoaXAgZGVmaW5pdGlvbnMuICovXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICBzdGF0aWMgcmVsYXRpb25zaGlwRGVmaW5pdGlvbnMoKSB7XFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgIHJldHVybiB7XFxuXCJcbiAgICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwIG9mIHJlbGF0aW9uc2hpcHMpIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBbYHR5cGU6ICR7SlNPTi5zdHJpbmdpZnkocmVsYXRpb25zaGlwLnR5cGUpfWBdXG5cbiAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5hdXRvbG9hZCA9PT0gZmFsc2UpIHBhcnRzLnB1c2goXCJhdXRvbG9hZDogZmFsc2VcIilcblxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgICAgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX06IHske3BhcnRzLmpvaW4oXCIsIFwiKX19LFxcbmBcbiAgICAgIH1cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgIH1cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIH1cXG5cIlxuXG4gICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAtIFJlbGF0aW9uc2hpcCBtb2RlbCBjbGFzcyBuYW1lcy4gKi9cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIHN0YXRpYyByZWxhdGlvbnNoaXBNb2RlbENsYXNzZXMoKSB7XFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgIHJldHVybiB7XFxuXCJcbiAgICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwIG9mIHJlbGF0aW9uc2hpcHMpIHtcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9OiAke0pTT04uc3RyaW5naWZ5KHJlbGF0aW9uc2hpcC50YXJnZXRDbGFzc05hbWUpfSxcXG5gXG4gICAgICB9XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICB9XFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICB9XFxuXCJcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCBjYW1lbGl6ZWRBdHRyaWJ1dGUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGF0dHJpYnV0ZS5uYW1lLCB0cnVlKVxuICAgICAgY29uc3QgY2FtZWxpemVkQXR0cmlidXRlVXBwZXIgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGF0dHJpYnV0ZS5uYW1lKVxuICAgICAgY29uc3QgYXR0cmlidXRlVHlwZSA9IGAke2F0dHJpYnV0ZXNUeXBlTmFtZX1bJHtKU09OLnN0cmluZ2lmeShhdHRyaWJ1dGUubmFtZSl9XWBcbiAgICAgIGNvbnN0IHNldHRlckF0dHJpYnV0ZVR5cGUgPSBhd2FpdCB0aGlzLmZyb250ZW5kV3JpdGVBdHRyaWJ1dGVUeXBlKHtcbiAgICAgICAgYXR0cmlidXRlLFxuICAgICAgICBhdHRyaWJ1dGVOYW1lOiBhdHRyaWJ1dGUubmFtZSxcbiAgICAgICAgYXR0cmlidXRlc1R5cGVOYW1lLFxuICAgICAgICByZXNvdXJjZUNsYXNzXG4gICAgICB9KVxuXG4gICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICAvKiogQHJldHVybnMgeyR7YXR0cmlidXRlVHlwZX19IC0gQXR0cmlidXRlIHZhbHVlLiAqL1xcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7Y2FtZWxpemVkQXR0cmlidXRlfSgpIHsgcmV0dXJuIC8qKiBAdHlwZSB7JHthdHRyaWJ1dGVUeXBlfX0gKi8gKHRoaXMucmVhZEF0dHJpYnV0ZSgke0pTT04uc3RyaW5naWZ5KGF0dHJpYnV0ZS5uYW1lKX0pKSB9XFxuYFxuXG4gICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEBwYXJhbSB7JHtzZXR0ZXJBdHRyaWJ1dGVUeXBlfX0gbmV3VmFsdWUgLSBOZXcgYXR0cmlidXRlIHZhbHVlLlxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHske3NldHRlckF0dHJpYnV0ZVR5cGV9fSAtIEFzc2lnbmVkIHZhbHVlLlxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgc2V0JHtjYW1lbGl6ZWRBdHRyaWJ1dGVVcHBlcn0obmV3VmFsdWUpIHsgcmV0dXJuIC8qKiBAdHlwZSB7JHtzZXR0ZXJBdHRyaWJ1dGVUeXBlfX0gKi8gKHRoaXMuc2V0QXR0cmlidXRlKCR7SlNPTi5zdHJpbmdpZnkoYXR0cmlidXRlLm5hbWUpfSwgbmV3VmFsdWUpKSB9XFxuYFxuICAgIH1cblxuICAgIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBPYmplY3Qua2V5cyhjb2xsZWN0aW9uQ29tbWFuZHMpKSB7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSB0aGlzLmN1c3RvbUNvbW1hbmRNZXRob2RTaWduYXR1cmUoe2NvbW1hbmRNZXRhZGF0YSwgbWV0aG9kTmFtZX0pXG5cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogUnVucyAke21ldGhvZE5hbWV9LlxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IHNpZ25hdHVyZS5wYXJhbURvY3NcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtQcm9taXNlPCR7c2lnbmF0dXJlLnJldHVyblR5cGV9Pn0gLSBDb21tYW5kIHJlc3BvbnNlLlxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgc3RhdGljIGFzeW5jICR7bWV0aG9kTmFtZX0oJHtzaWduYXR1cmUucGFyYW1ldGVyc30pIHtcXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgIHJldHVybiAvKiogQHR5cGUgeyR7c2lnbmF0dXJlLnJldHVyblR5cGV9fSAqLyAoYXdhaXQgdGhpcy5leGVjdXRlQ3VzdG9tQ29tbWFuZCh7XFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIGNvbW1hbmROYW1lOiAke0pTT04uc3RyaW5naWZ5KGNvbGxlY3Rpb25Db21tYW5kc1ttZXRob2ROYW1lXSl9LFxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICBjb21tYW5kVHlwZTogJHtKU09OLnN0cmluZ2lmeShjb2xsZWN0aW9uQ29tbWFuZHNbbWV0aG9kTmFtZV0pfSxcXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgICAgcGF5bG9hZDogJHtjbGFzc05hbWV9Lm5vcm1hbGl6ZUN1c3RvbUNvbW1hbmRQYXlsb2FkQXJndW1lbnRzKCR7c2lnbmF0dXJlLnBheWxvYWRBcmd1bWVudHN9KSxcXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICAgIHJlc291cmNlUGF0aDogdGhpcy5yZXNvdXJjZVBhdGgoKVxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICB9KSlcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIH1cXG5cIlxuICAgIH1cblxuICAgIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBPYmplY3Qua2V5cyhtZW1iZXJDb21tYW5kcykpIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRoaXMuY3VzdG9tQ29tbWFuZE1ldGhvZFNpZ25hdHVyZSh7Y29tbWFuZE1ldGFkYXRhLCBtZXRob2ROYW1lfSlcblxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgKiBSdW5zICR7bWV0aG9kTmFtZX0uXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gc2lnbmF0dXJlLnBhcmFtRG9jc1xuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge1Byb21pc2U8JHtzaWduYXR1cmUucmV0dXJuVHlwZX0+fSAtIENvbW1hbmQgcmVzcG9uc2UuXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICBhc3luYyAke21ldGhvZE5hbWV9KCR7c2lnbmF0dXJlLnBhcmFtZXRlcnN9KSB7XFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICByZXR1cm4gLyoqIEB0eXBlIHske3NpZ25hdHVyZS5yZXR1cm5UeXBlfX0gKi8gKGF3YWl0ICR7Y2xhc3NOYW1lfS5leGVjdXRlQ3VzdG9tQ29tbWFuZCh7XFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIGNvbW1hbmROYW1lOiAke0pTT04uc3RyaW5naWZ5KG1lbWJlckNvbW1hbmRzW21ldGhvZE5hbWVdKX0sXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIGNvbW1hbmRUeXBlOiAke0pTT04uc3RyaW5naWZ5KG1lbWJlckNvbW1hbmRzW21ldGhvZE5hbWVdKX0sXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgICBtZW1iZXJJZDogdGhpcy5wcmltYXJ5S2V5VmFsdWUoKSxcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIHBheWxvYWQ6ICR7Y2xhc3NOYW1lfS5ub3JtYWxpemVDdXN0b21Db21tYW5kUGF5bG9hZEFyZ3VtZW50cygke3NpZ25hdHVyZS5wYXlsb2FkQXJndW1lbnRzfSksXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIHJlc291cmNlUGF0aDogJHtjbGFzc05hbWV9LnJlc291cmNlUGF0aCgpXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgfSkpXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICB9XFxuXCJcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcCBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBOYW1lQ2FtZWxpemVkID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZSlcbiAgICAgIGNvbnN0IHRhcmdldEltcG9ydFBhdGggPSBgLi8ke3JlbGF0aW9uc2hpcC50YXJnZXRGaWxlTmFtZX0uanNgXG4gICAgICBjb25zdCB0YXJnZXRJbnN0YW5jZVR5cGUgPSBgaW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkodGFyZ2V0SW1wb3J0UGF0aCl9KS4ke3JlbGF0aW9uc2hpcC50YXJnZXRDbGFzc05hbWV9YFxuICAgICAgY29uc3QgdGFyZ2V0Q3JlYXRlQXR0cmlidXRlc1R5cGUgPSBgaW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkodGFyZ2V0SW1wb3J0UGF0aCl9KS4ke3JlbGF0aW9uc2hpcC50YXJnZXRDbGFzc05hbWV9Q3JlYXRlQXR0cmlidXRlc2BcblxuICAgICAgaWYgKHJlbGF0aW9uc2hpcC50eXBlID09IFwiaGFzTWFueVwiKSB7XG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIFJldHVybnMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0gcmVsYXRpb25zaGlwIGhlbHBlci5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtpbXBvcnQoJHtKU09OLnN0cmluZ2lmeShpbXBvcnRQYXRoKX0pLkZyb250ZW5kTW9kZWxIYXNNYW55UmVsYXRpb25zaGlwPCR7Y2xhc3NOYW1lfSwgJHt0YXJnZXRJbnN0YW5jZVR5cGV9LCAke3RhcmdldENyZWF0ZUF0dHJpYnV0ZXNUeXBlfT59IC0gUmVsYXRpb25zaGlwIGhlbHBlci5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfVJlbGF0aW9uc2hpcCgpIHsgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkoaW1wb3J0UGF0aCl9KS5Gcm9udGVuZE1vZGVsSGFzTWFueVJlbGF0aW9uc2hpcDwke2NsYXNzTmFtZX0sICR7dGFyZ2V0SW5zdGFuY2VUeXBlfSwgJHt0YXJnZXRDcmVhdGVBdHRyaWJ1dGVzVHlwZX0+fSAqLyAodGhpcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZSl9KSkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBSZXR1cm5zICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge2ltcG9ydCgke0pTT04uc3RyaW5naWZ5KGltcG9ydFBhdGgpfSkuRnJvbnRlbmRNb2RlbEhhc01hbnlSZWxhdGlvbnNoaXA8JHtjbGFzc05hbWV9LCAke3RhcmdldEluc3RhbmNlVHlwZX0sICR7dGFyZ2V0Q3JlYXRlQXR0cmlidXRlc1R5cGV9Pn0gLSBSZWxhdGlvbnNoaXAgaGVscGVyLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9KCkgeyByZXR1cm4gdGhpcy4ke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfVJlbGF0aW9uc2hpcCgpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogUmV0dXJucyBsb2FkZWQgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0uXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7QXJyYXk8JHt0YXJnZXRJbnN0YW5jZVR5cGV9Pn0gLSBMb2FkZWQgcmVsYXRlZCBtb2RlbHMuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1Mb2FkZWQoKSB7IHJldHVybiB0aGlzLiR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkubG9hZGVkKCkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBMb2FkcyAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfS5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PCR7dGFyZ2V0SW5zdGFuY2VUeXBlfT4+fSAtIExvYWRlZCByZWxhdGVkIG1vZGVscy5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICBhc3luYyBsb2FkJHtyZWxhdGlvbnNoaXBOYW1lQ2FtZWxpemVkfSgpIHsgcmV0dXJuIGF3YWl0IHRoaXMuJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1SZWxhdGlvbnNoaXAoKS5sb2FkKCkgfVxcbmBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIFJldHVybnMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0gcmVsYXRpb25zaGlwIGhlbHBlci5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtpbXBvcnQoJHtKU09OLnN0cmluZ2lmeShpbXBvcnRQYXRoKX0pLkZyb250ZW5kTW9kZWxTaW5ndWxhclJlbGF0aW9uc2hpcDwke2NsYXNzTmFtZX0sICR7dGFyZ2V0SW5zdGFuY2VUeXBlfSwgJHt0YXJnZXRDcmVhdGVBdHRyaWJ1dGVzVHlwZX0+fSAtIFJlbGF0aW9uc2hpcCBoZWxwZXIuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1SZWxhdGlvbnNoaXAoKSB7IHJldHVybiAvKiogQHR5cGUge2ltcG9ydCgke0pTT04uc3RyaW5naWZ5KGltcG9ydFBhdGgpfSkuRnJvbnRlbmRNb2RlbFNpbmd1bGFyUmVsYXRpb25zaGlwPCR7Y2xhc3NOYW1lfSwgJHt0YXJnZXRJbnN0YW5jZVR5cGV9LCAke3RhcmdldENyZWF0ZUF0dHJpYnV0ZXNUeXBlfT59ICovICh0aGlzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZSgke0pTT04uc3RyaW5naWZ5KHJlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lKX0pKSB9XFxuYFxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIFJldHVybnMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0uXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7JHt0YXJnZXRJbnN0YW5jZVR5cGV9IHwgbnVsbH0gLSBMb2FkZWQgcmVsYXRlZCBtb2RlbC5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfSgpIHsgcmV0dXJuIHRoaXMuJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1SZWxhdGlvbnNoaXAoKS5sb2FkZWQoKSB9XFxuYFxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEJ1aWxkcyAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfS5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEBwYXJhbSB7JHt0YXJnZXRDcmVhdGVBdHRyaWJ1dGVzVHlwZX19IFthdHRyaWJ1dGVzXSAtIEF0dHJpYnV0ZXMgZm9yIHRoZSBuZXcgcmVsYXRlZCBtb2RlbC5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHske3RhcmdldEluc3RhbmNlVHlwZX19IC0gQnVpbHQgcmVsYXRlZCBtb2RlbC5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICBidWlsZCR7cmVsYXRpb25zaGlwTmFtZUNhbWVsaXplZH0oYXR0cmlidXRlcyA9IHt9KSB7IHJldHVybiB0aGlzLiR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkuYnVpbGQoYXR0cmlidXRlcykgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBMb2FkcyAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfS5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtQcm9taXNlPCR7dGFyZ2V0SW5zdGFuY2VUeXBlfSB8IG51bGw+fSAtIExvYWRlZCByZWxhdGVkIG1vZGVsLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGFzeW5jIGxvYWQke3JlbGF0aW9uc2hpcE5hbWVDYW1lbGl6ZWR9KCkgeyByZXR1cm4gYXdhaXQgdGhpcy4ke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfVJlbGF0aW9uc2hpcCgpLmxvYWQoKSB9XFxuYFxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIFJldHVybnMgb3IgbG9hZHMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0uXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7UHJvbWlzZTwke3RhcmdldEluc3RhbmNlVHlwZX0gfCBudWxsPn0gLSBMb2FkZWQgcmVsYXRlZCBtb2RlbC5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICBhc3luYyAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfU9yTG9hZCgpIHsgcmV0dXJuIGF3YWl0IHRoaXMuJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1SZWxhdGlvbnNoaXAoKS5vckxvYWQoKSB9XFxuYFxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIFNldHMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0uXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcGFyYW0geyR7dGFyZ2V0SW5zdGFuY2VUeXBlfSB8IG51bGx9IG1vZGVsIC0gUmVsYXRlZCBtb2RlbC5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKiBAcmV0dXJucyB7dm9pZH1cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgc2V0JHtyZWxhdGlvbnNoaXBOYW1lQ2FtZWxpemVkfShtb2RlbCkgeyB0aGlzLiR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkuc2V0TG9hZGVkKG1vZGVsKSB9XFxuYFxuICAgICAgfVxuICAgIH1cblxuICAgIGZpbGVDb250ZW50ICs9IFwifVxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IGBGcm9udGVuZE1vZGVsQmFzZS5yZWdpc3Rlck1vZGVsKCR7Y2xhc3NOYW1lfSlcXG5gXG4gICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IGBleHBvcnQgeyR7Y2xhc3NOYW1lfX1cXG5gXG4gICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IGBleHBvcnQgZGVmYXVsdCAke2NsYXNzTmFtZX1cXG5gXG5cbiAgICByZXR1cm4gZmlsZUNvbnRlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGJ1aWxkIGluZGV4IGZpbGUgY29udGVudC5cbiAgICogQHBhcmFtIHtBcnJheTx7Y2xhc3NOYW1lOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmd9Pn0gZ2VuZXJhdGVkRmlsZXMgLSBHZW5lcmF0ZWQgbW9kZWwgZmlsZXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSW5kZXggZmlsZSBjb250ZW50IHRoYXQgaW1wb3J0cyBhbmQgcmUtZXhwb3J0cyBhbGwgbW9kZWxzLlxuICAgKi9cbiAgYnVpbGRJbmRleEZpbGVDb250ZW50KGdlbmVyYXRlZEZpbGVzKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBcIlwiXG5cbiAgICBmb3IgKGNvbnN0IHtjbGFzc05hbWUsIGZpbGVOYW1lfSBvZiBnZW5lcmF0ZWRGaWxlcykge1xuICAgICAgY29udGVudCArPSBgZXhwb3J0IHtkZWZhdWx0IGFzICR7Y2xhc3NOYW1lfX0gZnJvbSBcIi4vJHtmaWxlTmFtZX1cIlxcbmBcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGVudFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYnVpbGQgc2V0dXAgZmlsZSBjb250ZW50LlxuICAgKiBAcGFyYW0ge0FycmF5PHtjbGFzc05hbWU6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZ30+fSBnZW5lcmF0ZWRGaWxlcyAtIEdlbmVyYXRlZCBtb2RlbCBmaWxlcy5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTZXR1cCBmaWxlIGNvbnRlbnQgd2l0aCBzaWRlLWVmZmVjdCBpbXBvcnRzIGZvciBtb2RlbCByZWdpc3RyYXRpb24uXG4gICAqL1xuICBidWlsZFNldHVwRmlsZUNvbnRlbnQoZ2VuZXJhdGVkRmlsZXMpIHtcbiAgICBsZXQgY29udGVudCA9IFwiLy8gVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkIGJ5IFZlbG9jaW91cy4gRG8gbm90IGVkaXQgbWFudWFsbHkuXFxuXCJcblxuICAgIGNvbnRlbnQgKz0gXCIvLyBSdW4gYHZlbG9jaW91cyBnOmZyb250ZW5kLW1vZGVsc2AgdG8gcmVnZW5lcmF0ZS5cXG5cIlxuXG4gICAgZm9yIChjb25zdCB7ZmlsZU5hbWV9IG9mIGdlbmVyYXRlZEZpbGVzKSB7XG4gICAgICBjb250ZW50ICs9IGBpbXBvcnQgXCIuLyR7ZmlsZU5hbWV9XCJcXG5gXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdyaXRlIGF0dHJpYnV0ZXMgdHlwZWRlZi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7QXJyYXk8e2pzRG9jVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9Pn0gYXJncy5hdHRyaWJ1dGVzIC0gR2VuZXJhdGVkIHJlYWQgYXR0cmlidXRlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXR0cmlidXRlc1R5cGVOYW1lIC0gR2VuZXJhdGVkIHJlYWQgYXR0cmlidXRlcyB0eXBlZGVmIG5hbWUuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLm1vZGVsQ2xhc3MgLSBCYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge0FycmF5PHthdHRyaWJ1dGVzOiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiwgcmVsYXRpb25zaGlwTmFtZTogc3RyaW5nLCB0eXBlTmFtZTogc3RyaW5nfT59IGFyZ3MubmVzdGVkV3JpdGVUeXBlcyAtIE5lc3RlZCB3cml0ZSB0eXBlZGVmcy5cbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsR2VuZXJhdG9yUGVybWl0U3BlY30gYXJncy5wZXJtaXR0ZWRQYXJhbXMgLSBSZXNvdXJjZSBwZXJtaXR0ZWQgcGFyYW1zIHNwZWMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsIHwgdW5kZWZpbmVkfSBhcmdzLnJlc291cmNlQ2xhc3MgLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudHlwZU5hbWUgLSBUeXBlZGVmIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gR2VuZXJhdGVkIHR5cGVkZWYgc291cmNlLlxuICAgKi9cbiAgYXN5bmMgd3JpdGVBdHRyaWJ1dGVzVHlwZWRlZih7YXR0cmlidXRlcywgYXR0cmlidXRlc1R5cGVOYW1lLCBtb2RlbENsYXNzLCBuZXN0ZWRXcml0ZVR5cGVzLCBwZXJtaXR0ZWRQYXJhbXMsIHJlc291cmNlQ2xhc3MsIHR5cGVOYW1lfSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZUxpbmVzID0gW11cblxuICAgIGxldCBvdXRwdXQgPSBcIi8qKlxcblwiXG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzQnlOYW1lID0gbmV3IE1hcChhdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlKSA9PiBbYXR0cmlidXRlLm5hbWUsIGF0dHJpYnV0ZV0pKVxuICAgIGNvbnN0IG5lc3RlZFdyaXRlVHlwZXNCeUtleSA9IG5ldyBNYXAobmVzdGVkV3JpdGVUeXBlcy5tYXAoKG5lc3RlZFdyaXRlVHlwZSkgPT4gW2Ake25lc3RlZFdyaXRlVHlwZS5yZWxhdGlvbnNoaXBOYW1lfUF0dHJpYnV0ZXNgLCBuZXN0ZWRXcml0ZVR5cGVdKSlcbiAgICBjb25zdCBlbWl0dGVkQXR0cmlidXRlTmFtZXMgPSBuZXcgU2V0KClcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgcGVybWl0dGVkUGFyYW1zKSB7XG4gICAgICBpZiAodHlwZW9mIGVudHJ5ID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IHRoaXMuZnJvbnRlbmRXcml0ZUF0dHJpYnV0ZU5hbWUoe2F0dHJpYnV0ZU5hbWU6IGVudHJ5LCBhdHRyaWJ1dGVzQnlOYW1lLCBtb2RlbENsYXNzfSlcblxuICAgICAgICBpZiAoZW1pdHRlZEF0dHJpYnV0ZU5hbWVzLmhhcyhhdHRyaWJ1dGVOYW1lKSkgY29udGludWVcblxuICAgICAgICBlbWl0dGVkQXR0cmlidXRlTmFtZXMuYWRkKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICAgICAgY29uc3QgdHlwZSA9IGF3YWl0IHRoaXMuZnJvbnRlbmRXcml0ZUF0dHJpYnV0ZVR5cGUoe1xuICAgICAgICAgIGF0dHJpYnV0ZTogYXR0cmlidXRlc0J5TmFtZS5nZXQoYXR0cmlidXRlTmFtZSksXG4gICAgICAgICAgYXR0cmlidXRlTmFtZSxcbiAgICAgICAgICBhdHRyaWJ1dGVzVHlwZU5hbWUsXG4gICAgICAgICAgcmVzb3VyY2VDbGFzc1xuICAgICAgICB9KVxuXG4gICAgICAgIGF0dHJpYnV0ZUxpbmVzLnB1c2goYCAqIEBwcm9wZXJ0eSB7JHt0eXBlfX0gWyR7YXR0cmlidXRlTmFtZX1dIC0gUGVybWl0dGVkICR7YXR0cmlidXRlTmFtZX0gdmFsdWUuXFxuYClcbiAgICAgIH0gZWxzZSBpZiAoZW50cnkgJiYgdHlwZW9mIGVudHJ5ID09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZW50cnkpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudHJ5KSkge1xuICAgICAgICAgIGNvbnN0IG5lc3RlZFdyaXRlVHlwZSA9IG5lc3RlZFdyaXRlVHlwZXNCeUtleS5nZXQoa2V5KVxuICAgICAgICAgIGNvbnN0IHR5cGUgPSBuZXN0ZWRXcml0ZVR5cGUgPyBgQXJyYXk8JHtuZXN0ZWRXcml0ZVR5cGUudHlwZU5hbWV9PmAgOiBcIkFycmF5PG9iamVjdD5cIlxuXG4gICAgICAgICAgYXR0cmlidXRlTGluZXMucHVzaChgICogQHByb3BlcnR5IHske3R5cGV9fSBbJHtrZXl9XSAtIFBlcm1pdHRlZCBuZXN0ZWQgJHtrZXl9IHZhbHVlcy5cXG5gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3V0cHV0ICs9IGAgKiBBdHRyaWJ1dGVzIGFjY2VwdGVkIGJ5ICR7dHlwZU5hbWV9LlxcbmBcbiAgICBpZiAoYXR0cmlidXRlTGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBvdXRwdXQgKz0gYCAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBuZXZlcj59ICR7dHlwZU5hbWV9XFxuYFxuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQgKz0gYCAqIEB0eXBlZGVmIHtvYmplY3R9ICR7dHlwZU5hbWV9XFxuYFxuICAgICAgb3V0cHV0ICs9IGF0dHJpYnV0ZUxpbmVzLmpvaW4oXCJcIilcbiAgICB9XG4gICAgb3V0cHV0ICs9IFwiICovXFxuXCJcblxuICAgIHJldHVybiBvdXRwdXRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIHdyaXRlIGF0dHJpYnV0ZSB0eXBlLlxuICAgKiBAcGFyYW0ge3thdHRyaWJ1dGU6IHtqc0RvY1R5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nfSB8IHVuZGVmaW5lZCwgYXR0cmlidXRlTmFtZTogc3RyaW5nLCBhdHRyaWJ1dGVzVHlwZU5hbWU6IHN0cmluZywgcmVzb3VyY2VDbGFzczogaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsIHwgdW5kZWZpbmVkfX0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBKU0RvYyB0eXBlIGZvciB0aGUgcGVybWl0dGVkIHdyaXRlIGZpZWxkLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRXcml0ZUF0dHJpYnV0ZVR5cGUoe2F0dHJpYnV0ZSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlc1R5cGVOYW1lLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGNvbnN0IHNldHRlclBhcmFtZXRlclR5cGUgPSBhd2FpdCB0aGlzLmZyb250ZW5kV3JpdGVBdHRyaWJ1dGVTZXR0ZXJQYXJhbWV0ZXJUeXBlKHthdHRyaWJ1dGVOYW1lLCByZXNvdXJjZUNsYXNzfSlcblxuICAgIGlmIChzZXR0ZXJQYXJhbWV0ZXJUeXBlKSByZXR1cm4gYCR7c2V0dGVyUGFyYW1ldGVyVHlwZX0gfCBudWxsYFxuXG4gICAgaWYgKCFhdHRyaWJ1dGUpIHJldHVybiBcIkZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZVwiXG5cbiAgICBpZiAoYXR0cmlidXRlLmpzRG9jVHlwZS50cmltKCkgPT09IFwibnVsbFwiKSByZXR1cm4gXCJGcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWVcIlxuXG4gICAgcmV0dXJuIGAke2F0dHJpYnV0ZXNUeXBlTmFtZX1bJHtKU09OLnN0cmluZ2lmeShhdHRyaWJ1dGUubmFtZSl9XSB8IG51bGxgXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCB3cml0ZSBhdHRyaWJ1dGUgc2V0dGVyIHBhcmFtZXRlciB0eXBlLlxuICAgKiBAcGFyYW0ge3thdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIHJlc291cmNlQ2xhc3M6IGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZH19IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IG51bGw+fSAtIFNldHRlciB2YWx1ZSBwYXJhbWV0ZXIgdHlwZSB3aGVuIGl0IGlzIHVzZWZ1bCBmb3IgZ2VuZXJhdGlvbi5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kV3JpdGVBdHRyaWJ1dGVTZXR0ZXJQYXJhbWV0ZXJUeXBlKHthdHRyaWJ1dGVOYW1lLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGlmICghcmVzb3VyY2VDbGFzcz8ubmFtZSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBgc2V0JHtpbmZsZWN0aW9uLmNhbWVsaXplKGF0dHJpYnV0ZU5hbWUpfUF0dHJpYnV0ZWBcbiAgICBjb25zdCBwYXJhbWV0ZXJUeXBlID0gYXdhaXQgdGhpcy5yZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGUoe1xuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIHBhcmFtZXRlckluZGV4OiAxLFxuICAgICAgc291cmNlQ2xhc3NOYW1lOiByZXNvdXJjZUNsYXNzLm5hbWVcbiAgICB9KVxuXG4gICAgaWYgKCFwYXJhbWV0ZXJUeXBlKSByZXR1cm4gbnVsbFxuICAgIGlmICh0aGlzLmlzQnJvYWRHZW5lcmF0ZWRUeXBlKHBhcmFtZXRlclR5cGUpKSByZXR1cm4gbnVsbFxuXG4gICAgcmV0dXJuIHBhcmFtZXRlclR5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIGJyb2FkIGdlbmVyYXRlZCB0eXBlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ganNEb2NUeXBlIC0gSlNEb2MgdHlwZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgdHlwZSBpcyB0b28gYnJvYWQgdG8gaW1wcm92ZSBnZW5lcmF0ZWQgd3JpdGUgdHlwaW5nLlxuICAgKi9cbiAgaXNCcm9hZEdlbmVyYXRlZFR5cGUoanNEb2NUeXBlKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSBqc0RvY1R5cGUudHJpbSgpXG5cbiAgICByZXR1cm4gbm9ybWFsaXplZFR5cGUgPT09IFwiP1wiXG4gICAgICB8fCBub3JtYWxpemVkVHlwZSA9PT0gXCJhbnlcIlxuICAgICAgfHwgbm9ybWFsaXplZFR5cGUgPT09IFwib2JqZWN0XCJcbiAgICAgIHx8IG5vcm1hbGl6ZWRUeXBlID09PSBcInVua25vd25cIlxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgcGVybWl0dGVkIHdyaXRlIGF0dHJpYnV0ZSB0byB0aGUgZ2VuZXJhdGVkIGZyb250ZW5kIGF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcGFyYW0ge3thdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIGF0dHJpYnV0ZXNCeU5hbWU6IE1hcDxzdHJpbmcsIHtqc0RvY1R5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nfT4sIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH19IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gRnJvbnRlbmQgYXR0cmlidXRlIG5hbWUgdXNlZCBieSBnZW5lcmF0ZWQgYWNjZXNzb3JzLlxuICAgKi9cbiAgZnJvbnRlbmRXcml0ZUF0dHJpYnV0ZU5hbWUoe2F0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZXNCeU5hbWUsIG1vZGVsQ2xhc3N9KSB7XG4gICAgaWYgKGF0dHJpYnV0ZXNCeU5hbWUuaGFzKGF0dHJpYnV0ZU5hbWUpKSByZXR1cm4gYXR0cmlidXRlTmFtZVxuXG4gICAgaWYgKG1vZGVsQ2xhc3MpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkQXR0cmlidXRlTmFtZSA9IG1vZGVsQ2xhc3MucmVzb2x2ZUF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlTmFtZSlcblxuICAgICAgaWYgKHJlc29sdmVkQXR0cmlidXRlTmFtZSAmJiBhdHRyaWJ1dGVzQnlOYW1lLmhhcyhyZXNvbHZlZEF0dHJpYnV0ZU5hbWUpKSByZXR1cm4gcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lXG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZEF0dHJpYnV0ZU5hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGF0dHJpYnV0ZU5hbWUsIHRydWUpLnRvTG93ZXJDYXNlKClcbiAgICBjb25zdCBtYXRjaGluZ0F0dHJpYnV0ZU5hbWUgPSBBcnJheS5mcm9tKGF0dHJpYnV0ZXNCeU5hbWUua2V5cygpKS5maW5kKChjYW5kaWRhdGVOYW1lKSA9PiBjYW5kaWRhdGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vcm1hbGl6ZWRBdHRyaWJ1dGVOYW1lKVxuXG4gICAgaWYgKG1hdGNoaW5nQXR0cmlidXRlTmFtZSkgcmV0dXJuIG1hdGNoaW5nQXR0cmlidXRlTmFtZVxuXG4gICAgLy8gV3JpdGUtb25seSB2aXJ0dWFsIHBhcmFtcyBhcmUgdmFsaWQgcGVybWl0dGVkIHBhcmFtcyBldmVuIHdoZW4gdGhleSBoYXZlIG5vIHJlYWQgYXR0cmlidXRlLlxuICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lXG4gIH1cblxuICAvKipcbiAgICogUnVucyBuZXN0ZWQgd3JpdGUgdHlwZXMgZm9yIG1vZGVsLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2xhc3NOYW1lIC0gRnJvbnRlbmQgbW9kZWwgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsR2VuZXJhdG9yUGVybWl0U3BlY30gYXJncy5wZXJtaXR0ZWRQYXJhbXMgLSBDb21iaW5lZCBwZXJtaXR0ZWQgcGFyYW1zIHNwZWNzLlxuICAgKiBAcGFyYW0ge0FycmF5PHthdXRvbG9hZDogYm9vbGVhbiwgcmVsYXRpb25zaGlwTmFtZTogc3RyaW5nLCB0YXJnZXRDbGFzc05hbWU6IHN0cmluZywgdGFyZ2V0RmlsZU5hbWU6IHN0cmluZywgdHlwZTogXCJiZWxvbmdzVG9cIiB8IFwiaGFzT25lXCIgfCBcImhhc01hbnlcIn0+fSBhcmdzLnJlbGF0aW9uc2hpcHMgLSBHZW5lcmF0ZWQgcmVsYXRpb25zaGlwcy5cbiAgICogQHJldHVybnMge0FycmF5PHthdHRyaWJ1dGVzOiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiwgcmVsYXRpb25zaGlwTmFtZTogc3RyaW5nLCB0eXBlTmFtZTogc3RyaW5nfT59IC0gTmVzdGVkIHdyaXRlIHR5cGVkZWZzLlxuICAgKi9cbiAgbmVzdGVkV3JpdGVUeXBlc0Zvck1vZGVsKHtjbGFzc05hbWUsIHBlcm1pdHRlZFBhcmFtcywgcmVsYXRpb25zaGlwc30pIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXBzQnlOYW1lID0gbmV3IE1hcChyZWxhdGlvbnNoaXBzLm1hcCgocmVsYXRpb25zaGlwKSA9PiBbcmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWUsIHJlbGF0aW9uc2hpcF0pKVxuICAgIGNvbnN0IG5lc3RlZFdyaXRlVHlwZXNCeU5hbWUgPSBuZXcgTWFwKClcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgcGVybWl0dGVkUGFyYW1zKSB7XG4gICAgICBpZiAoIWVudHJ5IHx8IHR5cGVvZiBlbnRyeSAhPSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZW50cnkpKSBjb250aW51ZVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnRyeSkpIHtcbiAgICAgICAgaWYgKCFrZXkuZW5kc1dpdGgoXCJBdHRyaWJ1dGVzXCIpKSBjb250aW51ZVxuICAgICAgICBjb25zdCByZWxhdGlvbnNoaXBOYW1lID0ga2V5LnNsaWNlKDAsIC1cIkF0dHJpYnV0ZXNcIi5sZW5ndGgpXG4gICAgICAgIGNvbnN0IG5lc3RlZFNwZWMgPSBlbnRyeVtrZXldXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcHNCeU5hbWUuZ2V0KHJlbGF0aW9uc2hpcE5hbWUpXG4gICAgICAgIGxldCB0YXJnZXRNb2RlbENsYXNzXG5cbiAgICAgICAgaWYgKHJlbGF0aW9uc2hpcCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0YXJnZXRNb2RlbENsYXNzID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0TW9kZWxDbGFzcyhyZWxhdGlvbnNoaXAudGFyZ2V0Q2xhc3NOYW1lKVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgdGFyZ2V0TW9kZWxDbGFzcyA9IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXN0ZWRXcml0ZVR5cGVzQnlOYW1lLmhhcyhyZWxhdGlvbnNoaXBOYW1lKSkgY29udGludWVcblxuICAgICAgICBuZXN0ZWRXcml0ZVR5cGVzQnlOYW1lLnNldChyZWxhdGlvbnNoaXBOYW1lLCB7XG4gICAgICAgICAgYXR0cmlidXRlczogdGhpcy5uZXN0ZWRXcml0ZUF0dHJpYnV0ZXNGb3JTcGVjKHtuZXN0ZWRTcGVjLCB0YXJnZXRNb2RlbENsYXNzfSksXG4gICAgICAgICAgcmVsYXRpb25zaGlwTmFtZSxcbiAgICAgICAgICB0eXBlTmFtZTogYCR7Y2xhc3NOYW1lfSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShyZWxhdGlvbnNoaXBOYW1lKX1OZXN0ZWRBdHRyaWJ1dGVzYFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5lc3RlZFdyaXRlVHlwZXNCeU5hbWUudmFsdWVzKCkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBuZXN0ZWQgd3JpdGUgYXR0cmlidXRlcyBmb3Igc3BlYy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgb2JqZWN0Pj4gfCBvYmplY3QgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBhcmdzLm5lc3RlZFNwZWMgLSBOZXN0ZWQgcGVybWl0IHNwZWMuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLnRhcmdldE1vZGVsQ2xhc3MgLSBUYXJnZXQgYmFja2VuZCBtb2RlbCBjbGFzcy5cbiAgICogQHJldHVybnMge0FycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+fSAtIE5lc3RlZCB3cml0ZSBhdHRyaWJ1dGVzLlxuICAgKi9cbiAgbmVzdGVkV3JpdGVBdHRyaWJ1dGVzRm9yU3BlYyh7bmVzdGVkU3BlYywgdGFyZ2V0TW9kZWxDbGFzc30pIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobmVzdGVkU3BlYykpIHJldHVybiBbXVxuXG4gICAgcmV0dXJuIG5lc3RlZFNwZWMuZmlsdGVyKChlbnRyeSkgPT4gdHlwZW9mIGVudHJ5ID09IFwic3RyaW5nXCIpLm1hcCgoYXR0cmlidXRlTmFtZSkgPT4ge1xuICAgICAgY29uc3QgcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lID0gdGFyZ2V0TW9kZWxDbGFzcz8ucmVzb2x2ZUF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlTmFtZSkgfHwgYXR0cmlidXRlTmFtZVxuICAgICAgY29uc3QgYXR0cmlidXRlQ29uZmlnID0gdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0Zvck1vZGVsQXR0cmlidXRlKHthdHRyaWJ1dGVOYW1lOiByZXNvbHZlZEF0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3M6IHRhcmdldE1vZGVsQ2xhc3N9KVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiByZXNvbHZlZEF0dHJpYnV0ZU5hbWUsXG4gICAgICAgIHR5cGU6IGF0dHJpYnV0ZUNvbmZpZyA/IHRoaXMuanNEb2NUeXBlRm9yRnJvbnRlbmRBdHRyaWJ1dGUoe2F0dHJpYnV0ZUNvbmZpZ30pIDogXCJGcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWVcIlxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwZXJtaXR0ZWQgcGFyYW1zIGZvciBnZW5lcmF0b3IuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsfSByZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEBwYXJhbSB7XCJjcmVhdGVcIiB8IFwidXBkYXRlXCJ9IGFjdGlvbiAtIFdyaXRlIGFjdGlvbi5cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxHZW5lcmF0b3JQZXJtaXRTcGVjfSAtIFBlcm1pdHRlZCBwYXJhbXMgc3BlYy5cbiAgICovXG4gIHBlcm1pdHRlZFBhcmFtc0ZvckdlbmVyYXRvcihyZXNvdXJjZUNsYXNzLCBhY3Rpb24pIHtcbiAgICBpZiAoIXJlc291cmNlQ2xhc3MpIHJldHVybiBbXVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSByZXNvdXJjZUNsYXNzLm1vZGVsQ2xhc3MoKVxuXG4gICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyByZXNvdXJjZUNsYXNzKHtcbiAgICAgICAgYWJpbGl0eTogdW5kZWZpbmVkLFxuICAgICAgICBjb250ZXh0OiB7fSxcbiAgICAgICAgbG9jYWxzOiB7fSxcbiAgICAgICAgbW9kZWxDbGFzcyxcbiAgICAgICAgbW9kZWxOYW1lOiBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpLFxuICAgICAgICBwYXJhbXM6IHt9LFxuICAgICAgICByZXNvdXJjZUNvbmZpZ3VyYXRpb246IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSAqLyAoe2F0dHJpYnV0ZXM6IFtdfSlcbiAgICAgIH0pXG4gICAgICBjb25zdCBzcGVjID0gaW5zdGFuY2UucGVybWl0dGVkUGFyYW1zKHthY3Rpb24sIGFiaWxpdHk6IHVuZGVmaW5lZCwgbG9jYWxzOiB7fSwgcGFyYW1zOiB7fX0pXG5cbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHNwZWMpID8gc3BlYyA6IFtdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGludm9rZSAke3Jlc291cmNlQ2xhc3MubmFtZX0ucGVybWl0dGVkUGFyYW1zKCkgd2hpbGUgZ2VuZXJhdGluZyBmcm9udGVuZCBtb2RlbCB3cml0ZSB0eXBlczogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCwge2NhdXNlOiBlcnJvcn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZXMgYSBiYWNrZW5kIHJlc291cmNlJ3MgYHBlcm1pdHRlZFBhcmFtcygpYCBpbnN0YW5jZSBtZXRob2QgYXRcbiAgICogZ2VuZXJhdGlvbiB0aW1lIGFuZCBleHRyYWN0cyB0aGUgcmVsYXRpb25zaGlwIG5hbWVzIHRoYXQgYWNjZXB0XG4gICAqIG5lc3RlZCB3cml0ZXMgKGB7Zm9vQXR0cmlidXRlczogWy4uLl19YCBlbnRyaWVzKS4gVGhlIGdlbmVyYXRvclxuICAgKiBlbWl0cyB0aG9zZSBuYW1lcyBpbnRvIHRoZSBmcm9udGVuZCBtb2RlbCdzIGByZXNvdXJjZUNvbmZpZygpYCBzb1xuICAgKiB0aGUgY2xpZW50IGBzYXZlKClgIHdhbGtlciBrbm93cyB3aGljaCByZWxhdGlvbnNoaXBzIHRvIHNoaXAuXG4gICAqXG4gICAqIENvbnN0cnVjdGVkIHdpdGggbm8gY29udHJvbGxlci9hYmlsaXR5IHNvIHJlc291cmNlIG92ZXJyaWRlcyBtdXN0XG4gICAqIHN1cHBvcnQgYmVpbmcgY2FsbGVkIHdpdGhvdXQgYSByZXF1ZXN0IGNvbnRleHQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsfSByZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBSZWxhdGlvbnNoaXAgbmFtZXMgdGhhdCBhY2NlcHQgbmVzdGVkIHdyaXRlcyAoZW1wdHkgd2hlbiBub25lKS5cbiAgICovXG4gIG5lc3RlZFJlbGF0aW9uc2hpcE5hbWVzRm9yR2VuZXJhdG9yKHJlc291cmNlQ2xhc3MpIHtcbiAgICBpZiAoIXJlc291cmNlQ2xhc3MpIHJldHVybiBbXVxuXG4gICAgbGV0IHNwZWNcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBtb2RlbENsYXNzID0gcmVzb3VyY2VDbGFzcy5tb2RlbENsYXNzKClcblxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgcmVzb3VyY2VDbGFzcyh7XG4gICAgICAgIGFiaWxpdHk6IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGV4dDoge30sXG4gICAgICAgIGxvY2Fsczoge30sXG4gICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgIG1vZGVsTmFtZTogbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKSxcbiAgICAgICAgcGFyYW1zOiB7fSxcbiAgICAgICAgcmVzb3VyY2VDb25maWd1cmF0aW9uOiAvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbn0gKi8gKHthdHRyaWJ1dGVzOiBbXX0pXG4gICAgICB9KVxuICAgICAgc3BlYyA9IGluc3RhbmNlLnBlcm1pdHRlZFBhcmFtcygpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGludm9rZSAke3Jlc291cmNlQ2xhc3MubmFtZX0ucGVybWl0dGVkUGFyYW1zKCkgd2hpbGUgZ2VuZXJhdGluZyBmcm9udGVuZCBtb2RlbHM6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsIHtjYXVzZTogZXJyb3J9KVxuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShzcGVjKSkgcmV0dXJuIFtdXG5cbiAgICAvKipcbiAgICAgKiBSZWxhdGlvbnNoaXAgbmFtZXMuXG4gICAgICogQHR5cGUge3N0cmluZ1tdfSAqL1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcE5hbWVzID0gW11cblxuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc3BlYykge1xuICAgICAgaWYgKCFlbnRyeSB8fCB0eXBlb2YgZW50cnkgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShlbnRyeSkpIGNvbnRpbnVlXG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudHJ5KSkge1xuICAgICAgICBpZiAoIWtleS5lbmRzV2l0aChcIkF0dHJpYnV0ZXNcIikpIGNvbnRpbnVlXG4gICAgICAgIGNvbnN0IG5hbWUgPSBrZXkuc2xpY2UoMCwgLVwiQXR0cmlidXRlc1wiLmxlbmd0aClcbiAgICAgICAgaWYgKG5hbWUpIHJlbGF0aW9uc2hpcE5hbWVzLnB1c2gobmFtZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVsYXRpb25zaGlwTmFtZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZvcm1hdHRlZCBhcnJheSBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBGb3JtYXR0aW5nIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmluZGVudCAtIEJhc2UgaW5kZW50YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnByb3BlcnR5TmFtZSAtIE9iamVjdCBwcm9wZXJ0eSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLnZhbHVlcyAtIFN0cmluZyB2YWx1ZXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gRm9ybWF0dGVkIG11bHRpbGluZSBhcnJheSBwcm9wZXJ0eS5cbiAgICovXG4gIGZvcm1hdHRlZEFycmF5UHJvcGVydHkoe2luZGVudCwgcHJvcGVydHlOYW1lLCB2YWx1ZXN9KSB7XG4gICAgbGV0IG91dHB1dCA9IGAke2luZGVudH0ke3Byb3BlcnR5TmFtZX06IFtcXG5gXG5cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgb3V0cHV0ICs9IGAke2luZGVudH0gICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSxcXG5gXG4gICAgfVxuXG4gICAgb3V0cHV0ICs9IGAke2luZGVudH1dLFxcbmBcblxuICAgIHJldHVybiBvdXRwdXRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZvcm1hdHRlZCBjb21tYW5kcyBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBGb3JtYXR0aW5nIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmluZGVudCAtIEJhc2UgaW5kZW50YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnByb3BlcnR5TmFtZSAtIE9iamVjdCBwcm9wZXJ0eSBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGFyZ3MudmFsdWVzIC0gQ29tbWFuZCBrZXktdmFsdWVzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZvcm1hdHRlZCBtdWx0aWxpbmUgYXJyYXkgcHJvcGVydHkuIEFsd2F5cyBlbWl0c1xuICAgKiAgIHRoZSBjYW1lbENhc2UgbWV0aG9kLW5hbWUgYXJyYXkgZm9ybSAoYG1lbWJlckNvbW1hbmRzOiBbXCJ1cGRhdGVBY2Nlc3NcIl1gKVxuICAgKiAgIHNvIHRoZSBnZW5lcmF0ZWQgY29uZmlnIG1hdGNoZXMgdGhlIGNhbm9uaWNhbFxuICAgKiAgIGBGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWcue2NvbGxlY3Rpb24sbWVtYmVyfUNvbW1hbmRzOiBzdHJpbmdbXWBcbiAgICogICBzaGFwZS4gVGhlIHJ1bnRpbWUgZGVyaXZlcyB0aGUgY29tbWFuZCBzbHVnIGZyb20gdGhlIGNhbWVsQ2FzZVxuICAgKiAgIG1ldGhvZCBuYW1lOyBjb25zdW1lcnMgbmV2ZXIgbmVlZCB0byB3cml0ZSBvdXRcbiAgICogICBge3VwZGF0ZUFjY2VzczogXCJ1cGRhdGUtYWNjZXNzXCJ9YCBieSBoYW5kLlxuICAgKi9cbiAgZm9ybWF0dGVkQ29tbWFuZHNQcm9wZXJ0eSh7aW5kZW50LCBwcm9wZXJ0eU5hbWUsIHZhbHVlc30pIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXR0ZWRBcnJheVByb3BlcnR5KHtpbmRlbnQsIHByb3BlcnR5TmFtZSwgdmFsdWVzOiBPYmplY3Qua2V5cyh2YWx1ZXMpfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZvcm1hdHRlZCBvYmplY3QgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gRm9ybWF0dGluZyBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5pbmRlbnQgLSBCYXNlIGluZGVudGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wcm9wZXJ0eU5hbWUgLSBPYmplY3QgcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBhcmdzLnZhbHVlcyAtIE9iamVjdCBrZXktdmFsdWVzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFthcmdzLmZpbHRlckRlZmF1bHRWYWx1ZXNdIC0gRGVmYXVsdCB2YWx1ZXMgdG8gb21pdCBmcm9tIG91dHB1dC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBGb3JtYXR0ZWQgbXVsdGlsaW5lIG9iamVjdCBwcm9wZXJ0eS5cbiAgICovXG4gIGZvcm1hdHRlZE9iamVjdFByb3BlcnR5KHtmaWx0ZXJEZWZhdWx0VmFsdWVzLCBpbmRlbnQsIHByb3BlcnR5TmFtZSwgdmFsdWVzfSkge1xuICAgIGxldCBvdXRwdXQgPSBgJHtpbmRlbnR9JHtwcm9wZXJ0eU5hbWV9OiB7XFxuYFxuXG4gICAgZm9yIChjb25zdCBvYmplY3RLZXkgb2YgT2JqZWN0LmtleXModmFsdWVzKSkge1xuICAgICAgaWYgKGZpbHRlckRlZmF1bHRWYWx1ZXMgJiYgZmlsdGVyRGVmYXVsdFZhbHVlc1tvYmplY3RLZXldID09PSB2YWx1ZXNbb2JqZWN0S2V5XSkgY29udGludWVcblxuICAgICAgb3V0cHV0ICs9IGAke2luZGVudH0gICR7b2JqZWN0S2V5fTogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZXNbb2JqZWN0S2V5XSl9LFxcbmBcbiAgICB9XG5cbiAgICBvdXRwdXQgKz0gYCR7aW5kZW50fX0sXFxuYFxuXG4gICAgcmV0dXJuIG91dHB1dFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYXR0cmlidXRlIGRlZmluaXRpb25zIGZvciBtb2RlbC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIEZyb250ZW5kIG1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLm1vZGVsQ2xhc3MgLSBCYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259IGFyZ3MubW9kZWxDb25maWcgLSBNb2RlbCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbH0gW2FyZ3MucmVzb3VyY2VDbGFzc10gLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8e2pzRG9jVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9Pj59IC0gQXR0cmlidXRlIGRlZmluaXRpb25zLlxuICAgKi9cbiAgYXN5bmMgYXR0cmlidXRlRGVmaW5pdGlvbnNGb3JNb2RlbCh7Y2xhc3NOYW1lLCBtb2RlbENsYXNzLCBtb2RlbENvbmZpZywgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBsZXQgYXR0cmlidXRlcyA9IG1vZGVsQ29uZmlnLmF0dHJpYnV0ZXNcblxuICAgIC8vIEF1dG8tZGVyaXZlIGF0dHJpYnV0ZXMgZnJvbSBtb2RlbCBjb2x1bW5zIHdoZW4gbm90IGV4cGxpY2l0bHkgZGVmaW5lZFxuICAgIGlmICgoIWF0dHJpYnV0ZXMgfHwgKEFycmF5LmlzQXJyYXkoYXR0cmlidXRlcykgJiYgYXR0cmlidXRlcy5sZW5ndGggPT09IDApKSAmJiBtb2RlbENsYXNzKSB7XG4gICAgICBjb25zdCBjb2x1bW5zID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5zKClcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sdW1ucykpIHtcbiAgICAgICAgYXR0cmlidXRlcyA9IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IGluZmxlY3Rpb24uY2FtZWxpemUoY29sdW1uLmdldE5hbWUoKSwgdHJ1ZSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXR0cmlidXRlcykpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZURlZmluaXRpb25zID0gW11cblxuICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGVEZWZpbml0aW9uIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgLyoqIEB0eXBlIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGx9ICovXG4gICAgICAgIGxldCBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnID0gbnVsbFxuICAgICAgICBsZXQgYXR0cmlidXRlTmFtZVxuXG4gICAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlRGVmaW5pdGlvbiA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZURlZmluaXRpb25cbiAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGVEZWZpbml0aW9uICYmIHR5cGVvZiBhdHRyaWJ1dGVEZWZpbml0aW9uID09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoYXR0cmlidXRlRGVmaW5pdGlvbikpIHtcbiAgICAgICAgICBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnID0gLyoqIEB0eXBlIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ30gKi8gKGF0dHJpYnV0ZURlZmluaXRpb24pXG4gICAgICAgICAgYXR0cmlidXRlTmFtZSA9IGNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWcubmFtZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVOYW1lICE9IFwic3RyaW5nXCIgfHwgYXR0cmlidXRlTmFtZS5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBmcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgYXJyYXkgZW50cmllcyB0byBiZSBzdHJpbmdzIG9yIG9iamVjdHMgd2l0aCBhIG5hbWUsIGdvdDogJHtKU09OLnN0cmluZ2lmeShhdHRyaWJ1dGVEZWZpbml0aW9uKX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXR0cmlidXRlQ29uZmlnID0gYXdhaXQgdGhpcy5yZXNvbHZlZEZyb250ZW5kQXR0cmlidXRlQ29uZmlnKHtcbiAgICAgICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnLFxuICAgICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgICAgcmVzb3VyY2VDbGFzc1xuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGZyb250ZW5kQXR0cmlidXRlQ29uZmlnID0gdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0ZvckdlbmVyYXRlZEF0dHJpYnV0ZSh7XG4gICAgICAgICAgYXR0cmlidXRlQ29uZmlnLFxuICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgbW9kZWxDbGFzc1xuICAgICAgICB9KVxuXG4gICAgICAgIGF0dHJpYnV0ZURlZmluaXRpb25zLnB1c2goe1xuICAgICAgICAgIGpzRG9jVHlwZTogdGhpcy5qc0RvY1R5cGVGb3JGcm9udGVuZEF0dHJpYnV0ZSh7YXR0cmlidXRlQ29uZmlnOiBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ30pLFxuICAgICAgICAgIG5hbWU6IGF0dHJpYnV0ZU5hbWVcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF0dHJpYnV0ZURlZmluaXRpb25zXG4gICAgfVxuXG4gICAgaWYgKCFhdHRyaWJ1dGVzIHx8IHR5cGVvZiBhdHRyaWJ1dGVzICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICdhdHRyaWJ1dGVzJyBhcyBhcnJheSBvciBvYmplY3QgYnV0IGdvdDogJHthdHRyaWJ1dGVzfWApXG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlRGVmaW5pdGlvbnMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVDb25maWcgPSBhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdXG4gICAgICBjb25zdCBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnID0gYXR0cmlidXRlQ29uZmlnICYmIHR5cGVvZiBhdHRyaWJ1dGVDb25maWcgPT09IFwib2JqZWN0XCJcbiAgICAgICAgPyAvKiogQHR5cGUge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnfSAqLyAoYXR0cmlidXRlQ29uZmlnKVxuICAgICAgICA6IG51bGxcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRBdHRyaWJ1dGVDb25maWcgPSBhd2FpdCB0aGlzLnJlc29sdmVkRnJvbnRlbmRBdHRyaWJ1dGVDb25maWcoe1xuICAgICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIGNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWcsXG4gICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgIHJlc291cmNlQ2xhc3NcbiAgICAgIH0pXG4gICAgICBjb25zdCBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyA9IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JHZW5lcmF0ZWRBdHRyaWJ1dGUoe1xuICAgICAgICBhdHRyaWJ1dGVDb25maWc6IG5vcm1hbGl6ZWRBdHRyaWJ1dGVDb25maWcsXG4gICAgICAgIGF0dHJpYnV0ZU5hbWUsXG4gICAgICAgIG1vZGVsQ2xhc3NcbiAgICAgIH0pXG5cbiAgICAgIGF0dHJpYnV0ZURlZmluaXRpb25zLnB1c2goe1xuICAgICAgICBqc0RvY1R5cGU6IHRoaXMuanNEb2NUeXBlRm9yRnJvbnRlbmRBdHRyaWJ1dGUoe2F0dHJpYnV0ZUNvbmZpZzogZnJvbnRlbmRBdHRyaWJ1dGVDb25maWd9KSxcbiAgICAgICAgbmFtZTogYXR0cmlidXRlTmFtZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlRGVmaW5pdGlvbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgZm9yIGdlbmVyYXRlZCBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7e2F0dHJpYnV0ZUNvbmZpZzogRnJvbnRlbmRBdHRyaWJ1dGVDb25maWcsIGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfX0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnfSAtIEF0dHJpYnV0ZSBjb25maWcgdXNlZCBmb3IgZ2VuZXJhdGVkIEpTRG9jLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JHZW5lcmF0ZWRBdHRyaWJ1dGUoe2F0dHJpYnV0ZUNvbmZpZywgYXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pIHtcbiAgICBpZiAoIXRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVJc01vZGVsUHJpbWFyeUtleSh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pKSByZXR1cm4gYXR0cmlidXRlQ29uZmlnXG4gICAgaWYgKHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdIYXNOdWxsYWJpbGl0eShhdHRyaWJ1dGVDb25maWcpKSByZXR1cm4gYXR0cmlidXRlQ29uZmlnXG5cbiAgICByZXR1cm4gey4uLmF0dHJpYnV0ZUNvbmZpZywgbnVsbDogZmFsc2V9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgaXMgbW9kZWwgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7e2F0dHJpYnV0ZU5hbWU6IHN0cmluZywgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfX0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgYXR0cmlidXRlIGlzIHRoZSBtb2RlbCBwcmltYXJ5IGtleS5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlSXNNb2RlbFByaW1hcnlLZXkoe2F0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3N9KSB7XG4gICAgaWYgKCFtb2RlbENsYXNzKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSBtb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuXG4gICAgaWYgKHR5cGVvZiBwcmltYXJ5S2V5ICE9IFwic3RyaW5nXCIgfHwgcHJpbWFyeUtleS5sZW5ndGggPCAxKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoYXR0cmlidXRlTmFtZSA9PT0gcHJpbWFyeUtleSkgcmV0dXJuIHRydWVcblxuICAgIHJldHVybiBtb2RlbENsYXNzLnJlc29sdmVBdHRyaWJ1dGVOYW1lKHByaW1hcnlLZXkpID09PSBhdHRyaWJ1dGVOYW1lXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHByaW1hcnkga2V5IGZyb20gZXhwbGljaXQgcmVzb3VyY2UgY29uZmlnIG9yIHRoZSBiYWNrZW5kIG1vZGVsLlxuICAgKiBAcGFyYW0ge3thdHRyaWJ1dGVOYW1lczogQXJyYXk8c3RyaW5nPiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkLCBtb2RlbENvbmZpZzogaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbn19IGFyZ3MgLSBQcmltYXJ5IGtleSByZXNvbHV0aW9uIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBBcnJheTxzdHJpbmc+fSAtIEZyb250ZW5kLW1vZGVsIHByaW1hcnkga2V5IGF0dHJpYnV0ZSBuYW1lLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbFByaW1hcnlLZXlGb3JSZXNvdXJjZSh7YXR0cmlidXRlTmFtZXMsIG1vZGVsQ2xhc3MsIG1vZGVsQ29uZmlnfSkge1xuICAgIGlmIChtb2RlbENvbmZpZy5wcmltYXJ5S2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZWRDb25maWd1cmVkUHJpbWFyeUtleSh7YXR0cmlidXRlTmFtZXMsIHByaW1hcnlLZXk6IG1vZGVsQ29uZmlnLnByaW1hcnlLZXl9KVxuICAgIH1cblxuICAgIGlmICghbW9kZWxDbGFzcykgcmV0dXJuIFwiaWRcIlxuXG4gICAgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbFByaW1hcnlLZXlGb3JNb2RlbENsYXNzKHthdHRyaWJ1dGVOYW1lcywgbW9kZWxDbGFzc30pXG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFuIGV4cGxpY2l0bHkgY29uZmlndXJlZCBmcm9udGVuZC1tb2RlbCBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHt7YXR0cmlidXRlTmFtZXM6IEFycmF5PHN0cmluZz4sIHByaW1hcnlLZXk6IHN0cmluZ319IGFyZ3MgLSBDb25maWd1cmVkIHByaW1hcnkga2V5IGFyZ3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQ29uZmlndXJlZCBwcmltYXJ5IGtleS5cbiAgICovXG4gIHZhbGlkYXRlZENvbmZpZ3VyZWRQcmltYXJ5S2V5KHthdHRyaWJ1dGVOYW1lcywgcHJpbWFyeUtleX0pIHtcbiAgICBpZiAoYXR0cmlidXRlTmFtZXMuaW5jbHVkZXMocHJpbWFyeUtleSkpIHJldHVybiBwcmltYXJ5S2V5XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvbmZpZ3VyZWQgZnJvbnRlbmQgbW9kZWwgcHJpbWFyeSBrZXkgXCIke3ByaW1hcnlLZXl9XCIgaXMgbm90IGEgZ2VuZXJhdGVkIGZyb250ZW5kIG1vZGVsIGF0dHJpYnV0ZS5gKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBiYWNrZW5kIHByaW1hcnkga2V5IHRvIGdlbmVyYXRlZCBmcm9udGVuZC1tb2RlbCBhdHRyaWJ1dGUgbmFtZXMuXG4gICAqIEBwYXJhbSB7e2F0dHJpYnV0ZU5hbWVzOiBBcnJheTxzdHJpbmc+LCBtb2RlbENsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9fSBhcmdzIC0gUHJpbWFyeSBrZXkgcmVzb2x1dGlvbiBhcmdzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nPn0gLSBGcm9udGVuZC1tb2RlbCBwcmltYXJ5IGtleSBhdHRyaWJ1dGUgbmFtZS5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxQcmltYXJ5S2V5Rm9yTW9kZWxDbGFzcyh7YXR0cmlidXRlTmFtZXMsIG1vZGVsQ2xhc3N9KSB7XG4gICAgY29uc3QgcHJpbWFyeUtleSA9IG1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG5cbiAgICBpZiAocHJpbWFyeUtleSA9PT0gXCJpZFwiKSByZXR1cm4gXCJpZFwiXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcmltYXJ5S2V5KSkge1xuICAgICAgcmV0dXJuIHByaW1hcnlLZXkubWFwKChjb2x1bW5OYW1lKSA9PiB0aGlzLmZyb250ZW5kTW9kZWxQcmltYXJ5S2V5QXR0cmlidXRlTmFtZSh7YXR0cmlidXRlTmFtZXMsIGNvbHVtbk5hbWUsIG1vZGVsQ2xhc3N9KSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsUHJpbWFyeUtleUF0dHJpYnV0ZU5hbWUoe2F0dHJpYnV0ZU5hbWVzLCBjb2x1bW5OYW1lOiBwcmltYXJ5S2V5LCBtb2RlbENsYXNzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBvbmUgYmFja2VuZCBwcmltYXJ5IGtleSBjb2x1bW4gdG8gYSBnZW5lcmF0ZWQgZnJvbnRlbmQtbW9kZWwgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7e2F0dHJpYnV0ZU5hbWVzOiBBcnJheTxzdHJpbmc+LCBjb2x1bW5OYW1lOiBzdHJpbmcsIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH19IGFyZ3MgLSBQcmltYXJ5IGtleSBhcmdzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZyb250ZW5kLW1vZGVsIHByaW1hcnkga2V5IGF0dHJpYnV0ZSBuYW1lLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbFByaW1hcnlLZXlBdHRyaWJ1dGVOYW1lKHthdHRyaWJ1dGVOYW1lcywgY29sdW1uTmFtZSwgbW9kZWxDbGFzc30pIHtcbiAgICBpZiAoYXR0cmlidXRlTmFtZXMuaW5jbHVkZXMoY29sdW1uTmFtZSkpIHJldHVybiBjb2x1bW5OYW1lXG5cbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gbW9kZWxDbGFzcy5yZXNvbHZlQXR0cmlidXRlTmFtZShjb2x1bW5OYW1lKVxuXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWUgJiYgYXR0cmlidXRlTmFtZXMuaW5jbHVkZXMoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGAke21vZGVsQ2xhc3MubmFtZX0ucHJpbWFyeUtleSgpIGNvbHVtbiBcIiR7Y29sdW1uTmFtZX1cIiBkb2VzIG5vdCByZXNvbHZlIHRvIGEgZ2VuZXJhdGVkIGZyb250ZW5kIG1vZGVsIGF0dHJpYnV0ZS5gKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgZnJvbSBleHBsaWNpdCBtZXRhZGF0YSwgcmVzb3VyY2UgbWV0aG9kcywgbW9kZWwgY29sdW1ucywgdHJhbnNsYXRlZCBjb2x1bW5zLCBvciBtb2RlbCBhY2Nlc3NvciBKU0RvYy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZU5hbWUgLSBGcm9udGVuZCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2xhc3NOYW1lIC0gRnJvbnRlbmQgbW9kZWwgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGx9IGFyZ3MuY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZyAtIFJlc291cmNlLXByb3ZpZGVkIGF0dHJpYnV0ZSBjb25maWcuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLm1vZGVsQ2xhc3MgLSBCYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5yZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEZyb250ZW5kQXR0cmlidXRlQ29uZmlnPn0gLSBSZXNvbHZlZCBmcm9udGVuZCBhdHRyaWJ1dGUgY29uZmlnLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZWRGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyh7YXR0cmlidXRlTmFtZSwgY2xhc3NOYW1lLCBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnLCBtb2RlbENsYXNzLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGNvbnN0IGluZmVycmVkUmVzb3VyY2VDb25maWcgPSBhd2FpdCB0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yUmVzb3VyY2VBdHRyaWJ1dGUoe2F0dHJpYnV0ZU5hbWUsIHJlc291cmNlQ2xhc3N9KVxuICAgIGNvbnN0IGluZmVycmVkQ29sdW1uQ29uZmlnID0gaW5mZXJyZWRSZXNvdXJjZUNvbmZpZ1xuICAgICAgPyBudWxsXG4gICAgICA6IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JNb2RlbEF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pXG4gICAgY29uc3QgaW5mZXJyZWRUcmFuc2xhdGVkQ29uZmlnID0gaW5mZXJyZWRSZXNvdXJjZUNvbmZpZyB8fCBpbmZlcnJlZENvbHVtbkNvbmZpZ1xuICAgICAgPyBudWxsXG4gICAgICA6IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JUcmFuc2xhdGVkQXR0cmlidXRlKHthdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzLCByZXNvdXJjZUNsYXNzfSlcbiAgICBjb25zdCBpbmZlcnJlZE1vZGVsQWNjZXNzb3JDb25maWcgPSBpbmZlcnJlZFJlc291cmNlQ29uZmlnIHx8IGluZmVycmVkQ29sdW1uQ29uZmlnIHx8IGluZmVycmVkVHJhbnNsYXRlZENvbmZpZ1xuICAgICAgPyBudWxsXG4gICAgICA6IGF3YWl0IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JNb2RlbEFjY2Vzc29yKHthdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzfSlcbiAgICBjb25zdCBpbmZlcnJlZENvbmZpZyA9IGluZmVycmVkUmVzb3VyY2VDb25maWcgfHwgaW5mZXJyZWRDb2x1bW5Db25maWcgfHwgaW5mZXJyZWRUcmFuc2xhdGVkQ29uZmlnIHx8IGluZmVycmVkTW9kZWxBY2Nlc3NvckNvbmZpZ1xuXG4gICAgaWYgKGNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWcgJiYgdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0hhc1R5cGUoY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZykpIHtcbiAgICAgIHJldHVybiBpbmZlcnJlZENvbmZpZ1xuICAgICAgICA/IHsuLi5pbmZlcnJlZENvbmZpZywgLi4uY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZ31cbiAgICAgICAgOiBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnXG4gICAgfVxuXG4gICAgaWYgKGluZmVycmVkQ29uZmlnKSB7XG4gICAgICByZXR1cm4gY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZ1xuICAgICAgICA/IHsuLi5pbmZlcnJlZENvbmZpZywgLi4uY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZ31cbiAgICAgICAgOiBpbmZlcnJlZENvbmZpZ1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGluZmVyIEpTRG9jIHR5cGUgZm9yIGZyb250ZW5kIG1vZGVsIGF0dHJpYnV0ZSAnJHtjbGFzc05hbWV9IyR7YXR0cmlidXRlTmFtZX0nLiBBZGQgYSBiYWNrZW5kIG1vZGVsIGNvbHVtbiwgdHJhbnNsYXRpb24gdGFibGUgY29sdW1uLCBleHBsaWNpdCByZXNvdXJjZSBtZXRhZGF0YSwgb3IgYSBAcmV0dXJucyBKU0RvYyB0eXBlIG9uICR7cmVzb3VyY2VDbGFzcz8ubmFtZSB8fCBcInRoZSByZXNvdXJjZVwifS4ke2F0dHJpYnV0ZU5hbWV9QXR0cmlidXRlKCkuYClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgaGFzIHR5cGUuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkfSBhdHRyaWJ1dGVDb25maWcgLSBBdHRyaWJ1dGUgY29uZmlnLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBjb25maWcgZGVjbGFyZXMgYSB0eXBlIHNvdXJjZS5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlQ29uZmlnSGFzVHlwZShhdHRyaWJ1dGVDb25maWcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVUeXBlVmFsdWUoYXR0cmlidXRlQ29uZmlnKSA9PSBcInN0cmluZ1wiXG4gICAgICB8fCB0eXBlb2YgYXR0cmlidXRlQ29uZmlnPy5qc0RvY1R5cGUgPT0gXCJzdHJpbmdcIlxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGNvbmZpZyBoYXMgbnVsbGFiaWxpdHkuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkfSBhdHRyaWJ1dGVDb25maWcgLSBBdHRyaWJ1dGUgY29uZmlnLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBjb25maWcgZGVjbGFyZXMgbnVsbGFiaWxpdHkuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0hhc051bGxhYmlsaXR5KGF0dHJpYnV0ZUNvbmZpZykge1xuICAgIGlmICghYXR0cmlidXRlQ29uZmlnIHx8IHR5cGVvZiBhdHRyaWJ1dGVDb25maWcgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZVxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXR0cmlidXRlQ29uZmlnLCBcIm51bGxcIikpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gdHlwZW9mIGF0dHJpYnV0ZUNvbmZpZy5nZXROdWxsID09IFwiZnVuY3Rpb25cIlxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMganMgZG9jIHR5cGUgZm9yIGZyb250ZW5kIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkfSBhcmdzLmF0dHJpYnV0ZUNvbmZpZyAtIEF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEpTRG9jIHR5cGUuXG4gICAqL1xuICBqc0RvY1R5cGVGb3JGcm9udGVuZEF0dHJpYnV0ZSh7YXR0cmlidXRlQ29uZmlnfSkge1xuICAgIGlmIChhdHRyaWJ1dGVDb25maWcgJiYgdHlwZW9mIGF0dHJpYnV0ZUNvbmZpZy5qc0RvY1R5cGUgPT0gXCJzdHJpbmdcIiAmJiBhdHRyaWJ1dGVDb25maWcuanNEb2NUeXBlLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVDb25maWcuanNEb2NUeXBlXG4gICAgfVxuXG4gICAgY29uc3QganNEb2NUeXBlID0gdGhpcy5qc0RvY1R5cGVGb3JGcm9udGVuZEF0dHJpYnV0ZUJhc2VUeXBlKGF0dHJpYnV0ZUNvbmZpZylcblxuICAgIGlmICghdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNhbkJlTnVsbChhdHRyaWJ1dGVDb25maWcpKSB7XG4gICAgICByZXR1cm4ganNEb2NUeXBlXG4gICAgfVxuXG4gICAgcmV0dXJuIGAke2pzRG9jVHlwZX0gfCBudWxsYFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMganMgZG9jIHR5cGUgZm9yIGZyb250ZW5kIGF0dHJpYnV0ZSBiYXNlIHR5cGUuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkfSBhdHRyaWJ1dGVDb25maWcgLSBBdHRyaWJ1dGUgY29uZmlndXJhdGlvbiB2YWx1ZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBOb24tbnVsbGFibGUgSlNEb2MgdHlwZS5cbiAgICovXG4gIGpzRG9jVHlwZUZvckZyb250ZW5kQXR0cmlidXRlQmFzZVR5cGUoYXR0cmlidXRlQ29uZmlnKSB7XG4gICAgaWYgKCFhdHRyaWJ1dGVDb25maWcgfHwgdHlwZW9mIGF0dHJpYnV0ZUNvbmZpZyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIFwiRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlXCJcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlID0gdGhpcy5mcm9udGVuZEF0dHJpYnV0ZVR5cGVWYWx1ZShhdHRyaWJ1dGVDb25maWcpXG5cbiAgICBpZiAodHlwZSA9PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIFwiYm9vbGVhblwiXG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwianNvblwiIHx8IHR5cGUgPT0gXCJqc29uYlwiKSB7XG4gICAgICByZXR1cm4gXCJGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWVcIlxuICAgIH0gZWxzZSBpZiAodHlwZSAmJiBbXCJibG9iXCIsIFwiY2hhclwiLCBcIm52YXJjaGFyXCIsIFwidmFyY2hhclwiLCBcInRleHRcIiwgXCJsb25ndGV4dFwiLCBcIm1lZGl1bXRleHRcIiwgXCJ0aW55dGV4dFwiLCBcInV1aWRcIiwgXCJjaGFyYWN0ZXIgdmFyeWluZ1wiXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nXCJcbiAgICB9IGVsc2UgaWYgKHR5cGUgJiYgW1wiYml0XCIsIFwiYmlnaW50XCIsIFwiZGVjaW1hbFwiLCBcImRvdWJsZVwiLCBcImRvdWJsZSBwcmVjaXNpb25cIiwgXCJmbG9hdFwiLCBcImludFwiLCBcImludGVnZXJcIiwgXCJudW1lcmljXCIsIFwicmVhbFwiLCBcInNtYWxsaW50XCIsIFwidGlueWludFwiXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIFwibnVtYmVyXCJcbiAgICB9IGVsc2UgaWYgKHR5cGUgJiYgW1wiZGF0ZVwiLCBcImRhdGV0aW1lXCIsIFwidGltZXN0YW1wXCIsIFwidGltZXN0YW1wIHdpdGhvdXQgdGltZSB6b25lXCIsIFwidGltZXN0YW1wdHpcIl0uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgIHJldHVybiBcIkRhdGVcIlxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJGcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWVcIlxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjYW4gYmUgbnVsbC5cbiAgICogQHBhcmFtIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGwgfCB1bmRlZmluZWR9IGF0dHJpYnV0ZUNvbmZpZyAtIEF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBhdHRyaWJ1dGUgYWxsb3dzIG51bGwgdmFsdWVzLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVDYW5CZU51bGwoYXR0cmlidXRlQ29uZmlnKSB7XG4gICAgaWYgKCFhdHRyaWJ1dGVDb25maWcgfHwgdHlwZW9mIGF0dHJpYnV0ZUNvbmZpZyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVDb25maWcuZ2V0TnVsbCA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVDb25maWcuZ2V0TnVsbCgpID09PSB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZUNvbmZpZy5udWxsID09PSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgdHlwZSB2YWx1ZS5cbiAgICogQHBhcmFtIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGwgfCB1bmRlZmluZWR9IGF0dHJpYnV0ZUNvbmZpZyAtIEF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gLSBOb3JtYWxpemVkIGNvbHVtbiB0eXBlLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVUeXBlVmFsdWUoYXR0cmlidXRlQ29uZmlnKSB7XG4gICAgaWYgKCFhdHRyaWJ1dGVDb25maWcgfHwgdHlwZW9mIGF0dHJpYnV0ZUNvbmZpZyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZUNvbmZpZy5nZXRUeXBlID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIFN0cmluZyhhdHRyaWJ1dGVDb25maWcuZ2V0VHlwZSgpKVxuICAgIH1cblxuICAgIGNvbnN0IHR5cGVWYWx1ZSA9IGF0dHJpYnV0ZUNvbmZpZy50eXBlIHx8IGF0dHJpYnV0ZUNvbmZpZy5jb2x1bW5UeXBlIHx8IGF0dHJpYnV0ZUNvbmZpZy5zcWxUeXBlIHx8IGF0dHJpYnV0ZUNvbmZpZy5kYXRhVHlwZVxuXG4gICAgaWYgKHR5cGVvZiB0eXBlVmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGNvbmZpZyBmb3IgcmVzb3VyY2UgYXR0cmlidXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXR0cmlidXRlTmFtZSAtIEZyb250ZW5kIG1vZGVsIGF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5yZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEZyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbD59IC0gQXR0cmlidXRlIGNvbmZpZyBpbmZlcnJlZCBmcm9tIHJlc291cmNlIG1ldGhvZCBKU0RvYy5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yUmVzb3VyY2VBdHRyaWJ1dGUoe2F0dHJpYnV0ZU5hbWUsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgaWYgKCFyZXNvdXJjZUNsYXNzKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IGAke2F0dHJpYnV0ZU5hbWV9QXR0cmlidXRlYFxuICAgIGNvbnN0IG93bmVyQ2xhc3NOYW1lID0gdGhpcy5tZXRob2RPd25lckNsYXNzTmFtZSh7bWV0aG9kTmFtZSwgdGFyZ2V0Q2xhc3M6IHJlc291cmNlQ2xhc3N9KVxuXG4gICAgaWYgKCFvd25lckNsYXNzTmFtZSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGpzRG9jVHlwZSA9IGF3YWl0IHRoaXMucmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlKHtcbiAgICAgIG1ldGhvZE5hbWUsXG4gICAgICBzb3VyY2VDbGFzc05hbWU6IG93bmVyQ2xhc3NOYW1lXG4gICAgfSlcblxuICAgIHJldHVybiBqc0RvY1R5cGUgPyB7anNEb2NUeXBlOiB0aGlzLnVud3JhcHBlZFByb21pc2VKc0RvY1R5cGUoe2pzRG9jVHlwZX0pfSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgZm9yIHRyYW5zbGF0ZWQgYXR0cmlidXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXR0cmlidXRlTmFtZSAtIEZyb250ZW5kIG1vZGVsIGF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYXJncy5tb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGwgfCB1bmRlZmluZWR9IGFyZ3MucmVzb3VyY2VDbGFzcyAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsfSAtIEF0dHJpYnV0ZSBjb25maWcgaW5mZXJyZWQgZnJvbSB0cmFuc2xhdGVkIGF0dHJpYnV0ZSBjb2x1bW5zLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JUcmFuc2xhdGVkQXR0cmlidXRlKHthdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGlmICghbW9kZWxDbGFzcykgcmV0dXJuIG51bGxcbiAgICBpZiAoIXRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVJc1RyYW5zbGF0ZWQoe2F0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3MsIHJlc291cmNlQ2xhc3N9KSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IFRyYW5zbGF0aW9uQ2xhc3MgPSBtb2RlbENsYXNzLmdldFRyYW5zbGF0aW9uQ2xhc3MoKVxuICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcblxuICAgIGxldCBjb2x1bW5cblxuICAgIHRyeSB7XG4gICAgICBjb2x1bW4gPSBUcmFuc2xhdGlvbkNsYXNzLmdldENvbHVtbnNIYXNoKClbY29sdW1uTmFtZV1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcIikgfHwgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcInVzZWQgYmVmb3JlIGluaXRpYWxpemF0aW9uXCIpKSkgcmV0dXJuIG51bGxcblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICByZXR1cm4gY29sdW1uID8gdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0ZvckNvbHVtbih7Y29sdW1ufSkgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgaXMgdHJhbnNsYXRlZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZU5hbWUgLSBGcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MubW9kZWxDbGFzcyAtIEJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsIHwgdW5kZWZpbmVkfSBhcmdzLnJlc291cmNlQ2xhc3MgLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgZnJvbnRlbmQgYXR0cmlidXRlIGlzIHRyYW5zbGF0ZWQuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUlzVHJhbnNsYXRlZCh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzcywgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBpZiAocmVzb3VyY2VDbGFzcykge1xuICAgICAgY29uc3QgdHJhbnNsYXRlZEF0dHJpYnV0ZXMgPSByZXNvdXJjZUNsYXNzLnRyYW5zbGF0ZWRBdHRyaWJ1dGVzXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRyYW5zbGF0ZWRBdHRyaWJ1dGVzKSAmJiB0cmFuc2xhdGVkQXR0cmlidXRlcy5pbmNsdWRlcyhhdHRyaWJ1dGVOYW1lKSkgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSBtb2RlbENsYXNzLl90cmFuc2xhdGlvbnNcblxuICAgIHJldHVybiBCb29sZWFuKHRyYW5zbGF0aW9ucyAmJiB0eXBlb2YgdHJhbnNsYXRpb25zID09IFwib2JqZWN0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRyYW5zbGF0aW9ucywgYXR0cmlidXRlTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgY29uZmlnIGZvciBtb2RlbCBhY2Nlc3Nvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZU5hbWUgLSBGcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MubW9kZWxDbGFzcyAtIEJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEZyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbD59IC0gQXR0cmlidXRlIGNvbmZpZyBpbmZlcnJlZCBmcm9tIG1vZGVsIGFjY2Vzc29yIEpTRG9jLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JNb2RlbEFjY2Vzc29yKHthdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzfSkge1xuICAgIGlmICghbW9kZWxDbGFzcykgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IG93bmVyQ2xhc3NOYW1lID0gdGhpcy5tZXRob2RPd25lckNsYXNzTmFtZSh7bWV0aG9kTmFtZTogYXR0cmlidXRlTmFtZSwgdGFyZ2V0Q2xhc3M6IG1vZGVsQ2xhc3N9KVxuXG4gICAgaWYgKCFvd25lckNsYXNzTmFtZSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGpzRG9jVHlwZSA9IGF3YWl0IHRoaXMucmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlKHtcbiAgICAgIG1ldGhvZE5hbWU6IGF0dHJpYnV0ZU5hbWUsXG4gICAgICBzb3VyY2VDbGFzc05hbWU6IG93bmVyQ2xhc3NOYW1lXG4gICAgfSlcblxuICAgIC8vIEZyb250ZW5kIGF0dHJpYnV0ZXMgaG9sZCB0aGUgc2VyaWFsaXplZCAocmVzb2x2ZWQpIHZhbHVlLCBzbyBhbiBhc3luY1xuICAgIC8vIGJhY2tlbmQgYWNjZXNzb3IgdHlwZWQgYFByb21pc2U8bnVtYmVyPmAgbXVzdCBzdXJmYWNlIGFzIGBudW1iZXJgIOKAlCB0aGVcbiAgICAvLyBzYW1lIHVud3JhcHBpbmcgdGhlIHJlc291cmNlLW1ldGhvZCBpbmZlcmVuY2UgcGF0aCBhcHBsaWVzLlxuICAgIHJldHVybiBqc0RvY1R5cGVcbiAgICAgID8ge2pzRG9jVHlwZTogdGhpcy5mcm9udGVuZFJlc29sdmFibGVBdHRyaWJ1dGVKc0RvY1R5cGUodGhpcy51bndyYXBwZWRQcm9taXNlSnNEb2NUeXBlKHtqc0RvY1R5cGV9KSl9XG4gICAgICA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGJhY2tlbmQgYWNjZXNzb3IncyBgQHJldHVybnNgIGNhbiByZWZlcmVuY2UgdHlwZXMgdGhhdCBleGlzdCBvbmx5IG9uIHRoZVxuICAgKiBiYWNrZW5kIChlLmcuIGEgbW9kZWwtbG9jYWwgYEB0eXBlZGVmIEFnZW50UnVuUGxhbm5pbmdBcnRpZmFjdGApLiBUaGUgZnJvbnRlbmRcbiAgICogbW9kZWwgY2FuJ3QgcmVzb2x2ZSB0aG9zZSwgc28gZmFsbCBiYWNrIHRvIGBhbnlgIHJhdGhlciB0aGFuIGVtaXR0aW5nIGFuXG4gICAqIHVuZGVmaW5lZCB0eXBlIG5hbWUuIFR5cGVzIGJ1aWx0IG9ubHkgZnJvbSBwcmltaXRpdmVzIGFuZCBrbm93biBnZW5lcmljXG4gICAqIGJ1aWx0aW5zIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqc0RvY1R5cGUgLSBSZXNvbHZlZCAoUHJvbWlzZS11bndyYXBwZWQpIGF0dHJpYnV0ZSB0eXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEEgZnJvbnRlbmQtcmVzb2x2YWJsZSBhdHRyaWJ1dGUgdHlwZS5cbiAgICovXG4gIGZyb250ZW5kUmVzb2x2YWJsZUF0dHJpYnV0ZUpzRG9jVHlwZShqc0RvY1R5cGUpIHtcbiAgICBjb25zdCBzYWZlVHlwZUlkZW50aWZpZXJzID0gdGhpcy5mcm9udGVuZFJlc29sdmFibGVUeXBlSWRlbnRpZmllcnMoKVxuICAgIGNvbnN0IHJlZmVyZW5jZWRJZGVudGlmaWVycyA9IGpzRG9jVHlwZS5tYXRjaCgvW0EtWl1bQS1aYS16MC05XyRdKi9nKSB8fCBbXVxuXG4gICAgaWYgKHJlZmVyZW5jZWRJZGVudGlmaWVycy5zb21lKChpZGVudGlmaWVyKSA9PiAhc2FmZVR5cGVJZGVudGlmaWVycy5oYXMoaWRlbnRpZmllcikpKSB7XG4gICAgICByZXR1cm4gXCJhbnlcIlxuICAgIH1cblxuICAgIHJldHVybiBqc0RvY1R5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXBpdGFsaXplZCBpZGVudGlmaWVycyBhIGdlbmVyYXRlZCBmcm9udGVuZCBtb2RlbCBjYW4gcmVzb2x2ZSBvbiBpdHMgb3duXG4gICAqIChwcmltaXRpdmVzIGFyZSBsb3dlci1jYXNlIGFuZCBtYXRjaGVkIHNlcGFyYXRlbHkpLCBzbyBvbmx5IGZyYW1ld29yay1vd25lZFxuICAgKiBhbmQgYnVpbHRpbiBnZW5lcmljIHR5cGVzIGFyZSBsaXN0ZWQuXG4gICAqIEByZXR1cm5zIHtTZXQ8c3RyaW5nPn0gLSBGcm9udGVuZC1yZXNvbHZhYmxlIHR5cGUgaWRlbnRpZmllcnMuXG4gICAqL1xuICBmcm9udGVuZFJlc29sdmFibGVUeXBlSWRlbnRpZmllcnMoKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQoW1xuICAgICAgXCJBcnJheVwiLCBcIkRhdGVcIiwgXCJFeGNsdWRlXCIsIFwiRXh0cmFjdFwiLCBcIkZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZVwiLCBcIkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZVwiLFxuICAgICAgXCJNYXBcIiwgXCJOb25OdWxsYWJsZVwiLCBcIk9taXRcIiwgXCJQYXJ0aWFsXCIsIFwiUGlja1wiLCBcIlByb21pc2VcIiwgXCJSZWFkb25seVwiLCBcIlJlYWRvbmx5QXJyYXlcIiwgXCJSZWNvcmRcIixcbiAgICAgIFwiUmVxdWlyZWRcIiwgXCJSZXR1cm5UeXBlXCIsIFwiU2V0XCJcbiAgICBdKVxuICB9XG5cbiAgLyoqXG4gICAqIFJld3JpdGVzIGEgY3VzdG9tLWNvbW1hbmQgcGFyYW0vcmV0dXJuIEpTRG9jIHR5cGUgc28gaXQgcmVzb2x2ZXMgaW4gdGhlIGdlbmVyYXRlZFxuICAgKiBmcm9udGVuZCBtb2RlbDogZWFjaCBtb2RlbC1jbGFzcyAob3Igb3RoZXJ3aXNlIG5vbi1mcm9udGVuZC1yZXNvbHZhYmxlKSBpZGVudGlmaWVyXG4gICAqIGJlY29tZXMgYGFueWAgaW4gcGxhY2UsIGtlZXBpbmcgdGhlIHN1cnJvdW5kaW5nIG9iamVjdCBmaWVsZHMgdHlwZWQuIEEgY29tbWFuZC1yZXN1bHRcbiAgICogZmllbGQgaG9sZGluZyBhIG1vZGVsIGFycml2ZXMgYXMgYSBzZXJpYWxpemVkIHRyYW5zcG9ydCB2YWx1ZSwgc28gdGhlIGNvbnN1bWVyIGh5ZHJhdGVzXG4gICAqIGl0IHdpdGggYE1vZGVsLmluc3RhbnRpYXRlRnJvbVJlc3BvbnNlKC4uLilgLiBUaGUgd29yZCBib3VuZGFyeSBhdm9pZHMgbWF0Y2hpbmcgdGhlXG4gICAqIGNhcGl0YWxpemVkIG1pZGRsZSBvZiBhIGNhbWVsQ2FzZSBwcm9wZXJ0eSBuYW1lIChlLmcuIGBhZGp1c3RlZFRvdGFsQ2VudHNgKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGpzRG9jVHlwZSAtIFJlc29sdmVkIChQcm9taXNlLXVud3JhcHBlZCkgSlNEb2MgdHlwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBBIGZyb250ZW5kLXJlc29sdmFibGUgSlNEb2MgdHlwZS5cbiAgICovXG4gIGZyb250ZW5kUmVzb2x2YWJsZUNvbW1hbmRKc0RvY1R5cGUoanNEb2NUeXBlKSB7XG4gICAgY29uc3Qgc2FmZVR5cGVJZGVudGlmaWVycyA9IHRoaXMuZnJvbnRlbmRSZXNvbHZhYmxlVHlwZUlkZW50aWZpZXJzKClcblxuICAgIHJldHVybiBqc0RvY1R5cGVcbiAgICAgIC8vIEEgdHlwZSB0aGF0IHJlYWNoZXMgaW50byBhIGJhY2tlbmQgc291cmNlIGZpbGUgdmlhIGBpbXBvcnQoXCIuLi5cIilgIChvcHRpb25hbGx5XG4gICAgICAvLyBgLk1lbWJlcmAgYW5kIGBbXWApIGNhbid0IHJlc29sdmUgZnJvbSB0aGUgZ2VuZXJhdGVkIGZyb250ZW5kIG1vZGVsIGFuZCB3b3VsZCB0eXBlXG4gICAgICAvLyBhIHNlcmlhbGl6ZWQgcmVzdWx0IGFzIGEgYmFja2VuZCBtb2RlbCBpbnN0YW5jZSwgc28gY29sbGFwc2UgaXQgdG8gYGFueWAuXG4gICAgICAucmVwbGFjZSgvaW1wb3J0XFwoXFxzKltcIiddW15cIiddKltcIiddXFxzKlxcKShcXHMqXFwuXFxzKltBLVphLXpfJF1bXFx3JF0qKSooXFxzKlxcW1xccypcXF0pKi9nLCBcImFueVwiKVxuICAgICAgLy8gUmVtYWluaW5nIGNhcGl0YWxpemVkIGlkZW50aWZpZXJzIGFyZSBtb2RlbCBjbGFzc2VzIG9yIG90aGVyd2lzZSBub24tcmVzb2x2YWJsZVxuICAgICAgLy8gdHlwZXM7IGRvd25ncmFkZSBlYWNoIGluIHBsYWNlIHNvIHNpYmxpbmcgc2NhbGFyIGZpZWxkcyBrZWVwIHRoZWlyIHJlYWwgdHlwZXMuXG4gICAgICAucmVwbGFjZSgvXFxiW0EtWl1bQS1aYS16MC05XyRdKi9nLCAoaWRlbnRpZmllcikgPT4gc2FmZVR5cGVJZGVudGlmaWVycy5oYXMoaWRlbnRpZmllcikgPyBpZGVudGlmaWVyIDogXCJhbnlcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIEpTRG9jIHBhcmFtIGJsb2NrLCBwYXJhbWV0ZXIgbGlzdCwgcGF5bG9hZC1hcmd1bWVudCBleHByZXNzaW9uLCBhbmRcbiAgICogcmV0dXJuIHR5cGUgZm9yIGEgY3VzdG9tIGNvbW1hbmQgbWV0aG9kLiBXaXRoIGRlY2xhcmVkIGBhcmdzYCBlYWNoIGJlY29tZXMgYVxuICAgKiBuYW1lZCwgdHlwZWQgcGFyYW1ldGVyIG1hcHBlZCBwb3NpdGlvbmFsbHkgaW50byB0aGUgY29tbWFuZCBwYXlsb2FkOyB3aXRob3V0XG4gICAqIHRoZW0gdGhlIG1ldGhvZCBzdGF5cyB2YXJpYWRpYy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywge2FyZ3M6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+LCByZXR1cm5UeXBlOiBzdHJpbmcgfCBudWxsfT59IGFyZ3MuY29tbWFuZE1ldGFkYXRhIC0gUGVyLWNvbW1hbmQgbWV0YWRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1ldGhvZE5hbWUgLSBDb21tYW5kIG1ldGhvZCBuYW1lLlxuICAgKiBAcmV0dXJucyB7e3BhcmFtRG9jczogc3RyaW5nLCBwYXJhbWV0ZXJzOiBzdHJpbmcsIHBheWxvYWRBcmd1bWVudHM6IHN0cmluZywgcmV0dXJuVHlwZTogc3RyaW5nfX0gLSBHZW5lcmF0aW9uIHBpZWNlcy5cbiAgICovXG4gIGN1c3RvbUNvbW1hbmRNZXRob2RTaWduYXR1cmUoe2NvbW1hbmRNZXRhZGF0YSwgbWV0aG9kTmFtZX0pIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGNvbW1hbmRNZXRhZGF0YVttZXRob2ROYW1lXSB8fCB7YXJnczogW10sIHJldHVyblR5cGU6IG51bGx9XG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IG1ldGFkYXRhLnJldHVyblR5cGUgfHwgXCJSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWU+XCJcblxuICAgIGlmIChtZXRhZGF0YS5hcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlck5hbWVzID0gbWV0YWRhdGEuYXJncy5tYXAoKGFyZykgPT4gYXJnLm5hbWUpXG4gICAgICAvLyBBIHNpbmdsZSBhcmdzIG9iamVjdCB3aG9zZSBldmVyeSBmaWVsZCBpcyBvcHRpb25hbCBhY2NlcHRzIGB7fWAsIHNvIGRlZmF1bHRcbiAgICAgIC8vIHRoZSBwYXJhbWV0ZXIgYW5kIG1hcmsgaXQgb3B0aW9uYWwg4oCUIGNhbGxlcnMgY2FuIHRoZW4gb21pdCBpdCBlbnRpcmVseVxuICAgICAgLy8gKGByZWNvcmQuY29tbWFuZCgpYCBpbnN0ZWFkIG9mIGByZWNvcmQuY29tbWFuZCh7fSlgKS4gUmVxdWlyZWQtZmllbGQgYXJncyBrZWVwXG4gICAgICAvLyB0aGUgbWFuZGF0b3J5IHBhcmFtZXRlciAoYSBge31gIGRlZmF1bHQgd291bGRuJ3Qgc2F0aXNmeSB0aGVpciB0eXBlKS5cbiAgICAgIGNvbnN0IGRlZmF1bHRzVG9FbXB0eU9iamVjdCA9IG1ldGFkYXRhLmFyZ3MubGVuZ3RoID09PSAxICYmIHRoaXMuYXJnVHlwZUFjY2VwdHNFbXB0eU9iamVjdChtZXRhZGF0YS5hcmdzWzBdLnR5cGUpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhcmFtRG9jczogbWV0YWRhdGEuYXJncy5tYXAoKGFyZykgPT4gYCAgICogQHBhcmFtIHske2FyZy50eXBlfX0gJHtkZWZhdWx0c1RvRW1wdHlPYmplY3QgPyBgWyR7YXJnLm5hbWV9XWAgOiBhcmcubmFtZX0gLSBDb21tYW5kIGFyZ3VtZW50LlxcbmApLmpvaW4oXCJcIiksXG4gICAgICAgIHBhcmFtZXRlcnM6IGRlZmF1bHRzVG9FbXB0eU9iamVjdCA/IGAke3BhcmFtZXRlck5hbWVzWzBdfSA9IHt9YCA6IHBhcmFtZXRlck5hbWVzLmpvaW4oXCIsIFwiKSxcbiAgICAgICAgcGF5bG9hZEFyZ3VtZW50czogYFske3BhcmFtZXRlck5hbWVzLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgICAgcmV0dXJuVHlwZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwYXJhbURvY3M6IFwiICAgKiBAcGFyYW0gey4uLkZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZX0gY29tbWFuZEFyZ3VtZW50cyAtIEN1c3RvbSBjb21tYW5kIGFyZ3VtZW50cy5cXG5cIixcbiAgICAgIHBhcmFtZXRlcnM6IFwiLi4uY29tbWFuZEFyZ3VtZW50c1wiLFxuICAgICAgcGF5bG9hZEFyZ3VtZW50czogXCJjb21tYW5kQXJndW1lbnRzXCIsXG4gICAgICByZXR1cm5UeXBlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBzaW5nbGUgY29tbWFuZC1hcmdzIEpTRG9jIHR5cGUgaXMga25vd24gdG8gYWNjZXB0IGFuIGVtcHR5IG9iamVjdCBge31gOlxuICAgKiBhIHNpbmdsZSBiYWxhbmNlZCBvYmplY3QgbGl0ZXJhbCB3aG9zZSB0b3AtbGV2ZWwgbWVtYmVycyBhcmUgYWxsIG9wdGlvbmFsIChgbmFtZT86YClcbiAgICogb3IgaW5kZXggc2lnbmF0dXJlcyAoYFtrOiAuLi5dOmApLiBBbnl0aGluZyBlbHNlIHJldHVybnMgZmFsc2Ugc28gdGhlIHBhcmFtZXRlciBzdGF5c1xuICAgKiByZXF1aXJlZCDigJQgaW5jbHVkaW5nIGEgcmVxdWlyZWQgbWVtYmVyLCBhIG5vbi1vYmplY3QtbGl0ZXJhbCAoYSBwb3NpdGlvbmFsIGBudW1iZXJgLFxuICAgKiBhIGBSZWNvcmQ8Li4uPmAgLyBgUGFydGlhbDwuLi4+YCB3aG9zZSBrZXkvd3JhcHBlciBtYXkgc3RpbGwgcmVxdWlyZSBkYXRhKSwgYW5kIGFueVxuICAgKiBpbnRlcnNlY3Rpb24vdW5pb24gKGUuZy4gYHthPzogeH0gJiB7Yjogc3RyaW5nfWApLCB3aGVyZSBge31gIGlzIG5vdCBhc3NpZ25hYmxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBhcmcncyBKU0RvYyB0eXBlIHN0cmluZy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgZ2VuZXJhdGVkIHBhcmFtZXRlciBjYW4gZGVmYXVsdCB0byBge31gLlxuICAgKi9cbiAgYXJnVHlwZUFjY2VwdHNFbXB0eU9iamVjdCh0eXBlKSB7XG4gICAgY29uc3QgdHJpbW1lZFR5cGUgPSB0eXBlLnRyaW0oKVxuXG4gICAgLy8gTXVzdCBiZSBhIHNpbmdsZSBiYWxhbmNlZCBvYmplY3QgbGl0ZXJhbDogc3RhcnRzIHdpdGggYHtgLCBlbmRzIHdpdGggYH1gLCBhbmQgdGhlXG4gICAgLy8gb3BlbmluZyBicmFjZSBjbG9zZXMgb25seSBhdCB0aGUgZmluYWwgY2hhcmFjdGVyLiBUaGlzIHJlamVjdHMgaW50ZXJzZWN0aW9ucy91bmlvbnNcbiAgICAvLyBsaWtlIGB7YT86IHh9ICYge2I6IHN0cmluZ31gIHRoYXQgbWVyZWx5IGhhcHBlbiB0byBzdGFydCBge2AgYW5kIGVuZCBgfWAuXG4gICAgaWYgKCEodHJpbW1lZFR5cGUuc3RhcnRzV2l0aChcIntcIikgJiYgdHJpbW1lZFR5cGUuZW5kc1dpdGgoXCJ9XCIpKSkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKCF0aGlzLmlzU2luZ2xlQmFsYW5jZWRPYmplY3RMaXRlcmFsKHRyaW1tZWRUeXBlKSkgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBpbm5lciA9IHRyaW1tZWRUeXBlLnNsaWNlKDEsIC0xKVxuXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgdGhpcy5zcGxpdFRvcExldmVsVHlwZU1lbWJlcnMoaW5uZXIpKSB7XG4gICAgICBjb25zdCBjb2xvbkluZGV4ID0gdGhpcy50b3BMZXZlbENvbG9uSW5kZXgobWVtYmVyKVxuXG4gICAgICAvLyBObyB0b3AtbGV2ZWwgY29sb246IGEgY2FsbC9jb25zdHJ1Y3QvbWFwcGVkIHNpZ25hdHVyZSBvciBtYWxmb3JtZWQgbWVtYmVyIOKAlFxuICAgICAgLy8gY2FuJ3QgY29uZmlybSBpdCdzIG9wdGlvbmFsLCBzbyB0cmVhdCB0aGUgdHlwZSBhcyBub3QgZW1wdHktZGVmYXVsdGFibGUuXG4gICAgICBpZiAoY29sb25JbmRleCA8IDApIHJldHVybiBmYWxzZVxuXG4gICAgICBjb25zdCBrZXkgPSBtZW1iZXIuc2xpY2UoMCwgY29sb25JbmRleCkudHJpbSgpXG5cbiAgICAgIC8vIEluZGV4IHNpZ25hdHVyZXMgKGBbazogc3RyaW5nXWApIGRvbid0IHJlcXVpcmUgYSB2YWx1ZTsgb3B0aW9uYWwgcHJvcHMgZW5kIGluIGA/YC5cbiAgICAgIC8vIEFueXRoaW5nIGVsc2UgaXMgYSByZXF1aXJlZCBwcm9wZXJ0eSwgc28gYHt9YCB3b3VsZCBub3Qgc2F0aXNmeSB0aGUgdHlwZS5cbiAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoXCJbXCIpICYmICFrZXkuZW5kc1dpdGgoXCI/XCIpKSByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0cyB0aGUgaW5uZXIgYm9keSBvZiBhbiBvYmplY3QtbGl0ZXJhbCB0eXBlIGludG8gaXRzIHRvcC1sZXZlbCBtZW1iZXJzLFxuICAgKiByZXNwZWN0aW5nIG5lc3RlZCBge31gIC8gYFtdYCAvIGA8PmAgLyBgKClgIHNvIGZpZWxkIHR5cGVzIGxpa2UgYHN0cmluZ1tdIHwgbnVsbGBcbiAgICogb3IgYHthOiBifWAgYXJlbid0IHNwbGl0IG1pZC10eXBlLiBNZW1iZXJzIGFyZSBzZXBhcmF0ZWQgYnkgYCxgIG9yIGA7YC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGlubmVyIC0gT2JqZWN0LWxpdGVyYWwgYm9keSAod2l0aG91dCB0aGUgb3V0ZXIgYnJhY2VzKS5cbiAgICogQHJldHVybnMge3N0cmluZ1tdfSAtIFRyaW1tZWQgbm9uLWVtcHR5IHRvcC1sZXZlbCBtZW1iZXJzLlxuICAgKi9cbiAgc3BsaXRUb3BMZXZlbFR5cGVNZW1iZXJzKGlubmVyKSB7XG4gICAgY29uc3QgbWVtYmVycyA9IFtdXG4gICAgbGV0IGRlcHRoID0gMFxuICAgIGxldCBzdGFydCA9IDBcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBpbm5lci5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGNoYXJhY3RlciA9IGlubmVyW2luZGV4XVxuXG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBcIntcIiB8fCBjaGFyYWN0ZXIgPT09IFwiW1wiIHx8IGNoYXJhY3RlciA9PT0gXCI8XCIgfHwgY2hhcmFjdGVyID09PSBcIihcIikge1xuICAgICAgICBkZXB0aCArPSAxXG4gICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gXCJ9XCIgfHwgY2hhcmFjdGVyID09PSBcIl1cIiB8fCBjaGFyYWN0ZXIgPT09IFwiPlwiIHx8IGNoYXJhY3RlciA9PT0gXCIpXCIpIHtcbiAgICAgICAgZGVwdGggLT0gMVxuICAgICAgfSBlbHNlIGlmICgoY2hhcmFjdGVyID09PSBcIixcIiB8fCBjaGFyYWN0ZXIgPT09IFwiO1wiKSAmJiBkZXB0aCA9PT0gMCkge1xuICAgICAgICBtZW1iZXJzLnB1c2goaW5uZXIuc2xpY2Uoc3RhcnQsIGluZGV4KSlcbiAgICAgICAgc3RhcnQgPSBpbmRleCArIDFcbiAgICAgIH1cbiAgICB9XG5cbiAgICBtZW1iZXJzLnB1c2goaW5uZXIuc2xpY2Uoc3RhcnQpKVxuXG4gICAgcmV0dXJuIG1lbWJlcnMubWFwKChtZW1iZXIpID0+IG1lbWJlci50cmltKCkpLmZpbHRlcigobWVtYmVyKSA9PiBtZW1iZXIubGVuZ3RoID4gMClcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRleCBvZiB0aGUgZmlyc3QgdG9wLWxldmVsIGA6YCBpbiBhbiBvYmplY3QtbGl0ZXJhbCBtZW1iZXIsIGlnbm9yaW5nIGNvbG9uc1xuICAgKiBuZXN0ZWQgaW5zaWRlIGB7fWAgLyBgW11gIC8gYDw+YCAvIGAoKWAgKGUuZy4gYW4gaW5kZXggc2lnbmF0dXJlIGBbazogc3RyaW5nXWApLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVtYmVyIC0gQSBzaW5nbGUgb2JqZWN0LWxpdGVyYWwgbWVtYmVyLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIFRoZSBjb2xvbiBpbmRleCwgb3IgLTEgd2hlbiBub25lIGlzIGZvdW5kIGF0IHRoZSB0b3AgbGV2ZWwuXG4gICAqL1xuICB0b3BMZXZlbENvbG9uSW5kZXgobWVtYmVyKSB7XG4gICAgbGV0IGRlcHRoID0gMFxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG1lbWJlci5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGNoYXJhY3RlciA9IG1lbWJlcltpbmRleF1cblxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gXCJ7XCIgfHwgY2hhcmFjdGVyID09PSBcIltcIiB8fCBjaGFyYWN0ZXIgPT09IFwiPFwiIHx8IGNoYXJhY3RlciA9PT0gXCIoXCIpIHtcbiAgICAgICAgZGVwdGggKz0gMVxuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IFwifVwiIHx8IGNoYXJhY3RlciA9PT0gXCJdXCIgfHwgY2hhcmFjdGVyID09PSBcIj5cIiB8fCBjaGFyYWN0ZXIgPT09IFwiKVwiKSB7XG4gICAgICAgIGRlcHRoIC09IDFcbiAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBcIjpcIiAmJiBkZXB0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gaW5kZXhcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gLTFcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0eXBlIGlzIGEgc2luZ2xlIGJhbGFuY2VkIG9iamVjdCBsaXRlcmFsIOKAlCBpdHMgbGVhZGluZyBge2AgY2xvc2VzIG9ubHlcbiAgICogYXQgdGhlIGZpbmFsIGNoYXJhY3Rlci4gUmVqZWN0cyB0b3AtbGV2ZWwgaW50ZXJzZWN0aW9ucy91bmlvbnMgbGlrZSBge2E/OiB4fSAmIHtiOiB5fWBcbiAgICogb3IgYHthPzogeH0gfCBzdHJpbmdgIHdob3NlIGJyYWNlIGRlcHRoIHJldHVybnMgdG8gMCBiZWZvcmUgdGhlIGVuZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBBIHRyaW1tZWQgdHlwZSBzdHJpbmcgdGhhdCBzdGFydHMgd2l0aCBge2AgYW5kIGVuZHMgd2l0aCBgfWAuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGJyYWNlcyB3cmFwIHRoZSB3aG9sZSB0eXBlLlxuICAgKi9cbiAgaXNTaW5nbGVCYWxhbmNlZE9iamVjdExpdGVyYWwodHlwZSkge1xuICAgIGxldCBkZXB0aCA9IDBcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0eXBlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgY2hhcmFjdGVyID0gdHlwZVtpbmRleF1cblxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gXCJ7XCIgfHwgY2hhcmFjdGVyID09PSBcIltcIiB8fCBjaGFyYWN0ZXIgPT09IFwiPFwiIHx8IGNoYXJhY3RlciA9PT0gXCIoXCIpIHtcbiAgICAgICAgZGVwdGggKz0gMVxuICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IFwifVwiIHx8IGNoYXJhY3RlciA9PT0gXCJdXCIgfHwgY2hhcmFjdGVyID09PSBcIj5cIiB8fCBjaGFyYWN0ZXIgPT09IFwiKVwiKSB7XG4gICAgICAgIGRlcHRoIC09IDFcblxuICAgICAgICAvLyBUaGUgb3BlbmluZyBicmFjZSBiYWxhbmNlZCBiZWZvcmUgdGhlIGVuZCwgc28gc29tZXRoaW5nIGZvbGxvd3MgdGhlIGxpdGVyYWwuXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCAmJiBpbmRleCA8IHR5cGUubGVuZ3RoIC0gMSkgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlcHRoID09PSAwXG4gIH1cblxuICAvKipcbiAgICogRW5yaWNoZXMgY3VzdG9tLWNvbW1hbmQgbWV0YWRhdGEgYnkgZGVyaXZpbmcgYSBjb21tYW5kJ3MgdHlwZWQgYXJncyBhbmQgcmV0dXJuXG4gICAqIHR5cGUgZnJvbSB0aGUgYmFja2VuZCByZXNvdXJjZSBtZXRob2QncyBgQHBhcmFtYC9gQHJldHVybnNgIEpTRG9jIHdoZW4gdGhleSBhcmVcbiAgICogbm90IGFscmVhZHkgZGVjbGFyZWQgaW4gYHJlc291cmNlQ29uZmlnYC4gUHJlY2VkZW5jZTogZXhwbGljaXQgYHJlc291cmNlQ29uZmlnYFxuICAgKiBge2FyZ3MsIHJldHVyblR5cGV9YCB3aW5zLCB0aGVuIHRoZSBkZXJpdmVkIGJhY2tlbmQtbWV0aG9kIEpTRG9jLCB0aGVuIHRoZSBnZW5lcmljXG4gICAqIGRlZmF1bHQuIE1vZGVsLWNsYXNzIGlkZW50aWZpZXJzIGluIHRoZSBkZXJpdmVkIHR5cGVzIGFyZSBkb3duZ3JhZGVkIHRvIGBhbnlgXG4gICAqIGJlY2F1c2UgdGhlIGZyb250ZW5kIHJlY2VpdmVzIGEgc2VyaWFsaXplZCByZWNvcmQsIG5vdCBhIG1vZGVsIGluc3RhbmNlLCB3aGljaCB0aGVcbiAgICogY29uc3VtZXIgaHlkcmF0ZXMgd2l0aCBgTW9kZWwuaW5zdGFudGlhdGVGcm9tUmVzcG9uc2UoLi4uKWAuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHthcmdzOiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiwgcmV0dXJuVHlwZTogc3RyaW5nIHwgbnVsbH0+fSBhcmdzLmNvbW1hbmRNZXRhZGF0YSAtIERlY2xhcmVkIHBlci1jb21tYW5kIG1ldGFkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLmNvbW1hbmROYW1lcyAtIENvbW1hbmQgbWV0aG9kIG5hbWVzIHRvIHJlc29sdmUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsIHwgdW5kZWZpbmVkfSBhcmdzLnJlc291cmNlQ2xhc3MgLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywge2FyZ3M6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+LCByZXR1cm5UeXBlOiBzdHJpbmcgfCBudWxsfT4+fSAtIEVucmljaGVkIG1ldGFkYXRhLlxuICAgKi9cbiAgYXN5bmMgY29tbWFuZE1ldGFkYXRhV2l0aFJlc291cmNlSnNEb2Moe2NvbW1hbmRNZXRhZGF0YSwgY29tbWFuZE5hbWVzLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGlmICghcmVzb3VyY2VDbGFzcykgcmV0dXJuIGNvbW1hbmRNZXRhZGF0YVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB7YXJnczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJldHVyblR5cGU6IHN0cmluZyB8IG51bGx9Pn0gKi9cbiAgICBjb25zdCBlbnJpY2hlZCA9IHsuLi5jb21tYW5kTWV0YWRhdGF9XG5cbiAgICBmb3IgKGNvbnN0IGNvbW1hbmROYW1lIG9mIGNvbW1hbmROYW1lcykge1xuICAgICAgY29uc3QgZGVjbGFyZWQgPSBjb21tYW5kTWV0YWRhdGFbY29tbWFuZE5hbWVdIHx8IHthcmdzOiBbXSwgcmV0dXJuVHlwZTogbnVsbH1cbiAgICAgIGNvbnN0IHNvdXJjZUNsYXNzTmFtZSA9IHRoaXMubWV0aG9kT3duZXJDbGFzc05hbWUoe21ldGhvZE5hbWU6IGNvbW1hbmROYW1lLCB0YXJnZXRDbGFzczogcmVzb3VyY2VDbGFzc30pXG5cbiAgICAgIGlmICghc291cmNlQ2xhc3NOYW1lKSB7XG4gICAgICAgIGVucmljaGVkW2NvbW1hbmROYW1lXSA9IGRlY2xhcmVkXG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IHJldHVyblR5cGUgPSBkZWNsYXJlZC5yZXR1cm5UeXBlXG5cbiAgICAgIGlmICghcmV0dXJuVHlwZSkge1xuICAgICAgICBjb25zdCBqc0RvY1JldHVyblR5cGUgPSBhd2FpdCB0aGlzLnJlc291cmNlTWV0aG9kUmV0dXJuVHlwZSh7bWV0aG9kTmFtZTogY29tbWFuZE5hbWUsIHNvdXJjZUNsYXNzTmFtZX0pXG5cbiAgICAgICAgaWYgKGpzRG9jUmV0dXJuVHlwZSkge1xuICAgICAgICAgIHJldHVyblR5cGUgPSB0aGlzLmZyb250ZW5kUmVzb2x2YWJsZUNvbW1hbmRKc0RvY1R5cGUodGhpcy51bndyYXBwZWRQcm9taXNlSnNEb2NUeXBlKHtqc0RvY1R5cGU6IGpzRG9jUmV0dXJuVHlwZX0pKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBhcmdzID0gZGVjbGFyZWQuYXJnc1xuXG4gICAgICBpZiAoIWFyZ3MgfHwgYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc3QganNEb2NQYXJhbWV0ZXJzID0gYXdhaXQgdGhpcy5yZXNvdXJjZU1ldGhvZFBhcmFtZXRlcnMoe21ldGhvZE5hbWU6IGNvbW1hbmROYW1lLCBzb3VyY2VDbGFzc05hbWV9KVxuICAgICAgICAvLyBTa2lwIG9iamVjdC1wcm9wZXJ0eSB0YWdzIChgQHBhcmFtIHtzdHJpbmd9IGFyZ3MubWVzc2FnZWApOyBvbmx5IHRoZVxuICAgICAgICAvLyB0b3AtbGV2ZWwgcGFyYW1ldGVycyBtYXAgdG8gbWV0aG9kIGFyZ3VtZW50cywgb3RoZXJ3aXNlIHRoZSBzaGFyZWRcbiAgICAgICAgLy8gYEBwYXJhbSB7b2JqZWN0fSBhcmdzYCArIHByb3BlcnR5IHN0eWxlIHdvdWxkIGVtaXQgYG5hbWUoYXJncywgYXJncylgLlxuICAgICAgICBjb25zdCB0b3BMZXZlbFBhcmFtZXRlcnMgPSAoanNEb2NQYXJhbWV0ZXJzIHx8IFtdKS5maWx0ZXIoKHBhcmFtZXRlcikgPT4gdHlwZW9mIHBhcmFtZXRlci5uYW1lID09PSBcInN0cmluZ1wiICYmICFwYXJhbWV0ZXIubmFtZS5pbmNsdWRlcyhcIi5cIikpXG5cbiAgICAgICAgaWYgKHRvcExldmVsUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXJncyA9IHRvcExldmVsUGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGFyYW1ldGVyLm5hbWUpLFxuICAgICAgICAgICAgdHlwZTogdGhpcy5mcm9udGVuZFJlc29sdmFibGVDb21tYW5kSnNEb2NUeXBlKHBhcmFtZXRlci50eXBlKVxuICAgICAgICAgIH0pKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVucmljaGVkW2NvbW1hbmROYW1lXSA9IHthcmdzOiBhcmdzIHx8IFtdLCByZXR1cm5UeXBlOiByZXR1cm5UeXBlIHx8IG51bGx9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVucmljaGVkXG4gIH1cblxuICAvKipcbiAgICogUnVucyB1bndyYXBwZWQgcHJvbWlzZSBqcyBkb2MgdHlwZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmpzRG9jVHlwZSAtIEpTRG9jIHR5cGUgdG8gbm9ybWFsaXplLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSByZXNvbHZlZCB2YWx1ZSB0eXBlIGZvciBzZXJpYWxpemVkIGZyb250ZW5kIGF0dHJpYnV0ZXMuXG4gICAqL1xuICB1bndyYXBwZWRQcm9taXNlSnNEb2NUeXBlKHtqc0RvY1R5cGV9KSB7XG4gICAgY29uc3QgcHJvbWlzZVByZWZpeCA9IFwiUHJvbWlzZTxcIlxuXG4gICAgaWYgKCFqc0RvY1R5cGUuc3RhcnRzV2l0aChwcm9taXNlUHJlZml4KSkgcmV0dXJuIGpzRG9jVHlwZVxuXG4gICAgaWYgKCFqc0RvY1R5cGUuZW5kc1dpdGgoXCI+XCIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIFByb21pc2UgSlNEb2MgdHlwZSB0byBlbmQgd2l0aCAnPic6ICR7anNEb2NUeXBlfWApXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb2x2ZWRUeXBlID0ganNEb2NUeXBlLnNsaWNlKHByb21pc2VQcmVmaXgubGVuZ3RoLCAtMSkudHJpbSgpXG5cbiAgICBpZiAocmVzb2x2ZWRUeXBlLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgUHJvbWlzZSBKU0RvYyB0eXBlIHRvIGNvbnRhaW4gYSByZXNvbHZlZCB0eXBlOiAke2pzRG9jVHlwZX1gKVxuICAgIH1cblxuICAgIHJldHVybiByZXNvbHZlZFR5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG1ldGhvZCBvd25lciBjbGFzcyBuYW1lLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubWV0aG9kTmFtZSAtIE1ldGhvZCBuYW1lLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlfSBhcmdzLnRhcmdldENsYXNzIC0gVGFyZ2V0IGNsYXNzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gLSBDbGFzcyBuYW1lIHRoYXQgZGVjbGFyZXMgdGhlIG1ldGhvZC5cbiAgICovXG4gIG1ldGhvZE93bmVyQ2xhc3NOYW1lKHttZXRob2ROYW1lLCB0YXJnZXRDbGFzc30pIHtcbiAgICBsZXQgcHJvdG90eXBlID0gdGFyZ2V0Q2xhc3MucHJvdG90eXBlXG5cbiAgICB3aGlsZSAocHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm90b3R5cGUsIG1ldGhvZE5hbWUpKSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvdHlwZSwgbWV0aG9kTmFtZSlcblxuICAgICAgICBpZiAodHlwZW9mIGRlc2NyaXB0b3I/LnZhbHVlICE9IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGxcblxuICAgICAgICBjb25zdCBjb25zdHJ1Y3Rvck5hbWUgPSBwcm90b3R5cGUuY29uc3RydWN0b3I/Lm5hbWVcblxuICAgICAgICBpZiAodHlwZW9mIGNvbnN0cnVjdG9yTmFtZSA9PSBcInN0cmluZ1wiICYmIGNvbnN0cnVjdG9yTmFtZS5sZW5ndGggPiAwKSByZXR1cm4gY29uc3RydWN0b3JOYW1lXG5cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cblxuICAgICAgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSlcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb3VyY2UgbWV0aG9kIHJldHVybiB0eXBlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubWV0aG9kTmFtZSAtIE1ldGhvZCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zb3VyY2VDbGFzc05hbWUgLSBTb3VyY2UgY2xhc3MgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbD59IC0gSlNEb2MgcmV0dXJuIHR5cGUgd2hlbiBkb2N1bWVudGVkLlxuICAgKi9cbiAgYXN5bmMgcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlKHttZXRob2ROYW1lLCBzb3VyY2VDbGFzc05hbWV9KSB7XG4gICAgY29uc3QgcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlcyA9IGF3YWl0IHRoaXMucmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlcygpXG4gICAgY29uc3QgcmV0dXJuVHlwZUtleSA9IGAke3NvdXJjZUNsYXNzTmFtZX0uJHttZXRob2ROYW1lfWBcblxuICAgIGlmICghcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlcy5oYXMocmV0dXJuVHlwZUtleSkpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCByZXR1cm5UeXBlID0gcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlcy5nZXQocmV0dXJuVHlwZUtleSlcblxuICAgIGlmICh0eXBlb2YgcmV0dXJuVHlwZSAhPSBcInN0cmluZ1wiIHx8IHJldHVyblR5cGUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub24tZW1wdHkgSlNEb2MgcmV0dXJuIHR5cGUgZm9yICR7cmV0dXJuVHlwZUtleX1gKVxuICAgIH1cblxuICAgIHJldHVybiByZXR1cm5UeXBlXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXNvdXJjZSBtZXRob2QgcGFyYW1ldGVyIHR5cGUuXG4gICAqIEBwYXJhbSB7e21ldGhvZE5hbWU6IHN0cmluZywgcGFyYW1ldGVySW5kZXg6IG51bWJlciwgc291cmNlQ2xhc3NOYW1lOiBzdHJpbmd9fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsPn0gLSBKU0RvYyBwYXJhbWV0ZXIgdHlwZSB3aGVuIGRvY3VtZW50ZWQuXG4gICAqL1xuICBhc3luYyByZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGUoe21ldGhvZE5hbWUsIHBhcmFtZXRlckluZGV4LCBzb3VyY2VDbGFzc05hbWV9KSB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IGF3YWl0IHRoaXMucmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJzKHttZXRob2ROYW1lLCBzb3VyY2VDbGFzc05hbWV9KVxuXG4gICAgaWYgKCFwYXJhbWV0ZXJzKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgcGFyYW1ldGVyID0gcGFyYW1ldGVyc1twYXJhbWV0ZXJJbmRleF1cblxuICAgIGlmIChwYXJhbWV0ZXIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGxcblxuICAgIGlmIChwYXJhbWV0ZXIudHlwZS5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5vbi1lbXB0eSBKU0RvYyBwYXJhbWV0ZXIgdHlwZSBmb3IgJHtzb3VyY2VDbGFzc05hbWV9LiR7bWV0aG9kTmFtZX0gcGFyYW1ldGVyICR7cGFyYW1ldGVySW5kZXh9YClcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1ldGVyLnR5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc291cmNlIG1ldGhvZCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge3ttZXRob2ROYW1lOiBzdHJpbmcsIHNvdXJjZUNsYXNzTmFtZTogc3RyaW5nfX0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8e25hbWU6IHN0cmluZyB8IG51bGwsIHR5cGU6IHN0cmluZ30+IHwgbnVsbD59IC0gSlNEb2MgcGFyYW1ldGVycyAobmFtZSArIHR5cGUpIHdoZW4gZG9jdW1lbnRlZC5cbiAgICovXG4gIGFzeW5jIHJlc291cmNlTWV0aG9kUGFyYW1ldGVycyh7bWV0aG9kTmFtZSwgc291cmNlQ2xhc3NOYW1lfSkge1xuICAgIGNvbnN0IHJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXMgPSBhd2FpdCB0aGlzLnJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXMoKVxuICAgIGNvbnN0IHBhcmFtZXRlclR5cGVzS2V5ID0gYCR7c291cmNlQ2xhc3NOYW1lfS4ke21ldGhvZE5hbWV9YFxuXG4gICAgaWYgKCFyZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzLmhhcyhwYXJhbWV0ZXJUeXBlc0tleSkpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlcy5nZXQocGFyYW1ldGVyVHlwZXNLZXkpXG5cbiAgICBpZiAoIXBhcmFtZXRlcnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgSlNEb2MgcGFyYW1ldGVycyBmb3IgJHtwYXJhbWV0ZXJUeXBlc0tleX1gKVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbWV0ZXJzXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXNvdXJjZSBtZXRob2QgcmV0dXJuIHR5cGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNYXA8c3RyaW5nLCBzdHJpbmc+Pn0gLSBSZXNvdXJjZSBtZXRob2QgcmV0dXJuIHR5cGVzIGtleWVkIGJ5IENsYXNzTmFtZS5tZXRob2ROYW1lLlxuICAgKi9cbiAgYXN5bmMgcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlcygpIHtcbiAgICBpZiAodGhpcy5fcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlcykgcmV0dXJuIHRoaXMuX3Jlc291cmNlTWV0aG9kUmV0dXJuVHlwZXNcblxuICAgIGNvbnN0IHNvdXJjZUZpbGVzID0gYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsSnNEb2NTb3VyY2VGaWxlcygpXG4gICAgY29uc3QgcmV0dXJuVHlwZXMgPSBuZXcgTWFwKClcblxuICAgIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBzb3VyY2VGaWxlcykge1xuICAgICAgY29uc3Qgc291cmNlVGV4dCA9IGF3YWl0IGZzLnJlYWRGaWxlKHNvdXJjZUZpbGUsIFwidXRmOFwiKVxuXG4gICAgICB0aGlzLmFkZFJlc291cmNlTWV0aG9kUmV0dXJuVHlwZXNGcm9tU291cmNlKHtyZXR1cm5UeXBlcywgc291cmNlVGV4dH0pXG4gICAgfVxuXG4gICAgdGhpcy5fcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlcyA9IHJldHVyblR5cGVzXG5cbiAgICByZXR1cm4gcmV0dXJuVHlwZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc291cmNlIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE1hcDxzdHJpbmcsIEFycmF5PHtuYW1lOiBzdHJpbmcgfCBudWxsLCB0eXBlOiBzdHJpbmd9Pj4+fSAtIFJlc291cmNlIG1ldGhvZCBwYXJhbWV0ZXJzIGtleWVkIGJ5IENsYXNzTmFtZS5tZXRob2ROYW1lLlxuICAgKi9cbiAgYXN5bmMgcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlcygpIHtcbiAgICBpZiAodGhpcy5fcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlcykgcmV0dXJuIHRoaXMuX3Jlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXNcblxuICAgIGNvbnN0IHNvdXJjZUZpbGVzID0gYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsSnNEb2NTb3VyY2VGaWxlcygpXG4gICAgY29uc3QgcGFyYW1ldGVyVHlwZXMgPSBuZXcgTWFwKClcblxuICAgIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBzb3VyY2VGaWxlcykge1xuICAgICAgY29uc3Qgc291cmNlVGV4dCA9IGF3YWl0IGZzLnJlYWRGaWxlKHNvdXJjZUZpbGUsIFwidXRmOFwiKVxuXG4gICAgICB0aGlzLmFkZFJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXNGcm9tU291cmNlKHtwYXJhbWV0ZXJUeXBlcywgc291cmNlVGV4dH0pXG4gICAgfVxuXG4gICAgdGhpcy5fcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlcyA9IHBhcmFtZXRlclR5cGVzXG5cbiAgICByZXR1cm4gcGFyYW1ldGVyVHlwZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIEpTRG9jIHNvdXJjZSBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIEphdmFTY3JpcHQgc291cmNlIGZpbGVzIHRoYXQgY2FuIGRlZmluZSBmcm9udGVuZC1tb2RlbCByZXNvdXJjZXMgYW5kIG1vZGVsIGFjY2Vzc29ycy5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kTW9kZWxKc0RvY1NvdXJjZUZpbGVzKCkge1xuICAgIGNvbnN0IHNvdXJjZUZpbGVzID0gW11cblxuICAgIGZvciAoY29uc3Qgc291cmNlRGlyZWN0b3J5IG9mIHRoaXMuZnJvbnRlbmRNb2RlbEpzRG9jU291cmNlRGlyZWN0b3JpZXMoKSkge1xuICAgICAgc291cmNlRmlsZXMucHVzaCguLi5hd2FpdCB0aGlzLmphdmFzY3JpcHRGaWxlc0luRGlyZWN0b3J5KHNvdXJjZURpcmVjdG9yeSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZUZpbGVzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBKU0RvYyBzb3VyY2UgZGlyZWN0b3JpZXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBTb3VyY2UgZGlyZWN0b3JpZXMgdG8gc2NhbiBmb3IgZ2VuZXJhdGVkIGZyb250ZW5kLW1vZGVsIEpTRG9jLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbEpzRG9jU291cmNlRGlyZWN0b3JpZXMoKSB7XG4gICAgY29uc3Qgc291cmNlRGlyZWN0b3JpZXMgPSBuZXcgU2V0KFtwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnkoKSwgXCJzcmNcIildKVxuXG4gICAgZm9yIChjb25zdCBiYWNrZW5kUHJvamVjdCBvZiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRCYWNrZW5kUHJvamVjdHMoKSkge1xuICAgICAgaWYgKHR5cGVvZiBiYWNrZW5kUHJvamVjdC5wYXRoID09IFwic3RyaW5nXCIgJiYgYmFja2VuZFByb2plY3QucGF0aC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNvdXJjZURpcmVjdG9yaWVzLmFkZChwYXRoLmpvaW4oYmFja2VuZFByb2plY3QucGF0aCwgXCJzcmNcIikpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oc291cmNlRGlyZWN0b3JpZXMpXG4gIH1cblxuICAvKipcbiAgICogQWRkcyByZXNvdXJjZSBtZXRob2QgcmV0dXJuIHR5cGVzIGZyb20gc291cmNlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSBhcmdzLnJldHVyblR5cGVzIC0gTXV0YWJsZSByZXR1cm4gdHlwZXMgbWFwLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zb3VyY2VUZXh0IC0gU291cmNlIHRleHQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYWRkUmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlc0Zyb21Tb3VyY2Uoe3JldHVyblR5cGVzLCBzb3VyY2VUZXh0fSkge1xuICAgIGNvbnN0IGNsYXNzUmVnZXggPSAvY2xhc3NcXHMrKFtBLVphLXpfJF1bXFx3JF0qKVxccysoPzpleHRlbmRzXFxzK1tee10rKT9cXHsvZ1xuICAgIGxldCBjbGFzc01hdGNoXG5cbiAgICB3aGlsZSAoKGNsYXNzTWF0Y2ggPSBjbGFzc1JlZ2V4LmV4ZWMoc291cmNlVGV4dCkpKSB7XG4gICAgICBjb25zdCBjbGFzc05hbWUgPSBjbGFzc01hdGNoWzFdXG4gICAgICBjb25zdCBjbGFzc0JvZHlTdGFydCA9IGNsYXNzUmVnZXgubGFzdEluZGV4XG4gICAgICBjb25zdCBjbGFzc0JvZHlFbmQgPSB0aGlzLm1hdGNoaW5nQnJhY2VJbmRleCh7b3BlbkluZGV4OiBjbGFzc0JvZHlTdGFydCAtIDEsIHNvdXJjZVRleHR9KVxuXG4gICAgICBpZiAoY2xhc3NCb2R5RW5kID09IG51bGwpIHtcbiAgICAgICAgLy8gVGhlIGJyYWNlIG1hdGNoZXIgY2FuJ3QgdG9rZW5pemUgZXZlcnkgY29uc3RydWN0IChlLmcuIGEgcmVnZXggbGl0ZXJhbFxuICAgICAgICAvLyB3aG9zZSBxdW90ZXMgbG9vayBsaWtlIHN0cmluZyBkZWxpbWl0ZXJzKSwgc28gaXQgY2FuIGZhaWwgdG8gbG9jYXRlIGFcbiAgICAgICAgLy8gY2xhc3MgYm9keS4gU2tpcCBtZXRhZGF0YSBleHRyYWN0aW9uIGZvciB0aGF0IGNsYXNzIHJhdGhlciB0aGFuXG4gICAgICAgIC8vIGFib3J0aW5nIHRoZSB3aG9sZSBmcm9udGVuZC1tb2RlbCBnZW5lcmF0aW9uOyByZXNvdXJjZXMgdGhhdCBwYXJzZVxuICAgICAgICAvLyBjbGVhbmx5IHN0aWxsIGdldCB0aGVpciBKU0RvYy1kZXJpdmVkIHJldHVybi9wYXJhbSB0eXBlcy5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2xhc3NCb2R5ID0gc291cmNlVGV4dC5zbGljZShjbGFzc0JvZHlTdGFydCwgY2xhc3NCb2R5RW5kKVxuICAgICAgY29uc3QganNEb2NSZWdleCA9IC9cXC9cXCpcXCooW1xcc1xcU10qPylcXCpcXC8vZ1xuICAgICAgbGV0IGpzRG9jTWF0Y2hcblxuICAgICAgd2hpbGUgKChqc0RvY01hdGNoID0ganNEb2NSZWdleC5leGVjKGNsYXNzQm9keSkpKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUFmdGVySnNEb2MgPSBjbGFzc0JvZHkuc2xpY2UoanNEb2NSZWdleC5sYXN0SW5kZXgpXG4gICAgICAgIGNvbnN0IG1ldGhvZE1hdGNoID0gc291cmNlQWZ0ZXJKc0RvYy5tYXRjaCgvXlxccyooPzphc3luY1xccyspPyhbQS1aYS16XyRdW1xcdyRdKilcXHMqXFwoLylcblxuICAgICAgICBpZiAoIW1ldGhvZE1hdGNoKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBtZXRob2RNYXRjaFsxXVxuXG4gICAgICAgIGNvbnN0IHJldHVyblR5cGUgPSB0aGlzLmpzRG9jUmV0dXJuVHlwZShqc0RvY01hdGNoWzFdKVxuXG4gICAgICAgIGlmIChyZXR1cm5UeXBlKSB7XG4gICAgICAgICAgcmV0dXJuVHlwZXMuc2V0KGAke2NsYXNzTmFtZX0uJHttZXRob2ROYW1lfWAsIHJldHVyblR5cGUpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2xhc3NSZWdleC5sYXN0SW5kZXggPSBjbGFzc0JvZHlFbmQgKyAxXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlciB0eXBlcyBmcm9tIHNvdXJjZS5cbiAgICogQHBhcmFtIHt7cGFyYW1ldGVyVHlwZXM6IE1hcDxzdHJpbmcsIEFycmF5PHtuYW1lOiBzdHJpbmcgfCBudWxsLCB0eXBlOiBzdHJpbmd9Pj4sIHNvdXJjZVRleHQ6IHN0cmluZ319IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYWRkUmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlc0Zyb21Tb3VyY2Uoe3BhcmFtZXRlclR5cGVzLCBzb3VyY2VUZXh0fSkge1xuICAgIGNvbnN0IGNsYXNzUmVnZXggPSAvY2xhc3NcXHMrKFtBLVphLXpfJF1bXFx3JF0qKVxccysoPzpleHRlbmRzXFxzK1tee10rKT9cXHsvZ1xuICAgIGxldCBjbGFzc01hdGNoXG5cbiAgICB3aGlsZSAoKGNsYXNzTWF0Y2ggPSBjbGFzc1JlZ2V4LmV4ZWMoc291cmNlVGV4dCkpKSB7XG4gICAgICBjb25zdCBjbGFzc05hbWUgPSBjbGFzc01hdGNoWzFdXG4gICAgICBjb25zdCBjbGFzc0JvZHlTdGFydCA9IGNsYXNzUmVnZXgubGFzdEluZGV4XG4gICAgICBjb25zdCBjbGFzc0JvZHlFbmQgPSB0aGlzLm1hdGNoaW5nQnJhY2VJbmRleCh7b3BlbkluZGV4OiBjbGFzc0JvZHlTdGFydCAtIDEsIHNvdXJjZVRleHR9KVxuXG4gICAgICBpZiAoY2xhc3NCb2R5RW5kID09IG51bGwpIHtcbiAgICAgICAgLy8gVGhlIGJyYWNlIG1hdGNoZXIgY2FuJ3QgdG9rZW5pemUgZXZlcnkgY29uc3RydWN0IChlLmcuIGEgcmVnZXggbGl0ZXJhbFxuICAgICAgICAvLyB3aG9zZSBxdW90ZXMgbG9vayBsaWtlIHN0cmluZyBkZWxpbWl0ZXJzKSwgc28gaXQgY2FuIGZhaWwgdG8gbG9jYXRlIGFcbiAgICAgICAgLy8gY2xhc3MgYm9keS4gU2tpcCBtZXRhZGF0YSBleHRyYWN0aW9uIGZvciB0aGF0IGNsYXNzIHJhdGhlciB0aGFuXG4gICAgICAgIC8vIGFib3J0aW5nIHRoZSB3aG9sZSBmcm9udGVuZC1tb2RlbCBnZW5lcmF0aW9uOyByZXNvdXJjZXMgdGhhdCBwYXJzZVxuICAgICAgICAvLyBjbGVhbmx5IHN0aWxsIGdldCB0aGVpciBKU0RvYy1kZXJpdmVkIHJldHVybi9wYXJhbSB0eXBlcy5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2xhc3NCb2R5ID0gc291cmNlVGV4dC5zbGljZShjbGFzc0JvZHlTdGFydCwgY2xhc3NCb2R5RW5kKVxuICAgICAgY29uc3QganNEb2NSZWdleCA9IC9cXC9cXCpcXCooW1xcc1xcU10qPylcXCpcXC8vZ1xuICAgICAgbGV0IGpzRG9jTWF0Y2hcblxuICAgICAgd2hpbGUgKChqc0RvY01hdGNoID0ganNEb2NSZWdleC5leGVjKGNsYXNzQm9keSkpKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUFmdGVySnNEb2MgPSBjbGFzc0JvZHkuc2xpY2UoanNEb2NSZWdleC5sYXN0SW5kZXgpXG4gICAgICAgIGNvbnN0IG1ldGhvZE1hdGNoID0gc291cmNlQWZ0ZXJKc0RvYy5tYXRjaCgvXlxccyooPzphc3luY1xccyspPyhbQS1aYS16XyRdW1xcdyRdKilcXHMqXFwoLylcblxuICAgICAgICBpZiAoIW1ldGhvZE1hdGNoKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBtZXRob2RNYXRjaFsxXVxuICAgICAgICBjb25zdCBqc0RvY1BhcmFtZXRlcnMgPSB0aGlzLmpzRG9jUGFyYW1ldGVycyhqc0RvY01hdGNoWzFdKVxuXG4gICAgICAgIGlmIChqc0RvY1BhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHBhcmFtZXRlclR5cGVzLnNldChgJHtjbGFzc05hbWV9LiR7bWV0aG9kTmFtZX1gLCBqc0RvY1BhcmFtZXRlcnMpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2xhc3NSZWdleC5sYXN0SW5kZXggPSBjbGFzc0JvZHlFbmQgKyAxXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMganMgZG9jIHJldHVybiB0eXBlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ganNEb2NUZXh0IC0gSlNEb2MgdGV4dCBpbnNpZGUgY29tbWVudCBtYXJrZXJzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gLSBKU0RvYyByZXR1cm4gdHlwZSB3aGVuIHByZXNlbnQuXG4gICAqL1xuICBqc0RvY1JldHVyblR5cGUoanNEb2NUZXh0KSB7XG4gICAgY29uc3QgcmV0dXJuc01hdGNoID0ganNEb2NUZXh0Lm1hdGNoKC9AcmV0dXJucz9cXHMqXFx7LylcblxuICAgIGlmICghcmV0dXJuc01hdGNoIHx8IHJldHVybnNNYXRjaC5pbmRleCA9PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgdHlwZU9wZW5JbmRleCA9IHJldHVybnNNYXRjaC5pbmRleCArIHJldHVybnNNYXRjaFswXS5sZW5ndGggLSAxXG4gICAgY29uc3QgdHlwZUNsb3NlSW5kZXggPSB0aGlzLm1hdGNoaW5nQnJhY2VJbmRleCh7b3BlbkluZGV4OiB0eXBlT3BlbkluZGV4LCBzb3VyY2VUZXh0OiBqc0RvY1RleHR9KVxuXG4gICAgaWYgKHR5cGVDbG9zZUluZGV4ID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHBhcnNlIEpTRG9jIHJldHVybiB0eXBlIGZyb206ICR7anNEb2NUZXh0fWApXG4gICAgfVxuXG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IHRoaXMubm9ybWFsaXplSnNEb2NUeXBlKGpzRG9jVGV4dC5zbGljZSh0eXBlT3BlbkluZGV4ICsgMSwgdHlwZUNsb3NlSW5kZXgpKVxuXG4gICAgaWYgKHJldHVyblR5cGUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub24tZW1wdHkgSlNEb2MgcmV0dXJuIHR5cGUgaW46ICR7anNEb2NUZXh0fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblR5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsYXBzZXMgYSBKU0RvYyB0eXBlIHNwYW5uaW5nIG11bHRpcGxlIGNvbW1lbnQgbGluZXMgaW50byBhIHNpbmdsZSBsaW5lIHNvIGl0IGNhblxuICAgKiBiZSBlbWl0dGVkIGludG8gYW4gaW5saW5lIHR5cGUtYXNzZXJ0aW9uIGNhc3QuIEEgbXVsdGlsaW5lIGJhY2tlbmQgcmV0dXJuIHR5cGUga2VlcHNcbiAgICogaXRzIGxlYWRpbmcgY29udGludWF0aW9uIGFzdGVyaXNrcyBpbiB0aGUgY2FwdHVyZWQgc3Vic3RyaW5nLCB3aGljaCBhcmUgaW52YWxpZCBpbnNpZGVcbiAgICogYW4gaW5saW5lIGNhc3QgYW5kIG1ha2UgVHlwZVNjcmlwdCByZWFkIHRoZSBhc3NlcnRlZCB0eXBlIGFzIGB1bmRlZmluZWRgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ganNEb2NUeXBlIC0gUmF3IGNhcHR1cmVkIEpTRG9jIHR5cGUsIHBvc3NpYmx5IG11bHRpbGluZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTaW5nbGUtbGluZSBKU0RvYyB0eXBlLlxuICAgKi9cbiAgbm9ybWFsaXplSnNEb2NUeXBlKGpzRG9jVHlwZSkge1xuICAgIHJldHVybiBqc0RvY1R5cGUucmVwbGFjZSgvXFxzKlxcblxccypcXCo/WyBcXHRdKi9nLCBcIiBcIikudHJpbSgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBqcyBkb2MgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGpzRG9jVGV4dCAtIEpTRG9jIHRleHQgaW5zaWRlIGNvbW1lbnQgbWFya2Vycy5cbiAgICogQHJldHVybnMge0FycmF5PHtuYW1lOiBzdHJpbmcgfCBudWxsLCB0eXBlOiBzdHJpbmd9Pn0gLSBKU0RvYyBwYXJhbWV0ZXJzIChuYW1lICsgdHlwZSkgaW4gZGVjbGFyYXRpb24gb3JkZXIuXG4gICAqL1xuICBqc0RvY1BhcmFtZXRlcnMoanNEb2NUZXh0KSB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IFtdXG4gICAgY29uc3QgcGFyYW1SZWdleCA9IC9AcGFyYW1cXHMqXFx7L2dcbiAgICBsZXQgX3BhcmFtTWF0Y2hcblxuICAgIHdoaWxlICgoX3BhcmFtTWF0Y2ggPSBwYXJhbVJlZ2V4LmV4ZWMoanNEb2NUZXh0KSkpIHtcbiAgICAgIGNvbnN0IHR5cGVPcGVuSW5kZXggPSBwYXJhbVJlZ2V4Lmxhc3RJbmRleCAtIDFcbiAgICAgIGNvbnN0IHR5cGVDbG9zZUluZGV4ID0gdGhpcy5tYXRjaGluZ0JyYWNlSW5kZXgoe29wZW5JbmRleDogdHlwZU9wZW5JbmRleCwgc291cmNlVGV4dDoganNEb2NUZXh0fSlcblxuICAgICAgaWYgKHR5cGVDbG9zZUluZGV4ID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcGFyc2UgSlNEb2MgcGFyYW1ldGVyIHR5cGUgZnJvbTogJHtqc0RvY1RleHR9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHlwZSA9IHRoaXMubm9ybWFsaXplSnNEb2NUeXBlKGpzRG9jVGV4dC5zbGljZSh0eXBlT3BlbkluZGV4ICsgMSwgdHlwZUNsb3NlSW5kZXgpKVxuXG4gICAgICBpZiAodHlwZS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbm9uLWVtcHR5IEpTRG9jIHBhcmFtZXRlciB0eXBlIGluOiAke2pzRG9jVGV4dH1gKVxuICAgICAgfVxuXG4gICAgICAvLyBBZnRlciB0aGUgY2xvc2luZyBicmFjZSB0aGUgcGFyYW1ldGVyIG5hbWUgZm9sbG93cyAob3B0aW9uYWxseSBicmFja2V0ZWRcbiAgICAgIC8vIGZvciBgQHBhcmFtIHt0eXBlfSBbbmFtZV1gKS4gQ2FwdHVyZSB0aGUgbGVhZGluZyBuYW1lIHRva2VuIOKAlCBpbmNsdWRpbmcgYW55XG4gICAgICAvLyBkb3R0ZWQgcGF0aCBzbyBvYmplY3QtcHJvcGVydHkgdGFncyBsaWtlIGBAcGFyYW0ge3N0cmluZ30gYXJncy5tZXNzYWdlYCBzdGF5XG4gICAgICAvLyBkaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgdG9wLWxldmVsIGBAcGFyYW0ge29iamVjdH0gYXJnc2AgcGFyYW1ldGVyLlxuICAgICAgY29uc3QgbmFtZU1hdGNoID0ganNEb2NUZXh0LnNsaWNlKHR5cGVDbG9zZUluZGV4ICsgMSkubWF0Y2goL15cXHMqXFxbP1xccyooW0EtWmEtel8kXVtcXHckLl0qKS8pXG5cbiAgICAgIHBhcmFtZXRlcnMucHVzaCh7bmFtZTogbmFtZU1hdGNoID8gbmFtZU1hdGNoWzFdIDogbnVsbCwgdHlwZX0pXG4gICAgICBwYXJhbVJlZ2V4Lmxhc3RJbmRleCA9IHR5cGVDbG9zZUluZGV4ICsgMVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbWV0ZXJzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBqYXZhc2NyaXB0IGZpbGVzIGluIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRpcmVjdG9yeSAtIERpcmVjdG9yeSBwYXRoLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gSmF2YVNjcmlwdCBzb3VyY2UgZmlsZSBwYXRocy5cbiAgICovXG4gIGFzeW5jIGphdmFzY3JpcHRGaWxlc0luRGlyZWN0b3J5KGRpcmVjdG9yeSkge1xuICAgIGxldCBlbnRyaWVzXG5cbiAgICB0cnkge1xuICAgICAgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyZWN0b3J5LCB7d2l0aEZpbGVUeXBlczogdHJ1ZX0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT0gXCJvYmplY3RcIiAmJiBcImNvZGVcIiBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm4gW11cblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aHMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBlbnRyeVBhdGggPSBwYXRoLmpvaW4oZGlyZWN0b3J5LCBlbnRyeS5uYW1lKVxuXG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBmaWxlUGF0aHMucHVzaCguLi5hd2FpdCB0aGlzLmphdmFzY3JpcHRGaWxlc0luRGlyZWN0b3J5KGVudHJ5UGF0aCkpXG4gICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpICYmIC9cXC4obWpzfGpzfGpzeHx0cykkLy50ZXN0KGVudHJ5Lm5hbWUpKSB7XG4gICAgICAgIGZpbGVQYXRocy5wdXNoKGVudHJ5UGF0aClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmlsZVBhdGhzXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBtYXRjaGluZyBjbG9zaW5nIGJyYWNlIHdoaWxlIHJlc3BlY3RpbmcgSmF2YVNjcmlwdCBzdHJpbmdzIGFuZCBjb21tZW50cy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLm9wZW5JbmRleCAtIE9wZW5pbmcgYnJhY2UgaW5kZXguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNvdXJjZVRleHQgLSBTb3VyY2UgdGV4dC5cbiAgICogQHJldHVybnMge251bWJlciB8IG51bGx9IC0gQ2xvc2luZyBicmFjZSBpbmRleCB3aGVuIGZvdW5kLlxuICAgKi9cbiAgbWF0Y2hpbmdCcmFjZUluZGV4KHtvcGVuSW5kZXgsIHNvdXJjZVRleHR9KSB7XG4gICAgaWYgKHNvdXJjZVRleHRbb3BlbkluZGV4XSAhPT0gXCJ7XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb3BlbmluZyBicmFjZSBhdCBpbmRleCAke29wZW5JbmRleH1gKVxuICAgIH1cblxuICAgIGxldCBkZXB0aCA9IDBcbiAgICBsZXQgaW5CbG9ja0NvbW1lbnQgPSBmYWxzZVxuICAgIGxldCBpbkxpbmVDb21tZW50ID0gZmFsc2VcbiAgICBsZXQgaW5TdHJpbmcgPSBcIlwiXG5cbiAgICBmb3IgKGxldCBpbmRleCA9IG9wZW5JbmRleDsgaW5kZXggPCBzb3VyY2VUZXh0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgY2hhciA9IHNvdXJjZVRleHRbaW5kZXhdXG4gICAgICBjb25zdCBuZXh0Q2hhciA9IHNvdXJjZVRleHRbaW5kZXggKyAxXVxuICAgICAgY29uc3QgcHJldmlvdXNDaGFyID0gc291cmNlVGV4dFtpbmRleCAtIDFdXG5cbiAgICAgIGlmIChpbkxpbmVDb21tZW50KSB7XG4gICAgICAgIGlmIChjaGFyID09PSBcIlxcblwiKSBpbkxpbmVDb21tZW50ID0gZmFsc2VcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5CbG9ja0NvbW1lbnQpIHtcbiAgICAgICAgaWYgKGNoYXIgPT09IFwiKlwiICYmIG5leHRDaGFyID09PSBcIi9cIikge1xuICAgICAgICAgIGluQmxvY2tDb21tZW50ID0gZmFsc2VcbiAgICAgICAgICBpbmRleCsrXG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5TdHJpbmcpIHtcbiAgICAgICAgaWYgKGNoYXIgPT09IGluU3RyaW5nICYmIHByZXZpb3VzQ2hhciAhPT0gXCJcXFxcXCIpIGluU3RyaW5nID0gXCJcIlxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBcIi9cIiAmJiBuZXh0Q2hhciA9PT0gXCIvXCIpIHtcbiAgICAgICAgaW5MaW5lQ29tbWVudCA9IHRydWVcbiAgICAgICAgaW5kZXgrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gXCIvXCIgJiYgbmV4dENoYXIgPT09IFwiKlwiKSB7XG4gICAgICAgIGluQmxvY2tDb21tZW50ID0gdHJ1ZVxuICAgICAgICBpbmRleCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBcIlxcXCJcIiB8fCBjaGFyID09PSBcIidcIiB8fCBjaGFyID09PSBcImBcIikge1xuICAgICAgICBpblN0cmluZyA9IGNoYXJcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09IFwie1wiKSB7XG4gICAgICAgIGRlcHRoKytcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gXCJ9XCIpIHtcbiAgICAgICAgZGVwdGgtLVxuXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCkgcmV0dXJuIGluZGV4XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgZm9yIG1vZGVsIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZU5hbWUgLSBGcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MubW9kZWxDbGFzcyAtIEJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGx9IC0gQXR0cmlidXRlIGNvbmZpZyBpbmZlcnJlZCBmcm9tIHRoZSBiYWNrZW5kIG1vZGVsIHdoZW4gYXZhaWxhYmxlLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JNb2RlbEF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pIHtcbiAgICBpZiAoIW1vZGVsQ2xhc3MpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lID0gbW9kZWxDbGFzcy5yZXNvbHZlQXR0cmlidXRlTmFtZShhdHRyaWJ1dGVOYW1lKVxuXG4gICAgaWYgKCFyZXNvbHZlZEF0dHJpYnV0ZU5hbWUpIHJldHVybiBudWxsXG5cbiAgICBsZXQgY29sdW1uTmFtZVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbHVtbk5hbWUgPSBtb2RlbENsYXNzLmdldEF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWVNYXAoKVtyZXNvbHZlZEF0dHJpYnV0ZU5hbWVdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJ1c2VkIGJlZm9yZSBpbml0aWFsaXphdGlvblwiKSkgcmV0dXJuIG51bGxcblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBpZiAoIWNvbHVtbk5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgbGV0IGNvbHVtblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbHVtbiA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uc0hhc2goKVtjb2x1bW5OYW1lXVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwidXNlZCBiZWZvcmUgaW5pdGlhbGl6YXRpb25cIikpIHJldHVybiBudWxsXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHVtbiA/IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JDb2x1bW4oe2NvbHVtbn0pIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGNvbmZpZyBmb3IgY29sdW1uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UtY29sdW1uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29sdW1uIC0gRGF0YWJhc2UgY29sdW1uLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWd9IC0gQXR0cmlidXRlIGNvbmZpZyBpbmZlcnJlZCBmcm9tIHRoZSBkYXRhYmFzZSBjb2x1bW4uXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0ZvckNvbHVtbih7Y29sdW1ufSkge1xuICAgIGNvbnN0IHR5cGUgPSBjb2x1bW4uZ2V0VHlwZSgpXG5cbiAgICBpZiAodHlwZW9mIHR5cGUgIT0gXCJzdHJpbmdcIiB8fCB0eXBlLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbm9uLWVtcHR5IGNvbHVtbiB0eXBlIGZvciBmcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgaW5mZXJlbmNlLCBnb3Q6ICR7dHlwZX1gKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBudWxsOiBjb2x1bW4uZ2V0TnVsbCgpLFxuICAgICAgdHlwZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbGF0aW9uc2hpcHMgZm9yIG1vZGVsLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2xhc3NOYW1lIC0gTW9kZWwgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSBhcmdzLm1vZGVsQ29uZmlnIC0gTW9kZWwgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGx9IFthcmdzLnJlc291cmNlQ2xhc3NdIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtBcnJheTx7YXV0b2xvYWQ6IGJvb2xlYW4sIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgdGFyZ2V0Q2xhc3NOYW1lOiBzdHJpbmcsIHRhcmdldEZpbGVOYW1lOiBzdHJpbmcsIHR5cGU6IFwiYmVsb25nc1RvXCIgfCBcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9Pn0gLSBSZWxhdGlvbnNoaXBzLlxuICAgKi9cbiAgcmVsYXRpb25zaGlwc0Zvck1vZGVsKHtjbGFzc05hbWUsIG1vZGVsQ29uZmlnLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBtb2RlbENvbmZpZy5yZWxhdGlvbnNoaXBzXG5cbiAgICBpZiAocmVsYXRpb25zaGlwcyA9PT0gdW5kZWZpbmVkIHx8IHJlbGF0aW9uc2hpcHMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShyZWxhdGlvbnNoaXBzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyBoYXMgaW52YWxpZCByZWxhdGlvbnNoaXBzIGNvbmZpZyDigJQgbXVzdCBiZSBhbiBhcnJheSBvZiByZWxhdGlvbnNoaXAgbmFtZXMsIGdvdCAke3R5cGVvZiByZWxhdGlvbnNoaXBzfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbGF0aW9uc2hpcHMubWFwKChyZWxhdGlvbnNoaXBOYW1lKSA9PiB0aGlzLmluZmVycmVkUmVsYXRpb25zaGlwRGVmaW5pdGlvbih7Y2xhc3NOYW1lLCByZWxhdGlvbnNoaXBOYW1lLCByZXNvdXJjZUNsYXNzfSkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpbmZlcnJlZCByZWxhdGlvbnNoaXAgZGVmaW5pdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIE1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlbGF0aW9uc2hpcE5hbWUgLSBSZWxhdGlvbnNoaXAgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGx9IFthcmdzLnJlc291cmNlQ2xhc3NdIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHt7YXV0b2xvYWQ6IGJvb2xlYW4sIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgdGFyZ2V0Q2xhc3NOYW1lOiBzdHJpbmcsIHRhcmdldEZpbGVOYW1lOiBzdHJpbmcsIHR5cGU6IFwiYmVsb25nc1RvXCIgfCBcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9fSBJbmZlcnJlZCByZWxhdGlvbnNoaXAgZGVmaW5pdGlvbi5cbiAgICovXG4gIGluZmVycmVkUmVsYXRpb25zaGlwRGVmaW5pdGlvbih7Y2xhc3NOYW1lLCByZWxhdGlvbnNoaXBOYW1lLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSByZXNvdXJjZUNsYXNzID8gcmVzb3VyY2VDbGFzcy5tb2RlbENsYXNzKCkgOiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRNb2RlbENsYXNzKGNsYXNzTmFtZSlcblxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHJlbGF0aW9uc2hpcE5hbWUpXG4gICAgY29uc3QgcmVsYXRpb25zaGlwVHlwZSA9IHJlbGF0aW9uc2hpcC5nZXRUeXBlKClcblxuICAgIGlmIChyZWxhdGlvbnNoaXBUeXBlICE9PSBcImJlbG9uZ3NUb1wiICYmIHJlbGF0aW9uc2hpcFR5cGUgIT09IFwiaGFzT25lXCIgJiYgcmVsYXRpb25zaGlwVHlwZSAhPT0gXCJoYXNNYW55XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgJyR7Y2xhc3NOYW1lfScgcmVsYXRpb25zaGlwICcke3JlbGF0aW9uc2hpcE5hbWV9JyBoYXMgdW5zdXBwb3J0ZWQgdHlwZSAnJHtyZWxhdGlvbnNoaXBUeXBlfSdgKVxuICAgIH1cblxuICAgIGxldCB0YXJnZXRDbGFzc05hbWVcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgICB0YXJnZXRDbGFzc05hbWUgPSB0YXJnZXRNb2RlbENsYXNzPy5nZXRNb2RlbE5hbWUoKVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTW9kZWwgY2xhc3Mgbm90IHJlZ2lzdGVyZWQgeWV0IOKAlCBmYWxsIGJhY2sgdG8gY2xhc3NOYW1lIGZyb20gcmVsYXRpb25zaGlwIGRlZmluaXRpb25cbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldENsYXNzTmFtZSkge1xuICAgICAgdGFyZ2V0Q2xhc3NOYW1lID0gcmVsYXRpb25zaGlwLmNsYXNzTmFtZVxuXG4gICAgICBpZiAoIXRhcmdldENsYXNzTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICcke2NsYXNzTmFtZX0nIHJlbGF0aW9uc2hpcCAnJHtyZWxhdGlvbnNoaXBOYW1lfScgaGFzIG5vIHRhcmdldCBtb2RlbCBjbGFzc2ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGF1dG9sb2FkOiByZWxhdGlvbnNoaXAuZ2V0QXV0b2xvYWQoKSxcbiAgICAgIHJlbGF0aW9uc2hpcE5hbWUsXG4gICAgICB0YXJnZXRDbGFzc05hbWUsXG4gICAgICB0YXJnZXRGaWxlTmFtZTogaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKHRhcmdldENsYXNzTmFtZSkpLFxuICAgICAgdHlwZTogcmVsYXRpb25zaGlwVHlwZVxuICAgIH1cbiAgfVxufVxuIl19
|