oci-cdk-test 0.0.2 → 0.0.4
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 +2 -0
- package/bin/tail-execution-log.js +52 -19
- package/config/oci-config.js +66 -1
- package/config/oci-config.ts +67 -0
- package/lib/config/oci-config.js +66 -1
- package/lib/lib/oci-stack.js +15 -1
- package/lib/oci-stack.ts +15 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -134,6 +134,8 @@ API Gateway uses the same timeout as the function (from func.yaml or `OCI_FUNCTI
|
|
|
134
134
|
|
|
135
135
|
**API Gateway deployment spec:** Routes are read from a JSON file so you can edit them. By default the file `oci_apigateway_deployment.json` is created in your project root (like the Dockerfile) if it doesn’t exist. Override the path with `OCI_APIGATEWAY_DEPLOYMENT_JSON`. In the JSON, use `"functionId": "${function_id}"` in a route backend so the stack substitutes the deployed function’s OCID.
|
|
136
136
|
|
|
137
|
+
**Function logs:** A script `tail-function-logs.js` is generated in your project root (if missing). After deploy, the stack writes `.ocdk-outputs.json` there. Run `OCI_COMPARTMENT_ID=... node tail-function-logs.js` (or `npx oci-cdk-test tail:execution-log`) to tail the last 10 minutes of Functions invocation logs. Requires OCI CLI.
|
|
138
|
+
|
|
137
139
|
#### Terraform State Backend
|
|
138
140
|
|
|
139
141
|
By default, Terraform state is stored locally. Configure remote state with these environment variables:
|
|
@@ -19,42 +19,75 @@ function fail(msg) {
|
|
|
19
19
|
process.exit(1);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
function extractJson(raw) {
|
|
23
|
+
const s = (raw || '').trim();
|
|
24
|
+
const first = s.indexOf('{');
|
|
25
|
+
const last = s.lastIndexOf('}');
|
|
26
|
+
if (first === -1 || last === -1 || last <= first) return null;
|
|
27
|
+
try {
|
|
28
|
+
return JSON.parse(s.slice(first, last + 1));
|
|
29
|
+
} catch (e) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
22
34
|
function main() {
|
|
23
|
-
const
|
|
35
|
+
const packageRoot = path.join(__dirname, '..');
|
|
36
|
+
const projectDir = process.env.OCDK_PROJECT_DIR || process.cwd();
|
|
37
|
+
const fs = require('fs');
|
|
24
38
|
|
|
25
39
|
const compId = process.env.OCI_COMPARTMENT_ID || process.env.OCI_COMPARTMENT_OCID;
|
|
26
40
|
if (!compId) {
|
|
27
41
|
fail('OCI_COMPARTMENT_ID (or OCI_COMPARTMENT_OCID) must be set to tail execution logs.');
|
|
28
42
|
}
|
|
29
43
|
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
44
|
+
let parsed = null;
|
|
45
|
+
const outputsPath = path.join(projectDir, '.ocdk-outputs.json');
|
|
46
|
+
if (fs.existsSync(outputsPath)) {
|
|
47
|
+
try {
|
|
48
|
+
const raw = fs.readFileSync(outputsPath, 'utf8').replace(/^\uFEFF/, '').trim();
|
|
49
|
+
const first = raw.indexOf('{');
|
|
50
|
+
const last = raw.lastIndexOf('}');
|
|
51
|
+
if (first !== -1 && last > first) parsed = JSON.parse(raw.slice(first, last + 1));
|
|
52
|
+
} catch (e) {}
|
|
39
53
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
54
|
+
if (!parsed) {
|
|
55
|
+
let output = spawnSync('npx', ['cdktf', 'output', '-json'], {
|
|
56
|
+
cwd: packageRoot,
|
|
57
|
+
shell: true,
|
|
58
|
+
encoding: 'utf8',
|
|
59
|
+
});
|
|
60
|
+
if (output.status !== 0 || !output.stdout) {
|
|
61
|
+
output = spawnSync('npx', ['cdktf', 'output', '-json'], {
|
|
62
|
+
cwd: projectDir,
|
|
63
|
+
shell: true,
|
|
64
|
+
encoding: 'utf8',
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
if (output.status !== 0) {
|
|
68
|
+
console.error(output.stderr || output.stdout || '');
|
|
69
|
+
fail('Failed to run "cdktf output -json". Run deploy first (creates .ocdk-outputs.json) or run from the project where you deployed.');
|
|
70
|
+
}
|
|
71
|
+
parsed = extractJson(output.stdout);
|
|
72
|
+
if (!parsed) {
|
|
73
|
+
console.error('Could not parse outputs. Use the generated script: node tail-function-logs.js (reads .ocdk-outputs.json after deploy).');
|
|
74
|
+
fail('No valid JSON from cdktf output. Ensure the stack is deployed.');
|
|
75
|
+
}
|
|
46
76
|
}
|
|
47
77
|
|
|
78
|
+
// cdktf may return outputs keyed by stack name (e.g. { "oci-stack": { "log_group_id": {...} } })
|
|
79
|
+
const outputs = parsed.log_group_id != null ? parsed : Object.values(parsed).find((v) => v && typeof v === 'object' && (v.log_group_id != null || v.execution_log_id != null)) || parsed;
|
|
80
|
+
|
|
48
81
|
function valueOf(out, key) {
|
|
49
82
|
const v = out[key];
|
|
50
83
|
if (!v) return undefined;
|
|
51
84
|
if (typeof v === 'string') return v;
|
|
52
|
-
if (typeof v.value === 'string') return v.value;
|
|
85
|
+
if (v && typeof v.value === 'string') return v.value;
|
|
53
86
|
return undefined;
|
|
54
87
|
}
|
|
55
88
|
|
|
56
|
-
const logGroupId = valueOf(
|
|
57
|
-
const executionLogId = valueOf(
|
|
89
|
+
const logGroupId = valueOf(outputs, 'log_group_id');
|
|
90
|
+
const executionLogId = valueOf(outputs, 'execution_log_id');
|
|
58
91
|
|
|
59
92
|
if (!logGroupId || !executionLogId) {
|
|
60
93
|
fail('Outputs "log_group_id" and "execution_log_id" not found. Deploy the stack first.');
|
package/config/oci-config.js
CHANGED
|
@@ -256,6 +256,68 @@ function ensureDefaultApiGwDeploymentJson(projectDir) {
|
|
|
256
256
|
}
|
|
257
257
|
return p;
|
|
258
258
|
}
|
|
259
|
+
const TAIL_FUNCTION_LOGS_SCRIPT = `#!/usr/bin/env node
|
|
260
|
+
/**
|
|
261
|
+
* Tail OCI Functions execution logs. Generated by OCDK.
|
|
262
|
+
* Run from project root after deploy. Requires: OCI CLI, OCI_COMPARTMENT_ID, and .ocdk-outputs.json (created on deploy).
|
|
263
|
+
*/
|
|
264
|
+
const path = require('path');
|
|
265
|
+
const fs = require('fs');
|
|
266
|
+
const { spawnSync } = require('child_process');
|
|
267
|
+
|
|
268
|
+
const dir = process.env.OCDK_PROJECT_DIR || __dirname;
|
|
269
|
+
const outputsPath = path.join(dir, '.ocdk-outputs.json');
|
|
270
|
+
if (!fs.existsSync(outputsPath)) {
|
|
271
|
+
console.error('Run deploy first to create .ocdk-outputs.json in the project root.');
|
|
272
|
+
process.exit(1);
|
|
273
|
+
}
|
|
274
|
+
const compId = process.env.OCI_COMPARTMENT_ID || process.env.OCI_COMPARTMENT_OCID;
|
|
275
|
+
if (!compId) {
|
|
276
|
+
console.error('Set OCI_COMPARTMENT_ID (or OCI_COMPARTMENT_OCID).');
|
|
277
|
+
process.exit(1);
|
|
278
|
+
}
|
|
279
|
+
let out;
|
|
280
|
+
try {
|
|
281
|
+
const raw = fs.readFileSync(outputsPath, 'utf8').replace(/^\uFEFF/, '').trim();
|
|
282
|
+
const first = raw.indexOf('{');
|
|
283
|
+
const last = raw.lastIndexOf('}');
|
|
284
|
+
if (first === -1 || last <= first) throw new Error('No JSON');
|
|
285
|
+
out = JSON.parse(raw.slice(first, last + 1));
|
|
286
|
+
} catch (e) {
|
|
287
|
+
console.error('Invalid or missing .ocdk-outputs.json. Run deploy first.');
|
|
288
|
+
process.exit(1);
|
|
289
|
+
}
|
|
290
|
+
const outputs = out.log_group_id != null ? out : Object.values(out).find((v) => v && typeof v === 'object' && (v.log_group_id != null || v.execution_log_id != null)) || out;
|
|
291
|
+
function val(o, k) {
|
|
292
|
+
const v = o[k];
|
|
293
|
+
if (!v) return undefined;
|
|
294
|
+
if (typeof v === 'string') return v;
|
|
295
|
+
if (v && typeof v.value === 'string') return v.value;
|
|
296
|
+
return undefined;
|
|
297
|
+
}
|
|
298
|
+
const logGroupId = val(outputs, 'log_group_id');
|
|
299
|
+
const executionLogId = val(outputs, 'execution_log_id');
|
|
300
|
+
if (!logGroupId || !executionLogId) {
|
|
301
|
+
console.error('log_group_id or execution_log_id missing in .ocdk-outputs.json');
|
|
302
|
+
process.exit(1);
|
|
303
|
+
}
|
|
304
|
+
const now = new Date();
|
|
305
|
+
const start = new Date(now.getTime() - 10 * 60 * 1000);
|
|
306
|
+
const timeStart = start.toISOString();
|
|
307
|
+
const timeEnd = now.toISOString();
|
|
308
|
+
const scope = compId + '/' + logGroupId + '/' + executionLogId;
|
|
309
|
+
const query = 'search "' + scope + '" | sort by datetime desc | limit 50';
|
|
310
|
+
const r = spawnSync('oci', ['logging-search', 'search-logs', '--search-query', query, '--time-start', timeStart, '--time-end', timeEnd], { stdio: 'inherit', shell: true });
|
|
311
|
+
process.exit(r.status ?? 1);
|
|
312
|
+
`;
|
|
313
|
+
/** Ensure tail-function-logs.js exists in projectDir; write default if missing. Returns path. */
|
|
314
|
+
function ensureTailFunctionLogsScript(projectDir) {
|
|
315
|
+
const p = path.join(projectDir, 'tail-function-logs.js');
|
|
316
|
+
if (!fs.existsSync(p)) {
|
|
317
|
+
fs.writeFileSync(p, TAIL_FUNCTION_LOGS_SCRIPT, 'utf8');
|
|
318
|
+
}
|
|
319
|
+
return p;
|
|
320
|
+
}
|
|
259
321
|
/** Read tenancy and region from OCI CLI config. Default file: ~/.oci/config, default profile: DEFAULT. */
|
|
260
322
|
function readTenancyAndRegionFromCliConfig() {
|
|
261
323
|
const configPath = process.env.OCI_CONFIG_FILE || path.join(os.homedir(), '.oci', 'config');
|
|
@@ -466,6 +528,9 @@ async function getOciConfig() {
|
|
|
466
528
|
: dockerContextPath
|
|
467
529
|
? ensureDefaultApiGwDeploymentJson(dockerContextPath)
|
|
468
530
|
: undefined;
|
|
531
|
+
if (dockerContextPath) {
|
|
532
|
+
ensureTailFunctionLogsScript(dockerContextPath);
|
|
533
|
+
}
|
|
469
534
|
return {
|
|
470
535
|
compartmentId,
|
|
471
536
|
ocirCompartmentId: ocirCompartmentId || undefined,
|
|
@@ -487,4 +552,4 @@ async function getOciConfig() {
|
|
|
487
552
|
backend: backendConfig,
|
|
488
553
|
};
|
|
489
554
|
}
|
|
490
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NpLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvbmZpZy9vY2ktY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkVILGtDQUVDO0FBR0Qsd0NBS0M7QUFpVEQsb0NBcUZDO0FBM2RELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsdUNBQXlCO0FBQ3pCLG1EQUFxQztBQUNyQyxpRUFBbUQ7QUEwQ25ELE1BQU0sNkJBQTZCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FDbEQ7SUFDRSxNQUFNLEVBQUU7UUFDTjtZQUNFLElBQUksRUFBRSxVQUFVO1lBQ2hCLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDO1lBQ25DLE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsMEJBQTBCO2dCQUNoQyxVQUFVLEVBQUUsZ0JBQWdCO2dCQUM1QixvQkFBb0IsRUFBRSxFQUFFO2FBQ3pCO1NBQ0Y7S0FDRjtDQUNGLEVBQ0QsSUFBSSxFQUNKLENBQUMsQ0FDRixDQUFDO0FBRUYscUlBQXFJO0FBQ3hILFFBQUEsbUJBQW1CLEdBQTJCO0lBQ3pELGdCQUFnQixFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUs7SUFDM0YsWUFBWSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUs7SUFDckYsZUFBZSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEtBQUs7SUFDdkYsWUFBWSxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVB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QUcsQ0FBQyw4QkFBOEIsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNsRixNQUFNLHVCQUF1QixHQUFHLHNCQUFzQjtRQUNwRCxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztRQUN0QyxDQUFDLENBQUMsaUJBQWlCO1lBQ2pCLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQyxpQkFBaUIsQ0FBQztZQUNyRCxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRWhCLE9BQU87UUFDTCxhQUFhO1FBQ2IsaUJBQWlCLEVBQUUsaUJBQWlCLElBQUksU0FBUztRQUNqRCxTQUFTO1FBQ1QsTUFBTTtRQUNOLFNBQVM7UUFDVCxlQUFlLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsSUFBSSxVQUFVLENBQUMsZUFBZSxJQUFJLEVBQUU7UUFDdEYsWUFBWSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksVUFBVSxDQUFDLFlBQVksSUFBSSxFQUFFO1FBQzVFLGVBQWUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLElBQUksRUFBRSxJQUFJLFNBQVM7UUFDdkUsaUJBQWlCLEVBQUUsaUJBQWlCLElBQUksU0FBUztRQUNqRCxRQUFRO1FBQ1IsT0FBTyxFQUFFLE9BQU8sSUFBSSxTQUFTO1FBQzdCLGlCQUFpQjtRQUNqQixrQkFBa0IsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixJQUFJLFNBQVM7UUFDckUsZ0JBQWdCLEVBQUUsZ0JBQWdCLElBQUksU0FBUztRQUMvQyxzQkFBc0IsRUFBRSxzQkFBc0IsSUFBSSxTQUFTO1FBQzNELGNBQWM7UUFDZCx1QkFBdUIsRUFBRSx1QkFBdUIsSUFBSSxTQUFTO1FBQzdELE9BQU8sRUFBRSxhQUFhO0tBQ3ZCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPQ0kgQ29uZmlndXJhdGlvblxuICpcbiAqIFNldCB0aGVzZSB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9yIHVwZGF0ZSBkZWZhdWx0czpcbiAqIC0gT0NJX0NPTVBBUlRNRU5UX0lEXG4gKiAtIE9DSV9URU5BTkNZX0lEXG4gKiAtIE9DSV9SRUdJT05cbiAqIC0gT0NJX05BTUVTUEFDRSAoaWYgdW5zZXQsIG9idGFpbmVkIHZpYSBPQ0kgU0RLIGdldE5hbWVzcGFjZSlcbiAqIC0gT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQgKGZvciBPQ0lSOyBtdXN0IGJlIG5vbi1yb290IGZvciBmdWxsIHN0YWNrKVxuICogLSBPQ0lfRlVOQ1RJT05fQVBQX05BTUUgKEZ1bmN0aW9ucyBhcHBsaWNhdGlvbiBuYW1lOyBkZWZhdWx0IGVtcHR5KVxuICogLSBPQ0lfRlVOQ1RJT05fTkFNRSAoRnVuY3Rpb24gbmFtZTsgZGVmYXVsdCBlbXB0eSlcbiAqIC0gT0NJX0ZVTkNUSU9OX0hBTkRMRVIgKEphdmEgRkRLIENNRCBoYW5kbGVyLCBlLmcuIGNvbS5leGFtcGxlLkhhbmRsZXI6OmhhbmRsZVJlcXVlc3Q7IGZyb20gZnVuYy55YW1sIGNtZC9oYW5kbGVyIGlmIHVuc2V0KVxuICogLSBPQ0lfRlVOQ1RJT05fSkFSX1BBVEggKFBhdGggdG8gSkFSIG9yIHByb2plY3QgZGlyIGZvciBmdW5jdGlvbiBpbWFnZTsgZGVmYXVsdCBlbXB0eSlcbiAqIC0gT0NJX0ZVTkNUSU9OX01FTU9SWV9NQiAoZnVuY3Rpb24gbWVtb3J5IGluIE1COyBmcm9tIGZ1bmMueWFtbCBtZW1vcnkgaWYgdW5zZXQpXG4gKiAtIE9DSV9GVU5DVElPTl9USU1FT1VUX1NFQ09ORFMgKGZ1bmN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kczsgZnJvbSBmdW5jLnlhbWwgdGltZW91dCBpZiB1bnNldClcbiAqIC0gT0NJX0ZVTkNUSU9OX0NPTkZJRyAoSlNPTiBvYmplY3Qgc3RyaW5nIGZvciBmdW5jdGlvbiBjb25maWcvZW52OyBtZXJnZWQgd2l0aCBmdW5jLnlhbWwgY29uZmlnKVxuICogLSBPQ0lfQVBJR0FURVdBWV9ERVBMT1lNRU5UX0pTT04gKHBhdGggdG8gQVBJIEdhdGV3YXkgZGVwbG95bWVudCBzcGVjIEpTT047IGRlZmF1bHQgcHJvamVjdCByb290IG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbilcbiAqIC0gT0NES19QUk9KRUNUX0RJUiAoc2V0IGJ5IG9jZGsgQ0xJIHRvIGNhbGxlciBjd2Q7IHVzZWQgdG8gZGlzY292ZXIgZnVuYy55YW1sIGFuZCB0YXJnZXQvKVxuICogLSBPQ0lfU1RBVEVfQlVDS0VUIChmb3IgcmVtb3RlIHN0YXRlKVxuICogLSBPQ0lfU1RBVEVfQkFDS0VORF9UWVBFIChvY2l8aHR0cHxsb2NhbClcbiAqXG4gKiBXaGVuIE9DREtfUFJPSkVDVF9ESVIgaXMgc2V0IChlLmcuIHJ1bm5pbmcgYG5weCBvY2RrIGRlcGxveWAgZnJvbSBhIEphdmEgcHJvamVjdCksIGNvbmZpZ1xuICogZGlzY292ZXJzIGVpdGhlciB0YXJnZXQvKi5qYXIgb3IgcG9tLnhtbCtzcmMvIChhbmQgb3B0aW9uYWxseSBmdW5jLnlhbWwgbmFtZSwgdmVyc2lvbiwgY21kL2hhbmRsZXIpLlxuICogTm8gRG9ja2VyZmlsZSBpcyByZXF1aXJlZOKAlHRoZSBzdGFjayBnZW5lcmF0ZXMgb25lIGluIGxvY2FsLWV4ZWMgKGV4Y2x1ZGluZyBub2RlX21vZHVsZXMgdmlhIC5kb2NrZXJpZ25vcmUpLFxuICogdGhlbiBidWlsZHMsIHRhZ3MgKGZyb20gZnVuYy55YW1sIHZlcnNpb24pLCBhbmQgcHVzaGVzIHRvIE9DSVIuXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIGNvbW1vbiBmcm9tICdvY2ktY29tbW9uJztcbmltcG9ydCAqIGFzIG9iamVjdHN0b3JhZ2UgZnJvbSAnb2NpLW9iamVjdHN0b3JhZ2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9jaUJhY2tlbmRDb25maWcge1xuICB0eXBlOiAnb2NpJyB8ICdodHRwJyB8ICdsb2NhbCc7XG4gIGJ1Y2tldD86IHN0cmluZztcbiAga2V5Pzogc3RyaW5nO1xuICBhZGRyZXNzPzogc3RyaW5nO1xuICB1cGRhdGVNZXRob2Q/OiBzdHJpbmc7XG4gIGxvY2tBZGRyZXNzPzogc3RyaW5nO1xuICB1bmxvY2tBZGRyZXNzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9jaUNvbmZpZyB7XG4gIGNvbXBhcnRtZW50SWQ6IHN0cmluZztcbiAgb2NpckNvbXBhcnRtZW50SWQ/OiBzdHJpbmc7XG4gIHRlbmFuY3lJZDogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIGZ1bmN0aW9uQXBwTmFtZTogc3RyaW5nO1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqIFBhdGggdG8gSkFSIG9yIERvY2tlcmZpbGUgY29udGV4dCBmb3IgZnVuY3Rpb24gaW1hZ2U7IGVtcHR5ID0gbm8gYnVpbGQvZGVwbG95LiAqL1xuICBmdW5jdGlvbkphclBhdGg/OiBzdHJpbmc7XG4gIC8qKiBQYXRoIHRvIGRpcmVjdG9yeSBjb250YWluaW5nIHRhcmdldC8gKGRpc2NvdmVyZWQ7IERvY2tlcmZpbGUgaXMgZ2VuZXJhdGVkIGluIGxvY2FsLWV4ZWMpLiAqL1xuICBkb2NrZXJDb250ZXh0UGF0aD86IHN0cmluZztcbiAgLyoqIEltYWdlIHRhZyBmb3IgT0NJUiAoZnJvbSBmdW5jLnlhbWwgdmVyc2lvbiBvciBPQ0lfSU1BR0VfVEFHOyBkZWZhdWx0ICdsYXRlc3QnKS4gKi9cbiAgaW1hZ2VUYWc/OiBzdHJpbmc7XG4gIC8qKiBKYXZhIEZESyBDTUQgaGFuZGxlciAoZnJvbSBmdW5jLnlhbWwgY21kL2hhbmRsZXIgb3IgT0NJX0ZVTkNUSU9OX0hBTkRMRVI7IGRlZmF1bHQgYmVsb3cpLiAqL1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICAvKiogV2hlbiB0cnVlLCBkZXBsb3kgdXNlcyBhIHRoaW4gRG9ja2VyZmlsZSAoQ09QWSB0YXJnZXQvKi5qYXIgb25seSk7IGZ1bGwgTWF2ZW4gYnVpbGQgb25seSBpbiByZWRlcGxveTpmdW5jdGlvbi4gKi9cbiAgdXNlVGhpbkRvY2tlcmZpbGU/OiBib29sZWFuO1xuICBvY2lyUmVwb3NpdG9yeU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBGdW5jdGlvbiBtZW1vcnkgaW4gTUIgKDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzIpLiBGcm9tIGZ1bmMueWFtbCBtZW1vcnkgb3IgT0NJX0ZVTkNUSU9OX01FTU9SWV9NQi4gKi9cbiAgZnVuY3Rpb25NZW1vcnlNYj86IHN0cmluZztcbiAgLyoqIEZ1bmN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kcyAoMeKAkzMwMCkuIEZyb20gZnVuYy55YW1sIHRpbWVvdXQgb3IgT0NJX0ZVTkNUSU9OX1RJTUVPVVRfU0VDT05EUy4gKi9cbiAgZnVuY3Rpb25UaW1lb3V0U2Vjb25kcz86IG51bWJlcjtcbiAgLyoqIEZ1bmN0aW9uIGNvbmZpZy9lbnYga2V5LXZhbHVlLiBGcm9tIGZ1bmMueWFtbCBjb25maWcgb3IgT0NJX0ZVTkNUSU9OX0NPTkZJRyAoSlNPTiBvYmplY3Qgc3RyaW5nKS4gKi9cbiAgZnVuY3Rpb25Db25maWc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogUGF0aCB0byBBUEkgR2F0ZXdheSBkZXBsb3ltZW50IHNwZWMgSlNPTiAocm91dGVzKS4gVXNlIE9DSV9BUElHQVRFV0FZX0RFUExPWU1FTlRfSlNPTiBvciBkZWZhdWx0IG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbiBpbiBwcm9qZWN0IHJvb3QuICovXG4gIGFwaUd3RGVwbG95bWVudEpzb25QYXRoPzogc3RyaW5nO1xuICBiYWNrZW5kPzogT2NpQmFja2VuZENvbmZpZztcbn1cblxuY29uc3QgREVGQVVMVF9BUElHV19ERVBMT1lNRU5UX0pTT04gPSBKU09OLnN0cmluZ2lmeShcbiAge1xuICAgIHJvdXRlczogW1xuICAgICAge1xuICAgICAgICBwYXRoOiAnL3twYXRoKn0nLFxuICAgICAgICBtZXRob2RzOiBbJ0dFVCcsICdQT1NUJywgJ09QVElPTlMnXSxcbiAgICAgICAgYmFja2VuZDoge1xuICAgICAgICAgIHR5cGU6ICdPUkFDTEVfRlVOQ1RJT05TX0JBQ0tFTkQnLFxuICAgICAgICAgIGZ1bmN0aW9uSWQ6ICcke2Z1bmN0aW9uX2lkfScsXG4gICAgICAgICAgcmVhZFRpbWVvdXRJblNlY29uZHM6IDMwLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICBudWxsLFxuICAyXG4pO1xuXG4vKiogT0NJUiBzaG9ydCByZWdpb24ga2V5cyAoZS5nLiBldS1mcmFua2Z1cnQtMSAtPiBmcmEpLiBVc2VkIHNvIGxvZ2luLCBidWlsZCwgcHVzaCBhbmQgZnVuY3Rpb24gaW1hZ2UgYWxsIHVzZSBzYW1lIHJlZ2lzdHJ5IGhvc3QuICovXG5leHBvcnQgY29uc3QgUkVHSU9OX1RPX09DSVJfSE9TVDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ2V1LWZyYW5rZnVydC0xJzogJ2ZyYScsICd1cy1waG9lbml4LTEnOiAncGh4JywgJ3VzLWFzaGJ1cm4tMSc6ICdpYWQnLCAndWstbG9uZG9uLTEnOiAnbGhyJyxcbiAgJ2FwLXRva3lvLTEnOiAnbnJ0JywgJ2FwLW11bWJhaS0xJzogJ2JvbScsICdhcC1zZW91bC0xJzogJ2ljbicsICdjYS10b3JvbnRvLTEnOiAneXl6JyxcbiAgJ3NhLXNhb3BhdWxvLTEnOiAnZ3J1JywgJ2FwLXN5ZG5leS0xJzogJ3N5ZCcsICdldS16dXJpY2gtMSc6ICd6cmgnLCAnbWUtZHViYWktMSc6ICdkeGInLFxuICAnYXAtb3Nha2EtMSc6ICdraXgnLCAnZXUtYW1zdGVyZGFtLTEnOiAnYW1zJywgJ2FwLXNpbmdhcG9yZS0xJzogJ3NpbicsICdhcC1oeWRlcmFiYWQtMSc6ICdoeWQnLFxuICAnZXUtbWlsYW4tMSc6ICdteHAnLCAnc2Etc2FudGlhZ28tMSc6ICdzY2wnLCAnYXAtbWVsYm91cm5lLTEnOiAnbWVsJywgJ2V1LXN0b2NraG9sbS0xJzogJ2FybicsXG4gICdtZS1qZWRkYWgtMSc6ICdqZWQnLCAnYWYtam9oYW5uZXNidXJnLTEnOiAnam5iJywgJ2lsLWplcnVzYWxlbS0xJzogJ3RsdicsICdteC1xdWVyZXRhcm8tMSc6ICdxcm8nLFxuICAnZXUtbWFyc2VpbGxlLTEnOiAnbXJzJyxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvY2lySG9zdEtleShyZWdpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBSRUdJT05fVE9fT0NJUl9IT1NUW3JlZ2lvbl0gPz8gcmVnaW9uO1xufVxuXG4vKiogRnVsbCBPQ0lSIGltYWdlIFVSTCBmb3IgdGhlIGZ1bmN0aW9uIChyZWdpc3RyeS9uYW1lc3BhY2UvcmVwbzp0YWcpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9jaUltYWdlVXJsKGNvbmZpZzogT2NpQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgcmVnaXN0cnkgPSBgJHtvY2lySG9zdEtleShjb25maWcucmVnaW9uKX0ub2Npci5pb2A7XG4gIGNvbnN0IHJlcG8gPSBjb25maWcub2NpclJlcG9zaXRvcnlOYW1lIHx8IGNvbmZpZy5mdW5jdGlvbk5hbWUgfHwgJ29jaS1mdW5jdGlvbic7XG4gIGNvbnN0IHRhZyA9IGNvbmZpZy5pbWFnZVRhZyB8fCAnbGF0ZXN0JztcbiAgcmV0dXJuIGAke3JlZ2lzdHJ5fS8ke2NvbmZpZy5uYW1lc3BhY2V9LyR7cmVwb306JHt0YWd9YDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBmdW5jdGlvbiBuYW1lIGZyb20gZnVuYy55YW1sIChPQ0kgRnVuY3Rpb25zIGZvcm1hdCkuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJuYW1lOlwiIGxpbmUsIHRyaW1tZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sTmFtZShwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqbmFtZTpcXHMqW1wiJ10/KFteXCInXFxzXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKG0pIHJldHVybiBtWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgY21kL2hhbmRsZXIgZnJvbSBmdW5jLnlhbWwgKE9DSS9GbiBmb3JtYXQpLlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2YgXCJjbWQ6XCIgb3IgXCJoYW5kbGVyOlwiIGxpbmUsIHRyaW1tZWQ7IHVzZWQgYXMgRG9ja2VyIENNRCBmb3IgSmF2YSBGREsuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sSGFuZGxlcihwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgY21kTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eXFxzKmNtZDpcXHMqW1wiJ10/KFteXCInXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKGNtZE1hdGNoKSByZXR1cm4gY21kTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgY29uc3QgaGFuZGxlck1hdGNoID0gY29udGVudC5tYXRjaCgvXlxccypoYW5kbGVyOlxccypbXCInXT8oW15cIidcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAoaGFuZGxlck1hdGNoKSByZXR1cm4gaGFuZGxlck1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgdmVyc2lvbiBmcm9tIGZ1bmMueWFtbCAodXNlZCBhcyBPQ0lSIGltYWdlIHRhZykuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJ2ZXJzaW9uOlwiIGxpbmUsIHRyaW1tZWQ7IHNhbml0aXplZCBmb3IgRG9ja2VyIHRhZyAoYS16QS1aMC05Xy4tKS5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxWZXJzaW9uKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccyp2ZXJzaW9uOlxccypbXCInXT8oW15cIidcXHNcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAobSkge1xuICAgICAgICBjb25zdCByYXcgPSBtWzFdLnRyaW0oKTtcbiAgICAgICAgY29uc3Qgc2FuaXRpemVkID0gcmF3LnJlcGxhY2UoL1teYS16QS1aMC05Xy4tXS9nLCAnLScpLnJlcGxhY2UoLy0rL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpO1xuICAgICAgICByZXR1cm4gc2FuaXRpemVkIHx8IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IFZBTElEX01FTU9SWV9NQiA9IG5ldyBTZXQoWzEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzJdKTtcblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBtZW1vcnkgKE1CKSBmcm9tIGZ1bmMueWFtbC4gT0NJIGFsbG93cyAxMjgsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4LCAzMDcyLlxuICogUmV0dXJucyB0aGUgbnVtYmVyIGlmIHByZXNlbnQgYW5kIHZhbGlkOyBvdGhlcndpc2UgdW5kZWZpbmVkLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbE1lbW9yeShwcm9qZWN0RGlyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqbWVtb3J5OlxccyooXFxkKylcXHMqJC9tKTtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChtWzFdLCAxMCk7XG4gICAgICAgIGlmIChWQUxJRF9NRU1PUllfTUIuaGFzKG4pKSByZXR1cm4gbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgdGltZW91dCAoc2Vjb25kcykgZnJvbSBmdW5jLnlhbWwuIE9DSSBtYXggaXMgMzAwLlxuICogUmV0dXJucyB0aGUgbnVtYmVyIGlmIHByZXNlbnQgYW5kIGluIHJhbmdlIDHigJMzMDA7IG90aGVyd2lzZSB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sVGltZW91dChwcm9qZWN0RGlyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqdGltZW91dDpcXHMqKFxcZCspXFxzKiQvbSk7XG4gICAgICBpZiAobSkge1xuICAgICAgICBjb25zdCBuID0gcGFyc2VJbnQobVsxXSwgMTApO1xuICAgICAgICBpZiAobiA+PSAxICYmIG4gPD0gMzAwKSByZXR1cm4gbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgY29uZmlnIChrZXktdmFsdWUgZW52KSBmcm9tIGZ1bmMueWFtbC4gRXhwZWN0cyBhIHRvcC1sZXZlbCBcImNvbmZpZzpcIiBibG9jayB3aXRoIGtleTogdmFsdWUgbGluZXMuXG4gKiBSZXR1cm5zIGEgcmVjb3JkIG9mIHN0cmluZyBrZXlzIGFuZCBzdHJpbmcgdmFsdWVzOyBlbXB0eSBpZiBub25lIG9yIHBhcnNlIGVycm9yLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbENvbmZpZyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnZnVuYy55YW1sJyk7XG4gIHRyeSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHApKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgICBsZXQgaW5Db25maWcgPSBmYWxzZTtcbiAgICBjb25zdCBjb25maWc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTtcbiAgICAgIGlmICh0cmltbWVkID09PSAnY29uZmlnOicgfHwgL15jb25maWdcXHMqOlxccyokLy50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICAgIGluQ29uZmlnID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaW5Db25maWcpIHtcbiAgICAgICAgaWYgKHRyaW1tZWQgIT09ICcnICYmICFsaW5lLnN0YXJ0c1dpdGgoJyAnKSAmJiAhbGluZS5zdGFydHNXaXRoKCdcXHQnKSkgYnJlYWs7XG4gICAgICAgIGNvbnN0IGt2ID0gbGluZS5tYXRjaCgvXlxccysoW2EtekEtWl9dW2EtekEtWjAtOV8tXSopXFxzKjpcXHMqKC4qKSQvKTtcbiAgICAgICAgaWYgKGt2KSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0ga3ZbMV0udHJpbSgpO1xuICAgICAgICAgIGxldCB2YWwgPSBrdlsyXS50cmltKCk7XG4gICAgICAgICAgaWYgKCh2YWwuc3RhcnRzV2l0aCgnXCInKSAmJiB2YWwuZW5kc1dpdGgoJ1wiJykpIHx8ICh2YWwuc3RhcnRzV2l0aChcIidcIikgJiYgdmFsLmVuZHNXaXRoKFwiJ1wiKSkpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5zbGljZSgxLCAtMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbmZpZ1trZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb25maWcpLmxlbmd0aCA/IGNvbmZpZyA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogRW5zdXJlIG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbiBleGlzdHMgaW4gcHJvamVjdERpcjsgd3JpdGUgZGVmYXVsdCBpZiBtaXNzaW5nLiBSZXR1cm5zIHBhdGguICovXG5mdW5jdGlvbiBlbnN1cmVEZWZhdWx0QXBpR3dEZXBsb3ltZW50SnNvbihwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdvY2lfYXBpZ2F0ZXdheV9kZXBsb3ltZW50Lmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwLCBERUZBVUxUX0FQSUdXX0RFUExPWU1FTlRfSlNPTiwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gcDtcbn1cblxuLyoqIFJlYWQgdGVuYW5jeSBhbmQgcmVnaW9uIGZyb20gT0NJIENMSSBjb25maWcuIERlZmF1bHQgZmlsZTogfi8ub2NpL2NvbmZpZywgZGVmYXVsdCBwcm9maWxlOiBERUZBVUxULiAqL1xuZnVuY3Rpb24gcmVhZFRlbmFuY3lBbmRSZWdpb25Gcm9tQ2xpQ29uZmlnKCk6IHsgdGVuYW5jeT86IHN0cmluZzsgcmVnaW9uPzogc3RyaW5nIH0ge1xuICBjb25zdCBjb25maWdQYXRoID0gcHJvY2Vzcy5lbnYuT0NJX0NPTkZJR19GSUxFIHx8IHBhdGguam9pbihvcy5ob21lZGlyKCksICcub2NpJywgJ2NvbmZpZycpO1xuICBjb25zdCBwcm9maWxlID0gcHJvY2Vzcy5lbnYuT0NJX0NMSV9QUk9GSUxFIHx8ICdERUZBVUxUJztcbiAgdHJ5IHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHJldHVybiB7fTtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgvXFxyP1xcbi8pO1xuICAgIGxldCBpblByb2ZpbGUgPSBmYWxzZTtcbiAgICBjb25zdCByZXN1bHQ6IHsgdGVuYW5jeT86IHN0cmluZzsgcmVnaW9uPzogc3RyaW5nIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTtcbiAgICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ1snKSAmJiB0cmltbWVkLmVuZHNXaXRoKCddJykpIHtcbiAgICAgICAgaW5Qcm9maWxlID0gdHJpbW1lZC5zbGljZSgxLCAtMSkgPT09IHByb2ZpbGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFpblByb2ZpbGUpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZXEgPSB0cmltbWVkLmluZGV4T2YoJz0nKTtcbiAgICAgIGlmIChlcSA8PSAwKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGtleSA9IHRyaW1tZWQuc2xpY2UoMCwgZXEpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgdmFsdWUgPSB0cmltbWVkLnNsaWNlKGVxICsgMSkudHJpbSgpO1xuICAgICAgaWYgKGtleSA9PT0gJ3RlbmFuY3knKSByZXN1bHQudGVuYW5jeSA9IHZhbHVlO1xuICAgICAgaWYgKGtleSA9PT0gJ3JlZ2lvbicpIHJlc3VsdC5yZWdpb24gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbi8qKiBHZXQgb2JqZWN0IHN0b3JhZ2UgbmFtZXNwYWNlIHZpYSBPQ0kgU0RLIChzYW1lIGFzIFwib2NpIG9zIG5zIGdldFwiKS4gVXNlcyB+Ly5vY2kvY29uZmlnLCBERUZBVUxUIHByb2ZpbGUuICovXG5hc3luYyBmdW5jdGlvbiBnZXROYW1lc3BhY2VGcm9tT2NpU2RrKGNvbXBhcnRtZW50SWQ6IHN0cmluZywgcmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBjb25maWdQYXRoID0gcHJvY2Vzcy5lbnYuT0NJX0NPTkZJR19GSUxFIHx8IHBhdGguam9pbihvcy5ob21lZGlyKCksICcub2NpJywgJ2NvbmZpZycpO1xuICBjb25zdCBwcm9maWxlID0gcHJvY2Vzcy5lbnYuT0NJX0NMSV9QUk9GSUxFIHx8ICdERUZBVUxUJztcbiAgdHJ5IHtcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBjb21tb24uQ29uZmlnRmlsZUF1dGhlbnRpY2F0aW9uRGV0YWlsc1Byb3ZpZGVyKGNvbmZpZ1BhdGgsIHByb2ZpbGUpO1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBvYmplY3RzdG9yYWdlLk9iamVjdFN0b3JhZ2VDbGllbnQoeyBhdXRoZW50aWNhdGlvbkRldGFpbHNQcm92aWRlcjogcHJvdmlkZXIgfSk7XG4gICAgY2xpZW50LnJlZ2lvbklkID0gcmVnaW9uO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldE5hbWVzcGFjZSh7XG4gICAgICBjb21wYXJ0bWVudElkLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS52YWx1ZT8udHJpbSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogRmluZCBhIEpBUiB1bmRlciB0YXJnZXQvIChwcmVmZXIgb25lIG1hdGNoaW5nIG5hbWUsIGVsc2UgZmlyc3QgLmphcikuXG4gKi9cbmZ1bmN0aW9uIGZpbmRKYXJJblRhcmdldChwcm9qZWN0RGlyOiBzdHJpbmcsIGZ1bmN0aW9uTmFtZT86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRhcmdldERpciA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAndGFyZ2V0Jyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyh0YXJnZXREaXIpKSByZXR1cm4gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmModGFyZ2V0RGlyKTtcbiAgICBjb25zdCBqYXJzID0gZmlsZXMuZmlsdGVyKChmKSA9PiBmLmVuZHNXaXRoKCcuamFyJykgJiYgIWYuZW5kc1dpdGgoJy1zb3VyY2VzLmphcicpKTtcbiAgICBpZiAoamFycy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKGZ1bmN0aW9uTmFtZSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBqYXJzLmZpbmQoKGopID0+IGoudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmdW5jdGlvbk5hbWUudG9Mb3dlckNhc2UoKSkpO1xuICAgICAgaWYgKG1hdGNoKSByZXR1cm4gcGF0aC5qb2luKHRhcmdldERpciwgbWF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5qb2luKHRhcmdldERpciwgamFyc1swXSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqIFRydWUgaWYgcHJvamVjdCBoYXMgcG9tLnhtbCBhbmQgc3JjLyAoTWF2ZW4gc291cmNlIGxheW91dCBmb3IgYnVpbGQtZnJvbS1zb3VyY2UgRG9ja2VyZmlsZSkuICovXG5mdW5jdGlvbiBoYXNQb21BbmRTcmMocHJvamVjdERpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBvbSA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAncG9tLnhtbCcpO1xuICBjb25zdCBzcmMgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ3NyYycpO1xuICB0cnkge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBvbSkgJiYgZnMuZXhpc3RzU3luYyhzcmMpICYmIGZzLnN0YXRTeW5jKHNyYykuaXNEaXJlY3RvcnkoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc2NvdmVyRnJvbUZ1bmNZYW1sQW5kVGFyZ2V0KCk6IHtcbiAgZnVuY3Rpb25OYW1lPzogc3RyaW5nO1xuICBmdW5jdGlvbkFwcE5hbWU/OiBzdHJpbmc7XG4gIGRvY2tlckNvbnRleHRQYXRoPzogc3RyaW5nO1xuICBpbWFnZVRhZz86IHN0cmluZztcbiAgaGFuZGxlcj86IHN0cmluZztcbiAgdXNlVGhpbkRvY2tlcmZpbGU/OiBib29sZWFuO1xuICBtZW1vcnlNYj86IG51bWJlcjtcbiAgdGltZW91dFNlY29uZHM/OiBudW1iZXI7XG4gIGNvbmZpZz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59IHtcbiAgbGV0IHByb2plY3REaXIgPSBwcm9jZXNzLmVudi5PQ0RLX1BST0pFQ1RfRElSPy50cmltKCk7XG4gIGlmICghcHJvamVjdERpcikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICcub2Nkay1wcm9qZWN0LWRpcicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHByb2plY3REaXIgPSBmcy5yZWFkRmlsZVN5bmMocCwgJ3V0ZjgnKS50cmltKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH1cbiAgaWYgKCFwcm9qZWN0RGlyICYmIHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSD8udHJpbSgpKSB7XG4gICAgY29uc3QgcCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSkFSX1BBVEgudHJpbSgpKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkgcHJvamVjdERpciA9IGZzLnN0YXRTeW5jKHApLmlzRGlyZWN0b3J5KCkgPyBwIDogcGF0aC5kaXJuYW1lKHApO1xuICB9XG4gIGlmICghcHJvamVjdERpcikgcHJvamVjdERpciA9IHByb2Nlc3MuY3dkKCk7XG4gIHByb2plY3REaXIgPSBwcm9qZWN0RGlyID8gcGF0aC5yZXNvbHZlKHByb2plY3REaXIpIDogJyc7XG4gIGlmICghcHJvamVjdERpciB8fCAhZnMuZXhpc3RzU3luYyhwcm9qZWN0RGlyKSkgcmV0dXJuIHt9O1xuXG4gIGNvbnN0IG5hbWVGcm9tWWFtbCA9IGdldEZ1bmNZYW1sTmFtZShwcm9qZWN0RGlyKTtcbiAgY29uc3QgamFyUGF0aCA9IGZpbmRKYXJJblRhcmdldChwcm9qZWN0RGlyLCBuYW1lRnJvbVlhbWwgfHwgdW5kZWZpbmVkKTtcbiAgY29uc3QgaGFzU291cmNlID0gaGFzUG9tQW5kU3JjKHByb2plY3REaXIpO1xuICBpZiAoIWphclBhdGggJiYgIWhhc1NvdXJjZSkgcmV0dXJuIHt9O1xuXG4gIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9OQU1FPy50cmltKCkgfHwgbmFtZUZyb21ZYW1sIHx8IHBhdGguYmFzZW5hbWUocHJvamVjdERpcikgfHwgJ29jaS1mdW5jdGlvbic7XG4gIGNvbnN0IGltYWdlVGFnID0gcHJvY2Vzcy5lbnYuT0NJX0lNQUdFX1RBRz8udHJpbSgpIHx8IGdldEZ1bmNZYW1sVmVyc2lvbihwcm9qZWN0RGlyKTtcbiAgY29uc3QgaGFuZGxlciA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9IQU5ETEVSPy50cmltKCkgfHwgZ2V0RnVuY1lhbWxIYW5kbGVyKHByb2plY3REaXIpO1xuICBjb25zdCB1c2VUaGluRG9ja2VyZmlsZSA9ICEhamFyUGF0aDtcbiAgY29uc3QgbWVtb3J5TWIgPSBnZXRGdW5jWWFtbE1lbW9yeShwcm9qZWN0RGlyKTtcbiAgY29uc3QgdGltZW91dFNlY29uZHMgPSBnZXRGdW5jWWFtbFRpbWVvdXQocHJvamVjdERpcik7XG4gIGNvbnN0IGNvbmZpZyA9IGdldEZ1bmNZYW1sQ29uZmlnKHByb2plY3REaXIpO1xuXG4gIHJldHVybiB7XG4gICAgZnVuY3Rpb25OYW1lLFxuICAgIGZ1bmN0aW9uQXBwTmFtZTogcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0FQUF9OQU1FPy50cmltKCkgfHwgZnVuY3Rpb25OYW1lLFxuICAgIGRvY2tlckNvbnRleHRQYXRoOiBwYXRoLnJlc29sdmUocHJvamVjdERpciksXG4gICAgaW1hZ2VUYWc6IGltYWdlVGFnIHx8IHVuZGVmaW5lZCxcbiAgICBoYW5kbGVyOiBoYW5kbGVyIHx8IHVuZGVmaW5lZCxcbiAgICB1c2VUaGluRG9ja2VyZmlsZSxcbiAgICBtZW1vcnlNYixcbiAgICB0aW1lb3V0U2Vjb25kcyxcbiAgICBjb25maWcsXG4gIH07XG59XG5cbmNvbnN0IGJhY2tlbmRUeXBlID0gKHByb2Nlc3MuZW52Lk9DSV9TVEFURV9CQUNLRU5EX1RZUEUgfHwgJ2xvY2FsJykgYXMgJ29jaScgfCAnaHR0cCcgfCAnbG9jYWwnO1xuXG5jb25zdCBiYWNrZW5kQ29uZmlnOiBPY2lCYWNrZW5kQ29uZmlnIHwgdW5kZWZpbmVkID0gYmFja2VuZFR5cGUgPT09ICdsb2NhbCdcbiAgPyB1bmRlZmluZWRcbiAgOiBiYWNrZW5kVHlwZSA9PT0gJ29jaSdcbiAgICA/IHtcbiAgICAgICAgdHlwZTogJ29jaScsXG4gICAgICAgIGJ1Y2tldDogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0JVQ0tFVCB8fCAndGYtc3RhdGUnLFxuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9LRVkgfHwgJ2Z1bmN0aW9uLXN0YWNrL3RlcnJhZm9ybS50ZnN0YXRlJyxcbiAgICAgIH1cbiAgICA6IHtcbiAgICAgICAgdHlwZTogJ2h0dHAnLFxuICAgICAgICBhZGRyZXNzOiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfSFRUUF9BRERSRVNTIHx8ICcnLFxuICAgICAgICB1cGRhdGVNZXRob2Q6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9IVFRQX1VQREFURV9NRVRIT0QgfHwgJ1BVVCcsXG4gICAgICAgIGxvY2tBZGRyZXNzOiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfSFRUUF9MT0NLX0FERFJFU1MsXG4gICAgICAgIHVubG9ja0FkZHJlc3M6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9IVFRQX1VOTE9DS19BRERSRVNTLFxuICAgICAgfTtcblxuLyoqXG4gKiBMb2FkIE9DSSBjb25maWcgZnJvbSBlbnYgYW5kIENMSSBjb25maWcuIFdoZW4gT0NJX05BTUVTUEFDRSBpcyB1bnNldCwgZmV0Y2hlcyBpdCB2aWEgT0NJIFNESyAoZ2V0TmFtZXNwYWNlKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9jaUNvbmZpZygpOiBQcm9taXNlPE9jaUNvbmZpZz4ge1xuICBjb25zdCBjbGlDb25maWcgPSByZWFkVGVuYW5jeUFuZFJlZ2lvbkZyb21DbGlDb25maWcoKTtcbiAgY29uc3QgY29tcGFydG1lbnRJZCA9IHByb2Nlc3MuZW52Lk9DSV9DT01QQVJUTUVOVF9JRD8udHJpbSgpIHx8ICdvY2lkMS5jb21wYXJ0bWVudC5vYzEuLmFhYWFhYWEuLi4nO1xuICBjb25zdCBvY2lyQ29tcGFydG1lbnRJZCA9IHByb2Nlc3MuZW52Lk9DSV9PQ0lSX0NPTVBBUlRNRU5UX0lEPy50cmltKCkgfHwgcHJvY2Vzcy5lbnYuT0NJX0NPTVBBUlRNRU5UX0lEPy50cmltKCkgfHwgY29tcGFydG1lbnRJZDtcbiAgY29uc3QgdGVuYW5jeUlkID0gcHJvY2Vzcy5lbnYuT0NJX1RFTkFOQ1lfSUQ/LnRyaW0oKSB8fCBjbGlDb25maWcudGVuYW5jeT8udHJpbSgpIHx8ICdvY2lkMS50ZW5hbmN5Lm9jMS4uYWFhYWFhYS4uLic7XG4gIGNvbnN0IHJlZ2lvbiA9IHByb2Nlc3MuZW52Lk9DSV9SRUdJT04/LnRyaW0oKSB8fCBjbGlDb25maWcucmVnaW9uPy50cmltKCkgfHwgJ2V1LWZyYW5rZnVydC0xJztcblxuICBpZiAoIW9jaXJDb21wYXJ0bWVudElkIHx8IG9jaXJDb21wYXJ0bWVudElkLmluY2x1ZGVzKCdyb290JykpIHtcbiAgICBjb25zb2xlLndhcm4oJ+KaoO+4jyAgV0FSTklORzogT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQgbm90IHNldCBvciBzZXQgdG8gcm9vdCBjb21wYXJ0bWVudC4nKTtcbiAgICBjb25zb2xlLndhcm4oJyAgIFBsZWFzZSBzZXQgT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQgdG8geW91ciBob21lIGNvbXBhcnRtZW50IE9DSUQuJyk7XG4gICAgY29uc29sZS53YXJuKCcgICBFeGFtcGxlOiBleHBvcnQgT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQ9XCJvY2lkMS5jb21wYXJ0bWVudC5vYzEuLmFhYWFhYWEuLi5cIicpO1xuICB9XG5cbiAgbGV0IG5hbWVzcGFjZSA9IHByb2Nlc3MuZW52Lk9DSV9OQU1FU1BBQ0U/LnRyaW0oKTtcbiAgaWYgKCFuYW1lc3BhY2UgfHwgbmFtZXNwYWNlID09PSAneW91ci1uYW1lc3BhY2UnKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBnZXROYW1lc3BhY2VGcm9tT2NpU2RrKGNvbXBhcnRtZW50SWQsIHJlZ2lvbik7XG4gICAgaWYgKHJlc29sdmVkKSBuYW1lc3BhY2UgPSByZXNvbHZlZDtcbiAgICBlbHNlIGlmICghbmFtZXNwYWNlKSBuYW1lc3BhY2UgPSAneW91ci1uYW1lc3BhY2UnO1xuICAgIGlmIChuYW1lc3BhY2UgPT09ICd5b3VyLW5hbWVzcGFjZScpIHtcbiAgICAgIGNvbnNvbGUud2Fybign4pqg77iPICBPQ0lfTkFNRVNQQUNFIG5vdCBzZXQgYW5kIFNESyBjb3VsZCBub3QgcmVzb2x2ZSBpdC4gU2V0IE9DSV9OQU1FU1BBQ0Ugb3IgcnVuIFwib2NpIHNldHVwIGNvbmZpZ1wiLicpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRpc2NvdmVyZWQgPSBkaXNjb3ZlckZyb21GdW5jWWFtbEFuZFRhcmdldCgpO1xuXG4gIGNvbnN0IGltYWdlVGFnID0gcHJvY2Vzcy5lbnYuT0NJX0lNQUdFX1RBRz8udHJpbSgpIHx8IGRpc2NvdmVyZWQuaW1hZ2VUYWcgfHwgJ2xhdGVzdCc7XG5cbiAgbGV0IGRvY2tlckNvbnRleHRQYXRoID0gZGlzY292ZXJlZC5kb2NrZXJDb250ZXh0UGF0aDtcbiAgaWYgKCFkb2NrZXJDb250ZXh0UGF0aCAmJiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSkFSX1BBVEg/LnRyaW0oKSkge1xuICAgIGNvbnN0IHAgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRILnRyaW0oKSk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIGRvY2tlckNvbnRleHRQYXRoID0gZnMuc3RhdFN5bmMocCkuaXNEaXJlY3RvcnkoKSA/IHAgOiBwYXRoLmRpcm5hbWUocCk7XG4gIH1cblxuICBjb25zdCBoYW5kbGVyID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0hBTkRMRVI/LnRyaW0oKSB8fCBkaXNjb3ZlcmVkLmhhbmRsZXI7XG4gIGNvbnN0IHVzZVRoaW5Eb2NrZXJmaWxlID0gZGlzY292ZXJlZC51c2VUaGluRG9ja2VyZmlsZSA/PyBmYWxzZTtcblxuICBjb25zdCBtZW1vcnlFbnYgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fTUVNT1JZX01CPy50cmltKCk7XG4gIGNvbnN0IGZ1bmN0aW9uTWVtb3J5TWIgPSBtZW1vcnlFbnZcbiAgICA/IFN0cmluZyhwYXJzZUludChtZW1vcnlFbnYsIDEwKSlcbiAgICA6IChkaXNjb3ZlcmVkLm1lbW9yeU1iICE9IG51bGwgPyBTdHJpbmcoZGlzY292ZXJlZC5tZW1vcnlNYikgOiB1bmRlZmluZWQpO1xuXG4gIGNvbnN0IHRpbWVvdXRFbnYgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fVElNRU9VVF9TRUNPTkRTPy50cmltKCk7XG4gIGNvbnN0IGZ1bmN0aW9uVGltZW91dFNlY29uZHMgPSB0aW1lb3V0RW52XG4gICAgPyBwYXJzZUludCh0aW1lb3V0RW52LCAxMClcbiAgICA6IGRpc2NvdmVyZWQudGltZW91dFNlY29uZHM7XG5cbiAgbGV0IGZ1bmN0aW9uQ29uZmlnID0gZGlzY292ZXJlZC5jb25maWc7XG4gIGNvbnN0IGNvbmZpZ0VudiA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9DT05GSUc/LnRyaW0oKTtcbiAgaWYgKGNvbmZpZ0Vudikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbmZpZ0VudikgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgIGZ1bmN0aW9uQ29uZmlnID0geyAuLi5mdW5jdGlvbkNvbmZpZywgLi4ucGFyc2VkIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmUgaW52YWxpZCBKU09OXG4gICAgfVxuICB9XG4gIGlmIChmdW5jdGlvbkNvbmZpZyAmJiBPYmplY3Qua2V5cyhmdW5jdGlvbkNvbmZpZykubGVuZ3RoID09PSAwKSBmdW5jdGlvbkNvbmZpZyA9IHVuZGVmaW5lZDtcblxuICBjb25zdCBhcGlHd0RlcGxveW1lbnRKc29uRW52ID0gcHJvY2Vzcy5lbnYuT0NJX0FQSUdBVEVXQVlfREVQTE9ZTUVOVF9KU09OPy50cmltKCk7XG4gIGNvbnN0IGFwaUd3RGVwbG95bWVudEpzb25QYXRoID0gYXBpR3dEZXBsb3ltZW50SnNvbkVudlxuICAgID8gcGF0aC5yZXNvbHZlKGFwaUd3RGVwbG95bWVudEpzb25FbnYpXG4gICAgOiBkb2NrZXJDb250ZXh0UGF0aFxuICAgICAgPyBlbnN1cmVEZWZhdWx0QXBpR3dEZXBsb3ltZW50SnNvbihkb2NrZXJDb250ZXh0UGF0aClcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgY29tcGFydG1lbnRJZCxcbiAgICBvY2lyQ29tcGFydG1lbnRJZDogb2NpckNvbXBhcnRtZW50SWQgfHwgdW5kZWZpbmVkLFxuICAgIHRlbmFuY3lJZCxcbiAgICByZWdpb24sXG4gICAgbmFtZXNwYWNlLFxuICAgIGZ1bmN0aW9uQXBwTmFtZTogcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0FQUF9OQU1FID8/IGRpc2NvdmVyZWQuZnVuY3Rpb25BcHBOYW1lID8/ICcnLFxuICAgIGZ1bmN0aW9uTmFtZTogcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX05BTUUgPz8gZGlzY292ZXJlZC5mdW5jdGlvbk5hbWUgPz8gJycsXG4gICAgZnVuY3Rpb25KYXJQYXRoOiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSkFSX1BBVEg/LnRyaW0oKSB8fCB1bmRlZmluZWQsXG4gICAgZG9ja2VyQ29udGV4dFBhdGg6IGRvY2tlckNvbnRleHRQYXRoIHx8IHVuZGVmaW5lZCxcbiAgICBpbWFnZVRhZyxcbiAgICBoYW5kbGVyOiBoYW5kbGVyIHx8IHVuZGVmaW5lZCxcbiAgICB1c2VUaGluRG9ja2VyZmlsZSxcbiAgICBvY2lyUmVwb3NpdG9yeU5hbWU6IHByb2Nlc3MuZW52Lk9DSV9PQ0lSX1JFUE9TSVRPUllfTkFNRSB8fCB1bmRlZmluZWQsXG4gICAgZnVuY3Rpb25NZW1vcnlNYjogZnVuY3Rpb25NZW1vcnlNYiB8fCB1bmRlZmluZWQsXG4gICAgZnVuY3Rpb25UaW1lb3V0U2Vjb25kczogZnVuY3Rpb25UaW1lb3V0U2Vjb25kcyA/PyB1bmRlZmluZWQsXG4gICAgZnVuY3Rpb25Db25maWcsXG4gICAgYXBpR3dEZXBsb3ltZW50SnNvblBhdGg6IGFwaUd3RGVwbG95bWVudEpzb25QYXRoIHx8IHVuZGVmaW5lZCxcbiAgICBiYWNrZW5kOiBiYWNrZW5kQ29uZmlnLFxuICB9O1xufVxuIl19
|
|
555
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NpLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvbmZpZy9vY2ktY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkVILGtDQUVDO0FBR0Qsd0NBS0M7QUFpWEQsb0NBd0ZDO0FBOWhCRCx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLHVDQUF5QjtBQUN6QixtREFBcUM7QUFDckMsaUVBQW1EO0FBMENuRCxNQUFNLDZCQUE2QixHQUFHLElBQUksQ0FBQyxTQUFTLENBQ2xEO0lBQ0UsTUFBTSxFQUFFO1FBQ047WUFDRSxJQUFJLEVBQUUsVUFBVTtZQUNoQixPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQztZQUNuQyxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLDBCQUEwQjtnQkFDaEMsVUFBVSxFQUFFLGdCQUFnQjtnQkFDNUIsb0JBQW9CLEVBQUUsRUFBRTthQUN6QjtTQUNGO0tBQ0Y7Q0FDRixFQUNELElBQUksRUFDSixDQUFDLENBQ0YsQ0FBQztBQUVGLHFJQUFxSTtBQUN4SCxRQUFBLG1CQUFtQixHQUEyQjtJQUN6RCxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLO0lBQzNGLFlBQVksRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLO0lBQ3JGLGVBQWUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLO0lBQ3ZGLFlBQVksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixF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QUFxQixFQUFFLElBQUksRUFBRSxJQUFJLFNBQVM7UUFDdkUsaUJBQWlCLEVBQUUsaUJBQWlCLElBQUksU0FBUztRQUNqRCxRQUFRO1FBQ1IsT0FBTyxFQUFFLE9BQU8sSUFBSSxTQUFTO1FBQzdCLGlCQUFpQjtRQUNqQixrQkFBa0IsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixJQUFJLFNBQVM7UUFDckUsZ0JBQWdCLEVBQUUsZ0JBQWdCLElBQUksU0FBUztRQUMvQyxzQkFBc0IsRUFBRSxzQkFBc0IsSUFBSSxTQUFTO1FBQzNELGNBQWM7UUFDZCx1QkFBdUIsRUFBRSx1QkFBdUIsSUFBSSxTQUFTO1FBQzdELE9BQU8sRUFBRSxhQUFhO0tBQ3ZCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPQ0kgQ29uZmlndXJhdGlvblxuICpcbiAqIFNldCB0aGVzZSB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9yIHVwZGF0ZSBkZWZhdWx0czpcbiAqIC0gT0NJX0NPTVBBUlRNRU5UX0lEXG4gKiAtIE9DSV9URU5BTkNZX0lEXG4gKiAtIE9DSV9SRUdJT05cbiAqIC0gT0NJX05BTUVTUEFDRSAoaWYgdW5zZXQsIG9idGFpbmVkIHZpYSBPQ0kgU0RLIGdldE5hbWVzcGFjZSlcbiAqIC0gT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQgKGZvciBPQ0lSOyBtdXN0IGJlIG5vbi1yb290IGZvciBmdWxsIHN0YWNrKVxuICogLSBPQ0lfRlVOQ1RJT05fQVBQX05BTUUgKEZ1bmN0aW9ucyBhcHBsaWNhdGlvbiBuYW1lOyBkZWZhdWx0IGVtcHR5KVxuICogLSBPQ0lfRlVOQ1RJT05fTkFNRSAoRnVuY3Rpb24gbmFtZTsgZGVmYXVsdCBlbXB0eSlcbiAqIC0gT0NJX0ZVTkNUSU9OX0hBTkRMRVIgKEphdmEgRkRLIENNRCBoYW5kbGVyLCBlLmcuIGNvbS5leGFtcGxlLkhhbmRsZXI6OmhhbmRsZVJlcXVlc3Q7IGZyb20gZnVuYy55YW1sIGNtZC9oYW5kbGVyIGlmIHVuc2V0KVxuICogLSBPQ0lfRlVOQ1RJT05fSkFSX1BBVEggKFBhdGggdG8gSkFSIG9yIHByb2plY3QgZGlyIGZvciBmdW5jdGlvbiBpbWFnZTsgZGVmYXVsdCBlbXB0eSlcbiAqIC0gT0NJX0ZVTkNUSU9OX01FTU9SWV9NQiAoZnVuY3Rpb24gbWVtb3J5IGluIE1COyBmcm9tIGZ1bmMueWFtbCBtZW1vcnkgaWYgdW5zZXQpXG4gKiAtIE9DSV9GVU5DVElPTl9USU1FT1VUX1NFQ09ORFMgKGZ1bmN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kczsgZnJvbSBmdW5jLnlhbWwgdGltZW91dCBpZiB1bnNldClcbiAqIC0gT0NJX0ZVTkNUSU9OX0NPTkZJRyAoSlNPTiBvYmplY3Qgc3RyaW5nIGZvciBmdW5jdGlvbiBjb25maWcvZW52OyBtZXJnZWQgd2l0aCBmdW5jLnlhbWwgY29uZmlnKVxuICogLSBPQ0lfQVBJR0FURVdBWV9ERVBMT1lNRU5UX0pTT04gKHBhdGggdG8gQVBJIEdhdGV3YXkgZGVwbG95bWVudCBzcGVjIEpTT047IGRlZmF1bHQgcHJvamVjdCByb290IG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbilcbiAqIC0gT0NES19QUk9KRUNUX0RJUiAoc2V0IGJ5IG9jZGsgQ0xJIHRvIGNhbGxlciBjd2Q7IHVzZWQgdG8gZGlzY292ZXIgZnVuYy55YW1sIGFuZCB0YXJnZXQvKVxuICogLSBPQ0lfU1RBVEVfQlVDS0VUIChmb3IgcmVtb3RlIHN0YXRlKVxuICogLSBPQ0lfU1RBVEVfQkFDS0VORF9UWVBFIChvY2l8aHR0cHxsb2NhbClcbiAqXG4gKiBXaGVuIE9DREtfUFJPSkVDVF9ESVIgaXMgc2V0IChlLmcuIHJ1bm5pbmcgYG5weCBvY2RrIGRlcGxveWAgZnJvbSBhIEphdmEgcHJvamVjdCksIGNvbmZpZ1xuICogZGlzY292ZXJzIGVpdGhlciB0YXJnZXQvKi5qYXIgb3IgcG9tLnhtbCtzcmMvIChhbmQgb3B0aW9uYWxseSBmdW5jLnlhbWwgbmFtZSwgdmVyc2lvbiwgY21kL2hhbmRsZXIpLlxuICogTm8gRG9ja2VyZmlsZSBpcyByZXF1aXJlZOKAlHRoZSBzdGFjayBnZW5lcmF0ZXMgb25lIGluIGxvY2FsLWV4ZWMgKGV4Y2x1ZGluZyBub2RlX21vZHVsZXMgdmlhIC5kb2NrZXJpZ25vcmUpLFxuICogdGhlbiBidWlsZHMsIHRhZ3MgKGZyb20gZnVuYy55YW1sIHZlcnNpb24pLCBhbmQgcHVzaGVzIHRvIE9DSVIuXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIGNvbW1vbiBmcm9tICdvY2ktY29tbW9uJztcbmltcG9ydCAqIGFzIG9iamVjdHN0b3JhZ2UgZnJvbSAnb2NpLW9iamVjdHN0b3JhZ2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9jaUJhY2tlbmRDb25maWcge1xuICB0eXBlOiAnb2NpJyB8ICdodHRwJyB8ICdsb2NhbCc7XG4gIGJ1Y2tldD86IHN0cmluZztcbiAga2V5Pzogc3RyaW5nO1xuICBhZGRyZXNzPzogc3RyaW5nO1xuICB1cGRhdGVNZXRob2Q/OiBzdHJpbmc7XG4gIGxvY2tBZGRyZXNzPzogc3RyaW5nO1xuICB1bmxvY2tBZGRyZXNzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9jaUNvbmZpZyB7XG4gIGNvbXBhcnRtZW50SWQ6IHN0cmluZztcbiAgb2NpckNvbXBhcnRtZW50SWQ/OiBzdHJpbmc7XG4gIHRlbmFuY3lJZDogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIGZ1bmN0aW9uQXBwTmFtZTogc3RyaW5nO1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqIFBhdGggdG8gSkFSIG9yIERvY2tlcmZpbGUgY29udGV4dCBmb3IgZnVuY3Rpb24gaW1hZ2U7IGVtcHR5ID0gbm8gYnVpbGQvZGVwbG95LiAqL1xuICBmdW5jdGlvbkphclBhdGg/OiBzdHJpbmc7XG4gIC8qKiBQYXRoIHRvIGRpcmVjdG9yeSBjb250YWluaW5nIHRhcmdldC8gKGRpc2NvdmVyZWQ7IERvY2tlcmZpbGUgaXMgZ2VuZXJhdGVkIGluIGxvY2FsLWV4ZWMpLiAqL1xuICBkb2NrZXJDb250ZXh0UGF0aD86IHN0cmluZztcbiAgLyoqIEltYWdlIHRhZyBmb3IgT0NJUiAoZnJvbSBmdW5jLnlhbWwgdmVyc2lvbiBvciBPQ0lfSU1BR0VfVEFHOyBkZWZhdWx0ICdsYXRlc3QnKS4gKi9cbiAgaW1hZ2VUYWc/OiBzdHJpbmc7XG4gIC8qKiBKYXZhIEZESyBDTUQgaGFuZGxlciAoZnJvbSBmdW5jLnlhbWwgY21kL2hhbmRsZXIgb3IgT0NJX0ZVTkNUSU9OX0hBTkRMRVI7IGRlZmF1bHQgYmVsb3cpLiAqL1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICAvKiogV2hlbiB0cnVlLCBkZXBsb3kgdXNlcyBhIHRoaW4gRG9ja2VyZmlsZSAoQ09QWSB0YXJnZXQvKi5qYXIgb25seSk7IGZ1bGwgTWF2ZW4gYnVpbGQgb25seSBpbiByZWRlcGxveTpmdW5jdGlvbi4gKi9cbiAgdXNlVGhpbkRvY2tlcmZpbGU/OiBib29sZWFuO1xuICBvY2lyUmVwb3NpdG9yeU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBGdW5jdGlvbiBtZW1vcnkgaW4gTUIgKDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzIpLiBGcm9tIGZ1bmMueWFtbCBtZW1vcnkgb3IgT0NJX0ZVTkNUSU9OX01FTU9SWV9NQi4gKi9cbiAgZnVuY3Rpb25NZW1vcnlNYj86IHN0cmluZztcbiAgLyoqIEZ1bmN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kcyAoMeKAkzMwMCkuIEZyb20gZnVuYy55YW1sIHRpbWVvdXQgb3IgT0NJX0ZVTkNUSU9OX1RJTUVPVVRfU0VDT05EUy4gKi9cbiAgZnVuY3Rpb25UaW1lb3V0U2Vjb25kcz86IG51bWJlcjtcbiAgLyoqIEZ1bmN0aW9uIGNvbmZpZy9lbnYga2V5LXZhbHVlLiBGcm9tIGZ1bmMueWFtbCBjb25maWcgb3IgT0NJX0ZVTkNUSU9OX0NPTkZJRyAoSlNPTiBvYmplY3Qgc3RyaW5nKS4gKi9cbiAgZnVuY3Rpb25Db25maWc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogUGF0aCB0byBBUEkgR2F0ZXdheSBkZXBsb3ltZW50IHNwZWMgSlNPTiAocm91dGVzKS4gVXNlIE9DSV9BUElHQVRFV0FZX0RFUExPWU1FTlRfSlNPTiBvciBkZWZhdWx0IG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbiBpbiBwcm9qZWN0IHJvb3QuICovXG4gIGFwaUd3RGVwbG95bWVudEpzb25QYXRoPzogc3RyaW5nO1xuICBiYWNrZW5kPzogT2NpQmFja2VuZENvbmZpZztcbn1cblxuY29uc3QgREVGQVVMVF9BUElHV19ERVBMT1lNRU5UX0pTT04gPSBKU09OLnN0cmluZ2lmeShcbiAge1xuICAgIHJvdXRlczogW1xuICAgICAge1xuICAgICAgICBwYXRoOiAnL3twYXRoKn0nLFxuICAgICAgICBtZXRob2RzOiBbJ0dFVCcsICdQT1NUJywgJ09QVElPTlMnXSxcbiAgICAgICAgYmFja2VuZDoge1xuICAgICAgICAgIHR5cGU6ICdPUkFDTEVfRlVOQ1RJT05TX0JBQ0tFTkQnLFxuICAgICAgICAgIGZ1bmN0aW9uSWQ6ICcke2Z1bmN0aW9uX2lkfScsXG4gICAgICAgICAgcmVhZFRpbWVvdXRJblNlY29uZHM6IDMwLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICBudWxsLFxuICAyXG4pO1xuXG4vKiogT0NJUiBzaG9ydCByZWdpb24ga2V5cyAoZS5nLiBldS1mcmFua2Z1cnQtMSAtPiBmcmEpLiBVc2VkIHNvIGxvZ2luLCBidWlsZCwgcHVzaCBhbmQgZnVuY3Rpb24gaW1hZ2UgYWxsIHVzZSBzYW1lIHJlZ2lzdHJ5IGhvc3QuICovXG5leHBvcnQgY29uc3QgUkVHSU9OX1RPX09DSVJfSE9TVDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ2V1LWZyYW5rZnVydC0xJzogJ2ZyYScsICd1cy1waG9lbml4LTEnOiAncGh4JywgJ3VzLWFzaGJ1cm4tMSc6ICdpYWQnLCAndWstbG9uZG9uLTEnOiAnbGhyJyxcbiAgJ2FwLXRva3lvLTEnOiAnbnJ0JywgJ2FwLW11bWJhaS0xJzogJ2JvbScsICdhcC1zZW91bC0xJzogJ2ljbicsICdjYS10b3JvbnRvLTEnOiAneXl6JyxcbiAgJ3NhLXNhb3BhdWxvLTEnOiAnZ3J1JywgJ2FwLXN5ZG5leS0xJzogJ3N5ZCcsICdldS16dXJpY2gtMSc6ICd6cmgnLCAnbWUtZHViYWktMSc6ICdkeGInLFxuICAnYXAtb3Nha2EtMSc6ICdraXgnLCAnZXUtYW1zdGVyZGFtLTEnOiAnYW1zJywgJ2FwLXNpbmdhcG9yZS0xJzogJ3NpbicsICdhcC1oeWRlcmFiYWQtMSc6ICdoeWQnLFxuICAnZXUtbWlsYW4tMSc6ICdteHAnLCAnc2Etc2FudGlhZ28tMSc6ICdzY2wnLCAnYXAtbWVsYm91cm5lLTEnOiAnbWVsJywgJ2V1LXN0b2NraG9sbS0xJzogJ2FybicsXG4gICdtZS1qZWRkYWgtMSc6ICdqZWQnLCAnYWYtam9oYW5uZXNidXJnLTEnOiAnam5iJywgJ2lsLWplcnVzYWxlbS0xJzogJ3RsdicsICdteC1xdWVyZXRhcm8tMSc6ICdxcm8nLFxuICAnZXUtbWFyc2VpbGxlLTEnOiAnbXJzJyxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvY2lySG9zdEtleShyZWdpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBSRUdJT05fVE9fT0NJUl9IT1NUW3JlZ2lvbl0gPz8gcmVnaW9uO1xufVxuXG4vKiogRnVsbCBPQ0lSIGltYWdlIFVSTCBmb3IgdGhlIGZ1bmN0aW9uIChyZWdpc3RyeS9uYW1lc3BhY2UvcmVwbzp0YWcpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9jaUltYWdlVXJsKGNvbmZpZzogT2NpQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgcmVnaXN0cnkgPSBgJHtvY2lySG9zdEtleShjb25maWcucmVnaW9uKX0ub2Npci5pb2A7XG4gIGNvbnN0IHJlcG8gPSBjb25maWcub2NpclJlcG9zaXRvcnlOYW1lIHx8IGNvbmZpZy5mdW5jdGlvbk5hbWUgfHwgJ29jaS1mdW5jdGlvbic7XG4gIGNvbnN0IHRhZyA9IGNvbmZpZy5pbWFnZVRhZyB8fCAnbGF0ZXN0JztcbiAgcmV0dXJuIGAke3JlZ2lzdHJ5fS8ke2NvbmZpZy5uYW1lc3BhY2V9LyR7cmVwb306JHt0YWd9YDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBmdW5jdGlvbiBuYW1lIGZyb20gZnVuYy55YW1sIChPQ0kgRnVuY3Rpb25zIGZvcm1hdCkuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJuYW1lOlwiIGxpbmUsIHRyaW1tZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sTmFtZShwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqbmFtZTpcXHMqW1wiJ10/KFteXCInXFxzXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKG0pIHJldHVybiBtWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgY21kL2hhbmRsZXIgZnJvbSBmdW5jLnlhbWwgKE9DSS9GbiBmb3JtYXQpLlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2YgXCJjbWQ6XCIgb3IgXCJoYW5kbGVyOlwiIGxpbmUsIHRyaW1tZWQ7IHVzZWQgYXMgRG9ja2VyIENNRCBmb3IgSmF2YSBGREsuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sSGFuZGxlcihwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgY21kTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eXFxzKmNtZDpcXHMqW1wiJ10/KFteXCInXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKGNtZE1hdGNoKSByZXR1cm4gY21kTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgY29uc3QgaGFuZGxlck1hdGNoID0gY29udGVudC5tYXRjaCgvXlxccypoYW5kbGVyOlxccypbXCInXT8oW15cIidcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAoaGFuZGxlck1hdGNoKSByZXR1cm4gaGFuZGxlck1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgdmVyc2lvbiBmcm9tIGZ1bmMueWFtbCAodXNlZCBhcyBPQ0lSIGltYWdlIHRhZykuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJ2ZXJzaW9uOlwiIGxpbmUsIHRyaW1tZWQ7IHNhbml0aXplZCBmb3IgRG9ja2VyIHRhZyAoYS16QS1aMC05Xy4tKS5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxWZXJzaW9uKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccyp2ZXJzaW9uOlxccypbXCInXT8oW15cIidcXHNcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAobSkge1xuICAgICAgICBjb25zdCByYXcgPSBtWzFdLnRyaW0oKTtcbiAgICAgICAgY29uc3Qgc2FuaXRpemVkID0gcmF3LnJlcGxhY2UoL1teYS16QS1aMC05Xy4tXS9nLCAnLScpLnJlcGxhY2UoLy0rL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpO1xuICAgICAgICByZXR1cm4gc2FuaXRpemVkIHx8IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IFZBTElEX01FTU9SWV9NQiA9IG5ldyBTZXQoWzEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzJdKTtcblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBtZW1vcnkgKE1CKSBmcm9tIGZ1bmMueWFtbC4gT0NJIGFsbG93cyAxMjgsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4LCAzMDcyLlxuICogUmV0dXJucyB0aGUgbnVtYmVyIGlmIHByZXNlbnQgYW5kIHZhbGlkOyBvdGhlcndpc2UgdW5kZWZpbmVkLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbE1lbW9yeShwcm9qZWN0RGlyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqbWVtb3J5OlxccyooXFxkKylcXHMqJC9tKTtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChtWzFdLCAxMCk7XG4gICAgICAgIGlmIChWQUxJRF9NRU1PUllfTUIuaGFzKG4pKSByZXR1cm4gbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgdGltZW91dCAoc2Vjb25kcykgZnJvbSBmdW5jLnlhbWwuIE9DSSBtYXggaXMgMzAwLlxuICogUmV0dXJucyB0aGUgbnVtYmVyIGlmIHByZXNlbnQgYW5kIGluIHJhbmdlIDHigJMzMDA7IG90aGVyd2lzZSB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sVGltZW91dChwcm9qZWN0RGlyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqdGltZW91dDpcXHMqKFxcZCspXFxzKiQvbSk7XG4gICAgICBpZiAobSkge1xuICAgICAgICBjb25zdCBuID0gcGFyc2VJbnQobVsxXSwgMTApO1xuICAgICAgICBpZiAobiA+PSAxICYmIG4gPD0gMzAwKSByZXR1cm4gbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgY29uZmlnIChrZXktdmFsdWUgZW52KSBmcm9tIGZ1bmMueWFtbC4gRXhwZWN0cyBhIHRvcC1sZXZlbCBcImNvbmZpZzpcIiBibG9jayB3aXRoIGtleTogdmFsdWUgbGluZXMuXG4gKiBSZXR1cm5zIGEgcmVjb3JkIG9mIHN0cmluZyBrZXlzIGFuZCBzdHJpbmcgdmFsdWVzOyBlbXB0eSBpZiBub25lIG9yIHBhcnNlIGVycm9yLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbENvbmZpZyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnZnVuYy55YW1sJyk7XG4gIHRyeSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHApKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgICBsZXQgaW5Db25maWcgPSBmYWxzZTtcbiAgICBjb25zdCBjb25maWc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTtcbiAgICAgIGlmICh0cmltbWVkID09PSAnY29uZmlnOicgfHwgL15jb25maWdcXHMqOlxccyokLy50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICAgIGluQ29uZmlnID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaW5Db25maWcpIHtcbiAgICAgICAgaWYgKHRyaW1tZWQgIT09ICcnICYmICFsaW5lLnN0YXJ0c1dpdGgoJyAnKSAmJiAhbGluZS5zdGFydHNXaXRoKCdcXHQnKSkgYnJlYWs7XG4gICAgICAgIGNvbnN0IGt2ID0gbGluZS5tYXRjaCgvXlxccysoW2EtekEtWl9dW2EtekEtWjAtOV8tXSopXFxzKjpcXHMqKC4qKSQvKTtcbiAgICAgICAgaWYgKGt2KSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0ga3ZbMV0udHJpbSgpO1xuICAgICAgICAgIGxldCB2YWwgPSBrdlsyXS50cmltKCk7XG4gICAgICAgICAgaWYgKCh2YWwuc3RhcnRzV2l0aCgnXCInKSAmJiB2YWwuZW5kc1dpdGgoJ1wiJykpIHx8ICh2YWwuc3RhcnRzV2l0aChcIidcIikgJiYgdmFsLmVuZHNXaXRoKFwiJ1wiKSkpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5zbGljZSgxLCAtMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbmZpZ1trZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb25maWcpLmxlbmd0aCA/IGNvbmZpZyA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogRW5zdXJlIG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbiBleGlzdHMgaW4gcHJvamVjdERpcjsgd3JpdGUgZGVmYXVsdCBpZiBtaXNzaW5nLiBSZXR1cm5zIHBhdGguICovXG5mdW5jdGlvbiBlbnN1cmVEZWZhdWx0QXBpR3dEZXBsb3ltZW50SnNvbihwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdvY2lfYXBpZ2F0ZXdheV9kZXBsb3ltZW50Lmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwLCBERUZBVUxUX0FQSUdXX0RFUExPWU1FTlRfSlNPTiwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gcDtcbn1cblxuY29uc3QgVEFJTF9GVU5DVElPTl9MT0dTX1NDUklQVCA9IGAjIS91c3IvYmluL2VudiBub2RlXG4vKipcbiAqIFRhaWwgT0NJIEZ1bmN0aW9ucyBleGVjdXRpb24gbG9ncy4gR2VuZXJhdGVkIGJ5IE9DREsuXG4gKiBSdW4gZnJvbSBwcm9qZWN0IHJvb3QgYWZ0ZXIgZGVwbG95LiBSZXF1aXJlczogT0NJIENMSSwgT0NJX0NPTVBBUlRNRU5UX0lELCBhbmQgLm9jZGstb3V0cHV0cy5qc29uIChjcmVhdGVkIG9uIGRlcGxveSkuXG4gKi9cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCB7IHNwYXduU3luYyB9ID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpO1xuXG5jb25zdCBkaXIgPSBwcm9jZXNzLmVudi5PQ0RLX1BST0pFQ1RfRElSIHx8IF9fZGlybmFtZTtcbmNvbnN0IG91dHB1dHNQYXRoID0gcGF0aC5qb2luKGRpciwgJy5vY2RrLW91dHB1dHMuanNvbicpO1xuaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dHNQYXRoKSkge1xuICBjb25zb2xlLmVycm9yKCdSdW4gZGVwbG95IGZpcnN0IHRvIGNyZWF0ZSAub2Nkay1vdXRwdXRzLmpzb24gaW4gdGhlIHByb2plY3Qgcm9vdC4nKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuY29uc3QgY29tcElkID0gcHJvY2Vzcy5lbnYuT0NJX0NPTVBBUlRNRU5UX0lEIHx8IHByb2Nlc3MuZW52Lk9DSV9DT01QQVJUTUVOVF9PQ0lEO1xuaWYgKCFjb21wSWQpIHtcbiAgY29uc29sZS5lcnJvcignU2V0IE9DSV9DT01QQVJUTUVOVF9JRCAob3IgT0NJX0NPTVBBUlRNRU5UX09DSUQpLicpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5sZXQgb3V0O1xudHJ5IHtcbiAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKG91dHB1dHNQYXRoLCAndXRmOCcpLnJlcGxhY2UoL15cXHVGRUZGLywgJycpLnRyaW0oKTtcbiAgY29uc3QgZmlyc3QgPSByYXcuaW5kZXhPZigneycpO1xuICBjb25zdCBsYXN0ID0gcmF3Lmxhc3RJbmRleE9mKCd9Jyk7XG4gIGlmIChmaXJzdCA9PT0gLTEgfHwgbGFzdCA8PSBmaXJzdCkgdGhyb3cgbmV3IEVycm9yKCdObyBKU09OJyk7XG4gIG91dCA9IEpTT04ucGFyc2UocmF3LnNsaWNlKGZpcnN0LCBsYXN0ICsgMSkpO1xufSBjYXRjaCAoZSkge1xuICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIG9yIG1pc3NpbmcgLm9jZGstb3V0cHV0cy5qc29uLiBSdW4gZGVwbG95IGZpcnN0LicpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5jb25zdCBvdXRwdXRzID0gb3V0LmxvZ19ncm91cF9pZCAhPSBudWxsID8gb3V0IDogT2JqZWN0LnZhbHVlcyhvdXQpLmZpbmQoKHYpID0+IHYgJiYgdHlwZW9mIHYgPT09ICdvYmplY3QnICYmICh2LmxvZ19ncm91cF9pZCAhPSBudWxsIHx8IHYuZXhlY3V0aW9uX2xvZ19pZCAhPSBudWxsKSkgfHwgb3V0O1xuZnVuY3Rpb24gdmFsKG8sIGspIHtcbiAgY29uc3QgdiA9IG9ba107XG4gIGlmICghdikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykgcmV0dXJuIHY7XG4gIGlmICh2ICYmIHR5cGVvZiB2LnZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHYudmFsdWU7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5jb25zdCBsb2dHcm91cElkID0gdmFsKG91dHB1dHMsICdsb2dfZ3JvdXBfaWQnKTtcbmNvbnN0IGV4ZWN1dGlvbkxvZ0lkID0gdmFsKG91dHB1dHMsICdleGVjdXRpb25fbG9nX2lkJyk7XG5pZiAoIWxvZ0dyb3VwSWQgfHwgIWV4ZWN1dGlvbkxvZ0lkKSB7XG4gIGNvbnNvbGUuZXJyb3IoJ2xvZ19ncm91cF9pZCBvciBleGVjdXRpb25fbG9nX2lkIG1pc3NpbmcgaW4gLm9jZGstb3V0cHV0cy5qc29uJyk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cbmNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG5jb25zdCBzdGFydCA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgLSAxMCAqIDYwICogMTAwMCk7XG5jb25zdCB0aW1lU3RhcnQgPSBzdGFydC50b0lTT1N0cmluZygpO1xuY29uc3QgdGltZUVuZCA9IG5vdy50b0lTT1N0cmluZygpO1xuY29uc3Qgc2NvcGUgPSBjb21wSWQgKyAnLycgKyBsb2dHcm91cElkICsgJy8nICsgZXhlY3V0aW9uTG9nSWQ7XG5jb25zdCBxdWVyeSA9ICdzZWFyY2ggXCInICsgc2NvcGUgKyAnXCIgfCBzb3J0IGJ5IGRhdGV0aW1lIGRlc2MgfCBsaW1pdCA1MCc7XG5jb25zdCByID0gc3Bhd25TeW5jKCdvY2knLCBbJ2xvZ2dpbmctc2VhcmNoJywgJ3NlYXJjaC1sb2dzJywgJy0tc2VhcmNoLXF1ZXJ5JywgcXVlcnksICctLXRpbWUtc3RhcnQnLCB0aW1lU3RhcnQsICctLXRpbWUtZW5kJywgdGltZUVuZF0sIHsgc3RkaW86ICdpbmhlcml0Jywgc2hlbGw6IHRydWUgfSk7XG5wcm9jZXNzLmV4aXQoci5zdGF0dXMgPz8gMSk7XG5gO1xuXG4vKiogRW5zdXJlIHRhaWwtZnVuY3Rpb24tbG9ncy5qcyBleGlzdHMgaW4gcHJvamVjdERpcjsgd3JpdGUgZGVmYXVsdCBpZiBtaXNzaW5nLiBSZXR1cm5zIHBhdGguICovXG5mdW5jdGlvbiBlbnN1cmVUYWlsRnVuY3Rpb25Mb2dzU2NyaXB0KHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ3RhaWwtZnVuY3Rpb24tbG9ncy5qcycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHAsIFRBSUxfRlVOQ1RJT05fTE9HU19TQ1JJUFQsICd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuIHA7XG59XG5cbi8qKiBSZWFkIHRlbmFuY3kgYW5kIHJlZ2lvbiBmcm9tIE9DSSBDTEkgY29uZmlnLiBEZWZhdWx0IGZpbGU6IH4vLm9jaS9jb25maWcsIGRlZmF1bHQgcHJvZmlsZTogREVGQVVMVC4gKi9cbmZ1bmN0aW9uIHJlYWRUZW5hbmN5QW5kUmVnaW9uRnJvbUNsaUNvbmZpZygpOiB7IHRlbmFuY3k/OiBzdHJpbmc7IHJlZ2lvbj86IHN0cmluZyB9IHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IHByb2Nlc3MuZW52Lk9DSV9DT05GSUdfRklMRSB8fCBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLm9jaScsICdjb25maWcnKTtcbiAgY29uc3QgcHJvZmlsZSA9IHByb2Nlc3MuZW52Lk9DSV9DTElfUFJPRklMRSB8fCAnREVGQVVMVCc7XG4gIHRyeSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSByZXR1cm4ge307XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmLTgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgICBsZXQgaW5Qcm9maWxlID0gZmFsc2U7XG4gICAgY29uc3QgcmVzdWx0OiB7IHRlbmFuY3k/OiBzdHJpbmc7IHJlZ2lvbj86IHN0cmluZyB9ID0ge307XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG4gICAgICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCdbJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnXScpKSB7XG4gICAgICAgIGluUHJvZmlsZSA9IHRyaW1tZWQuc2xpY2UoMSwgLTEpID09PSBwcm9maWxlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghaW5Qcm9maWxlKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGVxID0gdHJpbW1lZC5pbmRleE9mKCc9Jyk7XG4gICAgICBpZiAoZXEgPD0gMCkgY29udGludWU7XG4gICAgICBjb25zdCBrZXkgPSB0cmltbWVkLnNsaWNlKDAsIGVxKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gdHJpbW1lZC5zbGljZShlcSArIDEpLnRyaW0oKTtcbiAgICAgIGlmIChrZXkgPT09ICd0ZW5hbmN5JykgcmVzdWx0LnRlbmFuY3kgPSB2YWx1ZTtcbiAgICAgIGlmIChrZXkgPT09ICdyZWdpb24nKSByZXN1bHQucmVnaW9uID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKiogR2V0IG9iamVjdCBzdG9yYWdlIG5hbWVzcGFjZSB2aWEgT0NJIFNESyAoc2FtZSBhcyBcIm9jaSBvcyBucyBnZXRcIikuIFVzZXMgfi8ub2NpL2NvbmZpZywgREVGQVVMVCBwcm9maWxlLiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlRnJvbU9jaVNkayhjb21wYXJ0bWVudElkOiBzdHJpbmcsIHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IHByb2Nlc3MuZW52Lk9DSV9DT05GSUdfRklMRSB8fCBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLm9jaScsICdjb25maWcnKTtcbiAgY29uc3QgcHJvZmlsZSA9IHByb2Nlc3MuZW52Lk9DSV9DTElfUFJPRklMRSB8fCAnREVGQVVMVCc7XG4gIHRyeSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgY29tbW9uLkNvbmZpZ0ZpbGVBdXRoZW50aWNhdGlvbkRldGFpbHNQcm92aWRlcihjb25maWdQYXRoLCBwcm9maWxlKTtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgb2JqZWN0c3RvcmFnZS5PYmplY3RTdG9yYWdlQ2xpZW50KHsgYXV0aGVudGljYXRpb25EZXRhaWxzUHJvdmlkZXI6IHByb3ZpZGVyIH0pO1xuICAgIGNsaWVudC5yZWdpb25JZCA9IHJlZ2lvbjtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXROYW1lc3BhY2Uoe1xuICAgICAgY29tcGFydG1lbnRJZCxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UudmFsdWU/LnRyaW0oKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEZpbmQgYSBKQVIgdW5kZXIgdGFyZ2V0LyAocHJlZmVyIG9uZSBtYXRjaGluZyBuYW1lLCBlbHNlIGZpcnN0IC5qYXIpLlxuICovXG5mdW5jdGlvbiBmaW5kSmFySW5UYXJnZXQocHJvamVjdERpcjogc3RyaW5nLCBmdW5jdGlvbk5hbWU/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0YXJnZXREaXIgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ3RhcmdldCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0RGlyKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHRhcmdldERpcik7XG4gICAgY29uc3QgamFycyA9IGZpbGVzLmZpbHRlcigoZikgPT4gZi5lbmRzV2l0aCgnLmphcicpICYmICFmLmVuZHNXaXRoKCctc291cmNlcy5qYXInKSk7XG4gICAgaWYgKGphcnMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChmdW5jdGlvbk5hbWUpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gamFycy5maW5kKChqKSA9PiBqLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZnVuY3Rpb25OYW1lLnRvTG93ZXJDYXNlKCkpKTtcbiAgICAgIGlmIChtYXRjaCkgcmV0dXJuIHBhdGguam9pbih0YXJnZXREaXIsIG1hdGNoKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbih0YXJnZXREaXIsIGphcnNbMF0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBUcnVlIGlmIHByb2plY3QgaGFzIHBvbS54bWwgYW5kIHNyYy8gKE1hdmVuIHNvdXJjZSBsYXlvdXQgZm9yIGJ1aWxkLWZyb20tc291cmNlIERvY2tlcmZpbGUpLiAqL1xuZnVuY3Rpb24gaGFzUG9tQW5kU3JjKHByb2plY3REaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwb20gPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ3BvbS54bWwnKTtcbiAgY29uc3Qgc3JjID0gcGF0aC5qb2luKHByb2plY3REaXIsICdzcmMnKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwb20pICYmIGZzLmV4aXN0c1N5bmMoc3JjKSAmJiBmcy5zdGF0U3luYyhzcmMpLmlzRGlyZWN0b3J5KCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNjb3ZlckZyb21GdW5jWWFtbEFuZFRhcmdldCgpOiB7XG4gIGZ1bmN0aW9uTmFtZT86IHN0cmluZztcbiAgZnVuY3Rpb25BcHBOYW1lPzogc3RyaW5nO1xuICBkb2NrZXJDb250ZXh0UGF0aD86IHN0cmluZztcbiAgaW1hZ2VUYWc/OiBzdHJpbmc7XG4gIGhhbmRsZXI/OiBzdHJpbmc7XG4gIHVzZVRoaW5Eb2NrZXJmaWxlPzogYm9vbGVhbjtcbiAgbWVtb3J5TWI/OiBudW1iZXI7XG4gIHRpbWVvdXRTZWNvbmRzPzogbnVtYmVyO1xuICBjb25maWc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufSB7XG4gIGxldCBwcm9qZWN0RGlyID0gcHJvY2Vzcy5lbnYuT0NES19QUk9KRUNUX0RJUj8udHJpbSgpO1xuICBpZiAoIXByb2plY3REaXIpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnLm9jZGstcHJvamVjdC1kaXInKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSBwcm9qZWN0RGlyID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4JykudHJpbSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9XG4gIGlmICghcHJvamVjdERpciAmJiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSkFSX1BBVEg/LnRyaW0oKSkge1xuICAgIGNvbnN0IHAgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRILnRyaW0oKSk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHByb2plY3REaXIgPSBmcy5zdGF0U3luYyhwKS5pc0RpcmVjdG9yeSgpID8gcCA6IHBhdGguZGlybmFtZShwKTtcbiAgfVxuICBpZiAoIXByb2plY3REaXIpIHByb2plY3REaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICBwcm9qZWN0RGlyID0gcHJvamVjdERpciA/IHBhdGgucmVzb2x2ZShwcm9qZWN0RGlyKSA6ICcnO1xuICBpZiAoIXByb2plY3REaXIgfHwgIWZzLmV4aXN0c1N5bmMocHJvamVjdERpcikpIHJldHVybiB7fTtcblxuICBjb25zdCBuYW1lRnJvbVlhbWwgPSBnZXRGdW5jWWFtbE5hbWUocHJvamVjdERpcik7XG4gIGNvbnN0IGphclBhdGggPSBmaW5kSmFySW5UYXJnZXQocHJvamVjdERpciwgbmFtZUZyb21ZYW1sIHx8IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGhhc1NvdXJjZSA9IGhhc1BvbUFuZFNyYyhwcm9qZWN0RGlyKTtcbiAgaWYgKCFqYXJQYXRoICYmICFoYXNTb3VyY2UpIHJldHVybiB7fTtcblxuICBjb25zdCBmdW5jdGlvbk5hbWUgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fTkFNRT8udHJpbSgpIHx8IG5hbWVGcm9tWWFtbCB8fCBwYXRoLmJhc2VuYW1lKHByb2plY3REaXIpIHx8ICdvY2ktZnVuY3Rpb24nO1xuICBjb25zdCBpbWFnZVRhZyA9IHByb2Nlc3MuZW52Lk9DSV9JTUFHRV9UQUc/LnRyaW0oKSB8fCBnZXRGdW5jWWFtbFZlcnNpb24ocHJvamVjdERpcik7XG4gIGNvbnN0IGhhbmRsZXIgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSEFORExFUj8udHJpbSgpIHx8IGdldEZ1bmNZYW1sSGFuZGxlcihwcm9qZWN0RGlyKTtcbiAgY29uc3QgdXNlVGhpbkRvY2tlcmZpbGUgPSAhIWphclBhdGg7XG4gIGNvbnN0IG1lbW9yeU1iID0gZ2V0RnVuY1lhbWxNZW1vcnkocHJvamVjdERpcik7XG4gIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gZ2V0RnVuY1lhbWxUaW1lb3V0KHByb2plY3REaXIpO1xuICBjb25zdCBjb25maWcgPSBnZXRGdW5jWWFtbENvbmZpZyhwcm9qZWN0RGlyKTtcblxuICByZXR1cm4ge1xuICAgIGZ1bmN0aW9uTmFtZSxcbiAgICBmdW5jdGlvbkFwcE5hbWU6IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9BUFBfTkFNRT8udHJpbSgpIHx8IGZ1bmN0aW9uTmFtZSxcbiAgICBkb2NrZXJDb250ZXh0UGF0aDogcGF0aC5yZXNvbHZlKHByb2plY3REaXIpLFxuICAgIGltYWdlVGFnOiBpbWFnZVRhZyB8fCB1bmRlZmluZWQsXG4gICAgaGFuZGxlcjogaGFuZGxlciB8fCB1bmRlZmluZWQsXG4gICAgdXNlVGhpbkRvY2tlcmZpbGUsXG4gICAgbWVtb3J5TWIsXG4gICAgdGltZW91dFNlY29uZHMsXG4gICAgY29uZmlnLFxuICB9O1xufVxuXG5jb25zdCBiYWNrZW5kVHlwZSA9IChwcm9jZXNzLmVudi5PQ0lfU1RBVEVfQkFDS0VORF9UWVBFIHx8ICdsb2NhbCcpIGFzICdvY2knIHwgJ2h0dHAnIHwgJ2xvY2FsJztcblxuY29uc3QgYmFja2VuZENvbmZpZzogT2NpQmFja2VuZENvbmZpZyB8IHVuZGVmaW5lZCA9IGJhY2tlbmRUeXBlID09PSAnbG9jYWwnXG4gID8gdW5kZWZpbmVkXG4gIDogYmFja2VuZFR5cGUgPT09ICdvY2knXG4gICAgPyB7XG4gICAgICAgIHR5cGU6ICdvY2knLFxuICAgICAgICBidWNrZXQ6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9CVUNLRVQgfHwgJ3RmLXN0YXRlJyxcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfS0VZIHx8ICdmdW5jdGlvbi1zdGFjay90ZXJyYWZvcm0udGZzdGF0ZScsXG4gICAgICB9XG4gICAgOiB7XG4gICAgICAgIHR5cGU6ICdodHRwJyxcbiAgICAgICAgYWRkcmVzczogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfQUREUkVTUyB8fCAnJyxcbiAgICAgICAgdXBkYXRlTWV0aG9kOiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfSFRUUF9VUERBVEVfTUVUSE9EIHx8ICdQVVQnLFxuICAgICAgICBsb2NrQWRkcmVzczogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfTE9DS19BRERSRVNTLFxuICAgICAgICB1bmxvY2tBZGRyZXNzOiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfSFRUUF9VTkxPQ0tfQUREUkVTUyxcbiAgICAgIH07XG5cbi8qKlxuICogTG9hZCBPQ0kgY29uZmlnIGZyb20gZW52IGFuZCBDTEkgY29uZmlnLiBXaGVuIE9DSV9OQU1FU1BBQ0UgaXMgdW5zZXQsIGZldGNoZXMgaXQgdmlhIE9DSSBTREsgKGdldE5hbWVzcGFjZSkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPY2lDb25maWcoKTogUHJvbWlzZTxPY2lDb25maWc+IHtcbiAgY29uc3QgY2xpQ29uZmlnID0gcmVhZFRlbmFuY3lBbmRSZWdpb25Gcm9tQ2xpQ29uZmlnKCk7XG4gIGNvbnN0IGNvbXBhcnRtZW50SWQgPSBwcm9jZXNzLmVudi5PQ0lfQ09NUEFSVE1FTlRfSUQ/LnRyaW0oKSB8fCAnb2NpZDEuY29tcGFydG1lbnQub2MxLi5hYWFhYWFhLi4uJztcbiAgY29uc3Qgb2NpckNvbXBhcnRtZW50SWQgPSBwcm9jZXNzLmVudi5PQ0lfT0NJUl9DT01QQVJUTUVOVF9JRD8udHJpbSgpIHx8IHByb2Nlc3MuZW52Lk9DSV9DT01QQVJUTUVOVF9JRD8udHJpbSgpIHx8IGNvbXBhcnRtZW50SWQ7XG4gIGNvbnN0IHRlbmFuY3lJZCA9IHByb2Nlc3MuZW52Lk9DSV9URU5BTkNZX0lEPy50cmltKCkgfHwgY2xpQ29uZmlnLnRlbmFuY3k/LnRyaW0oKSB8fCAnb2NpZDEudGVuYW5jeS5vYzEuLmFhYWFhYWEuLi4nO1xuICBjb25zdCByZWdpb24gPSBwcm9jZXNzLmVudi5PQ0lfUkVHSU9OPy50cmltKCkgfHwgY2xpQ29uZmlnLnJlZ2lvbj8udHJpbSgpIHx8ICdldS1mcmFua2Z1cnQtMSc7XG5cbiAgaWYgKCFvY2lyQ29tcGFydG1lbnRJZCB8fCBvY2lyQ29tcGFydG1lbnRJZC5pbmNsdWRlcygncm9vdCcpKSB7XG4gICAgY29uc29sZS53YXJuKCfimqDvuI8gIFdBUk5JTkc6IE9DSV9PQ0lSX0NPTVBBUlRNRU5UX0lEIG5vdCBzZXQgb3Igc2V0IHRvIHJvb3QgY29tcGFydG1lbnQuJyk7XG4gICAgY29uc29sZS53YXJuKCcgICBQbGVhc2Ugc2V0IE9DSV9PQ0lSX0NPTVBBUlRNRU5UX0lEIHRvIHlvdXIgaG9tZSBjb21wYXJ0bWVudCBPQ0lELicpO1xuICAgIGNvbnNvbGUud2FybignICAgRXhhbXBsZTogZXhwb3J0IE9DSV9PQ0lSX0NPTVBBUlRNRU5UX0lEPVwib2NpZDEuY29tcGFydG1lbnQub2MxLi5hYWFhYWFhLi4uXCInKTtcbiAgfVxuXG4gIGxldCBuYW1lc3BhY2UgPSBwcm9jZXNzLmVudi5PQ0lfTkFNRVNQQUNFPy50cmltKCk7XG4gIGlmICghbmFtZXNwYWNlIHx8IG5hbWVzcGFjZSA9PT0gJ3lvdXItbmFtZXNwYWNlJykge1xuICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgZ2V0TmFtZXNwYWNlRnJvbU9jaVNkayhjb21wYXJ0bWVudElkLCByZWdpb24pO1xuICAgIGlmIChyZXNvbHZlZCkgbmFtZXNwYWNlID0gcmVzb2x2ZWQ7XG4gICAgZWxzZSBpZiAoIW5hbWVzcGFjZSkgbmFtZXNwYWNlID0gJ3lvdXItbmFtZXNwYWNlJztcbiAgICBpZiAobmFtZXNwYWNlID09PSAneW91ci1uYW1lc3BhY2UnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ+KaoO+4jyAgT0NJX05BTUVTUEFDRSBub3Qgc2V0IGFuZCBTREsgY291bGQgbm90IHJlc29sdmUgaXQuIFNldCBPQ0lfTkFNRVNQQUNFIG9yIHJ1biBcIm9jaSBzZXR1cCBjb25maWdcIi4nKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkaXNjb3ZlcmVkID0gZGlzY292ZXJGcm9tRnVuY1lhbWxBbmRUYXJnZXQoKTtcblxuICBjb25zdCBpbWFnZVRhZyA9IHByb2Nlc3MuZW52Lk9DSV9JTUFHRV9UQUc/LnRyaW0oKSB8fCBkaXNjb3ZlcmVkLmltYWdlVGFnIHx8ICdsYXRlc3QnO1xuXG4gIGxldCBkb2NrZXJDb250ZXh0UGF0aCA9IGRpc2NvdmVyZWQuZG9ja2VyQ29udGV4dFBhdGg7XG4gIGlmICghZG9ja2VyQ29udGV4dFBhdGggJiYgcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRIPy50cmltKCkpIHtcbiAgICBjb25zdCBwID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSC50cmltKCkpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSBkb2NrZXJDb250ZXh0UGF0aCA9IGZzLnN0YXRTeW5jKHApLmlzRGlyZWN0b3J5KCkgPyBwIDogcGF0aC5kaXJuYW1lKHApO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlciA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9IQU5ETEVSPy50cmltKCkgfHwgZGlzY292ZXJlZC5oYW5kbGVyO1xuICBjb25zdCB1c2VUaGluRG9ja2VyZmlsZSA9IGRpc2NvdmVyZWQudXNlVGhpbkRvY2tlcmZpbGUgPz8gZmFsc2U7XG5cbiAgY29uc3QgbWVtb3J5RW52ID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX01FTU9SWV9NQj8udHJpbSgpO1xuICBjb25zdCBmdW5jdGlvbk1lbW9yeU1iID0gbWVtb3J5RW52XG4gICAgPyBTdHJpbmcocGFyc2VJbnQobWVtb3J5RW52LCAxMCkpXG4gICAgOiAoZGlzY292ZXJlZC5tZW1vcnlNYiAhPSBudWxsID8gU3RyaW5nKGRpc2NvdmVyZWQubWVtb3J5TWIpIDogdW5kZWZpbmVkKTtcblxuICBjb25zdCB0aW1lb3V0RW52ID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX1RJTUVPVVRfU0VDT05EUz8udHJpbSgpO1xuICBjb25zdCBmdW5jdGlvblRpbWVvdXRTZWNvbmRzID0gdGltZW91dEVudlxuICAgID8gcGFyc2VJbnQodGltZW91dEVudiwgMTApXG4gICAgOiBkaXNjb3ZlcmVkLnRpbWVvdXRTZWNvbmRzO1xuXG4gIGxldCBmdW5jdGlvbkNvbmZpZyA9IGRpc2NvdmVyZWQuY29uZmlnO1xuICBjb25zdCBjb25maWdFbnYgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fQ09ORklHPy50cmltKCk7XG4gIGlmIChjb25maWdFbnYpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjb25maWdFbnYpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICBmdW5jdGlvbkNvbmZpZyA9IHsgLi4uZnVuY3Rpb25Db25maWcsIC4uLnBhcnNlZCB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlIGludmFsaWQgSlNPTlxuICAgIH1cbiAgfVxuICBpZiAoZnVuY3Rpb25Db25maWcgJiYgT2JqZWN0LmtleXMoZnVuY3Rpb25Db25maWcpLmxlbmd0aCA9PT0gMCkgZnVuY3Rpb25Db25maWcgPSB1bmRlZmluZWQ7XG5cbiAgY29uc3QgYXBpR3dEZXBsb3ltZW50SnNvbkVudiA9IHByb2Nlc3MuZW52Lk9DSV9BUElHQVRFV0FZX0RFUExPWU1FTlRfSlNPTj8udHJpbSgpO1xuICBjb25zdCBhcGlHd0RlcGxveW1lbnRKc29uUGF0aCA9IGFwaUd3RGVwbG95bWVudEpzb25FbnZcbiAgICA/IHBhdGgucmVzb2x2ZShhcGlHd0RlcGxveW1lbnRKc29uRW52KVxuICAgIDogZG9ja2VyQ29udGV4dFBhdGhcbiAgICAgID8gZW5zdXJlRGVmYXVsdEFwaUd3RGVwbG95bWVudEpzb24oZG9ja2VyQ29udGV4dFBhdGgpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgaWYgKGRvY2tlckNvbnRleHRQYXRoKSB7XG4gICAgZW5zdXJlVGFpbEZ1bmN0aW9uTG9nc1NjcmlwdChkb2NrZXJDb250ZXh0UGF0aCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNvbXBhcnRtZW50SWQsXG4gICAgb2NpckNvbXBhcnRtZW50SWQ6IG9jaXJDb21wYXJ0bWVudElkIHx8IHVuZGVmaW5lZCxcbiAgICB0ZW5hbmN5SWQsXG4gICAgcmVnaW9uLFxuICAgIG5hbWVzcGFjZSxcbiAgICBmdW5jdGlvbkFwcE5hbWU6IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9BUFBfTkFNRSA/PyBkaXNjb3ZlcmVkLmZ1bmN0aW9uQXBwTmFtZSA/PyAnJyxcbiAgICBmdW5jdGlvbk5hbWU6IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9OQU1FID8/IGRpc2NvdmVyZWQuZnVuY3Rpb25OYW1lID8/ICcnLFxuICAgIGZ1bmN0aW9uSmFyUGF0aDogcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRIPy50cmltKCkgfHwgdW5kZWZpbmVkLFxuICAgIGRvY2tlckNvbnRleHRQYXRoOiBkb2NrZXJDb250ZXh0UGF0aCB8fCB1bmRlZmluZWQsXG4gICAgaW1hZ2VUYWcsXG4gICAgaGFuZGxlcjogaGFuZGxlciB8fCB1bmRlZmluZWQsXG4gICAgdXNlVGhpbkRvY2tlcmZpbGUsXG4gICAgb2NpclJlcG9zaXRvcnlOYW1lOiBwcm9jZXNzLmVudi5PQ0lfT0NJUl9SRVBPU0lUT1JZX05BTUUgfHwgdW5kZWZpbmVkLFxuICAgIGZ1bmN0aW9uTWVtb3J5TWI6IGZ1bmN0aW9uTWVtb3J5TWIgfHwgdW5kZWZpbmVkLFxuICAgIGZ1bmN0aW9uVGltZW91dFNlY29uZHM6IGZ1bmN0aW9uVGltZW91dFNlY29uZHMgPz8gdW5kZWZpbmVkLFxuICAgIGZ1bmN0aW9uQ29uZmlnLFxuICAgIGFwaUd3RGVwbG95bWVudEpzb25QYXRoOiBhcGlHd0RlcGxveW1lbnRKc29uUGF0aCB8fCB1bmRlZmluZWQsXG4gICAgYmFja2VuZDogYmFja2VuZENvbmZpZyxcbiAgfTtcbn1cbiJdfQ==
|
package/config/oci-config.ts
CHANGED
|
@@ -262,6 +262,70 @@ function ensureDefaultApiGwDeploymentJson(projectDir: string): string {
|
|
|
262
262
|
return p;
|
|
263
263
|
}
|
|
264
264
|
|
|
265
|
+
const TAIL_FUNCTION_LOGS_SCRIPT = `#!/usr/bin/env node
|
|
266
|
+
/**
|
|
267
|
+
* Tail OCI Functions execution logs. Generated by OCDK.
|
|
268
|
+
* Run from project root after deploy. Requires: OCI CLI, OCI_COMPARTMENT_ID, and .ocdk-outputs.json (created on deploy).
|
|
269
|
+
*/
|
|
270
|
+
const path = require('path');
|
|
271
|
+
const fs = require('fs');
|
|
272
|
+
const { spawnSync } = require('child_process');
|
|
273
|
+
|
|
274
|
+
const dir = process.env.OCDK_PROJECT_DIR || __dirname;
|
|
275
|
+
const outputsPath = path.join(dir, '.ocdk-outputs.json');
|
|
276
|
+
if (!fs.existsSync(outputsPath)) {
|
|
277
|
+
console.error('Run deploy first to create .ocdk-outputs.json in the project root.');
|
|
278
|
+
process.exit(1);
|
|
279
|
+
}
|
|
280
|
+
const compId = process.env.OCI_COMPARTMENT_ID || process.env.OCI_COMPARTMENT_OCID;
|
|
281
|
+
if (!compId) {
|
|
282
|
+
console.error('Set OCI_COMPARTMENT_ID (or OCI_COMPARTMENT_OCID).');
|
|
283
|
+
process.exit(1);
|
|
284
|
+
}
|
|
285
|
+
let out;
|
|
286
|
+
try {
|
|
287
|
+
const raw = fs.readFileSync(outputsPath, 'utf8').replace(/^\uFEFF/, '').trim();
|
|
288
|
+
const first = raw.indexOf('{');
|
|
289
|
+
const last = raw.lastIndexOf('}');
|
|
290
|
+
if (first === -1 || last <= first) throw new Error('No JSON');
|
|
291
|
+
out = JSON.parse(raw.slice(first, last + 1));
|
|
292
|
+
} catch (e) {
|
|
293
|
+
console.error('Invalid or missing .ocdk-outputs.json. Run deploy first.');
|
|
294
|
+
process.exit(1);
|
|
295
|
+
}
|
|
296
|
+
const outputs = out.log_group_id != null ? out : Object.values(out).find((v) => v && typeof v === 'object' && (v.log_group_id != null || v.execution_log_id != null)) || out;
|
|
297
|
+
function val(o, k) {
|
|
298
|
+
const v = o[k];
|
|
299
|
+
if (!v) return undefined;
|
|
300
|
+
if (typeof v === 'string') return v;
|
|
301
|
+
if (v && typeof v.value === 'string') return v.value;
|
|
302
|
+
return undefined;
|
|
303
|
+
}
|
|
304
|
+
const logGroupId = val(outputs, 'log_group_id');
|
|
305
|
+
const executionLogId = val(outputs, 'execution_log_id');
|
|
306
|
+
if (!logGroupId || !executionLogId) {
|
|
307
|
+
console.error('log_group_id or execution_log_id missing in .ocdk-outputs.json');
|
|
308
|
+
process.exit(1);
|
|
309
|
+
}
|
|
310
|
+
const now = new Date();
|
|
311
|
+
const start = new Date(now.getTime() - 10 * 60 * 1000);
|
|
312
|
+
const timeStart = start.toISOString();
|
|
313
|
+
const timeEnd = now.toISOString();
|
|
314
|
+
const scope = compId + '/' + logGroupId + '/' + executionLogId;
|
|
315
|
+
const query = 'search "' + scope + '" | sort by datetime desc | limit 50';
|
|
316
|
+
const r = spawnSync('oci', ['logging-search', 'search-logs', '--search-query', query, '--time-start', timeStart, '--time-end', timeEnd], { stdio: 'inherit', shell: true });
|
|
317
|
+
process.exit(r.status ?? 1);
|
|
318
|
+
`;
|
|
319
|
+
|
|
320
|
+
/** Ensure tail-function-logs.js exists in projectDir; write default if missing. Returns path. */
|
|
321
|
+
function ensureTailFunctionLogsScript(projectDir: string): string {
|
|
322
|
+
const p = path.join(projectDir, 'tail-function-logs.js');
|
|
323
|
+
if (!fs.existsSync(p)) {
|
|
324
|
+
fs.writeFileSync(p, TAIL_FUNCTION_LOGS_SCRIPT, 'utf8');
|
|
325
|
+
}
|
|
326
|
+
return p;
|
|
327
|
+
}
|
|
328
|
+
|
|
265
329
|
/** Read tenancy and region from OCI CLI config. Default file: ~/.oci/config, default profile: DEFAULT. */
|
|
266
330
|
function readTenancyAndRegionFromCliConfig(): { tenancy?: string; region?: string } {
|
|
267
331
|
const configPath = process.env.OCI_CONFIG_FILE || path.join(os.homedir(), '.oci', 'config');
|
|
@@ -479,6 +543,9 @@ export async function getOciConfig(): Promise<OciConfig> {
|
|
|
479
543
|
: dockerContextPath
|
|
480
544
|
? ensureDefaultApiGwDeploymentJson(dockerContextPath)
|
|
481
545
|
: undefined;
|
|
546
|
+
if (dockerContextPath) {
|
|
547
|
+
ensureTailFunctionLogsScript(dockerContextPath);
|
|
548
|
+
}
|
|
482
549
|
|
|
483
550
|
return {
|
|
484
551
|
compartmentId,
|
package/lib/config/oci-config.js
CHANGED
|
@@ -256,6 +256,68 @@ function ensureDefaultApiGwDeploymentJson(projectDir) {
|
|
|
256
256
|
}
|
|
257
257
|
return p;
|
|
258
258
|
}
|
|
259
|
+
const TAIL_FUNCTION_LOGS_SCRIPT = `#!/usr/bin/env node
|
|
260
|
+
/**
|
|
261
|
+
* Tail OCI Functions execution logs. Generated by OCDK.
|
|
262
|
+
* Run from project root after deploy. Requires: OCI CLI, OCI_COMPARTMENT_ID, and .ocdk-outputs.json (created on deploy).
|
|
263
|
+
*/
|
|
264
|
+
const path = require('path');
|
|
265
|
+
const fs = require('fs');
|
|
266
|
+
const { spawnSync } = require('child_process');
|
|
267
|
+
|
|
268
|
+
const dir = process.env.OCDK_PROJECT_DIR || __dirname;
|
|
269
|
+
const outputsPath = path.join(dir, '.ocdk-outputs.json');
|
|
270
|
+
if (!fs.existsSync(outputsPath)) {
|
|
271
|
+
console.error('Run deploy first to create .ocdk-outputs.json in the project root.');
|
|
272
|
+
process.exit(1);
|
|
273
|
+
}
|
|
274
|
+
const compId = process.env.OCI_COMPARTMENT_ID || process.env.OCI_COMPARTMENT_OCID;
|
|
275
|
+
if (!compId) {
|
|
276
|
+
console.error('Set OCI_COMPARTMENT_ID (or OCI_COMPARTMENT_OCID).');
|
|
277
|
+
process.exit(1);
|
|
278
|
+
}
|
|
279
|
+
let out;
|
|
280
|
+
try {
|
|
281
|
+
const raw = fs.readFileSync(outputsPath, 'utf8').replace(/^\uFEFF/, '').trim();
|
|
282
|
+
const first = raw.indexOf('{');
|
|
283
|
+
const last = raw.lastIndexOf('}');
|
|
284
|
+
if (first === -1 || last <= first) throw new Error('No JSON');
|
|
285
|
+
out = JSON.parse(raw.slice(first, last + 1));
|
|
286
|
+
} catch (e) {
|
|
287
|
+
console.error('Invalid or missing .ocdk-outputs.json. Run deploy first.');
|
|
288
|
+
process.exit(1);
|
|
289
|
+
}
|
|
290
|
+
const outputs = out.log_group_id != null ? out : Object.values(out).find((v) => v && typeof v === 'object' && (v.log_group_id != null || v.execution_log_id != null)) || out;
|
|
291
|
+
function val(o, k) {
|
|
292
|
+
const v = o[k];
|
|
293
|
+
if (!v) return undefined;
|
|
294
|
+
if (typeof v === 'string') return v;
|
|
295
|
+
if (v && typeof v.value === 'string') return v.value;
|
|
296
|
+
return undefined;
|
|
297
|
+
}
|
|
298
|
+
const logGroupId = val(outputs, 'log_group_id');
|
|
299
|
+
const executionLogId = val(outputs, 'execution_log_id');
|
|
300
|
+
if (!logGroupId || !executionLogId) {
|
|
301
|
+
console.error('log_group_id or execution_log_id missing in .ocdk-outputs.json');
|
|
302
|
+
process.exit(1);
|
|
303
|
+
}
|
|
304
|
+
const now = new Date();
|
|
305
|
+
const start = new Date(now.getTime() - 10 * 60 * 1000);
|
|
306
|
+
const timeStart = start.toISOString();
|
|
307
|
+
const timeEnd = now.toISOString();
|
|
308
|
+
const scope = compId + '/' + logGroupId + '/' + executionLogId;
|
|
309
|
+
const query = 'search "' + scope + '" | sort by datetime desc | limit 50';
|
|
310
|
+
const r = spawnSync('oci', ['logging-search', 'search-logs', '--search-query', query, '--time-start', timeStart, '--time-end', timeEnd], { stdio: 'inherit', shell: true });
|
|
311
|
+
process.exit(r.status ?? 1);
|
|
312
|
+
`;
|
|
313
|
+
/** Ensure tail-function-logs.js exists in projectDir; write default if missing. Returns path. */
|
|
314
|
+
function ensureTailFunctionLogsScript(projectDir) {
|
|
315
|
+
const p = path.join(projectDir, 'tail-function-logs.js');
|
|
316
|
+
if (!fs.existsSync(p)) {
|
|
317
|
+
fs.writeFileSync(p, TAIL_FUNCTION_LOGS_SCRIPT, 'utf8');
|
|
318
|
+
}
|
|
319
|
+
return p;
|
|
320
|
+
}
|
|
259
321
|
/** Read tenancy and region from OCI CLI config. Default file: ~/.oci/config, default profile: DEFAULT. */
|
|
260
322
|
function readTenancyAndRegionFromCliConfig() {
|
|
261
323
|
const configPath = process.env.OCI_CONFIG_FILE || path.join(os.homedir(), '.oci', 'config');
|
|
@@ -466,6 +528,9 @@ async function getOciConfig() {
|
|
|
466
528
|
: dockerContextPath
|
|
467
529
|
? ensureDefaultApiGwDeploymentJson(dockerContextPath)
|
|
468
530
|
: undefined;
|
|
531
|
+
if (dockerContextPath) {
|
|
532
|
+
ensureTailFunctionLogsScript(dockerContextPath);
|
|
533
|
+
}
|
|
469
534
|
return {
|
|
470
535
|
compartmentId,
|
|
471
536
|
ocirCompartmentId: ocirCompartmentId || undefined,
|
|
@@ -487,4 +552,4 @@ async function getOciConfig() {
|
|
|
487
552
|
backend: backendConfig,
|
|
488
553
|
};
|
|
489
554
|
}
|
|
490
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NpLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvbmZpZy9vY2ktY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkVILGtDQUVDO0FBR0Qsd0NBS0M7QUFpVEQsb0NBcUZDO0FBM2RELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsdUNBQXlCO0FBQ3pCLG1EQUFxQztBQUNyQyxpRUFBbUQ7QUEwQ25ELE1BQU0sNkJBQTZCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FDbEQ7SUFDRSxNQUFNLEVBQUU7UUFDTjtZQUNFLElBQUksRUFBRSxVQUFVO1lBQ2hCLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDO1lBQ25DLE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsMEJBQTBCO2dCQUNoQyxVQUFVLEVBQUUsZ0JBQWdCO2dCQUM1QixvQkFBb0IsRUFBRSxFQUFFO2FBQ3pCO1NBQ0Y7S0FDRjtDQUNGLEVBQ0QsSUFBSSxFQUNKLENBQUMsQ0FDRixDQUFDO0FBRUYscUlBQXFJO0FBQ3hILFFBQUEsbUJBQW1CLEdBQTJCO0lBQ3pELGdCQUFnQixFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUs7SUFDM0YsWUFBWSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUs7SUFDckYsZUFBZSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEtBQUs7SUFDdkYsWUFBWSxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVB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QUcsQ0FBQyw4QkFBOEIsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNsRixNQUFNLHVCQUF1QixHQUFHLHNCQUFzQjtRQUNwRCxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztRQUN0QyxDQUFDLENBQUMsaUJBQWlCO1lBQ2pCLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQyxpQkFBaUIsQ0FBQztZQUNyRCxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRWhCLE9BQU87UUFDTCxhQUFhO1FBQ2IsaUJBQWlCLEVBQUUsaUJBQWlCLElBQUksU0FBUztRQUNqRCxTQUFTO1FBQ1QsTUFBTTtRQUNOLFNBQVM7UUFDVCxlQUFlLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsSUFBSSxVQUFVLENBQUMsZUFBZSxJQUFJLEVBQUU7UUFDdEYsWUFBWSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksVUFBVSxDQUFDLFlBQVksSUFBSSxFQUFFO1FBQzVFLGVBQWUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLElBQUksRUFBRSxJQUFJLFNBQVM7UUFDdkUsaUJBQWlCLEVBQUUsaUJBQWlCLElBQUksU0FBUztRQUNqRCxRQUFRO1FBQ1IsT0FBTyxFQUFFLE9BQU8sSUFBSSxTQUFTO1FBQzdCLGlCQUFpQjtRQUNqQixrQkFBa0IsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixJQUFJLFNBQVM7UUFDckUsZ0JBQWdCLEVBQUUsZ0JBQWdCLElBQUksU0FBUztRQUMvQyxzQkFBc0IsRUFBRSxzQkFBc0IsSUFBSSxTQUFTO1FBQzNELGNBQWM7UUFDZCx1QkFBdUIsRUFBRSx1QkFBdUIsSUFBSSxTQUFTO1FBQzdELE9BQU8sRUFBRSxhQUFhO0tBQ3ZCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPQ0kgQ29uZmlndXJhdGlvblxuICpcbiAqIFNldCB0aGVzZSB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9yIHVwZGF0ZSBkZWZhdWx0czpcbiAqIC0gT0NJX0NPTVBBUlRNRU5UX0lEXG4gKiAtIE9DSV9URU5BTkNZX0lEXG4gKiAtIE9DSV9SRUdJT05cbiAqIC0gT0NJX05BTUVTUEFDRSAoaWYgdW5zZXQsIG9idGFpbmVkIHZpYSBPQ0kgU0RLIGdldE5hbWVzcGFjZSlcbiAqIC0gT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQgKGZvciBPQ0lSOyBtdXN0IGJlIG5vbi1yb290IGZvciBmdWxsIHN0YWNrKVxuICogLSBPQ0lfRlVOQ1RJT05fQVBQX05BTUUgKEZ1bmN0aW9ucyBhcHBsaWNhdGlvbiBuYW1lOyBkZWZhdWx0IGVtcHR5KVxuICogLSBPQ0lfRlVOQ1RJT05fTkFNRSAoRnVuY3Rpb24gbmFtZTsgZGVmYXVsdCBlbXB0eSlcbiAqIC0gT0NJX0ZVTkNUSU9OX0hBTkRMRVIgKEphdmEgRkRLIENNRCBoYW5kbGVyLCBlLmcuIGNvbS5leGFtcGxlLkhhbmRsZXI6OmhhbmRsZVJlcXVlc3Q7IGZyb20gZnVuYy55YW1sIGNtZC9oYW5kbGVyIGlmIHVuc2V0KVxuICogLSBPQ0lfRlVOQ1RJT05fSkFSX1BBVEggKFBhdGggdG8gSkFSIG9yIHByb2plY3QgZGlyIGZvciBmdW5jdGlvbiBpbWFnZTsgZGVmYXVsdCBlbXB0eSlcbiAqIC0gT0NJX0ZVTkNUSU9OX01FTU9SWV9NQiAoZnVuY3Rpb24gbWVtb3J5IGluIE1COyBmcm9tIGZ1bmMueWFtbCBtZW1vcnkgaWYgdW5zZXQpXG4gKiAtIE9DSV9GVU5DVElPTl9USU1FT1VUX1NFQ09ORFMgKGZ1bmN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kczsgZnJvbSBmdW5jLnlhbWwgdGltZW91dCBpZiB1bnNldClcbiAqIC0gT0NJX0ZVTkNUSU9OX0NPTkZJRyAoSlNPTiBvYmplY3Qgc3RyaW5nIGZvciBmdW5jdGlvbiBjb25maWcvZW52OyBtZXJnZWQgd2l0aCBmdW5jLnlhbWwgY29uZmlnKVxuICogLSBPQ0lfQVBJR0FURVdBWV9ERVBMT1lNRU5UX0pTT04gKHBhdGggdG8gQVBJIEdhdGV3YXkgZGVwbG95bWVudCBzcGVjIEpTT047IGRlZmF1bHQgcHJvamVjdCByb290IG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbilcbiAqIC0gT0NES19QUk9KRUNUX0RJUiAoc2V0IGJ5IG9jZGsgQ0xJIHRvIGNhbGxlciBjd2Q7IHVzZWQgdG8gZGlzY292ZXIgZnVuYy55YW1sIGFuZCB0YXJnZXQvKVxuICogLSBPQ0lfU1RBVEVfQlVDS0VUIChmb3IgcmVtb3RlIHN0YXRlKVxuICogLSBPQ0lfU1RBVEVfQkFDS0VORF9UWVBFIChvY2l8aHR0cHxsb2NhbClcbiAqXG4gKiBXaGVuIE9DREtfUFJPSkVDVF9ESVIgaXMgc2V0IChlLmcuIHJ1bm5pbmcgYG5weCBvY2RrIGRlcGxveWAgZnJvbSBhIEphdmEgcHJvamVjdCksIGNvbmZpZ1xuICogZGlzY292ZXJzIGVpdGhlciB0YXJnZXQvKi5qYXIgb3IgcG9tLnhtbCtzcmMvIChhbmQgb3B0aW9uYWxseSBmdW5jLnlhbWwgbmFtZSwgdmVyc2lvbiwgY21kL2hhbmRsZXIpLlxuICogTm8gRG9ja2VyZmlsZSBpcyByZXF1aXJlZOKAlHRoZSBzdGFjayBnZW5lcmF0ZXMgb25lIGluIGxvY2FsLWV4ZWMgKGV4Y2x1ZGluZyBub2RlX21vZHVsZXMgdmlhIC5kb2NrZXJpZ25vcmUpLFxuICogdGhlbiBidWlsZHMsIHRhZ3MgKGZyb20gZnVuYy55YW1sIHZlcnNpb24pLCBhbmQgcHVzaGVzIHRvIE9DSVIuXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIGNvbW1vbiBmcm9tICdvY2ktY29tbW9uJztcbmltcG9ydCAqIGFzIG9iamVjdHN0b3JhZ2UgZnJvbSAnb2NpLW9iamVjdHN0b3JhZ2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9jaUJhY2tlbmRDb25maWcge1xuICB0eXBlOiAnb2NpJyB8ICdodHRwJyB8ICdsb2NhbCc7XG4gIGJ1Y2tldD86IHN0cmluZztcbiAga2V5Pzogc3RyaW5nO1xuICBhZGRyZXNzPzogc3RyaW5nO1xuICB1cGRhdGVNZXRob2Q/OiBzdHJpbmc7XG4gIGxvY2tBZGRyZXNzPzogc3RyaW5nO1xuICB1bmxvY2tBZGRyZXNzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9jaUNvbmZpZyB7XG4gIGNvbXBhcnRtZW50SWQ6IHN0cmluZztcbiAgb2NpckNvbXBhcnRtZW50SWQ/OiBzdHJpbmc7XG4gIHRlbmFuY3lJZDogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIGZ1bmN0aW9uQXBwTmFtZTogc3RyaW5nO1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqIFBhdGggdG8gSkFSIG9yIERvY2tlcmZpbGUgY29udGV4dCBmb3IgZnVuY3Rpb24gaW1hZ2U7IGVtcHR5ID0gbm8gYnVpbGQvZGVwbG95LiAqL1xuICBmdW5jdGlvbkphclBhdGg/OiBzdHJpbmc7XG4gIC8qKiBQYXRoIHRvIGRpcmVjdG9yeSBjb250YWluaW5nIHRhcmdldC8gKGRpc2NvdmVyZWQ7IERvY2tlcmZpbGUgaXMgZ2VuZXJhdGVkIGluIGxvY2FsLWV4ZWMpLiAqL1xuICBkb2NrZXJDb250ZXh0UGF0aD86IHN0cmluZztcbiAgLyoqIEltYWdlIHRhZyBmb3IgT0NJUiAoZnJvbSBmdW5jLnlhbWwgdmVyc2lvbiBvciBPQ0lfSU1BR0VfVEFHOyBkZWZhdWx0ICdsYXRlc3QnKS4gKi9cbiAgaW1hZ2VUYWc/OiBzdHJpbmc7XG4gIC8qKiBKYXZhIEZESyBDTUQgaGFuZGxlciAoZnJvbSBmdW5jLnlhbWwgY21kL2hhbmRsZXIgb3IgT0NJX0ZVTkNUSU9OX0hBTkRMRVI7IGRlZmF1bHQgYmVsb3cpLiAqL1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICAvKiogV2hlbiB0cnVlLCBkZXBsb3kgdXNlcyBhIHRoaW4gRG9ja2VyZmlsZSAoQ09QWSB0YXJnZXQvKi5qYXIgb25seSk7IGZ1bGwgTWF2ZW4gYnVpbGQgb25seSBpbiByZWRlcGxveTpmdW5jdGlvbi4gKi9cbiAgdXNlVGhpbkRvY2tlcmZpbGU/OiBib29sZWFuO1xuICBvY2lyUmVwb3NpdG9yeU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBGdW5jdGlvbiBtZW1vcnkgaW4gTUIgKDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzIpLiBGcm9tIGZ1bmMueWFtbCBtZW1vcnkgb3IgT0NJX0ZVTkNUSU9OX01FTU9SWV9NQi4gKi9cbiAgZnVuY3Rpb25NZW1vcnlNYj86IHN0cmluZztcbiAgLyoqIEZ1bmN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kcyAoMeKAkzMwMCkuIEZyb20gZnVuYy55YW1sIHRpbWVvdXQgb3IgT0NJX0ZVTkNUSU9OX1RJTUVPVVRfU0VDT05EUy4gKi9cbiAgZnVuY3Rpb25UaW1lb3V0U2Vjb25kcz86IG51bWJlcjtcbiAgLyoqIEZ1bmN0aW9uIGNvbmZpZy9lbnYga2V5LXZhbHVlLiBGcm9tIGZ1bmMueWFtbCBjb25maWcgb3IgT0NJX0ZVTkNUSU9OX0NPTkZJRyAoSlNPTiBvYmplY3Qgc3RyaW5nKS4gKi9cbiAgZnVuY3Rpb25Db25maWc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogUGF0aCB0byBBUEkgR2F0ZXdheSBkZXBsb3ltZW50IHNwZWMgSlNPTiAocm91dGVzKS4gVXNlIE9DSV9BUElHQVRFV0FZX0RFUExPWU1FTlRfSlNPTiBvciBkZWZhdWx0IG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbiBpbiBwcm9qZWN0IHJvb3QuICovXG4gIGFwaUd3RGVwbG95bWVudEpzb25QYXRoPzogc3RyaW5nO1xuICBiYWNrZW5kPzogT2NpQmFja2VuZENvbmZpZztcbn1cblxuY29uc3QgREVGQVVMVF9BUElHV19ERVBMT1lNRU5UX0pTT04gPSBKU09OLnN0cmluZ2lmeShcbiAge1xuICAgIHJvdXRlczogW1xuICAgICAge1xuICAgICAgICBwYXRoOiAnL3twYXRoKn0nLFxuICAgICAgICBtZXRob2RzOiBbJ0dFVCcsICdQT1NUJywgJ09QVElPTlMnXSxcbiAgICAgICAgYmFja2VuZDoge1xuICAgICAgICAgIHR5cGU6ICdPUkFDTEVfRlVOQ1RJT05TX0JBQ0tFTkQnLFxuICAgICAgICAgIGZ1bmN0aW9uSWQ6ICcke2Z1bmN0aW9uX2lkfScsXG4gICAgICAgICAgcmVhZFRpbWVvdXRJblNlY29uZHM6IDMwLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICBudWxsLFxuICAyXG4pO1xuXG4vKiogT0NJUiBzaG9ydCByZWdpb24ga2V5cyAoZS5nLiBldS1mcmFua2Z1cnQtMSAtPiBmcmEpLiBVc2VkIHNvIGxvZ2luLCBidWlsZCwgcHVzaCBhbmQgZnVuY3Rpb24gaW1hZ2UgYWxsIHVzZSBzYW1lIHJlZ2lzdHJ5IGhvc3QuICovXG5leHBvcnQgY29uc3QgUkVHSU9OX1RPX09DSVJfSE9TVDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ2V1LWZyYW5rZnVydC0xJzogJ2ZyYScsICd1cy1waG9lbml4LTEnOiAncGh4JywgJ3VzLWFzaGJ1cm4tMSc6ICdpYWQnLCAndWstbG9uZG9uLTEnOiAnbGhyJyxcbiAgJ2FwLXRva3lvLTEnOiAnbnJ0JywgJ2FwLW11bWJhaS0xJzogJ2JvbScsICdhcC1zZW91bC0xJzogJ2ljbicsICdjYS10b3JvbnRvLTEnOiAneXl6JyxcbiAgJ3NhLXNhb3BhdWxvLTEnOiAnZ3J1JywgJ2FwLXN5ZG5leS0xJzogJ3N5ZCcsICdldS16dXJpY2gtMSc6ICd6cmgnLCAnbWUtZHViYWktMSc6ICdkeGInLFxuICAnYXAtb3Nha2EtMSc6ICdraXgnLCAnZXUtYW1zdGVyZGFtLTEnOiAnYW1zJywgJ2FwLXNpbmdhcG9yZS0xJzogJ3NpbicsICdhcC1oeWRlcmFiYWQtMSc6ICdoeWQnLFxuICAnZXUtbWlsYW4tMSc6ICdteHAnLCAnc2Etc2FudGlhZ28tMSc6ICdzY2wnLCAnYXAtbWVsYm91cm5lLTEnOiAnbWVsJywgJ2V1LXN0b2NraG9sbS0xJzogJ2FybicsXG4gICdtZS1qZWRkYWgtMSc6ICdqZWQnLCAnYWYtam9oYW5uZXNidXJnLTEnOiAnam5iJywgJ2lsLWplcnVzYWxlbS0xJzogJ3RsdicsICdteC1xdWVyZXRhcm8tMSc6ICdxcm8nLFxuICAnZXUtbWFyc2VpbGxlLTEnOiAnbXJzJyxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvY2lySG9zdEtleShyZWdpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBSRUdJT05fVE9fT0NJUl9IT1NUW3JlZ2lvbl0gPz8gcmVnaW9uO1xufVxuXG4vKiogRnVsbCBPQ0lSIGltYWdlIFVSTCBmb3IgdGhlIGZ1bmN0aW9uIChyZWdpc3RyeS9uYW1lc3BhY2UvcmVwbzp0YWcpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9jaUltYWdlVXJsKGNvbmZpZzogT2NpQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgcmVnaXN0cnkgPSBgJHtvY2lySG9zdEtleShjb25maWcucmVnaW9uKX0ub2Npci5pb2A7XG4gIGNvbnN0IHJlcG8gPSBjb25maWcub2NpclJlcG9zaXRvcnlOYW1lIHx8IGNvbmZpZy5mdW5jdGlvbk5hbWUgfHwgJ29jaS1mdW5jdGlvbic7XG4gIGNvbnN0IHRhZyA9IGNvbmZpZy5pbWFnZVRhZyB8fCAnbGF0ZXN0JztcbiAgcmV0dXJuIGAke3JlZ2lzdHJ5fS8ke2NvbmZpZy5uYW1lc3BhY2V9LyR7cmVwb306JHt0YWd9YDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBmdW5jdGlvbiBuYW1lIGZyb20gZnVuYy55YW1sIChPQ0kgRnVuY3Rpb25zIGZvcm1hdCkuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJuYW1lOlwiIGxpbmUsIHRyaW1tZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sTmFtZShwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqbmFtZTpcXHMqW1wiJ10/KFteXCInXFxzXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKG0pIHJldHVybiBtWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgY21kL2hhbmRsZXIgZnJvbSBmdW5jLnlhbWwgKE9DSS9GbiBmb3JtYXQpLlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2YgXCJjbWQ6XCIgb3IgXCJoYW5kbGVyOlwiIGxpbmUsIHRyaW1tZWQ7IHVzZWQgYXMgRG9ja2VyIENNRCBmb3IgSmF2YSBGREsuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sSGFuZGxlcihwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgY21kTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eXFxzKmNtZDpcXHMqW1wiJ10/KFteXCInXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKGNtZE1hdGNoKSByZXR1cm4gY21kTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgY29uc3QgaGFuZGxlck1hdGNoID0gY29udGVudC5tYXRjaCgvXlxccypoYW5kbGVyOlxccypbXCInXT8oW15cIidcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAoaGFuZGxlck1hdGNoKSByZXR1cm4gaGFuZGxlck1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgdmVyc2lvbiBmcm9tIGZ1bmMueWFtbCAodXNlZCBhcyBPQ0lSIGltYWdlIHRhZykuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJ2ZXJzaW9uOlwiIGxpbmUsIHRyaW1tZWQ7IHNhbml0aXplZCBmb3IgRG9ja2VyIHRhZyAoYS16QS1aMC05Xy4tKS5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxWZXJzaW9uKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccyp2ZXJzaW9uOlxccypbXCInXT8oW15cIidcXHNcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAobSkge1xuICAgICAgICBjb25zdCByYXcgPSBtWzFdLnRyaW0oKTtcbiAgICAgICAgY29uc3Qgc2FuaXRpemVkID0gcmF3LnJlcGxhY2UoL1teYS16QS1aMC05Xy4tXS9nLCAnLScpLnJlcGxhY2UoLy0rL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpO1xuICAgICAgICByZXR1cm4gc2FuaXRpemVkIHx8IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IFZBTElEX01FTU9SWV9NQiA9IG5ldyBTZXQoWzEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzJdKTtcblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBtZW1vcnkgKE1CKSBmcm9tIGZ1bmMueWFtbC4gT0NJIGFsbG93cyAxMjgsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4LCAzMDcyLlxuICogUmV0dXJucyB0aGUgbnVtYmVyIGlmIHByZXNlbnQgYW5kIHZhbGlkOyBvdGhlcndpc2UgdW5kZWZpbmVkLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbE1lbW9yeShwcm9qZWN0RGlyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqbWVtb3J5OlxccyooXFxkKylcXHMqJC9tKTtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChtWzFdLCAxMCk7XG4gICAgICAgIGlmIChWQUxJRF9NRU1PUllfTUIuaGFzKG4pKSByZXR1cm4gbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgdGltZW91dCAoc2Vjb25kcykgZnJvbSBmdW5jLnlhbWwuIE9DSSBtYXggaXMgMzAwLlxuICogUmV0dXJucyB0aGUgbnVtYmVyIGlmIHByZXNlbnQgYW5kIGluIHJhbmdlIDHigJMzMDA7IG90aGVyd2lzZSB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sVGltZW91dChwcm9qZWN0RGlyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqdGltZW91dDpcXHMqKFxcZCspXFxzKiQvbSk7XG4gICAgICBpZiAobSkge1xuICAgICAgICBjb25zdCBuID0gcGFyc2VJbnQobVsxXSwgMTApO1xuICAgICAgICBpZiAobiA+PSAxICYmIG4gPD0gMzAwKSByZXR1cm4gbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgY29uZmlnIChrZXktdmFsdWUgZW52KSBmcm9tIGZ1bmMueWFtbC4gRXhwZWN0cyBhIHRvcC1sZXZlbCBcImNvbmZpZzpcIiBibG9jayB3aXRoIGtleTogdmFsdWUgbGluZXMuXG4gKiBSZXR1cm5zIGEgcmVjb3JkIG9mIHN0cmluZyBrZXlzIGFuZCBzdHJpbmcgdmFsdWVzOyBlbXB0eSBpZiBub25lIG9yIHBhcnNlIGVycm9yLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbENvbmZpZyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnZnVuYy55YW1sJyk7XG4gIHRyeSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHApKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgICBsZXQgaW5Db25maWcgPSBmYWxzZTtcbiAgICBjb25zdCBjb25maWc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTtcbiAgICAgIGlmICh0cmltbWVkID09PSAnY29uZmlnOicgfHwgL15jb25maWdcXHMqOlxccyokLy50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICAgIGluQ29uZmlnID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaW5Db25maWcpIHtcbiAgICAgICAgaWYgKHRyaW1tZWQgIT09ICcnICYmICFsaW5lLnN0YXJ0c1dpdGgoJyAnKSAmJiAhbGluZS5zdGFydHNXaXRoKCdcXHQnKSkgYnJlYWs7XG4gICAgICAgIGNvbnN0IGt2ID0gbGluZS5tYXRjaCgvXlxccysoW2EtekEtWl9dW2EtekEtWjAtOV8tXSopXFxzKjpcXHMqKC4qKSQvKTtcbiAgICAgICAgaWYgKGt2KSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0ga3ZbMV0udHJpbSgpO1xuICAgICAgICAgIGxldCB2YWwgPSBrdlsyXS50cmltKCk7XG4gICAgICAgICAgaWYgKCh2YWwuc3RhcnRzV2l0aCgnXCInKSAmJiB2YWwuZW5kc1dpdGgoJ1wiJykpIHx8ICh2YWwuc3RhcnRzV2l0aChcIidcIikgJiYgdmFsLmVuZHNXaXRoKFwiJ1wiKSkpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5zbGljZSgxLCAtMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbmZpZ1trZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb25maWcpLmxlbmd0aCA/IGNvbmZpZyA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogRW5zdXJlIG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbiBleGlzdHMgaW4gcHJvamVjdERpcjsgd3JpdGUgZGVmYXVsdCBpZiBtaXNzaW5nLiBSZXR1cm5zIHBhdGguICovXG5mdW5jdGlvbiBlbnN1cmVEZWZhdWx0QXBpR3dEZXBsb3ltZW50SnNvbihwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdvY2lfYXBpZ2F0ZXdheV9kZXBsb3ltZW50Lmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwLCBERUZBVUxUX0FQSUdXX0RFUExPWU1FTlRfSlNPTiwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gcDtcbn1cblxuLyoqIFJlYWQgdGVuYW5jeSBhbmQgcmVnaW9uIGZyb20gT0NJIENMSSBjb25maWcuIERlZmF1bHQgZmlsZTogfi8ub2NpL2NvbmZpZywgZGVmYXVsdCBwcm9maWxlOiBERUZBVUxULiAqL1xuZnVuY3Rpb24gcmVhZFRlbmFuY3lBbmRSZWdpb25Gcm9tQ2xpQ29uZmlnKCk6IHsgdGVuYW5jeT86IHN0cmluZzsgcmVnaW9uPzogc3RyaW5nIH0ge1xuICBjb25zdCBjb25maWdQYXRoID0gcHJvY2Vzcy5lbnYuT0NJX0NPTkZJR19GSUxFIHx8IHBhdGguam9pbihvcy5ob21lZGlyKCksICcub2NpJywgJ2NvbmZpZycpO1xuICBjb25zdCBwcm9maWxlID0gcHJvY2Vzcy5lbnYuT0NJX0NMSV9QUk9GSUxFIHx8ICdERUZBVUxUJztcbiAgdHJ5IHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHJldHVybiB7fTtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgvXFxyP1xcbi8pO1xuICAgIGxldCBpblByb2ZpbGUgPSBmYWxzZTtcbiAgICBjb25zdCByZXN1bHQ6IHsgdGVuYW5jeT86IHN0cmluZzsgcmVnaW9uPzogc3RyaW5nIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTtcbiAgICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ1snKSAmJiB0cmltbWVkLmVuZHNXaXRoKCddJykpIHtcbiAgICAgICAgaW5Qcm9maWxlID0gdHJpbW1lZC5zbGljZSgxLCAtMSkgPT09IHByb2ZpbGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFpblByb2ZpbGUpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZXEgPSB0cmltbWVkLmluZGV4T2YoJz0nKTtcbiAgICAgIGlmIChlcSA8PSAwKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGtleSA9IHRyaW1tZWQuc2xpY2UoMCwgZXEpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgdmFsdWUgPSB0cmltbWVkLnNsaWNlKGVxICsgMSkudHJpbSgpO1xuICAgICAgaWYgKGtleSA9PT0gJ3RlbmFuY3knKSByZXN1bHQudGVuYW5jeSA9IHZhbHVlO1xuICAgICAgaWYgKGtleSA9PT0gJ3JlZ2lvbicpIHJlc3VsdC5yZWdpb24gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbi8qKiBHZXQgb2JqZWN0IHN0b3JhZ2UgbmFtZXNwYWNlIHZpYSBPQ0kgU0RLIChzYW1lIGFzIFwib2NpIG9zIG5zIGdldFwiKS4gVXNlcyB+Ly5vY2kvY29uZmlnLCBERUZBVUxUIHByb2ZpbGUuICovXG5hc3luYyBmdW5jdGlvbiBnZXROYW1lc3BhY2VGcm9tT2NpU2RrKGNvbXBhcnRtZW50SWQ6IHN0cmluZywgcmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBjb25maWdQYXRoID0gcHJvY2Vzcy5lbnYuT0NJX0NPTkZJR19GSUxFIHx8IHBhdGguam9pbihvcy5ob21lZGlyKCksICcub2NpJywgJ2NvbmZpZycpO1xuICBjb25zdCBwcm9maWxlID0gcHJvY2Vzcy5lbnYuT0NJX0NMSV9QUk9GSUxFIHx8ICdERUZBVUxUJztcbiAgdHJ5IHtcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBjb21tb24uQ29uZmlnRmlsZUF1dGhlbnRpY2F0aW9uRGV0YWlsc1Byb3ZpZGVyKGNvbmZpZ1BhdGgsIHByb2ZpbGUpO1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBvYmplY3RzdG9yYWdlLk9iamVjdFN0b3JhZ2VDbGllbnQoeyBhdXRoZW50aWNhdGlvbkRldGFpbHNQcm92aWRlcjogcHJvdmlkZXIgfSk7XG4gICAgY2xpZW50LnJlZ2lvbklkID0gcmVnaW9uO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldE5hbWVzcGFjZSh7XG4gICAgICBjb21wYXJ0bWVudElkLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS52YWx1ZT8udHJpbSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogRmluZCBhIEpBUiB1bmRlciB0YXJnZXQvIChwcmVmZXIgb25lIG1hdGNoaW5nIG5hbWUsIGVsc2UgZmlyc3QgLmphcikuXG4gKi9cbmZ1bmN0aW9uIGZpbmRKYXJJblRhcmdldChwcm9qZWN0RGlyOiBzdHJpbmcsIGZ1bmN0aW9uTmFtZT86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRhcmdldERpciA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAndGFyZ2V0Jyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyh0YXJnZXREaXIpKSByZXR1cm4gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmModGFyZ2V0RGlyKTtcbiAgICBjb25zdCBqYXJzID0gZmlsZXMuZmlsdGVyKChmKSA9PiBmLmVuZHNXaXRoKCcuamFyJykgJiYgIWYuZW5kc1dpdGgoJy1zb3VyY2VzLmphcicpKTtcbiAgICBpZiAoamFycy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKGZ1bmN0aW9uTmFtZSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBqYXJzLmZpbmQoKGopID0+IGoudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmdW5jdGlvbk5hbWUudG9Mb3dlckNhc2UoKSkpO1xuICAgICAgaWYgKG1hdGNoKSByZXR1cm4gcGF0aC5qb2luKHRhcmdldERpciwgbWF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5qb2luKHRhcmdldERpciwgamFyc1swXSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqIFRydWUgaWYgcHJvamVjdCBoYXMgcG9tLnhtbCBhbmQgc3JjLyAoTWF2ZW4gc291cmNlIGxheW91dCBmb3IgYnVpbGQtZnJvbS1zb3VyY2UgRG9ja2VyZmlsZSkuICovXG5mdW5jdGlvbiBoYXNQb21BbmRTcmMocHJvamVjdERpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBvbSA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAncG9tLnhtbCcpO1xuICBjb25zdCBzcmMgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ3NyYycpO1xuICB0cnkge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBvbSkgJiYgZnMuZXhpc3RzU3luYyhzcmMpICYmIGZzLnN0YXRTeW5jKHNyYykuaXNEaXJlY3RvcnkoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc2NvdmVyRnJvbUZ1bmNZYW1sQW5kVGFyZ2V0KCk6IHtcbiAgZnVuY3Rpb25OYW1lPzogc3RyaW5nO1xuICBmdW5jdGlvbkFwcE5hbWU/OiBzdHJpbmc7XG4gIGRvY2tlckNvbnRleHRQYXRoPzogc3RyaW5nO1xuICBpbWFnZVRhZz86IHN0cmluZztcbiAgaGFuZGxlcj86IHN0cmluZztcbiAgdXNlVGhpbkRvY2tlcmZpbGU/OiBib29sZWFuO1xuICBtZW1vcnlNYj86IG51bWJlcjtcbiAgdGltZW91dFNlY29uZHM/OiBudW1iZXI7XG4gIGNvbmZpZz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59IHtcbiAgbGV0IHByb2plY3REaXIgPSBwcm9jZXNzLmVudi5PQ0RLX1BST0pFQ1RfRElSPy50cmltKCk7XG4gIGlmICghcHJvamVjdERpcikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICcub2Nkay1wcm9qZWN0LWRpcicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHByb2plY3REaXIgPSBmcy5yZWFkRmlsZVN5bmMocCwgJ3V0ZjgnKS50cmltKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH1cbiAgaWYgKCFwcm9qZWN0RGlyICYmIHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSD8udHJpbSgpKSB7XG4gICAgY29uc3QgcCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSkFSX1BBVEgudHJpbSgpKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkgcHJvamVjdERpciA9IGZzLnN0YXRTeW5jKHApLmlzRGlyZWN0b3J5KCkgPyBwIDogcGF0aC5kaXJuYW1lKHApO1xuICB9XG4gIGlmICghcHJvamVjdERpcikgcHJvamVjdERpciA9IHByb2Nlc3MuY3dkKCk7XG4gIHByb2plY3REaXIgPSBwcm9qZWN0RGlyID8gcGF0aC5yZXNvbHZlKHByb2plY3REaXIpIDogJyc7XG4gIGlmICghcHJvamVjdERpciB8fCAhZnMuZXhpc3RzU3luYyhwcm9qZWN0RGlyKSkgcmV0dXJuIHt9O1xuXG4gIGNvbnN0IG5hbWVGcm9tWWFtbCA9IGdldEZ1bmNZYW1sTmFtZShwcm9qZWN0RGlyKTtcbiAgY29uc3QgamFyUGF0aCA9IGZpbmRKYXJJblRhcmdldChwcm9qZWN0RGlyLCBuYW1lRnJvbVlhbWwgfHwgdW5kZWZpbmVkKTtcbiAgY29uc3QgaGFzU291cmNlID0gaGFzUG9tQW5kU3JjKHByb2plY3REaXIpO1xuICBpZiAoIWphclBhdGggJiYgIWhhc1NvdXJjZSkgcmV0dXJuIHt9O1xuXG4gIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9OQU1FPy50cmltKCkgfHwgbmFtZUZyb21ZYW1sIHx8IHBhdGguYmFzZW5hbWUocHJvamVjdERpcikgfHwgJ29jaS1mdW5jdGlvbic7XG4gIGNvbnN0IGltYWdlVGFnID0gcHJvY2Vzcy5lbnYuT0NJX0lNQUdFX1RBRz8udHJpbSgpIHx8IGdldEZ1bmNZYW1sVmVyc2lvbihwcm9qZWN0RGlyKTtcbiAgY29uc3QgaGFuZGxlciA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9IQU5ETEVSPy50cmltKCkgfHwgZ2V0RnVuY1lhbWxIYW5kbGVyKHByb2plY3REaXIpO1xuICBjb25zdCB1c2VUaGluRG9ja2VyZmlsZSA9ICEhamFyUGF0aDtcbiAgY29uc3QgbWVtb3J5TWIgPSBnZXRGdW5jWWFtbE1lbW9yeShwcm9qZWN0RGlyKTtcbiAgY29uc3QgdGltZW91dFNlY29uZHMgPSBnZXRGdW5jWWFtbFRpbWVvdXQocHJvamVjdERpcik7XG4gIGNvbnN0IGNvbmZpZyA9IGdldEZ1bmNZYW1sQ29uZmlnKHByb2plY3REaXIpO1xuXG4gIHJldHVybiB7XG4gICAgZnVuY3Rpb25OYW1lLFxuICAgIGZ1bmN0aW9uQXBwTmFtZTogcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0FQUF9OQU1FPy50cmltKCkgfHwgZnVuY3Rpb25OYW1lLFxuICAgIGRvY2tlckNvbnRleHRQYXRoOiBwYXRoLnJlc29sdmUocHJvamVjdERpciksXG4gICAgaW1hZ2VUYWc6IGltYWdlVGFnIHx8IHVuZGVmaW5lZCxcbiAgICBoYW5kbGVyOiBoYW5kbGVyIHx8IHVuZGVmaW5lZCxcbiAgICB1c2VUaGluRG9ja2VyZmlsZSxcbiAgICBtZW1vcnlNYixcbiAgICB0aW1lb3V0U2Vjb25kcyxcbiAgICBjb25maWcsXG4gIH07XG59XG5cbmNvbnN0IGJhY2tlbmRUeXBlID0gKHByb2Nlc3MuZW52Lk9DSV9TVEFURV9CQUNLRU5EX1RZUEUgfHwgJ2xvY2FsJykgYXMgJ29jaScgfCAnaHR0cCcgfCAnbG9jYWwnO1xuXG5jb25zdCBiYWNrZW5kQ29uZmlnOiBPY2lCYWNrZW5kQ29uZmlnIHwgdW5kZWZpbmVkID0gYmFja2VuZFR5cGUgPT09ICdsb2NhbCdcbiAgPyB1bmRlZmluZWRcbiAgOiBiYWNrZW5kVHlwZSA9PT0gJ29jaSdcbiAgICA/IHtcbiAgICAgICAgdHlwZTogJ29jaScsXG4gICAgICAgIGJ1Y2tldDogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0JVQ0tFVCB8fCAndGYtc3RhdGUnLFxuICAgICAgICBrZXk6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9LRVkgfHwgJ2Z1bmN0aW9uLXN0YWNrL3RlcnJhZm9ybS50ZnN0YXRlJyxcbiAgICAgIH1cbiAgICA6IHtcbiAgICAgICAgdHlwZTogJ2h0dHAnLFxuICAgICAgICBhZGRyZXNzOiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfSFRUUF9BRERSRVNTIHx8ICcnLFxuICAgICAgICB1cGRhdGVNZXRob2Q6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9IVFRQX1VQREFURV9NRVRIT0QgfHwgJ1BVVCcsXG4gICAgICAgIGxvY2tBZGRyZXNzOiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfSFRUUF9MT0NLX0FERFJFU1MsXG4gICAgICAgIHVubG9ja0FkZHJlc3M6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9IVFRQX1VOTE9DS19BRERSRVNTLFxuICAgICAgfTtcblxuLyoqXG4gKiBMb2FkIE9DSSBjb25maWcgZnJvbSBlbnYgYW5kIENMSSBjb25maWcuIFdoZW4gT0NJX05BTUVTUEFDRSBpcyB1bnNldCwgZmV0Y2hlcyBpdCB2aWEgT0NJIFNESyAoZ2V0TmFtZXNwYWNlKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9jaUNvbmZpZygpOiBQcm9taXNlPE9jaUNvbmZpZz4ge1xuICBjb25zdCBjbGlDb25maWcgPSByZWFkVGVuYW5jeUFuZFJlZ2lvbkZyb21DbGlDb25maWcoKTtcbiAgY29uc3QgY29tcGFydG1lbnRJZCA9IHByb2Nlc3MuZW52Lk9DSV9DT01QQVJUTUVOVF9JRD8udHJpbSgpIHx8ICdvY2lkMS5jb21wYXJ0bWVudC5vYzEuLmFhYWFhYWEuLi4nO1xuICBjb25zdCBvY2lyQ29tcGFydG1lbnRJZCA9IHByb2Nlc3MuZW52Lk9DSV9PQ0lSX0NPTVBBUlRNRU5UX0lEPy50cmltKCkgfHwgcHJvY2Vzcy5lbnYuT0NJX0NPTVBBUlRNRU5UX0lEPy50cmltKCkgfHwgY29tcGFydG1lbnRJZDtcbiAgY29uc3QgdGVuYW5jeUlkID0gcHJvY2Vzcy5lbnYuT0NJX1RFTkFOQ1lfSUQ/LnRyaW0oKSB8fCBjbGlDb25maWcudGVuYW5jeT8udHJpbSgpIHx8ICdvY2lkMS50ZW5hbmN5Lm9jMS4uYWFhYWFhYS4uLic7XG4gIGNvbnN0IHJlZ2lvbiA9IHByb2Nlc3MuZW52Lk9DSV9SRUdJT04/LnRyaW0oKSB8fCBjbGlDb25maWcucmVnaW9uPy50cmltKCkgfHwgJ2V1LWZyYW5rZnVydC0xJztcblxuICBpZiAoIW9jaXJDb21wYXJ0bWVudElkIHx8IG9jaXJDb21wYXJ0bWVudElkLmluY2x1ZGVzKCdyb290JykpIHtcbiAgICBjb25zb2xlLndhcm4oJ+KaoO+4jyAgV0FSTklORzogT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQgbm90IHNldCBvciBzZXQgdG8gcm9vdCBjb21wYXJ0bWVudC4nKTtcbiAgICBjb25zb2xlLndhcm4oJyAgIFBsZWFzZSBzZXQgT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQgdG8geW91ciBob21lIGNvbXBhcnRtZW50IE9DSUQuJyk7XG4gICAgY29uc29sZS53YXJuKCcgICBFeGFtcGxlOiBleHBvcnQgT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQ9XCJvY2lkMS5jb21wYXJ0bWVudC5vYzEuLmFhYWFhYWEuLi5cIicpO1xuICB9XG5cbiAgbGV0IG5hbWVzcGFjZSA9IHByb2Nlc3MuZW52Lk9DSV9OQU1FU1BBQ0U/LnRyaW0oKTtcbiAgaWYgKCFuYW1lc3BhY2UgfHwgbmFtZXNwYWNlID09PSAneW91ci1uYW1lc3BhY2UnKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBnZXROYW1lc3BhY2VGcm9tT2NpU2RrKGNvbXBhcnRtZW50SWQsIHJlZ2lvbik7XG4gICAgaWYgKHJlc29sdmVkKSBuYW1lc3BhY2UgPSByZXNvbHZlZDtcbiAgICBlbHNlIGlmICghbmFtZXNwYWNlKSBuYW1lc3BhY2UgPSAneW91ci1uYW1lc3BhY2UnO1xuICAgIGlmIChuYW1lc3BhY2UgPT09ICd5b3VyLW5hbWVzcGFjZScpIHtcbiAgICAgIGNvbnNvbGUud2Fybign4pqg77iPICBPQ0lfTkFNRVNQQUNFIG5vdCBzZXQgYW5kIFNESyBjb3VsZCBub3QgcmVzb2x2ZSBpdC4gU2V0IE9DSV9OQU1FU1BBQ0Ugb3IgcnVuIFwib2NpIHNldHVwIGNvbmZpZ1wiLicpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRpc2NvdmVyZWQgPSBkaXNjb3ZlckZyb21GdW5jWWFtbEFuZFRhcmdldCgpO1xuXG4gIGNvbnN0IGltYWdlVGFnID0gcHJvY2Vzcy5lbnYuT0NJX0lNQUdFX1RBRz8udHJpbSgpIHx8IGRpc2NvdmVyZWQuaW1hZ2VUYWcgfHwgJ2xhdGVzdCc7XG5cbiAgbGV0IGRvY2tlckNvbnRleHRQYXRoID0gZGlzY292ZXJlZC5kb2NrZXJDb250ZXh0UGF0aDtcbiAgaWYgKCFkb2NrZXJDb250ZXh0UGF0aCAmJiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSkFSX1BBVEg/LnRyaW0oKSkge1xuICAgIGNvbnN0IHAgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRILnRyaW0oKSk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIGRvY2tlckNvbnRleHRQYXRoID0gZnMuc3RhdFN5bmMocCkuaXNEaXJlY3RvcnkoKSA/IHAgOiBwYXRoLmRpcm5hbWUocCk7XG4gIH1cblxuICBjb25zdCBoYW5kbGVyID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0hBTkRMRVI/LnRyaW0oKSB8fCBkaXNjb3ZlcmVkLmhhbmRsZXI7XG4gIGNvbnN0IHVzZVRoaW5Eb2NrZXJmaWxlID0gZGlzY292ZXJlZC51c2VUaGluRG9ja2VyZmlsZSA/PyBmYWxzZTtcblxuICBjb25zdCBtZW1vcnlFbnYgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fTUVNT1JZX01CPy50cmltKCk7XG4gIGNvbnN0IGZ1bmN0aW9uTWVtb3J5TWIgPSBtZW1vcnlFbnZcbiAgICA/IFN0cmluZyhwYXJzZUludChtZW1vcnlFbnYsIDEwKSlcbiAgICA6IChkaXNjb3ZlcmVkLm1lbW9yeU1iICE9IG51bGwgPyBTdHJpbmcoZGlzY292ZXJlZC5tZW1vcnlNYikgOiB1bmRlZmluZWQpO1xuXG4gIGNvbnN0IHRpbWVvdXRFbnYgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fVElNRU9VVF9TRUNPTkRTPy50cmltKCk7XG4gIGNvbnN0IGZ1bmN0aW9uVGltZW91dFNlY29uZHMgPSB0aW1lb3V0RW52XG4gICAgPyBwYXJzZUludCh0aW1lb3V0RW52LCAxMClcbiAgICA6IGRpc2NvdmVyZWQudGltZW91dFNlY29uZHM7XG5cbiAgbGV0IGZ1bmN0aW9uQ29uZmlnID0gZGlzY292ZXJlZC5jb25maWc7XG4gIGNvbnN0IGNvbmZpZ0VudiA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9DT05GSUc/LnRyaW0oKTtcbiAgaWYgKGNvbmZpZ0Vudikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbmZpZ0VudikgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgIGZ1bmN0aW9uQ29uZmlnID0geyAuLi5mdW5jdGlvbkNvbmZpZywgLi4ucGFyc2VkIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmUgaW52YWxpZCBKU09OXG4gICAgfVxuICB9XG4gIGlmIChmdW5jdGlvbkNvbmZpZyAmJiBPYmplY3Qua2V5cyhmdW5jdGlvbkNvbmZpZykubGVuZ3RoID09PSAwKSBmdW5jdGlvbkNvbmZpZyA9IHVuZGVmaW5lZDtcblxuICBjb25zdCBhcGlHd0RlcGxveW1lbnRKc29uRW52ID0gcHJvY2Vzcy5lbnYuT0NJX0FQSUdBVEVXQVlfREVQTE9ZTUVOVF9KU09OPy50cmltKCk7XG4gIGNvbnN0IGFwaUd3RGVwbG95bWVudEpzb25QYXRoID0gYXBpR3dEZXBsb3ltZW50SnNvbkVudlxuICAgID8gcGF0aC5yZXNvbHZlKGFwaUd3RGVwbG95bWVudEpzb25FbnYpXG4gICAgOiBkb2NrZXJDb250ZXh0UGF0aFxuICAgICAgPyBlbnN1cmVEZWZhdWx0QXBpR3dEZXBsb3ltZW50SnNvbihkb2NrZXJDb250ZXh0UGF0aClcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgY29tcGFydG1lbnRJZCxcbiAgICBvY2lyQ29tcGFydG1lbnRJZDogb2NpckNvbXBhcnRtZW50SWQgfHwgdW5kZWZpbmVkLFxuICAgIHRlbmFuY3lJZCxcbiAgICByZWdpb24sXG4gICAgbmFtZXNwYWNlLFxuICAgIGZ1bmN0aW9uQXBwTmFtZTogcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0FQUF9OQU1FID8/IGRpc2NvdmVyZWQuZnVuY3Rpb25BcHBOYW1lID8/ICcnLFxuICAgIGZ1bmN0aW9uTmFtZTogcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX05BTUUgPz8gZGlzY292ZXJlZC5mdW5jdGlvbk5hbWUgPz8gJycsXG4gICAgZnVuY3Rpb25KYXJQYXRoOiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSkFSX1BBVEg/LnRyaW0oKSB8fCB1bmRlZmluZWQsXG4gICAgZG9ja2VyQ29udGV4dFBhdGg6IGRvY2tlckNvbnRleHRQYXRoIHx8IHVuZGVmaW5lZCxcbiAgICBpbWFnZVRhZyxcbiAgICBoYW5kbGVyOiBoYW5kbGVyIHx8IHVuZGVmaW5lZCxcbiAgICB1c2VUaGluRG9ja2VyZmlsZSxcbiAgICBvY2lyUmVwb3NpdG9yeU5hbWU6IHByb2Nlc3MuZW52Lk9DSV9PQ0lSX1JFUE9TSVRPUllfTkFNRSB8fCB1bmRlZmluZWQsXG4gICAgZnVuY3Rpb25NZW1vcnlNYjogZnVuY3Rpb25NZW1vcnlNYiB8fCB1bmRlZmluZWQsXG4gICAgZnVuY3Rpb25UaW1lb3V0U2Vjb25kczogZnVuY3Rpb25UaW1lb3V0U2Vjb25kcyA/PyB1bmRlZmluZWQsXG4gICAgZnVuY3Rpb25Db25maWcsXG4gICAgYXBpR3dEZXBsb3ltZW50SnNvblBhdGg6IGFwaUd3RGVwbG95bWVudEpzb25QYXRoIHx8IHVuZGVmaW5lZCxcbiAgICBiYWNrZW5kOiBiYWNrZW5kQ29uZmlnLFxuICB9O1xufVxuIl19
|
|
555
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NpLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvbmZpZy9vY2ktY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkVILGtDQUVDO0FBR0Qsd0NBS0M7QUFpWEQsb0NBd0ZDO0FBOWhCRCx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLHVDQUF5QjtBQUN6QixtREFBcUM7QUFDckMsaUVBQW1EO0FBMENuRCxNQUFNLDZCQUE2QixHQUFHLElBQUksQ0FBQyxTQUFTLENBQ2xEO0lBQ0UsTUFBTSxFQUFFO1FBQ047WUFDRSxJQUFJLEVBQUUsVUFBVTtZQUNoQixPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQztZQUNuQyxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLDBCQUEwQjtnQkFDaEMsVUFBVSxFQUFFLGdCQUFnQjtnQkFDNUIsb0JBQW9CLEVBQUUsRUFBRTthQUN6QjtTQUNGO0tBQ0Y7Q0FDRixFQUNELElBQUksRUFDSixDQUFDLENBQ0YsQ0FBQztBQUVGLHFJQUFxSTtBQUN4SCxRQUFBLG1CQUFtQixHQUEyQjtJQUN6RCxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLO0lBQzNGLFlBQVksRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLO0lBQ3JGLGVBQWUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLO0lBQ3ZGLFlBQVksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixF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QUFxQixFQUFFLElBQUksRUFBRSxJQUFJLFNBQVM7UUFDdkUsaUJBQWlCLEVBQUUsaUJBQWlCLElBQUksU0FBUztRQUNqRCxRQUFRO1FBQ1IsT0FBTyxFQUFFLE9BQU8sSUFBSSxTQUFTO1FBQzdCLGlCQUFpQjtRQUNqQixrQkFBa0IsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixJQUFJLFNBQVM7UUFDckUsZ0JBQWdCLEVBQUUsZ0JBQWdCLElBQUksU0FBUztRQUMvQyxzQkFBc0IsRUFBRSxzQkFBc0IsSUFBSSxTQUFTO1FBQzNELGNBQWM7UUFDZCx1QkFBdUIsRUFBRSx1QkFBdUIsSUFBSSxTQUFTO1FBQzdELE9BQU8sRUFBRSxhQUFhO0tBQ3ZCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPQ0kgQ29uZmlndXJhdGlvblxuICpcbiAqIFNldCB0aGVzZSB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9yIHVwZGF0ZSBkZWZhdWx0czpcbiAqIC0gT0NJX0NPTVBBUlRNRU5UX0lEXG4gKiAtIE9DSV9URU5BTkNZX0lEXG4gKiAtIE9DSV9SRUdJT05cbiAqIC0gT0NJX05BTUVTUEFDRSAoaWYgdW5zZXQsIG9idGFpbmVkIHZpYSBPQ0kgU0RLIGdldE5hbWVzcGFjZSlcbiAqIC0gT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQgKGZvciBPQ0lSOyBtdXN0IGJlIG5vbi1yb290IGZvciBmdWxsIHN0YWNrKVxuICogLSBPQ0lfRlVOQ1RJT05fQVBQX05BTUUgKEZ1bmN0aW9ucyBhcHBsaWNhdGlvbiBuYW1lOyBkZWZhdWx0IGVtcHR5KVxuICogLSBPQ0lfRlVOQ1RJT05fTkFNRSAoRnVuY3Rpb24gbmFtZTsgZGVmYXVsdCBlbXB0eSlcbiAqIC0gT0NJX0ZVTkNUSU9OX0hBTkRMRVIgKEphdmEgRkRLIENNRCBoYW5kbGVyLCBlLmcuIGNvbS5leGFtcGxlLkhhbmRsZXI6OmhhbmRsZVJlcXVlc3Q7IGZyb20gZnVuYy55YW1sIGNtZC9oYW5kbGVyIGlmIHVuc2V0KVxuICogLSBPQ0lfRlVOQ1RJT05fSkFSX1BBVEggKFBhdGggdG8gSkFSIG9yIHByb2plY3QgZGlyIGZvciBmdW5jdGlvbiBpbWFnZTsgZGVmYXVsdCBlbXB0eSlcbiAqIC0gT0NJX0ZVTkNUSU9OX01FTU9SWV9NQiAoZnVuY3Rpb24gbWVtb3J5IGluIE1COyBmcm9tIGZ1bmMueWFtbCBtZW1vcnkgaWYgdW5zZXQpXG4gKiAtIE9DSV9GVU5DVElPTl9USU1FT1VUX1NFQ09ORFMgKGZ1bmN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kczsgZnJvbSBmdW5jLnlhbWwgdGltZW91dCBpZiB1bnNldClcbiAqIC0gT0NJX0ZVTkNUSU9OX0NPTkZJRyAoSlNPTiBvYmplY3Qgc3RyaW5nIGZvciBmdW5jdGlvbiBjb25maWcvZW52OyBtZXJnZWQgd2l0aCBmdW5jLnlhbWwgY29uZmlnKVxuICogLSBPQ0lfQVBJR0FURVdBWV9ERVBMT1lNRU5UX0pTT04gKHBhdGggdG8gQVBJIEdhdGV3YXkgZGVwbG95bWVudCBzcGVjIEpTT047IGRlZmF1bHQgcHJvamVjdCByb290IG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbilcbiAqIC0gT0NES19QUk9KRUNUX0RJUiAoc2V0IGJ5IG9jZGsgQ0xJIHRvIGNhbGxlciBjd2Q7IHVzZWQgdG8gZGlzY292ZXIgZnVuYy55YW1sIGFuZCB0YXJnZXQvKVxuICogLSBPQ0lfU1RBVEVfQlVDS0VUIChmb3IgcmVtb3RlIHN0YXRlKVxuICogLSBPQ0lfU1RBVEVfQkFDS0VORF9UWVBFIChvY2l8aHR0cHxsb2NhbClcbiAqXG4gKiBXaGVuIE9DREtfUFJPSkVDVF9ESVIgaXMgc2V0IChlLmcuIHJ1bm5pbmcgYG5weCBvY2RrIGRlcGxveWAgZnJvbSBhIEphdmEgcHJvamVjdCksIGNvbmZpZ1xuICogZGlzY292ZXJzIGVpdGhlciB0YXJnZXQvKi5qYXIgb3IgcG9tLnhtbCtzcmMvIChhbmQgb3B0aW9uYWxseSBmdW5jLnlhbWwgbmFtZSwgdmVyc2lvbiwgY21kL2hhbmRsZXIpLlxuICogTm8gRG9ja2VyZmlsZSBpcyByZXF1aXJlZOKAlHRoZSBzdGFjayBnZW5lcmF0ZXMgb25lIGluIGxvY2FsLWV4ZWMgKGV4Y2x1ZGluZyBub2RlX21vZHVsZXMgdmlhIC5kb2NrZXJpZ25vcmUpLFxuICogdGhlbiBidWlsZHMsIHRhZ3MgKGZyb20gZnVuYy55YW1sIHZlcnNpb24pLCBhbmQgcHVzaGVzIHRvIE9DSVIuXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIGNvbW1vbiBmcm9tICdvY2ktY29tbW9uJztcbmltcG9ydCAqIGFzIG9iamVjdHN0b3JhZ2UgZnJvbSAnb2NpLW9iamVjdHN0b3JhZ2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9jaUJhY2tlbmRDb25maWcge1xuICB0eXBlOiAnb2NpJyB8ICdodHRwJyB8ICdsb2NhbCc7XG4gIGJ1Y2tldD86IHN0cmluZztcbiAga2V5Pzogc3RyaW5nO1xuICBhZGRyZXNzPzogc3RyaW5nO1xuICB1cGRhdGVNZXRob2Q/OiBzdHJpbmc7XG4gIGxvY2tBZGRyZXNzPzogc3RyaW5nO1xuICB1bmxvY2tBZGRyZXNzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9jaUNvbmZpZyB7XG4gIGNvbXBhcnRtZW50SWQ6IHN0cmluZztcbiAgb2NpckNvbXBhcnRtZW50SWQ/OiBzdHJpbmc7XG4gIHRlbmFuY3lJZDogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIGZ1bmN0aW9uQXBwTmFtZTogc3RyaW5nO1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqIFBhdGggdG8gSkFSIG9yIERvY2tlcmZpbGUgY29udGV4dCBmb3IgZnVuY3Rpb24gaW1hZ2U7IGVtcHR5ID0gbm8gYnVpbGQvZGVwbG95LiAqL1xuICBmdW5jdGlvbkphclBhdGg/OiBzdHJpbmc7XG4gIC8qKiBQYXRoIHRvIGRpcmVjdG9yeSBjb250YWluaW5nIHRhcmdldC8gKGRpc2NvdmVyZWQ7IERvY2tlcmZpbGUgaXMgZ2VuZXJhdGVkIGluIGxvY2FsLWV4ZWMpLiAqL1xuICBkb2NrZXJDb250ZXh0UGF0aD86IHN0cmluZztcbiAgLyoqIEltYWdlIHRhZyBmb3IgT0NJUiAoZnJvbSBmdW5jLnlhbWwgdmVyc2lvbiBvciBPQ0lfSU1BR0VfVEFHOyBkZWZhdWx0ICdsYXRlc3QnKS4gKi9cbiAgaW1hZ2VUYWc/OiBzdHJpbmc7XG4gIC8qKiBKYXZhIEZESyBDTUQgaGFuZGxlciAoZnJvbSBmdW5jLnlhbWwgY21kL2hhbmRsZXIgb3IgT0NJX0ZVTkNUSU9OX0hBTkRMRVI7IGRlZmF1bHQgYmVsb3cpLiAqL1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICAvKiogV2hlbiB0cnVlLCBkZXBsb3kgdXNlcyBhIHRoaW4gRG9ja2VyZmlsZSAoQ09QWSB0YXJnZXQvKi5qYXIgb25seSk7IGZ1bGwgTWF2ZW4gYnVpbGQgb25seSBpbiByZWRlcGxveTpmdW5jdGlvbi4gKi9cbiAgdXNlVGhpbkRvY2tlcmZpbGU/OiBib29sZWFuO1xuICBvY2lyUmVwb3NpdG9yeU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBGdW5jdGlvbiBtZW1vcnkgaW4gTUIgKDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzIpLiBGcm9tIGZ1bmMueWFtbCBtZW1vcnkgb3IgT0NJX0ZVTkNUSU9OX01FTU9SWV9NQi4gKi9cbiAgZnVuY3Rpb25NZW1vcnlNYj86IHN0cmluZztcbiAgLyoqIEZ1bmN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kcyAoMeKAkzMwMCkuIEZyb20gZnVuYy55YW1sIHRpbWVvdXQgb3IgT0NJX0ZVTkNUSU9OX1RJTUVPVVRfU0VDT05EUy4gKi9cbiAgZnVuY3Rpb25UaW1lb3V0U2Vjb25kcz86IG51bWJlcjtcbiAgLyoqIEZ1bmN0aW9uIGNvbmZpZy9lbnYga2V5LXZhbHVlLiBGcm9tIGZ1bmMueWFtbCBjb25maWcgb3IgT0NJX0ZVTkNUSU9OX0NPTkZJRyAoSlNPTiBvYmplY3Qgc3RyaW5nKS4gKi9cbiAgZnVuY3Rpb25Db25maWc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogUGF0aCB0byBBUEkgR2F0ZXdheSBkZXBsb3ltZW50IHNwZWMgSlNPTiAocm91dGVzKS4gVXNlIE9DSV9BUElHQVRFV0FZX0RFUExPWU1FTlRfSlNPTiBvciBkZWZhdWx0IG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbiBpbiBwcm9qZWN0IHJvb3QuICovXG4gIGFwaUd3RGVwbG95bWVudEpzb25QYXRoPzogc3RyaW5nO1xuICBiYWNrZW5kPzogT2NpQmFja2VuZENvbmZpZztcbn1cblxuY29uc3QgREVGQVVMVF9BUElHV19ERVBMT1lNRU5UX0pTT04gPSBKU09OLnN0cmluZ2lmeShcbiAge1xuICAgIHJvdXRlczogW1xuICAgICAge1xuICAgICAgICBwYXRoOiAnL3twYXRoKn0nLFxuICAgICAgICBtZXRob2RzOiBbJ0dFVCcsICdQT1NUJywgJ09QVElPTlMnXSxcbiAgICAgICAgYmFja2VuZDoge1xuICAgICAgICAgIHR5cGU6ICdPUkFDTEVfRlVOQ1RJT05TX0JBQ0tFTkQnLFxuICAgICAgICAgIGZ1bmN0aW9uSWQ6ICcke2Z1bmN0aW9uX2lkfScsXG4gICAgICAgICAgcmVhZFRpbWVvdXRJblNlY29uZHM6IDMwLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICBudWxsLFxuICAyXG4pO1xuXG4vKiogT0NJUiBzaG9ydCByZWdpb24ga2V5cyAoZS5nLiBldS1mcmFua2Z1cnQtMSAtPiBmcmEpLiBVc2VkIHNvIGxvZ2luLCBidWlsZCwgcHVzaCBhbmQgZnVuY3Rpb24gaW1hZ2UgYWxsIHVzZSBzYW1lIHJlZ2lzdHJ5IGhvc3QuICovXG5leHBvcnQgY29uc3QgUkVHSU9OX1RPX09DSVJfSE9TVDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ2V1LWZyYW5rZnVydC0xJzogJ2ZyYScsICd1cy1waG9lbml4LTEnOiAncGh4JywgJ3VzLWFzaGJ1cm4tMSc6ICdpYWQnLCAndWstbG9uZG9uLTEnOiAnbGhyJyxcbiAgJ2FwLXRva3lvLTEnOiAnbnJ0JywgJ2FwLW11bWJhaS0xJzogJ2JvbScsICdhcC1zZW91bC0xJzogJ2ljbicsICdjYS10b3JvbnRvLTEnOiAneXl6JyxcbiAgJ3NhLXNhb3BhdWxvLTEnOiAnZ3J1JywgJ2FwLXN5ZG5leS0xJzogJ3N5ZCcsICdldS16dXJpY2gtMSc6ICd6cmgnLCAnbWUtZHViYWktMSc6ICdkeGInLFxuICAnYXAtb3Nha2EtMSc6ICdraXgnLCAnZXUtYW1zdGVyZGFtLTEnOiAnYW1zJywgJ2FwLXNpbmdhcG9yZS0xJzogJ3NpbicsICdhcC1oeWRlcmFiYWQtMSc6ICdoeWQnLFxuICAnZXUtbWlsYW4tMSc6ICdteHAnLCAnc2Etc2FudGlhZ28tMSc6ICdzY2wnLCAnYXAtbWVsYm91cm5lLTEnOiAnbWVsJywgJ2V1LXN0b2NraG9sbS0xJzogJ2FybicsXG4gICdtZS1qZWRkYWgtMSc6ICdqZWQnLCAnYWYtam9oYW5uZXNidXJnLTEnOiAnam5iJywgJ2lsLWplcnVzYWxlbS0xJzogJ3RsdicsICdteC1xdWVyZXRhcm8tMSc6ICdxcm8nLFxuICAnZXUtbWFyc2VpbGxlLTEnOiAnbXJzJyxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvY2lySG9zdEtleShyZWdpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBSRUdJT05fVE9fT0NJUl9IT1NUW3JlZ2lvbl0gPz8gcmVnaW9uO1xufVxuXG4vKiogRnVsbCBPQ0lSIGltYWdlIFVSTCBmb3IgdGhlIGZ1bmN0aW9uIChyZWdpc3RyeS9uYW1lc3BhY2UvcmVwbzp0YWcpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9jaUltYWdlVXJsKGNvbmZpZzogT2NpQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgcmVnaXN0cnkgPSBgJHtvY2lySG9zdEtleShjb25maWcucmVnaW9uKX0ub2Npci5pb2A7XG4gIGNvbnN0IHJlcG8gPSBjb25maWcub2NpclJlcG9zaXRvcnlOYW1lIHx8IGNvbmZpZy5mdW5jdGlvbk5hbWUgfHwgJ29jaS1mdW5jdGlvbic7XG4gIGNvbnN0IHRhZyA9IGNvbmZpZy5pbWFnZVRhZyB8fCAnbGF0ZXN0JztcbiAgcmV0dXJuIGAke3JlZ2lzdHJ5fS8ke2NvbmZpZy5uYW1lc3BhY2V9LyR7cmVwb306JHt0YWd9YDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBmdW5jdGlvbiBuYW1lIGZyb20gZnVuYy55YW1sIChPQ0kgRnVuY3Rpb25zIGZvcm1hdCkuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJuYW1lOlwiIGxpbmUsIHRyaW1tZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sTmFtZShwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqbmFtZTpcXHMqW1wiJ10/KFteXCInXFxzXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKG0pIHJldHVybiBtWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgY21kL2hhbmRsZXIgZnJvbSBmdW5jLnlhbWwgKE9DSS9GbiBmb3JtYXQpLlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2YgXCJjbWQ6XCIgb3IgXCJoYW5kbGVyOlwiIGxpbmUsIHRyaW1tZWQ7IHVzZWQgYXMgRG9ja2VyIENNRCBmb3IgSmF2YSBGREsuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sSGFuZGxlcihwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgY21kTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eXFxzKmNtZDpcXHMqW1wiJ10/KFteXCInXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKGNtZE1hdGNoKSByZXR1cm4gY21kTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgY29uc3QgaGFuZGxlck1hdGNoID0gY29udGVudC5tYXRjaCgvXlxccypoYW5kbGVyOlxccypbXCInXT8oW15cIidcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAoaGFuZGxlck1hdGNoKSByZXR1cm4gaGFuZGxlck1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgdmVyc2lvbiBmcm9tIGZ1bmMueWFtbCAodXNlZCBhcyBPQ0lSIGltYWdlIHRhZykuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJ2ZXJzaW9uOlwiIGxpbmUsIHRyaW1tZWQ7IHNhbml0aXplZCBmb3IgRG9ja2VyIHRhZyAoYS16QS1aMC05Xy4tKS5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxWZXJzaW9uKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccyp2ZXJzaW9uOlxccypbXCInXT8oW15cIidcXHNcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAobSkge1xuICAgICAgICBjb25zdCByYXcgPSBtWzFdLnRyaW0oKTtcbiAgICAgICAgY29uc3Qgc2FuaXRpemVkID0gcmF3LnJlcGxhY2UoL1teYS16QS1aMC05Xy4tXS9nLCAnLScpLnJlcGxhY2UoLy0rL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpO1xuICAgICAgICByZXR1cm4gc2FuaXRpemVkIHx8IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IFZBTElEX01FTU9SWV9NQiA9IG5ldyBTZXQoWzEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzJdKTtcblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBtZW1vcnkgKE1CKSBmcm9tIGZ1bmMueWFtbC4gT0NJIGFsbG93cyAxMjgsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4LCAzMDcyLlxuICogUmV0dXJucyB0aGUgbnVtYmVyIGlmIHByZXNlbnQgYW5kIHZhbGlkOyBvdGhlcndpc2UgdW5kZWZpbmVkLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbE1lbW9yeShwcm9qZWN0RGlyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqbWVtb3J5OlxccyooXFxkKylcXHMqJC9tKTtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChtWzFdLCAxMCk7XG4gICAgICAgIGlmIChWQUxJRF9NRU1PUllfTUIuaGFzKG4pKSByZXR1cm4gbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgdGltZW91dCAoc2Vjb25kcykgZnJvbSBmdW5jLnlhbWwuIE9DSSBtYXggaXMgMzAwLlxuICogUmV0dXJucyB0aGUgbnVtYmVyIGlmIHByZXNlbnQgYW5kIGluIHJhbmdlIDHigJMzMDA7IG90aGVyd2lzZSB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sVGltZW91dChwcm9qZWN0RGlyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqdGltZW91dDpcXHMqKFxcZCspXFxzKiQvbSk7XG4gICAgICBpZiAobSkge1xuICAgICAgICBjb25zdCBuID0gcGFyc2VJbnQobVsxXSwgMTApO1xuICAgICAgICBpZiAobiA+PSAxICYmIG4gPD0gMzAwKSByZXR1cm4gbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgY29uZmlnIChrZXktdmFsdWUgZW52KSBmcm9tIGZ1bmMueWFtbC4gRXhwZWN0cyBhIHRvcC1sZXZlbCBcImNvbmZpZzpcIiBibG9jayB3aXRoIGtleTogdmFsdWUgbGluZXMuXG4gKiBSZXR1cm5zIGEgcmVjb3JkIG9mIHN0cmluZyBrZXlzIGFuZCBzdHJpbmcgdmFsdWVzOyBlbXB0eSBpZiBub25lIG9yIHBhcnNlIGVycm9yLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbENvbmZpZyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnZnVuYy55YW1sJyk7XG4gIHRyeSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHApKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgICBsZXQgaW5Db25maWcgPSBmYWxzZTtcbiAgICBjb25zdCBjb25maWc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTtcbiAgICAgIGlmICh0cmltbWVkID09PSAnY29uZmlnOicgfHwgL15jb25maWdcXHMqOlxccyokLy50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICAgIGluQ29uZmlnID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaW5Db25maWcpIHtcbiAgICAgICAgaWYgKHRyaW1tZWQgIT09ICcnICYmICFsaW5lLnN0YXJ0c1dpdGgoJyAnKSAmJiAhbGluZS5zdGFydHNXaXRoKCdcXHQnKSkgYnJlYWs7XG4gICAgICAgIGNvbnN0IGt2ID0gbGluZS5tYXRjaCgvXlxccysoW2EtekEtWl9dW2EtekEtWjAtOV8tXSopXFxzKjpcXHMqKC4qKSQvKTtcbiAgICAgICAgaWYgKGt2KSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0ga3ZbMV0udHJpbSgpO1xuICAgICAgICAgIGxldCB2YWwgPSBrdlsyXS50cmltKCk7XG4gICAgICAgICAgaWYgKCh2YWwuc3RhcnRzV2l0aCgnXCInKSAmJiB2YWwuZW5kc1dpdGgoJ1wiJykpIHx8ICh2YWwuc3RhcnRzV2l0aChcIidcIikgJiYgdmFsLmVuZHNXaXRoKFwiJ1wiKSkpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5zbGljZSgxLCAtMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbmZpZ1trZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb25maWcpLmxlbmd0aCA/IGNvbmZpZyA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogRW5zdXJlIG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbiBleGlzdHMgaW4gcHJvamVjdERpcjsgd3JpdGUgZGVmYXVsdCBpZiBtaXNzaW5nLiBSZXR1cm5zIHBhdGguICovXG5mdW5jdGlvbiBlbnN1cmVEZWZhdWx0QXBpR3dEZXBsb3ltZW50SnNvbihwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdvY2lfYXBpZ2F0ZXdheV9kZXBsb3ltZW50Lmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwLCBERUZBVUxUX0FQSUdXX0RFUExPWU1FTlRfSlNPTiwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gcDtcbn1cblxuY29uc3QgVEFJTF9GVU5DVElPTl9MT0dTX1NDUklQVCA9IGAjIS91c3IvYmluL2VudiBub2RlXG4vKipcbiAqIFRhaWwgT0NJIEZ1bmN0aW9ucyBleGVjdXRpb24gbG9ncy4gR2VuZXJhdGVkIGJ5IE9DREsuXG4gKiBSdW4gZnJvbSBwcm9qZWN0IHJvb3QgYWZ0ZXIgZGVwbG95LiBSZXF1aXJlczogT0NJIENMSSwgT0NJX0NPTVBBUlRNRU5UX0lELCBhbmQgLm9jZGstb3V0cHV0cy5qc29uIChjcmVhdGVkIG9uIGRlcGxveSkuXG4gKi9cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCB7IHNwYXduU3luYyB9ID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpO1xuXG5jb25zdCBkaXIgPSBwcm9jZXNzLmVudi5PQ0RLX1BST0pFQ1RfRElSIHx8IF9fZGlybmFtZTtcbmNvbnN0IG91dHB1dHNQYXRoID0gcGF0aC5qb2luKGRpciwgJy5vY2RrLW91dHB1dHMuanNvbicpO1xuaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dHNQYXRoKSkge1xuICBjb25zb2xlLmVycm9yKCdSdW4gZGVwbG95IGZpcnN0IHRvIGNyZWF0ZSAub2Nkay1vdXRwdXRzLmpzb24gaW4gdGhlIHByb2plY3Qgcm9vdC4nKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuY29uc3QgY29tcElkID0gcHJvY2Vzcy5lbnYuT0NJX0NPTVBBUlRNRU5UX0lEIHx8IHByb2Nlc3MuZW52Lk9DSV9DT01QQVJUTUVOVF9PQ0lEO1xuaWYgKCFjb21wSWQpIHtcbiAgY29uc29sZS5lcnJvcignU2V0IE9DSV9DT01QQVJUTUVOVF9JRCAob3IgT0NJX0NPTVBBUlRNRU5UX09DSUQpLicpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5sZXQgb3V0O1xudHJ5IHtcbiAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKG91dHB1dHNQYXRoLCAndXRmOCcpLnJlcGxhY2UoL15cXHVGRUZGLywgJycpLnRyaW0oKTtcbiAgY29uc3QgZmlyc3QgPSByYXcuaW5kZXhPZigneycpO1xuICBjb25zdCBsYXN0ID0gcmF3Lmxhc3RJbmRleE9mKCd9Jyk7XG4gIGlmIChmaXJzdCA9PT0gLTEgfHwgbGFzdCA8PSBmaXJzdCkgdGhyb3cgbmV3IEVycm9yKCdObyBKU09OJyk7XG4gIG91dCA9IEpTT04ucGFyc2UocmF3LnNsaWNlKGZpcnN0LCBsYXN0ICsgMSkpO1xufSBjYXRjaCAoZSkge1xuICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIG9yIG1pc3NpbmcgLm9jZGstb3V0cHV0cy5qc29uLiBSdW4gZGVwbG95IGZpcnN0LicpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5jb25zdCBvdXRwdXRzID0gb3V0LmxvZ19ncm91cF9pZCAhPSBudWxsID8gb3V0IDogT2JqZWN0LnZhbHVlcyhvdXQpLmZpbmQoKHYpID0+IHYgJiYgdHlwZW9mIHYgPT09ICdvYmplY3QnICYmICh2LmxvZ19ncm91cF9pZCAhPSBudWxsIHx8IHYuZXhlY3V0aW9uX2xvZ19pZCAhPSBudWxsKSkgfHwgb3V0O1xuZnVuY3Rpb24gdmFsKG8sIGspIHtcbiAgY29uc3QgdiA9IG9ba107XG4gIGlmICghdikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykgcmV0dXJuIHY7XG4gIGlmICh2ICYmIHR5cGVvZiB2LnZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHYudmFsdWU7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5jb25zdCBsb2dHcm91cElkID0gdmFsKG91dHB1dHMsICdsb2dfZ3JvdXBfaWQnKTtcbmNvbnN0IGV4ZWN1dGlvbkxvZ0lkID0gdmFsKG91dHB1dHMsICdleGVjdXRpb25fbG9nX2lkJyk7XG5pZiAoIWxvZ0dyb3VwSWQgfHwgIWV4ZWN1dGlvbkxvZ0lkKSB7XG4gIGNvbnNvbGUuZXJyb3IoJ2xvZ19ncm91cF9pZCBvciBleGVjdXRpb25fbG9nX2lkIG1pc3NpbmcgaW4gLm9jZGstb3V0cHV0cy5qc29uJyk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cbmNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG5jb25zdCBzdGFydCA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgLSAxMCAqIDYwICogMTAwMCk7XG5jb25zdCB0aW1lU3RhcnQgPSBzdGFydC50b0lTT1N0cmluZygpO1xuY29uc3QgdGltZUVuZCA9IG5vdy50b0lTT1N0cmluZygpO1xuY29uc3Qgc2NvcGUgPSBjb21wSWQgKyAnLycgKyBsb2dHcm91cElkICsgJy8nICsgZXhlY3V0aW9uTG9nSWQ7XG5jb25zdCBxdWVyeSA9ICdzZWFyY2ggXCInICsgc2NvcGUgKyAnXCIgfCBzb3J0IGJ5IGRhdGV0aW1lIGRlc2MgfCBsaW1pdCA1MCc7XG5jb25zdCByID0gc3Bhd25TeW5jKCdvY2knLCBbJ2xvZ2dpbmctc2VhcmNoJywgJ3NlYXJjaC1sb2dzJywgJy0tc2VhcmNoLXF1ZXJ5JywgcXVlcnksICctLXRpbWUtc3RhcnQnLCB0aW1lU3RhcnQsICctLXRpbWUtZW5kJywgdGltZUVuZF0sIHsgc3RkaW86ICdpbmhlcml0Jywgc2hlbGw6IHRydWUgfSk7XG5wcm9jZXNzLmV4aXQoci5zdGF0dXMgPz8gMSk7XG5gO1xuXG4vKiogRW5zdXJlIHRhaWwtZnVuY3Rpb24tbG9ncy5qcyBleGlzdHMgaW4gcHJvamVjdERpcjsgd3JpdGUgZGVmYXVsdCBpZiBtaXNzaW5nLiBSZXR1cm5zIHBhdGguICovXG5mdW5jdGlvbiBlbnN1cmVUYWlsRnVuY3Rpb25Mb2dzU2NyaXB0KHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ3RhaWwtZnVuY3Rpb24tbG9ncy5qcycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHAsIFRBSUxfRlVOQ1RJT05fTE9HU19TQ1JJUFQsICd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuIHA7XG59XG5cbi8qKiBSZWFkIHRlbmFuY3kgYW5kIHJlZ2lvbiBmcm9tIE9DSSBDTEkgY29uZmlnLiBEZWZhdWx0IGZpbGU6IH4vLm9jaS9jb25maWcsIGRlZmF1bHQgcHJvZmlsZTogREVGQVVMVC4gKi9cbmZ1bmN0aW9uIHJlYWRUZW5hbmN5QW5kUmVnaW9uRnJvbUNsaUNvbmZpZygpOiB7IHRlbmFuY3k/OiBzdHJpbmc7IHJlZ2lvbj86IHN0cmluZyB9IHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IHByb2Nlc3MuZW52Lk9DSV9DT05GSUdfRklMRSB8fCBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLm9jaScsICdjb25maWcnKTtcbiAgY29uc3QgcHJvZmlsZSA9IHByb2Nlc3MuZW52Lk9DSV9DTElfUFJPRklMRSB8fCAnREVGQVVMVCc7XG4gIHRyeSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSByZXR1cm4ge307XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmLTgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgICBsZXQgaW5Qcm9maWxlID0gZmFsc2U7XG4gICAgY29uc3QgcmVzdWx0OiB7IHRlbmFuY3k/OiBzdHJpbmc7IHJlZ2lvbj86IHN0cmluZyB9ID0ge307XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG4gICAgICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCdbJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnXScpKSB7XG4gICAgICAgIGluUHJvZmlsZSA9IHRyaW1tZWQuc2xpY2UoMSwgLTEpID09PSBwcm9maWxlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghaW5Qcm9maWxlKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGVxID0gdHJpbW1lZC5pbmRleE9mKCc9Jyk7XG4gICAgICBpZiAoZXEgPD0gMCkgY29udGludWU7XG4gICAgICBjb25zdCBrZXkgPSB0cmltbWVkLnNsaWNlKDAsIGVxKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gdHJpbW1lZC5zbGljZShlcSArIDEpLnRyaW0oKTtcbiAgICAgIGlmIChrZXkgPT09ICd0ZW5hbmN5JykgcmVzdWx0LnRlbmFuY3kgPSB2YWx1ZTtcbiAgICAgIGlmIChrZXkgPT09ICdyZWdpb24nKSByZXN1bHQucmVnaW9uID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKiogR2V0IG9iamVjdCBzdG9yYWdlIG5hbWVzcGFjZSB2aWEgT0NJIFNESyAoc2FtZSBhcyBcIm9jaSBvcyBucyBnZXRcIikuIFVzZXMgfi8ub2NpL2NvbmZpZywgREVGQVVMVCBwcm9maWxlLiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlRnJvbU9jaVNkayhjb21wYXJ0bWVudElkOiBzdHJpbmcsIHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IHByb2Nlc3MuZW52Lk9DSV9DT05GSUdfRklMRSB8fCBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLm9jaScsICdjb25maWcnKTtcbiAgY29uc3QgcHJvZmlsZSA9IHByb2Nlc3MuZW52Lk9DSV9DTElfUFJPRklMRSB8fCAnREVGQVVMVCc7XG4gIHRyeSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgY29tbW9uLkNvbmZpZ0ZpbGVBdXRoZW50aWNhdGlvbkRldGFpbHNQcm92aWRlcihjb25maWdQYXRoLCBwcm9maWxlKTtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgb2JqZWN0c3RvcmFnZS5PYmplY3RTdG9yYWdlQ2xpZW50KHsgYXV0aGVudGljYXRpb25EZXRhaWxzUHJvdmlkZXI6IHByb3ZpZGVyIH0pO1xuICAgIGNsaWVudC5yZWdpb25JZCA9IHJlZ2lvbjtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXROYW1lc3BhY2Uoe1xuICAgICAgY29tcGFydG1lbnRJZCxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UudmFsdWU/LnRyaW0oKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEZpbmQgYSBKQVIgdW5kZXIgdGFyZ2V0LyAocHJlZmVyIG9uZSBtYXRjaGluZyBuYW1lLCBlbHNlIGZpcnN0IC5qYXIpLlxuICovXG5mdW5jdGlvbiBmaW5kSmFySW5UYXJnZXQocHJvamVjdERpcjogc3RyaW5nLCBmdW5jdGlvbk5hbWU/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0YXJnZXREaXIgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ3RhcmdldCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0RGlyKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHRhcmdldERpcik7XG4gICAgY29uc3QgamFycyA9IGZpbGVzLmZpbHRlcigoZikgPT4gZi5lbmRzV2l0aCgnLmphcicpICYmICFmLmVuZHNXaXRoKCctc291cmNlcy5qYXInKSk7XG4gICAgaWYgKGphcnMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChmdW5jdGlvbk5hbWUpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gamFycy5maW5kKChqKSA9PiBqLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZnVuY3Rpb25OYW1lLnRvTG93ZXJDYXNlKCkpKTtcbiAgICAgIGlmIChtYXRjaCkgcmV0dXJuIHBhdGguam9pbih0YXJnZXREaXIsIG1hdGNoKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbih0YXJnZXREaXIsIGphcnNbMF0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBUcnVlIGlmIHByb2plY3QgaGFzIHBvbS54bWwgYW5kIHNyYy8gKE1hdmVuIHNvdXJjZSBsYXlvdXQgZm9yIGJ1aWxkLWZyb20tc291cmNlIERvY2tlcmZpbGUpLiAqL1xuZnVuY3Rpb24gaGFzUG9tQW5kU3JjKHByb2plY3REaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwb20gPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ3BvbS54bWwnKTtcbiAgY29uc3Qgc3JjID0gcGF0aC5qb2luKHByb2plY3REaXIsICdzcmMnKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwb20pICYmIGZzLmV4aXN0c1N5bmMoc3JjKSAmJiBmcy5zdGF0U3luYyhzcmMpLmlzRGlyZWN0b3J5KCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNjb3ZlckZyb21GdW5jWWFtbEFuZFRhcmdldCgpOiB7XG4gIGZ1bmN0aW9uTmFtZT86IHN0cmluZztcbiAgZnVuY3Rpb25BcHBOYW1lPzogc3RyaW5nO1xuICBkb2NrZXJDb250ZXh0UGF0aD86IHN0cmluZztcbiAgaW1hZ2VUYWc/OiBzdHJpbmc7XG4gIGhhbmRsZXI/OiBzdHJpbmc7XG4gIHVzZVRoaW5Eb2NrZXJmaWxlPzogYm9vbGVhbjtcbiAgbWVtb3J5TWI/OiBudW1iZXI7XG4gIHRpbWVvdXRTZWNvbmRzPzogbnVtYmVyO1xuICBjb25maWc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufSB7XG4gIGxldCBwcm9qZWN0RGlyID0gcHJvY2Vzcy5lbnYuT0NES19QUk9KRUNUX0RJUj8udHJpbSgpO1xuICBpZiAoIXByb2plY3REaXIpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnLm9jZGstcHJvamVjdC1kaXInKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSBwcm9qZWN0RGlyID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4JykudHJpbSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9XG4gIGlmICghcHJvamVjdERpciAmJiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSkFSX1BBVEg/LnRyaW0oKSkge1xuICAgIGNvbnN0IHAgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRILnRyaW0oKSk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHByb2plY3REaXIgPSBmcy5zdGF0U3luYyhwKS5pc0RpcmVjdG9yeSgpID8gcCA6IHBhdGguZGlybmFtZShwKTtcbiAgfVxuICBpZiAoIXByb2plY3REaXIpIHByb2plY3REaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICBwcm9qZWN0RGlyID0gcHJvamVjdERpciA/IHBhdGgucmVzb2x2ZShwcm9qZWN0RGlyKSA6ICcnO1xuICBpZiAoIXByb2plY3REaXIgfHwgIWZzLmV4aXN0c1N5bmMocHJvamVjdERpcikpIHJldHVybiB7fTtcblxuICBjb25zdCBuYW1lRnJvbVlhbWwgPSBnZXRGdW5jWWFtbE5hbWUocHJvamVjdERpcik7XG4gIGNvbnN0IGphclBhdGggPSBmaW5kSmFySW5UYXJnZXQocHJvamVjdERpciwgbmFtZUZyb21ZYW1sIHx8IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGhhc1NvdXJjZSA9IGhhc1BvbUFuZFNyYyhwcm9qZWN0RGlyKTtcbiAgaWYgKCFqYXJQYXRoICYmICFoYXNTb3VyY2UpIHJldHVybiB7fTtcblxuICBjb25zdCBmdW5jdGlvbk5hbWUgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fTkFNRT8udHJpbSgpIHx8IG5hbWVGcm9tWWFtbCB8fCBwYXRoLmJhc2VuYW1lKHByb2plY3REaXIpIHx8ICdvY2ktZnVuY3Rpb24nO1xuICBjb25zdCBpbWFnZVRhZyA9IHByb2Nlc3MuZW52Lk9DSV9JTUFHRV9UQUc/LnRyaW0oKSB8fCBnZXRGdW5jWWFtbFZlcnNpb24ocHJvamVjdERpcik7XG4gIGNvbnN0IGhhbmRsZXIgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSEFORExFUj8udHJpbSgpIHx8IGdldEZ1bmNZYW1sSGFuZGxlcihwcm9qZWN0RGlyKTtcbiAgY29uc3QgdXNlVGhpbkRvY2tlcmZpbGUgPSAhIWphclBhdGg7XG4gIGNvbnN0IG1lbW9yeU1iID0gZ2V0RnVuY1lhbWxNZW1vcnkocHJvamVjdERpcik7XG4gIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gZ2V0RnVuY1lhbWxUaW1lb3V0KHByb2plY3REaXIpO1xuICBjb25zdCBjb25maWcgPSBnZXRGdW5jWWFtbENvbmZpZyhwcm9qZWN0RGlyKTtcblxuICByZXR1cm4ge1xuICAgIGZ1bmN0aW9uTmFtZSxcbiAgICBmdW5jdGlvbkFwcE5hbWU6IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9BUFBfTkFNRT8udHJpbSgpIHx8IGZ1bmN0aW9uTmFtZSxcbiAgICBkb2NrZXJDb250ZXh0UGF0aDogcGF0aC5yZXNvbHZlKHByb2plY3REaXIpLFxuICAgIGltYWdlVGFnOiBpbWFnZVRhZyB8fCB1bmRlZmluZWQsXG4gICAgaGFuZGxlcjogaGFuZGxlciB8fCB1bmRlZmluZWQsXG4gICAgdXNlVGhpbkRvY2tlcmZpbGUsXG4gICAgbWVtb3J5TWIsXG4gICAgdGltZW91dFNlY29uZHMsXG4gICAgY29uZmlnLFxuICB9O1xufVxuXG5jb25zdCBiYWNrZW5kVHlwZSA9IChwcm9jZXNzLmVudi5PQ0lfU1RBVEVfQkFDS0VORF9UWVBFIHx8ICdsb2NhbCcpIGFzICdvY2knIHwgJ2h0dHAnIHwgJ2xvY2FsJztcblxuY29uc3QgYmFja2VuZENvbmZpZzogT2NpQmFja2VuZENvbmZpZyB8IHVuZGVmaW5lZCA9IGJhY2tlbmRUeXBlID09PSAnbG9jYWwnXG4gID8gdW5kZWZpbmVkXG4gIDogYmFja2VuZFR5cGUgPT09ICdvY2knXG4gICAgPyB7XG4gICAgICAgIHR5cGU6ICdvY2knLFxuICAgICAgICBidWNrZXQ6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9CVUNLRVQgfHwgJ3RmLXN0YXRlJyxcbiAgICAgICAga2V5OiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfS0VZIHx8ICdmdW5jdGlvbi1zdGFjay90ZXJyYWZvcm0udGZzdGF0ZScsXG4gICAgICB9XG4gICAgOiB7XG4gICAgICAgIHR5cGU6ICdodHRwJyxcbiAgICAgICAgYWRkcmVzczogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfQUREUkVTUyB8fCAnJyxcbiAgICAgICAgdXBkYXRlTWV0aG9kOiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfSFRUUF9VUERBVEVfTUVUSE9EIHx8ICdQVVQnLFxuICAgICAgICBsb2NrQWRkcmVzczogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfTE9DS19BRERSRVNTLFxuICAgICAgICB1bmxvY2tBZGRyZXNzOiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfSFRUUF9VTkxPQ0tfQUREUkVTUyxcbiAgICAgIH07XG5cbi8qKlxuICogTG9hZCBPQ0kgY29uZmlnIGZyb20gZW52IGFuZCBDTEkgY29uZmlnLiBXaGVuIE9DSV9OQU1FU1BBQ0UgaXMgdW5zZXQsIGZldGNoZXMgaXQgdmlhIE9DSSBTREsgKGdldE5hbWVzcGFjZSkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPY2lDb25maWcoKTogUHJvbWlzZTxPY2lDb25maWc+IHtcbiAgY29uc3QgY2xpQ29uZmlnID0gcmVhZFRlbmFuY3lBbmRSZWdpb25Gcm9tQ2xpQ29uZmlnKCk7XG4gIGNvbnN0IGNvbXBhcnRtZW50SWQgPSBwcm9jZXNzLmVudi5PQ0lfQ09NUEFSVE1FTlRfSUQ/LnRyaW0oKSB8fCAnb2NpZDEuY29tcGFydG1lbnQub2MxLi5hYWFhYWFhLi4uJztcbiAgY29uc3Qgb2NpckNvbXBhcnRtZW50SWQgPSBwcm9jZXNzLmVudi5PQ0lfT0NJUl9DT01QQVJUTUVOVF9JRD8udHJpbSgpIHx8IHByb2Nlc3MuZW52Lk9DSV9DT01QQVJUTUVOVF9JRD8udHJpbSgpIHx8IGNvbXBhcnRtZW50SWQ7XG4gIGNvbnN0IHRlbmFuY3lJZCA9IHByb2Nlc3MuZW52Lk9DSV9URU5BTkNZX0lEPy50cmltKCkgfHwgY2xpQ29uZmlnLnRlbmFuY3k/LnRyaW0oKSB8fCAnb2NpZDEudGVuYW5jeS5vYzEuLmFhYWFhYWEuLi4nO1xuICBjb25zdCByZWdpb24gPSBwcm9jZXNzLmVudi5PQ0lfUkVHSU9OPy50cmltKCkgfHwgY2xpQ29uZmlnLnJlZ2lvbj8udHJpbSgpIHx8ICdldS1mcmFua2Z1cnQtMSc7XG5cbiAgaWYgKCFvY2lyQ29tcGFydG1lbnRJZCB8fCBvY2lyQ29tcGFydG1lbnRJZC5pbmNsdWRlcygncm9vdCcpKSB7XG4gICAgY29uc29sZS53YXJuKCfimqDvuI8gIFdBUk5JTkc6IE9DSV9PQ0lSX0NPTVBBUlRNRU5UX0lEIG5vdCBzZXQgb3Igc2V0IHRvIHJvb3QgY29tcGFydG1lbnQuJyk7XG4gICAgY29uc29sZS53YXJuKCcgICBQbGVhc2Ugc2V0IE9DSV9PQ0lSX0NPTVBBUlRNRU5UX0lEIHRvIHlvdXIgaG9tZSBjb21wYXJ0bWVudCBPQ0lELicpO1xuICAgIGNvbnNvbGUud2FybignICAgRXhhbXBsZTogZXhwb3J0IE9DSV9PQ0lSX0NPTVBBUlRNRU5UX0lEPVwib2NpZDEuY29tcGFydG1lbnQub2MxLi5hYWFhYWFhLi4uXCInKTtcbiAgfVxuXG4gIGxldCBuYW1lc3BhY2UgPSBwcm9jZXNzLmVudi5PQ0lfTkFNRVNQQUNFPy50cmltKCk7XG4gIGlmICghbmFtZXNwYWNlIHx8IG5hbWVzcGFjZSA9PT0gJ3lvdXItbmFtZXNwYWNlJykge1xuICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgZ2V0TmFtZXNwYWNlRnJvbU9jaVNkayhjb21wYXJ0bWVudElkLCByZWdpb24pO1xuICAgIGlmIChyZXNvbHZlZCkgbmFtZXNwYWNlID0gcmVzb2x2ZWQ7XG4gICAgZWxzZSBpZiAoIW5hbWVzcGFjZSkgbmFtZXNwYWNlID0gJ3lvdXItbmFtZXNwYWNlJztcbiAgICBpZiAobmFtZXNwYWNlID09PSAneW91ci1uYW1lc3BhY2UnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ+KaoO+4jyAgT0NJX05BTUVTUEFDRSBub3Qgc2V0IGFuZCBTREsgY291bGQgbm90IHJlc29sdmUgaXQuIFNldCBPQ0lfTkFNRVNQQUNFIG9yIHJ1biBcIm9jaSBzZXR1cCBjb25maWdcIi4nKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkaXNjb3ZlcmVkID0gZGlzY292ZXJGcm9tRnVuY1lhbWxBbmRUYXJnZXQoKTtcblxuICBjb25zdCBpbWFnZVRhZyA9IHByb2Nlc3MuZW52Lk9DSV9JTUFHRV9UQUc/LnRyaW0oKSB8fCBkaXNjb3ZlcmVkLmltYWdlVGFnIHx8ICdsYXRlc3QnO1xuXG4gIGxldCBkb2NrZXJDb250ZXh0UGF0aCA9IGRpc2NvdmVyZWQuZG9ja2VyQ29udGV4dFBhdGg7XG4gIGlmICghZG9ja2VyQ29udGV4dFBhdGggJiYgcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRIPy50cmltKCkpIHtcbiAgICBjb25zdCBwID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSC50cmltKCkpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSBkb2NrZXJDb250ZXh0UGF0aCA9IGZzLnN0YXRTeW5jKHApLmlzRGlyZWN0b3J5KCkgPyBwIDogcGF0aC5kaXJuYW1lKHApO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlciA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9IQU5ETEVSPy50cmltKCkgfHwgZGlzY292ZXJlZC5oYW5kbGVyO1xuICBjb25zdCB1c2VUaGluRG9ja2VyZmlsZSA9IGRpc2NvdmVyZWQudXNlVGhpbkRvY2tlcmZpbGUgPz8gZmFsc2U7XG5cbiAgY29uc3QgbWVtb3J5RW52ID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX01FTU9SWV9NQj8udHJpbSgpO1xuICBjb25zdCBmdW5jdGlvbk1lbW9yeU1iID0gbWVtb3J5RW52XG4gICAgPyBTdHJpbmcocGFyc2VJbnQobWVtb3J5RW52LCAxMCkpXG4gICAgOiAoZGlzY292ZXJlZC5tZW1vcnlNYiAhPSBudWxsID8gU3RyaW5nKGRpc2NvdmVyZWQubWVtb3J5TWIpIDogdW5kZWZpbmVkKTtcblxuICBjb25zdCB0aW1lb3V0RW52ID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX1RJTUVPVVRfU0VDT05EUz8udHJpbSgpO1xuICBjb25zdCBmdW5jdGlvblRpbWVvdXRTZWNvbmRzID0gdGltZW91dEVudlxuICAgID8gcGFyc2VJbnQodGltZW91dEVudiwgMTApXG4gICAgOiBkaXNjb3ZlcmVkLnRpbWVvdXRTZWNvbmRzO1xuXG4gIGxldCBmdW5jdGlvbkNvbmZpZyA9IGRpc2NvdmVyZWQuY29uZmlnO1xuICBjb25zdCBjb25maWdFbnYgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fQ09ORklHPy50cmltKCk7XG4gIGlmIChjb25maWdFbnYpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjb25maWdFbnYpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICBmdW5jdGlvbkNvbmZpZyA9IHsgLi4uZnVuY3Rpb25Db25maWcsIC4uLnBhcnNlZCB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlIGludmFsaWQgSlNPTlxuICAgIH1cbiAgfVxuICBpZiAoZnVuY3Rpb25Db25maWcgJiYgT2JqZWN0LmtleXMoZnVuY3Rpb25Db25maWcpLmxlbmd0aCA9PT0gMCkgZnVuY3Rpb25Db25maWcgPSB1bmRlZmluZWQ7XG5cbiAgY29uc3QgYXBpR3dEZXBsb3ltZW50SnNvbkVudiA9IHByb2Nlc3MuZW52Lk9DSV9BUElHQVRFV0FZX0RFUExPWU1FTlRfSlNPTj8udHJpbSgpO1xuICBjb25zdCBhcGlHd0RlcGxveW1lbnRKc29uUGF0aCA9IGFwaUd3RGVwbG95bWVudEpzb25FbnZcbiAgICA/IHBhdGgucmVzb2x2ZShhcGlHd0RlcGxveW1lbnRKc29uRW52KVxuICAgIDogZG9ja2VyQ29udGV4dFBhdGhcbiAgICAgID8gZW5zdXJlRGVmYXVsdEFwaUd3RGVwbG95bWVudEpzb24oZG9ja2VyQ29udGV4dFBhdGgpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgaWYgKGRvY2tlckNvbnRleHRQYXRoKSB7XG4gICAgZW5zdXJlVGFpbEZ1bmN0aW9uTG9nc1NjcmlwdChkb2NrZXJDb250ZXh0UGF0aCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNvbXBhcnRtZW50SWQsXG4gICAgb2NpckNvbXBhcnRtZW50SWQ6IG9jaXJDb21wYXJ0bWVudElkIHx8IHVuZGVmaW5lZCxcbiAgICB0ZW5hbmN5SWQsXG4gICAgcmVnaW9uLFxuICAgIG5hbWVzcGFjZSxcbiAgICBmdW5jdGlvbkFwcE5hbWU6IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9BUFBfTkFNRSA/PyBkaXNjb3ZlcmVkLmZ1bmN0aW9uQXBwTmFtZSA/PyAnJyxcbiAgICBmdW5jdGlvbk5hbWU6IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9OQU1FID8/IGRpc2NvdmVyZWQuZnVuY3Rpb25OYW1lID8/ICcnLFxuICAgIGZ1bmN0aW9uSmFyUGF0aDogcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRIPy50cmltKCkgfHwgdW5kZWZpbmVkLFxuICAgIGRvY2tlckNvbnRleHRQYXRoOiBkb2NrZXJDb250ZXh0UGF0aCB8fCB1bmRlZmluZWQsXG4gICAgaW1hZ2VUYWcsXG4gICAgaGFuZGxlcjogaGFuZGxlciB8fCB1bmRlZmluZWQsXG4gICAgdXNlVGhpbkRvY2tlcmZpbGUsXG4gICAgb2NpclJlcG9zaXRvcnlOYW1lOiBwcm9jZXNzLmVudi5PQ0lfT0NJUl9SRVBPU0lUT1JZX05BTUUgfHwgdW5kZWZpbmVkLFxuICAgIGZ1bmN0aW9uTWVtb3J5TWI6IGZ1bmN0aW9uTWVtb3J5TWIgfHwgdW5kZWZpbmVkLFxuICAgIGZ1bmN0aW9uVGltZW91dFNlY29uZHM6IGZ1bmN0aW9uVGltZW91dFNlY29uZHMgPz8gdW5kZWZpbmVkLFxuICAgIGZ1bmN0aW9uQ29uZmlnLFxuICAgIGFwaUd3RGVwbG95bWVudEpzb25QYXRoOiBhcGlHd0RlcGxveW1lbnRKc29uUGF0aCB8fCB1bmRlZmluZWQsXG4gICAgYmFja2VuZDogYmFja2VuZENvbmZpZyxcbiAgfTtcbn1cbiJdfQ==
|
package/lib/lib/oci-stack.js
CHANGED
|
@@ -163,6 +163,9 @@ CMD ["${handler.replace(/"/g, '\\"')}"]
|
|
|
163
163
|
.vscode
|
|
164
164
|
*.log
|
|
165
165
|
oci_apigateway_deployment.json
|
|
166
|
+
.ocdk-outputs.json
|
|
167
|
+
tail-function-logs.js
|
|
168
|
+
tail-function-logs.sh
|
|
166
169
|
`;
|
|
167
170
|
const dockerfileB64 = Buffer.from(dockerfileContent, 'utf8').toString('base64');
|
|
168
171
|
const dockerignoreB64 = Buffer.from(dockerignoreContent, 'utf8').toString('base64');
|
|
@@ -347,6 +350,17 @@ oci_apigateway_deployment.json
|
|
|
347
350
|
},
|
|
348
351
|
});
|
|
349
352
|
executionLog.node.addDependency(functionApp);
|
|
353
|
+
// Write stack outputs to project dir so generated tail-function-logs.js can read them
|
|
354
|
+
const writeOutputsId = 'WriteOutputsToProject';
|
|
355
|
+
this.addOverride(`resource.null_resource.${writeOutputsId}.triggers`, { execution_log_id: executionLog.id });
|
|
356
|
+
this.addOverride(`resource.null_resource.${writeOutputsId}.depends_on`, ['oci_logging_log.ExecutionLog']);
|
|
357
|
+
this.addOverride(`resource.null_resource.${writeOutputsId}.provisioner`, [
|
|
358
|
+
{
|
|
359
|
+
'local-exec': {
|
|
360
|
+
command: 'if [ -n "$OCDK_PROJECT_DIR" ]; then cdktf output -json > "$OCDK_PROJECT_DIR/.ocdk-outputs.json"; fi',
|
|
361
|
+
},
|
|
362
|
+
},
|
|
363
|
+
]);
|
|
350
364
|
new cdktf_1.TerraformOutput(this, 'ocir_repository_name', { value: ocirRepository.displayName, description: 'OCIR repository name' });
|
|
351
365
|
new cdktf_1.TerraformOutput(this, 'api_gateway_host', { value: apiGateway.hostname, description: 'API Gateway hostname' });
|
|
352
366
|
new cdktf_1.TerraformOutput(this, 'function_invoke_url', { value: `https://${apiGateway.hostname}`, description: 'Base URL to invoke the function' });
|
|
@@ -362,4 +376,4 @@ oci_apigateway_deployment.json
|
|
|
362
376
|
}
|
|
363
377
|
}
|
|
364
378
|
exports.OciStack = OciStack;
|
|
365
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NpLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vb2NpLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLGlDQUF3RDtBQUN4RCw2REFBNkQ7QUFDN0QseUdBQW9HO0FBQ3BHLDZEQUF5RDtBQUN6RCxtRUFBK0Q7QUFDL0QsaUZBQTRFO0FBQzVFLHFGQUFnRjtBQUNoRix5RkFBbUY7QUFDbkYsNkVBQXdFO0FBQ3hFLHVGQUFrRjtBQUNsRixpRkFBNkU7QUFDN0UsdUZBQW1GO0FBQ25GLHVGQUFtRjtBQUNuRixpRkFBNkU7QUFDN0UsK0VBQTBFO0FBQzFFLG1FQUErRDtBQUMvRCxxREFBcUY7QUFDckYsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQXdDN0IsTUFBYSxRQUFTLFNBQVEsc0JBQWM7SUFDMUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxNQUFzQjtRQUM5RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLDZDQUE2QztRQUM3QyxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDdEQsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDbEMscUJBQXFCO2dCQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFO29CQUNwQyxHQUFHLEVBQUU7d0JBQ0gsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTTt3QkFDN0IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO3dCQUMzQixHQUFHLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLG9CQUFvQjt3QkFDcEQsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO3FCQUN0QjtpQkFDRixDQUFDLENBQUM7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QyxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO1lBQzlILElBQUksdUJBQWUsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO1lBQ25ILElBQUksdUJBQWUsQ0FBQyxJQUFJLEVBQUUscUJBQXFCLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsV0FBVyxFQUFFLGlDQUFpQyxFQUFFLENBQUMsQ0FBQztZQUM5SSxJQUFJLHVCQUFlLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLENBQUM7WUFDdEcsSUFBSSx1QkFBZSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsd0NBQXdDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pILElBQUksdUJBQWUsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsa0NBQWtDLEVBQUUsQ0FBQyxDQUFDO1FBQzdILENBQUM7UUFFRCx5SEFBeUg7UUFDekgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQ0FBa0MsRUFBRTtZQUNuRCxNQUFNLEVBQUUsWUFBWTtZQUNwQixPQUFPLEVBQUUsbUJBQW1CO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWpVRCw0QkFpVUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IFRlcnJhZm9ybVN0YWNrLCBUZXJyYWZvcm1PdXRwdXQgfSBmcm9tICdjZGt0Zic7XG5pbXBvcnQgeyBPY2lQcm92aWRlciB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9wcm92aWRlcic7XG5pbXBvcnQgeyBBcnRpZmFjdHNDb250YWluZXJSZXBvc2l0b3J5IH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2FydGlmYWN0cy1jb250YWluZXItcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBDb3JlVmNuIH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2NvcmUtdmNuJztcbmltcG9ydCB7IENvcmVTdWJuZXQgfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvY29yZS1zdWJuZXQnO1xuaW1wb3J0IHsgQ29yZVNlY3VyaXR5TGlzdCB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9jb3JlLXNlY3VyaXR5LWxpc3QnO1xuaW1wb3J0IHsgQ29yZVNlcnZpY2VHYXRld2F5IH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2NvcmUtc2VydmljZS1nYXRld2F5JztcbmltcG9ydCB7IERhdGFPY2lDb3JlU2VydmljZXMgfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvZGF0YS1vY2ktY29yZS1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBDb3JlUm91dGVUYWJsZSB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9jb3JlLXJvdXRlLXRhYmxlJztcbmltcG9ydCB7IENvcmVJbnRlcm5ldEdhdGV3YXkgfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvY29yZS1pbnRlcm5ldC1nYXRld2F5JztcbmltcG9ydCB7IEFwaWdhdGV3YXlHYXRld2F5IH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2FwaWdhdGV3YXktZ2F0ZXdheSc7XG5pbXBvcnQgeyBBcGlnYXRld2F5RGVwbG95bWVudCB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9hcGlnYXRld2F5LWRlcGxveW1lbnQnO1xuaW1wb3J0IHsgRnVuY3Rpb25zQXBwbGljYXRpb24gfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvZnVuY3Rpb25zLWFwcGxpY2F0aW9uJztcbmltcG9ydCB7IEZ1bmN0aW9uc0Z1bmN0aW9uIH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2Z1bmN0aW9ucy1mdW5jdGlvbic7XG5pbXBvcnQgeyBMb2dnaW5nTG9nR3JvdXAgfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvbG9nZ2luZy1sb2ctZ3JvdXAnO1xuaW1wb3J0IHsgTG9nZ2luZ0xvZyB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9sb2dnaW5nLWxvZyc7XG5pbXBvcnQgeyBPY2lCYWNrZW5kQ29uZmlnLCBvY2lySG9zdEtleSwgZ2V0T2NpSW1hZ2VVcmwgfSBmcm9tICcuLi9jb25maWcvb2NpLWNvbmZpZyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9jaVN0YWNrQ29uZmlnIHtcbiAgY29tcGFydG1lbnRJZDogc3RyaW5nO1xuICBvY2lyQ29tcGFydG1lbnRJZD86IHN0cmluZztcbiAgdGVuYW5jeUlkOiBzdHJpbmc7XG4gIHJlZ2lvbjogc3RyaW5nO1xuICBuYW1lc3BhY2U6IHN0cmluZztcbiAgLyoqIE9DSSBGdW5jdGlvbnMgYXBwbGljYXRpb24gbmFtZSAoZS5nLiBteS1hcHApLiBTZXQgdmlhIE9DSV9GVU5DVElPTl9BUFBfTkFNRSBvciBwYXNzIGluIGNvbmZpZy4gKi9cbiAgZnVuY3Rpb25BcHBOYW1lOiBzdHJpbmc7XG4gIC8qKiBPQ0kgRnVuY3Rpb24gbmFtZSAoZS5nLiBteS1mdW5jdGlvbikuIFNldCB2aWEgT0NJX0ZVTkNUSU9OX05BTUUgb3IgcGFzcyBpbiBjb25maWcuICovXG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgcGF0aCB0byBKQVIgKG9yIERvY2tlcmZpbGUgY29udGV4dCkgdG8gYnVpbGQgYW5kIGRlcGxveSBhcyB0aGUgZnVuY3Rpb24gaW1hZ2UuIFNldCB2aWEgT0NJX0ZVTkNUSU9OX0pBUl9QQVRILiBFbXB0eSA9IG5vIGZ1bmN0aW9uL2ltYWdlIGJ1aWxkLiAqL1xuICBmdW5jdGlvbkphclBhdGg/OiBzdHJpbmc7XG4gIC8qKiBEaXJlY3RvcnkgY29udGFpbmluZyB0YXJnZXQvIChEb2NrZXJmaWxlIGlzIGdlbmVyYXRlZCBpbiBsb2NhbC1leGVjKS4gV2hlbiBzZXQgd2l0aCBmdW5jdGlvbk5hbWUsIGNyZWF0ZXMgVkNOLCBGdW5jdGlvbiwgQVBJIEdhdGV3YXkuICovXG4gIGRvY2tlckNvbnRleHRQYXRoPzogc3RyaW5nO1xuICAvKiogSW1hZ2UgdGFnIGZvciBPQ0lSIChmcm9tIGZ1bmMueWFtbCB2ZXJzaW9uIG9yIE9DSV9JTUFHRV9UQUc7IGRlZmF1bHQgJ2xhdGVzdCcpLiAqL1xuICBpbWFnZVRhZz86IHN0cmluZztcbiAgLyoqIEphdmEgRkRLIENNRCBoYW5kbGVyIChmcm9tIGZ1bmMueWFtbCBvciBPQ0lfRlVOQ1RJT05fSEFORExFUikuICovXG4gIGhhbmRsZXI/OiBzdHJpbmc7XG4gIC8qKiBXaGVuIHRydWUsIGRlcGxveSB1c2VzIHRoaW4gRG9ja2VyZmlsZSAobm8gTWF2ZW4gaW4gaW1hZ2UpOyBmdWxsIGJ1aWxkIG9ubHkgaW4gcmVkZXBsb3k6ZnVuY3Rpb24uICovXG4gIHVzZVRoaW5Eb2NrZXJmaWxlPzogYm9vbGVhbjtcbiAgb2NpclJlcG9zaXRvcnlOYW1lPzogc3RyaW5nO1xuICAvKiogQVBJIEdhdGV3YXkgZGVwbG95bWVudCBwYXRoIHByZWZpeC4gRGVmYXVsdCAnLycuICovXG4gIGFwaUd3UGF0aFByZWZpeD86IHN0cmluZztcbiAgLyoqIEFQSSBHYXRld2F5IHJvdXRlIHBhdGguIERlZmF1bHQgJy97cGF0aCp9Jy4gKi9cbiAgYXBpR3dSb3V0ZVBhdGg/OiBzdHJpbmc7XG4gIC8qKiBBUEkgR2F0ZXdheSByb3V0ZSBtZXRob2RzLiBEZWZhdWx0IFsnR0VUJywgJ1BPU1QnLCAnT1BUSU9OUyddLiAqL1xuICBhcGlHd01ldGhvZHM/OiBzdHJpbmdbXTtcbiAgLyoqIEZ1bmN0aW9uIG1lbW9yeSBpbiBNQiAoZS5nLiAnMjU2JykuIEZyb20gZnVuYy55YW1sIG9yIE9DSV9GVU5DVElPTl9NRU1PUllfTUIuICovXG4gIGZ1bmN0aW9uTWVtb3J5TWI/OiBzdHJpbmc7XG4gIC8qKiBGdW5jdGlvbiB0aW1lb3V0IGluIHNlY29uZHMuIEZyb20gZnVuYy55YW1sIG9yIE9DSV9GVU5DVElPTl9USU1FT1VUX1NFQ09ORFMuICovXG4gIGZ1bmN0aW9uVGltZW91dFNlY29uZHM/OiBudW1iZXI7XG4gIC8qKiBGdW5jdGlvbiBjb25maWcvZW52IGtleS12YWx1ZS4gRnJvbSBmdW5jLnlhbWwgY29uZmlnIG9yIE9DSV9GVU5DVElPTl9DT05GSUcuICovXG4gIGZ1bmN0aW9uQ29uZmlnPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFBhdGggdG8gQVBJIEdhdGV3YXkgZGVwbG95bWVudCBzcGVjIEpTT04gKHJvdXRlcykuIERlZmF1bHQgb2NpX2FwaWdhdGV3YXlfZGVwbG95bWVudC5qc29uIGluIHByb2plY3Qgcm9vdC4gKi9cbiAgYXBpR3dEZXBsb3ltZW50SnNvblBhdGg/OiBzdHJpbmc7XG4gIGJhY2tlbmQ/OiBPY2lCYWNrZW5kQ29uZmlnO1xufVxuXG5leHBvcnQgY2xhc3MgT2NpU3RhY2sgZXh0ZW5kcyBUZXJyYWZvcm1TdGFjayB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGNvbmZpZzogT2NpU3RhY2tDb25maWcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gQ29uZmlndXJlIFRlcnJhZm9ybSBiYWNrZW5kIChpZiBub3QgbG9jYWwpXG4gICAgaWYgKGNvbmZpZy5iYWNrZW5kICYmIGNvbmZpZy5iYWNrZW5kLnR5cGUgIT09ICdsb2NhbCcpIHtcbiAgICAgIGlmIChjb25maWcuYmFja2VuZC50eXBlID09PSAnb2NpJykge1xuICAgICAgICAvLyBPQ0kgbmF0aXZlIGJhY2tlbmRcbiAgICAgICAgdGhpcy5hZGRPdmVycmlkZSgndGVycmFmb3JtLmJhY2tlbmQnLCB7XG4gICAgICAgICAgb2NpOiB7XG4gICAgICAgICAgICBidWNrZXQ6IGNvbmZpZy5iYWNrZW5kLmJ1Y2tldCxcbiAgICAgICAgICAgIG5hbWVzcGFjZTogY29uZmlnLm5hbWVzcGFjZSxcbiAgICAgICAgICAgIGtleTogY29uZmlnLmJhY2tlbmQua2V5IHx8IGAke2lkfS90ZXJyYWZvcm0udGZzdGF0ZWAsXG4gICAgICAgICAgICByZWdpb246IGNvbmZpZy5yZWdpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGNvbmZpZy5iYWNrZW5kLnR5cGUgPT09ICdodHRwJykge1xuICAgICAgICAvLyBIVFRQIGJhY2tlbmQgKGZvciBPQ0kgT2JqZWN0IFN0b3JhZ2UgdmlhIFJFU1QgQVBJKVxuICAgICAgICBjb25zdCBodHRwQmFja2VuZDogYW55ID0ge1xuICAgICAgICAgIGFkZHJlc3M6IGNvbmZpZy5iYWNrZW5kLmFkZHJlc3MsXG4gICAgICAgICAgdXBkYXRlX21ldGhvZDogY29uZmlnLmJhY2tlbmQudXBkYXRlTWV0aG9kIHx8ICdQVVQnLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoY29uZmlnLmJhY2tlbmQubG9ja0FkZHJlc3MpIHtcbiAgICAgICAgICBodHRwQmFja2VuZC5sb2NrX2FkZHJlc3MgPSBjb25maWcuYmFja2VuZC5sb2NrQWRkcmVzcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmJhY2tlbmQudW5sb2NrQWRkcmVzcykge1xuICAgICAgICAgIGh0dHBCYWNrZW5kLnVubG9ja19hZGRyZXNzID0gY29uZmlnLmJhY2tlbmQudW5sb2NrQWRkcmVzcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZE92ZXJyaWRlKCd0ZXJyYWZvcm0uYmFja2VuZCcsIHtcbiAgICAgICAgICBodHRwOiBodHRwQmFja2VuZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT0NJIFByb3ZpZGVyXG4gICAgbmV3IE9jaVByb3ZpZGVyKHRoaXMsICdvY2knLCB7XG4gICAgICByZWdpb246IGNvbmZpZy5yZWdpb24sXG4gICAgICB0ZW5hbmN5T2NpZDogY29uZmlnLnRlbmFuY3lJZCxcbiAgICB9KTtcblxuICAgIC8vIE9DSVIgQ29udGFpbmVyIFJlcG9zaXRvcnkgKHJvb3QgY29tcGFydG1lbnQgYWxsb3dlZCBpZiBleHBsaWNpdGx5IHNldClcbiAgICBjb25zdCBvY2lyQ29tcGFydG1lbnRJZCA9IGNvbmZpZy5vY2lyQ29tcGFydG1lbnRJZCB8fCBjb25maWcuY29tcGFydG1lbnRJZDtcbiAgICBjb25zdCBvY2lyUmVwb05hbWUgPSBjb25maWcub2NpclJlcG9zaXRvcnlOYW1lIHx8IGNvbmZpZy5mdW5jdGlvbk5hbWUgfHwgJ29jaS1mdW5jdGlvbic7XG5cbiAgICBjb25zdCBvY2lyUmVwb3NpdG9yeSA9IG5ldyBBcnRpZmFjdHNDb250YWluZXJSZXBvc2l0b3J5KHRoaXMsICdPY2lyUmVwb3NpdG9yeScsIHtcbiAgICAgIGNvbXBhcnRtZW50SWQ6IG9jaXJDb21wYXJ0bWVudElkLFxuICAgICAgZGlzcGxheU5hbWU6IG9jaXJSZXBvTmFtZSxcbiAgICAgIGlzUHVibGljOiBmYWxzZSwgLy8gUHJpdmF0ZSByZXBvc2l0b3J5IGJ5IGRlZmF1bHRcbiAgICAgIGlzSW1tdXRhYmxlOiBmYWxzZSwgLy8gQWxsb3cgaW1hZ2UgdXBkYXRlc1xuICAgIH0pO1xuXG4gICAgY29uc3QgZG9ja2VyQ29udGV4dFBhdGggPSAoY29uZmlnLmRvY2tlckNvbnRleHRQYXRoIHx8IGNvbmZpZy5mdW5jdGlvbkphclBhdGgpPy50cmltKCk7XG4gICAgY29uc3QgY3JlYXRlRnVsbFN0YWNrID0gY29uZmlnLmZ1bmN0aW9uTmFtZSAmJiBkb2NrZXJDb250ZXh0UGF0aDtcblxuICAgIGlmIChjcmVhdGVGdWxsU3RhY2spIHtcbiAgICAgIGlmIChvY2lyQ29tcGFydG1lbnRJZC5pbmNsdWRlcygncm9vdCcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnRnVsbCBzdGFjayAoRnVuY3Rpb24gKyBBUEkgR2F0ZXdheSkgcmVxdWlyZXMgYSBub24tcm9vdCBjb21wYXJ0bWVudCBmb3IgT0NJUi4gU2V0IE9DSV9PQ0lSX0NPTVBBUlRNRU5UX0lEIHRvIHlvdXIgaG9tZSBjb21wYXJ0bWVudCBPQ0lELidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZ1bmN0aW9uQ29kZVBhdGggPSBwYXRoLnJlc29sdmUoZG9ja2VyQ29udGV4dFBhdGghKTtcbiAgICAgIGNvbnN0IGltYWdlVGFnID0gY29uZmlnLmltYWdlVGFnIHx8ICdsYXRlc3QnO1xuICAgICAgY29uc3Qgb2NpclJlZ2lzdHJ5ID0gYCR7b2Npckhvc3RLZXkoY29uZmlnLnJlZ2lvbil9Lm9jaXIuaW9gO1xuICAgICAgY29uc3QgaW1hZ2VVcmwgPSBnZXRPY2lJbWFnZVVybChjb25maWcpO1xuICAgICAgY29uc3QgYXBwTmFtZSA9IGNvbmZpZy5mdW5jdGlvbkFwcE5hbWUgfHwgY29uZmlnLmZ1bmN0aW9uTmFtZSE7XG4gICAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBhcHBOYW1lO1xuXG4gICAgICB0aGlzLmFkZE92ZXJyaWRlKCd0ZXJyYWZvcm0ucmVxdWlyZWRfcHJvdmlkZXJzLm51bGwnLCB7XG4gICAgICAgIHNvdXJjZTogJ2hhc2hpY29ycC9udWxsJyxcbiAgICAgICAgdmVyc2lvbjogJ34+IDMuMCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGJ1aWxkQW5kUHVzaEltYWdlSWQgPSAnQnVpbGRBbmRQdXNoSW1hZ2UnO1xuICAgICAgdGhpcy5hZGRPdmVycmlkZShgcmVzb3VyY2UubnVsbF9yZXNvdXJjZS4ke2J1aWxkQW5kUHVzaEltYWdlSWR9LmRlcGVuZHNfb25gLCBbXG4gICAgICAgICdvY2lfYXJ0aWZhY3RzX2NvbnRhaW5lcl9yZXBvc2l0b3J5Lk9jaXJSZXBvc2l0b3J5JyxcbiAgICAgIF0pO1xuICAgICAgdGhpcy5hZGRPdmVycmlkZShgcmVzb3VyY2UubnVsbF9yZXNvdXJjZS4ke2J1aWxkQW5kUHVzaEltYWdlSWR9LnRyaWdnZXJzYCwge1xuICAgICAgICByZXBvX25hbWU6IG9jaXJSZXBvTmFtZSxcbiAgICAgICAgaW1hZ2VfdXJsOiBpbWFnZVVybCxcbiAgICAgICAgaW1hZ2VfdGFnOiBpbWFnZVRhZyxcbiAgICAgICAgaGFuZGxlcjogY29uZmlnLmhhbmRsZXIgfHwgJycsXG4gICAgICAgIHVzZV90aGluX2RvY2tlcmZpbGU6IGNvbmZpZy51c2VUaGluRG9ja2VyZmlsZSA9PT0gdHJ1ZSA/ICcxJyA6ICcwJyxcbiAgICAgICAgbmFtZXNwYWNlOiBjb25maWcubmFtZXNwYWNlLFxuICAgICAgICByZWdpb246IGNvbmZpZy5yZWdpb24sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlZ2lvblAgPSBjb25maWcucmVnaW9uO1xuICAgICAgY29uc3QgbmFtZXNwYWNlUCA9IGNvbmZpZy5uYW1lc3BhY2U7XG4gICAgICBjb25zdCBvY2lyVXNlciA9IHByb2Nlc3MuZW52Lk9DSV9PQ0lSX1VTRVJOQU1FIHx8ICdBVVRPX0RFVEVDVCc7XG4gICAgICBjb25zdCBsb2dpblNjcmlwdCA9IHByb2Nlc3MuZW52Lk9DSV9BVVRIX1RPS0VOXG4gICAgICAgID8gYGV4cG9ydCBPQ0lSX0FVVEhfVE9LRU49XCIke3Byb2Nlc3MuZW52Lk9DSV9BVVRIX1RPS0VOfVwiOyBPQ0lSX1VTRVI9XCIke29jaXJVc2VyfVwiOyBbIFwiJE9DSVJfVVNFUlwiID0gXCJBVVRPX0RFVEVDVFwiIF0gJiYgT0NJUl9VU0VSPVwiJHtuYW1lc3BhY2VQfS91c2VyXCI7IGVjaG8gXCIkT0NJUl9BVVRIX1RPS0VOXCIgfCBkb2NrZXIgbG9naW4gJHtvY2lyUmVnaXN0cnl9IC11IFwiJE9DSVJfVVNFUlwiIC0tcGFzc3dvcmQtc3RkaW4gfHwgZXhpdCAxYFxuICAgICAgICA6IGBvY2kgcmF3LXJlcXVlc3QgLS1yZWdpb24gJHtyZWdpb25QfSAtLWh0dHAtbWV0aG9kIEdFVCAtLXRhcmdldC11cmkgXCJodHRwczovLyR7b2NpclJlZ2lzdHJ5fS8yMDE4MDQxOS9kb2NrZXIvdG9rZW5cIiAyPi9kZXYvbnVsbCB8IChjb21tYW5kIC12IGpxID4vZGV2L251bGwgJiYganEgLXIgLmRhdGEudG9rZW4gfHwgZ3JlcCAtbyAnXCJ0b2tlblwiOlwiW15cIl0qXCInIHwgY3V0IC1kJ1wiJyAtZjQpIHwgZG9ja2VyIGxvZ2luIC11IEJFQVJFUl9UT0tFTiAtLXBhc3N3b3JkLXN0ZGluICR7b2NpclJlZ2lzdHJ5fSB8fCAoZWNobyBcIlNldCBPQ0lfQVVUSF9UT0tFTiBvciBjb25maWd1cmUgT0NJIENMSVwiID4mMjsgZXhpdCAxKWA7XG4gICAgICBjb25zdCBoYW5kbGVyID0gY29uZmlnLmhhbmRsZXIgfHwgJ2NvbS5leGFtcGxlLmZuLkhlbGxvRnVuY3Rpb246OmhhbmRsZVJlcXVlc3QnO1xuICAgICAgY29uc3QgdXNlVGhpbiA9IGNvbmZpZy51c2VUaGluRG9ja2VyZmlsZSA9PT0gdHJ1ZTtcbiAgICAgIGNvbnN0IGRvY2tlcmZpbGVDb250ZW50VGhpbiA9IGBGUk9NIGZucHJvamVjdC9mbi1qYXZhLWZkazpqcmUxNy0xLjEuNVxuV09SS0RJUiAvZnVuY3Rpb25cbkNPUFkgdGFyZ2V0LyouamFyIC9mdW5jdGlvbi9hcHAvXG5DTUQgW1wiJHtoYW5kbGVyLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKX1cIl1cbmA7XG4gICAgICBjb25zdCBkb2NrZXJmaWxlQ29udGVudEZ1bGwgPSBgRlJPTSBmbnByb2plY3QvZm4tamF2YS1mZGstYnVpbGQ6amRrMTctMS4xLjUgYXMgYnVpbGQtc3RhZ2VcbldPUktESVIgL2Z1bmN0aW9uXG5FTlYgTUFWRU5fT1BUUyAtRGh0dHAucHJveHlIb3N0PSAtRGh0dHAucHJveHlQb3J0PSAtRGh0dHBzLnByb3h5SG9zdD0gLURodHRwcy5wcm94eVBvcnQ9IC1EaHR0cC5ub25Qcm94eUhvc3RzPSAtRG1hdmVuLnJlcG8ubG9jYWw9L3Vzci9zaGFyZS9tYXZlbi9yZWYvcmVwb3NpdG9yeVxuQUREIHBvbS54bWwgL2Z1bmN0aW9uL3BvbS54bWxcblJVTiBbXCJtdm5cIiwgXCJwYWNrYWdlXCIsIFwiZGVwZW5kZW5jeTpjb3B5LWRlcGVuZGVuY2llc1wiLCBcIi1EaW5jbHVkZVNjb3BlPXJ1bnRpbWVcIiwgXCItRHNraXBUZXN0cz10cnVlXCIsIFwiLURtZGVwLnByZXBlbmRHcm91cElkPXRydWVcIiwgXCItRG91dHB1dERpcmVjdG9yeT10YXJnZXRcIiwgXCItLWZhaWwtbmV2ZXJcIl1cbkFERCBzcmMgL2Z1bmN0aW9uL3NyY1xuUlVOIFtcIm12blwiLCBcInBhY2thZ2VcIl1cbkZST00gZm5wcm9qZWN0L2ZuLWphdmEtZmRrOmpyZTE3LTEuMS41XG5XT1JLRElSIC9mdW5jdGlvblxuQ09QWSAtLWZyb209YnVpbGQtc3RhZ2UgL2Z1bmN0aW9uL3RhcmdldC8qLmphciAvZnVuY3Rpb24vYXBwL1xuQ01EIFtcIiR7aGFuZGxlci5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJyl9XCJdXG5gO1xuICAgICAgY29uc3QgZG9ja2VyZmlsZUNvbnRlbnQgPSB1c2VUaGluID8gZG9ja2VyZmlsZUNvbnRlbnRUaGluIDogZG9ja2VyZmlsZUNvbnRlbnRGdWxsO1xuICAgICAgY29uc3QgZG9ja2VyaWdub3JlQ29udGVudCA9IGBub2RlX21vZHVsZXNcbi5naXRcbioubWRcbi5lbnZcbi5pZGVhXG4udnNjb2RlXG4qLmxvZ1xub2NpX2FwaWdhdGV3YXlfZGVwbG95bWVudC5qc29uXG5gO1xuICAgICAgY29uc3QgZG9ja2VyZmlsZUI2NCA9IEJ1ZmZlci5mcm9tKGRvY2tlcmZpbGVDb250ZW50LCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgIGNvbnN0IGRvY2tlcmlnbm9yZUI2NCA9IEJ1ZmZlci5mcm9tKGRvY2tlcmlnbm9yZUNvbnRlbnQsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgLy8gR2VuZXJhdGUgRG9ja2VyZmlsZSBhbmQgLmRvY2tlcmlnbm9yZSBpbiBsb2NhbC1leGVjIG9ubHkgaWYgbWlzc2luZzsgaWYgdGhleSBleGlzdCB1c2UgYXMtaXMuIFRoZW4gbG9naW4sIGJ1aWxkLCBwdXNoLlxuICAgICAgdGhpcy5hZGRPdmVycmlkZShgcmVzb3VyY2UubnVsbF9yZXNvdXJjZS4ke2J1aWxkQW5kUHVzaEltYWdlSWR9LnByb3Zpc2lvbmVyYCwgW1xuICAgICAgICB7XG4gICAgICAgICAgJ2xvY2FsLWV4ZWMnOiB7XG4gICAgICAgICAgICBjb21tYW5kOiAnY2QgXCIkRlVOQ1RJT05fQ09ERV9QQVRIXCIgJiYgKFsgLWYgRG9ja2VyZmlsZSBdIHx8IChlY2hvIFwiJERPQ0tFUkZJTEVfQjY0XCIgfCBiYXNlNjQgLWQgPiBEb2NrZXJmaWxlKSkgJiYgKFsgLWYgLmRvY2tlcmlnbm9yZSBdIHx8IChlY2hvIFwiJERPQ0tFUklHTk9SRV9CNjRcIiB8IGJhc2U2NCAtZCA+IC5kb2NrZXJpZ25vcmUpKScsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgICBGVU5DVElPTl9DT0RFX1BBVEg6IGZ1bmN0aW9uQ29kZVBhdGgsXG4gICAgICAgICAgICAgIERPQ0tFUkZJTEVfQjY0OiBkb2NrZXJmaWxlQjY0LFxuICAgICAgICAgICAgICBET0NLRVJJR05PUkVfQjY0OiBkb2NrZXJpZ25vcmVCNjQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgJ2xvY2FsLWV4ZWMnOiB7IGNvbW1hbmQ6IGxvZ2luU2NyaXB0LCBvbl9mYWlsdXJlOiAnY29udGludWUnIH0gfSxcbiAgICAgICAgeyAnbG9jYWwtZXhlYyc6IHsgY29tbWFuZDogYGNkIFwiJHtmdW5jdGlvbkNvZGVQYXRoLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKX1cIiAmJiBkb2NrZXIgYnVpbGQgLS1wbGF0Zm9ybSBsaW51eC9hbWQ2NCAtdCAke2ltYWdlVXJsfSAuYCB9IH0sXG4gICAgICAgIHsgJ2xvY2FsLWV4ZWMnOiB7IGNvbW1hbmQ6IGBkb2NrZXIgcHVzaCAke2ltYWdlVXJsfWAgfSB9LFxuICAgICAgXSk7XG5cbiAgICAgIGNvbnN0IHZjbiA9IG5ldyBDb3JlVmNuKHRoaXMsICdWY24nLCB7XG4gICAgICAgIGNvbXBhcnRtZW50SWQ6IGNvbmZpZy5jb21wYXJ0bWVudElkLFxuICAgICAgICBkaXNwbGF5TmFtZTogYCR7cmVzb3VyY2VOYW1lfS12Y25gLFxuICAgICAgICBjaWRyQmxvY2tzOiBbJzEwLjAuMC4wLzE2J10sXG4gICAgICAgIGRuc0xhYmVsOiAnYXBwZm4nLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwdWJsaWNTdWJuZXQgPSBuZXcgQ29yZVN1Ym5ldCh0aGlzLCAnUHVibGljU3VibmV0Jywge1xuICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgdmNuSWQ6IHZjbi5pZCxcbiAgICAgICAgZGlzcGxheU5hbWU6IGAke3Jlc291cmNlTmFtZX0tcHVibGljYCxcbiAgICAgICAgY2lkckJsb2NrOiAnMTAuMC4xLjAvMjQnLFxuICAgICAgICBkbnNMYWJlbDogJ3B1YmxpYycsXG4gICAgICAgIHByb2hpYml0UHVibGljSXBPblZuaWM6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwcml2YXRlU3VibmV0ID0gbmV3IENvcmVTdWJuZXQodGhpcywgJ1ByaXZhdGVTdWJuZXQnLCB7XG4gICAgICAgIGNvbXBhcnRtZW50SWQ6IGNvbmZpZy5jb21wYXJ0bWVudElkLFxuICAgICAgICB2Y25JZDogdmNuLmlkLFxuICAgICAgICBkaXNwbGF5TmFtZTogYCR7cmVzb3VyY2VOYW1lfS1wcml2YXRlYCxcbiAgICAgICAgY2lkckJsb2NrOiAnMTAuMC4yLjAvMjQnLFxuICAgICAgICBkbnNMYWJlbDogJ3ByaXZhdGUnLFxuICAgICAgICBwcm9oaWJpdFB1YmxpY0lwT25WbmljOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHB1YmxpY1NsID0gbmV3IENvcmVTZWN1cml0eUxpc3QodGhpcywgJ1B1YmxpY1NlY3VyaXR5TGlzdCcsIHtcbiAgICAgICAgY29tcGFydG1lbnRJZDogY29uZmlnLmNvbXBhcnRtZW50SWQsXG4gICAgICAgIHZjbklkOiB2Y24uaWQsXG4gICAgICAgIGRpc3BsYXlOYW1lOiBgJHtyZXNvdXJjZU5hbWV9LXB1YmxpYy1zbGAsXG4gICAgICAgIGluZ3Jlc3NTZWN1cml0eVJ1bGVzOiBbXG4gICAgICAgICAgeyBwcm90b2NvbDogJzYnLCBzb3VyY2U6ICcwLjAuMC4wLzAnLCBkZXNjcmlwdGlvbjogJ0hUVFAnLCB0Y3BPcHRpb25zOiB7IG1pbjogODAsIG1heDogODAgfSB9LFxuICAgICAgICAgIHsgcHJvdG9jb2w6ICc2Jywgc291cmNlOiAnMC4wLjAuMC8wJywgZGVzY3JpcHRpb246ICdIVFRQUycsIHRjcE9wdGlvbnM6IHsgbWluOiA0NDMsIG1heDogNDQzIH0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgZWdyZXNzU2VjdXJpdHlSdWxlczogW3sgcHJvdG9jb2w6ICdhbGwnLCBkZXN0aW5hdGlvbjogJzAuMC4wLjAvMCcsIGRlc2NyaXB0aW9uOiAnQWxsJyB9XSxcbiAgICAgIH0pO1xuICAgICAgcHVibGljU3VibmV0LmFkZE92ZXJyaWRlKCdzZWN1cml0eV9saXN0X2lkcycsIFtwdWJsaWNTbC5pZF0pO1xuICAgICAgY29uc3QgcHJpdmF0ZVNsID0gbmV3IENvcmVTZWN1cml0eUxpc3QodGhpcywgJ1ByaXZhdGVTZWN1cml0eUxpc3QnLCB7XG4gICAgICAgIGNvbXBhcnRtZW50SWQ6IGNvbmZpZy5jb21wYXJ0bWVudElkLFxuICAgICAgICB2Y25JZDogdmNuLmlkLFxuICAgICAgICBkaXNwbGF5TmFtZTogYCR7cmVzb3VyY2VOYW1lfS1wcml2YXRlLXNsYCxcbiAgICAgICAgaW5ncmVzc1NlY3VyaXR5UnVsZXM6IFtcbiAgICAgICAgICB7IHByb3RvY29sOiAnNicsIHNvdXJjZTogJzEwLjAuMi4wLzI0JywgZGVzY3JpcHRpb246ICdQRycsIHRjcE9wdGlvbnM6IHsgbWluOiA1NDMyLCBtYXg6IDU0MzIgfSB9LFxuICAgICAgICBdLFxuICAgICAgICBlZ3Jlc3NTZWN1cml0eVJ1bGVzOiBbeyBwcm90b2NvbDogJ2FsbCcsIGRlc3RpbmF0aW9uOiAnMC4wLjAuMC8wJywgZGVzY3JpcHRpb246ICdBbGwnIH1dLFxuICAgICAgfSk7XG4gICAgICBwcml2YXRlU3VibmV0LmFkZE92ZXJyaWRlKCdzZWN1cml0eV9saXN0X2lkcycsIFtwcml2YXRlU2wuaWRdKTtcblxuICAgICAgY29uc3QgYWxsU2VydmljZXMgPSBuZXcgRGF0YU9jaUNvcmVTZXJ2aWNlcyh0aGlzLCAnQWxsU2VydmljZXMnLCB7fSk7XG4gICAgICBjb25zdCBzdmNHdyA9IG5ldyBDb3JlU2VydmljZUdhdGV3YXkodGhpcywgJ1NlcnZpY2VHYXRld2F5Jywge1xuICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgdmNuSWQ6IHZjbi5pZCxcbiAgICAgICAgZGlzcGxheU5hbWU6IGAke3Jlc291cmNlTmFtZX0tc2d3YCxcbiAgICAgICAgc2VydmljZXM6IFt7IHNlcnZpY2VJZDogYWxsU2VydmljZXMuc2VydmljZXMuZ2V0KDApLmlkIH1dLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwcml2UnQgPSBuZXcgQ29yZVJvdXRlVGFibGUodGhpcywgJ1ByaXZhdGVSb3V0ZVRhYmxlJywge1xuICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgdmNuSWQ6IHZjbi5pZCxcbiAgICAgICAgZGlzcGxheU5hbWU6IGAke3Jlc291cmNlTmFtZX0tcHJpdmF0ZS1ydGAsXG4gICAgICAgIHJvdXRlUnVsZXM6IFtcbiAgICAgICAgICB7IG5ldHdvcmtFbnRpdHlJZDogc3ZjR3cuaWQsIGRlc3RpbmF0aW9uOiBhbGxTZXJ2aWNlcy5zZXJ2aWNlcy5nZXQoMCkuY2lkckJsb2NrLCBkZXN0aW5hdGlvblR5cGU6ICdTRVJWSUNFX0NJRFJfQkxPQ0snLCBkZXNjcmlwdGlvbjogJ09DSVInIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICAgIHByaXZhdGVTdWJuZXQuYWRkT3ZlcnJpZGUoJ3JvdXRlX3RhYmxlX2lkJywgcHJpdlJ0LmlkKTtcbiAgICAgIGNvbnN0IGlndyA9IG5ldyBDb3JlSW50ZXJuZXRHYXRld2F5KHRoaXMsICdJbnRlcm5ldEdhdGV3YXknLCB7XG4gICAgICAgIGNvbXBhcnRtZW50SWQ6IGNvbmZpZy5jb21wYXJ0bWVudElkLFxuICAgICAgICB2Y25JZDogdmNuLmlkLFxuICAgICAgICBkaXNwbGF5TmFtZTogYCR7cmVzb3VyY2VOYW1lfS1pZ3dgLFxuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwdWJSdCA9IG5ldyBDb3JlUm91dGVUYWJsZSh0aGlzLCAnUHVibGljUm91dGVUYWJsZScsIHtcbiAgICAgICAgY29tcGFydG1lbnRJZDogY29uZmlnLmNvbXBhcnRtZW50SWQsXG4gICAgICAgIHZjbklkOiB2Y24uaWQsXG4gICAgICAgIGRpc3BsYXlOYW1lOiBgJHtyZXNvdXJjZU5hbWV9LXB1YmxpYy1ydGAsXG4gICAgICAgIHJvdXRlUnVsZXM6IFtcbiAgICAgICAgICB7IG5ldHdvcmtFbnRpdHlJZDogaWd3LmlkLCBkZXN0aW5hdGlvbjogJzAuMC4wLjAvMCcsIGRlc3RpbmF0aW9uVHlwZTogJ0NJRFJfQkxPQ0snLCBkZXNjcmlwdGlvbjogJ0ludGVybmV0JyB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgICBwdWJsaWNTdWJuZXQuYWRkT3ZlcnJpZGUoJ3JvdXRlX3RhYmxlX2lkJywgcHViUnQuaWQpO1xuXG4gICAgICBjb25zdCBhcGlHYXRld2F5ID0gbmV3IEFwaWdhdGV3YXlHYXRld2F5KHRoaXMsICdBcGlHYXRld2F5Jywge1xuICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgc3VibmV0SWQ6IHB1YmxpY1N1Ym5ldC5pZCxcbiAgICAgICAgZW5kcG9pbnRUeXBlOiAnUFVCTElDJyxcbiAgICAgICAgZGlzcGxheU5hbWU6IGAke3Jlc291cmNlTmFtZX0tYXBpLWdhdGV3YXlgLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBsb2dHcm91cCA9IG5ldyBMb2dnaW5nTG9nR3JvdXAodGhpcywgJ0xvZ0dyb3VwJywge1xuICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgZGlzcGxheU5hbWU6IGFwcE5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTG9nIGdyb3VwIGZvciAke2FwcE5hbWV9YCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZnVuY3Rpb25BcHAgPSBuZXcgRnVuY3Rpb25zQXBwbGljYXRpb24odGhpcywgJ0Z1bmN0aW9uQXBwJywge1xuICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgZGlzcGxheU5hbWU6IGFwcE5hbWUsXG4gICAgICAgIHN1Ym5ldElkczogW3ByaXZhdGVTdWJuZXQuaWRdLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBvY2lGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbnNGdW5jdGlvbih0aGlzLCAnRnVuY3Rpb24nLCB7XG4gICAgICAgIGFwcGxpY2F0aW9uSWQ6IGZ1bmN0aW9uQXBwLmlkLFxuICAgICAgICBkaXNwbGF5TmFtZTogY29uZmlnLmZ1bmN0aW9uTmFtZSEsXG4gICAgICAgIGltYWdlOiBpbWFnZVVybCxcbiAgICAgICAgbWVtb3J5SW5NYnM6IGNvbmZpZy5mdW5jdGlvbk1lbW9yeU1iID8/ICcyNTYnLFxuICAgICAgICB0aW1lb3V0SW5TZWNvbmRzOiBjb25maWcuZnVuY3Rpb25UaW1lb3V0U2Vjb25kcyA/PyAzMCxcbiAgICAgICAgLi4uKGNvbmZpZy5mdW5jdGlvbkNvbmZpZyAmJiBPYmplY3Qua2V5cyhjb25maWcuZnVuY3Rpb25Db25maWcpLmxlbmd0aCA+IDAgPyB7IGNvbmZpZzogY29uZmlnLmZ1bmN0aW9uQ29uZmlnIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIG9jaUZ1bmN0aW9uLmFkZE92ZXJyaWRlKCdkZXBlbmRzX29uJywgW2BudWxsX3Jlc291cmNlLiR7YnVpbGRBbmRQdXNoSW1hZ2VJZH1gXSk7XG4gICAgICBjb25zdCBwYXRoUHJlZml4ID0gY29uZmlnLmFwaUd3UGF0aFByZWZpeCA/PyAnLyc7XG4gICAgICBsZXQgcm91dGVzOiBBcnJheTx7IHBhdGg6IHN0cmluZzsgbWV0aG9kczogc3RyaW5nW107IGJhY2tlbmQ6IHsgdHlwZTogc3RyaW5nOyBmdW5jdGlvbklkOiB0eXBlb2Ygb2NpRnVuY3Rpb24uaWQ7IHJlYWRUaW1lb3V0SW5TZWNvbmRzPzogbnVtYmVyIH0gfT47XG4gICAgICBpZiAoY29uZmlnLmFwaUd3RGVwbG95bWVudEpzb25QYXRoICYmIGZzLmV4aXN0c1N5bmMoY29uZmlnLmFwaUd3RGVwbG95bWVudEpzb25QYXRoKSkge1xuICAgICAgICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmMoY29uZmlnLmFwaUd3RGVwbG95bWVudEpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgICBjb25zdCBzcGVjID0gSlNPTi5wYXJzZShyYXcpIGFzIHsgcm91dGVzPzogQXJyYXk8eyBwYXRoPzogc3RyaW5nOyBtZXRob2RzPzogc3RyaW5nW107IGJhY2tlbmQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PiB9O1xuICAgICAgICBjb25zdCByb3V0ZUxpc3QgPSBzcGVjPy5yb3V0ZXMgPz8gW107XG4gICAgICAgIHJvdXRlcyA9IHJvdXRlTGlzdC5tYXAoKHIpID0+IHtcbiAgICAgICAgICBjb25zdCBiID0gci5iYWNrZW5kID8/IHt9O1xuICAgICAgICAgIGNvbnN0IGZ1bmN0aW9uSWRSYXcgPSAoYi5mdW5jdGlvbklkID8/IGIuZnVuY3Rpb25faWQpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCBmdW5jdGlvbklkID0gdHlwZW9mIGZ1bmN0aW9uSWRSYXcgPT09ICdzdHJpbmcnICYmIGZ1bmN0aW9uSWRSYXcuaW5jbHVkZXMoJyR7ZnVuY3Rpb25faWR9JylcbiAgICAgICAgICAgID8gb2NpRnVuY3Rpb24uaWRcbiAgICAgICAgICAgIDogKGZ1bmN0aW9uSWRSYXcgPz8gb2NpRnVuY3Rpb24uaWQpO1xuICAgICAgICAgIGNvbnN0IHJlYWRUaW1lb3V0ID0gKGIucmVhZFRpbWVvdXRJblNlY29uZHMgPz8gYi5yZWFkX3RpbWVvdXRfaW5fc2Vjb25kcykgYXMgbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYXRoOiByLnBhdGggPz8gJy97cGF0aCp9JyxcbiAgICAgICAgICAgIG1ldGhvZHM6IEFycmF5LmlzQXJyYXkoci5tZXRob2RzKSA/IHIubWV0aG9kcyA6IFsnR0VUJywgJ1BPU1QnLCAnT1BUSU9OUyddLFxuICAgICAgICAgICAgYmFja2VuZDoge1xuICAgICAgICAgICAgICB0eXBlOiAoYi50eXBlIGFzIHN0cmluZykgPz8gJ09SQUNMRV9GVU5DVElPTlNfQkFDS0VORCcsXG4gICAgICAgICAgICAgIGZ1bmN0aW9uSWQsXG4gICAgICAgICAgICAgIC4uLihyZWFkVGltZW91dCAhPSBudWxsID8geyByZWFkVGltZW91dEluU2Vjb25kczogcmVhZFRpbWVvdXQgfSA6IHt9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByb3V0ZVBhdGggPSBjb25maWcuYXBpR3dSb3V0ZVBhdGggPz8gJy97cGF0aCp9JztcbiAgICAgICAgY29uc3QgbWV0aG9kcyA9IGNvbmZpZy5hcGlHd01ldGhvZHM/Lmxlbmd0aCA/IGNvbmZpZy5hcGlHd01ldGhvZHMgOiBbJ0dFVCcsICdQT1NUJywgJ09QVElPTlMnXTtcbiAgICAgICAgcm91dGVzID0gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHBhdGg6IHJvdXRlUGF0aCxcbiAgICAgICAgICAgIG1ldGhvZHMsXG4gICAgICAgICAgICBiYWNrZW5kOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdPUkFDTEVfRlVOQ1RJT05TX0JBQ0tFTkQnLFxuICAgICAgICAgICAgICBmdW5jdGlvbklkOiBvY2lGdW5jdGlvbi5pZCxcbiAgICAgICAgICAgICAgcmVhZFRpbWVvdXRJblNlY29uZHM6IGNvbmZpZy5mdW5jdGlvblRpbWVvdXRTZWNvbmRzID8/IDMwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgY29uc3QgYXBpRGVwbG95bWVudCA9IG5ldyBBcGlnYXRld2F5RGVwbG95bWVudCh0aGlzLCAnQXBpRGVwbG95bWVudCcsIHtcbiAgICAgICAgY29tcGFydG1lbnRJZDogY29uZmlnLmNvbXBhcnRtZW50SWQsXG4gICAgICAgIGdhdGV3YXlJZDogYXBpR2F0ZXdheS5pZCxcbiAgICAgICAgcGF0aFByZWZpeCxcbiAgICAgICAgZGlzcGxheU5hbWU6IGAke3Jlc291cmNlTmFtZX0tZGVwbG95bWVudGAsXG4gICAgICAgIHNwZWNpZmljYXRpb246IHtcbiAgICAgICAgICByb3V0ZXMsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGFwaURlcGxveW1lbnQubm9kZS5hZGREZXBlbmRlbmN5KG9jaUZ1bmN0aW9uKTtcblxuICAgICAgLy8gRnVuY3Rpb25zIGV4ZWN1dGlvbiBsb2c6IFNFUlZJQ0UgbG9nIGZvciB0aGUgRnVuY3Rpb25zIGFwcGxpY2F0aW9uIChjYXRlZ29yeSBpbnZva2UpXG4gICAgICBjb25zdCBleGVjdXRpb25Mb2cgPSBuZXcgTG9nZ2luZ0xvZyh0aGlzLCAnRXhlY3V0aW9uTG9nJywge1xuICAgICAgICBkaXNwbGF5TmFtZTogYCR7YXBwTmFtZX0taW52b2tlYCxcbiAgICAgICAgbG9nR3JvdXBJZDogbG9nR3JvdXAuaWQsXG4gICAgICAgIGxvZ1R5cGU6ICdTRVJWSUNFJyxcbiAgICAgICAgY29uZmlndXJhdGlvbjoge1xuICAgICAgICAgIGNvbXBhcnRtZW50SWQ6IGNvbmZpZy5jb21wYXJ0bWVudElkLFxuICAgICAgICAgIHNvdXJjZToge1xuICAgICAgICAgICAgY2F0ZWdvcnk6ICdpbnZva2UnLFxuICAgICAgICAgICAgLy8gQXNzb2NpYXRlIHRoaXMgc2VydmljZSBsb2cgd2l0aCB0aGUgRnVuY3Rpb25zIGFwcGxpY2F0aW9uXG4gICAgICAgICAgICByZXNvdXJjZTogZnVuY3Rpb25BcHAuaWQsXG4gICAgICAgICAgICBzZXJ2aWNlOiAnZnVuY3Rpb25zJyxcbiAgICAgICAgICAgIHNvdXJjZVR5cGU6ICdPQ0lTRVJWSUNFJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBleGVjdXRpb25Mb2cubm9kZS5hZGREZXBlbmRlbmN5KGZ1bmN0aW9uQXBwKTtcblxuICAgICAgbmV3IFRlcnJhZm9ybU91dHB1dCh0aGlzLCAnb2Npcl9yZXBvc2l0b3J5X25hbWUnLCB7IHZhbHVlOiBvY2lyUmVwb3NpdG9yeS5kaXNwbGF5TmFtZSwgZGVzY3JpcHRpb246ICdPQ0lSIHJlcG9zaXRvcnkgbmFtZScgfSk7XG4gICAgICBuZXcgVGVycmFmb3JtT3V0cHV0KHRoaXMsICdhcGlfZ2F0ZXdheV9ob3N0JywgeyB2YWx1ZTogYXBpR2F0ZXdheS5ob3N0bmFtZSwgZGVzY3JpcHRpb246ICdBUEkgR2F0ZXdheSBob3N0bmFtZScgfSk7XG4gICAgICBuZXcgVGVycmFmb3JtT3V0cHV0KHRoaXMsICdmdW5jdGlvbl9pbnZva2VfdXJsJywgeyB2YWx1ZTogYGh0dHBzOi8vJHthcGlHYXRld2F5Lmhvc3RuYW1lfWAsIGRlc2NyaXB0aW9uOiAnQmFzZSBVUkwgdG8gaW52b2tlIHRoZSBmdW5jdGlvbicgfSk7XG4gICAgICBuZXcgVGVycmFmb3JtT3V0cHV0KHRoaXMsICdmdW5jdGlvbl9pZCcsIHsgdmFsdWU6IG9jaUZ1bmN0aW9uLmlkLCBkZXNjcmlwdGlvbjogJ09DSSBGdW5jdGlvbiBPQ0lEJyB9KTtcbiAgICAgIG5ldyBUZXJyYWZvcm1PdXRwdXQodGhpcywgJ2xvZ19ncm91cF9pZCcsIHsgdmFsdWU6IGxvZ0dyb3VwLmlkLCBkZXNjcmlwdGlvbjogJ09DSSBMb2cgR3JvdXAgT0NJRCBmb3IgdGhlIGFwcGxpY2F0aW9uJyB9KTtcbiAgICAgIG5ldyBUZXJyYWZvcm1PdXRwdXQodGhpcywgJ2V4ZWN1dGlvbl9sb2dfaWQnLCB7IHZhbHVlOiBleGVjdXRpb25Mb2cuaWQsIGRlc2NyaXB0aW9uOiAnT0NJIEZ1bmN0aW9ucyBleGVjdXRpb24gbG9nIE9DSUQnIH0pO1xuICAgIH1cblxuICAgIC8vIEZvcmNlIG9yYWNsZS9vY2kgKFRlcnJhZm9ybSBSZWdpc3RyeSkgc28gdGVycmFmb3JtIGluaXQgdXNlcyBpdCBvbiBPTDggYW5kIGVsc2V3aGVyZTsgbXVzdCBydW4gYWZ0ZXIgcHJvdmlkZXIgaXMgYWRkZWRcbiAgICB0aGlzLmFkZE92ZXJyaWRlKCd0ZXJyYWZvcm0ucmVxdWlyZWRfcHJvdmlkZXJzLm9jaScsIHtcbiAgICAgIHNvdXJjZTogJ29yYWNsZS9vY2knLFxuICAgICAgdmVyc2lvbjogJz49IDUuMC4wLCA8IDYuMC4wJyxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
379
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NpLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vb2NpLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLGlDQUF3RDtBQUN4RCw2REFBNkQ7QUFDN0QseUdBQW9HO0FBQ3BHLDZEQUF5RDtBQUN6RCxtRUFBK0Q7QUFDL0QsaUZBQTRFO0FBQzVFLHFGQUFnRjtBQUNoRix5RkFBbUY7QUFDbkYsNkVBQXdFO0FBQ3hFLHVGQUFrRjtBQUNsRixpRkFBNkU7QUFDN0UsdUZBQW1GO0FBQ25GLHVGQUFtRjtBQUNuRixpRkFBNkU7QUFDN0UsK0VBQTBFO0FBQzFFLG1FQUErRDtBQUMvRCxxREFBcUY7QUFDckYsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQXdDN0IsTUFBYSxRQUFTLFNBQVEsc0JBQWM7SUFDMUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxNQUFzQjtRQUM5RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLDZDQUE2QztRQUM3QyxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDdEQsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDbEMscUJBQXFCO2dCQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFO29CQUNwQyxHQUFHLEVBQUU7d0JBQ0gsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTTt3QkFDN0IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO3dCQUMzQixHQUFHLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLG9CQUFvQjt3QkFDcEQsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO3FCQUN0QjtpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzFDLHFEQUFxRDtnQkFDckQsTUFBTSxXQUFXLEdBQVE7b0JBQ3ZCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU87b0JBQy9CLGFBQWEsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksSUFBSSxLQUFLO2lCQUNwRCxDQUFDO2dCQUNGLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDL0IsV0FBVyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztnQkFDeEQsQ0FBQztnQkFDRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ2pDLFdBQVcsQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7Z0JBQzVELENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRTtvQkFDcEMsSUFBSSxFQUFFLFdBQVc7aUJBQ2xCLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO1FBRUQsZUFBZTtRQUNmLElBQUksc0JBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO1lBQzNCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtZQUNyQixXQUFXLEVBQUUsTUFBTSxDQUFDLFNBQVM7U0FDOUIsQ0FBQyxDQUFDO1FBRUgseUVBQXlFO1FBQ3pFLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFDM0UsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUksY0FBYyxDQUFDO1FBRXhGLE1BQU0sY0FBYyxHQUFHLElBQUksNkRBQTRCLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQzlFLGFBQWEsRUFBRSxpQkFBaUI7WUFDaEMsV0FBVyxFQUFFLFlBQVk7WUFDekIsUUFBUSxFQUFFLEtBQUssRUFBRSxnQ0FBZ0M7WUFDakQsV0FBVyxFQUFFLEtBQUssRUFBRSxzQkFBc0I7U0FDM0MsQ0FBQyxDQUFDO1FBRUgsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDdkYsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLFlBQVksSUFBSSxpQkFBaUIsQ0FBQztRQUVqRSxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3BCLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQ2IsMElBQTBJLENBQzNJLENBQUM7WUFDSixDQUFDO1lBQ0QsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFrQixDQUFDLENBQUM7WUFDMUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUM7WUFDN0MsTUFBTSxZQUFZLEdBQUcsR0FBRyxJQUFBLHdCQUFXLEVBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7WUFDN0QsTUFBTSxRQUFRLEdBQUcsSUFBQSwyQkFBYyxFQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxlQUFlLElBQUksTUFBTSxDQUFDLFlBQWEsQ0FBQztZQUMvRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUM7WUFFN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQ0FBbUMsRUFBRTtnQkFDcEQsTUFBTSxFQUFFLGdCQUFnQjtnQkFDeEIsT0FBTyxFQUFFLFFBQVE7YUFDbEIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQztZQUNoRCxJQUFJLENBQUMsV0FBVyxDQUFDLDBCQUEwQixtQkFBbUIsYUFBYSxFQUFFO2dCQUMzRSxtREFBbUQ7YUFDcEQsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQywwQkFBMEIsbUJBQW1CLFdBQVcsRUFBRTtnQkFDekUsU0FBUyxFQUFFLFlBQVk7Z0JBQ3ZCLFNBQVMsRUFBRSxRQUFRO2dCQUNuQixTQUFTLEVBQUUsUUFBUTtnQkFDbkIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRTtnQkFDN0IsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHO2dCQUNsRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7Z0JBQzNCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTthQUN0QixDQUFDLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQzlCLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDcEMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxhQUFhLENBQUM7WUFDaEUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjO2dCQUM1QyxDQUFDLENBQUMsMkJBQTJCLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxpQkFBaUIsUUFBUSxxREFBcUQsVUFBVSxrREFBa0QsWUFBWSw2Q0FBNkM7Z0JBQzFQLENBQUMsQ0FBQyw0QkFBNEIsT0FBTyw0Q0FBNEMsWUFBWSxzTEFBc0wsWUFBWSxrRUFBa0UsQ0FBQztZQUNwVyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLDZDQUE2QyxDQUFDO1lBQ2hGLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLENBQUM7WUFDbEQsTUFBTSxxQkFBcUIsR0FBRzs7O1FBRzVCLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQztDQUNuQyxDQUFDO1lBQ0ksTUFBTSxxQkFBcUIsR0FBRzs7Ozs7Ozs7OztRQVU1QixPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUM7Q0FDbkMsQ0FBQztZQUNJLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUM7WUFDbEYsTUFBTSxtQkFBbUIsR0FBRzs7Ozs7Ozs7Ozs7Q0FXakMsQ0FBQztZQUNJLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2hGLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3BGLHlIQUF5SDtZQUN6SCxJQUFJLENBQUMsV0FBVyxDQUFDLDBCQUEwQixtQkFBbUIsY0FBYyxFQUFFO2dCQUM1RTtvQkFDRSxZQUFZLEVBQUU7d0JBQ1osT0FBTyxFQUFFLDBMQUEwTDt3QkFDbk0sV0FBVyxFQUFFOzRCQUNYLGtCQUFrQixFQUFFLGdCQUFnQjs0QkFDcEMsY0FBYyxFQUFFLGFBQWE7NEJBQzdCLGdCQUFnQixFQUFFLGVBQWU7eUJBQ2xDO3FCQUNGO2lCQUNGO2dCQUNELEVBQUUsWUFBWSxFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEVBQUU7Z0JBQ2xFLEVBQUUsWUFBWSxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsK0NBQStDLFFBQVEsSUFBSSxFQUFFLEVBQUU7Z0JBQ3RJLEVBQUUsWUFBWSxFQUFFLEVBQUUsT0FBTyxFQUFFLGVBQWUsUUFBUSxFQUFFLEVBQUUsRUFBRTthQUN6RCxDQUFDLENBQUM7WUFFSCxNQUFNLEdBQUcsR0FBRyxJQUFJLGtCQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtnQkFDbkMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhO2dCQUNuQyxXQUFXLEVBQUUsR0FBRyxZQUFZLE1BQU07Z0JBQ2xDLFVBQVUsRUFBRSxDQUFDLGFBQWEsQ0FBQztnQkFDM0IsUUFBUSxFQUFFLE9BQU87YUFDbEIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxZQUFZLEdBQUcsSUFBSSx3QkFBVSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7Z0JBQ3hELGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYTtnQkFDbkMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNiLFdBQVcsRUFBRSxHQUFHLFlBQVksU0FBUztnQkFDckMsU0FBUyxFQUFFLGFBQWE7Z0JBQ3hCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixzQkFBc0IsRUFBRSxLQUFLO2FBQzlCLENBQUMsQ0FBQztZQUNILE1BQU0sYUFBYSxHQUFHLElBQUksd0JBQVUsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFO2dCQUMxRCxhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWE7Z0JBQ25DLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDYixXQUFXLEVBQUUsR0FBRyxZQUFZLFVBQVU7Z0JBQ3RDLFNBQVMsRUFBRSxhQUFhO2dCQUN4QixRQUFRLEVBQUUsU0FBUztnQkFDbkIsc0JBQXNCLEVBQUUsSUFBSTthQUM3QixDQUFDLENBQUM7WUFFSCxNQUFNLFFBQVEsR0FBRyxJQUFJLHFDQUFnQixDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRTtnQkFDaEUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhO2dCQUNuQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ2IsV0FBVyxFQUFFLEdBQUcsWUFBWSxZQUFZO2dCQUN4QyxvQkFBb0IsRUFBRTtvQkFDcEIsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRTtvQkFDN0YsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtpQkFDakc7Z0JBQ0QsbUJBQW1CLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUM7YUFDekYsQ0FBQyxDQUFDO1lBQ0gsWUFBWSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzdELE1BQU0sU0FBUyxHQUFHLElBQUkscUNBQWdCLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFO2dCQUNsRSxhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWE7Z0JBQ25DLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDYixXQUFXLEVBQUUsR0FBRyxZQUFZLGFBQWE7Z0JBQ3pDLG9CQUFvQixFQUFFO29CQUNwQixFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO2lCQUNsRztnQkFDRCxtQkFBbUIsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQzthQUN6RixDQUFDLENBQUM7WUFDSCxhQUFhLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFL0QsTUFBTSxXQUFXLEdBQUcsSUFBSSw0Q0FBbUIsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLE1BQU0sS0FBSyxHQUFHLElBQUkseUNBQWtCLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUMzRCxhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWE7Z0JBQ25DLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDYixXQUFXLEVBQUUsR0FBRyxZQUFZLE1BQU07Z0JBQ2xDLFFBQVEsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO2FBQzFELENBQUMsQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLElBQUksaUNBQWMsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7Z0JBQzNELGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYTtnQkFDbkMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNiLFdBQVcsRUFBRSxHQUFHLFlBQVksYUFBYTtnQkFDekMsVUFBVSxFQUFFO29CQUNWLEVBQUUsZUFBZSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRTtpQkFDOUk7YUFDRixDQUFDLENBQUM7WUFDSCxhQUFhLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2RCxNQUFNLEdBQUcsR0FBRyxJQUFJLDJDQUFtQixDQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRTtnQkFDM0QsYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhO2dCQUNuQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ2IsV0FBVyxFQUFFLEdBQUcsWUFBWSxNQUFNO2dCQUNsQyxPQUFPLEVBQUUsSUFBSTthQUNkLENBQUMsQ0FBQztZQUNILE1BQU0sS0FBSyxHQUFHLElBQUksaUNBQWMsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7Z0JBQ3pELGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYTtnQkFDbkMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNiLFdBQVcsRUFBRSxHQUFHLFlBQVksWUFBWTtnQkFDeEMsVUFBVSxFQUFFO29CQUNWLEVBQUUsZUFBZSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUU7aUJBQzlHO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsWUFBWSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFckQsTUFBTSxVQUFVLEdBQUcsSUFBSSxzQ0FBaUIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFO2dCQUMzRCxhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWE7Z0JBQ25DLFFBQVEsRUFBRSxZQUFZLENBQUMsRUFBRTtnQkFDekIsWUFBWSxFQUFFLFFBQVE7Z0JBQ3RCLFdBQVcsRUFBRSxHQUFHLFlBQVksY0FBYzthQUMzQyxDQUFDLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxJQUFJLG1DQUFlLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFDckQsYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhO2dCQUNuQyxXQUFXLEVBQUUsT0FBTztnQkFDcEIsV0FBVyxFQUFFLGlCQUFpQixPQUFPLEVBQUU7YUFDeEMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxXQUFXLEdBQUcsSUFBSSw0Q0FBb0IsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFO2dCQUNoRSxhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWE7Z0JBQ25DLFdBQVcsRUFBRSxPQUFPO2dCQUNwQixTQUFTLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO2FBQzlCLENBQUMsQ0FBQztZQUNILE1BQU0sV0FBVyxHQUFHLElBQUksc0NBQWlCLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFDMUQsYUFBYSxFQUFFLFdBQVcsQ0FBQyxFQUFFO2dCQUM3QixXQUFXLEVBQUUsTUFBTSxDQUFDLFlBQWE7Z0JBQ2pDLEtBQUssRUFBRSxRQUFRO2dCQUNmLFdBQVcsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLElBQUksS0FBSztnQkFDN0MsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLHNCQUFzQixJQUFJLEVBQUU7Z0JBQ3JELEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3JILENBQUMsQ0FBQztZQUNILFdBQVcsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUMsaUJBQWlCLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hGLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxlQUFlLElBQUksR0FBRyxDQUFDO1lBQ2pELElBQUksTUFBK0ksQ0FBQztZQUNwSixJQUFJLE1BQU0sQ0FBQyx1QkFBdUIsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BGLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNwRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBaUcsQ0FBQztnQkFDN0gsTUFBTSxTQUFTLEdBQUcsSUFBSSxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQzNCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO29CQUMxQixNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBdUIsQ0FBQztvQkFDNUUsTUFBTSxVQUFVLEdBQUcsT0FBTyxhQUFhLEtBQUssUUFBUSxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7d0JBQzlGLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRTt3QkFDaEIsQ0FBQyxDQUFDLENBQUMsYUFBYSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDdEMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLElBQUksQ0FBQyxDQUFDLHVCQUF1QixDQUF1QixDQUFDO29CQUNoRyxPQUFPO3dCQUNMLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLFVBQVU7d0JBQzFCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQzt3QkFDMUUsT0FBTyxFQUFFOzRCQUNQLElBQUksRUFBRyxDQUFDLENBQUMsSUFBZSxJQUFJLDBCQUEwQjs0QkFDdEQsVUFBVTs0QkFDVixHQUFHLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO3lCQUN0RTtxQkFDRixDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLElBQUksVUFBVSxDQUFDO2dCQUN0RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUMvRixNQUFNLEdBQUc7b0JBQ1A7d0JBQ0UsSUFBSSxFQUFFLFNBQVM7d0JBQ2YsT0FBTzt3QkFDUCxPQUFPLEVBQUU7NEJBQ1AsSUFBSSxFQUFFLDBCQUEwQjs0QkFDaEMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxFQUFFOzRCQUMxQixvQkFBb0IsRUFBRSxNQUFNLENBQUMsc0JBQXNCLElBQUksRUFBRTt5QkFDMUQ7cUJBQ0Y7aUJBQ0YsQ0FBQztZQUNKLENBQUM7WUFDRCxNQUFNLGFBQWEsR0FBRyxJQUFJLDRDQUFvQixDQUFDLElBQUksRUFBRSxlQUFlLEVBQUU7Z0JBQ3BFLGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYTtnQkFDbkMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxFQUFFO2dCQUN4QixVQUFVO2dCQUNWLFdBQVcsRUFBRSxHQUFHLFlBQVksYUFBYTtnQkFDekMsYUFBYSxFQUFFO29CQUNiLE1BQU07aUJBQ1A7YUFDRixDQUFDLENBQUM7WUFDSCxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUU5Qyx1RkFBdUY7WUFDdkYsTUFBTSxZQUFZLEdBQUcsSUFBSSx3QkFBVSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7Z0JBQ3hELFdBQVcsRUFBRSxHQUFHLE9BQU8sU0FBUztnQkFDaEMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxFQUFFO2dCQUN2QixPQUFPLEVBQUUsU0FBUztnQkFDbEIsYUFBYSxFQUFFO29CQUNiLGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYTtvQkFDbkMsTUFBTSxFQUFFO3dCQUNOLFFBQVEsRUFBRSxRQUFRO3dCQUNsQiw0REFBNEQ7d0JBQzVELFFBQVEsRUFBRSxXQUFXLENBQUMsRUFBRTt3QkFDeEIsT0FBTyxFQUFFLFdBQVc7d0JBQ3BCLFVBQVUsRUFBRSxZQUFZO3FCQUN6QjtpQkFDRjthQUNGLENBQUMsQ0FBQztZQUNILFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRTdDLHNGQUFzRjtZQUN0RixNQUFNLGNBQWMsR0FBRyx1QkFBdUIsQ0FBQztZQUMvQyxJQUFJLENBQUMsV0FBVyxDQUFDLDBCQUEwQixjQUFjLFdBQVcsRUFBRSxFQUFFLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdHLElBQUksQ0FBQyxXQUFXLENBQUMsMEJBQTBCLGNBQWMsYUFBYSxFQUFFLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDO1lBQzFHLElBQUksQ0FBQyxXQUFXLENBQUMsMEJBQTBCLGNBQWMsY0FBYyxFQUFFO2dCQUN2RTtvQkFDRSxZQUFZLEVBQUU7d0JBQ1osT0FBTyxFQUFFLHFHQUFxRztxQkFDL0c7aUJBQ0Y7YUFDRixDQUFDLENBQUM7WUFFSCxJQUFJLHVCQUFlLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFLENBQUMsQ0FBQztZQUM5SCxJQUFJLHVCQUFlLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFLENBQUMsQ0FBQztZQUNuSCxJQUFJLHVCQUFlLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFLEVBQUUsS0FBSyxFQUFFLFdBQVcsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUFFLFdBQVcsRUFBRSxpQ0FBaUMsRUFBRSxDQUFDLENBQUM7WUFDOUksSUFBSSx1QkFBZSxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO1lBQ3RHLElBQUksdUJBQWUsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLHdDQUF3QyxFQUFFLENBQUMsQ0FBQztZQUN6SCxJQUFJLHVCQUFlLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLGtDQUFrQyxFQUFFLENBQUMsQ0FBQztRQUM3SCxDQUFDO1FBRUQseUhBQXlIO1FBQ3pILElBQUksQ0FBQyxXQUFXLENBQUMsa0NBQWtDLEVBQUU7WUFDbkQsTUFBTSxFQUFFLFlBQVk7WUFDcEIsT0FBTyxFQUFFLG1CQUFtQjtTQUM3QixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFoVkQsNEJBZ1ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBUZXJyYWZvcm1TdGFjaywgVGVycmFmb3JtT3V0cHV0IH0gZnJvbSAnY2RrdGYnO1xuaW1wb3J0IHsgT2NpUHJvdmlkZXIgfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvcHJvdmlkZXInO1xuaW1wb3J0IHsgQXJ0aWZhY3RzQ29udGFpbmVyUmVwb3NpdG9yeSB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9hcnRpZmFjdHMtY29udGFpbmVyLXJlcG9zaXRvcnknO1xuaW1wb3J0IHsgQ29yZVZjbiB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9jb3JlLXZjbic7XG5pbXBvcnQgeyBDb3JlU3VibmV0IH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2NvcmUtc3VibmV0JztcbmltcG9ydCB7IENvcmVTZWN1cml0eUxpc3QgfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvY29yZS1zZWN1cml0eS1saXN0JztcbmltcG9ydCB7IENvcmVTZXJ2aWNlR2F0ZXdheSB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9jb3JlLXNlcnZpY2UtZ2F0ZXdheSc7XG5pbXBvcnQgeyBEYXRhT2NpQ29yZVNlcnZpY2VzIH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2RhdGEtb2NpLWNvcmUtc2VydmljZXMnO1xuaW1wb3J0IHsgQ29yZVJvdXRlVGFibGUgfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvY29yZS1yb3V0ZS10YWJsZSc7XG5pbXBvcnQgeyBDb3JlSW50ZXJuZXRHYXRld2F5IH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2NvcmUtaW50ZXJuZXQtZ2F0ZXdheSc7XG5pbXBvcnQgeyBBcGlnYXRld2F5R2F0ZXdheSB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9hcGlnYXRld2F5LWdhdGV3YXknO1xuaW1wb3J0IHsgQXBpZ2F0ZXdheURlcGxveW1lbnQgfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvYXBpZ2F0ZXdheS1kZXBsb3ltZW50JztcbmltcG9ydCB7IEZ1bmN0aW9uc0FwcGxpY2F0aW9uIH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2Z1bmN0aW9ucy1hcHBsaWNhdGlvbic7XG5pbXBvcnQgeyBGdW5jdGlvbnNGdW5jdGlvbiB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9mdW5jdGlvbnMtZnVuY3Rpb24nO1xuaW1wb3J0IHsgTG9nZ2luZ0xvZ0dyb3VwIH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2xvZ2dpbmctbG9nLWdyb3VwJztcbmltcG9ydCB7IExvZ2dpbmdMb2cgfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvbG9nZ2luZy1sb2cnO1xuaW1wb3J0IHsgT2NpQmFja2VuZENvbmZpZywgb2Npckhvc3RLZXksIGdldE9jaUltYWdlVXJsIH0gZnJvbSAnLi4vY29uZmlnL29jaS1jb25maWcnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuZXhwb3J0IGludGVyZmFjZSBPY2lTdGFja0NvbmZpZyB7XG4gIGNvbXBhcnRtZW50SWQ6IHN0cmluZztcbiAgb2NpckNvbXBhcnRtZW50SWQ/OiBzdHJpbmc7XG4gIHRlbmFuY3lJZDogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIC8qKiBPQ0kgRnVuY3Rpb25zIGFwcGxpY2F0aW9uIG5hbWUgKGUuZy4gbXktYXBwKS4gU2V0IHZpYSBPQ0lfRlVOQ1RJT05fQVBQX05BTUUgb3IgcGFzcyBpbiBjb25maWcuICovXG4gIGZ1bmN0aW9uQXBwTmFtZTogc3RyaW5nO1xuICAvKiogT0NJIEZ1bmN0aW9uIG5hbWUgKGUuZy4gbXktZnVuY3Rpb24pLiBTZXQgdmlhIE9DSV9GVU5DVElPTl9OQU1FIG9yIHBhc3MgaW4gY29uZmlnLiAqL1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIHBhdGggdG8gSkFSIChvciBEb2NrZXJmaWxlIGNvbnRleHQpIHRvIGJ1aWxkIGFuZCBkZXBsb3kgYXMgdGhlIGZ1bmN0aW9uIGltYWdlLiBTZXQgdmlhIE9DSV9GVU5DVElPTl9KQVJfUEFUSC4gRW1wdHkgPSBubyBmdW5jdGlvbi9pbWFnZSBidWlsZC4gKi9cbiAgZnVuY3Rpb25KYXJQYXRoPzogc3RyaW5nO1xuICAvKiogRGlyZWN0b3J5IGNvbnRhaW5pbmcgdGFyZ2V0LyAoRG9ja2VyZmlsZSBpcyBnZW5lcmF0ZWQgaW4gbG9jYWwtZXhlYykuIFdoZW4gc2V0IHdpdGggZnVuY3Rpb25OYW1lLCBjcmVhdGVzIFZDTiwgRnVuY3Rpb24sIEFQSSBHYXRld2F5LiAqL1xuICBkb2NrZXJDb250ZXh0UGF0aD86IHN0cmluZztcbiAgLyoqIEltYWdlIHRhZyBmb3IgT0NJUiAoZnJvbSBmdW5jLnlhbWwgdmVyc2lvbiBvciBPQ0lfSU1BR0VfVEFHOyBkZWZhdWx0ICdsYXRlc3QnKS4gKi9cbiAgaW1hZ2VUYWc/OiBzdHJpbmc7XG4gIC8qKiBKYXZhIEZESyBDTUQgaGFuZGxlciAoZnJvbSBmdW5jLnlhbWwgb3IgT0NJX0ZVTkNUSU9OX0hBTkRMRVIpLiAqL1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICAvKiogV2hlbiB0cnVlLCBkZXBsb3kgdXNlcyB0aGluIERvY2tlcmZpbGUgKG5vIE1hdmVuIGluIGltYWdlKTsgZnVsbCBidWlsZCBvbmx5IGluIHJlZGVwbG95OmZ1bmN0aW9uLiAqL1xuICB1c2VUaGluRG9ja2VyZmlsZT86IGJvb2xlYW47XG4gIG9jaXJSZXBvc2l0b3J5TmFtZT86IHN0cmluZztcbiAgLyoqIEFQSSBHYXRld2F5IGRlcGxveW1lbnQgcGF0aCBwcmVmaXguIERlZmF1bHQgJy8nLiAqL1xuICBhcGlHd1BhdGhQcmVmaXg/OiBzdHJpbmc7XG4gIC8qKiBBUEkgR2F0ZXdheSByb3V0ZSBwYXRoLiBEZWZhdWx0ICcve3BhdGgqfScuICovXG4gIGFwaUd3Um91dGVQYXRoPzogc3RyaW5nO1xuICAvKiogQVBJIEdhdGV3YXkgcm91dGUgbWV0aG9kcy4gRGVmYXVsdCBbJ0dFVCcsICdQT1NUJywgJ09QVElPTlMnXS4gKi9cbiAgYXBpR3dNZXRob2RzPzogc3RyaW5nW107XG4gIC8qKiBGdW5jdGlvbiBtZW1vcnkgaW4gTUIgKGUuZy4gJzI1NicpLiBGcm9tIGZ1bmMueWFtbCBvciBPQ0lfRlVOQ1RJT05fTUVNT1JZX01CLiAqL1xuICBmdW5jdGlvbk1lbW9yeU1iPzogc3RyaW5nO1xuICAvKiogRnVuY3Rpb24gdGltZW91dCBpbiBzZWNvbmRzLiBGcm9tIGZ1bmMueWFtbCBvciBPQ0lfRlVOQ1RJT05fVElNRU9VVF9TRUNPTkRTLiAqL1xuICBmdW5jdGlvblRpbWVvdXRTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogRnVuY3Rpb24gY29uZmlnL2VudiBrZXktdmFsdWUuIEZyb20gZnVuYy55YW1sIGNvbmZpZyBvciBPQ0lfRlVOQ1RJT05fQ09ORklHLiAqL1xuICBmdW5jdGlvbkNvbmZpZz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBQYXRoIHRvIEFQSSBHYXRld2F5IGRlcGxveW1lbnQgc3BlYyBKU09OIChyb3V0ZXMpLiBEZWZhdWx0IG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbiBpbiBwcm9qZWN0IHJvb3QuICovXG4gIGFwaUd3RGVwbG95bWVudEpzb25QYXRoPzogc3RyaW5nO1xuICBiYWNrZW5kPzogT2NpQmFja2VuZENvbmZpZztcbn1cblxuZXhwb3J0IGNsYXNzIE9jaVN0YWNrIGV4dGVuZHMgVGVycmFmb3JtU3RhY2sge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBjb25maWc6IE9jaVN0YWNrQ29uZmlnKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIENvbmZpZ3VyZSBUZXJyYWZvcm0gYmFja2VuZCAoaWYgbm90IGxvY2FsKVxuICAgIGlmIChjb25maWcuYmFja2VuZCAmJiBjb25maWcuYmFja2VuZC50eXBlICE9PSAnbG9jYWwnKSB7XG4gICAgICBpZiAoY29uZmlnLmJhY2tlbmQudHlwZSA9PT0gJ29jaScpIHtcbiAgICAgICAgLy8gT0NJIG5hdGl2ZSBiYWNrZW5kXG4gICAgICAgIHRoaXMuYWRkT3ZlcnJpZGUoJ3RlcnJhZm9ybS5iYWNrZW5kJywge1xuICAgICAgICAgIG9jaToge1xuICAgICAgICAgICAgYnVja2V0OiBjb25maWcuYmFja2VuZC5idWNrZXQsXG4gICAgICAgICAgICBuYW1lc3BhY2U6IGNvbmZpZy5uYW1lc3BhY2UsXG4gICAgICAgICAgICBrZXk6IGNvbmZpZy5iYWNrZW5kLmtleSB8fCBgJHtpZH0vdGVycmFmb3JtLnRmc3RhdGVgLFxuICAgICAgICAgICAgcmVnaW9uOiBjb25maWcucmVnaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChjb25maWcuYmFja2VuZC50eXBlID09PSAnaHR0cCcpIHtcbiAgICAgICAgLy8gSFRUUCBiYWNrZW5kIChmb3IgT0NJIE9iamVjdCBTdG9yYWdlIHZpYSBSRVNUIEFQSSlcbiAgICAgICAgY29uc3QgaHR0cEJhY2tlbmQ6IGFueSA9IHtcbiAgICAgICAgICBhZGRyZXNzOiBjb25maWcuYmFja2VuZC5hZGRyZXNzLFxuICAgICAgICAgIHVwZGF0ZV9tZXRob2Q6IGNvbmZpZy5iYWNrZW5kLnVwZGF0ZU1ldGhvZCB8fCAnUFVUJyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNvbmZpZy5iYWNrZW5kLmxvY2tBZGRyZXNzKSB7XG4gICAgICAgICAgaHR0cEJhY2tlbmQubG9ja19hZGRyZXNzID0gY29uZmlnLmJhY2tlbmQubG9ja0FkZHJlc3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5iYWNrZW5kLnVubG9ja0FkZHJlc3MpIHtcbiAgICAgICAgICBodHRwQmFja2VuZC51bmxvY2tfYWRkcmVzcyA9IGNvbmZpZy5iYWNrZW5kLnVubG9ja0FkZHJlc3M7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRPdmVycmlkZSgndGVycmFmb3JtLmJhY2tlbmQnLCB7XG4gICAgICAgICAgaHR0cDogaHR0cEJhY2tlbmQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9DSSBQcm92aWRlclxuICAgIG5ldyBPY2lQcm92aWRlcih0aGlzLCAnb2NpJywge1xuICAgICAgcmVnaW9uOiBjb25maWcucmVnaW9uLFxuICAgICAgdGVuYW5jeU9jaWQ6IGNvbmZpZy50ZW5hbmN5SWQsXG4gICAgfSk7XG5cbiAgICAvLyBPQ0lSIENvbnRhaW5lciBSZXBvc2l0b3J5IChyb290IGNvbXBhcnRtZW50IGFsbG93ZWQgaWYgZXhwbGljaXRseSBzZXQpXG4gICAgY29uc3Qgb2NpckNvbXBhcnRtZW50SWQgPSBjb25maWcub2NpckNvbXBhcnRtZW50SWQgfHwgY29uZmlnLmNvbXBhcnRtZW50SWQ7XG4gICAgY29uc3Qgb2NpclJlcG9OYW1lID0gY29uZmlnLm9jaXJSZXBvc2l0b3J5TmFtZSB8fCBjb25maWcuZnVuY3Rpb25OYW1lIHx8ICdvY2ktZnVuY3Rpb24nO1xuXG4gICAgY29uc3Qgb2NpclJlcG9zaXRvcnkgPSBuZXcgQXJ0aWZhY3RzQ29udGFpbmVyUmVwb3NpdG9yeSh0aGlzLCAnT2NpclJlcG9zaXRvcnknLCB7XG4gICAgICBjb21wYXJ0bWVudElkOiBvY2lyQ29tcGFydG1lbnRJZCxcbiAgICAgIGRpc3BsYXlOYW1lOiBvY2lyUmVwb05hbWUsXG4gICAgICBpc1B1YmxpYzogZmFsc2UsIC8vIFByaXZhdGUgcmVwb3NpdG9yeSBieSBkZWZhdWx0XG4gICAgICBpc0ltbXV0YWJsZTogZmFsc2UsIC8vIEFsbG93IGltYWdlIHVwZGF0ZXNcbiAgICB9KTtcblxuICAgIGNvbnN0IGRvY2tlckNvbnRleHRQYXRoID0gKGNvbmZpZy5kb2NrZXJDb250ZXh0UGF0aCB8fCBjb25maWcuZnVuY3Rpb25KYXJQYXRoKT8udHJpbSgpO1xuICAgIGNvbnN0IGNyZWF0ZUZ1bGxTdGFjayA9IGNvbmZpZy5mdW5jdGlvbk5hbWUgJiYgZG9ja2VyQ29udGV4dFBhdGg7XG5cbiAgICBpZiAoY3JlYXRlRnVsbFN0YWNrKSB7XG4gICAgICBpZiAob2NpckNvbXBhcnRtZW50SWQuaW5jbHVkZXMoJ3Jvb3QnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0Z1bGwgc3RhY2sgKEZ1bmN0aW9uICsgQVBJIEdhdGV3YXkpIHJlcXVpcmVzIGEgbm9uLXJvb3QgY29tcGFydG1lbnQgZm9yIE9DSVIuIFNldCBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRCB0byB5b3VyIGhvbWUgY29tcGFydG1lbnQgT0NJRC4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBmdW5jdGlvbkNvZGVQYXRoID0gcGF0aC5yZXNvbHZlKGRvY2tlckNvbnRleHRQYXRoISk7XG4gICAgICBjb25zdCBpbWFnZVRhZyA9IGNvbmZpZy5pbWFnZVRhZyB8fCAnbGF0ZXN0JztcbiAgICAgIGNvbnN0IG9jaXJSZWdpc3RyeSA9IGAke29jaXJIb3N0S2V5KGNvbmZpZy5yZWdpb24pfS5vY2lyLmlvYDtcbiAgICAgIGNvbnN0IGltYWdlVXJsID0gZ2V0T2NpSW1hZ2VVcmwoY29uZmlnKTtcbiAgICAgIGNvbnN0IGFwcE5hbWUgPSBjb25maWcuZnVuY3Rpb25BcHBOYW1lIHx8IGNvbmZpZy5mdW5jdGlvbk5hbWUhO1xuICAgICAgY29uc3QgcmVzb3VyY2VOYW1lID0gYXBwTmFtZTtcblxuICAgICAgdGhpcy5hZGRPdmVycmlkZSgndGVycmFmb3JtLnJlcXVpcmVkX3Byb3ZpZGVycy5udWxsJywge1xuICAgICAgICBzb3VyY2U6ICdoYXNoaWNvcnAvbnVsbCcsXG4gICAgICAgIHZlcnNpb246ICd+PiAzLjAnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBidWlsZEFuZFB1c2hJbWFnZUlkID0gJ0J1aWxkQW5kUHVzaEltYWdlJztcbiAgICAgIHRoaXMuYWRkT3ZlcnJpZGUoYHJlc291cmNlLm51bGxfcmVzb3VyY2UuJHtidWlsZEFuZFB1c2hJbWFnZUlkfS5kZXBlbmRzX29uYCwgW1xuICAgICAgICAnb2NpX2FydGlmYWN0c19jb250YWluZXJfcmVwb3NpdG9yeS5PY2lyUmVwb3NpdG9yeScsXG4gICAgICBdKTtcbiAgICAgIHRoaXMuYWRkT3ZlcnJpZGUoYHJlc291cmNlLm51bGxfcmVzb3VyY2UuJHtidWlsZEFuZFB1c2hJbWFnZUlkfS50cmlnZ2Vyc2AsIHtcbiAgICAgICAgcmVwb19uYW1lOiBvY2lyUmVwb05hbWUsXG4gICAgICAgIGltYWdlX3VybDogaW1hZ2VVcmwsXG4gICAgICAgIGltYWdlX3RhZzogaW1hZ2VUYWcsXG4gICAgICAgIGhhbmRsZXI6IGNvbmZpZy5oYW5kbGVyIHx8ICcnLFxuICAgICAgICB1c2VfdGhpbl9kb2NrZXJmaWxlOiBjb25maWcudXNlVGhpbkRvY2tlcmZpbGUgPT09IHRydWUgPyAnMScgOiAnMCcsXG4gICAgICAgIG5hbWVzcGFjZTogY29uZmlnLm5hbWVzcGFjZSxcbiAgICAgICAgcmVnaW9uOiBjb25maWcucmVnaW9uLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByZWdpb25QID0gY29uZmlnLnJlZ2lvbjtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZVAgPSBjb25maWcubmFtZXNwYWNlO1xuICAgICAgY29uc3Qgb2NpclVzZXIgPSBwcm9jZXNzLmVudi5PQ0lfT0NJUl9VU0VSTkFNRSB8fCAnQVVUT19ERVRFQ1QnO1xuICAgICAgY29uc3QgbG9naW5TY3JpcHQgPSBwcm9jZXNzLmVudi5PQ0lfQVVUSF9UT0tFTlxuICAgICAgICA/IGBleHBvcnQgT0NJUl9BVVRIX1RPS0VOPVwiJHtwcm9jZXNzLmVudi5PQ0lfQVVUSF9UT0tFTn1cIjsgT0NJUl9VU0VSPVwiJHtvY2lyVXNlcn1cIjsgWyBcIiRPQ0lSX1VTRVJcIiA9IFwiQVVUT19ERVRFQ1RcIiBdICYmIE9DSVJfVVNFUj1cIiR7bmFtZXNwYWNlUH0vdXNlclwiOyBlY2hvIFwiJE9DSVJfQVVUSF9UT0tFTlwiIHwgZG9ja2VyIGxvZ2luICR7b2NpclJlZ2lzdHJ5fSAtdSBcIiRPQ0lSX1VTRVJcIiAtLXBhc3N3b3JkLXN0ZGluIHx8IGV4aXQgMWBcbiAgICAgICAgOiBgb2NpIHJhdy1yZXF1ZXN0IC0tcmVnaW9uICR7cmVnaW9uUH0gLS1odHRwLW1ldGhvZCBHRVQgLS10YXJnZXQtdXJpIFwiaHR0cHM6Ly8ke29jaXJSZWdpc3RyeX0vMjAxODA0MTkvZG9ja2VyL3Rva2VuXCIgMj4vZGV2L251bGwgfCAoY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsICYmIGpxIC1yIC5kYXRhLnRva2VuIHx8IGdyZXAgLW8gJ1widG9rZW5cIjpcIlteXCJdKlwiJyB8IGN1dCAtZCdcIicgLWY0KSB8IGRvY2tlciBsb2dpbiAtdSBCRUFSRVJfVE9LRU4gLS1wYXNzd29yZC1zdGRpbiAke29jaXJSZWdpc3RyeX0gfHwgKGVjaG8gXCJTZXQgT0NJX0FVVEhfVE9LRU4gb3IgY29uZmlndXJlIE9DSSBDTElcIiA+JjI7IGV4aXQgMSlgO1xuICAgICAgY29uc3QgaGFuZGxlciA9IGNvbmZpZy5oYW5kbGVyIHx8ICdjb20uZXhhbXBsZS5mbi5IZWxsb0Z1bmN0aW9uOjpoYW5kbGVSZXF1ZXN0JztcbiAgICAgIGNvbnN0IHVzZVRoaW4gPSBjb25maWcudXNlVGhpbkRvY2tlcmZpbGUgPT09IHRydWU7XG4gICAgICBjb25zdCBkb2NrZXJmaWxlQ29udGVudFRoaW4gPSBgRlJPTSBmbnByb2plY3QvZm4tamF2YS1mZGs6anJlMTctMS4xLjVcbldPUktESVIgL2Z1bmN0aW9uXG5DT1BZIHRhcmdldC8qLmphciAvZnVuY3Rpb24vYXBwL1xuQ01EIFtcIiR7aGFuZGxlci5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJyl9XCJdXG5gO1xuICAgICAgY29uc3QgZG9ja2VyZmlsZUNvbnRlbnRGdWxsID0gYEZST00gZm5wcm9qZWN0L2ZuLWphdmEtZmRrLWJ1aWxkOmpkazE3LTEuMS41IGFzIGJ1aWxkLXN0YWdlXG5XT1JLRElSIC9mdW5jdGlvblxuRU5WIE1BVkVOX09QVFMgLURodHRwLnByb3h5SG9zdD0gLURodHRwLnByb3h5UG9ydD0gLURodHRwcy5wcm94eUhvc3Q9IC1EaHR0cHMucHJveHlQb3J0PSAtRGh0dHAubm9uUHJveHlIb3N0cz0gLURtYXZlbi5yZXBvLmxvY2FsPS91c3Ivc2hhcmUvbWF2ZW4vcmVmL3JlcG9zaXRvcnlcbkFERCBwb20ueG1sIC9mdW5jdGlvbi9wb20ueG1sXG5SVU4gW1wibXZuXCIsIFwicGFja2FnZVwiLCBcImRlcGVuZGVuY3k6Y29weS1kZXBlbmRlbmNpZXNcIiwgXCItRGluY2x1ZGVTY29wZT1ydW50aW1lXCIsIFwiLURza2lwVGVzdHM9dHJ1ZVwiLCBcIi1EbWRlcC5wcmVwZW5kR3JvdXBJZD10cnVlXCIsIFwiLURvdXRwdXREaXJlY3Rvcnk9dGFyZ2V0XCIsIFwiLS1mYWlsLW5ldmVyXCJdXG5BREQgc3JjIC9mdW5jdGlvbi9zcmNcblJVTiBbXCJtdm5cIiwgXCJwYWNrYWdlXCJdXG5GUk9NIGZucHJvamVjdC9mbi1qYXZhLWZkazpqcmUxNy0xLjEuNVxuV09SS0RJUiAvZnVuY3Rpb25cbkNPUFkgLS1mcm9tPWJ1aWxkLXN0YWdlIC9mdW5jdGlvbi90YXJnZXQvKi5qYXIgL2Z1bmN0aW9uL2FwcC9cbkNNRCBbXCIke2hhbmRsZXIucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpfVwiXVxuYDtcbiAgICAgIGNvbnN0IGRvY2tlcmZpbGVDb250ZW50ID0gdXNlVGhpbiA/IGRvY2tlcmZpbGVDb250ZW50VGhpbiA6IGRvY2tlcmZpbGVDb250ZW50RnVsbDtcbiAgICAgIGNvbnN0IGRvY2tlcmlnbm9yZUNvbnRlbnQgPSBgbm9kZV9tb2R1bGVzXG4uZ2l0XG4qLm1kXG4uZW52XG4uaWRlYVxuLnZzY29kZVxuKi5sb2dcbm9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvblxuLm9jZGstb3V0cHV0cy5qc29uXG50YWlsLWZ1bmN0aW9uLWxvZ3MuanNcbnRhaWwtZnVuY3Rpb24tbG9ncy5zaFxuYDtcbiAgICAgIGNvbnN0IGRvY2tlcmZpbGVCNjQgPSBCdWZmZXIuZnJvbShkb2NrZXJmaWxlQ29udGVudCwgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICBjb25zdCBkb2NrZXJpZ25vcmVCNjQgPSBCdWZmZXIuZnJvbShkb2NrZXJpZ25vcmVDb250ZW50LCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgIC8vIEdlbmVyYXRlIERvY2tlcmZpbGUgYW5kIC5kb2NrZXJpZ25vcmUgaW4gbG9jYWwtZXhlYyBvbmx5IGlmIG1pc3Npbmc7IGlmIHRoZXkgZXhpc3QgdXNlIGFzLWlzLiBUaGVuIGxvZ2luLCBidWlsZCwgcHVzaC5cbiAgICAgIHRoaXMuYWRkT3ZlcnJpZGUoYHJlc291cmNlLm51bGxfcmVzb3VyY2UuJHtidWlsZEFuZFB1c2hJbWFnZUlkfS5wcm92aXNpb25lcmAsIFtcbiAgICAgICAge1xuICAgICAgICAgICdsb2NhbC1leGVjJzoge1xuICAgICAgICAgICAgY29tbWFuZDogJ2NkIFwiJEZVTkNUSU9OX0NPREVfUEFUSFwiICYmIChbIC1mIERvY2tlcmZpbGUgXSB8fCAoZWNobyBcIiRET0NLRVJGSUxFX0I2NFwiIHwgYmFzZTY0IC1kID4gRG9ja2VyZmlsZSkpICYmIChbIC1mIC5kb2NrZXJpZ25vcmUgXSB8fCAoZWNobyBcIiRET0NLRVJJR05PUkVfQjY0XCIgfCBiYXNlNjQgLWQgPiAuZG9ja2VyaWdub3JlKSknLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgICAgRlVOQ1RJT05fQ09ERV9QQVRIOiBmdW5jdGlvbkNvZGVQYXRoLFxuICAgICAgICAgICAgICBET0NLRVJGSUxFX0I2NDogZG9ja2VyZmlsZUI2NCxcbiAgICAgICAgICAgICAgRE9DS0VSSUdOT1JFX0I2NDogZG9ja2VyaWdub3JlQjY0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7ICdsb2NhbC1leGVjJzogeyBjb21tYW5kOiBsb2dpblNjcmlwdCwgb25fZmFpbHVyZTogJ2NvbnRpbnVlJyB9IH0sXG4gICAgICAgIHsgJ2xvY2FsLWV4ZWMnOiB7IGNvbW1hbmQ6IGBjZCBcIiR7ZnVuY3Rpb25Db2RlUGF0aC5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJyl9XCIgJiYgZG9ja2VyIGJ1aWxkIC0tcGxhdGZvcm0gbGludXgvYW1kNjQgLXQgJHtpbWFnZVVybH0gLmAgfSB9LFxuICAgICAgICB7ICdsb2NhbC1leGVjJzogeyBjb21tYW5kOiBgZG9ja2VyIHB1c2ggJHtpbWFnZVVybH1gIH0gfSxcbiAgICAgIF0pO1xuXG4gICAgICBjb25zdCB2Y24gPSBuZXcgQ29yZVZjbih0aGlzLCAnVmNuJywge1xuICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgZGlzcGxheU5hbWU6IGAke3Jlc291cmNlTmFtZX0tdmNuYCxcbiAgICAgICAgY2lkckJsb2NrczogWycxMC4wLjAuMC8xNiddLFxuICAgICAgICBkbnNMYWJlbDogJ2FwcGZuJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHVibGljU3VibmV0ID0gbmV3IENvcmVTdWJuZXQodGhpcywgJ1B1YmxpY1N1Ym5ldCcsIHtcbiAgICAgICAgY29tcGFydG1lbnRJZDogY29uZmlnLmNvbXBhcnRtZW50SWQsXG4gICAgICAgIHZjbklkOiB2Y24uaWQsXG4gICAgICAgIGRpc3BsYXlOYW1lOiBgJHtyZXNvdXJjZU5hbWV9LXB1YmxpY2AsXG4gICAgICAgIGNpZHJCbG9jazogJzEwLjAuMS4wLzI0JyxcbiAgICAgICAgZG5zTGFiZWw6ICdwdWJsaWMnLFxuICAgICAgICBwcm9oaWJpdFB1YmxpY0lwT25WbmljOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJpdmF0ZVN1Ym5ldCA9IG5ldyBDb3JlU3VibmV0KHRoaXMsICdQcml2YXRlU3VibmV0Jywge1xuICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgdmNuSWQ6IHZjbi5pZCxcbiAgICAgICAgZGlzcGxheU5hbWU6IGAke3Jlc291cmNlTmFtZX0tcHJpdmF0ZWAsXG4gICAgICAgIGNpZHJCbG9jazogJzEwLjAuMi4wLzI0JyxcbiAgICAgICAgZG5zTGFiZWw6ICdwcml2YXRlJyxcbiAgICAgICAgcHJvaGliaXRQdWJsaWNJcE9uVm5pYzogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwdWJsaWNTbCA9IG5ldyBDb3JlU2VjdXJpdHlMaXN0KHRoaXMsICdQdWJsaWNTZWN1cml0eUxpc3QnLCB7XG4gICAgICAgIGNvbXBhcnRtZW50SWQ6IGNvbmZpZy5jb21wYXJ0bWVudElkLFxuICAgICAgICB2Y25JZDogdmNuLmlkLFxuICAgICAgICBkaXNwbGF5TmFtZTogYCR7cmVzb3VyY2VOYW1lfS1wdWJsaWMtc2xgLFxuICAgICAgICBpbmdyZXNzU2VjdXJpdHlSdWxlczogW1xuICAgICAgICAgIHsgcHJvdG9jb2w6ICc2Jywgc291cmNlOiAnMC4wLjAuMC8wJywgZGVzY3JpcHRpb246ICdIVFRQJywgdGNwT3B0aW9uczogeyBtaW46IDgwLCBtYXg6IDgwIH0gfSxcbiAgICAgICAgICB7IHByb3RvY29sOiAnNicsIHNvdXJjZTogJzAuMC4wLjAvMCcsIGRlc2NyaXB0aW9uOiAnSFRUUFMnLCB0Y3BPcHRpb25zOiB7IG1pbjogNDQzLCBtYXg6IDQ0MyB9IH0sXG4gICAgICAgIF0sXG4gICAgICAgIGVncmVzc1NlY3VyaXR5UnVsZXM6IFt7IHByb3RvY29sOiAnYWxsJywgZGVzdGluYXRpb246ICcwLjAuMC4wLzAnLCBkZXNjcmlwdGlvbjogJ0FsbCcgfV0sXG4gICAgICB9KTtcbiAgICAgIHB1YmxpY1N1Ym5ldC5hZGRPdmVycmlkZSgnc2VjdXJpdHlfbGlzdF9pZHMnLCBbcHVibGljU2wuaWRdKTtcbiAgICAgIGNvbnN0IHByaXZhdGVTbCA9IG5ldyBDb3JlU2VjdXJpdHlMaXN0KHRoaXMsICdQcml2YXRlU2VjdXJpdHlMaXN0Jywge1xuICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgdmNuSWQ6IHZjbi5pZCxcbiAgICAgICAgZGlzcGxheU5hbWU6IGAke3Jlc291cmNlTmFtZX0tcHJpdmF0ZS1zbGAsXG4gICAgICAgIGluZ3Jlc3NTZWN1cml0eVJ1bGVzOiBbXG4gICAgICAgICAgeyBwcm90b2NvbDogJzYnLCBzb3VyY2U6ICcxMC4wLjIuMC8yNCcsIGRlc2NyaXB0aW9uOiAnUEcnLCB0Y3BPcHRpb25zOiB7IG1pbjogNTQzMiwgbWF4OiA1NDMyIH0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgZWdyZXNzU2VjdXJpdHlSdWxlczogW3sgcHJvdG9jb2w6ICdhbGwnLCBkZXN0aW5hdGlvbjogJzAuMC4wLjAvMCcsIGRlc2NyaXB0aW9uOiAnQWxsJyB9XSxcbiAgICAgIH0pO1xuICAgICAgcHJpdmF0ZVN1Ym5ldC5hZGRPdmVycmlkZSgnc2VjdXJpdHlfbGlzdF9pZHMnLCBbcHJpdmF0ZVNsLmlkXSk7XG5cbiAgICAgIGNvbnN0IGFsbFNlcnZpY2VzID0gbmV3IERhdGFPY2lDb3JlU2VydmljZXModGhpcywgJ0FsbFNlcnZpY2VzJywge30pO1xuICAgICAgY29uc3Qgc3ZjR3cgPSBuZXcgQ29yZVNlcnZpY2VHYXRld2F5KHRoaXMsICdTZXJ2aWNlR2F0ZXdheScsIHtcbiAgICAgICAgY29tcGFydG1lbnRJZDogY29uZmlnLmNvbXBhcnRtZW50SWQsXG4gICAgICAgIHZjbklkOiB2Y24uaWQsXG4gICAgICAgIGRpc3BsYXlOYW1lOiBgJHtyZXNvdXJjZU5hbWV9LXNnd2AsXG4gICAgICAgIHNlcnZpY2VzOiBbeyBzZXJ2aWNlSWQ6IGFsbFNlcnZpY2VzLnNlcnZpY2VzLmdldCgwKS5pZCB9XSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJpdlJ0ID0gbmV3IENvcmVSb3V0ZVRhYmxlKHRoaXMsICdQcml2YXRlUm91dGVUYWJsZScsIHtcbiAgICAgICAgY29tcGFydG1lbnRJZDogY29uZmlnLmNvbXBhcnRtZW50SWQsXG4gICAgICAgIHZjbklkOiB2Y24uaWQsXG4gICAgICAgIGRpc3BsYXlOYW1lOiBgJHtyZXNvdXJjZU5hbWV9LXByaXZhdGUtcnRgLFxuICAgICAgICByb3V0ZVJ1bGVzOiBbXG4gICAgICAgICAgeyBuZXR3b3JrRW50aXR5SWQ6IHN2Y0d3LmlkLCBkZXN0aW5hdGlvbjogYWxsU2VydmljZXMuc2VydmljZXMuZ2V0KDApLmNpZHJCbG9jaywgZGVzdGluYXRpb25UeXBlOiAnU0VSVklDRV9DSURSX0JMT0NLJywgZGVzY3JpcHRpb246ICdPQ0lSJyB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgICBwcml2YXRlU3VibmV0LmFkZE92ZXJyaWRlKCdyb3V0ZV90YWJsZV9pZCcsIHByaXZSdC5pZCk7XG4gICAgICBjb25zdCBpZ3cgPSBuZXcgQ29yZUludGVybmV0R2F0ZXdheSh0aGlzLCAnSW50ZXJuZXRHYXRld2F5Jywge1xuICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgdmNuSWQ6IHZjbi5pZCxcbiAgICAgICAgZGlzcGxheU5hbWU6IGAke3Jlc291cmNlTmFtZX0taWd3YCxcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHViUnQgPSBuZXcgQ29yZVJvdXRlVGFibGUodGhpcywgJ1B1YmxpY1JvdXRlVGFibGUnLCB7XG4gICAgICAgIGNvbXBhcnRtZW50SWQ6IGNvbmZpZy5jb21wYXJ0bWVudElkLFxuICAgICAgICB2Y25JZDogdmNuLmlkLFxuICAgICAgICBkaXNwbGF5TmFtZTogYCR7cmVzb3VyY2VOYW1lfS1wdWJsaWMtcnRgLFxuICAgICAgICByb3V0ZVJ1bGVzOiBbXG4gICAgICAgICAgeyBuZXR3b3JrRW50aXR5SWQ6IGlndy5pZCwgZGVzdGluYXRpb246ICcwLjAuMC4wLzAnLCBkZXN0aW5hdGlvblR5cGU6ICdDSURSX0JMT0NLJywgZGVzY3JpcHRpb246ICdJbnRlcm5ldCcgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgICAgcHVibGljU3VibmV0LmFkZE92ZXJyaWRlKCdyb3V0ZV90YWJsZV9pZCcsIHB1YlJ0LmlkKTtcblxuICAgICAgY29uc3QgYXBpR2F0ZXdheSA9IG5ldyBBcGlnYXRld2F5R2F0ZXdheSh0aGlzLCAnQXBpR2F0ZXdheScsIHtcbiAgICAgICAgY29tcGFydG1lbnRJZDogY29uZmlnLmNvbXBhcnRtZW50SWQsXG4gICAgICAgIHN1Ym5ldElkOiBwdWJsaWNTdWJuZXQuaWQsXG4gICAgICAgIGVuZHBvaW50VHlwZTogJ1BVQkxJQycsXG4gICAgICAgIGRpc3BsYXlOYW1lOiBgJHtyZXNvdXJjZU5hbWV9LWFwaS1nYXRld2F5YCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbG9nR3JvdXAgPSBuZXcgTG9nZ2luZ0xvZ0dyb3VwKHRoaXMsICdMb2dHcm91cCcsIHtcbiAgICAgICAgY29tcGFydG1lbnRJZDogY29uZmlnLmNvbXBhcnRtZW50SWQsXG4gICAgICAgIGRpc3BsYXlOYW1lOiBhcHBOYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogYExvZyBncm91cCBmb3IgJHthcHBOYW1lfWAsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGZ1bmN0aW9uQXBwID0gbmV3IEZ1bmN0aW9uc0FwcGxpY2F0aW9uKHRoaXMsICdGdW5jdGlvbkFwcCcsIHtcbiAgICAgICAgY29tcGFydG1lbnRJZDogY29uZmlnLmNvbXBhcnRtZW50SWQsXG4gICAgICAgIGRpc3BsYXlOYW1lOiBhcHBOYW1lLFxuICAgICAgICBzdWJuZXRJZHM6IFtwcml2YXRlU3VibmV0LmlkXSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgb2NpRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb25zRnVuY3Rpb24odGhpcywgJ0Z1bmN0aW9uJywge1xuICAgICAgICBhcHBsaWNhdGlvbklkOiBmdW5jdGlvbkFwcC5pZCxcbiAgICAgICAgZGlzcGxheU5hbWU6IGNvbmZpZy5mdW5jdGlvbk5hbWUhLFxuICAgICAgICBpbWFnZTogaW1hZ2VVcmwsXG4gICAgICAgIG1lbW9yeUluTWJzOiBjb25maWcuZnVuY3Rpb25NZW1vcnlNYiA/PyAnMjU2JyxcbiAgICAgICAgdGltZW91dEluU2Vjb25kczogY29uZmlnLmZ1bmN0aW9uVGltZW91dFNlY29uZHMgPz8gMzAsXG4gICAgICAgIC4uLihjb25maWcuZnVuY3Rpb25Db25maWcgJiYgT2JqZWN0LmtleXMoY29uZmlnLmZ1bmN0aW9uQ29uZmlnKS5sZW5ndGggPiAwID8geyBjb25maWc6IGNvbmZpZy5mdW5jdGlvbkNvbmZpZyB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICBvY2lGdW5jdGlvbi5hZGRPdmVycmlkZSgnZGVwZW5kc19vbicsIFtgbnVsbF9yZXNvdXJjZS4ke2J1aWxkQW5kUHVzaEltYWdlSWR9YF0pO1xuICAgICAgY29uc3QgcGF0aFByZWZpeCA9IGNvbmZpZy5hcGlHd1BhdGhQcmVmaXggPz8gJy8nO1xuICAgICAgbGV0IHJvdXRlczogQXJyYXk8eyBwYXRoOiBzdHJpbmc7IG1ldGhvZHM6IHN0cmluZ1tdOyBiYWNrZW5kOiB7IHR5cGU6IHN0cmluZzsgZnVuY3Rpb25JZDogdHlwZW9mIG9jaUZ1bmN0aW9uLmlkOyByZWFkVGltZW91dEluU2Vjb25kcz86IG51bWJlciB9IH0+O1xuICAgICAgaWYgKGNvbmZpZy5hcGlHd0RlcGxveW1lbnRKc29uUGF0aCAmJiBmcy5leGlzdHNTeW5jKGNvbmZpZy5hcGlHd0RlcGxveW1lbnRKc29uUGF0aCkpIHtcbiAgICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKGNvbmZpZy5hcGlHd0RlcGxveW1lbnRKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgY29uc3Qgc3BlYyA9IEpTT04ucGFyc2UocmF3KSBhcyB7IHJvdXRlcz86IEFycmF5PHsgcGF0aD86IHN0cmluZzsgbWV0aG9kcz86IHN0cmluZ1tdOyBiYWNrZW5kPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT4gfTtcbiAgICAgICAgY29uc3Qgcm91dGVMaXN0ID0gc3BlYz8ucm91dGVzID8/IFtdO1xuICAgICAgICByb3V0ZXMgPSByb3V0ZUxpc3QubWFwKChyKSA9PiB7XG4gICAgICAgICAgY29uc3QgYiA9IHIuYmFja2VuZCA/PyB7fTtcbiAgICAgICAgICBjb25zdCBmdW5jdGlvbklkUmF3ID0gKGIuZnVuY3Rpb25JZCA/PyBiLmZ1bmN0aW9uX2lkKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgZnVuY3Rpb25JZCA9IHR5cGVvZiBmdW5jdGlvbklkUmF3ID09PSAnc3RyaW5nJyAmJiBmdW5jdGlvbklkUmF3LmluY2x1ZGVzKCcke2Z1bmN0aW9uX2lkfScpXG4gICAgICAgICAgICA/IG9jaUZ1bmN0aW9uLmlkXG4gICAgICAgICAgICA6IChmdW5jdGlvbklkUmF3ID8/IG9jaUZ1bmN0aW9uLmlkKTtcbiAgICAgICAgICBjb25zdCByZWFkVGltZW91dCA9IChiLnJlYWRUaW1lb3V0SW5TZWNvbmRzID8/IGIucmVhZF90aW1lb3V0X2luX3NlY29uZHMpIGFzIG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aDogci5wYXRoID8/ICcve3BhdGgqfScsXG4gICAgICAgICAgICBtZXRob2RzOiBBcnJheS5pc0FycmF5KHIubWV0aG9kcykgPyByLm1ldGhvZHMgOiBbJ0dFVCcsICdQT1NUJywgJ09QVElPTlMnXSxcbiAgICAgICAgICAgIGJhY2tlbmQ6IHtcbiAgICAgICAgICAgICAgdHlwZTogKGIudHlwZSBhcyBzdHJpbmcpID8/ICdPUkFDTEVfRlVOQ1RJT05TX0JBQ0tFTkQnLFxuICAgICAgICAgICAgICBmdW5jdGlvbklkLFxuICAgICAgICAgICAgICAuLi4ocmVhZFRpbWVvdXQgIT0gbnVsbCA/IHsgcmVhZFRpbWVvdXRJblNlY29uZHM6IHJlYWRUaW1lb3V0IH0gOiB7fSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgcm91dGVQYXRoID0gY29uZmlnLmFwaUd3Um91dGVQYXRoID8/ICcve3BhdGgqfSc7XG4gICAgICAgIGNvbnN0IG1ldGhvZHMgPSBjb25maWcuYXBpR3dNZXRob2RzPy5sZW5ndGggPyBjb25maWcuYXBpR3dNZXRob2RzIDogWydHRVQnLCAnUE9TVCcsICdPUFRJT05TJ107XG4gICAgICAgIHJvdXRlcyA9IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXRoOiByb3V0ZVBhdGgsXG4gICAgICAgICAgICBtZXRob2RzLFxuICAgICAgICAgICAgYmFja2VuZDoge1xuICAgICAgICAgICAgICB0eXBlOiAnT1JBQ0xFX0ZVTkNUSU9OU19CQUNLRU5EJyxcbiAgICAgICAgICAgICAgZnVuY3Rpb25JZDogb2NpRnVuY3Rpb24uaWQsXG4gICAgICAgICAgICAgIHJlYWRUaW1lb3V0SW5TZWNvbmRzOiBjb25maWcuZnVuY3Rpb25UaW1lb3V0U2Vjb25kcyA/PyAzMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFwaURlcGxveW1lbnQgPSBuZXcgQXBpZ2F0ZXdheURlcGxveW1lbnQodGhpcywgJ0FwaURlcGxveW1lbnQnLCB7XG4gICAgICAgIGNvbXBhcnRtZW50SWQ6IGNvbmZpZy5jb21wYXJ0bWVudElkLFxuICAgICAgICBnYXRld2F5SWQ6IGFwaUdhdGV3YXkuaWQsXG4gICAgICAgIHBhdGhQcmVmaXgsXG4gICAgICAgIGRpc3BsYXlOYW1lOiBgJHtyZXNvdXJjZU5hbWV9LWRlcGxveW1lbnRgLFxuICAgICAgICBzcGVjaWZpY2F0aW9uOiB7XG4gICAgICAgICAgcm91dGVzLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBhcGlEZXBsb3ltZW50Lm5vZGUuYWRkRGVwZW5kZW5jeShvY2lGdW5jdGlvbik7XG5cbiAgICAgIC8vIEZ1bmN0aW9ucyBleGVjdXRpb24gbG9nOiBTRVJWSUNFIGxvZyBmb3IgdGhlIEZ1bmN0aW9ucyBhcHBsaWNhdGlvbiAoY2F0ZWdvcnkgaW52b2tlKVxuICAgICAgY29uc3QgZXhlY3V0aW9uTG9nID0gbmV3IExvZ2dpbmdMb2codGhpcywgJ0V4ZWN1dGlvbkxvZycsIHtcbiAgICAgICAgZGlzcGxheU5hbWU6IGAke2FwcE5hbWV9LWludm9rZWAsXG4gICAgICAgIGxvZ0dyb3VwSWQ6IGxvZ0dyb3VwLmlkLFxuICAgICAgICBsb2dUeXBlOiAnU0VSVklDRScsXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgICBzb3VyY2U6IHtcbiAgICAgICAgICAgIGNhdGVnb3J5OiAnaW52b2tlJyxcbiAgICAgICAgICAgIC8vIEFzc29jaWF0ZSB0aGlzIHNlcnZpY2UgbG9nIHdpdGggdGhlIEZ1bmN0aW9ucyBhcHBsaWNhdGlvblxuICAgICAgICAgICAgcmVzb3VyY2U6IGZ1bmN0aW9uQXBwLmlkLFxuICAgICAgICAgICAgc2VydmljZTogJ2Z1bmN0aW9ucycsXG4gICAgICAgICAgICBzb3VyY2VUeXBlOiAnT0NJU0VSVklDRScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZXhlY3V0aW9uTG9nLm5vZGUuYWRkRGVwZW5kZW5jeShmdW5jdGlvbkFwcCk7XG5cbiAgICAgIC8vIFdyaXRlIHN0YWNrIG91dHB1dHMgdG8gcHJvamVjdCBkaXIgc28gZ2VuZXJhdGVkIHRhaWwtZnVuY3Rpb24tbG9ncy5qcyBjYW4gcmVhZCB0aGVtXG4gICAgICBjb25zdCB3cml0ZU91dHB1dHNJZCA9ICdXcml0ZU91dHB1dHNUb1Byb2plY3QnO1xuICAgICAgdGhpcy5hZGRPdmVycmlkZShgcmVzb3VyY2UubnVsbF9yZXNvdXJjZS4ke3dyaXRlT3V0cHV0c0lkfS50cmlnZ2Vyc2AsIHsgZXhlY3V0aW9uX2xvZ19pZDogZXhlY3V0aW9uTG9nLmlkIH0pO1xuICAgICAgdGhpcy5hZGRPdmVycmlkZShgcmVzb3VyY2UubnVsbF9yZXNvdXJjZS4ke3dyaXRlT3V0cHV0c0lkfS5kZXBlbmRzX29uYCwgWydvY2lfbG9nZ2luZ19sb2cuRXhlY3V0aW9uTG9nJ10pO1xuICAgICAgdGhpcy5hZGRPdmVycmlkZShgcmVzb3VyY2UubnVsbF9yZXNvdXJjZS4ke3dyaXRlT3V0cHV0c0lkfS5wcm92aXNpb25lcmAsIFtcbiAgICAgICAge1xuICAgICAgICAgICdsb2NhbC1leGVjJzoge1xuICAgICAgICAgICAgY29tbWFuZDogJ2lmIFsgLW4gXCIkT0NES19QUk9KRUNUX0RJUlwiIF07IHRoZW4gY2RrdGYgb3V0cHV0IC1qc29uID4gXCIkT0NES19QUk9KRUNUX0RJUi8ub2Nkay1vdXRwdXRzLmpzb25cIjsgZmknLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdKTtcblxuICAgICAgbmV3IFRlcnJhZm9ybU91dHB1dCh0aGlzLCAnb2Npcl9yZXBvc2l0b3J5X25hbWUnLCB7IHZhbHVlOiBvY2lyUmVwb3NpdG9yeS5kaXNwbGF5TmFtZSwgZGVzY3JpcHRpb246ICdPQ0lSIHJlcG9zaXRvcnkgbmFtZScgfSk7XG4gICAgICBuZXcgVGVycmFmb3JtT3V0cHV0KHRoaXMsICdhcGlfZ2F0ZXdheV9ob3N0JywgeyB2YWx1ZTogYXBpR2F0ZXdheS5ob3N0bmFtZSwgZGVzY3JpcHRpb246ICdBUEkgR2F0ZXdheSBob3N0bmFtZScgfSk7XG4gICAgICBuZXcgVGVycmFmb3JtT3V0cHV0KHRoaXMsICdmdW5jdGlvbl9pbnZva2VfdXJsJywgeyB2YWx1ZTogYGh0dHBzOi8vJHthcGlHYXRld2F5Lmhvc3RuYW1lfWAsIGRlc2NyaXB0aW9uOiAnQmFzZSBVUkwgdG8gaW52b2tlIHRoZSBmdW5jdGlvbicgfSk7XG4gICAgICBuZXcgVGVycmFmb3JtT3V0cHV0KHRoaXMsICdmdW5jdGlvbl9pZCcsIHsgdmFsdWU6IG9jaUZ1bmN0aW9uLmlkLCBkZXNjcmlwdGlvbjogJ09DSSBGdW5jdGlvbiBPQ0lEJyB9KTtcbiAgICAgIG5ldyBUZXJyYWZvcm1PdXRwdXQodGhpcywgJ2xvZ19ncm91cF9pZCcsIHsgdmFsdWU6IGxvZ0dyb3VwLmlkLCBkZXNjcmlwdGlvbjogJ09DSSBMb2cgR3JvdXAgT0NJRCBmb3IgdGhlIGFwcGxpY2F0aW9uJyB9KTtcbiAgICAgIG5ldyBUZXJyYWZvcm1PdXRwdXQodGhpcywgJ2V4ZWN1dGlvbl9sb2dfaWQnLCB7IHZhbHVlOiBleGVjdXRpb25Mb2cuaWQsIGRlc2NyaXB0aW9uOiAnT0NJIEZ1bmN0aW9ucyBleGVjdXRpb24gbG9nIE9DSUQnIH0pO1xuICAgIH1cblxuICAgIC8vIEZvcmNlIG9yYWNsZS9vY2kgKFRlcnJhZm9ybSBSZWdpc3RyeSkgc28gdGVycmFmb3JtIGluaXQgdXNlcyBpdCBvbiBPTDggYW5kIGVsc2V3aGVyZTsgbXVzdCBydW4gYWZ0ZXIgcHJvdmlkZXIgaXMgYWRkZWRcbiAgICB0aGlzLmFkZE92ZXJyaWRlKCd0ZXJyYWZvcm0ucmVxdWlyZWRfcHJvdmlkZXJzLm9jaScsIHtcbiAgICAgIHNvdXJjZTogJ29yYWNsZS9vY2knLFxuICAgICAgdmVyc2lvbjogJz49IDUuMC4wLCA8IDYuMC4wJyxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
package/lib/oci-stack.ts
CHANGED
|
@@ -175,6 +175,9 @@ CMD ["${handler.replace(/"/g, '\\"')}"]
|
|
|
175
175
|
.vscode
|
|
176
176
|
*.log
|
|
177
177
|
oci_apigateway_deployment.json
|
|
178
|
+
.ocdk-outputs.json
|
|
179
|
+
tail-function-logs.js
|
|
180
|
+
tail-function-logs.sh
|
|
178
181
|
`;
|
|
179
182
|
const dockerfileB64 = Buffer.from(dockerfileContent, 'utf8').toString('base64');
|
|
180
183
|
const dockerignoreB64 = Buffer.from(dockerignoreContent, 'utf8').toString('base64');
|
|
@@ -364,6 +367,18 @@ oci_apigateway_deployment.json
|
|
|
364
367
|
});
|
|
365
368
|
executionLog.node.addDependency(functionApp);
|
|
366
369
|
|
|
370
|
+
// Write stack outputs to project dir so generated tail-function-logs.js can read them
|
|
371
|
+
const writeOutputsId = 'WriteOutputsToProject';
|
|
372
|
+
this.addOverride(`resource.null_resource.${writeOutputsId}.triggers`, { execution_log_id: executionLog.id });
|
|
373
|
+
this.addOverride(`resource.null_resource.${writeOutputsId}.depends_on`, ['oci_logging_log.ExecutionLog']);
|
|
374
|
+
this.addOverride(`resource.null_resource.${writeOutputsId}.provisioner`, [
|
|
375
|
+
{
|
|
376
|
+
'local-exec': {
|
|
377
|
+
command: 'if [ -n "$OCDK_PROJECT_DIR" ]; then cdktf output -json > "$OCDK_PROJECT_DIR/.ocdk-outputs.json"; fi',
|
|
378
|
+
},
|
|
379
|
+
},
|
|
380
|
+
]);
|
|
381
|
+
|
|
367
382
|
new TerraformOutput(this, 'ocir_repository_name', { value: ocirRepository.displayName, description: 'OCIR repository name' });
|
|
368
383
|
new TerraformOutput(this, 'api_gateway_host', { value: apiGateway.hostname, description: 'API Gateway hostname' });
|
|
369
384
|
new TerraformOutput(this, 'function_invoke_url', { value: `https://${apiGateway.hostname}`, description: 'Base URL to invoke the function' });
|