velocious 1.0.180 → 1.0.181
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.
|
@@ -12,24 +12,40 @@
|
|
|
12
12
|
* id: string
|
|
13
13
|
* }} CommandsRequireContextType
|
|
14
14
|
*/
|
|
15
|
+
/**
|
|
16
|
+
* @typedef {(id: string) => unknown} TestFilesRequireContextIDFunctionType
|
|
17
|
+
* @typedef {TestFilesRequireContextIDFunctionType & {
|
|
18
|
+
* keys: () => string[],
|
|
19
|
+
* id: string
|
|
20
|
+
* }} TestFilesRequireContextType
|
|
21
|
+
*/
|
|
15
22
|
export default class VelociousEnvironmentsHandlerBrowser extends Base {
|
|
16
23
|
/**
|
|
17
24
|
* @param {object} args - Options object.
|
|
18
25
|
* @param {() => Promise<MigrationsRequireContextType>} [args.migrationsRequireContextCallback] - Migrations require context callback.
|
|
26
|
+
* @param {() => Promise<TestFilesRequireContextType>} [args.testFilesRequireContextCallback] - Test files require context callback.
|
|
19
27
|
*/
|
|
20
|
-
constructor({ migrationsRequireContextCallback, ...restArgs }?: {
|
|
28
|
+
constructor({ migrationsRequireContextCallback, testFilesRequireContextCallback, ...restArgs }?: {
|
|
21
29
|
migrationsRequireContextCallback?: () => Promise<MigrationsRequireContextType>;
|
|
30
|
+
testFilesRequireContextCallback?: () => Promise<TestFilesRequireContextType>;
|
|
22
31
|
});
|
|
23
32
|
/** @type {CommandsRequireContextType | undefined} */
|
|
24
33
|
findCommandsRequireContextResult: CommandsRequireContextType | undefined;
|
|
25
34
|
/** @type {MigrationsRequireContextType | undefined} */
|
|
26
35
|
_migrationsRequireContextResult: MigrationsRequireContextType | undefined;
|
|
36
|
+
/** @type {TestFilesRequireContextType | undefined} */
|
|
37
|
+
_testFilesRequireContextResult: TestFilesRequireContextType | undefined;
|
|
27
38
|
migrationsRequireContextCallback: () => Promise<MigrationsRequireContextType>;
|
|
39
|
+
testFilesRequireContextCallback: () => Promise<TestFilesRequireContextType>;
|
|
28
40
|
logger: Logger;
|
|
29
41
|
/**
|
|
30
42
|
* @returns {Promise<MigrationsRequireContextType>} - Resolves with the migrations require context.
|
|
31
43
|
*/
|
|
32
44
|
migrationsRequireContext(): Promise<MigrationsRequireContextType>;
|
|
45
|
+
/**
|
|
46
|
+
* @returns {Promise<TestFilesRequireContextType>} - Resolves with the test files require context.
|
|
47
|
+
*/
|
|
48
|
+
testFilesRequireContext(): Promise<TestFilesRequireContextType>;
|
|
33
49
|
_findCommandsResult: {
|
|
34
50
|
name: string;
|
|
35
51
|
file: string;
|
|
@@ -70,6 +86,11 @@ export type CommandsRequireContextType = CommandsRequireContextIDFunctionType &
|
|
|
70
86
|
keys: () => string[];
|
|
71
87
|
id: string;
|
|
72
88
|
};
|
|
89
|
+
export type TestFilesRequireContextIDFunctionType = (id: string) => unknown;
|
|
90
|
+
export type TestFilesRequireContextType = TestFilesRequireContextIDFunctionType & {
|
|
91
|
+
keys: () => string[];
|
|
92
|
+
id: string;
|
|
93
|
+
};
|
|
73
94
|
import Base from "./base.js";
|
|
74
95
|
import { Logger } from "../logger.js";
|
|
75
96
|
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/environment-handlers/browser.js"],"names":[],"mappings":"AAKA;;;;;;GAMG;AAEH;;;;;;GAMG;AAEH;
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/environment-handlers/browser.js"],"names":[],"mappings":"AAKA;;;;;;GAMG;AAEH;;;;;;GAMG;AAEH;;;;;;GAMG;AAEH;IAUE;;;;OAIG;IACH,iGAHG;QAA2D,gCAAgC,GAAnF,MAAM,OAAO,CAAC,4BAA4B,CAAC;QACO,+BAA+B,GAAjF,MAAM,OAAO,CAAC,2BAA2B,CAAC;KACpD,EAQA;IArBD,qDAAqD;IACrD,kCADW,0BAA0B,GAAG,SAAS,CACL;IAE5C,uDAAuD;IACvD,iCADW,4BAA4B,GAAG,SAAS,CACR;IAE3C,sDAAsD;IACtD,gCADW,2BAA2B,GAAG,SAAS,CACR;IAWxC,wCAPe,OAAO,CAAC,4BAA4B,CAAC,CAOoB;IACxE,uCAPe,OAAO,CAAC,2BAA2B,CAAC,CAOmB;IACtE,eAA8B;IAIhC;;OAEG;IACH,4BAFa,OAAO,CAAC,4BAA4B,CAAC,CAUjD;IAED;;OAEG;IACH,2BAFa,OAAO,CAAC,2BAA2B,CAAC,CAYhD;IAMC;;;QAAqD;IAKvD;;OAEG;IACH,+BAFa,0BAA0B,CAOtC;IAED;;;QAmBC;IAgHD;;;OAGG;IACH,mBAA0B,UAHf,MAGuB,KAFrB,OAAO,CAAC,cAAc,gCAAgC,EAAE,OAAO,CAAC,CAgB5E;IAeD;;;;OAIG;IACH,6BAHG;QAA4E,GAAG,EAAvE,MAAM,CAAC,MAAM,EAAE,OAAO,6BAA6B,EAAE,OAAO,CAAC;KACrE,GAAU,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2BlC;CACF;qDAlSY,CAAC,EAAE,EAAE,MAAM,KAAK;IAAC,OAAO,EAAE,cAAc,gCAAgC,EAAE,OAAO,CAAA;CAAC;2CAClF,sCAAsC,GAAG;IACjD,IAAI,EAAE,MAAM,MAAM,EAAE,CAAC;IACrB,EAAE,EAAE,MAAM,CAAA;CACX;mDAIS,CAAC,EAAE,EAAE,MAAM,KAAK;IAAC,OAAO,EAAE,cAAc,wBAAwB,EAAE,OAAO,CAAA;CAAC;yCAC1E,oCAAoC,GAAG;IAC/C,IAAI,EAAE,MAAM,MAAM,EAAE,CAAC;IACrB,EAAE,EAAE,MAAM,CAAA;CACX;oDAIS,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO;0CACvB,qCAAqC,GAAG;IAChD,IAAI,EAAE,MAAM,MAAM,EAAE,CAAC;IACrB,EAAE,EAAE,MAAM,CAAA;CACX;iBA1Ba,WAAW;uBAGP,cAAc"}
|
|
@@ -16,19 +16,30 @@ import { Logger } from "../logger.js";
|
|
|
16
16
|
* id: string
|
|
17
17
|
* }} CommandsRequireContextType
|
|
18
18
|
*/
|
|
19
|
+
/**
|
|
20
|
+
* @typedef {(id: string) => unknown} TestFilesRequireContextIDFunctionType
|
|
21
|
+
* @typedef {TestFilesRequireContextIDFunctionType & {
|
|
22
|
+
* keys: () => string[],
|
|
23
|
+
* id: string
|
|
24
|
+
* }} TestFilesRequireContextType
|
|
25
|
+
*/
|
|
19
26
|
export default class VelociousEnvironmentsHandlerBrowser extends Base {
|
|
20
27
|
/** @type {CommandsRequireContextType | undefined} */
|
|
21
28
|
findCommandsRequireContextResult = undefined;
|
|
22
29
|
/** @type {MigrationsRequireContextType | undefined} */
|
|
23
30
|
_migrationsRequireContextResult = undefined;
|
|
31
|
+
/** @type {TestFilesRequireContextType | undefined} */
|
|
32
|
+
_testFilesRequireContextResult = undefined;
|
|
24
33
|
/**
|
|
25
34
|
* @param {object} args - Options object.
|
|
26
35
|
* @param {() => Promise<MigrationsRequireContextType>} [args.migrationsRequireContextCallback] - Migrations require context callback.
|
|
36
|
+
* @param {() => Promise<TestFilesRequireContextType>} [args.testFilesRequireContextCallback] - Test files require context callback.
|
|
27
37
|
*/
|
|
28
|
-
constructor({ migrationsRequireContextCallback, ...restArgs } = {}) {
|
|
38
|
+
constructor({ migrationsRequireContextCallback, testFilesRequireContextCallback, ...restArgs } = {}) {
|
|
29
39
|
super();
|
|
30
40
|
restArgsError(restArgs);
|
|
31
41
|
this.migrationsRequireContextCallback = migrationsRequireContextCallback;
|
|
42
|
+
this.testFilesRequireContextCallback = testFilesRequireContextCallback;
|
|
32
43
|
this.logger = new Logger(this);
|
|
33
44
|
}
|
|
34
45
|
/**
|
|
@@ -41,6 +52,17 @@ export default class VelociousEnvironmentsHandlerBrowser extends Base {
|
|
|
41
52
|
this._migrationsRequireContextResult ||= await migrationsRequireContextCallback();
|
|
42
53
|
return this._migrationsRequireContextResult;
|
|
43
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* @returns {Promise<TestFilesRequireContextType>} - Resolves with the test files require context.
|
|
57
|
+
*/
|
|
58
|
+
async testFilesRequireContext() {
|
|
59
|
+
const { testFilesRequireContextCallback } = this;
|
|
60
|
+
if (!testFilesRequireContextCallback) {
|
|
61
|
+
throw new Error("testFilesRequireContextCallback is required when running browser tests");
|
|
62
|
+
}
|
|
63
|
+
this._testFilesRequireContextResult ||= await testFilesRequireContextCallback();
|
|
64
|
+
return this._testFilesRequireContextResult;
|
|
65
|
+
}
|
|
44
66
|
/**
|
|
45
67
|
* @returns {Promise<Array<import("./base.js").CommandFileObjectType>>} - Resolves with the commands.
|
|
46
68
|
*/
|
|
@@ -146,8 +168,22 @@ export default class VelociousEnvironmentsHandlerBrowser extends Base {
|
|
|
146
168
|
* @returns {Promise<void>} - Resolves when complete.
|
|
147
169
|
*/
|
|
148
170
|
async importTestFiles(testFiles) {
|
|
171
|
+
const testFilesRequireContext = await this.testFilesRequireContext();
|
|
172
|
+
const requireKeys = testFilesRequireContext.keys();
|
|
173
|
+
const normalizedKeys = requireKeys.map((key) => ({
|
|
174
|
+
key,
|
|
175
|
+
normalized: key.replace(/\\/g, "/").replace(/^\.\//, "")
|
|
176
|
+
}));
|
|
149
177
|
for (const testFile of testFiles) {
|
|
150
|
-
|
|
178
|
+
const normalizedFile = testFile.replace(/\\/g, "/");
|
|
179
|
+
const matchedKey = normalizedKeys.find((entry) => normalizedFile.endsWith(entry.normalized))?.key;
|
|
180
|
+
if (!matchedKey) {
|
|
181
|
+
throw new Error(`Test file ${testFile} was not found in the provided require context`);
|
|
182
|
+
}
|
|
183
|
+
const imported = testFilesRequireContext(matchedKey);
|
|
184
|
+
if (imported && typeof imported == "object" && "then" in imported && typeof imported.then == "function") {
|
|
185
|
+
await imported;
|
|
186
|
+
}
|
|
151
187
|
}
|
|
152
188
|
}
|
|
153
189
|
/**
|
|
@@ -206,4 +242,4 @@ export default class VelociousEnvironmentsHandlerBrowser extends Base {
|
|
|
206
242
|
return `${sections.join("\n\n")}\n`;
|
|
207
243
|
}
|
|
208
244
|
}
|
|
209
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9icm93c2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUN2RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFBO0FBRW5DOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVILE1BQU0sQ0FBQyxPQUFPLE9BQU8sbUNBQW9DLFNBQVEsSUFBSTtJQUNuRSxxREFBcUQ7SUFDckQsZ0NBQWdDLEdBQUcsU0FBUyxDQUFBO0lBRTVDLHVEQUF1RDtJQUN2RCwrQkFBK0IsR0FBRyxTQUFTLENBQUE7SUFFM0M7OztPQUdHO0lBQ0gsWUFBWSxFQUFDLGdDQUFnQyxFQUFFLEdBQUcsUUFBUSxFQUFDLEdBQUcsRUFBRTtRQUM5RCxLQUFLLEVBQUUsQ0FBQTtRQUNQLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixJQUFJLENBQUMsZ0NBQWdDLEdBQUcsZ0NBQWdDLENBQUE7UUFDeEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNoQyxDQUFDO0lBR0Q7O09BRUc7SUFDSCxLQUFLLENBQUMsd0JBQXdCO1FBQzVCLE1BQU0sRUFBQyxnQ0FBZ0MsRUFBQyxHQUFHLElBQUksQ0FBQTtRQUUvQyxJQUFJLENBQUMsZ0NBQWdDO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFBO1FBRXRHLElBQUksQ0FBQywrQkFBK0IsS0FBSyxNQUFNLGdDQUFnQyxFQUFFLENBQUE7UUFFakYsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUE7SUFDN0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gs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LENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUVyQyxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFBO0lBQ3JDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlIGZyb20gXCIuL2Jhc2UuanNcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcbmltcG9ydCB7TG9nZ2VyfSBmcm9tIFwiLi4vbG9nZ2VyLmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7KGlkOiBzdHJpbmcpID0+IHtkZWZhdWx0OiB0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvbWlncmF0aW9uL2luZGV4LmpzXCIpLmRlZmF1bHR9fSBNaWdyYXRpb25zUmVxdWlyZUNvbnRleHRJREZ1bmN0aW9uVHlwZVxuICogQHR5cGVkZWYge01pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dElERnVuY3Rpb25UeXBlICYge1xuICogICBrZXlzOiAoKSA9PiBzdHJpbmdbXSxcbiAqICAgaWQ6IHN0cmluZ1xuICogfX0gTWlncmF0aW9uc1JlcXVpcmVDb250ZXh0VHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhpZDogc3RyaW5nKSA9PiB7ZGVmYXVsdDogdHlwZW9mIGltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdH19IENvbW1hbmRzUmVxdWlyZUNvbnRleHRJREZ1bmN0aW9uVHlwZVxuICogQHR5cGVkZWYge0NvbW1hbmRzUmVxdWlyZUNvbnRleHRJREZ1bmN0aW9uVHlwZSAmIHtcbiAqICAga2V5czogKCkgPT4gc3RyaW5nW10sXG4gKiAgIGlkOiBzdHJpbmdcbiAqIH19IENvbW1hbmRzUmVxdWlyZUNvbnRleHRUeXBlXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzRW52aXJvbm1lbnRzSGFuZGxlckJyb3dzZXIgZXh0ZW5kcyBCYXNlIHtcbiAgLyoqIEB0eXBlIHtDb21tYW5kc1JlcXVpcmVDb250ZXh0VHlwZSB8IHVuZGVmaW5lZH0gKi9cbiAgZmluZENvbW1hbmRzUmVxdWlyZUNvbnRleHRSZXN1bHQgPSB1bmRlZmluZWRcblxuICAvKiogQHR5cGUge01pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dFR5cGUgfCB1bmRlZmluZWR9ICovXG4gIF9taWdyYXRpb25zUmVxdWlyZUNvbnRleHRSZXN1bHQgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPE1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dFR5cGU+fSBbYXJncy5taWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFja10gLSBNaWdyYXRpb25zIHJlcXVpcmUgY29udGV4dCBjYWxsYmFjay5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHttaWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFjaywgLi4ucmVzdEFyZ3N9ID0ge30pIHtcbiAgICBzdXBlcigpXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIHRoaXMubWlncmF0aW9uc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2sgPSBtaWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFja1xuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKVxuICB9XG5cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8TWlncmF0aW9uc1JlcXVpcmVDb250ZXh0VHlwZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgbWlncmF0aW9ucyByZXF1aXJlIGNvbnRleHQuXG4gICAqL1xuICBhc3luYyBtaWdyYXRpb25zUmVxdWlyZUNvbnRleHQoKSB7XG4gICAgY29uc3Qge21pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dENhbGxiYWNrfSA9IHRoaXNcblxuICAgIGlmICghbWlncmF0aW9uc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2spIHRocm93IG5ldyBFcnJvcihcIm1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dENhbGxiYWNrIGlzIHJlcXVpcmVkXCIpXG5cbiAgICB0aGlzLl9taWdyYXRpb25zUmVxdWlyZUNvbnRleHRSZXN1bHQgfHw9IGF3YWl0IG1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dENhbGxiYWNrKClcblxuICAgIHJldHVybiB0aGlzLl9taWdyYXRpb25zUmVxdWlyZUNvbnRleHRSZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxpbXBvcnQoXCIuL2Jhc2UuanNcIikuQ29tbWFuZEZpbGVPYmplY3RUeXBlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZHMuXG4gICAqL1xuICBhc3luYyBmaW5kQ29tbWFuZHMoKSB7XG4gICAgdGhpcy5fZmluZENvbW1hbmRzUmVzdWx0ID0gdGhpcy5fYWN0dWFsRmluZENvbW1hbmRzKClcblxuICAgIHJldHVybiB0aGlzLl9maW5kQ29tbWFuZHNSZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Q29tbWFuZHNSZXF1aXJlQ29udGV4dFR5cGV9IC0gVGhlIGNvbW1hbmRzIHJlcXVpcmUgY29udGV4dC5cbiAgICovXG4gIF9maW5kQ29tbWFuZHNSZXF1aXJlQ29udGV4dCgpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgdGhpcy5maW5kQ29tbWFuZHNSZXF1aXJlQ29udGV4dFJlc3VsdCB8fD0gLyoqIEB0eXBlIHtDb21tYW5kc1JlcXVpcmVDb250ZXh0VHlwZX0gKi8gKHJlcXVpcmUuY29udGV4dChcIi4uL2NsaS9jb21tYW5kc1wiLCB0cnVlLCAvXFwuanMkLykpXG5cbiAgICByZXR1cm4gdGhpcy5maW5kQ29tbWFuZHNSZXF1aXJlQ29udGV4dFJlc3VsdFxuICB9XG5cbiAgX2FjdHVhbEZpbmRDb21tYW5kcygpIHtcbiAgICBjb25zdCBjb21tYW5kRmlsZXMgPSB0aGlzLl9maW5kQ29tbWFuZHNSZXF1aXJlQ29udGV4dCgpXG4gICAgY29uc3QgY29tbWFuZHMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBhRmlsZVBhdGggb2YgY29tbWFuZEZpbGVzLmtleXMoKSkge1xuICAgICAgY29uc3QgYUZpbGVQYXRoUGFydHMgPSBhRmlsZVBhdGguc3BsaXQoXCIvXCIpXG4gICAgICBjb25zdCBsYXN0UGFydCA9IGFGaWxlUGF0aFBhcnRzW2FGaWxlUGF0aFBhcnRzLmxlbmd0aCAtIDFdXG4gICAgICBsZXQgbmFtZVxuXG4gICAgICBpZiAobGFzdFBhcnQgPT0gXCJpbmRleC5qc1wiKSB7XG4gICAgICAgIG5hbWUgPSBhRmlsZVBhdGhQYXJ0c1thRmlsZVBhdGhQYXJ0cy5sZW5ndGggLSAyXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmFtZSA9IGxhc3RQYXJ0LnJlcGxhY2UoXCIuanNcIiwgXCJcIilcbiAgICAgIH1cblxuICAgICAgY29tbWFuZHMucHVzaCh7bmFtZSwgZmlsZTogYUZpbGVQYXRofSlcbiAgICB9XG5cbiAgICByZXR1cm4gY29tbWFuZHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGFyZ3MuY29tbWFuZFBhcnRzIC0gQ29tbWFuZCBwYXJ0cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dHlwZW9mIGltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdD59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgcmVxdWlyZSBjb21tYW5kLlxuICAgKi9cbiAgYXN5bmMgcmVxdWlyZUNvbW1hbmQoe2NvbW1hbmRQYXJ0c30pIHtcbiAgICBsZXQgZmlsZVBhdGggPSBcIi5cIlxuXG4gICAgZm9yIChsZXQgY29tbWFuZFBhcnQgb2YgY29tbWFuZFBhcnRzKSB7XG4gICAgICBpZiAoY29tbWFuZFBhcnQgPT0gXCJkXCIpIGNvbW1hbmRQYXJ0ID0gXCJkZXN0cm95XCJcbiAgICAgIGlmIChjb21tYW5kUGFydCA9PSBcImdcIikgY29tbWFuZFBhcnQgPSBcImdlbmVyYXRlXCJcbiAgICAgIGlmIChjb21tYW5kUGFydCA9PSBcInNcIikgY29tbWFuZFBhcnQgPSBcInNlcnZlclwiXG5cbiAgICAgIGZpbGVQYXRoICs9IGAvJHtjb21tYW5kUGFydH1gXG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGhzID0gW11cblxuICAgIGZpbGVQYXRocy5wdXNoKGAke2ZpbGVQYXRofS9pbmRleC5qc2ApXG4gICAgZmlsZVBhdGggKz0gXCIuanNcIlxuICAgIGZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKVxuXG4gICAgY29uc3QgY29tbWFuZHNSZXF1aXJlQ29udGV4dCA9IGF3YWl0IHRoaXMuX2ZpbmRDb21tYW5kc1JlcXVpcmVDb250ZXh0KClcbiAgICBsZXQgY29tbWFuZENsYXNzSW1wb3J0XG5cbiAgICBmb3IgKGNvbnN0IGFGaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICAgIGNvbW1hbmRDbGFzc0ltcG9ydCA9IGNvbW1hbmRzUmVxdWlyZUNvbnRleHQoYUZpbGVQYXRoKVxuXG4gICAgICBpZiAoY29tbWFuZENsYXNzSW1wb3J0KSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFjb21tYW5kQ2xhc3NJbXBvcnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmRQYXJ0cy5qb2luKFwiOlwiKX0uIFBvc3NpYmxlIGNvbW1hbmRzOiAke2NvbW1hbmRzUmVxdWlyZUNvbnRleHQua2V5cygpfWApXG4gICAgfVxuXG4gICAgY29uc3QgQ29tbWFuZENsYXNzID0gY29tbWFuZENsYXNzSW1wb3J0LmRlZmF1bHRcblxuICAgIHJldHVybiBDb21tYW5kQ2xhc3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxpbXBvcnQoXCIuL2Jhc2UuanNcIikuTWlncmF0aW9uT2JqZWN0VHlwZT4+fSAtIFJlc29sdmVzIHdpdGggdGhlIG1pZ3JhdGlvbnMuXG4gICAqL1xuICBhc3luYyBmaW5kTWlncmF0aW9ucygpIHtcbiAgICBjb25zdCBtaWdyYXRpb25zUmVxdWlyZUNvbnRleHQgPSBhd2FpdCB0aGlzLm1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dCgpXG4gICAgY29uc3QgZmlsZXMgPSBtaWdyYXRpb25zUmVxdWlyZUNvbnRleHRcbiAgICAgIC5rZXlzKClcbiAgICAgIC5tYXAoKGZpbGUpID0+IHtcbiAgICAgICAgLy8gXCIxMywxNFwiIGJlY2F1c2Ugc29tZXMgXCJyZXF1aXJlLWNvbnRleHRcIi1ucG0tbW9kdWxlIGRlbGV0ZXMgZmlyc3QgY2hhcmFjdGVyIT9cbiAgICAgICAgY29uc3QgbWF0Y2ggPSBmaWxlLm1hdGNoKC8oXFxkezEzLDE0fSktKC4rKVxcLmpzJC8pXG5cbiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIG51bGxcblxuICAgICAgICAvLyBGaXggcmVxdWlyZS1jb250ZXh0LW5wbS1tb2R1bGUgZGVsZXRlcyBmaXJzdCBjaGFyYWN0ZXJcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gZmlsZVxuICAgICAgICBsZXQgZGF0ZU51bWJlciA9IG1hdGNoWzFdXG5cbiAgICAgICAgaWYgKGRhdGVOdW1iZXIubGVuZ3RoID09IDEzKSB7XG4gICAgICAgICAgZGF0ZU51bWJlciA9IGAyJHtkYXRlTnVtYmVyfWBcbiAgICAgICAgICBmaWxlTmFtZSA9IGAyJHtmaWxlTmFtZX1gXG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSByZWdleFxuICAgICAgICBjb25zdCBkYXRlID0gcGFyc2VJbnQoZGF0ZU51bWJlcilcbiAgICAgICAgY29uc3QgbWlncmF0aW9uTmFtZSA9IG1hdGNoWzJdXG4gICAgICAgIGNvbnN0IG1pZ3JhdGlvbkNsYXNzTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUobWlncmF0aW9uTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikpXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmaWxlOiBmaWxlTmFtZSxcbiAgICAgICAgICBmdWxsUGF0aDogZmlsZSxcbiAgICAgICAgICBkYXRlLFxuICAgICAgICAgIG1pZ3JhdGlvbkNsYXNzTmFtZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigobWlncmF0aW9uKSA9PiBCb29sZWFuKG1pZ3JhdGlvbikpXG4gICAgICAuc29ydCgobWlncmF0aW9uMSwgbWlncmF0aW9uMikgPT4gbWlncmF0aW9uMS5kYXRlIC0gbWlncmF0aW9uMi5kYXRlKVxuXG4gICAgcmV0dXJuIGZpbGVzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdGVzdEZpbGVzIC0gVGVzdCBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGltcG9ydFRlc3RGaWxlcyh0ZXN0RmlsZXMpIHtcbiAgICBmb3IgKGNvbnN0IHRlc3RGaWxlIG9mIHRlc3RGaWxlcykge1xuICAgICAgYXdhaXQgaW1wb3J0KHRlc3RGaWxlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGggLSBGaWxlIHBhdGguXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHR5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9taWdyYXRpb24vaW5kZXguanNcIikuZGVmYXVsdD59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgcmVxdWlyZSBtaWdyYXRpb24uXG4gICAqL1xuICByZXF1aXJlTWlncmF0aW9uID0gYXN5bmMgKGZpbGVQYXRoKSA9PiB7XG4gICAgaWYgKCFmaWxlUGF0aCkgdGhyb3cgbmV3IEVycm9yKFwiZmlsZVBhdGggaXMgcmVxdWlyZWRcIilcblxuICAgIGNvbnN0IG1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dCA9IGF3YWl0IHRoaXMubWlncmF0aW9uc1JlcXVpcmVDb250ZXh0KClcbiAgICBjb25zdCBtaWdyYXRpb25JbXBvcnQgPSBtaWdyYXRpb25zUmVxdWlyZUNvbnRleHQoZmlsZVBhdGgpXG5cbiAgICBpZiAoIW1pZ3JhdGlvbkltcG9ydCkgdGhyb3cgbmV3IEVycm9yKGBNaWdyYXRpb24gZmlsZSAke2ZpbGVQYXRofSBub3QgZm91bmRgKVxuXG4gICAgY29uc3QgbWlncmF0aW9uSW1wb3J0RGVmYXVsdCA9IG1pZ3JhdGlvbkltcG9ydC5kZWZhdWx0XG5cbiAgICBpZiAoIW1pZ3JhdGlvbkltcG9ydERlZmF1bHQpIHRocm93IG5ldyBFcnJvcihcIk1pZ3JhdGlvbiBmaWxlIG11c3QgZXhwb3J0IGEgZGVmYXVsdCBtaWdyYXRpb24gY2xhc3NcIilcbiAgICBpZiAodHlwZW9mIG1pZ3JhdGlvbkltcG9ydERlZmF1bHQgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKFwiTWlncmF0aW9uIGRlZmF1bHQgZXhwb3J0IGlzbid0IGEgZnVuY3Rpb24gKHNob3VsZCBiZSBhIGNsYXNzIHdoaWNoIGlzIGEgZnVuY3Rpb24gaW4gSlMpXCIpXG5cbiAgICByZXR1cm4gbWlncmF0aW9uSW1wb3J0RGVmYXVsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+fSBhcmdzLmRicyAtIERicy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGFmdGVyTWlncmF0aW9ucyh7ZGJzfSkge1xuICAgIGNvbnN0IHN0cnVjdHVyZVNxbCA9IGF3YWl0IHRoaXMuX3NxbGl0ZVN0cnVjdHVyZVNxbCh7ZGJzfSlcblxuICAgIGlmICghc3RydWN0dXJlU3FsKSByZXR1cm5cblxuICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcInN0cnVjdHVyZS5zcWw6XCIsIHN0cnVjdHVyZVNxbF0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdD59IGFyZ3MuZGJzIC0gRGJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsPn0gLSBSZXNvbHZlcyB3aXRoIFNRTCBzdHJpbmcuXG4gICAqL1xuICBhc3luYyBfc3FsaXRlU3RydWN0dXJlU3FsKHtkYnN9KSB7XG4gICAgY29uc3Qgc3FsaXRlSWRlbnRpZmllcnMgPSBPYmplY3Qua2V5cyhkYnMpXG4gICAgICAuZmlsdGVyKChpZGVudGlmaWVyKSA9PiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXREYXRhYmFzZVR5cGUoaWRlbnRpZmllcikgPT0gXCJzcWxpdGVcIilcblxuICAgIGlmIChzcWxpdGVJZGVudGlmaWVycy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHNlY3Rpb25zID0gW11cblxuICAgIGZvciAoY29uc3QgaWRlbnRpZmllciBvZiBzcWxpdGVJZGVudGlmaWVycykge1xuICAgICAgY29uc3QgZGIgPSBkYnNbaWRlbnRpZmllcl1cbiAgICAgIGNvbnN0IHN0cnVjdHVyZVNxbCA9IHR5cGVvZiBkYi5zdHJ1Y3R1cmVTcWwgPT09IFwiZnVuY3Rpb25cIiA/IGF3YWl0IGRiLnN0cnVjdHVyZVNxbCgpIDogbnVsbFxuICAgICAgY29uc3QgdHJpbW1lZFNxbCA9IHN0cnVjdHVyZVNxbD8udHJpbUVuZCgpXG5cbiAgICAgIGlmICghdHJpbW1lZFNxbCkgY29udGludWVcblxuICAgICAgaWYgKHNxbGl0ZUlkZW50aWZpZXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgc2VjdGlvbnMucHVzaChgLS0gJHtpZGVudGlmaWVyfWApXG4gICAgICB9XG5cbiAgICAgIHNlY3Rpb25zLnB1c2godHJpbW1lZFNxbClcbiAgICB9XG5cbiAgICBpZiAoc2VjdGlvbnMubGVuZ3RoID09IDApIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4gYCR7c2VjdGlvbnMuam9pbihcIlxcblxcblwiKX1cXG5gXG4gIH1cbn1cbiJdfQ==
|
|
245
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9icm93c2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUM1QixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUN2RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFBO0FBRW5DOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVILE1BQU0sQ0FBQyxPQUFPLE9BQU8sbUNBQW9DLFNBQVEsSUFBSTtJQUNuRSxxREFBcUQ7SUFDckQsZ0NBQWdDLEdBQUcsU0FBUyxDQUFBO0lBRTVDLHVEQUF1RDtJQUN2RCwrQkFBK0IsR0FBRyxTQUFTLENBQUE7SUFFM0Msc0RBQXNEO0lBQ3RELDhCQUE4QixHQUFHLFNBQVMsQ0FBQTtJQUUxQzs7OztPQUlHO0lBQ0gsWUFBWSxFQUFDLGdDQUFnQyxFQUFFLCtCQUErQixFQUFFLEdBQUcsUUFBUSxFQUFDLEdBQUcsRUFBRTtRQUMvRixLQUFLLEVBQUUsQ0FBQTtRQUNQLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixJQUFJLENBQUMsZ0NBQWdDLEdBQUcsZ0NBQWdDLENBQUE7UUFDeEUsSUFBSSxDQUFDLCtCQUErQixHQUFHLCtCQUErQixDQUFBO1FBQ3RFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDaEMsQ0FBQztJQUdEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLHdCQUF3QjtRQUM1QixNQUFNLEVBQUMsZ0NBQWdDLEVBQUMsR0FBRyxJQUFJLENBQUE7UUFFL0MsSUFBSSxDQUFDLGdDQUFnQztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQTtR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LFNBQVE7WUFFekIsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxVQUFVLEVBQUUsQ0FBQyxDQUFBO1lBQ25DLENBQUM7WUFFRCxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzNCLENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRXJDLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUE7SUFDckMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UgZnJvbSBcIi4vYmFzZS5qc1wiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuaW1wb3J0IHtMb2dnZXJ9IGZyb20gXCIuLi9sb2dnZXIuanNcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHsoaWQ6IHN0cmluZykgPT4ge2RlZmF1bHQ6IHR5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9taWdyYXRpb24vaW5kZXguanNcIikuZGVmYXVsdH19IE1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dElERnVuY3Rpb25UeXBlXG4gKiBAdHlwZWRlZiB7TWlncmF0aW9uc1JlcXVpcmVDb250ZXh0SURGdW5jdGlvblR5cGUgJiB7XG4gKiAgIGtleXM6ICgpID0+IHN0cmluZ1tdLFxuICogICBpZDogc3RyaW5nXG4gKiB9fSBNaWdyYXRpb25zUmVxdWlyZUNvbnRleHRUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KGlkOiBzdHJpbmcpID0+IHtkZWZhdWx0OiB0eXBlb2YgaW1wb3J0KFwiLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiKS5kZWZhdWx0fX0gQ29tbWFuZHNSZXF1aXJlQ29udGV4dElERnVuY3Rpb25UeXBlXG4gKiBAdHlwZWRlZiB7Q29tbWFuZHNSZXF1aXJlQ29udGV4dElERnVuY3Rpb25UeXBlICYge1xuICogICBrZXlzOiAoKSA9PiBzdHJpbmdbXSxcbiAqICAgaWQ6IHN0cmluZ1xuICogfX0gQ29tbWFuZHNSZXF1aXJlQ29udGV4dFR5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoaWQ6IHN0cmluZykgPT4gdW5rbm93bn0gVGVzdEZpbGVzUmVxdWlyZUNvbnRleHRJREZ1bmN0aW9uVHlwZVxuICogQHR5cGVkZWYge1Rlc3RGaWxlc1JlcXVpcmVDb250ZXh0SURGdW5jdGlvblR5cGUgJiB7XG4gKiAgIGtleXM6ICgpID0+IHN0cmluZ1tdLFxuICogICBpZDogc3RyaW5nXG4gKiB9fSBUZXN0RmlsZXNSZXF1aXJlQ29udGV4dFR5cGVcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNFbnZpcm9ubWVudHNIYW5kbGVyQnJvd3NlciBleHRlbmRzIEJhc2Uge1xuICAvKiogQHR5cGUge0NvbW1hbmRzUmVxdWlyZUNvbnRleHRUeXBlIHwgdW5kZWZpbmVkfSAqL1xuICBmaW5kQ29tbWFuZHNSZXF1aXJlQ29udGV4dFJlc3VsdCA9IHVuZGVmaW5lZFxuXG4gIC8qKiBAdHlwZSB7TWlncmF0aW9uc1JlcXVpcmVDb250ZXh0VHlwZSB8IHVuZGVmaW5lZH0gKi9cbiAgX21pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dFJlc3VsdCA9IHVuZGVmaW5lZFxuXG4gIC8qKiBAdHlwZSB7VGVzdEZpbGVzUmVxdWlyZUNvbnRleHRUeXBlIHwgdW5kZWZpbmVkfSAqL1xuICBfdGVzdEZpbGVzUmVxdWlyZUNvbnRleHRSZXN1bHQgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPE1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dFR5cGU+fSBbYXJncy5taWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFja10gLSBNaWdyYXRpb25zIHJlcXVpcmUgY29udGV4dCBjYWxsYmFjay5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFRlc3RGaWxlc1JlcXVpcmVDb250ZXh0VHlwZT59IFthcmdzLnRlc3RGaWxlc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2tdIC0gVGVzdCBmaWxlcyByZXF1aXJlIGNvbnRleHQgY2FsbGJhY2suXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7bWlncmF0aW9uc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2ssIHRlc3RGaWxlc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2ssIC4uLnJlc3RBcmdzfSA9IHt9KSB7XG4gICAgc3VwZXIoKVxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICB0aGlzLm1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dENhbGxiYWNrID0gbWlncmF0aW9uc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2tcbiAgICB0aGlzLnRlc3RGaWxlc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2sgPSB0ZXN0RmlsZXNSZXF1aXJlQ29udGV4dENhbGxiYWNrXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMpXG4gIH1cblxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNaWdyYXRpb25zUmVxdWlyZUNvbnRleHRUeXBlPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBtaWdyYXRpb25zIHJlcXVpcmUgY29udGV4dC5cbiAgICovXG4gIGFzeW5jIG1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dCgpIHtcbiAgICBjb25zdCB7bWlncmF0aW9uc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2t9ID0gdGhpc1xuXG4gICAgaWYgKCFtaWdyYXRpb25zUmVxdWlyZUNvbnRleHRDYWxsYmFjaykgdGhyb3cgbmV3IEVycm9yKFwibWlncmF0aW9uc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2sgaXMgcmVxdWlyZWRcIilcblxuICAgIHRoaXMuX21pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dFJlc3VsdCB8fD0gYXdhaXQgbWlncmF0aW9uc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2soKVxuXG4gICAgcmV0dXJuIHRoaXMuX21pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dFJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFRlc3RGaWxlc1JlcXVpcmVDb250ZXh0VHlwZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgdGVzdCBmaWxlcyByZXF1aXJlIGNvbnRleHQuXG4gICAqL1xuICBhc3luYyB0ZXN0RmlsZXNSZXF1aXJlQ29udGV4dCgpIHtcbiAgICBjb25zdCB7dGVzdEZpbGVzUmVxdWlyZUNvbnRleHRDYWxsYmFja30gPSB0aGlzXG5cbiAgICBpZiAoIXRlc3RGaWxlc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInRlc3RGaWxlc1JlcXVpcmVDb250ZXh0Q2FsbGJhY2sgaXMgcmVxdWlyZWQgd2hlbiBydW5uaW5nIGJyb3dzZXIgdGVzdHNcIilcbiAgICB9XG5cbiAgICB0aGlzLl90ZXN0RmlsZXNSZXF1aXJlQ29udGV4dFJlc3VsdCB8fD0gYXdhaXQgdGVzdEZpbGVzUmVxdWlyZUNvbnRleHRDYWxsYmFjaygpXG5cbiAgICByZXR1cm4gdGhpcy5fdGVzdEZpbGVzUmVxdWlyZUNvbnRleHRSZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxpbXBvcnQoXCIuL2Jhc2UuanNcIikuQ29tbWFuZEZpbGVPYmplY3RUeXBlPj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZHMuXG4gICAqL1xuICBhc3luYyBmaW5kQ29tbWFuZHMoKSB7XG4gICAgdGhpcy5fZmluZENvbW1hbmRzUmVzdWx0ID0gdGhpcy5fYWN0dWFsRmluZENvbW1hbmRzKClcblxuICAgIHJldHVybiB0aGlzLl9maW5kQ29tbWFuZHNSZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Q29tbWFuZHNSZXF1aXJlQ29udGV4dFR5cGV9IC0gVGhlIGNvbW1hbmRzIHJlcXVpcmUgY29udGV4dC5cbiAgICovXG4gIF9maW5kQ29tbWFuZHNSZXF1aXJlQ29udGV4dCgpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgdGhpcy5maW5kQ29tbWFuZHNSZXF1aXJlQ29udGV4dFJlc3VsdCB8fD0gLyoqIEB0eXBlIHtDb21tYW5kc1JlcXVpcmVDb250ZXh0VHlwZX0gKi8gKHJlcXVpcmUuY29udGV4dChcIi4uL2NsaS9jb21tYW5kc1wiLCB0cnVlLCAvXFwuanMkLykpXG5cbiAgICByZXR1cm4gdGhpcy5maW5kQ29tbWFuZHNSZXF1aXJlQ29udGV4dFJlc3VsdFxuICB9XG5cbiAgX2FjdHVhbEZpbmRDb21tYW5kcygpIHtcbiAgICBjb25zdCBjb21tYW5kRmlsZXMgPSB0aGlzLl9maW5kQ29tbWFuZHNSZXF1aXJlQ29udGV4dCgpXG4gICAgY29uc3QgY29tbWFuZHMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBhRmlsZVBhdGggb2YgY29tbWFuZEZpbGVzLmtleXMoKSkge1xuICAgICAgY29uc3QgYUZpbGVQYXRoUGFydHMgPSBhRmlsZVBhdGguc3BsaXQoXCIvXCIpXG4gICAgICBjb25zdCBsYXN0UGFydCA9IGFGaWxlUGF0aFBhcnRzW2FGaWxlUGF0aFBhcnRzLmxlbmd0aCAtIDFdXG4gICAgICBsZXQgbmFtZVxuXG4gICAgICBpZiAobGFzdFBhcnQgPT0gXCJpbmRleC5qc1wiKSB7XG4gICAgICAgIG5hbWUgPSBhRmlsZVBhdGhQYXJ0c1thRmlsZVBhdGhQYXJ0cy5sZW5ndGggLSAyXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmFtZSA9IGxhc3RQYXJ0LnJlcGxhY2UoXCIuanNcIiwgXCJcIilcbiAgICAgIH1cblxuICAgICAgY29tbWFuZHMucHVzaCh7bmFtZSwgZmlsZTogYUZpbGVQYXRofSlcbiAgICB9XG5cbiAgICByZXR1cm4gY29tbWFuZHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGFyZ3MuY29tbWFuZFBhcnRzIC0gQ29tbWFuZCBwYXJ0cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dHlwZW9mIGltcG9ydChcIi4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIikuZGVmYXVsdD59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgcmVxdWlyZSBjb21tYW5kLlxuICAgKi9cbiAgYXN5bmMgcmVxdWlyZUNvbW1hbmQoe2NvbW1hbmRQYXJ0c30pIHtcbiAgICBsZXQgZmlsZVBhdGggPSBcIi5cIlxuXG4gICAgZm9yIChsZXQgY29tbWFuZFBhcnQgb2YgY29tbWFuZFBhcnRzKSB7XG4gICAgICBpZiAoY29tbWFuZFBhcnQgPT0gXCJkXCIpIGNvbW1hbmRQYXJ0ID0gXCJkZXN0cm95XCJcbiAgICAgIGlmIChjb21tYW5kUGFydCA9PSBcImdcIikgY29tbWFuZFBhcnQgPSBcImdlbmVyYXRlXCJcbiAgICAgIGlmIChjb21tYW5kUGFydCA9PSBcInNcIikgY29tbWFuZFBhcnQgPSBcInNlcnZlclwiXG5cbiAgICAgIGZpbGVQYXRoICs9IGAvJHtjb21tYW5kUGFydH1gXG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGhzID0gW11cblxuICAgIGZpbGVQYXRocy5wdXNoKGAke2ZpbGVQYXRofS9pbmRleC5qc2ApXG4gICAgZmlsZVBhdGggKz0gXCIuanNcIlxuICAgIGZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKVxuXG4gICAgY29uc3QgY29tbWFuZHNSZXF1aXJlQ29udGV4dCA9IGF3YWl0IHRoaXMuX2ZpbmRDb21tYW5kc1JlcXVpcmVDb250ZXh0KClcbiAgICBsZXQgY29tbWFuZENsYXNzSW1wb3J0XG5cbiAgICBmb3IgKGNvbnN0IGFGaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICAgIGNvbW1hbmRDbGFzc0ltcG9ydCA9IGNvbW1hbmRzUmVxdWlyZUNvbnRleHQoYUZpbGVQYXRoKVxuXG4gICAgICBpZiAoY29tbWFuZENsYXNzSW1wb3J0KSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFjb21tYW5kQ2xhc3NJbXBvcnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmRQYXJ0cy5qb2luKFwiOlwiKX0uIFBvc3NpYmxlIGNvbW1hbmRzOiAke2NvbW1hbmRzUmVxdWlyZUNvbnRleHQua2V5cygpfWApXG4gICAgfVxuXG4gICAgY29uc3QgQ29tbWFuZENsYXNzID0gY29tbWFuZENsYXNzSW1wb3J0LmRlZmF1bHRcblxuICAgIHJldHVybiBDb21tYW5kQ2xhc3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxpbXBvcnQoXCIuL2Jhc2UuanNcIikuTWlncmF0aW9uT2JqZWN0VHlwZT4+fSAtIFJlc29sdmVzIHdpdGggdGhlIG1pZ3JhdGlvbnMuXG4gICAqL1xuICBhc3luYyBmaW5kTWlncmF0aW9ucygpIHtcbiAgICBjb25zdCBtaWdyYXRpb25zUmVxdWlyZUNvbnRleHQgPSBhd2FpdCB0aGlzLm1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dCgpXG4gICAgY29uc3QgZmlsZXMgPSBtaWdyYXRpb25zUmVxdWlyZUNvbnRleHRcbiAgICAgIC5rZXlzKClcbiAgICAgIC5tYXAoKGZpbGUpID0+IHtcbiAgICAgICAgLy8gXCIxMywxNFwiIGJlY2F1c2Ugc29tZXMgXCJyZXF1aXJlLWNvbnRleHRcIi1ucG0tbW9kdWxlIGRlbGV0ZXMgZmlyc3QgY2hhcmFjdGVyIT9cbiAgICAgICAgY29uc3QgbWF0Y2ggPSBmaWxlLm1hdGNoKC8oXFxkezEzLDE0fSktKC4rKVxcLmpzJC8pXG5cbiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIG51bGxcblxuICAgICAgICAvLyBGaXggcmVxdWlyZS1jb250ZXh0LW5wbS1tb2R1bGUgZGVsZXRlcyBmaXJzdCBjaGFyYWN0ZXJcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gZmlsZVxuICAgICAgICBsZXQgZGF0ZU51bWJlciA9IG1hdGNoWzFdXG5cbiAgICAgICAgaWYgKGRhdGVOdW1iZXIubGVuZ3RoID09IDEzKSB7XG4gICAgICAgICAgZGF0ZU51bWJlciA9IGAyJHtkYXRlTnVtYmVyfWBcbiAgICAgICAgICBmaWxlTmFtZSA9IGAyJHtmaWxlTmFtZX1gXG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSByZWdleFxuICAgICAgICBjb25zdCBkYXRlID0gcGFyc2VJbnQoZGF0ZU51bWJlcilcbiAgICAgICAgY29uc3QgbWlncmF0aW9uTmFtZSA9IG1hdGNoWzJdXG4gICAgICAgIGNvbnN0IG1pZ3JhdGlvbkNsYXNzTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUobWlncmF0aW9uTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikpXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmaWxlOiBmaWxlTmFtZSxcbiAgICAgICAgICBmdWxsUGF0aDogZmlsZSxcbiAgICAgICAgICBkYXRlLFxuICAgICAgICAgIG1pZ3JhdGlvbkNsYXNzTmFtZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigobWlncmF0aW9uKSA9PiBCb29sZWFuKG1pZ3JhdGlvbikpXG4gICAgICAuc29ydCgobWlncmF0aW9uMSwgbWlncmF0aW9uMikgPT4gbWlncmF0aW9uMS5kYXRlIC0gbWlncmF0aW9uMi5kYXRlKVxuXG4gICAgcmV0dXJuIGZpbGVzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdGVzdEZpbGVzIC0gVGVzdCBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGltcG9ydFRlc3RGaWxlcyh0ZXN0RmlsZXMpIHtcbiAgICBjb25zdCB0ZXN0RmlsZXNSZXF1aXJlQ29udGV4dCA9IGF3YWl0IHRoaXMudGVzdEZpbGVzUmVxdWlyZUNvbnRleHQoKVxuICAgIGNvbnN0IHJlcXVpcmVLZXlzID0gdGVzdEZpbGVzUmVxdWlyZUNvbnRleHQua2V5cygpXG4gICAgY29uc3Qgbm9ybWFsaXplZEtleXMgPSByZXF1aXJlS2V5cy5tYXAoKGtleSkgPT4gKHtcbiAgICAgIGtleSxcbiAgICAgIG5vcm1hbGl6ZWQ6IGtleS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKS5yZXBsYWNlKC9eXFwuXFwvLywgXCJcIilcbiAgICB9KSlcblxuICAgIGZvciAoY29uc3QgdGVzdEZpbGUgb2YgdGVzdEZpbGVzKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkRmlsZSA9IHRlc3RGaWxlLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpXG4gICAgICBjb25zdCBtYXRjaGVkS2V5ID0gbm9ybWFsaXplZEtleXMuZmluZCgoZW50cnkpID0+IG5vcm1hbGl6ZWRGaWxlLmVuZHNXaXRoKGVudHJ5Lm5vcm1hbGl6ZWQpKT8ua2V5XG5cbiAgICAgIGlmICghbWF0Y2hlZEtleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRlc3QgZmlsZSAke3Rlc3RGaWxlfSB3YXMgbm90IGZvdW5kIGluIHRoZSBwcm92aWRlZCByZXF1aXJlIGNvbnRleHRgKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpbXBvcnRlZCA9IHRlc3RGaWxlc1JlcXVpcmVDb250ZXh0KG1hdGNoZWRLZXkpXG5cbiAgICAgIGlmIChpbXBvcnRlZCAmJiB0eXBlb2YgaW1wb3J0ZWQgPT0gXCJvYmplY3RcIiAmJiBcInRoZW5cIiBpbiBpbXBvcnRlZCAmJiB0eXBlb2YgaW1wb3J0ZWQudGhlbiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgYXdhaXQgaW1wb3J0ZWRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvbWlncmF0aW9uL2luZGV4LmpzXCIpLmRlZmF1bHQ+fSAtIFJlc29sdmVzIHdpdGggdGhlIHJlcXVpcmUgbWlncmF0aW9uLlxuICAgKi9cbiAgcmVxdWlyZU1pZ3JhdGlvbiA9IGFzeW5jIChmaWxlUGF0aCkgPT4ge1xuICAgIGlmICghZmlsZVBhdGgpIHRocm93IG5ldyBFcnJvcihcImZpbGVQYXRoIGlzIHJlcXVpcmVkXCIpXG5cbiAgICBjb25zdCBtaWdyYXRpb25zUmVxdWlyZUNvbnRleHQgPSBhd2FpdCB0aGlzLm1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dCgpXG4gICAgY29uc3QgbWlncmF0aW9uSW1wb3J0ID0gbWlncmF0aW9uc1JlcXVpcmVDb250ZXh0KGZpbGVQYXRoKVxuXG4gICAgaWYgKCFtaWdyYXRpb25JbXBvcnQpIHRocm93IG5ldyBFcnJvcihgTWlncmF0aW9uIGZpbGUgJHtmaWxlUGF0aH0gbm90IGZvdW5kYClcblxuICAgIGNvbnN0IG1pZ3JhdGlvbkltcG9ydERlZmF1bHQgPSBtaWdyYXRpb25JbXBvcnQuZGVmYXVsdFxuXG4gICAgaWYgKCFtaWdyYXRpb25JbXBvcnREZWZhdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJNaWdyYXRpb24gZmlsZSBtdXN0IGV4cG9ydCBhIGRlZmF1bHQgbWlncmF0aW9uIGNsYXNzXCIpXG4gICAgaWYgKHR5cGVvZiBtaWdyYXRpb25JbXBvcnREZWZhdWx0ICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihcIk1pZ3JhdGlvbiBkZWZhdWx0IGV4cG9ydCBpc24ndCBhIGZ1bmN0aW9uIChzaG91bGQgYmUgYSBjbGFzcyB3aGljaCBpcyBhIGZ1bmN0aW9uIGluIEpTKVwiKVxuXG4gICAgcmV0dXJuIG1pZ3JhdGlvbkltcG9ydERlZmF1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0Pn0gYXJncy5kYnMgLSBEYnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBhZnRlck1pZ3JhdGlvbnMoe2Ric30pIHtcbiAgICBjb25zdCBzdHJ1Y3R1cmVTcWwgPSBhd2FpdCB0aGlzLl9zcWxpdGVTdHJ1Y3R1cmVTcWwoe2Ric30pXG5cbiAgICBpZiAoIXN0cnVjdHVyZVNxbCkgcmV0dXJuXG5cbiAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJzdHJ1Y3R1cmUuc3FsOlwiLCBzdHJ1Y3R1cmVTcWxdKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+fSBhcmdzLmRicyAtIERicy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbD59IC0gUmVzb2x2ZXMgd2l0aCBTUUwgc3RyaW5nLlxuICAgKi9cbiAgYXN5bmMgX3NxbGl0ZVN0cnVjdHVyZVNxbCh7ZGJzfSkge1xuICAgIGNvbnN0IHNxbGl0ZUlkZW50aWZpZXJzID0gT2JqZWN0LmtleXMoZGJzKVxuICAgICAgLmZpbHRlcigoaWRlbnRpZmllcikgPT4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0RGF0YWJhc2VUeXBlKGlkZW50aWZpZXIpID09IFwic3FsaXRlXCIpXG5cbiAgICBpZiAoc3FsaXRlSWRlbnRpZmllcnMubGVuZ3RoID09IDApIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBzZWN0aW9ucyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2Ygc3FsaXRlSWRlbnRpZmllcnMpIHtcbiAgICAgIGNvbnN0IGRiID0gZGJzW2lkZW50aWZpZXJdXG4gICAgICBjb25zdCBzdHJ1Y3R1cmVTcWwgPSB0eXBlb2YgZGIuc3RydWN0dXJlU3FsID09PSBcImZ1bmN0aW9uXCIgPyBhd2FpdCBkYi5zdHJ1Y3R1cmVTcWwoKSA6IG51bGxcbiAgICAgIGNvbnN0IHRyaW1tZWRTcWwgPSBzdHJ1Y3R1cmVTcWw/LnRyaW1FbmQoKVxuXG4gICAgICBpZiAoIXRyaW1tZWRTcWwpIGNvbnRpbnVlXG5cbiAgICAgIGlmIChzcWxpdGVJZGVudGlmaWVycy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHNlY3Rpb25zLnB1c2goYC0tICR7aWRlbnRpZmllcn1gKVxuICAgICAgfVxuXG4gICAgICBzZWN0aW9ucy5wdXNoKHRyaW1tZWRTcWwpXG4gICAgfVxuXG4gICAgaWYgKHNlY3Rpb25zLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbFxuXG4gICAgcmV0dXJuIGAke3NlY3Rpb25zLmpvaW4oXCJcXG5cXG5cIil9XFxuYFxuICB9XG59XG4iXX0=
|