sliftutils 1.7.102 → 1.7.104
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/index.d.ts +223 -7
- package/package.json +2 -2
- package/storage/IArchives.d.ts +18 -0
- package/storage/IArchives.ts +14 -0
- package/storage/StreamingLogs.d.ts +77 -0
- package/storage/StreamingLogs.ts +412 -0
- package/storage/TransactionFile.d.ts +12 -6
- package/storage/TransactionFile.ts +44 -12
- package/storage/dist/IArchives.ts.cache +2 -2
- package/storage/dist/StreamingLogs.ts.cache +397 -0
- package/storage/dist/TransactionFile.ts.cache +41 -9
- package/storage/remoteStorage/ArchivesRemote.ts +3 -3
- package/storage/remoteStorage/blobStore.d.ts +28 -0
- package/storage/remoteStorage/blobStore.ts +117 -11
- package/storage/remoteStorage/createArchives.d.ts +40 -1
- package/storage/remoteStorage/createArchives.ts +84 -0
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +5 -5
- package/storage/remoteStorage/dist/blobStore.ts.cache +122 -12
- package/storage/remoteStorage/dist/createArchives.ts.cache +87 -3
- package/storage/remoteStorage/dist/storageController.ts.cache +40 -3
- package/storage/remoteStorage/dist/storageLogs.ts.cache +109 -0
- package/storage/remoteStorage/dist/storageServerState.ts.cache +18 -4
- package/storage/remoteStorage/dist/storeSync.ts.cache +43 -2
- package/storage/remoteStorage/spec.md +4 -0
- package/storage/remoteStorage/storageController.d.ts +10 -0
- package/storage/remoteStorage/storageController.ts +37 -3
- package/storage/remoteStorage/storageLogs.d.ts +29 -0
- package/storage/remoteStorage/storageLogs.ts +96 -0
- package/storage/remoteStorage/storageServerState.ts +16 -2
- package/storage/remoteStorage/storeSync.d.ts +1 -0
- package/storage/remoteStorage/storeSync.ts +38 -0
- package/yarn.lock +4 -4
|
@@ -22,6 +22,7 @@ const serverConfig_1 = require("./serverConfig");
|
|
|
22
22
|
const bucketDisk_1 = require("./bucketDisk");
|
|
23
23
|
const storageClientController_1 = require("./storageClientController");
|
|
24
24
|
const accessStats_2 = require("./accessStats");
|
|
25
|
+
const storageLogs_1 = require("./storageLogs");
|
|
25
26
|
const validation_1 = require("./validation");
|
|
26
27
|
exports.REMOTE_STORAGE_CLASS_GUID = "RemoteStorageController-b7e42a91";
|
|
27
28
|
exports.STORAGE_AUTH_PURPOSE = "remoteStorage-auth-1";
|
|
@@ -246,6 +247,7 @@ class RemoteStorageControllerBase {
|
|
|
246
247
|
}
|
|
247
248
|
async set(config) {
|
|
248
249
|
(0, serverConfig_1.assertWritesAllowed)();
|
|
250
|
+
let caller = callerId();
|
|
249
251
|
// Copied because the wire hands us a plain Uint8Array view, not a real Buffer
|
|
250
252
|
let data = Buffer.from(config.data);
|
|
251
253
|
if (config.path === remoteConfig_1.ROUTING_FILE) {
|
|
@@ -253,17 +255,22 @@ class RemoteStorageControllerBase {
|
|
|
253
255
|
return await (0, storageServerState_1.writeRoutingConfig)(config.account, config.bucketName, config.sourceConfig.name, data, config);
|
|
254
256
|
}
|
|
255
257
|
await withStore(config, store => store.set({ ...config, data }));
|
|
258
|
+
(0, storageLogs_1.logMutation)({ op: config.undelete && "undelete" || "set", account: config.account, bucketName: config.bucketName, store: config.sourceConfig.name, path: config.path, size: data.length, writeTime: config.lastModified, callerId: caller, internal: config.internal });
|
|
256
259
|
}
|
|
257
260
|
async del(config) {
|
|
258
261
|
(0, serverConfig_1.assertWritesAllowed)();
|
|
262
|
+
let caller = callerId();
|
|
259
263
|
await withStore(config, store => store.del(config));
|
|
264
|
+
(0, storageLogs_1.logMutation)({ op: "del", account: config.account, bucketName: config.bucketName, store: config.sourceConfig.name, path: config.path, writeTime: config.lastModified, callerId: caller, internal: config.internal });
|
|
260
265
|
}
|
|
261
266
|
async move(config) {
|
|
262
267
|
(0, serverConfig_1.assertWritesAllowed)();
|
|
268
|
+
let caller = callerId();
|
|
263
269
|
// assertValidArgs only knows the well-known `path` field, so the two paths of a move are validated here
|
|
264
270
|
(0, validation_1.assertValidPath)(config.fromPath);
|
|
265
271
|
(0, validation_1.assertValidPath)(config.toPath);
|
|
266
272
|
await withStore(config, store => store.move(config));
|
|
273
|
+
(0, storageLogs_1.logMutation)({ op: "move", account: config.account, bucketName: config.bucketName, store: config.sourceConfig.name, path: config.fromPath, toPath: config.toPath, callerId: caller });
|
|
267
274
|
}
|
|
268
275
|
async getInfo(config) {
|
|
269
276
|
if (config.path === remoteConfig_1.ROUTING_FILE) {
|
|
@@ -318,6 +325,14 @@ class RemoteStorageControllerBase {
|
|
|
318
325
|
async getSyncStatus(config) {
|
|
319
326
|
return await (0, storageServerState_1.bucketSyncStatus)(config.account, config.bucketName);
|
|
320
327
|
}
|
|
328
|
+
/** The operation-log files THIS server holds (every server logs its own operations - ask each one; see listAllServerLogFiles in createArchives). */
|
|
329
|
+
async listLogFiles(config) {
|
|
330
|
+
return await (0, storageLogs_1.listStorageLogFiles)();
|
|
331
|
+
}
|
|
332
|
+
/** One log file's bytes, always LZ4-compressed (a live file is flushed and compressed in memory before sending). Decode with decodeLogFile. */
|
|
333
|
+
async getLogFile(config) {
|
|
334
|
+
return await (0, storageLogs_1.readStorageLogFile)(config.name);
|
|
335
|
+
}
|
|
321
336
|
async startLargeFile(config) {
|
|
322
337
|
(0, serverConfig_1.assertWritesAllowed)();
|
|
323
338
|
let store = (0, storageServerState_1.findBucketStore)(config.account, config.bucketName, config.sourceConfig);
|
|
@@ -343,7 +358,11 @@ class RemoteStorageControllerBase {
|
|
|
343
358
|
if (!info)
|
|
344
359
|
throw new Error(`Unknown large upload ${config.uploadId}`);
|
|
345
360
|
largeUploadInfo.delete(config.uploadId);
|
|
346
|
-
|
|
361
|
+
let caller = callerId();
|
|
362
|
+
let store = (0, storageServerState_1.getStore)(info.account, info.bucketName, info.storeName);
|
|
363
|
+
await store.finishLargeUpload({ id: config.uploadId, path: info.path, lastModified: info.lastModified, forceSetImmutable: info.forceSetImmutable, noChecks: info.noChecks, internal: info.internal });
|
|
364
|
+
let written = await store.getInfo({ path: info.path });
|
|
365
|
+
(0, storageLogs_1.logMutation)({ op: "setLarge", account: info.account, bucketName: info.bucketName, store: info.storeName, path: info.path, size: written === null || written === void 0 ? void 0 : written.size, writeTime: written === null || written === void 0 ? void 0 : written.writeTime, callerId: caller });
|
|
347
366
|
}
|
|
348
367
|
/** Best-effort cleanup: an unknown upload has nothing left to cancel. */
|
|
349
368
|
async cancelLargeFile(config) {
|
|
@@ -524,6 +543,12 @@ __decorate([
|
|
|
524
543
|
__decorate([
|
|
525
544
|
validation_1.assertValidArgs
|
|
526
545
|
], RemoteStorageControllerBase.prototype, "getSyncStatus", null);
|
|
546
|
+
__decorate([
|
|
547
|
+
validation_1.assertValidArgs
|
|
548
|
+
], RemoteStorageControllerBase.prototype, "listLogFiles", null);
|
|
549
|
+
__decorate([
|
|
550
|
+
validation_1.assertValidArgs
|
|
551
|
+
], RemoteStorageControllerBase.prototype, "getLogFile", null);
|
|
527
552
|
__decorate([
|
|
528
553
|
validation_1.assertValidArgs
|
|
529
554
|
], RemoteStorageControllerBase.prototype, "startLargeFile", null);
|
|
@@ -531,6 +556,16 @@ __decorate([
|
|
|
531
556
|
async function withStore(config, fn) {
|
|
532
557
|
return await fn((0, storageServerState_1.findBucketStore)(config.account, config.bucketName, config.sourceConfig));
|
|
533
558
|
}
|
|
559
|
+
// The caller's node id for the mutation log - read synchronously at method entry (the call context does not survive awaits), and tolerant of there being none (local calls)
|
|
560
|
+
function callerId() {
|
|
561
|
+
var _a;
|
|
562
|
+
try {
|
|
563
|
+
return (_a = SocketFunction_1.SocketFunction.getCaller()) === null || _a === void 0 ? void 0 : _a.nodeId;
|
|
564
|
+
}
|
|
565
|
+
catch (_b) {
|
|
566
|
+
return undefined;
|
|
567
|
+
}
|
|
568
|
+
}
|
|
534
569
|
const largeUploadInfo = new Map();
|
|
535
570
|
const accountAccess = async (context) => {
|
|
536
571
|
let start = Date.now();
|
|
@@ -577,6 +612,8 @@ exports.RemoteStorageController = SocketFunction_1.SocketFunction.register(expor
|
|
|
577
612
|
getAccessStats: { hooks: [accountAccess] },
|
|
578
613
|
getAccessSummaries: { hooks: [accountAccess] },
|
|
579
614
|
getSyncStatus: { hooks: [accountAccess] },
|
|
615
|
+
listLogFiles: { hooks: [accountAccess] },
|
|
616
|
+
getLogFile: { hooks: [accountAccess] },
|
|
580
617
|
startLargeFile: { hooks: [accountAccess] },
|
|
581
618
|
uploadPart: { hooks: [uploadAccess] },
|
|
582
619
|
finishLargeFile: { hooks: [uploadAccess] },
|
|
@@ -586,5 +623,5 @@ exports.RemoteStorageController = SocketFunction_1.SocketFunction.register(expor
|
|
|
586
623
|
noClientHooks: true,
|
|
587
624
|
noDefaultHooks: true,
|
|
588
625
|
}));
|
|
589
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZUNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdG9yYWdlQ29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxtRUFBZ0U7QUFFaEUsNkRBQTREO0FBQzVELHlFQUFrRztBQUNsRyxpRUFBbUU7QUFDbkUsaUZBQThFO0FBQzlFLG1EQUF3RDtBQUN4RCxrREFBa0k7QUFDbEksNENBQW1JO0FBQ25JLGlEQUF1RTtBQUN2RSw2REFLOEI7QUFDOUIsK0NBQTREO0FBQzVELGlEQUFvRztBQUVwRyw2Q0FBb0Q7QUFDcEQsdUVBQW9FO0FBQ3BFLCtDQUE4SjtBQUM5Siw2Q0FBaUY7QUFHcEUsUUFBQSx5QkFBeUIsR0FBRyxrQ0FBa0MsQ0FBQztBQUMvRCxRQUFBLG9CQUFvQixHQUFHLHNCQUFzQixDQUFDO0FBQzlDLFFBQUEseUJBQXlCLEdBQUcsMkNBQTJDLENBQUM7QUFDeEUsUUFBQSxxQkFBcUIsR0FBRyx1Q0FBdUMsQ0FBQztBQUU3RSxNQUFNLGdCQUFnQixHQUFHLG1CQUFZLEdBQUcsRUFBRSxDQUFDO0FBQzNDLE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxDQUFDO0FBQ2xDLE1BQU0sWUFBWSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFDaEMsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUM7QUFpQy9CLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0FBRTNDLHdaQUF3WjtBQUN4WixNQUFNLGFBQWEsR0FBOEI7SUFDN0MsR0FBRyxFQUFFLHlCQUF5QixFQUFFLElBQUksRUFBRSxpQ0FBaUM7SUFDdkUsR0FBRyxFQUFFLDJCQUEyQixFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxXQUFXO0lBQzNHLElBQUksRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxJQUFJ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RTtJQUN6QyxjQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRTtJQUMxQyxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRTtJQUNyQyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRTtJQUMxQyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRTtJQUMxQyxTQUFTLEVBQUUsRUFBRTtDQUNoQixDQUFDLEVBQ0YsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNILGFBQWEsRUFBRSxJQUFJO0lBQ25CLGNBQWMsRUFBRSxJQUFJO0NBQ3ZCLENBQUMsQ0FDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU29ja2V0RnVuY3Rpb24gfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL1NvY2tldEZ1bmN0aW9uXCI7XG5pbXBvcnQgeyBTb2NrZXRGdW5jdGlvbkhvb2sgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL1NvY2tldEZ1bmN0aW9uVHlwZXNcIjtcbmltcG9ydCB7IGdldE5vZGVJZElQIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbm9kZUNhY2hlXCI7XG5pbXBvcnQgeyBzZXRIVFRQUmVzdWx0SGVhZGVycywgZ2V0Q3VycmVudEhUVFBSZXF1ZXN0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FsbEhUVFBIYW5kbGVyXCI7XG5pbXBvcnQgeyBwZXJmb3JtTG9jYWxDYWxsIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FsbE1hbmFnZXJcIjtcbmltcG9ydCB7IFJlcXVpcmVDb250cm9sbGVyIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9yZXF1aXJlL1JlcXVpcmVDb250cm9sbGVyXCI7XG5pbXBvcnQgeyB0aW1lSW5NaW51dGUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBnZXRDb21tb25OYW1lLCBnZXRQdWJsaWNJZGVudGlmaWVyLCBnZXRPd25NYWNoaW5lSWQsIHZlcmlmeSwgdmVyaWZ5TWFjaGluZUlkRm9yUHVibGljS2V5IH0gZnJvbSBcIi4uLy4uL21pc2MvaHR0cHMvY2VydHNcIjtcbmltcG9ydCB7IEFyY2hpdmVGaWxlSW5mbywgQXJjaGl2ZXNDb25maWcsIEFyY2hpdmVzU3luY1N0YXR1cywgRmluZENvbmZpZywgU291cmNlQ29uZmlnLCBJTU1VVEFCTEVfQ0FDSEVfVElNRSB9IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgZ2V0Um91dGUsIHJvdXRlQ29udGFpbnMgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7XG4gICAgZmluZEJ1Y2tldFN0b3JlLCBnZXRTdG9yZSwgZ2V0QnVja2V0U3RvcmVzLCByZWFkQnVja2V0SW50ZXJuYWwsIHdyaXRlUm91dGluZ0NvbmZpZyxcbiAgICBnZXRCdWNrZXRBcmNoaXZlc0NvbmZpZywgYnVja2V0U3luY1N0YXR1cywgZGVidWdCdWNrZXRJbmRleFRvdGFscywgQWN0aXZlQnVja2V0SW5mbyxcbiAgICBkZWJ1Z0xpc3RBY2NvdW50QnVja2V0cywgU2VydmVyQnVja2V0SW5mbyxcbiAgICBkZWJ1Z0dldEFjdGl2ZUJ1Y2tldCwgYWN0aXZhdGVCdWNrZXQsIGdldEFjdGl2ZUJ1Y2tldEtleXMsXG59IGZyb20gXCIuL3N0b3JhZ2VTZXJ2ZXJTdGF0ZVwiO1xuaW1wb3J0IHsgZGVidWdDbGVhckFjY291bnRXcml0ZVN0YXRzIH0gZnJvbSBcIi4vYWNjZXNzU3RhdHNcIjtcbmltcG9ydCB7IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcsIGdldFRydXN0LCBnZXRSZXF1ZXN0cywgYXNzZXJ0V3JpdGVzQWxsb3dlZCB9IGZyb20gXCIuL3NlcnZlckNvbmZpZ1wiO1xuaW1wb3J0IHsgQmxvYlN0b3JlIH0gZnJvbSBcIi4vYmxvYlN0b3JlXCI7XG5pbXBvcnQgeyBnZXRSb3V0aW5nRmlsZVJlc3VsdCB9IGZyb20gXCIuL2J1Y2tldERpc2tcIjtcbmltcG9ydCB7IFN0b3JhZ2VDbGllbnRDb250cm9sbGVyIH0gZnJvbSBcIi4vc3RvcmFnZUNsaWVudENvbnRyb2xsZXJcIjtcbmltcG9ydCB7IHRyYWNrQWNjZXNzLCB0cmFja0FjY2Vzc0NhbGwsIGdldEFjY2Vzc1RvdGFscywgcmVhZEFjY2Vzc1N1bW1hcmllcywgY2xlYXJBY2NvdW50QWNjZXNzU3RhdHMsIEFjY2Vzc1RvdGFscywgQWNjZXNzU3VtbWFyeVN0YXRlIH0gZnJvbSBcIi4vYWNjZXNzU3RhdHNcIjtcbmltcG9ydCB7IGFzc2VydFZhbGlkTmFtZSwgYXNzZXJ0VmFsaWRQYXRoLCBhc3NlcnRWYWxpZEFyZ3MgfSBmcm9tIFwiLi92YWxpZGF0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IFN1bW1hcnlFbnRyeSB9IGZyb20gXCIuLi8uLi90cmVlU3VtbWFyeVwiO1xuXG5leHBvcnQgY29uc3QgUkVNT1RFX1NUT1JBR0VfQ0xBU1NfR1VJRCA9IFwiUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXItYjdlNDJhOTFcIjtcbmV4cG9ydCBjb25zdCBTVE9SQUdFX0FVVEhfUFVSUE9TRSA9IFwicmVtb3RlU3RvcmFnZS1hdXRoLTFcIjtcbmV4cG9ydCBjb25zdCBTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVEID0gXCJSRU1PVEVfU1RPUkFHRV9OT1RfQVVUSEVOVElDQVRFRF9jZjJmN2IxZVwiO1xuZXhwb3J0IGNvbnN0IFNUT1JBR0VfQUNDRVNTX0RFTklFRCA9IFwiUkVNT1RFX1NUT1JBR0VfQUNDRVNTX0RFTklFRF85ZDgxYTRjMFwiO1xuXG5jb25zdCBBVVRIX1RJTUVfV0lORE9XID0gdGltZUluTWludXRlICogMTA7XG5jb25zdCBBQ0NFU1NfQ0hFQ0tfU0xPV19USU1FID0gNTA7XG5jb25zdCBNQVhfU0VTU0lPTlMgPSAxMDAgKiAxMDAwO1xuY29uc3QgTUFYX1JFUVVFU1RTX1BFUl9JUCA9IDUwO1xuXG5leHBvcnQgdHlwZSBBdXRoVG9rZW5EYXRhID0ge1xuICAgIHB1cnBvc2U6IHN0cmluZztcbiAgICB0aW1lOiBudW1iZXI7XG4gICAgc2VydmVyOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgQXV0aFRva2VuID0ge1xuICAgIGNlcnRQZW06IHN0cmluZztcbiAgICBzaWduYXR1cmU6IHN0cmluZztcbiAgICBkYXRhOiBBdXRoVG9rZW5EYXRhO1xufTtcbmV4cG9ydCB0eXBlIEFjY2Vzc1JlcXVlc3QgPSB7XG4gICAgcmVxdWVzdElkOiBzdHJpbmc7XG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIG1hY2hpbmVJZDogc3RyaW5nO1xuICAgIGlwOiBzdHJpbmc7XG4gICAgdGltZTogbnVtYmVyO1xufTtcbmV4cG9ydCB0eXBlIFRydXN0UmVjb3JkID0ge1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICBtYWNoaW5lSWQ6IHN0cmluZztcbiAgICBpcDogc3RyaW5nO1xuICAgIHRpbWU6IG51bWJlcjtcbn07XG5leHBvcnQgdHlwZSBBY2Nlc3NTdGF0ZSA9IHtcbiAgICBtYWNoaW5lSWQ6IHN0cmluZztcbiAgICBpcDogc3RyaW5nO1xuICAgIGhhc0FjY2VzczogYm9vbGVhbjtcbiAgICBncmFudEFjY2Vzc0NvbW1hbmQ/OiBzdHJpbmc7XG4gICAgdHJ1c3RlZE1hY2hpbmVzPzogVHJ1c3RSZWNvcmRbXTtcbn07XG5cbmNvbnN0IHNlc3Npb25zID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuLy8gV2UgbXVzdCBuZXZlciBzZXJ2ZSBhbnl0aGluZyB0aGF0IGNhbiBiZSBldmFsdWF0ZWQgYXMgY29kZSAoaHRtbCwganMgLSBhbmQgc3ZnLCB3aGljaCBjYW4gZW1iZWQgPHNjcmlwdD4gYW5kIHJ1bnMgaXQgd2hlbiB2aXNpdGVkIGFzIGEgZG9jdW1lbnQpLiBPdGhlcndpc2UgYSB1c2VyIGNvdWxkIGhvc3QgYSBmaWxlIGFuZCwgYnkgdmlzaXRpbmcgaXQsIHJ1biBpdCBvbiBvdXIgZG9tYWluIC0gZ2l2aW5nIHRoZW0gYWNjZXNzIHRvIGFsbCBvZiBvdXIga2V5cyBhbmQgY29va2llcy4gUERGIHN0YXlzOiBicm93c2VyIFBERiB2aWV3ZXJzIHJ1biBhbnkgZW1iZWRkZWQgUERGIHNjcmlwdGluZyBpbiBhIHNhbmRib3ggd2l0aCBubyBhY2Nlc3MgdG8gdGhlIHNlcnZpbmcgb3JpZ2luJ3MgY29va2llcyBvciBET00uXG5jb25zdCBDT05URU5UX1RZUEVTOiB7IFtleHQ6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIGNzczogXCJ0ZXh0L2NzczsgY2hhcnNldD11dGYtOFwiLCBqc29uOiBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIixcbiAgICB0eHQ6IFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiLCBwbmc6IFwiaW1hZ2UvcG5nXCIsIGpwZzogXCJpbWFnZS9qcGVnXCIsIGpwZWc6IFwiaW1hZ2UvanBlZ1wiLCBnaWY6IFwiaW1hZ2UvZ2lmXCIsXG4gICAgd2VicDogXCJpbWFnZS93ZWJwXCIsIG1wNDogXCJ2aWRlby9tcDRcIiwgd2VibTogXCJ2aWRlby93ZWJtXCIsXG4gICAgbXAzOiBcImF1ZGlvL21wZWdcIiwgd2F2OiBcImF1ZGlvL3dhdlwiLCBwZGY6IFwiYXBwbGljYXRpb24vcGRmXCIsXG59O1xuXG5jb25zdCBjb25uZWN0ZWRDbGllbnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5mdW5jdGlvbiB0cmFja0NhbGxlcigpOiB2b2lkIHtcbiAgICBsZXQgbm9kZUlkID0gU29ja2V0RnVuY3Rpb24uZ2V0Q2FsbGVyKCkubm9kZUlkO1xuICAgIGlmIChjb25uZWN0ZWRDbGllbnRzLmhhcyhub2RlSWQpKSByZXR1cm47XG4gICAgY29ubmVjdGVkQ2xpZW50cy5hZGQobm9kZUlkKTtcbiAgICBTb2NrZXRGdW5jdGlvbi5vbk5leHREaXNjb25uZWN0KG5vZGVJZCwgKCkgPT4ge1xuICAgICAgICBjb25uZWN0ZWRDbGllbnRzLmRlbGV0ZShub2RlSWQpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnJvYWRjYXN0Um91dGluZ0NoYW5nZWQoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coYEJyb2FkY2FzdGluZyByb3V0aW5nIGNvbmZpZyBjaGFuZ2UgdG8gJHtjb25uZWN0ZWRDbGllbnRzLnNpemV9IGNvbm5lY3RlZCBjbGllbnRzYCk7XG4gICAgZm9yIChsZXQgbm9kZUlkIG9mIFsuLi5jb25uZWN0ZWRDbGllbnRzXSkge1xuICAgICAgICB2b2lkIFN0b3JhZ2VDbGllbnRDb250cm9sbGVyLm5vZGVzW25vZGVJZF0ucm91dGluZ0NvbmZpZ0NoYW5nZWQoKS5jYXRjaCgoKSA9PiB7IH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q2FsbGVyTWFjaGluZUlkKCk6IHN0cmluZyB7XG4gICAgbGV0IGNhbGxlciA9IFNvY2tldEZ1bmN0aW9uLmdldENhbGxlcigpO1xuICAgIGxldCBtYWNoaW5lSWQgPSBzZXNzaW9ucy5nZXQoY2FsbGVyLm5vZGVJZCk7XG4gICAgaWYgKCFtYWNoaW5lSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURUR9IENhbGwgYXV0aGVudGljYXRlIGZpcnN0IChjb25uZWN0aW9uICR7Y2FsbGVyLm5vZGVJZH0pYCk7XG4gICAgfVxuICAgIHJldHVybiBtYWNoaW5lSWQ7XG59XG5mdW5jdGlvbiBnZXRDYWxsZXJJUCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXROb2RlSWRJUChTb2NrZXRGdW5jdGlvbi5nZXRDYWxsZXIoKS5ub2RlSWQpO1xufVxuZnVuY3Rpb24gaXNBZG1pbihtYWNoaW5lSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBtYWNoaW5lSWQgPT09IGdldE93bk1hY2hpbmVJZChnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCkucm9vdERvbWFpbik7XG59XG5mdW5jdGlvbiByZXF1aXJlQWRtaW4oKTogc3RyaW5nIHtcbiAgICBsZXQgbWFjaGluZUlkID0gZ2V0Q2FsbGVyTWFjaGluZUlkKCk7XG4gICAgaWYgKCFpc0FkbWluKG1hY2hpbmVJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfQUNDRVNTX0RFTklFRH0gQWRtaW4gY29tbWFuZHMgbXVzdCBiZSBydW4gZnJvbSB0aGUgc3RvcmFnZSBtYWNoaW5lIGl0c2VsZiAoY2FsbGVyIG1hY2hpbmUgJHttYWNoaW5lSWR9KWApO1xuICAgIH1cbiAgICByZXR1cm4gbWFjaGluZUlkO1xufVxuYXN5bmMgZnVuY3Rpb24gcmVxdWlyZUFjY2VzcyhhY2NvdW50OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGFzc2VydFZhbGlkTmFtZShhY2NvdW50LCBcImFjY291bnRcIik7XG4gICAgbGV0IG1hY2hpbmVJZCA9IGdldENhbGxlck1hY2hpbmVJZCgpO1xuICAgIGlmIChpc0FkbWluKG1hY2hpbmVJZCkpIHJldHVybiBtYWNoaW5lSWQ7XG4gICAgbGV0IHRydXN0ID0gYXdhaXQgZ2V0VHJ1c3QoKTtcbiAgICBsZXQgdHJ1c3RlZCA9IGF3YWl0IHRydXN0LmdldChgJHthY2NvdW50fXwke21hY2hpbmVJZH1gKTtcbiAgICBpZiAoIXRydXN0ZWQpIHtcbiAgICAgICAgbGV0IHsgZG9tYWluLCBwb3J0IH0gPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX0FDQ0VTU19ERU5JRUR9IE1hY2hpbmUgJHttYWNoaW5lSWR9IGhhcyBubyBhY2Nlc3MgdG8gYWNjb3VudCAke0pTT04uc3RyaW5naWZ5KGFjY291bnQpfS4gVmlzaXQgaHR0cHM6Ly8ke2RvbWFpbn06JHtwb3J0fS8ke2FjY291bnR9IGZvciBhY2Nlc3MgaW5zdHJ1Y3Rpb25zLmApO1xuICAgIH1cbiAgICByZXR1cm4gbWFjaGluZUlkO1xufVxuXG5mdW5jdGlvbiBnZXRHcmFudEFjY2Vzc0NvbW1hbmQocmVxdWVzdElkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCB7IHNzaFRhcmdldCwgc2VydmVyQ29tbWFuZCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgIHJldHVybiBgc3NoICR7c3NoVGFyZ2V0fSAnJHtzZXJ2ZXJDb21tYW5kfSAtLXJlcXVlc3RJZCAke3JlcXVlc3RJZH0nYDtcbn1cblxuY2xhc3MgUmVtb3RlU3RvcmFnZUNvbnRyb2xsZXJCYXNlIHtcbiAgICBhc3luYyBwaW5nKCk6IFByb21pc2U8e30+IHtcbiAgICAgICAgdHJhY2tDYWxsZXIoKTtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGFzeW5jIGF1dGhlbnRpY2F0ZSh0b2tlbjogQXV0aFRva2VuKTogUHJvbWlzZTx7IG1hY2hpbmVJZDogc3RyaW5nOyBpcDogc3RyaW5nIH0+IHtcbiAgICAgICAgbGV0IHsgZG9tYWluLCBwb3J0IH0gPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk7XG4gICAgICAgIGxldCBjYWxsZXIgPSBTb2NrZXRGdW5jdGlvbi5nZXRDYWxsZXIoKTtcbiAgICAgICAgdmVyaWZ5KHRva2VuLmNlcnRQZW0sIHRva2VuLnNpZ25hdHVyZSwgdG9rZW4uZGF0YSk7XG4gICAgICAgIGxldCB7IHB1cnBvc2UsIHRpbWUsIHNlcnZlciB9ID0gdG9rZW4uZGF0YTtcbiAgICAgICAgaWYgKHB1cnBvc2UgIT09IFNUT1JBR0VfQVVUSF9QVVJQT1NFKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF1dGggdG9rZW4gcHVycG9zZSBpcyAke0pTT04uc3RyaW5naWZ5KHB1cnBvc2UpfSwgZXhwZWN0ZWQgJHtKU09OLnN0cmluZ2lmeShTVE9SQUdFX0FVVEhfUFVSUE9TRSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE1hdGguYWJzKERhdGUubm93KCkgLSB0aW1lKSA+IEFVVEhfVElNRV9XSU5ET1cpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXV0aCB0b2tlbiB0aW1lIGlzIHRvbyBmYXIgZnJvbSB0aGUgc2VydmVyIHRpbWUgKHRva2VuICR7dGltZX0sIHNlcnZlciAke0RhdGUubm93KCl9LCBhbGxvd2VkIGRyaWZ0ICR7QVVUSF9USU1FX1dJTkRPV31tcylgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdG9rZW5Eb21haW4gPSBzZXJ2ZXIuc3BsaXQoXCI6XCIpWzBdO1xuICAgICAgICBpZiAodG9rZW5Eb21haW4gIT09IGRvbWFpbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdXRoIHRva2VuIGlzIGZvciBzZXJ2ZXIgJHtKU09OLnN0cmluZ2lmeShzZXJ2ZXIpfSwgYnV0IHRoaXMgc2VydmVyIGlzICR7SlNPTi5zdHJpbmdpZnkoYCR7ZG9tYWlufToke3BvcnR9YCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hY2hpbmVJZCA9IGdldENvbW1vbk5hbWUodG9rZW4uY2VydFBlbSkuc3BsaXQoXCIuXCIpWzBdO1xuICAgICAgICBpZiAoIXZlcmlmeU1hY2hpbmVJZEZvclB1YmxpY0tleSh7IG1hY2hpbmVJZCwgcHVibGljS2V5OiBnZXRQdWJsaWNJZGVudGlmaWVyKHRva2VuLmNlcnRQZW0pIH0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENlcnRpZmljYXRlIGNvbW1vbiBuYW1lICR7SlNPTi5zdHJpbmdpZnkoZ2V0Q29tbW9uTmFtZSh0b2tlbi5jZXJ0UGVtKSl9IGRvZXMgbm90IG1hdGNoIGl0cyBwdWJsaWMga2V5YCk7XG4gICAgICAgIH1cbiAgICAgICAgc2Vzc2lvbnMuc2V0KGNhbGxlci5ub2RlSWQsIG1hY2hpbmVJZCk7XG4gICAgICAgIHdoaWxlIChzZXNzaW9ucy5zaXplID4gTUFYX1NFU1NJT05TKSB7XG4gICAgICAgICAgICBsZXQgb2xkZXN0ID0gc2Vzc2lvbnMua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgICAgIGlmIChvbGRlc3QgPT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICAgICAgICBzZXNzaW9ucy5kZWxldGUob2xkZXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBtYWNoaW5lSWQsIGlwOiBnZXRDYWxsZXJJUCgpIH07XG4gICAgfVxuXG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIHJlcXVlc3RBY2Nlc3MoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZyB9KTogUHJvbWlzZTx7IG1hY2hpbmVJZDogc3RyaW5nOyBpcDogc3RyaW5nOyByZXF1ZXN0SWQ6IHN0cmluZzsgZ3JhbnRBY2Nlc3NDb21tYW5kOiBzdHJpbmcgfT4ge1xuICAgICAgICBsZXQgYWNjb3VudCA9IGNvbmZpZy5hY2NvdW50O1xuICAgICAgICBsZXQgbWFjaGluZUlkID0gZ2V0Q2FsbGVyTWFjaGluZUlkKCk7XG4gICAgICAgIGxldCBpcCA9IGdldENhbGxlcklQKCk7XG4gICAgICAgIGxldCByZXF1ZXN0c1N0b3JhZ2UgPSBhd2FpdCBnZXRSZXF1ZXN0cygpO1xuICAgICAgICBsZXQgcmVxdWVzdHMgPSBhd2FpdCByZXF1ZXN0c1N0b3JhZ2UuZ2V0KGlwKSB8fCBbXTtcbiAgICAgICAgbGV0IGV4aXN0aW5nID0gcmVxdWVzdHMuZmluZCh4ID0+IHguYWNjb3VudCA9PT0gYWNjb3VudCAmJiB4Lm1hY2hpbmVJZCA9PT0gbWFjaGluZUlkKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICBleGlzdGluZy50aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4aXN0aW5nID0ge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApLFxuICAgICAgICAgICAgICAgIGFjY291bnQsXG4gICAgICAgICAgICAgICAgbWFjaGluZUlkLFxuICAgICAgICAgICAgICAgIGlwLFxuICAgICAgICAgICAgICAgIHRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVxdWVzdHMucHVzaChleGlzdGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHJlcXVlc3RzLmxlbmd0aCA+IE1BWF9SRVFVRVNUU19QRVJfSVApIHJlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICAgIGF3YWl0IHJlcXVlc3RzU3RvcmFnZS5zZXQoaXAsIHJlcXVlc3RzKTtcbiAgICAgICAgcmV0dXJuIHsgbWFjaGluZUlkLCBpcCwgcmVxdWVzdElkOiBleGlzdGluZy5yZXF1ZXN0SWQsIGdyYW50QWNjZXNzQ29tbWFuZDogZ2V0R3JhbnRBY2Nlc3NDb21tYW5kKGV4aXN0aW5nLnJlcXVlc3RJZCkgfTtcbiAgICB9XG5cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgZ2V0QWNjZXNzU3RhdGUoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZyB9KTogUHJvbWlzZTxBY2Nlc3NTdGF0ZT4ge1xuICAgICAgICBsZXQgYWNjb3VudCA9IGNvbmZpZy5hY2NvdW50O1xuICAgICAgICBsZXQgbWFjaGluZUlkID0gZ2V0Q2FsbGVyTWFjaGluZUlkKCk7XG4gICAgICAgIGxldCBpcCA9IGdldENhbGxlcklQKCk7XG4gICAgICAgIGxldCB0cnVzdCA9IGF3YWl0IGdldFRydXN0KCk7XG4gICAgICAgIGxldCBoYXNBY2Nlc3MgPSBpc0FkbWluKG1hY2hpbmVJZCkgfHwgISFhd2FpdCB0cnVzdC5nZXQoYCR7YWNjb3VudH18JHttYWNoaW5lSWR9YCk7XG4gICAgICAgIGxldCByZXN1bHQ6IEFjY2Vzc1N0YXRlID0geyBtYWNoaW5lSWQsIGlwLCBoYXNBY2Nlc3MgfTtcbiAgICAgICAgaWYgKCFoYXNBY2Nlc3MpIHtcbiAgICAgICAgICAgIGxldCByZXF1ZXN0cyA9IGF3YWl0IGdldFJlcXVlc3RzKCk7XG4gICAgICAgICAgICBsZXQgb3duUmVxdWVzdCA9IChhd2FpdCByZXF1ZXN0cy5nZXQoaXApIHx8IFtdKS5maW5kKHggPT4geC5hY2NvdW50ID09PSBhY2NvdW50ICYmIHgubWFjaGluZUlkID09PSBtYWNoaW5lSWQpO1xuICAgICAgICAgICAgaWYgKG93blJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZ3JhbnRBY2Nlc3NDb21tYW5kID0gZ2V0R3JhbnRBY2Nlc3NDb21tYW5kKG93blJlcXVlc3QucmVxdWVzdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHJ1c3RlZE1hY2hpbmVzOiBUcnVzdFJlY29yZFtdID0gW107XG4gICAgICAgIGZvciAobGV0IGtleSBvZiBhd2FpdCB0cnVzdC5nZXRLZXlzKCkpIHtcbiAgICAgICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoYCR7YWNjb3VudH18YCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHJlY29yZCA9IGF3YWl0IHRydXN0LmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKHJlY29yZCkgdHJ1c3RlZE1hY2hpbmVzLnB1c2gocmVjb3JkKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQudHJ1c3RlZE1hY2hpbmVzID0gdHJ1c3RlZE1hY2hpbmVzO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGFzeW5jIGxpc3RSZXF1ZXN0c0ZvcklQKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGlwOiBzdHJpbmcgfSk6IFByb21pc2U8QWNjZXNzUmVxdWVzdFtdPiB7XG4gICAgICAgIGxldCByZXF1ZXN0cyA9IGF3YWl0IGdldFJlcXVlc3RzKCk7XG4gICAgICAgIHJldHVybiAoYXdhaXQgcmVxdWVzdHMuZ2V0KGNvbmZpZy5pcCkgfHwgW10pLmZpbHRlcih4ID0+IHguYWNjb3VudCA9PT0gY29uZmlnLmFjY291bnQpO1xuICAgIH1cblxuICAgIGFzeW5jIGdyYW50QWNjZXNzKGNvbmZpZzogeyByZXF1ZXN0SWQ6IHN0cmluZyB9KTogUHJvbWlzZTxUcnVzdFJlY29yZD4ge1xuICAgICAgICBsZXQgcmVxdWVzdElkID0gY29uZmlnLnJlcXVlc3RJZDtcbiAgICAgICAgbGV0IGNhbGxlck1hY2hpbmVJZCA9IGdldENhbGxlck1hY2hpbmVJZCgpO1xuICAgICAgICBsZXQgdHJ1c3QgPSBhd2FpdCBnZXRUcnVzdCgpO1xuICAgICAgICBsZXQgcmVxdWVzdHMgPSBhd2FpdCBnZXRSZXF1ZXN0cygpO1xuICAgICAgICBmb3IgKGxldCBpcCBvZiBhd2FpdCByZXF1ZXN0cy5nZXRLZXlzKCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHJlcXVlc3Qgb2YgYXdhaXQgcmVxdWVzdHMuZ2V0KGlwKSB8fCBbXSkge1xuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3RJZCAhPT0gcmVxdWVzdElkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQWRtaW4oY2FsbGVyTWFjaGluZUlkKSAmJiAhYXdhaXQgdHJ1c3QuZ2V0KGAke3JlcXVlc3QuYWNjb3VudH18JHtjYWxsZXJNYWNoaW5lSWR9YCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfQUNDRVNTX0RFTklFRH0gTWFjaGluZSAke2NhbGxlck1hY2hpbmVJZH0gaGFzIG5vIGFjY2VzcyB0byBhY2NvdW50ICR7SlNPTi5zdHJpbmdpZnkocmVxdWVzdC5hY2NvdW50KX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlY29yZDogVHJ1c3RSZWNvcmQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnQ6IHJlcXVlc3QuYWNjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgbWFjaGluZUlkOiByZXF1ZXN0Lm1hY2hpbmVJZCxcbiAgICAgICAgICAgICAgICAgICAgaXA6IHJlcXVlc3QuaXAsXG4gICAgICAgICAgICAgICAgICAgIHRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0cnVzdC5zZXQoYCR7cmVxdWVzdC5hY2NvdW50fXwke3JlcXVlc3QubWFjaGluZUlkfWAsIHJlY29yZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGFjY2VzcyByZXF1ZXN0IGZvdW5kIHdpdGggaWQgJHtKU09OLnN0cmluZ2lmeShyZXF1ZXN0SWQpfS4gSXQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGdyYW50ZWQgb3IgZXhwaXJlZC5gKTtcbiAgICB9XG5cbiAgICAvKiogQWRtaW4gKHNvIG9ubHkgdGhpcyBtYWNoaW5lJ3Mgb3duIHByb2Nlc3NlcyBjYW4gY2FsbCBpdCk6IHRoZSBidWNrZXRzIHRoaXMgcHJvY2VzcyBoYXMgbG9hZGVkLiBBIGRlcGxveSBzdWNjZXNzb3IgYXNrcyBpdHMgcHJlZGVjZXNzb3IgZm9yIHRoaXMsIHNvIGl0IGFjdGl2YXRlcyBleGFjdGx5IHRoZSBidWNrZXRzIHRoYXQgYXJlIGluIHVzZSBpbnN0ZWFkIG9mIGV2ZXJ5IGJ1Y2tldCBvbiBkaXNrLiAqL1xuICAgIGFzeW5jIGFkbWluTGlzdEFjdGl2ZUJ1Y2tldHMoKTogUHJvbWlzZTx7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH1bXT4ge1xuICAgICAgICByZXR1cm4gZ2V0QWN0aXZlQnVja2V0S2V5cygpO1xuICAgIH1cbiAgICBhc3luYyBhZG1pbkxpc3RSZXF1ZXN0cyhjb25maWc6IHsgaXA6IHN0cmluZyB9KTogUHJvbWlzZTxBY2Nlc3NSZXF1ZXN0W10+IHtcbiAgICAgICAgbGV0IHJlcXVlc3RzID0gYXdhaXQgZ2V0UmVxdWVzdHMoKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlcXVlc3RzLmdldChjb25maWcuaXApIHx8IFtdO1xuICAgIH1cbiAgICBhc3luYyBhZG1pbkdyYW50QWNjZXNzKGNvbmZpZzogeyByZXF1ZXN0SWQ6IHN0cmluZyB9KTogUHJvbWlzZTxUcnVzdFJlY29yZD4ge1xuICAgICAgICBsZXQgcmVxdWVzdElkID0gY29uZmlnLnJlcXVlc3RJZDtcbiAgICAgICAgbGV0IHRydXN0ID0gYXdhaXQgZ2V0VHJ1c3QoKTtcbiAgICAgICAgbGV0IHJlcXVlc3RzID0gYXdhaXQgZ2V0UmVxdWVzdHMoKTtcbiAgICAgICAgZm9yIChsZXQgaXAgb2YgYXdhaXQgcmVxdWVzdHMuZ2V0S2V5cygpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByZXF1ZXN0IG9mIGF3YWl0IHJlcXVlc3RzLmdldChpcCkgfHwgW10pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0SWQgIT09IHJlcXVlc3RJZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHJlY29yZDogVHJ1c3RSZWNvcmQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnQ6IHJlcXVlc3QuYWNjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgbWFjaGluZUlkOiByZXF1ZXN0Lm1hY2hpbmVJZCxcbiAgICAgICAgICAgICAgICAgICAgaXA6IHJlcXVlc3QuaXAsXG4gICAgICAgICAgICAgICAgICAgIHRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0cnVzdC5zZXQoYCR7cmVxdWVzdC5hY2NvdW50fXwke3JlcXVlc3QubWFjaGluZUlkfWAsIHJlY29yZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGFjY2VzcyByZXF1ZXN0IGZvdW5kIHdpdGggaWQgJHtKU09OLnN0cmluZ2lmeShyZXF1ZXN0SWQpfS4gSXQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGdyYW50ZWQgb3IgZXhwaXJlZC5gKTtcbiAgICB9XG5cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgQHRyYWNrQWNjZXNzQ2FsbChcImdldFwiKVxuICAgIGFzeW5jIGdldDIoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnOyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTsgaW50ZXJuYWw/OiBib29sZWFuOyBpbmNsdWRlVG9tYnN0b25lcz86IGJvb2xlYW4gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBpZiAoY29uZmlnLnBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBsaXZlcyBvdXRzaWRlIGV2ZXJ5IHN0b3JlIGFuZCBldmVuIG91dHNpZGUgdGhlIGJ1Y2tldCAoaXQgaXMgd2hhdCBDUkVBVEVTIGl0KSwgc28gaXQgaXMgcmVhZCBzdHJhaWdodCBvZmYgdGhlIGRpc2sgLSBhYnNlbnQgbWVhbnMgdW5kZWZpbmVkLCBleGFjdGx5IGxpa2UgYW55IGZpbGUgcmVhZFxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGdldFJvdXRpbmdGaWxlUmVzdWx0KGNvbmZpZy5hY2NvdW50LCBjb25maWcuYnVja2V0TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5pbnRlcm5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlYWRCdWNrZXRJbnRlcm5hbChjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHdpdGhTdG9yZShjb25maWcsIHN0b3JlID0+IHN0b3JlLmdldDIoY29uZmlnKSk7XG4gICAgfVxuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBAdHJhY2tBY2Nlc3NDYWxsKFwic2V0XCIpXG4gICAgYXN5bmMgc2V0KGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBkYXRhOiBCdWZmZXI7IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjsgaW50ZXJuYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICAvLyBDb3BpZWQgYmVjYXVzZSB0aGUgd2lyZSBoYW5kcyB1cyBhIHBsYWluIFVpbnQ4QXJyYXkgdmlldywgbm90IGEgcmVhbCBCdWZmZXJcbiAgICAgICAgbGV0IGRhdGEgPSBCdWZmZXIuZnJvbShjb25maWcuZGF0YSk7XG4gICAgICAgIGlmIChjb25maWcucGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICAvLyBUaGUgc3RvcmUgdGhlIGNhbGxlciBzZWxlY3RlZCBvd25zIHRoaXMgZmlsZTogaXQgYXBwbGllcyBpdCwgZW5mb3JjZXMgdGhlIHZlcnNpb24gcnVsZSwgYW5kIGl0cyBwZWVycyBwdWxsIGl0IGZyb20gdGhlcmVcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB3cml0ZVJvdXRpbmdDb25maWcoY29uZmlnLmFjY291bnQsIGNvbmZpZy5idWNrZXROYW1lLCBjb25maWcuc291cmNlQ29uZmlnLm5hbWUsIGRhdGEsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgd2l0aFN0b3JlKGNvbmZpZywgc3RvcmUgPT4gc3RvcmUuc2V0KHsgLi4uY29uZmlnLCBkYXRhIH0pKTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIEB0cmFja0FjY2Vzc0NhbGwoXCJkZWxcIilcbiAgICBhc3luYyBkZWwoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGludGVybmFsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICAgICAgYXdhaXQgd2l0aFN0b3JlKGNvbmZpZywgc3RvcmUgPT4gc3RvcmUuZGVsKGNvbmZpZykpO1xuICAgIH1cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgQHRyYWNrQWNjZXNzQ2FsbChcIm1vdmVcIilcbiAgICBhc3luYyBtb3ZlKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgZnJvbVBhdGg6IHN0cmluZzsgdG9QYXRoOiBzdHJpbmc7IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICAvLyBhc3NlcnRWYWxpZEFyZ3Mgb25seSBrbm93cyB0aGUgd2VsbC1rbm93biBgcGF0aGAgZmllbGQsIHNvIHRoZSB0d28gcGF0aHMgb2YgYSBtb3ZlIGFyZSB2YWxpZGF0ZWQgaGVyZVxuICAgICAgICBhc3NlcnRWYWxpZFBhdGgoY29uZmlnLmZyb21QYXRoKTtcbiAgICAgICAgYXNzZXJ0VmFsaWRQYXRoKGNvbmZpZy50b1BhdGgpO1xuICAgICAgICBhd2FpdCB3aXRoU3RvcmUoY29uZmlnLCBzdG9yZSA9PiBzdG9yZS5tb3ZlKGNvbmZpZykpO1xuICAgIH1cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgQHRyYWNrQWNjZXNzQ2FsbChcImdldEluZm9cIilcbiAgICBhc3luYyBnZXRJbmZvKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZzsgaW5jbHVkZVRvbWJzdG9uZXM/OiBib29sZWFuIH0pOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGlmIChjb25maWcucGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgZ2V0Um91dGluZ0ZpbGVSZXN1bHQoY29uZmlnLmFjY291bnQsIGNvbmZpZy5idWNrZXROYW1lKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgJiYgeyB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5zaXplIH0gfHwgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoU3RvcmUoY29uZmlnLCBzdG9yZSA9PiBzdG9yZS5nZXRJbmZvKGNvbmZpZykpO1xuICAgIH1cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgQHRyYWNrQWNjZXNzQ2FsbChcImZpbmRJbmZvXCIpXG4gICAgYXN5bmMgZmluZEluZm8oY29uZmlnOiBGaW5kQ29uZmlnICYgeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgcHJlZml4OiBzdHJpbmc7IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoU3RvcmUoY29uZmlnLCBzdG9yZSA9PiBzdG9yZS5maW5kSW5mbyhjb25maWcpKTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIEB0cmFja0FjY2Vzc0NhbGwoXCJnZXRDaGFuZ2VzQWZ0ZXJcIilcbiAgICBhc3luYyBnZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWc7IHRpbWU6IG51bWJlcjsgcm91dGVzPzogW251bWJlciwgbnVtYmVyXVtdIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoU3RvcmUoY29uZmlnLCBzdG9yZSA9PiBzdG9yZS5nZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZykpO1xuICAgIH1cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgZ2V0QXJjaGl2ZXNDb25maWcoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBnZXRCdWNrZXRBcmNoaXZlc0NvbmZpZyhjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgbGlzdEJ1Y2tldHMoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZyB9KTogUHJvbWlzZTxTZXJ2ZXJCdWNrZXRJbmZvW10+IHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBkZWJ1Z0xpc3RBY2NvdW50QnVja2V0cyhjb25maWcuYWNjb3VudCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAvLyBUaGUgYWNjZXNzIGhvb2sgKGFuZCB0aGUgc3RvcmFnZSBpdCBpbml0aWFsaXplcykgcnVucyBiZWZvcmUgdGhpcywgc28gYSBsYXJnZSBnYXAgYmV0d2VlbiB0aGlzIGFuZCB0aGUgY2FsbGVyJ3MgdGltaW5nIGlzIHRoZSBob29rXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgbGlzdEJ1Y2tldHMoJHtjb25maWcuYWNjb3VudH0pIGNhbGwgYm9keSB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIFRoZSBsaXZlLCBpbi1tZW1vcnkgc3RhdGUgb2Ygb25lIGJ1Y2tldCwgb3IgYSBzdHJpbmcgc2F5aW5nIHdoeSBpdCBpcyB1bmF2YWlsYWJsZS4gQW5zd2VyZWQgd2l0aG91dCB0b3VjaGluZyB0aGUgZGlzaywgc28gaXQgaXMgY2hlYXAgLSBidXQgb25seSB3b3JrcyB3aGlsZSB0aGUgYnVja2V0IGlzIGxvYWRlZCBoZXJlLiAqL1xuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBhc3luYyBnZXRBY3RpdmVCdWNrZXQoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFjdGl2ZUJ1Y2tldEluZm8gfCBzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGRlYnVnR2V0QWN0aXZlQnVja2V0KGNvbmZpZy5hY2NvdW50LCBjb25maWcuYnVja2V0TmFtZSk7XG4gICAgfVxuICAgIC8qKiBMb2FkcyBhIGJ1Y2tldCB0aGF0IGV4aXN0cyBvbiB0aGlzIHNlcnZlciBpbnRvIG1lbW9yeSAoc3RhcnRpbmcgaXRzIHN5bmNocm9uaXphdGlvbikgYW5kIHJldHVybnMgaXRzIGxpdmUgc3RhdGUsIG9yIGEgc3RyaW5nIHNheWluZyB3aHkgaXQgY291bGQgbm90IGJlIGxvYWRlZC4gKi9cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgYWN0aXZhdGVCdWNrZXQoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFjdGl2ZUJ1Y2tldEluZm8gfCBzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGFjdGl2YXRlQnVja2V0KGNvbmZpZy5hY2NvdW50LCBjb25maWcuYnVja2V0TmFtZSk7XG4gICAgfVxuICAgIC8qKiBaZXJvZXMgdGhlIHdyaXRlIHN0YXRpc3RpY3MgbGlzdEJ1Y2tldHMgcmVwb3J0cyBhbmQgdGhlIGluLW1lbW9yeSBhY2Nlc3Mgc3RhdGlzdGljcywgZm9yIGV2ZXJ5IGJ1Y2tldCBpbiB0aGUgYWNjb3VudC4gKi9cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgY2xlYXJXcml0ZVN0YXRzKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmcgfSk6IFByb21pc2U8eyBjbGVhcmVkQnVja2V0czogbnVtYmVyIH0+IHtcbiAgICAgICAgY2xlYXJBY2NvdW50QWNjZXNzU3RhdHMoY29uZmlnLmFjY291bnQpO1xuICAgICAgICByZXR1cm4geyBjbGVhcmVkQnVja2V0czogZGVidWdDbGVhckFjY291bnRXcml0ZVN0YXRzKGNvbmZpZy5hY2NvdW50KSB9O1xuICAgIH1cbiAgICAvKiogSW4tbWVtb3J5IHRvdGFscyBwZXIgb3BlcmF0aW9uIHR5cGUgc2luY2Ugc3RhcnR1cCAob3IgdGhlIGxhc3QgY2xlYXJXcml0ZVN0YXRzKS4gKi9cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgZ2V0QWNjZXNzU3RhdHMoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZyB9KTogUHJvbWlzZTxBY2Nlc3NUb3RhbHM+IHtcbiAgICAgICAgcmV0dXJuIGdldEFjY2Vzc1RvdGFscyhjb25maWcuYWNjb3VudCk7XG4gICAgfVxuICAgIC8qKiBBIHBhdGggYnJlYWtkb3duIG9mIG9uZSBvcGVyYXRpb24ncyBhY2Nlc3NlcyAob3BlcmF0aW9uIG5hbWVzIGNvbWUgZnJvbSBnZXRBY2Nlc3NTdGF0cykuIG1heENvdW50IGlzIHBhc3NlZCBzdHJhaWdodCB0byBUcmVlU3VtbWFyeS5nZXRTdW1tYXJpZXMuIHdlaWdodEJ5U2l6ZSBpcyBpZ25vcmVkIGZvciBjb3VudC1vbmx5IG9wZXJhdGlvbnMsIHdoaWNoIHJldHVybiB0aGVpciBjb3VudCBicmVha2Rvd24uICovXG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIGdldEFjY2Vzc1N1bW1hcmllcyhjb25maWc6IHsgYWNjb3VudDogc3RyaW5nOyBvcGVyYXRpb246IHN0cmluZzsgbWF4Q291bnQ6IG51bWJlcjsgd2VpZ2h0QnlTaXplPzogYm9vbGVhbiB9KTogUHJvbWlzZTxTdW1tYXJ5RW50cnk8QWNjZXNzU3VtbWFyeVN0YXRlPltdPiB7XG4gICAgICAgIHJldHVybiByZWFkQWNjZXNzU3VtbWFyaWVzKGNvbmZpZyk7XG4gICAgfVxuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBhc3luYyBnZXRJbmRleEluZm8oY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBzb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGRlYnVnQnVja2V0SW5kZXhUb3RhbHMoY29uZmlnLmFjY291bnQsIGNvbmZpZy5idWNrZXROYW1lKTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIGdldFN5bmNTdGF0dXMoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0U3luY1N0YXR1cyhjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUpO1xuICAgIH1cblxuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBhc3luYyBzdGFydExhcmdlRmlsZShjb25maWc6IHsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZm9yY2VTZXRJbW11dGFibGU/OiBib29sZWFuOyBub0NoZWNrcz86IGJvb2xlYW47IGludGVybmFsPzogYm9vbGVhbiB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICBsZXQgc3RvcmUgPSBmaW5kQnVja2V0U3RvcmUoY29uZmlnLmFjY291bnQsIGNvbmZpZy5idWNrZXROYW1lLCBjb25maWcuc291cmNlQ29uZmlnKTtcbiAgICAgICAgLy8gVGhlIHN0b3JlIHZhbGlkYXRlcyB0aGUgd3JpdGUgaGVyZSwgYmVmb3JlIGFueSBieXRlcyBtb3ZlIChzZWUgQmxvYlN0b3JlLnN0YXJ0TGFyZ2VVcGxvYWQpIC0gYSBsYXJnZSBmaWxlIGlzIGEgc2V0LCBhbmQgaXRzIFNldENvbmZpZyBkZWNpZGVzIHdoZXRoZXIgaXQgaXMgZXZlbiBhbGxvd2VkXG4gICAgICAgIGxldCB3cml0ZSA9IHsgcGF0aDogY29uZmlnLnBhdGgsIGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCwgZm9yY2VTZXRJbW11dGFibGU6IGNvbmZpZy5mb3JjZVNldEltbXV0YWJsZSwgbm9DaGVja3M6IGNvbmZpZy5ub0NoZWNrcywgaW50ZXJuYWw6IGNvbmZpZy5pbnRlcm5hbCB9O1xuICAgICAgICBsZXQgaWQgPSBhd2FpdCBzdG9yZS5zdGFydExhcmdlVXBsb2FkKHdyaXRlKTtcbiAgICAgICAgLy8gVGhlIHN0b3JlIG5hbWUgcGlucyB0aGUgdXBsb2FkJ3MgcGFydHMgYW5kIGZpbmlzaCB0byB0aGUgc2FtZSBzdG9yZSB0aGUgc3RhcnQgcGlja2VkIChpbi1mbGlnaHQgdXBsb2FkcyBzdXJ2aXZlIGEgYnVja2V0IHJlYnVpbGQ6IHRoZSBwYXJ0IGRhdGEgbGl2ZXMgaW4gdGhhdCBzdG9yZSdzIGZvbGRlciwgd2hpY2ggYSByZWJ1aWx0IHN0b3JlIHN0aWxsIG9wZW5zKVxuICAgICAgICBsYXJnZVVwbG9hZEluZm8uc2V0KGlkLCB7IC4uLndyaXRlLCBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgYnVja2V0TmFtZTogY29uZmlnLmJ1Y2tldE5hbWUsIHN0b3JlTmFtZTogY29uZmlnLnNvdXJjZUNvbmZpZy5uYW1lIH0pO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICAgIC8qKiBvZmZzZXQgbWFrZXMgdGhlIHBhcnQgd3JpdGUgcG9zaXRpb25hbCAoc2VlIEFyY2hpdmVzRGlzay5hcHBlbmRMYXJnZVVwbG9hZCksIHdoaWNoIGlzIHdoYXQgbGV0cyB0aGUgY2xpZW50IFJFVFJZIGEgZmFpbGVkIHBhcnQgLSBhIHJlLXNlbnQgcGFydCBsYW5kcyBvbiB0aGUgc2FtZSBieXRlcyBpbnN0ZWFkIG9mIGFwcGVuZGluZyB0d2ljZS4gKi9cbiAgICBhc3luYyB1cGxvYWRQYXJ0KGNvbmZpZzogeyB1cGxvYWRJZDogc3RyaW5nOyBkYXRhOiBCdWZmZXI7IG9mZnNldD86IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICAgICAgbGV0IGluZm8gPSBsYXJnZVVwbG9hZEluZm8uZ2V0KGNvbmZpZy51cGxvYWRJZCk7XG4gICAgICAgIGlmICghaW5mbykgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGxhcmdlIHVwbG9hZCAke2NvbmZpZy51cGxvYWRJZH1gKTtcbiAgICAgICAgdHJhY2tBY2Nlc3MoeyBhY2NvdW50OiBpbmZvLmFjY291bnQsIG9wZXJhdGlvbjogXCJ1cGxvYWRQYXJ0XCIsIHBhdGg6IGAke2luZm8uYnVja2V0TmFtZX0vJHtpbmZvLnBhdGh9YCwgc2l6ZTogY29uZmlnLmRhdGEubGVuZ3RoIH0pO1xuICAgICAgICBhd2FpdCBnZXRTdG9yZShpbmZvLmFjY291bnQsIGluZm8uYnVja2V0TmFtZSwgaW5mby5zdG9yZU5hbWUpLmFwcGVuZExhcmdlVXBsb2FkKHsgaWQ6IGNvbmZpZy51cGxvYWRJZCwgZGF0YTogQnVmZmVyLmZyb20oY29uZmlnLmRhdGEpLCBvZmZzZXQ6IGNvbmZpZy5vZmZzZXQgfSk7XG4gICAgfVxuICAgIGFzeW5jIGZpbmlzaExhcmdlRmlsZShjb25maWc6IHsgdXBsb2FkSWQ6IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICAgICAgbGV0IGluZm8gPSBsYXJnZVVwbG9hZEluZm8uZ2V0KGNvbmZpZy51cGxvYWRJZCk7XG4gICAgICAgIGlmICghaW5mbykgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGxhcmdlIHVwbG9hZCAke2NvbmZpZy51cGxvYWRJZH1gKTtcbiAgICAgICAgbGFyZ2VVcGxvYWRJbmZvLmRlbGV0ZShjb25maWcudXBsb2FkSWQpO1xuICAgICAgICBhd2FpdCBnZXRTdG9yZShpbmZvLmFjY291bnQsIGluZm8uYnVja2V0TmFtZSwgaW5mby5zdG9yZU5hbWUpLmZpbmlzaExhcmdlVXBsb2FkKHsgaWQ6IGNvbmZpZy51cGxvYWRJZCwgcGF0aDogaW5mby5wYXRoLCBsYXN0TW9kaWZpZWQ6IGluZm8ubGFzdE1vZGlmaWVkLCBmb3JjZVNldEltbXV0YWJsZTogaW5mby5mb3JjZVNldEltbXV0YWJsZSwgbm9DaGVja3M6IGluZm8ubm9DaGVja3MsIGludGVybmFsOiBpbmZvLmludGVybmFsIH0pO1xuICAgIH1cbiAgICAvKiogQmVzdC1lZmZvcnQgY2xlYW51cDogYW4gdW5rbm93biB1cGxvYWQgaGFzIG5vdGhpbmcgbGVmdCB0byBjYW5jZWwuICovXG4gICAgYXN5bmMgY2FuY2VsTGFyZ2VGaWxlKGNvbmZpZzogeyB1cGxvYWRJZDogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGluZm8gPSBsYXJnZVVwbG9hZEluZm8uZ2V0KGNvbmZpZy51cGxvYWRJZCk7XG4gICAgICAgIGlmICghaW5mbykgcmV0dXJuO1xuICAgICAgICBsYXJnZVVwbG9hZEluZm8uZGVsZXRlKGNvbmZpZy51cGxvYWRJZCk7XG4gICAgICAgIGF3YWl0IGdldFN0b3JlKGluZm8uYWNjb3VudCwgaW5mby5idWNrZXROYW1lLCBpbmZvLnN0b3JlTmFtZSkuY2FuY2VsTGFyZ2VVcGxvYWQoeyBpZDogY29uZmlnLnVwbG9hZElkIH0pO1xuICAgIH1cblxuICAgIC8vIElNUE9SVEFOVDogV2UgY2FuIG5ldmVyIGV4cG9zZSBlbnVtZXJhdGlvbiAobGlzdGluZywgcHJlZml4IHNlYXJjaCwgY2hhbmdlcyBmZWVkcykgb3ZlciB0aGlzIHB1YmxpYyBIVFRQIGVuZHBvaW50IC0gb25seSBleGFjdC1rZXkgcmVhZHMuIEVudW1lcmF0aW9uIHdvdWxkIGJlIGEgbWFzc2l2ZSBzZWN1cml0eSByaXNrIChwdWJsaWMgYnVja2V0cyByZWx5IG9uIHVuZ3Vlc3NhYmxlIGtleXMgc3RheWluZyB1bmd1ZXNzYWJsZSksIGFuZCBjb3VsZCBhbHNvIGNyYXNoIHRoZSBjbGllbnQgYnkgc2VuZGluZyB0aGVtIHRvbyBtdWNoIGRhdGEuIExpc3RpbmdzIGV4aXN0IG9ubHkgb24gdGhlIGF1dGhlbnRpY2F0ZWQgQVBJIChmaW5kSW5mbyBldGMsIGJlaGluZCBhY2NvdW50QWNjZXNzKS5cbiAgICBhc3luYyBodHRwRW50cnkoY29uZmlnPzogeyByZXF1aXJlQ2FsbHM/OiBzdHJpbmdbXTsgY2FjaGVUaW1lPzogbnVtYmVyIH0pOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgICAgICBsZXQgY2FsbGVyID0gU29ja2V0RnVuY3Rpb24uZ2V0Q2FsbGVyKCk7XG4gICAgICAgIGxldCByZXF1ZXN0ID0gZ2V0Q3VycmVudEhUVFBSZXF1ZXN0KCk7XG4gICAgICAgIGxldCBwYXRobmFtZSA9IG5ldyBVUkwocmVxdWVzdD8udXJsIHx8IFwiL1wiLCBcImh0dHBzOi8vbG9jYWxob3N0XCIpLnBhdGhuYW1lO1xuICAgICAgICBpZiAoIXBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvZmlsZS9cIikpIHtcbiAgICAgICAgICAgIGxldCBodG1sID0gYXdhaXQgcGVyZm9ybUxvY2FsQ2FsbCh7XG4gICAgICAgICAgICAgICAgY2FsbGVyLFxuICAgICAgICAgICAgICAgIGNhbGw6IHsgbm9kZUlkOiBjYWxsZXIubm9kZUlkLCBjbGFzc0d1aWQ6IFJlcXVpcmVDb250cm9sbGVyLl9jbGFzc0d1aWQsIGZ1bmN0aW9uTmFtZTogXCJyZXF1aXJlSFRNTFwiLCBhcmdzOiBbY29uZmlnXSB9LFxuICAgICAgICAgICAgfSkgYXMgQnVmZmVyO1xuICAgICAgICAgICAgLy8gV2l0aG91dCB0aGlzIHRoZSBhY2Nlc3MgcGFnZSBpcyBzZXJ2ZWQgd2l0aCBubyBjb250ZW50IHR5cGUsIGFuZCBhIGJyb3dzZXIgdGhhdCBpcyB0b2xkIG5vdCB0byBzbmlmZiBzaW1wbHkgd2lsbCBub3QgcmVuZGVyIGl0XG4gICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMoaHRtbCwgeyBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvaHRtbDsgY2hhcnNldD11dGYtOFwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXJ0cyA9IHBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoeCA9PiB4KS5tYXAoZGVjb2RlVVJJQ29tcG9uZW50KTtcbiAgICAgICAgbGV0IGFjY291bnQgPSBwYXJ0c1sxXTtcbiAgICAgICAgbGV0IGJ1Y2tldE5hbWUgPSBwYXJ0c1syXTtcbiAgICAgICAgbGV0IGZpbGVQYXRoID0gcGFydHMuc2xpY2UoMykuam9pbihcIi9cIik7XG4gICAgICAgIGlmICghYWNjb3VudCB8fCAhYnVja2V0TmFtZSB8fCAhZmlsZVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhCdWZmZXIuZnJvbShcIlwiKSwgeyBzdGF0dXM6IFwiNDA0XCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0VmFsaWROYW1lKGFjY291bnQsIFwiYWNjb3VudFwiKTtcbiAgICAgICAgYXNzZXJ0VmFsaWROYW1lKGJ1Y2tldE5hbWUsIFwiYnVja2V0IG5hbWVcIik7XG4gICAgICAgIGFzc2VydFZhbGlkUGF0aChmaWxlUGF0aCk7XG4gICAgICAgIGxldCBidWNrZXRTdG9yZXMgPSBhd2FpdCBnZXRCdWNrZXRTdG9yZXMoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIGlmICghYnVja2V0U3RvcmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHNldEhUVFBSZXN1bHRIZWFkZXJzKEJ1ZmZlci5mcm9tKFwiXCIpLCB7IHN0YXR1czogXCI0MDRcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFYWNoIHN0b3JlJ3MgcG9saWN5IGNvbWVzIGZyb20gaXRzIG93biBjb25maWcsIHdoaWNoIGl0IGhhcyBvbmx5IHJlYWQgb25jZSBpbml0IHJhblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChidWNrZXRTdG9yZXMubWFwKHggPT4geC5zdG9yZS5pbml0KCkpKTtcbiAgICAgICAgbGV0IHBvbGljaWVzID0gYnVja2V0U3RvcmVzLm1hcCh4ID0+ICh7IHN0b3JlOiB4LnN0b3JlLCBwb2xpY3k6IHguc3RvcmUuc3RvcmVDb25maWcuY3VycmVudCgpIH0pKTtcbiAgICAgICAgaWYgKCFwb2xpY2llcy5zb21lKHggPT4geC5wb2xpY3kucHVibGljKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IGlzIG5vdCBwdWJsaWMsIHNvIGl0cyBmaWxlcyBjYW5ub3QgYmUgcmVhZCBvdmVyIHBsYWluIFVSTHNgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbm9ueW1vdXMgVVJMIHJlYWRzIGNhcnJ5IG5vIHNvdXJjZSBzZWxlY3Rpb24gLSB0aGUgZmlsZSdzIHJvdXRlIHBpY2tzIHRoZSBzdG9yZSwgYW5kIGEgcm91dGUgbm8gc3RvcmUgaGVyZSBjb3ZlcnMgaXMgc2ltcGx5IG5vdCBmb3VuZCAodGhlIHJvdXRpbmcgZmlsZSBpdHNlbGYgbGl2ZXMgb3V0c2lkZSBldmVyeSBzdG9yZSlcbiAgICAgICAgbGV0IGh0dHBTdG9yZTogQmxvYlN0b3JlIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaW1tdXRhYmxlID0gZmFsc2U7XG4gICAgICAgIGxldCBpbmZvOiB7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGZpbGVQYXRoICE9PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGZpbGVQYXRoKTtcbiAgICAgICAgICAgIGxldCBzZXJ2aW5nID0gcG9saWNpZXMuZmluZCh4ID0+IHgucG9saWN5LnB1YmxpYyAmJiByb3V0ZUNvbnRhaW5zKHgucG9saWN5LnJvdXRlLCByb3V0ZSkpO1xuICAgICAgICAgICAgaHR0cFN0b3JlID0gc2VydmluZz8uc3RvcmU7XG4gICAgICAgICAgICBpbW11dGFibGUgPSAhIXNlcnZpbmc/LnBvbGljeS5pbW11dGFibGU7XG4gICAgICAgICAgICBpbmZvID0gaHR0cFN0b3JlICYmIGF3YWl0IGh0dHBTdG9yZS5nZXRJbmZvKHsgcGF0aDogZmlsZVBhdGggfSkgfHwgdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5mbyA9IGF3YWl0IGdldFJvdXRpbmdGaWxlUmVzdWx0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaW5mbyB8fCAhaW5mby5zaXplKSB7XG4gICAgICAgICAgICB0cmFja0FjY2Vzcyh7IGFjY291bnQsIG9wZXJhdGlvbjogXCJodHRwR2V0XCIsIHBhdGg6IGAke2J1Y2tldE5hbWV9LyR7ZmlsZVBhdGh9YCwgc2l6ZTogMCB9KTtcbiAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhCdWZmZXIuZnJvbShcIlwiKSwgeyBzdGF0dXM6IFwiNDA0XCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGV4dCA9IGZpbGVQYXRoLnNwbGl0KFwiLlwiKS5wb3AoKSB8fCBcIlwiO1xuICAgICAgICBsZXQgaGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IENPTlRFTlRfVFlQRVNbZXh0LnRvTG93ZXJDYXNlKCldIHx8IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIsXG4gICAgICAgICAgICBcIkxhc3QtTW9kaWZpZWRcIjogbmV3IERhdGUoaW5mby53cml0ZVRpbWUpLnRvVVRDU3RyaW5nKCksXG4gICAgICAgICAgICBcIkFjY2VwdC1SYW5nZXNcIjogXCJieXRlc1wiLFxuICAgICAgICB9O1xuICAgICAgICAvLyBUaGUgc2VydmluZyBzdG9yZSdzIG93biBwb2xpY3kgLSBhbmQgbmV2ZXIgZm9yIHRoZSByb3V0aW5nIGZpbGUsIHdoaWNoIGNoYW5naW5nIGlzIHRoZSB3aG9sZSBwb2ludCBvZlxuICAgICAgICBpZiAoaW1tdXRhYmxlKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiQ2FjaGUtQ29udHJvbFwiXSA9IGBtYXgtYWdlPSR7SU1NVVRBQkxFX0NBQ0hFX1RJTUUgLyAxMDAwfWA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlmTW9kaWZpZWRTaW5jZSA9IHJlcXVlc3Q/LmhlYWRlcnNbXCJpZi1tb2RpZmllZC1zaW5jZVwiXTtcbiAgICAgICAgaWYgKHR5cGVvZiBpZk1vZGlmaWVkU2luY2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBzaW5jZSA9IG5ldyBEYXRlKGlmTW9kaWZpZWRTaW5jZSkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgaWYgKHNpbmNlICYmIE1hdGguZmxvb3IoaW5mby53cml0ZVRpbWUgLyAxMDAwKSAqIDEwMDAgPD0gc2luY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMoQnVmZmVyLmZyb20oXCJcIiksIHsgLi4uaGVhZGVycywgc3RhdHVzOiBcIjMwNFwiIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgcmFuZ2VIZWFkZXIgPSByZXF1ZXN0Py5oZWFkZXJzW1wicmFuZ2VcIl07XG4gICAgICAgIGlmICh0eXBlb2YgcmFuZ2VIZWFkZXIgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IC9eYnl0ZXM9KFxcZCopLShcXGQqKSQvLmV4ZWMocmFuZ2VIZWFkZXIudHJpbSgpKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCAmJiAobWF0Y2hbMV0gfHwgbWF0Y2hbMl0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0OiBudW1iZXI7XG4gICAgICAgICAgICAgICAgbGV0IGVuZEluY2x1c2l2ZSA9IGluZm8uc2l6ZSAtIDE7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaFsxXSkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydCA9IE1hdGgubWF4KDAsIGluZm8uc2l6ZSAtICttYXRjaFsyXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSArbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kSW5jbHVzaXZlID0gTWF0aC5taW4oK21hdGNoWzJdLCBpbmZvLnNpemUgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gaW5mby5zaXplIHx8IHN0YXJ0ID4gZW5kSW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhCdWZmZXIuZnJvbShcIlwiKSwgeyAuLi5oZWFkZXJzLCBcIkNvbnRlbnQtUmFuZ2VcIjogYGJ5dGVzICovJHtpbmZvLnNpemV9YCwgc3RhdHVzOiBcIjQxNlwiIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByYW5nZSA9IHsgc3RhcnQsIGVuZDogZW5kSW5jbHVzaXZlICsgMSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQ6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChodHRwU3RvcmUpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGh0dHBTdG9yZS5nZXQyKHsgcGF0aDogZmlsZVBhdGgsIHJhbmdlIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgZ2V0Um91dGluZ0ZpbGVSZXN1bHQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmIHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0geyAuLi5yZXN1bHQsIGRhdGE6IHJlc3VsdC5kYXRhLnN1YmFycmF5KE1hdGgubWluKHJhbmdlLnN0YXJ0LCByZXN1bHQuZGF0YS5sZW5ndGgpLCBNYXRoLm1pbihyYW5nZS5lbmQsIHJlc3VsdC5kYXRhLmxlbmd0aCkpIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2tBY2Nlc3MoeyBhY2NvdW50LCBvcGVyYXRpb246IFwiaHR0cEdldFwiLCBwYXRoOiBgJHtidWNrZXROYW1lfS8ke2ZpbGVQYXRofWAsIHNpemU6IHJlc3VsdCAmJiByZXN1bHQuZGF0YS5sZW5ndGggfHwgMCB9KTtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhCdWZmZXIuZnJvbShcIlwiKSwgeyBzdGF0dXM6IFwiNDA0XCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMocmVzdWx0LmRhdGEsIHsgLi4uaGVhZGVycywgXCJDb250ZW50LVJhbmdlXCI6IGBieXRlcyAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZCAtIDF9LyR7aW5mby5zaXplfWAsIHN0YXR1czogXCIyMDZcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMocmVzdWx0LmRhdGEsIGhlYWRlcnMpO1xuICAgIH1cbn1cblxuLyoqIFRoZSBvbmUgcmVzb2x1dGlvbiBldmVyeSBkYXRhIGNhbGwgZG9lczogdGhlIGNsaWVudCdzIHNlbGVjdGVkIHNvdXJjZUNvbmZpZyBOQU1FUyBleGFjdGx5IG9uZSBzdG9yZSAoY3JlYXRlZCBvbiBmaXJzdCB1c2UpLCBhbmQgZm4gcnVucyBvbiBpdC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdpdGhTdG9yZTxUPihjb25maWc6IHsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmc7IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIH0sIGZuOiAoc3RvcmU6IEJsb2JTdG9yZSkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBhd2FpdCBmbihmaW5kQnVja2V0U3RvcmUoY29uZmlnLmFjY291bnQsIGNvbmZpZy5idWNrZXROYW1lLCBjb25maWcuc291cmNlQ29uZmlnKSk7XG59XG5cbmNvbnN0IGxhcmdlVXBsb2FkSW5mbyA9IG5ldyBNYXA8c3RyaW5nLCB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZm9yY2VTZXRJbW11dGFibGU/OiBib29sZWFuOyBub0NoZWNrcz86IGJvb2xlYW47IGludGVybmFsPzogYm9vbGVhbjsgc3RvcmVOYW1lOiBzdHJpbmcgfT4oKTtcblxuY29uc3QgYWNjb3VudEFjY2VzczogU29ja2V0RnVuY3Rpb25Ib29rID0gYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGxldCBjb25maWcgPSBjb250ZXh0LmNhbGwuYXJnc1swXSBhcyB7IGFjY291bnQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBhd2FpdCByZXF1aXJlQWNjZXNzKFN0cmluZyhjb25maWc/LmFjY291bnQpKTtcbiAgICBsZXQgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnQ7XG4gICAgaWYgKGR1cmF0aW9uID4gQUNDRVNTX0NIRUNLX1NMT1dfVElNRSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQWNjZXNzIGNoZWNrIGZvciAke2NvbnRleHQuY2FsbC5mdW5jdGlvbk5hbWV9IHRvb2sgJHtkdXJhdGlvbn1tc2ApO1xuICAgIH1cbn07XG5jb25zdCB1cGxvYWRBY2Nlc3M6IFNvY2tldEZ1bmN0aW9uSG9vayA9IGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgbGV0IGNvbmZpZyA9IGNvbnRleHQuY2FsbC5hcmdzWzBdIGFzIHsgdXBsb2FkSWQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaW5mbyA9IGxhcmdlVXBsb2FkSW5mby5nZXQoU3RyaW5nKGNvbmZpZz8udXBsb2FkSWQpKTtcbiAgICBpZiAoIWluZm8pIHJldHVybjtcbiAgICBhd2FpdCByZXF1aXJlQWNjZXNzKGluZm8uYWNjb3VudCk7XG59O1xuY29uc3QgYWRtaW5BY2Nlc3M6IFNvY2tldEZ1bmN0aW9uSG9vayA9IGFzeW5jICgpID0+IHtcbiAgICByZXF1aXJlQWRtaW4oKTtcbn07XG5cbmV4cG9ydCBjb25zdCBSZW1vdGVTdG9yYWdlQ29udHJvbGxlciA9IFNvY2tldEZ1bmN0aW9uLnJlZ2lzdGVyKFxuICAgIFJFTU9URV9TVE9SQUdFX0NMQVNTX0dVSUQsXG4gICAgbmV3IFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyQmFzZSgpLFxuICAgICgpID0+ICh7XG4gICAgICAgIHBpbmc6IHt9LFxuICAgICAgICBhdXRoZW50aWNhdGU6IHt9LFxuICAgICAgICByZXF1ZXN0QWNjZXNzOiB7fSxcbiAgICAgICAgZ2V0QWNjZXNzU3RhdGU6IHt9LFxuICAgICAgICBsaXN0UmVxdWVzdHNGb3JJUDogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGdyYW50QWNjZXNzOiB7fSxcbiAgICAgICAgYWRtaW5MaXN0UmVxdWVzdHM6IHsgaG9va3M6IFthZG1pbkFjY2Vzc10gfSxcbiAgICAgICAgYWRtaW5MaXN0QWN0aXZlQnVja2V0czogeyBob29rczogW2FkbWluQWNjZXNzXSB9LFxuICAgICAgICBhZG1pbkdyYW50QWNjZXNzOiB7IGhvb2tzOiBbYWRtaW5BY2Nlc3NdIH0sXG4gICAgICAgIGdldDI6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBzZXQ6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBkZWw6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBtb3ZlOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0SW5mbzogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGZpbmRJbmZvOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0Q2hhbmdlc0FmdGVyMjogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGdldEFyY2hpdmVzQ29uZmlnOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0SW5kZXhJbmZvOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgbGlzdEJ1Y2tldHM6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBnZXRBY3RpdmVCdWNrZXQ6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBhY3RpdmF0ZUJ1Y2tldDogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGNsZWFyV3JpdGVTdGF0czogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGdldEFjY2Vzc1N0YXRzOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0QWNjZXNzU3VtbWFyaWVzOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0U3luY1N0YXR1czogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIHN0YXJ0TGFyZ2VGaWxlOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgdXBsb2FkUGFydDogeyBob29rczogW3VwbG9hZEFjY2Vzc10gfSxcbiAgICAgICAgZmluaXNoTGFyZ2VGaWxlOiB7IGhvb2tzOiBbdXBsb2FkQWNjZXNzXSB9LFxuICAgICAgICBjYW5jZWxMYXJnZUZpbGU6IHsgaG9va3M6IFt1cGxvYWRBY2Nlc3NdIH0sXG4gICAgICAgIGh0dHBFbnRyeToge30sXG4gICAgfSksXG4gICAgKCkgPT4gKHtcbiAgICAgICAgbm9DbGllbnRIb29rczogdHJ1ZSxcbiAgICAgICAgbm9EZWZhdWx0SG9va3M6IHRydWUsXG4gICAgfSlcbik7XG4iXX0=
|
|
590
|
-
/* _JS_SOURCE_HASH = "
|
|
626
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZUNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdG9yYWdlQ29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxtRUFBZ0U7QUFFaEUsNkRBQTREO0FBQzVELHlFQUFrRztBQUNsRyxpRUFBbUU7QUFDbkUsaUZBQThFO0FBQzlFLG1EQUF3RDtBQUN4RCxrREFBa0k7QUFDbEksNENBQW1JO0FBQ25JLGlEQUF1RTtBQUN2RSw2REFLOEI7QUFDOUIsK0NBQTREO0FBQzVELGlEQUFvRztBQUVwRyw2Q0FBb0Q7QUFDcEQsdUVBQW9FO0FBQ3BFLCtDQUE4SjtBQUM5SiwrQ0FBcUY7QUFFckYsNkNBQWlGO0FBR3BFLFFBQUEseUJBQXlCLEdBQUcsa0NBQWtDLENBQUM7QUFDL0QsUUFBQSxvQkFBb0IsR0FBRyxzQkFBc0IsQ0FBQztBQUM5QyxRQUFBLHlCQUF5QixHQUFHLDJDQUEyQyxDQUFDO0FBQ3hFLFFBQUEscUJBQXFCLEdBQUcsdUNBQXVDLENBQUM7QUFFN0UsTUFBTSxnQkFBZ0IsR0FBRyxtQkFBWSxHQUFHLEVBQUUsQ0FBQztBQUMzQyxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUNsQyxNQUFNLFlBQVksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0FBaUMvQixNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztBQUUzQyx3WkFBd1o7QUFDeFosTUFBTSxhQUFhLEdBQThCO0lBQzdDLEdBQUcsRUFBRSx5QkFBeUIsRUFBRSxJQUFJLEVBQUUsaUNBQWlDO0lBQ3ZFLEdBQUcsRUFBRSwyQkFBMkIsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsV0FBVztJQUMzRyxJQUFJLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFlBQVk7SUFDeEQsR0FBRyxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxpQkFBaUI7Q0FDOUQsQ0FBQztBQUVGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztBQUMzQyxTQUFTLFdBQVc7SUFDaEIsSUFBSSxNQUFNLEdBQUcsK0JBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDL0MsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQUUsT0FBTztJQUN6QyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsK0JBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO1FBQ3pDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCxTQUFnQix1QkFBdUI7SUFDbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5Q0FBeUMsZ0JBQWdCLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ2hHLEtBQUssSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztRQUN2QyxLQUFLLGlEQUF1QixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN2RixDQUFDO0FBQ0wsQ0FBQztBQUxELDBEQUtDO0FBRUQsU0FBUyxrQkFBa0I7SUFDdkIsSUFBSSxNQUFNLEdBQUcsK0JBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN4QyxJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDYixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsaUNBQXlCLHdDQUF3QyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUMxRyxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDckIsQ0FBQztBQUNELFNBQVMsV0FBVztJQUNoQixPQUFPLElBQUEsdUJBQVcsRUFBQywrQkFBYyxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFDRCxTQUFTLE9BQU8sQ0FBQyxTQUFpQjtJQUM5QixPQUFPLFNBQVMsS0FBSyxJQUFBLHVCQUFlLEVBQUMsSUFBQSxxQ0FBc0IsR0FBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFDRCxTQUFTLFlBQVk7SUFDakIsSUFBSSxTQUFTLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztJQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLDZCQUFxQiwrRUFBK0UsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUN6SSxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDckIsQ0FBQztBQUNELEtBQUssVUFBVSxhQUFhLENBQUMsT0FBZTtJQUN4QyxJQUFBLDRCQUFlLEVBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3BDLElBQUksU0FBUyxHQUFHLGtCQUFrQixFQUFFLENBQUM7SUFDckMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDekMsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFBLHVCQUFRLEdBQUUsQ0FBQztJQUM3QixJQUFJLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLElBQUksU0FBUyxFQUFFLENBQUMsQ0FBQztJQUN6RCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDWCxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUEscUNBQXNCLEdBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsNkJBQXFCLFlBQVksU0FBUyw2QkFBNkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLE1BQU0sSUFBSSxJQUFJLElBQUksT0FBTywyQkFBMkIsQ0FBQyxDQUFDO0lBQzlMLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNyQixDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxTQUFpQjtJQUM1QyxJQUFJLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxHQUFHLElBQUEscUNBQXNCLEdBQUUsQ0FBQztJQUM1RCxPQUFPLE9BQU8sU0FBUyxLQUFLLGFBQWEsZ0JBQWdCLFNBQVMsR0FBRyxDQUFDO0FBQzFFLENBQUM7QUFFRCxNQUFNLDJCQUEyQjtJQUM3QixLQUFLLENBQUMsSUFBSTtRQUNOLFdBQVcsRUFBRSxDQUFDO1FBQ2QsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFnQjtRQUMvQixJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUEscUNBQXNCLEdBQUUsQ0FBQztRQUNoRCxJQUFJLE1BQU0sR0FBRywrQkFBYyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3hDLElBQUEsY0FBTSxFQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkQsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUMzQyxJQUFJLE9BQU8sS0FBSyw0QkFBb0IsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGNBQWMsSUFBSSxDQUFDLFNBQVMsQ0FBQyw0QkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxSCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2pELE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELElBQUksWUFBWSxJQUFJLENBQUMsR0FBRyxFQUFFLG1CQUFtQixnQkFBZ0IsS0FBSyxDQUFDLENBQUM7UUFDbEosQ0FBQztRQUNELElBQUksV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsSUFBSSxXQUFXLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxNQUFNLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckksQ0FBQztRQUNELElBQUksU0FBUyxHQUFHLElBQUEscUJBQWEsRUFBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxJQUFBLG1DQUEyQixFQUFDLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFBLDJCQUFtQixFQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM3RixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUEscUJBQWEsRUFBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUM3SCxDQUFDO1FBQ0QsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sUUFBUSxDQUFDLElBQUksR0FBRyxZQUFZLEVBQUUsQ0FBQztZQUNsQyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQzFDLElBQUksTUFBTSxLQUFLLFNBQVM7Z0JBQUUsTUFBTTtZQUNoQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFHSyxBQUFOLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBMkI7UUFDM0MsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUM3QixJQUFJLFNBQVMsR0FBRyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3JDLElBQUksRUFBRSxHQUFHLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksZUFBZSxHQUFHLE1BQU0sSUFBQSwwQkFBVyxHQUFFLENBQUM7UUFDMUMsSUFBSSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuRCxJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLElBQUksQ0FBQyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQztRQUN0RixJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDL0IsQ0FBQzthQUFNLENBQUM7WUFDSixRQUFRLEdBQUc7Z0JBQ1AsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2xELE9BQU87Z0JBQ1AsU0FBUztnQkFDVCxFQUFFO2dCQUNGLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO2FBQ25CLENBQUM7WUFDRixRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQyxNQUFNLEdBQUcsbUJBQW1CO1lBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQy9ELE1BQU0sZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7SUFDM0gsQ0FBQztJQUdLLEFBQU4sS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUEyQjtRQUM1QyxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQUksU0FBUyxHQUFHLGtCQUFrQixFQUFFLENBQUM7UUFDckMsSUFBSSxFQUFFLEdBQUcsV0FBVyxFQUFFLENBQUM7UUFDdkIsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFBLHVCQUFRLEdBQUUsQ0FBQztRQUM3QixJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ25GLElBQUksTUFBTSxHQUFnQixFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2IsSUFBSSxRQUFRLEdBQUcsTUFBTSxJQUFBLDBCQUFXLEdBQUUsQ0FBQztZQUNuQyxJQUFJLFVBQVUsR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLE9BQU8sSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1lBQzlHLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLGtCQUFrQixHQUFHLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1RSxDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQztRQUVELElBQUksZUFBZSxHQUFrQixFQUFFLENBQUM7UUFDeEMsS0FBSyxJQUFJLEdBQUcsSUFBSSxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUM7Z0JBQUUsU0FBUztZQUM3QyxJQUFJLE1BQU0sR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEMsSUFBSSxNQUFNO2dCQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELE1BQU0sQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO1FBQ3pDLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBdUM7UUFDM0QsSUFBSSxRQUFRLEdBQUcsTUFBTSxJQUFBLDBCQUFXLEdBQUUsQ0FBQztRQUNuQyxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUE2QjtRQUMzQyxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ2pDLElBQUksZUFBZSxHQUFHLGtCQUFrQixFQUFFLENBQUM7UUFDM0MsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFBLHVCQUFRLEdBQUUsQ0FBQztRQUM3QixJQUFJLFFBQVEsR0FBRyxNQUFNLElBQUEsMEJBQVcsR0FBRSxDQUFDO1FBQ25DLEtBQUssSUFBSSxFQUFFLElBQUksTUFBTSxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUN0QyxLQUFLLElBQUksT0FBTyxJQUFJLE1BQU0sUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxPQUFPLENBQUMsU0FBUyxLQUFLLFNBQVM7b0JBQUUsU0FBUztnQkFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUN6RixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsNkJBQXFCLFlBQVksZUFBZSw2QkFBNkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN2SSxDQUFDO2dCQUNELElBQUksTUFBTSxHQUFnQjtvQkFDdEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO29CQUN4QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7b0JBQzVCLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtvQkFDZCxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtpQkFDbkIsQ0FBQztnQkFDRixNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDbkUsT0FBTyxNQUFNLENBQUM7WUFDbEIsQ0FBQztRQUNMLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0lBQ2xJLENBQUM7SUFFRCw0T0FBNE87SUFDNU8sS0FBSyxDQUFDLHNCQUFzQjtRQUN4QixPQUFPLElBQUEsd0NBQW1CLEdBQUUsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQXNCO1FBQzFDLElBQUksUUFBUSxHQUFHLE1BQU0sSUFBQSwwQkFBVyxHQUFFLENBQUM7UUFDbkMsT0FBTyxNQUFNLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQTZCO1FBQ2hELElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDakMsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFBLHVCQUFRLEdBQUUsQ0FBQztRQUM3QixJQUFJLFFBQVEsR0FBRyxNQUFNLElBQUEsMEJBQVcsR0FBRSxDQUFDO1FBQ25DLEtBQUssSUFBSSxFQUFFLElBQUksTUFBTSxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUN0QyxLQUFLLElBQUksT0FBTyxJQUFJLE1BQU0sUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxPQUFPLENBQUMsU0FBUyxLQUFLLFNBQVM7b0JBQUUsU0FBUztnQkFDOUMsSUFBSSxNQUFNLEdBQWdCO29CQUN0QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87b0JBQ3hCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztvQkFDNUIsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFO29CQUNkLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO2lCQUNuQixDQUFDO2dCQUNGLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNuRSxPQUFPLE1BQU0sQ0FBQztZQUNsQixDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDbEksQ0FBQztJQUlLLEFBQU4sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUEyTTtRQUNsTixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssMkJBQVksRUFBRSxDQUFDO1lBQy9CLDJMQUEyTDtZQUMzTCxPQUFPLE1BQU0sSUFBQSxpQ0FBb0IsRUFBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsT0FBTyxNQUFNLElBQUEsdUNBQWtCLEVBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFDRCxPQUFPLE1BQU0sU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBR0ssQUFBTixLQUFLLENBQUMsR0FBRyxDQUFDLE1BQW1NO1FBQ3pNLElBQUEsa0NBQW1CLEdBQUUsQ0FBQztRQUN0QixJQUFJLE1BQU0sR0FBRyxRQUFRLEVBQUUsQ0FBQztRQUN4Qiw4RUFBOEU7UUFDOUUsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLDJCQUFZLEVBQUUsQ0FBQztZQUMvQiwySEFBMkg7WUFDM0gsT0FBTyxNQUFNLElBQUEsdUNBQWtCLEVBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvRyxDQUFDO1FBQ0QsTUFBTSxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRSxJQUFBLHlCQUFXLEVBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsSUFBSSxVQUFVLElBQUksS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUM1USxDQUFDO0lBR0ssQUFBTixLQUFLLENBQUMsR0FBRyxDQUFDLE1BQW9JO1FBQzFJLElBQUEsa0NBQW1CLEdBQUUsQ0FBQztRQUN0QixJQUFJLE1BQU0sR0FBRyxRQUFRLEVBQUUsQ0FBQztRQUN4QixNQUFNLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDcEQsSUFBQSx5QkFBVyxFQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDeE4sQ0FBQztJQUdLLEFBQU4sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUE2RztRQUNwSCxJQUFBLGtDQUFtQixHQUFFLENBQUM7UUFDdEIsSUFBSSxNQUFNLEdBQUcsUUFBUSxFQUFFLENBQUM7UUFDeEIsd0dBQXdHO1FBQ3hHLElBQUEsNEJBQWUsRUFBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakMsSUFBQSw0QkFBZSxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQixNQUFNLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDckQsSUFBQSx5QkFBVyxFQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDekwsQ0FBQztJQUdLLEFBQU4sS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFzSDtRQUNoSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssMkJBQVksRUFBRSxDQUFDO1lBQy9CLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBQSxpQ0FBb0IsRUFBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzRSxPQUFPLE1BQU0sSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksU0FBUyxDQUFDO1FBQ3JGLENBQUM7UUFDRCxPQUFPLE1BQU0sU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBR0ssQUFBTixLQUFLLENBQUMsUUFBUSxDQUFDLE1BQXdHO1FBQ25ILE9BQU8sTUFBTSxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFHSyxBQUFOLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFzSDtRQUN6SSxPQUFPLE1BQU0sU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFSyxBQUFOLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUErQztRQUNuRSxPQUFPLE1BQU0sSUFBQSw0Q0FBdUIsRUFBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUssQUFBTixLQUFLLENBQUMsV0FBVyxDQUFDLE1BQTJCO1FBQ3pDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUM7WUFDRCxPQUFPLE1BQU0sSUFBQSw0Q0FBdUIsRUFBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekQsQ0FBQztnQkFBUyxDQUFDO1lBQ1AscUlBQXFJO1lBQ3JJLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxNQUFNLENBQUMsT0FBTyxvQkFBb0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDekYsQ0FBQztJQUNMLENBQUM7SUFDRCw4TEFBOEw7SUFFeEwsQUFBTixLQUFLLENBQUMsZUFBZSxDQUFDLE1BQStDO1FBQ2pFLE9BQU8sTUFBTSxJQUFBLHlDQUFvQixFQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRCxzS0FBc0s7SUFFaEssQUFBTixLQUFLLENBQUMsY0FBYyxDQUFDLE1BQStDO1FBQ2hFLE9BQU8sTUFBTSxJQUFBLG1DQUFjLEVBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUNELDRIQUE0SDtJQUV0SCxBQUFOLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBMkI7UUFDN0MsSUFBQSxxQ0FBdUIsRUFBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxJQUFBLHlDQUEyQixFQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0lBQzNFLENBQUM7SUFDRCx1RkFBdUY7SUFFakYsQUFBTixLQUFLLENBQUMsY0FBYyxDQUFDLE1BQTJCO1FBQzVDLE9BQU8sSUFBQSw2QkFBZSxFQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsK09BQStPO0lBRXpPLEFBQU4sS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQXdGO1FBQzdHLE9BQU8sSUFBQSxpQ0FBbUIsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUssQUFBTixLQUFLLENBQUMsWUFBWSxDQUFDLE1BQStDO1FBQzlELE9BQU8sTUFBTSxJQUFBLDJDQUFzQixFQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFSyxBQUFOLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBK0M7UUFDL0QsT0FBTyxNQUFNLElBQUEscUNBQWdCLEVBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELG9KQUFvSjtJQUU5SSxBQUFOLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBMkI7UUFDMUMsT0FBTyxNQUFNLElBQUEsaUNBQW1CLEdBQUUsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsK0lBQStJO0lBRXpJLEFBQU4sS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUF5QztRQUN0RCxPQUFPLE1BQU0sSUFBQSxnQ0FBa0IsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUdLLEFBQU4sS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFxTDtRQUN0TSxJQUFBLGtDQUFtQixHQUFFLENBQUM7UUFDdEIsSUFBSSxLQUFLLEdBQUcsSUFBQSxvQ0FBZSxFQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEYsMktBQTJLO1FBQzNLLElBQUksS0FBSyxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEssSUFBSSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0MsbU5BQW1OO1FBQ25OLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNuSSxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFDRCwwTUFBME07SUFDMU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUEyRDtRQUN4RSxJQUFBLGtDQUFtQixHQUFFLENBQUM7UUFDdEIsSUFBSSxJQUFJLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN0RSxJQUFBLHlCQUFXLEVBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbkksTUFBTSxJQUFBLDZCQUFRLEVBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDcEssQ0FBQztJQUNELEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBNEI7UUFDOUMsSUFBQSxrQ0FBbUIsR0FBRSxDQUFDO1FBQ3RCLElBQUksSUFBSSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDdEUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEMsSUFBSSxNQUFNLEdBQUcsUUFBUSxFQUFFLENBQUM7UUFDeEIsSUFBSSxLQUFLLEdBQUcsSUFBQSw2QkFBUSxFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEUsTUFBTSxLQUFLLENBQUMsaUJBQWlCLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3RNLElBQUksT0FBTyxHQUFHLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2RCxJQUFBLHlCQUFXLEVBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3RNLENBQUM7SUFDRCx5RUFBeUU7SUFDekUsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUE0QjtRQUM5QyxJQUFJLElBQUksR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU87UUFDbEIsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEMsTUFBTSxJQUFBLDZCQUFRLEVBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUM3RyxDQUFDO0lBRUQsMFlBQTBZO0lBQzFZLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBd0Q7UUFDcEUsSUFBSSxNQUFNLEdBQUcsK0JBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN4QyxJQUFJLE9BQU8sR0FBRyxJQUFBLHVDQUFxQixHQUFFLENBQUM7UUFDdEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsR0FBRyxLQUFJLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUMxRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ2pDLElBQUksSUFBSSxHQUFHLE1BQU0sSUFBQSw4QkFBZ0IsRUFBQztnQkFDOUIsTUFBTTtnQkFDTixJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUscUNBQWlCLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUU7YUFDeEgsQ0FBVyxDQUFDO1lBQ2IsaUlBQWlJO1lBQ2pJLE9BQU8sSUFBQSxzQ0FBb0IsRUFBQyxJQUFJLEVBQUUsRUFBRSxjQUFjLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7UUFDRCxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sSUFBQSxzQ0FBb0IsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUNELElBQUEsNEJBQWUsRUFBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDcEMsSUFBQSw0QkFBZSxFQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUMzQyxJQUFBLDRCQUFlLEVBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUIsSUFBSSxZQUFZLEdBQUcsTUFBTSxJQUFBLG9DQUFlLEVBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdkIsT0FBTyxJQUFBLHNDQUFvQixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBQ0Qsc0ZBQXNGO1FBQ3RGLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekQsSUFBSSxRQUFRLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLE9BQU8sSUFBSSxVQUFVLDZEQUE2RCxDQUFDLENBQUM7UUFDbEgsQ0FBQztRQUNELDZMQUE2TDtRQUM3TCxJQUFJLFNBQWdDLENBQUM7UUFDckMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksSUFBcUQsQ0FBQztRQUMxRCxJQUFJLFFBQVEsS0FBSywyQkFBWSxFQUFFLENBQUM7WUFDNUIsSUFBSSxLQUFLLEdBQUcsSUFBQSx1QkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9CLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFBLDRCQUFhLEVBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMxRixTQUFTLEdBQUcsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEtBQUssQ0FBQztZQUMzQixTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUEsQ0FBQztZQUN4QyxJQUFJLEdBQUcsU0FBUyxJQUFJLE1BQU0sU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQztRQUNqRixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksR0FBRyxNQUFNLElBQUEsaUNBQW9CLEVBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3RCLElBQUEseUJBQVcsRUFBQyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxHQUFHLFVBQVUsSUFBSSxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMzRixPQUFPLElBQUEsc0NBQW9CLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFDRCxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMxQyxJQUFJLE9BQU8sR0FBaUM7WUFDeEMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSwwQkFBMEI7WUFDOUUsZUFBZSxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUU7WUFDdkQsZUFBZSxFQUFFLE9BQU87U0FDM0IsQ0FBQztRQUNGLHdHQUF3RztRQUN4RyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ1osT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLFdBQVcsZ0NBQW9CLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDeEUsQ0FBQztRQUNELElBQUksZUFBZSxHQUFHLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUM1RCxJQUFJLE9BQU8sZUFBZSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3RDLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hELElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQzdELE9BQU8sSUFBQSxzQ0FBb0IsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDaEYsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLEtBQWlELENBQUM7UUFDdEQsSUFBSSxXQUFXLEdBQUcsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QyxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLElBQUksS0FBSyxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMzRCxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLEtBQWEsQ0FBQztnQkFDbEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDWixLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxDQUFDO3FCQUFNLENBQUM7b0JBQ0osS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNsQixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUNYLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ3RELENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssR0FBRyxZQUFZLEVBQUUsQ0FBQztvQkFDN0MsT0FBTyxJQUFBLHNDQUFvQixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxlQUFlLEVBQUUsV0FBVyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ3pILENBQUM7Z0JBQ0QsS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0MsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLE1BQXFFLENBQUM7UUFDMUUsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDN0QsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLEdBQUcsTUFBTSxJQUFBLGlDQUFvQixFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN6RCxJQUFJLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxHQUFHLEVBQUUsR0FBRyxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzSSxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUEseUJBQVcsRUFBQyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxHQUFHLFVBQVUsSUFBSSxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0gsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1YsT0FBTyxJQUFBLHNDQUFvQixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBQ0QsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNSLE9BQU8sSUFBQSxzQ0FBb0IsRUFBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDbkosQ0FBQztRQUNELE9BQU8sSUFBQSxzQ0FBb0IsRUFBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RELENBQUM7Q0FDSjtBQXhYUztJQURMLDRCQUFlO2dFQXVCZjtBQUdLO0lBREwsNEJBQWU7aUVBeUJmO0FBNkRLO0lBRkwsNEJBQWU7SUFDZixJQUFBLDZCQUFlLEVBQUMsS0FBSyxDQUFDO3VEQVV0QjtBQUdLO0lBRkwsNEJBQWU7SUFDZixJQUFBLDZCQUFlLEVBQUMsS0FBSyxDQUFDO3NEQVl0QjtBQUdLO0lBRkwsNEJBQWU7SUFDZixJQUFBLDZCQUFlLEVBQUMsS0FBSyxDQUFDO3NEQU10QjtBQUdLO0lBRkwsNEJBQWU7SUFDZixJQUFBLDZCQUFlLEVBQUMsTUFBTSxDQUFDO3VEQVN2QjtBQUdLO0lBRkwsNEJBQWU7SUFDZixJQUFBLDZCQUFlLEVBQUMsU0FBUyxDQUFDOzBEQU8xQjtBQUdLO0lBRkwsNEJBQWU7SUFDZixJQUFBLDZCQUFlLEVBQUMsVUFBVSxDQUFDOzJEQUczQjtBQUdLO0lBRkwsNEJBQWU7SUFDZixJQUFBLDZCQUFlLEVBQUMsaUJBQWlCLENBQUM7bUVBR2xDO0FBRUs7SUFETCw0QkFBZTtvRUFHZjtBQUVLO0lBREwsNEJBQWU7OERBU2Y7QUFHSztJQURMLDRCQUFlO2tFQUdmO0FBR0s7SUFETCw0QkFBZTtpRUFHZjtBQUdLO0lBREwsNEJBQWU7a0VBSWY7QUFHSztJQURMLDRCQUFlO2lFQUdmO0FBR0s7SUFETCw0QkFBZTtxRUFHZjtBQUVLO0lBREwsNEJBQWU7K0RBR2Y7QUFFSztJQURMLDRCQUFlO2dFQUdmO0FBSUs7SUFETCw0QkFBZTsrREFHZjtBQUdLO0lBREwsNEJBQWU7NkRBR2Y7QUFHSztJQURMLDRCQUFlO2lFQVVmO0FBd0lMLHFKQUFxSjtBQUNySixLQUFLLFVBQVUsU0FBUyxDQUFJLE1BQTJFLEVBQUUsRUFBb0M7SUFDekksT0FBTyxNQUFNLEVBQUUsQ0FBQyxJQUFBLG9DQUFlLEVBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQzdGLENBQUM7QUFFRCw0S0FBNEs7QUFDNUssU0FBUyxRQUFROztJQUNiLElBQUksQ0FBQztRQUNELE9BQU8sTUFBQSwrQkFBYyxDQUFDLFNBQVMsRUFBRSwwQ0FBRSxNQUFNLENBQUM7SUFDOUMsQ0FBQztJQUFDLFdBQU0sQ0FBQztRQUNMLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQWdMLENBQUM7QUFFaE4sTUFBTSxhQUFhLEdBQXVCLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUN4RCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDdkIsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFxQyxDQUFDO0lBQ3RFLE1BQU0sYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUM3QyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLElBQUksUUFBUSxHQUFHLHNCQUFzQixFQUFFLENBQUM7UUFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLFNBQVMsUUFBUSxJQUFJLENBQUMsQ0FBQztJQUNwRixDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBQ0YsTUFBTSxZQUFZLEdBQXVCLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUN2RCxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQXNDLENBQUM7SUFDdkUsSUFBSSxJQUFJLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDekQsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPO0lBQ2xCLE1BQU0sYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN0QyxDQUFDLENBQUM7QUFDRixNQUFNLFdBQVcsR0FBdUIsS0FBSyxJQUFJLEVBQUU7SUFDL0MsWUFBWSxFQUFFLENBQUM7QUFDbkIsQ0FBQyxDQUFDO0FBRVcsUUFBQSx1QkFBdUIsR0FBRywrQkFBYyxDQUFDLFFBQVEsQ0FDMUQsaUNBQXlCLEVBQ3pCLElBQUksMkJBQTJCLEVBQUUsRUFDakMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNILElBQUksRUFBRSxFQUFFO0lBQ1IsWUFBWSxFQUFFLEVBQUU7SUFDaEIsYUFBYSxFQUFFLEVBQUU7SUFDakIsY0FBYyxFQUFFLEVBQUU7SUFDbEIsaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRTtJQUM3QyxXQUFXLEVBQUUsRUFBRTtJQUNmLGlCQUFpQixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUU7SUFDM0Msc0JBQXNCLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRTtJQUNoRCxnQkFBZ0IsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFO0lBQzFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQ2hDLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQy9CLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQy9CLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQ2hDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQ25DLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQ3BDLGdCQUFnQixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUU7SUFDNUMsaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRTtJQUM3QyxZQUFZLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRTtJQUN4QyxXQUFXLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRTtJQUN2QyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRTtJQUMzQyxjQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRTtJQUMxQyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRTtJQUMzQyxjQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRTtJQUMxQyxrQkFBa0IsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQzlDLGFBQWEsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQ3pDLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQ3hDLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQ3RDLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFO0lBQzFDLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFO0lBQ3JDLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFO0lBQzFDLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFO0lBQzFDLFNBQVMsRUFBRSxFQUFFO0NBQ2hCLENBQUMsRUFDRixHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ0gsYUFBYSxFQUFFLElBQUk7SUFDbkIsY0FBYyxFQUFFLElBQUk7Q0FDdkIsQ0FBQyxDQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTb2NrZXRGdW5jdGlvbiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vU29ja2V0RnVuY3Rpb25cIjtcbmltcG9ydCB7IFNvY2tldEZ1bmN0aW9uSG9vayB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vU29ja2V0RnVuY3Rpb25UeXBlc1wiO1xuaW1wb3J0IHsgZ2V0Tm9kZUlkSVAgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9ub2RlQ2FjaGVcIjtcbmltcG9ydCB7IHNldEhUVFBSZXN1bHRIZWFkZXJzLCBnZXRDdXJyZW50SFRUUFJlcXVlc3QgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWxsSFRUUEhhbmRsZXJcIjtcbmltcG9ydCB7IHBlcmZvcm1Mb2NhbENhbGwgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWxsTWFuYWdlclwiO1xuaW1wb3J0IHsgUmVxdWlyZUNvbnRyb2xsZXIgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3JlcXVpcmUvUmVxdWlyZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IHRpbWVJbk1pbnV0ZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGdldENvbW1vbk5hbWUsIGdldFB1YmxpY0lkZW50aWZpZXIsIGdldE93bk1hY2hpbmVJZCwgdmVyaWZ5LCB2ZXJpZnlNYWNoaW5lSWRGb3JQdWJsaWNLZXkgfSBmcm9tIFwiLi4vLi4vbWlzYy9odHRwcy9jZXJ0c1wiO1xuaW1wb3J0IHsgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc0NvbmZpZywgQXJjaGl2ZXNTeW5jU3RhdHVzLCBGaW5kQ29uZmlnLCBTb3VyY2VDb25maWcsIElNTVVUQUJMRV9DQUNIRV9USU1FIH0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgUk9VVElOR19GSUxFLCBnZXRSb3V0ZSwgcm91dGVDb250YWlucyB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHtcbiAgICBmaW5kQnVja2V0U3RvcmUsIGdldFN0b3JlLCBnZXRCdWNrZXRTdG9yZXMsIHJlYWRCdWNrZXRJbnRlcm5hbCwgd3JpdGVSb3V0aW5nQ29uZmlnLFxuICAgIGdldEJ1Y2tldEFyY2hpdmVzQ29uZmlnLCBidWNrZXRTeW5jU3RhdHVzLCBkZWJ1Z0J1Y2tldEluZGV4VG90YWxzLCBBY3RpdmVCdWNrZXRJbmZvLFxuICAgIGRlYnVnTGlzdEFjY291bnRCdWNrZXRzLCBTZXJ2ZXJCdWNrZXRJbmZvLFxuICAgIGRlYnVnR2V0QWN0aXZlQnVja2V0LCBhY3RpdmF0ZUJ1Y2tldCwgZ2V0QWN0aXZlQnVja2V0S2V5cyxcbn0gZnJvbSBcIi4vc3RvcmFnZVNlcnZlclN0YXRlXCI7XG5pbXBvcnQgeyBkZWJ1Z0NsZWFyQWNjb3VudFdyaXRlU3RhdHMgfSBmcm9tIFwiLi9hY2Nlc3NTdGF0c1wiO1xuaW1wb3J0IHsgZ2V0U3RvcmFnZVNlcnZlckNvbmZpZywgZ2V0VHJ1c3QsIGdldFJlcXVlc3RzLCBhc3NlcnRXcml0ZXNBbGxvd2VkIH0gZnJvbSBcIi4vc2VydmVyQ29uZmlnXCI7XG5pbXBvcnQgeyBCbG9iU3RvcmUgfSBmcm9tIFwiLi9ibG9iU3RvcmVcIjtcbmltcG9ydCB7IGdldFJvdXRpbmdGaWxlUmVzdWx0IH0gZnJvbSBcIi4vYnVja2V0RGlza1wiO1xuaW1wb3J0IHsgU3RvcmFnZUNsaWVudENvbnRyb2xsZXIgfSBmcm9tIFwiLi9zdG9yYWdlQ2xpZW50Q29udHJvbGxlclwiO1xuaW1wb3J0IHsgdHJhY2tBY2Nlc3MsIHRyYWNrQWNjZXNzQ2FsbCwgZ2V0QWNjZXNzVG90YWxzLCByZWFkQWNjZXNzU3VtbWFyaWVzLCBjbGVhckFjY291bnRBY2Nlc3NTdGF0cywgQWNjZXNzVG90YWxzLCBBY2Nlc3NTdW1tYXJ5U3RhdGUgfSBmcm9tIFwiLi9hY2Nlc3NTdGF0c1wiO1xuaW1wb3J0IHsgbG9nTXV0YXRpb24sIGxpc3RTdG9yYWdlTG9nRmlsZXMsIHJlYWRTdG9yYWdlTG9nRmlsZSB9IGZyb20gXCIuL3N0b3JhZ2VMb2dzXCI7XG5pbXBvcnQgeyBMb2dGaWxlSW5mbyB9IGZyb20gXCIuLi9TdHJlYW1pbmdMb2dzXCI7XG5pbXBvcnQgeyBhc3NlcnRWYWxpZE5hbWUsIGFzc2VydFZhbGlkUGF0aCwgYXNzZXJ0VmFsaWRBcmdzIH0gZnJvbSBcIi4vdmFsaWRhdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBTdW1tYXJ5RW50cnkgfSBmcm9tIFwiLi4vLi4vdHJlZVN1bW1hcnlcIjtcblxuZXhwb3J0IGNvbnN0IFJFTU9URV9TVE9SQUdFX0NMQVNTX0dVSUQgPSBcIlJlbW90ZVN0b3JhZ2VDb250cm9sbGVyLWI3ZTQyYTkxXCI7XG5leHBvcnQgY29uc3QgU1RPUkFHRV9BVVRIX1BVUlBPU0UgPSBcInJlbW90ZVN0b3JhZ2UtYXV0aC0xXCI7XG5leHBvcnQgY29uc3QgU1RPUkFHRV9OT1RfQVVUSEVOVElDQVRFRCA9IFwiUkVNT1RFX1NUT1JBR0VfTk9UX0FVVEhFTlRJQ0FURURfY2YyZjdiMWVcIjtcbmV4cG9ydCBjb25zdCBTVE9SQUdFX0FDQ0VTU19ERU5JRUQgPSBcIlJFTU9URV9TVE9SQUdFX0FDQ0VTU19ERU5JRURfOWQ4MWE0YzBcIjtcblxuY29uc3QgQVVUSF9USU1FX1dJTkRPVyA9IHRpbWVJbk1pbnV0ZSAqIDEwO1xuY29uc3QgQUNDRVNTX0NIRUNLX1NMT1dfVElNRSA9IDUwO1xuY29uc3QgTUFYX1NFU1NJT05TID0gMTAwICogMTAwMDtcbmNvbnN0IE1BWF9SRVFVRVNUU19QRVJfSVAgPSA1MDtcblxuZXhwb3J0IHR5cGUgQXV0aFRva2VuRGF0YSA9IHtcbiAgICBwdXJwb3NlOiBzdHJpbmc7XG4gICAgdGltZTogbnVtYmVyO1xuICAgIHNlcnZlcjogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIEF1dGhUb2tlbiA9IHtcbiAgICBjZXJ0UGVtOiBzdHJpbmc7XG4gICAgc2lnbmF0dXJlOiBzdHJpbmc7XG4gICAgZGF0YTogQXV0aFRva2VuRGF0YTtcbn07XG5leHBvcnQgdHlwZSBBY2Nlc3NSZXF1ZXN0ID0ge1xuICAgIHJlcXVlc3RJZDogc3RyaW5nO1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICBtYWNoaW5lSWQ6IHN0cmluZztcbiAgICBpcDogc3RyaW5nO1xuICAgIHRpbWU6IG51bWJlcjtcbn07XG5leHBvcnQgdHlwZSBUcnVzdFJlY29yZCA9IHtcbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgbWFjaGluZUlkOiBzdHJpbmc7XG4gICAgaXA6IHN0cmluZztcbiAgICB0aW1lOiBudW1iZXI7XG59O1xuZXhwb3J0IHR5cGUgQWNjZXNzU3RhdGUgPSB7XG4gICAgbWFjaGluZUlkOiBzdHJpbmc7XG4gICAgaXA6IHN0cmluZztcbiAgICBoYXNBY2Nlc3M6IGJvb2xlYW47XG4gICAgZ3JhbnRBY2Nlc3NDb21tYW5kPzogc3RyaW5nO1xuICAgIHRydXN0ZWRNYWNoaW5lcz86IFRydXN0UmVjb3JkW107XG59O1xuXG5jb25zdCBzZXNzaW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbi8vIFdlIG11c3QgbmV2ZXIgc2VydmUgYW55dGhpbmcgdGhhdCBjYW4gYmUgZXZhbHVhdGVkIGFzIGNvZGUgKGh0bWwsIGpzIC0gYW5kIHN2Zywgd2hpY2ggY2FuIGVtYmVkIDxzY3JpcHQ+IGFuZCBydW5zIGl0IHdoZW4gdmlzaXRlZCBhcyBhIGRvY3VtZW50KS4gT3RoZXJ3aXNlIGEgdXNlciBjb3VsZCBob3N0IGEgZmlsZSBhbmQsIGJ5IHZpc2l0aW5nIGl0LCBydW4gaXQgb24gb3VyIGRvbWFpbiAtIGdpdmluZyB0aGVtIGFjY2VzcyB0byBhbGwgb2Ygb3VyIGtleXMgYW5kIGNvb2tpZXMuIFBERiBzdGF5czogYnJvd3NlciBQREYgdmlld2VycyBydW4gYW55IGVtYmVkZGVkIFBERiBzY3JpcHRpbmcgaW4gYSBzYW5kYm94IHdpdGggbm8gYWNjZXNzIHRvIHRoZSBzZXJ2aW5nIG9yaWdpbidzIGNvb2tpZXMgb3IgRE9NLlxuY29uc3QgQ09OVEVOVF9UWVBFUzogeyBbZXh0OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICBjc3M6IFwidGV4dC9jc3M7IGNoYXJzZXQ9dXRmLThcIiwganNvbjogXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgdHh0OiBcInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIiwgcG5nOiBcImltYWdlL3BuZ1wiLCBqcGc6IFwiaW1hZ2UvanBlZ1wiLCBqcGVnOiBcImltYWdlL2pwZWdcIiwgZ2lmOiBcImltYWdlL2dpZlwiLFxuICAgIHdlYnA6IFwiaW1hZ2Uvd2VicFwiLCBtcDQ6IFwidmlkZW8vbXA0XCIsIHdlYm06IFwidmlkZW8vd2VibVwiLFxuICAgIG1wMzogXCJhdWRpby9tcGVnXCIsIHdhdjogXCJhdWRpby93YXZcIiwgcGRmOiBcImFwcGxpY2F0aW9uL3BkZlwiLFxufTtcblxuY29uc3QgY29ubmVjdGVkQ2xpZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuZnVuY3Rpb24gdHJhY2tDYWxsZXIoKTogdm9pZCB7XG4gICAgbGV0IG5vZGVJZCA9IFNvY2tldEZ1bmN0aW9uLmdldENhbGxlcigpLm5vZGVJZDtcbiAgICBpZiAoY29ubmVjdGVkQ2xpZW50cy5oYXMobm9kZUlkKSkgcmV0dXJuO1xuICAgIGNvbm5lY3RlZENsaWVudHMuYWRkKG5vZGVJZCk7XG4gICAgU29ja2V0RnVuY3Rpb24ub25OZXh0RGlzY29ubmVjdChub2RlSWQsICgpID0+IHtcbiAgICAgICAgY29ubmVjdGVkQ2xpZW50cy5kZWxldGUobm9kZUlkKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJyb2FkY2FzdFJvdXRpbmdDaGFuZ2VkKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKGBCcm9hZGNhc3Rpbmcgcm91dGluZyBjb25maWcgY2hhbmdlIHRvICR7Y29ubmVjdGVkQ2xpZW50cy5zaXplfSBjb25uZWN0ZWQgY2xpZW50c2ApO1xuICAgIGZvciAobGV0IG5vZGVJZCBvZiBbLi4uY29ubmVjdGVkQ2xpZW50c10pIHtcbiAgICAgICAgdm9pZCBTdG9yYWdlQ2xpZW50Q29udHJvbGxlci5ub2Rlc1tub2RlSWRdLnJvdXRpbmdDb25maWdDaGFuZ2VkKCkuY2F0Y2goKCkgPT4geyB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldENhbGxlck1hY2hpbmVJZCgpOiBzdHJpbmcge1xuICAgIGxldCBjYWxsZXIgPSBTb2NrZXRGdW5jdGlvbi5nZXRDYWxsZXIoKTtcbiAgICBsZXQgbWFjaGluZUlkID0gc2Vzc2lvbnMuZ2V0KGNhbGxlci5ub2RlSWQpO1xuICAgIGlmICghbWFjaGluZUlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX05PVF9BVVRIRU5USUNBVEVEfSBDYWxsIGF1dGhlbnRpY2F0ZSBmaXJzdCAoY29ubmVjdGlvbiAke2NhbGxlci5ub2RlSWR9KWApO1xuICAgIH1cbiAgICByZXR1cm4gbWFjaGluZUlkO1xufVxuZnVuY3Rpb24gZ2V0Q2FsbGVySVAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0Tm9kZUlkSVAoU29ja2V0RnVuY3Rpb24uZ2V0Q2FsbGVyKCkubm9kZUlkKTtcbn1cbmZ1bmN0aW9uIGlzQWRtaW4obWFjaGluZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbWFjaGluZUlkID09PSBnZXRPd25NYWNoaW5lSWQoZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpLnJvb3REb21haW4pO1xufVxuZnVuY3Rpb24gcmVxdWlyZUFkbWluKCk6IHN0cmluZyB7XG4gICAgbGV0IG1hY2hpbmVJZCA9IGdldENhbGxlck1hY2hpbmVJZCgpO1xuICAgIGlmICghaXNBZG1pbihtYWNoaW5lSWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX0FDQ0VTU19ERU5JRUR9IEFkbWluIGNvbW1hbmRzIG11c3QgYmUgcnVuIGZyb20gdGhlIHN0b3JhZ2UgbWFjaGluZSBpdHNlbGYgKGNhbGxlciBtYWNoaW5lICR7bWFjaGluZUlkfSlgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hY2hpbmVJZDtcbn1cbmFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVBY2Nlc3MoYWNjb3VudDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhc3NlcnRWYWxpZE5hbWUoYWNjb3VudCwgXCJhY2NvdW50XCIpO1xuICAgIGxldCBtYWNoaW5lSWQgPSBnZXRDYWxsZXJNYWNoaW5lSWQoKTtcbiAgICBpZiAoaXNBZG1pbihtYWNoaW5lSWQpKSByZXR1cm4gbWFjaGluZUlkO1xuICAgIGxldCB0cnVzdCA9IGF3YWl0IGdldFRydXN0KCk7XG4gICAgbGV0IHRydXN0ZWQgPSBhd2FpdCB0cnVzdC5nZXQoYCR7YWNjb3VudH18JHttYWNoaW5lSWR9YCk7XG4gICAgaWYgKCF0cnVzdGVkKSB7XG4gICAgICAgIGxldCB7IGRvbWFpbiwgcG9ydCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U1RPUkFHRV9BQ0NFU1NfREVOSUVEfSBNYWNoaW5lICR7bWFjaGluZUlkfSBoYXMgbm8gYWNjZXNzIHRvIGFjY291bnQgJHtKU09OLnN0cmluZ2lmeShhY2NvdW50KX0uIFZpc2l0IGh0dHBzOi8vJHtkb21haW59OiR7cG9ydH0vJHthY2NvdW50fSBmb3IgYWNjZXNzIGluc3RydWN0aW9ucy5gKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hY2hpbmVJZDtcbn1cblxuZnVuY3Rpb24gZ2V0R3JhbnRBY2Nlc3NDb21tYW5kKHJlcXVlc3RJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgeyBzc2hUYXJnZXQsIHNlcnZlckNvbW1hbmQgfSA9IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKTtcbiAgICByZXR1cm4gYHNzaCAke3NzaFRhcmdldH0gJyR7c2VydmVyQ29tbWFuZH0gLS1yZXF1ZXN0SWQgJHtyZXF1ZXN0SWR9J2A7XG59XG5cbmNsYXNzIFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyQmFzZSB7XG4gICAgYXN5bmMgcGluZygpOiBQcm9taXNlPHt9PiB7XG4gICAgICAgIHRyYWNrQ2FsbGVyKCk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBhc3luYyBhdXRoZW50aWNhdGUodG9rZW46IEF1dGhUb2tlbik6IFByb21pc2U8eyBtYWNoaW5lSWQ6IHN0cmluZzsgaXA6IHN0cmluZyB9PiB7XG4gICAgICAgIGxldCB7IGRvbWFpbiwgcG9ydCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgICAgICBsZXQgY2FsbGVyID0gU29ja2V0RnVuY3Rpb24uZ2V0Q2FsbGVyKCk7XG4gICAgICAgIHZlcmlmeSh0b2tlbi5jZXJ0UGVtLCB0b2tlbi5zaWduYXR1cmUsIHRva2VuLmRhdGEpO1xuICAgICAgICBsZXQgeyBwdXJwb3NlLCB0aW1lLCBzZXJ2ZXIgfSA9IHRva2VuLmRhdGE7XG4gICAgICAgIGlmIChwdXJwb3NlICE9PSBTVE9SQUdFX0FVVEhfUFVSUE9TRSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdXRoIHRva2VuIHB1cnBvc2UgaXMgJHtKU09OLnN0cmluZ2lmeShwdXJwb3NlKX0sIGV4cGVjdGVkICR7SlNPTi5zdHJpbmdpZnkoU1RPUkFHRV9BVVRIX1BVUlBPU0UpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChNYXRoLmFicyhEYXRlLm5vdygpIC0gdGltZSkgPiBBVVRIX1RJTUVfV0lORE9XKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF1dGggdG9rZW4gdGltZSBpcyB0b28gZmFyIGZyb20gdGhlIHNlcnZlciB0aW1lICh0b2tlbiAke3RpbWV9LCBzZXJ2ZXIgJHtEYXRlLm5vdygpfSwgYWxsb3dlZCBkcmlmdCAke0FVVEhfVElNRV9XSU5ET1d9bXMpYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRva2VuRG9tYWluID0gc2VydmVyLnNwbGl0KFwiOlwiKVswXTtcbiAgICAgICAgaWYgKHRva2VuRG9tYWluICE9PSBkb21haW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXV0aCB0b2tlbiBpcyBmb3Igc2VydmVyICR7SlNPTi5zdHJpbmdpZnkoc2VydmVyKX0sIGJ1dCB0aGlzIHNlcnZlciBpcyAke0pTT04uc3RyaW5naWZ5KGAke2RvbWFpbn06JHtwb3J0fWApfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYWNoaW5lSWQgPSBnZXRDb21tb25OYW1lKHRva2VuLmNlcnRQZW0pLnNwbGl0KFwiLlwiKVswXTtcbiAgICAgICAgaWYgKCF2ZXJpZnlNYWNoaW5lSWRGb3JQdWJsaWNLZXkoeyBtYWNoaW5lSWQsIHB1YmxpY0tleTogZ2V0UHVibGljSWRlbnRpZmllcih0b2tlbi5jZXJ0UGVtKSB9KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDZXJ0aWZpY2F0ZSBjb21tb24gbmFtZSAke0pTT04uc3RyaW5naWZ5KGdldENvbW1vbk5hbWUodG9rZW4uY2VydFBlbSkpfSBkb2VzIG5vdCBtYXRjaCBpdHMgcHVibGljIGtleWApO1xuICAgICAgICB9XG4gICAgICAgIHNlc3Npb25zLnNldChjYWxsZXIubm9kZUlkLCBtYWNoaW5lSWQpO1xuICAgICAgICB3aGlsZSAoc2Vzc2lvbnMuc2l6ZSA+IE1BWF9TRVNTSU9OUykge1xuICAgICAgICAgICAgbGV0IG9sZGVzdCA9IHNlc3Npb25zLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgICAgICBpZiAob2xkZXN0ID09PSB1bmRlZmluZWQpIGJyZWFrO1xuICAgICAgICAgICAgc2Vzc2lvbnMuZGVsZXRlKG9sZGVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbWFjaGluZUlkLCBpcDogZ2V0Q2FsbGVySVAoKSB9O1xuICAgIH1cblxuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBhc3luYyByZXF1ZXN0QWNjZXNzKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmcgfSk6IFByb21pc2U8eyBtYWNoaW5lSWQ6IHN0cmluZzsgaXA6IHN0cmluZzsgcmVxdWVzdElkOiBzdHJpbmc7IGdyYW50QWNjZXNzQ29tbWFuZDogc3RyaW5nIH0+IHtcbiAgICAgICAgbGV0IGFjY291bnQgPSBjb25maWcuYWNjb3VudDtcbiAgICAgICAgbGV0IG1hY2hpbmVJZCA9IGdldENhbGxlck1hY2hpbmVJZCgpO1xuICAgICAgICBsZXQgaXAgPSBnZXRDYWxsZXJJUCgpO1xuICAgICAgICBsZXQgcmVxdWVzdHNTdG9yYWdlID0gYXdhaXQgZ2V0UmVxdWVzdHMoKTtcbiAgICAgICAgbGV0IHJlcXVlc3RzID0gYXdhaXQgcmVxdWVzdHNTdG9yYWdlLmdldChpcCkgfHwgW107XG4gICAgICAgIGxldCBleGlzdGluZyA9IHJlcXVlc3RzLmZpbmQoeCA9PiB4LmFjY291bnQgPT09IGFjY291bnQgJiYgeC5tYWNoaW5lSWQgPT09IG1hY2hpbmVJZCk7XG4gICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgZXhpc3RpbmcudGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleGlzdGluZyA9IHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEwKSxcbiAgICAgICAgICAgICAgICBhY2NvdW50LFxuICAgICAgICAgICAgICAgIG1hY2hpbmVJZCxcbiAgICAgICAgICAgICAgICBpcCxcbiAgICAgICAgICAgICAgICB0aW1lOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcXVlc3RzLnB1c2goZXhpc3RpbmcpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChyZXF1ZXN0cy5sZW5ndGggPiBNQVhfUkVRVUVTVFNfUEVSX0lQKSByZXF1ZXN0cy5zaGlmdCgpO1xuICAgICAgICBhd2FpdCByZXF1ZXN0c1N0b3JhZ2Uuc2V0KGlwLCByZXF1ZXN0cyk7XG4gICAgICAgIHJldHVybiB7IG1hY2hpbmVJZCwgaXAsIHJlcXVlc3RJZDogZXhpc3RpbmcucmVxdWVzdElkLCBncmFudEFjY2Vzc0NvbW1hbmQ6IGdldEdyYW50QWNjZXNzQ29tbWFuZChleGlzdGluZy5yZXF1ZXN0SWQpIH07XG4gICAgfVxuXG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIGdldEFjY2Vzc1N0YXRlKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmcgfSk6IFByb21pc2U8QWNjZXNzU3RhdGU+IHtcbiAgICAgICAgbGV0IGFjY291bnQgPSBjb25maWcuYWNjb3VudDtcbiAgICAgICAgbGV0IG1hY2hpbmVJZCA9IGdldENhbGxlck1hY2hpbmVJZCgpO1xuICAgICAgICBsZXQgaXAgPSBnZXRDYWxsZXJJUCgpO1xuICAgICAgICBsZXQgdHJ1c3QgPSBhd2FpdCBnZXRUcnVzdCgpO1xuICAgICAgICBsZXQgaGFzQWNjZXNzID0gaXNBZG1pbihtYWNoaW5lSWQpIHx8ICEhYXdhaXQgdHJ1c3QuZ2V0KGAke2FjY291bnR9fCR7bWFjaGluZUlkfWApO1xuICAgICAgICBsZXQgcmVzdWx0OiBBY2Nlc3NTdGF0ZSA9IHsgbWFjaGluZUlkLCBpcCwgaGFzQWNjZXNzIH07XG4gICAgICAgIGlmICghaGFzQWNjZXNzKSB7XG4gICAgICAgICAgICBsZXQgcmVxdWVzdHMgPSBhd2FpdCBnZXRSZXF1ZXN0cygpO1xuICAgICAgICAgICAgbGV0IG93blJlcXVlc3QgPSAoYXdhaXQgcmVxdWVzdHMuZ2V0KGlwKSB8fCBbXSkuZmluZCh4ID0+IHguYWNjb3VudCA9PT0gYWNjb3VudCAmJiB4Lm1hY2hpbmVJZCA9PT0gbWFjaGluZUlkKTtcbiAgICAgICAgICAgIGlmIChvd25SZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmdyYW50QWNjZXNzQ29tbWFuZCA9IGdldEdyYW50QWNjZXNzQ29tbWFuZChvd25SZXF1ZXN0LnJlcXVlc3RJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRydXN0ZWRNYWNoaW5lczogVHJ1c3RSZWNvcmRbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBrZXkgb2YgYXdhaXQgdHJ1c3QuZ2V0S2V5cygpKSB7XG4gICAgICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKGAke2FjY291bnR9fGApKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCByZWNvcmQgPSBhd2FpdCB0cnVzdC5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChyZWNvcmQpIHRydXN0ZWRNYWNoaW5lcy5wdXNoKHJlY29yZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnRydXN0ZWRNYWNoaW5lcyA9IHRydXN0ZWRNYWNoaW5lcztcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBhc3luYyBsaXN0UmVxdWVzdHNGb3JJUChjb25maWc6IHsgYWNjb3VudDogc3RyaW5nOyBpcDogc3RyaW5nIH0pOiBQcm9taXNlPEFjY2Vzc1JlcXVlc3RbXT4ge1xuICAgICAgICBsZXQgcmVxdWVzdHMgPSBhd2FpdCBnZXRSZXF1ZXN0cygpO1xuICAgICAgICByZXR1cm4gKGF3YWl0IHJlcXVlc3RzLmdldChjb25maWcuaXApIHx8IFtdKS5maWx0ZXIoeCA9PiB4LmFjY291bnQgPT09IGNvbmZpZy5hY2NvdW50KTtcbiAgICB9XG5cbiAgICBhc3luYyBncmFudEFjY2Vzcyhjb25maWc6IHsgcmVxdWVzdElkOiBzdHJpbmcgfSk6IFByb21pc2U8VHJ1c3RSZWNvcmQ+IHtcbiAgICAgICAgbGV0IHJlcXVlc3RJZCA9IGNvbmZpZy5yZXF1ZXN0SWQ7XG4gICAgICAgIGxldCBjYWxsZXJNYWNoaW5lSWQgPSBnZXRDYWxsZXJNYWNoaW5lSWQoKTtcbiAgICAgICAgbGV0IHRydXN0ID0gYXdhaXQgZ2V0VHJ1c3QoKTtcbiAgICAgICAgbGV0IHJlcXVlc3RzID0gYXdhaXQgZ2V0UmVxdWVzdHMoKTtcbiAgICAgICAgZm9yIChsZXQgaXAgb2YgYXdhaXQgcmVxdWVzdHMuZ2V0S2V5cygpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByZXF1ZXN0IG9mIGF3YWl0IHJlcXVlc3RzLmdldChpcCkgfHwgW10pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0SWQgIT09IHJlcXVlc3RJZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0FkbWluKGNhbGxlck1hY2hpbmVJZCkgJiYgIWF3YWl0IHRydXN0LmdldChgJHtyZXF1ZXN0LmFjY291bnR9fCR7Y2FsbGVyTWFjaGluZUlkfWApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX0FDQ0VTU19ERU5JRUR9IE1hY2hpbmUgJHtjYWxsZXJNYWNoaW5lSWR9IGhhcyBubyBhY2Nlc3MgdG8gYWNjb3VudCAke0pTT04uc3RyaW5naWZ5KHJlcXVlc3QuYWNjb3VudCl9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByZWNvcmQ6IFRydXN0UmVjb3JkID0ge1xuICAgICAgICAgICAgICAgICAgICBhY2NvdW50OiByZXF1ZXN0LmFjY291bnQsXG4gICAgICAgICAgICAgICAgICAgIG1hY2hpbmVJZDogcmVxdWVzdC5tYWNoaW5lSWQsXG4gICAgICAgICAgICAgICAgICAgIGlwOiByZXF1ZXN0LmlwLFxuICAgICAgICAgICAgICAgICAgICB0aW1lOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYXdhaXQgdHJ1c3Quc2V0KGAke3JlcXVlc3QuYWNjb3VudH18JHtyZXF1ZXN0Lm1hY2hpbmVJZH1gLCByZWNvcmQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBhY2Nlc3MgcmVxdWVzdCBmb3VuZCB3aXRoIGlkICR7SlNPTi5zdHJpbmdpZnkocmVxdWVzdElkKX0uIEl0IG1heSBoYXZlIGFscmVhZHkgYmVlbiBncmFudGVkIG9yIGV4cGlyZWQuYCk7XG4gICAgfVxuXG4gICAgLyoqIEFkbWluIChzbyBvbmx5IHRoaXMgbWFjaGluZSdzIG93biBwcm9jZXNzZXMgY2FuIGNhbGwgaXQpOiB0aGUgYnVja2V0cyB0aGlzIHByb2Nlc3MgaGFzIGxvYWRlZC4gQSBkZXBsb3kgc3VjY2Vzc29yIGFza3MgaXRzIHByZWRlY2Vzc29yIGZvciB0aGlzLCBzbyBpdCBhY3RpdmF0ZXMgZXhhY3RseSB0aGUgYnVja2V0cyB0aGF0IGFyZSBpbiB1c2UgaW5zdGVhZCBvZiBldmVyeSBidWNrZXQgb24gZGlzay4gKi9cbiAgICBhc3luYyBhZG1pbkxpc3RBY3RpdmVCdWNrZXRzKCk6IFByb21pc2U8eyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9W10+IHtcbiAgICAgICAgcmV0dXJuIGdldEFjdGl2ZUJ1Y2tldEtleXMoKTtcbiAgICB9XG4gICAgYXN5bmMgYWRtaW5MaXN0UmVxdWVzdHMoY29uZmlnOiB7IGlwOiBzdHJpbmcgfSk6IFByb21pc2U8QWNjZXNzUmVxdWVzdFtdPiB7XG4gICAgICAgIGxldCByZXF1ZXN0cyA9IGF3YWl0IGdldFJlcXVlc3RzKCk7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXF1ZXN0cy5nZXQoY29uZmlnLmlwKSB8fCBbXTtcbiAgICB9XG4gICAgYXN5bmMgYWRtaW5HcmFudEFjY2Vzcyhjb25maWc6IHsgcmVxdWVzdElkOiBzdHJpbmcgfSk6IFByb21pc2U8VHJ1c3RSZWNvcmQ+IHtcbiAgICAgICAgbGV0IHJlcXVlc3RJZCA9IGNvbmZpZy5yZXF1ZXN0SWQ7XG4gICAgICAgIGxldCB0cnVzdCA9IGF3YWl0IGdldFRydXN0KCk7XG4gICAgICAgIGxldCByZXF1ZXN0cyA9IGF3YWl0IGdldFJlcXVlc3RzKCk7XG4gICAgICAgIGZvciAobGV0IGlwIG9mIGF3YWl0IHJlcXVlc3RzLmdldEtleXMoKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgcmVxdWVzdCBvZiBhd2FpdCByZXF1ZXN0cy5nZXQoaXApIHx8IFtdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QucmVxdWVzdElkICE9PSByZXF1ZXN0SWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByZWNvcmQ6IFRydXN0UmVjb3JkID0ge1xuICAgICAgICAgICAgICAgICAgICBhY2NvdW50OiByZXF1ZXN0LmFjY291bnQsXG4gICAgICAgICAgICAgICAgICAgIG1hY2hpbmVJZDogcmVxdWVzdC5tYWNoaW5lSWQsXG4gICAgICAgICAgICAgICAgICAgIGlwOiByZXF1ZXN0LmlwLFxuICAgICAgICAgICAgICAgICAgICB0aW1lOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYXdhaXQgdHJ1c3Quc2V0KGAke3JlcXVlc3QuYWNjb3VudH18JHtyZXF1ZXN0Lm1hY2hpbmVJZH1gLCByZWNvcmQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBhY2Nlc3MgcmVxdWVzdCBmb3VuZCB3aXRoIGlkICR7SlNPTi5zdHJpbmdpZnkocmVxdWVzdElkKX0uIEl0IG1heSBoYXZlIGFscmVhZHkgYmVlbiBncmFudGVkIG9yIGV4cGlyZWQuYCk7XG4gICAgfVxuXG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIEB0cmFja0FjY2Vzc0NhbGwoXCJnZXRcIilcbiAgICBhc3luYyBnZXQyKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZzsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH07IGludGVybmFsPzogYm9vbGVhbjsgaW5jbHVkZVRvbWJzdG9uZXM/OiBib29sZWFuOyBpbmNsdWRlTWFya2VkPzogYm9vbGVhbiB9KTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGlmIChjb25maWcucGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICAvLyBUaGUgcm91dGluZyBmaWxlIGxpdmVzIG91dHNpZGUgZXZlcnkgc3RvcmUgYW5kIGV2ZW4gb3V0c2lkZSB0aGUgYnVja2V0IChpdCBpcyB3aGF0IENSRUFURVMgaXQpLCBzbyBpdCBpcyByZWFkIHN0cmFpZ2h0IG9mZiB0aGUgZGlzayAtIGFic2VudCBtZWFucyB1bmRlZmluZWQsIGV4YWN0bHkgbGlrZSBhbnkgZmlsZSByZWFkXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZ2V0Um91dGluZ0ZpbGVSZXN1bHQoY29uZmlnLmFjY291bnQsIGNvbmZpZy5idWNrZXROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmludGVybmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVhZEJ1Y2tldEludGVybmFsKGNvbmZpZy5hY2NvdW50LCBjb25maWcuYnVja2V0TmFtZSwgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgd2l0aFN0b3JlKGNvbmZpZywgc3RvcmUgPT4gc3RvcmUuZ2V0Mihjb25maWcpKTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIEB0cmFja0FjY2Vzc0NhbGwoXCJzZXRcIilcbiAgICBhc3luYyBzZXQoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGRhdGE6IEJ1ZmZlcjsgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZm9yY2VTZXRJbW11dGFibGU/OiBib29sZWFuOyBpbnRlcm5hbD86IGJvb2xlYW47IHVuZGVsZXRlPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICAgICAgbGV0IGNhbGxlciA9IGNhbGxlcklkKCk7XG4gICAgICAgIC8vIENvcGllZCBiZWNhdXNlIHRoZSB3aXJlIGhhbmRzIHVzIGEgcGxhaW4gVWludDhBcnJheSB2aWV3LCBub3QgYSByZWFsIEJ1ZmZlclxuICAgICAgICBsZXQgZGF0YSA9IEJ1ZmZlci5mcm9tKGNvbmZpZy5kYXRhKTtcbiAgICAgICAgaWYgKGNvbmZpZy5wYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBzdG9yZSB0aGUgY2FsbGVyIHNlbGVjdGVkIG93bnMgdGhpcyBmaWxlOiBpdCBhcHBsaWVzIGl0LCBlbmZvcmNlcyB0aGUgdmVyc2lvbiBydWxlLCBhbmQgaXRzIHBlZXJzIHB1bGwgaXQgZnJvbSB0aGVyZVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHdyaXRlUm91dGluZ0NvbmZpZyhjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUsIGNvbmZpZy5zb3VyY2VDb25maWcubmFtZSwgZGF0YSwgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB3aXRoU3RvcmUoY29uZmlnLCBzdG9yZSA9PiBzdG9yZS5zZXQoeyAuLi5jb25maWcsIGRhdGEgfSkpO1xuICAgICAgICBsb2dNdXRhdGlvbih7IG9wOiBjb25maWcudW5kZWxldGUgJiYgXCJ1bmRlbGV0ZVwiIHx8IFwic2V0XCIsIGFjY291bnQ6IGNvbmZpZy5hY2NvdW50LCBidWNrZXROYW1lOiBjb25maWcuYnVja2V0TmFtZSwgc3RvcmU6IGNvbmZpZy5zb3VyY2VDb25maWcubmFtZSwgcGF0aDogY29uZmlnLnBhdGgsIHNpemU6IGRhdGEubGVuZ3RoLCB3cml0ZVRpbWU6IGNvbmZpZy5sYXN0TW9kaWZpZWQsIGNhbGxlcklkOiBjYWxsZXIsIGludGVybmFsOiBjb25maWcuaW50ZXJuYWwgfSk7XG4gICAgfVxuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBAdHJhY2tBY2Nlc3NDYWxsKFwiZGVsXCIpXG4gICAgYXN5bmMgZGVsKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZzsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBpbnRlcm5hbD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhc3NlcnRXcml0ZXNBbGxvd2VkKCk7XG4gICAgICAgIGxldCBjYWxsZXIgPSBjYWxsZXJJZCgpO1xuICAgICAgICBhd2FpdCB3aXRoU3RvcmUoY29uZmlnLCBzdG9yZSA9PiBzdG9yZS5kZWwoY29uZmlnKSk7XG4gICAgICAgIGxvZ011dGF0aW9uKHsgb3A6IFwiZGVsXCIsIGFjY291bnQ6IGNvbmZpZy5hY2NvdW50LCBidWNrZXROYW1lOiBjb25maWcuYnVja2V0TmFtZSwgc3RvcmU6IGNvbmZpZy5zb3VyY2VDb25maWcubmFtZSwgcGF0aDogY29uZmlnLnBhdGgsIHdyaXRlVGltZTogY29uZmlnLmxhc3RNb2RpZmllZCwgY2FsbGVySWQ6IGNhbGxlciwgaW50ZXJuYWw6IGNvbmZpZy5pbnRlcm5hbCB9KTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIEB0cmFja0FjY2Vzc0NhbGwoXCJtb3ZlXCIpXG4gICAgYXN5bmMgbW92ZShjb25maWc6IHsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmc7IGZyb21QYXRoOiBzdHJpbmc7IHRvUGF0aDogc3RyaW5nOyBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICAgICAgbGV0IGNhbGxlciA9IGNhbGxlcklkKCk7XG4gICAgICAgIC8vIGFzc2VydFZhbGlkQXJncyBvbmx5IGtub3dzIHRoZSB3ZWxsLWtub3duIGBwYXRoYCBmaWVsZCwgc28gdGhlIHR3byBwYXRocyBvZiBhIG1vdmUgYXJlIHZhbGlkYXRlZCBoZXJlXG4gICAgICAgIGFzc2VydFZhbGlkUGF0aChjb25maWcuZnJvbVBhdGgpO1xuICAgICAgICBhc3NlcnRWYWxpZFBhdGgoY29uZmlnLnRvUGF0aCk7XG4gICAgICAgIGF3YWl0IHdpdGhTdG9yZShjb25maWcsIHN0b3JlID0+IHN0b3JlLm1vdmUoY29uZmlnKSk7XG4gICAgICAgIGxvZ011dGF0aW9uKHsgb3A6IFwibW92ZVwiLCBhY2NvdW50OiBjb25maWcuYWNjb3VudCwgYnVja2V0TmFtZTogY29uZmlnLmJ1Y2tldE5hbWUsIHN0b3JlOiBjb25maWcuc291cmNlQ29uZmlnLm5hbWUsIHBhdGg6IGNvbmZpZy5mcm9tUGF0aCwgdG9QYXRoOiBjb25maWcudG9QYXRoLCBjYWxsZXJJZDogY2FsbGVyIH0pO1xuICAgIH1cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgQHRyYWNrQWNjZXNzQ2FsbChcImdldEluZm9cIilcbiAgICBhc3luYyBnZXRJbmZvKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZzsgaW5jbHVkZVRvbWJzdG9uZXM/OiBib29sZWFuIH0pOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGlmIChjb25maWcucGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgZ2V0Um91dGluZ0ZpbGVSZXN1bHQoY29uZmlnLmFjY291bnQsIGNvbmZpZy5idWNrZXROYW1lKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgJiYgeyB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5zaXplIH0gfHwgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoU3RvcmUoY29uZmlnLCBzdG9yZSA9PiBzdG9yZS5nZXRJbmZvKGNvbmZpZykpO1xuICAgIH1cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgQHRyYWNrQWNjZXNzQ2FsbChcImZpbmRJbmZvXCIpXG4gICAgYXN5bmMgZmluZEluZm8oY29uZmlnOiBGaW5kQ29uZmlnICYgeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgcHJlZml4OiBzdHJpbmc7IHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoU3RvcmUoY29uZmlnLCBzdG9yZSA9PiBzdG9yZS5maW5kSW5mbyhjb25maWcpKTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIEB0cmFja0FjY2Vzc0NhbGwoXCJnZXRDaGFuZ2VzQWZ0ZXJcIilcbiAgICBhc3luYyBnZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWc7IHRpbWU6IG51bWJlcjsgcm91dGVzPzogW251bWJlciwgbnVtYmVyXVtdIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoU3RvcmUoY29uZmlnLCBzdG9yZSA9PiBzdG9yZS5nZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZykpO1xuICAgIH1cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgZ2V0QXJjaGl2ZXNDb25maWcoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBnZXRCdWNrZXRBcmNoaXZlc0NvbmZpZyhjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgbGlzdEJ1Y2tldHMoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZyB9KTogUHJvbWlzZTxTZXJ2ZXJCdWNrZXRJbmZvW10+IHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBkZWJ1Z0xpc3RBY2NvdW50QnVja2V0cyhjb25maWcuYWNjb3VudCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAvLyBUaGUgYWNjZXNzIGhvb2sgKGFuZCB0aGUgc3RvcmFnZSBpdCBpbml0aWFsaXplcykgcnVucyBiZWZvcmUgdGhpcywgc28gYSBsYXJnZSBnYXAgYmV0d2VlbiB0aGlzIGFuZCB0aGUgY2FsbGVyJ3MgdGltaW5nIGlzIHRoZSBob29rXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgbGlzdEJ1Y2tldHMoJHtjb25maWcuYWNjb3VudH0pIGNhbGwgYm9keSB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIFRoZSBsaXZlLCBpbi1tZW1vcnkgc3RhdGUgb2Ygb25lIGJ1Y2tldCwgb3IgYSBzdHJpbmcgc2F5aW5nIHdoeSBpdCBpcyB1bmF2YWlsYWJsZS4gQW5zd2VyZWQgd2l0aG91dCB0b3VjaGluZyB0aGUgZGlzaywgc28gaXQgaXMgY2hlYXAgLSBidXQgb25seSB3b3JrcyB3aGlsZSB0aGUgYnVja2V0IGlzIGxvYWRlZCBoZXJlLiAqL1xuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBhc3luYyBnZXRBY3RpdmVCdWNrZXQoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFjdGl2ZUJ1Y2tldEluZm8gfCBzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGRlYnVnR2V0QWN0aXZlQnVja2V0KGNvbmZpZy5hY2NvdW50LCBjb25maWcuYnVja2V0TmFtZSk7XG4gICAgfVxuICAgIC8qKiBMb2FkcyBhIGJ1Y2tldCB0aGF0IGV4aXN0cyBvbiB0aGlzIHNlcnZlciBpbnRvIG1lbW9yeSAoc3RhcnRpbmcgaXRzIHN5bmNocm9uaXphdGlvbikgYW5kIHJldHVybnMgaXRzIGxpdmUgc3RhdGUsIG9yIGEgc3RyaW5nIHNheWluZyB3aHkgaXQgY291bGQgbm90IGJlIGxvYWRlZC4gKi9cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgYWN0aXZhdGVCdWNrZXQoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFjdGl2ZUJ1Y2tldEluZm8gfCBzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGFjdGl2YXRlQnVja2V0KGNvbmZpZy5hY2NvdW50LCBjb25maWcuYnVja2V0TmFtZSk7XG4gICAgfVxuICAgIC8qKiBaZXJvZXMgdGhlIHdyaXRlIHN0YXRpc3RpY3MgbGlzdEJ1Y2tldHMgcmVwb3J0cyBhbmQgdGhlIGluLW1lbW9yeSBhY2Nlc3Mgc3RhdGlzdGljcywgZm9yIGV2ZXJ5IGJ1Y2tldCBpbiB0aGUgYWNjb3VudC4gKi9cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgY2xlYXJXcml0ZVN0YXRzKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmcgfSk6IFByb21pc2U8eyBjbGVhcmVkQnVja2V0czogbnVtYmVyIH0+IHtcbiAgICAgICAgY2xlYXJBY2NvdW50QWNjZXNzU3RhdHMoY29uZmlnLmFjY291bnQpO1xuICAgICAgICByZXR1cm4geyBjbGVhcmVkQnVja2V0czogZGVidWdDbGVhckFjY291bnRXcml0ZVN0YXRzKGNvbmZpZy5hY2NvdW50KSB9O1xuICAgIH1cbiAgICAvKiogSW4tbWVtb3J5IHRvdGFscyBwZXIgb3BlcmF0aW9uIHR5cGUgc2luY2Ugc3RhcnR1cCAob3IgdGhlIGxhc3QgY2xlYXJXcml0ZVN0YXRzKS4gKi9cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgZ2V0QWNjZXNzU3RhdHMoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZyB9KTogUHJvbWlzZTxBY2Nlc3NUb3RhbHM+IHtcbiAgICAgICAgcmV0dXJuIGdldEFjY2Vzc1RvdGFscyhjb25maWcuYWNjb3VudCk7XG4gICAgfVxuICAgIC8qKiBBIHBhdGggYnJlYWtkb3duIG9mIG9uZSBvcGVyYXRpb24ncyBhY2Nlc3NlcyAob3BlcmF0aW9uIG5hbWVzIGNvbWUgZnJvbSBnZXRBY2Nlc3NTdGF0cykuIG1heENvdW50IGlzIHBhc3NlZCBzdHJhaWdodCB0byBUcmVlU3VtbWFyeS5nZXRTdW1tYXJpZXMuIHdlaWdodEJ5U2l6ZSBpcyBpZ25vcmVkIGZvciBjb3VudC1vbmx5IG9wZXJhdGlvbnMsIHdoaWNoIHJldHVybiB0aGVpciBjb3VudCBicmVha2Rvd24uICovXG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIGdldEFjY2Vzc1N1bW1hcmllcyhjb25maWc6IHsgYWNjb3VudDogc3RyaW5nOyBvcGVyYXRpb246IHN0cmluZzsgbWF4Q291bnQ6IG51bWJlcjsgd2VpZ2h0QnlTaXplPzogYm9vbGVhbiB9KTogUHJvbWlzZTxTdW1tYXJ5RW50cnk8QWNjZXNzU3VtbWFyeVN0YXRlPltdPiB7XG4gICAgICAgIHJldHVybiByZWFkQWNjZXNzU3VtbWFyaWVzKGNvbmZpZyk7XG4gICAgfVxuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBhc3luYyBnZXRJbmRleEluZm8oY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBzb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGRlYnVnQnVja2V0SW5kZXhUb3RhbHMoY29uZmlnLmFjY291bnQsIGNvbmZpZy5idWNrZXROYW1lKTtcbiAgICB9XG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIGdldFN5bmNTdGF0dXMoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH0pOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0U3luY1N0YXR1cyhjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgb3BlcmF0aW9uLWxvZyBmaWxlcyBUSElTIHNlcnZlciBob2xkcyAoZXZlcnkgc2VydmVyIGxvZ3MgaXRzIG93biBvcGVyYXRpb25zIC0gYXNrIGVhY2ggb25lOyBzZWUgbGlzdEFsbFNlcnZlckxvZ0ZpbGVzIGluIGNyZWF0ZUFyY2hpdmVzKS4gKi9cbiAgICBAYXNzZXJ0VmFsaWRBcmdzXG4gICAgYXN5bmMgbGlzdExvZ0ZpbGVzKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmcgfSk6IFByb21pc2U8TG9nRmlsZUluZm9bXT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgbGlzdFN0b3JhZ2VMb2dGaWxlcygpO1xuICAgIH1cbiAgICAvKiogT25lIGxvZyBmaWxlJ3MgYnl0ZXMsIGFsd2F5cyBMWjQtY29tcHJlc3NlZCAoYSBsaXZlIGZpbGUgaXMgZmx1c2hlZCBhbmQgY29tcHJlc3NlZCBpbiBtZW1vcnkgYmVmb3JlIHNlbmRpbmcpLiBEZWNvZGUgd2l0aCBkZWNvZGVMb2dGaWxlLiAqL1xuICAgIEBhc3NlcnRWYWxpZEFyZ3NcbiAgICBhc3luYyBnZXRMb2dGaWxlKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9KTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlYWRTdG9yYWdlTG9nRmlsZShjb25maWcubmFtZSk7XG4gICAgfVxuXG4gICAgQGFzc2VydFZhbGlkQXJnc1xuICAgIGFzeW5jIHN0YXJ0TGFyZ2VGaWxlKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZzsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBmb3JjZVNldEltbXV0YWJsZT86IGJvb2xlYW47IG5vQ2hlY2tzPzogYm9vbGVhbjsgaW50ZXJuYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBhc3NlcnRXcml0ZXNBbGxvd2VkKCk7XG4gICAgICAgIGxldCBzdG9yZSA9IGZpbmRCdWNrZXRTdG9yZShjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUsIGNvbmZpZy5zb3VyY2VDb25maWcpO1xuICAgICAgICAvLyBUaGUgc3RvcmUgdmFsaWRhdGVzIHRoZSB3cml0ZSBoZXJlLCBiZWZvcmUgYW55IGJ5dGVzIG1vdmUgKHNlZSBCbG9iU3RvcmUuc3RhcnRMYXJnZVVwbG9hZCkgLSBhIGxhcmdlIGZpbGUgaXMgYSBzZXQsIGFuZCBpdHMgU2V0Q29uZmlnIGRlY2lkZXMgd2hldGhlciBpdCBpcyBldmVuIGFsbG93ZWRcbiAgICAgICAgbGV0IHdyaXRlID0geyBwYXRoOiBjb25maWcucGF0aCwgbGFzdE1vZGlmaWVkOiBjb25maWcubGFzdE1vZGlmaWVkLCBmb3JjZVNldEltbXV0YWJsZTogY29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlLCBub0NoZWNrczogY29uZmlnLm5vQ2hlY2tzLCBpbnRlcm5hbDogY29uZmlnLmludGVybmFsIH07XG4gICAgICAgIGxldCBpZCA9IGF3YWl0IHN0b3JlLnN0YXJ0TGFyZ2VVcGxvYWQod3JpdGUpO1xuICAgICAgICAvLyBUaGUgc3RvcmUgbmFtZSBwaW5zIHRoZSB1cGxvYWQncyBwYXJ0cyBhbmQgZmluaXNoIHRvIHRoZSBzYW1lIHN0b3JlIHRoZSBzdGFydCBwaWNrZWQgKGluLWZsaWdodCB1cGxvYWRzIHN1cnZpdmUgYSBidWNrZXQgcmVidWlsZDogdGhlIHBhcnQgZGF0YSBsaXZlcyBpbiB0aGF0IHN0b3JlJ3MgZm9sZGVyLCB3aGljaCBhIHJlYnVpbHQgc3RvcmUgc3RpbGwgb3BlbnMpXG4gICAgICAgIGxhcmdlVXBsb2FkSW5mby5zZXQoaWQsIHsgLi4ud3JpdGUsIGFjY291bnQ6IGNvbmZpZy5hY2NvdW50LCBidWNrZXROYW1lOiBjb25maWcuYnVja2V0TmFtZSwgc3RvcmVOYW1lOiBjb25maWcuc291cmNlQ29uZmlnLm5hbWUgfSk7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gICAgLyoqIG9mZnNldCBtYWtlcyB0aGUgcGFydCB3cml0ZSBwb3NpdGlvbmFsIChzZWUgQXJjaGl2ZXNEaXNrLmFwcGVuZExhcmdlVXBsb2FkKSwgd2hpY2ggaXMgd2hhdCBsZXRzIHRoZSBjbGllbnQgUkVUUlkgYSBmYWlsZWQgcGFydCAtIGEgcmUtc2VudCBwYXJ0IGxhbmRzIG9uIHRoZSBzYW1lIGJ5dGVzIGluc3RlYWQgb2YgYXBwZW5kaW5nIHR3aWNlLiAqL1xuICAgIGFzeW5jIHVwbG9hZFBhcnQoY29uZmlnOiB7IHVwbG9hZElkOiBzdHJpbmc7IGRhdGE6IEJ1ZmZlcjsgb2Zmc2V0PzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICBsZXQgaW5mbyA9IGxhcmdlVXBsb2FkSW5mby5nZXQoY29uZmlnLnVwbG9hZElkKTtcbiAgICAgICAgaWYgKCFpbmZvKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbGFyZ2UgdXBsb2FkICR7Y29uZmlnLnVwbG9hZElkfWApO1xuICAgICAgICB0cmFja0FjY2Vzcyh7IGFjY291bnQ6IGluZm8uYWNjb3VudCwgb3BlcmF0aW9uOiBcInVwbG9hZFBhcnRcIiwgcGF0aDogYCR7aW5mby5idWNrZXROYW1lfS8ke2luZm8ucGF0aH1gLCBzaXplOiBjb25maWcuZGF0YS5sZW5ndGggfSk7XG4gICAgICAgIGF3YWl0IGdldFN0b3JlKGluZm8uYWNjb3VudCwgaW5mby5idWNrZXROYW1lLCBpbmZvLnN0b3JlTmFtZSkuYXBwZW5kTGFyZ2VVcGxvYWQoeyBpZDogY29uZmlnLnVwbG9hZElkLCBkYXRhOiBCdWZmZXIuZnJvbShjb25maWcuZGF0YSksIG9mZnNldDogY29uZmlnLm9mZnNldCB9KTtcbiAgICB9XG4gICAgYXN5bmMgZmluaXNoTGFyZ2VGaWxlKGNvbmZpZzogeyB1cGxvYWRJZDogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICBsZXQgaW5mbyA9IGxhcmdlVXBsb2FkSW5mby5nZXQoY29uZmlnLnVwbG9hZElkKTtcbiAgICAgICAgaWYgKCFpbmZvKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbGFyZ2UgdXBsb2FkICR7Y29uZmlnLnVwbG9hZElkfWApO1xuICAgICAgICBsYXJnZVVwbG9hZEluZm8uZGVsZXRlKGNvbmZpZy51cGxvYWRJZCk7XG4gICAgICAgIGxldCBjYWxsZXIgPSBjYWxsZXJJZCgpO1xuICAgICAgICBsZXQgc3RvcmUgPSBnZXRTdG9yZShpbmZvLmFjY291bnQsIGluZm8uYnVja2V0TmFtZSwgaW5mby5zdG9yZU5hbWUpO1xuICAgICAgICBhd2FpdCBzdG9yZS5maW5pc2hMYXJnZVVwbG9hZCh7IGlkOiBjb25maWcudXBsb2FkSWQsIHBhdGg6IGluZm8ucGF0aCwgbGFzdE1vZGlmaWVkOiBpbmZvLmxhc3RNb2RpZmllZCwgZm9yY2VTZXRJbW11dGFibGU6IGluZm8uZm9yY2VTZXRJbW11dGFibGUsIG5vQ2hlY2tzOiBpbmZvLm5vQ2hlY2tzLCBpbnRlcm5hbDogaW5mby5pbnRlcm5hbCB9KTtcbiAgICAgICAgbGV0IHdyaXR0ZW4gPSBhd2FpdCBzdG9yZS5nZXRJbmZvKHsgcGF0aDogaW5mby5wYXRoIH0pO1xuICAgICAgICBsb2dNdXRhdGlvbih7IG9wOiBcInNldExhcmdlXCIsIGFjY291bnQ6IGluZm8uYWNjb3VudCwgYnVja2V0TmFtZTogaW5mby5idWNrZXROYW1lLCBzdG9yZTogaW5mby5zdG9yZU5hbWUsIHBhdGg6IGluZm8ucGF0aCwgc2l6ZTogd3JpdHRlbj8uc2l6ZSwgd3JpdGVUaW1lOiB3cml0dGVuPy53cml0ZVRpbWUsIGNhbGxlcklkOiBjYWxsZXIgfSk7XG4gICAgfVxuICAgIC8qKiBCZXN0LWVmZm9ydCBjbGVhbnVwOiBhbiB1bmtub3duIHVwbG9hZCBoYXMgbm90aGluZyBsZWZ0IHRvIGNhbmNlbC4gKi9cbiAgICBhc3luYyBjYW5jZWxMYXJnZUZpbGUoY29uZmlnOiB7IHVwbG9hZElkOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgaW5mbyA9IGxhcmdlVXBsb2FkSW5mby5nZXQoY29uZmlnLnVwbG9hZElkKTtcbiAgICAgICAgaWYgKCFpbmZvKSByZXR1cm47XG4gICAgICAgIGxhcmdlVXBsb2FkSW5mby5kZWxldGUoY29uZmlnLnVwbG9hZElkKTtcbiAgICAgICAgYXdhaXQgZ2V0U3RvcmUoaW5mby5hY2NvdW50LCBpbmZvLmJ1Y2tldE5hbWUsIGluZm8uc3RvcmVOYW1lKS5jYW5jZWxMYXJnZVVwbG9hZCh7IGlkOiBjb25maWcudXBsb2FkSWQgfSk7XG4gICAgfVxuXG4gICAgLy8gSU1QT1JUQU5UOiBXZSBjYW4gbmV2ZXIgZXhwb3NlIGVudW1lcmF0aW9uIChsaXN0aW5nLCBwcmVmaXggc2VhcmNoLCBjaGFuZ2VzIGZlZWRzKSBvdmVyIHRoaXMgcHVibGljIEhUVFAgZW5kcG9pbnQgLSBvbmx5IGV4YWN0LWtleSByZWFkcy4gRW51bWVyYXRpb24gd291bGQgYmUgYSBtYXNzaXZlIHNlY3VyaXR5IHJpc2sgKHB1YmxpYyBidWNrZXRzIHJlbHkgb24gdW5ndWVzc2FibGUga2V5cyBzdGF5aW5nIHVuZ3Vlc3NhYmxlKSwgYW5kIGNvdWxkIGFsc28gY3Jhc2ggdGhlIGNsaWVudCBieSBzZW5kaW5nIHRoZW0gdG9vIG11Y2ggZGF0YS4gTGlzdGluZ3MgZXhpc3Qgb25seSBvbiB0aGUgYXV0aGVudGljYXRlZCBBUEkgKGZpbmRJbmZvIGV0YywgYmVoaW5kIGFjY291bnRBY2Nlc3MpLlxuICAgIGFzeW5jIGh0dHBFbnRyeShjb25maWc/OiB7IHJlcXVpcmVDYWxscz86IHN0cmluZ1tdOyBjYWNoZVRpbWU/OiBudW1iZXIgfSk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgICAgIGxldCBjYWxsZXIgPSBTb2NrZXRGdW5jdGlvbi5nZXRDYWxsZXIoKTtcbiAgICAgICAgbGV0IHJlcXVlc3QgPSBnZXRDdXJyZW50SFRUUFJlcXVlc3QoKTtcbiAgICAgICAgbGV0IHBhdGhuYW1lID0gbmV3IFVSTChyZXF1ZXN0Py51cmwgfHwgXCIvXCIsIFwiaHR0cHM6Ly9sb2NhbGhvc3RcIikucGF0aG5hbWU7XG4gICAgICAgIGlmICghcGF0aG5hbWUuc3RhcnRzV2l0aChcIi9maWxlL1wiKSkge1xuICAgICAgICAgICAgbGV0IGh0bWwgPSBhd2FpdCBwZXJmb3JtTG9jYWxDYWxsKHtcbiAgICAgICAgICAgICAgICBjYWxsZXIsXG4gICAgICAgICAgICAgICAgY2FsbDogeyBub2RlSWQ6IGNhbGxlci5ub2RlSWQsIGNsYXNzR3VpZDogUmVxdWlyZUNvbnRyb2xsZXIuX2NsYXNzR3VpZCwgZnVuY3Rpb25OYW1lOiBcInJlcXVpcmVIVE1MXCIsIGFyZ3M6IFtjb25maWddIH0sXG4gICAgICAgICAgICB9KSBhcyBCdWZmZXI7XG4gICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMgdGhlIGFjY2VzcyBwYWdlIGlzIHNlcnZlZCB3aXRoIG5vIGNvbnRlbnQgdHlwZSwgYW5kIGEgYnJvd3NlciB0aGF0IGlzIHRvbGQgbm90IHRvIHNuaWZmIHNpbXBseSB3aWxsIG5vdCByZW5kZXIgaXRcbiAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhodG1sLCB7IFwiQ29udGVudC1UeXBlXCI6IFwidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04XCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhcnRzID0gcGF0aG5hbWUuc3BsaXQoXCIvXCIpLmZpbHRlcih4ID0+IHgpLm1hcChkZWNvZGVVUklDb21wb25lbnQpO1xuICAgICAgICBsZXQgYWNjb3VudCA9IHBhcnRzWzFdO1xuICAgICAgICBsZXQgYnVja2V0TmFtZSA9IHBhcnRzWzJdO1xuICAgICAgICBsZXQgZmlsZVBhdGggPSBwYXJ0cy5zbGljZSgzKS5qb2luKFwiL1wiKTtcbiAgICAgICAgaWYgKCFhY2NvdW50IHx8ICFidWNrZXROYW1lIHx8ICFmaWxlUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHNldEhUVFBSZXN1bHRIZWFkZXJzKEJ1ZmZlci5mcm9tKFwiXCIpLCB7IHN0YXR1czogXCI0MDRcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRWYWxpZE5hbWUoYWNjb3VudCwgXCJhY2NvdW50XCIpO1xuICAgICAgICBhc3NlcnRWYWxpZE5hbWUoYnVja2V0TmFtZSwgXCJidWNrZXQgbmFtZVwiKTtcbiAgICAgICAgYXNzZXJ0VmFsaWRQYXRoKGZpbGVQYXRoKTtcbiAgICAgICAgbGV0IGJ1Y2tldFN0b3JlcyA9IGF3YWl0IGdldEJ1Y2tldFN0b3JlcyhhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgaWYgKCFidWNrZXRTdG9yZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMoQnVmZmVyLmZyb20oXCJcIiksIHsgc3RhdHVzOiBcIjQwNFwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVhY2ggc3RvcmUncyBwb2xpY3kgY29tZXMgZnJvbSBpdHMgb3duIGNvbmZpZywgd2hpY2ggaXQgaGFzIG9ubHkgcmVhZCBvbmNlIGluaXQgcmFuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGJ1Y2tldFN0b3Jlcy5tYXAoeCA9PiB4LnN0b3JlLmluaXQoKSkpO1xuICAgICAgICBsZXQgcG9saWNpZXMgPSBidWNrZXRTdG9yZXMubWFwKHggPT4gKHsgc3RvcmU6IHguc3RvcmUsIHBvbGljeTogeC5zdG9yZS5zdG9yZUNvbmZpZy5jdXJyZW50KCkgfSkpO1xuICAgICAgICBpZiAoIXBvbGljaWVzLnNvbWUoeCA9PiB4LnBvbGljeS5wdWJsaWMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0gaXMgbm90IHB1YmxpYywgc28gaXRzIGZpbGVzIGNhbm5vdCBiZSByZWFkIG92ZXIgcGxhaW4gVVJMc2ApO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFub255bW91cyBVUkwgcmVhZHMgY2Fycnkgbm8gc291cmNlIHNlbGVjdGlvbiAtIHRoZSBmaWxlJ3Mgcm91dGUgcGlja3MgdGhlIHN0b3JlLCBhbmQgYSByb3V0ZSBubyBzdG9yZSBoZXJlIGNvdmVycyBpcyBzaW1wbHkgbm90IGZvdW5kICh0aGUgcm91dGluZyBmaWxlIGl0c2VsZiBsaXZlcyBvdXRzaWRlIGV2ZXJ5IHN0b3JlKVxuICAgICAgICBsZXQgaHR0cFN0b3JlOiBCbG9iU3RvcmUgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBpbW11dGFibGUgPSBmYWxzZTtcbiAgICAgICAgbGV0IGluZm86IHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZmlsZVBhdGggIT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgbGV0IHJvdXRlID0gZ2V0Um91dGUoZmlsZVBhdGgpO1xuICAgICAgICAgICAgbGV0IHNlcnZpbmcgPSBwb2xpY2llcy5maW5kKHggPT4geC5wb2xpY3kucHVibGljICYmIHJvdXRlQ29udGFpbnMoeC5wb2xpY3kucm91dGUsIHJvdXRlKSk7XG4gICAgICAgICAgICBodHRwU3RvcmUgPSBzZXJ2aW5nPy5zdG9yZTtcbiAgICAgICAgICAgIGltbXV0YWJsZSA9ICEhc2VydmluZz8ucG9saWN5LmltbXV0YWJsZTtcbiAgICAgICAgICAgIGluZm8gPSBodHRwU3RvcmUgJiYgYXdhaXQgaHR0cFN0b3JlLmdldEluZm8oeyBwYXRoOiBmaWxlUGF0aCB9KSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbmZvID0gYXdhaXQgZ2V0Um91dGluZ0ZpbGVSZXN1bHQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbmZvIHx8ICFpbmZvLnNpemUpIHtcbiAgICAgICAgICAgIHRyYWNrQWNjZXNzKHsgYWNjb3VudCwgb3BlcmF0aW9uOiBcImh0dHBHZXRcIiwgcGF0aDogYCR7YnVja2V0TmFtZX0vJHtmaWxlUGF0aH1gLCBzaXplOiAwIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHNldEhUVFBSZXN1bHRIZWFkZXJzKEJ1ZmZlci5mcm9tKFwiXCIpLCB7IHN0YXR1czogXCI0MDRcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZXh0ID0gZmlsZVBhdGguc3BsaXQoXCIuXCIpLnBvcCgpIHx8IFwiXCI7XG4gICAgICAgIGxldCBoZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogQ09OVEVOVF9UWVBFU1tleHQudG9Mb3dlckNhc2UoKV0gfHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIixcbiAgICAgICAgICAgIFwiTGFzdC1Nb2RpZmllZFwiOiBuZXcgRGF0ZShpbmZvLndyaXRlVGltZSkudG9VVENTdHJpbmcoKSxcbiAgICAgICAgICAgIFwiQWNjZXB0LVJhbmdlc1wiOiBcImJ5dGVzXCIsXG4gICAgICAgIH07XG4gICAgICAgIC8vIFRoZSBzZXJ2aW5nIHN0b3JlJ3Mgb3duIHBvbGljeSAtIGFuZCBuZXZlciBmb3IgdGhlIHJvdXRpbmcgZmlsZSwgd2hpY2ggY2hhbmdpbmcgaXMgdGhlIHdob2xlIHBvaW50IG9mXG4gICAgICAgIGlmIChpbW11dGFibGUpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbXCJDYWNoZS1Db250cm9sXCJdID0gYG1heC1hZ2U9JHtJTU1VVEFCTEVfQ0FDSEVfVElNRSAvIDEwMDB9YDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaWZNb2RpZmllZFNpbmNlID0gcmVxdWVzdD8uaGVhZGVyc1tcImlmLW1vZGlmaWVkLXNpbmNlXCJdO1xuICAgICAgICBpZiAodHlwZW9mIGlmTW9kaWZpZWRTaW5jZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IHNpbmNlID0gbmV3IERhdGUoaWZNb2RpZmllZFNpbmNlKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICBpZiAoc2luY2UgJiYgTWF0aC5mbG9vcihpbmZvLndyaXRlVGltZSAvIDEwMDApICogMTAwMCA8PSBzaW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhCdWZmZXIuZnJvbShcIlwiKSwgeyAuLi5oZWFkZXJzLCBzdGF0dXM6IFwiMzA0XCIgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCByYW5nZUhlYWRlciA9IHJlcXVlc3Q/LmhlYWRlcnNbXCJyYW5nZVwiXTtcbiAgICAgICAgaWYgKHR5cGVvZiByYW5nZUhlYWRlciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IG1hdGNoID0gL15ieXRlcz0oXFxkKiktKFxcZCopJC8uZXhlYyhyYW5nZUhlYWRlci50cmltKCkpO1xuICAgICAgICAgICAgaWYgKG1hdGNoICYmIChtYXRjaFsxXSB8fCBtYXRjaFsyXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnQ6IG51bWJlcjtcbiAgICAgICAgICAgICAgICBsZXQgZW5kSW5jbHVzaXZlID0gaW5mby5zaXplIC0gMTtcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoMCwgaW5mby5zaXplIC0gK21hdGNoWzJdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdGFydCA9ICttYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRJbmNsdXNpdmUgPSBNYXRoLm1pbigrbWF0Y2hbMl0sIGluZm8uc2l6ZSAtIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzdGFydCA+PSBpbmZvLnNpemUgfHwgc3RhcnQgPiBlbmRJbmNsdXNpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldEhUVFBSZXN1bHRIZWFkZXJzKEJ1ZmZlci5mcm9tKFwiXCIpLCB7IC4uLmhlYWRlcnMsIFwiQ29udGVudC1SYW5nZVwiOiBgYnl0ZXMgKi8ke2luZm8uc2l6ZX1gLCBzdGF0dXM6IFwiNDE2XCIgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJhbmdlID0geyBzdGFydCwgZW5kOiBlbmRJbmNsdXNpdmUgKyAxIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdDogeyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGh0dHBTdG9yZSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgaHR0cFN0b3JlLmdldDIoeyBwYXRoOiBmaWxlUGF0aCwgcmFuZ2UgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBnZXRSb3V0aW5nRmlsZVJlc3VsdChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgcmFuZ2UpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7IC4uLnJlc3VsdCwgZGF0YTogcmVzdWx0LmRhdGEuc3ViYXJyYXkoTWF0aC5taW4ocmFuZ2Uuc3RhcnQsIHJlc3VsdC5kYXRhLmxlbmd0aCksIE1hdGgubWluKHJhbmdlLmVuZCwgcmVzdWx0LmRhdGEubGVuZ3RoKSkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cmFja0FjY2Vzcyh7IGFjY291bnQsIG9wZXJhdGlvbjogXCJodHRwR2V0XCIsIHBhdGg6IGAke2J1Y2tldE5hbWV9LyR7ZmlsZVBhdGh9YCwgc2l6ZTogcmVzdWx0ICYmIHJlc3VsdC5kYXRhLmxlbmd0aCB8fCAwIH0pO1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHNldEhUVFBSZXN1bHRIZWFkZXJzKEJ1ZmZlci5mcm9tKFwiXCIpLCB7IHN0YXR1czogXCI0MDRcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhyZXN1bHQuZGF0YSwgeyAuLi5oZWFkZXJzLCBcIkNvbnRlbnQtUmFuZ2VcIjogYGJ5dGVzICR7cmFuZ2Uuc3RhcnR9LSR7cmFuZ2UuZW5kIC0gMX0vJHtpbmZvLnNpemV9YCwgc3RhdHVzOiBcIjIwNlwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhyZXN1bHQuZGF0YSwgaGVhZGVycyk7XG4gICAgfVxufVxuXG4vKiogVGhlIG9uZSByZXNvbHV0aW9uIGV2ZXJ5IGRhdGEgY2FsbCBkb2VzOiB0aGUgY2xpZW50J3Mgc2VsZWN0ZWQgc291cmNlQ29uZmlnIE5BTUVTIGV4YWN0bHkgb25lIHN0b3JlIChjcmVhdGVkIG9uIGZpcnN0IHVzZSksIGFuZCBmbiBydW5zIG9uIGl0LiAqL1xuYXN5bmMgZnVuY3Rpb24gd2l0aFN0b3JlPFQ+KGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWcgfSwgZm46IChzdG9yZTogQmxvYlN0b3JlKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKGZpbmRCdWNrZXRTdG9yZShjb25maWcuYWNjb3VudCwgY29uZmlnLmJ1Y2tldE5hbWUsIGNvbmZpZy5zb3VyY2VDb25maWcpKTtcbn1cblxuLy8gVGhlIGNhbGxlcidzIG5vZGUgaWQgZm9yIHRoZSBtdXRhdGlvbiBsb2cgLSByZWFkIHN5bmNocm9ub3VzbHkgYXQgbWV0aG9kIGVudHJ5ICh0aGUgY2FsbCBjb250ZXh0IGRvZXMgbm90IHN1cnZpdmUgYXdhaXRzKSwgYW5kIHRvbGVyYW50IG9mIHRoZXJlIGJlaW5nIG5vbmUgKGxvY2FsIGNhbGxzKVxuZnVuY3Rpb24gY2FsbGVySWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gU29ja2V0RnVuY3Rpb24uZ2V0Q2FsbGVyKCk/Lm5vZGVJZDtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5cbmNvbnN0IGxhcmdlVXBsb2FkSW5mbyA9IG5ldyBNYXA8c3RyaW5nLCB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZm9yY2VTZXRJbW11dGFibGU/OiBib29sZWFuOyBub0NoZWNrcz86IGJvb2xlYW47IGludGVybmFsPzogYm9vbGVhbjsgc3RvcmVOYW1lOiBzdHJpbmcgfT4oKTtcblxuY29uc3QgYWNjb3VudEFjY2VzczogU29ja2V0RnVuY3Rpb25Ib29rID0gYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGxldCBjb25maWcgPSBjb250ZXh0LmNhbGwuYXJnc1swXSBhcyB7IGFjY291bnQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBhd2FpdCByZXF1aXJlQWNjZXNzKFN0cmluZyhjb25maWc/LmFjY291bnQpKTtcbiAgICBsZXQgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnQ7XG4gICAgaWYgKGR1cmF0aW9uID4gQUNDRVNTX0NIRUNLX1NMT1dfVElNRSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQWNjZXNzIGNoZWNrIGZvciAke2NvbnRleHQuY2FsbC5mdW5jdGlvbk5hbWV9IHRvb2sgJHtkdXJhdGlvbn1tc2ApO1xuICAgIH1cbn07XG5jb25zdCB1cGxvYWRBY2Nlc3M6IFNvY2tldEZ1bmN0aW9uSG9vayA9IGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgbGV0IGNvbmZpZyA9IGNvbnRleHQuY2FsbC5hcmdzWzBdIGFzIHsgdXBsb2FkSWQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaW5mbyA9IGxhcmdlVXBsb2FkSW5mby5nZXQoU3RyaW5nKGNvbmZpZz8udXBsb2FkSWQpKTtcbiAgICBpZiAoIWluZm8pIHJldHVybjtcbiAgICBhd2FpdCByZXF1aXJlQWNjZXNzKGluZm8uYWNjb3VudCk7XG59O1xuY29uc3QgYWRtaW5BY2Nlc3M6IFNvY2tldEZ1bmN0aW9uSG9vayA9IGFzeW5jICgpID0+IHtcbiAgICByZXF1aXJlQWRtaW4oKTtcbn07XG5cbmV4cG9ydCBjb25zdCBSZW1vdGVTdG9yYWdlQ29udHJvbGxlciA9IFNvY2tldEZ1bmN0aW9uLnJlZ2lzdGVyKFxuICAgIFJFTU9URV9TVE9SQUdFX0NMQVNTX0dVSUQsXG4gICAgbmV3IFJlbW90ZVN0b3JhZ2VDb250cm9sbGVyQmFzZSgpLFxuICAgICgpID0+ICh7XG4gICAgICAgIHBpbmc6IHt9LFxuICAgICAgICBhdXRoZW50aWNhdGU6IHt9LFxuICAgICAgICByZXF1ZXN0QWNjZXNzOiB7fSxcbiAgICAgICAgZ2V0QWNjZXNzU3RhdGU6IHt9LFxuICAgICAgICBsaXN0UmVxdWVzdHNGb3JJUDogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGdyYW50QWNjZXNzOiB7fSxcbiAgICAgICAgYWRtaW5MaXN0UmVxdWVzdHM6IHsgaG9va3M6IFthZG1pbkFjY2Vzc10gfSxcbiAgICAgICAgYWRtaW5MaXN0QWN0aXZlQnVja2V0czogeyBob29rczogW2FkbWluQWNjZXNzXSB9LFxuICAgICAgICBhZG1pbkdyYW50QWNjZXNzOiB7IGhvb2tzOiBbYWRtaW5BY2Nlc3NdIH0sXG4gICAgICAgIGdldDI6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBzZXQ6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBkZWw6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBtb3ZlOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0SW5mbzogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGZpbmRJbmZvOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0Q2hhbmdlc0FmdGVyMjogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGdldEFyY2hpdmVzQ29uZmlnOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0SW5kZXhJbmZvOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgbGlzdEJ1Y2tldHM6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBnZXRBY3RpdmVCdWNrZXQ6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBhY3RpdmF0ZUJ1Y2tldDogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGNsZWFyV3JpdGVTdGF0czogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGdldEFjY2Vzc1N0YXRzOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0QWNjZXNzU3VtbWFyaWVzOiB7IGhvb2tzOiBbYWNjb3VudEFjY2Vzc10gfSxcbiAgICAgICAgZ2V0U3luY1N0YXR1czogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGxpc3RMb2dGaWxlczogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIGdldExvZ0ZpbGU6IHsgaG9va3M6IFthY2NvdW50QWNjZXNzXSB9LFxuICAgICAgICBzdGFydExhcmdlRmlsZTogeyBob29rczogW2FjY291bnRBY2Nlc3NdIH0sXG4gICAgICAgIHVwbG9hZFBhcnQ6IHsgaG9va3M6IFt1cGxvYWRBY2Nlc3NdIH0sXG4gICAgICAgIGZpbmlzaExhcmdlRmlsZTogeyBob29rczogW3VwbG9hZEFjY2Vzc10gfSxcbiAgICAgICAgY2FuY2VsTGFyZ2VGaWxlOiB7IGhvb2tzOiBbdXBsb2FkQWNjZXNzXSB9LFxuICAgICAgICBodHRwRW50cnk6IHt9LFxuICAgIH0pLFxuICAgICgpID0+ICh7XG4gICAgICAgIG5vQ2xpZW50SG9va3M6IHRydWUsXG4gICAgICAgIG5vRGVmYXVsdEhvb2tzOiB0cnVlLFxuICAgIH0pXG4pO1xuIl19
|
|
627
|
+
/* _JS_SOURCE_HASH = "e1f6244cd5db1fe6e30db812ccd871f7310ea9ed766ffb5a5cab0cf02414d36a"; */
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
6
|
+
//exports.readStorageLogFile = exports.listStorageLogFiles = exports.logStorageError = exports.logSyncEvent = exports.logMutation = exports.LOGS_FOLDER_NAME = void 0;
|
|
7
|
+
const os_1 = __importDefault(require("os"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const caching_1 = require("socket-function/src/caching");
|
|
10
|
+
const StreamingLogs_1 = require("../StreamingLogs");
|
|
11
|
+
const serverConfig_1 = require("./serverConfig");
|
|
12
|
+
const certs_1 = require("../../misc/https/certs");
|
|
13
|
+
// The storage server's operation log: every mutation (never the data itself - just what happened, to what, when, how big, and who asked), every error, and the synchronization key points, streamed as JSON lines into <storage folder>/logs (see StreamingLogs for the file lifecycle). Everything here is a safe no-op on processes that have no storage folder - logging must never be the thing that breaks a request.
|
|
14
|
+
exports.LOGS_FOLDER_NAME = "logs";
|
|
15
|
+
const getLogs = (0, caching_1.lazy)(() => {
|
|
16
|
+
var _a;
|
|
17
|
+
let folder;
|
|
18
|
+
try {
|
|
19
|
+
folder = path_1.default.join((0, serverConfig_1.getStorageFolder)(), exports.LOGS_FOLDER_NAME);
|
|
20
|
+
}
|
|
21
|
+
catch (_b) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
let threadId;
|
|
25
|
+
try {
|
|
26
|
+
threadId = (0, certs_1.getOwnThreadId)(((_a = (0, serverConfig_1.getStorageServerConfigOptional)()) === null || _a === void 0 ? void 0 : _a.rootDomain) || "");
|
|
27
|
+
}
|
|
28
|
+
catch (_c) {
|
|
29
|
+
threadId = undefined;
|
|
30
|
+
}
|
|
31
|
+
hookErrorLogging();
|
|
32
|
+
return new StreamingLogs_1.StreamingLogs({ folder, threadId });
|
|
33
|
+
});
|
|
34
|
+
function firstExternalIPv4() {
|
|
35
|
+
for (let addresses of Object.values(os_1.default.networkInterfaces())) {
|
|
36
|
+
for (let address of addresses || []) {
|
|
37
|
+
if (address.family === "IPv4" && !address.internal)
|
|
38
|
+
return address.address;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
// Computed once: none of it changes over a process's lifetime
|
|
44
|
+
const baseFields = (0, caching_1.lazy)(() => {
|
|
45
|
+
var _a;
|
|
46
|
+
return ({
|
|
47
|
+
pid: process.pid,
|
|
48
|
+
entryPoint: process.argv[1],
|
|
49
|
+
ip: firstExternalIPv4(),
|
|
50
|
+
domain: (_a = (0, serverConfig_1.getStorageServerConfigOptional)()) === null || _a === void 0 ? void 0 : _a.domain,
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
function write(kind, entry) {
|
|
54
|
+
let logs = getLogs();
|
|
55
|
+
if (!logs)
|
|
56
|
+
return;
|
|
57
|
+
logs.log({ kind, time: Date.now(), ...baseFields(), ...entry });
|
|
58
|
+
}
|
|
59
|
+
/** One mutation the server performed: set/del/move/undelete/setLarge/routingConfig, plus the per-file synchronization writes ("sync get"/"sync set"). Sizes and times, never the data. internal marks writes pushed by a peer's synchronization rather than a client. */
|
|
60
|
+
function logMutation(entry) {
|
|
61
|
+
write("mutation", entry);
|
|
62
|
+
}
|
|
63
|
+
exports.logMutation = logMutation;
|
|
64
|
+
/** A synchronization key point: scans and full syncs starting/finishing, reconciles, boundary scans - what an operator greps for to see whether the fleet is converging. */
|
|
65
|
+
function logSyncEvent(entry) {
|
|
66
|
+
write("sync", entry);
|
|
67
|
+
}
|
|
68
|
+
exports.logSyncEvent = logSyncEvent;
|
|
69
|
+
function logStorageError(message) {
|
|
70
|
+
write("error", { message });
|
|
71
|
+
}
|
|
72
|
+
exports.logStorageError = logStorageError;
|
|
73
|
+
// Everything console.errored also lands in the log stream (with a reentrancy guard: a failure INSIDE logging must not log itself forever)
|
|
74
|
+
let writingError = false;
|
|
75
|
+
const hookErrorLogging = (0, caching_1.lazy)(() => {
|
|
76
|
+
let original = console.error.bind(console);
|
|
77
|
+
console.error = (...args) => {
|
|
78
|
+
original(...args);
|
|
79
|
+
if (writingError)
|
|
80
|
+
return;
|
|
81
|
+
writingError = true;
|
|
82
|
+
try {
|
|
83
|
+
logStorageError(args.map(x => { var _a; return typeof x === "string" && x || ((_a = x === null || x === void 0 ? void 0 : x.stack) !== null && _a !== void 0 ? _a : JSON.stringify(x)); }).join(" ").slice(0, 5000));
|
|
84
|
+
}
|
|
85
|
+
catch (_a) { }
|
|
86
|
+
finally {
|
|
87
|
+
writingError = false;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
/** The log files this server holds - see StreamingLogs.listFiles. Empty on processes with no storage folder. */
|
|
92
|
+
async function listStorageLogFiles() {
|
|
93
|
+
let logs = getLogs();
|
|
94
|
+
if (!logs)
|
|
95
|
+
return [];
|
|
96
|
+
return await logs.listFiles();
|
|
97
|
+
}
|
|
98
|
+
exports.listStorageLogFiles = listStorageLogFiles;
|
|
99
|
+
/** One log file's bytes, always LZ4-compressed - see StreamingLogs.readFileCompressed (decode with decodeLogFile). */
|
|
100
|
+
async function readStorageLogFile(name) {
|
|
101
|
+
let logs = getLogs();
|
|
102
|
+
if (!logs) {
|
|
103
|
+
throw new Error(`This process has no storage folder, so it has no logs to read`);
|
|
104
|
+
}
|
|
105
|
+
return await logs.readFileCompressed(name);
|
|
106
|
+
}
|
|
107
|
+
exports.readStorageLogFile = readStorageLogFile;
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZUxvZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdG9yYWdlTG9ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLHlEQUFtRDtBQUNuRCxvREFBOEQ7QUFDOUQsaURBQWtGO0FBQ2xGLGtEQUF3RDtBQUV4RCwyWkFBMlo7QUFFOVksUUFBQSxnQkFBZ0IsR0FBRyxNQUFNLENBQUM7QUFFdkMsTUFBTSxPQUFPLEdBQUcsSUFBQSxjQUFJLEVBQUMsR0FBOEIsRUFBRTs7SUFDakQsSUFBSSxNQUFjLENBQUM7SUFDbkIsSUFBSSxDQUFDO1FBQ0QsTUFBTSxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsSUFBQSwrQkFBZ0IsR0FBRSxFQUFFLHdCQUFnQixDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUFDLFdBQU0sQ0FBQztRQUNMLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLFFBQTRCLENBQUM7SUFDakMsSUFBSSxDQUFDO1FBQ0QsUUFBUSxHQUFHLElBQUEsc0JBQWMsRUFBQyxDQUFBLE1BQUEsSUFBQSw2Q0FBOEIsR0FBRSwwQ0FBRSxVQUFVLEtBQUksRUFBRSxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUFDLFdBQU0sQ0FBQztRQUNMLFFBQVEsR0FBRyxTQUFTLENBQUM7SUFDekIsQ0FBQztJQUNELGdCQUFnQixFQUFFLENBQUM7SUFDbkIsT0FBTyxJQUFJLDZCQUFhLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUNuRCxDQUFDLENBQUMsQ0FBQztBQUVILFNBQVMsaUJBQWlCO0lBQ3RCLEtBQUssSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDMUQsS0FBSyxJQUFJLE9BQU8sSUFBSSxTQUFTLElBQUksRUFBRSxFQUFFLENBQUM7WUFDbEMs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QUpELGtEQUlDO0FBRUQsc0hBQXNIO0FBQy9HLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxJQUFZO0lBQ2pELElBQUksSUFBSSxHQUFHLE9BQU8sRUFBRSxDQUFDO0lBQ3JCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNSLE1BQU0sSUFBSSxLQUFLLENBQUMsK0RBQStELENBQUMsQ0FBQztJQUNyRixDQUFDO0lBQ0QsT0FBTyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBTkQsZ0RBTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IFN0cmVhbWluZ0xvZ3MsIExvZ0ZpbGVJbmZvIH0gZnJvbSBcIi4uL1N0cmVhbWluZ0xvZ3NcIjtcbmltcG9ydCB7IGdldFN0b3JhZ2VGb2xkZXIsIGdldFN0b3JhZ2VTZXJ2ZXJDb25maWdPcHRpb25hbCB9IGZyb20gXCIuL3NlcnZlckNvbmZpZ1wiO1xuaW1wb3J0IHsgZ2V0T3duVGhyZWFkSWQgfSBmcm9tIFwiLi4vLi4vbWlzYy9odHRwcy9jZXJ0c1wiO1xuXG4vLyBUaGUgc3RvcmFnZSBzZXJ2ZXIncyBvcGVyYXRpb24gbG9nOiBldmVyeSBtdXRhdGlvbiAobmV2ZXIgdGhlIGRhdGEgaXRzZWxmIC0ganVzdCB3aGF0IGhhcHBlbmVkLCB0byB3aGF0LCB3aGVuLCBob3cgYmlnLCBhbmQgd2hvIGFza2VkKSwgZXZlcnkgZXJyb3IsIGFuZCB0aGUgc3luY2hyb25pemF0aW9uIGtleSBwb2ludHMsIHN0cmVhbWVkIGFzIEpTT04gbGluZXMgaW50byA8c3RvcmFnZSBmb2xkZXI+L2xvZ3MgKHNlZSBTdHJlYW1pbmdMb2dzIGZvciB0aGUgZmlsZSBsaWZlY3ljbGUpLiBFdmVyeXRoaW5nIGhlcmUgaXMgYSBzYWZlIG5vLW9wIG9uIHByb2Nlc3NlcyB0aGF0IGhhdmUgbm8gc3RvcmFnZSBmb2xkZXIgLSBsb2dnaW5nIG11c3QgbmV2ZXIgYmUgdGhlIHRoaW5nIHRoYXQgYnJlYWtzIGEgcmVxdWVzdC5cblxuZXhwb3J0IGNvbnN0IExPR1NfRk9MREVSX05BTUUgPSBcImxvZ3NcIjtcblxuY29uc3QgZ2V0TG9ncyA9IGxhenkoKCk6IFN0cmVhbWluZ0xvZ3MgfCB1bmRlZmluZWQgPT4ge1xuICAgIGxldCBmb2xkZXI6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgICBmb2xkZXIgPSBwYXRoLmpvaW4oZ2V0U3RvcmFnZUZvbGRlcigpLCBMT0dTX0ZPTERFUl9OQU1FKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgbGV0IHRocmVhZElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgdGhyZWFkSWQgPSBnZXRPd25UaHJlYWRJZChnZXRTdG9yYWdlU2VydmVyQ29uZmlnT3B0aW9uYWwoKT8ucm9vdERvbWFpbiB8fCBcIlwiKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhyZWFkSWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGhvb2tFcnJvckxvZ2dpbmcoKTtcbiAgICByZXR1cm4gbmV3IFN0cmVhbWluZ0xvZ3MoeyBmb2xkZXIsIHRocmVhZElkIH0pO1xufSk7XG5cbmZ1bmN0aW9uIGZpcnN0RXh0ZXJuYWxJUHY0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChsZXQgYWRkcmVzc2VzIG9mIE9iamVjdC52YWx1ZXMob3MubmV0d29ya0ludGVyZmFjZXMoKSkpIHtcbiAgICAgICAgZm9yIChsZXQgYWRkcmVzcyBvZiBhZGRyZXNzZXMgfHwgW10pIHtcbiAgICAgICAgICAgIGlmIChhZGRyZXNzLmZhbWlseSA9PT0gXCJJUHY0XCIgJiYgIWFkZHJlc3MuaW50ZXJuYWwpIHJldHVybiBhZGRyZXNzLmFkZHJlc3M7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLy8gQ29tcHV0ZWQgb25jZTogbm9uZSBvZiBpdCBjaGFuZ2VzIG92ZXIgYSBwcm9jZXNzJ3MgbGlmZXRpbWVcbmNvbnN0IGJhc2VGaWVsZHMgPSBsYXp5KCgpID0+ICh7XG4gICAgcGlkOiBwcm9jZXNzLnBpZCxcbiAgICBlbnRyeVBvaW50OiBwcm9jZXNzLmFyZ3ZbMV0sXG4gICAgaXA6IGZpcnN0RXh0ZXJuYWxJUHY0KCksXG4gICAgZG9tYWluOiBnZXRTdG9yYWdlU2VydmVyQ29uZmlnT3B0aW9uYWwoKT8uZG9tYWluLFxufSkpO1xuXG5mdW5jdGlvbiB3cml0ZShraW5kOiBzdHJpbmcsIGVudHJ5OiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSk6IHZvaWQge1xuICAgIGxldCBsb2dzID0gZ2V0TG9ncygpO1xuICAgIGlmICghbG9ncykgcmV0dXJuO1xuICAgIGxvZ3MubG9nKHsga2luZCwgdGltZTogRGF0ZS5ub3coKSwgLi4uYmFzZUZpZWxkcygpLCAuLi5lbnRyeSB9KTtcbn1cblxuLyoqIE9uZSBtdXRhdGlvbiB0aGUgc2VydmVyIHBlcmZvcm1lZDogc2V0L2RlbC9tb3ZlL3VuZGVsZXRlL3NldExhcmdlL3JvdXRpbmdDb25maWcsIHBsdXMgdGhlIHBlci1maWxlIHN5bmNocm9uaXphdGlvbiB3cml0ZXMgKFwic3luYyBnZXRcIi9cInN5bmMgc2V0XCIpLiBTaXplcyBhbmQgdGltZXMsIG5ldmVyIHRoZSBkYXRhLiBpbnRlcm5hbCBtYXJrcyB3cml0ZXMgcHVzaGVkIGJ5IGEgcGVlcidzIHN5bmNocm9uaXphdGlvbiByYXRoZXIgdGhhbiBhIGNsaWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dNdXRhdGlvbihlbnRyeTogeyBvcDogc3RyaW5nOyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZzsgc3RvcmU/OiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgdG9QYXRoPzogc3RyaW5nOyBzaXplPzogbnVtYmVyOyB3cml0ZVRpbWU/OiBudW1iZXI7IGNhbGxlcklkPzogc3RyaW5nOyBpbnRlcm5hbD86IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIHdyaXRlKFwibXV0YXRpb25cIiwgZW50cnkpO1xufVxuXG4vKiogQSBzeW5jaHJvbml6YXRpb24ga2V5IHBvaW50OiBzY2FucyBhbmQgZnVsbCBzeW5jcyBzdGFydGluZy9maW5pc2hpbmcsIHJlY29uY2lsZXMsIGJvdW5kYXJ5IHNjYW5zIC0gd2hhdCBhbiBvcGVyYXRvciBncmVwcyBmb3IgdG8gc2VlIHdoZXRoZXIgdGhlIGZsZWV0IGlzIGNvbnZlcmdpbmcuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nU3luY0V2ZW50KGVudHJ5OiB7IGV2ZW50OiBzdHJpbmc7IHN0b3JlOiBzdHJpbmc7IHNvdXJjZT86IHN0cmluZzsgW2tleTogc3RyaW5nXTogdW5rbm93biB9KTogdm9pZCB7XG4gICAgd3JpdGUoXCJzeW5jXCIsIGVudHJ5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvZ1N0b3JhZ2VFcnJvcihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB3cml0ZShcImVycm9yXCIsIHsgbWVzc2FnZSB9KTtcbn1cblxuLy8gRXZlcnl0aGluZyBjb25zb2xlLmVycm9yZWQgYWxzbyBsYW5kcyBpbiB0aGUgbG9nIHN0cmVhbSAod2l0aCBhIHJlZW50cmFuY3kgZ3VhcmQ6IGEgZmFpbHVyZSBJTlNJREUgbG9nZ2luZyBtdXN0IG5vdCBsb2cgaXRzZWxmIGZvcmV2ZXIpXG5sZXQgd3JpdGluZ0Vycm9yID0gZmFsc2U7XG5jb25zdCBob29rRXJyb3JMb2dnaW5nID0gbGF6eSgoKSA9PiB7XG4gICAgbGV0IG9yaWdpbmFsID0gY29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpO1xuICAgIGNvbnNvbGUuZXJyb3IgPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIG9yaWdpbmFsKC4uLmFyZ3MpO1xuICAgICAgICBpZiAod3JpdGluZ0Vycm9yKSByZXR1cm47XG4gICAgICAgIHdyaXRpbmdFcnJvciA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2dTdG9yYWdlRXJyb3IoYXJncy5tYXAoeCA9PiB0eXBlb2YgeCA9PT0gXCJzdHJpbmdcIiAmJiB4IHx8ICgoeCBhcyBFcnJvcik/LnN0YWNrID8/IEpTT04uc3RyaW5naWZ5KHgpKSkuam9pbihcIiBcIikuc2xpY2UoMCwgNTAwMCkpO1xuICAgICAgICB9IGNhdGNoIHsgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHdyaXRpbmdFcnJvciA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcbn0pO1xuXG4vKiogVGhlIGxvZyBmaWxlcyB0aGlzIHNlcnZlciBob2xkcyAtIHNlZSBTdHJlYW1pbmdMb2dzLmxpc3RGaWxlcy4gRW1wdHkgb24gcHJvY2Vzc2VzIHdpdGggbm8gc3RvcmFnZSBmb2xkZXIuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFN0b3JhZ2VMb2dGaWxlcygpOiBQcm9taXNlPExvZ0ZpbGVJbmZvW10+IHtcbiAgICBsZXQgbG9ncyA9IGdldExvZ3MoKTtcbiAgICBpZiAoIWxvZ3MpIHJldHVybiBbXTtcbiAgICByZXR1cm4gYXdhaXQgbG9ncy5saXN0RmlsZXMoKTtcbn1cblxuLyoqIE9uZSBsb2cgZmlsZSdzIGJ5dGVzLCBhbHdheXMgTFo0LWNvbXByZXNzZWQgLSBzZWUgU3RyZWFtaW5nTG9ncy5yZWFkRmlsZUNvbXByZXNzZWQgKGRlY29kZSB3aXRoIGRlY29kZUxvZ0ZpbGUpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRTdG9yYWdlTG9nRmlsZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGxldCBsb2dzID0gZ2V0TG9ncygpO1xuICAgIGlmICghbG9ncykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoaXMgcHJvY2VzcyBoYXMgbm8gc3RvcmFnZSBmb2xkZXIsIHNvIGl0IGhhcyBubyBsb2dzIHRvIHJlYWRgKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGxvZ3MucmVhZEZpbGVDb21wcmVzc2VkKG5hbWUpO1xufVxuIl19
|
|
109
|
+
/* _JS_SOURCE_HASH = "367fa81a3392273b281481b840017152af22d1dd26c478d4a5b06d737c8dff25"; */
|