construct-hub 0.4.4 → 0.4.7
Sign up to get free protection for your applications and to get access to all the features.
- package/.jsii +119 -57
- package/API.md +50 -4
- package/changelog.md +6 -1
- package/docs/operator-runbook.md +32 -0
- package/lib/backend/catalog-builder/index.js +5 -1
- package/lib/construct-hub.d.ts +19 -0
- package/lib/construct-hub.js +37 -12
- package/lib/monitoring/api.d.ts +3 -3
- package/lib/monitoring/api.js +1 -1
- package/lib/monitoring/index.d.ts +4 -4
- package/lib/monitoring/index.js +5 -5
- package/lib/package-sources/code-artifact.js +1 -1
- package/lib/package-sources/npmjs/canary/constants.d.ts +14 -1
- package/lib/package-sources/npmjs/canary/constants.js +1 -1
- package/lib/package-sources/npmjs/canary/index.d.ts +22 -0
- package/lib/package-sources/npmjs/canary/index.js +49 -4
- package/lib/package-sources/npmjs/canary/npmjs-package-canary.lambda.bundle/index.js +40 -1
- package/lib/package-sources/npmjs/canary/npmjs-package-canary.lambda.bundle/index.js.map +2 -2
- package/lib/package-sources/npmjs/canary/npmjs-package-canary.lambda.d.ts +63 -0
- package/lib/package-sources/npmjs/canary/npmjs-package-canary.lambda.js +54 -3
- package/lib/package-sources/npmjs.js +68 -8
- package/lib/package-tag/index.js +3 -3
- package/lib/package-tag-group/index.js +2 -2
- package/lib/preload-file/index.js +1 -1
- package/lib/s3/storage.js +1 -1
- package/lib/spdx-license.js +1 -1
- package/package.json +1 -1
- package/releasetag.txt +1 -1
- package/version.txt +1 -1
@@ -15,3 +15,66 @@
|
|
15
15
|
* will receive one sample per tracked version.
|
16
16
|
*/
|
17
17
|
export declare function handler(event: unknown): Promise<void>;
|
18
|
+
export declare class CanaryStateService {
|
19
|
+
private readonly bucketName;
|
20
|
+
constructor(bucketName: string);
|
21
|
+
/**
|
22
|
+
* Save the state to the bucket.
|
23
|
+
*/
|
24
|
+
save(packageName: string, state: CanaryState): Promise<void>;
|
25
|
+
/**
|
26
|
+
* Load the state file for this package from the bucket.
|
27
|
+
*/
|
28
|
+
load(packageName: string): Promise<CanaryState | undefined>;
|
29
|
+
/**
|
30
|
+
* Create a state from the latest version of the package.
|
31
|
+
*/
|
32
|
+
latest(packageName: string): Promise<CanaryState['latest']>;
|
33
|
+
isNpmReplicaDown(): Promise<boolean>;
|
34
|
+
/**
|
35
|
+
* Estimate how far behind the NPM replica is compared to the live NPM
|
36
|
+
* registry. If the NPM replica is down, return undefined.
|
37
|
+
*/
|
38
|
+
npmReplicaLagSeconds(packageName: string): Promise<number | undefined>;
|
39
|
+
private key;
|
40
|
+
private url;
|
41
|
+
}
|
42
|
+
interface CanaryState {
|
43
|
+
/**
|
44
|
+
* The latest package version, as of the last execution of the canary.
|
45
|
+
*/
|
46
|
+
latest: {
|
47
|
+
/**
|
48
|
+
* The version we are tracking.
|
49
|
+
*/
|
50
|
+
readonly version: string;
|
51
|
+
/**
|
52
|
+
* The publish date of the version.
|
53
|
+
*/
|
54
|
+
readonly publishedAt: Date;
|
55
|
+
/**
|
56
|
+
* The date at which the version is available on the hub.
|
57
|
+
*/
|
58
|
+
availableAt?: Date;
|
59
|
+
};
|
60
|
+
/**
|
61
|
+
* Each existing, but not-yet-found versions that are still tracked.
|
62
|
+
*/
|
63
|
+
pending: {
|
64
|
+
[version: string]: {
|
65
|
+
/**
|
66
|
+
* The version we are tracking.
|
67
|
+
*/
|
68
|
+
readonly version: string;
|
69
|
+
/**
|
70
|
+
* The publish date of the version.
|
71
|
+
*/
|
72
|
+
readonly publishedAt: Date;
|
73
|
+
/**
|
74
|
+
* These pending packages are NEVER available at this point.
|
75
|
+
*/
|
76
|
+
availableAt: undefined;
|
77
|
+
};
|
78
|
+
};
|
79
|
+
}
|
80
|
+
export {};
|
@@ -14,7 +14,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
14
14
|
};
|
15
15
|
var _catalog;
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
17
|
-
exports.handler = void 0;
|
17
|
+
exports.CanaryStateService = exports.handler = void 0;
|
18
18
|
const https = require("https");
|
19
19
|
const zlib_1 = require("zlib");
|
20
20
|
const aws_embedded_metrics_1 = require("aws-embedded-metrics");
|
@@ -66,10 +66,17 @@ async function handler(event) {
|
|
66
66
|
// If the current "latest" isn't the one from state, it needs updating.
|
67
67
|
updateLatestIfNeeded(state, latest);
|
68
68
|
try {
|
69
|
-
await
|
69
|
+
const replicaLag = await stateService.npmReplicaLagSeconds(packageName);
|
70
|
+
await aws_embedded_metrics_1.metricScope((metrics) => async () => {
|
70
71
|
// Clear out default dimensions as we don't need those. See https://github.com/awslabs/aws-embedded-metrics-node/issues/73.
|
71
72
|
metrics.setDimensions();
|
72
73
|
metrics.putMetric("TrackedVersionCount" /* TRACKED_VERSION_COUNT */, Object.keys(state.pending).length + 1, aws_embedded_metrics_1.Unit.Count);
|
74
|
+
metrics.putMetric("NpmReplicaIsDown" /* NPM_REPLICA_DOWN */, (await stateService.isNpmReplicaDown()) ? 1 : 0, aws_embedded_metrics_1.Unit.None);
|
75
|
+
// If we weren't able to calculate the replica's lag, then simply
|
76
|
+
// don't report the metric.
|
77
|
+
if (replicaLag !== undefined) {
|
78
|
+
metrics.putMetric("EstimatedNpmReplicaLag" /* NPM_REPLICA_LAG */, replicaLag, aws_embedded_metrics_1.Unit.Seconds);
|
79
|
+
}
|
73
80
|
})();
|
74
81
|
for (const versionState of [
|
75
82
|
state.latest,
|
@@ -235,6 +242,49 @@ class CanaryStateService {
|
|
235
242
|
console.log(`Package: ${packageName} | Version : ${version} | Published At: ${publishedAt}`);
|
236
243
|
return { version, publishedAt: new Date(publishedAt) };
|
237
244
|
}
|
245
|
+
async isNpmReplicaDown() {
|
246
|
+
try {
|
247
|
+
await getJSON('https://replicate.npmjs.com/');
|
248
|
+
return false;
|
249
|
+
}
|
250
|
+
catch (e) {
|
251
|
+
return true;
|
252
|
+
}
|
253
|
+
}
|
254
|
+
/**
|
255
|
+
* Estimate how far behind the NPM replica is compared to the live NPM
|
256
|
+
* registry. If the NPM replica is down, return undefined.
|
257
|
+
*/
|
258
|
+
async npmReplicaLagSeconds(packageName) {
|
259
|
+
const encodedPackageName = encodeURIComponent(packageName);
|
260
|
+
console.log(`Measuring NPM replica lag using ${packageName}...`);
|
261
|
+
const primaryDate = await getModifiedTimestamp(`registry.npmjs.org`);
|
262
|
+
let replicaDate;
|
263
|
+
try {
|
264
|
+
replicaDate = await getModifiedTimestamp(`replicate.npmjs.com/registry`);
|
265
|
+
}
|
266
|
+
catch (e) {
|
267
|
+
if (e instanceof Error && e.message.includes('HTTP 504')) {
|
268
|
+
console.log(`Warning: error fetching replicate.npmjs.com: ${e.toString()}`);
|
269
|
+
// There is no value to report
|
270
|
+
return undefined;
|
271
|
+
}
|
272
|
+
else {
|
273
|
+
throw e;
|
274
|
+
}
|
275
|
+
}
|
276
|
+
const deltaMs = primaryDate.getTime() - replicaDate.getTime();
|
277
|
+
console.log(`Timestamp on primary: ${primaryDate.toISOString()}`);
|
278
|
+
console.log(`Timestamp on replica: ${replicaDate.toISOString()} (${deltaMs / 3600000} hours behind)`);
|
279
|
+
// We return in seconds... The millisecond resolution is silly here since the probe package is
|
280
|
+
// only published approximately once every three hours. We use seconds only because this is the
|
281
|
+
// largest available time unit in CloudWatch.
|
282
|
+
return deltaMs / 1000;
|
283
|
+
async function getModifiedTimestamp(baseUrl) {
|
284
|
+
const isoDate = await getJSON(`https://${baseUrl}/${encodedPackageName}`, ['time', 'modified']);
|
285
|
+
return new Date(isoDate);
|
286
|
+
}
|
287
|
+
}
|
238
288
|
key(packageName) {
|
239
289
|
return `${"package-canary/" /* STATE_PREFIX */}${packageName}${".state.json" /* STATE_SUFFIX */}`;
|
240
290
|
}
|
@@ -242,6 +292,7 @@ class CanaryStateService {
|
|
242
292
|
return `s3://${this.bucketName}/${this.key(packageName)}`;
|
243
293
|
}
|
244
294
|
}
|
295
|
+
exports.CanaryStateService = CanaryStateService;
|
245
296
|
/**
|
246
297
|
* Makes a request to the provided URL and returns the response after having
|
247
298
|
* parsed it from JSON.
|
@@ -298,4 +349,4 @@ function gunzip(readable) {
|
|
298
349
|
readable.pipe(gz, { end: true });
|
299
350
|
return gz;
|
300
351
|
}
|
301
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtanMtcGFja2FnZS1jYW5hcnkubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BhY2thZ2Utc291cmNlcy9ucG1qcy9jYW5hcnkvbnBtanMtcGFja2FnZS1jYW5hcnkubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0JBQStCO0FBRS9CLCtCQUFvQztBQUNwQywrREFBd0U7QUFFeEUseUNBQXlDO0FBRXpDLGlFQUFpRTtBQUNqRSxpRkFBdUU7QUFDdkUsMkNBS3FCO0FBRXJCLG9DQUFhLENBQUMsU0FBUyxHQUFHLDZCQUFpQixDQUFDO0FBRTVDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNJLEtBQUssVUFBVSxPQUFPLENBQUMsS0FBYzs7SUFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFeEQsTUFBTSxXQUFXLEdBQUcsOEJBQVUsbUNBQTBCLENBQUM7SUFDekQsTUFBTSxXQUFXLEdBQUcsOEJBQVUsK0RBQXdDLENBQUM7SUFDdkUsTUFBTSxvQkFBb0IsR0FBRyw4QkFBVSx1REFBb0MsQ0FBQztJQUU1RSxNQUFNLFlBQVksR0FBRyxJQUFJLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFFNUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sS0FBSyxTQUFnQixDQUFDLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxtQ0FBSTtRQUNuRSxrRkFBa0Y7UUFDbEYsTUFBTSxFQUFFO1lBQ04sR0FBRyxNQUFNO1lBQ1QsK0RBQStEO1lBQy9E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O0lBQ2pDLE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGh0dHBzIGZyb20gJ2h0dHBzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IGNyZWF0ZUd1bnppcCB9IGZyb20gJ3psaWInO1xuaW1wb3J0IHsgbWV0cmljU2NvcGUsIENvbmZpZ3VyYXRpb24sIFVuaXQgfSBmcm9tICdhd3MtZW1iZWRkZWQtbWV0cmljcyc7XG5pbXBvcnQgdHlwZSB7IEFXU0Vycm9yLCBTMyB9IGZyb20gJ2F3cy1zZGsnO1xuaW1wb3J0ICogYXMgSlNPTlN0cmVhbSBmcm9tICdKU09OU3RyZWFtJztcbmltcG9ydCB7IENhdGFsb2dNb2RlbCB9IGZyb20gJy4uLy4uLy4uL2JhY2tlbmQnO1xuaW1wb3J0ICogYXMgYXdzIGZyb20gJy4uLy4uLy4uL2JhY2tlbmQvc2hhcmVkL2F3cy5sYW1iZGEtc2hhcmVkJztcbmltcG9ydCB7IHJlcXVpcmVFbnYgfSBmcm9tICcuLi8uLi8uLi9iYWNrZW5kL3NoYXJlZC9lbnYubGFtYmRhLXNoYXJlZCc7XG5pbXBvcnQge1xuICBNRVRSSUNTX05BTUVTUEFDRSxcbiAgTWV0cmljTmFtZSxcbiAgRW52aXJvbm1lbnQsXG4gIE9iamVjdEtleSxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5Db25maWd1cmF0aW9uLm5hbWVzcGFjZSA9IE1FVFJJQ1NfTkFNRVNQQUNFO1xuXG4vKipcbiAqIFRoaXMgcGFja2FnZSBjYW5hcnkgbW9uaXRvcnMgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgdmVyc2lvbnMgb2YgYSBzcGVjaWZpZWRcbiAqIHBhY2thZ2UgaW4gdGhlIENvbnN0cnVjdEh1YiBjYXRhbG9nLiBJdCBwdWJsaXNoZXMgbWV0cmljcyB0aGF0IGhlbHBcbiAqIHVuZGVyc3RhbmQgaG93IG11Y2ggdGltZSBwYXNzZXMgYmV0d2VlbiBhIHBha2NhZ2UgYXBwZWFyaW5nIGluIHRoZSBwdWJsaWNcbiAqIHJlZ2lzdHJ5IGFuZCBpdCdzIGF2YWlsYWJpbGl0eSBpbiB0aGUgQ29uc3RydWN0SHViIGluc3RhbmNlLlxuICpcbiAqIEZyb20gdGhlIG1vbWVudCBhIHBhY2thZ2UgaGFzIGJlZW4gcHVibGlzaGVkLCBhbmQgdW50aWwgaXQgYXBwZWFyZWQgaW5cbiAqIGNhdGFsb2csIHRoZSBgTWV0cmljTmFtZS5EV0VMTF9USU1FYCBtZXRyaWMgaXMgZW1pdHRlZC5cbiAqXG4gKiBPbmNlIHRoZSBwYWNrYWdlIGhhcyBhcHBlYXJlZCBpbiBjYXRhbG9nLCBhbmQgdW50aWwgYSBuZXcgcGFja2FnZSB2ZXJzaW9uIGlzXG4gKiBpZGVudGlmaWVkIGluIG5wbWpzLmNvbSwgdGhlIGBNZXRyaWNOYW1lLlRJTUVfVE9fQ0FUQUxPR2AgbWV0cmljIGlzIGVtaXR0ZWQuXG4gKlxuICogSWYgYSBuZXcgcGFja2FnZSB2ZXJzaW9uIGlzIHB1Ymxpc2hlZCBiZWZvcmUgdGhlIHByZXZpb3VzIG9uZSBoYXMgYXBwZWFyZWRcbiAqIGluIGNhdGFsb2csIGJvdGggdmVyc2lvbnMgd2lsbCBiZSB0cmFja2VkIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCB0aGUgbWV0cmljc1xuICogd2lsbCByZWNlaXZlIG9uZSBzYW1wbGUgcGVyIHRyYWNrZWQgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQ6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc29sZS5sb2coYEV2ZW50OiAke0pTT04uc3RyaW5naWZ5KGV2ZW50LCBudWxsLCAyKX1gKTtcblxuICBjb25zdCBwYWNrYWdlTmFtZSA9IHJlcXVpcmVFbnYoRW52aXJvbm1lbnQuUEFDS0FHRV9OQU1FKTtcbiAgY29uc3Qgc3RhdGVCdWNrZXQgPSByZXF1aXJlRW52KEVudmlyb25tZW50LlBBQ0tBR0VfQ0FOQVJZX0JVQ0tFVF9OQU1FKTtcbiAgY29uc3QgY29uc3RydWN0SHViRW5kcG9pbnQgPSByZXF1aXJlRW52KEVudmlyb25tZW50LkNPTlNUUlVDVF9IVUJfQkFTRV9VUkwpO1xuXG4gIGNvbnN0IHN0YXRlU2VydmljZSA9IG5ldyBDYW5hcnlTdGF0ZVNlcnZpY2Uoc3RhdGVCdWNrZXQpO1xuICBjb25zdCBjb25zdHJ1Y3RIdWIgPSBuZXcgQ29uc3RydWN0SHViKGNvbnN0cnVjdEh1YkVuZHBvaW50KTtcblxuICBjb25zdCBsYXRlc3QgPSBhd2FpdCBzdGF0ZVNlcnZpY2UubGF0ZXN0KHBhY2thZ2VOYW1lKTtcbiAgY29uc3Qgc3RhdGU6IENhbmFyeVN0YXRlID0gKGF3YWl0IHN0YXRlU2VydmljZS5sb2FkKHBhY2thZ2VOYW1lKSkgPz8ge1xuICAgIC8vIElmIHdlIGRpZCBub3QgaGF2ZSBhbnkgc3RhdGUsIHdlJ2xsIGJvb3RzdHJhcCB1c2luZyB0aGUgY3VycmVudCBsYXRlc3QgdmVyc2lvbi5cbiAgICBsYXRlc3Q6IHtcbiAgICAgIC4uLmxhdGVzdCxcbiAgICAgIC8vIElmIHRoYXQgbGF0ZXN0IHZlcnNpb24gaXMgQUxSRUFEWSBpbiBjYXRhbG9nLCBwcmV0ZW5kIGl0IHdhc1xuICAgICAgLy8gXCJpbnN0YW50YW5lb3VzbHlcIiB0aGVyZSwgc28gd2UgYXZvaWQgcG9zc2libHkgcmVwb3J0aW5nIGFuIGJyZWFjaCBvZlxuICAgICAgLy8gU0xBIGFsYXJtLCB3aGVuIHdlIHJlYWxseSBqdXN0IG9ic2VydmVkIHByZXNlbmNlIG9mIHRoZSBwYWNrYWdlIGluXG4gICAgICAvLyBjYXRhbG9nIHRvbyBsYXRlLCBmb3IgZXhhbXBsZSBvbiBmaXJzdCBkZXBsb3ltZW50IG9mIHRoZSBjYW5hcnkuXG4gICAgICBhdmFpbGFibGVBdDogKGF3YWl0IGNvbnN0cnVjdEh1Yi5pc0luQ2F0YWxvZyhwYWNrYWdlTmFtZSwgbGF0ZXN0LnZlcnNpb24pKVxuICAgICAgICA/IGxhdGVzdC5wdWJsaXNoZWRBdFxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9LFxuICAgIHBlbmRpbmc6IHt9LFxuICB9O1xuXG4gIGNvbnNvbGUubG9nKGBJbml0aWFsIHN0YXRlOiAke0pTT04uc3RyaW5naWZ5KHN0YXRlLCBudWxsLCAyKX1gKTtcblxuICAvLyBJZiB0aGUgY3VycmVudCBcImxhdGVzdFwiIGlzbid0IHRoZSBvbmUgZnJvbSBzdGF0ZSwgaXQgbmVlZHMgdXBkYXRpbmcuXG4gIHVwZGF0ZUxhdGVzdElmTmVlZGVkKHN0YXRlLCBsYXRlc3QpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgbWV0cmljU2NvcGUoKG1ldHJpY3MpID0+ICgpID0+IHtcbiAgICAgIC8vIENsZWFyIG91dCBkZWZhdWx0IGRpbWVuc2lvbnMgYXMgd2UgZG9uJ3QgbmVlZCB0aG9zZS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3NsYWJzL2F3cy1lbWJlZGRlZC1tZXRyaWNzLW5vZGUvaXNzdWVzLzczLlxuICAgICAgbWV0cmljcy5zZXREaW1lbnNpb25zKCk7XG4gICAgICBtZXRyaWNzLnB1dE1ldHJpYyhcbiAgICAgICAgTWV0cmljTmFtZS5UUkFDS0VEX1ZFUlNJT05fQ09VTlQsXG4gICAgICAgIE9iamVjdC5rZXlzKHN0YXRlLnBlbmRpbmcpLmxlbmd0aCArIDEsXG4gICAgICAgIFVuaXQuQ291bnRcbiAgICAgICk7XG4gICAgfSkoKTtcblxuICAgIGZvciAoY29uc3QgdmVyc2lvblN0YXRlIG9mIFtcbiAgICAgIHN0YXRlLmxhdGVzdCxcbiAgICAgIC4uLk9iamVjdC52YWx1ZXMoc3RhdGUucGVuZGluZyA/PyB7fSksXG4gICAgXSkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBDaGVja2luZyBzdGF0ZSBvZiAke3ZlcnNpb25TdGF0ZS52ZXJzaW9ufSwgY3VycmVudDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICB2ZXJzaW9uU3RhdGUsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICAyXG4gICAgICAgICl9YFxuICAgICAgKTtcblxuICAgICAgYXdhaXQgbWV0cmljU2NvcGUoKG1ldHJpY3MpID0+IGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYXIgb3V0IGRlZmF1bHQgZGltZW5zaW9ucyBhcyB3ZSBkb24ndCBuZWVkIHRob3NlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3c2xhYnMvYXdzLWVtYmVkZGVkLW1ldHJpY3Mtbm9kZS9pc3N1ZXMvNzMuXG4gICAgICAgIG1ldHJpY3Muc2V0RGltZW5zaW9ucygpO1xuICAgICAgICBtZXRyaWNzLnNldFByb3BlcnR5KCdQYWNrYWdlTmFtZScsIHBhY2thZ2VOYW1lKTtcbiAgICAgICAgbWV0cmljcy5zZXRQcm9wZXJ0eSgnUGFja2FnZVZlcnNpb24nLCB2ZXJzaW9uU3RhdGUudmVyc2lvbik7XG4gICAgICAgIG1ldHJpY3Muc2V0UHJvcGVydHkoXG4gICAgICAgICAgJ0lzTGF0ZXN0JyxcbiAgICAgICAgICBzdGF0ZS5sYXRlc3QudmVyc2lvbiA9PT0gdmVyc2lvblN0YXRlLnZlcnNpb25cbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXZlcnNpb25TdGF0ZS5hdmFpbGFibGVBdCkge1xuICAgICAgICAgIGlmICh2ZXJzaW9uU3RhdGUudmVyc2lvbiA9PT0gc3RhdGUubGF0ZXN0LnZlcnNpb24pIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgYXdhaXQgY29uc3RydWN0SHViLmlzSW5DYXRhbG9nKHBhY2thZ2VOYW1lLCB2ZXJzaW9uU3RhdGUudmVyc2lvbilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB2ZXJzaW9uU3RhdGUuYXZhaWxhYmxlQXQgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOb24tY3VycmVudCB2ZXJzaW9ucyB3aWxsIHByb2JhYmx5IG5ldmVyIG1ha2UgaXQgdG8gY2F0YWxvZyAodGhleSdyZSBvbGRlciB0aGFuIHRoZVxuICAgICAgICAgICAgLy8gY3VycmVudCB2ZXJzaW9uKSwgc28gaW5zdGVhZCwgd2UgY2hlY2sgd2hldGhlciB0aGV5IGhhdmUgVHlwZVNjcmlwdCBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBhd2FpdCBjb25zdHJ1Y3RIdWIuaGFzVHlwZVNjcmlwdERvY3VtZW50YXRpb24oXG4gICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsXG4gICAgICAgICAgICAgICAgdmVyc2lvblN0YXRlLnZlcnNpb25cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHZlcnNpb25TdGF0ZS5hdmFpbGFibGVBdCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZlcnNpb25TdGF0ZS5hdmFpbGFibGVBdCkge1xuICAgICAgICAgIC8vIFRlbGxzIHVzIGhvdyBsb25nIGl0J3MgdGFrZW4gZm9yIHRoZSBwYWNrYWdlIHRvIG1ha2UgaXQgdG8gY2F0YWxvZyBhZnRlciBpdCB3YXMgcHVibGlzaGVkLlxuICAgICAgICAgIG1ldHJpY3MucHV0TWV0cmljKFxuICAgICAgICAgICAgTWV0cmljTmFtZS5USU1FX1RPX0NBVEFMT0csXG4gICAgICAgICAgICAodmVyc2lvblN0YXRlLmF2YWlsYWJsZUF0LmdldFRpbWUoKSAtXG4gICAgICAgICAgICAgIHZlcnNpb25TdGF0ZS5wdWJsaXNoZWRBdC5nZXRUaW1lKCkpIC9cbiAgICAgICAgICAgICAgMV8wMDAsXG4gICAgICAgICAgICBVbml0LlNlY29uZHNcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gU3RvcCB0cmFja2luZyB0aGF0IHZlcnNpb24sIGFzIGl0J3Mgbm93IGF2YWlsYWJsZS5cbiAgICAgICAgICBpZiAodmVyc2lvblN0YXRlLnZlcnNpb24gaW4gc3RhdGUucGVuZGluZykge1xuICAgICAgICAgICAgZGVsZXRlIHN0YXRlLnBlbmRpbmdbdmVyc2lvblN0YXRlLnZlcnNpb25dO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUZWxscyB1cyBob3cgbG9uZyB3ZSd2ZSBiZWVuIHdhaXRpbmcgZm9yIHRoaXMgdmVyc2lvbiB0byBzaG93IHVwLCBzbyBmYXIuXG4gICAgICAgICAgbWV0cmljcy5wdXRNZXRyaWMoXG4gICAgICAgICAgICBNZXRyaWNOYW1lLkRXRUxMX1RJTUUsXG4gICAgICAgICAgICAoRGF0ZS5ub3coKSAtIHZlcnNpb25TdGF0ZS5wdWJsaXNoZWRBdC5nZXRUaW1lKCkpIC8gMV8wMDAsXG4gICAgICAgICAgICBVbml0LlNlY29uZHNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBzdGF0ZVNlcnZpY2Uuc2F2ZShwYWNrYWdlTmFtZSwgc3RhdGUpO1xuICB9XG59XG5cbmNsYXNzIENvbnN0cnVjdEh1YiB7XG4gICNjYXRhbG9nPzogQ2F0YWxvZ01vZGVsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYmFzZVVybDogc3RyaW5nKSB7fVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwYWNrYWdlIHZlcnNpb24gaXMgcHJlc2VudCBpbiB0aGUgY2F0YWxvZ1xuICAgKiBvYmplY3Qgb3Igbm90LlxuICAgKlxuICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgICAgdGhlIG5hbWUgb2YgdGhlIGNoZWNrZWQgcGFja2FnZS5cbiAgICogQHBhcmFtIHBhY2thZ2VWZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBjaGVja2VkIHBhY2thZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBJSUYgdGhlIGV4YWN0IHBhY2thZ2UgdmVyc2lvbiBpcyBmb3VuZCBpbiB0aGUgY2F0YWxvZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBpc0luQ2F0YWxvZyhcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICAgIHBhY2thZ2VWZXJzaW9uOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2F0YWxvZyA9IGF3YWl0IHRoaXMuZ2V0Q2F0YWxvZygpO1xuICAgIGNvbnN0IGZpbHRlcmVkID0gY2F0YWxvZy5wYWNrYWdlcy5maWx0ZXIoXG4gICAgICAocDogYW55KSA9PiBwLm5hbWUgPT09IHBhY2thZ2VOYW1lICYmIHAudmVyc2lvbiA9PT0gcGFja2FnZVZlcnNpb25cbiAgICApO1xuXG4gICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZvdW5kIG11bHRpcGxlIGVudHJpZXMgZm9yICR7cGFja2FnZU5hbWV9QCR7cGFja2FnZVZlcnNpb259IGluIGNhdGFsb2dgXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXJlZC5sZW5ndGggPT09IDE7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgVHlwZVNjcmlwdCBkb2N1bWVudGF0aW9uIGV4aXN0cyBpbiBDb25zdHJ1Y3RIdWIgZm9yIHRoZVxuICAgKiBzcGVjaWZpZWQgcGFja2FnZSB2ZXJzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgICAgdGhlIG5hbWUgb2YgdGhlIGNoZWNrZWQgcGFja2FnZS5cbiAgICogQHBhcmFtIHBhY2thZ2VWZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBjaGVja2VkIHBhY2thZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBJSUYgdGhlIGBkb2NzLXR5cGVzY3JpcHQubWRgIGRvY3VtZW50IGV4aXN0cyBmb3IgdGhlXG4gICAqICAgICAgICAgIHNwZWNpZmllZCBwYWNrYWdlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhc1R5cGVTY3JpcHREb2N1bWVudGF0aW9uKFxuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gICAgcGFja2FnZVZlcnNpb246IHN0cmluZ1xuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKG9rLCBrbykgPT4ge1xuICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5iYXNlVXJsfS9kYXRhLyR7cGFja2FnZU5hbWV9L3Yke3BhY2thZ2VWZXJzaW9ufS9kb2NzLXR5cGVzY3JpcHQubWRgO1xuICAgICAgaHR0cHNcbiAgICAgICAgLnJlcXVlc3QodXJsLCB7IG1ldGhvZDogJ0hFQUQnIH0sIChyZXMpID0+IHtcbiAgICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgPT09IDIwMCkge1xuICAgICAgICAgICAgLy8gVGhpcyByZXR1cm5zIEhUVFAgMjAwIHdpdGggdGV4dC9odG1sIGlmIGl0J3MgYSA0MDQsIGR1ZSB0byBob3dcbiAgICAgICAgICAgIC8vIHdlIGNvbmZpZ3VyZWQgQ2xvdWRGcm9udCBiZWhhdmlvcnMuXG4gICAgICAgICAgICByZXR1cm4gb2soXG4gICAgICAgICAgICAgICEhcmVzLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddPy5zdGFydHNXaXRoKCd0ZXh0L21hcmtkb3duJylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBIRUFEICR7dXJsfSAtLSBIVFRQICR7cmVzLnN0YXR1c0NvZGV9ICgke3Jlcy5zdGF0dXNNZXNzYWdlfSlgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIpO1xuICAgICAgICAgIGtvKGVycik7XG4gICAgICAgIH0pXG4gICAgICAgIC5lbmQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q2F0YWxvZygpOiBQcm9taXNlPENhdGFsb2dNb2RlbD4ge1xuICAgIGlmICh0aGlzLiNjYXRhbG9nKSB7XG4gICAgICByZXR1cm4gdGhpcy4jY2F0YWxvZztcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLiNjYXRhbG9nID0gYXdhaXQgZ2V0SlNPTihgJHt0aGlzLmJhc2VVcmx9L2NhdGFsb2cuanNvbmApKTtcbiAgfVxufVxuXG5jbGFzcyBDYW5hcnlTdGF0ZVNlcnZpY2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGJ1Y2tldE5hbWU6IHN0cmluZykge31cblxuICAvKipcbiAgICogU2F2ZSB0aGUgc3RhdGUgdG8gdGhlIGJ1Y2tldC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzYXZlKHBhY2thZ2VOYW1lOiBzdHJpbmcsIHN0YXRlOiBDYW5hcnlTdGF0ZSkge1xuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKHBhY2thZ2VOYW1lKTtcblxuICAgIGNvbnNvbGUubG9nKGBTYXZpbmcgdG8gJHt1cmx9OiAke0pTT04uc3RyaW5naWZ5KHN0YXRlLCBudWxsLCAyKX1gKTtcbiAgICBhd2FpdCBhd3NcbiAgICAgIC5zMygpXG4gICAgICAucHV0T2JqZWN0KHtcbiAgICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldE5hbWUsXG4gICAgICAgIEtleTogdGhpcy5rZXkocGFja2FnZU5hbWUpLFxuICAgICAgICBCb2R5OiBKU09OLnN0cmluZ2lmeShzdGF0ZSwgbnVsbCwgMiksXG4gICAgICAgIENvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9KVxuICAgICAgLnByb21pc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBzdGF0ZSBmaWxlIGZvciB0aGlzIHBhY2thZ2UgZnJvbSB0aGUgYnVja2V0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWQocGFja2FnZU5hbWU6IHN0cmluZyk6IFByb21pc2U8Q2FuYXJ5U3RhdGUgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBzdGF0ZSBmb3IgcGFja2FnZSAnJHtwYWNrYWdlTmFtZX0nYCk7XG5cbiAgICBjb25zdCBvYmplY3RLZXkgPSB0aGlzLmtleShwYWNrYWdlTmFtZSk7XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwocGFja2FnZU5hbWUpO1xuXG4gICAgY29uc29sZS5sb2coYEZldGNoaW5nOiAke3VybH1gKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgYXdzXG4gICAgICAuczMoKVxuICAgICAgLmdldE9iamVjdCh7IEJ1Y2tldDogdGhpcy5idWNrZXROYW1lLCBLZXk6IG9iamVjdEtleSB9KVxuICAgICAgLnByb21pc2UoKVxuICAgICAgLmNhdGNoKChlcnI6IEFXU0Vycm9yKSA9PlxuICAgICAgICBlcnIuY29kZSAhPT0gJ05vU3VjaEtleSdcbiAgICAgICAgICA/IFByb21pc2UucmVqZWN0KGVycilcbiAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgICAgIC8qIG5vIGRhdGEgKi9cbiAgICAgICAgICAgIH0gYXMgUzMuR2V0T2JqZWN0T3V0cHV0KVxuICAgICAgKTtcblxuICAgIGlmICghZGF0YT8uQm9keSkge1xuICAgICAgY29uc29sZS5sb2coYE5vdCBmb3VuZDogJHt1cmx9YCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBMb2FkZWQ6ICR7dXJsfWApO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEuQm9keS50b1N0cmluZygndXRmLTgnKSwgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGlmIChrZXkgPT09ICdwdWJsaXNoZWRBdCcgfHwga2V5ID09PSAnYXZhaWxhYmxlQXQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgc3RhdGUgZnJvbSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHBhY2thZ2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGF0ZXN0KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPENhbmFyeVN0YXRlWydsYXRlc3QnXT4ge1xuICAgIGNvbnNvbGUubG9nKGBGZXRjaGluZyBsYXRlc3QgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIE5QTTogJHtwYWNrYWdlTmFtZX1gKTtcbiAgICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0SlNPTihcbiAgICAgIGBodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy8ke2VuY29kZVVSSUNvbXBvbmVudChwYWNrYWdlTmFtZSl9L2xhdGVzdGAsXG4gICAgICBbJ3ZlcnNpb24nXVxuICAgICk7XG4gICAgY29uc3QgcHVibGlzaGVkQXQgPSBhd2FpdCBnZXRKU09OKFxuICAgICAgYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhY2thZ2VOYW1lKX1gLFxuICAgICAgWyd0aW1lJywgdmVyc2lvbl1cbiAgICApO1xuXG4gICAgY29uc29sZS5sb2coXG4gICAgICBgUGFja2FnZTogJHtwYWNrYWdlTmFtZX0gfCBWZXJzaW9uIDogJHt2ZXJzaW9ufSB8IFB1Ymxpc2hlZCBBdDogJHtwdWJsaXNoZWRBdH1gXG4gICAgKTtcblxuICAgIHJldHVybiB7IHZlcnNpb24sIHB1Ymxpc2hlZEF0OiBuZXcgRGF0ZShwdWJsaXNoZWRBdCkgfTtcbiAgfVxuXG4gIHByaXZhdGUga2V5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtPYmplY3RLZXkuU1RBVEVfUFJFRklYfSR7cGFja2FnZU5hbWV9JHtPYmplY3RLZXkuU1RBVEVfU1VGRklYfWA7XG4gIH1cblxuICBwcml2YXRlIHVybChwYWNrYWdlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGBzMzovLyR7dGhpcy5idWNrZXROYW1lfS8ke3RoaXMua2V5KHBhY2thZ2VOYW1lKX1gO1xuICB9XG59XG5cbmludGVyZmFjZSBDYW5hcnlTdGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgbGF0ZXN0IHBhY2thZ2UgdmVyc2lvbiwgYXMgb2YgdGhlIGxhc3QgZXhlY3V0aW9uIG9mIHRoZSBjYW5hcnkuXG4gICAqL1xuICBsYXRlc3Q6IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiB3ZSBhcmUgdHJhY2tpbmcuXG4gICAgICovXG4gICAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHB1Ymxpc2ggZGF0ZSBvZiB0aGUgdmVyc2lvbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBwdWJsaXNoZWRBdDogRGF0ZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGF0IHdoaWNoIHRoZSB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBvbiB0aGUgaHViLlxuICAgICAqL1xuICAgIGF2YWlsYWJsZUF0PzogRGF0ZTtcbiAgfTtcblxuICAvKipcbiAgICogRWFjaCBleGlzdGluZywgYnV0IG5vdC15ZXQtZm91bmQgdmVyc2lvbnMgdGhhdCBhcmUgc3RpbGwgdHJhY2tlZC5cbiAgICovXG4gIHBlbmRpbmc6IHtcbiAgICBbdmVyc2lvbjogc3RyaW5nXToge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdmVyc2lvbiB3ZSBhcmUgdHJhY2tpbmcuXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgcHVibGlzaCBkYXRlIG9mIHRoZSB2ZXJzaW9uLlxuICAgICAgICovXG4gICAgICByZWFkb25seSBwdWJsaXNoZWRBdDogRGF0ZTtcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGVzZSBwZW5kaW5nIHBhY2thZ2VzIGFyZSBORVZFUiBhdmFpbGFibGUgYXQgdGhpcyBwb2ludC5cbiAgICAgICAqL1xuICAgICAgYXZhaWxhYmxlQXQ6IHVuZGVmaW5lZDtcbiAgICB9O1xuICB9O1xufVxuXG4vKipcbiAqIE1ha2VzIGEgcmVxdWVzdCB0byB0aGUgcHJvdmlkZWQgVVJMIGFuZCByZXR1cm5zIHRoZSByZXNwb25zZSBhZnRlciBoYXZpbmdcbiAqIHBhcnNlZCBpdCBmcm9tIEpTT04uXG4gKlxuICogQHBhcmFtIHVybCB0aGUgVVJMIHRvIGdldC5cbiAqIEBwYXJhbSBqc29uUGF0aCBhIEpTT04gcGF0aCB0byBleHRyYWN0IG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZ2V0SlNPTih1cmw6IHN0cmluZywganNvblBhdGg/OiBzdHJpbmdbXSk6IFByb21pc2U8YW55PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgob2ssIGtvKSA9PiB7XG4gICAgaHR0cHMuZ2V0KFxuICAgICAgdXJsLFxuICAgICAge1xuICAgICAgICBoZWFkZXJzOiB7IEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQWNjZXB0LUVuY29kaW5nJzogJ2lkZW50aXR5JyB9LFxuICAgICAgfSxcbiAgICAgIChyZXMpID0+IHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBHRVQgJHt1cmx9IC0gSFRUUCAke3Jlcy5zdGF0dXNDb2RlfSAoJHtyZXMuc3RhdHVzTWVzc2FnZX0pYFxuICAgICAgICAgICk7XG4gICAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoZXJyb3IpO1xuICAgICAgICAgIHJldHVybiBrbyhlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXMub25jZSgnZXJyb3InLCBrbyk7XG5cbiAgICAgICAgY29uc3QganNvbiA9IEpTT05TdHJlYW0ucGFyc2UoanNvblBhdGgpO1xuICAgICAgICBqc29uLm9uY2UoJ2RhdGEnLCBvayk7XG4gICAgICAgIGpzb24ub25jZSgnZXJyb3InLCBrbyk7XG5cbiAgICAgICAgY29uc3QgcGxhaW5QYXlsb2FkID1cbiAgICAgICAgICByZXMuaGVhZGVyc1snY29udGVudC1lbmNvZGluZyddID09PSAnZ3ppcCcgPyBndW56aXAocmVzKSA6IHJlcztcbiAgICAgICAgcGxhaW5QYXlsb2FkLnBpcGUoanNvbiwgeyBlbmQ6IHRydWUgfSk7XG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgYGxhdGVzdGAgcHJvcGVydHkgb2YgYHN0YXRlYCB0aSB0aGUgcHJvdmlkZWQgYGxhdGVzdGAgdmFsdWUsXG4gKiB1bmxlc3MgdGhpcyBpcyBhbHJlYWR5IHRoZSBjdXJyZW50IGxhdGVzdC5cbiAqXG4gKiBJZiB0aGUgcHJldmlvdXMgbGF0ZXN0IHZlcnNpb24gZG9lcyBub3QgaGF2ZSB0aGUgYGF2YWlsYWJsZUF0YCBwcm9wZXJ0eSwgYWRkc1xuICogdGhhdCB0byB0aGUgYHBlbmRpbmdgIHNldC5cbiAqXG4gKiBAcGFyYW0gc3RhdGUgIHRoZSBzdGF0ZSB0byBiZSB1cGRhdGVkLlxuICogQHBhcmFtIGxhdGVzdCB0aGUgY3VycmVudCBcImxhdGVzdFwiIHZlcnNpb24gb2YgdGhlIHRyYWNrZWQgcGFja2FnZS5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlTGF0ZXN0SWZOZWVkZWQoXG4gIHN0YXRlOiBDYW5hcnlTdGF0ZSxcbiAgbGF0ZXN0OiBDYW5hcnlTdGF0ZVsnbGF0ZXN0J11cbik6IHZvaWQge1xuICBpZiAoc3RhdGUubGF0ZXN0LnZlcnNpb24gPT09IGxhdGVzdC52ZXJzaW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgdGhlIGN1cnJlbnQgXCJsYXRlc3RcIiBpc24ndCBhdmFpbGFibGUgeWV0LCBhZGQgaXQgdG8gdGhlIGBwZW5kaW5nYCB2ZXJzaW9ucy5cbiAgaWYgKHN0YXRlLmxhdGVzdC5hdmFpbGFibGVBdCA9PSBudWxsKSB7XG4gICAgLy8gVGhlIFR5cGVTY3JpcHQgdmVyc2lvbiBvZiBqc2lpIGRvZXNuJ3QgZG8gY29udHJvbCBmbG93IGFuYWx5c2lzIHdlbGwgZW5vdWdoIGhlcmUgdG9cbiAgICAvLyBkZXRlcm1pbmUgdGhhdCB0aGVgaWZgIGJyYW5jaCBndWFyYW50ZWVzIGBhdmFpbGFibGVBdGAgaXMgdW5kZWZpbmVkIGhlcmUuXG4gICAgc3RhdGUucGVuZGluZ1tzdGF0ZS5sYXRlc3QudmVyc2lvbl0gPSB7XG4gICAgICAuLi5zdGF0ZS5sYXRlc3QsXG4gICAgICBhdmFpbGFibGVBdDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICBzdGF0ZS5sYXRlc3QgPSBsYXRlc3Q7XG59XG5cbmZ1bmN0aW9uIGd1bnppcChyZWFkYWJsZTogUmVhZGFibGUpOiBSZWFkYWJsZSB7XG4gIGNvbnN0IGd6ID0gY3JlYXRlR3VuemlwKCk7XG4gIHJlYWRhYmxlLnBpcGUoZ3osIHsgZW5kOiB0cnVlIH0pO1xuICByZXR1cm4gZ3o7XG59XG4iXX0=
|
352
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtanMtcGFja2FnZS1jYW5hcnkubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BhY2thZ2Utc291cmNlcy9ucG1qcy9jYW5hcnkvbnBtanMtcGFja2FnZS1jYW5hcnkubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0JBQStCO0FBRS9CLCtCQUFvQztBQUNwQywrREFBd0U7QUFFeEUseUNBQXlDO0FBRXpDLGlFQUFpRTtBQUNqRSxpRkFBdUU7QUFDdkUsMkNBS3FCO0FBRXJCLG9DQUFhLENBQUMsU0FBUyxHQUFHLDZCQUFpQixDQUFDO0FBRTVDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNJLEtBQUssVUFBVSxPQUFPLENBQUMsS0FBYzs7SUFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFeEQsTUFBTSxXQUFXLEdBQUcsOEJBQVUsbUNBQTBCLENBQUM7SUFDekQsTUFBTSxXQUFXLEdBQUcsOEJBQVUsK0RBQXdDLENBQUM7SUFDdkUsTUFBTSxvQkFBb0IsR0FBRyw4QkFBVSx1REFBb0MsQ0FBQztJQUU1RSxNQUFNLFlBQVksR0FBRyxJQUFJLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFFNUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sS0FBSyxTQUFnQixDQUFDLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxtQ0FBSTtRQUNuRSxrRkFBa0Y7UUFDbEYsTUFBTSxFQUFFO1lBQ04sR0FBRyxNQUFNO1lBQ1QsK0RBQStEO1lBQy9E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QUFDLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FDM0IsS0FBa0IsRUFDbEIsTUFBNkI7SUFFN0IsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQzNDLE9BQU87S0FDUjtJQUVELGlGQUFpRjtJQUNqRixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLElBQUksRUFBRTtRQUNwQyxzRkFBc0Y7UUFDdEYsNEVBQTRFO1FBQzVFLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRztZQUNwQyxHQUFHLEtBQUssQ0FBQyxNQUFNO1lBQ2YsV0FBVyxFQUFFLFNBQVM7U0FDdkIsQ0FBQztLQUNIO0lBRUQsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDeEIsQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLFFBQWtCO0lBQ2hDLE1BQU0sRUFBRSxHQUFHLG1CQUFZLEVBQUUsQ0FBQztJQUMxQixRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGh0dHBzIGZyb20gJ2h0dHBzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IGNyZWF0ZUd1bnppcCB9IGZyb20gJ3psaWInO1xuaW1wb3J0IHsgbWV0cmljU2NvcGUsIENvbmZpZ3VyYXRpb24sIFVuaXQgfSBmcm9tICdhd3MtZW1iZWRkZWQtbWV0cmljcyc7XG5pbXBvcnQgdHlwZSB7IEFXU0Vycm9yLCBTMyB9IGZyb20gJ2F3cy1zZGsnO1xuaW1wb3J0ICogYXMgSlNPTlN0cmVhbSBmcm9tICdKU09OU3RyZWFtJztcbmltcG9ydCB7IENhdGFsb2dNb2RlbCB9IGZyb20gJy4uLy4uLy4uL2JhY2tlbmQnO1xuaW1wb3J0ICogYXMgYXdzIGZyb20gJy4uLy4uLy4uL2JhY2tlbmQvc2hhcmVkL2F3cy5sYW1iZGEtc2hhcmVkJztcbmltcG9ydCB7IHJlcXVpcmVFbnYgfSBmcm9tICcuLi8uLi8uLi9iYWNrZW5kL3NoYXJlZC9lbnYubGFtYmRhLXNoYXJlZCc7XG5pbXBvcnQge1xuICBNRVRSSUNTX05BTUVTUEFDRSxcbiAgTWV0cmljTmFtZSxcbiAgRW52aXJvbm1lbnQsXG4gIE9iamVjdEtleSxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5Db25maWd1cmF0aW9uLm5hbWVzcGFjZSA9IE1FVFJJQ1NfTkFNRVNQQUNFO1xuXG4vKipcbiAqIFRoaXMgcGFja2FnZSBjYW5hcnkgbW9uaXRvcnMgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgdmVyc2lvbnMgb2YgYSBzcGVjaWZpZWRcbiAqIHBhY2thZ2UgaW4gdGhlIENvbnN0cnVjdEh1YiBjYXRhbG9nLiBJdCBwdWJsaXNoZXMgbWV0cmljcyB0aGF0IGhlbHBcbiAqIHVuZGVyc3RhbmQgaG93IG11Y2ggdGltZSBwYXNzZXMgYmV0d2VlbiBhIHBha2NhZ2UgYXBwZWFyaW5nIGluIHRoZSBwdWJsaWNcbiAqIHJlZ2lzdHJ5IGFuZCBpdCdzIGF2YWlsYWJpbGl0eSBpbiB0aGUgQ29uc3RydWN0SHViIGluc3RhbmNlLlxuICpcbiAqIEZyb20gdGhlIG1vbWVudCBhIHBhY2thZ2UgaGFzIGJlZW4gcHVibGlzaGVkLCBhbmQgdW50aWwgaXQgYXBwZWFyZWQgaW5cbiAqIGNhdGFsb2csIHRoZSBgTWV0cmljTmFtZS5EV0VMTF9USU1FYCBtZXRyaWMgaXMgZW1pdHRlZC5cbiAqXG4gKiBPbmNlIHRoZSBwYWNrYWdlIGhhcyBhcHBlYXJlZCBpbiBjYXRhbG9nLCBhbmQgdW50aWwgYSBuZXcgcGFja2FnZSB2ZXJzaW9uIGlzXG4gKiBpZGVudGlmaWVkIGluIG5wbWpzLmNvbSwgdGhlIGBNZXRyaWNOYW1lLlRJTUVfVE9fQ0FUQUxPR2AgbWV0cmljIGlzIGVtaXR0ZWQuXG4gKlxuICogSWYgYSBuZXcgcGFja2FnZSB2ZXJzaW9uIGlzIHB1Ymxpc2hlZCBiZWZvcmUgdGhlIHByZXZpb3VzIG9uZSBoYXMgYXBwZWFyZWRcbiAqIGluIGNhdGFsb2csIGJvdGggdmVyc2lvbnMgd2lsbCBiZSB0cmFja2VkIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCB0aGUgbWV0cmljc1xuICogd2lsbCByZWNlaXZlIG9uZSBzYW1wbGUgcGVyIHRyYWNrZWQgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQ6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc29sZS5sb2coYEV2ZW50OiAke0pTT04uc3RyaW5naWZ5KGV2ZW50LCBudWxsLCAyKX1gKTtcblxuICBjb25zdCBwYWNrYWdlTmFtZSA9IHJlcXVpcmVFbnYoRW52aXJvbm1lbnQuUEFDS0FHRV9OQU1FKTtcbiAgY29uc3Qgc3RhdGVCdWNrZXQgPSByZXF1aXJlRW52KEVudmlyb25tZW50LlBBQ0tBR0VfQ0FOQVJZX0JVQ0tFVF9OQU1FKTtcbiAgY29uc3QgY29uc3RydWN0SHViRW5kcG9pbnQgPSByZXF1aXJlRW52KEVudmlyb25tZW50LkNPTlNUUlVDVF9IVUJfQkFTRV9VUkwpO1xuXG4gIGNvbnN0IHN0YXRlU2VydmljZSA9IG5ldyBDYW5hcnlTdGF0ZVNlcnZpY2Uoc3RhdGVCdWNrZXQpO1xuICBjb25zdCBjb25zdHJ1Y3RIdWIgPSBuZXcgQ29uc3RydWN0SHViKGNvbnN0cnVjdEh1YkVuZHBvaW50KTtcblxuICBjb25zdCBsYXRlc3QgPSBhd2FpdCBzdGF0ZVNlcnZpY2UubGF0ZXN0KHBhY2thZ2VOYW1lKTtcbiAgY29uc3Qgc3RhdGU6IENhbmFyeVN0YXRlID0gKGF3YWl0IHN0YXRlU2VydmljZS5sb2FkKHBhY2thZ2VOYW1lKSkgPz8ge1xuICAgIC8vIElmIHdlIGRpZCBub3QgaGF2ZSBhbnkgc3RhdGUsIHdlJ2xsIGJvb3RzdHJhcCB1c2luZyB0aGUgY3VycmVudCBsYXRlc3QgdmVyc2lvbi5cbiAgICBsYXRlc3Q6IHtcbiAgICAgIC4uLmxhdGVzdCxcbiAgICAgIC8vIElmIHRoYXQgbGF0ZXN0IHZlcnNpb24gaXMgQUxSRUFEWSBpbiBjYXRhbG9nLCBwcmV0ZW5kIGl0IHdhc1xuICAgICAgLy8gXCJpbnN0YW50YW5lb3VzbHlcIiB0aGVyZSwgc28gd2UgYXZvaWQgcG9zc2libHkgcmVwb3J0aW5nIGFuIGJyZWFjaCBvZlxuICAgICAgLy8gU0xBIGFsYXJtLCB3aGVuIHdlIHJlYWxseSBqdXN0IG9ic2VydmVkIHByZXNlbmNlIG9mIHRoZSBwYWNrYWdlIGluXG4gICAgICAvLyBjYXRhbG9nIHRvbyBsYXRlLCBmb3IgZXhhbXBsZSBvbiBmaXJzdCBkZXBsb3ltZW50IG9mIHRoZSBjYW5hcnkuXG4gICAgICBhdmFpbGFibGVBdDogKGF3YWl0IGNvbnN0cnVjdEh1Yi5pc0luQ2F0YWxvZyhwYWNrYWdlTmFtZSwgbGF0ZXN0LnZlcnNpb24pKVxuICAgICAgICA/IGxhdGVzdC5wdWJsaXNoZWRBdFxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9LFxuICAgIHBlbmRpbmc6IHt9LFxuICB9O1xuXG4gIGNvbnNvbGUubG9nKGBJbml0aWFsIHN0YXRlOiAke0pTT04uc3RyaW5naWZ5KHN0YXRlLCBudWxsLCAyKX1gKTtcblxuICAvLyBJZiB0aGUgY3VycmVudCBcImxhdGVzdFwiIGlzbid0IHRoZSBvbmUgZnJvbSBzdGF0ZSwgaXQgbmVlZHMgdXBkYXRpbmcuXG4gIHVwZGF0ZUxhdGVzdElmTmVlZGVkKHN0YXRlLCBsYXRlc3QpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVwbGljYUxhZyA9IGF3YWl0IHN0YXRlU2VydmljZS5ucG1SZXBsaWNhTGFnU2Vjb25kcyhwYWNrYWdlTmFtZSk7XG5cbiAgICBhd2FpdCBtZXRyaWNTY29wZSgobWV0cmljcykgPT4gYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gQ2xlYXIgb3V0IGRlZmF1bHQgZGltZW5zaW9ucyBhcyB3ZSBkb24ndCBuZWVkIHRob3NlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3c2xhYnMvYXdzLWVtYmVkZGVkLW1ldHJpY3Mtbm9kZS9pc3N1ZXMvNzMuXG4gICAgICBtZXRyaWNzLnNldERpbWVuc2lvbnMoKTtcbiAgICAgIG1ldHJpY3MucHV0TWV0cmljKFxuICAgICAgICBNZXRyaWNOYW1lLlRSQUNLRURfVkVSU0lPTl9DT1VOVCxcbiAgICAgICAgT2JqZWN0LmtleXMoc3RhdGUucGVuZGluZykubGVuZ3RoICsgMSxcbiAgICAgICAgVW5pdC5Db3VudFxuICAgICAgKTtcbiAgICAgIG1ldHJpY3MucHV0TWV0cmljKFxuICAgICAgICBNZXRyaWNOYW1lLk5QTV9SRVBMSUNBX0RPV04sXG4gICAgICAgIChhd2FpdCBzdGF0ZVNlcnZpY2UuaXNOcG1SZXBsaWNhRG93bigpKSA/IDEgOiAwLFxuICAgICAgICBVbml0Lk5vbmVcbiAgICAgICk7XG5cbiAgICAgIC8vIElmIHdlIHdlcmVuJ3QgYWJsZSB0byBjYWxjdWxhdGUgdGhlIHJlcGxpY2EncyBsYWcsIHRoZW4gc2ltcGx5XG4gICAgICAvLyBkb24ndCByZXBvcnQgdGhlIG1ldHJpYy5cbiAgICAgIGlmIChyZXBsaWNhTGFnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWV0cmljcy5wdXRNZXRyaWMoTWV0cmljTmFtZS5OUE1fUkVQTElDQV9MQUcsIHJlcGxpY2FMYWcsIFVuaXQuU2Vjb25kcyk7XG4gICAgICB9XG4gICAgfSkoKTtcblxuICAgIGZvciAoY29uc3QgdmVyc2lvblN0YXRlIG9mIFtcbiAgICAgIHN0YXRlLmxhdGVzdCxcbiAgICAgIC4uLk9iamVjdC52YWx1ZXMoc3RhdGUucGVuZGluZyA/PyB7fSksXG4gICAgXSkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBDaGVja2luZyBzdGF0ZSBvZiAke3ZlcnNpb25TdGF0ZS52ZXJzaW9ufSwgY3VycmVudDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICB2ZXJzaW9uU3RhdGUsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICAyXG4gICAgICAgICl9YFxuICAgICAgKTtcblxuICAgICAgYXdhaXQgbWV0cmljU2NvcGUoKG1ldHJpY3MpID0+IGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gQ2xlYXIgb3V0IGRlZmF1bHQgZGltZW5zaW9ucyBhcyB3ZSBkb24ndCBuZWVkIHRob3NlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3c2xhYnMvYXdzLWVtYmVkZGVkLW1ldHJpY3Mtbm9kZS9pc3N1ZXMvNzMuXG4gICAgICAgIG1ldHJpY3Muc2V0RGltZW5zaW9ucygpO1xuICAgICAgICBtZXRyaWNzLnNldFByb3BlcnR5KCdQYWNrYWdlTmFtZScsIHBhY2thZ2VOYW1lKTtcbiAgICAgICAgbWV0cmljcy5zZXRQcm9wZXJ0eSgnUGFja2FnZVZlcnNpb24nLCB2ZXJzaW9uU3RhdGUudmVyc2lvbik7XG4gICAgICAgIG1ldHJpY3Muc2V0UHJvcGVydHkoXG4gICAgICAgICAgJ0lzTGF0ZXN0JyxcbiAgICAgICAgICBzdGF0ZS5sYXRlc3QudmVyc2lvbiA9PT0gdmVyc2lvblN0YXRlLnZlcnNpb25cbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXZlcnNpb25TdGF0ZS5hdmFpbGFibGVBdCkge1xuICAgICAgICAgIGlmICh2ZXJzaW9uU3RhdGUudmVyc2lvbiA9PT0gc3RhdGUubGF0ZXN0LnZlcnNpb24pIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgYXdhaXQgY29uc3RydWN0SHViLmlzSW5DYXRhbG9nKHBhY2thZ2VOYW1lLCB2ZXJzaW9uU3RhdGUudmVyc2lvbilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB2ZXJzaW9uU3RhdGUuYXZhaWxhYmxlQXQgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOb24tY3VycmVudCB2ZXJzaW9ucyB3aWxsIHByb2JhYmx5IG5ldmVyIG1ha2UgaXQgdG8gY2F0YWxvZyAodGhleSdyZSBvbGRlciB0aGFuIHRoZVxuICAgICAgICAgICAgLy8gY3VycmVudCB2ZXJzaW9uKSwgc28gaW5zdGVhZCwgd2UgY2hlY2sgd2hldGhlciB0aGV5IGhhdmUgVHlwZVNjcmlwdCBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBhd2FpdCBjb25zdHJ1Y3RIdWIuaGFzVHlwZVNjcmlwdERvY3VtZW50YXRpb24oXG4gICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsXG4gICAgICAgICAgICAgICAgdmVyc2lvblN0YXRlLnZlcnNpb25cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHZlcnNpb25TdGF0ZS5hdmFpbGFibGVBdCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZlcnNpb25TdGF0ZS5hdmFpbGFibGVBdCkge1xuICAgICAgICAgIC8vIFRlbGxzIHVzIGhvdyBsb25nIGl0J3MgdGFrZW4gZm9yIHRoZSBwYWNrYWdlIHRvIG1ha2UgaXQgdG8gY2F0YWxvZyBhZnRlciBpdCB3YXMgcHVibGlzaGVkLlxuICAgICAgICAgIG1ldHJpY3MucHV0TWV0cmljKFxuICAgICAgICAgICAgTWV0cmljTmFtZS5USU1FX1RPX0NBVEFMT0csXG4gICAgICAgICAgICAodmVyc2lvblN0YXRlLmF2YWlsYWJsZUF0LmdldFRpbWUoKSAtXG4gICAgICAgICAgICAgIHZlcnNpb25TdGF0ZS5wdWJsaXNoZWRBdC5nZXRUaW1lKCkpIC9cbiAgICAgICAgICAgICAgMV8wMDAsXG4gICAgICAgICAgICBVbml0LlNlY29uZHNcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gU3RvcCB0cmFja2luZyB0aGF0IHZlcnNpb24sIGFzIGl0J3Mgbm93IGF2YWlsYWJsZS5cbiAgICAgICAgICBpZiAodmVyc2lvblN0YXRlLnZlcnNpb24gaW4gc3RhdGUucGVuZGluZykge1xuICAgICAgICAgICAgZGVsZXRlIHN0YXRlLnBlbmRpbmdbdmVyc2lvblN0YXRlLnZlcnNpb25dO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUZWxscyB1cyBob3cgbG9uZyB3ZSd2ZSBiZWVuIHdhaXRpbmcgZm9yIHRoaXMgdmVyc2lvbiB0byBzaG93IHVwLCBzbyBmYXIuXG4gICAgICAgICAgbWV0cmljcy5wdXRNZXRyaWMoXG4gICAgICAgICAgICBNZXRyaWNOYW1lLkRXRUxMX1RJTUUsXG4gICAgICAgICAgICAoRGF0ZS5ub3coKSAtIHZlcnNpb25TdGF0ZS5wdWJsaXNoZWRBdC5nZXRUaW1lKCkpIC8gMV8wMDAsXG4gICAgICAgICAgICBVbml0LlNlY29uZHNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBzdGF0ZVNlcnZpY2Uuc2F2ZShwYWNrYWdlTmFtZSwgc3RhdGUpO1xuICB9XG59XG5cbmNsYXNzIENvbnN0cnVjdEh1YiB7XG4gICNjYXRhbG9nPzogQ2F0YWxvZ01vZGVsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYmFzZVVybDogc3RyaW5nKSB7fVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwYWNrYWdlIHZlcnNpb24gaXMgcHJlc2VudCBpbiB0aGUgY2F0YWxvZ1xuICAgKiBvYmplY3Qgb3Igbm90LlxuICAgKlxuICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgICAgdGhlIG5hbWUgb2YgdGhlIGNoZWNrZWQgcGFja2FnZS5cbiAgICogQHBhcmFtIHBhY2thZ2VWZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBjaGVja2VkIHBhY2thZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBJSUYgdGhlIGV4YWN0IHBhY2thZ2UgdmVyc2lvbiBpcyBmb3VuZCBpbiB0aGUgY2F0YWxvZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBpc0luQ2F0YWxvZyhcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICAgIHBhY2thZ2VWZXJzaW9uOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2F0YWxvZyA9IGF3YWl0IHRoaXMuZ2V0Q2F0YWxvZygpO1xuICAgIGNvbnN0IGZpbHRlcmVkID0gY2F0YWxvZy5wYWNrYWdlcy5maWx0ZXIoXG4gICAgICAocDogYW55KSA9PiBwLm5hbWUgPT09IHBhY2thZ2VOYW1lICYmIHAudmVyc2lvbiA9PT0gcGFja2FnZVZlcnNpb25cbiAgICApO1xuXG4gICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZvdW5kIG11bHRpcGxlIGVudHJpZXMgZm9yICR7cGFja2FnZU5hbWV9QCR7cGFja2FnZVZlcnNpb259IGluIGNhdGFsb2dgXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXJlZC5sZW5ndGggPT09IDE7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgVHlwZVNjcmlwdCBkb2N1bWVudGF0aW9uIGV4aXN0cyBpbiBDb25zdHJ1Y3RIdWIgZm9yIHRoZVxuICAgKiBzcGVjaWZpZWQgcGFja2FnZSB2ZXJzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgICAgdGhlIG5hbWUgb2YgdGhlIGNoZWNrZWQgcGFja2FnZS5cbiAgICogQHBhcmFtIHBhY2thZ2VWZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBjaGVja2VkIHBhY2thZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBJSUYgdGhlIGBkb2NzLXR5cGVzY3JpcHQubWRgIGRvY3VtZW50IGV4aXN0cyBmb3IgdGhlXG4gICAqICAgICAgICAgIHNwZWNpZmllZCBwYWNrYWdlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhc1R5cGVTY3JpcHREb2N1bWVudGF0aW9uKFxuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gICAgcGFja2FnZVZlcnNpb246IHN0cmluZ1xuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKG9rLCBrbykgPT4ge1xuICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5iYXNlVXJsfS9kYXRhLyR7cGFja2FnZU5hbWV9L3Yke3BhY2thZ2VWZXJzaW9ufS9kb2NzLXR5cGVzY3JpcHQubWRgO1xuICAgICAgaHR0cHNcbiAgICAgICAgLnJlcXVlc3QodXJsLCB7IG1ldGhvZDogJ0hFQUQnIH0sIChyZXMpID0+IHtcbiAgICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgPT09IDIwMCkge1xuICAgICAgICAgICAgLy8gVGhpcyByZXR1cm5zIEhUVFAgMjAwIHdpdGggdGV4dC9odG1sIGlmIGl0J3MgYSA0MDQsIGR1ZSB0byBob3dcbiAgICAgICAgICAgIC8vIHdlIGNvbmZpZ3VyZWQgQ2xvdWRGcm9udCBiZWhhdmlvcnMuXG4gICAgICAgICAgICByZXR1cm4gb2soXG4gICAgICAgICAgICAgICEhcmVzLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddPy5zdGFydHNXaXRoKCd0ZXh0L21hcmtkb3duJylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBIRUFEICR7dXJsfSAtLSBIVFRQICR7cmVzLnN0YXR1c0NvZGV9ICgke3Jlcy5zdGF0dXNNZXNzYWdlfSlgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIpO1xuICAgICAgICAgIGtvKGVycik7XG4gICAgICAgIH0pXG4gICAgICAgIC5lbmQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q2F0YWxvZygpOiBQcm9taXNlPENhdGFsb2dNb2RlbD4ge1xuICAgIGlmICh0aGlzLiNjYXRhbG9nKSB7XG4gICAgICByZXR1cm4gdGhpcy4jY2F0YWxvZztcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLiNjYXRhbG9nID0gYXdhaXQgZ2V0SlNPTihgJHt0aGlzLmJhc2VVcmx9L2NhdGFsb2cuanNvbmApKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2FuYXJ5U3RhdGVTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBidWNrZXROYW1lOiBzdHJpbmcpIHt9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGhlIHN0YXRlIHRvIHRoZSBidWNrZXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2F2ZShwYWNrYWdlTmFtZTogc3RyaW5nLCBzdGF0ZTogQ2FuYXJ5U3RhdGUpIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybChwYWNrYWdlTmFtZSk7XG5cbiAgICBjb25zb2xlLmxvZyhgU2F2aW5nIHRvICR7dXJsfTogJHtKU09OLnN0cmluZ2lmeShzdGF0ZSwgbnVsbCwgMil9YCk7XG4gICAgYXdhaXQgYXdzXG4gICAgICAuczMoKVxuICAgICAgLnB1dE9iamVjdCh7XG4gICAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXROYW1lLFxuICAgICAgICBLZXk6IHRoaXMua2V5KHBhY2thZ2VOYW1lKSxcbiAgICAgICAgQm9keTogSlNPTi5zdHJpbmdpZnkoc3RhdGUsIG51bGwsIDIpLFxuICAgICAgICBDb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSlcbiAgICAgIC5wcm9taXNlKCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgc3RhdGUgZmlsZSBmb3IgdGhpcyBwYWNrYWdlIGZyb20gdGhlIGJ1Y2tldC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPENhbmFyeVN0YXRlIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc29sZS5sb2coYExvYWRpbmcgc3RhdGUgZm9yIHBhY2thZ2UgJyR7cGFja2FnZU5hbWV9J2ApO1xuXG4gICAgY29uc3Qgb2JqZWN0S2V5ID0gdGhpcy5rZXkocGFja2FnZU5hbWUpO1xuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKHBhY2thZ2VOYW1lKTtcblxuICAgIGNvbnNvbGUubG9nKGBGZXRjaGluZzogJHt1cmx9YCk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGF3c1xuICAgICAgLnMzKClcbiAgICAgIC5nZXRPYmplY3QoeyBCdWNrZXQ6IHRoaXMuYnVja2V0TmFtZSwgS2V5OiBvYmplY3RLZXkgfSlcbiAgICAgIC5wcm9taXNlKClcbiAgICAgIC5jYXRjaCgoZXJyOiBBV1NFcnJvcikgPT5cbiAgICAgICAgZXJyLmNvZGUgIT09ICdOb1N1Y2hLZXknXG4gICAgICAgICAgPyBQcm9taXNlLnJlamVjdChlcnIpXG4gICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgICAvKiBubyBkYXRhICovXG4gICAgICAgICAgICB9IGFzIFMzLkdldE9iamVjdE91dHB1dClcbiAgICAgICk7XG5cbiAgICBpZiAoIWRhdGE/LkJvZHkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBOb3QgZm91bmQ6ICR7dXJsfWApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgTG9hZGVkOiAke3VybH1gKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhLkJvZHkudG9TdHJpbmcoJ3V0Zi04JyksIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSAncHVibGlzaGVkQXQnIHx8IGtleSA9PT0gJ2F2YWlsYWJsZUF0Jykge1xuICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0YXRlIGZyb20gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxhdGVzdChwYWNrYWdlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDYW5hcnlTdGF0ZVsnbGF0ZXN0J10+IHtcbiAgICBjb25zb2xlLmxvZyhgRmV0Y2hpbmcgbGF0ZXN0IHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSBOUE06ICR7cGFja2FnZU5hbWV9YCk7XG4gICAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGdldEpTT04oXG4gICAgICBgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJHtlbmNvZGVVUklDb21wb25lbnQocGFja2FnZU5hbWUpfS9sYXRlc3RgLFxuICAgICAgWyd2ZXJzaW9uJ11cbiAgICApO1xuICAgIGNvbnN0IHB1Ymxpc2hlZEF0ID0gYXdhaXQgZ2V0SlNPTihcbiAgICAgIGBodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy8ke2VuY29kZVVSSUNvbXBvbmVudChwYWNrYWdlTmFtZSl9YCxcbiAgICAgIFsndGltZScsIHZlcnNpb25dXG4gICAgKTtcblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFBhY2thZ2U6ICR7cGFja2FnZU5hbWV9IHwgVmVyc2lvbiA6ICR7dmVyc2lvbn0gfCBQdWJsaXNoZWQgQXQ6ICR7cHVibGlzaGVkQXR9YFxuICAgICk7XG5cbiAgICByZXR1cm4geyB2ZXJzaW9uLCBwdWJsaXNoZWRBdDogbmV3IERhdGUocHVibGlzaGVkQXQpIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaXNOcG1SZXBsaWNhRG93bigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZ2V0SlNPTignaHR0cHM6Ly9yZXBsaWNhdGUubnBtanMuY29tLycpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RpbWF0ZSBob3cgZmFyIGJlaGluZCB0aGUgTlBNIHJlcGxpY2EgaXMgY29tcGFyZWQgdG8gdGhlIGxpdmUgTlBNXG4gICAqIHJlZ2lzdHJ5LiBJZiB0aGUgTlBNIHJlcGxpY2EgaXMgZG93biwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBucG1SZXBsaWNhTGFnU2Vjb25kcyhcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nXG4gICk6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZW5jb2RlZFBhY2thZ2VOYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KHBhY2thZ2VOYW1lKTtcblxuICAgIGNvbnNvbGUubG9nKGBNZWFzdXJpbmcgTlBNIHJlcGxpY2EgbGFnIHVzaW5nICR7cGFja2FnZU5hbWV9Li4uYCk7XG5cbiAgICBjb25zdCBwcmltYXJ5RGF0ZSA9IGF3YWl0IGdldE1vZGlmaWVkVGltZXN0YW1wKGByZWdpc3RyeS5ucG1qcy5vcmdgKTtcblxuICAgIGxldCByZXBsaWNhRGF0ZTtcbiAgICB0cnkge1xuICAgICAgcmVwbGljYURhdGUgPSBhd2FpdCBnZXRNb2RpZmllZFRpbWVzdGFtcChgcmVwbGljYXRlLm5wbWpzLmNvbS9yZWdpc3RyeWApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKCdIVFRQIDUwNCcpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBXYXJuaW5nOiBlcnJvciBmZXRjaGluZyByZXBsaWNhdGUubnBtanMuY29tOiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICk7XG4gICAgICAgIC8vIFRoZXJlIGlzIG5vIHZhbHVlIHRvIHJlcG9ydFxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkZWx0YU1zID0gcHJpbWFyeURhdGUuZ2V0VGltZSgpIC0gcmVwbGljYURhdGUuZ2V0VGltZSgpO1xuXG4gICAgY29uc29sZS5sb2coYFRpbWVzdGFtcCBvbiBwcmltYXJ5OiAke3ByaW1hcnlEYXRlLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgVGltZXN0YW1wIG9uIHJlcGxpY2E6ICR7cmVwbGljYURhdGUudG9JU09TdHJpbmcoKX0gKCR7XG4gICAgICAgIGRlbHRhTXMgLyAzXzYwMF8wMDBcbiAgICAgIH0gaG91cnMgYmVoaW5kKWBcbiAgICApO1xuXG4gICAgLy8gV2UgcmV0dXJuIGluIHNlY29uZHMuLi4gVGhlIG1pbGxpc2Vjb25kIHJlc29sdXRpb24gaXMgc2lsbHkgaGVyZSBzaW5jZSB0aGUgcHJvYmUgcGFja2FnZSBpc1xuICAgIC8vIG9ubHkgcHVibGlzaGVkIGFwcHJveGltYXRlbHkgb25jZSBldmVyeSB0aHJlZSBob3Vycy4gV2UgdXNlIHNlY29uZHMgb25seSBiZWNhdXNlIHRoaXMgaXMgdGhlXG4gICAgLy8gbGFyZ2VzdCBhdmFpbGFibGUgdGltZSB1bml0IGluIENsb3VkV2F0Y2guXG4gICAgcmV0dXJuIGRlbHRhTXMgLyAxXzAwMDtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGdldE1vZGlmaWVkVGltZXN0YW1wKGJhc2VVcmw6IHN0cmluZykge1xuICAgICAgY29uc3QgaXNvRGF0ZSA9IGF3YWl0IGdldEpTT04oXG4gICAgICAgIGBodHRwczovLyR7YmFzZVVybH0vJHtlbmNvZGVkUGFja2FnZU5hbWV9YCxcbiAgICAgICAgWyd0aW1lJywgJ21vZGlmaWVkJ11cbiAgICAgICk7XG4gICAgICByZXR1cm4gbmV3IERhdGUoaXNvRGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBrZXkocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke09iamVjdEtleS5TVEFURV9QUkVGSVh9JHtwYWNrYWdlTmFtZX0ke09iamVjdEtleS5TVEFURV9TVUZGSVh9YDtcbiAgfVxuXG4gIHByaXZhdGUgdXJsKHBhY2thZ2VOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYHMzOi8vJHt0aGlzLmJ1Y2tldE5hbWV9LyR7dGhpcy5rZXkocGFja2FnZU5hbWUpfWA7XG4gIH1cbn1cblxuaW50ZXJmYWNlIENhbmFyeVN0YXRlIHtcbiAgLyoqXG4gICAqIFRoZSBsYXRlc3QgcGFja2FnZSB2ZXJzaW9uLCBhcyBvZiB0aGUgbGFzdCBleGVjdXRpb24gb2YgdGhlIGNhbmFyeS5cbiAgICovXG4gIGxhdGVzdDoge1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIHdlIGFyZSB0cmFja2luZy5cbiAgICAgKi9cbiAgICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcHVibGlzaCBkYXRlIG9mIHRoZSB2ZXJzaW9uLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHB1Ymxpc2hlZEF0OiBEYXRlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYXQgd2hpY2ggdGhlIHZlcnNpb24gaXMgYXZhaWxhYmxlIG9uIHRoZSBodWIuXG4gICAgICovXG4gICAgYXZhaWxhYmxlQXQ/OiBEYXRlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFYWNoIGV4aXN0aW5nLCBidXQgbm90LXlldC1mb3VuZCB2ZXJzaW9ucyB0aGF0IGFyZSBzdGlsbCB0cmFja2VkLlxuICAgKi9cbiAgcGVuZGluZzoge1xuICAgIFt2ZXJzaW9uOiBzdHJpbmddOiB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSB2ZXJzaW9uIHdlIGFyZSB0cmFja2luZy5cbiAgICAgICAqL1xuICAgICAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBwdWJsaXNoIGRhdGUgb2YgdGhlIHZlcnNpb24uXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IHB1Ymxpc2hlZEF0OiBEYXRlO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZXNlIHBlbmRpbmcgcGFja2FnZXMgYXJlIE5FVkVSIGF2YWlsYWJsZSBhdCB0aGlzIHBvaW50LlxuICAgICAgICovXG4gICAgICBhdmFpbGFibGVBdDogdW5kZWZpbmVkO1xuICAgIH07XG4gIH07XG59XG5cbi8qKlxuICogTWFrZXMgYSByZXF1ZXN0IHRvIHRoZSBwcm92aWRlZCBVUkwgYW5kIHJldHVybnMgdGhlIHJlc3BvbnNlIGFmdGVyIGhhdmluZ1xuICogcGFyc2VkIGl0IGZyb20gSlNPTi5cbiAqXG4gKiBAcGFyYW0gdXJsIHRoZSBVUkwgdG8gZ2V0LlxuICogQHBhcmFtIGpzb25QYXRoIGEgSlNPTiBwYXRoIHRvIGV4dHJhY3Qgb25seSBhIHN1YnNldCBvZiB0aGUgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBnZXRKU09OKHVybDogc3RyaW5nLCBqc29uUGF0aD86IHN0cmluZ1tdKTogUHJvbWlzZTxhbnk+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChvaywga28pID0+IHtcbiAgICBodHRwcy5nZXQoXG4gICAgICB1cmwsXG4gICAgICB7XG4gICAgICAgIGhlYWRlcnM6IHsgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsICdBY2NlcHQtRW5jb2RpbmcnOiAnaWRlbnRpdHknIH0sXG4gICAgICB9LFxuICAgICAgKHJlcykgPT4ge1xuICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgYEdFVCAke3VybH0gLSBIVFRQICR7cmVzLnN0YXR1c0NvZGV9ICgke3Jlcy5zdGF0dXNNZXNzYWdlfSlgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnJvcik7XG4gICAgICAgICAgcmV0dXJuIGtvKGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcy5vbmNlKCdlcnJvcicsIGtvKTtcblxuICAgICAgICBjb25zdCBqc29uID0gSlNPTlN0cmVhbS5wYXJzZShqc29uUGF0aCk7XG4gICAgICAgIGpzb24ub25jZSgnZGF0YScsIG9rKTtcbiAgICAgICAganNvbi5vbmNlKCdlcnJvcicsIGtvKTtcblxuICAgICAgICBjb25zdCBwbGFpblBheWxvYWQgPVxuICAgICAgICAgIHJlcy5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10gPT09ICdnemlwJyA/IGd1bnppcChyZXMpIDogcmVzO1xuICAgICAgICBwbGFpblBheWxvYWQucGlwZShqc29uLCB7IGVuZDogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBgbGF0ZXN0YCBwcm9wZXJ0eSBvZiBgc3RhdGVgIHRpIHRoZSBwcm92aWRlZCBgbGF0ZXN0YCB2YWx1ZSxcbiAqIHVubGVzcyB0aGlzIGlzIGFscmVhZHkgdGhlIGN1cnJlbnQgbGF0ZXN0LlxuICpcbiAqIElmIHRoZSBwcmV2aW91cyBsYXRlc3QgdmVyc2lvbiBkb2VzIG5vdCBoYXZlIHRoZSBgYXZhaWxhYmxlQXRgIHByb3BlcnR5LCBhZGRzXG4gKiB0aGF0IHRvIHRoZSBgcGVuZGluZ2Agc2V0LlxuICpcbiAqIEBwYXJhbSBzdGF0ZSAgdGhlIHN0YXRlIHRvIGJlIHVwZGF0ZWQuXG4gKiBAcGFyYW0gbGF0ZXN0IHRoZSBjdXJyZW50IFwibGF0ZXN0XCIgdmVyc2lvbiBvZiB0aGUgdHJhY2tlZCBwYWNrYWdlLlxuICovXG5mdW5jdGlvbiB1cGRhdGVMYXRlc3RJZk5lZWRlZChcbiAgc3RhdGU6IENhbmFyeVN0YXRlLFxuICBsYXRlc3Q6IENhbmFyeVN0YXRlWydsYXRlc3QnXVxuKTogdm9pZCB7XG4gIGlmIChzdGF0ZS5sYXRlc3QudmVyc2lvbiA9PT0gbGF0ZXN0LnZlcnNpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJZiB0aGUgY3VycmVudCBcImxhdGVzdFwiIGlzbid0IGF2YWlsYWJsZSB5ZXQsIGFkZCBpdCB0byB0aGUgYHBlbmRpbmdgIHZlcnNpb25zLlxuICBpZiAoc3RhdGUubGF0ZXN0LmF2YWlsYWJsZUF0ID09IG51bGwpIHtcbiAgICAvLyBUaGUgVHlwZVNjcmlwdCB2ZXJzaW9uIG9mIGpzaWkgZG9lc24ndCBkbyBjb250cm9sIGZsb3cgYW5hbHlzaXMgd2VsbCBlbm91Z2ggaGVyZSB0b1xuICAgIC8vIGRldGVybWluZSB0aGF0IHRoZWBpZmAgYnJhbmNoIGd1YXJhbnRlZXMgYGF2YWlsYWJsZUF0YCBpcyB1bmRlZmluZWQgaGVyZS5cbiAgICBzdGF0ZS5wZW5kaW5nW3N0YXRlLmxhdGVzdC52ZXJzaW9uXSA9IHtcbiAgICAgIC4uLnN0YXRlLmxhdGVzdCxcbiAgICAgIGF2YWlsYWJsZUF0OiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRlLmxhdGVzdCA9IGxhdGVzdDtcbn1cblxuZnVuY3Rpb24gZ3VuemlwKHJlYWRhYmxlOiBSZWFkYWJsZSk6IFJlYWRhYmxlIHtcbiAgY29uc3QgZ3ogPSBjcmVhdGVHdW56aXAoKTtcbiAgcmVhZGFibGUucGlwZShneiwgeyBlbmQ6IHRydWUgfSk7XG4gIHJldHVybiBnejtcbn1cbiJdfQ==
|