velocious 1.0.171 → 1.0.172
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 +43 -0
- package/build/src/configuration-types.d.ts +14 -0
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +5 -1
- package/build/src/configuration.d.ts +9 -1
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +14 -2
- package/build/src/environment-handlers/node/cli/commands/test.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/test.js +71 -7
- package/build/src/http-server/client/index.d.ts.map +1 -1
- package/build/src/http-server/client/index.js +4 -2
- package/build/src/http-server/client/websocket-session.d.ts +23 -3
- package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-session.js +62 -7
- package/build/src/http-server/websocket-channel.d.ts +45 -0
- package/build/src/http-server/websocket-channel.d.ts.map +1 -0
- package/build/src/http-server/websocket-channel.js +64 -0
- package/build/src/http-server/worker-handler/worker-thread.d.ts +2 -2
- package/build/src/http-server/worker-handler/worker-thread.d.ts.map +1 -1
- package/build/src/http-server/worker-handler/worker-thread.js +10 -5
- package/build/src/testing/test-files-finder.d.ts +18 -0
- package/build/src/testing/test-files-finder.d.ts.map +1 -1
- package/build/src/testing/test-files-finder.js +44 -4
- package/build/src/testing/test-runner.d.ts +92 -4
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +153 -11
- package/build/src/testing/test.d.ts +4 -1
- package/build/src/testing/test.d.ts.map +1 -1
- package/build/src/testing/test.js +58 -5
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -4,6 +4,7 @@ import TestFilesFinder from "../../../../testing/test-files-finder.js";
|
|
|
4
4
|
import TestRunner from "../../../../testing/test-runner.js";
|
|
5
5
|
const INCLUDE_TAG_FLAGS = new Set(["--tag", "--include-tag", "-t"]);
|
|
6
6
|
const EXCLUDE_TAG_FLAGS = new Set(["--exclude-tag", "--skip-tag", "-x"]);
|
|
7
|
+
const EXAMPLE_FLAGS = new Set(["--example", "--name", "-e"]);
|
|
7
8
|
/**
|
|
8
9
|
* @param {string | undefined} value - Tag argument value.
|
|
9
10
|
* @returns {string[]} - Tags list.
|
|
@@ -16,14 +17,39 @@ function splitTags(value) {
|
|
|
16
17
|
.map((tag) => tag.trim())
|
|
17
18
|
.filter(Boolean);
|
|
18
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* @param {string} value - Value.
|
|
22
|
+
* @returns {string} - Escaped value for regex.
|
|
23
|
+
*/
|
|
24
|
+
function escapeRegExp(value) {
|
|
25
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* @param {string[]} patterns - Patterns.
|
|
29
|
+
* @returns {RegExp[]} - Normalized patterns.
|
|
30
|
+
*/
|
|
31
|
+
function normalizeExamplePatterns(patterns) {
|
|
32
|
+
const normalized = [];
|
|
33
|
+
for (const pattern of patterns) {
|
|
34
|
+
const regexMatch = pattern.match(/^\/(.+)\/([gimsuy]*)$/);
|
|
35
|
+
if (regexMatch) {
|
|
36
|
+
normalized.push(new RegExp(regexMatch[1], regexMatch[2]));
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
normalized.push(new RegExp(escapeRegExp(pattern)));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return normalized;
|
|
43
|
+
}
|
|
19
44
|
/**
|
|
20
45
|
* @param {string[]} processArgs - Process args.
|
|
21
|
-
* @returns {{includeTags: string[], excludeTags: string[], filteredProcessArgs: string[]}} - Parsed tags and process args.
|
|
46
|
+
* @returns {{includeTags: string[], excludeTags: string[], examplePatterns: string[], filteredProcessArgs: string[]}} - Parsed tags and process args.
|
|
22
47
|
*/
|
|
23
|
-
function
|
|
48
|
+
function parseFilters(processArgs) {
|
|
24
49
|
const includeTags = [];
|
|
25
50
|
const excludeTags = [];
|
|
26
51
|
const filteredProcessArgs = processArgs.length > 0 ? [processArgs[0]] : [];
|
|
52
|
+
const examplePatterns = [];
|
|
27
53
|
let inRestArgs = false;
|
|
28
54
|
for (let i = 1; i < processArgs.length; i++) {
|
|
29
55
|
const arg = processArgs[i];
|
|
@@ -65,12 +91,29 @@ function parseTagFilters(processArgs) {
|
|
|
65
91
|
excludeTags.push(...splitTags(arg.slice("--skip-tag=".length)));
|
|
66
92
|
continue;
|
|
67
93
|
}
|
|
94
|
+
if (EXAMPLE_FLAGS.has(arg)) {
|
|
95
|
+
const nextValue = processArgs[i + 1];
|
|
96
|
+
if (nextValue && !nextValue.startsWith("-")) {
|
|
97
|
+
examplePatterns.push(nextValue);
|
|
98
|
+
i++;
|
|
99
|
+
}
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (arg.startsWith("--example=")) {
|
|
103
|
+
examplePatterns.push(arg.slice("--example=".length));
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (arg.startsWith("--name=")) {
|
|
107
|
+
examplePatterns.push(arg.slice("--name=".length));
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
68
110
|
}
|
|
69
111
|
filteredProcessArgs.push(arg);
|
|
70
112
|
}
|
|
71
113
|
return {
|
|
72
114
|
includeTags: Array.from(new Set(includeTags)),
|
|
73
115
|
excludeTags: Array.from(new Set(excludeTags)),
|
|
116
|
+
examplePatterns,
|
|
74
117
|
filteredProcessArgs
|
|
75
118
|
};
|
|
76
119
|
}
|
|
@@ -89,10 +132,17 @@ export default class VelociousCliCommandsTest extends BaseCommand {
|
|
|
89
132
|
directories.push(`${this.directory()}/tests`);
|
|
90
133
|
directories.push(`${this.directory()}/spec`);
|
|
91
134
|
}
|
|
92
|
-
const { includeTags, excludeTags, filteredProcessArgs } =
|
|
135
|
+
const { includeTags, excludeTags, examplePatterns, filteredProcessArgs } = parseFilters(this.processArgs || []);
|
|
93
136
|
const testFilesFinder = new TestFilesFinder({ directory, directories, processArgs: filteredProcessArgs });
|
|
94
137
|
const testFiles = await testFilesFinder.findTestFiles();
|
|
95
|
-
const testRunner = new TestRunner({
|
|
138
|
+
const testRunner = new TestRunner({
|
|
139
|
+
configuration: this.getConfiguration(),
|
|
140
|
+
excludeTags,
|
|
141
|
+
includeTags,
|
|
142
|
+
testFiles,
|
|
143
|
+
lineFilters: testFilesFinder.getLineFiltersByFile(),
|
|
144
|
+
examplePatterns: normalizeExamplePatterns(examplePatterns)
|
|
145
|
+
});
|
|
96
146
|
let signalHandled = false;
|
|
97
147
|
const handleSignal = async (signal) => {
|
|
98
148
|
if (signalHandled)
|
|
@@ -117,11 +167,25 @@ export default class VelociousCliCommandsTest extends BaseCommand {
|
|
|
117
167
|
}
|
|
118
168
|
await testRunner.run();
|
|
119
169
|
const executedTests = testRunner.getExecutedTestsCount();
|
|
120
|
-
|
|
121
|
-
|
|
170
|
+
const lineFilters = testRunner.getLineFilters();
|
|
171
|
+
const hasLineFilters = Object.keys(lineFilters).length > 0;
|
|
172
|
+
const hasExampleFilters = examplePatterns.length > 0;
|
|
173
|
+
const hasTagFilters = includeTags.length > 0 || excludeTags.length > 0;
|
|
174
|
+
if ((hasTagFilters || hasLineFilters || hasExampleFilters) && executedTests === 0) {
|
|
175
|
+
console.error("\nNo tests matched the provided filters");
|
|
122
176
|
process.exit(1);
|
|
123
177
|
}
|
|
124
178
|
if (testRunner.isFailed()) {
|
|
179
|
+
const failedTests = testRunner.getFailedTestDetails();
|
|
180
|
+
if (failedTests.length > 0) {
|
|
181
|
+
console.error("\nFailed tests:");
|
|
182
|
+
for (const failed of failedTests) {
|
|
183
|
+
const location = failed.filePath && failed.line
|
|
184
|
+
? ` (${failed.filePath}:${failed.line})`
|
|
185
|
+
: "";
|
|
186
|
+
console.error(`- ${failed.fullDescription}${location}`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
125
189
|
console.error(`\nTest run failed with ${testRunner.getFailedTests()} failed tests and ${testRunner.getSuccessfulTests()} successfull`);
|
|
126
190
|
process.exit(1);
|
|
127
191
|
}
|
|
@@ -135,4 +199,4 @@ export default class VelociousCliCommandsTest extends BaseCommand {
|
|
|
135
199
|
}
|
|
136
200
|
}
|
|
137
201
|
}
|
|
138
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9ub2RlL2NsaS9jb21tYW5kcy90ZXN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFdBQVcsTUFBTSxpQ0FBaUMsQ0FBQTtBQUN6RCxPQUFPLGVBQWUsTUFBTSwwQ0FBMEMsQ0FBQTtBQUN0RSxPQUFPLFVBQVUsTUFBTSxvQ0FBb0MsQ0FBQTtBQUUzRCxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBQ25FLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7QUFFeEU7OztHQUdHO0FBQ0gsU0FBUyxTQUFTLENBQUMsS0FBSztJQUN0QixJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sRUFBRSxDQUFBO0lBRXJCLE9BQU8sS0FBSztTQUNULEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDVixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN4QixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDcEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsZUFBZSxDQUFDLFdBQVc7SUFDbEMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFBO0lBQ3RCLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQTtJQUN0QixNQUFNLG1CQUFtQixHQUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDMUUsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFB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QU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO1FBRXhELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLGFBQWEsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM5RSxPQUFPLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUE7WUFDNUQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNqQixDQUFDO1FBRUQsSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixVQUFVLENBQUMsY0FBYyxFQUFFLHFCQUFxQixVQUFVLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxDQUFDLENBQUE7WUFDdEksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNqQixDQUFDO2FBQU0sSUFBSSxVQUFVLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDO1lBQzVDLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLFVBQVUsQ0FBQyxjQUFjLEVBQUUscUJBQXFCLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLENBQUMsQ0FBQTtZQUNuSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2pCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsVUFBVSxDQUFDLGtCQUFrQixFQUFFLG1CQUFtQixDQUFDLENBQUE7WUFDNUYsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNqQixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBCYXNlQ29tbWFuZCBmcm9tIFwiLi4vLi4vLi4vLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiXG5pbXBvcnQgVGVzdEZpbGVzRmluZGVyIGZyb20gXCIuLi8uLi8uLi8uLi90ZXN0aW5nL3Rlc3QtZmlsZXMtZmluZGVyLmpzXCJcbmltcG9ydCBUZXN0UnVubmVyIGZyb20gXCIuLi8uLi8uLi8uLi90ZXN0aW5nL3Rlc3QtcnVubmVyLmpzXCJcblxuY29uc3QgSU5DTFVERV9UQUdfRkxBR1MgPSBuZXcgU2V0KFtcIi0tdGFnXCIsIFwiLS1pbmNsdWRlLXRhZ1wiLCBcIi10XCJdKVxuY29uc3QgRVhDTFVERV9UQUdfRkxBR1MgPSBuZXcgU2V0KFtcIi0tZXhjbHVkZS10YWdcIiwgXCItLXNraXAtdGFnXCIsIFwiLXhcIl0pXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHZhbHVlIC0gVGFnIGFyZ3VtZW50IHZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ1tdfSAtIFRhZ3MgbGlzdC5cbiAqL1xuZnVuY3Rpb24gc3BsaXRUYWdzKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXVxuXG4gIHJldHVybiB2YWx1ZVxuICAgIC5zcGxpdChcIixcIilcbiAgICAubWFwKCh0YWcpID0+IHRhZy50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nW119IHByb2Nlc3NBcmdzIC0gUHJvY2VzcyBhcmdzLlxuICogQHJldHVybnMge3tpbmNsdWRlVGFnczogc3RyaW5nW10sIGV4Y2x1ZGVUYWdzOiBzdHJpbmdbXSwgZmlsdGVyZWRQcm9jZXNzQXJnczogc3RyaW5nW119fSAtIFBhcnNlZCB0YWdzIGFuZCBwcm9jZXNzIGFyZ3MuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlVGFnRmlsdGVycyhwcm9jZXNzQXJncykge1xuICBjb25zdCBpbmNsdWRlVGFncyA9IFtdXG4gIGNvbnN0IGV4Y2x1ZGVUYWdzID0gW11cbiAgY29uc3QgZmlsdGVyZWRQcm9jZXNzQXJncyA9IHByb2Nlc3NBcmdzLmxlbmd0aCA+IDAgPyBbcHJvY2Vzc0FyZ3NbMF1dIDogW11cbiAgbGV0IGluUmVzdEFyZ3MgPSBmYWxzZVxuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgcHJvY2Vzc0FyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhcmcgPSBwcm9jZXNzQXJnc1tpXVxuXG4gICAgaWYgKGFyZyA9PT0gXCItLVwiKSB7XG4gICAgICBpblJlc3RBcmdzID0gdHJ1ZVxuICAgICAgZmlsdGVyZWRQcm9jZXNzQXJncy5wdXNoKGFyZylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKCFpblJlc3RBcmdzKSB7XG4gICAgICBpZiAoSU5DTFVERV9UQUdfRkxBR1MuaGFzKGFyZykpIHtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlID0gcHJvY2Vzc0FyZ3NbaSArIDFdXG5cbiAgICAgICAgaWYgKG5leHRWYWx1ZSAmJiAhbmV4dFZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgaW5jbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MobmV4dFZhbHVlKSlcbiAgICAgICAgICBpKytcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoRVhDTFVERV9UQUdfRkxBR1MuaGFzKGFyZykpIHtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlID0gcHJvY2Vzc0FyZ3NbaSArIDFdXG5cbiAgICAgICAgaWYgKG5leHRWYWx1ZSAmJiAhbmV4dFZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgZXhjbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MobmV4dFZhbHVlKSlcbiAgICAgICAgICBpKytcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLXRhZz1cIikpIHtcbiAgICAgICAgaW5jbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MoYXJnLnNsaWNlKFwiLS10YWc9XCIubGVuZ3RoKSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0taW5jbHVkZS10YWc9XCIpKSB7XG4gICAgICAgIGluY2x1ZGVUYWdzLnB1c2goLi4uc3BsaXRUYWdzKGFyZy5zbGljZShcIi0taW5jbHVkZS10YWc9XCIubGVuZ3RoKSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tZXhjbHVkZS10YWc9XCIpKSB7XG4gICAgICAgIGV4Y2x1ZGVUYWdzLnB1c2goLi4uc3BsaXRUYWdzKGFyZy5zbGljZShcIi0tZXhjbHVkZS10YWc9XCIubGVuZ3RoKSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tc2tpcC10YWc9XCIpKSB7XG4gICAgICAgIGV4Y2x1ZGVUYWdzLnB1c2goLi4uc3BsaXRUYWdzKGFyZy5zbGljZShcIi0tc2tpcC10YWc9XCIubGVuZ3RoKSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgZmlsdGVyZWRQcm9jZXNzQXJncy5wdXNoKGFyZylcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaW5jbHVkZVRhZ3M6IEFycmF5LmZyb20obmV3IFNldChpbmNsdWRlVGFncykpLFxuICAgIGV4Y2x1ZGVUYWdzOiBBcnJheS5mcm9tKG5ldyBTZXQoZXhjbHVkZVRhZ3MpKSxcbiAgICBmaWx0ZXJlZFByb2Nlc3NBcmdzXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzQ2xpQ29tbWFuZHNUZXN0IGV4dGVuZHMgQmFzZUNvbW1hbmQge1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnNldEVudmlyb25tZW50KFwidGVzdFwiKVxuXG4gICAgbGV0IGRpcmVjdG9yeVxuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gW11cblxuICAgIGlmIChwcm9jZXNzLmVudi5WRUxPQ0lPVVNfVEVTVF9ESVIpIHtcbiAgICAgIGRpcmVjdG9yeSA9IHByb2Nlc3MuZW52LlZFTE9DSU9VU19URVNUX0RJUlxuICAgICAgZGlyZWN0b3JpZXMucHVzaChwcm9jZXNzLmVudi5WRUxPQ0lPVVNfVEVTVF9ESVIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRpcmVjdG9yeSA9IHRoaXMuZGlyZWN0b3J5KClcbiAgICAgIGRpcmVjdG9yaWVzLnB1c2goYCR7dGhpcy5kaXJlY3RvcnkoKX0vX190ZXN0c19fYClcbiAgICAgIGRpcmVjdG9yaWVzLnB1c2goYCR7dGhpcy5kaXJlY3RvcnkoKX0vdGVzdHNgKVxuICAgICAgZGlyZWN0b3JpZXMucHVzaChgJHt0aGlzLmRpcmVjdG9yeSgpfS9zcGVjYClcbiAgICB9XG5cbiAgICBjb25zdCB7aW5jbHVkZVRhZ3MsIGV4Y2x1ZGVUYWdzLCBmaWx0ZXJlZFByb2Nlc3NBcmdzfSA9IHBhcnNlVGFnRmlsdGVycyh0aGlzLnByb2Nlc3NBcmdzIHx8IFtdKVxuICAgIGNvbnN0IHRlc3RGaWxlc0ZpbmRlciA9IG5ldyBUZXN0RmlsZXNGaW5kZXIoe2RpcmVjdG9yeSwgZGlyZWN0b3JpZXMsIHByb2Nlc3NBcmdzOiBmaWx0ZXJlZFByb2Nlc3NBcmdzfSlcbiAgICBjb25zdCB0ZXN0RmlsZXMgPSBhd2FpdCB0ZXN0RmlsZXNGaW5kZXIuZmluZFRlc3RGaWxlcygpXG4gICAgY29uc3QgdGVzdFJ1bm5lciA9IG5ldyBUZXN0UnVubmVyKHtjb25maWd1cmF0aW9uOiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKSwgZXhjbHVkZVRhZ3MsIGluY2x1ZGVUYWdzLCB0ZXN0RmlsZXN9KVxuICAgIGxldCBzaWduYWxIYW5kbGVkID0gZmFsc2VcblxuICAgIGNvbnN0IGhhbmRsZVNpZ25hbCA9IGFzeW5jIChzaWduYWwpID0+IHtcbiAgICAgIGlmIChzaWduYWxIYW5kbGVkKSByZXR1cm5cbiAgICAgIHNpZ25hbEhhbmRsZWQgPSB0cnVlXG4gICAgICBjb25zb2xlLmVycm9yKGBcXG5SZWNlaXZlZCAke3NpZ25hbH0sIHJ1bm5pbmcgYWZ0ZXJBbGwgaG9va3MgYmVmb3JlIGV4aXQuLi5gKVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0ZXN0UnVubmVyLnJ1bkFmdGVyQWxsc0ZvckFjdGl2ZVNjb3BlcygpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHdoaWxlIHJ1bm5pbmcgYWZ0ZXJBbGwgaG9va3M6XCIsIGVycm9yKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEzMClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9jZXNzLm9uY2UoXCJTSUdJTlRcIiwgKCkgPT4geyB2b2lkIGhhbmRsZVNpZ25hbChcIlNJR0lOVFwiKSB9KVxuICAgIHByb2Nlc3Mub25jZShcIlNJR1RFUk1cIiwgKCkgPT4geyB2b2lkIGhhbmRsZVNpZ25hbChcIlNJR1RFUk1cIikgfSlcblxuICAgIGF3YWl0IHRlc3RSdW5uZXIucHJlcGFyZSgpXG5cbiAgICBpZiAodGVzdFJ1bm5lci5nZXRUZXN0c0NvdW50KCkgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0ZXN0UnVubmVyLmdldFRlc3RzQ291bnQoKX0gdGVzdHMgd2FzIGZvdW5kIGluICR7dGVzdEZpbGVzLmxlbmd0aH0gZmlsZShzKWApXG4gICAgfVxuXG4gICAgYXdhaXQgdGVzdFJ1bm5lci5ydW4oKVxuXG4gICAgY29uc3QgZXhlY3V0ZWRUZXN0cyA9IHRlc3RSdW5uZXIuZ2V0RXhlY3V0ZWRUZXN0c0NvdW50KClcblxuICAgIGlmICgoaW5jbHVkZVRhZ3MubGVuZ3RoID4gMCB8fCBleGNsdWRlVGFncy5sZW5ndGggPiAwKSAmJiBleGVjdXRlZFRlc3RzID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiXFxuTm8gdGVzdHMgbWF0Y2hlZCB0aGUgcHJvdmlkZWQgdGFnIGZpbHRlcnNcIilcbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgIH1cblxuICAgIGlmICh0ZXN0UnVubmVyLmlzRmFpbGVkKCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxcblRlc3QgcnVuIGZhaWxlZCB3aXRoICR7dGVzdFJ1bm5lci5nZXRGYWlsZWRUZXN0cygpfSBmYWlsZWQgdGVzdHMgYW5kICR7dGVzdFJ1bm5lci5nZXRTdWNjZXNzZnVsVGVzdHMoKX0gc3VjY2Vzc2Z1bGxgKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgfSBlbHNlIGlmICh0ZXN0UnVubmVyLmFyZUFueVRlc3RzRm9jdXNzZWQoKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgXFxuRm9jdXNzZWQgcnVuIHdpdGggJHt0ZXN0UnVubmVyLmdldEZhaWxlZFRlc3RzKCl9IGZhaWxlZCB0ZXN0cyBhbmQgJHt0ZXN0UnVubmVyLmdldFN1Y2Nlc3NmdWxUZXN0cygpfSBzdWNjZXNzZnVsbGApXG4gICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coYFxcblRlc3QgcnVuIHN1Y2NlZWRlZCB3aXRoICR7dGVzdFJ1bm5lci5nZXRTdWNjZXNzZnVsVGVzdHMoKX0gc3VjY2Vzc2Z1bCB0ZXN0c2ApXG4gICAgICBwcm9jZXNzLmV4aXQoMClcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9ub2RlL2NsaS9jb21tYW5kcy90ZXN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFdBQVcsTUFBTSxpQ0FBaUMsQ0FBQTtBQUN6RCxPQUFPLGVBQWUsTUFBTSwwQ0FBMEMsQ0FBQTtBQUN0RSxPQUFPLFVBQVUsTUFBTSxvQ0FBb0MsQ0FBQTtBQUUzRCxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBQ25FLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7QUFDeEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7QUFFNUQ7OztHQUdHO0FBQ0gsU0FBUyxTQUFTLENBQUMsS0FBSztJQUN0QixJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sRUFBRSxDQUFBO0lBRXJCLE9BQU8sS0FBSztTQUNULEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDVixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN4QixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDcEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsWUFBWSxDQUFDLEtBQUs7SUFDekIsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxDQUFBO0FBQ3JELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLHdCQUF3QixDQUFDLFFBQVE7SUFDeEMsTUFBTSxVQUFVLEdBQUcs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Q0FBQyxDQUFDLENBQUE7UUFDakIsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQmFzZUNvbW1hbmQgZnJvbSBcIi4uLy4uLy4uLy4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIlxuaW1wb3J0IFRlc3RGaWxlc0ZpbmRlciBmcm9tIFwiLi4vLi4vLi4vLi4vdGVzdGluZy90ZXN0LWZpbGVzLWZpbmRlci5qc1wiXG5pbXBvcnQgVGVzdFJ1bm5lciBmcm9tIFwiLi4vLi4vLi4vLi4vdGVzdGluZy90ZXN0LXJ1bm5lci5qc1wiXG5cbmNvbnN0IElOQ0xVREVfVEFHX0ZMQUdTID0gbmV3IFNldChbXCItLXRhZ1wiLCBcIi0taW5jbHVkZS10YWdcIiwgXCItdFwiXSlcbmNvbnN0IEVYQ0xVREVfVEFHX0ZMQUdTID0gbmV3IFNldChbXCItLWV4Y2x1ZGUtdGFnXCIsIFwiLS1za2lwLXRhZ1wiLCBcIi14XCJdKVxuY29uc3QgRVhBTVBMRV9GTEFHUyA9IG5ldyBTZXQoW1wiLS1leGFtcGxlXCIsIFwiLS1uYW1lXCIsIFwiLWVcIl0pXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHZhbHVlIC0gVGFnIGFyZ3VtZW50IHZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ1tdfSAtIFRhZ3MgbGlzdC5cbiAqL1xuZnVuY3Rpb24gc3BsaXRUYWdzKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXVxuXG4gIHJldHVybiB2YWx1ZVxuICAgIC5zcGxpdChcIixcIilcbiAgICAubWFwKCh0YWcpID0+IHRhZy50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBFc2NhcGVkIHZhbHVlIGZvciByZWdleC5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIilcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXR0ZXJucyAtIFBhdHRlcm5zLlxuICogQHJldHVybnMge1JlZ0V4cFtdfSAtIE5vcm1hbGl6ZWQgcGF0dGVybnMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV4YW1wbGVQYXR0ZXJucyhwYXR0ZXJucykge1xuICBjb25zdCBub3JtYWxpemVkID0gW11cblxuICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICBjb25zdCByZWdleE1hdGNoID0gcGF0dGVybi5tYXRjaCgvXlxcLyguKylcXC8oW2dpbXN1eV0qKSQvKVxuXG4gICAgaWYgKHJlZ2V4TWF0Y2gpIHtcbiAgICAgIG5vcm1hbGl6ZWQucHVzaChuZXcgUmVnRXhwKHJlZ2V4TWF0Y2hbMV0sIHJlZ2V4TWF0Y2hbMl0pKVxuICAgIH0gZWxzZSB7XG4gICAgICBub3JtYWxpemVkLnB1c2gobmV3IFJlZ0V4cChlc2NhcGVSZWdFeHAocGF0dGVybikpKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvY2Vzc0FyZ3MgLSBQcm9jZXNzIGFyZ3MuXG4gKiBAcmV0dXJucyB7e2luY2x1ZGVUYWdzOiBzdHJpbmdbXSwgZXhjbHVkZVRhZ3M6IHN0cmluZ1tdLCBleGFtcGxlUGF0dGVybnM6IHN0cmluZ1tdLCBmaWx0ZXJlZFByb2Nlc3NBcmdzOiBzdHJpbmdbXX19IC0gUGFyc2VkIHRhZ3MgYW5kIHByb2Nlc3MgYXJncy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VGaWx0ZXJzKHByb2Nlc3NBcmdzKSB7XG4gIGNvbnN0IGluY2x1ZGVUYWdzID0gW11cbiAgY29uc3QgZXhjbHVkZVRhZ3MgPSBbXVxuICBjb25zdCBmaWx0ZXJlZFByb2Nlc3NBcmdzID0gcHJvY2Vzc0FyZ3MubGVuZ3RoID4gMCA/IFtwcm9jZXNzQXJnc1swXV0gOiBbXVxuICBjb25zdCBleGFtcGxlUGF0dGVybnMgPSBbXVxuICBsZXQgaW5SZXN0QXJncyA9IGZhbHNlXG5cbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBwcm9jZXNzQXJncy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFyZyA9IHByb2Nlc3NBcmdzW2ldXG5cbiAgICBpZiAoYXJnID09PSBcIi0tXCIpIHtcbiAgICAgIGluUmVzdEFyZ3MgPSB0cnVlXG4gICAgICBmaWx0ZXJlZFByb2Nlc3NBcmdzLnB1c2goYXJnKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoIWluUmVzdEFyZ3MpIHtcbiAgICAgIGlmIChJTkNMVURFX1RBR19GTEFHUy5oYXMoYXJnKSkge1xuICAgICAgICBjb25zdCBuZXh0VmFsdWUgPSBwcm9jZXNzQXJnc1tpICsgMV1cblxuICAgICAgICBpZiAobmV4dFZhbHVlICYmICFuZXh0VmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICBpbmNsdWRlVGFncy5wdXNoKC4uLnNwbGl0VGFncyhuZXh0VmFsdWUpKVxuICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChFWENMVURFX1RBR19GTEFHUy5oYXMoYXJnKSkge1xuICAgICAgICBjb25zdCBuZXh0VmFsdWUgPSBwcm9jZXNzQXJnc1tpICsgMV1cblxuICAgICAgICBpZiAobmV4dFZhbHVlICYmICFuZXh0VmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICBleGNsdWRlVGFncy5wdXNoKC4uLnNwbGl0VGFncyhuZXh0VmFsdWUpKVxuICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tdGFnPVwiKSkge1xuICAgICAgICBpbmNsdWRlVGFncy5wdXNoKC4uLnNwbGl0VGFncyhhcmcuc2xpY2UoXCItLXRhZz1cIi5sZW5ndGgpKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS1pbmNsdWRlLXRhZz1cIikpIHtcbiAgICAgICAgaW5jbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MoYXJnLnNsaWNlKFwiLS1pbmNsdWRlLXRhZz1cIi5sZW5ndGgpKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS1leGNsdWRlLXRhZz1cIikpIHtcbiAgICAgICAgZXhjbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MoYXJnLnNsaWNlKFwiLS1leGNsdWRlLXRhZz1cIi5sZW5ndGgpKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS1za2lwLXRhZz1cIikpIHtcbiAgICAgICAgZXhjbHVkZVRhZ3MucHVzaCguLi5zcGxpdFRhZ3MoYXJnLnNsaWNlKFwiLS1za2lwLXRhZz1cIi5sZW5ndGgpKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKEVYQU1QTEVfRkxBR1MuaGFzKGFyZykpIHtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlID0gcHJvY2Vzc0FyZ3NbaSArIDFdXG5cbiAgICAgICAgaWYgKG5leHRWYWx1ZSAmJiAhbmV4dFZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgZXhhbXBsZVBhdHRlcm5zLnB1c2gobmV4dFZhbHVlKVxuICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tZXhhbXBsZT1cIikpIHtcbiAgICAgICAgZXhhbXBsZVBhdHRlcm5zLnB1c2goYXJnLnNsaWNlKFwiLS1leGFtcGxlPVwiLmxlbmd0aCkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tbmFtZT1cIikpIHtcbiAgICAgICAgZXhhbXBsZVBhdHRlcm5zLnB1c2goYXJnLnNsaWNlKFwiLS1uYW1lPVwiLmxlbmd0aCkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgZmlsdGVyZWRQcm9jZXNzQXJncy5wdXNoKGFyZylcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaW5jbHVkZVRhZ3M6IEFycmF5LmZyb20obmV3IFNldChpbmNsdWRlVGFncykpLFxuICAgIGV4Y2x1ZGVUYWdzOiBBcnJheS5mcm9tKG5ldyBTZXQoZXhjbHVkZVRhZ3MpKSxcbiAgICBleGFtcGxlUGF0dGVybnMsXG4gICAgZmlsdGVyZWRQcm9jZXNzQXJnc1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0NsaUNvbW1hbmRzVGVzdCBleHRlbmRzIEJhc2VDb21tYW5kIHtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5zZXRFbnZpcm9ubWVudChcInRlc3RcIilcblxuICAgIGxldCBkaXJlY3RvcnlcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IFtdXG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuVkVMT0NJT1VTX1RFU1RfRElSKSB7XG4gICAgICBkaXJlY3RvcnkgPSBwcm9jZXNzLmVudi5WRUxPQ0lPVVNfVEVTVF9ESVJcbiAgICAgIGRpcmVjdG9yaWVzLnB1c2gocHJvY2Vzcy5lbnYuVkVMT0NJT1VTX1RFU1RfRElSKVxuICAgIH0gZWxzZSB7XG4gICAgICBkaXJlY3RvcnkgPSB0aGlzLmRpcmVjdG9yeSgpXG4gICAgICBkaXJlY3Rvcmllcy5wdXNoKGAke3RoaXMuZGlyZWN0b3J5KCl9L19fdGVzdHNfX2ApXG4gICAgICBkaXJlY3Rvcmllcy5wdXNoKGAke3RoaXMuZGlyZWN0b3J5KCl9L3Rlc3RzYClcbiAgICAgIGRpcmVjdG9yaWVzLnB1c2goYCR7dGhpcy5kaXJlY3RvcnkoKX0vc3BlY2ApXG4gICAgfVxuXG4gICAgY29uc3Qge2luY2x1ZGVUYWdzLCBleGNsdWRlVGFncywgZXhhbXBsZVBhdHRlcm5zLCBmaWx0ZXJlZFByb2Nlc3NBcmdzfSA9IHBhcnNlRmlsdGVycyh0aGlzLnByb2Nlc3NBcmdzIHx8IFtdKVxuICAgIGNvbnN0IHRlc3RGaWxlc0ZpbmRlciA9IG5ldyBUZXN0RmlsZXNGaW5kZXIoe2RpcmVjdG9yeSwgZGlyZWN0b3JpZXMsIHByb2Nlc3NBcmdzOiBmaWx0ZXJlZFByb2Nlc3NBcmdzfSlcbiAgICBjb25zdCB0ZXN0RmlsZXMgPSBhd2FpdCB0ZXN0RmlsZXNGaW5kZXIuZmluZFRlc3RGaWxlcygpXG4gICAgY29uc3QgdGVzdFJ1bm5lciA9IG5ldyBUZXN0UnVubmVyKHtcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLFxuICAgICAgZXhjbHVkZVRhZ3MsXG4gICAgICBpbmNsdWRlVGFncyxcbiAgICAgIHRlc3RGaWxlcyxcbiAgICAgIGxpbmVGaWx0ZXJzOiB0ZXN0RmlsZXNGaW5kZXIuZ2V0TGluZUZpbHRlcnNCeUZpbGUoKSxcbiAgICAgIGV4YW1wbGVQYXR0ZXJuczogbm9ybWFsaXplRXhhbXBsZVBhdHRlcm5zKGV4YW1wbGVQYXR0ZXJucylcbiAgICB9KVxuICAgIGxldCBzaWduYWxIYW5kbGVkID0gZmFsc2VcblxuICAgIGNvbnN0IGhhbmRsZVNpZ25hbCA9IGFzeW5jIChzaWduYWwpID0+IHtcbiAgICAgIGlmIChzaWduYWxIYW5kbGVkKSByZXR1cm5cbiAgICAgIHNpZ25hbEhhbmRsZWQgPSB0cnVlXG4gICAgICBjb25zb2xlLmVycm9yKGBcXG5SZWNlaXZlZCAke3NpZ25hbH0sIHJ1bm5pbmcgYWZ0ZXJBbGwgaG9va3MgYmVmb3JlIGV4aXQuLi5gKVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0ZXN0UnVubmVyLnJ1bkFmdGVyQWxsc0ZvckFjdGl2ZVNjb3BlcygpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHdoaWxlIHJ1bm5pbmcgYWZ0ZXJBbGwgaG9va3M6XCIsIGVycm9yKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEzMClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9jZXNzLm9uY2UoXCJTSUdJTlRcIiwgKCkgPT4geyB2b2lkIGhhbmRsZVNpZ25hbChcIlNJR0lOVFwiKSB9KVxuICAgIHByb2Nlc3Mub25jZShcIlNJR1RFUk1cIiwgKCkgPT4geyB2b2lkIGhhbmRsZVNpZ25hbChcIlNJR1RFUk1cIikgfSlcblxuICAgIGF3YWl0IHRlc3RSdW5uZXIucHJlcGFyZSgpXG5cbiAgICBpZiAodGVzdFJ1bm5lci5nZXRUZXN0c0NvdW50KCkgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0ZXN0UnVubmVyLmdldFRlc3RzQ291bnQoKX0gdGVzdHMgd2FzIGZvdW5kIGluICR7dGVzdEZpbGVzLmxlbmd0aH0gZmlsZShzKWApXG4gICAgfVxuXG4gICAgYXdhaXQgdGVzdFJ1bm5lci5ydW4oKVxuXG4gICAgY29uc3QgZXhlY3V0ZWRUZXN0cyA9IHRlc3RSdW5uZXIuZ2V0RXhlY3V0ZWRUZXN0c0NvdW50KClcblxuICAgIGNvbnN0IGxpbmVGaWx0ZXJzID0gdGVzdFJ1bm5lci5nZXRMaW5lRmlsdGVycygpXG4gICAgY29uc3QgaGFzTGluZUZpbHRlcnMgPSBPYmplY3Qua2V5cyhsaW5lRmlsdGVycykubGVuZ3RoID4gMFxuICAgIGNvbnN0IGhhc0V4YW1wbGVGaWx0ZXJzID0gZXhhbXBsZVBhdHRlcm5zLmxlbmd0aCA+IDBcbiAgICBjb25zdCBoYXNUYWdGaWx0ZXJzID0gaW5jbHVkZVRhZ3MubGVuZ3RoID4gMCB8fCBleGNsdWRlVGFncy5sZW5ndGggPiAwXG5cbiAgICBpZiAoKGhhc1RhZ0ZpbHRlcnMgfHwgaGFzTGluZUZpbHRlcnMgfHwgaGFzRXhhbXBsZUZpbHRlcnMpICYmIGV4ZWN1dGVkVGVzdHMgPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJcXG5ObyB0ZXN0cyBtYXRjaGVkIHRoZSBwcm92aWRlZCBmaWx0ZXJzXCIpXG4gICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICB9XG5cbiAgICBpZiAodGVzdFJ1bm5lci5pc0ZhaWxlZCgpKSB7XG4gICAgICBjb25zdCBmYWlsZWRUZXN0cyA9IHRlc3RSdW5uZXIuZ2V0RmFpbGVkVGVzdERldGFpbHMoKVxuXG4gICAgICBpZiAoZmFpbGVkVGVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiXFxuRmFpbGVkIHRlc3RzOlwiKVxuXG4gICAgICAgIGZvciAoY29uc3QgZmFpbGVkIG9mIGZhaWxlZFRlc3RzKSB7XG4gICAgICAgICAgY29uc3QgbG9jYXRpb24gPSBmYWlsZWQuZmlsZVBhdGggJiYgZmFpbGVkLmxpbmVcbiAgICAgICAgICAgID8gYCAoJHtmYWlsZWQuZmlsZVBhdGh9OiR7ZmFpbGVkLmxpbmV9KWBcbiAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYC0gJHtmYWlsZWQuZnVsbERlc2NyaXB0aW9ufSR7bG9jYXRpb259YClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmVycm9yKGBcXG5UZXN0IHJ1biBmYWlsZWQgd2l0aCAke3Rlc3RSdW5uZXIuZ2V0RmFpbGVkVGVzdHMoKX0gZmFpbGVkIHRlc3RzIGFuZCAke3Rlc3RSdW5uZXIuZ2V0U3VjY2Vzc2Z1bFRlc3RzKCl9IHN1Y2Nlc3NmdWxsYClcbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgIH0gZWxzZSBpZiAodGVzdFJ1bm5lci5hcmVBbnlUZXN0c0ZvY3Vzc2VkKCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbkZvY3Vzc2VkIHJ1biB3aXRoICR7dGVzdFJ1bm5lci5nZXRGYWlsZWRUZXN0cygpfSBmYWlsZWQgdGVzdHMgYW5kICR7dGVzdFJ1bm5lci5nZXRTdWNjZXNzZnVsVGVzdHMoKX0gc3VjY2Vzc2Z1bGxgKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGBcXG5UZXN0IHJ1biBzdWNjZWVkZWQgd2l0aCAke3Rlc3RSdW5uZXIuZ2V0U3VjY2Vzc2Z1bFRlc3RzKCl9IHN1Y2Nlc3NmdWwgdGVzdHNgKVxuICAgICAgcHJvY2Vzcy5leGl0KDApXG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/index.js"],"names":[],"mappings":"AAUA;IAIE;;;;;OAKG;IACH,2DAJG;QAAqB,WAAW,EAAxB,MAAM;QACyC,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO;QAC1B,aAAa,GAA3B,MAAM;KAChB,EAWA;IAnBD,mEAA2B;IAC3B,cAAiB;IAWf,eAA8B;IAC9B,oBAA8B;IAC9B,wDAAkC;IAClC,sBAAkC;IAElC,8BAA8B;IAC9B,gBADW,aAAa,EAAE,CACF;IAG1B;;;OAGG;IACH,iCAHW,MAAM,GACJ,IAAI,CAgBhB;IAED,kCAsBC;IAED;;;OAGG;IACH,cAHW,MAAM,GACJ,IAAI,CAoBhB;IAXG,wBAAoF;IAaxF;;;OAGG;IACH,6BAHW,OAAO,cAAc,EAAE,OAAO,GAC5B,OAAO,CAOnB;IAED,0CAA0C;IAC1C,uBADc,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/index.js"],"names":[],"mappings":"AAUA;IAIE;;;;;OAKG;IACH,2DAJG;QAAqB,WAAW,EAAxB,MAAM;QACyC,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO;QAC1B,aAAa,GAA3B,MAAM;KAChB,EAWA;IAnBD,mEAA2B;IAC3B,cAAiB;IAWf,eAA8B;IAC9B,oBAA8B;IAC9B,wDAAkC;IAClC,sBAAkC;IAElC,8BAA8B;IAC9B,gBADW,aAAa,EAAE,CACF;IAG1B;;;OAGG;IACH,iCAHW,MAAM,GACJ,IAAI,CAgBhB;IAED,kCAsBC;IAED;;;OAGG;IACH,cAHW,MAAM,GACJ,IAAI,CAoBhB;IAXG,wBAAoF;IAaxF;;;OAGG;IACH,6BAHW,OAAO,cAAc,EAAE,OAAO,GAC5B,OAAO,CAOnB;IAED,0CAA0C;IAC1C,uBADc,IAAI,CAsCjB;IAbC,mCAIE;IAWJ,wBAEC;IAED,yBAqBC;IAED;;;OAGG;IACH,4BAHW,aAAa,GACX,IAAI,CAwChB;CACF;uBAxNoB,iBAAiB;0BAEZ,qBAAqB;oBAD3B,cAAc;6BAEL,wBAAwB"}
|
|
@@ -118,7 +118,8 @@ export default class VeoliciousHttpServerClient {
|
|
|
118
118
|
const response = responseLines.join("\r\n");
|
|
119
119
|
this.websocketSession = new WebsocketSession({
|
|
120
120
|
client: this,
|
|
121
|
-
configuration: this.configuration
|
|
121
|
+
configuration: this.configuration,
|
|
122
|
+
upgradeRequest: this.currentRequest
|
|
122
123
|
});
|
|
123
124
|
this.websocketSession.events.on("close", () => {
|
|
124
125
|
this.websocketSession?.destroy();
|
|
@@ -127,6 +128,7 @@ export default class VeoliciousHttpServerClient {
|
|
|
127
128
|
});
|
|
128
129
|
this.state = "websocket";
|
|
129
130
|
this.events.emit("output", response);
|
|
131
|
+
void this.websocketSession.initializeChannel();
|
|
130
132
|
}
|
|
131
133
|
requestDone = () => {
|
|
132
134
|
this.sendDoneRequests();
|
|
@@ -187,4 +189,4 @@ export default class VeoliciousHttpServerClient {
|
|
|
187
189
|
this.events.emit("output", body);
|
|
188
190
|
}
|
|
189
191
|
}
|
|
190
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUE7QUFDM0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUM5QixPQUFPLFlBQVksTUFBTSw4QkFBOEIsQ0FBQTtBQUN2RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFDdEMsT0FBTyxPQUFPLE1BQU0sY0FBYyxDQUFBO0FBQ2xDLE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sZ0JBQWdCLE1BQU0sd0JBQXdCLENBQUE7QUFFckQsTUFBTSxDQUFDLE9BQU8sT0FBTywwQkFBMEI7SUFDN0MsTUFBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUE7SUFDM0IsS0FBSyxHQUFHLFNBQVMsQ0FBQTtJQUVqQjs7Ozs7T0FLRztJQUNILFlBQVksRUFBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBQztRQUNyRCxJQUFJLENBQUMsYUFBYTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtRQUU3RCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFBO1FBQzlCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBRWxDLDhCQUE4QjtRQUM5QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQTtJQUMxQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsdUJBQXVCLENBQUMsT0FBTztRQUM3QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxJQUFJLEtBQUssQ0FBQTtRQUMvRCxNQUFNLElBQUksR0FBRyxHQUFHLE9BQU8sSUFBSSxDQUFBO1FBQzNCLE1BQU0sT0FBTyxHQUFHO1lBQ2QsUUFBUSxXQUFXLGtCQUFrQjtZQUNyQyxtQkFBbUI7WUFDbkIseUNBQXlDO1lBQ3pDLG1CQUFtQixNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRTtZQUNwRCxFQUFFO1lBQ0YsSUFBSTtTQUNMLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRWQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzNCLENBQUM7SUFFRCxxQkFBcUIsR0FBRyxHQUFHLEVBQUU7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtRQUUxQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUE7UUFFL0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUE7WUFDMUIsT0FBTTtRQUNSLENBQUM7UUFFRCxnSkFBZ0o7UUFDaEosSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUE7UUFFdEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxhQUFhLENBQUM7WUFDdEMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYztTQUM3QixDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUV2QyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ2pELGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtJQUNyQixDQUFDLENBQUE7SUFFRDs7O09BR0c7SUFDSCxPQUFPLENBQUMsSUFBSTtRQUNWLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUNsQyxPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBQyxDQUFDLENBQUE7WUFDcEYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUE7WUFDL0UsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDOUIsSUFBSSxDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQTtRQUMvQixDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtZQUUvRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNoQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQzVELENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsbUJBQW1CLENBQUMsT0FBTztRQUN6QixNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFBO1FBQzlELE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQTtRQUVwRSxPQUFPLE9BQU8sQ0FBQyxhQUFhLElBQUksV0FBVyxJQUFJLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO0lBQ3ZGLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtRQUUvRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO1FBRXZFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsdUJBQXVCLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtZQUNoRSxPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7YUFDakQsTUFBTSxDQUFDLEdBQUcsZUFBZSxzQ0FBc0MsRUFBRSxRQUFRLENBQUM7YUFDMUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ25CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLElBQUksS0FBSyxDQUFBO1FBQzlELE1BQU0sYUFBYSxHQUFHO1lBQ3BCLFFBQVEsV0FBVywwQkFBMEI7WUFDN0Msb0JBQW9CO1lBQ3BCLHFCQUFxQjtZQUNyQix5QkFBeUIsa0JBQWtCLEVBQUU7WUFDN0MsRUFBRTtZQUNGLEVBQUU7U0FDSCxDQUFBO1FBQ0QsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUUzQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQztZQUMzQyxNQUFNLEVBQUUsSUFBSTtZQUNaLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtTQUNsQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO1lBQzVDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsQ0FBQTtZQUNoQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFBO1lBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzNCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUE7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ3RDLENBQUM7SUFFRCxXQUFXLEdBQUcsR0FBRyxFQUFFO1FBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO0lBQ3pCLENBQUMsQ0FBQTtJQUVELGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDWixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQzVDLE1BQU0sT0FBTyxHQUFHLGFBQWEsRUFBRSxVQUFVLEVBQUUsQ0FBQTtZQUUzQyxJQUFJLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDeEMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFBO2dCQUN6QyxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUE7Z0JBRTVFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUE7Z0JBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUE7Z0JBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsa0JBQWtCLEVBQUUsRUFBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBRTdHLElBQUksV0FBVyxJQUFJLEtBQUssSUFBSSxnQkFBZ0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztvQkFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxrQ0FBa0MsV0FBVywwQkFBMEIsZ0JBQWdCLEVBQUUsRUFBRSxFQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFDLENBQUMsQ0FBQyxDQUFBO29CQUNySixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtnQkFDM0IsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFLO1lBQ1AsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFBWSxDQUFDLGFBQWE7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBRS9ELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDaEQsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQzFDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUMvQixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO1FBQ3ZCLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQTtRQUM1RSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUE7UUFFekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtRQUVqRyxJQUFJLFdBQVcsSUFBSSxLQUFLLElBQUksZ0JBQWdCLElBQUksWUFBWSxFQUFFLENBQUM7WUFDN0QsUUFBUSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUE7UUFDaEQsQ0FBQzthQUFNLENBQUM7WUFDTixRQUFRLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMzQyxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFBO1FBRTNELFFBQVEsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDbkQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUE7UUFDOUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUE7UUFFekMsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFBO1FBRWhCLE9BQU8sSUFBSSxRQUFRLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRSxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUE7UUFFckgsS0FBSyxNQUFNLFNBQVMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekMsS0FBSyxNQUFNLFdBQVcsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RELE9BQU8sSUFBSSxHQUFHLFNBQVMsS0FBSyxXQUFXLE1BQU0sQ0FBQTtZQUMvQyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxNQUFNLENBQUE7UUFFakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGNyeXB0byBmcm9tIFwiY3J5cHRvXCJcbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCIuLi8uLi91dGlscy9ldmVudC1lbWl0dGVyLmpzXCJcbmltcG9ydCB7TG9nZ2VyfSBmcm9tIFwiLi4vLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCBSZXF1ZXN0IGZyb20gXCIuL3JlcXVlc3QuanNcIlxuaW1wb3J0IFJlcXVlc3RSdW5uZXIgZnJvbSBcIi4vcmVxdWVzdC1ydW5uZXIuanNcIlxuaW1wb3J0IFdlYnNvY2tldFNlc3Npb24gZnJvbSBcIi4vd2Vic29ja2V0LXNlc3Npb24uanNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZW9saWNpb3VzSHR0cFNlcnZlckNsaWVudCB7XG4gIGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICBzdGF0ZSA9IFwiaW5pdGlhbFwiXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmNsaWVudENvdW50IC0gQ2xpZW50IGNvdW50LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnJlbW90ZUFkZHJlc3NdIC0gUmVtb3RlIGFkZHJlc3MuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y2xpZW50Q291bnQsIGNvbmZpZ3VyYXRpb24sIHJlbW90ZUFkZHJlc3N9KSB7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb25maWd1cmF0aW9uIGdpdmVuXCIpXG5cbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICB0aGlzLmNsaWVudENvdW50ID0gY2xpZW50Q291bnRcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5yZW1vdGVBZGRyZXNzID0gcmVtb3RlQWRkcmVzc1xuXG4gICAgLyoqIEB0eXBlIHtSZXF1ZXN0UnVubmVyW119ICovXG4gICAgdGhpcy5yZXF1ZXN0UnVubmVycyA9IFtdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBNZXNzYWdlIHRleHQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9zZW5kQmFkVXBncmFkZVJlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBodHRwVmVyc2lvbiA9IHRoaXMuY3VycmVudFJlcXVlc3Q/Lmh0dHBWZXJzaW9uKCkgfHwgXCIxLjFcIlxuICAgIGNvbnN0IGJvZHkgPSBgJHttZXNzYWdlfVxcbmBcbiAgICBjb25zdCBoZWFkZXJzID0gW1xuICAgICAgYEhUVFAvJHtodHRwVmVyc2lvbn0gNDAwIEJhZCBSZXF1ZXN0YCxcbiAgICAgIFwiQ29ubmVjdGlvbjogQ2xvc2VcIixcbiAgICAgIFwiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XCIsXG4gICAgICBgQ29udGVudC1MZW5ndGg6ICR7QnVmZmVyLmJ5dGVMZW5ndGgoYm9keSwgXCJ1dGY4XCIpfWAsXG4gICAgICBcIlwiLFxuICAgICAgYm9keVxuICAgIF0uam9pbihcIlxcclxcblwiKVxuXG4gICAgdGhpcy5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBoZWFkZXJzKVxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJjbG9zZVwiKVxuICB9XG5cbiAgZXhlY3V0ZUN1cnJlbnRSZXF1ZXN0ID0gKCkgPT4ge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwiZXhlY3V0ZUN1cnJlbnRSZXF1ZXN0XCIpXG5cbiAgICBpZiAoIXRoaXMuY3VycmVudFJlcXVlc3QpIHRocm93IG5ldyBFcnJvcihcIk5vIGN1cnJlbnQgcmVxdWVzdFwiKVxuXG4gICAgaWYgKHRoaXMuX2lzV2Vic29ja2V0VXBncmFkZSh0aGlzLmN1cnJlbnRSZXF1ZXN0KSkge1xuICAgICAgdGhpcy5fdXBncmFkZVRvV2Vic29ja2V0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFdlIGFyZSBkb25lIHBhcnNpbmcgdGhlIGdpdmVuIHJlcXVlc3QgYW5kIGNhbiB0aGVvcmV0aWNhbGx5IHN0YXJ0IHBhcnNpbmcgYSBuZXcgb25lLCBiZWZvcmUgdGhlIGN1cnJlbnQgcmVxdWVzdCBpcyBkb25lIC0gc28gcmVzZXQgdGhlIHN0YXRlLlxuICAgIHRoaXMuc3RhdGUgPSBcImluaXRpYWxcIlxuXG4gICAgY29uc3QgcmVxdWVzdFJ1bm5lciA9IG5ldyBSZXF1ZXN0UnVubmVyKHtcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgIHJlcXVlc3Q6IHRoaXMuY3VycmVudFJlcXVlc3RcbiAgICB9KVxuXG4gICAgdGhpcy5yZXF1ZXN0UnVubmVycy5wdXNoKHJlcXVlc3RSdW5uZXIpXG5cbiAgICByZXF1ZXN0UnVubmVyLmV2ZW50cy5vbihcImRvbmVcIiwgdGhpcy5yZXF1ZXN0RG9uZSlcbiAgICByZXF1ZXN0UnVubmVyLnJ1bigpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG9uV3JpdGUoZGF0YSkge1xuICAgIGlmICh0aGlzLndlYnNvY2tldFNlc3Npb24pIHtcbiAgICAgIHRoaXMud2Vic29ja2V0U2Vzc2lvbi5vbkRhdGEoZGF0YSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlID09IFwiaW5pdGlhbFwiKSB7XG4gICAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0ID0gbmV3IFJlcXVlc3Qoe2NsaWVudDogdGhpcywgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9ufSlcbiAgICAgIHRoaXMuY3VycmVudFJlcXVlc3QucmVxdWVzdFBhcnNlci5ldmVudHMub24oXCJkb25lXCIsIHRoaXMuZXhlY3V0ZUN1cnJlbnRSZXF1ZXN0KVxuICAgICAgdGhpcy5jdXJyZW50UmVxdWVzdC5mZWVkKGRhdGEpXG4gICAgICB0aGlzLnN0YXRlID0gXCJyZXF1ZXN0U3RhcnRlZFwiXG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09IFwicmVxdWVzdFN0YXJ0ZWRcIikge1xuICAgICAgaWYgKCF0aGlzLmN1cnJlbnRSZXF1ZXN0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjdXJyZW50IHJlcXVlc3RcIilcblxuICAgICAgdGhpcy5jdXJyZW50UmVxdWVzdC5mZWVkKGRhdGEpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGF0ZSBmb3IgY2xpZW50OiAke3RoaXMuc3RhdGV9YClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3JlcXVlc3QuanNcIikuZGVmYXVsdH0gcmVxdWVzdCAtIFJlcXVlc3Qgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHdlYnNvY2tldCB1cGdyYWRlLlxuICAgKi9cbiAgX2lzV2Vic29ja2V0VXBncmFkZShyZXF1ZXN0KSB7XG4gICAgY29uc3QgdXBncmFkZUhlYWRlciA9IHJlcXVlc3QuaGVhZGVyKFwidXBncmFkZVwiKT8udG9Mb3dlckNhc2UoKVxuICAgIGNvbnN0IGNvbm5lY3Rpb25IZWFkZXIgPSByZXF1ZXN0LmhlYWRlcihcImNvbm5lY3Rpb25cIik/LnRvTG93ZXJDYXNlKClcblxuICAgIHJldHVybiBCb29sZWFuKHVwZ3JhZGVIZWFkZXIgPT0gXCJ3ZWJzb2NrZXRcIiAmJiBjb25uZWN0aW9uSGVhZGVyPy5pbmNsdWRlcyhcInVwZ3JhZGVcIikpXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLiAgKi9cbiAgX3VwZ3JhZGVUb1dlYnNvY2tldCgpIHtcbiAgICBpZiAoIXRoaXMuY3VycmVudFJlcXVlc3QpIHRocm93IG5ldyBFcnJvcihcIk5vIGN1cnJlbnQgcmVxdWVzdFwiKVxuXG4gICAgY29uc3Qgc2VjV2Vic29ja2V0S2V5ID0gdGhpcy5jdXJyZW50UmVxdWVzdC5oZWFkZXIoXCJzZWMtd2Vic29ja2V0LWtleVwiKVxuXG4gICAgaWYgKCFzZWNXZWJzb2NrZXRLZXkpIHtcbiAgICAgIHRoaXMuX3NlbmRCYWRVcGdyYWRlUmVzcG9uc2UoXCJNaXNzaW5nIFNlYy1XZWJTb2NrZXQtS2V5IGhlYWRlclwiKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgd2Vic29ja2V0QWNjZXB0S2V5ID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGExXCIpXG4gICAgICAudXBkYXRlKGAke3NlY1dlYnNvY2tldEtleX0yNThFQUZBNS1FOTE0LTQ3REEtOTVDQS1DNUFCMERDODVCMTFgLCBcImJpbmFyeVwiKVxuICAgICAgLmRpZ2VzdChcImJhc2U2NFwiKVxuICAgIGNvbnN0IGh0dHBWZXJzaW9uID0gdGhpcy5jdXJyZW50UmVxdWVzdC5odHRwVmVyc2lvbigpIHx8IFwiMS4xXCJcbiAgICBjb25zdCByZXNwb25zZUxpbmVzID0gW1xuICAgICAgYEhUVFAvJHtodHRwVmVyc2lvbn0gMTAxIFN3aXRjaGluZyBQcm90b2NvbHNgLFxuICAgICAgXCJVcGdyYWRlOiB3ZWJzb2NrZXRcIixcbiAgICAgIFwiQ29ubmVjdGlvbjogVXBncmFkZVwiLFxuICAgICAgYFNlYy1XZWJTb2NrZXQtQWNjZXB0OiAke3dlYnNvY2tldEFjY2VwdEtleX1gLFxuICAgICAgXCJcIixcbiAgICAgIFwiXCJcbiAgICBdXG4gICAgY29uc3QgcmVzcG9uc2UgPSByZXNwb25zZUxpbmVzLmpvaW4oXCJcXHJcXG5cIilcblxuICAgIHRoaXMud2Vic29ja2V0U2Vzc2lvbiA9IG5ldyBXZWJzb2NrZXRTZXNzaW9uKHtcbiAgICAgIGNsaWVudDogdGhpcyxcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvblxuICAgIH0pXG4gICAgdGhpcy53ZWJzb2NrZXRTZXNzaW9uLmV2ZW50cy5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgIHRoaXMud2Vic29ja2V0U2Vzc2lvbj8uZGVzdHJveSgpXG4gICAgICB0aGlzLndlYnNvY2tldFNlc3Npb24gPSB1bmRlZmluZWRcbiAgICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJjbG9zZVwiKVxuICAgIH0pXG4gICAgdGhpcy5zdGF0ZSA9IFwid2Vic29ja2V0XCJcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwib3V0cHV0XCIsIHJlc3BvbnNlKVxuICB9XG5cbiAgcmVxdWVzdERvbmUgPSAoKSA9PiB7XG4gICAgdGhpcy5zZW5kRG9uZVJlcXVlc3RzKClcbiAgfVxuXG4gIHNlbmREb25lUmVxdWVzdHMoKSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHJlcXVlc3RSdW5uZXIgPSB0aGlzLnJlcXVlc3RSdW5uZXJzWzBdXG4gICAgICBjb25zdCByZXF1ZXN0ID0gcmVxdWVzdFJ1bm5lcj8uZ2V0UmVxdWVzdCgpXG5cbiAgICAgIGlmIChyZXF1ZXN0UnVubmVyPy5nZXRTdGF0ZSgpID09IFwiZG9uZVwiKSB7XG4gICAgICAgIGNvbnN0IGh0dHBWZXJzaW9uID0gcmVxdWVzdC5odHRwVmVyc2lvbigpXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25IZWFkZXIgPSByZXF1ZXN0LmhlYWRlcihcImNvbm5lY3Rpb25cIik/LnRvTG93ZXJDYXNlKCk/LnRyaW0oKVxuXG4gICAgICAgIHRoaXMucmVxdWVzdFJ1bm5lcnMuc2hpZnQoKVxuICAgICAgICB0aGlzLnNlbmRSZXNwb25zZShyZXF1ZXN0UnVubmVyKVxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJzZW5kRG9uZVJlcXVlc3RzXCIsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCwgY29ubmVjdGlvbkhlYWRlciwgaHR0cFZlcnNpb259XSlcblxuICAgICAgICBpZiAoaHR0cFZlcnNpb24gPT0gXCIxLjBcIiAmJiBjb25uZWN0aW9uSGVhZGVyICE9IFwia2VlcC1hbGl2ZVwiKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW2BDbG9zaW5nIHRoZSBjb25uZWN0aW9uIGJlY2F1c2UgJHtodHRwVmVyc2lvbn0gYW5kIGNvbm5lY3Rpb24gaGVhZGVyICR7Y29ubmVjdGlvbkhlYWRlcn1gLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnR9XSlcbiAgICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZXF1ZXN0UnVubmVyfSByZXF1ZXN0UnVubmVyIC0gUmVxdWVzdCBydW5uZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNlbmRSZXNwb25zZShyZXF1ZXN0UnVubmVyKSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRSZXF1ZXN0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjdXJyZW50IHJlcXVlc3RcIilcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gZGlnZyhyZXF1ZXN0UnVubmVyLCBcInJlc3BvbnNlXCIpXG4gICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RSdW5uZXIuZ2V0UmVxdWVzdCgpXG4gICAgY29uc3QgYm9keSA9IHJlc3BvbnNlLmdldEJvZHkoKVxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpXG4gICAgY29uc3QgY29ubmVjdGlvbkhlYWRlciA9IHJlcXVlc3QuaGVhZGVyKFwiY29ubmVjdGlvblwiKT8udG9Mb3dlckNhc2UoKT8udHJpbSgpXG4gICAgY29uc3QgaHR0cFZlcnNpb24gPSByZXF1ZXN0Lmh0dHBWZXJzaW9uKClcblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwic2VuZFJlc3BvbnNlXCIsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCwgY29ubmVjdGlvbkhlYWRlciwgaHR0cFZlcnNpb259KVxuXG4gICAgaWYgKGh0dHBWZXJzaW9uID09IFwiMS4wXCIgJiYgY29ubmVjdGlvbkhlYWRlciA9PSBcImtlZXAtYWxpdmVcIikge1xuICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiQ29ubmVjdGlvblwiLCBcIktlZXAtQWxpdmVcIilcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiQ29ubmVjdGlvblwiLCBcIkNsb3NlXCIpXG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudExlbmd0aCA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShib2R5KS5sZW5ndGhcblxuICAgIHJlc3BvbnNlLnNldEhlYWRlcihcIkNvbnRlbnQtTGVuZ3RoXCIsIGNvbnRlbnRMZW5ndGgpXG4gICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiRGF0ZVwiLCBkYXRlLnRvVVRDU3RyaW5nKCkpXG4gICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiU2VydmVyXCIsIFwiVmVsb2Npb3VzXCIpXG5cbiAgICBsZXQgaGVhZGVycyA9IFwiXCJcblxuICAgIGhlYWRlcnMgKz0gYEhUVFAvJHt0aGlzLmN1cnJlbnRSZXF1ZXN0Lmh0dHBWZXJzaW9uKCl9ICR7cmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpfSAke3Jlc3BvbnNlLmdldFN0YXR1c01lc3NhZ2UoKX1cXHJcXG5gXG5cbiAgICBmb3IgKGNvbnN0IGhlYWRlcktleSBpbiByZXNwb25zZS5oZWFkZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGhlYWRlclZhbHVlIG9mIHJlc3BvbnNlLmhlYWRlcnNbaGVhZGVyS2V5XSkge1xuICAgICAgICBoZWFkZXJzICs9IGAke2hlYWRlcktleX06ICR7aGVhZGVyVmFsdWV9XFxyXFxuYFxuICAgICAgfVxuICAgIH1cblxuICAgIGhlYWRlcnMgKz0gXCJcXHJcXG5cIlxuXG4gICAgdGhpcy5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBoZWFkZXJzKVxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgYm9keSlcbiAgfVxufVxuIl19
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUE7QUFDM0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUM5QixPQUFPLFlBQVksTUFBTSw4QkFBOEIsQ0FBQTtBQUN2RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFDdEMsT0FBTyxPQUFPLE1BQU0sY0FBYyxDQUFBO0FBQ2xDLE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sZ0JBQWdCLE1BQU0sd0JBQXdCLENBQUE7QUFFckQsTUFBTSxDQUFDLE9BQU8sT0FBTywwQkFBMEI7SUFDN0MsTUFBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUE7SUFDM0IsS0FBSyxHQUFHLFNBQVMsQ0FBQTtJQUVqQjs7Ozs7T0FLRztJQUNILFlBQVksRUFBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBQztRQUNyRCxJQUFJLENBQUMsYUFBYTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtRQUU3RCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFBO1FBQzlCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBRWxDLDhCQUE4QjtRQUM5QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQTtJQUMxQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsdUJBQXVCLENBQUMsT0FBTztRQUM3QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFF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Q0FBQTtZQUMvQyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxNQUFNLENBQUE7UUFFakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGNyeXB0byBmcm9tIFwiY3J5cHRvXCJcbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCIuLi8uLi91dGlscy9ldmVudC1lbWl0dGVyLmpzXCJcbmltcG9ydCB7TG9nZ2VyfSBmcm9tIFwiLi4vLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCBSZXF1ZXN0IGZyb20gXCIuL3JlcXVlc3QuanNcIlxuaW1wb3J0IFJlcXVlc3RSdW5uZXIgZnJvbSBcIi4vcmVxdWVzdC1ydW5uZXIuanNcIlxuaW1wb3J0IFdlYnNvY2tldFNlc3Npb24gZnJvbSBcIi4vd2Vic29ja2V0LXNlc3Npb24uanNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZW9saWNpb3VzSHR0cFNlcnZlckNsaWVudCB7XG4gIGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICBzdGF0ZSA9IFwiaW5pdGlhbFwiXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmNsaWVudENvdW50IC0gQ2xpZW50IGNvdW50LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnJlbW90ZUFkZHJlc3NdIC0gUmVtb3RlIGFkZHJlc3MuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y2xpZW50Q291bnQsIGNvbmZpZ3VyYXRpb24sIHJlbW90ZUFkZHJlc3N9KSB7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb25maWd1cmF0aW9uIGdpdmVuXCIpXG5cbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICB0aGlzLmNsaWVudENvdW50ID0gY2xpZW50Q291bnRcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5yZW1vdGVBZGRyZXNzID0gcmVtb3RlQWRkcmVzc1xuXG4gICAgLyoqIEB0eXBlIHtSZXF1ZXN0UnVubmVyW119ICovXG4gICAgdGhpcy5yZXF1ZXN0UnVubmVycyA9IFtdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBNZXNzYWdlIHRleHQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9zZW5kQmFkVXBncmFkZVJlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBodHRwVmVyc2lvbiA9IHRoaXMuY3VycmVudFJlcXVlc3Q/Lmh0dHBWZXJzaW9uKCkgfHwgXCIxLjFcIlxuICAgIGNvbnN0IGJvZHkgPSBgJHttZXNzYWdlfVxcbmBcbiAgICBjb25zdCBoZWFkZXJzID0gW1xuICAgICAgYEhUVFAvJHtodHRwVmVyc2lvbn0gNDAwIEJhZCBSZXF1ZXN0YCxcbiAgICAgIFwiQ29ubmVjdGlvbjogQ2xvc2VcIixcbiAgICAgIFwiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XCIsXG4gICAgICBgQ29udGVudC1MZW5ndGg6ICR7QnVmZmVyLmJ5dGVMZW5ndGgoYm9keSwgXCJ1dGY4XCIpfWAsXG4gICAgICBcIlwiLFxuICAgICAgYm9keVxuICAgIF0uam9pbihcIlxcclxcblwiKVxuXG4gICAgdGhpcy5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBoZWFkZXJzKVxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJjbG9zZVwiKVxuICB9XG5cbiAgZXhlY3V0ZUN1cnJlbnRSZXF1ZXN0ID0gKCkgPT4ge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwiZXhlY3V0ZUN1cnJlbnRSZXF1ZXN0XCIpXG5cbiAgICBpZiAoIXRoaXMuY3VycmVudFJlcXVlc3QpIHRocm93IG5ldyBFcnJvcihcIk5vIGN1cnJlbnQgcmVxdWVzdFwiKVxuXG4gICAgaWYgKHRoaXMuX2lzV2Vic29ja2V0VXBncmFkZSh0aGlzLmN1cnJlbnRSZXF1ZXN0KSkge1xuICAgICAgdGhpcy5fdXBncmFkZVRvV2Vic29ja2V0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFdlIGFyZSBkb25lIHBhcnNpbmcgdGhlIGdpdmVuIHJlcXVlc3QgYW5kIGNhbiB0aGVvcmV0aWNhbGx5IHN0YXJ0IHBhcnNpbmcgYSBuZXcgb25lLCBiZWZvcmUgdGhlIGN1cnJlbnQgcmVxdWVzdCBpcyBkb25lIC0gc28gcmVzZXQgdGhlIHN0YXRlLlxuICAgIHRoaXMuc3RhdGUgPSBcImluaXRpYWxcIlxuXG4gICAgY29uc3QgcmVxdWVzdFJ1bm5lciA9IG5ldyBSZXF1ZXN0UnVubmVyKHtcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgIHJlcXVlc3Q6IHRoaXMuY3VycmVudFJlcXVlc3RcbiAgICB9KVxuXG4gICAgdGhpcy5yZXF1ZXN0UnVubmVycy5wdXNoKHJlcXVlc3RSdW5uZXIpXG5cbiAgICByZXF1ZXN0UnVubmVyLmV2ZW50cy5vbihcImRvbmVcIiwgdGhpcy5yZXF1ZXN0RG9uZSlcbiAgICByZXF1ZXN0UnVubmVyLnJ1bigpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG9uV3JpdGUoZGF0YSkge1xuICAgIGlmICh0aGlzLndlYnNvY2tldFNlc3Npb24pIHtcbiAgICAgIHRoaXMud2Vic29ja2V0U2Vzc2lvbi5vbkRhdGEoZGF0YSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlID09IFwiaW5pdGlhbFwiKSB7XG4gICAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0ID0gbmV3IFJlcXVlc3Qoe2NsaWVudDogdGhpcywgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9ufSlcbiAgICAgIHRoaXMuY3VycmVudFJlcXVlc3QucmVxdWVzdFBhcnNlci5ldmVudHMub24oXCJkb25lXCIsIHRoaXMuZXhlY3V0ZUN1cnJlbnRSZXF1ZXN0KVxuICAgICAgdGhpcy5jdXJyZW50UmVxdWVzdC5mZWVkKGRhdGEpXG4gICAgICB0aGlzLnN0YXRlID0gXCJyZXF1ZXN0U3RhcnRlZFwiXG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09IFwicmVxdWVzdFN0YXJ0ZWRcIikge1xuICAgICAgaWYgKCF0aGlzLmN1cnJlbnRSZXF1ZXN0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjdXJyZW50IHJlcXVlc3RcIilcblxuICAgICAgdGhpcy5jdXJyZW50UmVxdWVzdC5mZWVkKGRhdGEpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGF0ZSBmb3IgY2xpZW50OiAke3RoaXMuc3RhdGV9YClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3JlcXVlc3QuanNcIikuZGVmYXVsdH0gcmVxdWVzdCAtIFJlcXVlc3Qgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHdlYnNvY2tldCB1cGdyYWRlLlxuICAgKi9cbiAgX2lzV2Vic29ja2V0VXBncmFkZShyZXF1ZXN0KSB7XG4gICAgY29uc3QgdXBncmFkZUhlYWRlciA9IHJlcXVlc3QuaGVhZGVyKFwidXBncmFkZVwiKT8udG9Mb3dlckNhc2UoKVxuICAgIGNvbnN0IGNvbm5lY3Rpb25IZWFkZXIgPSByZXF1ZXN0LmhlYWRlcihcImNvbm5lY3Rpb25cIik/LnRvTG93ZXJDYXNlKClcblxuICAgIHJldHVybiBCb29sZWFuKHVwZ3JhZGVIZWFkZXIgPT0gXCJ3ZWJzb2NrZXRcIiAmJiBjb25uZWN0aW9uSGVhZGVyPy5pbmNsdWRlcyhcInVwZ3JhZGVcIikpXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLiAgKi9cbiAgX3VwZ3JhZGVUb1dlYnNvY2tldCgpIHtcbiAgICBpZiAoIXRoaXMuY3VycmVudFJlcXVlc3QpIHRocm93IG5ldyBFcnJvcihcIk5vIGN1cnJlbnQgcmVxdWVzdFwiKVxuXG4gICAgY29uc3Qgc2VjV2Vic29ja2V0S2V5ID0gdGhpcy5jdXJyZW50UmVxdWVzdC5oZWFkZXIoXCJzZWMtd2Vic29ja2V0LWtleVwiKVxuXG4gICAgaWYgKCFzZWNXZWJzb2NrZXRLZXkpIHtcbiAgICAgIHRoaXMuX3NlbmRCYWRVcGdyYWRlUmVzcG9uc2UoXCJNaXNzaW5nIFNlYy1XZWJTb2NrZXQtS2V5IGhlYWRlclwiKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgd2Vic29ja2V0QWNjZXB0S2V5ID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGExXCIpXG4gICAgICAudXBkYXRlKGAke3NlY1dlYnNvY2tldEtleX0yNThFQUZBNS1FOTE0LTQ3REEtOTVDQS1DNUFCMERDODVCMTFgLCBcImJpbmFyeVwiKVxuICAgICAgLmRpZ2VzdChcImJhc2U2NFwiKVxuICAgIGNvbnN0IGh0dHBWZXJzaW9uID0gdGhpcy5jdXJyZW50UmVxdWVzdC5odHRwVmVyc2lvbigpIHx8IFwiMS4xXCJcbiAgICBjb25zdCByZXNwb25zZUxpbmVzID0gW1xuICAgICAgYEhUVFAvJHtodHRwVmVyc2lvbn0gMTAxIFN3aXRjaGluZyBQcm90b2NvbHNgLFxuICAgICAgXCJVcGdyYWRlOiB3ZWJzb2NrZXRcIixcbiAgICAgIFwiQ29ubmVjdGlvbjogVXBncmFkZVwiLFxuICAgICAgYFNlYy1XZWJTb2NrZXQtQWNjZXB0OiAke3dlYnNvY2tldEFjY2VwdEtleX1gLFxuICAgICAgXCJcIixcbiAgICAgIFwiXCJcbiAgICBdXG4gICAgY29uc3QgcmVzcG9uc2UgPSByZXNwb25zZUxpbmVzLmpvaW4oXCJcXHJcXG5cIilcblxuICAgIHRoaXMud2Vic29ja2V0U2Vzc2lvbiA9IG5ldyBXZWJzb2NrZXRTZXNzaW9uKHtcbiAgICAgIGNsaWVudDogdGhpcyxcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgIHVwZ3JhZGVSZXF1ZXN0OiB0aGlzLmN1cnJlbnRSZXF1ZXN0XG4gICAgfSlcbiAgICB0aGlzLndlYnNvY2tldFNlc3Npb24uZXZlbnRzLm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgdGhpcy53ZWJzb2NrZXRTZXNzaW9uPy5kZXN0cm95KClcbiAgICAgIHRoaXMud2Vic29ja2V0U2Vzc2lvbiA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gICAgfSlcbiAgICB0aGlzLnN0YXRlID0gXCJ3ZWJzb2NrZXRcIlxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgcmVzcG9uc2UpXG4gICAgdm9pZCB0aGlzLndlYnNvY2tldFNlc3Npb24uaW5pdGlhbGl6ZUNoYW5uZWwoKVxuICB9XG5cbiAgcmVxdWVzdERvbmUgPSAoKSA9PiB7XG4gICAgdGhpcy5zZW5kRG9uZVJlcXVlc3RzKClcbiAgfVxuXG4gIHNlbmREb25lUmVxdWVzdHMoKSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHJlcXVlc3RSdW5uZXIgPSB0aGlzLnJlcXVlc3RSdW5uZXJzWzBdXG4gICAgICBjb25zdCByZXF1ZXN0ID0gcmVxdWVzdFJ1bm5lcj8uZ2V0UmVxdWVzdCgpXG5cbiAgICAgIGlmIChyZXF1ZXN0UnVubmVyPy5nZXRTdGF0ZSgpID09IFwiZG9uZVwiKSB7XG4gICAgICAgIGNvbnN0IGh0dHBWZXJzaW9uID0gcmVxdWVzdC5odHRwVmVyc2lvbigpXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25IZWFkZXIgPSByZXF1ZXN0LmhlYWRlcihcImNvbm5lY3Rpb25cIik/LnRvTG93ZXJDYXNlKCk/LnRyaW0oKVxuXG4gICAgICAgIHRoaXMucmVxdWVzdFJ1bm5lcnMuc2hpZnQoKVxuICAgICAgICB0aGlzLnNlbmRSZXNwb25zZShyZXF1ZXN0UnVubmVyKVxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJzZW5kRG9uZVJlcXVlc3RzXCIsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCwgY29ubmVjdGlvbkhlYWRlciwgaHR0cFZlcnNpb259XSlcblxuICAgICAgICBpZiAoaHR0cFZlcnNpb24gPT0gXCIxLjBcIiAmJiBjb25uZWN0aW9uSGVhZGVyICE9IFwia2VlcC1hbGl2ZVwiKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoKCkgPT4gW2BDbG9zaW5nIHRoZSBjb25uZWN0aW9uIGJlY2F1c2UgJHtodHRwVmVyc2lvbn0gYW5kIGNvbm5lY3Rpb24gaGVhZGVyICR7Y29ubmVjdGlvbkhlYWRlcn1gLCB7Y2xpZW50Q291bnQ6IHRoaXMuY2xpZW50Q291bnR9XSlcbiAgICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZXF1ZXN0UnVubmVyfSByZXF1ZXN0UnVubmVyIC0gUmVxdWVzdCBydW5uZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNlbmRSZXNwb25zZShyZXF1ZXN0UnVubmVyKSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRSZXF1ZXN0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjdXJyZW50IHJlcXVlc3RcIilcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gZGlnZyhyZXF1ZXN0UnVubmVyLCBcInJlc3BvbnNlXCIpXG4gICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RSdW5uZXIuZ2V0UmVxdWVzdCgpXG4gICAgY29uc3QgYm9keSA9IHJlc3BvbnNlLmdldEJvZHkoKVxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpXG4gICAgY29uc3QgY29ubmVjdGlvbkhlYWRlciA9IHJlcXVlc3QuaGVhZGVyKFwiY29ubmVjdGlvblwiKT8udG9Mb3dlckNhc2UoKT8udHJpbSgpXG4gICAgY29uc3QgaHR0cFZlcnNpb24gPSByZXF1ZXN0Lmh0dHBWZXJzaW9uKClcblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwic2VuZFJlc3BvbnNlXCIsIHtjbGllbnRDb3VudDogdGhpcy5jbGllbnRDb3VudCwgY29ubmVjdGlvbkhlYWRlciwgaHR0cFZlcnNpb259KVxuXG4gICAgaWYgKGh0dHBWZXJzaW9uID09IFwiMS4wXCIgJiYgY29ubmVjdGlvbkhlYWRlciA9PSBcImtlZXAtYWxpdmVcIikge1xuICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiQ29ubmVjdGlvblwiLCBcIktlZXAtQWxpdmVcIilcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiQ29ubmVjdGlvblwiLCBcIkNsb3NlXCIpXG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudExlbmd0aCA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShib2R5KS5sZW5ndGhcblxuICAgIHJlc3BvbnNlLnNldEhlYWRlcihcIkNvbnRlbnQtTGVuZ3RoXCIsIGNvbnRlbnRMZW5ndGgpXG4gICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiRGF0ZVwiLCBkYXRlLnRvVVRDU3RyaW5nKCkpXG4gICAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiU2VydmVyXCIsIFwiVmVsb2Npb3VzXCIpXG5cbiAgICBsZXQgaGVhZGVycyA9IFwiXCJcblxuICAgIGhlYWRlcnMgKz0gYEhUVFAvJHt0aGlzLmN1cnJlbnRSZXF1ZXN0Lmh0dHBWZXJzaW9uKCl9ICR7cmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpfSAke3Jlc3BvbnNlLmdldFN0YXR1c01lc3NhZ2UoKX1cXHJcXG5gXG5cbiAgICBmb3IgKGNvbnN0IGhlYWRlcktleSBpbiByZXNwb25zZS5oZWFkZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGhlYWRlclZhbHVlIG9mIHJlc3BvbnNlLmhlYWRlcnNbaGVhZGVyS2V5XSkge1xuICAgICAgICBoZWFkZXJzICs9IGAke2hlYWRlcktleX06ICR7aGVhZGVyVmFsdWV9XFxyXFxuYFxuICAgICAgfVxuICAgIH1cblxuICAgIGhlYWRlcnMgKz0gXCJcXHJcXG5cIlxuXG4gICAgdGhpcy5ldmVudHMuZW1pdChcIm91dHB1dFwiLCBoZWFkZXJzKVxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgYm9keSlcbiAgfVxufVxuIl19
|
|
@@ -3,16 +3,19 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
3
3
|
* @param {object} args - Options object.
|
|
4
4
|
* @param {import("../../configuration.js").default} args.configuration - Configuration instance.
|
|
5
5
|
* @param {import("./index.js").default} args.client - Client instance.
|
|
6
|
+
* @param {import("./request.js").default | import("./websocket-request.js").default} [args.upgradeRequest] - Initial websocket upgrade request.
|
|
6
7
|
*/
|
|
7
|
-
constructor({ client, configuration }: {
|
|
8
|
+
constructor({ client, configuration, upgradeRequest }: {
|
|
8
9
|
configuration: import("../../configuration.js").default;
|
|
9
10
|
client: import("./index.js").default;
|
|
11
|
+
upgradeRequest?: import("./request.js").default | import("./websocket-request.js").default;
|
|
10
12
|
});
|
|
11
13
|
events: import("eventemitter3").EventEmitter<string | symbol, any>;
|
|
12
14
|
subscriptions: Set<any>;
|
|
13
15
|
buffer: Buffer<ArrayBuffer>;
|
|
14
16
|
client: import("./index.js").default;
|
|
15
17
|
configuration: import("../../configuration.js").default;
|
|
18
|
+
upgradeRequest: WebsocketRequest | import("./request.js").default;
|
|
16
19
|
logger: Logger;
|
|
17
20
|
/**
|
|
18
21
|
* @param {string} channel - Channel name.
|
|
@@ -33,9 +36,14 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
33
36
|
/**
|
|
34
37
|
* @param {string} channel - Channel name.
|
|
35
38
|
* @param {any} payload - Payload data.
|
|
36
|
-
* @returns {void} -
|
|
39
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
40
|
+
*/
|
|
41
|
+
sendEvent(channel: string, payload: any): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
37
44
|
*/
|
|
38
|
-
|
|
45
|
+
initializeChannel(): Promise<void>;
|
|
46
|
+
channel: WebsocketChannel;
|
|
39
47
|
/**
|
|
40
48
|
* @param {import("./index.js").default} client - Client instance.
|
|
41
49
|
* @returns {void} - No return value.
|
|
@@ -61,6 +69,16 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
61
69
|
* @returns {void} - No return value.
|
|
62
70
|
*/
|
|
63
71
|
_sendJson(body: object): void;
|
|
72
|
+
/**
|
|
73
|
+
* @param {string} channel - Channel name.
|
|
74
|
+
* @param {{acknowledge?: boolean}} [options] - Subscribe options.
|
|
75
|
+
* @returns {Promise<boolean>} - Whether the subscription was added.
|
|
76
|
+
*/
|
|
77
|
+
subscribeToChannel(channel: string, { acknowledge }?: {
|
|
78
|
+
acknowledge?: boolean;
|
|
79
|
+
}): Promise<boolean>;
|
|
80
|
+
_handleClose(): void;
|
|
81
|
+
_teardownChannel(): Promise<void>;
|
|
64
82
|
/**
|
|
65
83
|
* @param {Buffer} payload - Payload data.
|
|
66
84
|
* @param {Buffer} mask - Mask.
|
|
@@ -68,5 +86,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
68
86
|
*/
|
|
69
87
|
_unmaskPayload(payload: Buffer, mask: Buffer): Buffer;
|
|
70
88
|
}
|
|
89
|
+
import WebsocketRequest from "./websocket-request.js";
|
|
71
90
|
import { Logger } from "../../logger.js";
|
|
91
|
+
import WebsocketChannel from "../websocket-channel.js";
|
|
72
92
|
//# sourceMappingURL=websocket-session.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-session.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/websocket-session.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"websocket-session.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/websocket-session.js"],"names":[],"mappings":"AAcA;IAIE;;;;;OAKG;IACH,uDAJG;QAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO;QACL,MAAM,EAAzC,OAAO,YAAY,EAAE,OAAO;QACqD,cAAc,GAA/F,OAAO,cAAc,EAAE,OAAO,GAAG,OAAO,wBAAwB,EAAE,OAAO;KACnF,EAOA;IAfD,mEAA2B;IAC3B,wBAAyB;IASvB,4BAA6B;IAC7B,qCAAoB;IACpB,wDAAkC;IAClC,kEAAoC;IACpC,eAA8B;IAGhC;;;OAGG;IACH,yBAHW,MAAM,GACJ,IAAI,CAIhB;IAED,gBAGC;IAED;;;OAGG;IACH,yBAHW,MAAM,GACJ,OAAO,CAInB;IAED;;;OAGG;IACH,aAHW,MAAM,GACJ,IAAI,CAKhB;IAED;;;;OAIG;IACH,mBAJW,MAAM,WACN,GAAG,GACD,OAAO,CAAC,IAAI,CAAC,CAMzB;IAED;;OAEG;IACH,qBAFa,OAAO,CAAC,IAAI,CAAC,CA6BzB;IAZG,0BAEY;IAYhB;;;OAGG;IACH,oBAHW,OAAO,YAAY,EAAE,OAAO,GAC1B,IAAI,CAMhB;IAED;;;OAGG;IACH,wBAHW,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAkDzB;IAED;;OAEG;IACH,kBAFa,IAAI,CAuEhB;IAED;;;;OAIG;IACH,0BAJW,MAAM,WACN,MAAM,GACJ,IAAI,CAShB;IAED;;;OAGG;IACH,gBAHW,MAAM,GACJ,IAAI,CAuBhB;IAED;;;;OAIG;IACH,4BAJW,MAAM,oBACN;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAC,GACrB,OAAO,CAAC,OAAO,CAAC,CAQ5B;IAED,qBAGC;IAED,kCAMC;IAED;;;;OAIG;IACH,wBAJW,MAAM,QACN,MAAM,GACJ,MAAM,CAWlB;CACF;6BAhU4B,wBAAwB;uBAFhC,iBAAiB;6BAGT,yBAAyB"}
|
|
@@ -3,6 +3,7 @@ import EventEmitter from "../../utils/event-emitter.js";
|
|
|
3
3
|
import { Logger } from "../../logger.js";
|
|
4
4
|
import RequestRunner from "./request-runner.js";
|
|
5
5
|
import WebsocketRequest from "./websocket-request.js";
|
|
6
|
+
import WebsocketChannel from "../websocket-channel.js";
|
|
6
7
|
const WEBSOCKET_FINAL_FRAME = 0x80;
|
|
7
8
|
const WEBSOCKET_OPCODE_TEXT = 0x1;
|
|
8
9
|
const WEBSOCKET_OPCODE_CLOSE = 0x8;
|
|
@@ -15,11 +16,13 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
15
16
|
* @param {object} args - Options object.
|
|
16
17
|
* @param {import("../../configuration.js").default} args.configuration - Configuration instance.
|
|
17
18
|
* @param {import("./index.js").default} args.client - Client instance.
|
|
19
|
+
* @param {import("./request.js").default | import("./websocket-request.js").default} [args.upgradeRequest] - Initial websocket upgrade request.
|
|
18
20
|
*/
|
|
19
|
-
constructor({ client, configuration }) {
|
|
21
|
+
constructor({ client, configuration, upgradeRequest }) {
|
|
20
22
|
this.buffer = Buffer.alloc(0);
|
|
21
23
|
this.client = client;
|
|
22
24
|
this.configuration = configuration;
|
|
25
|
+
this.upgradeRequest = upgradeRequest;
|
|
23
26
|
this.logger = new Logger(this);
|
|
24
27
|
}
|
|
25
28
|
/**
|
|
@@ -30,6 +33,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
30
33
|
this.subscriptions.add(channel);
|
|
31
34
|
}
|
|
32
35
|
destroy() {
|
|
36
|
+
void this._teardownChannel();
|
|
33
37
|
this.events.removeAllListeners();
|
|
34
38
|
}
|
|
35
39
|
/**
|
|
@@ -50,13 +54,41 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
50
54
|
/**
|
|
51
55
|
* @param {string} channel - Channel name.
|
|
52
56
|
* @param {any} payload - Payload data.
|
|
53
|
-
* @returns {void} -
|
|
57
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
54
58
|
*/
|
|
55
|
-
sendEvent(channel, payload) {
|
|
59
|
+
async sendEvent(channel, payload) {
|
|
56
60
|
if (!this.hasSubscription(channel))
|
|
57
61
|
return;
|
|
58
62
|
this._sendJson({ channel, payload, type: "event" });
|
|
59
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
66
|
+
*/
|
|
67
|
+
async initializeChannel() {
|
|
68
|
+
const resolver = this.configuration.getWebsocketChannelResolver?.();
|
|
69
|
+
if (!resolver)
|
|
70
|
+
return;
|
|
71
|
+
try {
|
|
72
|
+
const resolved = await resolver({
|
|
73
|
+
client: this.client,
|
|
74
|
+
configuration: this.configuration,
|
|
75
|
+
request: this.upgradeRequest,
|
|
76
|
+
websocketSession: this
|
|
77
|
+
});
|
|
78
|
+
if (!resolved)
|
|
79
|
+
return;
|
|
80
|
+
this.channel = typeof resolved === "function"
|
|
81
|
+
? new resolved({ client: this.client, configuration: this.configuration, request: this.upgradeRequest, websocketSession: this })
|
|
82
|
+
: resolved;
|
|
83
|
+
if (this.channel && !(this.channel instanceof WebsocketChannel)) {
|
|
84
|
+
throw new Error("Resolved websocket channel must extend WebsocketChannel");
|
|
85
|
+
}
|
|
86
|
+
await this.channel?.subscribed?.();
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
this.logger.error(() => ["Failed to initialize websocket channel", error]);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
60
92
|
/**
|
|
61
93
|
* @param {import("./index.js").default} client - Client instance.
|
|
62
94
|
* @returns {void} - No return value.
|
|
@@ -74,8 +106,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
74
106
|
const { channel } = message;
|
|
75
107
|
if (!channel)
|
|
76
108
|
throw new Error("channel is required for subscribe");
|
|
77
|
-
this.
|
|
78
|
-
this._sendJson({ channel, type: "subscribed" });
|
|
109
|
+
await this.subscribeToChannel(channel, { acknowledge: true });
|
|
79
110
|
return;
|
|
80
111
|
}
|
|
81
112
|
if (message.type && message.type !== "request") {
|
|
@@ -157,7 +188,7 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
157
188
|
continue;
|
|
158
189
|
}
|
|
159
190
|
if (opcode === WEBSOCKET_OPCODE_CLOSE) {
|
|
160
|
-
this.
|
|
191
|
+
this._handleClose();
|
|
161
192
|
this.sendGoodbye(this.client);
|
|
162
193
|
continue;
|
|
163
194
|
}
|
|
@@ -214,6 +245,30 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
214
245
|
header[0] = WEBSOCKET_FINAL_FRAME | WEBSOCKET_OPCODE_TEXT;
|
|
215
246
|
this.client.events.emit("output", Buffer.concat([header, payload]));
|
|
216
247
|
}
|
|
248
|
+
/**
|
|
249
|
+
* @param {string} channel - Channel name.
|
|
250
|
+
* @param {{acknowledge?: boolean}} [options] - Subscribe options.
|
|
251
|
+
* @returns {Promise<boolean>} - Whether the subscription was added.
|
|
252
|
+
*/
|
|
253
|
+
async subscribeToChannel(channel, { acknowledge = true } = {}) {
|
|
254
|
+
this.addSubscription(channel);
|
|
255
|
+
if (acknowledge) {
|
|
256
|
+
this._sendJson({ channel, type: "subscribed" });
|
|
257
|
+
}
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
_handleClose() {
|
|
261
|
+
void this._teardownChannel();
|
|
262
|
+
this.events.emit("close");
|
|
263
|
+
}
|
|
264
|
+
async _teardownChannel() {
|
|
265
|
+
try {
|
|
266
|
+
await this.channel?.unsubscribed?.();
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
this.logger.error(() => ["Failed to teardown websocket channel", error]);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
217
272
|
/**
|
|
218
273
|
* @param {Buffer} payload - Payload data.
|
|
219
274
|
* @param {Buffer} mask - Mask.
|
|
@@ -228,4 +283,4 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
228
283
|
return result;
|
|
229
284
|
}
|
|
230
285
|
}
|
|
231
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFlBQVksTUFBTSw4QkFBOEIsQ0FBQTtBQUN2RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFDdEMsT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxnQkFBZ0IsTUFBTSx3QkFBd0IsQ0FBQTtBQUVyRCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQTtBQUNsQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQTtBQUNsQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUNqQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQTtBQUVqQyxNQUFNLENBQUMsT0FBTyxPQUFPLHlDQUF5QztJQUM1RCxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtJQUMzQixhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUV6Qjs7OztPQUlHO0lBQ0gsWUFBWSxFQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDaEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGVBQWUsQ0FBQyxPQUFPO1FBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FB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TUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQTtZQUNmLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUN6QyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ3pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUE7WUFDZixNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUNwRCxDQUFDO1FBRUQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLHFCQUFxQixHQUFHLHFCQUFxQixDQUFBO1FBRXpELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDckUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUk7UUFDMUIscUJBQXFCO1FBQ3JCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRTNDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQ3RDLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCIuLi8uLi91dGlscy9ldmVudC1lbWl0dGVyLmpzXCJcbmltcG9ydCB7TG9nZ2VyfSBmcm9tIFwiLi4vLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCBSZXF1ZXN0UnVubmVyIGZyb20gXCIuL3JlcXVlc3QtcnVubmVyLmpzXCJcbmltcG9ydCBXZWJzb2NrZXRSZXF1ZXN0IGZyb20gXCIuL3dlYnNvY2tldC1yZXF1ZXN0LmpzXCJcblxuY29uc3QgV0VCU09DS0VUX0ZJTkFMX0ZSQU1FID0gMHg4MFxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9URVhUID0gMHgxXG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX0NMT1NFID0gMHg4XG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX1BJTkcgPSAweDlcbmNvbnN0IFdFQlNPQ0tFVF9PUENPREVfUE9ORyA9IDB4QVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNIdHRwU2VydmVyQ2xpZW50V2Vic29ja2V0U2Vzc2lvbiB7XG4gIGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICBzdWJzY3JpcHRpb25zID0gbmV3IFNldCgpXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5jbGllbnQgLSBDbGllbnQgaW5zdGFuY2UuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y2xpZW50LCBjb25maWd1cmF0aW9ufSkge1xuICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmFsbG9jKDApXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnRcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGFkZFN1YnNjcmlwdGlvbihjaGFubmVsKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChjaGFubmVsKVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmV2ZW50cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGl0IGhhcyBzdWJzY3JpcHRpb24uXG4gICAqL1xuICBoYXNTdWJzY3JpcHRpb24oY2hhbm5lbCkge1xuICAgIHJldHVybiB0aGlzLnN1YnNjcmlwdGlvbnMuaGFzKGNoYW5uZWwpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG9uRGF0YShkYXRhKSB7XG4gICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuY29uY2F0KFt0aGlzLmJ1ZmZlciwgZGF0YV0pXG4gICAgdGhpcy5fcHJvY2Vzc0J1ZmZlcigpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7YW55fSBwYXlsb2FkIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZW5kRXZlbnQoY2hhbm5lbCwgcGF5bG9hZCkge1xuICAgIGlmICghdGhpcy5oYXNTdWJzY3JpcHRpb24oY2hhbm5lbCkpIHJldHVyblxuXG4gICAgdGhpcy5fc2VuZEpzb24oe2NoYW5uZWwsIHBheWxvYWQsIHR5cGU6IFwiZXZlbnRcIn0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IGNsaWVudCAtIENsaWVudCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2VuZEdvb2RieWUoY2xpZW50KSB7XG4gICAgY29uc3QgZnJhbWUgPSBCdWZmZXIuZnJvbShbV0VCU09DS0VUX0ZJTkFMX0ZSQU1FIHwgV0VCU09DS0VUX09QQ09ERV9DTE9TRSwgMHgwMF0pXG5cbiAgICBjbGllbnQuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgZnJhbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IG1lc3NhZ2UgLSBNZXNzYWdlIHRleHQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfaGFuZGxlTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJzdWJzY3JpYmVcIikge1xuICAgICAgY29uc3Qge2NoYW5uZWx9ID0gbWVzc2FnZVxuXG4gICAgICBpZiAoIWNoYW5uZWwpIHRocm93IG5ldyBFcnJvcihcImNoYW5uZWwgaXMgcmVxdWlyZWQgZm9yIHN1YnNjcmliZVwiKVxuXG4gICAgICB0aGlzLmFkZFN1YnNjcmlwdGlvbihjaGFubmVsKVxuICAgICAgdGhpcy5fc2VuZEpzb24oe2NoYW5uZWwsIHR5cGU6IFwic3Vic2NyaWJlZFwifSlcblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSAmJiBtZXNzYWdlLnR5cGUgIT09IFwicmVxdWVzdFwiKSB7XG4gICAgICB0aGlzLl9zZW5kSnNvbih7ZXJyb3I6IGBVbmtub3duIG1lc3NhZ2UgdHlwZTogJHttZXNzYWdlLnR5cGV9YCwgdHlwZTogXCJlcnJvclwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHtib2R5LCBoZWFkZXJzLCBpZCwgbWV0aG9kLCBwYXRofSA9IG1lc3NhZ2VcblxuICAgIGlmICghbWV0aG9kKSB0aHJvdyBuZXcgRXJyb3IoXCJtZXRob2QgaXMgcmVxdWlyZWRcIilcbiAgICBpZiAoIXBhdGgpIHRocm93IG5ldyBFcnJvcihcInBhdGggaXMgcmVxdWlyZWRcIilcblxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgV2Vic29ja2V0UmVxdWVzdCh7XG4gICAgICBib2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHBhdGgsXG4gICAgICByZW1vdGVBZGRyZXNzOiB0aGlzLmNsaWVudC5yZW1vdGVBZGRyZXNzXG4gICAgfSlcbiAgICBjb25zdCByZXF1ZXN0UnVubmVyID0gbmV3IFJlcXVlc3RSdW5uZXIoe1xuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgcmVxdWVzdFxuICAgIH0pXG5cbiAgICByZXF1ZXN0UnVubmVyLmV2ZW50cy5vbihcImRvbmVcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXF1ZXN0UnVubmVyLnJlc3BvbnNlXG4gICAgICBjb25zdCBib2R5ID0gcmVzcG9uc2UuZ2V0Qm9keSgpXG4gICAgICBjb25zdCBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVyc1xuXG4gICAgICB0aGlzLl9zZW5kSnNvbih7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGlkLFxuICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5nZXRTdGF0dXNDb2RlKCksXG4gICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3BvbnNlLmdldFN0YXR1c01lc3NhZ2UoKSxcbiAgICAgICAgdHlwZTogXCJyZXNwb25zZVwiXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBhd2FpdCByZXF1ZXN0UnVubmVyLnJ1bigpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3Byb2Nlc3NCdWZmZXIoKSB7XG4gICAgd2hpbGUgKHRoaXMuYnVmZmVyLmxlbmd0aCA+PSAyKSB7XG4gICAgICBjb25zdCBmaXJzdEJ5dGUgPSB0aGlzLmJ1ZmZlclswXVxuICAgICAgY29uc3Qgc2Vjb25kQnl0ZSA9IHRoaXMuYnVmZmVyWzFdXG4gICAgICBjb25zdCBpc0ZpbmFsID0gKGZpcnN0Qnl0ZSAmIFdFQlNPQ0tFVF9GSU5BTF9GUkFNRSkgPT09IFdFQlNPQ0tFVF9GSU5BTF9GUkFNRVxuICAgICAgY29uc3Qgb3Bjb2RlID0gZmlyc3RCeXRlICYgMHgwRlxuICAgICAgY29uc3QgaXNNYXNrZWQgPSAoc2Vjb25kQnl0ZSAmIDB4ODApID09PSAweDgwXG4gICAgICBsZXQgcGF5bG9hZExlbmd0aCA9IHNlY29uZEJ5dGUgJiAweDdGXG4gICAgICBsZXQgb2Zmc2V0ID0gMlxuXG4gICAgICBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI2KSB7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPCBvZmZzZXQgKyAyKSByZXR1cm5cbiAgICAgICAgcGF5bG9hZExlbmd0aCA9IHRoaXMuYnVmZmVyLnJlYWRVSW50MTZCRShvZmZzZXQpXG4gICAgICAgIG9mZnNldCArPSAyXG4gICAgICB9IGVsc2UgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNykge1xuICAgICAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoIDwgb2Zmc2V0ICsgOCkgcmV0dXJuXG4gICAgICAgIGNvbnN0IGJpZ0xlbmd0aCA9IHRoaXMuYnVmZmVyLnJlYWRCaWdVSW50NjRCRShvZmZzZXQpXG5cbiAgICAgICAgcGF5bG9hZExlbmd0aCA9IE51bWJlcihiaWdMZW5ndGgpXG4gICAgICAgIG9mZnNldCArPSA4XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hc2tMZW5ndGggPSBpc01hc2tlZCA/IDQgOiAwXG5cbiAgICAgIGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPCBvZmZzZXQgKyBtYXNrTGVuZ3RoICsgcGF5bG9hZExlbmd0aCkgcmV0dXJuXG5cbiAgICAgIC8qKiBAdHlwZSB7QnVmZmVyfSAqL1xuICAgICAgbGV0IHBheWxvYWQgPSB0aGlzLmJ1ZmZlci5zbGljZShvZmZzZXQgKyBtYXNrTGVuZ3RoLCBvZmZzZXQgKyBtYXNrTGVuZ3RoICsgcGF5bG9hZExlbmd0aClcblxuICAgICAgaWYgKGlzTWFza2VkKSB7XG4gICAgICAgIGNvbnN0IG1hc2sgPSB0aGlzLmJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIG1hc2tMZW5ndGgpXG4gICAgICAgIHBheWxvYWQgPSB0aGlzLl91bm1hc2tQYXlsb2FkKHBheWxvYWQsIG1hc2spXG4gICAgICB9XG5cbiAgICAgIHRoaXMuYnVmZmVyID0gdGhpcy5idWZmZXIuc2xpY2Uob2Zmc2V0ICsgbWFza0xlbmd0aCArIHBheWxvYWRMZW5ndGgpXG5cbiAgICAgIGlmICghaXNGaW5hbCkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiRnJhZ21lbnRlZCBmcmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0XCIpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfUElORykge1xuICAgICAgICB0aGlzLl9zZW5kQ29udHJvbEZyYW1lKFdFQlNPQ0tFVF9PUENPREVfUE9ORywgcGF5bG9hZClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9DTE9TRSkge1xuICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY2xvc2VcIilcbiAgICAgICAgdGhpcy5zZW5kR29vZGJ5ZSh0aGlzLmNsaWVudClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKG9wY29kZSAhPT0gV0VCU09DS0VUX09QQ09ERV9URVhUKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFVuc3VwcG9ydGVkIHdlYnNvY2tldCBvcGNvZGU6ICR7b3Bjb2RlfWApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBKU09OLnBhcnNlKHBheWxvYWQudG9TdHJpbmcoXCJ1dGYtOFwiKSlcblxuICAgICAgICB0aGlzLl9oYW5kbGVNZXNzYWdlKG1lc3NhZ2UpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIldlYnNvY2tldCBtZXNzYWdlIGhhbmRsZXIgZmFpbGVkXCIsIGVycm9yXSlcbiAgICAgICAgICB0aGlzLl9zZW5kSnNvbih7ZXJyb3I6IGVycm9yLm1lc3NhZ2UsIHR5cGU6IFwiZXJyb3JcIn0pXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gcGFyc2Ugd2Vic29ja2V0IG1lc3NhZ2VcIiwgZXJyb3JdKVxuICAgICAgICB0aGlzLl9zZW5kSnNvbih7ZXJyb3I6IFwiSW52YWxpZCB3ZWJzb2NrZXQgbWVzc2FnZVwiLCB0eXBlOiBcImVycm9yXCJ9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gb3Bjb2RlIC0gT3Bjb2RlLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gcGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3NlbmRDb250cm9sRnJhbWUob3Bjb2RlLCBwYXlsb2FkKSB7XG4gICAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDIpXG5cbiAgICBoZWFkZXJbMF0gPSBXRUJTT0NLRVRfRklOQUxfRlJBTUUgfCBvcGNvZGVcbiAgICBoZWFkZXJbMV0gPSBwYXlsb2FkLmxlbmd0aFxuXG4gICAgdGhpcy5jbGllbnQuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgQnVmZmVyLmNvbmNhdChbaGVhZGVyLCBwYXlsb2FkXSkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgLSBSZXF1ZXN0IGJvZHkuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9zZW5kSnNvbihib2R5KSB7XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KGJvZHkpXG4gICAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5mcm9tKGpzb24sIFwidXRmLThcIilcbiAgICBsZXQgaGVhZGVyXG5cbiAgICBpZiAocGF5bG9hZC5sZW5ndGggPCAxMjYpIHtcbiAgICAgIGhlYWRlciA9IEJ1ZmZlci5hbGxvYygyKVxuICAgICAgaGVhZGVyWzFdID0gcGF5bG9hZC5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHBheWxvYWQubGVuZ3RoIDwgNjU1MzYpIHtcbiAgICAgIGhlYWRlciA9IEJ1ZmZlci5hbGxvYyg0KVxuICAgICAgaGVhZGVyWzFdID0gMTI2XG4gICAgICBoZWFkZXIud3JpdGVVSW50MTZCRShwYXlsb2FkLmxlbmd0aCwgMilcbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDEwKVxuICAgICAgaGVhZGVyWzFdID0gMTI3XG4gICAgICBoZWFkZXIud3JpdGVCaWdVSW50NjRCRShCaWdJbnQocGF5bG9hZC5sZW5ndGgpLCAyKVxuICAgIH1cblxuICAgIGhlYWRlclswXSA9IFdFQlNPQ0tFVF9GSU5BTF9GUkFNRSB8IFdFQlNPQ0tFVF9PUENPREVfVEVYVFxuXG4gICAgdGhpcy5jbGllbnQuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgQnVmZmVyLmNvbmNhdChbaGVhZGVyLCBwYXlsb2FkXSkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtCdWZmZXJ9IHBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBtYXNrIC0gTWFzay5cbiAgICogQHJldHVybnMge0J1ZmZlcn0gLSBUaGUgdW5tYXNrIHBheWxvYWQuXG4gICAqL1xuICBfdW5tYXNrUGF5bG9hZChwYXlsb2FkLCBtYXNrKSB7XG4gICAgLyoqIEB0eXBlIHtCdWZmZXJ9ICovXG4gICAgY29uc3QgcmVzdWx0ID0gQnVmZmVyLmFsbG9jKHBheWxvYWQubGVuZ3RoKVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXlsb2FkLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHRbaV0gPSBwYXlsb2FkW2ldIF4gbWFza1tpICUgNF1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbn1cbiJdfQ==
|
|
286
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFlBQVksTUFBTSw4QkFBOEIsQ0FBQTtBQUN2RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFDdEMsT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxnQkFBZ0IsTUFBTSx3QkFBd0IsQ0FBQTtBQUNyRCxPQUFPLGdCQUFnQixNQUFNLHlCQUF5QixDQUFBO0FBRXRELE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFBO0FBQ2xDLE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFBO0FBQ2pDLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxDQUFBO0FBQ2xDLE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFBO0FBQ2pDLE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFBO0FBRWpDLE1BQU0sQ0FBQyxPQUFPLE9BQU8seUNBQXlDO0lBQzVELE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFBO0lBQzNCLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRXpCOzs7OztPQUtHO0lBQ0gsWUFBWSxFQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUNsQyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQTtRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxlQUFlLENBQUMsT0FBTztRQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNqQyxDQUFDO0lBRUQsT0FBTztRQUNMLEtBQUssSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUE7UUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO0lBQ2xDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxlQUFlLENBQUMsT0FBTztRQUNyQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsSUFBSTtRQUNULElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUNoRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUE7SUFDdkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxPQUFPO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQztZQUFFLE9BQU07UUFFMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7SUFDbkQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGlCQUFpQjtRQUNyQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixFQUFFLEVBQUUsQ0FBQTtRQUVuRSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU07UUFFckIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxRQUFRLENBQUM7Z0JBQzlCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO2dCQUNqQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWM7Z0JBQzVCLGdCQUFnQixFQUFFLElBQUk7YUFDdkIsQ0FBQyxDQUFBO1lBRUYsSUFBSSxDQUFDLFFBQVE7Z0JBQUUsT0FBTTtZQUVyQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sUUFBUSxLQUFLLFVBQVU7Z0JBQzNDLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBQyxDQUFDO2dCQUM5SCxDQUFDLENBQUMsUUFBUSxDQUFBO1lBRVosSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxZQUFZLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztnQkFDaEUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFBO1lBQzVFLENBQUM7WUFFRCxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQTtRQUNwQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsd0NBQXdDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUM1RSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVcsQ0FBQyxNQUFNO1FBQ2hCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxxQkFBcUIsR0FBRyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBRWpGLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUNyQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPO1FBQzFCLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNqQyxNQUFNLEVBQUMsT0FBTyxFQUFDLEdBQUcsT0FBTyxDQUFBO1lBRXpCLElBQUksQ0FBQyxPQUFPO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQTtZQUNsRSxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtZQUUzRCxPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBQyxLQUFLLEVBQUUseUJBQXlCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtZQUMvRSxPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFDLEdBQUcsT0FBTyxDQUFBO1FBRWpELElBQUksQ0FBQyxNQUFNO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBQ2xELElBQUksQ0FBQyxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBRTlDLE1BQU0sT0FBTyxHQUFHLElBQUksZ0JBQWdCLENBQUM7WUFDbkMsSUFBSTtZQUNKLE9BQU87WUFDUCxNQUFNO1lBQ04sSUFBSTtZQUNKLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWE7U0FDekMsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxhQUFhLEdBQUcsSUFBSSxhQUFhLENBQUM7WUFDdEMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLE9BQU87U0FDUixDQUFDLENBQUE7UUFFRixhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO1lBQ25DLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUE7WUFDdkMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBQy9CLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUE7WUFFaEMsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDYixJQUFJO2dCQUNKLE9BQU87Z0JBQ1AsRUFBRTtnQkFDRixVQUFVLEVBQUUsUUFBUSxDQUFDLGFBQWEsRUFBRTtnQkFDcEMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDMUMsSUFBSSxFQUFFLFVBQVU7YUFDakIsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7UUFFRixNQUFNLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2hDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDakMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxTQUFTLEdBQUcscUJBQXFCLENBQUMsS0FBSyxxQkFBcUIsQ0FBQTtZQUM3RSxNQUFNLE1BQU0sR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFBO1lBQy9CLE1BQU0sUUFBUSxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQTtZQUM3QyxJQUFJLGFBQWEsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFBO1lBQ3JDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQTtZQUVkLElBQUksYUFBYSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUMxQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDO29CQUFFLE9BQU07Z0JBQzNDLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDaEQsTUFBTSxJQUFJLENBQUMsQ0FBQTtZQUNiLENBQUM7aUJBQU0sSUFBSSxhQUFhLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ2pDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUM7b0JBQUUsT0FBTTtnQkFDM0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBRXJELGFBQWEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBQ2pDLE1BQU0sSUFBSSxDQUFDLENBQUE7WUFDYixDQUFDO1lBRUQsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUVuQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sR0FBRyxVQUFVLEdBQUcsYUFBYTtnQkFBRSxPQUFNO1lBRXBFLHFCQUFxQjtZQUNyQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsVUFBVSxFQUFFLE1BQU0sR0FBRyxVQUFVLEdBQUcsYUFBYSxDQUFDLENBQUE7WUFFekYsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFBO2dCQUMzRCxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDOUMsQ0FBQztZQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxhQUFhLENBQUMsQ0FBQTtZQUVwRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMseUNBQXlDLENBQUMsQ0FBQTtnQkFDM0QsU0FBUTtZQUNWLENBQUM7WUFFRCxJQUFJLE1BQU0sS0FBSyxxQkFBcUIsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLEVBQUUsT0FBTyxDQUFDLENBQUE7Z0JBQ3RELFNBQVE7WUFDVixDQUFDO1lBRUQsSUFBSSxNQUFNLEtBQUssc0JBQXNCLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO2dCQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDN0IsU0FBUTtZQUNWLENBQUM7WUFFRCxJQUFJLE1BQU0sS0FBSyxxQkFBcUIsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtnQkFDM0QsU0FBUTtZQUNWLENBQUM7WUFFRCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7Z0JBRXJELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtvQkFDcEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFBO2dCQUN2RCxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsbUNBQW1DLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtnQkFDckUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFDLEtBQUssRUFBRSwyQkFBMkIsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtZQUNyRSxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE9BQU87UUFDL0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUU5QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcscUJBQXFCLEdBQUcsTUFBTSxDQUFBO1FBQzFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFBO1FBRTFCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDckUsQ0FBQztJQUVEOzs7T0FHRztJQUNILFNBQVMsQ0FBQyxJQUFJO1FBQ1osTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNqQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMxQyxJQUFJLE1BQU0sQ0FBQTtRQUVWLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUN6QixNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUN4QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQTtRQUM1QixDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQ2xDLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3hCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUE7WUFDZixNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDekMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUN6QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFBO1lBQ2YsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDcEQsQ0FBQztRQUVELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQTtRQUV6RCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3JFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFDLFdBQVcsR0FBRyxJQUFJLEVBQUMsR0FBRyxFQUFFO1FBQ3pELElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDN0IsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFBO1FBQy9DLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxZQUFZO1FBQ1YsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtRQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUMzQixDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQjtRQUNwQixJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQTtRQUN0QyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsc0NBQXNDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUMxRSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUk7UUFDMUIscUJBQXFCO1FBQ3JCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRTNDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQ3RDLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCIuLi8uLi91dGlscy9ldmVudC1lbWl0dGVyLmpzXCJcbmltcG9ydCB7TG9nZ2VyfSBmcm9tIFwiLi4vLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCBSZXF1ZXN0UnVubmVyIGZyb20gXCIuL3JlcXVlc3QtcnVubmVyLmpzXCJcbmltcG9ydCBXZWJzb2NrZXRSZXF1ZXN0IGZyb20gXCIuL3dlYnNvY2tldC1yZXF1ZXN0LmpzXCJcbmltcG9ydCBXZWJzb2NrZXRDaGFubmVsIGZyb20gXCIuLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiXG5cbmNvbnN0IFdFQlNPQ0tFVF9GSU5BTF9GUkFNRSA9IDB4ODBcbmNvbnN0IFdFQlNPQ0tFVF9PUENPREVfVEVYVCA9IDB4MVxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9DTE9TRSA9IDB4OFxuY29uc3QgV0VCU09DS0VUX09QQ09ERV9QSU5HID0gMHg5XG5jb25zdCBXRUJTT0NLRVRfT1BDT0RFX1BPTkcgPSAweEFcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlckNsaWVudFdlYnNvY2tldFNlc3Npb24ge1xuICBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgc3Vic2NyaXB0aW9ucyA9IG5ldyBTZXQoKVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MuY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSBbYXJncy51cGdyYWRlUmVxdWVzdF0gLSBJbml0aWFsIHdlYnNvY2tldCB1cGdyYWRlIHJlcXVlc3QuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y2xpZW50LCBjb25maWd1cmF0aW9uLCB1cGdyYWRlUmVxdWVzdH0pIHtcbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygwKVxuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMudXBncmFkZVJlcXVlc3QgPSB1cGdyYWRlUmVxdWVzdFxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhZGRTdWJzY3JpcHRpb24oY2hhbm5lbCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoY2hhbm5lbClcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHRoaXMuZXZlbnRzLnJlbW92ZUFsbExpc3RlbmVycygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgaXQgaGFzIHN1YnNjcmlwdGlvbi5cbiAgICovXG4gIGhhc1N1YnNjcmlwdGlvbihjaGFubmVsKSB7XG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9ucy5oYXMoY2hhbm5lbClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgb25EYXRhKGRhdGEpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuYnVmZmVyLCBkYXRhXSlcbiAgICB0aGlzLl9wcm9jZXNzQnVmZmVyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHthbnl9IHBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBzZW5kRXZlbnQoY2hhbm5lbCwgcGF5bG9hZCkge1xuICAgIGlmICghdGhpcy5oYXNTdWJzY3JpcHRpb24oY2hhbm5lbCkpIHJldHVyblxuXG4gICAgdGhpcy5fc2VuZEpzb24oe2NoYW5uZWwsIHBheWxvYWQsIHR5cGU6IFwiZXZlbnRcIn0pXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemVDaGFubmVsKCkge1xuICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxSZXNvbHZlcj8uKClcblxuICAgIGlmICghcmVzb2x2ZXIpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgcmVzb2x2ZXIoe1xuICAgICAgICBjbGllbnQ6IHRoaXMuY2xpZW50LFxuICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgIHJlcXVlc3Q6IHRoaXMudXBncmFkZVJlcXVlc3QsXG4gICAgICAgIHdlYnNvY2tldFNlc3Npb246IHRoaXNcbiAgICAgIH0pXG5cbiAgICAgIGlmICghcmVzb2x2ZWQpIHJldHVyblxuXG4gICAgICB0aGlzLmNoYW5uZWwgPSB0eXBlb2YgcmVzb2x2ZWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG5ldyByZXNvbHZlZCh7Y2xpZW50OiB0aGlzLmNsaWVudCwgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLCByZXF1ZXN0OiB0aGlzLnVwZ3JhZGVSZXF1ZXN0LCB3ZWJzb2NrZXRTZXNzaW9uOiB0aGlzfSlcbiAgICAgICAgOiByZXNvbHZlZFxuXG4gICAgICBpZiAodGhpcy5jaGFubmVsICYmICEodGhpcy5jaGFubmVsIGluc3RhbmNlb2YgV2Vic29ja2V0Q2hhbm5lbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVzb2x2ZWQgd2Vic29ja2V0IGNoYW5uZWwgbXVzdCBleHRlbmQgV2Vic29ja2V0Q2hhbm5lbFwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmNoYW5uZWw/LnN1YnNjcmliZWQ/LigpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byBpbml0aWFsaXplIHdlYnNvY2tldCBjaGFubmVsXCIsIGVycm9yXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLmRlZmF1bHR9IGNsaWVudCAtIENsaWVudCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2VuZEdvb2RieWUoY2xpZW50KSB7XG4gICAgY29uc3QgZnJhbWUgPSBCdWZmZXIuZnJvbShbV0VCU09DS0VUX0ZJTkFMX0ZSQU1FIHwgV0VCU09DS0VUX09QQ09ERV9DTE9TRSwgMHgwMF0pXG5cbiAgICBjbGllbnQuZXZlbnRzLmVtaXQoXCJvdXRwdXRcIiwgZnJhbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IG1lc3NhZ2UgLSBNZXNzYWdlIHRleHQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfaGFuZGxlTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJzdWJzY3JpYmVcIikge1xuICAgICAgY29uc3Qge2NoYW5uZWx9ID0gbWVzc2FnZVxuXG4gICAgICBpZiAoIWNoYW5uZWwpIHRocm93IG5ldyBFcnJvcihcImNoYW5uZWwgaXMgcmVxdWlyZWQgZm9yIHN1YnNjcmliZVwiKVxuICAgICAgYXdhaXQgdGhpcy5zdWJzY3JpYmVUb0NoYW5uZWwoY2hhbm5lbCwge2Fja25vd2xlZGdlOiB0cnVlfSlcblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSAmJiBtZXNzYWdlLnR5cGUgIT09IFwicmVxdWVzdFwiKSB7XG4gICAgICB0aGlzLl9zZW5kSnNvbih7ZXJyb3I6IGBVbmtub3duIG1lc3NhZ2UgdHlwZTogJHttZXNzYWdlLnR5cGV9YCwgdHlwZTogXCJlcnJvclwifSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHtib2R5LCBoZWFkZXJzLCBpZCwgbWV0aG9kLCBwYXRofSA9IG1lc3NhZ2VcblxuICAgIGlmICghbWV0aG9kKSB0aHJvdyBuZXcgRXJyb3IoXCJtZXRob2QgaXMgcmVxdWlyZWRcIilcbiAgICBpZiAoIXBhdGgpIHRocm93IG5ldyBFcnJvcihcInBhdGggaXMgcmVxdWlyZWRcIilcblxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgV2Vic29ja2V0UmVxdWVzdCh7XG4gICAgICBib2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHBhdGgsXG4gICAgICByZW1vdGVBZGRyZXNzOiB0aGlzLmNsaWVudC5yZW1vdGVBZGRyZXNzXG4gICAgfSlcbiAgICBjb25zdCByZXF1ZXN0UnVubmVyID0gbmV3IFJlcXVlc3RSdW5uZXIoe1xuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgcmVxdWVzdFxuICAgIH0pXG5cbiAgICByZXF1ZXN0UnVubmVyLmV2ZW50cy5vbihcImRvbmVcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXF1ZXN0UnVubmVyLnJlc3BvbnNlXG4gICAgICBjb25zdCBib2R5ID0gcmVzcG9uc2UuZ2V0Qm9keSgpXG4gICAgICBjb25zdCBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVyc1xuXG4gICAgICB0aGlzLl9zZW5kSnNvbih7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGlkLFxuICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5nZXRTdGF0dXNDb2RlKCksXG4gICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3BvbnNlLmdldFN0YXR1c01lc3NhZ2UoKSxcbiAgICAgICAgdHlwZTogXCJyZXNwb25zZVwiXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBhd2FpdCByZXF1ZXN0UnVubmVyLnJ1bigpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3Byb2Nlc3NCdWZmZXIoKSB7XG4gICAgd2hpbGUgKHRoaXMuYnVmZmVyLmxlbmd0aCA+PSAyKSB7XG4gICAgICBjb25zdCBmaXJzdEJ5dGUgPSB0aGlzLmJ1ZmZlclswXVxuICAgICAgY29uc3Qgc2Vjb25kQnl0ZSA9IHRoaXMuYnVmZmVyWzFdXG4gICAgICBjb25zdCBpc0ZpbmFsID0gKGZpcnN0Qnl0ZSAmIFdFQlNPQ0tFVF9GSU5BTF9GUkFNRSkgPT09IFdFQlNPQ0tFVF9GSU5BTF9GUkFNRVxuICAgICAgY29uc3Qgb3Bjb2RlID0gZmlyc3RCeXRlICYgMHgwRlxuICAgICAgY29uc3QgaXNNYXNrZWQgPSAoc2Vjb25kQnl0ZSAmIDB4ODApID09PSAweDgwXG4gICAgICBsZXQgcGF5bG9hZExlbmd0aCA9IHNlY29uZEJ5dGUgJiAweDdGXG4gICAgICBsZXQgb2Zmc2V0ID0gMlxuXG4gICAgICBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI2KSB7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPCBvZmZzZXQgKyAyKSByZXR1cm5cbiAgICAgICAgcGF5bG9hZExlbmd0aCA9IHRoaXMuYnVmZmVyLnJlYWRVSW50MTZCRShvZmZzZXQpXG4gICAgICAgIG9mZnNldCArPSAyXG4gICAgICB9IGVsc2UgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNykge1xuICAgICAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoIDwgb2Zmc2V0ICsgOCkgcmV0dXJuXG4gICAgICAgIGNvbnN0IGJpZ0xlbmd0aCA9IHRoaXMuYnVmZmVyLnJlYWRCaWdVSW50NjRCRShvZmZzZXQpXG5cbiAgICAgICAgcGF5bG9hZExlbmd0aCA9IE51bWJlcihiaWdMZW5ndGgpXG4gICAgICAgIG9mZnNldCArPSA4XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hc2tMZW5ndGggPSBpc01hc2tlZCA/IDQgOiAwXG5cbiAgICAgIGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPCBvZmZzZXQgKyBtYXNrTGVuZ3RoICsgcGF5bG9hZExlbmd0aCkgcmV0dXJuXG5cbiAgICAgIC8qKiBAdHlwZSB7QnVmZmVyfSAqL1xuICAgICAgbGV0IHBheWxvYWQgPSB0aGlzLmJ1ZmZlci5zbGljZShvZmZzZXQgKyBtYXNrTGVuZ3RoLCBvZmZzZXQgKyBtYXNrTGVuZ3RoICsgcGF5bG9hZExlbmd0aClcblxuICAgICAgaWYgKGlzTWFza2VkKSB7XG4gICAgICAgIGNvbnN0IG1hc2sgPSB0aGlzLmJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIG1hc2tMZW5ndGgpXG4gICAgICAgIHBheWxvYWQgPSB0aGlzLl91bm1hc2tQYXlsb2FkKHBheWxvYWQsIG1hc2spXG4gICAgICB9XG5cbiAgICAgIHRoaXMuYnVmZmVyID0gdGhpcy5idWZmZXIuc2xpY2Uob2Zmc2V0ICsgbWFza0xlbmd0aCArIHBheWxvYWRMZW5ndGgpXG5cbiAgICAgIGlmICghaXNGaW5hbCkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiRnJhZ21lbnRlZCBmcmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0XCIpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChvcGNvZGUgPT09IFdFQlNPQ0tFVF9PUENPREVfUElORykge1xuICAgICAgICB0aGlzLl9zZW5kQ29udHJvbEZyYW1lKFdFQlNPQ0tFVF9PUENPREVfUE9ORywgcGF5bG9hZClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKG9wY29kZSA9PT0gV0VCU09DS0VUX09QQ09ERV9DTE9TRSkge1xuICAgICAgICB0aGlzLl9oYW5kbGVDbG9zZSgpXG4gICAgICAgIHRoaXMuc2VuZEdvb2RieWUodGhpcy5jbGllbnQpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChvcGNvZGUgIT09IFdFQlNPQ0tFVF9PUENPREVfVEVYVCkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBVbnN1cHBvcnRlZCB3ZWJzb2NrZXQgb3Bjb2RlOiAke29wY29kZX1gKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gSlNPTi5wYXJzZShwYXlsb2FkLnRvU3RyaW5nKFwidXRmLThcIikpXG5cbiAgICAgICAgdGhpcy5faGFuZGxlTWVzc2FnZShtZXNzYWdlKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJXZWJzb2NrZXQgbWVzc2FnZSBoYW5kbGVyIGZhaWxlZFwiLCBlcnJvcl0pXG4gICAgICAgICAgdGhpcy5fc2VuZEpzb24oe2Vycm9yOiBlcnJvci5tZXNzYWdlLCB0eXBlOiBcImVycm9yXCJ9KVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiRmFpbGVkIHRvIHBhcnNlIHdlYnNvY2tldCBtZXNzYWdlXCIsIGVycm9yXSlcbiAgICAgICAgdGhpcy5fc2VuZEpzb24oe2Vycm9yOiBcIkludmFsaWQgd2Vic29ja2V0IG1lc3NhZ2VcIiwgdHlwZTogXCJlcnJvclwifSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9wY29kZSAtIE9wY29kZS5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IHBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9zZW5kQ29udHJvbEZyYW1lKG9wY29kZSwgcGF5bG9hZCkge1xuICAgIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5hbGxvYygyKVxuXG4gICAgaGVhZGVyWzBdID0gV0VCU09DS0VUX0ZJTkFMX0ZSQU1FIHwgb3Bjb2RlXG4gICAgaGVhZGVyWzFdID0gcGF5bG9hZC5sZW5ndGhcblxuICAgIHRoaXMuY2xpZW50LmV2ZW50cy5lbWl0KFwib3V0cHV0XCIsIEJ1ZmZlci5jb25jYXQoW2hlYWRlciwgcGF5bG9hZF0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IC0gUmVxdWVzdCBib2R5LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBfc2VuZEpzb24oYm9keSkge1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShib2R5KVxuICAgIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuZnJvbShqc29uLCBcInV0Zi04XCIpXG4gICAgbGV0IGhlYWRlclxuXG4gICAgaWYgKHBheWxvYWQubGVuZ3RoIDwgMTI2KSB7XG4gICAgICBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoMilcbiAgICAgIGhlYWRlclsxXSA9IHBheWxvYWQubGVuZ3RoXG4gICAgfSBlbHNlIGlmIChwYXlsb2FkLmxlbmd0aCA8IDY1NTM2KSB7XG4gICAgICBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoNClcbiAgICAgIGhlYWRlclsxXSA9IDEyNlxuICAgICAgaGVhZGVyLndyaXRlVUludDE2QkUocGF5bG9hZC5sZW5ndGgsIDIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlciA9IEJ1ZmZlci5hbGxvYygxMClcbiAgICAgIGhlYWRlclsxXSA9IDEyN1xuICAgICAgaGVhZGVyLndyaXRlQmlnVUludDY0QkUoQmlnSW50KHBheWxvYWQubGVuZ3RoKSwgMilcbiAgICB9XG5cbiAgICBoZWFkZXJbMF0gPSBXRUJTT0NLRVRfRklOQUxfRlJBTUUgfCBXRUJTT0NLRVRfT1BDT0RFX1RFWFRcblxuICAgIHRoaXMuY2xpZW50LmV2ZW50cy5lbWl0KFwib3V0cHV0XCIsIEJ1ZmZlci5jb25jYXQoW2hlYWRlciwgcGF5bG9hZF0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3thY2tub3dsZWRnZT86IGJvb2xlYW59fSBbb3B0aW9uc10gLSBTdWJzY3JpYmUgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgc3Vic2NyaXB0aW9uIHdhcyBhZGRlZC5cbiAgICovXG4gIGFzeW5jIHN1YnNjcmliZVRvQ2hhbm5lbChjaGFubmVsLCB7YWNrbm93bGVkZ2UgPSB0cnVlfSA9IHt9KSB7XG4gICAgdGhpcy5hZGRTdWJzY3JpcHRpb24oY2hhbm5lbClcbiAgICBpZiAoYWNrbm93bGVkZ2UpIHtcbiAgICAgIHRoaXMuX3NlbmRKc29uKHtjaGFubmVsLCB0eXBlOiBcInN1YnNjcmliZWRcIn0pXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBfaGFuZGxlQ2xvc2UoKSB7XG4gICAgdm9pZCB0aGlzLl90ZWFyZG93bkNoYW5uZWwoKVxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJjbG9zZVwiKVxuICB9XG5cbiAgYXN5bmMgX3RlYXJkb3duQ2hhbm5lbCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jaGFubmVsPy51bnN1YnNjcmliZWQ/LigpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byB0ZWFyZG93biB3ZWJzb2NrZXQgY2hhbm5lbFwiLCBlcnJvcl0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBwYXlsb2FkIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gbWFzayAtIE1hc2suXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IC0gVGhlIHVubWFzayBwYXlsb2FkLlxuICAgKi9cbiAgX3VubWFza1BheWxvYWQocGF5bG9hZCwgbWFzaykge1xuICAgIC8qKiBAdHlwZSB7QnVmZmVyfSAqL1xuICAgIGNvbnN0IHJlc3VsdCA9IEJ1ZmZlci5hbGxvYyhwYXlsb2FkLmxlbmd0aClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0W2ldID0gcGF5bG9hZFtpXSBeIG1hc2tbaSAlIDRdXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG59XG4iXX0=
|