@discordeno/rest 22.0.1-next.fca3cbb → 22.0.1-next.fdb61e1

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/dist/manager.js CHANGED
@@ -1,6 +1,6 @@
1
- import { Buffer } from 'node:buffer';
2
1
  import { inspect } from 'node:util';
3
- import { camelize, camelToSnakeCase, DISCORDENO_VERSION, delay, getBotIdFromToken, hasProperty, logger, processReactionString, snowflakeToTimestamp, urlToBase64 } from '@discordeno/utils';
2
+ import { camelize, camelToSnakeCase, DISCORDENO_VERSION, delay, getBotIdFromToken, hasProperty, logger, snowflakeToTimestamp } from '@discordeno/utils';
3
+ import { restEndpoints } from './endpoints.js';
4
4
  import { createInvalidRequestBucket } from './invalidBucket.js';
5
5
  import { Queue } from './queue.js';
6
6
  import { createRoutes } from './routes.js';
@@ -39,7 +39,10 @@ export function createRestManager(options) {
39
39
  }),
40
40
  isProxied: !baseUrl.startsWith(DISCORD_API_URL),
41
41
  updateBearerTokenEndpoint: options.proxy?.updateBearerTokenEndpoint,
42
+ retryProxiedRequests: options.proxy?.retryRequests ?? false,
42
43
  maxRetryCount: Infinity,
44
+ maxProxyRetryCount: 15,
45
+ proxyRetryDelayStep: 250,
43
46
  requestTimeout: options.requestTimeout ?? 30000,
44
47
  processingRateLimitedPaths: false,
45
48
  queues: new Map(),
@@ -63,13 +66,12 @@ export function createRestManager(options) {
63
66
  const ratelimited = rest.rateLimitedPaths.get(`${identifier}${url}`);
64
67
  const global = rest.rateLimitedPaths.get('global');
65
68
  const now = Date.now();
66
- if (ratelimited && now < ratelimited.resetTimestamp) {
67
- return ratelimited.resetTimestamp - now;
68
- }
69
- if (global && now < global.resetTimestamp) {
70
- return global.resetTimestamp - now;
71
- }
72
- return false;
69
+ // Whichever of the two lasts longer is the one that decides when this request may go out, a shorter per url limit does not make it
70
+ // alright to send while the global one is still running.
71
+ const urlWait = ratelimited && now < ratelimited.resetTimestamp ? ratelimited.resetTimestamp - now : 0;
72
+ const globalWait = global && now < global.resetTimestamp ? global.resetTimestamp - now : 0;
73
+ const wait = Math.max(urlWait, globalWait);
74
+ return wait > 0 ? wait : false;
73
75
  },
74
76
  async updateTokenQueues (oldToken, newToken) {
75
77
  if (rest.isProxied) {
@@ -106,6 +108,9 @@ export function createRestManager(options) {
106
108
  newQueue.pending.unshift(...queue.pending);
107
109
  queue.waiting = [];
108
110
  queue.pending = [];
111
+ // The merged queue is not processing anything of its own, so nothing would ever look at what it was just handed.
112
+ newQueue.processWaiting();
113
+ newQueue.processPending();
109
114
  queue.cleanup();
110
115
  } else {
111
116
  rest.queues.set(newKey, queue);
@@ -198,6 +203,42 @@ export function createRestManager(options) {
198
203
  method
199
204
  };
200
205
  },
206
+ createRequestError (error, reason) {
207
+ let errorText;
208
+ switch(reason.status){
209
+ case 400:
210
+ errorText = "The options was improperly formatted, or the server couldn't understand it.";
211
+ break;
212
+ case 401:
213
+ errorText = 'The Authorization header was missing or invalid.';
214
+ break;
215
+ case 403:
216
+ errorText = 'The Authorization token you passed did not have permission to the resource.';
217
+ break;
218
+ case 404:
219
+ errorText = "The resource at the location specified doesn't exist.";
220
+ break;
221
+ case 405:
222
+ errorText = 'The HTTP method used is not valid for the location specified.';
223
+ break;
224
+ case 429:
225
+ errorText = "You're being ratelimited.";
226
+ break;
227
+ case 502:
228
+ errorText = 'There was not a gateway available to process your options. Wait a bit and retry.';
229
+ break;
230
+ default:
231
+ errorText = reason.statusText ?? reason.error ?? 'Unknown error';
232
+ }
233
+ error.message = `[${reason.status}] ${errorText}`;
234
+ // 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
235
+ // https://docs.discord.com/developers/reference#error-messages
236
+ if (typeof reason.body === 'object' && hasProperty(reason.body, 'code') && hasProperty(reason.body, 'message')) {
237
+ error.message += `\nDiscord error: [${reason.body.code}] ${reason.body.message}`;
238
+ }
239
+ error.cause = Object.assign(Object.create(baseErrorPrototype), reason);
240
+ return error;
241
+ },
201
242
  processRateLimitedPaths () {
202
243
  const now = Date.now();
203
244
  for (const [key, value] of rest.rateLimitedPaths.entries()){
@@ -320,9 +361,14 @@ export function createRestManager(options) {
320
361
  // Give this attempt a hard deadline. `AbortSignal.timeout` aborts the fetch (and any in-progress body
321
362
  // read) once it fires, which makes the awaited fetch reject so a stalled connection can never keep this
322
363
  // queue's `processPending` loop (and therefore the whole queue) wedged forever. Omitted when disabled.
364
+ // The caller's signal is handed to fetch too: fetch refuses to send a request whose signal is already aborted, so a queue entry that got
365
+ // aborted while waiting never goes out, and aborting mid-request tears down the connection.
366
+ const signals = [];
367
+ if (options.requestBodyOptions?.signal) signals.push(options.requestBodyOptions.signal);
368
+ if (rest.requestTimeout > 0) signals.push(AbortSignal.timeout(rest.requestTimeout));
323
369
  const request = new Request(url, {
324
370
  ...payload,
325
- signal: rest.requestTimeout > 0 ? AbortSignal.timeout(rest.requestTimeout) : undefined
371
+ signal: signals.length > 0 ? AbortSignal.any(signals) : undefined
326
372
  });
327
373
  rest.events.request(request, {
328
374
  body: options.requestBodyOptions?.body
@@ -337,6 +383,16 @@ export function createRestManager(options) {
337
383
  });
338
384
  // Mark request as completed
339
385
  rest.invalidBucket.handleCompletedRequest(999, false);
386
+ // The caller aborted the request, never re-send it, Discord may have received it already. The caller was rejected the moment the signal fired.
387
+ if (options.requestBodyOptions?.signal?.aborted) {
388
+ options.reject({
389
+ ok: false,
390
+ status: 999,
391
+ error: 'The request was aborted.',
392
+ errorObject: error
393
+ });
394
+ return;
395
+ }
340
396
  // The attempt hit `rest.requestTimeout` and was aborted. Treat it like a transient failure and retry
341
397
  // it through the queue, so a single stalled connection doesn't permanently fail the request.
342
398
  if (isTimeoutError(error)) return await handleTimeout(options, error);
@@ -360,7 +416,7 @@ export function createRestManager(options) {
360
416
  // Mark request as completed
361
417
  rest.invalidBucket.handleCompletedRequest(response.status, response.headers.get(RATE_LIMIT_SCOPE_HEADER) === 'shared');
362
418
  // Set the bucket id if it was available on the headers
363
- const bucketId = rest.processHeaders(rest.simplifyUrl(options.route, options.method), response.headers, payload.headers.authorization);
419
+ const bucketId = rest.processHeaders(options.simplifiedUrl ?? rest.simplifyUrl(options.route, options.method), response.headers, payload.headers.authorization);
364
420
  if (bucketId) options.bucketId = bucketId;
365
421
  if (response.status < 200 || response.status >= 400) {
366
422
  rest.logger.debug(`Request to ${url} failed.`);
@@ -376,7 +432,10 @@ export function createRestManager(options) {
376
432
  rest.logger.debug(`Request to ${url} was ratelimited.`);
377
433
  // Too many attempts, get rid of request from queue.
378
434
  if (options.retryCount >= rest.maxRetryCount) {
379
- rest.logger.debug(`Request to ${url} exceeded the maximum allowed retries.`, 'with payload:', payload);
435
+ rest.logger.debug(`Request to ${url} exceeded the maximum allowed retries.`, 'with payload:', {
436
+ ...payload,
437
+ headers: loggingHeaders
438
+ });
380
439
  // rest.debug(`[REST - RetriesMaxed] ${JSON.stringify(options)}`)
381
440
  options.reject({
382
441
  ok: false,
@@ -444,7 +503,8 @@ export function createRestManager(options) {
444
503
  return routeInformationKey.join(':');
445
504
  },
446
505
  async processRequest (request) {
447
- const url = rest.simplifyUrl(request.route, request.method);
506
+ request.simplifiedUrl ??= rest.simplifyUrl(request.route, request.method);
507
+ const url = request.simplifiedUrl;
448
508
  if (request.runThroughQueue === false) {
449
509
  await rest.sendRequest(request);
450
510
  return;
@@ -478,48 +538,119 @@ export function createRestManager(options) {
478
538
  options.headers[rest.authorizationHeader] = rest.authorization;
479
539
  }
480
540
  const url = `${rest.baseUrl}/v${rest.version}${route}`;
481
- // Retry on timeout up to `maxRetryCount`, mirroring the queued `sendRequest` path, so a stalled proxy
482
- // connection doesn't permanently fail the request (and can never hang the caller forever).
483
- for(let retryCount = 0;; retryCount++){
484
- // Give the request to the proxy a hard deadline too via `AbortSignal.timeout` (omitted when disabled).
541
+ // An attempt that failed without a response is not re-sent by default. Whatever it failed on, the proxy may already have the request
542
+ // (a timeout only aborts our side of the connection, and a socket that dies once the request is on the wire may still have delivered
543
+ // it), so re-sending it would execute non-idempotent requests twice. `fetch` gives no way to tell the two apart, so the caller is the
544
+ // one who decides: `proxy.retryRequests` says re-sending against this proxy is safe. Retrying towards Discord is the proxy's job, it
545
+ // is the one talking to Discord.
546
+ let retryCount = 0;
547
+ for(;;){
548
+ // The request may have been aborted while the previous attempt was timing out, never send it in that case.
549
+ if (options?.signal?.aborted) {
550
+ throw rest.createRequestError(error, {
551
+ ok: false,
552
+ status: 999,
553
+ error: 'The request was aborted.',
554
+ errorObject: options.signal.reason
555
+ });
556
+ }
557
+ // Give the attempt a deadline (omitted when disabled) so a stalled connection can't hang the caller forever, and hand the caller's
558
+ // signal to fetch so aborting tears down a request that is already on the wire.
559
+ const signals = [];
560
+ if (options?.signal) signals.push(options.signal);
561
+ if (rest.requestTimeout > 0) signals.push(AbortSignal.timeout(rest.requestTimeout));
485
562
  const request = new Request(url, {
486
563
  ...rest.createRequestBody(method, options),
487
- signal: rest.requestTimeout > 0 ? AbortSignal.timeout(rest.requestTimeout) : undefined
564
+ signal: signals.length > 0 ? AbortSignal.any(signals) : undefined
488
565
  });
489
566
  rest.events.request(request, {
490
567
  body: options?.body
491
568
  });
492
- const result = await fetch(request).catch((fetchError)=>{
569
+ const result = await fetch(request).catch(async (fetchError)=>{
493
570
  rest.events.requestError(request, fetchError, {
494
571
  body: options?.body
495
572
  });
496
- // The attempt hit `rest.requestTimeout` and was aborted; retry it until the budget is exhausted.
497
- if (isTimeoutError(fetchError) && retryCount < rest.maxRetryCount) {
498
- rest.logger.debug(`request to proxy ${url} timed out after ${rest.requestTimeout}ms, retrying.`, fetchError);
573
+ // The caller aborted the request, never re-send it, the proxy may have received it already.
574
+ if (options?.signal?.aborted) {
575
+ throw rest.createRequestError(error, {
576
+ ok: false,
577
+ status: 999,
578
+ error: 'The request was aborted.',
579
+ errorObject: fetchError
580
+ });
581
+ }
582
+ const timedOut = isTimeoutError(fetchError);
583
+ if (rest.retryProxiedRequests && retryCount < rest.maxRetryCount && retryCount < rest.maxProxyRetryCount) {
584
+ retryCount++;
585
+ rest.logger.debug(`request to proxy ${url} failed without a response, retrying.`, fetchError);
586
+ // Wait a little longer before each further attempt so a proxy that is down isn't hammered in a tight loop, while staying
587
+ // frequent enough to notice it coming back. A timed out attempt already sat out `requestTimeout`, so it goes again right away.
588
+ if (!timedOut) await delay(rest.proxyRetryDelayStep * retryCount);
499
589
  return undefined;
500
590
  }
501
- throw fetchError;
591
+ if (timedOut) {
592
+ rest.logger.debug(`request to proxy ${url} timed out after ${rest.requestTimeout}ms.`);
593
+ throw rest.createRequestError(error, {
594
+ ok: false,
595
+ status: 999,
596
+ error: 'The request timed out and it maxed out the retries limit.',
597
+ errorObject: fetchError
598
+ });
599
+ }
600
+ rest.logger.debug(`request fetch to proxy ${url} failed.`, fetchError);
601
+ throw rest.createRequestError(error, {
602
+ ok: false,
603
+ status: 999,
604
+ error: 'Possible network or request shape issue occurred. If this is rare, its a network glitch. If it occurs a lot something is wrong.',
605
+ errorObject: fetchError
606
+ });
502
607
  });
503
- // If result is undefined, the attempt timed out and is being retried.
608
+ // If result is undefined, the attempt failed in a way that is safe to re-send and is being retried.
504
609
  if (!result) continue;
505
610
  // Sometimes the Content-Type may be "application/json; charset=utf-8", for this reason, we need to check the start of the header
506
- const body = await (result.headers.get('Content-Type')?.startsWith('application/json') ? result.json() : result.text()).catch(()=>null);
611
+ let bodyReadFailed = false;
612
+ const body = await (result.headers.get('Content-Type')?.startsWith('application/json') ? result.json() : result.text()).catch(()=>{
613
+ bodyReadFailed = true;
614
+ return null;
615
+ });
507
616
  rest.events.response(request, result, {
508
617
  requestBody: options?.body,
509
618
  responseBody: body
510
619
  });
620
+ // `fetch` resolves once the headers are in, so an abort can land while the body above is still being read. That read rejects, the
621
+ // fallback turns it into a `null` body and the caller gets it back as a successful empty response. A read that did finish is kept,
622
+ // the same way the queued path hands back a result that arrived before the signal fired.
623
+ if (bodyReadFailed && options?.signal?.aborted) {
624
+ throw rest.createRequestError(error, {
625
+ ok: false,
626
+ status: 999,
627
+ error: 'The request was aborted.',
628
+ errorObject: options.signal.reason
629
+ });
630
+ }
511
631
  if (!result.ok) {
512
- error.cause = Object.assign(Object.create(baseErrorPrototype), {
632
+ throw rest.createRequestError(error, {
513
633
  ok: false,
514
634
  status: result.status,
635
+ statusText: result.statusText,
515
636
  body
516
637
  });
517
- throw error;
518
638
  }
519
639
  return result.status !== 204 ? typeof body === 'string' ? JSON.parse(body) : body : undefined;
520
640
  }
521
641
  }
522
642
  return await new Promise(async (resolve, reject)=>{
643
+ const signal = options?.signal;
644
+ const abortListener = ()=>{
645
+ // Reject right away instead of waiting for the queue to reach the request. The signal is attached to the fetch itself as well, so an
646
+ // attempt that is already in flight gets its connection torn down too.
647
+ payload.reject({
648
+ ok: false,
649
+ status: 999,
650
+ error: 'The request was aborted.',
651
+ errorObject: signal?.reason
652
+ });
653
+ };
523
654
  const payload = {
524
655
  route,
525
656
  method,
@@ -529,1210 +660,55 @@ export function createRestManager(options) {
529
660
  await rest.processRequest(payload);
530
661
  },
531
662
  resolve: (data)=>{
663
+ signal?.removeEventListener('abort', abortListener);
532
664
  resolve(data.status !== 204 ? data.body : undefined);
533
665
  },
534
666
  reject: (reason)=>{
535
- let errorText;
536
- switch(reason.status){
537
- case 400:
538
- errorText = "The options was improperly formatted, or the server couldn't understand it.";
539
- break;
540
- case 401:
541
- errorText = 'The Authorization header was missing or invalid.';
542
- break;
543
- case 403:
544
- errorText = 'The Authorization token you passed did not have permission to the resource.';
545
- break;
546
- case 404:
547
- errorText = "The resource at the location specified doesn't exist.";
548
- break;
549
- case 405:
550
- errorText = 'The HTTP method used is not valid for the location specified.';
551
- break;
552
- case 429:
553
- errorText = "You're being ratelimited.";
554
- break;
555
- case 502:
556
- errorText = 'There was not a gateway available to process your options. Wait a bit and retry.';
557
- break;
558
- default:
559
- errorText = reason.statusText ?? 'Unknown error';
560
- }
561
- error.message = `[${reason.status}] ${errorText}`;
562
- // 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
563
- // https://docs.discord.com/developers/reference#error-messages
564
- if (typeof reason.body === 'object' && hasProperty(reason.body, 'code') && hasProperty(reason.body, 'message')) {
565
- error.message += `\nDiscord error: [${reason.body.code}] ${reason.body.message}`;
566
- }
567
- error.cause = Object.assign(Object.create(baseErrorPrototype), reason);
568
- reject(error);
667
+ signal?.removeEventListener('abort', abortListener);
668
+ reject(rest.createRequestError(error, reason));
569
669
  },
570
670
  runThroughQueue: options?.runThroughQueue
571
671
  };
672
+ // Reject a queued request as soon as its signal aborts instead of when the queue reaches it, so a caller enforcing a deadline gets its
673
+ // answer right away. Fetch refusing to send an already aborted request is what guarantees the stale queue entry never goes out.
674
+ if (signal?.aborted) {
675
+ abortListener();
676
+ return;
677
+ }
678
+ signal?.addEventListener('abort', abortListener, {
679
+ once: true
680
+ });
572
681
  await rest.processRequest(payload);
573
682
  });
574
683
  },
575
684
  async get (url, options) {
576
- return camelize(await rest.makeRequest('GET', url, options));
685
+ return await rest.makeRequest('GET', url, options);
577
686
  },
578
687
  async post (url, options) {
579
- return camelize(await rest.makeRequest('POST', url, options));
688
+ return await rest.makeRequest('POST', url, options);
580
689
  },
581
690
  async delete (url, options) {
582
- camelize(await rest.makeRequest('DELETE', url, options));
691
+ await rest.makeRequest('DELETE', url, options);
583
692
  },
584
693
  async patch (url, options) {
585
- return camelize(await rest.makeRequest('PATCH', url, options));
694
+ return await rest.makeRequest('PATCH', url, options);
586
695
  },
587
696
  async put (url, options) {
588
- return camelize(await rest.makeRequest('PUT', url, options));
589
- },
590
- async addReaction (channelId, messageId, reaction) {
591
- reaction = processReactionString(reaction);
592
- await rest.put(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
593
- },
594
- async addReactions (channelId, messageId, reactions, ordered = false) {
595
- if (!ordered) {
596
- await Promise.all(reactions.map(async (reaction)=>{
597
- await rest.addReaction(channelId, messageId, reaction);
598
- }));
599
- return;
600
- }
601
- for (const reaction of reactions){
602
- await rest.addReaction(channelId, messageId, reaction);
603
- }
604
- },
605
- async addRole (guildId, userId, roleId, reason) {
606
- await rest.put(rest.routes.guilds.roles.member(guildId, userId, roleId), {
607
- reason
608
- });
609
- },
610
- async addThreadMember (channelId, userId) {
611
- await rest.put(rest.routes.channels.threads.user(channelId, userId));
612
- },
613
- async addDmRecipient (channelId, userId, body) {
614
- await rest.put(rest.routes.channels.dmRecipient(channelId, userId), {
615
- body
616
- });
617
- },
618
- async createAutomodRule (guildId, body, reason) {
619
- return await rest.post(rest.routes.guilds.automod.rules(guildId), {
620
- body,
621
- reason
622
- });
623
- },
624
- async createChannel (guildId, body, reason) {
625
- return await rest.post(rest.routes.guilds.channels(guildId), {
626
- body,
627
- reason
628
- });
629
- },
630
- async createEmoji (guildId, body, reason) {
631
- return await rest.post(rest.routes.guilds.emojis(guildId), {
632
- body,
633
- reason
634
- });
635
- },
636
- async createApplicationEmoji (body) {
637
- return await rest.post(rest.routes.applicationEmojis(rest.applicationId), {
638
- body
639
- });
640
- },
641
- async createGlobalApplicationCommand (body, options) {
642
- const restOptions = {
643
- body
644
- };
645
- if (options?.bearerToken) {
646
- restOptions.unauthorized = true;
647
- restOptions.headers = {
648
- authorization: `Bearer ${options.bearerToken}`
649
- };
650
- }
651
- return await rest.post(rest.routes.interactions.commands.commands(rest.applicationId), restOptions);
652
- },
653
- async createGuildApplicationCommand (body, guildId, options) {
654
- const restOptions = {
655
- body
656
- };
657
- if (options?.bearerToken) {
658
- restOptions.unauthorized = true;
659
- restOptions.headers = {
660
- authorization: `Bearer ${options.bearerToken}`
661
- };
662
- }
663
- return await rest.post(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), restOptions);
664
- },
665
- async createGuildSticker (guildId, options, reason) {
666
- const form = new FormData();
667
- form.append('file', options.file.blob, options.file.name);
668
- form.append('name', options.name);
669
- form.append('description', options.description);
670
- form.append('tags', options.tags);
671
- return await rest.post(rest.routes.guilds.stickers(guildId), {
672
- body: form,
673
- reason
674
- });
675
- },
676
- async createGuildTemplate (guildId, body) {
677
- return await rest.post(rest.routes.guilds.templates.all(guildId), {
678
- body
679
- });
680
- },
681
- async createForumThread (channelId, body, reason) {
682
- return await rest.post(rest.routes.channels.forum(channelId), {
683
- body,
684
- files: body.files,
685
- reason
686
- });
687
- },
688
- async createInvite (channelId, body = {}, reason) {
689
- if (!body.targetUsersFile) {
690
- return await rest.post(rest.routes.channels.invites(channelId), {
691
- body,
692
- reason
693
- });
694
- }
695
- // When we have to upload a file, we need to use FormData, and all other fields need to be part of the payload_json field.
696
- const form = new FormData();
697
- form.append('payload_json', JSON.stringify(rest.changeToDiscordFormat({
698
- ...body,
699
- targetUsersFile: undefined
700
- })));
701
- form.append('target_users_file', body.targetUsersFile);
702
- return await rest.post(rest.routes.channels.invites(channelId), {
703
- body: form,
704
- reason
705
- });
706
- },
707
- async getGuildRoleMemberCounts (guildId) {
708
- return await rest.get(rest.routes.guilds.roles.memberCounts(guildId));
709
- },
710
- async createRole (guildId, body, reason) {
711
- return await rest.post(rest.routes.guilds.roles.all(guildId), {
712
- body,
713
- reason
714
- });
715
- },
716
- async createScheduledEvent (guildId, body, reason) {
717
- return await rest.post(rest.routes.guilds.events.events(guildId), {
718
- body,
719
- reason
720
- });
721
- },
722
- async createStageInstance (body, reason) {
723
- return await rest.post(rest.routes.channels.stages(), {
724
- body,
725
- reason
726
- });
727
- },
728
- async createWebhook (channelId, options, reason) {
729
- return await rest.post(rest.routes.channels.webhooks(channelId), {
730
- body: {
731
- name: options.name,
732
- avatar: options.avatar ? await urlToBase64(options.avatar) : undefined
733
- },
734
- reason
735
- });
736
- },
737
- async deleteAutomodRule (guildId, ruleId, reason) {
738
- await rest.delete(rest.routes.guilds.automod.rule(guildId, ruleId), {
739
- reason
740
- });
741
- },
742
- async deleteChannel (channelId, reason) {
743
- await rest.delete(rest.routes.channels.channel(channelId), {
744
- reason
745
- });
746
- },
747
- async deleteChannelPermissionOverride (channelId, overwriteId, reason) {
748
- await rest.delete(rest.routes.channels.overwrite(channelId, overwriteId), {
749
- reason
750
- });
751
- },
752
- async deleteEmoji (guildId, id, reason) {
753
- await rest.delete(rest.routes.guilds.emoji(guildId, id), {
754
- reason
755
- });
756
- },
757
- async deleteApplicationEmoji (id) {
758
- await rest.delete(rest.routes.applicationEmoji(rest.applicationId, id));
759
- },
760
- async deleteFollowupMessage (token, messageId) {
761
- await rest.delete(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
762
- unauthorized: true
763
- });
764
- },
765
- async deleteGlobalApplicationCommand (commandId) {
766
- await rest.delete(rest.routes.interactions.commands.command(rest.applicationId, commandId));
767
- },
768
- async deleteGuildApplicationCommand (commandId, guildId) {
769
- await rest.delete(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
770
- },
771
- async deleteGuildSticker (guildId, stickerId, reason) {
772
- await rest.delete(rest.routes.guilds.sticker(guildId, stickerId), {
773
- reason
774
- });
775
- },
776
- async deleteGuildTemplate (guildId, templateCode) {
777
- await rest.delete(rest.routes.guilds.templates.guild(guildId, templateCode));
778
- },
779
- async deleteIntegration (guildId, integrationId, reason) {
780
- await rest.delete(rest.routes.guilds.integration(guildId, integrationId), {
781
- reason
782
- });
783
- },
784
- async deleteInvite (inviteCode, reason) {
785
- await rest.delete(rest.routes.guilds.invite(inviteCode), {
786
- reason
787
- });
788
- },
789
- async getTargetUsers (inviteCode) {
790
- return await rest.get(rest.routes.guilds.inviteTargetUsers(inviteCode));
791
- },
792
- async updateTargetUsers (inviteCode, targetUsersFile) {
793
- const form = new FormData();
794
- form.append('target_users_file', targetUsersFile);
795
- await rest.put(rest.routes.guilds.inviteTargetUsers(inviteCode), {
796
- body: form
797
- });
798
- },
799
- async getTargetUsersJobStatus (inviteCode) {
800
- return await rest.get(rest.routes.guilds.inviteTargetUsersJobStatus(inviteCode));
801
- },
802
- async deleteMessage (channelId, messageId, reason) {
803
- await rest.delete(rest.routes.channels.message(channelId, messageId), {
804
- reason
805
- });
806
- },
807
- async deleteMessages (channelId, messageIds, reason) {
808
- await rest.post(rest.routes.channels.bulk(channelId), {
809
- body: {
810
- messages: messageIds.slice(0, 100).map((id)=>id.toString())
811
- },
812
- reason
813
- });
814
- },
815
- async deleteOriginalInteractionResponse (token) {
816
- await rest.delete(rest.routes.interactions.responses.original(rest.applicationId, token), {
817
- unauthorized: true
818
- });
819
- },
820
- async deleteOwnReaction (channelId, messageId, reaction) {
821
- reaction = processReactionString(reaction);
822
- await rest.delete(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
823
- },
824
- async deleteReactionsAll (channelId, messageId) {
825
- await rest.delete(rest.routes.channels.reactions.all(channelId, messageId));
826
- },
827
- async deleteReactionsEmoji (channelId, messageId, reaction) {
828
- reaction = processReactionString(reaction);
829
- await rest.delete(rest.routes.channels.reactions.emoji(channelId, messageId, reaction));
830
- },
831
- async deleteRole (guildId, roleId, reason) {
832
- await rest.delete(rest.routes.guilds.roles.one(guildId, roleId), {
833
- reason
834
- });
835
- },
836
- async deleteScheduledEvent (guildId, eventId) {
837
- await rest.delete(rest.routes.guilds.events.event(guildId, eventId));
838
- },
839
- async deleteStageInstance (channelId, reason) {
840
- await rest.delete(rest.routes.channels.stage(channelId), {
841
- reason
842
- });
843
- },
844
- async deleteUserReaction (channelId, messageId, userId, reaction) {
845
- reaction = processReactionString(reaction);
846
- await rest.delete(rest.routes.channels.reactions.user(channelId, messageId, reaction, userId));
847
- },
848
- async deleteWebhook (webhookId, reason) {
849
- await rest.delete(rest.routes.webhooks.id(webhookId), {
850
- reason
851
- });
852
- },
853
- async deleteWebhookMessage (webhookId, token, messageId, options) {
854
- await rest.delete(rest.routes.webhooks.message(webhookId, token, messageId, options), {
855
- unauthorized: true
856
- });
857
- },
858
- async deleteWebhookWithToken (webhookId, token) {
859
- await rest.delete(rest.routes.webhooks.webhook(webhookId, token), {
860
- unauthorized: true
861
- });
862
- },
863
- async editApplicationCommandPermissions (guildId, commandId, bearerToken, permissions) {
864
- return await rest.put(rest.routes.interactions.commands.permission(rest.applicationId, guildId, commandId), {
865
- body: {
866
- permissions
867
- },
868
- headers: {
869
- authorization: `Bearer ${bearerToken}`
870
- }
871
- });
872
- },
873
- async editAutomodRule (guildId, ruleId, body, reason) {
874
- return await rest.patch(rest.routes.guilds.automod.rule(guildId, ruleId), {
875
- body,
876
- reason
877
- });
878
- },
879
- async editBotProfile (options) {
880
- const avatar = options?.botAvatarURL ? await urlToBase64(options?.botAvatarURL) : options?.botAvatarURL;
881
- const banner = options?.botBannerURL ? await urlToBase64(options?.botBannerURL) : options?.botBannerURL;
882
- return await rest.patch(rest.routes.currentUser(), {
883
- body: {
884
- username: options.username?.trim(),
885
- avatar,
886
- banner
887
- }
888
- });
889
- },
890
- async editChannel (channelId, body, reason) {
891
- return await rest.patch(rest.routes.channels.channel(channelId), {
892
- body,
893
- reason
894
- });
895
- },
896
- async editChannelPermissionOverrides (channelId, body, reason) {
897
- await rest.put(rest.routes.channels.overwrite(channelId, body.id), {
898
- body,
899
- reason
900
- });
901
- },
902
- async editChannelPositions (guildId, body) {
903
- await rest.patch(rest.routes.guilds.channels(guildId), {
904
- body
905
- });
906
- },
907
- async editEmoji (guildId, id, body, reason) {
908
- return await rest.patch(rest.routes.guilds.emoji(guildId, id), {
909
- body,
910
- reason
911
- });
912
- },
913
- async editApplicationEmoji (id, body) {
914
- return await rest.patch(rest.routes.applicationEmoji(rest.applicationId, id), {
915
- body
916
- });
917
- },
918
- async editFollowupMessage (token, messageId, body) {
919
- return await rest.patch(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
920
- body,
921
- files: body.files,
922
- unauthorized: true
923
- });
924
- },
925
- async editGlobalApplicationCommand (commandId, body) {
926
- return await rest.patch(rest.routes.interactions.commands.command(rest.applicationId, commandId), {
927
- body
928
- });
929
- },
930
- async editGuild (guildId, body, reason) {
931
- return await rest.patch(rest.routes.guilds.guild(guildId), {
932
- body,
933
- reason
934
- });
935
- },
936
- async editGuildApplicationCommand (commandId, guildId, body) {
937
- return await rest.patch(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId), {
938
- body
939
- });
940
- },
941
- async editGuildSticker (guildId, stickerId, body, reason) {
942
- return await rest.patch(rest.routes.guilds.sticker(guildId, stickerId), {
943
- body,
944
- reason
945
- });
946
- },
947
- async editGuildTemplate (guildId, templateCode, body) {
948
- return await rest.patch(rest.routes.guilds.templates.guild(guildId, templateCode), {
949
- body
950
- });
951
- },
952
- async editMessage (channelId, messageId, body) {
953
- return await rest.patch(rest.routes.channels.message(channelId, messageId), {
954
- body,
955
- files: body.files
956
- });
957
- },
958
- async editOriginalInteractionResponse (token, body) {
959
- return await rest.patch(rest.routes.interactions.responses.original(rest.applicationId, token), {
960
- body,
961
- files: body.files,
962
- unauthorized: true
963
- });
964
- },
965
- async editOwnVoiceState (guildId, options) {
966
- await rest.patch(rest.routes.guilds.voice(guildId), {
967
- body: {
968
- ...options,
969
- requestToSpeakTimestamp: options.requestToSpeakTimestamp ? new Date(options.requestToSpeakTimestamp).toISOString() : options.requestToSpeakTimestamp
970
- }
971
- });
972
- },
973
- async editScheduledEvent (guildId, eventId, body, reason) {
974
- return await rest.patch(rest.routes.guilds.events.event(guildId, eventId), {
975
- body,
976
- reason
977
- });
978
- },
979
- async editRole (guildId, roleId, body, reason) {
980
- return await rest.patch(rest.routes.guilds.roles.one(guildId, roleId), {
981
- body,
982
- reason
983
- });
984
- },
985
- async editRolePositions (guildId, body, reason) {
986
- return await rest.patch(rest.routes.guilds.roles.all(guildId), {
987
- body,
988
- reason
989
- });
990
- },
991
- async editStageInstance (channelId, topic, reason) {
992
- return await rest.patch(rest.routes.channels.stage(channelId), {
993
- body: {
994
- topic
995
- },
996
- reason
997
- });
998
- },
999
- async editUserVoiceState (guildId, options) {
1000
- await rest.patch(rest.routes.guilds.voice(guildId, options.userId), {
1001
- body: options
1002
- });
1003
- },
1004
- async editWebhook (webhookId, body, reason) {
1005
- return await rest.patch(rest.routes.webhooks.id(webhookId), {
1006
- body,
1007
- reason
1008
- });
1009
- },
1010
- async editWebhookMessage (webhookId, token, messageId, options) {
1011
- return await rest.patch(rest.routes.webhooks.message(webhookId, token, messageId, options), {
1012
- body: options,
1013
- files: options.files,
1014
- unauthorized: true
1015
- });
1016
- },
1017
- async editWebhookWithToken (webhookId, token, body) {
1018
- return await rest.patch(rest.routes.webhooks.webhook(webhookId, token), {
1019
- body,
1020
- unauthorized: true
1021
- });
1022
- },
1023
- async editWelcomeScreen (guildId, body, reason) {
1024
- return await rest.patch(rest.routes.guilds.welcome(guildId), {
1025
- body,
1026
- reason
1027
- });
1028
- },
1029
- async editWidgetSettings (guildId, body, reason) {
1030
- return await rest.patch(rest.routes.guilds.widget(guildId), {
1031
- body,
1032
- reason
1033
- });
1034
- },
1035
- async executeWebhook (webhookId, token, options) {
1036
- return await rest.post(rest.routes.webhooks.webhook(webhookId, token, options), {
1037
- body: options,
1038
- unauthorized: true
1039
- });
1040
- },
1041
- async followAnnouncement (sourceChannelId, targetChannelId, reason) {
1042
- return await rest.post(rest.routes.channels.follow(sourceChannelId), {
1043
- body: {
1044
- webhookChannelId: targetChannelId
1045
- },
1046
- reason
1047
- });
1048
- },
1049
- async getActiveThreads (guildId) {
1050
- return await rest.get(rest.routes.channels.threads.active(guildId));
1051
- },
1052
- async getApplicationCommandPermission (guildId, commandId, options) {
1053
- const restOptions = {};
1054
- if (options?.accessToken) {
1055
- restOptions.unauthorized = true;
1056
- restOptions.headers = {
1057
- authorization: `Bearer ${options.accessToken}`
1058
- };
1059
- }
1060
- return await rest.get(rest.routes.interactions.commands.permission(options?.applicationId ?? rest.applicationId, guildId, commandId), restOptions);
1061
- },
1062
- async getApplicationCommandPermissions (guildId, options) {
1063
- const restOptions = {};
1064
- if (options?.accessToken) {
1065
- restOptions.unauthorized = true;
1066
- restOptions.headers = {
1067
- authorization: `Bearer ${options.accessToken}`
1068
- };
1069
- }
1070
- return await rest.get(rest.routes.interactions.commands.permissions(options?.applicationId ?? rest.applicationId, guildId), restOptions);
1071
- },
1072
- async getApplicationInfo () {
1073
- return await rest.get(rest.routes.oauth2.application());
1074
- },
1075
- async editApplicationInfo (body) {
1076
- return await rest.patch(rest.routes.application(), {
1077
- body
1078
- });
1079
- },
1080
- async getCurrentAuthenticationInfo (token) {
1081
- return await rest.get(rest.routes.oauth2.currentAuthorization(), {
1082
- headers: {
1083
- authorization: `Bearer ${token}`
1084
- },
1085
- unauthorized: true
1086
- });
1087
- },
1088
- async exchangeToken (clientId, clientSecret, body) {
1089
- const basicCredentials = Buffer.from(`${clientId}:${clientSecret}`);
1090
- const restOptions = {
1091
- body,
1092
- headers: {
1093
- 'content-type': 'application/x-www-form-urlencoded',
1094
- authorization: `Basic ${basicCredentials.toString('base64')}`
1095
- },
1096
- runThroughQueue: false,
1097
- unauthorized: true
1098
- };
1099
- if (body.grantType === 'client_credentials') {
1100
- restOptions.body.scope = body.scope.join(' ');
1101
- }
1102
- return await rest.post(rest.routes.oauth2.tokenExchange(), restOptions);
1103
- },
1104
- async revokeToken (clientId, clientSecret, body) {
1105
- const basicCredentials = Buffer.from(`${clientId}:${clientSecret}`);
1106
- await rest.post(rest.routes.oauth2.tokenRevoke(), {
1107
- body,
1108
- headers: {
1109
- 'content-type': 'application/x-www-form-urlencoded',
1110
- authorization: `Basic ${basicCredentials.toString('base64')}`
1111
- },
1112
- unauthorized: true
1113
- });
1114
- },
1115
- async getAuditLog (guildId, options) {
1116
- return await rest.get(rest.routes.guilds.auditlogs(guildId, options));
1117
- },
1118
- async getAutomodRule (guildId, ruleId) {
1119
- return await rest.get(rest.routes.guilds.automod.rule(guildId, ruleId));
1120
- },
1121
- async getAutomodRules (guildId) {
1122
- return await rest.get(rest.routes.guilds.automod.rules(guildId));
1123
- },
1124
- async getAvailableVoiceRegions () {
1125
- return await rest.get(rest.routes.regions());
1126
- },
1127
- async getBan (guildId, userId) {
1128
- return await rest.get(rest.routes.guilds.members.ban(guildId, userId));
1129
- },
1130
- async getBans (guildId, options) {
1131
- return await rest.get(rest.routes.guilds.members.bans(guildId, options));
1132
- },
1133
- async getChannel (id) {
1134
- return await rest.get(rest.routes.channels.channel(id));
1135
- },
1136
- async getChannelInvites (channelId) {
1137
- return await rest.get(rest.routes.channels.invites(channelId));
1138
- },
1139
- async getChannels (guildId) {
1140
- return await rest.get(rest.routes.guilds.channels(guildId));
1141
- },
1142
- async getChannelWebhooks (channelId) {
1143
- return await rest.get(rest.routes.channels.webhooks(channelId));
1144
- },
1145
- async getDmChannel (userId) {
1146
- return await rest.post(rest.routes.channels.dm(), {
1147
- body: {
1148
- recipientId: userId
1149
- }
1150
- });
1151
- },
1152
- async getGroupDmChannel (body) {
1153
- return await rest.post(rest.routes.channels.dm(), {
1154
- body
1155
- });
1156
- },
1157
- async getEmoji (guildId, emojiId) {
1158
- return await rest.get(rest.routes.guilds.emoji(guildId, emojiId));
1159
- },
1160
- async getApplicationEmoji (emojiId) {
1161
- return await rest.get(rest.routes.applicationEmoji(rest.applicationId, emojiId));
1162
- },
1163
- async getEmojis (guildId) {
1164
- return await rest.get(rest.routes.guilds.emojis(guildId));
1165
- },
1166
- async getApplicationEmojis () {
1167
- return await rest.get(rest.routes.applicationEmojis(rest.applicationId));
1168
- },
1169
- async getFollowupMessage (token, messageId) {
1170
- return await rest.get(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
1171
- unauthorized: true
1172
- });
1173
- },
1174
- async getGatewayBot () {
1175
- return await rest.get(rest.routes.gatewayBot());
1176
- },
1177
- async getGlobalApplicationCommand (commandId) {
1178
- return await rest.get(rest.routes.interactions.commands.command(rest.applicationId, commandId));
1179
- },
1180
- async getGlobalApplicationCommands (options) {
1181
- return await rest.get(rest.routes.interactions.commands.commands(rest.applicationId, options?.withLocalizations));
1182
- },
1183
- async getGuild (guildId, options = {
1184
- counts: true
1185
- }) {
1186
- return await rest.get(rest.routes.guilds.guild(guildId, options.counts));
1187
- },
1188
- async getGuilds (token, options) {
1189
- const makeRequestOptions = token ? {
1190
- headers: {
1191
- authorization: `Bearer ${token}`
1192
- },
1193
- unauthorized: true
1194
- } : undefined;
1195
- return await rest.get(rest.routes.guilds.userGuilds(options), makeRequestOptions);
1196
- },
1197
- async getGuildApplicationCommand (commandId, guildId) {
1198
- return await rest.get(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
1199
- },
1200
- async getGuildApplicationCommands (guildId, options) {
1201
- return await rest.get(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId, options?.withLocalizations));
1202
- },
1203
- async getGuildPreview (guildId) {
1204
- return await rest.get(rest.routes.guilds.preview(guildId));
1205
- },
1206
- async getGuildTemplate (templateCode) {
1207
- return await rest.get(rest.routes.guilds.templates.code(templateCode));
1208
- },
1209
- async getGuildTemplates (guildId) {
1210
- return await rest.get(rest.routes.guilds.templates.all(guildId));
1211
- },
1212
- async getGuildWebhooks (guildId) {
1213
- return await rest.get(rest.routes.guilds.webhooks(guildId));
1214
- },
1215
- async getIntegrations (guildId) {
1216
- return await rest.get(rest.routes.guilds.integrations(guildId));
1217
- },
1218
- async getInvite (inviteCode, options) {
1219
- return await rest.get(rest.routes.guilds.invite(inviteCode, options));
1220
- },
1221
- async getInvites (guildId) {
1222
- return await rest.get(rest.routes.guilds.invites(guildId));
1223
- },
1224
- async getMessage (channelId, messageId) {
1225
- return await rest.get(rest.routes.channels.message(channelId, messageId));
1226
- },
1227
- async getMessages (channelId, options) {
1228
- return await rest.get(rest.routes.channels.messages(channelId, options));
1229
- },
1230
- async searchGuildMessages (guildId, options) {
1231
- return await rest.get(rest.routes.guilds.messagesSearch(guildId, options));
1232
- },
1233
- async getStickerPack (stickerPackId) {
1234
- return await rest.get(rest.routes.stickerPack(stickerPackId));
1235
- },
1236
- async getStickerPacks () {
1237
- return await rest.get(rest.routes.stickerPacks());
1238
- },
1239
- async getOriginalInteractionResponse (token) {
1240
- return await rest.get(rest.routes.interactions.responses.original(rest.applicationId, token), {
1241
- unauthorized: true
1242
- });
1243
- },
1244
- async getChannelPins (channelId, options) {
1245
- return await rest.get(rest.routes.channels.messagePins(channelId, options));
1246
- },
1247
- async getPinnedMessages (channelId) {
1248
- return await rest.get(rest.routes.channels.pins(channelId));
1249
- },
1250
- async getPrivateArchivedThreads (channelId, options) {
1251
- return await rest.get(rest.routes.channels.threads.private(channelId, options));
1252
- },
1253
- async getPrivateJoinedArchivedThreads (channelId, options) {
1254
- return await rest.get(rest.routes.channels.threads.joined(channelId, options));
1255
- },
1256
- async getPruneCount (guildId, options) {
1257
- return await rest.get(rest.routes.guilds.prune(guildId, options));
1258
- },
1259
- async getPublicArchivedThreads (channelId, options) {
1260
- return await rest.get(rest.routes.channels.threads.public(channelId, options));
1261
- },
1262
- async getRoles (guildId) {
1263
- return await rest.get(rest.routes.guilds.roles.all(guildId));
1264
- },
1265
- async getRole (guildId, roleId) {
1266
- return await rest.get(rest.routes.guilds.roles.one(guildId, roleId));
1267
- },
1268
- async getScheduledEvent (guildId, eventId, options) {
1269
- return await rest.get(rest.routes.guilds.events.event(guildId, eventId, options?.withUserCount));
1270
- },
1271
- async getScheduledEvents (guildId, options) {
1272
- return await rest.get(rest.routes.guilds.events.events(guildId, options?.withUserCount));
1273
- },
1274
- async getScheduledEventUsers (guildId, eventId, options) {
1275
- return await rest.get(rest.routes.guilds.events.users(guildId, eventId, options));
1276
- },
1277
- async getSessionInfo () {
1278
- return await rest.getGatewayBot();
1279
- },
1280
- async getStageInstance (channelId) {
1281
- return await rest.get(rest.routes.channels.stage(channelId));
1282
- },
1283
- async getOwnVoiceState (guildId) {
1284
- return await rest.get(rest.routes.guilds.voice(guildId));
1285
- },
1286
- async getUserVoiceState (guildId, userId) {
1287
- return await rest.get(rest.routes.guilds.voice(guildId, userId));
1288
- },
1289
- async getSticker (stickerId) {
1290
- return await rest.get(rest.routes.sticker(stickerId));
1291
- },
1292
- async getGuildSticker (guildId, stickerId) {
1293
- return await rest.get(rest.routes.guilds.sticker(guildId, stickerId));
1294
- },
1295
- async getGuildStickers (guildId) {
1296
- return await rest.get(rest.routes.guilds.stickers(guildId));
1297
- },
1298
- async getThreadMember (channelId, userId, options) {
1299
- return await rest.get(rest.routes.channels.threads.getUser(channelId, userId, options));
1300
- },
1301
- async getThreadMembers (channelId, options) {
1302
- return await rest.get(rest.routes.channels.threads.members(channelId, options));
1303
- },
1304
- async getReactions (channelId, messageId, reaction, options) {
1305
- return await rest.get(rest.routes.channels.reactions.message(channelId, messageId, reaction, options));
1306
- },
1307
- async getUser (id) {
1308
- return await rest.get(rest.routes.user(id));
1309
- },
1310
- async getCurrentUser (token) {
1311
- return await rest.get(rest.routes.currentUser(), {
1312
- headers: {
1313
- authorization: `Bearer ${token}`
1314
- },
1315
- unauthorized: true
1316
- });
1317
- },
1318
- async getUserConnections (token) {
1319
- return await rest.get(rest.routes.oauth2.connections(), {
1320
- headers: {
1321
- authorization: `Bearer ${token}`
1322
- },
1323
- unauthorized: true
1324
- });
1325
- },
1326
- async getUserApplicationRoleConnection (token, applicationId) {
1327
- return await rest.get(rest.routes.oauth2.roleConnections(applicationId), {
1328
- headers: {
1329
- authorization: `Bearer ${token}`
1330
- },
1331
- unauthorized: true
1332
- });
1333
- },
1334
- async getVanityUrl (guildId) {
1335
- return await rest.get(rest.routes.guilds.vanity(guildId));
1336
- },
1337
- async getVoiceRegions (guildId) {
1338
- return await rest.get(rest.routes.guilds.regions(guildId));
1339
- },
1340
- async getWebhook (webhookId) {
1341
- return await rest.get(rest.routes.webhooks.id(webhookId));
1342
- },
1343
- async getWebhookMessage (webhookId, token, messageId, options) {
1344
- return await rest.get(rest.routes.webhooks.message(webhookId, token, messageId, options), {
1345
- unauthorized: true
1346
- });
1347
- },
1348
- async getWebhookWithToken (webhookId, token) {
1349
- return await rest.get(rest.routes.webhooks.webhook(webhookId, token), {
1350
- unauthorized: true
1351
- });
1352
- },
1353
- async getWelcomeScreen (guildId) {
1354
- return await rest.get(rest.routes.guilds.welcome(guildId));
1355
- },
1356
- async getWidget (guildId) {
1357
- return await rest.get(rest.routes.guilds.widgetJson(guildId));
1358
- },
1359
- async getWidgetSettings (guildId) {
1360
- return await rest.get(rest.routes.guilds.widget(guildId));
1361
- },
1362
- async joinThread (channelId) {
1363
- await rest.put(rest.routes.channels.threads.me(channelId));
1364
- },
1365
- async leaveGuild (guildId) {
1366
- await rest.delete(rest.routes.guilds.leave(guildId));
1367
- },
1368
- async leaveThread (channelId) {
1369
- await rest.delete(rest.routes.channels.threads.me(channelId));
1370
- },
1371
- async publishMessage (channelId, messageId) {
1372
- return await rest.post(rest.routes.channels.crosspost(channelId, messageId));
1373
- },
1374
- async removeRole (guildId, userId, roleId, reason) {
1375
- await rest.delete(rest.routes.guilds.roles.member(guildId, userId, roleId), {
1376
- reason
1377
- });
1378
- },
1379
- async removeThreadMember (channelId, userId) {
1380
- await rest.delete(rest.routes.channels.threads.user(channelId, userId));
1381
- },
1382
- async removeDmRecipient (channelId, userId) {
1383
- await rest.delete(rest.routes.channels.dmRecipient(channelId, userId));
1384
- },
1385
- async sendFollowupMessage (token, options) {
1386
- return await rest.post(rest.routes.webhooks.webhook(rest.applicationId, token), {
1387
- body: options,
1388
- files: options.files,
1389
- unauthorized: true
1390
- });
1391
- },
1392
- async sendInteractionResponse (interactionId, token, options, params) {
1393
- return await rest.post(rest.routes.interactions.responses.callback(interactionId, token, params), {
1394
- body: options,
1395
- files: options.data?.files,
1396
- runThroughQueue: false,
1397
- unauthorized: true
1398
- });
1399
- },
1400
- async sendMessage (channelId, body) {
1401
- return await rest.post(rest.routes.channels.messages(channelId), {
1402
- body,
1403
- files: body.files
1404
- });
1405
- },
1406
- async startThreadWithMessage (channelId, messageId, body, reason) {
1407
- return await rest.post(rest.routes.channels.threads.message(channelId, messageId), {
1408
- body,
1409
- reason
1410
- });
1411
- },
1412
- async startThreadWithoutMessage (channelId, body, reason) {
1413
- return await rest.post(rest.routes.channels.threads.all(channelId), {
1414
- body,
1415
- reason
1416
- });
1417
- },
1418
- async getPollAnswerVoters (channelId, messageId, answerId, options) {
1419
- return await rest.get(rest.routes.channels.polls.votes(channelId, messageId, answerId, options));
1420
- },
1421
- async endPoll (channelId, messageId) {
1422
- return await rest.post(rest.routes.channels.polls.expire(channelId, messageId));
1423
- },
1424
- async syncGuildTemplate (guildId) {
1425
- return await rest.put(rest.routes.guilds.templates.all(guildId));
1426
- },
1427
- async banMember (guildId, userId, body, reason) {
1428
- await rest.put(rest.routes.guilds.members.ban(guildId, userId), {
1429
- body,
1430
- reason
1431
- });
1432
- },
1433
- async bulkBanMembers (guildId, options, reason) {
1434
- return await rest.post(rest.routes.guilds.members.bulkBan(guildId), {
1435
- body: options,
1436
- reason
1437
- });
1438
- },
1439
- async editCurrentMember (guildId, body, reason) {
1440
- return await rest.patch(rest.routes.guilds.members.bot(guildId), {
1441
- body,
1442
- reason
1443
- });
1444
- },
1445
- async editMember (guildId, userId, body, reason) {
1446
- return await rest.patch(rest.routes.guilds.members.member(guildId, userId), {
1447
- body,
1448
- reason
1449
- });
1450
- },
1451
- async getCurrentMember (guildId, token) {
1452
- return await rest.get(rest.routes.guilds.members.currentMember(guildId), {
1453
- headers: {
1454
- authorization: `Bearer ${token}`
1455
- },
1456
- unauthorized: true
1457
- });
1458
- },
1459
- async getMember (guildId, userId) {
1460
- return await rest.get(rest.routes.guilds.members.member(guildId, userId));
1461
- },
1462
- async getMembers (guildId, options) {
1463
- return await rest.get(rest.routes.guilds.members.members(guildId, options));
1464
- },
1465
- async getApplicationActivityInstance (applicationId, instanceId) {
1466
- return await rest.get(rest.routes.applicationActivityInstance(applicationId, instanceId));
1467
- },
1468
- async kickMember (guildId, userId, reason) {
1469
- await rest.delete(rest.routes.guilds.members.member(guildId, userId), {
1470
- reason
1471
- });
1472
- },
1473
- async pinMessage (channelId, messageId, reason) {
1474
- await rest.put(rest.routes.channels.messagePin(channelId, messageId), {
1475
- reason
1476
- });
1477
- },
1478
- async pruneMembers (guildId, body, reason) {
1479
- return await rest.post(rest.routes.guilds.members.prune(guildId), {
1480
- body,
1481
- reason
1482
- });
1483
- },
1484
- async searchMembers (guildId, query, options) {
1485
- return await rest.get(rest.routes.guilds.members.search(guildId, query, options));
1486
- },
1487
- async getGuildOnboarding (guildId) {
1488
- return await rest.get(rest.routes.guilds.onboarding(guildId));
1489
- },
1490
- async editGuildOnboarding (guildId, options, reason) {
1491
- return await rest.put(rest.routes.guilds.onboarding(guildId), {
1492
- body: options,
1493
- reason
1494
- });
1495
- },
1496
- async modifyGuildIncidentActions (guildId, options) {
1497
- return await rest.put(rest.routes.guilds.incidentActions(guildId), {
1498
- body: options
1499
- });
1500
- },
1501
- async unbanMember (guildId, userId, reason) {
1502
- await rest.delete(rest.routes.guilds.members.ban(guildId, userId), {
1503
- reason
1504
- });
1505
- },
1506
- async unpinMessage (channelId, messageId, reason) {
1507
- await rest.delete(rest.routes.channels.messagePin(channelId, messageId), {
1508
- reason
1509
- });
1510
- },
1511
- async triggerTypingIndicator (channelId) {
1512
- await rest.post(rest.routes.channels.typing(channelId));
1513
- },
1514
- async upsertGlobalApplicationCommands (body, options) {
1515
- const restOptions = {
1516
- body
1517
- };
1518
- if (options?.bearerToken) {
1519
- restOptions.unauthorized = true;
1520
- restOptions.headers = {
1521
- authorization: `Bearer ${options.bearerToken}`
1522
- };
1523
- }
1524
- return await rest.put(rest.routes.interactions.commands.commands(rest.applicationId), restOptions);
1525
- },
1526
- async upsertGuildApplicationCommands (guildId, body, options) {
1527
- const restOptions = {
1528
- body
1529
- };
1530
- if (options?.bearerToken) {
1531
- restOptions.unauthorized = true;
1532
- restOptions.headers = {
1533
- authorization: `Bearer ${options.bearerToken}`
1534
- };
1535
- }
1536
- return await rest.put(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), restOptions);
1537
- },
1538
- async editUserApplicationRoleConnection (token, applicationId, body) {
1539
- return await rest.put(rest.routes.oauth2.roleConnections(applicationId), {
1540
- body,
1541
- headers: {
1542
- authorization: `Bearer ${token}`
1543
- },
1544
- unauthorized: true
1545
- });
1546
- },
1547
- async deleteCurrentUserApplicationRoleConnection (bearerToken, applicationId) {
1548
- return await rest.delete(rest.routes.oauth2.roleConnections(applicationId), {
1549
- headers: {
1550
- authorization: `Bearer ${bearerToken}`
1551
- },
1552
- unauthorized: true
1553
- });
1554
- },
1555
- async addGuildMember (guildId, userId, body) {
1556
- return await rest.put(rest.routes.guilds.members.member(guildId, userId), {
1557
- body
1558
- });
1559
- },
1560
- async createTestEntitlement (applicationId, body) {
1561
- return await rest.post(rest.routes.monetization.entitlements(applicationId), {
1562
- body
1563
- });
1564
- },
1565
- async listEntitlements (applicationId, options) {
1566
- return await rest.get(rest.routes.monetization.entitlements(applicationId, options));
1567
- },
1568
- async getEntitlement (applicationId, entitlementId) {
1569
- return await rest.get(rest.routes.monetization.entitlement(applicationId, entitlementId));
1570
- },
1571
- async deleteTestEntitlement (applicationId, entitlementId) {
1572
- await rest.delete(rest.routes.monetization.entitlement(applicationId, entitlementId));
1573
- },
1574
- async consumeEntitlement (applicationId, entitlementId) {
1575
- await rest.post(rest.routes.monetization.consumeEntitlement(applicationId, entitlementId));
1576
- },
1577
- async listSkus (applicationId) {
1578
- return await rest.get(rest.routes.monetization.skus(applicationId));
1579
- },
1580
- async listSubscriptions (skuId, options) {
1581
- return await rest.get(rest.routes.monetization.subscriptions(skuId, options));
1582
- },
1583
- async getSubscription (skuId, subscriptionId) {
1584
- return await rest.get(rest.routes.monetization.subscription(skuId, subscriptionId));
1585
- },
1586
- async sendSoundboardSound (channelId, options) {
1587
- await rest.post(rest.routes.soundboard.sendSound(channelId), {
1588
- body: options
1589
- });
1590
- },
1591
- async listDefaultSoundboardSounds () {
1592
- return await rest.get(rest.routes.soundboard.listDefault());
1593
- },
1594
- async listGuildSoundboardSounds (guildId) {
1595
- return await rest.get(rest.routes.soundboard.guildSounds(guildId));
1596
- },
1597
- async getGuildSoundboardSound (guildId, soundId) {
1598
- return await rest.get(rest.routes.soundboard.guildSound(guildId, soundId));
1599
- },
1600
- async createGuildSoundboardSound (guildId, options, reason) {
1601
- return await rest.post(rest.routes.soundboard.guildSounds(guildId), {
1602
- body: options,
1603
- reason
1604
- });
1605
- },
1606
- async modifyGuildSoundboardSound (guildId, soundId, options, reason) {
1607
- return await rest.post(rest.routes.soundboard.guildSound(guildId, soundId), {
1608
- body: options,
1609
- reason
1610
- });
1611
- },
1612
- async deleteGuildSoundboardSound (guildId, soundId, reason) {
1613
- return await rest.delete(rest.routes.soundboard.guildSound(guildId, soundId), {
1614
- reason
1615
- });
1616
- },
1617
- async listApplicationRoleConnectionsMetadataRecords (applicationId) {
1618
- return await rest.get(rest.routes.applicationRoleConnectionMetadata(applicationId));
1619
- },
1620
- async updateApplicationRoleConnectionsMetadataRecords (applicationId, options) {
1621
- return await rest.put(rest.routes.applicationRoleConnectionMetadata(applicationId), {
1622
- body: options
1623
- });
1624
- },
1625
- async createLobby (options) {
1626
- return await rest.post(rest.routes.lobby.create(), {
1627
- body: options
1628
- });
1629
- },
1630
- async getLobby (lobbyId) {
1631
- return await rest.get(rest.routes.lobby.lobby(lobbyId));
1632
- },
1633
- async modifyLobby (lobbyId, options) {
1634
- return await rest.patch(rest.routes.lobby.lobby(lobbyId), {
1635
- body: options
1636
- });
1637
- },
1638
- async deleteLobby (lobbyId) {
1639
- return await rest.delete(rest.routes.lobby.lobby(lobbyId));
1640
- },
1641
- async addMemberToLobby (lobbyId, userId, options) {
1642
- return await rest.put(rest.routes.lobby.member(lobbyId, userId), {
1643
- body: options
1644
- });
1645
- },
1646
- async bulkUpdateLobbyMembers (lobbyId, options) {
1647
- return await rest.post(rest.routes.lobby.membersBulk(lobbyId), {
1648
- body: options
1649
- });
1650
- },
1651
- async removeMemberFromLobby (lobbyId, userId) {
1652
- return await rest.delete(rest.routes.lobby.member(lobbyId, userId));
1653
- },
1654
- async leaveLobby (lobbyId, bearerToken) {
1655
- return await rest.delete(rest.routes.lobby.leave(lobbyId), {
1656
- headers: {
1657
- authorization: `Bearer ${bearerToken}`
1658
- },
1659
- unauthorized: true
1660
- });
1661
- },
1662
- async linkChannelToLobby (lobbyId, bearerToken, options) {
1663
- return await rest.patch(rest.routes.lobby.link(lobbyId), {
1664
- body: options,
1665
- headers: {
1666
- authorization: `Bearer ${bearerToken}`
1667
- },
1668
- unauthorized: true
1669
- });
1670
- },
1671
- async unlinkChannelToLobby (lobbyId, bearerToken) {
1672
- return await rest.patch(rest.routes.lobby.link(lobbyId), {
1673
- headers: {
1674
- authorization: `Bearer ${bearerToken}`
1675
- },
1676
- unauthorized: true
1677
- });
1678
- },
1679
- async updateLobbyMessageModerationMetadata (lobbyId, messageId, options) {
1680
- await rest.put(rest.routes.lobby.moderationMetadata(lobbyId, messageId), {
1681
- body: options
1682
- });
1683
- },
1684
- createOrJoinLobby (options) {
1685
- return rest.put(rest.routes.lobby.create(), {
1686
- body: options
1687
- });
1688
- },
1689
- sendLobbyMessage (bearerToken, lobbyId, options) {
1690
- return rest.post(rest.routes.lobby.messages(lobbyId), {
1691
- body: options,
1692
- headers: {
1693
- authorization: `Bearer ${bearerToken}`
1694
- },
1695
- unauthorized: true
1696
- });
1697
- },
1698
- getLobbyMessages (bearerToken, lobbyId, options) {
1699
- return rest.get(rest.routes.lobby.messages(lobbyId, options), {
1700
- headers: {
1701
- authorization: `Bearer ${bearerToken}`
1702
- },
1703
- unauthorized: true
1704
- });
1705
- },
1706
- createLobbyChannelInviteForSelf (bearerToken, lobbyId) {
1707
- return rest.post(rest.routes.lobby.inviteSelf(lobbyId), {
1708
- headers: {
1709
- authorization: `Bearer ${bearerToken}`
1710
- },
1711
- unauthorized: true
1712
- });
1713
- },
1714
- createLobbyChannelInviteForUser (lobbyId, userId) {
1715
- return rest.post(rest.routes.lobby.inviteUser(lobbyId, userId));
1716
- },
1717
- preferSnakeCase (enabled) {
1718
- const camelizer = enabled ? (x)=>x : camelize;
1719
- rest.get = async (url, options)=>{
1720
- return camelizer(await rest.makeRequest('GET', url, options));
1721
- };
1722
- rest.post = async (url, options)=>{
1723
- return camelizer(await rest.makeRequest('POST', url, options));
1724
- };
1725
- rest.delete = async (url, options)=>{
1726
- camelizer(await rest.makeRequest('DELETE', url, options));
1727
- };
1728
- rest.patch = async (url, options)=>{
1729
- return camelizer(await rest.makeRequest('PATCH', url, options));
1730
- };
1731
- rest.put = async (url, options)=>{
1732
- return camelizer(await rest.makeRequest('PUT', url, options));
1733
- };
1734
- return rest;
1735
- }
697
+ return await rest.makeRequest('PUT', url, options);
698
+ },
699
+ // We need to wrap all the functions to pass the rest manager as the first argument, so we can use it in the endpoints
700
+ snake: Object.fromEntries(Object.entries(restEndpoints).map(([key, endpointFunc])=>{
701
+ const func = endpointFunc;
702
+ return [
703
+ key,
704
+ async (...args)=>await func(rest, ...args)
705
+ ];
706
+ })),
707
+ // The camelCase versions call rest.snake at call time, so overriding rest.snake.x also changes rest.x
708
+ ...Object.fromEntries(Object.keys(restEndpoints).map((key)=>[
709
+ key,
710
+ async (...args)=>camelize(await rest.snake[key](...args))
711
+ ]))
1736
712
  };
1737
713
  return rest;
1738
714
  }
@@ -1747,4 +723,4 @@ var HttpResponseCode = /*#__PURE__*/ function(HttpResponseCode) {
1747
723
  return error instanceof DOMException && error.name === 'TimeoutError';
1748
724
  }
1749
725
 
1750
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ25vZGU6YnVmZmVyJztcbmltcG9ydCB7IHR5cGUgSW5zcGVjdE9wdGlvbnMsIGluc3BlY3QgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHR5cGUge1xuICBCaWdTdHJpbmcsXG4gIENhbWVsaXplLFxuICBEaXNjb3JkQWNjZXNzVG9rZW5SZXNwb25zZSxcbiAgRGlzY29yZEFjdGl2aXR5SW5zdGFuY2UsXG4gIERpc2NvcmRBcHBsaWNhdGlvbixcbiAgRGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZCxcbiAgRGlzY29yZEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24sXG4gIERpc2NvcmRBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uTWV0YWRhdGEsXG4gIERpc2NvcmRBdWRpdExvZyxcbiAgRGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZSxcbiAgRGlzY29yZEJhbixcbiAgRGlzY29yZEJ1bGtCYW4sXG4gIERpc2NvcmRDaGFubmVsLFxuICBEaXNjb3JkQ29ubmVjdGlvbixcbiAgRGlzY29yZEN1cnJlbnRBdXRob3JpemF0aW9uLFxuICBEaXNjb3JkRW1vamksXG4gIERpc2NvcmRFbnRpdGxlbWVudCxcbiAgRGlzY29yZEZvbGxvd2VkQ2hhbm5lbCxcbiAgRGlzY29yZEdldEFuc3dlclZvdGVzUmVzcG9uc2UsXG4gIERpc2NvcmRHZXRHYXRld2F5Qm90LFxuICBEaXNjb3JkR3VpbGQsXG4gIERpc2NvcmRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zLFxuICBEaXNjb3JkR3VpbGRPbmJvYXJkaW5nLFxuICBEaXNjb3JkR3VpbGRQcmV2aWV3LFxuICBEaXNjb3JkR3VpbGRXaWRnZXQsXG4gIERpc2NvcmRHdWlsZFdpZGdldFNldHRpbmdzLFxuICBEaXNjb3JkSW5jaWRlbnRzRGF0YSxcbiAgRGlzY29yZEludGVncmF0aW9uLFxuICBEaXNjb3JkSW50ZXJhY3Rpb25DYWxsYmFja1Jlc3BvbnNlLFxuICBEaXNjb3JkSW52aXRlLFxuICBEaXNjb3JkSW52aXRlTWV0YWRhdGEsXG4gIERpc2NvcmRMaXN0QWN0aXZlVGhyZWFkcyxcbiAgRGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHMsXG4gIERpc2NvcmRMb2JieSxcbiAgRGlzY29yZExvYmJ5SW52aXRlLFxuICBEaXNjb3JkTG9iYnlNZW1iZXIsXG4gIERpc2NvcmRMb2JieU1lc3NhZ2UsXG4gIERpc2NvcmRNZW1iZXIsXG4gIERpc2NvcmRNZW1iZXJXaXRoVXNlcixcbiAgRGlzY29yZE1lc3NhZ2UsXG4gIERpc2NvcmRQcnVuZWRDb3VudCxcbiAgRGlzY29yZFJvbGUsXG4gIERpc2NvcmRTY2hlZHVsZWRFdmVudCxcbiAgRGlzY29yZFNlYXJjaEd1aWxkTWVzc2FnZXMsXG4gIERpc2NvcmRTZWFyY2hHdWlsZE1lc3NhZ2VzSW5kZXhpbmcsXG4gIERpc2NvcmRTa3UsXG4gIERpc2NvcmRTb3VuZGJvYXJkU291bmQsXG4gIERpc2NvcmRTdGFnZUluc3RhbmNlLFxuICBEaXNjb3JkU3RpY2tlcixcbiAgRGlzY29yZFN0aWNrZXJQYWNrLFxuICBEaXNjb3JkU3Vic2NyaXB0aW9uLFxuICBEaXNjb3JkVGFyZ2V0VXNlcnNKb2JTdGF0dXMsXG4gIERpc2NvcmRUZW1wbGF0ZSxcbiAgRGlzY29yZFRocmVhZE1lbWJlcixcbiAgRGlzY29yZFVzZXIsXG4gIERpc2NvcmRWYW5pdHlVcmwsXG4gIERpc2NvcmRWb2ljZVJlZ2lvbixcbiAgRGlzY29yZFZvaWNlU3RhdGUsXG4gIERpc2NvcmRXZWJob29rLFxuICBEaXNjb3JkV2VsY29tZVNjcmVlbixcbiAgTW9kaWZ5R3VpbGRUZW1wbGF0ZSxcbn0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnO1xuaW1wb3J0IHtcbiAgY2FtZWxpemUsXG4gIGNhbWVsVG9TbmFrZUNhc2UsXG4gIERJU0NPUkRFTk9fVkVSU0lPTixcbiAgZGVsYXksXG4gIGdldEJvdElkRnJvbVRva2VuLFxuICBoYXNQcm9wZXJ0eSxcbiAgbG9nZ2VyLFxuICBwcm9jZXNzUmVhY3Rpb25TdHJpbmcsXG4gIHNub3dmbGFrZVRvVGltZXN0YW1wLFxuICB1cmxUb0Jhc2U2NCxcbn0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnO1xuaW1wb3J0IHsgY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQgfSBmcm9tICcuL2ludmFsaWRCdWNrZXQuanMnO1xuaW1wb3J0IHsgUXVldWUgfSBmcm9tICcuL3F1ZXVlLmpzJztcbmltcG9ydCB7IGNyZWF0ZVJvdXRlcyB9IGZyb20gJy4vcm91dGVzLmpzJztcbmltcG9ydCB0eXBlIHsgQ3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCBDcmVhdGVSZXN0TWFuYWdlck9wdGlvbnMsIE1ha2VSZXF1ZXN0T3B0aW9ucywgUmVzdE1hbmFnZXIsIFNlbmRSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgY29uc3QgRElTQ09SRF9BUElfVkVSU0lPTiA9IDEwO1xuZXhwb3J0IGNvbnN0IERJU0NPUkRfQVBJX1VSTCA9ICdodHRwczovL2Rpc2NvcmQuY29tL2FwaSc7XG5cbmV4cG9ydCBjb25zdCBBVURJVF9MT0dfUkVBU09OX0hFQURFUiA9ICd4LWF1ZGl0LWxvZy1yZWFzb24nO1xuZXhwb3J0IGNvbnN0IFJBVEVfTElNSVRfUkVNQUlOSU5HX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1yZW1haW5pbmcnO1xuZXhwb3J0IGNvbnN0IFJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSID0gJ3gtcmF0ZWxpbWl0LXJlc2V0LWFmdGVyJztcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX0dMT0JBTF9IRUFERVIgPSAneC1yYXRlbGltaXQtZ2xvYmFsJztcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX0JVQ0tFVF9IRUFERVIgPSAneC1yYXRlbGltaXQtYnVja2V0JztcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX0xJTUlUX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1saW1pdCc7XG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9TQ09QRV9IRUFERVIgPSAneC1yYXRlbGltaXQtc2NvcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVzdE1hbmFnZXIob3B0aW9uczogQ3JlYXRlUmVzdE1hbmFnZXJPcHRpb25zKTogUmVzdE1hbmFnZXIge1xuICBjb25zdCBhcHBsaWNhdGlvbklkID0gb3B0aW9ucy5hcHBsaWNhdGlvbklkID8gQmlnSW50KG9wdGlvbnMuYXBwbGljYXRpb25JZCkgOiBnZXRCb3RJZEZyb21Ub2tlbihvcHRpb25zLnRva2VuKTtcblxuICBjb25zdCBiYXNlVXJsID0gKG9wdGlvbnMucHJveHk/LmJhc2VVcmwgPz8gRElTQ09SRF9BUElfVVJMKS5yZXBsYWNlKC9cXC8kLywgJycpO1xuICAvLyBEaXNjb3JkIGVycm9yIGNhbiBnZXQgbmVzdGVkIGEgbG90LCBzbyB3ZSB1c2UgYSBjdXN0b20gaW5zcGVjdCB0byBjaGFuZ2UgdGhlIGRlcHRoIHRvIEluZmluaXR5XG4gIGNvbnN0IGJhc2VFcnJvclByb3RvdHlwZSA9IHtcbiAgICBbaW5zcGVjdC5jdXN0b21dKF9kZXB0aDogbnVtYmVyLCBvcHRpb25zOiBJbnNwZWN0T3B0aW9ucywgX2luc3BlY3Q6IHR5cGVvZiBpbnNwZWN0KSB7XG4gICAgICByZXR1cm4gX2luc3BlY3QodGhpcywge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBkZXB0aDogSW5maW5pdHksXG4gICAgICAgIC8vIFNpbmNlIHdlIGNhbGwgaW5zcGVjdCBvbiBvdXJzZWxmLCB3ZSBuZWVkIHRvIGRpc2FibGUgdGhlIGNhbGxzIHRvIHRoZSBpbnNwZWN0LmN1c3RvbSBzeW1ib2wgb3IgZWxzZSBpdCB3aWxsIGNhdXNlIGFuIGluZmluaXRlIGxvb3AuXG4gICAgICAgIGN1c3RvbUluc3BlY3Q6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdCByZXN0OiBSZXN0TWFuYWdlciA9IHtcbiAgICBhcHBsaWNhdGlvbklkLFxuICAgIGF1dGhvcml6YXRpb246IG9wdGlvbnMucHJveHk/LmF1dGhvcml6YXRpb24sXG4gICAgYXV0aG9yaXphdGlvbkhlYWRlcjogb3B0aW9ucy5wcm94eT8uYXV0aG9yaXphdGlvbkhlYWRlciA/PyAnYXV0aG9yaXphdGlvbicsXG4gICAgYmFzZVVybCxcbiAgICBkZWxldGVRdWV1ZURlbGF5OiA2MDAwMCxcbiAgICBnbG9iYWxseVJhdGVMaW1pdGVkOiBmYWxzZSxcbiAgICBpbnZhbGlkQnVja2V0OiBjcmVhdGVJbnZhbGlkUmVxdWVzdEJ1Y2tldCh7IGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgfSksXG4gICAgaXNQcm94aWVkOiAhYmFzZVVybC5zdGFydHNXaXRoKERJU0NPUkRfQVBJX1VSTCksXG4gICAgdXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludDogb3B0aW9ucy5wcm94eT8udXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCxcbiAgICBtYXhSZXRyeUNvdW50OiBJbmZpbml0eSxcbiAgICByZXF1ZXN0VGltZW91dDogb3B0aW9ucy5yZXF1ZXN0VGltZW91dCA/PyAzMDAwMCxcbiAgICBwcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRoczogZmFsc2UsXG4gICAgcXVldWVzOiBuZXcgTWFwKCksXG4gICAgcmF0ZUxpbWl0ZWRQYXRoczogbmV3IE1hcCgpLFxuICAgIHRva2VuOiBvcHRpb25zLnRva2VuLFxuICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiA/PyBESVNDT1JEX0FQSV9WRVJTSU9OLFxuICAgIGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyLFxuICAgIGV2ZW50czoge1xuICAgICAgcmVxdWVzdDogKCkgPT4ge30sXG4gICAgICByZXNwb25zZTogKCkgPT4ge30sXG4gICAgICByZXF1ZXN0RXJyb3I6ICgpID0+IHt9LFxuICAgICAgLi4ub3B0aW9ucy5ldmVudHMsXG4gICAgfSxcblxuICAgIHJvdXRlczogY3JlYXRlUm91dGVzKCksXG5cbiAgICBjcmVhdGVCYXNlSGVhZGVycygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICd1c2VyLWFnZW50JzogYERpc2NvcmRCb3QgKGh0dHBzOi8vZ2l0aHViLmNvbS9kaXNjb3JkZW5vL2Rpc2NvcmRlbm8sIHYke0RJU0NPUkRFTk9fVkVSU0lPTn0pYCxcbiAgICAgIH07XG4gICAgfSxcblxuICAgIGNoZWNrUmF0ZUxpbWl0cyh1cmwsIGlkZW50aWZpZXIpIHtcbiAgICAgIGNvbnN0IHJhdGVsaW1pdGVkID0gcmVzdC5yYXRlTGltaXRlZFBhdGhzLmdldChgJHtpZGVudGlmaWVyfSR7dXJsfWApO1xuXG4gICAgICBjb25zdCBnbG9iYWwgPSByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZ2V0KCdnbG9iYWwnKTtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICAgIGlmIChyYXRlbGltaXRlZCAmJiBub3cgPCByYXRlbGltaXRlZC5yZXNldFRpbWVzdGFtcCkge1xuICAgICAgICByZXR1cm4gcmF0ZWxpbWl0ZWQucmVzZXRUaW1lc3RhbXAgLSBub3c7XG4gICAgICB9XG5cbiAgICAgIGlmIChnbG9iYWwgJiYgbm93IDwgZ2xvYmFsLnJlc2V0VGltZXN0YW1wKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWwucmVzZXRUaW1lc3RhbXAgLSBub3c7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBkYXRlVG9rZW5RdWV1ZXMob2xkVG9rZW4sIG5ld1Rva2VuKSB7XG4gICAgICBpZiAocmVzdC5pc1Byb3hpZWQpIHtcbiAgICAgICAgaWYgKCFyZXN0LnVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIlRoZSAncHJveHkudXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCcgb3B0aW9uIG5lZWRzIHRvIGJlIHNldCB3aGVuIHVzaW5nIGEgcmVzdCBwcm94eSBhbmQgbmVlZGVkIHRvIGNhbGwgJ3VwZGF0ZVRva2VuUXVldWVzJ1wiLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH0gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAgICAgICBpZiAocmVzdC5hdXRob3JpemF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBoZWFkZXJzW3Jlc3QuYXV0aG9yaXphdGlvbkhlYWRlcl0gPSByZXN0LmF1dGhvcml6YXRpb247XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBmZXRjaChgJHtyZXN0LmJhc2VVcmx9LyR7cmVzdC51cGRhdGVCZWFyZXJUb2tlbkVuZHBvaW50fWAsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBvbGRUb2tlbixcbiAgICAgICAgICAgIG5ld1Rva2VuLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3SWRlbnRpZmllciA9IGBCZWFyZXIgJHtuZXdUb2tlbn1gO1xuXG4gICAgICAvLyBVcGRhdGUgYWxsIHRoZSBxdWV1ZXNcbiAgICAgIGZvciAoY29uc3QgW2tleSwgcXVldWVdIG9mIHJlc3QucXVldWVzLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKGBCZWFyZXIgJHtvbGRUb2tlbn1gKSkgY29udGludWU7XG5cbiAgICAgICAgcmVzdC5xdWV1ZXMuZGVsZXRlKGtleSk7XG4gICAgICAgIHF1ZXVlLmlkZW50aWZpZXIgPSBuZXdJZGVudGlmaWVyO1xuXG4gICAgICAgIGNvbnN0IG5ld0tleSA9IGAke25ld0lkZW50aWZpZXJ9JHtxdWV1ZS51cmx9YDtcbiAgICAgICAgY29uc3QgbmV3UXVldWUgPSByZXN0LnF1ZXVlcy5nZXQobmV3S2V5KTtcblxuICAgICAgICAvLyBNZXJnZSB0aGUgcXVldWVzXG4gICAgICAgIGlmIChuZXdRdWV1ZSkge1xuICAgICAgICAgIG5ld1F1ZXVlLndhaXRpbmcudW5zaGlmdCguLi5xdWV1ZS53YWl0aW5nKTtcbiAgICAgICAgICBuZXdRdWV1ZS5wZW5kaW5nLnVuc2hpZnQoLi4ucXVldWUucGVuZGluZyk7XG5cbiAgICAgICAgICBxdWV1ZS53YWl0aW5nID0gW107XG4gICAgICAgICAgcXVldWUucGVuZGluZyA9IFtdO1xuXG4gICAgICAgICAgcXVldWUuY2xlYW51cCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3QucXVldWVzLnNldChuZXdLZXksIHF1ZXVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHJhdGVsaW1pdFBhdGhdIG9mIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChgQmVhcmVyICR7b2xkVG9rZW59YCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoYCR7bmV3SWRlbnRpZmllcn0ke3JhdGVsaW1pdFBhdGgudXJsfWAsIHJhdGVsaW1pdFBhdGgpO1xuXG4gICAgICAgIGlmIChyYXRlbGltaXRQYXRoLmJ1Y2tldElkKSB7XG4gICAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChgJHtuZXdJZGVudGlmaWVyfSR7cmF0ZWxpbWl0UGF0aC5idWNrZXRJZH1gLCByYXRlbGltaXRQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjaGFuZ2VUb0Rpc2NvcmRGb3JtYXQob2JqOiBhbnkpOiBhbnkge1xuICAgICAgaWYgKG9iaiA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgcmV0dXJuIG9iai5tYXAoKGl0ZW0pID0+IHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KGl0ZW0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld09iajogYW55ID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG5cbiAgICAgICAgICAvLyBJZiB0aGUga2V5IGlzIGFscmVhZHkgaW4gc25ha2VfY2FzZSB3ZSBjYW4gYXNzdW1lIGl0IGlzIGFscmVhZHkgaW4gdGhlIGRpc2NvcmQgZm9ybWF0LlxuICAgICAgICAgIGlmIChrZXkuaW5jbHVkZXMoJ18nKSkge1xuICAgICAgICAgICAgbmV3T2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgICBjYXNlICduYW1lTG9jYWxpemF0aW9ucyc6XG4gICAgICAgICAgICAgICAgbmV3T2JqLm5hbWVfbG9jYWxpemF0aW9ucyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjYXNlICdkZXNjcmlwdGlvbkxvY2FsaXphdGlvbnMnOlxuICAgICAgICAgICAgICAgIG5ld09iai5kZXNjcmlwdGlvbl9sb2NhbGl6YXRpb25zID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV3T2JqW2NhbWVsVG9TbmFrZUNhc2Uoa2V5KV0gPSByZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3T2JqO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2JpZ2ludCcpIHJldHVybiBvYmoudG9TdHJpbmcoKTtcblxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuXG4gICAgY3JlYXRlUmVxdWVzdEJvZHkobWV0aG9kLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5jcmVhdGVCYXNlSGVhZGVycygpO1xuXG4gICAgICBpZiAob3B0aW9ucz8udW5hdXRob3JpemVkICE9PSB0cnVlKSBoZWFkZXJzLmF1dGhvcml6YXRpb24gPSBgQm90ICR7cmVzdC50b2tlbn1gO1xuXG4gICAgICAvLyBJRiBBIFJFQVNPTiBJUyBQUk9WSURFRCBFTkNPREUgSVQgSU4gSEVBREVSU1xuICAgICAgaWYgKG9wdGlvbnM/LnJlYXNvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhlYWRlcnNbQVVESVRfTE9HX1JFQVNPTl9IRUFERVJdID0gZW5jb2RlVVJJQ29tcG9uZW50KG9wdGlvbnM/LnJlYXNvbik7XG4gICAgICB9XG5cbiAgICAgIGxldCBib2R5OiBzdHJpbmcgfCBGb3JtRGF0YSB8IHVuZGVmaW5lZDtcblxuICAgICAgLy8gSGF2ZSB0byBjaGVjayBmb3IgYXR0YWNobWVudHMgZmlyc3QsIHNpbmNlIGJvZHkgdGhlbiBoYXMgdG8gYmUgc2VuZCBpbiBhIGRpZmZlcmVudCB3YXkuXG4gICAgICBpZiAob3B0aW9ucz8uZmlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5maWxlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGZvcm0uYXBwZW5kKGBmaWxlc1ske2l9XWAsIG9wdGlvbnMuZmlsZXNbaV0uYmxvYiwgb3B0aW9ucy5maWxlc1tpXS5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhdmUgdG8gdXNlIGNoYW5nZVRvRGlzY29yZEZvcm1hdCBvciBlbHNlIEpTT04uc3RyaW5naWZ5IG1heSB0aHJvdyBhbiBlcnJvciBmb3IgdGhlIHByZXNlbmNlIG9mIEJpZ0ludChzKSBpbiB0aGUganNvblxuICAgICAgICBmb3JtLmFwcGVuZCgncGF5bG9hZF9qc29uJywgSlNPTi5zdHJpbmdpZnkocmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQoeyAuLi5vcHRpb25zLmJvZHksIGZpbGVzOiB1bmRlZmluZWQgfSkpKTtcblxuICAgICAgICAvLyBObyBuZWVkIHRvIHNldCB0aGUgYGNvbnRlbnQtdHlwZWAgaGVhZGVyIHNpbmNlIGBmZXRjaGAgZG9lcyB0aGF0IGF1dG9tYXRpY2FsbHkgZm9yIHVzIHdoZW4gd2UgdXNlIGEgYEZvcm1EYXRhYCBvYmplY3QuXG4gICAgICAgIGJvZHkgPSBmb3JtO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zPy5ib2R5ICYmIG9wdGlvbnMuaGVhZGVycyAmJiBvcHRpb25zLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID09PSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykge1xuICAgICAgICAvLyBPQXV0aDIgYm9keSBoYW5kbGluZ1xuICAgICAgICBjb25zdCBmb3JtQm9keTogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBjb25zdCBkaXNjb3JkQm9keSA9IHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KG9wdGlvbnMuYm9keSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIGRpc2NvcmRCb2R5KSB7XG4gICAgICAgICAgZm9ybUJvZHkucHVzaChgJHtlbmNvZGVVUklDb21wb25lbnQocHJvcCl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KGRpc2NvcmRCb2R5W3Byb3BdKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJvZHkgPSBmb3JtQm9keS5qb2luKCcmJyk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnM/LmJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAob3B0aW9ucy5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgICAgICBib2R5ID0gb3B0aW9ucy5ib2R5O1xuICAgICAgICAgIC8vIE5vIG5lZWQgdG8gc2V0IHRoZSBgY29udGVudC10eXBlYCBoZWFkZXIgc2luY2UgYGZldGNoYCBkb2VzIHRoYXQgYXV0b21hdGljYWxseSBmb3IgdXMgd2hlbiB3ZSB1c2UgYSBgRm9ybURhdGFgIG9iamVjdC5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkocmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQob3B0aW9ucy5ib2R5KSk7XG4gICAgICAgICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gPSBgYXBwbGljYXRpb24vanNvbmA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU09NRVRJTUVTIFNQRUNJQUwgSEVBREVSUyAoRS5HLiBDVVNUT00gQVVUSE9SSVpBVElPTikgTkVFRCBUTyBCRSBVU0VEXG4gICAgICBpZiAob3B0aW9ucz8uaGVhZGVycykge1xuICAgICAgICBPYmplY3QuYXNzaWduKGhlYWRlcnMsIG9wdGlvbnMuaGVhZGVycyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgIH07XG4gICAgfSxcblxuICAgIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzKCkge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcmVzdC5yYXRlTGltaXRlZFBhdGhzLmVudHJpZXMoKSkge1xuICAgICAgICAvLyAgIHJlc3QuZGVidWcoXG4gICAgICAgIC8vIGBbUkVTVCAtIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzXSBSdW5uaW5nIGZvciBvZiBsb29wLiAke1xuICAgICAgICAvLyAgIHZhbHVlLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICAgIC8vIH1gXG4gICAgICAgIC8vICAgKVxuICAgICAgICAvLyBJZiB0aGUgdGltZSBoYXMgbm90IHJlYWNoZWQgY2FuY2VsXG4gICAgICAgIGlmICh2YWx1ZS5yZXNldFRpbWVzdGFtcCA+IG5vdykgY29udGludWU7XG5cbiAgICAgICAgLy8gUmF0ZSBsaW1pdCBpcyBvdmVyLCBkZWxldGUgdGhlIHJhdGUgbGltaXRlclxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZGVsZXRlKGtleSk7XG4gICAgICAgIC8vIElmIGl0IHdhcyBnbG9iYWwsIGFsc28gbWFyayB0aGUgZ2xvYmFsIHZhbHVlIGFzIGZhbHNlXG4gICAgICAgIGlmIChrZXkgPT09ICdnbG9iYWwnKSByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQUxMIFBBVEhTIEFSRSBDTEVBUkVEIENBTiBDQU5DRUwgT1VUIVxuICAgICAgaWYgKHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zaXplID09PSAwKSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMgPSB0cnVlO1xuICAgICAgICAvLyBSRUNIRUNLIElOIDEgU0VDT05EXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vIHJlc3QuZGVidWcoJ1tSRVNUIC0gcHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHNdIFJ1bm5pbmcgc2V0VGltZW91dC4nKVxuICAgICAgICAgIHJlc3QucHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMoKTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKiBQcm9jZXNzZXMgdGhlIHJhdGUgbGltaXQgaGVhZGVycyBhbmQgZGV0ZXJtaW5lcyBpZiBpdCBuZWVkcyB0byBiZSByYXRlIGxpbWl0ZWQgYW5kIHJldHVybnMgdGhlIGJ1Y2tldCBpZCBpZiBhdmFpbGFibGUgKi9cbiAgICBwcm9jZXNzSGVhZGVycyh1cmwsIGhlYWRlcnMsIGlkZW50aWZpZXIpIHtcbiAgICAgIGxldCByYXRlTGltaXRlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBHRVQgQUxMIE5FQ0VTU0FSWSBIRUFERVJTXG4gICAgICBjb25zdCByZW1haW5pbmcgPSBoZWFkZXJzLmdldChSQVRFX0xJTUlUX1JFTUFJTklOR19IRUFERVIpO1xuICAgICAgY29uc3QgcmV0cnlBZnRlciA9IGhlYWRlcnMuZ2V0KCdSZXRyeS1BZnRlcicpID8/IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSKTtcbiAgICAgIGNvbnN0IHJlc2V0ID0gRGF0ZS5ub3coKSArIE51bWJlcihyZXRyeUFmdGVyKSAqIDEwMDA7XG4gICAgICBjb25zdCBnbG9iYWwgPSBoZWFkZXJzLmdldChSQVRFX0xJTUlUX0dMT0JBTF9IRUFERVIpO1xuICAgICAgLy8gdW5kZWZpbmVkIG92ZXJyaWRlIG51bGwgbmVlZGVkIGZvciB0eXBpbmdzXG4gICAgICBjb25zdCBidWNrZXRJZCA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfQlVDS0VUX0hFQURFUikgPz8gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgbGltaXQgPSBoZWFkZXJzLmdldChSQVRFX0xJTUlUX0xJTUlUX0hFQURFUik7XG5cbiAgICAgIC8vIElmIHdlIGRpZG4ndCByZWNlaXZlZCB0aGUgaWRlbnRpZmllciwgZmFsbGJhY2sgdG8gdGhlIGJvdCB0b2tlblxuICAgICAgaWRlbnRpZmllciA/Pz0gYEJvdCAke3Jlc3QudG9rZW59YDtcblxuICAgICAgcmVzdC5xdWV1ZXMuZ2V0KGAke2lkZW50aWZpZXJ9JHt1cmx9YCk/LmhhbmRsZUNvbXBsZXRlZFJlcXVlc3Qoe1xuICAgICAgICByZW1haW5pbmc6IHJlbWFpbmluZyA/IE51bWJlcihyZW1haW5pbmcpIDogdW5kZWZpbmVkLFxuICAgICAgICBpbnRlcnZhbDogcmV0cnlBZnRlciA/IE51bWJlcihyZXRyeUFmdGVyKSAqIDEwMDAgOiB1bmRlZmluZWQsXG4gICAgICAgIG1heDogbGltaXQgPyBOdW1iZXIobGltaXQpIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElGIFRIRVJFIElTIE5PIFJFTUFJTklORyBSQVRFIExJTUlULCBNQVJLIElUIEFTIFJBVEUgTElNSVRFRFxuICAgICAgaWYgKHJlbWFpbmluZyA9PT0gJzAnKSB7XG4gICAgICAgIHJhdGVMaW1pdGVkID0gdHJ1ZTtcblxuICAgICAgICAvLyBTQVZFIFRIRSBVUkwgQVMgTElNSVRFRCwgSU1QT1JUQU5UIEZPUiBORVcgUkVRVUVTVFMgQlkgVVNFUiBXSVRIT1VUIEJVQ0tFVFxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGAke2lkZW50aWZpZXJ9JHt1cmx9YCwge1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICByZXNldFRpbWVzdGFtcDogcmVzZXQsXG4gICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNBVkUgVEhFIEJVQ0tFVCBBUyBMSU1JVEVEIFNJTkNFIERJRkZFUkVOVCBVUkxTIE1BWSBTSEFSRSBBIEJVQ0tFVFxuICAgICAgICBpZiAoYnVja2V0SWQpIHtcbiAgICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGAke2lkZW50aWZpZXJ9JHtidWNrZXRJZH1gLCB7XG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICByZXNldFRpbWVzdGFtcDogcmVzZXQsXG4gICAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJRiBUSEVSRSBJUyBOTyBSRU1BSU5JTkcgR0xPQkFMIExJTUlULCBNQVJLIElUIFJBVEUgTElNSVRFRCBHTE9CQUxMWVxuICAgICAgaWYgKGdsb2JhbCkge1xuICAgICAgICBjb25zdCByZXRyeUFmdGVyID0gTnVtYmVyKGhlYWRlcnMuZ2V0KCdyZXRyeS1hZnRlcicpKSAqIDEwMDA7XG4gICAgICAgIGNvbnN0IGdsb2JhbFJlc2V0ID0gRGF0ZS5ub3coKSArIHJldHJ5QWZ0ZXI7XG4gICAgICAgIC8vICAgcmVzdC5kZWJ1ZyhcbiAgICAgICAgLy8gYFtSRVNUID0gR2xvYmFsbHkgUmF0ZSBMaW1pdGVkXSBVUkw6ICR7dXJsfSB8IEdsb2JhbCBSZXN0OiAke2dsb2JhbFJlc2V0fWBcbiAgICAgICAgLy8gICApXG4gICAgICAgIHJlc3QuZ2xvYmFsbHlSYXRlTGltaXRlZCA9IHRydWU7XG4gICAgICAgIHJhdGVMaW1pdGVkID0gdHJ1ZTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSBmYWxzZTtcbiAgICAgICAgfSwgcmV0cnlBZnRlcik7XG5cbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldCgnZ2xvYmFsJywge1xuICAgICAgICAgIHVybDogJ2dsb2JhbCcsXG4gICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IGdsb2JhbFJlc2V0LFxuICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYnVja2V0SWQpIHtcbiAgICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGlkZW50aWZpZXIsIHtcbiAgICAgICAgICAgIHVybDogJ2dsb2JhbCcsXG4gICAgICAgICAgICByZXNldFRpbWVzdGFtcDogZ2xvYmFsUmVzZXQsXG4gICAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmF0ZUxpbWl0ZWQgJiYgIXJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMpIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJhdGVMaW1pdGVkID8gYnVja2V0SWQgOiB1bmRlZmluZWQ7XG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHVybCA9IGAke3Jlc3QuYmFzZVVybH0vdiR7cmVzdC52ZXJzaW9ufSR7b3B0aW9ucy5yb3V0ZX1gO1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHJlc3QuY3JlYXRlUmVxdWVzdEJvZHkob3B0aW9ucy5tZXRob2QsIG9wdGlvbnMucmVxdWVzdEJvZHlPcHRpb25zKTtcblxuICAgICAgLy8gUmV0cmllcyBhIHJlcXVlc3QgdGhhdCB3YXMgYWJvcnRlZCBiZWNhdXNlIGl0IGhpdCBgcmVzdC5yZXF1ZXN0VGltZW91dGAsIG9yIHJlamVjdHMgaXQgb25jZSB0aGUgcmV0cnlcbiAgICAgIC8vIGJ1ZGdldCBpcyBleGhhdXN0ZWQuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHRoZSBgaW52YWxpZEJ1Y2tldGAvZXZlbnQgYm9va2tlZXBpbmcgYmVmb3JlaGFuZC5cbiAgICAgIGNvbnN0IGhhbmRsZVRpbWVvdXQgPSBhc3luYyAob3B0aW9uczogU2VuZFJlcXVlc3RPcHRpb25zLCBlcnJvcjogRXJyb3IpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnMucmV0cnlDb3VudCA+PSByZXN0Lm1heFJldHJ5Q291bnQpIHtcbiAgICAgICAgICByZXN0LmxvZ2dlci5kZWJ1ZyhgcmVxdWVzdCB0byAke3VybH0gdGltZWQgb3V0IGFuZCBleGNlZWRlZCB0aGUgbWF4aW11bSBhbGxvd2VkIHJldHJpZXMuYCk7XG4gICAgICAgICAgb3B0aW9ucy5yZWplY3Qoe1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgc3RhdHVzOiA5OTksXG4gICAgICAgICAgICBlcnJvcjogJ1RoZSByZXF1ZXN0IHRpbWVkIG91dCBhbmQgaXQgbWF4ZWQgb3V0IHRoZSByZXRyaWVzIGxpbWl0LicsXG4gICAgICAgICAgICBlcnJvck9iamVjdDogZXJyb3IsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYHJlcXVlc3QgdG8gJHt1cmx9IHRpbWVkIG91dCBhZnRlciAke3Jlc3QucmVxdWVzdFRpbWVvdXR9bXMsIHJldHJ5aW5nLmAsIGVycm9yKTtcbiAgICAgICAgb3B0aW9ucy5yZXRyeUNvdW50ICs9IDE7XG4gICAgICAgIGF3YWl0IG9wdGlvbnMucmV0cnlSZXF1ZXN0Py4ob3B0aW9ucyk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBsb2dnaW5nSGVhZGVycyA9IHsgLi4ucGF5bG9hZC5oZWFkZXJzIH07XG5cbiAgICAgIGlmIChwYXlsb2FkLmhlYWRlcnMuYXV0aG9yaXphdGlvbikge1xuICAgICAgICBjb25zdCBhdXRob3JpemF0aW9uU2NoZW1lID0gcGF5bG9hZC5oZWFkZXJzLmF1dGhvcml6YXRpb24/LnNwbGl0KCcgJylbMF07XG4gICAgICAgIGxvZ2dpbmdIZWFkZXJzLmF1dGhvcml6YXRpb24gPSBgJHthdXRob3JpemF0aW9uU2NoZW1lfSB0b2tlbmhlcmVgO1xuICAgICAgfVxuXG4gICAgICAvLyBHaXZlIHRoaXMgYXR0ZW1wdCBhIGhhcmQgZGVhZGxpbmUuIGBBYm9ydFNpZ25hbC50aW1lb3V0YCBhYm9ydHMgdGhlIGZldGNoIChhbmQgYW55IGluLXByb2dyZXNzIGJvZHlcbiAgICAgIC8vIHJlYWQpIG9uY2UgaXQgZmlyZXMsIHdoaWNoIG1ha2VzIHRoZSBhd2FpdGVkIGZldGNoIHJlamVjdCBzbyBhIHN0YWxsZWQgY29ubmVjdGlvbiBjYW4gbmV2ZXIga2VlcCB0aGlzXG4gICAgICAvLyBxdWV1ZSdzIGBwcm9jZXNzUGVuZGluZ2AgbG9vcCAoYW5kIHRoZXJlZm9yZSB0aGUgd2hvbGUgcXVldWUpIHdlZGdlZCBmb3JldmVyLiBPbWl0dGVkIHdoZW4gZGlzYWJsZWQuXG4gICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCB7IC4uLnBheWxvYWQsIHNpZ25hbDogcmVzdC5yZXF1ZXN0VGltZW91dCA+IDAgPyBBYm9ydFNpZ25hbC50aW1lb3V0KHJlc3QucmVxdWVzdFRpbWVvdXQpIDogdW5kZWZpbmVkIH0pO1xuICAgICAgcmVzdC5ldmVudHMucmVxdWVzdChyZXF1ZXN0LCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMucmVxdWVzdEJvZHlPcHRpb25zPy5ib2R5LFxuICAgICAgfSk7XG5cbiAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGBzZW5kaW5nIHJlcXVlc3QgdG8gJHt1cmx9YCwgJ3dpdGggcGF5bG9hZDonLCB7IC4uLnBheWxvYWQsIGhlYWRlcnM6IGxvZ2dpbmdIZWFkZXJzIH0pO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KS5jYXRjaChhc3luYyAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVzdC5ldmVudHMucmVxdWVzdEVycm9yKHJlcXVlc3QsIGVycm9yLCB7IGJvZHk6IG9wdGlvbnMucmVxdWVzdEJvZHlPcHRpb25zPy5ib2R5IH0pO1xuICAgICAgICAvLyBNYXJrIHJlcXVlc3QgYXMgY29tcGxldGVkXG4gICAgICAgIHJlc3QuaW52YWxpZEJ1Y2tldC5oYW5kbGVDb21wbGV0ZWRSZXF1ZXN0KDk5OSwgZmFsc2UpO1xuXG4gICAgICAgIC8vIFRoZSBhdHRlbXB0IGhpdCBgcmVzdC5yZXF1ZXN0VGltZW91dGAgYW5kIHdhcyBhYm9ydGVkLiBUcmVhdCBpdCBsaWtlIGEgdHJhbnNpZW50IGZhaWx1cmUgYW5kIHJldHJ5XG4gICAgICAgIC8vIGl0IHRocm91Z2ggdGhlIHF1ZXVlLCBzbyBhIHNpbmdsZSBzdGFsbGVkIGNvbm5lY3Rpb24gZG9lc24ndCBwZXJtYW5lbnRseSBmYWlsIHRoZSByZXF1ZXN0LlxuICAgICAgICBpZiAoaXNUaW1lb3V0RXJyb3IoZXJyb3IpKSByZXR1cm4gYXdhaXQgaGFuZGxlVGltZW91dChvcHRpb25zLCBlcnJvcik7XG5cbiAgICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYHJlcXVlc3QgZmV0Y2ggdG8gJHt1cmx9IGZhaWxlZC5gLCBlcnJvcik7XG4gICAgICAgIG9wdGlvbnMucmVqZWN0KHtcbiAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgc3RhdHVzOiA5OTksXG4gICAgICAgICAgZXJyb3I6ICdQb3NzaWJsZSBuZXR3b3JrIG9yIHJlcXVlc3Qgc2hhcGUgaXNzdWUgb2NjdXJyZWQuIElmIHRoaXMgaXMgcmFyZSwgaXRzIGEgbmV0d29yayBnbGl0Y2guIElmIGl0IG9jY3VycyBhIGxvdCBzb21ldGhpbmcgaXMgd3JvbmcuJyxcbiAgICAgICAgICBlcnJvck9iamVjdDogZXJyb3IsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHJlc3BvbnNlIGlzIHVuZGVmaW5lZCwgdGhlIGVycm9yIGhhcyBiZWVuIGhhbmRsZWQgaW4gdGhlIGNhdGNoIGJsb2NrIGFib3ZlXG4gICAgICBpZiAoIXJlc3BvbnNlKSByZXR1cm47XG5cbiAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGByZXF1ZXN0IGZldGNoZWQgZnJvbSAke3VybH0gd2l0aCBzdGF0dXMgJHtyZXNwb25zZS5zdGF0dXN9ICYgJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuXG4gICAgICAvLyBTb21ldGltZXMgdGhlIENvbnRlbnQtVHlwZSBtYXkgYmUgXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIsIGZvciB0aGlzIHJlYXNvbiwgd2UgbmVlZCB0byBjaGVjayB0aGUgc3RhcnQgb2YgdGhlIGhlYWRlclxuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IChyZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk/LnN0YXJ0c1dpdGgoJ2FwcGxpY2F0aW9uL2pzb24nKSA/IHJlc3BvbnNlLmpzb24oKSA6IHJlc3BvbnNlLnRleHQoKSkuY2F0Y2goKCkgPT4gbnVsbCk7XG5cbiAgICAgIHJlc3QuZXZlbnRzLnJlc3BvbnNlKHJlcXVlc3QsIHJlc3BvbnNlLCB7XG4gICAgICAgIHJlcXVlc3RCb2R5OiBvcHRpb25zLnJlcXVlc3RCb2R5T3B0aW9ucz8uYm9keSxcbiAgICAgICAgcmVzcG9uc2VCb2R5OiBib2R5LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIE1hcmsgcmVxdWVzdCBhcyBjb21wbGV0ZWRcbiAgICAgIHJlc3QuaW52YWxpZEJ1Y2tldC5oYW5kbGVDb21wbGV0ZWRSZXF1ZXN0KHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UuaGVhZGVycy5nZXQoUkFURV9MSU1JVF9TQ09QRV9IRUFERVIpID09PSAnc2hhcmVkJyk7XG5cbiAgICAgIC8vIFNldCB0aGUgYnVja2V0IGlkIGlmIGl0IHdhcyBhdmFpbGFibGUgb24gdGhlIGhlYWRlcnNcbiAgICAgIGNvbnN0IGJ1Y2tldElkID0gcmVzdC5wcm9jZXNzSGVhZGVycyhyZXN0LnNpbXBsaWZ5VXJsKG9wdGlvbnMucm91dGUsIG9wdGlvbnMubWV0aG9kKSwgcmVzcG9uc2UuaGVhZGVycywgcGF5bG9hZC5oZWFkZXJzLmF1dGhvcml6YXRpb24pO1xuXG4gICAgICBpZiAoYnVja2V0SWQpIG9wdGlvbnMuYnVja2V0SWQgPSBidWNrZXRJZDtcblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA8IEh0dHBSZXNwb25zZUNvZGUuU3VjY2VzcyB8fCByZXNwb25zZS5zdGF0dXMgPj0gSHR0cFJlc3BvbnNlQ29kZS5FcnJvcikge1xuICAgICAgICByZXN0LmxvZ2dlci5kZWJ1ZyhgUmVxdWVzdCB0byAke3VybH0gZmFpbGVkLmApO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IEh0dHBSZXNwb25zZUNvZGUuVG9vTWFueVJlcXVlc3RzKSB7XG4gICAgICAgICAgb3B0aW9ucy5yZWplY3QoeyBvazogZmFsc2UsIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LCBib2R5IH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGBSZXF1ZXN0IHRvICR7dXJsfSB3YXMgcmF0ZWxpbWl0ZWQuYCk7XG4gICAgICAgIC8vIFRvbyBtYW55IGF0dGVtcHRzLCBnZXQgcmlkIG9mIHJlcXVlc3QgZnJvbSBxdWV1ZS5cbiAgICAgICAgaWYgKG9wdGlvbnMucmV0cnlDb3VudCA+PSByZXN0Lm1heFJldHJ5Q291bnQpIHtcbiAgICAgICAgICByZXN0LmxvZ2dlci5kZWJ1ZyhgUmVxdWVzdCB0byAke3VybH0gZXhjZWVkZWQgdGhlIG1heGltdW0gYWxsb3dlZCByZXRyaWVzLmAsICd3aXRoIHBheWxvYWQ6JywgcGF5bG9hZCk7XG4gICAgICAgICAgLy8gcmVzdC5kZWJ1ZyhgW1JFU1QgLSBSZXRyaWVzTWF4ZWRdICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9YClcbiAgICAgICAgICBvcHRpb25zLnJlamVjdCh7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgICAgICBlcnJvcjogJ1RoZSByZXF1ZXN0IHdhcyByYXRlIGxpbWl0ZWQgYW5kIGl0IG1heGVkIG91dCB0aGUgcmV0cmllcyBsaW1pdC4nLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucy5yZXRyeUNvdW50ICs9IDE7XG5cbiAgICAgICAgY29uc3QgcmVzZXRBZnRlciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdyZXRyeS1hZnRlcicpO1xuICAgICAgICBpZiAocmVzZXRBZnRlcikgYXdhaXQgZGVsYXkoTnVtYmVyKHJlc2V0QWZ0ZXIpICogMTAwMCk7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IG9wdGlvbnMucmV0cnlSZXF1ZXN0Py4ob3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIC8vIERpc2NvcmQgc29tZXRpbWVzIHNlbmRzIGEgcmVzcG9uc2Ugd2l0aCBubyBjb250ZW50XG4gICAgICBvcHRpb25zLnJlc29sdmUoeyBvazogdHJ1ZSwgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIGJvZHk6IHJlc3BvbnNlLnN0YXR1cyA9PT0gSHR0cFJlc3BvbnNlQ29kZS5Ob0NvbnRlbnQgPyB1bmRlZmluZWQgOiBib2R5IH0pO1xuICAgIH0sXG5cbiAgICBzaW1wbGlmeVVybCh1cmwsIG1ldGhvZCkge1xuICAgICAgY29uc3Qgcm91dGVJbmZvcm1hdGlvbktleTogc3RyaW5nW10gPSBbbWV0aG9kXTtcblxuICAgICAgY29uc3QgcXVlcnlQYXJhbUluZGV4ID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgICAgIGNvbnN0IHJvdXRlID0gcXVlcnlQYXJhbUluZGV4ICE9PSAtMSA/IHVybC5zbGljZSgwLCBxdWVyeVBhcmFtSW5kZXgpIDogdXJsO1xuXG4gICAgICAvLyBTaW5jZSB0aGUgdXJscyBzdGFydCB3aXRoIC8gdGhlIGZpcnN0IHBhcnQgd2lsbCBhbHdheXMgYmUgZW1wdHlcbiAgICAgIGNvbnN0IHNwbGl0dGVkUm91dGUgPSByb3V0ZS5zcGxpdCgnLycpO1xuXG4gICAgICAvLyAxKSBTdHJpcCB0aGUgbWlub3IgcGFyYW1zXG4gICAgICAvLyAgICBUaGUgb25seSBtYWpvcnMgYXJlIGNoYW5uZWxzLCBndWlsZHMsIHdlYmhvb2tzIGFuZCB3ZWJob29rcyB3aXRoIHRoZWlyIHRva2VuXG5cbiAgICAgIGNvbnN0IHN0cmlwcGVkUm91dGUgPSBzcGxpdHRlZFJvdXRlXG4gICAgICAgIC5tYXAoKHBhcnQsIGluZGV4LCBhcnJheSkgPT4ge1xuICAgICAgICAgIC8vIFdoaWxlIHBhcnNlSW50IHdpbGwgdHJ1bmNhdGUgdGhlIHNub3dmbGFrZSBpZCwgaXQgd2lsbCBzdGlsbCB0ZWxsIHVzIGlmIGl0IGlzIGEgbnVtYmVyXG4gICAgICAgICAgY29uc3QgaXNOdW1iZXIgPSBOdW1iZXIuaXNGaW5pdGUocGFyc2VJbnQocGFydCwgMTApKTtcblxuICAgICAgICAgIGlmICghaXNOdW1iZXIpIHtcbiAgICAgICAgICAgIC8vIFJlYWN0aW9ucyBlbW9qaSBuZWVkIHRvIGJlIHN0cmlwcGVkIGFzIGl0IGlzIGEgbWlub3IgcGFyYW1ldGVyXG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gMSAmJiBhcnJheVtpbmRleCAtIDFdID09PSAncmVhY3Rpb25zJykgcmV0dXJuICd4JztcbiAgICAgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIHdlYmhvb2sgb3IgaWYgaXQgaXMgcGFydCBvZiB0aGUgcm91dGUsIGtlZXAgaXQgYXMgaXQgaXMgYSBtYWpvciBwYXJhbWV0ZXJcbiAgICAgICAgICAgIHJldHVybiBwYXJ0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGFyZSBvbiBhIGNoYW5uZWwgaWQsIGEgZ3VpbGQgaWQgb3IgYSB3ZWJob29rIGlkXG4gICAgICAgICAgY29uc3QgaXNNYWpvciA9IGluZGV4ID49IDEgJiYgKGFycmF5W2luZGV4IC0gMV0gPT09ICdjaGFubmVscycgfHwgYXJyYXlbaW5kZXggLSAxXSA9PT0gJ2d1aWxkcycgfHwgYXJyYXlbaW5kZXggLSAxXSA9PT0gJ3dlYmhvb2tzJyk7XG5cbiAgICAgICAgICBpZiAoaXNNYWpvcikgcmV0dXJuIHBhcnQ7XG5cbiAgICAgICAgICByZXR1cm4gJ3gnO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbignLycpO1xuXG4gICAgICByb3V0ZUluZm9ybWF0aW9uS2V5LnB1c2goc3RyaXBwZWRSb3V0ZSk7XG5cbiAgICAgIC8vIDIpIEFjY291bnQgZm9yIGV4Y2VwdGlvbnNcbiAgICAgIC8vICAgIC0gaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmQvZGlzY29yZC1hcGktZG9jcy9pc3N1ZXMvMTA5MlxuICAgICAgLy8gICAgLSBodHRwczovL2dpdGh1Yi5jb20vZGlzY29yZC9kaXNjb3JkLWFwaS1kb2NzL2lzc3Vlcy8xMjk1XG5cbiAgICAgIC8vIFRoZSAyIGV4Y2VwdGlvbnMgYXJlIGZvciBtZXNzYWdlIGRlbGV0ZSwgc28gd2UgbmVlZCB0byBjaGVjayBpZiB3ZSBhcmUgaW4gdGhhdCByb3V0ZVxuICAgICAgaWYgKG1ldGhvZCA9PT0gJ0RFTEVURScgJiYgc3BsaXR0ZWRSb3V0ZS5sZW5ndGggPT09IDUgJiYgc3BsaXR0ZWRSb3V0ZVsxXSA9PT0gJ2NoYW5uZWxzJyAmJiBzdHJpcHBlZFJvdXRlLmVuZHNXaXRoKCcvbWVzc2FnZXMveCcpKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VJZCA9IHNwbGl0dGVkUm91dGVbNF07XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IHNub3dmbGFrZVRvVGltZXN0YW1wKG1lc3NhZ2VJZCk7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmQvZGlzY29yZC1hcGktZG9jcy9pc3N1ZXMvMTA5MlxuICAgICAgICBpZiAobm93IC0gdGltZXN0YW1wIDwgMTBfMDAwKSB7XG4gICAgICAgICAgcm91dGVJbmZvcm1hdGlvbktleS5wdXNoKCdtZXNzYWdlLWRlbGV0ZS0xMHMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kaXNjb3JkL2Rpc2NvcmQtYXBpLWRvY3MvaXNzdWVzLzEyOTVcbiAgICAgICAgLy8gMiB3ZWVrcyA9IDIgKiA3ICogMjQgKiA2MCAqIDYwICogMTAwMCA9IDEyMDk2MDAwMDBcbiAgICAgICAgaWYgKG5vdyAtIHRpbWVzdGFtcCA+IDEyMDk2MDAwMDApIHtcbiAgICAgICAgICByb3V0ZUluZm9ybWF0aW9uS2V5LnB1c2goJ21lc3NhZ2UtZGVsZXRlLTJ3Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJvdXRlSW5mb3JtYXRpb25LZXkuam9pbignOicpO1xuICAgIH0sXG5cbiAgICBhc3luYyBwcm9jZXNzUmVxdWVzdChyZXF1ZXN0OiBTZW5kUmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHVybCA9IHJlc3Quc2ltcGxpZnlVcmwocmVxdWVzdC5yb3V0ZSwgcmVxdWVzdC5tZXRob2QpO1xuXG4gICAgICBpZiAocmVxdWVzdC5ydW5UaHJvdWdoUXVldWUgPT09IGZhbHNlKSB7XG4gICAgICAgIGF3YWl0IHJlc3Quc2VuZFJlcXVlc3QocmVxdWVzdCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgcmVxdWVzdCBoYXMgYSB0b2tlbiwgdXNlIGl0XG4gICAgICAvLyBFbHNlIGZhbGxiYWNrIHRvIHByZWZpeCB3aXRoIHRoZSBib3QgdG9rZW5cbiAgICAgIGNvbnN0IHF1ZXVlSWRlbnRpZmllciA9IHJlcXVlc3QucmVxdWVzdEJvZHlPcHRpb25zPy5oZWFkZXJzPy5hdXRob3JpemF0aW9uID8/IGBCb3QgJHtyZXN0LnRva2VufWA7XG5cbiAgICAgIGNvbnN0IHF1ZXVlID0gcmVzdC5xdWV1ZXMuZ2V0KGAke3F1ZXVlSWRlbnRpZmllcn0ke3VybH1gKTtcblxuICAgICAgaWYgKHF1ZXVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcXVldWUubWFrZVJlcXVlc3QocmVxdWVzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDUkVBVEVTIEEgTkVXIFFVRVVFXG4gICAgICAgIGNvbnN0IGJ1Y2tldFF1ZXVlID0gbmV3IFF1ZXVlKHJlc3QsIHsgdXJsLCBkZWxldGVRdWV1ZURlbGF5OiByZXN0LmRlbGV0ZVF1ZXVlRGVsYXksIGlkZW50aWZpZXI6IHF1ZXVlSWRlbnRpZmllciB9KTtcblxuICAgICAgICAvLyBTYXZlIHF1ZXVlXG4gICAgICAgIHJlc3QucXVldWVzLnNldChgJHtxdWV1ZUlkZW50aWZpZXJ9JHt1cmx9YCwgYnVja2V0UXVldWUpO1xuXG4gICAgICAgIC8vIEFkZCByZXF1ZXN0IHRvIHF1ZXVlXG4gICAgICAgIGJ1Y2tldFF1ZXVlLm1ha2VSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBtYWtlUmVxdWVzdChtZXRob2QsIHJvdXRlLCBvcHRpb25zKSB7XG4gICAgICAvLyBUaGlzIGVycm9yIG5lZWRzIHRvIGJlIGNyZWF0ZWQgaGVyZSBiZWNhdXNlIG9mIGhvdyBzdGFjayB0cmFjZXMgZ2V0IGNhbGN1bGF0ZWRcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG5cbiAgICAgIGlmIChyZXN0LmlzUHJveGllZCkge1xuICAgICAgICBpZiAocmVzdC5hdXRob3JpemF0aW9uKSB7XG4gICAgICAgICAgb3B0aW9ucyA/Pz0ge307XG4gICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID8/PSB7fTtcbiAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbcmVzdC5hdXRob3JpemF0aW9uSGVhZGVyXSA9IHJlc3QuYXV0aG9yaXphdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVybCA9IGAke3Jlc3QuYmFzZVVybH0vdiR7cmVzdC52ZXJzaW9ufSR7cm91dGV9YDtcblxuICAgICAgICAvLyBSZXRyeSBvbiB0aW1lb3V0IHVwIHRvIGBtYXhSZXRyeUNvdW50YCwgbWlycm9yaW5nIHRoZSBxdWV1ZWQgYHNlbmRSZXF1ZXN0YCBwYXRoLCBzbyBhIHN0YWxsZWQgcHJveHlcbiAgICAgICAgLy8gY29ubmVjdGlvbiBkb2Vzbid0IHBlcm1hbmVudGx5IGZhaWwgdGhlIHJlcXVlc3QgKGFuZCBjYW4gbmV2ZXIgaGFuZyB0aGUgY2FsbGVyIGZvcmV2ZXIpLlxuICAgICAgICBmb3IgKGxldCByZXRyeUNvdW50ID0gMDsgOyByZXRyeUNvdW50KyspIHtcbiAgICAgICAgICAvLyBHaXZlIHRoZSByZXF1ZXN0IHRvIHRoZSBwcm94eSBhIGhhcmQgZGVhZGxpbmUgdG9vIHZpYSBgQWJvcnRTaWduYWwudGltZW91dGAgKG9taXR0ZWQgd2hlbiBkaXNhYmxlZCkuXG4gICAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVybCwge1xuICAgICAgICAgICAgLi4ucmVzdC5jcmVhdGVSZXF1ZXN0Qm9keShtZXRob2QsIG9wdGlvbnMpLFxuICAgICAgICAgICAgc2lnbmFsOiByZXN0LnJlcXVlc3RUaW1lb3V0ID4gMCA/IEFib3J0U2lnbmFsLnRpbWVvdXQocmVzdC5yZXF1ZXN0VGltZW91dCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzdC5ldmVudHMucmVxdWVzdChyZXF1ZXN0LCB7XG4gICAgICAgICAgICBib2R5OiBvcHRpb25zPy5ib2R5LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2gocmVxdWVzdCkuY2F0Y2goKGZldGNoRXJyb3IpID0+IHtcbiAgICAgICAgICAgIHJlc3QuZXZlbnRzLnJlcXVlc3RFcnJvcihyZXF1ZXN0LCBmZXRjaEVycm9yLCB7IGJvZHk6IG9wdGlvbnM/LmJvZHkgfSk7XG5cbiAgICAgICAgICAgIC8vIFRoZSBhdHRlbXB0IGhpdCBgcmVzdC5yZXF1ZXN0VGltZW91dGAgYW5kIHdhcyBhYm9ydGVkOyByZXRyeSBpdCB1bnRpbCB0aGUgYnVkZ2V0IGlzIGV4aGF1c3RlZC5cbiAgICAgICAgICAgIGlmIChpc1RpbWVvdXRFcnJvcihmZXRjaEVycm9yKSAmJiByZXRyeUNvdW50IDwgcmVzdC5tYXhSZXRyeUNvdW50KSB7XG4gICAgICAgICAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGByZXF1ZXN0IHRvIHByb3h5ICR7dXJsfSB0aW1lZCBvdXQgYWZ0ZXIgJHtyZXN0LnJlcXVlc3RUaW1lb3V0fW1zLCByZXRyeWluZy5gLCBmZXRjaEVycm9yKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgZmV0Y2hFcnJvcjtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIElmIHJlc3VsdCBpcyB1bmRlZmluZWQsIHRoZSBhdHRlbXB0IHRpbWVkIG91dCBhbmQgaXMgYmVpbmcgcmV0cmllZC5cbiAgICAgICAgICBpZiAoIXJlc3VsdCkgY29udGludWU7XG5cbiAgICAgICAgICAvLyBTb21ldGltZXMgdGhlIENvbnRlbnQtVHlwZSBtYXkgYmUgXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIsIGZvciB0aGlzIHJlYXNvbiwgd2UgbmVlZCB0byBjaGVjayB0aGUgc3RhcnQgb2YgdGhlIGhlYWRlclxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCAocmVzdWx0LmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKT8uc3RhcnRzV2l0aCgnYXBwbGljYXRpb24vanNvbicpID8gcmVzdWx0Lmpzb24oKSA6IHJlc3VsdC50ZXh0KCkpLmNhdGNoKCgpID0+IG51bGwpO1xuXG4gICAgICAgICAgcmVzdC5ldmVudHMucmVzcG9uc2UocmVxdWVzdCwgcmVzdWx0LCB7XG4gICAgICAgICAgICByZXF1ZXN0Qm9keTogb3B0aW9ucz8uYm9keSxcbiAgICAgICAgICAgIHJlc3BvbnNlQm9keTogYm9keSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgICBlcnJvci5jYXVzZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShiYXNlRXJyb3JQcm90b3R5cGUpLCB7XG4gICAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXN1bHQuc3RhdHVzICE9PSAyMDQgPyAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShib2R5KSA6IGJvZHkpIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFNlbmRSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgcmVxdWVzdEJvZHlPcHRpb25zOiBvcHRpb25zLFxuICAgICAgICAgIHJldHJ5Q291bnQ6IDAsXG4gICAgICAgICAgcmV0cnlSZXF1ZXN0OiBhc3luYyAocGF5bG9hZDogU2VuZFJlcXVlc3RPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCByZXN0LnByb2Nlc3NSZXF1ZXN0KHBheWxvYWQpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzb2x2ZTogKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoZGF0YS5zdGF0dXMgIT09IDIwNCA/IChkYXRhLmJvZHkgYXMgUGFyYW1ldGVyczx0eXBlb2YgcmVzb2x2ZT5bMF0pIDogdW5kZWZpbmVkISk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICByZWplY3Q6IChyZWFzb24pID0+IHtcbiAgICAgICAgICAgIGxldCBlcnJvclRleHQ6IHN0cmluZztcblxuICAgICAgICAgICAgc3dpdGNoIChyZWFzb24uc3RhdHVzKSB7XG4gICAgICAgICAgICAgIGNhc2UgNDAwOlxuICAgICAgICAgICAgICAgIGVycm9yVGV4dCA9IFwiVGhlIG9wdGlvbnMgd2FzIGltcHJvcGVybHkgZm9ybWF0dGVkLCBvciB0aGUgc2VydmVyIGNvdWxkbid0IHVuZGVyc3RhbmQgaXQuXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgNDAxOlxuICAgICAgICAgICAgICAgIGVycm9yVGV4dCA9ICdUaGUgQXV0aG9yaXphdGlvbiBoZWFkZXIgd2FzIG1pc3Npbmcgb3IgaW52YWxpZC4nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDQwMzpcbiAgICAgICAgICAgICAgICBlcnJvclRleHQgPSAnVGhlIEF1dGhvcml6YXRpb24gdG9rZW4geW91IHBhc3NlZCBkaWQgbm90IGhhdmUgcGVybWlzc2lvbiB0byB0aGUgcmVzb3VyY2UuJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSA0MDQ6XG4gICAgICAgICAgICAgICAgZXJyb3JUZXh0ID0gXCJUaGUgcmVzb3VyY2UgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBkb2Vzbid0IGV4aXN0LlwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDQwNTpcbiAgICAgICAgICAgICAgICBlcnJvclRleHQgPSAnVGhlIEhUVFAgbWV0aG9kIHVzZWQgaXMgbm90IHZhbGlkIGZvciB0aGUgbG9jYXRpb24gc3BlY2lmaWVkLic7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgNDI5OlxuICAgICAgICAgICAgICAgIGVycm9yVGV4dCA9IFwiWW91J3JlIGJlaW5nIHJhdGVsaW1pdGVkLlwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDUwMjpcbiAgICAgICAgICAgICAgICBlcnJvclRleHQgPSAnVGhlcmUgd2FzIG5vdCBhIGdhdGV3YXkgYXZhaWxhYmxlIHRvIHByb2Nlc3MgeW91ciBvcHRpb25zLiBXYWl0IGEgYml0IGFuZCByZXRyeS4nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGVycm9yVGV4dCA9IHJlYXNvbi5zdGF0dXNUZXh0ID8/ICdVbmtub3duIGVycm9yJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXJyb3IubWVzc2FnZSA9IGBbJHtyZWFzb24uc3RhdHVzfV0gJHtlcnJvclRleHR9YDtcblxuICAgICAgICAgICAgLy8gSWYgZGlzY29yZCBzZW50IHVzIEpTT04sIGl0IGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlIGFuIGVycm9yIG1lc3NhZ2UgZnJvbSB3aGljaCB3ZSBjYW4gZ2V0IGFuZCBhZGQgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IgdG8gdGhlIGVycm9yIG1lc3NhZ2UsIHRoZSBmdWxsIGJvZHkgd2lsbCBiZSBpbiB0aGUgZXJyb3IuY2F1c2VcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZG9jcy5kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL3JlZmVyZW5jZSNlcnJvci1tZXNzYWdlc1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFzb24uYm9keSA9PT0gJ29iamVjdCcgJiYgaGFzUHJvcGVydHkocmVhc29uLmJvZHksICdjb2RlJykgJiYgaGFzUHJvcGVydHkocmVhc29uLmJvZHksICdtZXNzYWdlJykpIHtcbiAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSArPSBgXFxuRGlzY29yZCBlcnJvcjogWyR7cmVhc29uLmJvZHkuY29kZX1dICR7cmVhc29uLmJvZHkubWVzc2FnZX1gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlcnJvci5jYXVzZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShiYXNlRXJyb3JQcm90b3R5cGUpLCByZWFzb24pO1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJ1blRocm91Z2hRdWV1ZTogb3B0aW9ucz8ucnVuVGhyb3VnaFF1ZXVlLFxuICAgICAgICB9O1xuXG4gICAgICAgIGF3YWl0IHJlc3QucHJvY2Vzc1JlcXVlc3QocGF5bG9hZCk7XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnR0VUJywgdXJsLCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD47XG4gICAgfSxcblxuICAgIGFzeW5jIHBvc3Q8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQT1NUJywgdXJsLCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD47XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZSh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0RFTEVURScsIHVybCwgb3B0aW9ucykpO1xuICAgIH0sXG5cbiAgICBhc3luYyBwYXRjaDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BBVENIJywgdXJsLCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD47XG4gICAgfSxcblxuICAgIGFzeW5jIHB1dDxUID0gdm9pZD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUFVUJywgdXJsLCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD47XG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pO1xuXG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMuYm90KGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikpO1xuICAgIH0sXG5cbiAgICBhc3luYyBhZGRSZWFjdGlvbnMoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9ucywgb3JkZXJlZCA9IGZhbHNlKSB7XG4gICAgICBpZiAoIW9yZGVyZWQpIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgcmVhY3Rpb25zLm1hcChhc3luYyAocmVhY3Rpb24pID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHJlc3QuYWRkUmVhY3Rpb24oY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHJlYWN0aW9uIG9mIHJlYWN0aW9ucykge1xuICAgICAgICBhd2FpdCByZXN0LmFkZFJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbik7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFJvbGUoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm1lbWJlcihndWlsZElkLCB1c2VySWQsIHJvbGVJZCksIHsgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBhZGRUaHJlYWRNZW1iZXIoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMudXNlcihjaGFubmVsSWQsIHVzZXJJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBhZGREbVJlY2lwaWVudChjaGFubmVsSWQsIHVzZXJJZCwgYm9keSkge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZG1SZWNpcGllbnQoY2hhbm5lbElkLCB1c2VySWQpLCB7IGJvZHkgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUF1dG9tb2RSdWxlKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlcyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUNoYW5uZWwoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVFbW9qaShndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamlzKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlQXBwbGljYXRpb25FbW9qaShib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25FbW9qaXMocmVzdC5hcHBsaWNhdGlvbklkKSwgeyBib2R5IH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoYm9keSwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE1ha2VSZXF1ZXN0T3B0aW9ucyA9IHsgYm9keSB9O1xuXG4gICAgICBpZiAob3B0aW9ucz8uYmVhcmVyVG9rZW4pIHtcbiAgICAgICAgcmVzdE9wdGlvbnMudW5hdXRob3JpemVkID0gdHJ1ZTtcbiAgICAgICAgcmVzdE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5iZWFyZXJUb2tlbn1gLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQpLCByZXN0T3B0aW9ucyk7XG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kKGJvZHksIGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJlc3RPcHRpb25zOiBNYWtlUmVxdWVzdE9wdGlvbnMgPSB7IGJvZHkgfTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmJlYXJlclRva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWU7XG4gICAgICAgIHJlc3RPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke29wdGlvbnMuYmVhcmVyVG9rZW59YCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLmFsbChyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpLCByZXN0T3B0aW9ucyk7XG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUd1aWxkU3RpY2tlcihndWlsZElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGZvcm0uYXBwZW5kKCdmaWxlJywgb3B0aW9ucy5maWxlLmJsb2IsIG9wdGlvbnMuZmlsZS5uYW1lKTtcbiAgICAgIGZvcm0uYXBwZW5kKCduYW1lJywgb3B0aW9ucy5uYW1lKTtcbiAgICAgIGZvcm0uYXBwZW5kKCdkZXNjcmlwdGlvbicsIG9wdGlvbnMuZGVzY3JpcHRpb24pO1xuICAgICAgZm9ybS5hcHBlbmQoJ3RhZ3MnLCBvcHRpb25zLnRhZ3MpO1xuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcnMoZ3VpbGRJZCksIHsgYm9keTogZm9ybSwgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSwgeyBib2R5IH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVGb3J1bVRocmVhZChjaGFubmVsSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZm9ydW0oY2hhbm5lbElkKSwgeyBib2R5LCBmaWxlczogYm9keS5maWxlcywgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVJbnZpdGUoY2hhbm5lbElkLCBib2R5ID0ge30sIHJlYXNvbikge1xuICAgICAgaWYgKCFib2R5LnRhcmdldFVzZXJzRmlsZSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRJbnZpdGU+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmludml0ZXMoY2hhbm5lbElkKSwgeyBib2R5LCByZWFzb24gfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdoZW4gd2UgaGF2ZSB0byB1cGxvYWQgYSBmaWxlLCB3ZSBuZWVkIHRvIHVzZSBGb3JtRGF0YSwgYW5kIGFsbCBvdGhlciBmaWVsZHMgbmVlZCB0byBiZSBwYXJ0IG9mIHRoZSBwYXlsb2FkX2pzb24gZmllbGQuXG4gICAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICAgIGZvcm0uYXBwZW5kKCdwYXlsb2FkX2pzb24nLCBKU09OLnN0cmluZ2lmeShyZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdCh7IC4uLmJvZHksIHRhcmdldFVzZXJzRmlsZTogdW5kZWZpbmVkIH0pKSk7XG4gICAgICBmb3JtLmFwcGVuZCgndGFyZ2V0X3VzZXJzX2ZpbGUnLCBib2R5LnRhcmdldFVzZXJzRmlsZSk7XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEludml0ZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuaW52aXRlcyhjaGFubmVsSWQpLCB7IGJvZHk6IGZvcm0sIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRSb2xlTWVtYmVyQ291bnRzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMubWVtYmVyQ291bnRzKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlUm9sZShndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFJvbGU+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5hbGwoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50cyhndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVN0YWdlSW5zdGFuY2UoYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTdGFnZUluc3RhbmNlPihyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZXMoKSwgeyBib2R5LCByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVdlYmhvb2soY2hhbm5lbElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLmNoYW5uZWxzLndlYmhvb2tzKGNoYW5uZWxJZCksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICBhdmF0YXI6IG9wdGlvbnMuYXZhdGFyID8gYXdhaXQgdXJsVG9CYXNlNjQob3B0aW9ucy5hdmF0YXIpIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgICByZWFzb24sXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSwgeyByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUNoYW5uZWwoY2hhbm5lbElkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoY2hhbm5lbElkKSwge1xuICAgICAgICByZWFzb24sXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQ2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZShjaGFubmVsSWQsIG92ZXJ3cml0ZUlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLm92ZXJ3cml0ZShjaGFubmVsSWQsIG92ZXJ3cml0ZUlkKSwgeyByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUVtb2ppKGd1aWxkSWQsIGlkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaShndWlsZElkLCBpZCksIHsgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVBcHBsaWNhdGlvbkVtb2ppKGlkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbkVtb2ppKHJlc3QuYXBwbGljYXRpb25JZCwgaWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlRm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMubWVzc2FnZShyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuLCBtZXNzYWdlSWQpLCB7IHVuYXV0aG9yaXplZDogdHJ1ZSB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmQocmVzdC5hcHBsaWNhdGlvbklkLCBjb21tYW5kSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLm9uZShyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkLCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5zdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCksIHsgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5ndWlsZChndWlsZElkLCB0ZW1wbGF0ZUNvZGUpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlSW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuaW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCksIHsgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVJbnZpdGUoaW52aXRlQ29kZSwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuaW52aXRlKGludml0ZUNvZGUpLCB7IHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGFyZ2V0VXNlcnMoaW52aXRlQ29kZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PHN0cmluZz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludml0ZVRhcmdldFVzZXJzKGludml0ZUNvZGUpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBkYXRlVGFyZ2V0VXNlcnMoaW52aXRlQ29kZSwgdGFyZ2V0VXNlcnNGaWxlKSB7XG4gICAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBmb3JtLmFwcGVuZCgndGFyZ2V0X3VzZXJzX2ZpbGUnLCB0YXJnZXRVc2Vyc0ZpbGUpO1xuXG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5ndWlsZHMuaW52aXRlVGFyZ2V0VXNlcnMoaW52aXRlQ29kZSksIHsgYm9keTogZm9ybSB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGFyZ2V0VXNlcnNKb2JTdGF0dXMoaW52aXRlQ29kZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUYXJnZXRVc2Vyc0pvYlN0YXR1cz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludml0ZVRhcmdldFVzZXJzSm9iU3RhdHVzKGludml0ZUNvZGUpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU1lc3NhZ2VzKGNoYW5uZWxJZCwgbWVzc2FnZUlkcywgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuY2hhbm5lbHMuYnVsayhjaGFubmVsSWQpLCB7XG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICBtZXNzYWdlczogbWVzc2FnZUlkcy5zbGljZSgwLCAxMDApLm1hcCgoaWQpID0+IGlkLnRvU3RyaW5nKCkpLFxuICAgICAgICB9LFxuICAgICAgICByZWFzb24sXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlT3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCB7IHVuYXV0aG9yaXplZDogdHJ1ZSB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlT3duUmVhY3Rpb24oY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSB7XG4gICAgICByZWFjdGlvbiA9IHByb2Nlc3NSZWFjdGlvblN0cmluZyhyZWFjdGlvbik7XG5cbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5ib3QoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVJlYWN0aW9uc0FsbChjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLmFsbChjaGFubmVsSWQsIG1lc3NhZ2VJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVSZWFjdGlvbnNFbW9qaShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pIHtcbiAgICAgIHJlYWN0aW9uID0gcHJvY2Vzc1JlYWN0aW9uU3RyaW5nKHJlYWN0aW9uKTtcblxuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLmVtb2ppKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikpO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVSb2xlKGd1aWxkSWQsIHJvbGVJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMub25lKGd1aWxkSWQsIHJvbGVJZCksIHsgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlU3RhZ2VJbnN0YW5jZShjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2UoY2hhbm5lbElkKSwgeyByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVVzZXJSZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgdXNlcklkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pO1xuXG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMudXNlcihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24sIHVzZXJJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rKHdlYmhvb2tJZCwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy5pZCh3ZWJob29rSWQpLCB7IHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlV2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucyksIHsgdW5hdXRob3JpemVkOiB0cnVlIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4pIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbiksIHtcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkLCBjb21tYW5kSWQsIGJlYXJlclRva2VuLCBwZXJtaXNzaW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb24ocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpLFxuICAgICAgICB7XG4gICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBoZWFkZXJzOiB7IGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtiZWFyZXJUb2tlbn1gIH0sXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSwgeyBib2R5LCByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRCb3RQcm9maWxlKG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGF2YXRhciA9IG9wdGlvbnM/LmJvdEF2YXRhclVSTCA/IGF3YWl0IHVybFRvQmFzZTY0KG9wdGlvbnM/LmJvdEF2YXRhclVSTCkgOiBvcHRpb25zPy5ib3RBdmF0YXJVUkw7XG4gICAgICBjb25zdCBiYW5uZXIgPSBvcHRpb25zPy5ib3RCYW5uZXJVUkwgPyBhd2FpdCB1cmxUb0Jhc2U2NChvcHRpb25zPy5ib3RCYW5uZXJVUkwpIDogb3B0aW9ucz8uYm90QmFubmVyVVJMO1xuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkVXNlcj4ocmVzdC5yb3V0ZXMuY3VycmVudFVzZXIoKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgdXNlcm5hbWU6IG9wdGlvbnMudXNlcm5hbWU/LnRyaW0oKSxcbiAgICAgICAgICBhdmF0YXIsXG4gICAgICAgICAgYmFubmVyLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRDaGFubmVsKGNoYW5uZWxJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY2hhbm5lbChjaGFubmVsSWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzKGNoYW5uZWxJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5vdmVyd3JpdGUoY2hhbm5lbElkLCBib2R5LmlkKSwgeyBib2R5LCByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRDaGFubmVsUG9zaXRpb25zKGd1aWxkSWQsIGJvZHkpIHtcbiAgICAgIGF3YWl0IHJlc3QucGF0Y2gocmVzdC5yb3V0ZXMuZ3VpbGRzLmNoYW5uZWxzKGd1aWxkSWQpLCB7IGJvZHkgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRFbW9qaShndWlsZElkLCBpZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaShndWlsZElkLCBpZCksIHsgYm9keSwgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0QXBwbGljYXRpb25FbW9qaShpZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbkVtb2ppKHJlc3QuYXBwbGljYXRpb25JZCwgaWQpLCB7IGJvZHkgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG1lc3NhZ2VJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMubWVzc2FnZShyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuLCBtZXNzYWdlSWQpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGZpbGVzOiBib2R5LmZpbGVzLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kKHJlc3QuYXBwbGljYXRpb25JZCwgY29tbWFuZElkKSwgeyBib2R5IH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGQoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkR3VpbGQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ndWlsZChndWlsZElkKSwgeyBib2R5LCByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSwge1xuICAgICAgICBib2R5LFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkVGVtcGxhdGUoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlOiBzdHJpbmcsIGJvZHk6IE1vZGlmeUd1aWxkVGVtcGxhdGUpOiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+IHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5ndWlsZChndWlsZElkLCB0ZW1wbGF0ZUNvZGUpLCB7IGJvZHkgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgYm9keSwgZmlsZXM6IGJvZHkuZmlsZXMgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4sIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCB7XG4gICAgICAgIGJvZHksXG4gICAgICAgIGZpbGVzOiBib2R5LmZpbGVzLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE93blZvaWNlU3RhdGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgYXdhaXQgcmVzdC5wYXRjaChyZXN0LnJvdXRlcy5ndWlsZHMudm9pY2UoZ3VpbGRJZCksIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgcmVxdWVzdFRvU3BlYWtUaW1lc3RhbXA6IG9wdGlvbnMucmVxdWVzdFRvU3BlYWtUaW1lc3RhbXBcbiAgICAgICAgICAgID8gbmV3IERhdGUob3B0aW9ucy5yZXF1ZXN0VG9TcGVha1RpbWVzdGFtcCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgOiBvcHRpb25zLnJlcXVlc3RUb1NwZWFrVGltZXN0YW1wLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRTY2hlZHVsZWRFdmVudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudChndWlsZElkLCBldmVudElkKSwgeyBib2R5LCByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRSb2xlKGd1aWxkSWQsIHJvbGVJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkUm9sZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm9uZShndWlsZElkLCByb2xlSWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFJvbGVQb3NpdGlvbnMoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkUm9sZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMuYWxsKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFN0YWdlSW5zdGFuY2UoY2hhbm5lbElkLCB0b3BpYywgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2UoY2hhbm5lbElkKSwgeyBib2R5OiB7IHRvcGljIH0sIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFVzZXJWb2ljZVN0YXRlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHJlc3QucGF0Y2gocmVzdC5yb3V0ZXMuZ3VpbGRzLnZvaWNlKGd1aWxkSWQsIG9wdGlvbnMudXNlcklkKSwgeyBib2R5OiBvcHRpb25zIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2ViaG9vayh3ZWJob29rSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCksIHsgYm9keSwgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3MubWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIGZpbGVzOiBvcHRpb25zLmZpbGVzLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbiwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbiksIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWxjb21lU2NyZWVuKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlbGNvbWVTY3JlZW4+KHJlc3Qucm91dGVzLmd1aWxkcy53ZWxjb21lKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFdpZGdldFNldHRpbmdzKGd1aWxkSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEd1aWxkV2lkZ2V0U2V0dGluZ3M+KHJlc3Qucm91dGVzLmd1aWxkcy53aWRnZXQoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBleGVjdXRlV2ViaG9vayh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBmb2xsb3dBbm5vdW5jZW1lbnQoc291cmNlQ2hhbm5lbElkLCB0YXJnZXRDaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkRm9sbG93ZWRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5mb2xsb3coc291cmNlQ2hhbm5lbElkKSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgd2ViaG9va0NoYW5uZWxJZDogdGFyZ2V0Q2hhbm5lbElkLFxuICAgICAgICB9LFxuICAgICAgICByZWFzb24sXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QWN0aXZlVGhyZWFkcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBY3RpdmVUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmFjdGl2ZShndWlsZElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb24oZ3VpbGRJZCwgY29tbWFuZElkLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogT21pdDxNYWtlUmVxdWVzdE9wdGlvbnMsICdib2R5Jz4gPSB7fTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLnVuYXV0aG9yaXplZCA9IHRydWU7XG4gICAgICAgIHJlc3RPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke29wdGlvbnMuYWNjZXNzVG9rZW59YCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb24ob3B0aW9ucz8uYXBwbGljYXRpb25JZCA/PyByZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCksXG4gICAgICAgIHJlc3RPcHRpb25zLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgY29uc3QgcmVzdE9wdGlvbnM6IE9taXQ8TWFrZVJlcXVlc3RPcHRpb25zLCAnYm9keSc+ID0ge307XG5cbiAgICAgIGlmIChvcHRpb25zPy5hY2Nlc3NUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlO1xuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmFjY2Vzc1Rva2VufWAsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uc1tdPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb25zKG9wdGlvbnM/LmFwcGxpY2F0aW9uSWQgPz8gcmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkKSxcbiAgICAgICAgcmVzdE9wdGlvbnMsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBcHBsaWNhdGlvbkluZm8oKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uPihyZXN0LnJvdXRlcy5vYXV0aDIuYXBwbGljYXRpb24oKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBcHBsaWNhdGlvbkluZm8oYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEFwcGxpY2F0aW9uPihyZXN0LnJvdXRlcy5hcHBsaWNhdGlvbigpLCB7XG4gICAgICAgIGJvZHksXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q3VycmVudEF1dGhlbnRpY2F0aW9uSW5mbyh0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRDdXJyZW50QXV0aG9yaXphdGlvbj4ocmVzdC5yb3V0ZXMub2F1dGgyLmN1cnJlbnRBdXRob3JpemF0aW9uKCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZXhjaGFuZ2VUb2tlbihjbGllbnRJZCwgY2xpZW50U2VjcmV0LCBib2R5KSB7XG4gICAgICBjb25zdCBiYXNpY0NyZWRlbnRpYWxzID0gQnVmZmVyLmZyb20oYCR7Y2xpZW50SWR9OiR7Y2xpZW50U2VjcmV0fWApO1xuXG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCYXNpYyAke2Jhc2ljQ3JlZGVudGlhbHMudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsXG4gICAgICAgIH0sXG4gICAgICAgIHJ1blRocm91Z2hRdWV1ZTogZmFsc2UsXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChib2R5LmdyYW50VHlwZSA9PT0gJ2NsaWVudF9jcmVkZW50aWFscycpIHtcbiAgICAgICAgcmVzdE9wdGlvbnMuYm9keS5zY29wZSA9IGJvZHkuc2NvcGUuam9pbignICcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBY2Nlc3NUb2tlblJlc3BvbnNlPihyZXN0LnJvdXRlcy5vYXV0aDIudG9rZW5FeGNoYW5nZSgpLCByZXN0T3B0aW9ucyk7XG4gICAgfSxcblxuICAgIGFzeW5jIHJldm9rZVRva2VuKGNsaWVudElkLCBjbGllbnRTZWNyZXQsIGJvZHkpIHtcbiAgICAgIGNvbnN0IGJhc2ljQ3JlZGVudGlhbHMgPSBCdWZmZXIuZnJvbShgJHtjbGllbnRJZH06JHtjbGllbnRTZWNyZXR9YCk7XG5cbiAgICAgIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5vYXV0aDIudG9rZW5SZXZva2UoKSwge1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCYXNpYyAke2Jhc2ljQ3JlZGVudGlhbHMudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBdWRpdExvZyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEF1ZGl0TG9nPihyZXN0LnJvdXRlcy5ndWlsZHMuYXVkaXRsb2dzKGd1aWxkSWQsIG9wdGlvbnMpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZShndWlsZElkLCBydWxlSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXV0b21vZFJ1bGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlW10+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGVzKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXZhaWxhYmxlVm9pY2VSZWdpb25zKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWb2ljZVJlZ2lvbltdPihyZXN0LnJvdXRlcy5yZWdpb25zKCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRCYW4oZ3VpbGRJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEJhbj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYmFuKGd1aWxkSWQsIHVzZXJJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRCYW5zKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQmFuW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbnMoZ3VpbGRJZCwgb3B0aW9ucykpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsKGlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoaWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q2hhbm5lbEludml0ZXMoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmludml0ZXMoY2hhbm5lbElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ2hhbm5lbFtdPihyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsV2ViaG9va3MoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2tbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMud2ViaG9va3MoY2hhbm5lbElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldERtQ2hhbm5lbCh1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmRtKCksIHtcbiAgICAgICAgYm9keTogeyByZWNpcGllbnRJZDogdXNlcklkIH0sXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3JvdXBEbUNoYW5uZWwoYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZG0oKSwge1xuICAgICAgICBib2R5LFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEVtb2ppKGd1aWxkSWQsIGVtb2ppSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaShndWlsZElkLCBlbW9qaUlkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uRW1vamkoZW1vamlJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25FbW9qaShyZXN0LmFwcGxpY2F0aW9uSWQsIGVtb2ppSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0RW1vamlzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkRW1vamlbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppcyhndWlsZElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uRW1vamlzKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PHsgaXRlbXM6IERpc2NvcmRFbW9qaVtdIH0+KHJlc3Qucm91dGVzLmFwcGxpY2F0aW9uRW1vamlzKHJlc3QuYXBwbGljYXRpb25JZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSwgeyB1bmF1dGhvcml6ZWQ6IHRydWUgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdhdGV3YXlCb3QoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEdldEdhdGV3YXlCb3Q+KHJlc3Qucm91dGVzLmdhdGV3YXlCb3QoKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZChyZXN0LmFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQsIG9wdGlvbnM/LndpdGhMb2NhbGl6YXRpb25zKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkKGd1aWxkSWQsIG9wdGlvbnMgPSB7IGNvdW50czogdHJ1ZSB9KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkPihyZXN0LnJvdXRlcy5ndWlsZHMuZ3VpbGQoZ3VpbGRJZCwgb3B0aW9ucy5jb3VudHMpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRzKHRva2VuLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCBtYWtlUmVxdWVzdE9wdGlvbnM6IE1ha2VSZXF1ZXN0T3B0aW9ucyB8IHVuZGVmaW5lZCA9IHRva2VuXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PFBhcnRpYWw8RGlzY29yZEd1aWxkPltdPihyZXN0LnJvdXRlcy5ndWlsZHMudXNlckd1aWxkcyhvcHRpb25zKSwgbWFrZVJlcXVlc3RPcHRpb25zKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5vbmUocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KFxuICAgICAgICByZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLmFsbChyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIG9wdGlvbnM/LndpdGhMb2NhbGl6YXRpb25zKSxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkUHJldmlldyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkUHJldmlldz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnByZXZpZXcoZ3VpbGRJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFRlbXBsYXRlKHRlbXBsYXRlQ29kZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5jb2RlKHRlbXBsYXRlQ29kZSkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHdWlsZFRlbXBsYXRlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRlbXBsYXRlW10+KHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuYWxsKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRXZWJob29rcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2tbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndlYmhvb2tzKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW50ZWdyYXRpb25zKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkSW50ZWdyYXRpb25bXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludGVncmF0aW9ucyhndWlsZElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEludml0ZShpbnZpdGVDb2RlLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhPihyZXN0LnJvdXRlcy5ndWlsZHMuaW52aXRlKGludml0ZUNvZGUsIG9wdGlvbnMpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW52aXRlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGVzKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldE1lc3NhZ2VzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2VzKGNoYW5uZWxJZCwgb3B0aW9ucykpO1xuICAgIH0sXG5cbiAgICBhc3luYyBzZWFyY2hHdWlsZE1lc3NhZ2VzKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU2VhcmNoR3VpbGRNZXNzYWdlcyB8IERpc2NvcmRTZWFyY2hHdWlsZE1lc3NhZ2VzSW5kZXhpbmc+KHJlc3Qucm91dGVzLmd1aWxkcy5tZXNzYWdlc1NlYXJjaChndWlsZElkLCBvcHRpb25zKSk7XG4gICAgfSxcbiAgICBhc3luYyBnZXRTdGlja2VyUGFjayhzdGlja2VyUGFja0lkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXJQYWNrPihyZXN0LnJvdXRlcy5zdGlja2VyUGFjayhzdGlja2VyUGFja0lkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN0aWNrZXJQYWNrcygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlclBhY2tbXT4ocmVzdC5yb3V0ZXMuc3RpY2tlclBhY2tzKCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5vcmlnaW5hbChyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSwgeyB1bmF1dGhvcml6ZWQ6IHRydWUgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxQaW5zKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2VQaW5zKGNoYW5uZWxJZCwgb3B0aW9ucykpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQaW5uZWRNZXNzYWdlcyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZVtdPihyZXN0LnJvdXRlcy5jaGFubmVscy5waW5zKGNoYW5uZWxJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQcml2YXRlQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnByaXZhdGUoY2hhbm5lbElkLCBvcHRpb25zKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFByaXZhdGVKb2luZWRBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMuam9pbmVkKGNoYW5uZWxJZCwgb3B0aW9ucykpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQcnVuZUNvdW50KGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkUHJ1bmVkQ291bnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5wcnVuZShndWlsZElkLCBvcHRpb25zKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFB1YmxpY0FyY2hpdmVkVGhyZWFkcyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTGlzdEFyY2hpdmVkVGhyZWFkcz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5wdWJsaWMoY2hhbm5lbElkLCBvcHRpb25zKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFJvbGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkUm9sZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMuYWxsKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Um9sZShndWlsZElkLCByb2xlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkUm9sZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm9uZShndWlsZElkLCByb2xlSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTY2hlZHVsZWRFdmVudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudChndWlsZElkLCBldmVudElkLCBvcHRpb25zPy53aXRoVXNlckNvdW50KSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNjaGVkdWxlZEV2ZW50cyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNjaGVkdWxlZEV2ZW50W10+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnRzKGd1aWxkSWQsIG9wdGlvbnM/LndpdGhVc2VyQ291bnQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2NoZWR1bGVkRXZlbnRVc2VycyhndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8QXJyYXk8eyB1c2VyOiBEaXNjb3JkVXNlcjsgbWVtYmVyPzogRGlzY29yZE1lbWJlciB9Pj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy51c2VycyhndWlsZElkLCBldmVudElkLCBvcHRpb25zKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNlc3Npb25JbmZvKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0R2F0ZXdheUJvdCgpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTdGFnZUluc3RhbmNlKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGFnZUluc3RhbmNlPihyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZShjaGFubmVsSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0T3duVm9pY2VTdGF0ZShndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZvaWNlU3RhdGU+KHJlc3Qucm91dGVzLmd1aWxkcy52b2ljZShndWlsZElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFVzZXJWb2ljZVN0YXRlKGd1aWxkSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWb2ljZVN0YXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudm9pY2UoZ3VpbGRJZCwgdXNlcklkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN0aWNrZXIoc3RpY2tlcklkOiBCaWdTdHJpbmcpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuc3RpY2tlcihzdGlja2VySWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRTdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5ndWlsZHMuc3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRTdGlja2VycyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXJbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXJzKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRocmVhZE1lbWJlcj4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5nZXRVc2VyKGNoYW5uZWxJZCwgdXNlcklkLCBvcHRpb25zKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFRocmVhZE1lbWJlcnMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRocmVhZE1lbWJlcltdPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lbWJlcnMoY2hhbm5lbElkLCBvcHRpb25zKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFJlYWN0aW9ucyhjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVXNlcltdPihyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24sIG9wdGlvbnMpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VXNlcihpZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRVc2VyPihyZXN0LnJvdXRlcy51c2VyKGlkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEN1cnJlbnRVc2VyKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFVzZXI+KHJlc3Qucm91dGVzLmN1cnJlbnRVc2VyKCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VXNlckNvbm5lY3Rpb25zKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZENvbm5lY3Rpb25bXT4ocmVzdC5yb3V0ZXMub2F1dGgyLmNvbm5lY3Rpb25zKCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VXNlckFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24odG9rZW4sIGFwcGxpY2F0aW9uSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbj4ocmVzdC5yb3V0ZXMub2F1dGgyLnJvbGVDb25uZWN0aW9ucyhhcHBsaWNhdGlvbklkKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRWYW5pdHlVcmwoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWYW5pdHlVcmw+KHJlc3Qucm91dGVzLmd1aWxkcy52YW5pdHkoZ3VpbGRJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRWb2ljZVJlZ2lvbnMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWb2ljZVJlZ2lvbltdPihyZXN0LnJvdXRlcy5ndWlsZHMucmVnaW9ucyhndWlsZElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2sod2ViaG9va0lkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3MubWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpLCB7XG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuKSwge1xuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2VsY29tZVNjcmVlbihndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlbGNvbWVTY3JlZW4+KHJlc3Qucm91dGVzLmd1aWxkcy53ZWxjb21lKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2lkZ2V0KGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRXaWRnZXQ+KHJlc3Qucm91dGVzLmd1aWxkcy53aWRnZXRKc29uKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2lkZ2V0U2V0dGluZ3MoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZFdpZGdldFNldHRpbmdzPihyZXN0LnJvdXRlcy5ndWlsZHMud2lkZ2V0KGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgam9pblRocmVhZChjaGFubmVsSWQpIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWUoY2hhbm5lbElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGxlYXZlR3VpbGQoZ3VpbGRJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmxlYXZlKGd1aWxkSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgbGVhdmVUaHJlYWQoY2hhbm5lbElkKSB7XG4gICAgICBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lKGNoYW5uZWxJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBwdWJsaXNoTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY3Jvc3Nwb3N0KGNoYW5uZWxJZCwgbWVzc2FnZUlkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIHJlbW92ZVJvbGUoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm1lbWJlcihndWlsZElkLCB1c2VySWQsIHJvbGVJZCksIHsgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyByZW1vdmVUaHJlYWRNZW1iZXIoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMudXNlcihjaGFubmVsSWQsIHVzZXJJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyByZW1vdmVEbVJlY2lwaWVudChjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZG1SZWNpcGllbnQoY2hhbm5lbElkLCB1c2VySWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIGZpbGVzOiBvcHRpb25zLmZpbGVzLFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZEludGVyYWN0aW9uUmVzcG9uc2UoaW50ZXJhY3Rpb25JZCwgdG9rZW4sIG9wdGlvbnMsIHBhcmFtcykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDx2b2lkIHwgRGlzY29yZEludGVyYWN0aW9uQ2FsbGJhY2tSZXNwb25zZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5jYWxsYmFjayhpbnRlcmFjdGlvbklkLCB0b2tlbiwgcGFyYW1zKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICBmaWxlczogb3B0aW9ucy5kYXRhPy5maWxlcyxcbiAgICAgICAgcnVuVGhyb3VnaFF1ZXVlOiBmYWxzZSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRNZXNzYWdlKGNoYW5uZWxJZCwgYm9keSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZXMoY2hhbm5lbElkKSwgeyBib2R5LCBmaWxlczogYm9keS5maWxlcyB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc3RhcnRUaHJlYWRXaXRoTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc3RhcnRUaHJlYWRXaXRob3V0TWVzc2FnZShjaGFubmVsSWQsIGJvZHksIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5hbGwoY2hhbm5lbElkKSwgeyBib2R5LCByZWFzb24gfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFBvbGxBbnN3ZXJWb3RlcnMoY2hhbm5lbElkLCBtZXNzYWdlSWQsIGFuc3dlcklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEdldEFuc3dlclZvdGVzUmVzcG9uc2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnBvbGxzLnZvdGVzKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBhbnN3ZXJJZCwgb3B0aW9ucykpO1xuICAgIH0sXG5cbiAgICBhc3luYyBlbmRQb2xsKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5wb2xscy5leHBpcmUoY2hhbm5lbElkLCBtZXNzYWdlSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc3luY0d1aWxkVGVtcGxhdGUoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5hbGwoZ3VpbGRJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBiYW5NZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCBib2R5LCByZWFzb24pIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0PHZvaWQ+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgYnVsa0Jhbk1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRCdWxrQmFuPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5idWxrQmFuKGd1aWxkSWQpLCB7IGJvZHk6IG9wdGlvbnMsIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEN1cnJlbnRNZW1iZXIoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVtYmVyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5ib3QoZ3VpbGRJZCksIHsgYm9keSwgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0TWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVtYmVyV2l0aFVzZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Q3VycmVudE1lbWJlcihndWlsZElkLCB0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuY3VycmVudE1lbWJlcihndWlsZElkKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldE1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXJzKGd1aWxkSWQsIG9wdGlvbnMpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25BY3Rpdml0eUluc3RhbmNlKGFwcGxpY2F0aW9uSWQsIGluc3RhbmNlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQWN0aXZpdHlJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25BY3Rpdml0eUluc3RhbmNlKGFwcGxpY2F0aW9uSWQsIGluc3RhbmNlSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMga2lja01lbWJlcihndWlsZElkLCB1c2VySWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCksIHtcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIHBpbk1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZVBpbihjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBwcnVuZU1lbWJlcnMoZ3VpbGRJZCwgYm9keSwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PHsgcHJ1bmVkOiBudW1iZXIgfCBudWxsIH0+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLnBydW5lKGd1aWxkSWQpLCB7IGJvZHksIHJlYXNvbiB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VhcmNoTWVtYmVycyhndWlsZElkLCBxdWVyeSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5zZWFyY2goZ3VpbGRJZCwgcXVlcnksIG9wdGlvbnMpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRPbmJvYXJkaW5nKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRPbmJvYXJkaW5nPihyZXN0LnJvdXRlcy5ndWlsZHMub25ib2FyZGluZyhndWlsZElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZE9uYm9hcmRpbmcoZ3VpbGRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEd1aWxkT25ib2FyZGluZz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm9uYm9hcmRpbmcoZ3VpbGRJZCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIG1vZGlmeUd1aWxkSW5jaWRlbnRBY3Rpb25zKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkSW5jaWRlbnRzRGF0YT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmluY2lkZW50QWN0aW9ucyhndWlsZElkKSwgeyBib2R5OiBvcHRpb25zIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyB1bmJhbk1lbWJlcihndWlsZElkLCB1c2VySWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMuYmFuKGd1aWxkSWQsIHVzZXJJZCksIHsgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyB1bnBpbk1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYXNvbikge1xuICAgICAgYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZVBpbihjaGFubmVsSWQsIG1lc3NhZ2VJZCksIHsgcmVhc29uIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyB0cmlnZ2VyVHlwaW5nSW5kaWNhdG9yKGNoYW5uZWxJZCkge1xuICAgICAgYXdhaXQgcmVzdC5wb3N0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnR5cGluZyhjaGFubmVsSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBzZXJ0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyhib2R5LCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0geyBib2R5IH07XG5cbiAgICAgIGlmIChvcHRpb25zPy5iZWFyZXJUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlO1xuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmJlYXJlclRva2VufWAsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQpLCByZXN0T3B0aW9ucyk7XG4gICAgfSxcblxuICAgIGFzeW5jIHVwc2VydEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyhndWlsZElkLCBib2R5LCBvcHRpb25zKSB7XG4gICAgICBjb25zdCByZXN0T3B0aW9uczogTWFrZVJlcXVlc3RPcHRpb25zID0geyBib2R5IH07XG5cbiAgICAgIGlmIChvcHRpb25zPy5iZWFyZXJUb2tlbikge1xuICAgICAgICByZXN0T3B0aW9ucy51bmF1dGhvcml6ZWQgPSB0cnVlO1xuICAgICAgICByZXN0T3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtvcHRpb25zLmJlYXJlclRva2VufWAsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCksIHJlc3RPcHRpb25zKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFVzZXJBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uKHRva2VuLCBhcHBsaWNhdGlvbklkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEFwcGxpY2F0aW9uUm9sZUNvbm5lY3Rpb24+KHJlc3Qucm91dGVzLm9hdXRoMi5yb2xlQ29ubmVjdGlvbnMoYXBwbGljYXRpb25JZCksIHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgICB1bmF1dGhvcml6ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQ3VycmVudFVzZXJBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uKGJlYXJlclRva2VuLCBhcHBsaWNhdGlvbklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMub2F1dGgyLnJvbGVDb25uZWN0aW9ucyhhcHBsaWNhdGlvbklkKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke2JlYXJlclRva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBhZGRHdWlsZE1lbWJlcihndWlsZElkLCB1c2VySWQsIGJvZHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSwge1xuICAgICAgICBib2R5LFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVRlc3RFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBib2R5KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRFbnRpdGxlbWVudD4ocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLmVudGl0bGVtZW50cyhhcHBsaWNhdGlvbklkKSwge1xuICAgICAgICBib2R5LFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3RFbnRpdGxlbWVudHMoYXBwbGljYXRpb25JZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbnRpdGxlbWVudFtdPihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uZW50aXRsZW1lbnRzKGFwcGxpY2F0aW9uSWQsIG9wdGlvbnMpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0RW50aXRsZW1lbnQoYXBwbGljYXRpb25JZCwgZW50aXRsZW1lbnRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbnRpdGxlbWVudD4ocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLmVudGl0bGVtZW50KGFwcGxpY2F0aW9uSWQsIGVudGl0bGVtZW50SWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlVGVzdEVudGl0bGVtZW50KGFwcGxpY2F0aW9uSWQsIGVudGl0bGVtZW50SWQpIHtcbiAgICAgIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5lbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGNvbnN1bWVFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSB7XG4gICAgICBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMubW9uZXRpemF0aW9uLmNvbnN1bWVFbnRpdGxlbWVudChhcHBsaWNhdGlvbklkLCBlbnRpdGxlbWVudElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3RTa3VzKGFwcGxpY2F0aW9uSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU2t1W10+KHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5za3VzKGFwcGxpY2F0aW9uSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdFN1YnNjcmlwdGlvbnMoc2t1SWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3Vic2NyaXB0aW9uW10+KHJlc3Qucm91dGVzLm1vbmV0aXphdGlvbi5zdWJzY3JpcHRpb25zKHNrdUlkLCBvcHRpb25zKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFN1YnNjcmlwdGlvbihza3VJZCwgc3Vic2NyaXB0aW9uSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3Vic2NyaXB0aW9uPihyZXN0LnJvdXRlcy5tb25ldGl6YXRpb24uc3Vic2NyaXB0aW9uKHNrdUlkLCBzdWJzY3JpcHRpb25JZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kU291bmRib2FyZFNvdW5kKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgYXdhaXQgcmVzdC5wb3N0KHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuc2VuZFNvdW5kKGNoYW5uZWxJZCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0RGVmYXVsdFNvdW5kYm9hcmRTb3VuZHMoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNvdW5kYm9hcmRTb3VuZFtdPihyZXN0LnJvdXRlcy5zb3VuZGJvYXJkLmxpc3REZWZhdWx0KCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0R3VpbGRTb3VuZGJvYXJkU291bmRzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDx7IGl0ZW1zOiBEaXNjb3JkU291bmRib2FyZFNvdW5kW10gfT4ocmVzdC5yb3V0ZXMuc291bmRib2FyZC5ndWlsZFNvdW5kcyhndWlsZElkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkU291bmRib2FyZFNvdW5kKGd1aWxkSWQsIHNvdW5kSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU291bmRib2FyZFNvdW5kPihyZXN0LnJvdXRlcy5zb3VuZGJvYXJkLmd1aWxkU291bmQoZ3VpbGRJZCwgc291bmRJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZFNvdW5kYm9hcmRTb3VuZChndWlsZElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFNvdW5kYm9hcmRTb3VuZD4ocmVzdC5yb3V0ZXMuc291bmRib2FyZC5ndWlsZFNvdW5kcyhndWlsZElkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICByZWFzb24sXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgbW9kaWZ5R3VpbGRTb3VuZGJvYXJkU291bmQoZ3VpbGRJZCwgc291bmRJZCwgb3B0aW9ucywgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTb3VuZGJvYXJkU291bmQ+KHJlc3Qucm91dGVzLnNvdW5kYm9hcmQuZ3VpbGRTb3VuZChndWlsZElkLCBzb3VuZElkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICByZWFzb24sXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRTb3VuZGJvYXJkU291bmQoZ3VpbGRJZCwgc291bmRJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuc291bmRib2FyZC5ndWlsZFNvdW5kKGd1aWxkSWQsIHNvdW5kSWQpLCB7XG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0QXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbnNNZXRhZGF0YVJlY29yZHMoYXBwbGljYXRpb25JZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uTWV0YWRhdGFbXT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbk1ldGFkYXRhKGFwcGxpY2F0aW9uSWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBkYXRlQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbnNNZXRhZGF0YVJlY29yZHMoYXBwbGljYXRpb25JZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uTWV0YWRhdGFbXT4ocmVzdC5yb3V0ZXMuYXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbk1ldGFkYXRhKGFwcGxpY2F0aW9uSWQpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlTG9iYnkob3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTG9iYnk+KHJlc3Qucm91dGVzLmxvYmJ5LmNyZWF0ZSgpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TG9iYnkobG9iYnlJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMb2JieT4ocmVzdC5yb3V0ZXMubG9iYnkubG9iYnkobG9iYnlJZCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBtb2RpZnlMb2JieShsb2JieUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTG9iYnk+KHJlc3Qucm91dGVzLmxvYmJ5LmxvYmJ5KGxvYmJ5SWQpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlTG9iYnkobG9iYnlJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmxvYmJ5LmxvYmJ5KGxvYmJ5SWQpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkTWVtYmVyVG9Mb2JieShsb2JieUlkLCB1c2VySWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkTG9iYnlNZW1iZXI+KHJlc3Qucm91dGVzLmxvYmJ5Lm1lbWJlcihsb2JieUlkLCB1c2VySWQpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgYnVsa1VwZGF0ZUxvYmJ5TWVtYmVycyhsb2JieUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRMb2JieU1lbWJlcltdPihyZXN0LnJvdXRlcy5sb2JieS5tZW1iZXJzQnVsayhsb2JieUlkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIHJlbW92ZU1lbWJlckZyb21Mb2JieShsb2JieUlkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5sb2JieS5tZW1iZXIobG9iYnlJZCwgdXNlcklkKSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGxlYXZlTG9iYnkobG9iYnlJZCwgYmVhcmVyVG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5sb2JieS5sZWF2ZShsb2JieUlkKSwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke2JlYXJlclRva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBsaW5rQ2hhbm5lbFRvTG9iYnkobG9iYnlJZCwgYmVhcmVyVG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRMb2JieT4ocmVzdC5yb3V0ZXMubG9iYnkubGluayhsb2JieUlkKSwge1xuICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke2JlYXJlclRva2VufWAsXG4gICAgICAgIH0sXG4gICAgICAgIHVuYXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyB1bmxpbmtDaGFubmVsVG9Mb2JieShsb2JieUlkLCBiZWFyZXJUb2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZExvYmJ5PihyZXN0LnJvdXRlcy5sb2JieS5saW5rKGxvYmJ5SWQpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YmVhcmVyVG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIHVwZGF0ZUxvYmJ5TWVzc2FnZU1vZGVyYXRpb25NZXRhZGF0YShsb2JieUlkLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmxvYmJ5Lm1vZGVyYXRpb25NZXRhZGF0YShsb2JieUlkLCBtZXNzYWdlSWQpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgY3JlYXRlT3JKb2luTG9iYnkob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHJlc3QucHV0PERpc2NvcmRMb2JieT4ocmVzdC5yb3V0ZXMubG9iYnkuY3JlYXRlKCksIHtcbiAgICAgICAgYm9keTogb3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBzZW5kTG9iYnlNZXNzYWdlKGJlYXJlclRva2VuLCBsb2JieUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gcmVzdC5wb3N0PERpc2NvcmRMb2JieU1lc3NhZ2U+KHJlc3Qucm91dGVzLmxvYmJ5Lm1lc3NhZ2VzKGxvYmJ5SWQpLCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YmVhcmVyVG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGdldExvYmJ5TWVzc2FnZXMoYmVhcmVyVG9rZW4sIGxvYmJ5SWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiByZXN0LmdldDxEaXNjb3JkTG9iYnlNZXNzYWdlW10+KHJlc3Qucm91dGVzLmxvYmJ5Lm1lc3NhZ2VzKGxvYmJ5SWQsIG9wdGlvbnMpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YmVhcmVyVG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGNyZWF0ZUxvYmJ5Q2hhbm5lbEludml0ZUZvclNlbGYoYmVhcmVyVG9rZW4sIGxvYmJ5SWQpIHtcbiAgICAgIHJldHVybiByZXN0LnBvc3Q8RGlzY29yZExvYmJ5SW52aXRlPihyZXN0LnJvdXRlcy5sb2JieS5pbnZpdGVTZWxmKGxvYmJ5SWQpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YmVhcmVyVG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgICAgdW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGNyZWF0ZUxvYmJ5Q2hhbm5lbEludml0ZUZvclVzZXIobG9iYnlJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gcmVzdC5wb3N0PERpc2NvcmRMb2JieUludml0ZT4ocmVzdC5yb3V0ZXMubG9iYnkuaW52aXRlVXNlcihsb2JieUlkLCB1c2VySWQpKTtcbiAgICB9LFxuXG4gICAgcHJlZmVyU25ha2VDYXNlKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgIGNvbnN0IGNhbWVsaXplciA9IGVuYWJsZWQgPyAoeDogYW55KSA9PiB4IDogY2FtZWxpemU7XG5cbiAgICAgIHJlc3QuZ2V0ID0gYXN5bmMgKHVybCwgb3B0aW9ucykgPT4ge1xuICAgICAgICByZXR1cm4gY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0dFVCcsIHVybCwgb3B0aW9ucykpO1xuICAgICAgfTtcblxuICAgICAgcmVzdC5wb3N0ID0gYXN5bmMgKHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikgPT4ge1xuICAgICAgICByZXR1cm4gY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BPU1QnLCB1cmwsIG9wdGlvbnMpKTtcbiAgICAgIH07XG5cbiAgICAgIHJlc3QuZGVsZXRlID0gYXN5bmMgKHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikgPT4ge1xuICAgICAgICBjYW1lbGl6ZXIoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnREVMRVRFJywgdXJsLCBvcHRpb25zKSk7XG4gICAgICB9O1xuXG4gICAgICByZXN0LnBhdGNoID0gYXN5bmMgKHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikgPT4ge1xuICAgICAgICByZXR1cm4gY2FtZWxpemVyKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BBVENIJywgdXJsLCBvcHRpb25zKSk7XG4gICAgICB9O1xuXG4gICAgICByZXN0LnB1dCA9IGFzeW5jICh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pID0+IHtcbiAgICAgICAgcmV0dXJuIGNhbWVsaXplcihhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQVVQnLCB1cmwsIG9wdGlvbnMpKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiByZXN0O1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIHJlc3Q7XG59XG5cbmVudW0gSHR0cFJlc3BvbnNlQ29kZSB7XG4gIC8qKiBNaW5pbXVtIHZhbHVlIG9mIGEgY29kZSBpbiBvZGVyIHRvIGNvbnNpZGVyIHRoYXQgaXQgd2FzIHN1Y2Nlc3NmdWwuICovXG4gIFN1Y2Nlc3MgPSAyMDAsXG4gIC8qKiBSZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIGJ1dCBEaXNjb3JkIHJldHVybmVkIGFuIGVtcHR5IGJvZHkuICovXG4gIE5vQ29udGVudCA9IDIwNCxcbiAgLyoqIE1pbmltdW0gdmFsdWUgb2YgYSBjb2RlIGluIG9yZGVyIHRvIGNvbnNpZGVyIHRoYXQgc29tZXRoaW5nIHdlbnQgd3JvbmcuICovXG4gIEVycm9yID0gNDAwLFxuICAvKiogVGhpcyByZXF1ZXN0IGdvdCByYXRlIGxpbWl0ZWQuICovXG4gIFRvb01hbnlSZXF1ZXN0cyA9IDQyOSxcbn1cblxuLyoqIFdoZXRoZXIgYW4gZXJyb3IgaXMgdGhlIGBUaW1lb3V0RXJyb3JgIHRocm93biBieSBgQWJvcnRTaWduYWwudGltZW91dCgpYC4gKi9cbmZ1bmN0aW9uIGlzVGltZW91dEVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJiBlcnJvci5uYW1lID09PSAnVGltZW91dEVycm9yJztcbn1cbiJdLCJuYW1lcyI6WyJCdWZmZXIiLCJpbnNwZWN0IiwiY2FtZWxpemUiLCJjYW1lbFRvU25ha2VDYXNlIiwiRElTQ09SREVOT19WRVJTSU9OIiwiZGVsYXkiLCJnZXRCb3RJZEZyb21Ub2tlbiIsImhhc1Byb3BlcnR5IiwibG9nZ2VyIiwicHJvY2Vzc1JlYWN0aW9uU3RyaW5nIiwic25vd2ZsYWtlVG9UaW1lc3RhbXAiLCJ1cmxUb0Jhc2U2NCIsImNyZWF0ZUludmFsaWRSZXF1ZXN0QnVja2V0IiwiUXVldWUiLCJjcmVhdGVSb3V0ZXMiLCJESVNDT1JEX0FQSV9WRVJTSU9OIiwiRElTQ09SRF9BUElfVVJMIiwiQVVESVRfTE9HX1JFQVNPTl9IRUFERVIiLCJSQVRFX0xJTUlUX1JFTUFJTklOR19IRUFERVIiLCJSQVRFX0xJTUlUX1JFU0VUX0FGVEVSX0hFQURFUiIsIlJBVEVfTElNSVRfR0xPQkFMX0hFQURFUiIsIlJBVEVfTElNSVRfQlVDS0VUX0hFQURFUiIsIlJBVEVfTElNSVRfTElNSVRfSEVBREVSIiwiUkFURV9MSU1JVF9TQ09QRV9IRUFERVIiLCJjcmVhdGVSZXN0TWFuYWdlciIsIm9wdGlvbnMiLCJhcHBsaWNhdGlvbklkIiwiQmlnSW50IiwidG9rZW4iLCJiYXNlVXJsIiwicHJveHkiLCJyZXBsYWNlIiwiYmFzZUVycm9yUHJvdG90eXBlIiwiY3VzdG9tIiwiX2RlcHRoIiwiX2luc3BlY3QiLCJkZXB0aCIsIkluZmluaXR5IiwiY3VzdG9tSW5zcGVjdCIsInJlc3QiLCJhdXRob3JpemF0aW9uIiwiYXV0aG9yaXphdGlvbkhlYWRlciIsImRlbGV0ZVF1ZXVlRGVsYXkiLCJnbG9iYWxseVJhdGVMaW1pdGVkIiwiaW52YWxpZEJ1Y2tldCIsImlzUHJveGllZCIsInN0YXJ0c1dpdGgiLCJ1cGRhdGVCZWFyZXJUb2tlbkVuZHBvaW50IiwibWF4UmV0cnlDb3VudCIsInJlcXVlc3RUaW1lb3V0IiwicHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMiLCJxdWV1ZXMiLCJNYXAiLCJyYXRlTGltaXRlZFBhdGhzIiwidmVyc2lvbiIsImV2ZW50cyIsInJlcXVlc3QiLCJyZXNwb25zZSIsInJlcXVlc3RFcnJvciIsInJvdXRlcyIsImNyZWF0ZUJhc2VIZWFkZXJzIiwiY2hlY2tSYXRlTGltaXRzIiwidXJsIiwiaWRlbnRpZmllciIsInJhdGVsaW1pdGVkIiwiZ2V0IiwiZ2xvYmFsIiwibm93IiwiRGF0ZSIsInJlc2V0VGltZXN0YW1wIiwidXBkYXRlVG9rZW5RdWV1ZXMiLCJvbGRUb2tlbiIsIm5ld1Rva2VuIiwiRXJyb3IiLCJoZWFkZXJzIiwidW5kZWZpbmVkIiwiZmV0Y2giLCJtZXRob2QiLCJib2R5IiwiSlNPTiIsInN0cmluZ2lmeSIsIm5ld0lkZW50aWZpZXIiLCJrZXkiLCJxdWV1ZSIsImVudHJpZXMiLCJkZWxldGUiLCJuZXdLZXkiLCJuZXdRdWV1ZSIsIndhaXRpbmciLCJ1bnNoaWZ0IiwicGVuZGluZyIsImNsZWFudXAiLCJzZXQiLCJyYXRlbGltaXRQYXRoIiwiYnVja2V0SWQiLCJjaGFuZ2VUb0Rpc2NvcmRGb3JtYXQiLCJvYmoiLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJpdGVtIiwibmV3T2JqIiwiT2JqZWN0Iiwia2V5cyIsInZhbHVlIiwiaW5jbHVkZXMiLCJuYW1lX2xvY2FsaXphdGlvbnMiLCJkZXNjcmlwdGlvbl9sb2NhbGl6YXRpb25zIiwidG9TdHJpbmciLCJjcmVhdGVSZXF1ZXN0Qm9keSIsInVuYXV0aG9yaXplZCIsInJlYXNvbiIsImVuY29kZVVSSUNvbXBvbmVudCIsImZpbGVzIiwiZm9ybSIsIkZvcm1EYXRhIiwiaSIsImxlbmd0aCIsImFwcGVuZCIsImJsb2IiLCJuYW1lIiwiZm9ybUJvZHkiLCJkaXNjb3JkQm9keSIsInByb3AiLCJwdXNoIiwiam9pbiIsImFzc2lnbiIsInByb2Nlc3NSYXRlTGltaXRlZFBhdGhzIiwic2l6ZSIsInNldFRpbWVvdXQiLCJwcm9jZXNzSGVhZGVycyIsInJhdGVMaW1pdGVkIiwicmVtYWluaW5nIiwicmV0cnlBZnRlciIsInJlc2V0IiwiTnVtYmVyIiwibGltaXQiLCJoYW5kbGVDb21wbGV0ZWRSZXF1ZXN0IiwiaW50ZXJ2YWwiLCJtYXgiLCJnbG9iYWxSZXNldCIsInNlbmRSZXF1ZXN0Iiwicm91dGUiLCJwYXlsb2FkIiwicmVxdWVzdEJvZHlPcHRpb25zIiwiaGFuZGxlVGltZW91dCIsImVycm9yIiwicmV0cnlDb3VudCIsImRlYnVnIiwicmVqZWN0Iiwib2siLCJzdGF0dXMiLCJlcnJvck9iamVjdCIsInJldHJ5UmVxdWVzdCIsImxvZ2dpbmdIZWFkZXJzIiwiYXV0aG9yaXphdGlvblNjaGVtZSIsInNwbGl0IiwiUmVxdWVzdCIsInNpZ25hbCIsIkFib3J0U2lnbmFsIiwidGltZW91dCIsImNhdGNoIiwiaXNUaW1lb3V0RXJyb3IiLCJzdGF0dXNUZXh0IiwianNvbiIsInRleHQiLCJyZXF1ZXN0Qm9keSIsInJlc3BvbnNlQm9keSIsInNpbXBsaWZ5VXJsIiwicmVzZXRBZnRlciIsInJlc29sdmUiLCJyb3V0ZUluZm9ybWF0aW9uS2V5IiwicXVlcnlQYXJhbUluZGV4IiwiaW5kZXhPZiIsInNsaWNlIiwic3BsaXR0ZWRSb3V0ZSIsInN0cmlwcGVkUm91dGUiLCJwYXJ0IiwiaW5kZXgiLCJhcnJheSIsImlzTnVtYmVyIiwiaXNGaW5pdGUiLCJwYXJzZUludCIsImlzTWFqb3IiLCJlbmRzV2l0aCIsIm1lc3NhZ2VJZCIsInRpbWVzdGFtcCIsInByb2Nlc3NSZXF1ZXN0IiwicnVuVGhyb3VnaFF1ZXVlIiwicXVldWVJZGVudGlmaWVyIiwibWFrZVJlcXVlc3QiLCJidWNrZXRRdWV1ZSIsInJlc3VsdCIsImZldGNoRXJyb3IiLCJjYXVzZSIsImNyZWF0ZSIsInBhcnNlIiwiUHJvbWlzZSIsImRhdGEiLCJlcnJvclRleHQiLCJtZXNzYWdlIiwiY29kZSIsInBvc3QiLCJwYXRjaCIsInB1dCIsImFkZFJlYWN0aW9uIiwiY2hhbm5lbElkIiwicmVhY3Rpb24iLCJjaGFubmVscyIsInJlYWN0aW9ucyIsImJvdCIsImFkZFJlYWN0aW9ucyIsIm9yZGVyZWQiLCJhbGwiLCJhZGRSb2xlIiwiZ3VpbGRJZCIsInVzZXJJZCIsInJvbGVJZCIsImd1aWxkcyIsInJvbGVzIiwibWVtYmVyIiwiYWRkVGhyZWFkTWVtYmVyIiwidGhyZWFkcyIsInVzZXIiLCJhZGREbVJlY2lwaWVudCIsImRtUmVjaXBpZW50IiwiY3JlYXRlQXV0b21vZFJ1bGUiLCJhdXRvbW9kIiwicnVsZXMiLCJjcmVhdGVDaGFubmVsIiwiY3JlYXRlRW1vamkiLCJlbW9qaXMiLCJjcmVhdGVBcHBsaWNhdGlvbkVtb2ppIiwiYXBwbGljYXRpb25FbW9qaXMiLCJjcmVhdGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJyZXN0T3B0aW9ucyIsImJlYXJlclRva2VuIiwiaW50ZXJhY3Rpb25zIiwiY29tbWFuZHMiLCJjcmVhdGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImNyZWF0ZUd1aWxkU3RpY2tlciIsImZpbGUiLCJkZXNjcmlwdGlvbiIsInRhZ3MiLCJzdGlja2VycyIsImNyZWF0ZUd1aWxkVGVtcGxhdGUiLCJ0ZW1wbGF0ZXMiLCJjcmVhdGVGb3J1bVRocmVhZCIsImZvcnVtIiwiY3JlYXRlSW52aXRlIiwidGFyZ2V0VXNlcnNGaWxlIiwiaW52aXRlcyIsImdldEd1aWxkUm9sZU1lbWJlckNvdW50cyIsIm1lbWJlckNvdW50cyIsImNyZWF0ZVJvbGUiLCJjcmVhdGVTY2hlZHVsZWRFdmVudCIsImNyZWF0ZVN0YWdlSW5zdGFuY2UiLCJzdGFnZXMiLCJjcmVhdGVXZWJob29rIiwid2ViaG9va3MiLCJhdmF0YXIiLCJkZWxldGVBdXRvbW9kUnVsZSIsInJ1bGVJZCIsInJ1bGUiLCJkZWxldGVDaGFubmVsIiwiY2hhbm5lbCIsImRlbGV0ZUNoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGUiLCJvdmVyd3JpdGVJZCIsIm92ZXJ3cml0ZSIsImRlbGV0ZUVtb2ppIiwiaWQiLCJlbW9qaSIsImRlbGV0ZUFwcGxpY2F0aW9uRW1vamkiLCJhcHBsaWNhdGlvbkVtb2ppIiwiZGVsZXRlRm9sbG93dXBNZXNzYWdlIiwicmVzcG9uc2VzIiwiZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiY29tbWFuZElkIiwiY29tbWFuZCIsImRlbGV0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kIiwib25lIiwiZGVsZXRlR3VpbGRTdGlja2VyIiwic3RpY2tlcklkIiwic3RpY2tlciIsImRlbGV0ZUd1aWxkVGVtcGxhdGUiLCJ0ZW1wbGF0ZUNvZGUiLCJndWlsZCIsImRlbGV0ZUludGVncmF0aW9uIiwiaW50ZWdyYXRpb25JZCIsImludGVncmF0aW9uIiwiZGVsZXRlSW52aXRlIiwiaW52aXRlQ29kZSIsImludml0ZSIsImdldFRhcmdldFVzZXJzIiwiaW52aXRlVGFyZ2V0VXNlcnMiLCJ1cGRhdGVUYXJnZXRVc2VycyIsImdldFRhcmdldFVzZXJzSm9iU3RhdHVzIiwiaW52aXRlVGFyZ2V0VXNlcnNKb2JTdGF0dXMiLCJkZWxldGVNZXNzYWdlIiwiZGVsZXRlTWVzc2FnZXMiLCJtZXNzYWdlSWRzIiwiYnVsayIsIm1lc3NhZ2VzIiwiZGVsZXRlT3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwib3JpZ2luYWwiLCJkZWxldGVPd25SZWFjdGlvbiIsImRlbGV0ZVJlYWN0aW9uc0FsbCIsImRlbGV0ZVJlYWN0aW9uc0Vtb2ppIiwiZGVsZXRlUm9sZSIsImRlbGV0ZVNjaGVkdWxlZEV2ZW50IiwiZXZlbnRJZCIsImV2ZW50IiwiZGVsZXRlU3RhZ2VJbnN0YW5jZSIsInN0YWdlIiwiZGVsZXRlVXNlclJlYWN0aW9uIiwiZGVsZXRlV2ViaG9vayIsIndlYmhvb2tJZCIsImRlbGV0ZVdlYmhvb2tNZXNzYWdlIiwiZGVsZXRlV2ViaG9va1dpdGhUb2tlbiIsIndlYmhvb2siLCJlZGl0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9ucyIsInBlcm1pc3Npb24iLCJlZGl0QXV0b21vZFJ1bGUiLCJlZGl0Qm90UHJvZmlsZSIsImJvdEF2YXRhclVSTCIsImJhbm5lciIsImJvdEJhbm5lclVSTCIsImN1cnJlbnRVc2VyIiwidXNlcm5hbWUiLCJ0cmltIiwiZWRpdENoYW5uZWwiLCJlZGl0Q2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZXMiLCJlZGl0Q2hhbm5lbFBvc2l0aW9ucyIsImVkaXRFbW9qaSIsImVkaXRBcHBsaWNhdGlvbkVtb2ppIiwiZWRpdEZvbGxvd3VwTWVzc2FnZSIsImVkaXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJlZGl0R3VpbGQiLCJlZGl0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJlZGl0R3VpbGRTdGlja2VyIiwiZWRpdEd1aWxkVGVtcGxhdGUiLCJlZGl0TWVzc2FnZSIsImVkaXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UiLCJlZGl0T3duVm9pY2VTdGF0ZSIsInZvaWNlIiwicmVxdWVzdFRvU3BlYWtUaW1lc3RhbXAiLCJ0b0lTT1N0cmluZyIsImVkaXRTY2hlZHVsZWRFdmVudCIsImVkaXRSb2xlIiwiZWRpdFJvbGVQb3NpdGlvbnMiLCJlZGl0U3RhZ2VJbnN0YW5jZSIsInRvcGljIiwiZWRpdFVzZXJWb2ljZVN0YXRlIiwiZWRpdFdlYmhvb2siLCJlZGl0V2ViaG9va01lc3NhZ2UiLCJlZGl0V2ViaG9va1dpdGhUb2tlbiIsImVkaXRXZWxjb21lU2NyZWVuIiwid2VsY29tZSIsImVkaXRXaWRnZXRTZXR0aW5ncyIsIndpZGdldCIsImV4ZWN1dGVXZWJob29rIiwiZm9sbG93QW5ub3VuY2VtZW50Iiwic291cmNlQ2hhbm5lbElkIiwidGFyZ2V0Q2hhbm5lbElkIiwiZm9sbG93Iiwid2ViaG9va0NoYW5uZWxJZCIsImdldEFjdGl2ZVRocmVhZHMiLCJhY3RpdmUiLCJnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uIiwiYWNjZXNzVG9rZW4iLCJnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyIsImdldEFwcGxpY2F0aW9uSW5mbyIsIm9hdXRoMiIsImFwcGxpY2F0aW9uIiwiZWRpdEFwcGxpY2F0aW9uSW5mbyIsImdldEN1cnJlbnRBdXRoZW50aWNhdGlvbkluZm8iLCJjdXJyZW50QXV0aG9yaXphdGlvbiIsImV4Y2hhbmdlVG9rZW4iLCJjbGllbnRJZCIsImNsaWVudFNlY3JldCIsImJhc2ljQ3JlZGVudGlhbHMiLCJmcm9tIiwiZ3JhbnRUeXBlIiwic2NvcGUiLCJ0b2tlbkV4Y2hhbmdlIiwicmV2b2tlVG9rZW4iLCJ0b2tlblJldm9rZSIsImdldEF1ZGl0TG9nIiwiYXVkaXRsb2dzIiwiZ2V0QXV0b21vZFJ1bGUiLCJnZXRBdXRvbW9kUnVsZXMiLCJnZXRBdmFpbGFibGVWb2ljZVJlZ2lvbnMiLCJyZWdpb25zIiwiZ2V0QmFuIiwibWVtYmVycyIsImJhbiIsImdldEJhbnMiLCJiYW5zIiwiZ2V0Q2hhbm5lbCIsImdldENoYW5uZWxJbnZpdGVzIiwiZ2V0Q2hhbm5lbHMiLCJnZXRDaGFubmVsV2ViaG9va3MiLCJnZXREbUNoYW5uZWwiLCJkbSIsInJlY2lwaWVudElkIiwiZ2V0R3JvdXBEbUNoYW5uZWwiLCJnZXRFbW9qaSIsImVtb2ppSWQiLCJnZXRBcHBsaWNhdGlvbkVtb2ppIiwiZ2V0RW1vamlzIiwiZ2V0QXBwbGljYXRpb25FbW9qaXMiLCJnZXRGb2xsb3d1cE1lc3NhZ2UiLCJnZXRHYXRld2F5Qm90IiwiZ2F0ZXdheUJvdCIsImdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZCIsImdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJ3aXRoTG9jYWxpemF0aW9ucyIsImdldEd1aWxkIiwiY291bnRzIiwiZ2V0R3VpbGRzIiwibWFrZVJlcXVlc3RPcHRpb25zIiwidXNlckd1aWxkcyIsImdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kIiwiZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzIiwiZ2V0R3VpbGRQcmV2aWV3IiwicHJldmlldyIsImdldEd1aWxkVGVtcGxhdGUiLCJnZXRHdWlsZFRlbXBsYXRlcyIsImdldEd1aWxkV2ViaG9va3MiLCJnZXRJbnRlZ3JhdGlvbnMiLCJpbnRlZ3JhdGlvbnMiLCJnZXRJbnZpdGUiLCJnZXRJbnZpdGVzIiwiZ2V0TWVzc2FnZSIsImdldE1lc3NhZ2VzIiwic2VhcmNoR3VpbGRNZXNzYWdlcyIsIm1lc3NhZ2VzU2VhcmNoIiwiZ2V0U3RpY2tlclBhY2siLCJzdGlja2VyUGFja0lkIiwic3RpY2tlclBhY2siLCJnZXRTdGlja2VyUGFja3MiLCJzdGlja2VyUGFja3MiLCJnZXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UiLCJnZXRDaGFubmVsUGlucyIsIm1lc3NhZ2VQaW5zIiwiZ2V0UGlubmVkTWVzc2FnZXMiLCJwaW5zIiwiZ2V0UHJpdmF0ZUFyY2hpdmVkVGhyZWFkcyIsInByaXZhdGUiLCJnZXRQcml2YXRlSm9pbmVkQXJjaGl2ZWRUaHJlYWRzIiwiam9pbmVkIiwiZ2V0UHJ1bmVDb3VudCIsInBydW5lIiwiZ2V0UHVibGljQXJjaGl2ZWRUaHJlYWRzIiwicHVibGljIiwiZ2V0Um9sZXMiLCJnZXRSb2xlIiwiZ2V0U2NoZWR1bGVkRXZlbnQiLCJ3aXRoVXNlckNvdW50IiwiZ2V0U2NoZWR1bGVkRXZlbnRzIiwiZ2V0U2NoZWR1bGVkRXZlbnRVc2VycyIsInVzZXJzIiwiZ2V0U2Vzc2lvbkluZm8iLCJnZXRTdGFnZUluc3RhbmNlIiwiZ2V0T3duVm9pY2VTdGF0ZSIsImdldFVzZXJWb2ljZVN0YXRlIiwiZ2V0U3RpY2tlciIsImdldEd1aWxkU3RpY2tlciIsImdldEd1aWxkU3RpY2tlcnMiLCJnZXRUaHJlYWRNZW1iZXIiLCJnZXRVc2VyIiwiZ2V0VGhyZWFkTWVtYmVycyIsImdldFJlYWN0aW9ucyIsImdldEN1cnJlbnRVc2VyIiwiZ2V0VXNlckNvbm5lY3Rpb25zIiwiY29ubmVjdGlvbnMiLCJnZXRVc2VyQXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbiIsInJvbGVDb25uZWN0aW9ucyIsImdldFZhbml0eVVybCIsInZhbml0eSIsImdldFZvaWNlUmVnaW9ucyIsImdldFdlYmhvb2siLCJnZXRXZWJob29rTWVzc2FnZSIsImdldFdlYmhvb2tXaXRoVG9rZW4iLCJnZXRXZWxjb21lU2NyZWVuIiwiZ2V0V2lkZ2V0Iiwid2lkZ2V0SnNvbiIsImdldFdpZGdldFNldHRpbmdzIiwiam9pblRocmVhZCIsIm1lIiwibGVhdmVHdWlsZCIsImxlYXZlIiwibGVhdmVUaHJlYWQiLCJwdWJsaXNoTWVzc2FnZSIsImNyb3NzcG9zdCIsInJlbW92ZVJvbGUiLCJyZW1vdmVUaHJlYWRNZW1iZXIiLCJyZW1vdmVEbVJlY2lwaWVudCIsInNlbmRGb2xsb3d1cE1lc3NhZ2UiLCJzZW5kSW50ZXJhY3Rpb25SZXNwb25zZSIsImludGVyYWN0aW9uSWQiLCJwYXJhbXMiLCJjYWxsYmFjayIsInNlbmRNZXNzYWdlIiwic3RhcnRUaHJlYWRXaXRoTWVzc2FnZSIsInN0YXJ0VGhyZWFkV2l0aG91dE1lc3NhZ2UiLCJnZXRQb2xsQW5zd2VyVm90ZXJzIiwiYW5zd2VySWQiLCJwb2xscyIsInZvdGVzIiwiZW5kUG9sbCIsImV4cGlyZSIsInN5bmNHdWlsZFRlbXBsYXRlIiwiYmFuTWVtYmVyIiwiYnVsa0Jhbk1lbWJlcnMiLCJidWxrQmFuIiwiZWRpdEN1cnJlbnRNZW1iZXIiLCJlZGl0TWVtYmVyIiwiZ2V0Q3VycmVudE1lbWJlciIsImN1cnJlbnRNZW1iZXIiLCJnZXRNZW1iZXIiLCJnZXRNZW1iZXJzIiwiZ2V0QXBwbGljYXRpb25BY3Rpdml0eUluc3RhbmNlIiwiaW5zdGFuY2VJZCIsImFwcGxpY2F0aW9uQWN0aXZpdHlJbnN0YW5jZSIsImtpY2tNZW1iZXIiLCJwaW5NZXNzYWdlIiwibWVzc2FnZVBpbiIsInBydW5lTWVtYmVycyIsInNlYXJjaE1lbWJlcnMiLCJxdWVyeSIsInNlYXJjaCIsImdldEd1aWxkT25ib2FyZGluZyIsIm9uYm9hcmRpbmciLCJlZGl0R3VpbGRPbmJvYXJkaW5nIiwibW9kaWZ5R3VpbGRJbmNpZGVudEFjdGlvbnMiLCJpbmNpZGVudEFjdGlvbnMiLCJ1bmJhbk1lbWJlciIsInVucGluTWVzc2FnZSIsInRyaWdnZXJUeXBpbmdJbmRpY2F0b3IiLCJ0eXBpbmciLCJ1cHNlcnRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzIiwidXBzZXJ0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzIiwiZWRpdFVzZXJBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uIiwiZGVsZXRlQ3VycmVudFVzZXJBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uIiwiYWRkR3VpbGRNZW1iZXIiLCJjcmVhdGVUZXN0RW50aXRsZW1lbnQiLCJtb25ldGl6YXRpb24iLCJlbnRpdGxlbWVudHMiLCJsaXN0RW50aXRsZW1lbnRzIiwiZ2V0RW50aXRsZW1lbnQiLCJlbnRpdGxlbWVudElkIiwiZW50aXRsZW1lbnQiLCJkZWxldGVUZXN0RW50aXRsZW1lbnQiLCJjb25zdW1lRW50aXRsZW1lbnQiLCJsaXN0U2t1cyIsInNrdXMiLCJsaXN0U3Vic2NyaXB0aW9ucyIsInNrdUlkIiwic3Vic2NyaXB0aW9ucyIsImdldFN1YnNjcmlwdGlvbiIsInN1YnNjcmlwdGlvbklkIiwic3Vic2NyaXB0aW9uIiwic2VuZFNvdW5kYm9hcmRTb3VuZCIsInNvdW5kYm9hcmQiLCJzZW5kU291bmQiLCJsaXN0RGVmYXVsdFNvdW5kYm9hcmRTb3VuZHMiLCJsaXN0RGVmYXVsdCIsImxpc3RHdWlsZFNvdW5kYm9hcmRTb3VuZHMiLCJndWlsZFNvdW5kcyIsImdldEd1aWxkU291bmRib2FyZFNvdW5kIiwic291bmRJZCIsImd1aWxkU291bmQiLCJjcmVhdGVHdWlsZFNvdW5kYm9hcmRTb3VuZCIsIm1vZGlmeUd1aWxkU291bmRib2FyZFNvdW5kIiwiZGVsZXRlR3VpbGRTb3VuZGJvYXJkU291bmQiLCJsaXN0QXBwbGljYXRpb25Sb2xlQ29ubmVjdGlvbnNNZXRhZGF0YVJlY29yZHMiLCJhcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uTWV0YWRhdGEiLCJ1cGRhdGVBcHBsaWNhdGlvblJvbGVDb25uZWN0aW9uc01ldGFkYXRhUmVjb3JkcyIsImNyZWF0ZUxvYmJ5IiwibG9iYnkiLCJnZXRMb2JieSIsImxvYmJ5SWQiLCJtb2RpZnlMb2JieSIsImRlbGV0ZUxvYmJ5IiwiYWRkTWVtYmVyVG9Mb2JieSIsImJ1bGtVcGRhdGVMb2JieU1lbWJlcnMiLCJtZW1iZXJzQnVsayIsInJlbW92ZU1lbWJlckZyb21Mb2JieSIsImxlYXZlTG9iYnkiLCJsaW5rQ2hhbm5lbFRvTG9iYnkiLCJsaW5rIiwidW5saW5rQ2hhbm5lbFRvTG9iYnkiLCJ1cGRhdGVMb2JieU1lc3NhZ2VNb2RlcmF0aW9uTWV0YWRhdGEiLCJtb2RlcmF0aW9uTWV0YWRhdGEiLCJjcmVhdGVPckpvaW5Mb2JieSIsInNlbmRMb2JieU1lc3NhZ2UiLCJnZXRMb2JieU1lc3NhZ2VzIiwiY3JlYXRlTG9iYnlDaGFubmVsSW52aXRlRm9yU2VsZiIsImludml0ZVNlbGYiLCJjcmVhdGVMb2JieUNoYW5uZWxJbnZpdGVGb3JVc2VyIiwiaW52aXRlVXNlciIsInByZWZlclNuYWtlQ2FzZSIsImVuYWJsZWQiLCJjYW1lbGl6ZXIiLCJ4IiwiSHR0cFJlc3BvbnNlQ29kZSIsIkRPTUV4Y2VwdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsTUFBTSxRQUFRLGNBQWM7QUFDckMsU0FBOEJDLE9BQU8sUUFBUSxZQUFZO0FBZ0V6RCxTQUNFQyxRQUFRLEVBQ1JDLGdCQUFnQixFQUNoQkMsa0JBQWtCLEVBQ2xCQyxLQUFLLEVBQ0xDLGlCQUFpQixFQUNqQkMsV0FBVyxFQUNYQyxNQUFNLEVBQ05DLHFCQUFxQixFQUNyQkMsb0JBQW9CLEVBQ3BCQyxXQUFXLFFBQ04sb0JBQW9CO0FBQzNCLFNBQVNDLDBCQUEwQixRQUFRLHFCQUFxQjtBQUNoRSxTQUFTQyxLQUFLLFFBQVEsYUFBYTtBQUNuQyxTQUFTQyxZQUFZLFFBQVEsY0FBYztBQUczQyxPQUFPLE1BQU1DLHNCQUFzQixHQUFHO0FBQ3RDLE9BQU8sTUFBTUMsa0JBQWtCLDBCQUEwQjtBQUV6RCxPQUFPLE1BQU1DLDBCQUEwQixxQkFBcUI7QUFDNUQsT0FBTyxNQUFNQyw4QkFBOEIsd0JBQXdCO0FBQ25FLE9BQU8sTUFBTUMsZ0NBQWdDLDBCQUEwQjtBQUN2RSxPQUFPLE1BQU1DLDJCQUEyQixxQkFBcUI7QUFDN0QsT0FBTyxNQUFNQywyQkFBMkIscUJBQXFCO0FBQzdELE9BQU8sTUFBTUMsMEJBQTBCLG9CQUFvQjtBQUMzRCxPQUFPLE1BQU1DLDBCQUEwQixvQkFBb0I7QUFFM0QsT0FBTyxTQUFTQyxrQkFBa0JDLE9BQWlDO0lBQ2pFLE1BQU1DLGdCQUFnQkQsUUFBUUMsYUFBYSxHQUFHQyxPQUFPRixRQUFRQyxhQUFhLElBQUlwQixrQkFBa0JtQixRQUFRRyxLQUFLO0lBRTdHLE1BQU1DLFVBQVUsQUFBQ0osQ0FBQUEsUUFBUUssS0FBSyxFQUFFRCxXQUFXYixlQUFjLEVBQUdlLE9BQU8sQ0FBQyxPQUFPO0lBQzNF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
726
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgSW5zcGVjdE9wdGlvbnMsIGluc3BlY3QgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHtcbiAgY2FtZWxpemUsXG4gIGNhbWVsVG9TbmFrZUNhc2UsXG4gIERJU0NPUkRFTk9fVkVSU0lPTixcbiAgZGVsYXksXG4gIGdldEJvdElkRnJvbVRva2VuLFxuICBoYXNQcm9wZXJ0eSxcbiAgbG9nZ2VyLFxuICBzbm93Zmxha2VUb1RpbWVzdGFtcCxcbn0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnO1xuaW1wb3J0IHsgdHlwZSBDYW1lbGl6ZWRSZXN0RW5kcG9pbnRzLCB0eXBlIFJlc3RFbmRwb2ludHMsIHJlc3RFbmRwb2ludHMgfSBmcm9tICcuL2VuZHBvaW50cy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVJbnZhbGlkUmVxdWVzdEJ1Y2tldCB9IGZyb20gJy4vaW52YWxpZEJ1Y2tldC5qcyc7XG5pbXBvcnQgeyBRdWV1ZSB9IGZyb20gJy4vcXVldWUuanMnO1xuaW1wb3J0IHsgY3JlYXRlUm91dGVzIH0gZnJvbSAnLi9yb3V0ZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsIENyZWF0ZVJlc3RNYW5hZ2VyT3B0aW9ucywgUmVzdE1hbmFnZXIsIFNlbmRSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgY29uc3QgRElTQ09SRF9BUElfVkVSU0lPTiA9IDEwO1xuZXhwb3J0IGNvbnN0IERJU0NPUkRfQVBJX1VSTCA9ICdodHRwczovL2Rpc2NvcmQuY29tL2FwaSc7XG5cbmV4cG9ydCBjb25zdCBBVURJVF9MT0dfUkVBU09OX0hFQURFUiA9ICd4LWF1ZGl0LWxvZy1yZWFzb24nO1xuZXhwb3J0IGNvbnN0IFJBVEVfTElNSVRfUkVNQUlOSU5HX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1yZW1haW5pbmcnO1xuZXhwb3J0IGNvbnN0IFJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSID0gJ3gtcmF0ZWxpbWl0LXJlc2V0LWFmdGVyJztcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX0dMT0JBTF9IRUFERVIgPSAneC1yYXRlbGltaXQtZ2xvYmFsJztcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX0JVQ0tFVF9IRUFERVIgPSAneC1yYXRlbGltaXQtYnVja2V0JztcbmV4cG9ydCBjb25zdCBSQVRFX0xJTUlUX0xJTUlUX0hFQURFUiA9ICd4LXJhdGVsaW1pdC1saW1pdCc7XG5leHBvcnQgY29uc3QgUkFURV9MSU1JVF9TQ09QRV9IRUFERVIgPSAneC1yYXRlbGltaXQtc2NvcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVzdE1hbmFnZXIob3B0aW9uczogQ3JlYXRlUmVzdE1hbmFnZXJPcHRpb25zKTogUmVzdE1hbmFnZXIge1xuICBjb25zdCBhcHBsaWNhdGlvbklkID0gb3B0aW9ucy5hcHBsaWNhdGlvbklkID8gQmlnSW50KG9wdGlvbnMuYXBwbGljYXRpb25JZCkgOiBnZXRCb3RJZEZyb21Ub2tlbihvcHRpb25zLnRva2VuKTtcblxuICBjb25zdCBiYXNlVXJsID0gKG9wdGlvbnMucHJveHk/LmJhc2VVcmwgPz8gRElTQ09SRF9BUElfVVJMKS5yZXBsYWNlKC9cXC8kLywgJycpO1xuICAvLyBEaXNjb3JkIGVycm9yIGNhbiBnZXQgbmVzdGVkIGEgbG90LCBzbyB3ZSB1c2UgYSBjdXN0b20gaW5zcGVjdCB0byBjaGFuZ2UgdGhlIGRlcHRoIHRvIEluZmluaXR5XG4gIGNvbnN0IGJhc2VFcnJvclByb3RvdHlwZSA9IHtcbiAgICBbaW5zcGVjdC5jdXN0b21dKF9kZXB0aDogbnVtYmVyLCBvcHRpb25zOiBJbnNwZWN0T3B0aW9ucywgX2luc3BlY3Q6IHR5cGVvZiBpbnNwZWN0KSB7XG4gICAgICByZXR1cm4gX2luc3BlY3QodGhpcywge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBkZXB0aDogSW5maW5pdHksXG4gICAgICAgIC8vIFNpbmNlIHdlIGNhbGwgaW5zcGVjdCBvbiBvdXJzZWxmLCB3ZSBuZWVkIHRvIGRpc2FibGUgdGhlIGNhbGxzIHRvIHRoZSBpbnNwZWN0LmN1c3RvbSBzeW1ib2wgb3IgZWxzZSBpdCB3aWxsIGNhdXNlIGFuIGluZmluaXRlIGxvb3AuXG4gICAgICAgIGN1c3RvbUluc3BlY3Q6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdCByZXN0OiBSZXN0TWFuYWdlciA9IHtcbiAgICBhcHBsaWNhdGlvbklkLFxuICAgIGF1dGhvcml6YXRpb246IG9wdGlvbnMucHJveHk/LmF1dGhvcml6YXRpb24sXG4gICAgYXV0aG9yaXphdGlvbkhlYWRlcjogb3B0aW9ucy5wcm94eT8uYXV0aG9yaXphdGlvbkhlYWRlciA/PyAnYXV0aG9yaXphdGlvbicsXG4gICAgYmFzZVVybCxcbiAgICBkZWxldGVRdWV1ZURlbGF5OiA2MDAwMCxcbiAgICBnbG9iYWxseVJhdGVMaW1pdGVkOiBmYWxzZSxcbiAgICBpbnZhbGlkQnVja2V0OiBjcmVhdGVJbnZhbGlkUmVxdWVzdEJ1Y2tldCh7IGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgfSksXG4gICAgaXNQcm94aWVkOiAhYmFzZVVybC5zdGFydHNXaXRoKERJU0NPUkRfQVBJX1VSTCksXG4gICAgdXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludDogb3B0aW9ucy5wcm94eT8udXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCxcbiAgICByZXRyeVByb3hpZWRSZXF1ZXN0czogb3B0aW9ucy5wcm94eT8ucmV0cnlSZXF1ZXN0cyA/PyBmYWxzZSxcbiAgICBtYXhSZXRyeUNvdW50OiBJbmZpbml0eSxcbiAgICBtYXhQcm94eVJldHJ5Q291bnQ6IDE1LFxuICAgIHByb3h5UmV0cnlEZWxheVN0ZXA6IDI1MCxcbiAgICByZXF1ZXN0VGltZW91dDogb3B0aW9ucy5yZXF1ZXN0VGltZW91dCA/PyAzMDAwMCxcbiAgICBwcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRoczogZmFsc2UsXG4gICAgcXVldWVzOiBuZXcgTWFwKCksXG4gICAgcmF0ZUxpbWl0ZWRQYXRoczogbmV3IE1hcCgpLFxuICAgIHRva2VuOiBvcHRpb25zLnRva2VuLFxuICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiA/PyBESVNDT1JEX0FQSV9WRVJTSU9OLFxuICAgIGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyLFxuICAgIGV2ZW50czoge1xuICAgICAgcmVxdWVzdDogKCkgPT4ge30sXG4gICAgICByZXNwb25zZTogKCkgPT4ge30sXG4gICAgICByZXF1ZXN0RXJyb3I6ICgpID0+IHt9LFxuICAgICAgLi4ub3B0aW9ucy5ldmVudHMsXG4gICAgfSxcblxuICAgIHJvdXRlczogY3JlYXRlUm91dGVzKCksXG5cbiAgICBjcmVhdGVCYXNlSGVhZGVycygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICd1c2VyLWFnZW50JzogYERpc2NvcmRCb3QgKGh0dHBzOi8vZ2l0aHViLmNvbS9kaXNjb3JkZW5vL2Rpc2NvcmRlbm8sIHYke0RJU0NPUkRFTk9fVkVSU0lPTn0pYCxcbiAgICAgIH07XG4gICAgfSxcblxuICAgIGNoZWNrUmF0ZUxpbWl0cyh1cmwsIGlkZW50aWZpZXIpIHtcbiAgICAgIGNvbnN0IHJhdGVsaW1pdGVkID0gcmVzdC5yYXRlTGltaXRlZFBhdGhzLmdldChgJHtpZGVudGlmaWVyfSR7dXJsfWApO1xuXG4gICAgICBjb25zdCBnbG9iYWwgPSByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZ2V0KCdnbG9iYWwnKTtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICAgIC8vIFdoaWNoZXZlciBvZiB0aGUgdHdvIGxhc3RzIGxvbmdlciBpcyB0aGUgb25lIHRoYXQgZGVjaWRlcyB3aGVuIHRoaXMgcmVxdWVzdCBtYXkgZ28gb3V0LCBhIHNob3J0ZXIgcGVyIHVybCBsaW1pdCBkb2VzIG5vdCBtYWtlIGl0XG4gICAgICAvLyBhbHJpZ2h0IHRvIHNlbmQgd2hpbGUgdGhlIGdsb2JhbCBvbmUgaXMgc3RpbGwgcnVubmluZy5cbiAgICAgIGNvbnN0IHVybFdhaXQgPSByYXRlbGltaXRlZCAmJiBub3cgPCByYXRlbGltaXRlZC5yZXNldFRpbWVzdGFtcCA/IHJhdGVsaW1pdGVkLnJlc2V0VGltZXN0YW1wIC0gbm93IDogMDtcbiAgICAgIGNvbnN0IGdsb2JhbFdhaXQgPSBnbG9iYWwgJiYgbm93IDwgZ2xvYmFsLnJlc2V0VGltZXN0YW1wID8gZ2xvYmFsLnJlc2V0VGltZXN0YW1wIC0gbm93IDogMDtcbiAgICAgIGNvbnN0IHdhaXQgPSBNYXRoLm1heCh1cmxXYWl0LCBnbG9iYWxXYWl0KTtcblxuICAgICAgcmV0dXJuIHdhaXQgPiAwID8gd2FpdCA6IGZhbHNlO1xuICAgIH0sXG5cbiAgICBhc3luYyB1cGRhdGVUb2tlblF1ZXVlcyhvbGRUb2tlbiwgbmV3VG9rZW4pIHtcbiAgICAgIGlmIChyZXN0LmlzUHJveGllZCkge1xuICAgICAgICBpZiAoIXJlc3QudXBkYXRlQmVhcmVyVG9rZW5FbmRwb2ludCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiVGhlICdwcm94eS51cGRhdGVCZWFyZXJUb2tlbkVuZHBvaW50JyBvcHRpb24gbmVlZHMgdG8gYmUgc2V0IHdoZW4gdXNpbmcgYSByZXN0IHByb3h5IGFuZCBuZWVkZWQgdG8gY2FsbCAndXBkYXRlVG9rZW5RdWV1ZXMnXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gICAgICAgIGlmIChyZXN0LmF1dGhvcml6YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGhlYWRlcnNbcmVzdC5hdXRob3JpemF0aW9uSGVhZGVyXSA9IHJlc3QuYXV0aG9yaXphdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGZldGNoKGAke3Jlc3QuYmFzZVVybH0vJHtyZXN0LnVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnR9YCwge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIG9sZFRva2VuLFxuICAgICAgICAgICAgbmV3VG9rZW4sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdJZGVudGlmaWVyID0gYEJlYXJlciAke25ld1Rva2VufWA7XG5cbiAgICAgIC8vIFVwZGF0ZSBhbGwgdGhlIHF1ZXVlc1xuICAgICAgZm9yIChjb25zdCBba2V5LCBxdWV1ZV0gb2YgcmVzdC5xdWV1ZXMuZW50cmllcygpKSB7XG4gICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoYEJlYXJlciAke29sZFRva2VufWApKSBjb250aW51ZTtcblxuICAgICAgICByZXN0LnF1ZXVlcy5kZWxldGUoa2V5KTtcbiAgICAgICAgcXVldWUuaWRlbnRpZmllciA9IG5ld0lkZW50aWZpZXI7XG5cbiAgICAgICAgY29uc3QgbmV3S2V5ID0gYCR7bmV3SWRlbnRpZmllcn0ke3F1ZXVlLnVybH1gO1xuICAgICAgICBjb25zdCBuZXdRdWV1ZSA9IHJlc3QucXVldWVzLmdldChuZXdLZXkpO1xuXG4gICAgICAgIC8vIE1lcmdlIHRoZSBxdWV1ZXNcbiAgICAgICAgaWYgKG5ld1F1ZXVlKSB7XG4gICAgICAgICAgbmV3UXVldWUud2FpdGluZy51bnNoaWZ0KC4uLnF1ZXVlLndhaXRpbmcpO1xuICAgICAgICAgIG5ld1F1ZXVlLnBlbmRpbmcudW5zaGlmdCguLi5xdWV1ZS5wZW5kaW5nKTtcblxuICAgICAgICAgIHF1ZXVlLndhaXRpbmcgPSBbXTtcbiAgICAgICAgICBxdWV1ZS5wZW5kaW5nID0gW107XG5cbiAgICAgICAgICAvLyBUaGUgbWVyZ2VkIHF1ZXVlIGlzIG5vdCBwcm9jZXNzaW5nIGFueXRoaW5nIG9mIGl0cyBvd24sIHNvIG5vdGhpbmcgd291bGQgZXZlciBsb29rIGF0IHdoYXQgaXQgd2FzIGp1c3QgaGFuZGVkLlxuICAgICAgICAgIG5ld1F1ZXVlLnByb2Nlc3NXYWl0aW5nKCk7XG4gICAgICAgICAgbmV3UXVldWUucHJvY2Vzc1BlbmRpbmcoKTtcblxuICAgICAgICAgIHF1ZXVlLmNsZWFudXAoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN0LnF1ZXVlcy5zZXQobmV3S2V5LCBxdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBba2V5LCByYXRlbGltaXRQYXRoXSBvZiByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZW50cmllcygpKSB7XG4gICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoYEJlYXJlciAke29sZFRva2VufWApKSBjb250aW51ZTtcblxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGAke25ld0lkZW50aWZpZXJ9JHtyYXRlbGltaXRQYXRoLnVybH1gLCByYXRlbGltaXRQYXRoKTtcblxuICAgICAgICBpZiAocmF0ZWxpbWl0UGF0aC5idWNrZXRJZCkge1xuICAgICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoYCR7bmV3SWRlbnRpZmllcn0ke3JhdGVsaW1pdFBhdGguYnVja2V0SWR9YCwgcmF0ZWxpbWl0UGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2hhbmdlVG9EaXNjb3JkRm9ybWF0KG9iajogYW55KTogYW55IHtcbiAgICAgIGlmIChvYmogPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgIHJldHVybiBvYmoubWFwKChpdGVtKSA9PiByZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdChpdGVtKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdPYmo6IGFueSA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iaikpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuXG4gICAgICAgICAgLy8gSWYgdGhlIGtleSBpcyBhbHJlYWR5IGluIHNuYWtlX2Nhc2Ugd2UgY2FuIGFzc3VtZSBpdCBpcyBhbHJlYWR5IGluIHRoZSBkaXNjb3JkIGZvcm1hdC5cbiAgICAgICAgICBpZiAoa2V5LmluY2x1ZGVzKCdfJykpIHtcbiAgICAgICAgICAgIG5ld09ialtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgICAgY2FzZSAnbmFtZUxvY2FsaXphdGlvbnMnOlxuICAgICAgICAgICAgICAgIG5ld09iai5uYW1lX2xvY2FsaXphdGlvbnMgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgY2FzZSAnZGVzY3JpcHRpb25Mb2NhbGl6YXRpb25zJzpcbiAgICAgICAgICAgICAgICBuZXdPYmouZGVzY3JpcHRpb25fbG9jYWxpemF0aW9ucyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5ld09ialtjYW1lbFRvU25ha2VDYXNlKGtleSldID0gcmVzdC5jaGFuZ2VUb0Rpc2NvcmRGb3JtYXQodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ld09iajtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdiaWdpbnQnKSByZXR1cm4gb2JqLnRvU3RyaW5nKCk7XG5cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcblxuICAgIGNyZWF0ZVJlcXVlc3RCb2R5KG1ldGhvZCwgb3B0aW9ucykge1xuICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuY3JlYXRlQmFzZUhlYWRlcnMoKTtcblxuICAgICAgaWYgKG9wdGlvbnM/LnVuYXV0aG9yaXplZCAhPT0gdHJ1ZSkgaGVhZGVycy5hdXRob3JpemF0aW9uID0gYEJvdCAke3Jlc3QudG9rZW59YDtcblxuICAgICAgLy8gSUYgQSBSRUFTT04gSVMgUFJPVklERUQgRU5DT0RFIElUIElOIEhFQURFUlNcbiAgICAgIGlmIChvcHRpb25zPy5yZWFzb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoZWFkZXJzW0FVRElUX0xPR19SRUFTT05fSEVBREVSXSA9IGVuY29kZVVSSUNvbXBvbmVudChvcHRpb25zPy5yZWFzb24pO1xuICAgICAgfVxuXG4gICAgICBsZXQgYm9keTogc3RyaW5nIHwgRm9ybURhdGEgfCB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIEhhdmUgdG8gY2hlY2sgZm9yIGF0dGFjaG1lbnRzIGZpcnN0LCBzaW5jZSBib2R5IHRoZW4gaGFzIHRvIGJlIHNlbmQgaW4gYSBkaWZmZXJlbnQgd2F5LlxuICAgICAgaWYgKG9wdGlvbnM/LmZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnMuZmlsZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBmb3JtLmFwcGVuZChgZmlsZXNbJHtpfV1gLCBvcHRpb25zLmZpbGVzW2ldLmJsb2IsIG9wdGlvbnMuZmlsZXNbaV0ubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYXZlIHRvIHVzZSBjaGFuZ2VUb0Rpc2NvcmRGb3JtYXQgb3IgZWxzZSBKU09OLnN0cmluZ2lmeSBtYXkgdGhyb3cgYW4gZXJyb3IgZm9yIHRoZSBwcmVzZW5jZSBvZiBCaWdJbnQocykgaW4gdGhlIGpzb25cbiAgICAgICAgZm9ybS5hcHBlbmQoJ3BheWxvYWRfanNvbicsIEpTT04uc3RyaW5naWZ5KHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KHsgLi4ub3B0aW9ucy5ib2R5LCBmaWxlczogdW5kZWZpbmVkIH0pKSk7XG5cbiAgICAgICAgLy8gTm8gbmVlZCB0byBzZXQgdGhlIGBjb250ZW50LXR5cGVgIGhlYWRlciBzaW5jZSBgZmV0Y2hgIGRvZXMgdGhhdCBhdXRvbWF0aWNhbGx5IGZvciB1cyB3aGVuIHdlIHVzZSBhIGBGb3JtRGF0YWAgb2JqZWN0LlxuICAgICAgICBib2R5ID0gZm9ybTtcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uYm9keSAmJiBvcHRpb25zLmhlYWRlcnMgJiYgb3B0aW9ucy5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9PT0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpIHtcbiAgICAgICAgLy8gT0F1dGgyIGJvZHkgaGFuZGxpbmdcbiAgICAgICAgY29uc3QgZm9ybUJvZHk6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgY29uc3QgZGlzY29yZEJvZHkgPSByZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdChvcHRpb25zLmJvZHkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBkaXNjb3JkQm9keSkge1xuICAgICAgICAgIGZvcm1Cb2R5LnB1c2goYCR7ZW5jb2RlVVJJQ29tcG9uZW50KHByb3ApfT0ke2VuY29kZVVSSUNvbXBvbmVudChkaXNjb3JkQm9keVtwcm9wXSl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBib2R5ID0gZm9ybUJvZHkuam9pbignJicpO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zPy5ib2R5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuYm9keSBpbnN0YW5jZW9mIEZvcm1EYXRhKSB7XG4gICAgICAgICAgYm9keSA9IG9wdGlvbnMuYm9keTtcbiAgICAgICAgICAvLyBObyBuZWVkIHRvIHNldCB0aGUgYGNvbnRlbnQtdHlwZWAgaGVhZGVyIHNpbmNlIGBmZXRjaGAgZG9lcyB0aGF0IGF1dG9tYXRpY2FsbHkgZm9yIHVzIHdoZW4gd2UgdXNlIGEgYEZvcm1EYXRhYCBvYmplY3QuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KG9wdGlvbnMuYm9keSkpO1xuICAgICAgICAgIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gYGFwcGxpY2F0aW9uL2pzb25gO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNPTUVUSU1FUyBTUEVDSUFMIEhFQURFUlMgKEUuRy4gQ1VTVE9NIEFVVEhPUklaQVRJT04pIE5FRUQgVE8gQkUgVVNFRFxuICAgICAgaWYgKG9wdGlvbnM/LmhlYWRlcnMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihoZWFkZXJzLCBvcHRpb25zLmhlYWRlcnMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBib2R5LFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBtZXRob2QsXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBjcmVhdGVSZXF1ZXN0RXJyb3IoZXJyb3IsIHJlYXNvbikge1xuICAgICAgbGV0IGVycm9yVGV4dDogc3RyaW5nO1xuXG4gICAgICBzd2l0Y2ggKHJlYXNvbi5zdGF0dXMpIHtcbiAgICAgICAgY2FzZSA0MDA6XG4gICAgICAgICAgZXJyb3JUZXh0ID0gXCJUaGUgb3B0aW9ucyB3YXMgaW1wcm9wZXJseSBmb3JtYXR0ZWQsIG9yIHRoZSBzZXJ2ZXIgY291bGRuJ3QgdW5kZXJzdGFuZCBpdC5cIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0MDE6XG4gICAgICAgICAgZXJyb3JUZXh0ID0gJ1RoZSBBdXRob3JpemF0aW9uIGhlYWRlciB3YXMgbWlzc2luZyBvciBpbnZhbGlkLic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgIGVycm9yVGV4dCA9ICdUaGUgQXV0aG9yaXphdGlvbiB0b2tlbiB5b3UgcGFzc2VkIGRpZCBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHRoZSByZXNvdXJjZS4nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQwNDpcbiAgICAgICAgICBlcnJvclRleHQgPSBcIlRoZSByZXNvdXJjZSBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGRvZXNuJ3QgZXhpc3QuXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDA1OlxuICAgICAgICAgIGVycm9yVGV4dCA9ICdUaGUgSFRUUCBtZXRob2QgdXNlZCBpcyBub3QgdmFsaWQgZm9yIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQuJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0Mjk6XG4gICAgICAgICAgZXJyb3JUZXh0ID0gXCJZb3UncmUgYmVpbmcgcmF0ZWxpbWl0ZWQuXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTAyOlxuICAgICAgICAgIGVycm9yVGV4dCA9ICdUaGVyZSB3YXMgbm90IGEgZ2F0ZXdheSBhdmFpbGFibGUgdG8gcHJvY2VzcyB5b3VyIG9wdGlvbnMuIFdhaXQgYSBiaXQgYW5kIHJldHJ5Lic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgZXJyb3JUZXh0ID0gcmVhc29uLnN0YXR1c1RleHQgPz8gcmVhc29uLmVycm9yID8/ICdVbmtub3duIGVycm9yJztcbiAgICAgIH1cblxuICAgICAgZXJyb3IubWVzc2FnZSA9IGBbJHtyZWFzb24uc3RhdHVzfV0gJHtlcnJvclRleHR9YDtcblxuICAgICAgLy8gSWYgZGlzY29yZCBzZW50IHVzIEpTT04sIGl0IGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlIGFuIGVycm9yIG1lc3NhZ2UgZnJvbSB3aGljaCB3ZSBjYW4gZ2V0IGFuZCBhZGQgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IgdG8gdGhlIGVycm9yIG1lc3NhZ2UsIHRoZSBmdWxsIGJvZHkgd2lsbCBiZSBpbiB0aGUgZXJyb3IuY2F1c2VcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL3JlZmVyZW5jZSNlcnJvci1tZXNzYWdlc1xuICAgICAgaWYgKHR5cGVvZiByZWFzb24uYm9keSA9PT0gJ29iamVjdCcgJiYgaGFzUHJvcGVydHkocmVhc29uLmJvZHksICdjb2RlJykgJiYgaGFzUHJvcGVydHkocmVhc29uLmJvZHksICdtZXNzYWdlJykpIHtcbiAgICAgICAgZXJyb3IubWVzc2FnZSArPSBgXFxuRGlzY29yZCBlcnJvcjogWyR7cmVhc29uLmJvZHkuY29kZX1dICR7cmVhc29uLmJvZHkubWVzc2FnZX1gO1xuICAgICAgfVxuXG4gICAgICBlcnJvci5jYXVzZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShiYXNlRXJyb3JQcm90b3R5cGUpLCByZWFzb24pO1xuXG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcblxuICAgIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzKCkge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcmVzdC5yYXRlTGltaXRlZFBhdGhzLmVudHJpZXMoKSkge1xuICAgICAgICAvLyAgIHJlc3QuZGVidWcoXG4gICAgICAgIC8vIGBbUkVTVCAtIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzXSBSdW5uaW5nIGZvciBvZiBsb29wLiAke1xuICAgICAgICAvLyAgIHZhbHVlLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICAgIC8vIH1gXG4gICAgICAgIC8vICAgKVxuICAgICAgICAvLyBJZiB0aGUgdGltZSBoYXMgbm90IHJlYWNoZWQgY2FuY2VsXG4gICAgICAgIGlmICh2YWx1ZS5yZXNldFRpbWVzdGFtcCA+IG5vdykgY29udGludWU7XG5cbiAgICAgICAgLy8gUmF0ZSBsaW1pdCBpcyBvdmVyLCBkZWxldGUgdGhlIHJhdGUgbGltaXRlclxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZGVsZXRlKGtleSk7XG4gICAgICAgIC8vIElmIGl0IHdhcyBnbG9iYWwsIGFsc28gbWFyayB0aGUgZ2xvYmFsIHZhbHVlIGFzIGZhbHNlXG4gICAgICAgIGlmIChrZXkgPT09ICdnbG9iYWwnKSByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQUxMIFBBVEhTIEFSRSBDTEVBUkVEIENBTiBDQU5DRUwgT1VUIVxuICAgICAgaWYgKHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zaXplID09PSAwKSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMgPSB0cnVlO1xuICAgICAgICAvLyBSRUNIRUNLIElOIDEgU0VDT05EXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vIHJlc3QuZGVidWcoJ1tSRVNUIC0gcHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHNdIFJ1bm5pbmcgc2V0VGltZW91dC4nKVxuICAgICAgICAgIHJlc3QucHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMoKTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKiBQcm9jZXNzZXMgdGhlIHJhdGUgbGltaXQgaGVhZGVycyBhbmQgZGV0ZXJtaW5lcyBpZiBpdCBuZWVkcyB0byBiZSByYXRlIGxpbWl0ZWQgYW5kIHJldHVybnMgdGhlIGJ1Y2tldCBpZCBpZiBhdmFpbGFibGUgKi9cbiAgICBwcm9jZXNzSGVhZGVycyh1cmwsIGhlYWRlcnMsIGlkZW50aWZpZXIpIHtcbiAgICAgIGxldCByYXRlTGltaXRlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBHRVQgQUxMIE5FQ0VTU0FSWSBIRUFERVJTXG4gICAgICBjb25zdCByZW1haW5pbmcgPSBoZWFkZXJzLmdldChSQVRFX0xJTUlUX1JFTUFJTklOR19IRUFERVIpO1xuICAgICAgY29uc3QgcmV0cnlBZnRlciA9IGhlYWRlcnMuZ2V0KCdSZXRyeS1BZnRlcicpID8/IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSKTtcbiAgICAgIGNvbnN0IHJlc2V0ID0gRGF0ZS5ub3coKSArIE51bWJlcihyZXRyeUFmdGVyKSAqIDEwMDA7XG4gICAgICBjb25zdCBnbG9iYWwgPSBoZWFkZXJzLmdldChSQVRFX0xJTUlUX0dMT0JBTF9IRUFERVIpO1xuICAgICAgLy8gdW5kZWZpbmVkIG92ZXJyaWRlIG51bGwgbmVlZGVkIGZvciB0eXBpbmdzXG4gICAgICBjb25zdCBidWNrZXRJZCA9IGhlYWRlcnMuZ2V0KFJBVEVfTElNSVRfQlVDS0VUX0hFQURFUikgPz8gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgbGltaXQgPSBoZWFkZXJzLmdldChSQVRFX0xJTUlUX0xJTUlUX0hFQURFUik7XG5cbiAgICAgIC8vIElmIHdlIGRpZG4ndCByZWNlaXZlZCB0aGUgaWRlbnRpZmllciwgZmFsbGJhY2sgdG8gdGhlIGJvdCB0b2tlblxuICAgICAgaWRlbnRpZmllciA/Pz0gYEJvdCAke3Jlc3QudG9rZW59YDtcblxuICAgICAgcmVzdC5xdWV1ZXMuZ2V0KGAke2lkZW50aWZpZXJ9JHt1cmx9YCk/LmhhbmRsZUNvbXBsZXRlZFJlcXVlc3Qoe1xuICAgICAgICByZW1haW5pbmc6IHJlbWFpbmluZyA/IE51bWJlcihyZW1haW5pbmcpIDogdW5kZWZpbmVkLFxuICAgICAgICBpbnRlcnZhbDogcmV0cnlBZnRlciA/IE51bWJlcihyZXRyeUFmdGVyKSAqIDEwMDAgOiB1bmRlZmluZWQsXG4gICAgICAgIG1heDogbGltaXQgPyBOdW1iZXIobGltaXQpIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElGIFRIRVJFIElTIE5PIFJFTUFJTklORyBSQVRFIExJTUlULCBNQVJLIElUIEFTIFJBVEUgTElNSVRFRFxuICAgICAgaWYgKHJlbWFpbmluZyA9PT0gJzAnKSB7XG4gICAgICAgIHJhdGVMaW1pdGVkID0gdHJ1ZTtcblxuICAgICAgICAvLyBTQVZFIFRIRSBVUkwgQVMgTElNSVRFRCwgSU1QT1JUQU5UIEZPUiBORVcgUkVRVUVTVFMgQlkgVVNFUiBXSVRIT1VUIEJVQ0tFVFxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGAke2lkZW50aWZpZXJ9JHt1cmx9YCwge1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICByZXNldFRpbWVzdGFtcDogcmVzZXQsXG4gICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNBVkUgVEhFIEJVQ0tFVCBBUyBMSU1JVEVEIFNJTkNFIERJRkZFUkVOVCBVUkxTIE1BWSBTSEFSRSBBIEJVQ0tFVFxuICAgICAgICBpZiAoYnVja2V0SWQpIHtcbiAgICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGAke2lkZW50aWZpZXJ9JHtidWNrZXRJZH1gLCB7XG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICByZXNldFRpbWVzdGFtcDogcmVzZXQsXG4gICAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJRiBUSEVSRSBJUyBOTyBSRU1BSU5JTkcgR0xPQkFMIExJTUlULCBNQVJLIElUIFJBVEUgTElNSVRFRCBHTE9CQUxMWVxuICAgICAgaWYgKGdsb2JhbCkge1xuICAgICAgICBjb25zdCByZXRyeUFmdGVyID0gTnVtYmVyKGhlYWRlcnMuZ2V0KCdyZXRyeS1hZnRlcicpKSAqIDEwMDA7XG4gICAgICAgIGNvbnN0IGdsb2JhbFJlc2V0ID0gRGF0ZS5ub3coKSArIHJldHJ5QWZ0ZXI7XG4gICAgICAgIC8vICAgcmVzdC5kZWJ1ZyhcbiAgICAgICAgLy8gYFtSRVNUID0gR2xvYmFsbHkgUmF0ZSBMaW1pdGVkXSBVUkw6ICR7dXJsfSB8IEdsb2JhbCBSZXN0OiAke2dsb2JhbFJlc2V0fWBcbiAgICAgICAgLy8gICApXG4gICAgICAgIHJlc3QuZ2xvYmFsbHlSYXRlTGltaXRlZCA9IHRydWU7XG4gICAgICAgIHJhdGVMaW1pdGVkID0gdHJ1ZTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSBmYWxzZTtcbiAgICAgICAgfSwgcmV0cnlBZnRlcik7XG5cbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldCgnZ2xvYmFsJywge1xuICAgICAgICAgIHVybDogJ2dsb2JhbCcsXG4gICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IGdsb2JhbFJlc2V0LFxuICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYnVja2V0SWQpIHtcbiAgICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGlkZW50aWZpZXIsIHtcbiAgICAgICAgICAgIHVybDogJ2dsb2JhbCcsXG4gICAgICAgICAgICByZXNldFRpbWVzdGFtcDogZ2xvYmFsUmVzZXQsXG4gICAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmF0ZUxpbWl0ZWQgJiYgIXJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMpIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJhdGVMaW1pdGVkID8gYnVja2V0SWQgOiB1bmRlZmluZWQ7XG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHVybCA9IGAke3Jlc3QuYmFzZVVybH0vdiR7cmVzdC52ZXJzaW9ufSR7b3B0aW9ucy5yb3V0ZX1gO1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHJlc3QuY3JlYXRlUmVxdWVzdEJvZHkob3B0aW9ucy5tZXRob2QsIG9wdGlvbnMucmVxdWVzdEJvZHlPcHRpb25zKTtcblxuICAgICAgLy8gUmV0cmllcyBhIHJlcXVlc3QgdGhhdCB3YXMgYWJvcnRlZCBiZWNhdXNlIGl0IGhpdCBgcmVzdC5yZXF1ZXN0VGltZW91dGAsIG9yIHJlamVjdHMgaXQgb25jZSB0aGUgcmV0cnlcbiAgICAgIC8vIGJ1ZGdldCBpcyBleGhhdXN0ZWQuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHRoZSBgaW52YWxpZEJ1Y2tldGAvZXZlbnQgYm9va2tlZXBpbmcgYmVmb3JlaGFuZC5cbiAgICAgIGNvbnN0IGhhbmRsZVRpbWVvdXQgPSBhc3luYyAob3B0aW9uczogU2VuZFJlcXVlc3RPcHRpb25zLCBlcnJvcjogRXJyb3IpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnMucmV0cnlDb3VudCA+PSByZXN0Lm1heFJldHJ5Q291bnQpIHtcbiAgICAgICAgICByZXN0LmxvZ2dlci5kZWJ1ZyhgcmVxdWVzdCB0byAke3VybH0gdGltZWQgb3V0IGFuZCBleGNlZWRlZCB0aGUgbWF4aW11bSBhbGxvd2VkIHJldHJpZXMuYCk7XG4gICAgICAgICAgb3B0aW9ucy5yZWplY3Qoe1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgc3RhdHVzOiA5OTksXG4gICAgICAgICAgICBlcnJvcjogJ1RoZSByZXF1ZXN0IHRpbWVkIG91dCBhbmQgaXQgbWF4ZWQgb3V0IHRoZSByZXRyaWVzIGxpbWl0LicsXG4gICAgICAgICAgICBlcnJvck9iamVjdDogZXJyb3IsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYHJlcXVlc3QgdG8gJHt1cmx9IHRpbWVkIG91dCBhZnRlciAke3Jlc3QucmVxdWVzdFRpbWVvdXR9bXMsIHJldHJ5aW5nLmAsIGVycm9yKTtcbiAgICAgICAgb3B0aW9ucy5yZXRyeUNvdW50ICs9IDE7XG4gICAgICAgIGF3YWl0IG9wdGlvbnMucmV0cnlSZXF1ZXN0Py4ob3B0aW9ucyk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBsb2dnaW5nSGVhZGVycyA9IHsgLi4ucGF5bG9hZC5oZWFkZXJzIH07XG5cbiAgICAgIGlmIChwYXlsb2FkLmhlYWRlcnMuYXV0aG9yaXphdGlvbikge1xuICAgICAgICBjb25zdCBhdXRob3JpemF0aW9uU2NoZW1lID0gcGF5bG9hZC5oZWFkZXJzLmF1dGhvcml6YXRpb24/LnNwbGl0KCcgJylbMF07XG4gICAgICAgIGxvZ2dpbmdIZWFkZXJzLmF1dGhvcml6YXRpb24gPSBgJHthdXRob3JpemF0aW9uU2NoZW1lfSB0b2tlbmhlcmVgO1xuICAgICAgfVxuXG4gICAgICAvLyBHaXZlIHRoaXMgYXR0ZW1wdCBhIGhhcmQgZGVhZGxpbmUuIGBBYm9ydFNpZ25hbC50aW1lb3V0YCBhYm9ydHMgdGhlIGZldGNoIChhbmQgYW55IGluLXByb2dyZXNzIGJvZHlcbiAgICAgIC8vIHJlYWQpIG9uY2UgaXQgZmlyZXMsIHdoaWNoIG1ha2VzIHRoZSBhd2FpdGVkIGZldGNoIHJlamVjdCBzbyBhIHN0YWxsZWQgY29ubmVjdGlvbiBjYW4gbmV2ZXIga2VlcCB0aGlzXG4gICAgICAvLyBxdWV1ZSdzIGBwcm9jZXNzUGVuZGluZ2AgbG9vcCAoYW5kIHRoZXJlZm9yZSB0aGUgd2hvbGUgcXVldWUpIHdlZGdlZCBmb3JldmVyLiBPbWl0dGVkIHdoZW4gZGlzYWJsZWQuXG4gICAgICAvLyBUaGUgY2FsbGVyJ3Mgc2lnbmFsIGlzIGhhbmRlZCB0byBmZXRjaCB0b286IGZldGNoIHJlZnVzZXMgdG8gc2VuZCBhIHJlcXVlc3Qgd2hvc2Ugc2lnbmFsIGlzIGFscmVhZHkgYWJvcnRlZCwgc28gYSBxdWV1ZSBlbnRyeSB0aGF0IGdvdFxuICAgICAgLy8gYWJvcnRlZCB3aGlsZSB3YWl0aW5nIG5ldmVyIGdvZXMgb3V0LCBhbmQgYWJvcnRpbmcgbWlkLXJlcXVlc3QgdGVhcnMgZG93biB0aGUgY29ubmVjdGlvbi5cbiAgICAgIGNvbnN0IHNpZ25hbHM6IEFib3J0U2lnbmFsW10gPSBbXTtcbiAgICAgIGlmIChvcHRpb25zLnJlcXVlc3RCb2R5T3B0aW9ucz8uc2lnbmFsKSBzaWduYWxzLnB1c2gob3B0aW9ucy5yZXF1ZXN0Qm9keU9wdGlvbnMuc2lnbmFsKTtcbiAgICAgIGlmIChyZXN0LnJlcXVlc3RUaW1lb3V0ID4gMCkgc2lnbmFscy5wdXNoKEFib3J0U2lnbmFsLnRpbWVvdXQocmVzdC5yZXF1ZXN0VGltZW91dCkpO1xuXG4gICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCB7IC4uLnBheWxvYWQsIHNpZ25hbDogc2lnbmFscy5sZW5ndGggPiAwID8gQWJvcnRTaWduYWwuYW55KHNpZ25hbHMpIDogdW5kZWZpbmVkIH0pO1xuICAgICAgcmVzdC5ldmVudHMucmVxdWVzdChyZXF1ZXN0LCB7XG4gICAgICAgIGJvZHk6IG9wdGlvbnMucmVxdWVzdEJvZHlPcHRpb25zPy5ib2R5LFxuICAgICAgfSk7XG5cbiAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGBzZW5kaW5nIHJlcXVlc3QgdG8gJHt1cmx9YCwgJ3dpdGggcGF5bG9hZDonLCB7IC4uLnBheWxvYWQsIGhlYWRlcnM6IGxvZ2dpbmdIZWFkZXJzIH0pO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KS5jYXRjaChhc3luYyAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVzdC5ldmVudHMucmVxdWVzdEVycm9yKHJlcXVlc3QsIGVycm9yLCB7IGJvZHk6IG9wdGlvbnMucmVxdWVzdEJvZHlPcHRpb25zPy5ib2R5IH0pO1xuICAgICAgICAvLyBNYXJrIHJlcXVlc3QgYXMgY29tcGxldGVkXG4gICAgICAgIHJlc3QuaW52YWxpZEJ1Y2tldC5oYW5kbGVDb21wbGV0ZWRSZXF1ZXN0KDk5OSwgZmFsc2UpO1xuXG4gICAgICAgIC8vIFRoZSBjYWxsZXIgYWJvcnRlZCB0aGUgcmVxdWVzdCwgbmV2ZXIgcmUtc2VuZCBpdCwgRGlzY29yZCBtYXkgaGF2ZSByZWNlaXZlZCBpdCBhbHJlYWR5LiBUaGUgY2FsbGVyIHdhcyByZWplY3RlZCB0aGUgbW9tZW50IHRoZSBzaWduYWwgZmlyZWQuXG4gICAgICAgIGlmIChvcHRpb25zLnJlcXVlc3RCb2R5T3B0aW9ucz8uc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgICAgb3B0aW9ucy5yZWplY3Qoe1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgc3RhdHVzOiA5OTksXG4gICAgICAgICAgICBlcnJvcjogJ1RoZSByZXF1ZXN0IHdhcyBhYm9ydGVkLicsXG4gICAgICAgICAgICBlcnJvck9iamVjdDogZXJyb3IsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGF0dGVtcHQgaGl0IGByZXN0LnJlcXVlc3RUaW1lb3V0YCBhbmQgd2FzIGFib3J0ZWQuIFRyZWF0IGl0IGxpa2UgYSB0cmFuc2llbnQgZmFpbHVyZSBhbmQgcmV0cnlcbiAgICAgICAgLy8gaXQgdGhyb3VnaCB0aGUgcXVldWUsIHNvIGEgc2luZ2xlIHN0YWxsZWQgY29ubmVjdGlvbiBkb2Vzbid0IHBlcm1hbmVudGx5IGZhaWwgdGhlIHJlcXVlc3QuXG4gICAgICAgIGlmIChpc1RpbWVvdXRFcnJvcihlcnJvcikpIHJldHVybiBhd2FpdCBoYW5kbGVUaW1lb3V0KG9wdGlvbnMsIGVycm9yKTtcblxuICAgICAgICByZXN0LmxvZ2dlci5kZWJ1ZyhgcmVxdWVzdCBmZXRjaCB0byAke3VybH0gZmFpbGVkLmAsIGVycm9yKTtcbiAgICAgICAgb3B0aW9ucy5yZWplY3Qoe1xuICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICBzdGF0dXM6IDk5OSxcbiAgICAgICAgICBlcnJvcjogJ1Bvc3NpYmxlIG5ldHdvcmsgb3IgcmVxdWVzdCBzaGFwZSBpc3N1ZSBvY2N1cnJlZC4gSWYgdGhpcyBpcyByYXJlLCBpdHMgYSBuZXR3b3JrIGdsaXRjaC4gSWYgaXQgb2NjdXJzIGEgbG90IHNvbWV0aGluZyBpcyB3cm9uZy4nLFxuICAgICAgICAgIGVycm9yT2JqZWN0OiBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgcmVzcG9uc2UgaXMgdW5kZWZpbmVkLCB0aGUgZXJyb3IgaGFzIGJlZW4gaGFuZGxlZCBpbiB0aGUgY2F0Y2ggYmxvY2sgYWJvdmVcbiAgICAgIGlmICghcmVzcG9uc2UpIHJldHVybjtcblxuICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYHJlcXVlc3QgZmV0Y2hlZCBmcm9tICR7dXJsfSB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c30gJiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG5cbiAgICAgIC8vIFNvbWV0aW1lcyB0aGUgQ29udGVudC1UeXBlIG1heSBiZSBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIiwgZm9yIHRoaXMgcmVhc29uLCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBzdGFydCBvZiB0aGUgaGVhZGVyXG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKT8uc3RhcnRzV2l0aCgnYXBwbGljYXRpb24vanNvbicpID8gcmVzcG9uc2UuanNvbigpIDogcmVzcG9uc2UudGV4dCgpKS5jYXRjaCgoKSA9PiBudWxsKTtcblxuICAgICAgcmVzdC5ldmVudHMucmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UsIHtcbiAgICAgICAgcmVxdWVzdEJvZHk6IG9wdGlvbnMucmVxdWVzdEJvZHlPcHRpb25zPy5ib2R5LFxuICAgICAgICByZXNwb25zZUJvZHk6IGJvZHksXG4gICAgICB9KTtcblxuICAgICAgLy8gTWFyayByZXF1ZXN0IGFzIGNvbXBsZXRlZFxuICAgICAgcmVzdC5pbnZhbGlkQnVja2V0LmhhbmRsZUNvbXBsZXRlZFJlcXVlc3QocmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5oZWFkZXJzLmdldChSQVRFX0xJTUlUX1NDT1BFX0hFQURFUikgPT09ICdzaGFyZWQnKTtcblxuICAgICAgLy8gU2V0IHRoZSBidWNrZXQgaWQgaWYgaXQgd2FzIGF2YWlsYWJsZSBvbiB0aGUgaGVhZGVyc1xuICAgICAgY29uc3QgYnVja2V0SWQgPSByZXN0LnByb2Nlc3NIZWFkZXJzKFxuICAgICAgICBvcHRpb25zLnNpbXBsaWZpZWRVcmwgPz8gcmVzdC5zaW1wbGlmeVVybChvcHRpb25zLnJvdXRlLCBvcHRpb25zLm1ldGhvZCksXG4gICAgICAgIHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgIHBheWxvYWQuaGVhZGVycy5hdXRob3JpemF0aW9uLFxuICAgICAgKTtcblxuICAgICAgaWYgKGJ1Y2tldElkKSBvcHRpb25zLmJ1Y2tldElkID0gYnVja2V0SWQ7XG5cbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPCBIdHRwUmVzcG9uc2VDb2RlLlN1Y2Nlc3MgfHwgcmVzcG9uc2Uuc3RhdHVzID49IEh0dHBSZXNwb25zZUNvZGUuRXJyb3IpIHtcbiAgICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYFJlcXVlc3QgdG8gJHt1cmx9IGZhaWxlZC5gKTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSBIdHRwUmVzcG9uc2VDb2RlLlRvb01hbnlSZXF1ZXN0cykge1xuICAgICAgICAgIG9wdGlvbnMucmVqZWN0KHsgb2s6IGZhbHNlLCBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCwgYm9keSB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXN0LmxvZ2dlci5kZWJ1ZyhgUmVxdWVzdCB0byAke3VybH0gd2FzIHJhdGVsaW1pdGVkLmApO1xuICAgICAgICAvLyBUb28gbWFueSBhdHRlbXB0cywgZ2V0IHJpZCBvZiByZXF1ZXN0IGZyb20gcXVldWUuXG4gICAgICAgIGlmIChvcHRpb25zLnJldHJ5Q291bnQgPj0gcmVzdC5tYXhSZXRyeUNvdW50KSB7XG4gICAgICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYFJlcXVlc3QgdG8gJHt1cmx9IGV4Y2VlZGVkIHRoZSBtYXhpbXVtIGFsbG93ZWQgcmV0cmllcy5gLCAnd2l0aCBwYXlsb2FkOicsIHsgLi4ucGF5bG9hZCwgaGVhZGVyczogbG9nZ2luZ0hlYWRlcnMgfSk7XG4gICAgICAgICAgLy8gcmVzdC5kZWJ1ZyhgW1JFU1QgLSBSZXRyaWVzTWF4ZWRdICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9YClcbiAgICAgICAgICBvcHRpb25zLnJlamVjdCh7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgICAgICBlcnJvcjogJ1RoZSByZXF1ZXN0IHdhcyByYXRlIGxpbWl0ZWQgYW5kIGl0IG1heGVkIG91dCB0aGUgcmV0cmllcyBsaW1pdC4nLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucy5yZXRyeUNvdW50ICs9IDE7XG5cbiAgICAgICAgY29uc3QgcmVzZXRBZnRlciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdyZXRyeS1hZnRlcicpO1xuICAgICAgICBpZiAocmVzZXRBZnRlcikgYXdhaXQgZGVsYXkoTnVtYmVyKHJlc2V0QWZ0ZXIpICogMTAwMCk7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IG9wdGlvbnMucmV0cnlSZXF1ZXN0Py4ob3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIC8vIERpc2NvcmQgc29tZXRpbWVzIHNlbmRzIGEgcmVzcG9uc2Ugd2l0aCBubyBjb250ZW50XG4gICAgICBvcHRpb25zLnJlc29sdmUoeyBvazogdHJ1ZSwgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIGJvZHk6IHJlc3BvbnNlLnN0YXR1cyA9PT0gSHR0cFJlc3BvbnNlQ29kZS5Ob0NvbnRlbnQgPyB1bmRlZmluZWQgOiBib2R5IH0pO1xuICAgIH0sXG5cbiAgICBzaW1wbGlmeVVybCh1cmwsIG1ldGhvZCkge1xuICAgICAgY29uc3Qgcm91dGVJbmZvcm1hdGlvbktleTogc3RyaW5nW10gPSBbbWV0aG9kXTtcblxuICAgICAgY29uc3QgcXVlcnlQYXJhbUluZGV4ID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgICAgIGNvbnN0IHJvdXRlID0gcXVlcnlQYXJhbUluZGV4ICE9PSAtMSA/IHVybC5zbGljZSgwLCBxdWVyeVBhcmFtSW5kZXgpIDogdXJsO1xuXG4gICAgICAvLyBTaW5jZSB0aGUgdXJscyBzdGFydCB3aXRoIC8gdGhlIGZpcnN0IHBhcnQgd2lsbCBhbHdheXMgYmUgZW1wdHlcbiAgICAgIGNvbnN0IHNwbGl0dGVkUm91dGUgPSByb3V0ZS5zcGxpdCgnLycpO1xuXG4gICAgICAvLyAxKSBTdHJpcCB0aGUgbWlub3IgcGFyYW1zXG4gICAgICAvLyAgICBUaGUgb25seSBtYWpvcnMgYXJlIGNoYW5uZWxzLCBndWlsZHMsIHdlYmhvb2tzIGFuZCB3ZWJob29rcyB3aXRoIHRoZWlyIHRva2VuXG5cbiAgICAgIGNvbnN0IHN0cmlwcGVkUm91dGUgPSBzcGxpdHRlZFJvdXRlXG4gICAgICAgIC5tYXAoKHBhcnQsIGluZGV4LCBhcnJheSkgPT4ge1xuICAgICAgICAgIC8vIFdoaWxlIHBhcnNlSW50IHdpbGwgdHJ1bmNhdGUgdGhlIHNub3dmbGFrZSBpZCwgaXQgd2lsbCBzdGlsbCB0ZWxsIHVzIGlmIGl0IGlzIGEgbnVtYmVyXG4gICAgICAgICAgY29uc3QgaXNOdW1iZXIgPSBOdW1iZXIuaXNGaW5pdGUocGFyc2VJbnQocGFydCwgMTApKTtcblxuICAgICAgICAgIGlmICghaXNOdW1iZXIpIHtcbiAgICAgICAgICAgIC8vIFJlYWN0aW9ucyBlbW9qaSBuZWVkIHRvIGJlIHN0cmlwcGVkIGFzIGl0IGlzIGEgbWlub3IgcGFyYW1ldGVyXG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gMSAmJiBhcnJheVtpbmRleCAtIDFdID09PSAncmVhY3Rpb25zJykgcmV0dXJuICd4JztcbiAgICAgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIHdlYmhvb2sgb3IgaWYgaXQgaXMgcGFydCBvZiB0aGUgcm91dGUsIGtlZXAgaXQgYXMgaXQgaXMgYSBtYWpvciBwYXJhbWV0ZXJcbiAgICAgICAgICAgIHJldHVybiBwYXJ0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGFyZSBvbiBhIGNoYW5uZWwgaWQsIGEgZ3VpbGQgaWQgb3IgYSB3ZWJob29rIGlkXG4gICAgICAgICAgY29uc3QgaXNNYWpvciA9IGluZGV4ID49IDEgJiYgKGFycmF5W2luZGV4IC0gMV0gPT09ICdjaGFubmVscycgfHwgYXJyYXlbaW5kZXggLSAxXSA9PT0gJ2d1aWxkcycgfHwgYXJyYXlbaW5kZXggLSAxXSA9PT0gJ3dlYmhvb2tzJyk7XG5cbiAgICAgICAgICBpZiAoaXNNYWpvcikgcmV0dXJuIHBhcnQ7XG5cbiAgICAgICAgICByZXR1cm4gJ3gnO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbignLycpO1xuXG4gICAgICByb3V0ZUluZm9ybWF0aW9uS2V5LnB1c2goc3RyaXBwZWRSb3V0ZSk7XG5cbiAgICAgIC8vIDIpIEFjY291bnQgZm9yIGV4Y2VwdGlvbnNcbiAgICAgIC8vICAgIC0gaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmQvZGlzY29yZC1hcGktZG9jcy9pc3N1ZXMvMTA5MlxuICAgICAgLy8gICAgLSBodHRwczovL2dpdGh1Yi5jb20vZGlzY29yZC9kaXNjb3JkLWFwaS1kb2NzL2lzc3Vlcy8xMjk1XG5cbiAgICAgIC8vIFRoZSAyIGV4Y2VwdGlvbnMgYXJlIGZvciBtZXNzYWdlIGRlbGV0ZSwgc28gd2UgbmVlZCB0byBjaGVjayBpZiB3ZSBhcmUgaW4gdGhhdCByb3V0ZVxuICAgICAgaWYgKG1ldGhvZCA9PT0gJ0RFTEVURScgJiYgc3BsaXR0ZWRSb3V0ZS5sZW5ndGggPT09IDUgJiYgc3BsaXR0ZWRSb3V0ZVsxXSA9PT0gJ2NoYW5uZWxzJyAmJiBzdHJpcHBlZFJvdXRlLmVuZHNXaXRoKCcvbWVzc2FnZXMveCcpKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VJZCA9IHNwbGl0dGVkUm91dGVbNF07XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IHNub3dmbGFrZVRvVGltZXN0YW1wKG1lc3NhZ2VJZCk7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmQvZGlzY29yZC1hcGktZG9jcy9pc3N1ZXMvMTA5MlxuICAgICAgICBpZiAobm93IC0gdGltZXN0YW1wIDwgMTBfMDAwKSB7XG4gICAgICAgICAgcm91dGVJbmZvcm1hdGlvbktleS5wdXNoKCdtZXNzYWdlLWRlbGV0ZS0xMHMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kaXNjb3JkL2Rpc2NvcmQtYXBpLWRvY3MvaXNzdWVzLzEyOTVcbiAgICAgICAgLy8gMiB3ZWVrcyA9IDIgKiA3ICogMjQgKiA2MCAqIDYwICogMTAwMCA9IDEyMDk2MDAwMDBcbiAgICAgICAgaWYgKG5vdyAtIHRpbWVzdGFtcCA+IDEyMDk2MDAwMDApIHtcbiAgICAgICAgICByb3V0ZUluZm9ybWF0aW9uS2V5LnB1c2goJ21lc3NhZ2UtZGVsZXRlLTJ3Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJvdXRlSW5mb3JtYXRpb25LZXkuam9pbignOicpO1xuICAgIH0sXG5cbiAgICBhc3luYyBwcm9jZXNzUmVxdWVzdChyZXF1ZXN0OiBTZW5kUmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgIHJlcXVlc3Quc2ltcGxpZmllZFVybCA/Pz0gcmVzdC5zaW1wbGlmeVVybChyZXF1ZXN0LnJvdXRlLCByZXF1ZXN0Lm1ldGhvZCk7XG4gICAgICBjb25zdCB1cmwgPSByZXF1ZXN0LnNpbXBsaWZpZWRVcmw7XG5cbiAgICAgIGlmIChyZXF1ZXN0LnJ1blRocm91Z2hRdWV1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYXdhaXQgcmVzdC5zZW5kUmVxdWVzdChyZXF1ZXN0KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSByZXF1ZXN0IGhhcyBhIHRva2VuLCB1c2UgaXRcbiAgICAgIC8vIEVsc2UgZmFsbGJhY2sgdG8gcHJlZml4IHdpdGggdGhlIGJvdCB0b2tlblxuICAgICAgY29uc3QgcXVldWVJZGVudGlmaWVyID0gcmVxdWVzdC5yZXF1ZXN0Qm9keU9wdGlvbnM/LmhlYWRlcnM/LmF1dGhvcml6YXRpb24gPz8gYEJvdCAke3Jlc3QudG9rZW59YDtcblxuICAgICAgY29uc3QgcXVldWUgPSByZXN0LnF1ZXVlcy5nZXQoYCR7cXVldWVJZGVudGlmaWVyfSR7dXJsfWApO1xuXG4gICAgICBpZiAocXVldWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBxdWV1ZS5tYWtlUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENSRUFURVMgQSBORVcgUVVFVUVcbiAgICAgICAgY29uc3QgYnVja2V0UXVldWUgPSBuZXcgUXVldWUocmVzdCwgeyB1cmwsIGRlbGV0ZVF1ZXVlRGVsYXk6IHJlc3QuZGVsZXRlUXVldWVEZWxheSwgaWRlbnRpZmllcjogcXVldWVJZGVudGlmaWVyIH0pO1xuXG4gICAgICAgIC8vIFNhdmUgcXVldWVcbiAgICAgICAgcmVzdC5xdWV1ZXMuc2V0KGAke3F1ZXVlSWRlbnRpZmllcn0ke3VybH1gLCBidWNrZXRRdWV1ZSk7XG5cbiAgICAgICAgLy8gQWRkIHJlcXVlc3QgdG8gcXVldWVcbiAgICAgICAgYnVja2V0UXVldWUubWFrZVJlcXVlc3QocmVxdWVzdCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIG1ha2VSZXF1ZXN0KG1ldGhvZCwgcm91dGUsIG9wdGlvbnMpIHtcbiAgICAgIC8vIFRoaXMgZXJyb3IgbmVlZHMgdG8gYmUgY3JlYXRlZCBoZXJlIGJlY2F1c2Ugb2YgaG93IHN0YWNrIHRyYWNlcyBnZXQgY2FsY3VsYXRlZFxuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoKTtcblxuICAgICAgaWYgKHJlc3QuaXNQcm94aWVkKSB7XG4gICAgICAgIGlmIChyZXN0LmF1dGhvcml6YXRpb24pIHtcbiAgICAgICAgICBvcHRpb25zID8/PSB7fTtcbiAgICAgICAgICBvcHRpb25zLmhlYWRlcnMgPz89IHt9O1xuICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1tyZXN0LmF1dGhvcml6YXRpb25IZWFkZXJdID0gcmVzdC5hdXRob3JpemF0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXJsID0gYCR7cmVzdC5iYXNlVXJsfS92JHtyZXN0LnZlcnNpb259JHtyb3V0ZX1gO1xuXG4gICAgICAgIC8vIEFuIGF0dGVtcHQgdGhhdCBmYWlsZWQgd2l0aG91dCBhIHJlc3BvbnNlIGlzIG5vdCByZS1zZW50IGJ5IGRlZmF1bHQuIFdoYXRldmVyIGl0IGZhaWxlZCBvbiwgdGhlIHByb3h5IG1heSBhbHJlYWR5IGhhdmUgdGhlIHJlcXVlc3RcbiAgICAgICAgLy8gKGEgdGltZW91dCBvbmx5IGFib3J0cyBvdXIgc2lkZSBvZiB0aGUgY29ubmVjdGlvbiwgYW5kIGEgc29ja2V0IHRoYXQgZGllcyBvbmNlIHRoZSByZXF1ZXN0IGlzIG9uIHRoZSB3aXJlIG1heSBzdGlsbCBoYXZlIGRlbGl2ZXJlZFxuICAgICAgICAvLyBpdCksIHNvIHJlLXNlbmRpbmcgaXQgd291bGQgZXhlY3V0ZSBub24taWRlbXBvdGVudCByZXF1ZXN0cyB0d2ljZS4gYGZldGNoYCBnaXZlcyBubyB3YXkgdG8gdGVsbCB0aGUgdHdvIGFwYXJ0LCBzbyB0aGUgY2FsbGVyIGlzIHRoZVxuICAgICAgICAvLyBvbmUgd2hvIGRlY2lkZXM6IGBwcm94eS5yZXRyeVJlcXVlc3RzYCBzYXlzIHJlLXNlbmRpbmcgYWdhaW5zdCB0aGlzIHByb3h5IGlzIHNhZmUuIFJldHJ5aW5nIHRvd2FyZHMgRGlzY29yZCBpcyB0aGUgcHJveHkncyBqb2IsIGl0XG4gICAgICAgIC8vIGlzIHRoZSBvbmUgdGFsa2luZyB0byBEaXNjb3JkLlxuICAgICAgICBsZXQgcmV0cnlDb3VudCA9IDA7XG5cbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IG1heSBoYXZlIGJlZW4gYWJvcnRlZCB3aGlsZSB0aGUgcHJldmlvdXMgYXR0ZW1wdCB3YXMgdGltaW5nIG91dCwgbmV2ZXIgc2VuZCBpdCBpbiB0aGF0IGNhc2UuXG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgICAgICAgdGhyb3cgcmVzdC5jcmVhdGVSZXF1ZXN0RXJyb3IoZXJyb3IsIHsgb2s6IGZhbHNlLCBzdGF0dXM6IDk5OSwgZXJyb3I6ICdUaGUgcmVxdWVzdCB3YXMgYWJvcnRlZC4nLCBlcnJvck9iamVjdDogb3B0aW9ucy5zaWduYWwucmVhc29uIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEdpdmUgdGhlIGF0dGVtcHQgYSBkZWFkbGluZSAob21pdHRlZCB3aGVuIGRpc2FibGVkKSBzbyBhIHN0YWxsZWQgY29ubmVjdGlvbiBjYW4ndCBoYW5nIHRoZSBjYWxsZXIgZm9yZXZlciwgYW5kIGhhbmQgdGhlIGNhbGxlcidzXG4gICAgICAgICAgLy8gc2lnbmFsIHRvIGZldGNoIHNvIGFib3J0aW5nIHRlYXJzIGRvd24gYSByZXF1ZXN0IHRoYXQgaXMgYWxyZWFkeSBvbiB0aGUgd2lyZS5cbiAgICAgICAgICBjb25zdCBzaWduYWxzOiBBYm9ydFNpZ25hbFtdID0gW107XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnNpZ25hbCkgc2lnbmFscy5wdXNoKG9wdGlvbnMuc2lnbmFsKTtcbiAgICAgICAgICBpZiAocmVzdC5yZXF1ZXN0VGltZW91dCA+IDApIHNpZ25hbHMucHVzaChBYm9ydFNpZ25hbC50aW1lb3V0KHJlc3QucmVxdWVzdFRpbWVvdXQpKTtcblxuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh1cmwsIHtcbiAgICAgICAgICAgIC4uLnJlc3QuY3JlYXRlUmVxdWVzdEJvZHkobWV0aG9kLCBvcHRpb25zKSxcbiAgICAgICAgICAgIHNpZ25hbDogc2lnbmFscy5sZW5ndGggPiAwID8gQWJvcnRTaWduYWwuYW55KHNpZ25hbHMpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlc3QuZXZlbnRzLnJlcXVlc3QocmVxdWVzdCwge1xuICAgICAgICAgICAgYm9keTogb3B0aW9ucz8uYm9keSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoKHJlcXVlc3QpLmNhdGNoKGFzeW5jIChmZXRjaEVycm9yKSA9PiB7XG4gICAgICAgICAgICByZXN0LmV2ZW50cy5yZXF1ZXN0RXJyb3IocmVxdWVzdCwgZmV0Y2hFcnJvciwgeyBib2R5OiBvcHRpb25zPy5ib2R5IH0pO1xuXG4gICAgICAgICAgICAvLyBUaGUgY2FsbGVyIGFib3J0ZWQgdGhlIHJlcXVlc3QsIG5ldmVyIHJlLXNlbmQgaXQsIHRoZSBwcm94eSBtYXkgaGF2ZSByZWNlaXZlZCBpdCBhbHJlYWR5LlxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgICAgICAgICB0aHJvdyByZXN0LmNyZWF0ZVJlcXVlc3RFcnJvcihlcnJvciwgeyBvazogZmFsc2UsIHN0YXR1czogOTk5LCBlcnJvcjogJ1RoZSByZXF1ZXN0IHdhcyBhYm9ydGVkLicsIGVycm9yT2JqZWN0OiBmZXRjaEVycm9yIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0aW1lZE91dCA9IGlzVGltZW91dEVycm9yKGZldGNoRXJyb3IpO1xuXG4gICAgICAgICAgICBpZiAocmVzdC5yZXRyeVByb3hpZWRSZXF1ZXN0cyAmJiByZXRyeUNvdW50IDwgcmVzdC5tYXhSZXRyeUNvdW50ICYmIHJldHJ5Q291bnQgPCByZXN0Lm1heFByb3h5UmV0cnlDb3VudCkge1xuICAgICAgICAgICAgICByZXRyeUNvdW50Kys7XG4gICAgICAgICAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGByZXF1ZXN0IHRvIHByb3h5ICR7dXJsfSBmYWlsZWQgd2l0aG91dCBhIHJlc3BvbnNlLCByZXRyeWluZy5gLCBmZXRjaEVycm9yKTtcbiAgICAgICAgICAgICAgLy8gV2FpdCBhIGxpdHRsZSBsb25nZXIgYmVmb3JlIGVhY2ggZnVydGhlciBhdHRlbXB0IHNvIGEgcHJveHkgdGhhdCBpcyBkb3duIGlzbid0IGhhbW1lcmVkIGluIGEgdGlnaHQgbG9vcCwgd2hpbGUgc3RheWluZ1xuICAgICAgICAgICAgICAvLyBmcmVxdWVudCBlbm91Z2ggdG8gbm90aWNlIGl0IGNvbWluZyBiYWNrLiBBIHRpbWVkIG91dCBhdHRlbXB0IGFscmVhZHkgc2F0IG91dCBgcmVxdWVzdFRpbWVvdXRgLCBzbyBpdCBnb2VzIGFnYWluIHJpZ2h0IGF3YXkuXG4gICAgICAgICAgICAgIGlmICghdGltZWRPdXQpIGF3YWl0IGRlbGF5KHJlc3QucHJveHlSZXRyeURlbGF5U3RlcCAqIHJldHJ5Q291bnQpO1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGltZWRPdXQpIHtcbiAgICAgICAgICAgICAgcmVzdC5sb2dnZXIuZGVidWcoYHJlcXVlc3QgdG8gcHJveHkgJHt1cmx9IHRpbWVkIG91dCBhZnRlciAke3Jlc3QucmVxdWVzdFRpbWVvdXR9bXMuYCk7XG4gICAgICAgICAgICAgIHRocm93IHJlc3QuY3JlYXRlUmVxdWVzdEVycm9yKGVycm9yLCB7XG4gICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHN0YXR1czogOTk5LFxuICAgICAgICAgICAgICAgIGVycm9yOiAnVGhlIHJlcXVlc3QgdGltZWQgb3V0IGFuZCBpdCBtYXhlZCBvdXQgdGhlIHJldHJpZXMgbGltaXQuJyxcbiAgICAgICAgICAgICAgICBlcnJvck9iamVjdDogZmV0Y2hFcnJvcixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3QubG9nZ2VyLmRlYnVnKGByZXF1ZXN0IGZldGNoIHRvIHByb3h5ICR7dXJsfSBmYWlsZWQuYCwgZmV0Y2hFcnJvcik7XG4gICAgICAgICAgICB0aHJvdyByZXN0LmNyZWF0ZVJlcXVlc3RFcnJvcihlcnJvciwge1xuICAgICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICAgIHN0YXR1czogOTk5LFxuICAgICAgICAgICAgICBlcnJvcjpcbiAgICAgICAgICAgICAgICAnUG9zc2libGUgbmV0d29yayBvciByZXF1ZXN0IHNoYXBlIGlzc3VlIG9jY3VycmVkLiBJZiB0aGlzIGlzIHJhcmUsIGl0cyBhIG5ldHdvcmsgZ2xpdGNoLiBJZiBpdCBvY2N1cnMgYSBsb3Qgc29tZXRoaW5nIGlzIHdyb25nLicsXG4gICAgICAgICAgICAgIGVycm9yT2JqZWN0OiBmZXRjaEVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBJZiByZXN1bHQgaXMgdW5kZWZpbmVkLCB0aGUgYXR0ZW1wdCBmYWlsZWQgaW4gYSB3YXkgdGhhdCBpcyBzYWZlIHRvIHJlLXNlbmQgYW5kIGlzIGJlaW5nIHJldHJpZWQuXG4gICAgICAgICAgaWYgKCFyZXN1bHQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgLy8gU29tZXRpbWVzIHRoZSBDb250ZW50LVR5cGUgbWF5IGJlIFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLCBmb3IgdGhpcyByZWFzb24sIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHN0YXJ0IG9mIHRoZSBoZWFkZXJcbiAgICAgICAgICBsZXQgYm9keVJlYWRGYWlsZWQgPSBmYWxzZTtcbiAgICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgKHJlc3VsdC5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk/LnN0YXJ0c1dpdGgoJ2FwcGxpY2F0aW9uL2pzb24nKSA/IHJlc3VsdC5qc29uKCkgOiByZXN1bHQudGV4dCgpKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICBib2R5UmVhZEZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJlc3QuZXZlbnRzLnJlc3BvbnNlKHJlcXVlc3QsIHJlc3VsdCwge1xuICAgICAgICAgICAgcmVxdWVzdEJvZHk6IG9wdGlvbnM/LmJvZHksXG4gICAgICAgICAgICByZXNwb25zZUJvZHk6IGJvZHksXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBgZmV0Y2hgIHJlc29sdmVzIG9uY2UgdGhlIGhlYWRlcnMgYXJlIGluLCBzbyBhbiBhYm9ydCBjYW4gbGFuZCB3aGlsZSB0aGUgYm9keSBhYm92ZSBpcyBzdGlsbCBiZWluZyByZWFkLiBUaGF0IHJlYWQgcmVqZWN0cywgdGhlXG4gICAgICAgICAgLy8gZmFsbGJhY2sgdHVybnMgaXQgaW50byBhIGBudWxsYCBib2R5IGFuZCB0aGUgY2FsbGVyIGdldHMgaXQgYmFjayBhcyBhIHN1Y2Nlc3NmdWwgZW1wdHkgcmVzcG9uc2UuIEEgcmVhZCB0aGF0IGRpZCBmaW5pc2ggaXMga2VwdCxcbiAgICAgICAgICAvLyB0aGUgc2FtZSB3YXkgdGhlIHF1ZXVlZCBwYXRoIGhhbmRzIGJhY2sgYSByZXN1bHQgdGhhdCBhcnJpdmVkIGJlZm9yZSB0aGUgc2lnbmFsIGZpcmVkLlxuICAgICAgICAgIGlmIChib2R5UmVhZEZhaWxlZCAmJiBvcHRpb25zPy5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IHJlc3QuY3JlYXRlUmVxdWVzdEVycm9yKGVycm9yLCB7IG9rOiBmYWxzZSwgc3RhdHVzOiA5OTksIGVycm9yOiAnVGhlIHJlcXVlc3Qgd2FzIGFib3J0ZWQuJywgZXJyb3JPYmplY3Q6IG9wdGlvbnMuc2lnbmFsLnJlYXNvbiB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgICAgdGhyb3cgcmVzdC5jcmVhdGVSZXF1ZXN0RXJyb3IoZXJyb3IsIHsgb2s6IGZhbHNlLCBzdGF0dXM6IHJlc3VsdC5zdGF0dXMsIHN0YXR1c1RleHQ6IHJlc3VsdC5zdGF0dXNUZXh0LCBib2R5IH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXN1bHQuc3RhdHVzICE9PSAyMDQgPyAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShib2R5KSA6IGJvZHkpIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICAgICAgY29uc3QgYWJvcnRMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgICAvLyBSZWplY3QgcmlnaHQgYXdheSBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBxdWV1ZSB0byByZWFjaCB0aGUgcmVxdWVzdC4gVGhlIHNpZ25hbCBpcyBhdHRhY2hlZCB0byB0aGUgZmV0Y2ggaXRzZWxmIGFzIHdlbGwsIHNvIGFuXG4gICAgICAgICAgLy8gYXR0ZW1wdCB0aGF0IGlzIGFscmVhZHkgaW4gZmxpZ2h0IGdldHMgaXRzIGNvbm5lY3Rpb24gdG9ybiBkb3duIHRvby5cbiAgICAgICAgICBwYXlsb2FkLnJlamVjdCh7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBzdGF0dXM6IDk5OSxcbiAgICAgICAgICAgIGVycm9yOiAnVGhlIHJlcXVlc3Qgd2FzIGFib3J0ZWQuJyxcbiAgICAgICAgICAgIGVycm9yT2JqZWN0OiBzaWduYWw/LnJlYXNvbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBwYXlsb2FkOiBTZW5kUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgICAgcm91dGUsXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIHJlcXVlc3RCb2R5T3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgICByZXRyeUNvdW50OiAwLFxuICAgICAgICAgIHJldHJ5UmVxdWVzdDogYXN5bmMgKHBheWxvYWQ6IFNlbmRSZXF1ZXN0T3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgYXdhaXQgcmVzdC5wcm9jZXNzUmVxdWVzdChwYXlsb2FkKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc29sdmU6IChkYXRhKSA9PiB7XG4gICAgICAgICAgICBzaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRMaXN0ZW5lcik7XG4gICAgICAgICAgICByZXNvbHZlKGRhdGEuc3RhdHVzICE9PSAyMDQgPyAoZGF0YS5ib2R5IGFzIFBhcmFtZXRlcnM8dHlwZW9mIHJlc29sdmU+WzBdKSA6IHVuZGVmaW5lZCEpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVqZWN0OiAocmVhc29uKSA9PiB7XG4gICAgICAgICAgICBzaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRMaXN0ZW5lcik7XG4gICAgICAgICAgICByZWplY3QocmVzdC5jcmVhdGVSZXF1ZXN0RXJyb3IoZXJyb3IsIHJlYXNvbikpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcnVuVGhyb3VnaFF1ZXVlOiBvcHRpb25zPy5ydW5UaHJvdWdoUXVldWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUmVqZWN0IGEgcXVldWVkIHJlcXVlc3QgYXMgc29vbiBhcyBpdHMgc2lnbmFsIGFib3J0cyBpbnN0ZWFkIG9mIHdoZW4gdGhlIHF1ZXVlIHJlYWNoZXMgaXQsIHNvIGEgY2FsbGVyIGVuZm9yY2luZyBhIGRlYWRsaW5lIGdldHMgaXRzXG4gICAgICAgIC8vIGFuc3dlciByaWdodCBhd2F5LiBGZXRjaCByZWZ1c2luZyB0byBzZW5kIGFuIGFscmVhZHkgYWJvcnRlZCByZXF1ZXN0IGlzIHdoYXQgZ3VhcmFudGVlcyB0aGUgc3RhbGUgcXVldWUgZW50cnkgbmV2ZXIgZ29lcyBvdXQuXG4gICAgICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgICAgICBhYm9ydExpc3RlbmVyKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0TGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTtcblxuICAgICAgICBhd2FpdCByZXN0LnByb2Nlc3NSZXF1ZXN0KHBheWxvYWQpO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldCh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdHRVQnLCB1cmwsIG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBwb3N0KHVybDogc3RyaW5nLCBvcHRpb25zPzogT21pdDxDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMsICdib2R5JyB8ICdtZXRob2QnPikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BPU1QnLCB1cmwsIG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGUodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBPbWl0PENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucywgJ2JvZHknIHwgJ21ldGhvZCc+KSB7XG4gICAgICBhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdERUxFVEUnLCB1cmwsIG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBwYXRjaCh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQQVRDSCcsIHVybCwgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIGFzeW5jIHB1dCh1cmw6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8Q3JlYXRlUmVxdWVzdEJvZHlPcHRpb25zLCAnYm9keScgfCAnbWV0aG9kJz4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQVVQnLCB1cmwsIG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICAvLyBXZSBuZWVkIHRvIHdyYXAgYWxsIHRoZSBmdW5jdGlvbnMgdG8gcGFzcyB0aGUgcmVzdCBtYW5hZ2VyIGFzIHRoZSBmaXJzdCBhcmd1bWVudCwgc28gd2UgY2FuIHVzZSBpdCBpbiB0aGUgZW5kcG9pbnRzXG4gICAgc25ha2U6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJlc3RFbmRwb2ludHMpLm1hcCgoW2tleSwgZW5kcG9pbnRGdW5jXSkgPT4ge1xuICAgICAgICBjb25zdCBmdW5jID0gZW5kcG9pbnRGdW5jIGFzIChyZXN0OiBSZXN0TWFuYWdlciwgLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuICAgICAgICByZXR1cm4gW2tleSwgYXN5bmMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYXdhaXQgZnVuYyhyZXN0LCAuLi5hcmdzKV07XG4gICAgICB9KSxcbiAgICApIGFzIFJlc3RFbmRwb2ludHMsXG5cbiAgICAvLyBUaGUgY2FtZWxDYXNlIHZlcnNpb25zIGNhbGwgcmVzdC5zbmFrZSBhdCBjYWxsIHRpbWUsIHNvIG92ZXJyaWRpbmcgcmVzdC5zbmFrZS54IGFsc28gY2hhbmdlcyByZXN0LnhcbiAgICAuLi4oT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmtleXMocmVzdEVuZHBvaW50cykubWFwKChrZXkpID0+IFtcbiAgICAgICAga2V5LFxuICAgICAgICBhc3luYyAoLi4uYXJnczogdW5rbm93bltdKSA9PlxuICAgICAgICAgIGNhbWVsaXplKGF3YWl0IChyZXN0LnNuYWtlIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gUHJvbWlzZTx1bmtub3duPj4pW2tleV0oLi4uYXJncykpLFxuICAgICAgXSksXG4gICAgKSBhcyBDYW1lbGl6ZWRSZXN0RW5kcG9pbnRzKSxcbiAgfSBzYXRpc2ZpZXMgUmVzdE1hbmFnZXI7XG5cbiAgcmV0dXJuIHJlc3Q7XG59XG5cbmVudW0gSHR0cFJlc3BvbnNlQ29kZSB7XG4gIC8qKiBNaW5pbXVtIHZhbHVlIG9mIGEgY29kZSBpbiBvZGVyIHRvIGNvbnNpZGVyIHRoYXQgaXQgd2FzIHN1Y2Nlc3NmdWwuICovXG4gIFN1Y2Nlc3MgPSAyMDAsXG4gIC8qKiBSZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIGJ1dCBEaXNjb3JkIHJldHVybmVkIGFuIGVtcHR5IGJvZHkuICovXG4gIE5vQ29udGVudCA9IDIwNCxcbiAgLyoqIE1pbmltdW0gdmFsdWUgb2YgYSBjb2RlIGluIG9yZGVyIHRvIGNvbnNpZGVyIHRoYXQgc29tZXRoaW5nIHdlbnQgd3JvbmcuICovXG4gIEVycm9yID0gNDAwLFxuICAvKiogVGhpcyByZXF1ZXN0IGdvdCByYXRlIGxpbWl0ZWQuICovXG4gIFRvb01hbnlSZXF1ZXN0cyA9IDQyOSxcbn1cblxuLyoqIFdoZXRoZXIgYW4gZXJyb3IgaXMgdGhlIGBUaW1lb3V0RXJyb3JgIHRocm93biBieSBgQWJvcnRTaWduYWwudGltZW91dCgpYC4gKi9cbmZ1bmN0aW9uIGlzVGltZW91dEVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJiBlcnJvci5uYW1lID09PSAnVGltZW91dEVycm9yJztcbn1cbiJdLCJuYW1lcyI6WyJpbnNwZWN0IiwiY2FtZWxpemUiLCJjYW1lbFRvU25ha2VDYXNlIiwiRElTQ09SREVOT19WRVJTSU9OIiwiZGVsYXkiLCJnZXRCb3RJZEZyb21Ub2tlbiIsImhhc1Byb3BlcnR5IiwibG9nZ2VyIiwic25vd2ZsYWtlVG9UaW1lc3RhbXAiLCJyZXN0RW5kcG9pbnRzIiwiY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQiLCJRdWV1ZSIsImNyZWF0ZVJvdXRlcyIsIkRJU0NPUkRfQVBJX1ZFUlNJT04iLCJESVNDT1JEX0FQSV9VUkwiLCJBVURJVF9MT0dfUkVBU09OX0hFQURFUiIsIlJBVEVfTElNSVRfUkVNQUlOSU5HX0hFQURFUiIsIlJBVEVfTElNSVRfUkVTRVRfQUZURVJfSEVBREVSIiwiUkFURV9MSU1JVF9HTE9CQUxfSEVBREVSIiwiUkFURV9MSU1JVF9CVUNLRVRfSEVBREVSIiwiUkFURV9MSU1JVF9MSU1JVF9IRUFERVIiLCJSQVRFX0xJTUlUX1NDT1BFX0hFQURFUiIsImNyZWF0ZVJlc3RNYW5hZ2VyIiwib3B0aW9ucyIsImFwcGxpY2F0aW9uSWQiLCJCaWdJbnQiLCJ0b2tlbiIsImJhc2VVcmwiLCJwcm94eSIsInJlcGxhY2UiLCJiYXNlRXJyb3JQcm90b3R5cGUiLCJjdXN0b20iLCJfZGVwdGgiLCJfaW5zcGVjdCIsImRlcHRoIiwiSW5maW5pdHkiLCJjdXN0b21JbnNwZWN0IiwicmVzdCIsImF1dGhvcml6YXRpb24iLCJhdXRob3JpemF0aW9uSGVhZGVyIiwiZGVsZXRlUXVldWVEZWxheSIsImdsb2JhbGx5UmF0ZUxpbWl0ZWQiLCJpbnZhbGlkQnVja2V0IiwiaXNQcm94aWVkIiwic3RhcnRzV2l0aCIsInVwZGF0ZUJlYXJlclRva2VuRW5kcG9pbnQiLCJyZXRyeVByb3hpZWRSZXF1ZXN0cyIsInJldHJ5UmVxdWVzdHMiLCJtYXhSZXRyeUNvdW50IiwibWF4UHJveHlSZXRyeUNvdW50IiwicHJveHlSZXRyeURlbGF5U3RlcCIsInJlcXVlc3RUaW1lb3V0IiwicHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMiLCJxdWV1ZXMiLCJNYXAiLCJyYXRlTGltaXRlZFBhdGhzIiwidmVyc2lvbiIsImV2ZW50cyIsInJlcXVlc3QiLCJyZXNwb25zZSIsInJlcXVlc3RFcnJvciIsInJvdXRlcyIsImNyZWF0ZUJhc2VIZWFkZXJzIiwiY2hlY2tSYXRlTGltaXRzIiwidXJsIiwiaWRlbnRpZmllciIsInJhdGVsaW1pdGVkIiwiZ2V0IiwiZ2xvYmFsIiwibm93IiwiRGF0ZSIsInVybFdhaXQiLCJyZXNldFRpbWVzdGFtcCIsImdsb2JhbFdhaXQiLCJ3YWl0IiwiTWF0aCIsIm1heCIsInVwZGF0ZVRva2VuUXVldWVzIiwib2xkVG9rZW4iLCJuZXdUb2tlbiIsIkVycm9yIiwiaGVhZGVycyIsInVuZGVmaW5lZCIsImZldGNoIiwibWV0aG9kIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJuZXdJZGVudGlmaWVyIiwia2V5IiwicXVldWUiLCJlbnRyaWVzIiwiZGVsZXRlIiwibmV3S2V5IiwibmV3UXVldWUiLCJ3YWl0aW5nIiwidW5zaGlmdCIsInBlbmRpbmciLCJwcm9jZXNzV2FpdGluZyIsInByb2Nlc3NQZW5kaW5nIiwiY2xlYW51cCIsInNldCIsInJhdGVsaW1pdFBhdGgiLCJidWNrZXRJZCIsImNoYW5nZVRvRGlzY29yZEZvcm1hdCIsIm9iaiIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsIml0ZW0iLCJuZXdPYmoiLCJPYmplY3QiLCJrZXlzIiwidmFsdWUiLCJpbmNsdWRlcyIsIm5hbWVfbG9jYWxpemF0aW9ucyIsImRlc2NyaXB0aW9uX2xvY2FsaXphdGlvbnMiLCJ0b1N0cmluZyIsImNyZWF0ZVJlcXVlc3RCb2R5IiwidW5hdXRob3JpemVkIiwicmVhc29uIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZmlsZXMiLCJmb3JtIiwiRm9ybURhdGEiLCJpIiwibGVuZ3RoIiwiYXBwZW5kIiwiYmxvYiIsIm5hbWUiLCJmb3JtQm9keSIsImRpc2NvcmRCb2R5IiwicHJvcCIsInB1c2giLCJqb2luIiwiYXNzaWduIiwiY3JlYXRlUmVxdWVzdEVycm9yIiwiZXJyb3IiLCJlcnJvclRleHQiLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwibWVzc2FnZSIsImNvZGUiLCJjYXVzZSIsImNyZWF0ZSIsInByb2Nlc3NSYXRlTGltaXRlZFBhdGhzIiwic2l6ZSIsInNldFRpbWVvdXQiLCJwcm9jZXNzSGVhZGVycyIsInJhdGVMaW1pdGVkIiwicmVtYWluaW5nIiwicmV0cnlBZnRlciIsInJlc2V0IiwiTnVtYmVyIiwibGltaXQiLCJoYW5kbGVDb21wbGV0ZWRSZXF1ZXN0IiwiaW50ZXJ2YWwiLCJnbG9iYWxSZXNldCIsInNlbmRSZXF1ZXN0Iiwicm91dGUiLCJwYXlsb2FkIiwicmVxdWVzdEJvZHlPcHRpb25zIiwiaGFuZGxlVGltZW91dCIsInJldHJ5Q291bnQiLCJkZWJ1ZyIsInJlamVjdCIsIm9rIiwiZXJyb3JPYmplY3QiLCJyZXRyeVJlcXVlc3QiLCJsb2dnaW5nSGVhZGVycyIsImF1dGhvcml6YXRpb25TY2hlbWUiLCJzcGxpdCIsInNpZ25hbHMiLCJzaWduYWwiLCJBYm9ydFNpZ25hbCIsInRpbWVvdXQiLCJSZXF1ZXN0IiwiYW55IiwiY2F0Y2giLCJhYm9ydGVkIiwiaXNUaW1lb3V0RXJyb3IiLCJqc29uIiwidGV4dCIsInJlcXVlc3RCb2R5IiwicmVzcG9uc2VCb2R5Iiwic2ltcGxpZmllZFVybCIsInNpbXBsaWZ5VXJsIiwicmVzZXRBZnRlciIsInJlc29sdmUiLCJyb3V0ZUluZm9ybWF0aW9uS2V5IiwicXVlcnlQYXJhbUluZGV4IiwiaW5kZXhPZiIsInNsaWNlIiwic3BsaXR0ZWRSb3V0ZSIsInN0cmlwcGVkUm91dGUiLCJwYXJ0IiwiaW5kZXgiLCJhcnJheSIsImlzTnVtYmVyIiwiaXNGaW5pdGUiLCJwYXJzZUludCIsImlzTWFqb3IiLCJlbmRzV2l0aCIsIm1lc3NhZ2VJZCIsInRpbWVzdGFtcCIsInByb2Nlc3NSZXF1ZXN0IiwicnVuVGhyb3VnaFF1ZXVlIiwicXVldWVJZGVudGlmaWVyIiwibWFrZVJlcXVlc3QiLCJidWNrZXRRdWV1ZSIsInJlc3VsdCIsImZldGNoRXJyb3IiLCJ0aW1lZE91dCIsImJvZHlSZWFkRmFpbGVkIiwicGFyc2UiLCJQcm9taXNlIiwiYWJvcnRMaXN0ZW5lciIsImRhdGEiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiYWRkRXZlbnRMaXN0ZW5lciIsIm9uY2UiLCJwb3N0IiwicGF0Y2giLCJwdXQiLCJzbmFrZSIsImZyb21FbnRyaWVzIiwiZW5kcG9pbnRGdW5jIiwiZnVuYyIsImFyZ3MiLCJIdHRwUmVzcG9uc2VDb2RlIiwiRE9NRXhjZXB0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUE4QkEsT0FBTyxRQUFRLFlBQVk7QUFDekQsU0FDRUMsUUFBUSxFQUNSQyxnQkFBZ0IsRUFDaEJDLGtCQUFrQixFQUNsQkMsS0FBSyxFQUNMQyxpQkFBaUIsRUFDakJDLFdBQVcsRUFDWEMsTUFBTSxFQUNOQyxvQkFBb0IsUUFDZixvQkFBb0I7QUFDM0IsU0FBMERDLGFBQWEsUUFBUSxpQkFBaUI7QUFDaEcsU0FBU0MsMEJBQTBCLFFBQVEscUJBQXFCO0FBQ2hFLFNBQVNDLEtBQUssUUFBUSxhQUFhO0FBQ25DLFNBQVNDLFlBQVksUUFBUSxjQUFjO0FBRzNDLE9BQU8sTUFBTUMsc0JBQXNCLEdBQUc7QUFDdEMsT0FBTyxNQUFNQyxrQkFBa0IsMEJBQTBCO0FBRXpELE9BQU8sTUFBTUMsMEJBQTBCLHFCQUFxQjtBQUM1RCxPQUFPLE1BQU1DLDhCQUE4Qix3QkFBd0I7QUFDbkUsT0FBTyxNQUFNQyxnQ0FBZ0MsMEJBQTBCO0FBQ3ZFLE9BQU8sTUFBTUMsMkJBQTJCLHFCQUFxQjtBQUM3RCxPQUFPLE1BQU1DLDJCQUEyQixxQkFBcUI7QUFDN0QsT0FBTyxNQUFNQywwQkFBMEIsb0JB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