@discordeno/rest 21.0.0 → 21.0.1-next.01dd69b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cjs/index.cjs +2 -2
- package/dist/cjs/manager.cjs +224 -102
- package/dist/cjs/queue.cjs +1 -1
- package/dist/cjs/routes.cjs +64 -22
- package/dist/esm/index.js +2 -2
- package/dist/esm/manager.js +214 -92
- package/dist/esm/queue.js +1 -1
- package/dist/esm/routes.js +64 -22
- package/dist/esm/types.js +1 -1
- package/dist/esm/typings/routes.js +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/manager.d.ts.map +1 -1
- package/dist/types/routes.d.ts.map +1 -1
- package/dist/types/types.d.ts +192 -92
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/typings/routes.d.ts +32 -13
- package/dist/types/typings/routes.d.ts.map +1 -1
- package/package.json +26 -22
package/dist/cjs/manager.cjs
CHANGED
|
@@ -5,43 +5,43 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
function _export(target, all) {
|
|
6
6
|
for(var name in all)Object.defineProperty(target, name, {
|
|
7
7
|
enumerable: true,
|
|
8
|
-
get: all
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
|
-
AUDIT_LOG_REASON_HEADER
|
|
12
|
+
get AUDIT_LOG_REASON_HEADER () {
|
|
13
13
|
return AUDIT_LOG_REASON_HEADER;
|
|
14
14
|
},
|
|
15
|
-
DISCORD_API_URL
|
|
15
|
+
get DISCORD_API_URL () {
|
|
16
16
|
return DISCORD_API_URL;
|
|
17
17
|
},
|
|
18
|
-
DISCORD_API_VERSION
|
|
18
|
+
get DISCORD_API_VERSION () {
|
|
19
19
|
return DISCORD_API_VERSION;
|
|
20
20
|
},
|
|
21
|
-
RATE_LIMIT_BUCKET_HEADER
|
|
21
|
+
get RATE_LIMIT_BUCKET_HEADER () {
|
|
22
22
|
return RATE_LIMIT_BUCKET_HEADER;
|
|
23
23
|
},
|
|
24
|
-
RATE_LIMIT_GLOBAL_HEADER
|
|
24
|
+
get RATE_LIMIT_GLOBAL_HEADER () {
|
|
25
25
|
return RATE_LIMIT_GLOBAL_HEADER;
|
|
26
26
|
},
|
|
27
|
-
RATE_LIMIT_LIMIT_HEADER
|
|
27
|
+
get RATE_LIMIT_LIMIT_HEADER () {
|
|
28
28
|
return RATE_LIMIT_LIMIT_HEADER;
|
|
29
29
|
},
|
|
30
|
-
RATE_LIMIT_REMAINING_HEADER
|
|
30
|
+
get RATE_LIMIT_REMAINING_HEADER () {
|
|
31
31
|
return RATE_LIMIT_REMAINING_HEADER;
|
|
32
32
|
},
|
|
33
|
-
RATE_LIMIT_RESET_AFTER_HEADER
|
|
33
|
+
get RATE_LIMIT_RESET_AFTER_HEADER () {
|
|
34
34
|
return RATE_LIMIT_RESET_AFTER_HEADER;
|
|
35
35
|
},
|
|
36
|
-
RATE_LIMIT_SCOPE_HEADER
|
|
36
|
+
get RATE_LIMIT_SCOPE_HEADER () {
|
|
37
37
|
return RATE_LIMIT_SCOPE_HEADER;
|
|
38
38
|
},
|
|
39
|
-
createRestManager
|
|
39
|
+
get createRestManager () {
|
|
40
40
|
return createRestManager;
|
|
41
41
|
}
|
|
42
42
|
});
|
|
43
43
|
const _nodebuffer = require("node:buffer");
|
|
44
|
-
const
|
|
44
|
+
const _nodeutil = require("node:util");
|
|
45
45
|
const _utils = require("@discordeno/utils");
|
|
46
46
|
const _invalidBucket = require("./invalidBucket.cjs");
|
|
47
47
|
const _queue = require("./queue.cjs");
|
|
@@ -58,6 +58,17 @@ const RATE_LIMIT_SCOPE_HEADER = 'x-ratelimit-scope';
|
|
|
58
58
|
function createRestManager(options) {
|
|
59
59
|
const applicationId = options.applicationId ? BigInt(options.applicationId) : (0, _utils.getBotIdFromToken)(options.token);
|
|
60
60
|
const baseUrl = options.proxy?.baseUrl ?? DISCORD_API_URL;
|
|
61
|
+
// Discord error can get nested a lot, so we use a custom inspect to change the depth to Infinity
|
|
62
|
+
const baseErrorPrototype = {
|
|
63
|
+
[_nodeutil.inspect.custom] (_depth, options, _inspect) {
|
|
64
|
+
return _inspect(this, {
|
|
65
|
+
...options,
|
|
66
|
+
depth: Infinity,
|
|
67
|
+
// Since we call inspect on ourself, we need to disable the calls to the inspect.custom symbol or else it will cause an infinite loop.
|
|
68
|
+
customInspect: false
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
};
|
|
61
72
|
const rest = {
|
|
62
73
|
applicationId,
|
|
63
74
|
authorization: options.proxy?.authorization,
|
|
@@ -77,6 +88,12 @@ function createRestManager(options) {
|
|
|
77
88
|
token: options.token,
|
|
78
89
|
version: options.version ?? DISCORD_API_VERSION,
|
|
79
90
|
logger: options.logger ?? _utils.logger,
|
|
91
|
+
events: {
|
|
92
|
+
request: ()=>{},
|
|
93
|
+
response: ()=>{},
|
|
94
|
+
requestError: ()=>{},
|
|
95
|
+
...options.events
|
|
96
|
+
},
|
|
80
97
|
routes: (0, _routes.createRoutes)(),
|
|
81
98
|
createBaseHeaders () {
|
|
82
99
|
return {
|
|
@@ -335,13 +352,20 @@ function createRestManager(options) {
|
|
|
335
352
|
const authorizationScheme = payload.headers.authorization?.split(' ')[0];
|
|
336
353
|
loggingHeaders.authorization = `${authorizationScheme} tokenhere`;
|
|
337
354
|
}
|
|
355
|
+
const request = new Request(url, payload);
|
|
356
|
+
rest.events.request(request, {
|
|
357
|
+
body: options.requestBodyOptions?.body
|
|
358
|
+
});
|
|
338
359
|
rest.logger.debug(`sending request to ${url}`, 'with payload:', {
|
|
339
360
|
...payload,
|
|
340
361
|
headers: loggingHeaders
|
|
341
362
|
});
|
|
342
|
-
const response = await fetch(
|
|
363
|
+
const response = await fetch(request).catch(async (error)=>{
|
|
343
364
|
rest.logger.error(error);
|
|
344
|
-
|
|
365
|
+
rest.events.requestError(request, error, {
|
|
366
|
+
body: options.requestBodyOptions?.body
|
|
367
|
+
});
|
|
368
|
+
// Mark request as completed
|
|
345
369
|
rest.invalidBucket.handleCompletedRequest(999, false);
|
|
346
370
|
options.reject({
|
|
347
371
|
ok: false,
|
|
@@ -351,7 +375,13 @@ function createRestManager(options) {
|
|
|
351
375
|
throw error;
|
|
352
376
|
});
|
|
353
377
|
rest.logger.debug(`request fetched from ${url} with status ${response.status} & ${response.statusText}`);
|
|
354
|
-
//
|
|
378
|
+
// Sometimes the Content-Type may be "application/json; charset=utf-8", for this reason, we need to check the start of the header
|
|
379
|
+
const body = await (response.headers.get('Content-Type')?.startsWith('application/json') ? response.json() : response.text()).catch(()=>null);
|
|
380
|
+
rest.events.response(request, response, {
|
|
381
|
+
requestBody: options.requestBodyOptions?.body,
|
|
382
|
+
responseBody: body
|
|
383
|
+
});
|
|
384
|
+
// Mark request as completed
|
|
355
385
|
rest.invalidBucket.handleCompletedRequest(response.status, response.headers.get(RATE_LIMIT_SCOPE_HEADER) === 'shared');
|
|
356
386
|
// Set the bucket id if it was available on the headers
|
|
357
387
|
const bucketId = rest.processHeaders(rest.simplifyUrl(options.route, options.method), response.headers, payload.headers.authorization);
|
|
@@ -362,7 +392,8 @@ function createRestManager(options) {
|
|
|
362
392
|
options.reject({
|
|
363
393
|
ok: false,
|
|
364
394
|
status: response.status,
|
|
365
|
-
|
|
395
|
+
statusText: response.statusText,
|
|
396
|
+
body
|
|
366
397
|
});
|
|
367
398
|
return;
|
|
368
399
|
}
|
|
@@ -374,6 +405,7 @@ function createRestManager(options) {
|
|
|
374
405
|
options.reject({
|
|
375
406
|
ok: false,
|
|
376
407
|
status: response.status,
|
|
408
|
+
statusText: response.statusText,
|
|
377
409
|
error: 'The request was rate limited and it maxed out the retries limit.'
|
|
378
410
|
});
|
|
379
411
|
return;
|
|
@@ -381,37 +413,59 @@ function createRestManager(options) {
|
|
|
381
413
|
options.retryCount += 1;
|
|
382
414
|
const resetAfter = response.headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
|
|
383
415
|
if (resetAfter) await (0, _utils.delay)(Number(resetAfter) * 1000);
|
|
384
|
-
// process the response to prevent mem leak
|
|
385
|
-
await response.arrayBuffer();
|
|
386
416
|
return await options.retryRequest?.(options);
|
|
387
417
|
}
|
|
388
|
-
// Discord sometimes sends
|
|
418
|
+
// Discord sometimes sends a response with no content
|
|
389
419
|
options.resolve({
|
|
390
420
|
ok: true,
|
|
391
421
|
status: response.status,
|
|
392
|
-
body: response.status === 204 ? undefined :
|
|
422
|
+
body: response.status === 204 ? undefined : body
|
|
393
423
|
});
|
|
394
424
|
},
|
|
395
425
|
simplifyUrl (url, method) {
|
|
396
|
-
const
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
426
|
+
const routeInformationKey = [
|
|
427
|
+
method
|
|
428
|
+
];
|
|
429
|
+
const queryParamIndex = url.indexOf('?');
|
|
430
|
+
const route = queryParamIndex !== -1 ? url.slice(0, queryParamIndex) : url;
|
|
431
|
+
// Since the urls start with / the first part will always be empty
|
|
432
|
+
const splittedRoute = route.split('/');
|
|
433
|
+
// 1) Strip the minor params
|
|
434
|
+
// The only majors are channels, guilds, webhooks and webhooks with their token
|
|
435
|
+
const strippedRoute = splittedRoute.map((part, index, array)=>{
|
|
436
|
+
// While parseInt will truncate the snowflake id, it will still tell us if it is a number
|
|
437
|
+
const isNumber = Number.isFinite(parseInt(part, 10));
|
|
438
|
+
if (!isNumber) {
|
|
439
|
+
// Reactions emoji need to be stripped as it is a minor parameter
|
|
440
|
+
if (index >= 1 && array[index - 1] === 'reactions') return 'x';
|
|
441
|
+
// If we are on a webhook or if it is part of the route, keep it as it is a major parameter
|
|
442
|
+
return part;
|
|
443
|
+
}
|
|
444
|
+
// Check if we are on a channel id, a guild id or a webhook id
|
|
445
|
+
const isMajor = index >= 1 && (array[index - 1] === 'channels' || array[index - 1] === 'guilds' || array[index - 1] === 'webhooks');
|
|
446
|
+
if (isMajor) return part;
|
|
447
|
+
return 'x';
|
|
448
|
+
}).join('/');
|
|
449
|
+
routeInformationKey.push(strippedRoute);
|
|
450
|
+
// 2) Account for exceptions
|
|
451
|
+
// - https://github.com/discord/discord-api-docs/issues/1092
|
|
452
|
+
// - https://github.com/discord/discord-api-docs/issues/1295
|
|
453
|
+
// The 2 exceptions are for message delete, so we need to check if we are in that route
|
|
454
|
+
if (method === 'DELETE' && splittedRoute.length === 5 && splittedRoute[1] === 'channels' && strippedRoute.endsWith('/messages/x')) {
|
|
455
|
+
const messageId = splittedRoute[4];
|
|
456
|
+
const timestamp = (0, _utils.snowflakeToTimestamp)(messageId);
|
|
457
|
+
const now = Date.now();
|
|
458
|
+
// https://github.com/discord/discord-api-docs/issues/1092
|
|
459
|
+
if (now - timestamp < 10_000) {
|
|
460
|
+
routeInformationKey.push('message-delete-10s');
|
|
461
|
+
}
|
|
462
|
+
// https://github.com/discord/discord-api-docs/issues/1295
|
|
463
|
+
// 2 weeks = 2 * 7 * 24 * 60 * 60 * 1000 = 1209600000
|
|
464
|
+
if (now - timestamp > 1209600000) {
|
|
465
|
+
routeInformationKey.push('message-delete-2w');
|
|
466
|
+
}
|
|
413
467
|
}
|
|
414
|
-
return
|
|
468
|
+
return routeInformationKey.join(':');
|
|
415
469
|
},
|
|
416
470
|
async processRequest (request) {
|
|
417
471
|
const url = rest.simplifyUrl(request.route, request.method);
|
|
@@ -441,30 +495,32 @@ function createRestManager(options) {
|
|
|
441
495
|
async makeRequest (method, route, options) {
|
|
442
496
|
// This error needs to be created here because of how stack traces get calculated
|
|
443
497
|
const error = new Error();
|
|
444
|
-
error.message = 'Failed to send request to discord.';
|
|
445
498
|
if (rest.isProxied) {
|
|
446
499
|
if (rest.authorization) {
|
|
447
500
|
options ??= {};
|
|
448
501
|
options.headers ??= {};
|
|
449
502
|
options.headers[rest.authorizationHeader] = rest.authorization;
|
|
450
503
|
}
|
|
451
|
-
const
|
|
504
|
+
const request = new Request(`${rest.baseUrl}/v${rest.version}${route}`, rest.createRequestBody(method, options));
|
|
505
|
+
rest.events.request(request, {
|
|
506
|
+
body: options?.body
|
|
507
|
+
});
|
|
508
|
+
const result = await fetch(request);
|
|
509
|
+
// Sometimes the Content-Type may be "application/json; charset=utf-8", for this reason, we need to check the start of the header
|
|
510
|
+
const body = await (result.headers.get('Content-Type')?.startsWith('application/json') ? result.json() : result.text()).catch(()=>null);
|
|
511
|
+
rest.events.response(request, result, {
|
|
512
|
+
requestBody: options?.body,
|
|
513
|
+
responseBody: body
|
|
514
|
+
});
|
|
452
515
|
if (!result.ok) {
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
};
|
|
460
|
-
throw error;
|
|
461
|
-
}
|
|
462
|
-
const err = await result.json().catch(()=>{});
|
|
463
|
-
// Legacy Handling to not break old code or when body is missing
|
|
464
|
-
if (!err?.body) throw new Error(`Error: ${err.message ?? result.statusText}`);
|
|
465
|
-
throw new Error(JSON.stringify(err));
|
|
516
|
+
error.cause = Object.assign(Object.create(baseErrorPrototype), {
|
|
517
|
+
ok: false,
|
|
518
|
+
status: result.status,
|
|
519
|
+
body
|
|
520
|
+
});
|
|
521
|
+
throw error;
|
|
466
522
|
}
|
|
467
|
-
return result.status !== 204 ?
|
|
523
|
+
return result.status !== 204 ? typeof body === 'string' ? JSON.parse(body) : body : undefined;
|
|
468
524
|
}
|
|
469
525
|
return await new Promise(async (resolve, reject)=>{
|
|
470
526
|
const payload = {
|
|
@@ -476,10 +532,42 @@ function createRestManager(options) {
|
|
|
476
532
|
await rest.processRequest(payload);
|
|
477
533
|
},
|
|
478
534
|
resolve: (data)=>{
|
|
479
|
-
resolve(data.status !== 204 ? JSON.parse(data.body
|
|
535
|
+
resolve(data.status !== 204 ? typeof data.body === 'string' ? JSON.parse(data.body) : data.body : undefined);
|
|
480
536
|
},
|
|
481
537
|
reject: (reason)=>{
|
|
482
|
-
|
|
538
|
+
let errorText;
|
|
539
|
+
switch(reason.status){
|
|
540
|
+
case 400:
|
|
541
|
+
errorText = "The options was improperly formatted, or the server couldn't understand it.";
|
|
542
|
+
break;
|
|
543
|
+
case 401:
|
|
544
|
+
errorText = 'The Authorization header was missing or invalid.';
|
|
545
|
+
break;
|
|
546
|
+
case 403:
|
|
547
|
+
errorText = 'The Authorization token you passed did not have permission to the resource.';
|
|
548
|
+
break;
|
|
549
|
+
case 404:
|
|
550
|
+
errorText = "The resource at the location specified doesn't exist.";
|
|
551
|
+
break;
|
|
552
|
+
case 405:
|
|
553
|
+
errorText = 'The HTTP method used is not valid for the location specified.';
|
|
554
|
+
break;
|
|
555
|
+
case 429:
|
|
556
|
+
errorText = "You're being ratelimited.";
|
|
557
|
+
break;
|
|
558
|
+
case 502:
|
|
559
|
+
errorText = 'There was not a gateway available to process your options. Wait a bit and retry.';
|
|
560
|
+
break;
|
|
561
|
+
default:
|
|
562
|
+
errorText = reason.statusText ?? 'Unknown error';
|
|
563
|
+
}
|
|
564
|
+
error.message = `[${reason.status}] ${errorText}`;
|
|
565
|
+
// If discord sent us JSON, it is probably going to be an error message from which we can get and add some information about the error to the error message, the full body will be in the error.cause
|
|
566
|
+
// https://discord.com/developers/docs/reference#error-messages
|
|
567
|
+
if (typeof reason.body === 'object' && (0, _utils.hasProperty)(reason.body, 'code') && (0, _utils.hasProperty)(reason.body, 'message')) {
|
|
568
|
+
error.message += `\nDiscord error: [${reason.body.code}] ${reason.body.message}`;
|
|
569
|
+
}
|
|
570
|
+
error.cause = Object.assign(Object.create(baseErrorPrototype), reason);
|
|
483
571
|
reject(error);
|
|
484
572
|
},
|
|
485
573
|
runThroughQueue: options?.runThroughQueue
|
|
@@ -565,11 +653,6 @@ function createRestManager(options) {
|
|
|
565
653
|
}
|
|
566
654
|
return await rest.post(rest.routes.interactions.commands.commands(rest.applicationId), restOptions);
|
|
567
655
|
},
|
|
568
|
-
async createGuild (body) {
|
|
569
|
-
return await rest.post(rest.routes.guilds.all(), {
|
|
570
|
-
body
|
|
571
|
-
});
|
|
572
|
-
},
|
|
573
656
|
async createGuildApplicationCommand (body, guildId, options) {
|
|
574
657
|
const restOptions = {
|
|
575
658
|
body
|
|
@@ -582,14 +665,6 @@ function createRestManager(options) {
|
|
|
582
665
|
}
|
|
583
666
|
return await rest.post(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), restOptions);
|
|
584
667
|
},
|
|
585
|
-
async createGuildFromTemplate (templateCode, body) {
|
|
586
|
-
if (body.icon) {
|
|
587
|
-
body.icon = await (0, _utils.urlToBase64)(body.icon);
|
|
588
|
-
}
|
|
589
|
-
return await rest.post(rest.routes.guilds.templates.code(templateCode), {
|
|
590
|
-
body
|
|
591
|
-
});
|
|
592
|
-
},
|
|
593
668
|
async createGuildSticker (guildId, options, reason) {
|
|
594
669
|
const form = new FormData();
|
|
595
670
|
form.append('file', options.file.blob, options.file.name);
|
|
@@ -677,9 +752,6 @@ function createRestManager(options) {
|
|
|
677
752
|
async deleteGlobalApplicationCommand (commandId) {
|
|
678
753
|
await rest.delete(rest.routes.interactions.commands.command(rest.applicationId, commandId));
|
|
679
754
|
},
|
|
680
|
-
async deleteGuild (guildId) {
|
|
681
|
-
await rest.delete(rest.routes.guilds.guild(guildId));
|
|
682
|
-
},
|
|
683
755
|
async deleteGuildApplicationCommand (commandId, guildId) {
|
|
684
756
|
await rest.delete(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
|
|
685
757
|
},
|
|
@@ -753,7 +825,9 @@ function createRestManager(options) {
|
|
|
753
825
|
});
|
|
754
826
|
},
|
|
755
827
|
async deleteWebhookMessage (webhookId, token, messageId, options) {
|
|
756
|
-
await rest.delete(rest.routes.webhooks.message(webhookId, token, messageId, options)
|
|
828
|
+
await rest.delete(rest.routes.webhooks.message(webhookId, token, messageId, options), {
|
|
829
|
+
unauthorized: true
|
|
830
|
+
});
|
|
757
831
|
},
|
|
758
832
|
async deleteWebhookWithToken (webhookId, token) {
|
|
759
833
|
await rest.delete(rest.routes.webhooks.webhook(webhookId, token), {
|
|
@@ -838,14 +912,6 @@ function createRestManager(options) {
|
|
|
838
912
|
body
|
|
839
913
|
});
|
|
840
914
|
},
|
|
841
|
-
async editGuildMfaLevel (guildId, mfaLevel, reason) {
|
|
842
|
-
await rest.post(rest.routes.guilds.mfa(guildId), {
|
|
843
|
-
body: {
|
|
844
|
-
level: mfaLevel
|
|
845
|
-
},
|
|
846
|
-
reason
|
|
847
|
-
});
|
|
848
|
-
},
|
|
849
915
|
async editGuildSticker (guildId, stickerId, body, reason) {
|
|
850
916
|
return await rest.patch(rest.routes.guilds.sticker(guildId, stickerId), {
|
|
851
917
|
body,
|
|
@@ -866,16 +932,7 @@ function createRestManager(options) {
|
|
|
866
932
|
async editOriginalInteractionResponse (token, body) {
|
|
867
933
|
return await rest.patch(rest.routes.interactions.responses.original(rest.applicationId, token), {
|
|
868
934
|
body,
|
|
869
|
-
files: body.files
|
|
870
|
-
});
|
|
871
|
-
},
|
|
872
|
-
async editOriginalWebhookMessage (webhookId, token, options) {
|
|
873
|
-
return await rest.patch(rest.routes.webhooks.original(webhookId, token, options), {
|
|
874
|
-
body: {
|
|
875
|
-
type: _types.InteractionResponseTypes.UpdateMessage,
|
|
876
|
-
data: options
|
|
877
|
-
},
|
|
878
|
-
files: options.files,
|
|
935
|
+
files: body.files,
|
|
879
936
|
unauthorized: true
|
|
880
937
|
});
|
|
881
938
|
},
|
|
@@ -1094,8 +1151,8 @@ function createRestManager(options) {
|
|
|
1094
1151
|
async getGlobalApplicationCommand (commandId) {
|
|
1095
1152
|
return await rest.get(rest.routes.interactions.commands.command(rest.applicationId, commandId));
|
|
1096
1153
|
},
|
|
1097
|
-
async getGlobalApplicationCommands () {
|
|
1098
|
-
return await rest.get(rest.routes.interactions.commands.commands(rest.applicationId));
|
|
1154
|
+
async getGlobalApplicationCommands (options) {
|
|
1155
|
+
return await rest.get(rest.routes.interactions.commands.commands(rest.applicationId, options?.withLocalizations));
|
|
1099
1156
|
},
|
|
1100
1157
|
async getGuild (guildId, options = {
|
|
1101
1158
|
counts: true
|
|
@@ -1114,8 +1171,8 @@ function createRestManager(options) {
|
|
|
1114
1171
|
async getGuildApplicationCommand (commandId, guildId) {
|
|
1115
1172
|
return await rest.get(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
|
|
1116
1173
|
},
|
|
1117
|
-
async getGuildApplicationCommands (guildId) {
|
|
1118
|
-
return await rest.get(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId));
|
|
1174
|
+
async getGuildApplicationCommands (guildId, options) {
|
|
1175
|
+
return await rest.get(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId, options?.withLocalizations));
|
|
1119
1176
|
},
|
|
1120
1177
|
async getGuildPreview (guildId) {
|
|
1121
1178
|
return await rest.get(rest.routes.guilds.preview(guildId));
|
|
@@ -1155,6 +1212,9 @@ function createRestManager(options) {
|
|
|
1155
1212
|
unauthorized: true
|
|
1156
1213
|
});
|
|
1157
1214
|
},
|
|
1215
|
+
async getChannelPins (channelId, options) {
|
|
1216
|
+
return await rest.get(rest.routes.channels.messagePins(channelId, options));
|
|
1217
|
+
},
|
|
1158
1218
|
async getPinnedMessages (channelId) {
|
|
1159
1219
|
return await rest.get(rest.routes.channels.pins(channelId));
|
|
1160
1220
|
},
|
|
@@ -1206,11 +1266,11 @@ function createRestManager(options) {
|
|
|
1206
1266
|
async getGuildStickers (guildId) {
|
|
1207
1267
|
return await rest.get(rest.routes.guilds.stickers(guildId));
|
|
1208
1268
|
},
|
|
1209
|
-
async getThreadMember (channelId, userId) {
|
|
1210
|
-
return await rest.get(rest.routes.channels.threads.
|
|
1269
|
+
async getThreadMember (channelId, userId, options) {
|
|
1270
|
+
return await rest.get(rest.routes.channels.threads.getUser(channelId, userId, options));
|
|
1211
1271
|
},
|
|
1212
|
-
async getThreadMembers (channelId) {
|
|
1213
|
-
return await rest.get(rest.routes.channels.threads.members(channelId));
|
|
1272
|
+
async getThreadMembers (channelId, options) {
|
|
1273
|
+
return await rest.get(rest.routes.channels.threads.members(channelId, options));
|
|
1214
1274
|
},
|
|
1215
1275
|
async getReactions (channelId, messageId, reaction, options) {
|
|
1216
1276
|
return await rest.get(rest.routes.channels.reactions.message(channelId, messageId, reaction, options));
|
|
@@ -1382,7 +1442,7 @@ function createRestManager(options) {
|
|
|
1382
1442
|
});
|
|
1383
1443
|
},
|
|
1384
1444
|
async pinMessage (channelId, messageId, reason) {
|
|
1385
|
-
await rest.put(rest.routes.channels.
|
|
1445
|
+
await rest.put(rest.routes.channels.messagePin(channelId, messageId), {
|
|
1386
1446
|
reason
|
|
1387
1447
|
});
|
|
1388
1448
|
},
|
|
@@ -1404,13 +1464,18 @@ function createRestManager(options) {
|
|
|
1404
1464
|
reason
|
|
1405
1465
|
});
|
|
1406
1466
|
},
|
|
1467
|
+
async modifyGuildIncidentActions (guildId, options) {
|
|
1468
|
+
return await rest.put(rest.routes.guilds.incidentActions(guildId), {
|
|
1469
|
+
body: options
|
|
1470
|
+
});
|
|
1471
|
+
},
|
|
1407
1472
|
async unbanMember (guildId, userId, reason) {
|
|
1408
1473
|
await rest.delete(rest.routes.guilds.members.ban(guildId, userId), {
|
|
1409
1474
|
reason
|
|
1410
1475
|
});
|
|
1411
1476
|
},
|
|
1412
1477
|
async unpinMessage (channelId, messageId, reason) {
|
|
1413
|
-
await rest.delete(rest.routes.channels.
|
|
1478
|
+
await rest.delete(rest.routes.channels.messagePin(channelId, messageId), {
|
|
1414
1479
|
reason
|
|
1415
1480
|
});
|
|
1416
1481
|
},
|
|
@@ -1512,6 +1577,63 @@ function createRestManager(options) {
|
|
|
1512
1577
|
reason
|
|
1513
1578
|
});
|
|
1514
1579
|
},
|
|
1580
|
+
async listApplicationRoleConnectionsMetadataRecords (applicationId) {
|
|
1581
|
+
return await rest.get(rest.routes.applicationRoleConnectionMetadata(applicationId));
|
|
1582
|
+
},
|
|
1583
|
+
async updateApplicationRoleConnectionsMetadataRecords (applicationId, options) {
|
|
1584
|
+
return await rest.put(rest.routes.applicationRoleConnectionMetadata(applicationId), {
|
|
1585
|
+
body: options
|
|
1586
|
+
});
|
|
1587
|
+
},
|
|
1588
|
+
async createLobby (options) {
|
|
1589
|
+
return await rest.post(rest.routes.lobby.create(), {
|
|
1590
|
+
body: options
|
|
1591
|
+
});
|
|
1592
|
+
},
|
|
1593
|
+
async getLobby (lobbyId) {
|
|
1594
|
+
return await rest.get(rest.routes.lobby.lobby(lobbyId));
|
|
1595
|
+
},
|
|
1596
|
+
async modifyLobby (lobbyId, options) {
|
|
1597
|
+
return await rest.patch(rest.routes.lobby.lobby(lobbyId), {
|
|
1598
|
+
body: options
|
|
1599
|
+
});
|
|
1600
|
+
},
|
|
1601
|
+
async deleteLobby (lobbyId) {
|
|
1602
|
+
return await rest.delete(rest.routes.lobby.lobby(lobbyId));
|
|
1603
|
+
},
|
|
1604
|
+
async addMemberToLobby (lobbyId, userId, options) {
|
|
1605
|
+
return await rest.put(rest.routes.lobby.member(lobbyId, userId), {
|
|
1606
|
+
body: options
|
|
1607
|
+
});
|
|
1608
|
+
},
|
|
1609
|
+
async removeMemberFromLobby (lobbyId, userId) {
|
|
1610
|
+
return await rest.delete(rest.routes.lobby.member(lobbyId, userId));
|
|
1611
|
+
},
|
|
1612
|
+
async leaveLobby (lobbyId, bearerToken) {
|
|
1613
|
+
return await rest.delete(rest.routes.lobby.leave(lobbyId), {
|
|
1614
|
+
headers: {
|
|
1615
|
+
authorization: `Bearer ${bearerToken}`
|
|
1616
|
+
},
|
|
1617
|
+
unauthorized: true
|
|
1618
|
+
});
|
|
1619
|
+
},
|
|
1620
|
+
async linkChannelToLobby (lobbyId, bearerToken, options) {
|
|
1621
|
+
return await rest.patch(rest.routes.lobby.link(lobbyId), {
|
|
1622
|
+
body: options,
|
|
1623
|
+
headers: {
|
|
1624
|
+
authorization: `Bearer ${bearerToken}`
|
|
1625
|
+
},
|
|
1626
|
+
unauthorized: true
|
|
1627
|
+
});
|
|
1628
|
+
},
|
|
1629
|
+
async unlinkChannelToLobby (lobbyId, bearerToken) {
|
|
1630
|
+
return await rest.patch(rest.routes.lobby.link(lobbyId), {
|
|
1631
|
+
headers: {
|
|
1632
|
+
authorization: `Bearer ${bearerToken}`
|
|
1633
|
+
},
|
|
1634
|
+
unauthorized: true
|
|
1635
|
+
});
|
|
1636
|
+
},
|
|
1515
1637
|
preferSnakeCase (enabled) {
|
|
1516
1638
|
const camelizer = enabled ? (x)=>x : _utils.camelize;
|
|
1517
1639
|
rest.get = async (url, options)=>{
|
|
@@ -1542,4 +1664,4 @@ var HttpResponseCode = /*#__PURE__*/ function(HttpResponseCode) {
|
|
|
1542
1664
|
return HttpResponseCode;
|
|
1543
1665
|
}(HttpResponseCode || {});
|
|
1544
1666
|
|
|
1545
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ25vZGU6YnVmZmVyJ1xuaW1wb3J0IHtcbiAgdHlwZSBCaWdTdHJpbmcsXG4gIHR5cGUgQ2FtZWxpemUsXG4gIHR5cGUgRGlzY29yZEFjY2Vzc1Rva2VuUmVzcG9uc2UsXG4gIHR5cGUgRGlzY29yZEFjdGl2aXR5SW5zdGFuY2UsXG4gIHR5cGUgRGlzY29yZEFwcGxpY2F0aW9uLFxuICB0eXBlIERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQsXG4gIHR5cGUgRGlzY29yZEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24sXG4gIHR5cGUgRGlzY29yZEF1ZGl0TG9nLFxuICB0eXBlIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGUsXG4gIHR5cGUgRGlzY29yZEJhbixcbiAgdHlwZSBEaXNjb3JkQnVsa0JhbixcbiAgdHlwZSBEaXNjb3JkQ2hhbm5lbCxcbiAgdHlwZSBEaXNjb3JkQ29ubmVjdGlvbixcbiAgdHlwZSBEaXNjb3JkQ3VycmVudEF1dGhvcml6YXRpb24sXG4gIHR5cGUgRGlzY29yZEVtb2ppLFxuICB0eXBlIERpc2NvcmRFbnRpdGxlbWVudCxcbiAgdHlwZSBEaXNjb3JkRm9sbG93ZWRDaGFubmVsLFxuICB0eXBlIERpc2NvcmRHZXRBbnN3ZXJWb3Rlc1Jlc3BvbnNlLFxuICB0eXBlIERpc2NvcmRHZXRHYXRld2F5Qm90LFxuICB0eXBlIERpc2NvcmRHdWlsZCxcbiAgdHlwZSBEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyxcbiAgdHlwZSBEaXNjb3JkR3VpbGRPbmJvYXJkaW5nLFxuICB0eXBlIERpc2NvcmRHdWlsZFByZXZpZXcsXG4gIHR5cGUgRGlzY29yZEd1aWxkV2lkZ2V0LFxuICB0eXBlIERpc2NvcmRHdWlsZFdpZGdldFNldHRpbmdzLFxuICB0eXBlIERpc2NvcmRJbnRlZ3JhdGlvbixcbiAgdHlwZSBEaXNjb3JkSW50ZXJhY3Rpb25DYWxsYmFja1Jlc3BvbnNlLFxuICB0eXBlIERpc2NvcmRJbnZpdGUsXG4gIHR5cGUgRGlzY29yZEludml0ZU1ldGFkYXRhLFxuICB0eXBlIERpc2NvcmRMaXN0QWN0aXZlVGhyZWFkcyxcbiAgdHlwZSBEaXNjb3JkTGlzdEFyY2hpdmVkVGhyZWFkcyxcbiAgdHlwZSBEaXNjb3JkTWVtYmVyLFxuICB0eXBlIERpc2NvcmRNZW1iZXJXaXRoVXNlcixcbiAgdHlwZSBEaXNjb3JkTWVzc2FnZSxcbiAgdHlwZSBEaXNjb3JkUHJ1bmVkQ291bnQsXG4gIHR5cGUgRGlzY29yZFJvbGUsXG4gIHR5cGUgRGlzY29yZFNjaGVkdWxlZEV2ZW50LFxuICB0eXBlIERpc2NvcmRTa3UsXG4gIHR5cGUgRGlzY29yZFNvdW5kYm9hcmRTb3VuZCxcbiAgdHlwZSBEaXNjb3JkU3RhZ2VJbnN0YW5jZSxcbiAgdHlwZSBEaXNjb3JkU3RpY2tlcixcbiAgdHlwZSBEaXNjb3JkU3RpY2tlclBhY2ssXG4gIHR5cGUgRGlzY29yZFN1YnNjcmlwdGlvbixcbiAgdHlwZSBEaXNjb3JkVGVtcGxhdGUsXG4gIHR5cGUgRGlzY29yZFRocmVhZE1lbWJlcixcbiAgdHlwZSBEaXNjb3JkVXNlcixcbiAgdHlwZSBEaXNjb3JkVmFuaXR5VXJsLFxuICB0eXBlIERpc2NvcmRWb2ljZVJlZ2lvbixcbiAgdHlwZSBEaXNjb3JkVm9pY2VTdGF0ZSxcbiAgdHlwZSBEaXNjb3JkV2ViaG9vayxcbiAgdHlwZSBEaXNjb3JkV2VsY29tZVNjcmVlbixcbiAgSW50ZXJhY3Rpb25SZXNwb25zZVR5cGVzLFxuICB0eXBlIE1mYUxldmVscyxcbiAgdHlwZSBNb2RpZnlHdWlsZFRlbXBsYXRlLFxufSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB7XG4gIERJU0NPUkRFTk9fVkVSU0lPTixcbiAgY2FsY3VsYXRlQml0cyxcbiAgY2FtZWxUb1NuYWtlQ2FzZSxcbiAgY2FtZWxpemUsXG4gIGRlbGF5LFxuICBnZXRCb3RJZEZyb21Ub2tlbixcbiAgbG9nZ2VyLFxuICBwcm9jZXNzUmVhY3Rpb25TdHJpbmcsXG4gIHVybFRvQmFzZTY0XG59IGZyb20gJ0BkaXNjb3JkZW5vL3V0aWxzJ1xuaW1wb3J0IHsgY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQgfSBmcm9tICcuL2ludmFsaWRCdWNrZXQuanMnXG5pbXBvcnQgeyBRdWV1ZSB9IGZyb20gJy4vcXVldWUuanMnXG5pbXBvcnQgeyBjcmVhdGVSb3V0ZXMgfSBmcm9tICcuL3JvdXRlcy5qcydcbmltcG9ydCB0eXBlIHsgQ3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCBDcmVhdGVSZXN0TWFuYWdlck9wdGlvbnMsIE1ha2VSZXF1ZXN0T3B0aW9ucywgUmVzdE1hbmFnZXIsIFNlbmRSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vdHlwZXMuanMnXG5cbmV4cG9ydCBjb25zdCBESVNDT1JEX0FQSV9WRVJTSU9OID0gMTBcbmV4cG9ydCBjb25zdCBESVNDT1JEX0FQSV9VUkwgPSAnaHR0cHM6Ly9kaXNjb3JkLmNvbS9hcGknXG5cbmV4cG9ydCBjb25zdCBBVURJVF9MT0dfUkVBU09OX0hFQURFUiA9ICd4LWF1ZGl0LWxvZy1yZWFzb24nXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9SRU1BSU5JTkdfSEVBREVSID0gJ3gtcmF0ZWxpbWl0LXJlbWFpbmluZydcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX1JFU0VUX0FGVEVSX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1yZXNldC1hZnRlcidcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX0dMT0JBTF9IRUFERVIgPSAneC1yYXRlbGltaXQtZ2xvYmFsJ1xuZXhwb3J0IGNvbnN0IFJBVEVfTElNSVRfQlVDS0VUX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1idWNrZXQnXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9MSU1JVF9IRUFERVIgPSAneC1yYXRlbGltaXQtbGltaXQnXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9TQ09QRV9IRUFERVIgPSAneC1yYXRlbGltaXQtc2NvcGUnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXN0TWFuYWdlcihvcHRpb25zOiBDcmVhdGVSZXN0TWFuYWdlck9wdGlvbnMpOiBSZXN0TWFuYWdlciB7XG4gIGNvbnN0IGFwcGxpY2F0aW9uSWQgPSBvcHRpb25zLmFwcGxpY2F0aW9uSWQgPyBCaWdJbnQob3B0aW9ucy5hcHBsaWNhdGlvbklkKSA6IGdldEJvdElkRnJvbVRva2VuKG9wdGlvbnMudG9rZW4pXG5cbiAgY29uc3QgYmFzZVVybCA9IG9wdGlvbnMucHJveHk/LmJhc2VVcmwgPz8gRElTQ09SRF9BUElfVVJMXG5cbiAgY29uc3QgcmVzdDogUmVzdE1hbmFnZXIgPSB7XG4gICAgYXBwbGljYXRpb25JZCxcbiAgICBhdXRob3JpemF0aW9uOiBvcHRpb25zLnByb3h5Py5hdXRob3JpemF0aW9uLFxuICAgIGF1dGhvcml6YXRpb25IZWFkZXI6IG9wdGlvbnMucHJveHk/LmF1dGhvcml6YXRpb25IZWFkZXIgPz8gJ2F1dGhvcml6YXRpb24nLFxuICAgIGJhc2VVcmwsXG4gICAgZGVsZXRlUXVldWVEZWxheTogNjAwMDAsXG4gICAgZ2xvYmFsbHlSYXRlTGltaXRlZDogZmFsc2UsXG4gICAgaW52YWxpZEJ1Y2tldDogY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQoeyBsb2dnZXI6IG9wdGlvbnMubG9nZ2VyIH0pLFxuICAgIGlzUHJveGllZDogIWJhc2VVcmwuc3RhcnRzV2l0aChESVNDT1JEX0FQSV9VUkwpLFxuICAgIHVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnQ6IG9wdGlvbnMucHJveHk/LnVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnQsXG4gICAgbWF4UmV0cnlDb3VudDogSW5maW5pdHksXG4gICAgcHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHM6IGZhbHNlLFxuICAgIHF1ZXVlczogbmV3IE1hcCgpLFxuICAgIHJhdGVMaW1pdGVkUGF0aHM6IG5ldyBNYXAoKSxcbiAgICB0b2tlbjogb3B0aW9ucy50b2tlbixcbiAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24gPz8gRElTQ09SRF9BUElfVkVSU0lPTixcbiAgICBsb2dnZXI6IG9wdGlvbnMubG9nZ2VyID8/IGxvZ2dlcixcblxuICAgIHJvdXRlczogY3JlYXRlUm91dGVzKCksXG5cbiAgICBjcmVhdGVCYXNlSGVhZGVycygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICd1c2VyLWFnZW50JzogYERpc2NvcmRCb3QgKGh0dHBzOi8vZ2l0aHViLmNvbS9kaXNjb3JkZW5vL2Rpc2NvcmRlbm8sIHYke0RJU0NPUkRFTk9fVkVSU0lPTn0pYCxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2hlY2tSYXRlTGltaXRzKHVybCwgaWRlbnRpZmllcikge1xuICAgICAgY29uc3QgcmF0ZWxpbWl0ZWQgPSByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZ2V0KGAke2lkZW50aWZpZXJ9JHt1cmx9YClcblxuICAgICAgY29uc3QgZ2xvYmFsID0gcmVzdC5yYXRlTGltaXRlZFBhdGhzLmdldCgnZ2xvYmFsJylcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcblxuICAgICAgaWYgKHJhdGVsaW1pdGVkICYmIG5vdyA8IHJhdGVsaW1pdGVkLnJlc2V0VGltZXN0YW1wKSB7XG4gICAgICAgIHJldHVybiByYXRlbGltaXRlZC5yZXNldFRpbWVzdGFtcCAtIG5vd1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2xvYmFsICYmIG5vdyA8IGdsb2JhbC5yZXNldFRpbWVzdGFtcCkge1xuICAgICAgICByZXR1cm4gZ2xvYmFsLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICBhc3luYyB1cGRhdGVUb2tlblF1ZXVlcyhvbGRUb2tlbiwgbmV3VG9rZW4pIHtcbiAgICAgIGlmIChyZXN0LmlzUHJveGllZCkge1xuICAgICAgICBpZiAoIXJlc3QudXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiVGhlICdwcm94eS51cGRhdGVCZWFyZXJUb2tlbkVuZHBvaW50JyBvcHRpb24gbmVlZHMgdG8gYmUgc2V0IHdoZW4gdXNpbmcgYSByZXN0IHByb3h5IGFuZCBuZWVkZWQgdG8gY2FsbCAndXBkYXRlVG9rZW5RdWV1ZXMnXCIsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz5cblxuICAgICAgICBpZiAocmVzdC5hdXRob3JpemF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBoZWFkZXJzW3Jlc3QuYXV0aG9yaXphdGlvbkhlYWRlcl0gPSByZXN0LmF1dGhvcml6YXRpb25cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGZldGNoKGAke3Jlc3QuYmFzZVVybH0vJHtyZXN0LnVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnR9YCwge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIG9sZFRva2VuLFxuICAgICAgICAgICAgbmV3VG9rZW4sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3SWRlbnRpZmllciA9IGBCZWFyZXIgJHtuZXdUb2tlbn1gXG5cbiAgICAgIC8vIFVwZGF0ZSBhbGwgdGhlIHF1ZXVlc1xuICAgICAgZm9yIChjb25zdCBba2V5LCBxdWV1ZV0gb2YgcmVzdC5xdWV1ZXMuZW50cmllcygpKSB7XG4gICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoYEJlYXJlciAke29sZFRva2VufWApKSBjb250aW51ZVxuXG4gICAgICAgIHJlc3QucXVldWVzLmRlbGV0ZShrZXkpXG4gICAgICAgIHF1ZXVlLmlkZW50aWZpZXIgPSBuZXdJZGVudGlmaWVyXG5cbiAgICAgICAgY29uc3QgbmV3S2V5ID0gYCR7bmV3SWRlbnRpZmllcn0ke3F1ZXVlLnVybH1gXG4gICAgICAgIGNvbnN0IG5ld1F1ZXVlID0gcmVzdC5xdWV1ZXMuZ2V0KG5ld0tleSlcblxuICAgICAgICAvLyBNZXJnZSB0aGUgcXVldWVzXG4gICAgICAgIGlmIChuZXdRdWV1ZSkge1xuICAgICAgICAgIG5ld1F1ZXVlLndhaXRpbmcudW5zaGlmdCguLi5xdWV1ZS53YWl0aW5nKVxuICAgICAgICAgIG5ld1F1ZXVlLnBlbmRpbmcudW5zaGlmdCguLi5xdWV1ZS5wZW5kaW5nKVxuXG4gICAgICAgICAgcXVldWUud2FpdGluZyA9IFtdXG4gICAgICAgICAgcXVldWUucGVuZGluZyA9IFtdXG5cbiAgICAgICAgICBxdWV1ZS5jbGVhbnVwKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN0LnF1ZXVlcy5zZXQobmV3S2V5LCBxdWV1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHJhdGVsaW1pdFBhdGhdIG9mIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChgQmVhcmVyICR7b2xkVG9rZW59YCkpIGNvbnRpbnVlXG5cbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChgJHtuZXdJZGVudGlmaWVyfSR7cmF0ZWxpbWl0UGF0aC51cmx9YCwgcmF0ZWxpbWl0UGF0aClcblxuICAgICAgICBpZiAocmF0ZWxpbWl0UGF0aC5idWNrZXRJZCkge1xuICAgICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoYCR7bmV3SWRlbnRpZmllcn0ke3JhdGVsaW1pdFBhdGguYnVja2V0SWR9YCwgcmF0ZWxpbWl0UGF0aClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjaGFuZ2VUb0Rpc2NvcmRGb3JtYXQob2JqOiBhbnkpOiBhbnkge1xuICAgICAgaWYgKG9iaiA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICByZXR1cm4gb2JqLm1hcCgoaXRlbSkgPT4gcmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQoaXRlbSkpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdPYmo6IGFueSA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV1cblxuICAgICAgICAgIC8vIElmIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiBzbmFrZV9jYXNlIHdlIGNhbiBhc3N1bWUgaXQgaXMgYWxyZWFkeSBpbiB0aGUgZGlzY29yZCBmb3JtYXQuXG4gICAgICAgICAgaWYgKGtleS5pbmNsdWRlcygnXycpKSB7XG4gICAgICAgICAgICBuZXdPYmpba2V5XSA9IHZhbHVlXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNvbWUgZmFsc3kgdmFsdWVzIHNob3VsZCBiZSBhbGxvd2VkIGxpa2UgbnVsbCBvciAwXG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICAgIGNhc2UgJ3Blcm1pc3Npb25zJzpcbiAgICAgICAgICAgICAgY2FzZSAnYWxsb3cnOlxuICAgICAgICAgICAgICBjYXNlICdkZW55JzpcbiAgICAgICAgICAgICAgICBuZXdPYmpba2V5XSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IGNhbGN1bGF0ZUJpdHModmFsdWUpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgY2FzZSAnZGVmYXVsdE1lbWJlclBlcm1pc3Npb25zJzpcbiAgICAgICAgICAgICAgICBuZXdPYmouZGVmYXVsdF9tZW1iZXJfcGVybWlzc2lvbnMgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBjYWxjdWxhdGVCaXRzKHZhbHVlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIGNhc2UgJ25hbWVMb2NhbGl6YXRpb25zJzpcbiAgICAgICAgICAgICAgICBuZXdPYmoubmFtZV9sb2NhbGl6YXRpb25zID0gdmFsdWVcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICBjYXNlICdkZXNjcmlwdGlvbkxvY2FsaXphdGlvbnMnOlxuICAgICAgICAgICAgICAgIG5ld09iai5kZXNjcmlwdGlvbl9sb2NhbGl6YXRpb25zID0gdmFsdWVcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5ld09ialtjYW1lbFRvU25ha2VDYXNlKGtleSldID0gcmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQodmFsdWUpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3T2JqXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYmlnaW50JykgcmV0dXJuIG9iai50b1N0cmluZygpXG5cbiAgICAgIHJldHVybiBvYmpcbiAgICB9LFxuXG4gICAgY3JlYXRlUmVxdWVzdEJvZHkobWV0aG9kLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5jcmVhdGVCYXNlSGVhZGVycygpXG5cbiAgICAgIGlmIChvcHRpb25zPy51bmF1dGhvcml6ZWQgIT09IHRydWUpIGhlYWRlcnMuYXV0aG9yaXphdGlvbiA9IGBCb3QgJHtyZXN0LnRva2VufWBcblxuICAgICAgLy8gSUYgQSBSRUFTT04gSVMgUFJPVklERUQgRU5DT0RFIElUIElOIEhFQURFUlNcbiAgICAgIGlmIChvcHRpb25zPy5yZWFzb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW0FVRElUX0xPR19SRUFTT05fSEVBREVSXSA9IGVuY29kZVVSSUNvbXBvbmVudChvcHRpb25zPy5yZWFzb24pXG4gICAgICB9XG5cbiAgICAgIGxldCBib2R5OiBzdHJpbmcgfCBGb3JtRGF0YSB8IHVuZGVmaW5lZFxuXG4gICAgICAvLyBUT0RPOiBjaGVjayBpZiB3ZSBuZWVkIHRvIGFkZCBzcGVjaWZpYyBjaGVjayBmb3IgR0VUIG1ldGhvZFxuICAgICAgLy8gU2luY2UgR0VUIGRvZXMgbm90IGFsbG93IGJvZGllc1xuXG4gICAgICAvLyBIYXZlIHRvIGNoZWNrIGZvciBhdHRhY2htZW50cyBmaXJzdCwgc2luY2UgYm9keSB0aGVuIGhhcyB0byBiZSBzZW5kIGluIGEgZGlmZmVyZW50IHdheS5cbiAgICAgIGlmIChvcHRpb25zPy5maWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnMuZmlsZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBmb3JtLmFwcGVuZChgZmlsZXNbJHtpfV1gLCBvcHRpb25zLmZpbGVzW2ldLmJsb2IsIG9wdGlvbnMuZmlsZXNbaV0ubmFtZSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhdmUgdG8gdXNlIGNoYW5nZVRvRGlzY29yZEZvcm1hdCBvciBlbHNlIEpTT04uc3RyaW5naWZ5IG1heSB0aHJvdyBhbiBlcnJvciBmb3IgdGhlIHByZXNlbmNlIG9mIEJpZ0ludChzKSBpbiB0aGUganNvblxuICAgICAgICBmb3JtLmFwcGVuZCgncGF5bG9hZF9qc29uJywgSlNPTi5zdHJpbmdpZnkocmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQoeyAuLi5vcHRpb25zLmJvZHksIGZpbGVzOiB1bmRlZmluZWQgfSkpKVxuXG4gICAgICAgIC8vIE5vIG5lZWQgdG8gc2V0IHRoZSBgY29udGVudC10eXBlYCBoZWFkZXIgc2luY2UgYGZldGNoYCBkb2VzIHRoYXQgYXV0b21hdGljYWxseSBmb3IgdXMgd2hlbiB3ZSB1c2UgYSBgRm9ybURhdGFgIG9iamVjdC5cbiAgICAgICAgYm9keSA9IGZvcm1cbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uYm9keSAmJiBvcHRpb25zLmhlYWRlcnMgJiYgb3B0aW9ucy5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9PT0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpIHtcbiAgICAgICAgLy8gT0F1dGgyIGJvZHkgaGFuZGxpbmdcbiAgICAgICAgY29uc3QgZm9ybUJvZHk6IHN0cmluZ1tdID0gW11cblxuICAgICAgICBjb25zdCBkaXNjb3JkQm9keSA9IHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KG9wdGlvbnMuYm9keSlcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gZGlzY29yZEJvZHkpIHtcbiAgICAgICAgICBmb3JtQm9keS5wdXNoKGAke2VuY29kZVVSSUNvbXBvbmVudChwcm9wKX09JHtlbmNvZGVVUklDb21wb25lbnQoZGlzY29yZEJvZHlbcHJvcF0pfWApXG4gICAgICAgIH1cblxuICAgICAgICBib2R5ID0gZm9ybUJvZHkuam9pbignJicpXG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnM/LmJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAob3B0aW9ucy5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgICAgICBib2R5ID0gb3B0aW9ucy5ib2R5XG4gICAgICAgICAgLy8gTm8gbmVlZCB0byBzZXQgdGhlIGBjb250ZW50LXR5cGVgIGhlYWRlciBzaW5jZSBgZmV0Y2hgIGRvZXMgdGhhdCBhdXRvbWF0aWNhbGx5IGZvciB1cyB3aGVuIHdlIHVzZSBhIGBGb3JtRGF0YWAgb2JqZWN0LlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShyZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdChvcHRpb25zLmJvZHkpKVxuICAgICAgICAgIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gYGFwcGxpY2F0aW9uL2pzb25gXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU09NRVRJTUVTIFNQRUNJQUwgSEVBREVSUyAoRS5HLiBDVVNUT00gQVVUSE9SSVpBVElPTikgTkVFRCBUTyBCRSBVU0VEXG4gICAgICBpZiAob3B0aW9ucz8uaGVhZGVycykge1xuICAgICAgICBPYmplY3QuYXNzaWduKGhlYWRlcnMsIG9wdGlvbnMuaGVhZGVycylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocygpIHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcblxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcmVzdC5yYXRlTGltaXRlZFBhdGhzLmVudHJpZXMoKSkge1xuICAgICAgICAvLyAgIHJlc3QuZGVidWcoXG4gICAgICAgIC8vIGBbUkVTVCAtIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzXSBSdW5uaW5nIGZvciBvZiBsb29wLiAke1xuICAgICAgICAvLyAgIHZhbHVlLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICAgIC8vIH1gXG4gICAgICAgIC8vICAgKVxuICAgICAgICAvLyBJZiB0aGUgdGltZSBoYXMgbm90IHJlYWNoZWQgY2FuY2VsXG4gICAgICAgIGlmICh2YWx1ZS5yZXNldFRpbWVzdGFtcCA+IG5vdykgY29udGludWVcblxuICAgICAgICAvLyBSYXRlIGxpbWl0IGlzIG92ZXIsIGRlbGV0ZSB0aGUgcmF0ZSBsaW1pdGVyXG4gICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5kZWxldGUoa2V5KVxuICAgICAgICAvLyBJZiBpdCB3YXMgZ2xvYmFsLCBhbHNvIG1hcmsgdGhlIGdsb2JhbCB2YWx1ZSBhcyBmYWxzZVxuICAgICAgICBpZiAoa2V5ID09PSAnZ2xvYmFsJykgcmVzdC5nbG9iYWxseVJhdGVMaW1pdGVkID0gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gQUxMIFBBVEhTIEFSRSBDTEVBUkVEIENBTiBDQU5DRUwgT1VUIVxuICAgICAgaWYgKHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zaXplID09PSAwKSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMgPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyA9IHRydWVcbiAgICAgICAgLy8gUkVDSEVDSyBJTiAxIFNFQ09ORFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAvLyByZXN0LmRlYnVnKCdbUkVTVCAtIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzXSBSdW5uaW5nIHNldFRpbWVvdXQuJylcbiAgICAgICAgICByZXN0LnByb2Nlc3NSYXRlTGltaXRlZFBhdGhzKClcbiAgICAgICAgfSwgMTAwMClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqIFByb2Nlc3NlcyB0aGUgcmF0ZSBsaW1pdCBoZWFkZXJzIGFuZCBkZXRlcm1pbmVzIGlmIGl0IG5lZWRzIHRvIGJlIHJhdGUgbGltaXRlZCBhbmQgcmV0dXJucyB0aGUgYnVja2V0IGlkIGlmIGF2YWlsYWJsZSAqL1xuICAgIHByb2Nlc3NIZWFkZXJzKHVybCwgaGVhZGVycywgaWRlbnRpZmllcikge1xuICAgICAgbGV0IHJhdGVMaW1pdGVkID0gZmFsc2VcblxuICAgICAgLy8gR0VUIEFMTCBORUNFU1NBUlkgSEVBREVSU1xuICAgICAgY29uc3QgcmVtYWluaW5nID0gaGVhZGVycy5nZXQoUkFURV9MSU1JVF9SRU1BSU5JTkdfSEVBREVSKVxuICAgICAgY29uc3QgcmV0cnlBZnRlciA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSKVxuICAgICAgY29uc3QgcmVzZXQgPSBEYXRlLm5vdygpICsgTnVtYmVyKHJldHJ5QWZ0ZXIpICogMTAwMFxuICAgICAgY29uc3QgZ2xvYmFsID0gaGVhZGVycy5nZXQoUkFURV9MSU1JVF9HTE9CQUxfSEVBREVSKVxuICAgICAgLy8gdW5kZWZpbmVkIG92ZXJyaWRlIG51bGwgbmVlZGVkIGZvciB0eXBpbmdzXG4gICAgICBjb25zdCBidWNrZXRJZCA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfQlVDS0VUX0hFQURFUikgPz8gdW5kZWZpbmVkXG4gICAgICBjb25zdCBsaW1pdCA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfTElNSVRfSEVBREVSKVxuXG4gICAgICAvLyBJZiB3ZSBkaWRuJ3QgcmVjZWl2ZWQgdGhlIGlkZW50aWZpZXIsIGZhbGxiYWNrIHRvIHRoZSBib3QgdG9rZW5cbiAgICAgIGlkZW50aWZpZXIgPz89IGBCb3QgJHtyZXN0LnRva2VufWBcblxuICAgICAgcmVzdC5xdWV1ZXMuZ2V0KGAke2lkZW50aWZpZXJ9JHt1cmx9YCk/LmhhbmRsZUNvbXBsZXRlZFJlcXVlc3Qoe1xuICAgICAgICByZW1haW5pbmc6IHJlbWFpbmluZyA/IE51bWJlcihyZW1haW5pbmcpIDogdW5kZWZpbmVkLFxuICAgICAgICBpbnRlcnZhbDogcmV0cnlBZnRlciA/IE51bWJlcihyZXRyeUFmdGVyKSAqIDEwMDAgOiB1bmRlZmluZWQsXG4gICAgICAgIG1heDogbGltaXQgPyBOdW1iZXIobGltaXQpIDogdW5kZWZpbmVkLFxuICAgICAgfSlcblxuICAgICAgLy8gSUYgVEhFUkUgSVMgTk8gUkVNQUlOSU5HIFJBVEUgTElNSVQsIE1BUksgSVQgQVMgUkFURSBMSU1JVEVEXG4gICAgICBpZiAocmVtYWluaW5nID09PSAnMCcpIHtcbiAgICAgICAgcmF0ZUxpbWl0ZWQgPSB0cnVlXG5cbiAgICAgICAgLy8gU0FWRSBUSEUgVVJMIEFTIExJTUlURUQsIElNUE9SVEFOVCBGT1IgTkVXIFJFUVVFU1RTIEJZIFVTRVIgV0lUSE9VVCBCVUNLRVRcbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChgJHtpZGVudGlmaWVyfSR7dXJsfWAsIHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IHJlc2V0LFxuICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIFNBVkUgVEhFIEJVQ0tFVCBBUyBMSU1JVEVEIFNJTkNFIERJRkZFUkVOVCBVUkxTIE1BWSBTSEFSRSBBIEJVQ0tFVFxuICAgICAgICBpZiAoYnVja2V0SWQpIHtcbiAgICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGAke2lkZW50aWZpZXJ9JHtidWNrZXRJZH1gLCB7XG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICByZXNldFRpbWVzdGFtcDogcmVzZXQsXG4gICAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElGIFRIRVJFIElTIE5PIFJFTUFJTklORyBHTE9CQUwgTElNSVQsIE1BUksgSVQgUkFURSBMSU1JVEVEIEdMT0JBTExZXG4gICAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSBOdW1iZXIoaGVhZGVycy5nZXQoJ3JldHJ5LWFmdGVyJykpICogMTAwMFxuICAgICAgICBjb25zdCBnbG9iYWxSZXNldCA9IERhdGUubm93KCkgKyByZXRyeUFmdGVyXG4gICAgICAgIC8vICAgcmVzdC5kZWJ1ZyhcbiAgICAgICAgLy8gYFtSRVNUID0gR2xvYmFsbHkgUmF0ZSBMaW1pdGVkXSBVUkw6ICR7dXJsfSB8IEdsb2JhbCBSZXN0OiAke2dsb2JhbFJlc2V0fWBcbiAgICAgICAgLy8gICApXG4gICAgICAgIHJlc3QuZ2xvYmFsbHlSYXRlTGltaXRlZCA9IHRydWVcbiAgICAgICAgcmF0ZUxpbWl0ZWQgPSB0cnVlXG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVzdC5nbG9iYWxseVJhdGVMaW1pdGVkID0gZmFsc2VcbiAgICAgICAgfSwgcmV0cnlBZnRlcilcblxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KCdnbG9iYWwnLCB7XG4gICAgICAgICAgdXJsOiAnZ2xvYmFsJyxcbiAgICAgICAgICByZXNldFRpbWVzdGFtcDogZ2xvYmFsUmVzZXQsXG4gICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGJ1Y2tldElkKSB7XG4gICAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChpZGVudGlmaWVyLCB7XG4gICAgICAgICAgICB1cmw6ICdnbG9iYWwnLFxuICAgICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IGdsb2JhbFJlc2V0LFxuICAgICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmF0ZUxpbWl0ZWQgJiYgIXJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMpIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocygpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmF0ZUxpbWl0ZWQgPyBidWNrZXRJZCA6IHVuZGVmaW5lZFxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kUmVxdWVzdChvcHRpb25zKSB7XG4gICAgICBjb25zdCB1cmwgPSBgJHtyZXN0LmJhc2VVcmx9L3Yke3Jlc3QudmVyc2lvbn0ke29wdGlvbnMucm91dGV9YFxuICAgICAgY29uc3QgcGF5bG9hZCA9IHJlc3QuY3JlYXRlUmVxdWVzdEJvZHkob3B0aW9ucy5tZXRob2QsIG9wdGlvbnMucmVxdWVzdEJvZHlPcHRpb25zKVxuXG4gICAgICBjb25zdCBsb2dnaW5nSGVhZGVycyA9IHsgLi4ucGF5bG9hZC5oZWFkZXJzIH1cblxuICAgICAgaWYgKHBheWxvYWQuaGVhZGVycy5hdXRob3JpemF0aW9uKSB7XG4gICAgICAgIGNvbnN0IGF1dGhvcml6YXRpb25TY2hlbWUgPSBwYXlsb2FkLmhlYWRlcnMuYXV0aG9yaXphdGlvbj8uc3BsaXQoJyAnKVswXVxuICAgICAgICBsb2dnaW5nSGVhZGVycy5hdXRob3JpemF0aW9uID0gYCR7YXV0aG9yaXphdGlvblNjaGVtZX0gdG9rZW5oZXJlYFxuICAgICAgfVxuXG4gICAgICByZXN0LmxvZ2dlci5kZWJ1Zyhgc2VuZGluZyByZXF1ZXN0IHRvICR7dXJsfWAsICd3aXRoIHBheWxvYWQ6JywgeyAuLi5wYXlsb2FkLCBoZWFkZXJzOiBsb2dnaW5nSGVhZGVycyB9KVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHBheWxvYWQpLmNhdGNoKGFzeW5jIChlcnJvcikgPT4ge1xuICAgICAgICByZXN0LmxvZ2dlci5lcnJvcihlcnJvcilcbiAgICAgICAgLy8gTWFyayByZXF1ZXN0IGFuZCBjb21wbGV0ZWRcbiAgICAgICAgcmVzdC5pbnZhbGlkQnVja2V0LmhhbmRsZUNvbXBsZXRlZFJlcXVlc3QoOTk5LCBmYWxzZSlcbiAgICAgICAgb3B0aW9ucy5yZWplY3Qoe1xuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBzdGF0dXM6IDk5OSxcbiAgICAgICAgICBlcnJvcjogJ1Bvc3NpYmxlIG5ldHdvcmsgb3IgcmVxdWVzdCBzaGFwZSBpc3N1ZSBvY2N1cnJlZC4gSWYgdGhpcyBpcyByYXJlLCBpdHMgYSBuZXR3b3JrIGdsaXRjaC4gSWYgaXQgb2NjdXJzIGEgbG90IHNvbWV0aGluZyBpcyB3cm9uZy4nLFxuICAgICAgICB9KVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfSlcbiAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGByZXF1ZXN0IGZldGNoZWQgZnJvbSAke3VybH0gd2l0aCBzdGF0dXMgJHtyZXNwb25zZS5zdGF0dXN9ICYgJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApXG5cbiAgICAgIC8vIE1hcmsgcmVxdWVzdCBhbmQgY29tcGxldGVkXG4gICAgICByZXN0LmludmFsaWRCdWNrZXQuaGFuZGxlQ29tcGxldGVkUmVxdWVzdChyZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfU0NPUEVfSEVBREVSKSA9PT0gJ3NoYXJlZCcpXG5cbiAgICAgIC8vIFNldCB0aGUgYnVja2V0IGlkIGlmIGl0IHdhcyBhdmFpbGFibGUgb24gdGhlIGhlYWRlcnNcbiAgICAgIGNvbnN0IGJ1Y2tldElkID0gcmVzdC5wcm9jZXNzSGVhZGVycyhyZXN0LnNpbXBsaWZ5VXJsKG9wdGlvbnMucm91dGUsIG9wdGlvbnMubWV0aG9kKSwgcmVzcG9uc2UuaGVhZGVycywgcGF5bG9hZC5oZWFkZXJzLmF1dGhvcml6YXRpb24pXG5cbiAgICAgIGlmIChidWNrZXRJZCkgb3B0aW9ucy5idWNrZXRJZCA9IGJ1Y2tldElkXG5cbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPCBIdHRwUmVzcG9uc2VDb2RlLlN1Y2Nlc3MgfHwgcmVzcG9uc2Uuc3RhdHVzID49IEh0dHBSZXNwb25zZUNvZGUuRXJyb3IpIHtcbiAgICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYFJlcXVlc3QgdG8gJHt1cmx9IGZhaWxlZC5gKVxuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IEh0dHBSZXNwb25zZUNvZGUuVG9vTWFueVJlcXVlc3RzKSB7XG4gICAgICAgICAgb3B0aW9ucy5yZWplY3QoeyBvazogZmFsc2UsIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBib2R5OiBhd2FpdCByZXNwb25zZS50ZXh0KCkgfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGBSZXF1ZXN0IHRvICR7dXJsfSB3YXMgcmF0ZWxpbWl0ZWQuYClcbiAgICAgICAgLy8gVG9vIG1hbnkgYXR0ZW1wdHMsIGdldCByaWQgb2YgcmVxdWVzdCBmcm9tIHF1ZXVlLlxuICAgICAgICBpZiAob3B0aW9ucy5yZXRyeUNvdW50ID49IHJlc3QubWF4UmV0cnlDb3VudCkge1xuICAgICAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGBSZXF1ZXN0IHRvICR7dXJsfSBleGNlZWRlZCB0aGUgbWF4aW11bSBhbGxvd2VkIHJldHJpZXMuYCwgJ3dpdGggcGF5bG9hZDonLCBwYXlsb2FkKVxuICAgICAgICAgIC8vIHJlc3QuZGVidWcoYFtSRVNUIC0gUmV0cmllc01heGVkXSAke0pTT04uc3RyaW5naWZ5KG9wdGlvbnMpfWApXG4gICAgICAgICAgb3B0aW9ucy5yZWplY3Qoe1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgICBlcnJvcjogJ1RoZSByZXF1ZXN0IHdhcyByYXRlIGxpbWl0ZWQgYW5kIGl0IG1heGVkIG91dCB0aGUgcmV0cmllcyBsaW1pdC4nLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMucmV0cnlDb3VudCArPSAxXG5cbiAgICAgICAgY29uc3QgcmVzZXRBZnRlciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSKVxuICAgICAgICBpZiAocmVzZXRBZnRlcikgYXdhaXQgZGVsYXkoTnVtYmVyKHJlc2V0QWZ0ZXIpICogMTAwMClcbiAgICAgICAgLy8gcHJvY2VzcyB0aGUgcmVzcG9uc2UgdG8gcHJldmVudCBtZW0gbGVha1xuICAgICAgICBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IG9wdGlvbnMucmV0cnlSZXF1ZXN0Py4ob3B0aW9ucylcbiAgICAgIH1cblxuICAgICAgLy8gRGlzY29yZCBzb21ldGltZXMgc2VuZHMgbm8gcmVzcG9uc2Ugd2l0aCBubyBjb250ZW50LlxuICAgICAgb3B0aW9ucy5yZXNvbHZlKHsgb2s6IHRydWUsIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBib2R5OiByZXNwb25zZS5zdGF0dXMgPT09IEh0dHBSZXNwb25zZUNvZGUuTm9Db250ZW50ID8gdW5kZWZpbmVkIDogYXdhaXQgcmVzcG9uc2UudGV4dCgpIH0pXG4gICAgfSxcblxuICAgIHNpbXBsaWZ5VXJsKHVybCwgbWV0aG9kKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IHVybC5zcGxpdCgnLycpXG4gICAgICBjb25zdCBzZWNvbmRMYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDJdXG5cbiAgICAgIGlmIChzZWNvbmRMYXN0UGFydCA9PT0gJ2NoYW5uZWxzJyB8fCBzZWNvbmRMYXN0UGFydCA9PT0gJ2d1aWxkcycpIHtcbiAgICAgICAgcmV0dXJuIHVybFxuICAgICAgfVxuXG4gICAgICBpZiAoc2Vjb25kTGFzdFBhcnQgPT09ICdyZWFjdGlvbnMnIHx8IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdID09PSAnQG1lJykge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoLTIpXG4gICAgICAgIHBhcnRzLnB1c2goJ3JlYWN0aW9ucycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoLTEpXG4gICAgICAgIHBhcnRzLnB1c2goJ3gnKVxuICAgICAgfVxuXG4gICAgICBpZiAocGFydHNbcGFydHMubGVuZ3RoIC0gM10gPT09ICdyZWFjdGlvbnMnKSB7XG4gICAgICAgIHBhcnRzLnNwbGljZSgtMilcbiAgICAgIH1cblxuICAgICAgaWYgKG1ldGhvZCA9PT0gJ0RFTEVURScgJiYgc2Vjb25kTGFzdFBhcnQgPT09ICdtZXNzYWdlcycpIHtcbiAgICAgICAgcmV0dXJuIGBEJHtwYXJ0cy5qb2luKCcvJyl9YFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFydHMuam9pbignLycpXG4gICAgfSxcblxuICAgIGFzeW5jIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3Q6IFNlbmRSZXF1ZXN0T3B0aW9ucykge1xuICAgICAgY29uc3QgdXJsID0gcmVzdC5zaW1wbGlmeVVybChyZXF1ZXN0LnJvdXRlLCByZXF1ZXN0Lm1ldGhvZClcblxuICAgICAgaWYgKHJlcXVlc3QucnVuVGhyb3VnaFF1ZXVlID09PSBmYWxzZSkge1xuICAgICAgICBhd2FpdCByZXN0LnNlbmRSZXF1ZXN0KHJlcXVlc3QpXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIElmIHdlIHRoZSByZXF1ZXN0IGhhcyBhIHRva2VuLCB1c2UgaXRcbiAgICAgIC8vIEVsc2UgZmFsbGJhY2sgdG8gcHJlZml4IHdpdGggdGhlIGJvdCB0b2tlblxuICAgICAgY29uc3QgcXVldWVJZGVudGlmaWVyID0gcmVxdWVzdC5yZXF1ZXN0Qm9keU9wdGlvbnM/LmhlYWRlcnM/LmF1dGhvcml6YXRpb24gPz8gYEJvdCAke3Jlc3QudG9rZW59YFxuXG4gICAgICBjb25zdCBxdWV1ZSA9IHJlc3QucXVldWVzLmdldChgJHtxdWV1ZUlkZW50aWZpZXJ9JHt1cmx9YClcblxuICAgICAgaWYgKHF1ZXVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcXVldWUubWFrZVJlcXVlc3QocmVxdWVzdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENSRUFURVMgQSBORVcgUVVFVUVcbiAgICAgICAgY29uc3QgYnVja2V0UXVldWUgPSBuZXcgUXVldWUocmVzdCwgeyB1cmwsIGRlbGV0ZVF1ZXVlRGVsYXk6IHJlc3QuZGVsZXRlUXVldWVEZWxheSwgaWRlbnRpZmllcjogcXVldWVJZGVudGlmaWVyIH0pXG5cbiAgICAgICAgLy8gU2F2ZSBxdWV1ZVxuICAgICAgICByZXN0LnF1ZXVlcy5zZXQoYCR7cXVldWVJZGVudGlmaWVyfSR7dXJsfWAsIGJ1Y2tldFF1ZXVlKVxuXG4gICAgICAgIC8vIEFkZCByZXF1ZXN0IHRvIHF1ZXVlXG4gICAgICAgIGJ1Y2tldFF1ZXVlLm1ha2VSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIG1ha2VSZXF1ZXN0KG1ldGhvZCwgcm91dGUsIG9wdGlvbnMpIHtcbiAgICAgIC8vIFRoaXMgZXJyb3IgbmVlZHMgdG8gYmUgY3JlYXRlZCBoZXJlIGJlY2F1c2Ugb2YgaG93IHN0YWNrIHRyYWNlcyBnZXQgY2FsY3VsYXRlZFxuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoKVxuICAgICAgZXJyb3IubWVzc2FnZSA9ICdGYWlsZWQgdG8gc2VuZCByZXF1ZXN0IHRvIGRpc2NvcmQuJ1xuXG4gICAgICBpZiAocmVzdC5pc1Byb3hpZWQpIHtcbiAgICAgICAgaWYgKHJlc3QuYXV0aG9yaXphdGlvbikge1xuICAgICAgICAgIG9wdGlvbnMgPz89IHt9XG4gICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID8/PSB7fVxuICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1tyZXN0LmF1dGhvcml6YXRpb25IZWFkZXJdID0gcmVzdC5hdXRob3JpemF0aW9uXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaChgJHtyZXN0LmJhc2VVcmx9L3Yke3Jlc3QudmVyc2lvbn0ke3JvdXRlfWAsIHJlc3QuY3JlYXRlUmVxdWVzdEJvZHkobWV0aG9kLCBvcHRpb25zKSlcblxuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIGNvbnN0IGVyclRleHQgPSBhd2FpdCByZXN1bHQudGV4dCgpLmNhdGNoKCgpID0+IG51bGwpXG5cbiAgICAgICAgICBpZiAoZXJyVGV4dCkge1xuICAgICAgICAgICAgZXJyb3IuY2F1c2UgPSB7XG4gICAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgICAgICAgICBib2R5OiBlcnJUZXh0LFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVyciA9IChhd2FpdCByZXN1bHQuanNvbigpLmNhdGNoKCgpID0+IHt9KSkgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICAgICAgICAgIC8vIExlZ2FjeSBIYW5kbGluZyB0byBub3QgYnJlYWsgb2xkIGNvZGUgb3Igd2hlbiBib2R5IGlzIG1pc3NpbmdcbiAgICAgICAgICBpZiAoIWVycj8uYm9keSkgdGhyb3cgbmV3IEVycm9yKGBFcnJvcjogJHtlcnIubWVzc2FnZSA/PyByZXN1bHQuc3RhdHVzVGV4dH1gKVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KGVycikpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0LnN0YXR1cyAhPT0gMjA0ID8gYXdhaXQgcmVzdWx0Lmpzb24oKSA6IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBTZW5kUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgICAgcm91dGUsXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIHJlcXVlc3RCb2R5T3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgICByZXRyeUNvdW50OiAwLFxuICAgICAgICAgIHJldHJ5UmVxdWVzdDogYXN5bmMgKHBheWxvYWQ6IFNlbmRSZXF1ZXN0T3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgYXdhaXQgcmVzdC5wcm9jZXNzUmVxdWVzdChwYXlsb2FkKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzb2x2ZTogKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoZGF0YS5zdGF0dXMgIT09IDIwNCA/IEpTT04ucGFyc2UoZGF0YS5ib2R5ID8/ICd7fScpIDogdW5kZWZpbmVkKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVqZWN0OiAocmVhc29uKSA9PiB7XG4gICAgICAgICAgICBlcnJvci5jYXVzZSA9IHJlYXNvblxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcnVuVGhyb3VnaFF1ZXVlOiBvcHRpb25zPy5ydW5UaHJvdWdoUXVldWUsXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCByZXN0LnByb2Nlc3NSZXF1ZXN0KHBheWxvYWQpXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXQ8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdHRVQnLCB1cmwsIG9wdGlvbnMpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBwb3N0PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUE9TVCcsIHVybCwgb3B0aW9ucykpIGFzIENhbWVsaXplPFQ+XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZSh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0RFTEVURScsIHVybCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIHBhdGNoPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUEFUQ0gnLCB1cmwsIG9wdGlvbnMpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBwdXQ8VCA9IHZvaWQ+KHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BVVCcsIHVybCwgb3B0aW9ucykpIGFzIENhbWVsaXplPFQ+XG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pXG5cbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5ib3QoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkUmVhY3Rpb25zKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbnMsIG9yZGVyZWQgPSBmYWxzZSkge1xuICAgICAgaWYgKCFvcmRlcmVkKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHJlYWN0aW9ucy5tYXAoYXN5bmMgKHJlYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCByZXN0LmFkZFJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbilcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCByZWFjdGlvbiBvZiByZWFjdGlvbnMpIHtcbiAgICAgICAgYXdhaXQgcmVzdC5hZGRSZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFJvbGUoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm1lbWJlcihndWlsZElkLCB1c2VySWQsIHJvbGVJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFRocmVhZE1lbWJlcihjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy51c2VyKGNoYW5uZWxJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkRG1SZWNpcGllbnQoY2hhbm5lbElkLCB1c2VySWQsIGJvZHkpIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLmRtUmVjaXBpZW50KGNoYW5uZWxJZCwgdXNlcklkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUF1dG9tb2RSdWxlKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlcyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlQ2hhbm5lbChndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmd1aWxkcy5jaGFubmVscyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlRW1vamkoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppcyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlQXBwbGljYXRpb25FbW9qaShib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25FbW9qaXMocmVzdC5hcHBsaWNhdGlvbklkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChib2R5LCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0geyBib2R5IH1cblxuICAgICAgaWYgKG9wdGlvbnM/LmJlYXJlclRva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5iZWFyZXJUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmRzKHJlc3QuYXBwbGljYXRpb25JZCksIHJlc3RPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZChib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRHdWlsZD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmFsbCgpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoYm9keSwgZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE1ha2VSZXF1ZXN0T3B0aW9ucyA9IHsgYm9keSB9XG5cbiAgICAgIGlmIChvcHRpb25zPy5iZWFyZXJUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlXG4gICAgICAgIHJlc3RPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke29wdGlvbnMuYmVhcmVyVG9rZW59YCxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCksIHJlc3RPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZEZyb21UZW1wbGF0ZSh0ZW1wbGF0ZUNvZGUsIGJvZHkpIHtcbiAgICAgIGlmIChib2R5Lmljb24pIHtcbiAgICAgICAgYm9keS5pY29uID0gYXdhaXQgdXJsVG9CYXNlNjQoYm9keS5pY29uKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRHdWlsZD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5jb2RlKHRlbXBsYXRlQ29kZSksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKClcbiAgICAgIGZvcm0uYXBwZW5kKCdmaWxlJywgb3B0aW9ucy5maWxlLmJsb2IsIG9wdGlvbnMuZmlsZS5uYW1lKVxuICAgICAgZm9ybS5hcHBlbmQoJ25hbWUnLCBvcHRpb25zLm5hbWUpXG4gICAgICBmb3JtLmFwcGVuZCgnZGVzY3JpcHRpb24nLCBvcHRpb25zLmRlc2NyaXB0aW9uKVxuICAgICAgZm9ybS5hcHBlbmQoJ3RhZ3MnLCBvcHRpb25zLnRhZ3MpXG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFN0aWNrZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5zdGlja2VycyhndWlsZElkKSwgeyBib2R5OiBmb3JtLCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRUZW1wbGF0ZShndWlsZElkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5hbGwoZ3VpbGRJZCksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVGb3J1bVRocmVhZChjaGFubmVsSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZm9ydW0oY2hhbm5lbElkKSwgeyBib2R5LCBmaWxlczogYm9keS5maWxlcywgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUludml0ZShjaGFubmVsSWQsIGJvZHkgPSB7fSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRJbnZpdGU+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmludml0ZXMoY2hhbm5lbElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlUm9sZShndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFJvbGU+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5hbGwoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVNjaGVkdWxlZEV2ZW50KGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnRzKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVTdGFnZUluc3RhbmNlKGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2VzKCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVdlYmhvb2soY2hhbm5lbElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLmNoYW5uZWxzLndlYmhvb2tzKGNoYW5uZWxJZCksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICBhdmF0YXI6IG9wdGlvbnMuYXZhdGFyID8gYXdhaXQgdXJsVG9CYXNlNjQob3B0aW9ucy5hdmF0YXIpIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZShndWlsZElkLCBydWxlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVDaGFubmVsKGNoYW5uZWxJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5jaGFubmVsKGNoYW5uZWxJZCksIHtcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQ2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZShjaGFubmVsSWQsIG92ZXJ3cml0ZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLm92ZXJ3cml0ZShjaGFubmVsSWQsIG92ZXJ3cml0ZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlRW1vamkoZ3VpbGRJZCwgaWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppKGd1aWxkSWQsIGlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQXBwbGljYXRpb25FbW9qaShpZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25FbW9qaShyZXN0LmFwcGxpY2F0aW9uSWQsIGlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlRm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMubWVzc2FnZShyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuLCBtZXNzYWdlSWQpLCB7IHVuYXV0aG9yaXplZDogdHJ1ZSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZChyZXN0LmFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUd1aWxkKGd1aWxkSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5ndWlsZChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLm9uZShyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUd1aWxkU3RpY2tlcihndWlsZElkLCBzdGlja2VySWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRUZW1wbGF0ZShndWlsZElkLCB0ZW1wbGF0ZUNvZGUpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuZ3VpbGQoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlSW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuaW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUludml0ZShpbnZpdGVDb2RlLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGUoaW52aXRlQ29kZSksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU1lc3NhZ2VzKGNoYW5uZWxJZCwgbWVzc2FnZUlkcywgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuY2hhbm5lbHMuYnVsayhjaGFubmVsSWQpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICBtZXNzYWdlczogbWVzc2FnZUlkcy5zbGljZSgwLCAxMDApLm1hcCgoaWQpID0+IGlkLnRvU3RyaW5nKCkpLFxuICAgICAgICB9LFxuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMub3JpZ2luYWwocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiksIHsgdW5hdXRob3JpemVkOiB0cnVlIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU93blJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pXG5cbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5ib3QoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlUmVhY3Rpb25zQWxsKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMuYWxsKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlUmVhY3Rpb25zRW1vamkoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSB7XG4gICAgICByZWFjdGlvbiA9IHByb2Nlc3NSZWFjdGlvblN0cmluZyhyZWFjdGlvbilcblxuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLmVtb2ppKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVJvbGUoZ3VpbGRJZCwgcm9sZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5vbmUoZ3VpbGRJZCwgcm9sZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlU2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudChndWlsZElkLCBldmVudElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlU3RhZ2VJbnN0YW5jZShjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2UoY2hhbm5lbElkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlVXNlclJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCB1c2VySWQsIHJlYWN0aW9uKSB7XG4gICAgICByZWFjdGlvbiA9IHByb2Nlc3NSZWFjdGlvblN0cmluZyhyZWFjdGlvbilcblxuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLnVzZXIoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rKHdlYmhvb2tJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy5pZCh3ZWJob29rSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLndlYmhvb2tzLm1lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlV2ViaG9va1dpdGhUb2tlbih3ZWJob29rSWQsIHRva2VuKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4pLCB7XG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkLCBjb21tYW5kSWQsIGJlYXJlclRva2VuLCBwZXJtaXNzaW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb24ocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpLFxuICAgICAgICB7XG4gICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBoZWFkZXJzOiB7IGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtiZWFyZXJUb2tlbn1gIH0sXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZShndWlsZElkLCBydWxlSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Qm90UHJvZmlsZShvcHRpb25zKSB7XG4gICAgICBjb25zdCBhdmF0YXIgPSBvcHRpb25zPy5ib3RBdmF0YXJVUkwgPyBhd2FpdCB1cmxUb0Jhc2U2NChvcHRpb25zPy5ib3RBdmF0YXJVUkwpIDogb3B0aW9ucz8uYm90QXZhdGFyVVJMXG4gICAgICBjb25zdCBiYW5uZXIgPSBvcHRpb25zPy5ib3RCYW5uZXJVUkwgPyBhd2FpdCB1cmxUb0Jhc2U2NChvcHRpb25zPy5ib3RCYW5uZXJVUkwpIDogb3B0aW9ucz8uYm90QmFubmVyVVJMXG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRVc2VyPihyZXN0LnJvdXRlcy5jdXJyZW50VXNlcigpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICB1c2VybmFtZTogb3B0aW9ucy51c2VybmFtZT8udHJpbSgpLFxuICAgICAgICAgIGF2YXRhcixcbiAgICAgICAgICBiYW5uZXIsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Q2hhbm5lbChjaGFubmVsSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoY2hhbm5lbElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzKGNoYW5uZWxJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5vdmVyd3JpdGUoY2hhbm5lbElkLCBib2R5LmlkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdENoYW5uZWxQb3NpdGlvbnMoZ3VpbGRJZCwgYm9keSkge1xuICAgICAgYXdhaXQgcmVzdC5wYXRjaChyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0RW1vamkoZ3VpbGRJZCwgaWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamkoZ3VpbGRJZCwgaWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXBwbGljYXRpb25FbW9qaShpZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbkVtb2ppKHJlc3QuYXBwbGljYXRpb25JZCwgaWQpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5tZXNzYWdlKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4sIG1lc3NhZ2VJZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgZmlsZXM6IGJvZHkuZmlsZXMsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZChyZXN0LmFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGQoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkR3VpbGQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ndWlsZChndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5vbmUocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRNZmFMZXZlbChndWlsZElkOiBCaWdTdHJpbmcsIG1mYUxldmVsOiBNZmFMZXZlbHMsIHJlYXNvbj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgcmVzdC5wb3N0KHJlc3Qucm91dGVzLmd1aWxkcy5tZmEoZ3VpbGRJZCksIHsgYm9keTogeyBsZXZlbDogbWZhTGV2ZWwgfSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRUZW1wbGF0ZShndWlsZElkLCB0ZW1wbGF0ZUNvZGU6IHN0cmluZywgYm9keTogTW9kaWZ5R3VpbGRUZW1wbGF0ZSk6IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRlbXBsYXRlPj4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmd1aWxkKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0TWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCB7IGJvZHksIGZpbGVzOiBib2R5LmZpbGVzIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4sIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGZpbGVzOiBib2R5LmZpbGVzLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE9yaWdpbmFsV2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLndlYmhvb2tzLm9yaWdpbmFsKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICB0eXBlOiBJbnRlcmFjdGlvblJlc3BvbnNlVHlwZXMuVXBkYXRlTWVzc2FnZSxcbiAgICAgICAgICBkYXRhOiBvcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgICBmaWxlczogb3B0aW9ucy5maWxlcyxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE93blZvaWNlU3RhdGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgYXdhaXQgcmVzdC5wYXRjaChyZXN0LnJvdXRlcy5ndWlsZHMudm9pY2UoZ3VpbGRJZCksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgcmVxdWVzdFRvU3BlYWtUaW1lc3RhbXA6IG9wdGlvbnMucmVxdWVzdFRvU3BlYWtUaW1lc3RhbXBcbiAgICAgICAgICAgID8gbmV3IERhdGUob3B0aW9ucy5yZXF1ZXN0VG9TcGVha1RpbWVzdGFtcCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgOiBvcHRpb25zLnJlcXVlc3RUb1NwZWFrVGltZXN0YW1wLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFNjaGVkdWxlZEV2ZW50KGd1aWxkSWQsIGV2ZW50SWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Um9sZShndWlsZElkLCByb2xlSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFJvbGU+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5vbmUoZ3VpbGRJZCwgcm9sZUlkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFJvbGVQb3NpdGlvbnMoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkUm9sZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMuYWxsKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0U3RhZ2VJbnN0YW5jZShjaGFubmVsSWQsIHRvcGljLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRTdGFnZUluc3RhbmNlPihyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZShjaGFubmVsSWQpLCB7IGJvZHk6IHsgdG9waWMgfSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRVc2VyVm9pY2VTdGF0ZShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICBhd2FpdCByZXN0LnBhdGNoKHJlc3Qucm91dGVzLmd1aWxkcy52b2ljZShndWlsZElkLCBvcHRpb25zLnVzZXJJZCksIHsgYm9keTogb3B0aW9ucyB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2ViaG9vayh3ZWJob29rSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucyksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgZmlsZXM6IG9wdGlvbnMuZmlsZXMsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4sIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4pLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWxjb21lU2NyZWVuKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlbGNvbWVTY3JlZW4+KHJlc3Qucm91dGVzLmd1aWxkcy53ZWxjb21lKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2lkZ2V0U2V0dGluZ3MoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkR3VpbGRXaWRnZXRTZXR0aW5ncz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndpZGdldChndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZXhlY3V0ZVdlYmhvb2sod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBmb2xsb3dBbm5vdW5jZW1lbnQoc291cmNlQ2hhbm5lbElkLCB0YXJnZXRDaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkRm9sbG93ZWRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5mb2xsb3coc291cmNlQ2hhbm5lbElkKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgd2ViaG9va0NoYW5uZWxJZDogdGFyZ2V0Q2hhbm5lbElkLFxuICAgICAgICB9LFxuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBY3RpdmVUaHJlYWRzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTGlzdEFjdGl2ZVRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMuYWN0aXZlKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uKGd1aWxkSWQsIGNvbW1hbmRJZCwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE9taXQ8TWFrZVJlcXVlc3RPcHRpb25zLCAnYm9keSc+ID0ge31cblxuICAgICAgaWYgKG9wdGlvbnM/LmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5hY2Nlc3NUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucz4oXG4gICAgICAgIHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5wZXJtaXNzaW9uKG9wdGlvbnM/LmFwcGxpY2F0aW9uSWQgPz8gcmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpLFxuICAgICAgICByZXN0T3B0aW9ucyxcbiAgICAgIClcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE9taXQ8TWFrZVJlcXVlc3RPcHRpb25zLCAnYm9keSc+ID0ge31cblxuICAgICAgaWYgKG9wdGlvbnM/LmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5hY2Nlc3NUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uc1tdPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb25zKG9wdGlvbnM/LmFwcGxpY2F0aW9uSWQgPz8gcmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkKSxcbiAgICAgICAgcmVzdE9wdGlvbnMsXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uSW5mbygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb24+KHJlc3Qucm91dGVzLm9hdXRoMi5hcHBsaWNhdGlvbigpKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXBwbGljYXRpb25JbmZvKGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBcHBsaWNhdGlvbj4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb24oKSwge1xuICAgICAgICBib2R5LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q3VycmVudEF1dGhlbnRpY2F0aW9uSW5mbyh0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRDdXJyZW50QXV0aG9yaXphdGlvbj4ocmVzdC5yb3V0ZXMub2F1dGgyLmN1cnJlbnRBdXRob3JpemF0aW9uKCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBleGNoYW5nZVRva2VuKGNsaWVudElkLCBjbGllbnRTZWNyZXQsIGJvZHkpIHtcbiAgICAgIGNvbnN0IGJhc2ljQ3JlZGVudGlhbHMgPSBCdWZmZXIuZnJvbShgJHtjbGllbnRJZH06JHtjbGllbnRTZWNyZXR9YClcblxuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE1ha2VSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmFzaWMgJHtiYXNpY0NyZWRlbnRpYWxzLnRvU3RyaW5nKCdiYXNlNjQnKX1gLFxuICAgICAgICB9LFxuICAgICAgICBydW5UaHJvdWdoUXVldWU6IGZhbHNlLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9XG5cbiAgICAgIGlmIChib2R5LmdyYW50VHlwZSA9PT0gJ2NsaWVudF9jcmVkZW50aWFscycpIHtcbiAgICAgICAgcmVzdE9wdGlvbnMuYm9keS5zY29wZSA9IGJvZHkuc2NvcGUuam9pbignICcpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEFjY2Vzc1Rva2VuUmVzcG9uc2U+KHJlc3Qucm91dGVzLm9hdXRoMi50b2tlbkV4Y2hhbmdlKCksIHJlc3RPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyByZXZva2VUb2tlbihjbGllbnRJZCwgY2xpZW50U2VjcmV0LCBib2R5KSB7XG4gICAgICBjb25zdCBiYXNpY0NyZWRlbnRpYWxzID0gQnVmZmVyLmZyb20oYCR7Y2xpZW50SWR9OiR7Y2xpZW50U2VjcmV0fWApXG5cbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5vYXV0aDIudG9rZW5SZXZva2UoKSwge1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCYXNpYyAke2Jhc2ljQ3JlZGVudGlhbHMudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF1ZGl0TG9nKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXVkaXRMb2c+KHJlc3Qucm91dGVzLmd1aWxkcy5hdWRpdGxvZ3MoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF1dG9tb2RSdWxlKGd1aWxkSWQsIHJ1bGVJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXV0b21vZFJ1bGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlW10+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGVzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBdmFpbGFibGVWb2ljZVJlZ2lvbnMoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZvaWNlUmVnaW9uW10+KHJlc3Qucm91dGVzLnJlZ2lvbnMoKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QmFuKGd1aWxkSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRCYW4+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRCYW5zKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQmFuW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbnMoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWwoaWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY2hhbm5lbChpZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxJbnZpdGVzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnZpdGVNZXRhZGF0YVtdPihyZXN0LnJvdXRlcy5jaGFubmVscy5pbnZpdGVzKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ2hhbm5lbFtdPihyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxXZWJob29rcyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2ViaG9va1tdPihyZXN0LnJvdXRlcy5jaGFubmVscy53ZWJob29rcyhjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXREbUNoYW5uZWwodXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5kbSgpLCB7XG4gICAgICAgIGJvZHk6IHsgcmVjaXBpZW50SWQ6IHVzZXJJZCB9LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3JvdXBEbUNoYW5uZWwoYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZG0oKSwge1xuICAgICAgICBib2R5LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0RW1vamkoZ3VpbGRJZCwgZW1vamlJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppKGd1aWxkSWQsIGVtb2ppSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkVtb2ppKGVtb2ppSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uRW1vamkocmVzdC5hcHBsaWNhdGlvbklkLCBlbW9qaUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0RW1vamlzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW1vamlbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25FbW9qaXMoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8eyBpdGVtczogRGlzY29yZEVtb2ppW10gfT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25FbW9qaXMocmVzdC5hcHBsaWNhdGlvbklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Rm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5tZXNzYWdlKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4sIG1lc3NhZ2VJZCksIHsgdW5hdXRob3JpemVkOiB0cnVlIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdhdGV3YXlCb3QoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEdldEdhdGV3YXlCb3Q+KHJlc3Qucm91dGVzLmdhdGV3YXlCb3QoKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kKHJlc3QuYXBwbGljYXRpb25JZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZChndWlsZElkLCBvcHRpb25zID0geyBjb3VudHM6IHRydWUgfSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmd1aWxkKGd1aWxkSWQsIG9wdGlvbnMuY291bnRzKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRzKHRva2VuLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCBtYWtlUmVxdWVzdE9wdGlvbnM6IE1ha2VSZXF1ZXN0T3B0aW9ucyB8IHVuZGVmaW5lZCA9IHRva2VuXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8UGFydGlhbDxEaXNjb3JkR3VpbGQ+W10+KHJlc3Qucm91dGVzLmd1aWxkcy51c2VyR3VpbGRzKG9wdGlvbnMpLCBtYWtlUmVxdWVzdE9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkUHJldmlldyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkUHJldmlldz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnByZXZpZXcoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkVGVtcGxhdGUodGVtcGxhdGVDb2RlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmNvZGUodGVtcGxhdGVDb2RlKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRUZW1wbGF0ZXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUZW1wbGF0ZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRXZWJob29rcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2tbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndlYmhvb2tzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRJbnRlZ3JhdGlvbnMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnRlZ3JhdGlvbltdPihyZXN0LnJvdXRlcy5ndWlsZHMuaW50ZWdyYXRpb25zKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRJbnZpdGUoaW52aXRlQ29kZSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnZpdGVNZXRhZGF0YT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludml0ZShpbnZpdGVDb2RlLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW52aXRlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGVzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZXNzYWdlcyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZVtdPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlcyhjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTdGlja2VyUGFjayhzdGlja2VyUGFja0lkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXJQYWNrPihyZXN0LnJvdXRlcy5zdGlja2VyUGFjayhzdGlja2VyUGFja0lkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3RpY2tlclBhY2tzKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyUGFja1tdPihyZXN0LnJvdXRlcy5zdGlja2VyUGFja3MoKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMub3JpZ2luYWwocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiksIHsgdW5hdXRob3JpemVkOiB0cnVlIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFBpbm5lZE1lc3NhZ2VzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnBpbnMoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UHJpdmF0ZUFyY2hpdmVkVGhyZWFkcyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTGlzdEFyY2hpdmVkVGhyZWFkcz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5wcml2YXRlKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFByaXZhdGVKb2luZWRBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMuam9pbmVkKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFBydW5lQ291bnQoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRQcnVuZWRDb3VudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnBydW5lKGd1aWxkSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQdWJsaWNBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMucHVibGljKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFJvbGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkUm9sZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMuYWxsKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRSb2xlKGd1aWxkSWQsIHJvbGVJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRSb2xlPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMub25lKGd1aWxkSWQsIHJvbGVJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNjaGVkdWxlZEV2ZW50KGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucz8ud2l0aFVzZXJDb3VudCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNjaGVkdWxlZEV2ZW50cyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNjaGVkdWxlZEV2ZW50W10+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnRzKGd1aWxkSWQsIG9wdGlvbnM/LndpdGhVc2VyQ291bnQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTY2hlZHVsZWRFdmVudFVzZXJzKGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxBcnJheTx7IHVzZXI6IERpc2NvcmRVc2VyOyBtZW1iZXI/OiBEaXNjb3JkTWVtYmVyIH0+PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLnVzZXJzKGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTZXNzaW9uSW5mbygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEdhdGV3YXlCb3QoKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTdGFnZUluc3RhbmNlKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGFnZUluc3RhbmNlPihyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZShjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPd25Wb2ljZVN0YXRlKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVm9pY2VTdGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnZvaWNlKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRVc2VyVm9pY2VTdGF0ZShndWlsZElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVm9pY2VTdGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnZvaWNlKGd1aWxkSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN0aWNrZXIoc3RpY2tlcklkOiBCaWdTdHJpbmcpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuc3RpY2tlcihzdGlja2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5zdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkU3RpY2tlcnMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyW10+KHJlc3Qucm91dGVzLmd1aWxkcy5zdGlja2VycyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRocmVhZE1lbWJlcj4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy51c2VyKGNoYW5uZWxJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGhyZWFkTWVtYmVycyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVGhyZWFkTWVtYmVyW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWVtYmVycyhjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRSZWFjdGlvbnMoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFVzZXJbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VXNlcihpZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRVc2VyPihyZXN0LnJvdXRlcy51c2VyKGlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q3VycmVudFVzZXIodG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVXNlcj4ocmVzdC5yb3V0ZXMuY3VycmVudFVzZXIoKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFVzZXJDb25uZWN0aW9ucyh0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRDb25uZWN0aW9uW10+KHJlc3Qucm91dGVzLm9hdXRoMi5jb25uZWN0aW9ucygpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VXNlckFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24odG9rZW4sIGFwcGxpY2F0aW9uSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbj4ocmVzdC5yb3V0ZXMub2F1dGgyLnJvbGVDb25uZWN0aW9ucyhhcHBsaWNhdGlvbklkKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFZhbml0eVVybChndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZhbml0eVVybD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnZhbml0eShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Vm9pY2VSZWdpb25zKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVm9pY2VSZWdpb25bXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJlZ2lvbnMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2sod2ViaG9va0lkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucyksIHtcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2ViaG9va1dpdGhUb2tlbih3ZWJob29rSWQsIHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbiksIHtcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2VsY29tZVNjcmVlbihndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlbGNvbWVTY3JlZW4+KHJlc3Qucm91dGVzLmd1aWxkcy53ZWxjb21lKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXaWRnZXQoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZFdpZGdldD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndpZGdldEpzb24oZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdpZGdldFNldHRpbmdzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRXaWRnZXRTZXR0aW5ncz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndpZGdldChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgam9pblRocmVhZChjaGFubmVsSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWUoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGVhdmVHdWlsZChndWlsZElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMubGVhdmUoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGxlYXZlVGhyZWFkKGNoYW5uZWxJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZShjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBwdWJsaXNoTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY3Jvc3Nwb3N0KGNoYW5uZWxJZCwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVtb3ZlUm9sZShndWlsZElkLCB1c2VySWQsIHJvbGVJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgcm9sZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVtb3ZlVGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnVzZXIoY2hhbm5lbElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyByZW1vdmVEbVJlY2lwaWVudChjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZG1SZWNpcGllbnQoY2hhbm5lbElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kRm9sbG93dXBNZXNzYWdlKHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0KHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2socmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgZmlsZXM6IG9wdGlvbnMuZmlsZXMsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRJbnRlcmFjdGlvblJlc3BvbnNlKGludGVyYWN0aW9uSWQsIHRva2VuLCBvcHRpb25zLCBwYXJhbXMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8dm9pZCB8IERpc2NvcmRJbnRlcmFjdGlvbkNhbGxiYWNrUmVzcG9uc2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMuY2FsbGJhY2soaW50ZXJhY3Rpb25JZCwgdG9rZW4sIHBhcmFtcyksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgZmlsZXM6IG9wdGlvbnMuZGF0YT8uZmlsZXMsXG4gICAgICAgIHJ1blRocm91Z2hRdWV1ZTogZmFsc2UsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRNZXNzYWdlKGNoYW5uZWxJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZXMoY2hhbm5lbElkKSwgeyBib2R5LCBmaWxlczogYm9keS5maWxlcyB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBzdGFydFRocmVhZFdpdGhNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHN0YXJ0VGhyZWFkV2l0aG91dE1lc3NhZ2UoY2hhbm5lbElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMuYWxsKGNoYW5uZWxJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFBvbGxBbnN3ZXJWb3RlcnMoY2hhbm5lbElkLCBtZXNzYWdlSWQsIGFuc3dlcklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEdldEFuc3dlclZvdGVzUmVzcG9uc2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnBvbGxzLnZvdGVzKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBhbnN3ZXJJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGVuZFBvbGwoY2hhbm5lbElkLCBtZXNzYWdlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnBvbGxzLmV4cGlyZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHN5bmNHdWlsZFRlbXBsYXRlKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkVGVtcGxhdGU+KHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuYWxsKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBiYW5NZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0PHZvaWQ+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBidWxrQmFuTWVtYmVycyhndWlsZElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEJ1bGtCYW4+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJ1bGtCYW4oZ3VpbGRJZCksIHsgYm9keTogb3B0aW9ucywgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRCb3RNZW1iZXIoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVtYmVyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5ib3QoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZW1iZXJXaXRoVXNlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE1lbWJlcihndWlsZElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVtYmVyV2l0aFVzZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDdXJyZW50TWVtYmVyKGd1aWxkSWQsIHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5jdXJyZW50TWVtYmVyKGd1aWxkSWQpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TWVtYmVycyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uQWN0aXZpdHlJbnN0YW5jZShhcHBsaWNhdGlvbklkLCBpbnN0YW5jZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFjdGl2aXR5SW5zdGFuY2U+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uQWN0aXZpdHlJbnN0YW5jZShhcHBsaWNhdGlvbklkLCBpbnN0YW5jZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMga2lja01lbWJlcihndWlsZElkLCB1c2VySWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCksIHtcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcGluTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5waW4oY2hhbm5lbElkLCBtZXNzYWdlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBwcnVuZU1lbWJlcnMoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PHsgcHJ1bmVkOiBudW1iZXIgfCBudWxsIH0+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLnBydW5lKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBzZWFyY2hNZW1iZXJzKGd1aWxkSWQsIHF1ZXJ5LCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLnNlYXJjaChndWlsZElkLCBxdWVyeSwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkT25ib2FyZGluZyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkT25ib2FyZGluZz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm9uYm9hcmRpbmcoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZE9uYm9hcmRpbmcoZ3VpbGRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEd1aWxkT25ib2FyZGluZz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm9uYm9hcmRpbmcoZ3VpbGRJZCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdW5iYW5NZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyB1bnBpbk1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucGluKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdHJpZ2dlclR5cGluZ0luZGljYXRvcihjaGFubmVsSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5jaGFubmVscy50eXBpbmcoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBzZXJ0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyhib2R5LCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0geyBib2R5IH1cblxuICAgICAgaWYgKG9wdGlvbnM/LmJlYXJlclRva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5iZWFyZXJUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQpLCByZXN0T3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBzZXJ0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzKGd1aWxkSWQsIGJvZHksIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBNYWtlUmVxdWVzdE9wdGlvbnMgPSB7IGJvZHkgfVxuXG4gICAgICBpZiAob3B0aW9ucz8uYmVhcmVyVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZVxuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmJlYXJlclRva2VufWAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5hbGwocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkKSwgcmVzdE9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRVc2VyQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbih0b2tlbiwgYXBwbGljYXRpb25JZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uPihyZXN0LnJvdXRlcy5vYXV0aDIucm9sZUNvbm5lY3Rpb25zKGFwcGxpY2F0aW9uSWQpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkR3VpbGRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVRlc3RFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRFbnRpdGxlbWVudD4ocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLmVudGl0bGVtZW50cyhhcHBsaWNhdGlvbklkKSwge1xuICAgICAgICBib2R5LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdEVudGl0bGVtZW50cyhhcHBsaWNhdGlvbklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVudGl0bGVtZW50W10+KHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5lbnRpdGxlbWVudHMoYXBwbGljYXRpb25JZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEVudGl0bGVtZW50KGFwcGxpY2F0aW9uSWQsIGVudGl0bGVtZW50SWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW50aXRsZW1lbnQ+KHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5lbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlVGVzdEVudGl0bGVtZW50KGFwcGxpY2F0aW9uSWQsIGVudGl0bGVtZW50SWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5lbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY29uc3VtZUVudGl0bGVtZW50KGFwcGxpY2F0aW9uSWQsIGVudGl0bGVtZW50SWQpIHtcbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uY29uc3VtZUVudGl0bGVtZW50KGFwcGxpY2F0aW9uSWQsIGVudGl0bGVtZW50SWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0U2t1cyhhcHBsaWNhdGlvbklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNrdVtdPihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uc2t1cyhhcHBsaWNhdGlvbklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdFN1YnNjcmlwdGlvbnMoc2t1SWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3Vic2NyaXB0aW9uW10+KHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5zdWJzY3JpcHRpb25zKHNrdUlkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3Vic2NyaXB0aW9uKHNrdUlkLCBzdWJzY3JpcHRpb25JZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdWJzY3JpcHRpb24+KHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5zdWJzY3JpcHRpb24oc2t1SWQsIHN1YnNjcmlwdGlvbklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZFNvdW5kYm9hcmRTb3VuZChjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5zb3VuZGJvYXJkLnNlbmRTb3VuZChjaGFubmVsSWQpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0RGVmYXVsdFNvdW5kYm9hcmRTb3VuZHMoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNvdW5kYm9hcmRTb3VuZFtdPihyZXN0LnJvdXRlcy5zb3VuZGJvYXJkLmxpc3REZWZhdWx0KCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3RHdWlsZFNvdW5kYm9hcmRTb3VuZHMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PHsgaXRlbXM6IERpc2NvcmRTb3VuZGJvYXJkU291bmRbXSB9PihyZXN0LnJvdXRlcy5zb3VuZGJvYXJkLmd1aWxkU291bmRzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFNvdW5kYm9hcmRTb3VuZChndWlsZElkLCBzb3VuZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNvdW5kYm9hcmRTb3VuZD4ocmVzdC5yb3V0ZXMuc291bmRib2FyZC5ndWlsZFNvdW5kKGd1aWxkSWQsIHNvdW5kSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZFNvdW5kYm9hcmRTb3VuZChndWlsZElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFNvdW5kYm9hcmRTb3VuZD4ocmVzdC5yb3V0ZXMuc291bmRib2FyZC5ndWlsZFNvdW5kcyhndWlsZElkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBtb2RpZnlHdWlsZFNvdW5kYm9hcmRTb3VuZChndWlsZElkLCBzb3VuZElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFNvdW5kYm9hcmRTb3VuZD4ocmVzdC5yb3V0ZXMuc291bmRib2FyZC5ndWlsZFNvdW5kKGd1aWxkSWQsIHNvdW5kSWQpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUd1aWxkU291bmRib2FyZFNvdW5kKGd1aWxkSWQsIHNvdW5kSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuZ3VpbGRTb3VuZChndWlsZElkLCBzb3VuZElkKSwge1xuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBwcmVmZXJTbmFrZUNhc2UoZW5hYmxlZDogYm9vbGVhbikge1xuICAgICAgY29uc3QgY2FtZWxpemVyID0gZW5hYmxlZCA/ICh4OiBhbnkpID0+IHggOiBjYW1lbGl6ZVxuXG4gICAgICByZXN0LmdldCA9IGFzeW5jICh1cmwsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgcmV0dXJuIGNhbWVsaXplcihhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdHRVQnLCB1cmwsIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICByZXN0LnBvc3QgPSBhc3luYyAodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSA9PiB7XG4gICAgICAgIHJldHVybiBjYW1lbGl6ZXIoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUE9TVCcsIHVybCwgb3B0aW9ucykpXG4gICAgICB9XG5cbiAgICAgIHJlc3QuZGVsZXRlID0gYXN5bmMgKHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikgPT4ge1xuICAgICAgICBjYW1lbGl6ZXIoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnREVMRVRFJywgdXJsLCBvcHRpb25zKSlcbiAgICAgIH1cblxuICAgICAgcmVzdC5wYXRjaCA9IGFzeW5jICh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pID0+IHtcbiAgICAgICAgcmV0dXJuIGNhbWVsaXplcihhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQQVRDSCcsIHVybCwgb3B0aW9ucykpXG4gICAgICB9XG5cbiAgICAgIHJlc3QucHV0ID0gYXN5bmMgKHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikgPT4ge1xuICAgICAgICByZXR1cm4gY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BVVCcsIHVybCwgb3B0aW9ucykpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN0XG4gICAgfSxcbiAgfVxuXG4gIHJldHVybiByZXN0XG59XG5cbmVudW0gSHR0cFJlc3BvbnNlQ29kZSB7XG4gIC8qKiBNaW5pbXVtIHZhbHVlIG9mIGEgY29kZSBpbiBvZGVyIHRvIGNvbnNpZGVyIHRoYXQgaXQgd2FzIHN1Y2Nlc3NmdWwuICovXG4gIFN1Y2Nlc3MgPSAyMDAsXG4gIC8qKiBSZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIGJ1dCBEaXNjb3JkIHJldHVybmVkIGFuIGVtcHR5IGJvZHkuICovXG4gIE5vQ29udGVudCA9IDIwNCxcbiAgLyoqIE1pbmltdW0gdmFsdWUgb2YgYSBjb2RlIGluIG9yZGVyIHRvIGNvbnNpZGVyIHRoYXQgc29tZXRoaW5nIHdlbnQgd3JvbmcuICovXG4gIEVycm9yID0gNDAwLFxuICAvKiogVGhpcyByZXF1ZXN0IGdvdCByYXRlIGxpbWl0ZWQuICovXG4gIFRvb01hbnlSZXF1ZXN0cyA9IDQyOSxcbn1cbiJdLCJuYW1lcyI6WyJBVURJVF9MT0dfUkVBU09OX0hFQURFUiIsIkRJU0NPUkRfQVBJX1VSTCIsIkRJU0NPUkRfQVBJX1ZFUlNJT04iLCJSQVRFX0xJTUlUX0JVQ0tFVF9IRUFERVIiLCJSQVRFX0xJTUlUX0dMT0JBTF9IRUFERVIiLCJSQVRFX0xJTUlUX0xJTUlUX0hFQURFUiIsIlJBVEVfTElNSVRfUkVNQUlOSU5HX0hFQURFUiIsIlJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSIiwiUkFURV9MSU1JVF9TQ09QRV9IRUFERVIiLCJjcmVhdGVSZXN0TWFuYWdlciIsIm9wdGlvbnMiLCJhcHBsaWNhdGlvbklkIiwiQmlnSW50IiwiZ2V0Qm90SWRGcm9tVG9rZW4iLCJ0b2tlbiIsImJhc2VVcmwiLCJwcm94eSIsInJlc3QiLCJhdXRob3JpemF0aW9uIiwiYXV0aG9yaXphdGlvbkhlYWRlciIsImRlbGV0ZVF1ZXVlRGVsYXkiLCJnbG9iYWxseVJhdGVMaW1pdGVkIiwiaW52YWxpZEJ1Y2tldCIsImNyZWF0ZUludmFsaWRSZXF1ZXN0QnVja2V0IiwibG9nZ2VyIiwiaXNQcm94aWVkIiwic3RhcnRzV2l0aCIsInVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnQiLCJtYXhSZXRyeUNvdW50IiwiSW5maW5pdHkiLCJwcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyIsInF1ZXVlcyIsIk1hcCIsInJhdGVMaW1pdGVkUGF0aHMiLCJ2ZXJzaW9uIiwicm91dGVzIiwiY3JlYXRlUm91dGVzIiwiY3JlYXRlQmFzZUhlYWRlcnMiLCJESVNDT1JERU5PX1ZFUlNJT04iLCJjaGVja1JhdGVMaW1pdHMiLCJ1cmwiLCJpZGVudGlmaWVyIiwicmF0ZWxpbWl0ZWQiLCJnZXQiLCJnbG9iYWwiLCJub3ciLCJEYXRlIiwicmVzZXRUaW1lc3RhbXAiLCJ1cGRhdGVUb2tlblF1ZXVlcyIsIm9sZFRva2VuIiwibmV3VG9rZW4iLCJFcnJvciIsImhlYWRlcnMiLCJ1bmRlZmluZWQiLCJmZXRjaCIsIm1ldGhvZCIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwibmV3SWRlbnRpZmllciIsImtleSIsInF1ZXVlIiwiZW50cmllcyIsImRlbGV0ZSIsIm5ld0tleSIsIm5ld1F1ZXVlIiwid2FpdGluZyIsInVuc2hpZnQiLCJwZW5kaW5nIiwiY2xlYW51cCIsInNldCIsInJhdGVsaW1pdFBhdGgiLCJidWNrZXRJZCIsImNoYW5nZVRvRGlzY29yZEZvcm1hdCIsIm9iaiIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsIml0ZW0iLCJuZXdPYmoiLCJPYmplY3QiLCJrZXlzIiwidmFsdWUiLCJpbmNsdWRlcyIsImNhbGN1bGF0ZUJpdHMiLCJkZWZhdWx0X21lbWJlcl9wZXJtaXNzaW9ucyIsIm5hbWVfbG9jYWxpemF0aW9ucyIsImRlc2NyaXB0aW9uX2xvY2FsaXphdGlvbnMiLCJjYW1lbFRvU25ha2VDYXNlIiwidG9TdHJpbmciLCJjcmVhdGVSZXF1ZXN0Qm9keSIsInVuYXV0aG9yaXplZCIsInJlYXNvbiIsImVuY29kZVVSSUNvbXBvbmVudCIsImZpbGVzIiwiZm9ybSIsIkZvcm1EYXRhIiwiaSIsImxlbmd0aCIsImFwcGVuZCIsImJsb2IiLCJuYW1lIiwiZm9ybUJvZHkiLCJkaXNjb3JkQm9keSIsInByb3AiLCJwdXNoIiwiam9pbiIsImFzc2lnbiIsInByb2Nlc3NSYXRlTGltaXRlZFBhdGhzIiwic2l6ZSIsInNldFRpbWVvdXQiLCJwcm9jZXNzSGVhZGVycyIsInJhdGVMaW1pdGVkIiwicmVtYWluaW5nIiwicmV0cnlBZnRlciIsInJlc2V0IiwiTnVtYmVyIiwibGltaXQiLCJoYW5kbGVDb21wbGV0ZWRSZXF1ZXN0IiwiaW50ZXJ2YWwiLCJtYXgiLCJnbG9iYWxSZXNldCIsInNlbmRSZXF1ZXN0Iiwicm91dGUiLCJwYXlsb2FkIiwicmVxdWVzdEJvZHlPcHRpb25zIiwibG9nZ2luZ0hlYWRlcnMiLCJhdXRob3JpemF0aW9uU2NoZW1lIiwic3BsaXQiLCJkZWJ1ZyIsInJlc3BvbnNlIiwiY2F0Y2giLCJlcnJvciIsInJlamVjdCIsIm9rIiwic3RhdHVzIiwic3RhdHVzVGV4dCIsInNpbXBsaWZ5VXJsIiwidGV4dCIsInJldHJ5Q291bnQiLCJyZXNldEFmdGVyIiwiZGVsYXkiLCJhcnJheUJ1ZmZlciIsInJldHJ5UmVxdWVzdCIsInJlc29sdmUiLCJwYXJ0cyIsInNlY29uZExhc3RQYXJ0Iiwic3BsaWNlIiwicHJvY2Vzc1JlcXVlc3QiLCJyZXF1ZXN0IiwicnVuVGhyb3VnaFF1ZXVlIiwicXVldWVJZGVudGlmaWVyIiwibWFrZVJlcXVlc3QiLCJidWNrZXRRdWV1ZSIsIlF1ZXVlIiwibWVzc2FnZSIsInJlc3VsdCIsImVyclRleHQiLCJjYXVzZSIsImVyciIsImpzb24iLCJQcm9taXNlIiwiZGF0YSIsInBhcnNlIiwiY2FtZWxpemUiLCJwb3N0IiwicGF0Y2giLCJwdXQiLCJhZGRSZWFjdGlvbiIsImNoYW5uZWxJZCIsIm1lc3NhZ2VJZCIsInJlYWN0aW9uIiwicHJvY2Vzc1JlYWN0aW9uU3RyaW5nIiwiY2hhbm5lbHMiLCJyZWFjdGlvbnMiLCJib3QiLCJhZGRSZWFjdGlvbnMiLCJvcmRlcmVkIiwiYWxsIiwiYWRkUm9sZSIsImd1aWxkSWQiLCJ1c2VySWQiLCJyb2xlSWQiLCJndWlsZHMiLCJyb2xlcyIsIm1lbWJlciIsImFkZFRocmVhZE1lbWJlciIsInRocmVhZHMiLCJ1c2VyIiwiYWRkRG1SZWNpcGllbnQiLCJkbVJlY2lwaWVudCIsImNyZWF0ZUF1dG9tb2RSdWxlIiwiYXV0b21vZCIsInJ1bGVzIiwiY3JlYXRlQ2hhbm5lbCIsImNyZWF0ZUVtb2ppIiwiZW1vamlzIiwiY3JlYXRlQXBwbGljYXRpb25FbW9qaSIsImFwcGxpY2F0aW9uRW1vamlzIiwiY3JlYXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwicmVzdE9wdGlvbnMiLCJiZWFyZXJUb2tlbiIsImludGVyYWN0aW9ucyIsImNvbW1hbmRzIiwiY3JlYXRlR3VpbGQiLCJjcmVhdGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImNyZWF0ZUd1aWxkRnJvbVRlbXBsYXRlIiwidGVtcGxhdGVDb2RlIiwiaWNvbiIsInVybFRvQmFzZTY0IiwidGVtcGxhdGVzIiwiY29kZSIsImNyZWF0ZUd1aWxkU3RpY2tlciIsImZpbGUiLCJkZXNjcmlwdGlvbiIsInRhZ3MiLCJzdGlja2VycyIsImNyZWF0ZUd1aWxkVGVtcGxhdGUiLCJjcmVhdGVGb3J1bVRocmVhZCIsImZvcnVtIiwiY3JlYXRlSW52aXRlIiwiaW52aXRlcyIsImNyZWF0ZVJvbGUiLCJjcmVhdGVTY2hlZHVsZWRFdmVudCIsImV2ZW50cyIsImNyZWF0ZVN0YWdlSW5zdGFuY2UiLCJzdGFnZXMiLCJjcmVhdGVXZWJob29rIiwid2ViaG9va3MiLCJhdmF0YXIiLCJkZWxldGVBdXRvbW9kUnVsZSIsInJ1bGVJZCIsInJ1bGUiLCJkZWxldGVDaGFubmVsIiwiY2hhbm5lbCIsImRlbGV0ZUNoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGUiLCJvdmVyd3JpdGVJZCIsIm92ZXJ3cml0ZSIsImRlbGV0ZUVtb2ppIiwiaWQiLCJlbW9qaSIsImRlbGV0ZUFwcGxpY2F0aW9uRW1vamkiLCJhcHBsaWNhdGlvbkVtb2ppIiwiZGVsZXRlRm9sbG93dXBNZXNzYWdlIiwicmVzcG9uc2VzIiwiZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiY29tbWFuZElkIiwiY29tbWFuZCIsImRlbGV0ZUd1aWxkIiwiZ3VpbGQiLCJkZWxldGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsIm9uZSIsImRlbGV0ZUd1aWxkU3RpY2tlciIsInN0aWNrZXJJZCIsInN0aWNrZXIiLCJkZWxldGVHdWlsZFRlbXBsYXRlIiwiZGVsZXRlSW50ZWdyYXRpb24iLCJpbnRlZ3JhdGlvbklkIiwiaW50ZWdyYXRpb24iLCJkZWxldGVJbnZpdGUiLCJpbnZpdGVDb2RlIiwiaW52aXRlIiwiZGVsZXRlTWVzc2FnZSIsImRlbGV0ZU1lc3NhZ2VzIiwibWVzc2FnZUlkcyIsImJ1bGsiLCJtZXNzYWdlcyIsInNsaWNlIiwiZGVsZXRlT3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwib3JpZ2luYWwiLCJkZWxldGVPd25SZWFjdGlvbiIsImRlbGV0ZVJlYWN0aW9uc0FsbCIsImRlbGV0ZVJlYWN0aW9uc0Vtb2ppIiwiZGVsZXRlUm9sZSIsImRlbGV0ZVNjaGVkdWxlZEV2ZW50IiwiZXZlbnRJZCIsImV2ZW50IiwiZGVsZXRlU3RhZ2VJbnN0YW5jZSIsInN0YWdlIiwiZGVsZXRlVXNlclJlYWN0aW9uIiwiZGVsZXRlV2ViaG9vayIsIndlYmhvb2tJZCIsImRlbGV0ZVdlYmhvb2tNZXNzYWdlIiwiZGVsZXRlV2ViaG9va1dpdGhUb2tlbiIsIndlYmhvb2siLCJlZGl0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9ucyIsInBlcm1pc3Npb24iLCJlZGl0QXV0b21vZFJ1bGUiLCJlZGl0Qm90UHJvZmlsZSIsImJvdEF2YXRhclVSTCIsImJhbm5lciIsImJvdEJhbm5lclVSTCIsImN1cnJlbnRVc2VyIiwidXNlcm5hbWUiLCJ0cmltIiwiZWRpdENoYW5uZWwiLCJlZGl0Q2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZXMiLCJlZGl0Q2hhbm5lbFBvc2l0aW9ucyIsImVkaXRFbW9qaSIsImVkaXRBcHBsaWNhdGlvbkVtb2ppIiwiZWRpdEZvbGxvd3VwTWVzc2FnZSIsImVkaXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJlZGl0R3VpbGQiLCJlZGl0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJlZGl0R3VpbGRNZmFMZXZlbCIsIm1mYUxldmVsIiwibWZhIiwibGV2ZWwiLCJlZGl0R3VpbGRTdGlja2VyIiwiZWRpdEd1aWxkVGVtcGxhdGUiLCJlZGl0TWVzc2FnZSIsImVkaXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UiLCJlZGl0T3JpZ2luYWxXZWJob29rTWVzc2FnZSIsInR5cGUiLCJJbnRlcmFjdGlvblJlc3BvbnNlVHlwZXMiLCJVcGRhdGVNZXNzYWdlIiwiZWRpdE93blZvaWNlU3RhdGUiLCJ2b2ljZSIsInJlcXVlc3RUb1NwZWFrVGltZXN0YW1wIiwidG9JU09TdHJpbmciLCJlZGl0U2NoZWR1bGVkRXZlbnQiLCJlZGl0Um9sZSIsImVkaXRSb2xlUG9zaXRpb25zIiwiZWRpdFN0YWdlSW5zdGFuY2UiLCJ0b3BpYyIsImVkaXRVc2VyVm9pY2VTdGF0ZSIsImVkaXRXZWJob29rIiwiZWRpdFdlYmhvb2tNZXNzYWdlIiwiZWRpdFdlYmhvb2tXaXRoVG9rZW4iLCJlZGl0V2VsY29tZVNjcmVlbiIsIndlbGNvbWUiLCJlZGl0V2lkZ2V0U2V0dGluZ3MiLCJ3aWRnZXQiLCJleGVjdXRlV2ViaG9vayIsImZvbGxvd0Fubm91bmNlbWVudCIsInNvdXJjZUNoYW5uZWxJZCIsInRhcmdldENoYW5uZWxJZCIsImZvbGxvdyIsIndlYmhvb2tDaGFubmVsSWQiLCJnZXRBY3RpdmVUaHJlYWRzIiwiYWN0aXZlIiwiZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbiIsImFjY2Vzc1Rva2VuIiwiZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMiLCJnZXRBcHBsaWNhdGlvbkluZm8iLCJvYXV0aDIiLCJhcHBsaWNhdGlvbiIsImVkaXRBcHBsaWNhdGlvbkluZm8iLCJnZXRDdXJyZW50QXV0aGVudGljYXRpb25JbmZvIiwiY3VycmVudEF1dGhvcml6YXRpb24iLCJleGNoYW5nZVRva2VuIiwiY2xpZW50SWQiLCJjbGllbnRTZWNyZXQiLCJiYXNpY0NyZWRlbnRpYWxzIiwiQnVmZmVyIiwiZnJvbSIsImdyYW50VHlwZSIsInNjb3BlIiwidG9rZW5FeGNoYW5nZSIsInJldm9rZVRva2VuIiwidG9rZW5SZXZva2UiLCJnZXRBdWRpdExvZyIsImF1ZGl0bG9ncyIsImdldEF1dG9tb2RSdWxlIiwiZ2V0QXV0b21vZFJ1bGVzIiwiZ2V0QXZhaWxhYmxlVm9pY2VSZWdpb25zIiwicmVnaW9ucyIsImdldEJhbiIsIm1lbWJlcnMiLCJiYW4iLCJnZXRCYW5zIiwiYmFucyIsImdldENoYW5uZWwiLCJnZXRDaGFubmVsSW52aXRlcyIsImdldENoYW5uZWxzIiwiZ2V0Q2hhbm5lbFdlYmhvb2tzIiwiZ2V0RG1DaGFubmVsIiwiZG0iLCJyZWNpcGllbnRJZCIsImdldEdyb3VwRG1DaGFubmVsIiwiZ2V0RW1vamkiLCJlbW9qaUlkIiwiZ2V0QXBwbGljYXRpb25FbW9qaSIsImdldEVtb2ppcyIsImdldEFwcGxpY2F0aW9uRW1vamlzIiwiZ2V0Rm9sbG93dXBNZXNzYWdlIiwiZ2V0R2F0ZXdheUJvdCIsImdhdGV3YXlCb3QiLCJnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzIiwiZ2V0R3VpbGQiLCJjb3VudHMiLCJnZXRHdWlsZHMiLCJtYWtlUmVxdWVzdE9wdGlvbnMiLCJ1c2VyR3VpbGRzIiwiZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJnZXRHdWlsZFByZXZpZXciLCJwcmV2aWV3IiwiZ2V0R3VpbGRUZW1wbGF0ZSIsImdldEd1aWxkVGVtcGxhdGVzIiwiZ2V0R3VpbGRXZWJob29rcyIsImdldEludGVncmF0aW9ucyIsImludGVncmF0aW9ucyIsImdldEludml0ZSIsImdldEludml0ZXMiLCJnZXRNZXNzYWdlIiwiZ2V0TWVzc2FnZXMiLCJnZXRTdGlja2VyUGFjayIsInN0aWNrZXJQYWNrSWQiLCJzdGlja2VyUGFjayIsImdldFN0aWNrZXJQYWNrcyIsInN0aWNrZXJQYWNrcyIsImdldE9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSIsImdldFBpbm5lZE1lc3NhZ2VzIiwicGlucyIsImdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMiLCJwcml2YXRlIiwiZ2V0UHJpdmF0ZUpvaW5lZEFyY2hpdmVkVGhyZWFkcyIsImpvaW5lZCIsImdldFBydW5lQ291bnQiLCJwcnVuZSIsImdldFB1YmxpY0FyY2hpdmVkVGhyZWFkcyIsInB1YmxpYyIsImdldFJvbGVzIiwiZ2V0Um9sZSIsImdldFNjaGVkdWxlZEV2ZW50Iiwid2l0aFVzZXJDb3VudCIsImdldFNjaGVkdWxlZEV2ZW50cyIsImdldFNjaGVkdWxlZEV2ZW50VXNlcnMiLCJ1c2VycyIsImdldFNlc3Npb25JbmZvIiwiZ2V0U3RhZ2VJbnN0YW5jZSIsImdldE93blZvaWNlU3RhdGUiLCJnZXRVc2VyVm9pY2VTdGF0ZSIsImdldFN0aWNrZXIiLCJnZXRHdWlsZFN0aWNrZXIiLCJnZXRHdWlsZFN0aWNrZXJzIiwiZ2V0VGhyZWFkTWVtYmVyIiwiZ2V0VGhyZWFkTWVtYmVycyIsImdldFJlYWN0aW9ucyIsImdldFVzZXIiLCJnZXRDdXJyZW50VXNlciIsImdldFVzZXJDb25uZWN0aW9ucyIsImNvbm5lY3Rpb25zIiwiZ2V0VXNlckFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24iLCJyb2xlQ29ubmVjdGlvbnMiLCJnZXRWYW5pdHlVcmwiLCJ2YW5pdHkiLCJnZXRWb2ljZVJlZ2lvbnMiLCJnZXRXZWJob29rIiwiZ2V0V2ViaG9va01lc3NhZ2UiLCJnZXRXZWJob29rV2l0aFRva2VuIiwiZ2V0V2VsY29tZVNjcmVlbiIsImdldFdpZGdldCIsIndpZGdldEpzb24iLCJnZXRXaWRnZXRTZXR0aW5ncyIsImpvaW5UaHJlYWQiLCJtZSIsImxlYXZlR3VpbGQiLCJsZWF2ZSIsImxlYXZlVGhyZWFkIiwicHVibGlzaE1lc3NhZ2UiLCJjcm9zc3Bvc3QiLCJyZW1vdmVSb2xlIiwicmVtb3ZlVGhyZWFkTWVtYmVyIiwicmVtb3ZlRG1SZWNpcGllbnQiLCJzZW5kRm9sbG93dXBNZXNzYWdlIiwic2VuZEludGVyYWN0aW9uUmVzcG9uc2UiLCJpbnRlcmFjdGlvbklkIiwicGFyYW1zIiwiY2FsbGJhY2siLCJzZW5kTWVzc2FnZSIsInN0YXJ0VGhyZWFkV2l0aE1lc3NhZ2UiLCJzdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlIiwiZ2V0UG9sbEFuc3dlclZvdGVycyIsImFuc3dlcklkIiwicG9sbHMiLCJ2b3RlcyIsImVuZFBvbGwiLCJleHBpcmUiLCJzeW5jR3VpbGRUZW1wbGF0ZSIsImJhbk1lbWJlciIsImJ1bGtCYW5NZW1iZXJzIiwiYnVsa0JhbiIsImVkaXRCb3RNZW1iZXIiLCJlZGl0TWVtYmVyIiwiZ2V0TWVtYmVyIiwiZ2V0Q3VycmVudE1lbWJlciIsImN1cnJlbnRNZW1iZXIiLCJnZXRNZW1iZXJzIiwiZ2V0QXBwbGljYXRpb25BY3Rpdml0eUluc3RhbmNlIiwiaW5zdGFuY2VJZCIsImFwcGxpY2F0aW9uQWN0aXZpdHlJbnN0YW5jZSIsImtpY2tNZW1iZXIiLCJwaW5NZXNzYWdlIiwicGluIiwicHJ1bmVNZW1iZXJzIiwic2VhcmNoTWVtYmVycyIsInF1ZXJ5Iiwic2VhcmNoIiwiZ2V0R3VpbGRPbmJvYXJkaW5nIiwib25ib2FyZGluZyIsImVkaXRHdWlsZE9uYm9hcmRpbmciLCJ1bmJhbk1lbWJlciIsInVucGluTWVzc2FnZSIsInRyaWdnZXJUeXBpbmdJbmRpY2F0b3IiLCJ0eXBpbmciLCJ1cHNlcnRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzIiwidXBzZXJ0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzIiwiZWRpdFVzZXJBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uIiwiYWRkR3VpbGRNZW1iZXIiLCJjcmVhdGVUZXN0RW50aXRsZW1lbnQiLCJtb25ldGl6YXRpb24iLCJlbnRpdGxlbWVudHMiLCJsaXN0RW50aXRsZW1lbnRzIiwiZ2V0RW50aXRsZW1lbnQiLCJlbnRpdGxlbWVudElkIiwiZW50aXRsZW1lbnQiLCJkZWxldGVUZXN0RW50aXRsZW1lbnQiLCJjb25zdW1lRW50aXRsZW1lbnQiLCJsaXN0U2t1cyIsInNrdXMiLCJsaXN0U3Vic2NyaXB0aW9ucyIsInNrdUlkIiwic3Vic2NyaXB0aW9ucyIsImdldFN1YnNjcmlwdGlvbiIsInN1YnNjcmlwdGlvbklkIiwic3Vic2NyaXB0aW9uIiwic2VuZFNvdW5kYm9hcmRTb3VuZCIsInNvdW5kYm9hcmQiLCJzZW5kU291bmQiLCJsaXN0RGVmYXVsdFNvdW5kYm9hcmRTb3VuZHMiLCJsaXN0RGVmYXVsdCIsImxpc3RHdWlsZFNvdW5kYm9hcmRTb3VuZHMiLCJndWlsZFNvdW5kcyIsImdldEd1aWxkU291bmRib2FyZFNvdW5kIiwic291bmRJZCIsImd1aWxkU291bmQiLCJjcmVhdGVHdWlsZFNvdW5kYm9hcmRTb3VuZCIsIm1vZGlmeUd1aWxkU291bmRib2FyZFNvdW5kIiwiZGVsZXRlR3VpbGRTb3VuZGJvYXJkU291bmQiLCJwcmVmZXJTbmFrZUNhc2UiLCJlbmFibGVkIiwiY2FtZWxpemVyIiwieCIsIkh0dHBSZXNwb25zZUNvZGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0lBNEVhQSx1QkFBdUI7ZUFBdkJBOztJQUZBQyxlQUFlO2VBQWZBOztJQURBQyxtQkFBbUI7ZUFBbkJBOztJQU9BQyx3QkFBd0I7ZUFBeEJBOztJQURBQyx3QkFBd0I7ZUFBeEJBOztJQUVBQyx1QkFBdUI7ZUFBdkJBOztJQUpBQywyQkFBMkI7ZUFBM0JBOztJQUNBQyw2QkFBNkI7ZUFBN0JBOztJQUlBQyx1QkFBdUI7ZUFBdkJBOztJQUVHQyxpQkFBaUI7ZUFBakJBOzs7NEJBcEZPO3VCQXdEaEI7dUJBV0E7K0JBQ29DO3VCQUNyQjt3QkFDTztBQUd0QixNQUFNUCxzQkFBc0I7QUFDNUIsTUFBTUQsa0JBQWtCO0FBRXhCLE1BQU1ELDBCQUEwQjtBQUNoQyxNQUFNTSw4QkFBOEI7QUFDcEMsTUFBTUMsZ0NBQWdDO0FBQ3RDLE1BQU1ILDJCQUEyQjtBQUNqQyxNQUFNRCwyQkFBMkI7QUFDakMsTUFBTUUsMEJBQTBCO0FBQ2hDLE1BQU1HLDBCQUEwQjtBQUVoQyxTQUFTQyxrQkFBa0JDLE9BQWlDO0lBQ2pFLE1BQU1DLGdCQUFnQkQsUUFBUUMsYUFBYSxHQUFHQyxPQUFPRixRQUFRQyxhQUFhLElBQUlFLElBQUFBLHdCQUFpQixFQUFDSCxRQUFRSSxLQUFLO0lBRTdHLE1BQU1DLFVBQVVMLFFBQVFNLEtBQUssRUFBRUQsV0FBV2Q7SUFFMUMsTUFBTWdCLE9BQW9CO1FBQ3hCTjtRQUNBTyxlQUFlUixRQUFRTSxLQUFLLEVBQUVFO1FBQzlCQyxxQkFBcUJULFFBQVFNLEtBQUssRUFBRUcsdUJBQXVCO1FBQzNESjtRQUNBSyxrQkFBa0I7UUFDbEJDLHFCQUFxQjtRQUNy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
|
|
1667
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ25vZGU6YnVmZmVyJ1xuaW1wb3J0IHsgdHlwZSBJbnNwZWN0T3B0aW9ucywgaW5zcGVjdCB9IGZyb20gJ25vZGU6dXRpbCdcbmltcG9ydCB0eXBlIHtcbiAgQmlnU3RyaW5nLFxuICBDYW1lbGl6ZSxcbiAgRGlzY29yZEFjY2Vzc1Rva2VuUmVzcG9uc2UsXG4gIERpc2NvcmRBY3Rpdml0eUluc3RhbmNlLFxuICBEaXNjb3JkQXBwbGljYXRpb24sXG4gIERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQsXG4gIERpc2NvcmRBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uLFxuICBEaXNjb3JkQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbk1ldGFkYXRhLFxuICBEaXNjb3JkQXVkaXRMb2csXG4gIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGUsXG4gIERpc2NvcmRCYW4sXG4gIERpc2NvcmRCdWxrQmFuLFxuICBEaXNjb3JkQ2hhbm5lbCxcbiAgRGlzY29yZENvbm5lY3Rpb24sXG4gIERpc2NvcmRDdXJyZW50QXV0aG9yaXphdGlvbixcbiAgRGlzY29yZEVtb2ppLFxuICBEaXNjb3JkRW50aXRsZW1lbnQsXG4gIERpc2NvcmRGb2xsb3dlZENoYW5uZWwsXG4gIERpc2NvcmRHZXRBbnN3ZXJWb3Rlc1Jlc3BvbnNlLFxuICBEaXNjb3JkR2V0R2F0ZXdheUJvdCxcbiAgRGlzY29yZEd1aWxkLFxuICBEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyxcbiAgRGlzY29yZEd1aWxkT25ib2FyZGluZyxcbiAgRGlzY29yZEd1aWxkUHJldmlldyxcbiAgRGlzY29yZEd1aWxkV2lkZ2V0LFxuICBEaXNjb3JkR3VpbGRXaWRnZXRTZXR0aW5ncyxcbiAgRGlzY29yZEluY2lkZW50c0RhdGEsXG4gIERpc2NvcmRJbnRlZ3JhdGlvbixcbiAgRGlzY29yZEludGVyYWN0aW9uQ2FsbGJhY2tSZXNwb25zZSxcbiAgRGlzY29yZEludml0ZSxcbiAgRGlzY29yZEludml0ZU1ldGFkYXRhLFxuICBEaXNjb3JkTGlzdEFjdGl2ZVRocmVhZHMsXG4gIERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzLFxuICBEaXNjb3JkTG9iYnksXG4gIERpc2NvcmRMb2JieU1lbWJlcixcbiAgRGlzY29yZE1lbWJlcixcbiAgRGlzY29yZE1lbWJlcldpdGhVc2VyLFxuICBEaXNjb3JkTWVzc2FnZSxcbiAgRGlzY29yZFBydW5lZENvdW50LFxuICBEaXNjb3JkUm9sZSxcbiAgRGlzY29yZFNjaGVkdWxlZEV2ZW50LFxuICBEaXNjb3JkU2t1LFxuICBEaXNjb3JkU291bmRib2FyZFNvdW5kLFxuICBEaXNjb3JkU3RhZ2VJbnN0YW5jZSxcbiAgRGlzY29yZFN0aWNrZXIsXG4gIERpc2NvcmRTdGlja2VyUGFjayxcbiAgRGlzY29yZFN1YnNjcmlwdGlvbixcbiAgRGlzY29yZFRlbXBsYXRlLFxuICBEaXNjb3JkVGhyZWFkTWVtYmVyLFxuICBEaXNjb3JkVXNlcixcbiAgRGlzY29yZFZhbml0eVVybCxcbiAgRGlzY29yZFZvaWNlUmVnaW9uLFxuICBEaXNjb3JkVm9pY2VTdGF0ZSxcbiAgRGlzY29yZFdlYmhvb2ssXG4gIERpc2NvcmRXZWxjb21lU2NyZWVuLFxuICBNb2RpZnlHdWlsZFRlbXBsYXRlLFxufSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZUJpdHMsXG4gIGNhbWVsaXplLFxuICBjYW1lbFRvU25ha2VDYXNlLFxuICBESVNDT1JERU5PX1ZFUlNJT04sXG4gIGRlbGF5LFxuICBnZXRCb3RJZEZyb21Ub2tlbixcbiAgaGFzUHJvcGVydHksXG4gIGxvZ2dlcixcbiAgcHJvY2Vzc1JlYWN0aW9uU3RyaW5nLFxuICBzbm93Zmxha2VUb1RpbWVzdGFtcCxcbiAgdXJsVG9CYXNlNjQsXG59IGZyb20gJ0BkaXNjb3JkZW5vL3V0aWxzJ1xuaW1wb3J0IHsgY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQgfSBmcm9tICcuL2ludmFsaWRCdWNrZXQuanMnXG5pbXBvcnQgeyBRdWV1ZSB9IGZyb20gJy4vcXVldWUuanMnXG5pbXBvcnQgeyBjcmVhdGVSb3V0ZXMgfSBmcm9tICcuL3JvdXRlcy5qcydcbmltcG9ydCB0eXBlIHsgQ3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCBDcmVhdGVSZXN0TWFuYWdlck9wdGlvbnMsIE1ha2VSZXF1ZXN0T3B0aW9ucywgUmVzdE1hbmFnZXIsIFNlbmRSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vdHlwZXMuanMnXG5cbmV4cG9ydCBjb25zdCBESVNDT1JEX0FQSV9WRVJTSU9OID0gMTBcbmV4cG9ydCBjb25zdCBESVNDT1JEX0FQSV9VUkwgPSAnaHR0cHM6Ly9kaXNjb3JkLmNvbS9hcGknXG5cbmV4cG9ydCBjb25zdCBBVURJVF9MT0dfUkVBU09OX0hFQURFUiA9ICd4LWF1ZGl0LWxvZy1yZWFzb24nXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9SRU1BSU5JTkdfSEVBREVSID0gJ3gtcmF0ZWxpbWl0LXJlbWFpbmluZydcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX1JFU0VUX0FGVEVSX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1yZXNldC1hZnRlcidcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX0dMT0JBTF9IRUFERVIgPSAneC1yYXRlbGltaXQtZ2xvYmFsJ1xuZXhwb3J0IGNvbnN0IFJBVEVfTElNSVRfQlVDS0VUX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1idWNrZXQnXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9MSU1JVF9IRUFERVIgPSAneC1yYXRlbGltaXQtbGltaXQnXG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9TQ09QRV9IRUFERVIgPSAneC1yYXRlbGltaXQtc2NvcGUnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXN0TWFuYWdlcihvcHRpb25zOiBDcmVhdGVSZXN0TWFuYWdlck9wdGlvbnMpOiBSZXN0TWFuYWdlciB7XG4gIGNvbnN0IGFwcGxpY2F0aW9uSWQgPSBvcHRpb25zLmFwcGxpY2F0aW9uSWQgPyBCaWdJbnQob3B0aW9ucy5hcHBsaWNhdGlvbklkKSA6IGdldEJvdElkRnJvbVRva2VuKG9wdGlvbnMudG9rZW4pXG5cbiAgY29uc3QgYmFzZVVybCA9IG9wdGlvbnMucHJveHk/LmJhc2VVcmwgPz8gRElTQ09SRF9BUElfVVJMXG4gIC8vIERpc2NvcmQgZXJyb3IgY2FuIGdldCBuZXN0ZWQgYSBsb3QsIHNvIHdlIHVzZSBhIGN1c3RvbSBpbnNwZWN0IHRvIGNoYW5nZSB0aGUgZGVwdGggdG8gSW5maW5pdHlcbiAgY29uc3QgYmFzZUVycm9yUHJvdG90eXBlID0ge1xuICAgIFtpbnNwZWN0LmN1c3RvbV0oX2RlcHRoOiBudW1iZXIsIG9wdGlvbnM6IEluc3BlY3RPcHRpb25zLCBfaW5zcGVjdDogdHlwZW9mIGluc3BlY3QpIHtcbiAgICAgIHJldHVybiBfaW5zcGVjdCh0aGlzLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGRlcHRoOiBJbmZpbml0eSxcbiAgICAgICAgLy8gU2luY2Ugd2UgY2FsbCBpbnNwZWN0IG9uIG91cnNlbGYsIHdlIG5lZWQgdG8gZGlzYWJsZSB0aGUgY2FsbHMgdG8gdGhlIGluc3BlY3QuY3VzdG9tIHN5bWJvbCBvciBlbHNlIGl0IHdpbGwgY2F1c2UgYW4gaW5maW5pdGUgbG9vcC5cbiAgICAgICAgY3VzdG9tSW5zcGVjdDogZmFsc2UsXG4gICAgICB9KVxuICAgIH0sXG4gIH1cblxuICBjb25zdCByZXN0OiBSZXN0TWFuYWdlciA9IHtcbiAgICBhcHBsaWNhdGlvbklkLFxuICAgIGF1dGhvcml6YXRpb246IG9wdGlvbnMucHJveHk/LmF1dGhvcml6YXRpb24sXG4gICAgYXV0aG9yaXphdGlvbkhlYWRlcjogb3B0aW9ucy5wcm94eT8uYXV0aG9yaXphdGlvbkhlYWRlciA/PyAnYXV0aG9yaXphdGlvbicsXG4gICAgYmFzZVVybCxcbiAgICBkZWxldGVRdWV1ZURlbGF5OiA2MDAwMCxcbiAgICBnbG9iYWxseVJhdGVMaW1pdGVkOiBmYWxzZSxcbiAgICBpbnZhbGlkQnVja2V0OiBjcmVhdGVJbnZhbGlkUmVxdWVzdEJ1Y2tldCh7IGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgfSksXG4gICAgaXNQcm94aWVkOiAhYmFzZVVybC5zdGFydHNXaXRoKERJU0NPUkRfQVBJX1VSTCksXG4gICAgdXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludDogb3B0aW9ucy5wcm94eT8udXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCxcbiAgICBtYXhSZXRyeUNvdW50OiBJbmZpbml0eSxcbiAgICBwcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRoczogZmFsc2UsXG4gICAgcXVldWVzOiBuZXcgTWFwKCksXG4gICAgcmF0ZUxpbWl0ZWRQYXRoczogbmV3IE1hcCgpLFxuICAgIHRva2VuOiBvcHRpb25zLnRva2VuLFxuICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiA/PyBESVNDT1JEX0FQSV9WRVJTSU9OLFxuICAgIGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyLFxuICAgIGV2ZW50czoge1xuICAgICAgcmVxdWVzdDogKCkgPT4ge30sXG4gICAgICByZXNwb25zZTogKCkgPT4ge30sXG4gICAgICByZXF1ZXN0RXJyb3I6ICgpID0+IHt9LFxuICAgICAgLi4ub3B0aW9ucy5ldmVudHMsXG4gICAgfSxcblxuICAgIHJvdXRlczogY3JlYXRlUm91dGVzKCksXG5cbiAgICBjcmVhdGVCYXNlSGVhZGVycygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICd1c2VyLWFnZW50JzogYERpc2NvcmRCb3QgKGh0dHBzOi8vZ2l0aHViLmNvbS9kaXNjb3JkZW5vL2Rpc2NvcmRlbm8sIHYke0RJU0NPUkRFTk9fVkVSU0lPTn0pYCxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2hlY2tSYXRlTGltaXRzKHVybCwgaWRlbnRpZmllcikge1xuICAgICAgY29uc3QgcmF0ZWxpbWl0ZWQgPSByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZ2V0KGAke2lkZW50aWZpZXJ9JHt1cmx9YClcblxuICAgICAgY29uc3QgZ2xvYmFsID0gcmVzdC5yYXRlTGltaXRlZFBhdGhzLmdldCgnZ2xvYmFsJylcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcblxuICAgICAgaWYgKHJhdGVsaW1pdGVkICYmIG5vdyA8IHJhdGVsaW1pdGVkLnJlc2V0VGltZXN0YW1wKSB7XG4gICAgICAgIHJldHVybiByYXRlbGltaXRlZC5yZXNldFRpbWVzdGFtcCAtIG5vd1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2xvYmFsICYmIG5vdyA8IGdsb2JhbC5yZXNldFRpbWVzdGFtcCkge1xuICAgICAgICByZXR1cm4gZ2xvYmFsLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICBhc3luYyB1cGRhdGVUb2tlblF1ZXVlcyhvbGRUb2tlbiwgbmV3VG9rZW4pIHtcbiAgICAgIGlmIChyZXN0LmlzUHJveGllZCkge1xuICAgICAgICBpZiAoIXJlc3QudXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiVGhlICdwcm94eS51cGRhdGVCZWFyZXJUb2tlbkVuZHBvaW50JyBvcHRpb24gbmVlZHMgdG8gYmUgc2V0IHdoZW4gdXNpbmcgYSByZXN0IHByb3h5IGFuZCBuZWVkZWQgdG8gY2FsbCAndXBkYXRlVG9rZW5RdWV1ZXMnXCIsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz5cblxuICAgICAgICBpZiAocmVzdC5hdXRob3JpemF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBoZWFkZXJzW3Jlc3QuYXV0aG9yaXphdGlvbkhlYWRlcl0gPSByZXN0LmF1dGhvcml6YXRpb25cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGZldGNoKGAke3Jlc3QuYmFzZVVybH0vJHtyZXN0LnVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnR9YCwge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIG9sZFRva2VuLFxuICAgICAgICAgICAgbmV3VG9rZW4sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3SWRlbnRpZmllciA9IGBCZWFyZXIgJHtuZXdUb2tlbn1gXG5cbiAgICAgIC8vIFVwZGF0ZSBhbGwgdGhlIHF1ZXVlc1xuICAgICAgZm9yIChjb25zdCBba2V5LCBxdWV1ZV0gb2YgcmVzdC5xdWV1ZXMuZW50cmllcygpKSB7XG4gICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoYEJlYXJlciAke29sZFRva2VufWApKSBjb250aW51ZVxuXG4gICAgICAgIHJlc3QucXVldWVzLmRlbGV0ZShrZXkpXG4gICAgICAgIHF1ZXVlLmlkZW50aWZpZXIgPSBuZXdJZGVudGlmaWVyXG5cbiAgICAgICAgY29uc3QgbmV3S2V5ID0gYCR7bmV3SWRlbnRpZmllcn0ke3F1ZXVlLnVybH1gXG4gICAgICAgIGNvbnN0IG5ld1F1ZXVlID0gcmVzdC5xdWV1ZXMuZ2V0KG5ld0tleSlcblxuICAgICAgICAvLyBNZXJnZSB0aGUgcXVldWVzXG4gICAgICAgIGlmIChuZXdRdWV1ZSkge1xuICAgICAgICAgIG5ld1F1ZXVlLndhaXRpbmcudW5zaGlmdCguLi5xdWV1ZS53YWl0aW5nKVxuICAgICAgICAgIG5ld1F1ZXVlLnBlbmRpbmcudW5zaGlmdCguLi5xdWV1ZS5wZW5kaW5nKVxuXG4gICAgICAgICAgcXVldWUud2FpdGluZyA9IFtdXG4gICAgICAgICAgcXVldWUucGVuZGluZyA9IFtdXG5cbiAgICAgICAgICBxdWV1ZS5jbGVhbnVwKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN0LnF1ZXVlcy5zZXQobmV3S2V5LCBxdWV1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHJhdGVsaW1pdFBhdGhdIG9mIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChgQmVhcmVyICR7b2xkVG9rZW59YCkpIGNvbnRpbnVlXG5cbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChgJHtuZXdJZGVudGlmaWVyfSR7cmF0ZWxpbWl0UGF0aC51cmx9YCwgcmF0ZWxpbWl0UGF0aClcblxuICAgICAgICBpZiAocmF0ZWxpbWl0UGF0aC5idWNrZXRJZCkge1xuICAgICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoYCR7bmV3SWRlbnRpZmllcn0ke3JhdGVsaW1pdFBhdGguYnVja2V0SWR9YCwgcmF0ZWxpbWl0UGF0aClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjaGFuZ2VUb0Rpc2NvcmRGb3JtYXQob2JqOiBhbnkpOiBhbnkge1xuICAgICAgaWYgKG9iaiA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICByZXR1cm4gb2JqLm1hcCgoaXRlbSkgPT4gcmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQoaXRlbSkpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdPYmo6IGFueSA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV1cblxuICAgICAgICAgIC8vIElmIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiBzbmFrZV9jYXNlIHdlIGNhbiBhc3N1bWUgaXQgaXMgYWxyZWFkeSBpbiB0aGUgZGlzY29yZCBmb3JtYXQuXG4gICAgICAgICAgaWYgKGtleS5pbmNsdWRlcygnXycpKSB7XG4gICAgICAgICAgICBuZXdPYmpba2V5XSA9IHZhbHVlXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNvbWUgZmFsc3kgdmFsdWVzIHNob3VsZCBiZSBhbGxvd2VkIGxpa2UgbnVsbCBvciAwXG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICAgIGNhc2UgJ3Blcm1pc3Npb25zJzpcbiAgICAgICAgICAgICAgY2FzZSAnYWxsb3cnOlxuICAgICAgICAgICAgICBjYXNlICdkZW55JzpcbiAgICAgICAgICAgICAgICBuZXdPYmpba2V5XSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IGNhbGN1bGF0ZUJpdHModmFsdWUpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgY2FzZSAnZGVmYXVsdE1lbWJlclBlcm1pc3Npb25zJzpcbiAgICAgICAgICAgICAgICBuZXdPYmouZGVmYXVsdF9tZW1iZXJfcGVybWlzc2lvbnMgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBjYWxjdWxhdGVCaXRzKHZhbHVlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIGNhc2UgJ25hbWVMb2NhbGl6YXRpb25zJzpcbiAgICAgICAgICAgICAgICBuZXdPYmoubmFtZV9sb2NhbGl6YXRpb25zID0gdmFsdWVcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICBjYXNlICdkZXNjcmlwdGlvbkxvY2FsaXphdGlvbnMnOlxuICAgICAgICAgICAgICAgIG5ld09iai5kZXNjcmlwdGlvbl9sb2NhbGl6YXRpb25zID0gdmFsdWVcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5ld09ialtjYW1lbFRvU25ha2VDYXNlKGtleSldID0gcmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQodmFsdWUpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3T2JqXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYmlnaW50JykgcmV0dXJuIG9iai50b1N0cmluZygpXG5cbiAgICAgIHJldHVybiBvYmpcbiAgICB9LFxuXG4gICAgY3JlYXRlUmVxdWVzdEJvZHkobWV0aG9kLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5jcmVhdGVCYXNlSGVhZGVycygpXG5cbiAgICAgIGlmIChvcHRpb25zPy51bmF1dGhvcml6ZWQgIT09IHRydWUpIGhlYWRlcnMuYXV0aG9yaXphdGlvbiA9IGBCb3QgJHtyZXN0LnRva2VufWBcblxuICAgICAgLy8gSUYgQSBSRUFTT04gSVMgUFJPVklERUQgRU5DT0RFIElUIElOIEhFQURFUlNcbiAgICAgIGlmIChvcHRpb25zPy5yZWFzb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW0FVRElUX0xPR19SRUFTT05fSEVBREVSXSA9IGVuY29kZVVSSUNvbXBvbmVudChvcHRpb25zPy5yZWFzb24pXG4gICAgICB9XG5cbiAgICAgIGxldCBib2R5OiBzdHJpbmcgfCBGb3JtRGF0YSB8IHVuZGVmaW5lZFxuXG4gICAgICAvLyBUT0RPOiBjaGVjayBpZiB3ZSBuZWVkIHRvIGFkZCBzcGVjaWZpYyBjaGVjayBmb3IgR0VUIG1ldGhvZFxuICAgICAgLy8gU2luY2UgR0VUIGRvZXMgbm90IGFsbG93IGJvZGllc1xuXG4gICAgICAvLyBIYXZlIHRvIGNoZWNrIGZvciBhdHRhY2htZW50cyBmaXJzdCwgc2luY2UgYm9keSB0aGVuIGhhcyB0byBiZSBzZW5kIGluIGEgZGlmZmVyZW50IHdheS5cbiAgICAgIGlmIChvcHRpb25zPy5maWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnMuZmlsZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBmb3JtLmFwcGVuZChgZmlsZXNbJHtpfV1gLCBvcHRpb25zLmZpbGVzW2ldLmJsb2IsIG9wdGlvbnMuZmlsZXNbaV0ubmFtZSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhdmUgdG8gdXNlIGNoYW5nZVRvRGlzY29yZEZvcm1hdCBvciBlbHNlIEpTT04uc3RyaW5naWZ5IG1heSB0aHJvdyBhbiBlcnJvciBmb3IgdGhlIHByZXNlbmNlIG9mIEJpZ0ludChzKSBpbiB0aGUganNvblxuICAgICAgICBmb3JtLmFwcGVuZCgncGF5bG9hZF9qc29uJywgSlNPTi5zdHJpbmdpZnkocmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQoeyAuLi5vcHRpb25zLmJvZHksIGZpbGVzOiB1bmRlZmluZWQgfSkpKVxuXG4gICAgICAgIC8vIE5vIG5lZWQgdG8gc2V0IHRoZSBgY29udGVudC10eXBlYCBoZWFkZXIgc2luY2UgYGZldGNoYCBkb2VzIHRoYXQgYXV0b21hdGljYWxseSBmb3IgdXMgd2hlbiB3ZSB1c2UgYSBgRm9ybURhdGFgIG9iamVjdC5cbiAgICAgICAgYm9keSA9IGZvcm1cbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uYm9keSAmJiBvcHRpb25zLmhlYWRlcnMgJiYgb3B0aW9ucy5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9PT0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpIHtcbiAgICAgICAgLy8gT0F1dGgyIGJvZHkgaGFuZGxpbmdcbiAgICAgICAgY29uc3QgZm9ybUJvZHk6IHN0cmluZ1tdID0gW11cblxuICAgICAgICBjb25zdCBkaXNjb3JkQm9keSA9IHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KG9wdGlvbnMuYm9keSlcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gZGlzY29yZEJvZHkpIHtcbiAgICAgICAgICBmb3JtQm9keS5wdXNoKGAke2VuY29kZVVSSUNvbXBvbmVudChwcm9wKX09JHtlbmNvZGVVUklDb21wb25lbnQoZGlzY29yZEJvZHlbcHJvcF0pfWApXG4gICAgICAgIH1cblxuICAgICAgICBib2R5ID0gZm9ybUJvZHkuam9pbignJicpXG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnM/LmJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAob3B0aW9ucy5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgICAgICBib2R5ID0gb3B0aW9ucy5ib2R5XG4gICAgICAgICAgLy8gTm8gbmVlZCB0byBzZXQgdGhlIGBjb250ZW50LXR5cGVgIGhlYWRlciBzaW5jZSBgZmV0Y2hgIGRvZXMgdGhhdCBhdXRvbWF0aWNhbGx5IGZvciB1cyB3aGVuIHdlIHVzZSBhIGBGb3JtRGF0YWAgb2JqZWN0LlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShyZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdChvcHRpb25zLmJvZHkpKVxuICAgICAgICAgIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gYGFwcGxpY2F0aW9uL2pzb25gXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU09NRVRJTUVTIFNQRUNJQUwgSEVBREVSUyAoRS5HLiBDVVNUT00gQVVUSE9SSVpBVElPTikgTkVFRCBUTyBCRSBVU0VEXG4gICAgICBpZiAob3B0aW9ucz8uaGVhZGVycykge1xuICAgICAgICBPYmplY3QuYXNzaWduKGhlYWRlcnMsIG9wdGlvbnMuaGVhZGVycylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocygpIHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcblxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcmVzdC5yYXRlTGltaXRlZFBhdGhzLmVudHJpZXMoKSkge1xuICAgICAgICAvLyAgIHJlc3QuZGVidWcoXG4gICAgICAgIC8vIGBbUkVTVCAtIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzXSBSdW5uaW5nIGZvciBvZiBsb29wLiAke1xuICAgICAgICAvLyAgIHZhbHVlLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICAgIC8vIH1gXG4gICAgICAgIC8vICAgKVxuICAgICAgICAvLyBJZiB0aGUgdGltZSBoYXMgbm90IHJlYWNoZWQgY2FuY2VsXG4gICAgICAgIGlmICh2YWx1ZS5yZXNldFRpbWVzdGFtcCA+IG5vdykgY29udGludWVcblxuICAgICAgICAvLyBSYXRlIGxpbWl0IGlzIG92ZXIsIGRlbGV0ZSB0aGUgcmF0ZSBsaW1pdGVyXG4gICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5kZWxldGUoa2V5KVxuICAgICAgICAvLyBJZiBpdCB3YXMgZ2xvYmFsLCBhbHNvIG1hcmsgdGhlIGdsb2JhbCB2YWx1ZSBhcyBmYWxzZVxuICAgICAgICBpZiAoa2V5ID09PSAnZ2xvYmFsJykgcmVzdC5nbG9iYWxseVJhdGVMaW1pdGVkID0gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gQUxMIFBBVEhTIEFSRSBDTEVBUkVEIENBTiBDQU5DRUwgT1VUIVxuICAgICAgaWYgKHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zaXplID09PSAwKSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMgPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyA9IHRydWVcbiAgICAgICAgLy8gUkVDSEVDSyBJTiAxIFNFQ09ORFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAvLyByZXN0LmRlYnVnKCdbUkVTVCAtIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzXSBSdW5uaW5nIHNldFRpbWVvdXQuJylcbiAgICAgICAgICByZXN0LnByb2Nlc3NSYXRlTGltaXRlZFBhdGhzKClcbiAgICAgICAgfSwgMTAwMClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqIFByb2Nlc3NlcyB0aGUgcmF0ZSBsaW1pdCBoZWFkZXJzIGFuZCBkZXRlcm1pbmVzIGlmIGl0IG5lZWRzIHRvIGJlIHJhdGUgbGltaXRlZCBhbmQgcmV0dXJucyB0aGUgYnVja2V0IGlkIGlmIGF2YWlsYWJsZSAqL1xuICAgIHByb2Nlc3NIZWFkZXJzKHVybCwgaGVhZGVycywgaWRlbnRpZmllcikge1xuICAgICAgbGV0IHJhdGVMaW1pdGVkID0gZmFsc2VcblxuICAgICAgLy8gR0VUIEFMTCBORUNFU1NBUlkgSEVBREVSU1xuICAgICAgY29uc3QgcmVtYWluaW5nID0gaGVhZGVycy5nZXQoUkFURV9MSU1JVF9SRU1BSU5JTkdfSEVBREVSKVxuICAgICAgY29uc3QgcmV0cnlBZnRlciA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSKVxuICAgICAgY29uc3QgcmVzZXQgPSBEYXRlLm5vdygpICsgTnVtYmVyKHJldHJ5QWZ0ZXIpICogMTAwMFxuICAgICAgY29uc3QgZ2xvYmFsID0gaGVhZGVycy5nZXQoUkFURV9MSU1JVF9HTE9CQUxfSEVBREVSKVxuICAgICAgLy8gdW5kZWZpbmVkIG92ZXJyaWRlIG51bGwgbmVlZGVkIGZvciB0eXBpbmdzXG4gICAgICBjb25zdCBidWNrZXRJZCA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfQlVDS0VUX0hFQURFUikgPz8gdW5kZWZpbmVkXG4gICAgICBjb25zdCBsaW1pdCA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfTElNSVRfSEVBREVSKVxuXG4gICAgICAvLyBJZiB3ZSBkaWRuJ3QgcmVjZWl2ZWQgdGhlIGlkZW50aWZpZXIsIGZhbGxiYWNrIHRvIHRoZSBib3QgdG9rZW5cbiAgICAgIGlkZW50aWZpZXIgPz89IGBCb3QgJHtyZXN0LnRva2VufWBcblxuICAgICAgcmVzdC5xdWV1ZXMuZ2V0KGAke2lkZW50aWZpZXJ9JHt1cmx9YCk/LmhhbmRsZUNvbXBsZXRlZFJlcXVlc3Qoe1xuICAgICAgICByZW1haW5pbmc6IHJlbWFpbmluZyA/IE51bWJlcihyZW1haW5pbmcpIDogdW5kZWZpbmVkLFxuICAgICAgICBpbnRlcnZhbDogcmV0cnlBZnRlciA/IE51bWJlcihyZXRyeUFmdGVyKSAqIDEwMDAgOiB1bmRlZmluZWQsXG4gICAgICAgIG1heDogbGltaXQgPyBOdW1iZXIobGltaXQpIDogdW5kZWZpbmVkLFxuICAgICAgfSlcblxuICAgICAgLy8gSUYgVEhFUkUgSVMgTk8gUkVNQUlOSU5HIFJBVEUgTElNSVQsIE1BUksgSVQgQVMgUkFURSBMSU1JVEVEXG4gICAgICBpZiAocmVtYWluaW5nID09PSAnMCcpIHtcbiAgICAgICAgcmF0ZUxpbWl0ZWQgPSB0cnVlXG5cbiAgICAgICAgLy8gU0FWRSBUSEUgVVJMIEFTIExJTUlURUQsIElNUE9SVEFOVCBGT1IgTkVXIFJFUVVFU1RTIEJZIFVTRVIgV0lUSE9VVCBCVUNLRVRcbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChgJHtpZGVudGlmaWVyfSR7dXJsfWAsIHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IHJlc2V0LFxuICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIFNBVkUgVEhFIEJVQ0tFVCBBUyBMSU1JVEVEIFNJTkNFIERJRkZFUkVOVCBVUkxTIE1BWSBTSEFSRSBBIEJVQ0tFVFxuICAgICAgICBpZiAoYnVja2V0SWQpIHtcbiAgICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGAke2lkZW50aWZpZXJ9JHtidWNrZXRJZH1gLCB7XG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICByZXNldFRpbWVzdGFtcDogcmVzZXQsXG4gICAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElGIFRIRVJFIElTIE5PIFJFTUFJTklORyBHTE9CQUwgTElNSVQsIE1BUksgSVQgUkFURSBMSU1JVEVEIEdMT0JBTExZXG4gICAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSBOdW1iZXIoaGVhZGVycy5nZXQoJ3JldHJ5LWFmdGVyJykpICogMTAwMFxuICAgICAgICBjb25zdCBnbG9iYWxSZXNldCA9IERhdGUubm93KCkgKyByZXRyeUFmdGVyXG4gICAgICAgIC8vICAgcmVzdC5kZWJ1ZyhcbiAgICAgICAgLy8gYFtSRVNUID0gR2xvYmFsbHkgUmF0ZSBMaW1pdGVkXSBVUkw6ICR7dXJsfSB8IEdsb2JhbCBSZXN0OiAke2dsb2JhbFJlc2V0fWBcbiAgICAgICAgLy8gICApXG4gICAgICAgIHJlc3QuZ2xvYmFsbHlSYXRlTGltaXRlZCA9IHRydWVcbiAgICAgICAgcmF0ZUxpbWl0ZWQgPSB0cnVlXG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVzdC5nbG9iYWxseVJhdGVMaW1pdGVkID0gZmFsc2VcbiAgICAgICAgfSwgcmV0cnlBZnRlcilcblxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KCdnbG9iYWwnLCB7XG4gICAgICAgICAgdXJsOiAnZ2xvYmFsJyxcbiAgICAgICAgICByZXNldFRpbWVzdGFtcDogZ2xvYmFsUmVzZXQsXG4gICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGJ1Y2tldElkKSB7XG4gICAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChpZGVudGlmaWVyLCB7XG4gICAgICAgICAgICB1cmw6ICdnbG9iYWwnLFxuICAgICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IGdsb2JhbFJlc2V0LFxuICAgICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmF0ZUxpbWl0ZWQgJiYgIXJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMpIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocygpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmF0ZUxpbWl0ZWQgPyBidWNrZXRJZCA6IHVuZGVmaW5lZFxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kUmVxdWVzdChvcHRpb25zKSB7XG4gICAgICBjb25zdCB1cmwgPSBgJHtyZXN0LmJhc2VVcmx9L3Yke3Jlc3QudmVyc2lvbn0ke29wdGlvbnMucm91dGV9YFxuICAgICAgY29uc3QgcGF5bG9hZCA9IHJlc3QuY3JlYXRlUmVxdWVzdEJvZHkob3B0aW9ucy5tZXRob2QsIG9wdGlvbnMucmVxdWVzdEJvZHlPcHRpb25zKVxuXG4gICAgICBjb25zdCBsb2dnaW5nSGVhZGVycyA9IHsgLi4ucGF5bG9hZC5oZWFkZXJzIH1cblxuICAgICAgaWYgKHBheWxvYWQuaGVhZGVycy5hdXRob3JpemF0aW9uKSB7XG4gICAgICAgIGNvbnN0IGF1dGhvcml6YXRpb25TY2hlbWUgPSBwYXlsb2FkLmhlYWRlcnMuYXV0aG9yaXphdGlvbj8uc3BsaXQoJyAnKVswXVxuICAgICAgICBsb2dnaW5nSGVhZGVycy5hdXRob3JpemF0aW9uID0gYCR7YXV0aG9yaXphdGlvblNjaGVtZX0gdG9rZW5oZXJlYFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCBwYXlsb2FkKVxuICAgICAgcmVzdC5ldmVudHMucmVxdWVzdChyZXF1ZXN0LCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMucmVxdWVzdEJvZHlPcHRpb25zPy5ib2R5LFxuICAgICAgfSlcblxuICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYHNlbmRpbmcgcmVxdWVzdCB0byAke3VybH1gLCAnd2l0aCBwYXlsb2FkOicsIHsgLi4ucGF5bG9hZCwgaGVhZGVyczogbG9nZ2luZ0hlYWRlcnMgfSlcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCkuY2F0Y2goYXN5bmMgKGVycm9yKSA9PiB7XG4gICAgICAgIHJlc3QubG9nZ2VyLmVycm9yKGVycm9yKVxuICAgICAgICByZXN0LmV2ZW50cy5yZXF1ZXN0RXJyb3IocmVxdWVzdCwgZXJyb3IsIHsgYm9keTogb3B0aW9ucy5yZXF1ZXN0Qm9keU9wdGlvbnM/LmJvZHkgfSlcbiAgICAgICAgLy8gTWFyayByZXF1ZXN0IGFzIGNvbXBsZXRlZFxuICAgICAgICByZXN0LmludmFsaWRCdWNrZXQuaGFuZGxlQ29tcGxldGVkUmVxdWVzdCg5OTksIGZhbHNlKVxuICAgICAgICBvcHRpb25zLnJlamVjdCh7XG4gICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgIHN0YXR1czogOTk5LFxuICAgICAgICAgIGVycm9yOiAnUG9zc2libGUgbmV0d29yayBvciByZXF1ZXN0IHNoYXBlIGlzc3VlIG9jY3VycmVkLiBJZiB0aGlzIGlzIHJhcmUsIGl0cyBhIG5ldHdvcmsgZ2xpdGNoLiBJZiBpdCBvY2N1cnMgYSBsb3Qgc29tZXRoaW5nIGlzIHdyb25nLicsXG4gICAgICAgIH0pXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9KVxuICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYHJlcXVlc3QgZmV0Y2hlZCBmcm9tICR7dXJsfSB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c30gJiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YClcblxuICAgICAgLy8gU29tZXRpbWVzIHRoZSBDb250ZW50LVR5cGUgbWF5IGJlIFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLCBmb3IgdGhpcyByZWFzb24sIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHN0YXJ0IG9mIHRoZSBoZWFkZXJcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCAocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpPy5zdGFydHNXaXRoKCdhcHBsaWNhdGlvbi9qc29uJykgPyByZXNwb25zZS5qc29uKCkgOiByZXNwb25zZS50ZXh0KCkpLmNhdGNoKCgpID0+IG51bGwpXG5cbiAgICAgIHJlc3QuZXZlbnRzLnJlc3BvbnNlKHJlcXVlc3QsIHJlc3BvbnNlLCB7XG4gICAgICAgIHJlcXVlc3RCb2R5OiBvcHRpb25zLnJlcXVlc3RCb2R5T3B0aW9ucz8uYm9keSxcbiAgICAgICAgcmVzcG9uc2VCb2R5OiBib2R5LFxuICAgICAgfSlcblxuICAgICAgLy8gTWFyayByZXF1ZXN0IGFzIGNvbXBsZXRlZFxuICAgICAgcmVzdC5pbnZhbGlkQnVja2V0LmhhbmRsZUNvbXBsZXRlZFJlcXVlc3QocmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5oZWFkZXJzLmdldChSQVRFX0xJTUlUX1NDT1BFX0hFQURFUikgPT09ICdzaGFyZWQnKVxuXG4gICAgICAvLyBTZXQgdGhlIGJ1Y2tldCBpZCBpZiBpdCB3YXMgYXZhaWxhYmxlIG9uIHRoZSBoZWFkZXJzXG4gICAgICBjb25zdCBidWNrZXRJZCA9IHJlc3QucHJvY2Vzc0hlYWRlcnMocmVzdC5zaW1wbGlmeVVybChvcHRpb25zLnJvdXRlLCBvcHRpb25zLm1ldGhvZCksIHJlc3BvbnNlLmhlYWRlcnMsIHBheWxvYWQuaGVhZGVycy5hdXRob3JpemF0aW9uKVxuXG4gICAgICBpZiAoYnVja2V0SWQpIG9wdGlvbnMuYnVja2V0SWQgPSBidWNrZXRJZFxuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzIDwgSHR0cFJlc3BvbnNlQ29kZS5TdWNjZXNzIHx8IHJlc3BvbnNlLnN0YXR1cyA+PSBIdHRwUmVzcG9uc2VDb2RlLkVycm9yKSB7XG4gICAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGBSZXF1ZXN0IHRvICR7dXJsfSBmYWlsZWQuYClcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSBIdHRwUmVzcG9uc2VDb2RlLlRvb01hbnlSZXF1ZXN0cykge1xuICAgICAgICAgIG9wdGlvbnMucmVqZWN0KHsgb2s6IGZhbHNlLCBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCwgYm9keSB9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYFJlcXVlc3QgdG8gJHt1cmx9IHdhcyByYXRlbGltaXRlZC5gKVxuICAgICAgICAvLyBUb28gbWFueSBhdHRlbXB0cywgZ2V0IHJpZCBvZiByZXF1ZXN0IGZyb20gcXVldWUuXG4gICAgICAgIGlmIChvcHRpb25zLnJldHJ5Q291bnQgPj0gcmVzdC5tYXhSZXRyeUNvdW50KSB7XG4gICAgICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYFJlcXVlc3QgdG8gJHt1cmx9IGV4Y2VlZGVkIHRoZSBtYXhpbXVtIGFsbG93ZWQgcmV0cmllcy5gLCAnd2l0aCBwYXlsb2FkOicsIHBheWxvYWQpXG4gICAgICAgICAgLy8gcmVzdC5kZWJ1ZyhgW1JFU1QgLSBSZXRyaWVzTWF4ZWRdICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9YClcbiAgICAgICAgICBvcHRpb25zLnJlamVjdCh7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgICAgICBlcnJvcjogJ1RoZSByZXF1ZXN0IHdhcyByYXRlIGxpbWl0ZWQgYW5kIGl0IG1heGVkIG91dCB0aGUgcmV0cmllcyBsaW1pdC4nLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMucmV0cnlDb3VudCArPSAxXG5cbiAgICAgICAgY29uc3QgcmVzZXRBZnRlciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSKVxuICAgICAgICBpZiAocmVzZXRBZnRlcikgYXdhaXQgZGVsYXkoTnVtYmVyKHJlc2V0QWZ0ZXIpICogMTAwMClcblxuICAgICAgICByZXR1cm4gYXdhaXQgb3B0aW9ucy5yZXRyeVJlcXVlc3Q/LihvcHRpb25zKVxuICAgICAgfVxuXG4gICAgICAvLyBEaXNjb3JkIHNvbWV0aW1lcyBzZW5kcyBhIHJlc3BvbnNlIHdpdGggbm8gY29udGVudFxuICAgICAgb3B0aW9ucy5yZXNvbHZlKHsgb2s6IHRydWUsIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBib2R5OiByZXNwb25zZS5zdGF0dXMgPT09IEh0dHBSZXNwb25zZUNvZGUuTm9Db250ZW50ID8gdW5kZWZpbmVkIDogYm9keSB9KVxuICAgIH0sXG5cbiAgICBzaW1wbGlmeVVybCh1cmwsIG1ldGhvZCkge1xuICAgICAgY29uc3Qgcm91dGVJbmZvcm1hdGlvbktleTogc3RyaW5nW10gPSBbbWV0aG9kXVxuXG4gICAgICBjb25zdCBxdWVyeVBhcmFtSW5kZXggPSB1cmwuaW5kZXhPZignPycpXG4gICAgICBjb25zdCByb3V0ZSA9IHF1ZXJ5UGFyYW1JbmRleCAhPT0gLTEgPyB1cmwuc2xpY2UoMCwgcXVlcnlQYXJhbUluZGV4KSA6IHVybFxuXG4gICAgICAvLyBTaW5jZSB0aGUgdXJscyBzdGFydCB3aXRoIC8gdGhlIGZpcnN0IHBhcnQgd2lsbCBhbHdheXMgYmUgZW1wdHlcbiAgICAgIGNvbnN0IHNwbGl0dGVkUm91dGUgPSByb3V0ZS5zcGxpdCgnLycpXG5cbiAgICAgIC8vIDEpIFN0cmlwIHRoZSBtaW5vciBwYXJhbXNcbiAgICAgIC8vICAgIFRoZSBvbmx5IG1ham9ycyBhcmUgY2hhbm5lbHMsIGd1aWxkcywgd2ViaG9va3MgYW5kIHdlYmhvb2tzIHdpdGggdGhlaXIgdG9rZW5cblxuICAgICAgY29uc3Qgc3RyaXBwZWRSb3V0ZSA9IHNwbGl0dGVkUm91dGVcbiAgICAgICAgLm1hcCgocGFydCwgaW5kZXgsIGFycmF5KSA9PiB7XG4gICAgICAgICAgLy8gV2hpbGUgcGFyc2VJbnQgd2lsbCB0cnVuY2F0ZSB0aGUgc25vd2ZsYWtlIGlkLCBpdCB3aWxsIHN0aWxsIHRlbGwgdXMgaWYgaXQgaXMgYSBudW1iZXJcbiAgICAgICAgICBjb25zdCBpc051bWJlciA9IE51bWJlci5pc0Zpbml0ZShwYXJzZUludChwYXJ0LCAxMCkpXG5cbiAgICAgICAgICBpZiAoIWlzTnVtYmVyKSB7XG4gICAgICAgICAgICAvLyBSZWFjdGlvbnMgZW1vamkgbmVlZCB0byBiZSBzdHJpcHBlZCBhcyBpdCBpcyBhIG1pbm9yIHBhcmFtZXRlclxuICAgICAgICAgICAgaWYgKGluZGV4ID49IDEgJiYgYXJyYXlbaW5kZXggLSAxXSA9PT0gJ3JlYWN0aW9ucycpIHJldHVybiAneCdcbiAgICAgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIHdlYmhvb2sgb3IgaWYgaXQgaXMgcGFydCBvZiB0aGUgcm91dGUsIGtlZXAgaXQgYXMgaXQgaXMgYSBtYWpvciBwYXJhbWV0ZXJcbiAgICAgICAgICAgIHJldHVybiBwYXJ0XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIG9uIGEgY2hhbm5lbCBpZCwgYSBndWlsZCBpZCBvciBhIHdlYmhvb2sgaWRcbiAgICAgICAgICBjb25zdCBpc01ham9yID0gaW5kZXggPj0gMSAmJiAoYXJyYXlbaW5kZXggLSAxXSA9PT0gJ2NoYW5uZWxzJyB8fCBhcnJheVtpbmRleCAtIDFdID09PSAnZ3VpbGRzJyB8fCBhcnJheVtpbmRleCAtIDFdID09PSAnd2ViaG9va3MnKVxuXG4gICAgICAgICAgaWYgKGlzTWFqb3IpIHJldHVybiBwYXJ0XG5cbiAgICAgICAgICByZXR1cm4gJ3gnXG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCcvJylcblxuICAgICAgcm91dGVJbmZvcm1hdGlvbktleS5wdXNoKHN0cmlwcGVkUm91dGUpXG5cbiAgICAgIC8vIDIpIEFjY291bnQgZm9yIGV4Y2VwdGlvbnNcbiAgICAgIC8vICAgIC0gaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmQvZGlzY29yZC1hcGktZG9jcy9pc3N1ZXMvMTA5MlxuICAgICAgLy8gICAgLSBodHRwczovL2dpdGh1Yi5jb20vZGlzY29yZC9kaXNjb3JkLWFwaS1kb2NzL2lzc3Vlcy8xMjk1XG5cbiAgICAgIC8vIFRoZSAyIGV4Y2VwdGlvbnMgYXJlIGZvciBtZXNzYWdlIGRlbGV0ZSwgc28gd2UgbmVlZCB0byBjaGVjayBpZiB3ZSBhcmUgaW4gdGhhdCByb3V0ZVxuICAgICAgaWYgKG1ldGhvZCA9PT0gJ0RFTEVURScgJiYgc3BsaXR0ZWRSb3V0ZS5sZW5ndGggPT09IDUgJiYgc3BsaXR0ZWRSb3V0ZVsxXSA9PT0gJ2NoYW5uZWxzJyAmJiBzdHJpcHBlZFJvdXRlLmVuZHNXaXRoKCcvbWVzc2FnZXMveCcpKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VJZCA9IHNwbGl0dGVkUm91dGVbNF1cbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gc25vd2ZsYWtlVG9UaW1lc3RhbXAobWVzc2FnZUlkKVxuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmQvZGlzY29yZC1hcGktZG9jcy9pc3N1ZXMvMTA5MlxuICAgICAgICBpZiAobm93IC0gdGltZXN0YW1wIDwgMTBfMDAwKSB7XG4gICAgICAgICAgcm91dGVJbmZvcm1hdGlvbktleS5wdXNoKCdtZXNzYWdlLWRlbGV0ZS0xMHMnKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmQvZGlzY29yZC1hcGktZG9jcy9pc3N1ZXMvMTI5NVxuICAgICAgICAvLyAyIHdlZWtzID0gMiAqIDcgKiAyNCAqIDYwICogNjAgKiAxMDAwID0gMTIwOTYwMDAwMFxuICAgICAgICBpZiAobm93IC0gdGltZXN0YW1wID4gMTIwOTYwMDAwMCkge1xuICAgICAgICAgIHJvdXRlSW5mb3JtYXRpb25LZXkucHVzaCgnbWVzc2FnZS1kZWxldGUtMncnKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByb3V0ZUluZm9ybWF0aW9uS2V5LmpvaW4oJzonKVxuICAgIH0sXG5cbiAgICBhc3luYyBwcm9jZXNzUmVxdWVzdChyZXF1ZXN0OiBTZW5kUmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHVybCA9IHJlc3Quc2ltcGxpZnlVcmwocmVxdWVzdC5yb3V0ZSwgcmVxdWVzdC5tZXRob2QpXG5cbiAgICAgIGlmIChyZXF1ZXN0LnJ1blRocm91Z2hRdWV1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYXdhaXQgcmVzdC5zZW5kUmVxdWVzdChyZXF1ZXN0KVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBJZiB3ZSB0aGUgcmVxdWVzdCBoYXMgYSB0b2tlbiwgdXNlIGl0XG4gICAgICAvLyBFbHNlIGZhbGxiYWNrIHRvIHByZWZpeCB3aXRoIHRoZSBib3QgdG9rZW5cbiAgICAgIGNvbnN0IHF1ZXVlSWRlbnRpZmllciA9IHJlcXVlc3QucmVxdWVzdEJvZHlPcHRpb25zPy5oZWFkZXJzPy5hdXRob3JpemF0aW9uID8/IGBCb3QgJHtyZXN0LnRva2VufWBcblxuICAgICAgY29uc3QgcXVldWUgPSByZXN0LnF1ZXVlcy5nZXQoYCR7cXVldWVJZGVudGlmaWVyfSR7dXJsfWApXG5cbiAgICAgIGlmIChxdWV1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHF1ZXVlLm1ha2VSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDUkVBVEVTIEEgTkVXIFFVRVVFXG4gICAgICAgIGNvbnN0IGJ1Y2tldFF1ZXVlID0gbmV3IFF1ZXVlKHJlc3QsIHsgdXJsLCBkZWxldGVRdWV1ZURlbGF5OiByZXN0LmRlbGV0ZVF1ZXVlRGVsYXksIGlkZW50aWZpZXI6IHF1ZXVlSWRlbnRpZmllciB9KVxuXG4gICAgICAgIC8vIFNhdmUgcXVldWVcbiAgICAgICAgcmVzdC5xdWV1ZXMuc2V0KGAke3F1ZXVlSWRlbnRpZmllcn0ke3VybH1gLCBidWNrZXRRdWV1ZSlcblxuICAgICAgICAvLyBBZGQgcmVxdWVzdCB0byBxdWV1ZVxuICAgICAgICBidWNrZXRRdWV1ZS5tYWtlUmVxdWVzdChyZXF1ZXN0KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBtYWtlUmVxdWVzdChtZXRob2QsIHJvdXRlLCBvcHRpb25zKSB7XG4gICAgICAvLyBUaGlzIGVycm9yIG5lZWRzIHRvIGJlIGNyZWF0ZWQgaGVyZSBiZWNhdXNlIG9mIGhvdyBzdGFjayB0cmFjZXMgZ2V0IGNhbGN1bGF0ZWRcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKClcblxuICAgICAgaWYgKHJlc3QuaXNQcm94aWVkKSB7XG4gICAgICAgIGlmIChyZXN0LmF1dGhvcml6YXRpb24pIHtcbiAgICAgICAgICBvcHRpb25zID8/PSB7fVxuICAgICAgICAgIG9wdGlvbnMuaGVhZGVycyA/Pz0ge31cbiAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbcmVzdC5hdXRob3JpemF0aW9uSGVhZGVyXSA9IHJlc3QuYXV0aG9yaXphdGlvblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGAke3Jlc3QuYmFzZVVybH0vdiR7cmVzdC52ZXJzaW9ufSR7cm91dGV9YCwgcmVzdC5jcmVhdGVSZXF1ZXN0Qm9keShtZXRob2QsIG9wdGlvbnMpKVxuICAgICAgICByZXN0LmV2ZW50cy5yZXF1ZXN0KHJlcXVlc3QsIHtcbiAgICAgICAgICBib2R5OiBvcHRpb25zPy5ib2R5LFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoKHJlcXVlc3QpXG5cbiAgICAgICAgLy8gU29tZXRpbWVzIHRoZSBDb250ZW50LVR5cGUgbWF5IGJlIFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLCBmb3IgdGhpcyByZWFzb24sIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHN0YXJ0IG9mIHRoZSBoZWFkZXJcbiAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IChyZXN1bHQuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpPy5zdGFydHNXaXRoKCdhcHBsaWNhdGlvbi9qc29uJykgPyByZXN1bHQuanNvbigpIDogcmVzdWx0LnRleHQoKSkuY2F0Y2goKCkgPT4gbnVsbClcblxuICAgICAgICByZXN0LmV2ZW50cy5yZXNwb25zZShyZXF1ZXN0LCByZXN1bHQsIHtcbiAgICAgICAgICByZXF1ZXN0Qm9keTogb3B0aW9ucz8uYm9keSxcbiAgICAgICAgICByZXNwb25zZUJvZHk6IGJvZHksXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICBlcnJvci5jYXVzZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShiYXNlRXJyb3JQcm90b3R5cGUpLCB7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMsXG4gICAgICAgICAgICBib2R5LFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5zdGF0dXMgIT09IDIwNCA/ICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGJvZHkpIDogYm9keSkgOiB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogU2VuZFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICAgIHJvdXRlLFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICByZXF1ZXN0Qm9keU9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICByZXRyeVJlcXVlc3Q6IGFzeW5jIChwYXlsb2FkOiBTZW5kUmVxdWVzdE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHJlc3QucHJvY2Vzc1JlcXVlc3QocGF5bG9hZClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc29sdmU6IChkYXRhKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKGRhdGEuc3RhdHVzICE9PSAyMDQgPyAodHlwZW9mIGRhdGEuYm9keSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGRhdGEuYm9keSkgOiBkYXRhLmJvZHkpIDogdW5kZWZpbmVkKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVqZWN0OiAocmVhc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgZXJyb3JUZXh0OiBzdHJpbmdcblxuICAgICAgICAgICAgc3dpdGNoIChyZWFzb24uc3RhdHVzKSB7XG4gICAgICAgICAgICAgIGNhc2UgNDAwOlxuICAgICAgICAgICAgICAgIGVycm9yVGV4dCA9IFwiVGhlIG9wdGlvbnMgd2FzIGltcHJvcGVybHkgZm9ybWF0dGVkLCBvciB0aGUgc2VydmVyIGNvdWxkbid0IHVuZGVyc3RhbmQgaXQuXCJcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlIDQwMTpcbiAgICAgICAgICAgICAgICBlcnJvclRleHQgPSAnVGhlIEF1dGhvcml6YXRpb24gaGVhZGVyIHdhcyBtaXNzaW5nIG9yIGludmFsaWQuJ1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgICAgICAgIGVycm9yVGV4dCA9ICdUaGUgQXV0aG9yaXphdGlvbiB0b2tlbiB5b3UgcGFzc2VkIGRpZCBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHRoZSByZXNvdXJjZS4nXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSA0MDQ6XG4gICAgICAgICAgICAgICAgZXJyb3JUZXh0ID0gXCJUaGUgcmVzb3VyY2UgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBkb2Vzbid0IGV4aXN0LlwiXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSA0MDU6XG4gICAgICAgICAgICAgICAgZXJyb3JUZXh0ID0gJ1RoZSBIVFRQIG1ldGhvZCB1c2VkIGlzIG5vdCB2YWxpZCBmb3IgdGhlIGxvY2F0aW9uIHNwZWNpZmllZC4nXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSA0Mjk6XG4gICAgICAgICAgICAgICAgZXJyb3JUZXh0ID0gXCJZb3UncmUgYmVpbmcgcmF0ZWxpbWl0ZWQuXCJcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlIDUwMjpcbiAgICAgICAgICAgICAgICBlcnJvclRleHQgPSAnVGhlcmUgd2FzIG5vdCBhIGdhdGV3YXkgYXZhaWxhYmxlIHRvIHByb2Nlc3MgeW91ciBvcHRpb25zLiBXYWl0IGEgYml0IGFuZCByZXRyeS4nXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBlcnJvclRleHQgPSByZWFzb24uc3RhdHVzVGV4dCA/PyAnVW5rbm93biBlcnJvcidcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXJyb3IubWVzc2FnZSA9IGBbJHtyZWFzb24uc3RhdHVzfV0gJHtlcnJvclRleHR9YFxuXG4gICAgICAgICAgICAvLyBJZiBkaXNjb3JkIHNlbnQgdXMgSlNPTiwgaXQgaXMgcHJvYmFibHkgZ29pbmcgdG8gYmUgYW4gZXJyb3IgbWVzc2FnZSBmcm9tIHdoaWNoIHdlIGNhbiBnZXQgYW5kIGFkZCBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvciB0byB0aGUgZXJyb3IgbWVzc2FnZSwgdGhlIGZ1bGwgYm9keSB3aWxsIGJlIGluIHRoZSBlcnJvci5jYXVzZVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVmZXJlbmNlI2Vycm9yLW1lc3NhZ2VzXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlYXNvbi5ib2R5ID09PSAnb2JqZWN0JyAmJiBoYXNQcm9wZXJ0eShyZWFzb24uYm9keSwgJ2NvZGUnKSAmJiBoYXNQcm9wZXJ0eShyZWFzb24uYm9keSwgJ21lc3NhZ2UnKSkge1xuICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlICs9IGBcXG5EaXNjb3JkIGVycm9yOiBbJHtyZWFzb24uYm9keS5jb2RlfV0gJHtyZWFzb24uYm9keS5tZXNzYWdlfWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXJyb3IuY2F1c2UgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoYmFzZUVycm9yUHJvdG90eXBlKSwgcmVhc29uKVxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcnVuVGhyb3VnaFF1ZXVlOiBvcHRpb25zPy5ydW5UaHJvdWdoUXVldWUsXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCByZXN0LnByb2Nlc3NSZXF1ZXN0KHBheWxvYWQpXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXQ8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdHRVQnLCB1cmwsIG9wdGlvbnMpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBwb3N0PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUE9TVCcsIHVybCwgb3B0aW9ucykpIGFzIENhbWVsaXplPFQ+XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZSh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0RFTEVURScsIHVybCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIHBhdGNoPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUEFUQ0gnLCB1cmwsIG9wdGlvbnMpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBwdXQ8VCA9IHZvaWQ+KHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BVVCcsIHVybCwgb3B0aW9ucykpIGFzIENhbWVsaXplPFQ+XG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pXG5cbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5ib3QoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkUmVhY3Rpb25zKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbnMsIG9yZGVyZWQgPSBmYWxzZSkge1xuICAgICAgaWYgKCFvcmRlcmVkKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHJlYWN0aW9ucy5tYXAoYXN5bmMgKHJlYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCByZXN0LmFkZFJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbilcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCByZWFjdGlvbiBvZiByZWFjdGlvbnMpIHtcbiAgICAgICAgYXdhaXQgcmVzdC5hZGRSZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFJvbGUoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm1lbWJlcihndWlsZElkLCB1c2VySWQsIHJvbGVJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFRocmVhZE1lbWJlcihjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy51c2VyKGNoYW5uZWxJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkRG1SZWNpcGllbnQoY2hhbm5lbElkLCB1c2VySWQsIGJvZHkpIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLmRtUmVjaXBpZW50KGNoYW5uZWxJZCwgdXNlcklkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUF1dG9tb2RSdWxlKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlcyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlQ2hhbm5lbChndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmd1aWxkcy5jaGFubmVscyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlRW1vamkoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppcyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlQXBwbGljYXRpb25FbW9qaShib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25FbW9qaXMocmVzdC5hcHBsaWNhdGlvbklkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChib2R5LCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0geyBib2R5IH1cblxuICAgICAgaWYgKG9wdGlvbnM/LmJlYXJlclRva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5iZWFyZXJUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmRzKHJlc3QuYXBwbGljYXRpb25JZCksIHJlc3RPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChib2R5LCBndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0geyBib2R5IH1cblxuICAgICAgaWYgKG9wdGlvbnM/LmJlYXJlclRva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5iZWFyZXJUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5hbGwocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkKSwgcmVzdE9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUd1aWxkU3RpY2tlcihndWlsZElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICAgICAgZm9ybS5hcHBlbmQoJ2ZpbGUnLCBvcHRpb25zLmZpbGUuYmxvYiwgb3B0aW9ucy5maWxlLm5hbWUpXG4gICAgICBmb3JtLmFwcGVuZCgnbmFtZScsIG9wdGlvbnMubmFtZSlcbiAgICAgIGZvcm0uYXBwZW5kKCdkZXNjcmlwdGlvbicsIG9wdGlvbnMuZGVzY3JpcHRpb24pXG4gICAgICBmb3JtLmFwcGVuZCgndGFncycsIG9wdGlvbnMudGFncylcblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXJzKGd1aWxkSWQpLCB7IGJvZHk6IGZvcm0sIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSwgeyBib2R5IH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUZvcnVtVGhyZWFkKGNoYW5uZWxJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5mb3J1bShjaGFubmVsSWQpLCB7IGJvZHksIGZpbGVzOiBib2R5LmZpbGVzLCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlSW52aXRlKGNoYW5uZWxJZCwgYm9keSA9IHt9LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEludml0ZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuaW52aXRlcyhjaGFubmVsSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVSb2xlKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkUm9sZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLmFsbChndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlU2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTY2hlZHVsZWRFdmVudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudHMoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVN0YWdlSW5zdGFuY2UoYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTdGFnZUluc3RhbmNlPihyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZXMoKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlV2ViaG9vayhjaGFubmVsSWQsIG9wdGlvbnMsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMud2ViaG9va3MoY2hhbm5lbElkKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgbmFtZTogb3B0aW9ucy5uYW1lLFxuICAgICAgICAgIGF2YXRhcjogb3B0aW9ucy5hdmF0YXIgPyBhd2FpdCB1cmxUb0Jhc2U2NChvcHRpb25zLmF2YXRhcikgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUF1dG9tb2RSdWxlKGd1aWxkSWQsIHJ1bGVJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlKGd1aWxkSWQsIHJ1bGVJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUNoYW5uZWwoY2hhbm5lbElkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoY2hhbm5lbElkKSwge1xuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlKGNoYW5uZWxJZCwgb3ZlcndyaXRlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMub3ZlcndyaXRlKGNoYW5uZWxJZCwgb3ZlcndyaXRlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVFbW9qaShndWlsZElkLCBpZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamkoZ3VpbGRJZCwgaWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVBcHBsaWNhdGlvbkVtb2ppKGlkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbkVtb2ppKHJlc3QuYXBwbGljYXRpb25JZCwgaWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG1lc3NhZ2VJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5tZXNzYWdlKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4sIG1lc3NhZ2VJZCksIHsgdW5hdXRob3JpemVkOiB0cnVlIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kKHJlc3QuYXBwbGljYXRpb25JZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLm9uZShyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUd1aWxkU3RpY2tlcihndWlsZElkLCBzdGlja2VySWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRUZW1wbGF0ZShndWlsZElkLCB0ZW1wbGF0ZUNvZGUpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuZ3VpbGQoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlSW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuaW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUludml0ZShpbnZpdGVDb2RlLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGUoaW52aXRlQ29kZSksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU1lc3NhZ2VzKGNoYW5uZWxJZCwgbWVzc2FnZUlkcywgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuY2hhbm5lbHMuYnVsayhjaGFubmVsSWQpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICBtZXNzYWdlczogbWVzc2FnZUlkcy5zbGljZSgwLCAxMDApLm1hcCgoaWQpID0+IGlkLnRvU3RyaW5nKCkpLFxuICAgICAgICB9LFxuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMub3JpZ2luYWwocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiksIHsgdW5hdXRob3JpemVkOiB0cnVlIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU93blJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pXG5cbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5ib3QoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlUmVhY3Rpb25zQWxsKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMuYWxsKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlUmVhY3Rpb25zRW1vamkoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSB7XG4gICAgICByZWFjdGlvbiA9IHByb2Nlc3NSZWFjdGlvblN0cmluZyhyZWFjdGlvbilcblxuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLmVtb2ppKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVJvbGUoZ3VpbGRJZCwgcm9sZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5vbmUoZ3VpbGRJZCwgcm9sZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlU2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudChndWlsZElkLCBldmVudElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlU3RhZ2VJbnN0YW5jZShjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2UoY2hhbm5lbElkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlVXNlclJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCB1c2VySWQsIHJlYWN0aW9uKSB7XG4gICAgICByZWFjdGlvbiA9IHByb2Nlc3NSZWFjdGlvblN0cmluZyhyZWFjdGlvbilcblxuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLnVzZXIoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rKHdlYmhvb2tJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy5pZCh3ZWJob29rSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLndlYmhvb2tzLm1lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSwgeyB1bmF1dGhvcml6ZWQ6IHRydWUgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlV2ViaG9va1dpdGhUb2tlbih3ZWJob29rSWQsIHRva2VuKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4pLCB7XG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkLCBjb21tYW5kSWQsIGJlYXJlclRva2VuLCBwZXJtaXNzaW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb24ocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpLFxuICAgICAgICB7XG4gICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBoZWFkZXJzOiB7IGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtiZWFyZXJUb2tlbn1gIH0sXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZShndWlsZElkLCBydWxlSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Qm90UHJvZmlsZShvcHRpb25zKSB7XG4gICAgICBjb25zdCBhdmF0YXIgPSBvcHRpb25zPy5ib3RBdmF0YXJVUkwgPyBhd2FpdCB1cmxUb0Jhc2U2NChvcHRpb25zPy5ib3RBdmF0YXJVUkwpIDogb3B0aW9ucz8uYm90QXZhdGFyVVJMXG4gICAgICBjb25zdCBiYW5uZXIgPSBvcHRpb25zPy5ib3RCYW5uZXJVUkwgPyBhd2FpdCB1cmxUb0Jhc2U2NChvcHRpb25zPy5ib3RCYW5uZXJVUkwpIDogb3B0aW9ucz8uYm90QmFubmVyVVJMXG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRVc2VyPihyZXN0LnJvdXRlcy5jdXJyZW50VXNlcigpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICB1c2VybmFtZTogb3B0aW9ucy51c2VybmFtZT8udHJpbSgpLFxuICAgICAgICAgIGF2YXRhcixcbiAgICAgICAgICBiYW5uZXIsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Q2hhbm5lbChjaGFubmVsSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoY2hhbm5lbElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzKGNoYW5uZWxJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5vdmVyd3JpdGUoY2hhbm5lbElkLCBib2R5LmlkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdENoYW5uZWxQb3NpdGlvbnMoZ3VpbGRJZCwgYm9keSkge1xuICAgICAgYXdhaXQgcmVzdC5wYXRjaChyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0RW1vamkoZ3VpbGRJZCwgaWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamkoZ3VpbGRJZCwgaWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXBwbGljYXRpb25FbW9qaShpZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbkVtb2ppKHJlc3QuYXBwbGljYXRpb25JZCwgaWQpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5tZXNzYWdlKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4sIG1lc3NhZ2VJZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgZmlsZXM6IGJvZHkuZmlsZXMsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZChyZXN0LmFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCksIHsgYm9keSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGQoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkR3VpbGQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ndWlsZChndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5vbmUocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRTdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkVGVtcGxhdGUoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlOiBzdHJpbmcsIGJvZHk6IE1vZGlmeUd1aWxkVGVtcGxhdGUpOiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+IHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5ndWlsZChndWlsZElkLCB0ZW1wbGF0ZUNvZGUpLCB7IGJvZHkgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyBib2R5LCBmaWxlczogYm9keS5maWxlcyB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5vcmlnaW5hbChyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSwge1xuICAgICAgICBib2R5LFxuICAgICAgICBmaWxlczogYm9keS5maWxlcyxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE93blZvaWNlU3RhdGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgYXdhaXQgcmVzdC5wYXRjaChyZXN0LnJvdXRlcy5ndWlsZHMudm9pY2UoZ3VpbGRJZCksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgcmVxdWVzdFRvU3BlYWtUaW1lc3RhbXA6IG9wdGlvbnMucmVxdWVzdFRvU3BlYWtUaW1lc3RhbXBcbiAgICAgICAgICAgID8gbmV3IERhdGUob3B0aW9ucy5yZXF1ZXN0VG9TcGVha1RpbWVzdGFtcCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgOiBvcHRpb25zLnJlcXVlc3RUb1NwZWFrVGltZXN0YW1wLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFNjaGVkdWxlZEV2ZW50KGd1aWxkSWQsIGV2ZW50SWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Um9sZShndWlsZElkLCByb2xlSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFJvbGU+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5vbmUoZ3VpbGRJZCwgcm9sZUlkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFJvbGVQb3NpdGlvbnMoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkUm9sZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMuYWxsKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0U3RhZ2VJbnN0YW5jZShjaGFubmVsSWQsIHRvcGljLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRTdGFnZUluc3RhbmNlPihyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZShjaGFubmVsSWQpLCB7IGJvZHk6IHsgdG9waWMgfSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRVc2VyVm9pY2VTdGF0ZShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICBhd2FpdCByZXN0LnBhdGNoKHJlc3Qucm91dGVzLmd1aWxkcy52b2ljZShndWlsZElkLCBvcHRpb25zLnVzZXJJZCksIHsgYm9keTogb3B0aW9ucyB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2ViaG9vayh3ZWJob29rSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucyksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgZmlsZXM6IG9wdGlvbnMuZmlsZXMsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4sIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4pLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWxjb21lU2NyZWVuKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlbGNvbWVTY3JlZW4+KHJlc3Qucm91dGVzLmd1aWxkcy53ZWxjb21lKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2lkZ2V0U2V0dGluZ3MoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkR3VpbGRXaWRnZXRTZXR0aW5ncz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndpZGdldChndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZXhlY3V0ZVdlYmhvb2sod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBmb2xsb3dBbm5vdW5jZW1lbnQoc291cmNlQ2hhbm5lbElkLCB0YXJnZXRDaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkRm9sbG93ZWRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5mb2xsb3coc291cmNlQ2hhbm5lbElkKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgd2ViaG9va0NoYW5uZWxJZDogdGFyZ2V0Q2hhbm5lbElkLFxuICAgICAgICB9LFxuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBY3RpdmVUaHJlYWRzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTGlzdEFjdGl2ZVRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMuYWN0aXZlKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uKGd1aWxkSWQsIGNvbW1hbmRJZCwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE9taXQ8TWFrZVJlcXVlc3RPcHRpb25zLCAnYm9keSc+ID0ge31cblxuICAgICAgaWYgKG9wdGlvbnM/LmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5hY2Nlc3NUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucz4oXG4gICAgICAgIHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5wZXJtaXNzaW9uKG9wdGlvbnM/LmFwcGxpY2F0aW9uSWQgPz8gcmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpLFxuICAgICAgICByZXN0T3B0aW9ucyxcbiAgICAgIClcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE9taXQ8TWFrZVJlcXVlc3RPcHRpb25zLCAnYm9keSc+ID0ge31cblxuICAgICAgaWYgKG9wdGlvbnM/LmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5hY2Nlc3NUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uc1tdPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb25zKG9wdGlvbnM/LmFwcGxpY2F0aW9uSWQgPz8gcmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkKSxcbiAgICAgICAgcmVzdE9wdGlvbnMsXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uSW5mbygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb24+KHJlc3Qucm91dGVzLm9hdXRoMi5hcHBsaWNhdGlvbigpKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXBwbGljYXRpb25JbmZvKGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBcHBsaWNhdGlvbj4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb24oKSwge1xuICAgICAgICBib2R5LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q3VycmVudEF1dGhlbnRpY2F0aW9uSW5mbyh0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRDdXJyZW50QXV0aG9yaXphdGlvbj4ocmVzdC5yb3V0ZXMub2F1dGgyLmN1cnJlbnRBdXRob3JpemF0aW9uKCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBleGNoYW5nZVRva2VuKGNsaWVudElkLCBjbGllbnRTZWNyZXQsIGJvZHkpIHtcbiAgICAgIGNvbnN0IGJhc2ljQ3JlZGVudGlhbHMgPSBCdWZmZXIuZnJvbShgJHtjbGllbnRJZH06JHtjbGllbnRTZWNyZXR9YClcblxuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE1ha2VSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmFzaWMgJHtiYXNpY0NyZWRlbnRpYWxzLnRvU3RyaW5nKCdiYXNlNjQnKX1gLFxuICAgICAgICB9LFxuICAgICAgICBydW5UaHJvdWdoUXVldWU6IGZhbHNlLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9XG5cbiAgICAgIGlmIChib2R5LmdyYW50VHlwZSA9PT0gJ2NsaWVudF9jcmVkZW50aWFscycpIHtcbiAgICAgICAgcmVzdE9wdGlvbnMuYm9keS5zY29wZSA9IGJvZHkuc2NvcGUuam9pbignICcpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEFjY2Vzc1Rva2VuUmVzcG9uc2U+KHJlc3Qucm91dGVzLm9hdXRoMi50b2tlbkV4Y2hhbmdlKCksIHJlc3RPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyByZXZva2VUb2tlbihjbGllbnRJZCwgY2xpZW50U2VjcmV0LCBib2R5KSB7XG4gICAgICBjb25zdCBiYXNpY0NyZWRlbnRpYWxzID0gQnVmZmVyLmZyb20oYCR7Y2xpZW50SWR9OiR7Y2xpZW50U2VjcmV0fWApXG5cbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5vYXV0aDIudG9rZW5SZXZva2UoKSwge1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCYXNpYyAke2Jhc2ljQ3JlZGVudGlhbHMudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF1ZGl0TG9nKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXVkaXRMb2c+KHJlc3Qucm91dGVzLmd1aWxkcy5hdWRpdGxvZ3MoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF1dG9tb2RSdWxlKGd1aWxkSWQsIHJ1bGVJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXV0b21vZFJ1bGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlW10+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGVzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBdmFpbGFibGVWb2ljZVJlZ2lvbnMoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZvaWNlUmVnaW9uW10+KHJlc3Qucm91dGVzLnJlZ2lvbnMoKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QmFuKGd1aWxkSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRCYW4+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRCYW5zKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQmFuW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbnMoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWwoaWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY2hhbm5lbChpZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxJbnZpdGVzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnZpdGVNZXRhZGF0YVtdPihyZXN0LnJvdXRlcy5jaGFubmVscy5pbnZpdGVzKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ2hhbm5lbFtdPihyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxXZWJob29rcyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2ViaG9va1tdPihyZXN0LnJvdXRlcy5jaGFubmVscy53ZWJob29rcyhjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXREbUNoYW5uZWwodXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5kbSgpLCB7XG4gICAgICAgIGJvZHk6IHsgcmVjaXBpZW50SWQ6IHVzZXJJZCB9LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3JvdXBEbUNoYW5uZWwoYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZG0oKSwge1xuICAgICAgICBib2R5LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0RW1vamkoZ3VpbGRJZCwgZW1vamlJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppKGd1aWxkSWQsIGVtb2ppSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkVtb2ppKGVtb2ppSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uRW1vamkocmVzdC5hcHBsaWNhdGlvbklkLCBlbW9qaUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0RW1vamlzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW1vamlbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25FbW9qaXMoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8eyBpdGVtczogRGlzY29yZEVtb2ppW10gfT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25FbW9qaXMocmVzdC5hcHBsaWNhdGlvbklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Rm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5tZXNzYWdlKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4sIG1lc3NhZ2VJZCksIHsgdW5hdXRob3JpemVkOiB0cnVlIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdhdGV3YXlCb3QoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEdldEdhdGV3YXlCb3Q+KHJlc3Qucm91dGVzLmdhdGV3YXlCb3QoKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kKHJlc3QuYXBwbGljYXRpb25JZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyhvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZHMocmVzdC5hcHBsaWNhdGlvbklkLCBvcHRpb25zPy53aXRoTG9jYWxpemF0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkKGd1aWxkSWQsIG9wdGlvbnMgPSB7IGNvdW50czogdHJ1ZSB9KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkPihyZXN0LnJvdXRlcy5ndWlsZHMuZ3VpbGQoZ3VpbGRJZCwgb3B0aW9ucy5jb3VudHMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZHModG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IG1ha2VSZXF1ZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zIHwgdW5kZWZpbmVkID0gdG9rZW5cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxQYXJ0aWFsPERpc2NvcmRHdWlsZD5bXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnVzZXJHdWlsZHMob3B0aW9ucyksIG1ha2VSZXF1ZXN0T3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5vbmUocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4oXG4gICAgICAgIHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgb3B0aW9ucz8ud2l0aExvY2FsaXphdGlvbnMpLFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFByZXZpZXcoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZFByZXZpZXc+KHJlc3Qucm91dGVzLmd1aWxkcy5wcmV2aWV3KGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFRlbXBsYXRlKHRlbXBsYXRlQ29kZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5jb2RlKHRlbXBsYXRlQ29kZSkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkVGVtcGxhdGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVGVtcGxhdGVbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5hbGwoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkV2ViaG9va3MoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rW10+KHJlc3Qucm91dGVzLmd1aWxkcy53ZWJob29rcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW50ZWdyYXRpb25zKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkSW50ZWdyYXRpb25bXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludGVncmF0aW9ucyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW52aXRlKGludml0ZUNvZGUsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkSW52aXRlTWV0YWRhdGE+KHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGUoaW52aXRlQ29kZSwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEludml0ZXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnZpdGVNZXRhZGF0YVtdPihyZXN0LnJvdXRlcy5ndWlsZHMuaW52aXRlcyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TWVzc2FnZXMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2VbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZXMoY2hhbm5lbElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3RpY2tlclBhY2soc3RpY2tlclBhY2tJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyUGFjaz4ocmVzdC5yb3V0ZXMuc3RpY2tlclBhY2soc3RpY2tlclBhY2tJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN0aWNrZXJQYWNrcygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlclBhY2tbXT4ocmVzdC5yb3V0ZXMuc3RpY2tlclBhY2tzKCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSh0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCB7IHVuYXV0aG9yaXplZDogdHJ1ZSB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsUGlucyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldChyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlUGlucyhjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQaW5uZWRNZXNzYWdlcyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZVtdPihyZXN0LnJvdXRlcy5jaGFubmVscy5waW5zKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMucHJpdmF0ZShjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQcml2YXRlSm9pbmVkQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmpvaW5lZChjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQcnVuZUNvdW50KGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkUHJ1bmVkQ291bnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5wcnVuZShndWlsZElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UHVibGljQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnB1YmxpYyhjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRSb2xlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFJvbGVbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLmFsbChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Um9sZShndWlsZElkLCByb2xlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkUm9sZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm9uZShndWlsZElkLCByb2xlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnM/LndpdGhVc2VyQ291bnQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTY2hlZHVsZWRFdmVudHMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTY2hlZHVsZWRFdmVudFtdPihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50cyhndWlsZElkLCBvcHRpb25zPy53aXRoVXNlckNvdW50KSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2NoZWR1bGVkRXZlbnRVc2VycyhndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8QXJyYXk8eyB1c2VyOiBEaXNjb3JkVXNlcjsgbWVtYmVyPzogRGlzY29yZE1lbWJlciB9Pj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy51c2VycyhndWlsZElkLCBldmVudElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2Vzc2lvbkluZm8oKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRHYXRld2F5Qm90KClcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3RhZ2VJbnN0YW5jZShjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2UoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0T3duVm9pY2VTdGF0ZShndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZvaWNlU3RhdGU+KHJlc3Qucm91dGVzLmd1aWxkcy52b2ljZShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VXNlclZvaWNlU3RhdGUoZ3VpbGRJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZvaWNlU3RhdGU+KHJlc3Qucm91dGVzLmd1aWxkcy52b2ljZShndWlsZElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTdGlja2VyKHN0aWNrZXJJZDogQmlnU3RyaW5nKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXI+KHJlc3Qucm91dGVzLnN0aWNrZXIoc3RpY2tlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRTdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFN0aWNrZXJzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlcltdPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcnMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFRocmVhZE1lbWJlcihjaGFubmVsSWQsIHVzZXJJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUaHJlYWRNZW1iZXI+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMuZ2V0VXNlcihjaGFubmVsSWQsIHVzZXJJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFRocmVhZE1lbWJlcnMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRocmVhZE1lbWJlcltdPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lbWJlcnMoY2hhbm5lbElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UmVhY3Rpb25zKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRVc2VyW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbiwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFVzZXIoaWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVXNlcj4ocmVzdC5yb3V0ZXMudXNlcihpZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEN1cnJlbnRVc2VyKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFVzZXI+KHJlc3Qucm91dGVzLmN1cnJlbnRVc2VyKCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRVc2VyQ29ubmVjdGlvbnModG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ29ubmVjdGlvbltdPihyZXN0LnJvdXRlcy5vYXV0aDIuY29ubmVjdGlvbnMoKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFVzZXJBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uKHRva2VuLCBhcHBsaWNhdGlvbklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24+KHJlc3Qucm91dGVzLm9hdXRoMi5yb2xlQ29ubmVjdGlvbnMoYXBwbGljYXRpb25JZCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRWYW5pdHlVcmwoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWYW5pdHlVcmw+KHJlc3Qucm91dGVzLmd1aWxkcy52YW5pdHkoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFZvaWNlUmVnaW9ucyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZvaWNlUmVnaW9uW10+KHJlc3Qucm91dGVzLmd1aWxkcy5yZWdpb25zKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rKHdlYmhvb2tJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy5pZCh3ZWJob29rSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3MubWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpLCB7XG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4pLCB7XG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlbGNvbWVTY3JlZW4oZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWxjb21lU2NyZWVuPihyZXN0LnJvdXRlcy5ndWlsZHMud2VsY29tZShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2lkZ2V0KGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRXaWRnZXQ+KHJlc3Qucm91dGVzLmd1aWxkcy53aWRnZXRKc29uKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXaWRnZXRTZXR0aW5ncyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkV2lkZ2V0U2V0dGluZ3M+KHJlc3Qucm91dGVzLmd1aWxkcy53aWRnZXQoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGpvaW5UaHJlYWQoY2hhbm5lbElkKSB7XG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGxlYXZlR3VpbGQoZ3VpbGRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmxlYXZlKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBsZWF2ZVRocmVhZChjaGFubmVsSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWUoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcHVibGlzaE1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmNyb3NzcG9zdChjaGFubmVsSWQsIG1lc3NhZ2VJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHJlbW92ZVJvbGUoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm1lbWJlcihndWlsZElkLCB1c2VySWQsIHJvbGVJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHJlbW92ZVRocmVhZE1lbWJlcihjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy51c2VyKGNoYW5uZWxJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVtb3ZlRG1SZWNpcGllbnQoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLmRtUmVjaXBpZW50KGNoYW5uZWxJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIGZpbGVzOiBvcHRpb25zLmZpbGVzLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kSW50ZXJhY3Rpb25SZXNwb25zZShpbnRlcmFjdGlvbklkLCB0b2tlbiwgb3B0aW9ucywgcGFyYW1zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PHZvaWQgfCBEaXNjb3JkSW50ZXJhY3Rpb25DYWxsYmFja1Jlc3BvbnNlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLmNhbGxiYWNrKGludGVyYWN0aW9uSWQsIHRva2VuLCBwYXJhbXMpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIGZpbGVzOiBvcHRpb25zLmRhdGE/LmZpbGVzLFxuICAgICAgICBydW5UaHJvdWdoUXVldWU6IGZhbHNlLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kTWVzc2FnZShjaGFubmVsSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2VzKGNoYW5uZWxJZCksIHsgYm9keSwgZmlsZXM6IGJvZHkuZmlsZXMgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc3RhcnRUaHJlYWRXaXRoTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBzdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlKGNoYW5uZWxJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmFsbChjaGFubmVsSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQb2xsQW5zd2VyVm90ZXJzKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBhbnN3ZXJJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHZXRBbnN3ZXJWb3Rlc1Jlc3BvbnNlPihyZXN0LnJvdXRlcy5jaGFubmVscy5wb2xscy52b3RlcyhjaGFubmVsSWQsIG1lc3NhZ2VJZCwgYW5zd2VySWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBlbmRQb2xsKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5wb2xscy5leHBpcmUoY2hhbm5lbElkLCBtZXNzYWdlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBzeW5jR3VpbGRUZW1wbGF0ZShndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYmFuTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnB1dDx2b2lkPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW4oZ3VpbGRJZCwgdXNlcklkKSwgeyBib2R5LCByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYnVsa0Jhbk1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRCdWxrQmFuPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5idWxrQmFuKGd1aWxkSWQpLCB7IGJvZHk6IG9wdGlvbnMsIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Qm90TWVtYmVyKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lbWJlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYm90KGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0TWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVtYmVyV2l0aFVzZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpLCB7IGJvZHksIHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q3VycmVudE1lbWJlcihndWlsZElkLCB0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuY3VycmVudE1lbWJlcihndWlsZElkKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXJzKGd1aWxkSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkFjdGl2aXR5SW5zdGFuY2UoYXBwbGljYXRpb25JZCwgaW5zdGFuY2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBY3Rpdml0eUluc3RhbmNlPihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbkFjdGl2aXR5SW5zdGFuY2UoYXBwbGljYXRpb25JZCwgaW5zdGFuY2VJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGtpY2tNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpLCB7XG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHBpbk1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZVBpbihjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHBydW5lTWVtYmVycyhndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8eyBwcnVuZWQ6IG51bWJlciB8IG51bGwgfT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMucHJ1bmUoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHNlYXJjaE1lbWJlcnMoZ3VpbGRJZCwgcXVlcnksIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuc2VhcmNoKGd1aWxkSWQsIHF1ZXJ5LCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRPbmJvYXJkaW5nKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRPbmJvYXJkaW5nPihyZXN0LnJvdXRlcy5ndWlsZHMub25ib2FyZGluZyhndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkT25ib2FyZGluZyhndWlsZElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkR3VpbGRPbmJvYXJkaW5nPihyZXN0LnJvdXRlcy5ndWlsZHMub25ib2FyZGluZyhndWlsZElkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBtb2RpZnlHdWlsZEluY2lkZW50QWN0aW9ucyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEluY2lkZW50c0RhdGE+KHJlc3Qucm91dGVzLmd1aWxkcy5pbmNpZGVudEFjdGlvbnMoZ3VpbGRJZCksIHsgYm9keTogb3B0aW9ucyB9KVxuICAgIH0sXG5cbiAgICBhc3luYyB1bmJhbk1lbWJlcihndWlsZElkLCB1c2VySWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYmFuKGd1aWxkSWQsIHVzZXJJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHVucGluTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlUGluKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdHJpZ2dlclR5cGluZ0luZGljYXRvcihjaGFubmVsSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5jaGFubmVscy50eXBpbmcoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBzZXJ0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyhib2R5LCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0geyBib2R5IH1cblxuICAgICAgaWYgKG9wdGlvbnM/LmJlYXJlclRva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWVcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5iZWFyZXJUb2tlbn1gLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQpLCByZXN0T3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBzZXJ0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzKGd1aWxkSWQsIGJvZHksIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBNYWtlUmVxdWVzdE9wdGlvbnMgPSB7IGJvZHkgfVxuXG4gICAgICBpZiAob3B0aW9ucz8uYmVhcmVyVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZVxuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmJlYXJlclRva2VufWAsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5hbGwocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkKSwgcmVzdE9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRVc2VyQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbih0b2tlbiwgYXBwbGljYXRpb25JZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uPihyZXN0LnJvdXRlcy5vYXV0aDIucm9sZUNvbm5lY3Rpb25zKGFwcGxpY2F0aW9uSWQpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkR3VpbGRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVRlc3RFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRFbnRpdGxlbWVudD4ocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLmVudGl0bGVtZW50cyhhcHBsaWNhdGlvbklkKSwge1xuICAgICAgICBib2R5LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdEVudGl0bGVtZW50cyhhcHBsaWNhdGlvbklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVudGl0bGVtZW50W10+KHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5lbnRpdGxlbWVudHMoYXBwbGljYXRpb25JZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEVudGl0bGVtZW50KGFwcGxpY2F0aW9uSWQsIGVudGl0bGVtZW50SWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW50aXRsZW1lbnQ+KHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5lbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlVGVzdEVudGl0bGVtZW50KGFwcGxpY2F0aW9uSWQsIGVudGl0bGVtZW50SWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5lbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY29uc3VtZUVudGl0bGVtZW50KGFwcGxpY2F0aW9uSWQsIGVudGl0bGVtZW50SWQpIHtcbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uY29uc3VtZUVudGl0bGVtZW50KGFwcGxpY2F0aW9uSWQsIGVudGl0bGVtZW50SWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0U2t1cyhhcHBsaWNhdGlvbklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNrdVtdPihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uc2t1cyhhcHBsaWNhdGlvbklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdFN1YnNjcmlwdGlvbnMoc2t1SWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3Vic2NyaXB0aW9uW10+KHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5zdWJzY3JpcHRpb25zKHNrdUlkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3Vic2NyaXB0aW9uKHNrdUlkLCBzdWJzY3JpcHRpb25JZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdWJzY3JpcHRpb24+KHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5zdWJzY3JpcHRpb24oc2t1SWQsIHN1YnNjcmlwdGlvbklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZFNvdW5kYm9hcmRTb3VuZChjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5zb3VuZGJvYXJkLnNlbmRTb3VuZChjaGFubmVsSWQpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0RGVmYXVsdFNvdW5kYm9hcmRTb3VuZHMoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNvdW5kYm9hcmRTb3VuZFtdPihyZXN0LnJvdXRlcy5zb3VuZGJvYXJkLmxpc3REZWZhdWx0KCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3RHdWlsZFNvdW5kYm9hcmRTb3VuZHMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PHsgaXRlbXM6IERpc2NvcmRTb3VuZGJvYXJkU291bmRbXSB9PihyZXN0LnJvdXRlcy5zb3VuZGJvYXJkLmd1aWxkU291bmRzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFNvdW5kYm9hcmRTb3VuZChndWlsZElkLCBzb3VuZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNvdW5kYm9hcmRTb3VuZD4ocmVzdC5yb3V0ZXMuc291bmRib2FyZC5ndWlsZFNvdW5kKGd1aWxkSWQsIHNvdW5kSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZFNvdW5kYm9hcmRTb3VuZChndWlsZElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFNvdW5kYm9hcmRTb3VuZD4ocmVzdC5yb3V0ZXMuc291bmRib2FyZC5ndWlsZFNvdW5kcyhndWlsZElkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBtb2RpZnlHdWlsZFNvdW5kYm9hcmRTb3VuZChndWlsZElkLCBzb3VuZElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFNvdW5kYm9hcmRTb3VuZD4ocmVzdC5yb3V0ZXMuc291bmRib2FyZC5ndWlsZFNvdW5kKGd1aWxkSWQsIHNvdW5kSWQpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUd1aWxkU291bmRib2FyZFNvdW5kKGd1aWxkSWQsIHNvdW5kSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuZ3VpbGRTb3VuZChndWlsZElkLCBzb3VuZElkKSwge1xuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0QXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbnNNZXRhZGF0YVJlY29yZHMoYXBwbGljYXRpb25JZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uTWV0YWRhdGFbXT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbk1ldGFkYXRhKGFwcGxpY2F0aW9uSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyB1cGRhdGVBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uc01ldGFkYXRhUmVjb3JkcyhhcHBsaWNhdGlvbklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb25NZXRhZGF0YVtdPihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uTWV0YWRhdGEoYXBwbGljYXRpb25JZCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUxvYmJ5KG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZExvYmJ5PihyZXN0LnJvdXRlcy5sb2JieS5jcmVhdGUoKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TG9iYnkobG9iYnlJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMb2JieT4ocmVzdC5yb3V0ZXMubG9iYnkubG9iYnkobG9iYnlJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIG1vZGlmeUxvYmJ5KGxvYmJ5SWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRMb2JieT4ocmVzdC5yb3V0ZXMubG9iYnkubG9iYnkobG9iYnlJZCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUxvYmJ5KGxvYmJ5SWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5sb2JieS5sb2JieShsb2JieUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkTWVtYmVyVG9Mb2JieShsb2JieUlkLCB1c2VySWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkTG9iYnlNZW1iZXI+KHJlc3Qucm91dGVzLmxvYmJ5Lm1lbWJlcihsb2JieUlkLCB1c2VySWQpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyByZW1vdmVNZW1iZXJGcm9tTG9iYnkobG9iYnlJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMubG9iYnkubWVtYmVyKGxvYmJ5SWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGxlYXZlTG9iYnkobG9iYnlJZCwgYmVhcmVyVG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5sb2JieS5sZWF2ZShsb2JieUlkKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke2JlYXJlclRva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGxpbmtDaGFubmVsVG9Mb2JieShsb2JieUlkLCBiZWFyZXJUb2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZExvYmJ5PihyZXN0LnJvdXRlcy5sb2JieS5saW5rKGxvYmJ5SWQpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YmVhcmVyVG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdW5saW5rQ2hhbm5lbFRvTG9iYnkobG9iYnlJZCwgYmVhcmVyVG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRMb2JieT4ocmVzdC5yb3V0ZXMubG9iYnkubGluayhsb2JieUlkKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke2JlYXJlclRva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHByZWZlclNuYWtlQ2FzZShlbmFibGVkOiBib29sZWFuKSB7XG4gICAgICBjb25zdCBjYW1lbGl6ZXIgPSBlbmFibGVkID8gKHg6IGFueSkgPT4geCA6IGNhbWVsaXplXG5cbiAgICAgIHJlc3QuZ2V0ID0gYXN5bmMgKHVybCwgb3B0aW9ucykgPT4ge1xuICAgICAgICByZXR1cm4gY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0dFVCcsIHVybCwgb3B0aW9ucykpXG4gICAgICB9XG5cbiAgICAgIHJlc3QucG9zdCA9IGFzeW5jICh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pID0+IHtcbiAgICAgICAgcmV0dXJuIGNhbWVsaXplcihhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQT1NUJywgdXJsLCBvcHRpb25zKSlcbiAgICAgIH1cblxuICAgICAgcmVzdC5kZWxldGUgPSBhc3luYyAodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSA9PiB7XG4gICAgICAgIGNhbWVsaXplcihhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdERUxFVEUnLCB1cmwsIG9wdGlvbnMpKVxuICAgICAgfVxuXG4gICAgICByZXN0LnBhdGNoID0gYXN5bmMgKHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikgPT4ge1xuICAgICAgICByZXR1cm4gY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BBVENIJywgdXJsLCBvcHRpb25zKSlcbiAgICAgIH1cblxuICAgICAgcmVzdC5wdXQgPSBhc3luYyAodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSA9PiB7XG4gICAgICAgIHJldHVybiBjYW1lbGl6ZXIoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUFVUJywgdXJsLCBvcHRpb25zKSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3RcbiAgICB9LFxuICB9XG5cbiAgcmV0dXJuIHJlc3Rcbn1cblxuZW51bSBIdHRwUmVzcG9uc2VDb2RlIHtcbiAgLyoqIE1pbmltdW0gdmFsdWUgb2YgYSBjb2RlIGluIG9kZXIgdG8gY29uc2lkZXIgdGhhdCBpdCB3YXMgc3VjY2Vzc2Z1bC4gKi9cbiAgU3VjY2VzcyA9IDIwMCxcbiAgLyoqIFJlcXVlc3QgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgYnV0IERpc2NvcmQgcmV0dXJuZWQgYW4gZW1wdHkgYm9keS4gKi9cbiAgTm9Db250ZW50ID0gMjA0LFxuICAvKiogTWluaW11bSB2YWx1ZSBvZiBhIGNvZGUgaW4gb3JkZXIgdG8gY29uc2lkZXIgdGhhdCBzb21ldGhpbmcgd2VudCB3cm9uZy4gKi9cbiAgRXJyb3IgPSA0MDAsXG4gIC8qKiBUaGlzIHJlcXVlc3QgZ290IHJhdGUgbGltaXRlZC4gKi9cbiAgVG9vTWFueVJlcXVlc3RzID0gNDI5LFxufVxuIl0sIm5hbWVzIjpbIkFVRElUX0xPR19SRUFTT05fSEVBREVSIiwiRElTQ09SRF9BUElfVVJMIiwiRElTQ09SRF9BUElfVkVSU0lPTiIsIlJBVEVfTElNSVRfQlVDS0VUX0hFQURFUiIsIlJBVEVfTElNSVRfR0xPQkFMX0hFQURFUiIsIlJBVEVfTElNSVRfTElNSVRfSEVBREVSIiwiUkFURV9MSU1JVF9SRU1BSU5JTkdfSEVBREVSIiwiUkFURV9MSU1JVF9SRVNFVF9BRlRFUl9IRUFERVIiLCJSQVRFX0xJTUlUX1NDT1BFX0hFQURFUiIsImNyZWF0ZVJlc3RNYW5hZ2VyIiwib3B0aW9ucyIsImFwcGxpY2F0aW9uSWQiLCJCaWdJbnQiLCJnZXRCb3RJZEZyb21Ub2tlbiIsInRva2VuIiwiYmFzZVVybCIsInByb3h5IiwiYmFzZUVycm9yUHJvdG90eXBlIiwiaW5zcGVjdCIsImN1c3RvbSIsIl9kZXB0aCIsIl9pbnNwZWN0IiwiZGVwdGgiLCJJbmZpbml0eSIsImN1c3RvbUluc3BlY3QiLCJyZXN0IiwiYXV0aG9yaXphdGlvbiIsImF1dGhvcml6YXRpb25IZWFkZXIiLCJkZWxldGVRdWV1ZURlbGF5IiwiZ2xvYmFsbHlSYXRlTGltaXRlZCIsImludmFsaWRCdWNrZXQiLCJjcmVhdGVJbnZhbGlkUmVxdWVzdEJ1Y2tldCIsImxvZ2dlciIsImlzUHJveGllZCIsInN0YXJ0c1dpdGgiLCJ1cGRhdGVCZWFyZXJUb2tlbkVuZHBvaW50IiwibWF4UmV0cnlDb3VudCIsInByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzIiwicXVldWVzIiwiTWFwIiwicmF0ZUxpbWl0ZWRQYXRocyIsInZlcnNpb24iLCJldmVudHMiLCJyZXF1ZXN0IiwicmVzcG9uc2UiLCJyZXF1ZXN0RXJyb3IiLCJyb3V0ZXMiLCJjcmVhdGVSb3V0ZXMiLCJjcmVhdGVCYXNlSGVhZGVycyIsIkRJU0NPUkRFTk9fVkVSU0lPTiIsImNoZWNrUmF0ZUxpbWl0cyIsInVybCIsImlkZW50aWZpZXIiLCJyYXRlbGltaXRlZCIsImdldCIsImdsb2JhbCIsIm5vdyIsIkRhdGUiLCJyZXNldFRpbWVzdGFtcCIsInVwZGF0ZVRva2VuUXVldWVzIiwib2xkVG9rZW4iLCJuZXdUb2tlbiIsIkVycm9yIiwiaGVhZGVycyIsInVuZGVmaW5lZCIsImZldGNoIiwibWV0aG9kIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJuZXdJZGVudGlmaWVyIiwia2V5IiwicXVldWUiLCJlbnRyaWVzIiwiZGVsZXRlIiwibmV3S2V5IiwibmV3UXVldWUiLCJ3YWl0aW5nIiwidW5zaGlmdCIsInBlbmRpbmciLCJjbGVhbnVwIiwic2V0IiwicmF0ZWxpbWl0UGF0aCIsImJ1Y2tldElkIiwiY2hhbmdlVG9EaXNjb3JkRm9ybWF0Iiwib2JqIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwiaXRlbSIsIm5ld09iaiIsIk9iamVjdCIsImtleXMiLCJ2YWx1ZSIsImluY2x1ZGVzIiwiY2FsY3VsYXRlQml0cyIsImRlZmF1bHRfbWVtYmVyX3Blcm1pc3Npb25zIiwibmFtZV9sb2NhbGl6YXRpb25zIiwiZGVzY3JpcHRpb25fbG9jYWxpemF0aW9ucyIsImNhbWVsVG9TbmFrZUNhc2UiLCJ0b1N0cmluZyIsImNyZWF0ZVJlcXVlc3RCb2R5IiwidW5hdXRob3JpemVkIiwicmVhc29uIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZmlsZXMiLCJmb3JtIiwiRm9ybURhdGEiLCJpIiwibGVuZ3RoIiwiYXBwZW5kIiwiYmxvYiIsIm5hbWUiLCJmb3JtQm9keSIsImRpc2NvcmRCb2R5IiwicHJvcCIsInB1c2giLCJqb2luIiwiYXNzaWduIiwicHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMiLCJzaXplIiwic2V0VGltZW91dCIsInByb2Nlc3NIZWFkZXJzIiwicmF0ZUxpbWl0ZWQiLCJyZW1haW5pbmciLCJyZXRyeUFmdGVyIiwicmVzZXQiLCJOdW1iZXIiLCJsaW1pdCIsImhhbmRsZUNvbXBsZXRlZFJlcXVlc3QiLCJpbnRlcnZhbCIsIm1heCIsImdsb2JhbFJlc2V0Iiwic2VuZFJlcXVlc3QiLCJyb3V0ZSIsInBheWxvYWQiLCJyZXF1ZXN0Qm9keU9wdGlvbnMiLCJsb2dnaW5nSGVhZGVycyIsImF1dGhvcml6YXRpb25TY2hlbWUiLCJzcGxpdCIsIlJlcXVlc3QiLCJkZWJ1ZyIsImNhdGNoIiwiZXJyb3IiLCJyZWplY3QiLCJvayIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJqc29uIiwidGV4dCIsInJlcXVlc3RCb2R5IiwicmVzcG9uc2VCb2R5Iiwic2ltcGxpZnlVcmwiLCJyZXRyeUNvdW50IiwicmVzZXRBZnRlciIsImRlbGF5IiwicmV0cnlSZXF1ZXN0IiwicmVzb2x2ZSIsInJvdXRlSW5mb3JtYXRpb25LZXkiLCJxdWVyeVBhcmFtSW5kZXgiLCJpbmRleE9mIiwic2xpY2UiLCJzcGxpdHRlZFJvdXRlIiwic3RyaXBwZWRSb3V0ZSIsInBhcnQiLCJpbmRleCIsImFycmF5IiwiaXNOdW1iZXIiLCJpc0Zpbml0ZSIsInBhcnNlSW50IiwiaXNNYWpvciIsImVuZHNXaXRoIiwibWVzc2FnZUlkIiwidGltZXN0YW1wIiwic25vd2ZsYWtlVG9UaW1lc3RhbXAiLCJwcm9jZXNzUmVxdWVzdCIsInJ1blRocm91Z2hRdWV1ZSIsInF1ZXVlSWRlbnRpZmllciIsIm1ha2VSZXF1ZXN0IiwiYnVja2V0UXVldWUiLCJRdWV1ZSIsInJlc3VsdCIsImNhdXNlIiwiY3JlYXRlIiwicGFyc2UiLCJQcm9taXNlIiwiZGF0YSIsImVycm9yVGV4dCIsIm1lc3NhZ2UiLCJoYXNQcm9wZXJ0eSIsImNvZGUiLCJjYW1lbGl6ZSIsInBvc3QiLCJwYXRjaCIsInB1dCIsImFkZFJlYWN0aW9uIiwiY2hhbm5lbElkIiwicmVhY3Rpb24iLCJwcm9jZXNzUmVhY3Rpb25TdHJpbmciLCJjaGFubmVscyIsInJlYWN0aW9ucyIsImJvdCIsImFkZFJlYWN0aW9ucyIsIm9yZGVyZWQiLCJhbGwiLCJhZGRSb2xlIiwiZ3VpbGRJZCIsInVzZXJJZCIsInJvbGVJZCIsImd1aWxkcyIsInJvbGVzIiwibWVtYmVyIiwiYWRkVGhyZWFkTWVtYmVyIiwidGhyZWFkcyIsInVzZXIiLCJhZGREbVJlY2lwaWVudCIsImRtUmVjaXBpZW50IiwiY3JlYXRlQXV0b21vZFJ1bGUiLCJhdXRvbW9kIiwicnVsZXMiLCJjcmVhdGVDaGFubmVsIiwiY3JlYXRlRW1vamkiLCJlbW9qaXMiLCJjcmVhdGVBcHBsaWNhdGlvbkVtb2ppIiwiYXBwbGljYXRpb25FbW9qaXMiLCJjcmVhdGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJyZXN0T3B0aW9ucyIsImJlYXJlclRva2VuIiwiaW50ZXJhY3Rpb25zIiwiY29tbWFuZHMiLCJjcmVhdGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImNyZWF0ZUd1aWxkU3RpY2tlciIsImZpbGUiLCJkZXNjcmlwdGlvbiIsInRhZ3MiLCJzdGlja2VycyIsImNyZWF0ZUd1aWxkVGVtcGxhdGUiLCJ0ZW1wbGF0ZXMiLCJjcmVhdGVGb3J1bVRocmVhZCIsImZvcnVtIiwiY3JlYXRlSW52aXRlIiwiaW52aXRlcyIsImNyZWF0ZVJvbGUiLCJjcmVhdGVTY2hlZHVsZWRFdmVudCIsImNyZWF0ZVN0YWdlSW5zdGFuY2UiLCJzdGFnZXMiLCJjcmVhdGVXZWJob29rIiwid2ViaG9va3MiLCJhdmF0YXIiLCJ1cmxUb0Jhc2U2NCIsImRlbGV0ZUF1dG9tb2RSdWxlIiwicnVsZUlkIiwicnVsZSIsImRlbGV0ZUNoYW5uZWwiLCJjaGFubmVsIiwiZGVsZXRlQ2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZSIsIm92ZXJ3cml0ZUlkIiwib3ZlcndyaXRlIiwiZGVsZXRlRW1vamkiLCJpZCIsImVtb2ppIiwiZGVsZXRlQXBwbGljYXRpb25FbW9qaSIsImFwcGxpY2F0aW9uRW1vamkiLCJkZWxldGVGb2xsb3d1cE1lc3NhZ2UiLCJyZXNwb25zZXMiLCJkZWxldGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJjb21tYW5kSWQiLCJjb21tYW5kIiwiZGVsZXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJvbmUiLCJkZWxldGVHdWlsZFN0aWNrZXIiLCJzdGlja2VySWQiLCJzdGlja2VyIiwiZGVsZXRlR3VpbGRUZW1wbGF0ZSIsInRlbXBsYXRlQ29kZSIsImd1aWxkIiwiZGVsZXRlSW50ZWdyYXRpb24iLCJpbnRlZ3JhdGlvbklkIiwiaW50ZWdyYXRpb24iLCJkZWxldGVJbnZpdGUiLCJpbnZpdGVDb2RlIiwiaW52aXRlIiwiZGVsZXRlTWVzc2FnZSIsImRlbGV0ZU1lc3NhZ2VzIiwibWVzc2FnZUlkcyIsImJ1bGsiLCJtZXNzYWdlcyIsImRlbGV0ZU9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSIsIm9yaWdpbmFsIiwiZGVsZXRlT3duUmVhY3Rpb24iLCJkZWxldGVSZWFjdGlvbnNBbGwiLCJkZWxldGVSZWFjdGlvbnNFbW9qaSIsImRlbGV0ZVJvbGUiLCJkZWxldGVTY2hlZHVsZWRFdmVudCIsImV2ZW50SWQiLCJldmVudCIsImRlbGV0ZVN0YWdlSW5zdGFuY2UiLCJzdGFnZSIsImRlbGV0ZVVzZXJSZWFjdGlvbiIsImRlbGV0ZVdlYmhvb2siLCJ3ZWJob29rSWQiLCJkZWxldGVXZWJob29rTWVzc2FnZSIsImRlbGV0ZVdlYmhvb2tXaXRoVG9rZW4iLCJ3ZWJob29rIiwiZWRpdEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uIiwiZWRpdEF1dG9tb2RSdWxlIiwiZWRpdEJvdFByb2ZpbGUiLCJib3RBdmF0YXJVUkwiLCJiYW5uZXIiLCJib3RCYW5uZXJVUkwiLCJjdXJyZW50VXNlciIsInVzZXJuYW1lIiwidHJpbSIsImVkaXRDaGFubmVsIiwiZWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzIiwiZWRpdENoYW5uZWxQb3NpdGlvbnMiLCJlZGl0RW1vamkiLCJlZGl0QXBwbGljYXRpb25FbW9qaSIsImVkaXRGb2xsb3d1cE1lc3NhZ2UiLCJlZGl0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiZWRpdEd1aWxkIiwiZWRpdEd1aWxkQXBwbGljYXRpb25Db21tYW5kIiwiZWRpdEd1aWxkU3RpY2tlciIsImVkaXRHdWlsZFRlbXBsYXRlIiwiZWRpdE1lc3NhZ2UiLCJlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwiZWRpdE93blZvaWNlU3RhdGUiLCJ2b2ljZSIsInJlcXVlc3RUb1NwZWFrVGltZXN0YW1wIiwidG9JU09TdHJpbmciLCJlZGl0U2NoZWR1bGVkRXZlbnQiLCJlZGl0Um9sZSIsImVkaXRSb2xlUG9zaXRpb25zIiwiZWRpdFN0YWdlSW5zdGFuY2UiLCJ0b3BpYyIsImVkaXRVc2VyVm9pY2VTdGF0ZSIsImVkaXRXZWJob29rIiwiZWRpdFdlYmhvb2tNZXNzYWdlIiwiZWRpdFdlYmhvb2tXaXRoVG9rZW4iLCJlZGl0V2VsY29tZVNjcmVlbiIsIndlbGNvbWUiLCJlZGl0V2lkZ2V0U2V0dGluZ3MiLCJ3aWRnZXQiLCJleGVjdXRlV2ViaG9vayIsImZvbGxvd0Fubm91bmNlbWVudCIsInNvdXJjZUNoYW5uZWxJZCIsInRhcmdldENoYW5uZWxJZCIsImZvbGxvdyIsIndlYmhvb2tDaGFubmVsSWQiLCJnZXRBY3RpdmVUaHJlYWRzIiwiYWN0aXZlIiwiZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbiIsImFjY2Vzc1Rva2VuIiwiZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMiLCJnZXRBcHBsaWNhdGlvbkluZm8iLCJvYXV0aDIiLCJhcHBsaWNhdGlvbiIsImVkaXRBcHBsaWNhdGlvbkluZm8iLCJnZXRDdXJyZW50QXV0aGVudGljYXRpb25JbmZvIiwiY3VycmVudEF1dGhvcml6YXRpb24iLCJleGNoYW5nZVRva2VuIiwiY2xpZW50SWQiLCJjbGllbnRTZWNyZXQiLCJiYXNpY0NyZWRlbnRpYWxzIiwiQnVmZmVyIiwiZnJvbSIsImdyYW50VHlwZSIsInNjb3BlIiwidG9rZW5FeGNoYW5nZSIsInJldm9rZVRva2VuIiwidG9rZW5SZXZva2UiLCJnZXRBdWRpdExvZyIsImF1ZGl0bG9ncyIsImdldEF1dG9tb2RSdWxlIiwiZ2V0QXV0b21vZFJ1bGVzIiwiZ2V0QXZhaWxhYmxlVm9pY2VSZWdpb25zIiwicmVnaW9ucyIsImdldEJhbiIsIm1lbWJlcnMiLCJiYW4iLCJnZXRCYW5zIiwiYmFucyIsImdldENoYW5uZWwiLCJnZXRDaGFubmVsSW52aXRlcyIsImdldENoYW5uZWxzIiwiZ2V0Q2hhbm5lbFdlYmhvb2tzIiwiZ2V0RG1DaGFubmVsIiwiZG0iLCJyZWNpcGllbnRJZCIsImdldEdyb3VwRG1DaGFubmVsIiwiZ2V0RW1vamkiLCJlbW9qaUlkIiwiZ2V0QXBwbGljYXRpb25FbW9qaSIsImdldEVtb2ppcyIsImdldEFwcGxpY2F0aW9uRW1vamlzIiwiZ2V0Rm9sbG93dXBNZXNzYWdlIiwiZ2V0R2F0ZXdheUJvdCIsImdhdGV3YXlCb3QiLCJnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzIiwid2l0aExvY2FsaXphdGlvbnMiLCJnZXRHdWlsZCIsImNvdW50cyIsImdldEd1aWxkcyIsIm1ha2VSZXF1ZXN0T3B0aW9ucyIsInVzZXJHdWlsZHMiLCJnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyIsImdldEd1aWxkUHJldmlldyIsInByZXZpZXciLCJnZXRHdWlsZFRlbXBsYXRlIiwiZ2V0R3VpbGRUZW1wbGF0ZXMiLCJnZXRHdWlsZFdlYmhvb2tzIiwiZ2V0SW50ZWdyYXRpb25zIiwiaW50ZWdyYXRpb25zIiwiZ2V0SW52aXRlIiwiZ2V0SW52aXRlcyIsImdldE1lc3NhZ2UiLCJnZXRNZXNzYWdlcyIsImdldFN0aWNrZXJQYWNrIiwic3RpY2tlclBhY2tJZCIsInN0aWNrZXJQYWNrIiwiZ2V0U3RpY2tlclBhY2tzIiwic3RpY2tlclBhY2tzIiwiZ2V0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwiZ2V0Q2hhbm5lbFBpbnMiLCJtZXNzYWdlUGlucyIsImdldFBpbm5lZE1lc3NhZ2VzIiwicGlucyIsImdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMiLCJwcml2YXRlIiwiZ2V0UHJpdmF0ZUpvaW5lZEFyY2hpdmVkVGhyZWFkcyIsImpvaW5lZCIsImdldFBydW5lQ291bnQiLCJwcnVuZSIsImdldFB1YmxpY0FyY2hpdmVkVGhyZWFkcyIsInB1YmxpYyIsImdldFJvbGVzIiwiZ2V0Um9sZSIsImdldFNjaGVkdWxlZEV2ZW50Iiwid2l0aFVzZXJDb3VudCIsImdldFNjaGVkdWxlZEV2ZW50cyIsImdldFNjaGVkdWxlZEV2ZW50VXNlcnMiLCJ1c2VycyIsImdldFNlc3Npb25JbmZvIiwiZ2V0U3RhZ2VJbnN0YW5jZSIsImdldE93blZvaWNlU3RhdGUiLCJnZXRVc2VyVm9pY2VTdGF0ZSIsImdldFN0aWNrZXIiLCJnZXRHdWlsZFN0aWNrZXIiLCJnZXRHdWlsZFN0aWNrZXJzIiwiZ2V0VGhyZWFkTWVtYmVyIiwiZ2V0VXNlciIsImdldFRocmVhZE1lbWJlcnMiLCJnZXRSZWFjdGlvbnMiLCJnZXRDdXJyZW50VXNlciIsImdldFVzZXJDb25uZWN0aW9ucyIsImNvbm5lY3Rpb25zIiwiZ2V0VXNlckFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24iLCJyb2xlQ29ubmVjdGlvbnMiLCJnZXRWYW5pdHlVcmwiLCJ2YW5pdHkiLCJnZXRWb2ljZVJlZ2lvbnMiLCJnZXRXZWJob29rIiwiZ2V0V2ViaG9va01lc3NhZ2UiLCJnZXRXZWJob29rV2l0aFRva2VuIiwiZ2V0V2VsY29tZVNjcmVlbiIsImdldFdpZGdldCIsIndpZGdldEpzb24iLCJnZXRXaWRnZXRTZXR0aW5ncyIsImpvaW5UaHJlYWQiLCJtZSIsImxlYXZlR3VpbGQiLCJsZWF2ZSIsImxlYXZlVGhyZWFkIiwicHVibGlzaE1lc3NhZ2UiLCJjcm9zc3Bvc3QiLCJyZW1vdmVSb2xlIiwicmVtb3ZlVGhyZWFkTWVtYmVyIiwicmVtb3ZlRG1SZWNpcGllbnQiLCJzZW5kRm9sbG93dXBNZXNzYWdlIiwic2VuZEludGVyYWN0aW9uUmVzcG9uc2UiLCJpbnRlcmFjdGlvbklkIiwicGFyYW1zIiwiY2FsbGJhY2siLCJzZW5kTWVzc2FnZSIsInN0YXJ0VGhyZWFkV2l0aE1lc3NhZ2UiLCJzdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlIiwiZ2V0UG9sbEFuc3dlclZvdGVycyIsImFuc3dlcklkIiwicG9sbHMiLCJ2b3RlcyIsImVuZFBvbGwiLCJleHBpcmUiLCJzeW5jR3VpbGRUZW1wbGF0ZSIsImJhbk1lbWJlciIsImJ1bGtCYW5NZW1iZXJzIiwiYnVsa0JhbiIsImVkaXRCb3RNZW1iZXIiLCJlZGl0TWVtYmVyIiwiZ2V0TWVtYmVyIiwiZ2V0Q3VycmVudE1lbWJlciIsImN1cnJlbnRNZW1iZXIiLCJnZXRNZW1iZXJzIiwiZ2V0QXBwbGljYXRpb25BY3Rpdml0eUluc3RhbmNlIiwiaW5zdGFuY2VJZCIsImFwcGxpY2F0aW9uQWN0aXZpdHlJbnN0YW5jZSIsImtpY2tNZW1iZXIiLCJwaW5NZXNzYWdlIiwibWVzc2FnZVBpbiIsInBydW5lTWVtYmVycyIsInNlYXJjaE1lbWJlcnMiLCJxdWVyeSIsInNlYXJjaCIsImdldEd1aWxkT25ib2FyZGluZyIsIm9uYm9hcmRpbmciLCJlZGl0R3VpbGRPbmJvYXJkaW5nIiwibW9kaWZ5R3VpbGRJbmNpZGVudEFjdGlvbnMiLCJpbmNpZGVudEFjdGlvbnMiLCJ1bmJhbk1lbWJlciIsInVucGluTWVzc2FnZSIsInRyaWdnZXJUeXBpbmdJbmRpY2F0b3IiLCJ0eXBpbmciLCJ1cHNlcnRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzIiwidXBzZXJ0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzIiwiZWRpdFVzZXJBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uIiwiYWRkR3VpbGRNZW1iZXIiLCJjcmVhdGVUZXN0RW50aXRsZW1lbnQiLCJtb25ldGl6YXRpb24iLCJlbnRpdGxlbWVudHMiLCJsaXN0RW50aXRsZW1lbnRzIiwiZ2V0RW50aXRsZW1lbnQiLCJlbnRpdGxlbWVudElkIiwiZW50aXRsZW1lbnQiLCJkZWxldGVUZXN0RW50aXRsZW1lbnQiLCJjb25zdW1lRW50aXRsZW1lbnQiLCJsaXN0U2t1cyIsInNrdXMiLCJsaXN0U3Vic2NyaXB0aW9ucyIsInNrdUlkIiwic3Vic2NyaXB0aW9ucyIsImdldFN1YnNjcmlwdGlvbiIsInN1YnNjcmlwdGlvbklkIiwic3Vic2NyaXB0aW9uIiwic2VuZFNvdW5kYm9hcmRTb3VuZCIsInNvdW5kYm9hcmQiLCJzZW5kU291bmQiLCJsaXN0RGVmYXVsdFNvdW5kYm9hcmRTb3VuZHMiLCJsaXN0RGVmYXVsdCIsImxpc3RHdWlsZFNvdW5kYm9hcmRTb3VuZHMiLCJndWlsZFNvdW5kcyIsImdldEd1aWxkU291bmRib2FyZFNvdW5kIiwic291bmRJZCIsImd1aWxkU291bmQiLCJjcmVhdGVHdWlsZFNvdW5kYm9hcmRTb3VuZCIsIm1vZGlmeUd1aWxkU291bmRib2FyZFNvdW5kIiwiZGVsZXRlR3VpbGRTb3VuZGJvYXJkU291bmQiLCJsaXN0QXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbnNNZXRhZGF0YVJlY29yZHMiLCJhcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uTWV0YWRhdGEiLCJ1cGRhdGVBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uc01ldGFkYXRhUmVjb3JkcyIsImNyZWF0ZUxvYmJ5IiwibG9iYnkiLCJnZXRMb2JieSIsImxvYmJ5SWQiLCJtb2RpZnlMb2JieSIsImRlbGV0ZUxvYmJ5IiwiYWRkTWVtYmVyVG9Mb2JieSIsInJlbW92ZU1lbWJlckZyb21Mb2JieSIsImxlYXZlTG9iYnkiLCJsaW5rQ2hhbm5lbFRvTG9iYnkiLCJsaW5rIiwidW5saW5rQ2hhbm5lbFRvTG9iYnkiLCJwcmVmZXJT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
|