@workflow/cli 5.0.0-beta.27 → 5.0.0-beta.28

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.
Files changed (35) hide show
  1. package/dist/base.d.ts.map +1 -1
  2. package/dist/base.js +8 -2
  3. package/dist/commands/cancel.d.ts.map +1 -1
  4. package/dist/commands/cancel.js +52 -9
  5. package/dist/commands/inspect.d.ts +2 -0
  6. package/dist/commands/inspect.d.ts.map +1 -1
  7. package/dist/commands/inspect.js +23 -3
  8. package/dist/commands/start.d.ts.map +1 -1
  9. package/dist/commands/start.js +8 -3
  10. package/dist/lib/config/types.d.ts +4 -0
  11. package/dist/lib/config/types.d.ts.map +1 -1
  12. package/dist/lib/config/types.js +1 -1
  13. package/dist/lib/inspect/env.d.ts +1 -1
  14. package/dist/lib/inspect/env.js +2 -2
  15. package/dist/lib/inspect/errors.d.ts +3 -0
  16. package/dist/lib/inspect/errors.d.ts.map +1 -0
  17. package/dist/lib/inspect/errors.js +27 -0
  18. package/dist/lib/inspect/output.d.ts +2 -2
  19. package/dist/lib/inspect/output.d.ts.map +1 -1
  20. package/dist/lib/inspect/output.js +253 -130
  21. package/dist/lib/inspect/output.test.js +403 -3
  22. package/dist/lib/inspect/pagination.d.ts +10 -1
  23. package/dist/lib/inspect/pagination.d.ts.map +1 -1
  24. package/dist/lib/inspect/pagination.js +20 -4
  25. package/dist/lib/inspect/run.d.ts.map +1 -1
  26. package/dist/lib/inspect/run.js +32 -9
  27. package/dist/lib/inspect/setup.d.ts.map +1 -1
  28. package/dist/lib/inspect/setup.js +42 -6
  29. package/dist/lib/inspect/time-window.d.ts +28 -0
  30. package/dist/lib/inspect/time-window.d.ts.map +1 -0
  31. package/dist/lib/inspect/time-window.js +61 -0
  32. package/dist/lib/inspect/time-window.test.d.ts +2 -0
  33. package/dist/lib/inspect/time-window.test.d.ts.map +1 -0
  34. package/dist/lib/inspect/time-window.test.js +58 -0
  35. package/package.json +9 -9
@@ -6,7 +6,9 @@ import chalk from 'chalk';
6
6
  import { formatDistance } from 'date-fns';
7
7
  import Table from 'easy-table';
8
8
  import { logger } from '../config/log.js';
9
+ import { getObservabilityUpgradeRequiredMessage, isObservabilityUpgradeRequiredError, } from './errors.js';
9
10
  import { hydrateResourceIO, isEncryptedRef, isExpiredRef, } from './hydration.js';
11
+ import { resolveTimeWindow } from './time-window.js';
10
12
  /**
11
13
  * Create an EncryptionKeyResolver from a World instance.
12
14
  * Returns null if decrypt is false — encrypted data will show as a placeholder.
@@ -31,7 +33,7 @@ function createResolver(world, decrypt) {
31
33
  return cached;
32
34
  };
33
35
  }
34
- import { setupListPagination } from './pagination.js';
36
+ import { setupListPagination, } from './pagination.js';
35
37
  import { streamToConsole } from './stream.js';
36
38
  import { formatISODate, formatStatus as formatStatusAbbrev, getDisplaySettings, getTerminalWidth, isCI, } from './terminal-utils.js';
37
39
  const DEFAULT_PAGE_SIZE = 20;
@@ -84,6 +86,7 @@ const STATUS_COLORS = {
84
86
  failed: chalk.red,
85
87
  cancelled: chalk.strikethrough.yellow,
86
88
  pending: chalk.blue,
89
+ waiting: chalk.blue,
87
90
  };
88
91
  const isStreamId = (value) => {
89
92
  return typeof value === 'string' && value.startsWith('strm_');
@@ -96,6 +99,7 @@ const showStatusLegend = () => {
96
99
  'failed',
97
100
  'cancelled',
98
101
  'pending',
102
+ 'waiting',
99
103
  ];
100
104
  const legendItems = statuses.map((status) => {
101
105
  const colorFunc = STATUS_COLORS[status];
@@ -133,11 +137,23 @@ const extractErrorMessage = (err) => {
133
137
  }
134
138
  return undefined;
135
139
  };
140
+ const getPageInfo = (result) => {
141
+ if (typeof result !== 'object' ||
142
+ result === null ||
143
+ !('pageInfo' in result)) {
144
+ return undefined;
145
+ }
146
+ return result.pageInfo;
147
+ };
136
148
  const handleApiError = (error, backend) => {
137
149
  // First check for Vercel access errors
138
150
  if (checkAndHandleVercelAccessError(error, backend)) {
139
151
  return true;
140
152
  }
153
+ if (isObservabilityUpgradeRequiredError(error)) {
154
+ logger.error(getObservabilityUpgradeRequiredMessage());
155
+ return true;
156
+ }
141
157
  // Handle other HTTP errors
142
158
  if (error && typeof error === 'object') {
143
159
  const err = error;
@@ -166,6 +182,7 @@ const getStatusText = (status) => {
166
182
  const statusTexts = {
167
183
  400: 'Bad Request',
168
184
  401: 'Unauthorized',
185
+ 402: 'Payment Required',
169
186
  403: 'Forbidden',
170
187
  404: 'Not Found',
171
188
  429: 'Too Many Requests',
@@ -229,7 +246,7 @@ export const formatTableValue = (prop, value, opts = {}, displaySettings, item)
229
246
  }
230
247
  if (prop === 'status') {
231
248
  const status = value;
232
- const colorFunc = STATUS_COLORS[status];
249
+ const colorFunc = STATUS_COLORS[status] ?? ((formatted) => formatted);
233
250
  const formattedStatus = displaySettings?.abbreviateStatus
234
251
  ? formatStatusAbbrev(status, true)
235
252
  : status;
@@ -305,6 +322,14 @@ const showJson = (data) => {
305
322
  const json = JSON.stringify(data, null, 2);
306
323
  process.stdout.write(`${json}\n`);
307
324
  };
325
+ const showJsonPage = (page) => {
326
+ showJson({
327
+ data: page.data,
328
+ cursor: page.cursor,
329
+ hasMore: page.hasMore,
330
+ ...(page.pageInfo ? { pageInfo: page.pageInfo } : {}),
331
+ });
332
+ };
308
333
  /**
309
334
  * In tables, we want to show a shorter timestamp, YYYY-MM-DD HH:MM:SS
310
335
  */
@@ -418,31 +443,81 @@ const inlineFormatIO = (io, topLevel = true) => {
418
443
  }
419
444
  return value;
420
445
  };
446
+ /**
447
+ * List views surface metadata only. When the active backend exposes the
448
+ * optional `world.analytics` read namespace we read list pages from it
449
+ * (metadata-only — no payload resolution); otherwise we fall back to the
450
+ * runtime storage APIs with `resolveData: 'none'`.
451
+ *
452
+ * `--withData` forces the runtime path so payloads can be resolved into the
453
+ * table. It is deprecated for list views: view payloads per-resource with
454
+ * `workflow inspect <resource> <id>`.
455
+ */
456
+ const warnWithDataDeprecatedForList = (singular) => {
457
+ logger.warn(`'--withData' is deprecated for list views and will be removed in a future release. Use 'workflow inspect ${singular} <id>' to view payloads for a single ${singular}.`);
458
+ };
421
459
  export const listRuns = async (world, opts = {}) => {
422
460
  const resolveKey = createResolver(world, opts?.decrypt ?? false);
423
461
  if (opts.stepId || opts.runId) {
424
462
  logger.warn('Filtering by step-id or run-id is not supported in list calls, ignoring filter.');
425
463
  }
464
+ if (opts.withData) {
465
+ warnWithDataDeprecatedForList('run');
466
+ }
467
+ const useAnalytics = !opts.withData && Boolean(world.analytics);
426
468
  const resolveData = opts.withData ? 'all' : 'none';
469
+ const status = opts.status;
470
+ // Resolve --since/--until into an explicit listing window. Only the
471
+ // analytics read path supports one; the runtime storage APIs have no time
472
+ // filter. Without the flags the backend applies its default window
473
+ // (trailing 24h on the Vercel backend).
474
+ const timeWindow = resolveTimeWindow(opts);
475
+ if (timeWindow && !useAnalytics) {
476
+ logger.warn('--since/--until require the analytics read path and are ignored by this backend.');
477
+ }
427
478
  // Determine which props to show based on withData flag
428
479
  const props = opts.withData
429
480
  ? WORKFLOW_RUN_LISTED_PROPS
430
481
  : WORKFLOW_RUN_LISTED_PROPS.filter((prop) => !WORKFLOW_RUN_IO_PROPS.includes(prop));
482
+ const fetchRunsPage = async (cursor) => {
483
+ const pagination = {
484
+ sortOrder: opts.sort || 'desc',
485
+ cursor,
486
+ limit: opts.limit || DEFAULT_PAGE_SIZE,
487
+ };
488
+ if (useAnalytics && world.analytics) {
489
+ const runs = await world.analytics.runs.list({
490
+ workflowName: opts.workflowName,
491
+ status,
492
+ ...(timeWindow ?? {}),
493
+ pagination,
494
+ });
495
+ return {
496
+ data: runs.data,
497
+ cursor: runs.cursor,
498
+ hasMore: runs.hasMore,
499
+ pageInfo: getPageInfo(runs),
500
+ };
501
+ }
502
+ const runs = await world.runs.list({
503
+ workflowName: opts.workflowName,
504
+ status,
505
+ pagination,
506
+ resolveData,
507
+ });
508
+ const data = await Promise.all(runs.data.map((r) => hydrateResourceIO(r, resolveKey)));
509
+ return {
510
+ data: data,
511
+ cursor: runs.cursor,
512
+ hasMore: runs.hasMore,
513
+ pageInfo: getPageInfo(runs),
514
+ };
515
+ };
431
516
  // For JSON output, just fetch once and return
432
517
  if (opts.json) {
433
518
  try {
434
- const runs = await world.runs.list({
435
- workflowName: opts.workflowName,
436
- status: opts.status,
437
- pagination: {
438
- sortOrder: opts.sort || 'desc',
439
- cursor: opts.cursor,
440
- limit: opts.limit || DEFAULT_PAGE_SIZE,
441
- },
442
- resolveData,
443
- });
444
- const runsWithHydratedIO = await Promise.all(runs.data.map((r) => hydrateResourceIO(r, resolveKey)));
445
- showJson({ ...runs, data: runsWithHydratedIO });
519
+ const page = await fetchRunsPage(opts.cursor);
520
+ showJsonPage(page);
446
521
  return;
447
522
  }
448
523
  catch (error) {
@@ -457,21 +532,7 @@ export const listRuns = async (world, opts = {}) => {
457
532
  interactive: opts.interactive,
458
533
  fetchPage: async (cursor) => {
459
534
  try {
460
- const runs = await world.runs.list({
461
- workflowName: opts.workflowName,
462
- status: opts.status,
463
- pagination: {
464
- sortOrder: opts.sort || 'desc',
465
- cursor,
466
- limit: opts.limit || DEFAULT_PAGE_SIZE,
467
- },
468
- resolveData,
469
- });
470
- return {
471
- data: runs.data,
472
- cursor: runs.cursor,
473
- hasMore: runs.hasMore,
474
- };
535
+ return await fetchRunsPage(cursor);
475
536
  }
476
537
  catch (error) {
477
538
  if (handleApiError(error, opts.backend)) {
@@ -481,8 +542,7 @@ export const listRuns = async (world, opts = {}) => {
481
542
  }
482
543
  },
483
544
  displayPage: async (runs) => {
484
- const runsWithHydratedIO = await Promise.all(runs.map((r) => hydrateResourceIO(r, resolveKey)));
485
- logger.log(showTable(runsWithHydratedIO, props, opts));
545
+ logger.log(showTable(runs, props, opts));
486
546
  },
487
547
  });
488
548
  };
@@ -547,26 +607,53 @@ export const listSteps = async (world, opts = {
547
607
  logger.error('No run found.');
548
608
  return;
549
609
  }
610
+ if (opts.withData) {
611
+ warnWithDataDeprecatedForList('step');
612
+ }
613
+ const useAnalytics = !opts.withData && Boolean(world.analytics);
550
614
  const resolveData = opts.withData ? 'all' : 'none';
551
615
  // Determine which props to show based on withData flag
552
616
  const props = opts.withData
553
617
  ? STEP_LISTED_PROPS
554
618
  : STEP_LISTED_PROPS.filter((prop) => !STEP_IO_PROPS.includes(prop));
619
+ const fetchStepsPage = async (cursor) => {
620
+ logger.debug(`Fetching steps for run ${runId}`);
621
+ const pagination = {
622
+ sortOrder: opts.sort || 'desc',
623
+ cursor,
624
+ limit: opts.limit || DEFAULT_PAGE_SIZE,
625
+ };
626
+ if (useAnalytics && world.analytics) {
627
+ const steps = await world.analytics.steps.list({ runId, pagination });
628
+ const page = {
629
+ data: steps.data,
630
+ cursor: steps.cursor,
631
+ hasMore: steps.hasMore,
632
+ pageInfo: getPageInfo(steps),
633
+ };
634
+ if (cursor || page.data.length > 0 || page.hasMore) {
635
+ return page;
636
+ }
637
+ logger.debug(`No analytics steps found for run ${runId}; falling back to storage`);
638
+ }
639
+ const stepChunks = await world.steps.list({
640
+ runId,
641
+ pagination,
642
+ resolveData,
643
+ });
644
+ const data = await Promise.all(stepChunks.data.map((s) => hydrateResourceIO(s, resolveKey)));
645
+ return {
646
+ data: data,
647
+ cursor: stepChunks.cursor,
648
+ hasMore: stepChunks.hasMore,
649
+ pageInfo: getPageInfo(stepChunks),
650
+ };
651
+ };
555
652
  // For JSON output, just fetch once and return
556
653
  if (opts.json) {
557
- logger.debug(`Fetching steps for run ${runId}`);
558
654
  try {
559
- const stepChunks = await world.steps.list({
560
- runId,
561
- pagination: {
562
- sortOrder: opts.sort || 'desc',
563
- cursor: opts.cursor,
564
- limit: opts.limit || DEFAULT_PAGE_SIZE,
565
- },
566
- resolveData,
567
- });
568
- const stepsWithHydratedIO = await Promise.all(stepChunks.data.map((s) => hydrateResourceIO(s, resolveKey)));
569
- showJson(stepsWithHydratedIO);
655
+ const page = await fetchStepsPage(opts.cursor);
656
+ showJson(page.data);
570
657
  return;
571
658
  }
572
659
  catch (error) {
@@ -580,22 +667,8 @@ export const listSteps = async (world, opts = {
580
667
  initialCursor: opts.cursor,
581
668
  interactive: opts.interactive,
582
669
  fetchPage: async (cursor) => {
583
- logger.debug(`Fetching steps for run ${runId}`);
584
670
  try {
585
- const stepChunks = await world.steps.list({
586
- runId,
587
- pagination: {
588
- sortOrder: opts.sort || 'desc',
589
- cursor,
590
- limit: opts.limit || DEFAULT_PAGE_SIZE,
591
- },
592
- resolveData,
593
- });
594
- return {
595
- data: stepChunks.data,
596
- cursor: stepChunks.cursor,
597
- hasMore: stepChunks.hasMore,
598
- };
671
+ return await fetchStepsPage(cursor);
599
672
  }
600
673
  catch (error) {
601
674
  if (handleApiError(error, opts.backend)) {
@@ -605,8 +678,7 @@ export const listSteps = async (world, opts = {
605
678
  }
606
679
  },
607
680
  displayPage: async (steps) => {
608
- const stepsWithHydratedIO = await Promise.all(steps.map((s) => hydrateResourceIO(s, resolveKey)));
609
- logger.log(showTable(stepsWithHydratedIO, props, opts));
681
+ logger.log(showTable(steps, props, opts));
610
682
  showInspectInfoBox('step');
611
683
  },
612
684
  });
@@ -730,40 +802,60 @@ export const listEvents = async (world, opts = {}) => {
730
802
  logger.error('No run found.');
731
803
  return;
732
804
  }
805
+ if (opts.withData) {
806
+ warnWithDataDeprecatedForList('event');
807
+ }
808
+ const useAnalytics = !opts.withData && Boolean(world.analytics);
733
809
  const correlationIdFilter = opts.hookId || opts.stepId;
734
- const params = {
735
- runId,
736
- pagination: {
810
+ // Determine which props to show based on withData flag
811
+ const props = opts.withData
812
+ ? EVENT_LISTED_PROPS
813
+ : EVENT_LISTED_PROPS.filter((prop) => !EVENT_IO_PROPS.includes(prop));
814
+ const fetchEventsPage = async (cursor) => {
815
+ logger.debug(`Fetching events for run ${runId}`);
816
+ const pagination = {
737
817
  sortOrder: opts.sort || 'desc',
738
- cursor: opts.cursor,
818
+ cursor,
739
819
  limit: opts.limit || DEFAULT_PAGE_SIZE,
740
- },
741
- resolveData: opts.withData ? 'all' : 'none',
742
- };
743
- const listCall = async (pagination) => {
744
- const result = await world.events.list({
745
- ...params,
746
- pagination: { ...params.pagination, ...pagination },
747
- });
748
- if (correlationIdFilter) {
749
- return {
750
- ...result,
751
- data: result.data.filter((e) => e.correlationId === correlationIdFilter),
820
+ };
821
+ if (useAnalytics && world.analytics) {
822
+ const events = await world.analytics.events.list({
823
+ runId,
824
+ correlationId: correlationIdFilter,
825
+ pagination,
826
+ });
827
+ const page = {
828
+ data: events.data,
829
+ cursor: events.cursor,
830
+ hasMore: events.hasMore,
831
+ pageInfo: getPageInfo(events),
752
832
  };
833
+ if (cursor || page.data.length > 0 || page.hasMore) {
834
+ return page;
835
+ }
836
+ logger.debug(`No analytics events found for run ${runId}; falling back to storage`);
753
837
  }
754
- return result;
838
+ const result = await world.events.list({
839
+ runId,
840
+ pagination,
841
+ resolveData: opts.withData ? 'all' : 'none',
842
+ });
843
+ const filtered = correlationIdFilter
844
+ ? result.data.filter((e) => e.correlationId === correlationIdFilter)
845
+ : result.data;
846
+ const data = await Promise.all(filtered.map((e) => hydrateResourceIO(e, resolveKey)));
847
+ return {
848
+ data: data,
849
+ cursor: result.cursor,
850
+ hasMore: result.hasMore,
851
+ pageInfo: getPageInfo(result),
852
+ };
755
853
  };
756
- // Determine which props to show based on withData flag
757
- const props = opts.withData
758
- ? EVENT_LISTED_PROPS
759
- : EVENT_LISTED_PROPS.filter((prop) => !EVENT_IO_PROPS.includes(prop));
760
854
  // For JSON output, just fetch once and return
761
855
  if (opts.json) {
762
- logger.debug(`Fetching events for run ${runId}`);
763
856
  try {
764
- const events = await listCall({});
765
- const hydratedEvents = await Promise.all(events.data.map((e) => hydrateResourceIO(e, resolveKey)));
766
- showJson(hydratedEvents);
857
+ const page = await fetchEventsPage(opts.cursor);
858
+ showJson(page.data);
767
859
  return;
768
860
  }
769
861
  catch (error) {
@@ -777,14 +869,8 @@ export const listEvents = async (world, opts = {}) => {
777
869
  initialCursor: opts.cursor,
778
870
  interactive: opts.interactive,
779
871
  fetchPage: async (cursor) => {
780
- logger.debug(`Fetching events for run ${runId}`);
781
872
  try {
782
- const events = await listCall({ cursor });
783
- return {
784
- data: events.data,
785
- cursor: events.cursor,
786
- hasMore: events.hasMore,
787
- };
873
+ return await fetchEventsPage(cursor);
788
874
  }
789
875
  catch (error) {
790
876
  if (handleApiError(error, opts.backend)) {
@@ -794,8 +880,7 @@ export const listEvents = async (world, opts = {}) => {
794
880
  }
795
881
  },
796
882
  displayPage: async (events) => {
797
- const hydratedEvents = await Promise.all(events.map((e) => hydrateResourceIO(e, resolveKey)));
798
- logger.log(showTable(hydratedEvents, props, opts));
883
+ logger.log(showTable(events, props, opts));
799
884
  showInspectInfoBox('event');
800
885
  },
801
886
  });
@@ -810,26 +895,35 @@ export const listHooks = async (world, opts = {}) => {
810
895
  }
811
896
  const runId = opts.runId;
812
897
  const resolveData = opts.withData ? 'all' : 'none';
813
- // For JSON output, just fetch once and return
814
- if (opts.json) {
898
+ // Hooks always read from the runtime storage API. Unlike runs/steps/events,
899
+ // the analytics read path omits `ownerId` (and the secret hook token used by
900
+ // resume/copy-token surfaces), so hook listing stays on the canonical APIs.
901
+ const fetchHooksPage = async (cursor) => {
815
902
  if (!runId) {
816
903
  logger.debug('Fetching all hooks');
817
904
  }
818
905
  else {
819
906
  logger.debug(`Fetching hooks for run ${runId}`);
820
907
  }
908
+ const pagination = {
909
+ sortOrder: opts.sort || 'desc',
910
+ cursor,
911
+ limit: opts.limit || DEFAULT_PAGE_SIZE,
912
+ };
913
+ const hooks = await world.hooks.list({ runId, pagination, resolveData });
914
+ const data = await Promise.all(hooks.data.map((h) => hydrateResourceIO(h, resolveKey)));
915
+ return {
916
+ data: data,
917
+ cursor: hooks.cursor,
918
+ hasMore: hooks.hasMore,
919
+ pageInfo: getPageInfo(hooks),
920
+ };
921
+ };
922
+ // For JSON output, just fetch once and return
923
+ if (opts.json) {
821
924
  try {
822
- const hooks = await world.hooks.list({
823
- runId,
824
- pagination: {
825
- sortOrder: opts.sort || 'desc',
826
- cursor: opts.cursor,
827
- limit: opts.limit || DEFAULT_PAGE_SIZE,
828
- },
829
- resolveData,
830
- });
831
- const hydratedHooks = await Promise.all(hooks.data.map((h) => hydrateResourceIO(h, resolveKey)));
832
- showJson({ ...hooks, data: hydratedHooks });
925
+ const page = await fetchHooksPage(opts.cursor);
926
+ showJsonPage(page);
833
927
  return;
834
928
  }
835
929
  catch (error) {
@@ -844,27 +938,8 @@ export const listHooks = async (world, opts = {}) => {
844
938
  initialCursor: opts.cursor,
845
939
  interactive: opts.interactive,
846
940
  fetchPage: async (cursor) => {
847
- if (!runId) {
848
- logger.debug('Fetching all hooks');
849
- }
850
- else {
851
- logger.debug(`Fetching hooks for run ${runId}`);
852
- }
853
941
  try {
854
- const hooks = await world.hooks.list({
855
- runId,
856
- pagination: {
857
- sortOrder: opts.sort || 'desc',
858
- cursor,
859
- limit: opts.limit || DEFAULT_PAGE_SIZE,
860
- },
861
- resolveData,
862
- });
863
- return {
864
- data: hooks.data,
865
- cursor: hooks.cursor,
866
- hasMore: hooks.hasMore,
867
- };
942
+ return await fetchHooksPage(cursor);
868
943
  }
869
944
  catch (error) {
870
945
  if (handleApiError(error, opts.backend)) {
@@ -874,8 +949,7 @@ export const listHooks = async (world, opts = {}) => {
874
949
  }
875
950
  },
876
951
  displayPage: async (hooks) => {
877
- const hydratedHooks = await Promise.all(hooks.map((h) => hydrateResourceIO(h, resolveKey)));
878
- logger.log(showTable(hydratedHooks, HOOK_LISTED_PROPS, opts));
952
+ logger.log(showTable(hooks, HOOK_LISTED_PROPS, opts));
879
953
  showInspectInfoBox('hook');
880
954
  },
881
955
  });
@@ -908,6 +982,42 @@ export const showHook = async (world, hookId, opts = {}) => {
908
982
  throw error;
909
983
  }
910
984
  };
985
+ /**
986
+ * List waits/sleeps via the analytics read path. The analytics wait shape is
987
+ * keyed by `waitId`/`status` rather than the `correlationId`/`eventId` columns
988
+ * reconstructed from the event stream in the fallback path.
989
+ */
990
+ const listSleepsViaAnalytics = async (analytics, opts) => {
991
+ const fetchSleepsPage = async (cursor) => {
992
+ const waits = await analytics.waits.list({
993
+ runId: opts.runId,
994
+ pagination: {
995
+ sortOrder: opts.sort || 'desc',
996
+ cursor,
997
+ limit: opts.limit || DEFAULT_PAGE_SIZE,
998
+ },
999
+ });
1000
+ return {
1001
+ data: waits.data,
1002
+ cursor: waits.cursor,
1003
+ hasMore: waits.hasMore,
1004
+ pageInfo: getPageInfo(waits),
1005
+ };
1006
+ };
1007
+ if (opts.json) {
1008
+ const page = await fetchSleepsPage(opts.cursor);
1009
+ showJson(page.data);
1010
+ return;
1011
+ }
1012
+ await setupListPagination({
1013
+ initialCursor: opts.cursor,
1014
+ interactive: opts.interactive,
1015
+ fetchPage: fetchSleepsPage,
1016
+ displayPage: async (waits) => {
1017
+ logger.log(showTable(waits, ['waitId', 'status', 'createdAt', 'resumeAt', 'completedAt'], { ...opts, disableRelativeDates: true }));
1018
+ },
1019
+ });
1020
+ };
911
1021
  export const listSleeps = async (world, opts = {}) => {
912
1022
  if (!opts.runId) {
913
1023
  logger.error('run-id is required for listing sleeps. Usage: `workflow inspect sleeps --runId=<id>`');
@@ -922,6 +1032,19 @@ export const listSleeps = async (world, opts = {}) => {
922
1032
  if (opts.withData) {
923
1033
  logger.warn('`withData` flag is ignored when listing sleeps');
924
1034
  }
1035
+ // Prefer the analytics read path for wait/sleep listing when available.
1036
+ if (world.analytics) {
1037
+ try {
1038
+ await listSleepsViaAnalytics(world.analytics, opts);
1039
+ return;
1040
+ }
1041
+ catch (error) {
1042
+ if (handleApiError(error, opts.backend)) {
1043
+ process.exit(1);
1044
+ }
1045
+ throw error;
1046
+ }
1047
+ }
925
1048
  try {
926
1049
  // Fetch all events for the run with resolveData='all' to get wait eventData
927
1050
  const events = await world.events.list({
@@ -997,4 +1120,4 @@ export const listSleeps = async (world, opts = {}) => {
997
1120
  throw error;
998
1121
  }
999
1122
  };
1000
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbnNwZWN0L291dHB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEQsT0FBTyxFQUVMLG9CQUFvQixFQUNwQixtQkFBbUIsR0FDcEIsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFZOUUsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQyxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxZQUFZLEdBQ2IsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4Qjs7Ozs7O0dBTUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxLQUFZLEVBQUUsT0FBZ0I7SUFDcEQsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPLElBQUksQ0FBQztJQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQjtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUEyQyxDQUFDO0lBQ2pFLE9BQU8sQ0FBQyxLQUFhLEVBQUUsRUFBRTtRQUN2QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSTtpQkFDaEIsR0FBRyxDQUFDLEtBQUssQ0FBQztpQkFD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QUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICdAd29ya2Zsb3cvY29yZS9lbmNyeXB0aW9uJztcbmltcG9ydCB7XG4gIHR5cGUgRW5jcnlwdGlvbktleVBhcmFtLFxuICBnZXREZXNlcmlhbGl6ZVN0cmVhbSxcbiAgZ2V0RXh0ZXJuYWxSZXZpdmVycyxcbn0gZnJvbSAnQHdvcmtmbG93L2NvcmUvc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBWRVJDRUxfNDAzX0VSUk9SX01FU1NBR0UgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHBhcnNlU3RlcE5hbWUsIHBhcnNlV29ya2Zsb3dOYW1lIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHR5cGUge1xuICBFdmVudCxcbiAgSG9vayxcbiAgTGlzdEV2ZW50c1BhcmFtcyxcbiAgUGFnaW5hdGlvbk9wdGlvbnMsXG4gIFN0ZXAsXG4gIFN0ZXBXaXRob3V0RGF0YSxcbiAgV29ya2Zsb3dSdW4sXG4gIFdvcmtmbG93UnVuV2l0aG91dERhdGEsXG4gIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcblxuaW1wb3J0IHsgZm9ybWF0RGlzdGFuY2UgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgVGFibGUgZnJvbSAnZWFzeS10YWJsZSc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9jb25maWcvbG9nLmpzJztcbmltcG9ydCB0eXBlIHsgSW5zcGVjdENMSU9wdGlvbnMgfSBmcm9tICcuLi9jb25maWcvdHlwZXMuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBFbmNyeXB0aW9uS2V5UmVzb2x2ZXIsXG4gIGh5ZHJhdGVSZXNvdXJjZUlPLFxuICBpc0VuY3J5cHRlZFJlZixcbiAgaXNFeHBpcmVkUmVmLFxufSBmcm9tICcuL2h5ZHJhdGlvbi5qcyc7XG5cbi8qKlxuICogQ3JlYXRlIGFuIEVuY3J5cHRpb25LZXlSZXNvbHZlciBmcm9tIGEgV29ybGQgaW5zdGFuY2UuXG4gKiBSZXR1cm5zIG51bGwgaWYgZGVjcnlwdCBpcyBmYWxzZSDigJQgZW5jcnlwdGVkIGRhdGEgd2lsbCBzaG93IGFzIGEgcGxhY2Vob2xkZXIuXG4gKlxuICogVGhlIHJlc29sdmVyIGZldGNoZXMgdGhlIGZ1bGwgV29ya2Zsb3dSdW4gKGNhY2hlZCBwZXIgcnVuSWQpIHNvIHRoYXQgdGhlXG4gKiBXb3JsZCBjYW4gaW5zcGVjdCBkZXBsb3ltZW50LXNwZWNpZmljIGZpZWxkcyBmb3Iga2V5IHJlc29sdXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlc29sdmVyKHdvcmxkOiBXb3JsZCwgZGVjcnlwdDogYm9vbGVhbik6IEVuY3J5cHRpb25LZXlSZXNvbHZlciB7XG4gIGlmICghZGVjcnlwdCkgcmV0dXJuIG51bGw7XG4gIGlmICghd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bikgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8VWludDhBcnJheSB8IHVuZGVmaW5lZD4+KCk7XG4gIHJldHVybiAocnVuSWQ6IHN0cmluZykgPT4ge1xuICAgIGxldCBjYWNoZWQgPSBjYWNoZS5nZXQocnVuSWQpO1xuICAgIGlmICghY2FjaGVkKSB7XG4gICAgICBjYWNoZWQgPSB3b3JsZC5ydW5zXG4gICAgICAgIC5nZXQocnVuSWQpXG4gICAgICAgIC50aGVuKChydW4pID0+IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4hKHJ1bikpO1xuICAgICAgY2FjaGUuc2V0KHJ1bklkLCBjYWNoZWQpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkO1xuICB9O1xufVxuXG5pbXBvcnQgeyBzZXR1cExpc3RQYWdpbmF0aW9uIH0gZnJvbSAnLi9wYWdpbmF0aW9uLmpzJztcbmltcG9ydCB7IHN0cmVhbVRvQ29uc29sZSB9IGZyb20gJy4vc3RyZWFtLmpzJztcbmltcG9ydCB7XG4gIGZvcm1hdElTT0RhdGUsXG4gIGZvcm1hdFN0YXR1cyBhcyBmb3JtYXRTdGF0dXNBYmJyZXYsXG4gIGdldERpc3BsYXlTZXR0aW5ncyxcbiAgZ2V0VGVybWluYWxXaWR0aCxcbiAgaXNDSSxcbn0gZnJvbSAnLi90ZXJtaW5hbC11dGlscy5qcyc7XG5cbmNvbnN0IERFRkFVTFRfUEFHRV9TSVpFID0gMjA7XG5sZXQgVEFCTEVfVFJVTkNBVEVfSU9fTEVOR1RIID0gMTU7IC8vIFdpbGwgYmUgYWRqdXN0ZWQgYmFzZWQgb24gdGVybWluYWwgd2lkdGhcblxuY29uc3QgV09SS0ZMT1dfUlVOX0lPX1BST1BTOiAoa2V5b2YgV29ya2Zsb3dSdW4pW10gPSBbJ2lucHV0JywgJ291dHB1dCddO1xuXG5jb25zdCBTVEVQX0lPX1BST1BTOiAoa2V5b2YgU3RlcClbXSA9IFsnaW5wdXQnLCAnb3V0cHV0J107XG5cbmNvbnN0IFdPUktGTE9XX1JVTl9MSVNURURfUFJPUFM6IChrZXlvZiBXb3JrZmxvd1J1bilbXSA9IFtcbiAgJ3J1bklkJyxcbiAgJ3dvcmtmbG93TmFtZScsXG4gICdzdGF0dXMnLFxuICAnc3RhcnRlZEF0JyxcbiAgJ2NvbXBsZXRlZEF0JyxcbiAgLi4uV09SS0ZMT1dfUlVOX0lPX1BST1BTLFxuXTtcblxuY29uc3QgU1RFUF9MSVNURURfUFJPUFM6IChrZXlvZiBTdGVwKVtdID0gW1xuICAncnVuSWQnLFxuICAnc3RlcElkJyxcbiAgJ3N0ZXBOYW1lJyxcbiAgJ3N0YXR1cycsXG4gICdzdGFydGVkQXQnLFxuICAnY29tcGxldGVkQXQnLFxuICAuLi5TVEVQX0lPX1BST1BTLFxuXTtcblxuY29uc3QgRVZFTlRfSU9fUFJPUFM6IChrZXlvZiBFdmVudCB8ICdldmVudERhdGEnKVtdID0gWydldmVudERhdGEnXTtcblxuY29uc3QgRVZFTlRfTElTVEVEX1BST1BTOiAoa2V5b2YgRXZlbnQgfCAnZXZlbnREYXRhJylbXSA9IFtcbiAgJ2V2ZW50SWQnLFxuICAnZXZlbnRUeXBlJyxcbiAgJ2NvcnJlbGF0aW9uSWQnLFxuICAnY3JlYXRlZEF0JyxcbiAgLi4uRVZFTlRfSU9fUFJPUFMsXG5dO1xuXG4vLyBjb25zdCBIT09LX0RBVEFfUFJPUFM6IChrZXlvZiBIb29rIHwgJ2hhc1Jlc3BvbnNlJylbXSA9IFsnaGFzUmVzcG9uc2UnXTtcblxuY29uc3QgSE9PS19MSVNURURfUFJPUFM6IChrZXlvZiBIb29rIHwgJ2hhc1Jlc3BvbnNlJylbXSA9IFtcbiAgJ3J1bklkJyxcbiAgJ2hvb2tJZCcsXG4gICdvd25lcklkJyxcbiAgJ2NyZWF0ZWRBdCcsXG4gIC8vIC4uLkhPT0tfREFUQV9QUk9QUyxcbl07XG5cbmludGVyZmFjZSBTbGVlcCB7XG4gIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbiAgZXZlbnRJZDogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHJlc3VtZUF0OiBEYXRlIHwgdW5kZWZpbmVkO1xuICBjb21wbGV0ZWRBdDogRGF0ZSB8IHVuZGVmaW5lZDtcbn1cblxuY29uc3QgV0FJVF9MSVNURURfUFJPUFM6IChrZXlvZiBTbGVlcClbXSA9IFtcbiAgJ2NvcnJlbGF0aW9uSWQnLFxuICAnZXZlbnRJZCcsXG4gICdjcmVhdGVkQXQnLFxuICAncmVzdW1lQXQnLFxuICAnY29tcGxldGVkQXQnLFxuXTtcblxuY29uc3QgU1RBVFVTX0NPTE9SUzogUmVjb3JkPFxuICBXb3JrZmxvd1J1blsnc3RhdHVzJ10gfCBTdGVwWydzdGF0dXMnXSxcbiAgKHZhbHVlOiBzdHJpbmcpID0+IHN0cmluZ1xuPiA9IHtcbiAgcnVubmluZzogY2hhbGsuYmx1ZSxcbiAgY29tcGxldGVkOiBjaGFsay5ncmVlbixcbiAgZmFpbGVkOiBjaGFsay5yZWQsXG4gIGNhbmNlbGxlZDogY2hhbGsuc3RyaWtldGhyb3VnaC55ZWxsb3csXG4gIHBlbmRpbmc6IGNoYWxrLmJsdWUsXG59O1xuXG5jb25zdCBpc1N0cmVhbUlkID0gKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3RhcnRzV2l0aCgnc3RybV8nKTtcbn07XG5cbmNvbnN0IHNob3dTdGF0dXNMZWdlbmQgPSAoKSA9PiB7XG4gIGxvZ2dlci5sb2coJ1xcblN0YXR1cyBMZWdlbmQ6Jyk7XG4gIGNvbnN0IHN0YXR1c2VzOiBBcnJheTxXb3JrZmxvd1J1blsnc3RhdHVzJ10gfCBTdGVwWydzdGF0dXMnXT4gPSBbXG4gICAgJ3J1bm5pbmcnLFxuICAgICdjb21wbGV0ZWQnLFxuICAgICdmYWlsZWQnLFxuICAgICdjYW5jZWxsZWQnLFxuICAgICdwZW5kaW5nJyxcbiAgXTtcblxuICBjb25zdCBsZWdlbmRJdGVtcyA9IHN0YXR1c2VzLm1hcCgoc3RhdHVzKSA9PiB7XG4gICAgY29uc3QgY29sb3JGdW5jID0gU1RBVFVTX0NPTE9SU1tzdGF0dXNdO1xuICAgIGNvbnN0IGFiYnJldiA9IGZvcm1hdFN0YXR1c0FiYnJldihzdGF0dXMsIHRydWUpO1xuICAgIHJldHVybiBgJHtjb2xvckZ1bmMoYWJicmV2KX0gPSAke3N0YXR1c31gO1xuICB9KTtcblxuICBsb2dnZXIubG9nKGAgICR7bGVnZW5kSXRlbXMuam9pbignICAnKX1gKTtcbiAgbG9nZ2VyLmxvZygnJyk7XG59O1xuXG5jb25zdCBpc1NsZWVwU3RlcCA9IChzdGVwTmFtZTogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBzdGVwTmFtZS5pbmNsdWRlcygnLXNsZWVwJyk7XG59O1xuXG5jb25zdCBjaGVja0FuZEhhbmRsZVZlcmNlbEFjY2Vzc0Vycm9yID0gKFxuICBlcnJvcjogdW5rbm93bixcbiAgYmFja2VuZD86IHN0cmluZ1xuKTogYm9vbGVhbiA9PiB7XG4gIGlmIChiYWNrZW5kID09PSAndmVyY2VsJyAmJiBlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgZXJyID0gZXJyb3IgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGVyci5zdGF0dXMgPT09IDQwMykge1xuICAgICAgbG9nZ2VyLmVycm9yKFZFUkNFTF80MDNfRVJST1JfTUVTU0FHRSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuY29uc3QgZXh0cmFjdEVycm9yTWVzc2FnZSA9IChcbiAgZXJyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGVyci5tZXNzYWdlICYmIHR5cGVvZiBlcnIubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZXJyLm1lc3NhZ2U7XG4gIH1cblxuICBpZiAoZXJyLmJvZHkgJiYgdHlwZW9mIGVyci5ib2R5ID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IGJvZHkgPSBlcnIuYm9keSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoYm9keS5tZXNzYWdlICYmIHR5cGVvZiBib2R5Lm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYm9keS5tZXNzYWdlO1xuICAgIH1cbiAgICBpZiAoYm9keS5lcnJvciAmJiB0eXBlb2YgYm9keS5lcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBib2R5LmVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBoYW5kbGVBcGlFcnJvciA9IChlcnJvcjogdW5rbm93biwgYmFja2VuZD86IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAvLyBGaXJzdCBjaGVjayBmb3IgVmVyY2VsIGFjY2VzcyBlcnJvcnNcbiAgaWYgKGNoZWNrQW5kSGFuZGxlVmVyY2VsQWNjZXNzRXJyb3IoZXJyb3IsIGJhY2tlbmQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBIYW5kbGUgb3RoZXIgSFRUUCBlcnJvcnNcbiAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgIC8vIEhhbmRsZSA0MDAgQmFkIFJlcXVlc3RcbiAgICBpZiAoZXJyLnN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0JhZCBSZXF1ZXN0OiBUaGUgcmVxdWVzdCB3YXMgaW52YWxpZC4nKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBleHRyYWN0RXJyb3JNZXNzYWdlKGVycik7XG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYERldGFpbHM6ICR7bWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBvdGhlciBIVFRQIGVycm9ycyAoNDA0LCA1MDAsIGV0Yy4pXG4gICAgaWYgKHR5cGVvZiBlcnIuc3RhdHVzID09PSAnbnVtYmVyJyAmJiBlcnIuc3RhdHVzID49IDQwMCkge1xuICAgICAgbG9nZ2VyLmVycm9yKGBIVFRQIEVycm9yICR7ZXJyLnN0YXR1c306ICR7Z2V0U3RhdHVzVGV4dChlcnIuc3RhdHVzKX1gKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBleHRyYWN0RXJyb3JNZXNzYWdlKGVycik7XG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYERldGFpbHM6ICR7bWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmNvbnN0IGdldFN0YXR1c1RleHQgPSAoc3RhdHVzOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBzdGF0dXNUZXh0czogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHtcbiAgICA0MDA6ICdCYWQgUmVxdWVzdCcsXG4gICAgNDAxOiAnVW5hdXRob3JpemVkJyxcbiAgICA0MDM6ICdGb3JiaWRkZW4nLFxuICAgIDQwNDogJ05vdCBGb3VuZCcsXG4gICAgNDI5OiAnVG9vIE1hbnkgUmVxdWVzdHMnLFxuICAgIDUwMDogJ0ludGVybmFsIFNlcnZlciBFcnJvcicsXG4gICAgNTAyOiAnQmFkIEdhdGV3YXknLFxuICAgIDUwMzogJ1NlcnZpY2UgVW5hdmFpbGFibGUnLFxuICB9O1xuICByZXR1cm4gc3RhdHVzVGV4dHNbc3RhdHVzXSB8fCAnVW5rbm93biBFcnJvcic7XG59O1xuXG5jb25zdCB0cnVuY2F0ZU5hbWVJZk5lZWRlZCA9IChuYW1lOiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuIG1heExlbmd0aCA8IG5hbWUubGVuZ3RoID8gYCR7bmFtZS5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoKX0uLi5gIDogbmFtZTtcbn07XG5cbmNvbnN0IGZvcm1hdE5hbWVGaWVsZCA9IChcbiAgbmFtZU5vblVuaXF1ZTogc3RyaW5nLFxuICB0cnVuY2F0ZUxlbmd0aDogbnVtYmVyLFxuICBpc1NsZWVwOiBib29sZWFuXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCB0cnVuY2F0ZWROYW1lID0gdHJ1bmNhdGVOYW1lSWZOZWVkZWQobmFtZU5vblVuaXF1ZSwgdHJ1bmNhdGVMZW5ndGgpO1xuICBpZiAoaXNTbGVlcCkge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3dCcmlnaHQodHJ1bmNhdGVkTmFtZSk7XG4gIH1cbiAgcmV0dXJuIGNoYWxrLmJsdWUuYmx1ZUJyaWdodCh0cnVuY2F0ZWROYW1lKTtcbn07XG5cbmNvbnN0IGZvcm1hdElkRmllbGQgPSAoXG4gIHByb3A6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd24sXG4gIHNob3VsZFRydW5jYXRlSWRzOiBib29sZWFuXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB2YWx1ZVN0ciA9IFN0cmluZyh2YWx1ZSk7XG4gIGNvbnN0IGlkU3RyID0gc2hvdWxkVHJ1bmNhdGVJZHMgPyB0cnVuY2F0ZUlkVG9MYXN0Q2hhcnModmFsdWVTdHIpIDogdmFsdWVTdHI7XG4gIGlmIChwcm9wID09PSAnc3RyZWFtSWQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuKGlkU3RyKTtcbiAgfVxuICByZXR1cm4gaWRTdHI7XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0VGFibGVWYWx1ZSA9IChcbiAgcHJvcDogc3RyaW5nLFxuICB2YWx1ZTogdW5rbm93bixcbiAgb3B0czogSW5zcGVjdENMSU9wdGlvbnMgPSB7fSxcbiAgZGlzcGxheVNldHRpbmdzPzogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RGlzcGxheVNldHRpbmdzPixcbiAgaXRlbT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pID0+IHtcbiAgY29uc3QgbmFtZXNUcnVuY2F0ZSA9IGRpc3BsYXlTZXR0aW5ncz8ubmFtZXNUcnVuY2F0ZUxlbmd0aCA/PyA0MDtcbiAgY29uc3Qgc2hvdWxkVHJ1bmNhdGVJZHMgPSBkaXNwbGF5U2V0dGluZ3M/LnRydW5jYXRlSWRzVG9MYXN0Q2hhcnMgPz8gZmFsc2U7XG5cbiAgLy8gSGFuZGxlIElEcyB3aXRoIHBvdGVudGlhbCB0cnVuY2F0aW9uXG4gIGlmIChcbiAgICBbXG4gICAgICAnc3RyZWFtSWQnLFxuICAgICAgJ3J1bklkJyxcbiAgICAgICdzdGVwSWQnLFxuICAgICAgJ2hvb2tJZCcsXG4gICAgICAnZXZlbnRJZCcsXG4gICAgICAnY29ycmVsYXRpb25JZCcsXG4gICAgICAnb3duZXJJZCcsXG4gICAgXS5pbmNsdWRlcyhwcm9wKVxuICApIHtcbiAgICByZXR1cm4gZm9ybWF0SWRGaWVsZChwcm9wLCB2YWx1ZSwgc2hvdWxkVHJ1bmNhdGVJZHMpO1xuICB9XG5cbiAgLy8gSGFuZGxlIG5hbWVzIHdpdGggdHJ1bmNhdGlvblxuICBpZiAocHJvcCA9PT0gJ3N0ZXBOYW1lJykge1xuICAgIGNvbnN0IG5hbWVOb25VbmlxdWUgPSBwYXJzZVN0ZXBOYW1lKFN0cmluZyh2YWx1ZSkpPy5zaG9ydE5hbWUgfHwgJz8nO1xuICAgIHJldHVybiBmb3JtYXROYW1lRmllbGQoXG4gICAgICBuYW1lTm9uVW5pcXVlLFxuICAgICAgbmFtZXNUcnVuY2F0ZSxcbiAgICAgIGlzU2xlZXBTdGVwKFN0cmluZyh2YWx1ZSkpXG4gICAgKTtcbiAgfVxuXG4gIGlmIChwcm9wID09PSAnd29ya2Zsb3dOYW1lJykge1xuICAgIGNvbnN0IG5hbWVOb25VbmlxdWUgPSBwYXJzZVdvcmtmbG93TmFtZShTdHJpbmcodmFsdWUpKT8uc2hvcnROYW1lIHx8ICc/JztcbiAgICBjb25zdCB0cnVuY2F0ZWROYW1lID0gdHJ1bmNhdGVOYW1lSWZOZWVkZWQobmFtZU5vblVuaXF1ZSwgbmFtZXNUcnVuY2F0ZSk7XG4gICAgcmV0dXJuIGNoYWxrLmJsdWUuYmx1ZUJyaWdodCh0cnVuY2F0ZWROYW1lKTtcbiAgfVxuXG4gIGlmIChwcm9wID09PSAnb3V0cHV0JyB8fCBwcm9wID09PSAnaW5wdXQnIHx8IHByb3AgPT09ICdlcnJvcicpIHtcbiAgICBpZiAoXG4gICAgICBpdGVtICYmXG4gICAgICAnZXhwaXJlZEF0JyBpbiBpdGVtICYmXG4gICAgICBpdGVtLmV4cGlyZWRBdCAhPSBudWxsICYmXG4gICAgICBuZXcgRGF0ZShpdGVtLmV4cGlyZWRBdCBhcyBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKSA8IG5ldyBEYXRlKClcbiAgICApIHtcbiAgICAgIHJldHVybiBFWFBJUkVEX0RBVEFfTUVTU0FHRTtcbiAgICB9XG4gICAgcmV0dXJuIGlubGluZUZvcm1hdElPKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChwcm9wID09PSAnc3RhdHVzJykge1xuICAgIGNvbnN0IHN0YXR1cyA9IHZhbHVlIGFzIFdvcmtmbG93UnVuWydzdGF0dXMnXSB8IFN0ZXBbJ3N0YXR1cyddO1xuICAgIGNvbnN0IGNvbG9yRnVuYyA9IFNUQVRVU19DT0xPUlNbc3RhdHVzXTtcbiAgICBjb25zdCBmb3JtYXR0ZWRTdGF0dXMgPSBkaXNwbGF5U2V0dGluZ3M/LmFiYnJldmlhdGVTdGF0dXNcbiAgICAgID8gZm9ybWF0U3RhdHVzQWJicmV2KHN0YXR1cywgdHJ1ZSlcbiAgICAgIDogc3RhdHVzO1xuICAgIHJldHVybiBjb2xvckZ1bmMoZm9ybWF0dGVkU3RhdHVzKTtcbiAgfVxuXG4gIGlmIChwcm9wID09PSAnZXZlbnREYXRhJykge1xuICAgIHJldHVybiB0cnVuY2F0ZVN0cmluZyhKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICB9XG5cbiAgaWYgKHByb3AgPT09ICdoYXNSZXNwb25zZScpIHtcbiAgICByZXR1cm4gdmFsdWUgPyBjaGFsay5ncmVlbigndHJ1ZScpIDogY2hhbGsuZ3JheSgnZmFsc2UnKTtcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gZm9ybWF0VGFibGVUaW1lc3RhbXAodmFsdWUsIG9wdHMsIGRpc3BsYXlTZXR0aW5ncyk7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5jb25zdCBnZXRWaXNpYmxlUHJvcHMgPSAoXG4gIHByb3BzOiBzdHJpbmdbXSxcbiAgZGlzcGxheVNldHRpbmdzOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXREaXNwbGF5U2V0dGluZ3M+XG4pOiBzdHJpbmdbXSA9PiB7XG4gIGlmIChkaXNwbGF5U2V0dGluZ3MuaGlkZUNvbXBsZXRlZEF0KSB7XG4gICAgcmV0dXJuIHByb3BzLmZpbHRlcigocHJvcCkgPT4gcHJvcCAhPT0gJ2NvbXBsZXRlZEF0Jyk7XG4gIH1cbiAgcmV0dXJuIHByb3BzO1xufTtcblxuY29uc3Qgc2hvd1RhYmxlID0gKFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICBwcm9wczogc3RyaW5nW10sXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge31cbikgPT4ge1xuICAvLyBHZXQgZGlzcGxheSBzZXR0aW5ncyBiYXNlZCBvbiB0ZXJtaW5hbCB3aWR0aFxuICBjb25zdCB0ZXJtaW5hbFdpZHRoID0gZ2V0VGVybWluYWxXaWR0aCgpO1xuICBjb25zdCBkaXNwbGF5U2V0dGluZ3MgPSBnZXREaXNwbGF5U2V0dGluZ3MoXG4gICAgdGVybWluYWxXaWR0aCxcbiAgICBvcHRzLndpdGhEYXRhIHx8IGZhbHNlLFxuICAgIHByb3BzLmluY2x1ZGVzKCdydW5OYW1lJylcbiAgKTtcblxuICAvLyBGaWx0ZXIgb3V0IGNvbXBsZXRlZEF0IGNvbHVtbiBpZiBuZWVkZWRcbiAgY29uc3QgdmlzaWJsZVByb3BzID0gZ2V0VmlzaWJsZVByb3BzKHByb3BzLCBkaXNwbGF5U2V0dGluZ3MpO1xuXG4gIC8vIFVwZGF0ZSB0cnVuY2F0ZSBsZW5ndGggZm9yIElPIGZpZWxkc1xuICBjb25zdCBvcmlnaW5hbFRydW5jYXRlTGVuZ3RoID0gVEFCTEVfVFJVTkNBVEVfSU9fTEVOR1RIO1xuICBUQUJMRV9UUlVOQ0FURV9JT19MRU5HVEggPSBkaXNwbGF5U2V0dGluZ3MuZGF0YUZpZWxkV2lkdGg7XG5cbiAgLy8gU2hvdyBzdGF0dXMgbGVnZW5kIGlmIHVzaW5nIGFiYnJldmlhdGVkIHN0YXR1c1xuICBpZiAoXG4gICAgZGF0YS5sZW5ndGggPiAwICYmXG4gICAgZGlzcGxheVNldHRpbmdzLmFiYnJldmlhdGVTdGF0dXMgJiZcbiAgICB2aXNpYmxlUHJvcHMuaW5jbHVkZXMoJ3N0YXR1cycpXG4gICkge1xuICAgIHNob3dTdGF0dXNMZWdlbmQoKTtcbiAgfVxuXG4gIC8vIENyZWF0ZSBoZWFkZXIgbWFwcGluZyBmb3IgYWJicmV2aWF0ZWQgc3RhdHVzXG4gIGNvbnN0IGhlYWRlck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBpZiAoZGlzcGxheVNldHRpbmdzLmFiYnJldmlhdGVTdGF0dXMgJiYgdmlzaWJsZVByb3BzLmluY2x1ZGVzKCdzdGF0dXMnKSkge1xuICAgIGhlYWRlck1hcFsnc3RhdHVzJ10gPSAnUyc7XG4gIH1cblxuICAvLyBBZGQgYSBibGFuayBsaW5lIGJlZm9yZSBhbnkgdGFibGVcbiAgY29uc3QgdGFibGUgPSBuZXcgVGFibGUoKTtcbiAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICBsb2dnZXIud2FybignTm8gZGF0YSBmb3VuZCBmb3IgdGhpcyBxdWVyeSBhbmQgcmVzb3VyY2UuXFxuJyk7XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIHZpc2libGVQcm9wcykge1xuICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyTWFwW3Byb3BdIHx8IHByb3A7XG4gICAgICB0YWJsZS5jZWxsKGhlYWRlciwgJ04vQScpO1xuICAgIH1cbiAgICB0YWJsZS5uZXdSb3coKTtcbiAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHRydW5jYXRlIGxlbmd0aFxuICAgIFRBQkxFX1RSVU5DQVRFX0lPX0xFTkdUSCA9IG9yaWdpbmFsVHJ1bmNhdGVMZW5ndGg7XG4gICAgcmV0dXJuIHRhYmxlLnRvU3RyaW5nKCk7XG4gIH0gZWxzZSBpZiAoIWRhdGEpIHtcbiAgICBsb2dnZXIud2FybignRXhwZWN0aW5nIGFuIGFycmF5IG9mIGRhdGEsIGJ1dCBnb3QgbnVsbC5cXG4nKTtcbiAgfVxuICBsb2dnZXIubG9nKCcnKTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGRhdGEpIHtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgdmlzaWJsZVByb3BzKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBoZWFkZXJNYXBbcHJvcF0gfHwgcHJvcDtcbiAgICAgIGNvbnN0IHZhbHVlID0gaXRlbVtwcm9wXTtcbiAgICAgIHRhYmxlLmNlbGwoXG4gICAgICAgIGhlYWRlcixcbiAgICAgICAgZm9ybWF0VGFibGVWYWx1ZShwcm9wLCB2YWx1ZSwgb3B0cywgZGlzcGxheVNldHRpbmdzLCBpdGVtKVxuICAgICAgKTtcbiAgICB9XG4gICAgdGFibGUubmV3Um93KCk7XG4gIH1cblxuICAvLyBSZXN0b3JlIG9yaWdpbmFsIHRydW5jYXRlIGxlbmd0aFxuICBUQUJMRV9UUlVOQ0FURV9JT19MRU5HVEggPSBvcmlnaW5hbFRydW5jYXRlTGVuZ3RoO1xuICByZXR1cm4gdGFibGUudG9TdHJpbmcoKTtcbn07XG5cbmNvbnN0IHNob3dKc29uID0gKGRhdGE6IHVua25vd24pID0+IHtcbiAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpO1xuICBwcm9jZXNzLnN0ZG91dC53cml0ZShgJHtqc29ufVxcbmApO1xufTtcblxuLyoqXG4gKiBJbiB0YWJsZXMsIHdlIHdhbnQgdG8gc2hvdyBhIHNob3J0ZXIgdGltZXN0YW1wLCBZWVlZLU1NLUREIEhIOk1NOlNTXG4gKi9cbmNvbnN0IGZvcm1hdFRhYmxlVGltZXN0YW1wID0gKFxuICB2YWx1ZTogRGF0ZSxcbiAgb3B0czogSW5zcGVjdENMSU9wdGlvbnMgPSB7fSxcbiAgZGlzcGxheVNldHRpbmdzPzogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RGlzcGxheVNldHRpbmdzPlxuKSA9PiB7XG4gIC8vIEZvcm1hdCBJU08gdGltZSB3aXRob3V0IFQgYW5kIFpcbiAgY29uc3QgaXNvVGltZSA9IGZvcm1hdElTT0RhdGUodmFsdWUpO1xuXG4gIC8vIFNob3cgcmVsYXRpdmUgdGltZSBvbmx5IGlmOlxuICAvLyAtIE5vdCBpbiBDSSBtb2RlXG4gIC8vIC0gRGlzcGxheSBzZXR0aW5ncyBhbGxvdyBpdCAoYmFzZWQgb24gdGVybWluYWwgd2lkdGgpXG4gIC8vIC0gd2l0aERhdGEgaXMgZGlzYWJsZWQgKG1vcmUgc3BhY2UgYXZhaWxhYmxlKVxuICAvLyAtIE5vdCBpbiBKU09OIG1vZGVcbiAgLy8gLSBkaXNhYmxlUmVsYXRpdmVEYXRlcyBpcyBub3Qgc2V0XG4gIGNvbnN0IHNob3VsZFNob3dSZWxhdGl2ZSA9XG4gICAgIWlzQ0koKSAmJlxuICAgIGRpc3BsYXlTZXR0aW5ncz8uc2hvd1JlbGF0aXZlRGF0ZXMgIT09IGZhbHNlICYmXG4gICAgIW9wdHMud2l0aERhdGEgJiZcbiAgICAhb3B0cy5qc29uICYmXG4gICAgIW9wdHMuZGlzYWJsZVJlbGF0aXZlRGF0ZXM7XG5cbiAgaWYgKHNob3VsZFNob3dSZWxhdGl2ZSkge1xuICAgIGNvbnN0IHJlbGF0aXZlID0gZm9ybWF0RGlzdGFuY2UodmFsdWUsIG5ldyBEYXRlKCksIHsgYWRkU3VmZml4OiB0cnVlIH0pO1xuICAgIHJldHVybiBgJHtpc29UaW1lfSAoJHtyZWxhdGl2ZX0pYDtcbiAgfVxuXG4gIHJldHVybiBpc29UaW1lO1xufTtcblxuY29uc3QgdHJ1bmNhdGVTdHJpbmcgPSAoXG4gIHN0cjogc3RyaW5nLFxuICBtYXhMZW5ndGg6IG51bWJlciA9IFRBQkxFX1RSVU5DQVRFX0lPX0xFTkdUSFxuKSA9PiB7XG4gIHJldHVybiBzdHIgJiYgc3RyLmxlbmd0aCA+IG1heExlbmd0aFxuICAgID8gYCR7c3RyLnN1YnN0cmluZygwLCBtYXhMZW5ndGgpfS4uLmBcbiAgICA6IHN0cjtcbn07XG5cbmNvbnN0IHRydW5jYXRlSWRUb0xhc3RDaGFycyA9IChpZDogc3RyaW5nLCBjaGFyczogbnVtYmVyID0gNCk6IHN0cmluZyA9PiB7XG4gIGlmICghaWQgfHwgaWQubGVuZ3RoIDw9IGNoYXJzKSByZXR1cm4gaWQ7XG4gIHJldHVybiBgLi4uJHtpZC5zdWJzdHJpbmcoaWQubGVuZ3RoIC0gY2hhcnMpfWA7XG59O1xuXG5jb25zdCBzaG93SW5zcGVjdEluZm9Cb3ggPSAocmVzb3VyY2U6IHN0cmluZykgPT4ge1xuICBsb2dnZXIuaW5mbyhcbiAgICBgVG8gdmlldyBkZXRhaWxzIGZvciBhICR7cmVzb3VyY2V9LCB1c2UgXFxgd29ya2Zsb3cgaW5zcGVjdCAke3Jlc291cmNlfVxcYCA8aWQ+YFxuICApO1xuICBsb2dnZXIuaW5mbyhcbiAgICBgVG8gdmlldyB0aGUgY29udGVudCBvZiBhbnkgc3RyZWFtLCB1c2UgXFxgd29ya2Zsb3cgaW5zcGVjdCBzdHJlYW0gPHN0cmVhbS1pZD5cXGBgXG4gICk7XG59O1xuXG5jb25zdCBFWFBJUkVEX0RBVEFfTUVTU0FHRSA9IGNoYWxrLmdyYXkoJzxkYXRhIGV4cGlyZWQ+Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcnVuIGhhcyBleHBpcmVkIGRhdGEgc3RvcmFnZSAocnVuLWxldmVsIGV4cGlyZWRBdCBmaWVsZCkuXG4gKiBPbmx5IHJldHVybnMgdHJ1ZSB3aGVuIGBleHBpcmVkQXRgIGlzIGluIHRoZSBwYXN0LlxuICovXG5leHBvcnQgY29uc3QgaGFzRXhwaXJlZERhdGEgPSAocnVuOiBXb3JrZmxvd1J1bik6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gKFxuICAgICdleHBpcmVkQXQnIGluIHJ1biAmJlxuICAgIHJ1bi5leHBpcmVkQXQgIT0gbnVsbCAmJlxuICAgIG5ldyBEYXRlKHJ1bi5leHBpcmVkQXQpIDwgbmV3IERhdGUoKVxuICApO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYW55IGRhdGEgZmllbGQgaW4gYSBoeWRyYXRlZCByZXNvdXJjZSBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIGFuXG4gKiBleHBpcmVkIHBsYWNlaG9sZGVyLiBXb3JrcyBmb3IgcnVucywgc3RlcHMsIGhvb2tzLCBhbmQgZXZlbnRzIOKAlCB1bmxpa2VcbiAqIGBoYXNFeHBpcmVkRGF0YWAgd2hpY2ggb25seSBjaGVja3MgdGhlIHJ1bi1sZXZlbCBgZXhwaXJlZEF0YCBmaWVsZC5cbiAqL1xuY29uc3QgaGFzRXhwaXJlZEZpZWxkcyA9IChyZXNvdXJjZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIFsnaW5wdXQnLCAnb3V0cHV0JywgJ2Vycm9yJywgJ21ldGFkYXRhJ10uc29tZSgoa2V5KSA9PlxuICAgIGlzRXhwaXJlZFJlZihyZXNvdXJjZVtrZXldKVxuICApO1xufTtcblxuLyoqXG4gKiBUYWtlcyBoeWRyYXRlZCBzdGVwL3dvcmtmbG93IGlucHV0L291dHB1dCBhbmQgc2VyaWFsaXplcyBpdCBmb3IgaW5saW5lIGRpc3BsYXkuXG4gKi9cbmNvbnN0IGlubGluZUZvcm1hdElPID0gPFQ+KGlvOiBULCB0b3BMZXZlbDogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB0eXBlID0gdHlwZW9mIGlvO1xuICBsZXQgdmFsdWUgPSAnJztcbiAgaWYgKGlvID09PSB1bmRlZmluZWQpIHtcbiAgICB2YWx1ZSA9ICc8ZW1wdHk+JztcbiAgfSBlbHNlIGlmIChpbyA9PT0gbnVsbCkge1xuICAgIHZhbHVlID0gJzxudWxsPic7XG4gIH0gZWxzZSBpZiAoaXNFbmNyeXB0ZWRSZWYoaW8pKSB7XG4gICAgdmFsdWUgPSBjaGFsay5kaW0ueWVsbG93KCdcXHV7MUY1MTJ9IEVuY3J5cHRlZCcpO1xuICB9IGVsc2UgaWYgKGlzRXhwaXJlZFJlZihpbykpIHtcbiAgICB2YWx1ZSA9IGNoYWxrLmdyYXkoJzxkYXRhIGV4cGlyZWQ+Jyk7XG4gIH0gZWxzZSBpZiAoaW8gJiYgQXJyYXkuaXNBcnJheShpbykpIHtcbiAgICBpZiAoaW8ubGVuZ3RoID09PSAwKSB7XG4gICAgICB2YWx1ZSA9ICc8ZW1wdHk+JztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3RyaW5naWZpZWQgPSBpb1xuICAgICAgICAubWFwKChpdGVtKSA9PiBpbmxpbmVGb3JtYXRJTyhpdGVtLCBmYWxzZSkpXG4gICAgICAgIC5qb2luKCcsJyk7XG4gICAgICBpZiAoc3RyaW5naWZpZWQubGVuZ3RoID4gVEFCTEVfVFJVTkNBVEVfSU9fTEVOR1RIICYmIHRvcExldmVsKSB7XG4gICAgICAgIHZhbHVlID0gY2hhbGsueWVsbG93KGAke2lvLmxlbmd0aH0gYXJnc2ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBzdHJpbmdpZmllZDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoaW8gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICB2YWx1ZSA9IGlvLnRvSVNPU3RyaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gdHJ1bmNhdGVTdHJpbmcoSlNPTi5zdHJpbmdpZnkoaW8pKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoWydzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgIGlmIChpc1N0cmVhbUlkKGlvIGFzIHN0cmluZykpIHtcbiAgICAgIHZhbHVlID0gaW8udG9TdHJpbmcoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIChpbyBhcyBzdHJpbmcpLmluY2x1ZGVzKCdzdHJtXycpKSB7XG4gICAgICB2YWx1ZSA9IGlvIGFzIHN0cmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSB0cnVuY2F0ZVN0cmluZyhTdHJpbmcoaW8pKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBgPCR7dHlwZX0+YDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5leHBvcnQgY29uc3QgbGlzdFJ1bnMgPSBhc3luYyAod29ybGQ6IFdvcmxkLCBvcHRzOiBJbnNwZWN0Q0xJT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHJlc29sdmVLZXkgPSBjcmVhdGVSZXNvbHZlcih3b3JsZCwgb3B0cz8uZGVjcnlwdCA/PyBmYWxzZSk7XG5cbiAgaWYgKG9wdHMuc3RlcElkIHx8IG9wdHMucnVuSWQpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgc3RlcC1pZCBvciBydW4taWQgaXMgbm90IHN1cHBvcnRlZCBpbiBsaXN0IGNhbGxzLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cblxuICBjb25zdCByZXNvbHZlRGF0YSA9IG9wdHMud2l0aERhdGEgPyAnYWxsJyA6ICdub25lJztcblxuICAvLyBEZXRlcm1pbmUgd2hpY2ggcHJvcHMgdG8gc2hvdyBiYXNlZCBvbiB3aXRoRGF0YSBmbGFnXG4gIGNvbnN0IHByb3BzID0gb3B0cy53aXRoRGF0YVxuICAgID8gV09SS0ZMT1dfUlVOX0xJU1RFRF9QUk9QU1xuICAgIDogV09SS0ZMT1dfUlVOX0xJU1RFRF9QUk9QUy5maWx0ZXIoXG4gICAgICAgIChwcm9wKSA9PiAhV09SS0ZMT1dfUlVOX0lPX1BST1BTLmluY2x1ZGVzKHByb3ApXG4gICAgICApO1xuXG4gIC8vIEZvciBKU09OIG91dHB1dCwganVzdCBmZXRjaCBvbmNlIGFuZCByZXR1cm5cbiAgaWYgKG9wdHMuanNvbikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBydW5zID0gYXdhaXQgd29ybGQucnVucy5saXN0KHtcbiAgICAgICAgd29ya2Zsb3dOYW1lOiBvcHRzLndvcmtmbG93TmFtZSxcbiAgICAgICAgc3RhdHVzOiBvcHRzLnN0YXR1cyBhcyBhbnksXG4gICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICBzb3J0T3JkZXI6IG9wdHMuc29ydCB8fCAnZGVzYycsXG4gICAgICAgICAgY3Vyc29yOiBvcHRzLmN1cnNvcixcbiAgICAgICAgICBsaW1pdDogb3B0cy5saW1pdCB8fCBERUZBVUxUX1BBR0VfU0laRSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZURhdGEsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJ1bnNXaXRoSHlkcmF0ZWRJTyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBydW5zLmRhdGEubWFwKChyKSA9PiBoeWRyYXRlUmVzb3VyY2VJTyhyLCByZXNvbHZlS2V5KSlcbiAgICAgICk7XG4gICAgICBzaG93SnNvbih7IC4uLnJ1bnMsIGRhdGE6IHJ1bnNXaXRoSHlkcmF0ZWRJTyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGhhbmRsZUFwaUVycm9yKGVycm9yLCBvcHRzLmJhY2tlbmQpKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IHNldHVwTGlzdFBhZ2luYXRpb248V29ya2Zsb3dSdW4gfCBXb3JrZmxvd1J1bldpdGhvdXREYXRhPih7XG4gICAgaW5pdGlhbEN1cnNvcjogb3B0cy5jdXJzb3IsXG4gICAgaW50ZXJhY3RpdmU6IG9wdHMuaW50ZXJhY3RpdmUsXG4gICAgZmV0Y2hQYWdlOiBhc3luYyAoY3Vyc29yKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBydW5zID0gYXdhaXQgd29ybGQucnVucy5saXN0KHtcbiAgICAgICAgICB3b3JrZmxvd05hbWU6IG9wdHMud29ya2Zsb3dOYW1lLFxuICAgICAgICAgIHN0YXR1czogb3B0cy5zdGF0dXMgYXMgYW55LFxuICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgIHNvcnRPcmRlcjogb3B0cy5zb3J0IHx8ICdkZXNjJyxcbiAgICAgICAgICAgIGN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzLmxpbWl0IHx8IERFRkFVTFRfUEFHRV9TSVpFLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzb2x2ZURhdGEsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IHJ1bnMuZGF0YSxcbiAgICAgICAgICBjdXJzb3I6IHJ1bnMuY3Vyc29yLFxuICAgICAgICAgIGhhc01vcmU6IHJ1bnMuaGFzTW9yZSxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRpc3BsYXlQYWdlOiBhc3luYyAocnVucykgPT4ge1xuICAgICAgY29uc3QgcnVuc1dpdGhIeWRyYXRlZElPID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHJ1bnMubWFwKChyKSA9PiBoeWRyYXRlUmVzb3VyY2VJTyhyLCByZXNvbHZlS2V5KSlcbiAgICAgICk7XG4gICAgICBsb2dnZXIubG9nKHNob3dUYWJsZShydW5zV2l0aEh5ZHJhdGVkSU8sIHByb3BzLCBvcHRzKSk7XG4gICAgfSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVjZW50UnVuID0gYXN5bmMgKFxuICB3b3JsZDogV29ybGQsXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge31cbikgPT4ge1xuICBjb25zdCByZXNvbHZlS2V5ID0gY3JlYXRlUmVzb2x2ZXIod29ybGQsIG9wdHM/LmRlY3J5cHQgPz8gZmFsc2UpO1xuXG4gIGxvZ2dlci53YXJuKGBObyBydW5JZCBwcm92aWRlZCwgZmV0Y2hpbmcgZGF0YSBmb3IgbGF0ZXN0IHJ1biBpbnN0ZWFkLmApO1xuICB0cnkge1xuICAgIGNvbnN0IHJ1bnMgPSBhd2FpdCB3b3JsZC5ydW5zLmxpc3Qoe1xuICAgICAgcGFnaW5hdGlvbjogeyBsaW1pdDogMSwgc29ydE9yZGVyOiBvcHRzLnNvcnQgfHwgJ2Rlc2MnIH0sXG4gICAgICByZXNvbHZlRGF0YTogJ25vbmUnLCAvLyBEb24ndCBuZWVkIGRhdGEgZm9yIGp1c3QgZ2V0dGluZyB0aGUgSURcbiAgICB9KTtcbiAgICBydW5zLmRhdGEgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHJ1bnMuZGF0YS5tYXAoKHIpID0+IGh5ZHJhdGVSZXNvdXJjZUlPKHIsIHJlc29sdmVLZXkpKVxuICAgICk7XG4gICAgcmV0dXJuIHJ1bnMuZGF0YVswXTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzaG93UnVuID0gYXN5bmMgKFxuICB3b3JsZDogV29ybGQsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge31cbikgPT4ge1xuICBjb25zdCByZXNvbHZlS2V5ID0gY3JlYXRlUmVzb2x2ZXIod29ybGQsIG9wdHM/LmRlY3J5cHQgPz8gZmFsc2UpO1xuXG4gIGlmIChvcHRzLndpdGhEYXRhKSB7XG4gICAgbG9nZ2VyLndhcm4oJ2B3aXRoRGF0YWAgZmxhZyBpcyBpZ25vcmVkIHdoZW4gc2hvd2luZyBpbmRpdmlkdWFsIHJlc291cmNlcycpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgcnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQocnVuSWQsIHsgcmVzb2x2ZURhdGE6ICdhbGwnIH0pO1xuICAgIGNvbnN0IHJ1bldpdGhIeWRyYXRlZElPID0gYXdhaXQgaHlkcmF0ZVJlc291cmNlSU8ocnVuLCByZXNvbHZlS2V5KTtcbiAgICBpZiAob3B0cy5qc29uKSB7XG4gICAgICBzaG93SnNvbihydW5XaXRoSHlkcmF0ZWRJTyk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChoYXNFeHBpcmVkRGF0YShydW4pKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIFwiVGhpcyBydW4ncyBkYXRhIChpbnB1dC9vdXRwdXQvZXJyb3IpIGhhcyBleHBpcmVkIGFuZCBpcyBubyBsb25nZXIgYXZhaWxhYmxlLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsb2dnZXIubG9nKHJ1bldpdGhIeWRyYXRlZElPKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGhhbmRsZUFwaUVycm9yKGVycm9yLCBvcHRzLmJhY2tlbmQpKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgbGlzdFN0ZXBzID0gYXN5bmMgKFxuICB3b3JsZDogV29ybGQsXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge1xuICAgIHJ1bklkOiB1bmRlZmluZWQsXG4gIH1cbikgPT4ge1xuICBjb25zdCByZXNvbHZlS2V5ID0gY3JlYXRlUmVzb2x2ZXIod29ybGQsIG9wdHM/LmRlY3J5cHQgPz8gZmFsc2UpO1xuXG4gIGlmIChvcHRzLnN0ZXBJZCkge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgJ0ZpbHRlcmluZyBieSBzdGVwLWlkIGlzIG5vdCBzdXBwb3J0ZWQgaW4gbGlzdCBjYWxscywgaWdub3JpbmcgZmlsdGVyLidcbiAgICApO1xuICB9XG4gIGlmIChvcHRzLndvcmtmbG93TmFtZSkge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgJ0ZpbHRlcmluZyBieSB3b3JrZmxvdy1uYW1lIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHN0ZXBzLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cblxuICBjb25zdCBydW5JZCA9IG9wdHMucnVuSWRcbiAgICA/IG9wdHMucnVuSWRcbiAgICA6IChhd2FpdCBnZXRSZWNlbnRSdW4od29ybGQsIG9wdHMpKT8ucnVuSWQ7XG4gIGlmICghcnVuSWQpIHtcbiAgICBsb2dnZXIuZXJyb3IoJ05vIHJ1biBmb3VuZC4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByZXNvbHZlRGF0YSA9IG9wdHMud2l0aERhdGEgPyAnYWxsJyA6ICdub25lJztcblxuICAvLyBEZXRlcm1pbmUgd2hpY2ggcHJvcHMgdG8gc2hvdyBiYXNlZCBvbiB3aXRoRGF0YSBmbGFnXG4gIGNvbnN0IHByb3BzID0gb3B0cy53aXRoRGF0YVxuICAgID8gU1RFUF9MSVNURURfUFJPUFNcbiAgICA6IFNURVBfTElTVEVEX1BST1BTLmZpbHRlcigocHJvcCkgPT4gIVNURVBfSU9fUFJPUFMuaW5jbHVkZXMocHJvcCkpO1xuXG4gIC8vIEZvciBKU09OIG91dHB1dCwganVzdCBmZXRjaCBvbmNlIGFuZCByZXR1cm5cbiAgaWYgKG9wdHMuanNvbikge1xuICAgIGxvZ2dlci5kZWJ1ZyhgRmV0Y2hpbmcgc3RlcHMgZm9yIHJ1biAke3J1bklkfWApO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGVwQ2h1bmtzID0gYXdhaXQgd29ybGQuc3RlcHMubGlzdCh7XG4gICAgICAgIHJ1bklkLFxuICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgc29ydE9yZGVyOiBvcHRzLnNvcnQgfHwgJ2Rlc2MnLFxuICAgICAgICAgIGN1cnNvcjogb3B0cy5jdXJzb3IsXG4gICAgICAgICAgbGltaXQ6IG9wdHMubGltaXQgfHwgREVGQVVMVF9QQUdFX1NJWkUsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVEYXRhLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBzdGVwc1dpdGhIeWRyYXRlZElPID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHN0ZXBDaHVua3MuZGF0YS5tYXAoKHMpID0+IGh5ZHJhdGVSZXNvdXJjZUlPKHMsIHJlc29sdmVLZXkpKVxuICAgICAgKTtcbiAgICAgIHNob3dKc29uKHN0ZXBzV2l0aEh5ZHJhdGVkSU8pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgc2V0dXBMaXN0UGFnaW5hdGlvbjxTdGVwIHwgU3RlcFdpdGhvdXREYXRhPih7XG4gICAgaW5pdGlhbEN1cnNvcjogb3B0cy5jdXJzb3IsXG4gICAgaW50ZXJhY3RpdmU6IG9wdHMuaW50ZXJhY3RpdmUsXG4gICAgZmV0Y2hQYWdlOiBhc3luYyAoY3Vyc29yKSA9PiB7XG4gICAgICBsb2dnZXIuZGVidWcoYEZldGNoaW5nIHN0ZXBzIGZvciBydW4gJHtydW5JZH1gKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0ZXBDaHVua3MgPSBhd2FpdCB3b3JsZC5zdGVwcy5saXN0KHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICBzb3J0T3JkZXI6IG9wdHMuc29ydCB8fCAnZGVzYycsXG4gICAgICAgICAgICBjdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cy5saW1pdCB8fCBERUZBVUxUX1BBR0VfU0laRSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc29sdmVEYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBzdGVwQ2h1bmtzLmRhdGEsXG4gICAgICAgICAgY3Vyc29yOiBzdGVwQ2h1bmtzLmN1cnNvcixcbiAgICAgICAgICBoYXNNb3JlOiBzdGVwQ2h1bmtzLmhhc01vcmUsXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSxcbiAgICBkaXNwbGF5UGFnZTogYXN5bmMgKHN0ZXBzKSA9PiB7XG4gICAgICBjb25zdCBzdGVwc1dpdGhIeWRyYXRlZElPID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHN0ZXBzLm1hcCgocykgPT4gaHlkcmF0ZVJlc291cmNlSU8ocywgcmVzb2x2ZUtleSkpXG4gICAgICApO1xuICAgICAgbG9nZ2VyLmxvZyhzaG93VGFibGUoc3RlcHNXaXRoSHlkcmF0ZWRJTywgcHJvcHMsIG9wdHMpKTtcbiAgICAgIHNob3dJbnNwZWN0SW5mb0JveCgnc3RlcCcpO1xuICAgIH0sXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHNob3dTdGVwID0gYXN5bmMgKFxuICB3b3JsZDogV29ybGQsXG4gIHN0ZXBJZDogc3RyaW5nLFxuICBvcHRzOiBJbnNwZWN0Q0xJT3B0aW9ucyA9IHt9XG4pID0+IHtcbiAgY29uc3QgcmVzb2x2ZUtleSA9IGNyZWF0ZVJlc29sdmVyKHdvcmxkLCBvcHRzPy5kZWNyeXB0ID8/IGZhbHNlKTtcblxuICBpZiAob3B0cy53aXRoRGF0YSkge1xuICAgIGxvZ2dlci53YXJuKCdgd2l0aERhdGFgIGZsYWcgaXMgaWdub3JlZCB3aGVuIHNob3dpbmcgaW5kaXZpZHVhbCByZXNvdXJjZXMnKTtcbiAgfVxuICBpZiAob3B0cy5zdGVwSWQpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgc3RlcC1pZCBpcyBub3Qgc3VwcG9ydGVkIGluIGdldCBjYWxscywgaWdub3JpbmcgZmlsdGVyLidcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcnVuSWQgPSBvcHRzLnJ1bklkID8/IChhd2FpdCBnZXRSZWNlbnRSdW4od29ybGQsIG9wdHMpKT8ucnVuSWQ7XG4gIGlmICghcnVuSWQpIHtcbiAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAncnVuLWlkIGlzIHJlcXVpcmVkIGZvciBzaG93aW5nIGEgc3RlcC4gVXNhZ2U6IGB3b3JrZmxvdyBpbnNwZWN0IHN0ZXAgPFNURVBfSUQ+IC0tcnVuSWQ9PFJVTl9JRD5gJ1xuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzdGVwID0gYXdhaXQgd29ybGQuc3RlcHMuZ2V0KHJ1bklkLCBzdGVwSWQsIHtcbiAgICAgIHJlc29sdmVEYXRhOiAnYWxsJyxcbiAgICB9KTtcbiAgICBjb25zdCBzdGVwV2l0aEh5ZHJhdGVkSU8gPSBhd2FpdCBoeWRyYXRlUmVzb3VyY2VJTyhzdGVwLCByZXNvbHZlS2V5KTtcbiAgICBpZiAob3B0cy5qc29uKSB7XG4gICAgICBzaG93SnNvbihzdGVwV2l0aEh5ZHJhdGVkSU8pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgIGhhc0V4cGlyZWRGaWVsZHMoXG4gICAgICAgICAgc3RlcFdpdGhIeWRyYXRlZElPIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIFwiVGhpcyBzdGVwJ3MgZGF0YSAoaW5wdXQvb3V0cHV0L2Vycm9yKSBoYXMgZXhwaXJlZCBhbmQgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmxvZyhzdGVwV2l0aEh5ZHJhdGVkSU8pO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzaG93U3RyZWFtID0gYXN5bmMgKFxuICB3b3JsZDogV29ybGQsXG4gIHN0cmVhbUlkOiBzdHJpbmcsXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge31cbikgPT4ge1xuICBpZiAob3B0cy5zdGVwSWQpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgc3RlcC1pZCBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gc2hvd2luZyBhIHN0cmVhbSwgaWdub3JpbmcgZmlsdGVyLidcbiAgICApO1xuICB9XG4gIGlmICghb3B0cy5ydW5JZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignLS1ydW4gaXMgcmVxdWlyZWQgd2hlbiBzaG93aW5nIGEgc3RyZWFtJyk7XG4gIH1cbiAgY29uc3QgcmF3U3RyZWFtID0gYXdhaXQgd29ybGQuc3RyZWFtcy5nZXQob3B0cy5ydW5JZCwgc3RyZWFtSWQpO1xuXG4gIC8vIE9ubHkgcmVzb2x2ZSB0aGUgZW5jcnlwdGlvbiBrZXkgd2hlbiAtLWRlY3J5cHQgaXMgcGFzc2VkIGFuZCAtLXJ1biBpcyBwcm92aWRlZC5cbiAgLy8gV2UgZmV0Y2ggdGhlIGZ1bGwgV29ya2Zsb3dSdW4gb2JqZWN0IHNvIHRoYXQgZ2V0RW5jcnlwdGlvbktleUZvclJ1biBoYXNcbiAgLy8gYWNjZXNzIHRvIHRoZSBkZXBsb3ltZW50SWQgKG5lZWRlZCBmb3IgQVBJLWJhc2VkIGtleSByZXNvbHV0aW9uKS5cbiAgbGV0IGVuY3J5cHRpb25LZXk6IEVuY3J5cHRpb25LZXlQYXJhbTtcbiAgaWYgKG9wdHMuZGVjcnlwdCAmJiBvcHRzLnJ1bklkKSB7XG4gICAgZW5jcnlwdGlvbktleSA9IChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBydW4gPSBhd2FpdCB3b3JsZC5ydW5zLmdldChvcHRzLnJ1bklkISk7XG4gICAgICBjb25zdCByYXdLZXkgPSBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4ocnVuKTtcbiAgICAgIHJldHVybiByYXdLZXkgPyBhd2FpdCBpbXBvcnRLZXkocmF3S2V5KSA6IHVuZGVmaW5lZDtcbiAgICB9KSgpO1xuICB9IGVsc2UgaWYgKG9wdHMuZGVjcnlwdCAmJiAhb3B0cy5ydW5JZCkge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgJ0Nhbm5vdCBkZWNyeXB0IHN0cmVhbSBjb250ZW50IHdpdGhvdXQgYSBydW4gSUQuIFVzZSAtLXJ1bj08cnVuLWlkPiB3aXRoIC0tZGVjcnlwdC4nXG4gICAgKTtcbiAgfVxuXG4gIC8vIERlc2VyaWFsaXplIHRoZSBzdHJlYW0gdG8gZ2V0IEphdmFTY3JpcHQgb2JqZWN0c1xuICBjb25zdCByZXZpdmVycyA9IGdldEV4dGVybmFsUmV2aXZlcnMoXG4gICAgZ2xvYmFsVGhpcyxcbiAgICBbXSxcbiAgICBvcHRzLnJ1bklkID8/ICcnLFxuICAgIGVuY3J5cHRpb25LZXlcbiAgKTtcbiAgY29uc3QgdHJhbnNmb3JtID0gZ2V0RGVzZXJpYWxpemVTdHJlYW0ocmV2aXZlcnMsIGVuY3J5cHRpb25LZXkpO1xuICBjb25zdCBzdHJlYW0gPSByYXdTdHJlYW0ucGlwZVRocm91Z2godHJhbnNmb3JtKTtcblxuICBsb2dnZXIuaW5mbygnU3RyZWFtaW5nIHRvIHN0ZG91dCwgcHJlc3MgQ1RSTCtDIHRvIGFib3J0LicpO1xuICBsb2dnZXIuaW5mbyhcbiAgICAnVXNlIC0tanNvbiB0byBvdXRwdXQgdGhlIHN0cmVhbSBhcyBuZXdsaW5lLWRlbGltaXRlZCBKU09OIHdpdGhvdXQgaW5mbyBsb2dzLlxcbidcbiAgKTtcbiAgYXdhaXQgc3RyZWFtVG9Db25zb2xlKHN0cmVhbSwgc3RyZWFtSWQsIG9wdHMpO1xufTtcblxuLyoqXG4gKiBMaXN0aW5nIHN0cmVhbXMgb25seSBsaXN0cyBhdmFpbGFibGUgc3RyZWFtIElEcyBiYXNlZCBvbiBydW4vc3RlcCBwYXNzZWQsXG4gKiBhbmQgZG9lc24ndCByZWFkIGFueSBkYXRhIGZyb20gdGhlIHN0cmVhbXMuXG4gKi9cbmV4cG9ydCBjb25zdCBsaXN0U3RyZWFtc0J5UnVuSWQgPSBhc3luYyAoXG4gIHdvcmxkOiBXb3JsZCxcbiAgb3B0czogSW5zcGVjdENMSU9wdGlvbnMgPSB7fVxuKSA9PiB7XG4gIGlmIChvcHRzLndpdGhEYXRhKSB7XG4gICAgbG9nZ2VyLndhcm4oJ2B3aXRoRGF0YWAgZmxhZyBpcyBpZ25vcmVkIHdoZW4gbGlzdGluZyBzdHJlYW1zJyk7XG4gIH1cbiAgaWYgKG9wdHMud29ya2Zsb3dOYW1lKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnRmlsdGVyaW5nIGJ5IHdvcmtmbG93LW5hbWUgaXMgbm90IHN1cHBvcnRlZCBmb3Igc3RyZWFtcywgaWdub3JpbmcgZmlsdGVyLidcbiAgICApO1xuICB9XG4gIGlmIChvcHRzLnN0ZXBJZCkge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgJ0ZpbHRlcmluZyBieSBzdGVwLWlkIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHN0cmVhbXMsIGlnbm9yaW5nIGZpbHRlci4nXG4gICAgKTtcbiAgfVxuXG4gIGxldCBydW5JZCA9IG9wdHMucnVuSWQ7XG4gIGlmICghcnVuSWQpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdObyBydW4taWQgcHJvdmlkZWQuIExpc3Rpbmcgc3RyZWFtcyBmb3IgbGF0ZXN0IHJ1biBpbnN0ZWFkLicsXG4gICAgICAnVXNlIC0tcnVuPTxydW4taWQ+IHRvIGZpbHRlciBzdHJlYW1zIGJ5IHJ1bi4nXG4gICAgKTtcbiAgICBjb25zdCBydW4gPSBhd2FpdCBnZXRSZWNlbnRSdW4od29ybGQsIG9wdHMpO1xuICAgIGlmICghcnVuKSB7XG4gICAgICBsb2dnZXIud2FybignTm8gcnVucyBmb3VuZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcnVuSWQgPSBydW4ucnVuSWQ7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHN0cmVhbUlkcyA9IGF3YWl0IHdvcmxkLnN0cmVhbXMubGlzdChydW5JZCk7XG4gICAgY29uc3QgbWF0Y2hpbmdTdHJlYW1zID0gc3RyZWFtSWRzLm1hcCgoc3RyZWFtSWQpID0+ICh7XG4gICAgICBydW5JZCxcbiAgICAgIHN0cmVhbUlkLFxuICAgIH0pKTtcblxuICAgIGlmIChvcHRzLmpzb24pIHtcbiAgICAgIHNob3dKc29uKG1hdGNoaW5nU3RyZWFtcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxvZ2dlci5sb2coc2hvd1RhYmxlKG1hdGNoaW5nU3RyZWFtcywgWydydW5JZCcsICdzdHJlYW1JZCddKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGhhbmRsZUFwaUVycm9yKGVycm9yLCBvcHRzLmJhY2tlbmQpKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgbGlzdEV2ZW50cyA9IGFzeW5jIChcbiAgd29ybGQ6IFdvcmxkLFxuICBvcHRzOiBJbnNwZWN0Q0xJT3B0aW9ucyA9IHt9XG4pID0+IHtcbiAgY29uc3QgcmVzb2x2ZUtleSA9IGNyZWF0ZVJlc29sdmVyKHdvcmxkLCBvcHRzPy5kZWNyeXB0ID8/IGZhbHNlKTtcbiAgaWYgKG9wdHMud29ya2Zsb3dOYW1lKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnRmlsdGVyaW5nIGJ5IHdvcmtmbG93LW5hbWUgaXMgbm90IHN1cHBvcnRlZCBmb3IgZXZlbnRzLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cblxuICBjb25zdCBydW5JZCA9IG9wdHMucnVuSWQgPz8gKGF3YWl0IGdldFJlY2VudFJ1bih3b3JsZCwgb3B0cykpPy5ydW5JZDtcbiAgaWYgKCFydW5JZCkge1xuICAgIGxvZ2dlci5lcnJvcignTm8gcnVuIGZvdW5kLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvcnJlbGF0aW9uSWRGaWx0ZXIgPSBvcHRzLmhvb2tJZCB8fCBvcHRzLnN0ZXBJZDtcbiAgY29uc3QgcGFyYW1zOiBMaXN0RXZlbnRzUGFyYW1zID0ge1xuICAgIHJ1bklkLFxuICAgIHBhZ2luYXRpb246IHtcbiAgICAgIHNvcnRPcmRlcjogb3B0cy5zb3J0IHx8ICdkZXNjJyxcbiAgICAgIGN1cnNvcjogb3B0cy5jdXJzb3IsXG4gICAgICBsaW1pdDogb3B0cy5saW1pdCB8fCBERUZBVUxUX1BBR0VfU0laRSxcbiAgICB9LFxuICAgIHJlc29sdmVEYXRhOiBvcHRzLndpdGhEYXRhID8gJ2FsbCcgOiAnbm9uZScsXG4gIH07XG4gIGNvbnN0IGxpc3RDYWxsID0gYXN5bmMgKHBhZ2luYXRpb246IFBhZ2luYXRpb25PcHRpb25zKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ybGQuZXZlbnRzLmxpc3Qoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgcGFnaW5hdGlvbjogeyAuLi5wYXJhbXMucGFnaW5hdGlvbiwgLi4ucGFnaW5hdGlvbiB9LFxuICAgIH0pO1xuICAgIGlmIChjb3JyZWxhdGlvbklkRmlsdGVyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhLmZpbHRlcihcbiAgICAgICAgICAoZSkgPT4gZS5jb3JyZWxhdGlvbklkID09PSBjb3JyZWxhdGlvbklkRmlsdGVyXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIERldGVybWluZSB3aGljaCBwcm9wcyB0byBzaG93IGJhc2VkIG9uIHdpdGhEYXRhIGZsYWdcbiAgY29uc3QgcHJvcHMgPSBvcHRzLndpdGhEYXRhXG4gICAgPyBFVkVOVF9MSVNURURfUFJPUFNcbiAgICA6IEVWRU5UX0xJU1RFRF9QUk9QUy5maWx0ZXIoKHByb3ApID0+ICFFVkVOVF9JT19QUk9QUy5pbmNsdWRlcyhwcm9wKSk7XG5cbiAgLy8gRm9yIEpTT04gb3V0cHV0LCBqdXN0IGZldGNoIG9uY2UgYW5kIHJldHVyblxuICBpZiAob3B0cy5qc29uKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBGZXRjaGluZyBldmVudHMgZm9yIHJ1biAke3J1bklkfWApO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBldmVudHMgPSBhd2FpdCBsaXN0Q2FsbCh7fSk7XG4gICAgICBjb25zdCBoeWRyYXRlZEV2ZW50cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBldmVudHMuZGF0YS5tYXAoKGUpID0+IGh5ZHJhdGVSZXNvdXJjZUlPKGUsIHJlc29sdmVLZXkpKVxuICAgICAgKTtcbiAgICAgIHNob3dKc29uKGh5ZHJhdGVkRXZlbnRzKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGhhbmRsZUFwaUVycm9yKGVycm9yLCBvcHRzLmJhY2tlbmQpKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IHNldHVwTGlzdFBhZ2luYXRpb248RXZlbnQ+KHtcbiAgICBpbml0aWFsQ3Vyc29yOiBvcHRzLmN1cnNvcixcbiAgICBpbnRlcmFjdGl2ZTogb3B0cy5pbnRlcmFjdGl2ZSxcbiAgICBmZXRjaFBhZ2U6IGFzeW5jIChjdXJzb3IpID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRmV0Y2hpbmcgZXZlbnRzIGZvciBydW4gJHtydW5JZH1gKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IGxpc3RDYWxsKHsgY3Vyc29yIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IGV2ZW50cy5kYXRhLFxuICAgICAgICAgIGN1cnNvcjogZXZlbnRzLmN1cnNvcixcbiAgICAgICAgICBoYXNNb3JlOiBldmVudHMuaGFzTW9yZSxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRpc3BsYXlQYWdlOiBhc3luYyAoZXZlbnRzKSA9PiB7XG4gICAgICBjb25zdCBoeWRyYXRlZEV2ZW50cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBldmVudHMubWFwKChlKSA9PiBoeWRyYXRlUmVzb3VyY2VJTyhlLCByZXNvbHZlS2V5KSlcbiAgICAgICk7XG4gICAgICBsb2dnZXIubG9nKHNob3dUYWJsZShoeWRyYXRlZEV2ZW50cywgcHJvcHMsIG9wdHMpKTtcbiAgICAgIHNob3dJbnNwZWN0SW5mb0JveCgnZXZlbnQnKTtcbiAgICB9LFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBsaXN0SG9va3MgPSBhc3luYyAod29ybGQ6IFdvcmxkLCBvcHRzOiBJbnNwZWN0Q0xJT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHJlc29sdmVLZXkgPSBjcmVhdGVSZXNvbHZlcih3b3JsZCwgb3B0cz8uZGVjcnlwdCA/PyBmYWxzZSk7XG5cbiAgaWYgKG9wdHMud29ya2Zsb3dOYW1lKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnRmlsdGVyaW5nIGJ5IHdvcmtmbG93LW5hbWUgaXMgbm90IHN1cHBvcnRlZCBmb3IgaG9va3MsIGlnbm9yaW5nIGZpbHRlci4nXG4gICAgKTtcbiAgfVxuICBpZiAob3B0cy5zdGVwSWQpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgc3RlcC1pZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBob29rcywgaWdub3JpbmcgZmlsdGVyLidcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcnVuSWQgPSBvcHRzLnJ1bklkO1xuICBjb25zdCByZXNvbHZlRGF0YSA9IG9wdHMud2l0aERhdGEgPyAnYWxsJyA6ICdub25lJztcblxuICAvLyBGb3IgSlNPTiBvdXRwdXQsIGp1c3QgZmV0Y2ggb25jZSBhbmQgcmV0dXJuXG4gIGlmIChvcHRzLmpzb24pIHtcbiAgICBpZiAoIXJ1bklkKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ0ZldGNoaW5nIGFsbCBob29rcycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuZGVidWcoYEZldGNoaW5nIGhvb2tzIGZvciBydW4gJHtydW5JZH1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhvb2tzID0gYXdhaXQgd29ybGQuaG9va3MubGlzdCh7XG4gICAgICAgIHJ1bklkLFxuICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgc29ydE9yZGVyOiBvcHRzLnNvcnQgfHwgJ2Rlc2MnLFxuICAgICAgICAgIGN1cnNvcjogb3B0cy5jdXJzb3IsXG4gICAgICAgICAgbGltaXQ6IG9wdHMubGltaXQgfHwgREVGQVVMVF9QQUdFX1NJWkUsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVEYXRhLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBoeWRyYXRlZEhvb2tzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGhvb2tzLmRhdGEubWFwKChoKSA9PiBoeWRyYXRlUmVzb3VyY2VJTyhoLCByZXNvbHZlS2V5KSlcbiAgICAgICk7XG4gICAgICBzaG93SnNvbih7IC4uLmhvb2tzLCBkYXRhOiBoeWRyYXRlZEhvb2tzIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0dXAgcGFnaW5hdGlvbiB3aXRoIG5ldyBtZWNoYW5pc21cbiAgYXdhaXQgc2V0dXBMaXN0UGFnaW5hdGlvbjxIb29rPih7XG4gICAgaW5pdGlhbEN1cnNvcjogb3B0cy5jdXJzb3IsXG4gICAgaW50ZXJhY3RpdmU6IG9wdHMuaW50ZXJhY3RpdmUsXG4gICAgZmV0Y2hQYWdlOiBhc3luYyAoY3Vyc29yKSA9PiB7XG4gICAgICBpZiAoIXJ1bklkKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnRmV0Y2hpbmcgYWxsIGhvb2tzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZGVidWcoYEZldGNoaW5nIGhvb2tzIGZvciBydW4gJHtydW5JZH1gKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhvb2tzID0gYXdhaXQgd29ybGQuaG9va3MubGlzdCh7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgc29ydE9yZGVyOiBvcHRzLnNvcnQgfHwgJ2Rlc2MnLFxuICAgICAgICAgICAgY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHMubGltaXQgfHwgREVGQVVMVF9QQUdFX1NJWkUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvbHZlRGF0YSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogaG9va3MuZGF0YSxcbiAgICAgICAgICBjdXJzb3I6IGhvb2tzLmN1cnNvcixcbiAgICAgICAgICBoYXNNb3JlOiBob29rcy5oYXNNb3JlLFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGhhbmRsZUFwaUVycm9yKGVycm9yLCBvcHRzLmJhY2tlbmQpKSB7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGlzcGxheVBhZ2U6IGFzeW5jIChob29rcykgPT4ge1xuICAgICAgY29uc3QgaHlkcmF0ZWRIb29rcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBob29rcy5tYXAoKGgpID0+IGh5ZHJhdGVSZXNvdXJjZUlPKGgsIHJlc29sdmVLZXkpKVxuICAgICAgKTtcbiAgICAgIGxvZ2dlci5sb2coc2hvd1RhYmxlKGh5ZHJhdGVkSG9va3MsIEhPT0tfTElTVEVEX1BST1BTLCBvcHRzKSk7XG4gICAgICBzaG93SW5zcGVjdEluZm9Cb3goJ2hvb2snKTtcbiAgICB9LFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaG93SG9vayA9IGFzeW5jIChcbiAgd29ybGQ6IFdvcmxkLFxuICBob29rSWQ6IHN0cmluZyxcbiAgb3B0czogSW5zcGVjdENMSU9wdGlvbnMgPSB7fVxuKSA9PiB7XG4gIGNvbnN0IHJlc29sdmVLZXkgPSBjcmVhdGVSZXNvbHZlcih3b3JsZCwgb3B0cz8uZGVjcnlwdCA/PyBmYWxzZSk7XG5cbiAgaWYgKG9wdHMud2l0aERhdGEpIHtcbiAgICBsb2dnZXIud2FybignYHdpdGhEYXRhYCBmbGFnIGlzIGlnbm9yZWQgd2hlbiBzaG93aW5nIGluZGl2aWR1YWwgcmVzb3VyY2VzJyk7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBob29rID0gYXdhaXQgd29ybGQuaG9va3MuZ2V0KGhvb2tJZCwge1xuICAgICAgcmVzb2x2ZURhdGE6ICdhbGwnLFxuICAgIH0pO1xuICAgIGNvbnN0IGh5ZHJhdGVkSG9vayA9IGF3YWl0IGh5ZHJhdGVSZXNvdXJjZUlPKGhvb2ssIHJlc29sdmVLZXkpO1xuICAgIGlmIChvcHRzLmpzb24pIHtcbiAgICAgIHNob3dKc29uKGh5ZHJhdGVkSG9vayk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChcbiAgICAgICAgaGFzRXhwaXJlZEZpZWxkcyhoeWRyYXRlZEhvb2sgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICkge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBcIlRoaXMgaG9vaydzIGRhdGEgKG1ldGFkYXRhKSBoYXMgZXhwaXJlZCBhbmQgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmxvZyhoeWRyYXRlZEhvb2spO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBsaXN0U2xlZXBzID0gYXN5bmMgKFxuICB3b3JsZDogV29ybGQsXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge31cbikgPT4ge1xuICBpZiAoIW9wdHMucnVuSWQpIHtcbiAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAncnVuLWlkIGlzIHJlcXVpcmVkIGZvciBsaXN0aW5nIHNsZWVwcy4gVXNhZ2U6IGB3b3JrZmxvdyBpbnNwZWN0IHNsZWVwcyAtLXJ1bklkPTxpZD5gJ1xuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKG9wdHMuc3RlcElkKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnRmlsdGVyaW5nIGJ5IHN0ZXAtaWQgaXMgbm90IHN1cHBvcnRlZCBmb3Igc2xlZXBzLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cbiAgaWYgKG9wdHMud29ya2Zsb3dOYW1lKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnRmlsdGVyaW5nIGJ5IHdvcmtmbG93LW5hbWUgaXMgbm90IHN1cHBvcnRlZCBmb3Igc2xlZXBzLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cbiAgaWYgKG9wdHMud2l0aERhdGEpIHtcbiAgICBsb2dnZXIud2FybignYHdpdGhEYXRhYCBmbGFnIGlzIGlnbm9yZWQgd2hlbiBsaXN0aW5nIHNsZWVwcycpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBGZXRjaCBhbGwgZXZlbnRzIGZvciB0aGUgcnVuIHdpdGggcmVzb2x2ZURhdGE9J2FsbCcgdG8gZ2V0IHdhaXQgZXZlbnREYXRhXG4gICAgY29uc3QgZXZlbnRzID0gYXdhaXQgd29ybGQuZXZlbnRzLmxpc3Qoe1xuICAgICAgcnVuSWQ6IG9wdHMucnVuSWQsXG4gICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgIHNvcnRPcmRlcjogb3B0cy5zb3J0IHx8ICdkZXNjJyxcbiAgICAgICAgbGltaXQ6IDEwMDAsXG4gICAgICB9LFxuICAgICAgcmVzb2x2ZURhdGE6ICdhbGwnLFxuICAgIH0pO1xuXG4gICAgLy8gU2hvdyBpbmZvIG1lc3NhZ2UgaWYgdGhlcmUgbWlnaHQgYmUgbW9yZSBzbGVlcHNcbiAgICBpZiAoZXZlbnRzLmhhc01vcmUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAnV2FybmluZzogVGhpcyBydW4gaGFzIG1vcmUgdGhhbiAxMDAwIGV2ZW50cy4gU29tZSBzbGVlcHMgbWlnaHQgbm90IGJlIHNob3duLiBQbGVhc2UgdXNlIHRoZSB3ZWIgVUkgdG8gZW5zdXJlIGdldHRpbmcgYSBjb21wbGV0ZSBsaXN0LidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gR3JvdXAgd2FpdCBldmVudHMgYnkgY29ycmVsYXRpb25JZFxuICAgIGNvbnN0IHdhaXRFdmVudHNCeUNvcnJlbGF0aW9uID0gbmV3IE1hcDxzdHJpbmcsIEV2ZW50W10+KCk7XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMuZGF0YSkge1xuICAgICAgaWYgKGV2ZW50LmNvcnJlbGF0aW9uSWQ/LnN0YXJ0c1dpdGgoJ3dhaXRfJykpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSB3YWl0RXZlbnRzQnlDb3JyZWxhdGlvbi5nZXQoZXZlbnQuY29ycmVsYXRpb25JZCkgPz8gW107XG4gICAgICAgIGV4aXN0aW5nLnB1c2goZXZlbnQpO1xuICAgICAgICB3YWl0RXZlbnRzQnlDb3JyZWxhdGlvbi5zZXQoZXZlbnQuY29ycmVsYXRpb25JZCwgZXhpc3RpbmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3YWl0RXZlbnRzQnlDb3JyZWxhdGlvbi5zaXplID09PSAwKSB7XG4gICAgICBsb2dnZXIud2FybignTm8gc2xlZXBzIGZvdW5kIGZvciB0aGlzIHJ1bi4nKTtcbiAgICAgIGlmIChvcHRzLmpzb24pIHtcbiAgICAgICAgc2hvd0pzb24oW10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmxvZyhcbiAgICAgICAgICBzaG93VGFibGUoW10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSwgV0FJVF9MSVNURURfUFJPUFMsIHtcbiAgICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgICAgICBkaXNhYmxlUmVsYXRpdmVEYXRlczogdHJ1ZSxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIHNsZWVwcyBmcm9tIGdyb3VwZWQgd2FpdCBldmVudHNcbiAgICBjb25zdCBzbGVlcHM6IFNsZWVwW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtjb3JyZWxhdGlvbklkLCBjb3JyZWxhdGlvbkV2ZW50c10gb2Ygd2FpdEV2ZW50c0J5Q29ycmVsYXRpb24pIHtcbiAgICAgIC8vIFN0aXRjaCB1cCB3YWl0X2NyZWF0ZWQgYW5kIHdhaXRfY29tcGxldGVkIGV2ZW50c1xuICAgICAgY29uc3Qgd2FpdENyZWF0ZWQgPSBjb3JyZWxhdGlvbkV2ZW50cy5maW5kKFxuICAgICAgICAoZTogRXZlbnQpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHdhaXRDb21wbGV0ZWQgPSBjb3JyZWxhdGlvbkV2ZW50cy5maW5kKFxuICAgICAgICAoZTogRXZlbnQpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnXG4gICAgICApO1xuXG4gICAgICBpZiAod2FpdENyZWF0ZWQpIHtcbiAgICAgICAgY29uc3Qgc2xlZXA6IFNsZWVwID0ge1xuICAgICAgICAgIGNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgcnVuSWQ6IHdhaXRDcmVhdGVkLnJ1bklkLFxuICAgICAgICAgIGV2ZW50SWQ6IHdhaXRDcmVhdGVkLmV2ZW50SWQsXG4gICAgICAgICAgY3JlYXRlZEF0OiB3YWl0Q3JlYXRlZC5jcmVhdGVkQXQsXG4gICAgICAgICAgcmVzdW1lQXQ6XG4gICAgICAgICAgICB3YWl0Q3JlYXRlZC5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnXG4gICAgICAgICAgICAgID8gd2FpdENyZWF0ZWQuZXZlbnREYXRhLnJlc3VtZUF0XG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGNvbXBsZXRlZEF0OiB3YWl0Q29tcGxldGVkPy5jcmVhdGVkQXQsXG4gICAgICAgIH07XG4gICAgICAgIHNsZWVwcy5wdXNoKHNsZWVwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IHNsZWVwcyBieSBjcmVhdGVkQXRcbiAgICBzbGVlcHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgdGltZUEgPSBhLmNyZWF0ZWRBdC5nZXRUaW1lKCk7XG4gICAgICBjb25zdCB0aW1lQiA9IGIuY3JlYXRlZEF0LmdldFRpbWUoKTtcbiAgICAgIHJldHVybiBvcHRzLnNvcnQgPT09ICdhc2MnID8gdGltZUEgLSB0aW1lQiA6IHRpbWVCIC0gdGltZUE7XG4gICAgfSk7XG5cbiAgICBpZiAob3B0cy5qc29uKSB7XG4gICAgICBzaG93SnNvbihzbGVlcHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZ2dlci5sb2coXG4gICAgICBzaG93VGFibGUoXG4gICAgICAgIHNsZWVwcyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG4gICAgICAgIFdBSVRfTElTVEVEX1BST1BTLFxuICAgICAgICB7IC4uLm9wdHMsIGRpc2FibGVSZWxhdGl2ZURhdGVzOiB0cnVlIH1cbiAgICAgIClcbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbiJdfQ==
1123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbnNwZWN0L291dHB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEQsT0FBTyxFQUVMLG9CQUFvQixFQUNwQixtQkFBbUIsR0FDcEIsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFOUUsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQyxPQUFPLEVBQ0wsc0NBQXNDLEVBQ3RDLG1DQUFtQyxHQUNwQyxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxZQUFZLEdBQ2IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVyRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxLQUFZLEVBQUUsT0FBZ0I7SUFDcEQsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPLElBQUksQ0FBQztJQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQjtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUEyQyxDQUFDO0lBQ2pFLE9BQU8sQ0FBQyxLQUFhLEVBQUUsRUFBRTtRQUN2QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUss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O1lBQ3BDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEMsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxDQUFDLEdBQUcsQ0FDUixTQUFTLENBQ1AsTUFBOEMsRUFDOUMsaUJBQWlCLEVBQ2pCLEVBQUUsR0FBRyxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLENBQ3hDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztRQUNELE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGltcG9ydEtleSB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL2VuY3J5cHRpb24nO1xuaW1wb3J0IHtcbiAgdHlwZSBFbmNyeXB0aW9uS2V5UGFyYW0sXG4gIGdldERlc2VyaWFsaXplU3RyZWFtLFxuICBnZXRFeHRlcm5hbFJldml2ZXJzLFxufSBmcm9tICdAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7IFZFUkNFTF80MDNfRVJST1JfTUVTU0FHRSB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgcGFyc2VTdGVwTmFtZSwgcGFyc2VXb3JrZmxvd05hbWUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50LCBIb29rLCBTdGVwLCBXb3JrZmxvd1J1biwgV29ybGQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcblxuaW1wb3J0IHsgZm9ybWF0RGlzdGFuY2UgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgVGFibGUgZnJvbSAnZWFzeS10YWJsZSc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9jb25maWcvbG9nLmpzJztcbmltcG9ydCB0eXBlIHsgSW5zcGVjdENMSU9wdGlvbnMgfSBmcm9tICcuLi9jb25maWcvdHlwZXMuanMnO1xuaW1wb3J0IHtcbiAgZ2V0T2JzZXJ2YWJpbGl0eVVwZ3JhZGVSZXF1aXJlZE1lc3NhZ2UsXG4gIGlzT2JzZXJ2YWJpbGl0eVVwZ3JhZGVSZXF1aXJlZEVycm9yLFxufSBmcm9tICcuL2Vycm9ycy5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEVuY3J5cHRpb25LZXlSZXNvbHZlcixcbiAgaHlkcmF0ZVJlc291cmNlSU8sXG4gIGlzRW5jcnlwdGVkUmVmLFxuICBpc0V4cGlyZWRSZWYsXG59IGZyb20gJy4vaHlkcmF0aW9uLmpzJztcbmltcG9ydCB7IHJlc29sdmVUaW1lV2luZG93IH0gZnJvbSAnLi90aW1lLXdpbmRvdy5qcyc7XG5cbi8qKlxuICogQ3JlYXRlIGFuIEVuY3J5cHRpb25LZXlSZXNvbHZlciBmcm9tIGEgV29ybGQgaW5zdGFuY2UuXG4gKiBSZXR1cm5zIG51bGwgaWYgZGVjcnlwdCBpcyBmYWxzZSDigJQgZW5jcnlwdGVkIGRhdGEgd2lsbCBzaG93IGFzIGEgcGxhY2Vob2xkZXIuXG4gKlxuICogVGhlIHJlc29sdmVyIGZldGNoZXMgdGhlIGZ1bGwgV29ya2Zsb3dSdW4gKGNhY2hlZCBwZXIgcnVuSWQpIHNvIHRoYXQgdGhlXG4gKiBXb3JsZCBjYW4gaW5zcGVjdCBkZXBsb3ltZW50LXNwZWNpZmljIGZpZWxkcyBmb3Iga2V5IHJlc29sdXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlc29sdmVyKHdvcmxkOiBXb3JsZCwgZGVjcnlwdDogYm9vbGVhbik6IEVuY3J5cHRpb25LZXlSZXNvbHZlciB7XG4gIGlmICghZGVjcnlwdCkgcmV0dXJuIG51bGw7XG4gIGlmICghd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bikgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8VWludDhBcnJheSB8IHVuZGVmaW5lZD4+KCk7XG4gIHJldHVybiAocnVuSWQ6IHN0cmluZykgPT4ge1xuICAgIGxldCBjYWNoZWQgPSBjYWNoZS5nZXQocnVuSWQpO1xuICAgIGlmICghY2FjaGVkKSB7XG4gICAgICBjYWNoZWQgPSB3b3JsZC5ydW5zXG4gICAgICAgIC5nZXQocnVuSWQpXG4gICAgICAgIC50aGVuKChydW4pID0+IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4hKHJ1bikpO1xuICAgICAgY2FjaGUuc2V0KHJ1bklkLCBjYWNoZWQpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkO1xuICB9O1xufVxuXG5pbXBvcnQge1xuICB0eXBlIEFuYWx5dGljc1BhZ2VJbmZvLFxuICB0eXBlIFBhZ2VEYXRhLFxuICBzZXR1cExpc3RQYWdpbmF0aW9uLFxufSBmcm9tICcuL3BhZ2luYXRpb24uanMnO1xuaW1wb3J0IHsgc3RyZWFtVG9Db25zb2xlIH0gZnJvbSAnLi9zdHJlYW0uanMnO1xuaW1wb3J0IHtcbiAgZm9ybWF0SVNPRGF0ZSxcbiAgZm9ybWF0U3RhdHVzIGFzIGZvcm1hdFN0YXR1c0FiYnJldixcbiAgZ2V0RGlzcGxheVNldHRpbmdzLFxuICBnZXRUZXJtaW5hbFdpZHRoLFxuICBpc0NJLFxufSBmcm9tICcuL3Rlcm1pbmFsLXV0aWxzLmpzJztcblxuY29uc3QgREVGQVVMVF9QQUdFX1NJWkUgPSAyMDtcbmxldCBUQUJMRV9UUlVOQ0FURV9JT19MRU5HVEggPSAxNTsgLy8gV2lsbCBiZSBhZGp1c3RlZCBiYXNlZCBvbiB0ZXJtaW5hbCB3aWR0aFxuXG5jb25zdCBXT1JLRkxPV19SVU5fSU9fUFJPUFM6IChrZXlvZiBXb3JrZmxvd1J1bilbXSA9IFsnaW5wdXQnLCAnb3V0cHV0J107XG5cbmNvbnN0IFNURVBfSU9fUFJPUFM6IChrZXlvZiBTdGVwKVtdID0gWydpbnB1dCcsICdvdXRwdXQnXTtcblxuY29uc3QgV09SS0ZMT1dfUlVOX0xJU1RFRF9QUk9QUzogKGtleW9mIFdvcmtmbG93UnVuKVtdID0gW1xuICAncnVuSWQnLFxuICAnd29ya2Zsb3dOYW1lJyxcbiAgJ3N0YXR1cycsXG4gICdzdGFydGVkQXQnLFxuICAnY29tcGxldGVkQXQnLFxuICAuLi5XT1JLRkxPV19SVU5fSU9fUFJPUFMsXG5dO1xuXG5jb25zdCBTVEVQX0xJU1RFRF9QUk9QUzogKGtleW9mIFN0ZXApW10gPSBbXG4gICdydW5JZCcsXG4gICdzdGVwSWQnLFxuICAnc3RlcE5hbWUnLFxuICAnc3RhdHVzJyxcbiAgJ3N0YXJ0ZWRBdCcsXG4gICdjb21wbGV0ZWRBdCcsXG4gIC4uLlNURVBfSU9fUFJPUFMsXG5dO1xuXG5jb25zdCBFVkVOVF9JT19QUk9QUzogKGtleW9mIEV2ZW50IHwgJ2V2ZW50RGF0YScpW10gPSBbJ2V2ZW50RGF0YSddO1xuXG5jb25zdCBFVkVOVF9MSVNURURfUFJPUFM6IChrZXlvZiBFdmVudCB8ICdldmVudERhdGEnKVtdID0gW1xuICAnZXZlbnRJZCcsXG4gICdldmVudFR5cGUnLFxuICAnY29ycmVsYXRpb25JZCcsXG4gICdjcmVhdGVkQXQnLFxuICAuLi5FVkVOVF9JT19QUk9QUyxcbl07XG5cbi8vIGNvbnN0IEhPT0tfREFUQV9QUk9QUzogKGtleW9mIEhvb2sgfCAnaGFzUmVzcG9uc2UnKVtdID0gWydoYXNSZXNwb25zZSddO1xuXG5jb25zdCBIT09LX0xJU1RFRF9QUk9QUzogKGtleW9mIEhvb2sgfCAnaGFzUmVzcG9uc2UnKVtdID0gW1xuICAncnVuSWQnLFxuICAnaG9va0lkJyxcbiAgJ293bmVySWQnLFxuICAnY3JlYXRlZEF0JyxcbiAgLy8gLi4uSE9PS19EQVRBX1BST1BTLFxuXTtcblxuaW50ZXJmYWNlIFNsZWVwIHtcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICBydW5JZDogc3RyaW5nO1xuICBldmVudElkOiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgcmVzdW1lQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gIGNvbXBsZXRlZEF0OiBEYXRlIHwgdW5kZWZpbmVkO1xufVxuXG5jb25zdCBXQUlUX0xJU1RFRF9QUk9QUzogKGtleW9mIFNsZWVwKVtdID0gW1xuICAnY29ycmVsYXRpb25JZCcsXG4gICdldmVudElkJyxcbiAgJ2NyZWF0ZWRBdCcsXG4gICdyZXN1bWVBdCcsXG4gICdjb21wbGV0ZWRBdCcsXG5dO1xuXG5jb25zdCBTVEFUVVNfQ09MT1JTOiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IHN0cmluZykgPT4gc3RyaW5nPiA9IHtcbiAgcnVubmluZzogY2hhbGsuYmx1ZSxcbiAgY29tcGxldGVkOiBjaGFsay5ncmVlbixcbiAgZmFpbGVkOiBjaGFsay5yZWQsXG4gIGNhbmNlbGxlZDogY2hhbGsuc3RyaWtldGhyb3VnaC55ZWxsb3csXG4gIHBlbmRpbmc6IGNoYWxrLmJsdWUsXG4gIHdhaXRpbmc6IGNoYWxrLmJsdWUsXG59O1xuXG5jb25zdCBpc1N0cmVhbUlkID0gKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3RhcnRzV2l0aCgnc3RybV8nKTtcbn07XG5cbmNvbnN0IHNob3dTdGF0dXNMZWdlbmQgPSAoKSA9PiB7XG4gIGxvZ2dlci5sb2coJ1xcblN0YXR1cyBMZWdlbmQ6Jyk7XG4gIGNvbnN0IHN0YXR1c2VzID0gW1xuICAgICdydW5uaW5nJyxcbiAgICAnY29tcGxldGVkJyxcbiAgICAnZmFpbGVkJyxcbiAgICAnY2FuY2VsbGVkJyxcbiAgICAncGVuZGluZycsXG4gICAgJ3dhaXRpbmcnLFxuICBdO1xuXG4gIGNvbnN0IGxlZ2VuZEl0ZW1zID0gc3RhdHVzZXMubWFwKChzdGF0dXMpID0+IHtcbiAgICBjb25zdCBjb2xvckZ1bmMgPSBTVEFUVVNfQ09MT1JTW3N0YXR1c107XG4gICAgY29uc3QgYWJicmV2ID0gZm9ybWF0U3RhdHVzQWJicmV2KHN0YXR1cywgdHJ1ZSk7XG4gICAgcmV0dXJuIGAke2NvbG9yRnVuYyhhYmJyZXYpfSA9ICR7c3RhdHVzfWA7XG4gIH0pO1xuXG4gIGxvZ2dlci5sb2coYCAgJHtsZWdlbmRJdGVtcy5qb2luKCcgICcpfWApO1xuICBsb2dnZXIubG9nKCcnKTtcbn07XG5cbmNvbnN0IGlzU2xlZXBTdGVwID0gKHN0ZXBOYW1lOiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIHN0ZXBOYW1lLmluY2x1ZGVzKCctc2xlZXAnKTtcbn07XG5cbmNvbnN0IGNoZWNrQW5kSGFuZGxlVmVyY2VsQWNjZXNzRXJyb3IgPSAoXG4gIGVycm9yOiB1bmtub3duLFxuICBiYWNrZW5kPzogc3RyaW5nXG4pOiBib29sZWFuID0+IHtcbiAgaWYgKGJhY2tlbmQgPT09ICd2ZXJjZWwnICYmIGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoZXJyLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoVkVSQ0VMXzQwM19FUlJPUl9NRVNTQUdFKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBleHRyYWN0RXJyb3JNZXNzYWdlID0gKFxuICBlcnI6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoZXJyLm1lc3NhZ2UgJiYgdHlwZW9mIGVyci5tZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBlcnIubWVzc2FnZTtcbiAgfVxuXG4gIGlmIChlcnIuYm9keSAmJiB0eXBlb2YgZXJyLmJvZHkgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgYm9keSA9IGVyci5ib2R5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChib2R5Lm1lc3NhZ2UgJiYgdHlwZW9mIGJvZHkubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBib2R5Lm1lc3NhZ2U7XG4gICAgfVxuICAgIGlmIChib2R5LmVycm9yICYmIHR5cGVvZiBib2R5LmVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGJvZHkuZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IGdldFBhZ2VJbmZvID0gKHJlc3VsdDogdW5rbm93bik6IEFuYWx5dGljc1BhZ2VJbmZvIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKFxuICAgIHR5cGVvZiByZXN1bHQgIT09ICdvYmplY3QnIHx8XG4gICAgcmVzdWx0ID09PSBudWxsIHx8XG4gICAgISgncGFnZUluZm8nIGluIHJlc3VsdClcbiAgKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gKHJlc3VsdCBhcyB7IHBhZ2VJbmZvPzogQW5hbHl0aWNzUGFnZUluZm8gfSkucGFnZUluZm87XG59O1xuXG5jb25zdCBoYW5kbGVBcGlFcnJvciA9IChlcnJvcjogdW5rbm93biwgYmFja2VuZD86IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAvLyBGaXJzdCBjaGVjayBmb3IgVmVyY2VsIGFjY2VzcyBlcnJvcnNcbiAgaWYgKGNoZWNrQW5kSGFuZGxlVmVyY2VsQWNjZXNzRXJyb3IoZXJyb3IsIGJhY2tlbmQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaXNPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgbG9nZ2VyLmVycm9yKGdldE9ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRNZXNzYWdlKCkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gSGFuZGxlIG90aGVyIEhUVFAgZXJyb3JzXG4gIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgZXJyID0gZXJyb3IgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAvLyBIYW5kbGUgNDAwIEJhZCBSZXF1ZXN0XG4gICAgaWYgKGVyci5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgbG9nZ2VyLmVycm9yKCdCYWQgUmVxdWVzdDogVGhlIHJlcXVlc3Qgd2FzIGludmFsaWQuJyk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXh0cmFjdEVycm9yTWVzc2FnZShlcnIpO1xuICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBEZXRhaWxzOiAke21lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgb3RoZXIgSFRUUCBlcnJvcnMgKDQwNCwgNTAwLCBldGMuKVxuICAgIGlmICh0eXBlb2YgZXJyLnN0YXR1cyA9PT0gJ251bWJlcicgJiYgZXJyLnN0YXR1cyA+PSA0MDApIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgSFRUUCBFcnJvciAke2Vyci5zdGF0dXN9OiAke2dldFN0YXR1c1RleHQoZXJyLnN0YXR1cyl9YCk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXh0cmFjdEVycm9yTWVzc2FnZShlcnIpO1xuICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBEZXRhaWxzOiAke21lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBnZXRTdGF0dXNUZXh0ID0gKHN0YXR1czogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc3RhdHVzVGV4dHM6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gICAgNDAwOiAnQmFkIFJlcXVlc3QnLFxuICAgIDQwMTogJ1VuYXV0aG9yaXplZCcsXG4gICAgNDAyOiAnUGF5bWVudCBSZXF1aXJlZCcsXG4gICAgNDAzOiAnRm9yYmlkZGVuJyxcbiAgICA0MDQ6ICdOb3QgRm91bmQnLFxuICAgIDQyOTogJ1RvbyBNYW55IFJlcXVlc3RzJyxcbiAgICA1MDA6ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLFxuICAgIDUwMjogJ0JhZCBHYXRld2F5JyxcbiAgICA1MDM6ICdTZXJ2aWNlIFVuYXZhaWxhYmxlJyxcbiAgfTtcbiAgcmV0dXJuIHN0YXR1c1RleHRzW3N0YXR1c10gfHwgJ1Vua25vd24gRXJyb3InO1xufTtcblxuY29uc3QgdHJ1bmNhdGVOYW1lSWZOZWVkZWQgPSAobmFtZTogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIHJldHVybiBtYXhMZW5ndGggPCBuYW1lLmxlbmd0aCA/IGAke25hbWUuc3Vic3RyaW5nKDAsIG1heExlbmd0aCl9Li4uYCA6IG5hbWU7XG59O1xuXG5jb25zdCBmb3JtYXROYW1lRmllbGQgPSAoXG4gIG5hbWVOb25VbmlxdWU6IHN0cmluZyxcbiAgdHJ1bmNhdGVMZW5ndGg6IG51bWJlcixcbiAgaXNTbGVlcDogYm9vbGVhblxuKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdHJ1bmNhdGVkTmFtZSA9IHRydW5jYXRlTmFtZUlmTmVlZGVkKG5hbWVOb25VbmlxdWUsIHRydW5jYXRlTGVuZ3RoKTtcbiAgaWYgKGlzU2xlZXApIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93QnJpZ2h0KHRydW5jYXRlZE5hbWUpO1xuICB9XG4gIHJldHVybiBjaGFsay5ibHVlLmJsdWVCcmlnaHQodHJ1bmNhdGVkTmFtZSk7XG59O1xuXG5jb25zdCBmb3JtYXRJZEZpZWxkID0gKFxuICBwcm9wOiBzdHJpbmcsXG4gIHZhbHVlOiB1bmtub3duLFxuICBzaG91bGRUcnVuY2F0ZUlkczogYm9vbGVhblxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgdmFsdWVTdHIgPSBTdHJpbmcodmFsdWUpO1xuICBjb25zdCBpZFN0ciA9IHNob3VsZFRydW5jYXRlSWRzID8gdHJ1bmNhdGVJZFRvTGFzdENoYXJzKHZhbHVlU3RyKSA6IHZhbHVlU3RyO1xuICBpZiAocHJvcCA9PT0gJ3N0cmVhbUlkJykge1xuICAgIHJldHVybiBjaGFsay5ncmVlbihpZFN0cik7XG4gIH1cbiAgcmV0dXJuIGlkU3RyO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdFRhYmxlVmFsdWUgPSAoXG4gIHByb3A6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd24sXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge30sXG4gIGRpc3BsYXlTZXR0aW5ncz86IFJldHVyblR5cGU8dHlwZW9mIGdldERpc3BsYXlTZXR0aW5ncz4sXG4gIGl0ZW0/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKSA9PiB7XG4gIGNvbnN0IG5hbWVzVHJ1bmNhdGUgPSBkaXNwbGF5U2V0dGluZ3M/Lm5hbWVzVHJ1bmNhdGVMZW5ndGggPz8gNDA7XG4gIGNvbnN0IHNob3VsZFRydW5jYXRlSWRzID0gZGlzcGxheVNldHRpbmdzPy50cnVuY2F0ZUlkc1RvTGFzdENoYXJzID8/IGZhbHNlO1xuXG4gIC8vIEhhbmRsZSBJRHMgd2l0aCBwb3RlbnRpYWwgdHJ1bmNhdGlvblxuICBpZiAoXG4gICAgW1xuICAgICAgJ3N0cmVhbUlkJyxcbiAgICAgICdydW5JZCcsXG4gICAgICAnc3RlcElkJyxcbiAgICAgICdob29rSWQnLFxuICAgICAgJ2V2ZW50SWQnLFxuICAgICAgJ2NvcnJlbGF0aW9uSWQnLFxuICAgICAgJ293bmVySWQnLFxuICAgIF0uaW5jbHVkZXMocHJvcClcbiAgKSB7XG4gICAgcmV0dXJuIGZvcm1hdElkRmllbGQocHJvcCwgdmFsdWUsIHNob3VsZFRydW5jYXRlSWRzKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBuYW1lcyB3aXRoIHRydW5jYXRpb25cbiAgaWYgKHByb3AgPT09ICdzdGVwTmFtZScpIHtcbiAgICBjb25zdCBuYW1lTm9uVW5pcXVlID0gcGFyc2VTdGVwTmFtZShTdHJpbmcodmFsdWUpKT8uc2hvcnROYW1lIHx8ICc/JztcbiAgICByZXR1cm4gZm9ybWF0TmFtZUZpZWxkKFxuICAgICAgbmFtZU5vblVuaXF1ZSxcbiAgICAgIG5hbWVzVHJ1bmNhdGUsXG4gICAgICBpc1NsZWVwU3RlcChTdHJpbmcodmFsdWUpKVxuICAgICk7XG4gIH1cblxuICBpZiAocHJvcCA9PT0gJ3dvcmtmbG93TmFtZScpIHtcbiAgICBjb25zdCBuYW1lTm9uVW5pcXVlID0gcGFyc2VXb3JrZmxvd05hbWUoU3RyaW5nKHZhbHVlKSk/LnNob3J0TmFtZSB8fCAnPyc7XG4gICAgY29uc3QgdHJ1bmNhdGVkTmFtZSA9IHRydW5jYXRlTmFtZUlmTmVlZGVkKG5hbWVOb25VbmlxdWUsIG5hbWVzVHJ1bmNhdGUpO1xuICAgIHJldHVybiBjaGFsay5ibHVlLmJsdWVCcmlnaHQodHJ1bmNhdGVkTmFtZSk7XG4gIH1cblxuICBpZiAocHJvcCA9PT0gJ291dHB1dCcgfHwgcHJvcCA9PT0gJ2lucHV0JyB8fCBwcm9wID09PSAnZXJyb3InKSB7XG4gICAgaWYgKFxuICAgICAgaXRlbSAmJlxuICAgICAgJ2V4cGlyZWRBdCcgaW4gaXRlbSAmJlxuICAgICAgaXRlbS5leHBpcmVkQXQgIT0gbnVsbCAmJlxuICAgICAgbmV3IERhdGUoaXRlbS5leHBpcmVkQXQgYXMgc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSkgPCBuZXcgRGF0ZSgpXG4gICAgKSB7XG4gICAgICByZXR1cm4gRVhQSVJFRF9EQVRBX01FU1NBR0U7XG4gICAgfVxuICAgIHJldHVybiBpbmxpbmVGb3JtYXRJTyh2YWx1ZSk7XG4gIH1cblxuICBpZiAocHJvcCA9PT0gJ3N0YXR1cycpIHtcbiAgICBjb25zdCBzdGF0dXMgPSB2YWx1ZSBhcyBXb3JrZmxvd1J1blsnc3RhdHVzJ10gfCBTdGVwWydzdGF0dXMnXTtcbiAgICBjb25zdCBjb2xvckZ1bmMgPVxuICAgICAgU1RBVFVTX0NPTE9SU1tzdGF0dXNdID8/ICgoZm9ybWF0dGVkOiBzdHJpbmcpID0+IGZvcm1hdHRlZCk7XG4gICAgY29uc3QgZm9ybWF0dGVkU3RhdHVzID0gZGlzcGxheVNldHRpbmdzPy5hYmJyZXZpYXRlU3RhdHVzXG4gICAgICA/IGZvcm1hdFN0YXR1c0FiYnJldihzdGF0dXMsIHRydWUpXG4gICAgICA6IHN0YXR1cztcbiAgICByZXR1cm4gY29sb3JGdW5jKGZvcm1hdHRlZFN0YXR1cyk7XG4gIH1cblxuICBpZiAocHJvcCA9PT0gJ2V2ZW50RGF0YScpIHtcbiAgICByZXR1cm4gdHJ1bmNhdGVTdHJpbmcoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgfVxuXG4gIGlmIChwcm9wID09PSAnaGFzUmVzcG9uc2UnKSB7XG4gICAgcmV0dXJuIHZhbHVlID8gY2hhbGsuZ3JlZW4oJ3RydWUnKSA6IGNoYWxrLmdyYXkoJ2ZhbHNlJyk7XG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIGZvcm1hdFRhYmxlVGltZXN0YW1wKHZhbHVlLCBvcHRzLCBkaXNwbGF5U2V0dGluZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuY29uc3QgZ2V0VmlzaWJsZVByb3BzID0gKFxuICBwcm9wczogc3RyaW5nW10sXG4gIGRpc3BsYXlTZXR0aW5nczogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RGlzcGxheVNldHRpbmdzPlxuKTogc3RyaW5nW10gPT4ge1xuICBpZiAoZGlzcGxheVNldHRpbmdzLmhpZGVDb21wbGV0ZWRBdCkge1xuICAgIHJldHVybiBwcm9wcy5maWx0ZXIoKHByb3ApID0+IHByb3AgIT09ICdjb21wbGV0ZWRBdCcpO1xuICB9XG4gIHJldHVybiBwcm9wcztcbn07XG5cbmNvbnN0IHNob3dUYWJsZSA9IChcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbiAgcHJvcHM6IHN0cmluZ1tdLFxuICBvcHRzOiBJbnNwZWN0Q0xJT3B0aW9ucyA9IHt9XG4pID0+IHtcbiAgLy8gR2V0IGRpc3BsYXkgc2V0dGluZ3MgYmFzZWQgb24gdGVybWluYWwgd2lkdGhcbiAgY29uc3QgdGVybWluYWxXaWR0aCA9IGdldFRlcm1pbmFsV2lkdGgoKTtcbiAgY29uc3QgZGlzcGxheVNldHRpbmdzID0gZ2V0RGlzcGxheVNldHRpbmdzKFxuICAgIHRlcm1pbmFsV2lkdGgsXG4gICAgb3B0cy53aXRoRGF0YSB8fCBmYWxzZSxcbiAgICBwcm9wcy5pbmNsdWRlcygncnVuTmFtZScpXG4gICk7XG5cbiAgLy8gRmlsdGVyIG91dCBjb21wbGV0ZWRBdCBjb2x1bW4gaWYgbmVlZGVkXG4gIGNvbnN0IHZpc2libGVQcm9wcyA9IGdldFZpc2libGVQcm9wcyhwcm9wcywgZGlzcGxheVNldHRpbmdzKTtcblxuICAvLyBVcGRhdGUgdHJ1bmNhdGUgbGVuZ3RoIGZvciBJTyBmaWVsZHNcbiAgY29uc3Qgb3JpZ2luYWxUcnVuY2F0ZUxlbmd0aCA9IFRBQkxFX1RSVU5DQVRFX0lPX0xFTkdUSDtcbiAgVEFCTEVfVFJVTkNBVEVfSU9fTEVOR1RIID0gZGlzcGxheVNldHRpbmdzLmRhdGFGaWVsZFdpZHRoO1xuXG4gIC8vIFNob3cgc3RhdHVzIGxlZ2VuZCBpZiB1c2luZyBhYmJyZXZpYXRlZCBzdGF0dXNcbiAgaWYgKFxuICAgIGRhdGEubGVuZ3RoID4gMCAmJlxuICAgIGRpc3BsYXlTZXR0aW5ncy5hYmJyZXZpYXRlU3RhdHVzICYmXG4gICAgdmlzaWJsZVByb3BzLmluY2x1ZGVzKCdzdGF0dXMnKVxuICApIHtcbiAgICBzaG93U3RhdHVzTGVnZW5kKCk7XG4gIH1cblxuICAvLyBDcmVhdGUgaGVhZGVyIG1hcHBpbmcgZm9yIGFiYnJldmlhdGVkIHN0YXR1c1xuICBjb25zdCBoZWFkZXJNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgaWYgKGRpc3BsYXlTZXR0aW5ncy5hYmJyZXZpYXRlU3RhdHVzICYmIHZpc2libGVQcm9wcy5pbmNsdWRlcygnc3RhdHVzJykpIHtcbiAgICBoZWFkZXJNYXBbJ3N0YXR1cyddID0gJ1MnO1xuICB9XG5cbiAgLy8gQWRkIGEgYmxhbmsgbGluZSBiZWZvcmUgYW55IHRhYmxlXG4gIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlKCk7XG4gIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nZ2VyLndhcm4oJ05vIGRhdGEgZm91bmQgZm9yIHRoaXMgcXVlcnkgYW5kIHJlc291cmNlLlxcbicpO1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiB2aXNpYmxlUHJvcHMpIHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IGhlYWRlck1hcFtwcm9wXSB8fCBwcm9wO1xuICAgICAgdGFibGUuY2VsbChoZWFkZXIsICdOL0EnKTtcbiAgICB9XG4gICAgdGFibGUubmV3Um93KCk7XG4gICAgLy8gUmVzdG9yZSBvcmlnaW5hbCB0cnVuY2F0ZSBsZW5ndGhcbiAgICBUQUJMRV9UUlVOQ0FURV9JT19MRU5HVEggPSBvcmlnaW5hbFRydW5jYXRlTGVuZ3RoO1xuICAgIHJldHVybiB0YWJsZS50b1N0cmluZygpO1xuICB9IGVsc2UgaWYgKCFkYXRhKSB7XG4gICAgbG9nZ2VyLndhcm4oJ0V4cGVjdGluZyBhbiBhcnJheSBvZiBkYXRhLCBidXQgZ290IG51bGwuXFxuJyk7XG4gIH1cbiAgbG9nZ2VyLmxvZygnJyk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhKSB7XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIHZpc2libGVQcm9wcykge1xuICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyTWFwW3Byb3BdIHx8IHByb3A7XG4gICAgICBjb25zdCB2YWx1ZSA9IGl0ZW1bcHJvcF07XG4gICAgICB0YWJsZS5jZWxsKFxuICAgICAgICBoZWFkZXIsXG4gICAgICAgIGZvcm1hdFRhYmxlVmFsdWUocHJvcCwgdmFsdWUsIG9wdHMsIGRpc3BsYXlTZXR0aW5ncywgaXRlbSlcbiAgICAgICk7XG4gICAgfVxuICAgIHRhYmxlLm5ld1JvdygpO1xuICB9XG5cbiAgLy8gUmVzdG9yZSBvcmlnaW5hbCB0cnVuY2F0ZSBsZW5ndGhcbiAgVEFCTEVfVFJVTkNBVEVfSU9fTEVOR1RIID0gb3JpZ2luYWxUcnVuY2F0ZUxlbmd0aDtcbiAgcmV0dXJuIHRhYmxlLnRvU3RyaW5nKCk7XG59O1xuXG5jb25zdCBzaG93SnNvbiA9IChkYXRhOiB1bmtub3duKSA9PiB7XG4gIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTtcbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoYCR7anNvbn1cXG5gKTtcbn07XG5cbmNvbnN0IHNob3dKc29uUGFnZSA9IDxUPihwYWdlOiBQYWdlRGF0YTxUPikgPT4ge1xuICBzaG93SnNvbih7XG4gICAgZGF0YTogcGFnZS5kYXRhLFxuICAgIGN1cnNvcjogcGFnZS5jdXJzb3IsXG4gICAgaGFzTW9yZTogcGFnZS5oYXNNb3JlLFxuICAgIC4uLihwYWdlLnBhZ2VJbmZvID8geyBwYWdlSW5mbzogcGFnZS5wYWdlSW5mbyB9IDoge30pLFxuICB9KTtcbn07XG5cbi8qKlxuICogSW4gdGFibGVzLCB3ZSB3YW50IHRvIHNob3cgYSBzaG9ydGVyIHRpbWVzdGFtcCwgWVlZWS1NTS1ERCBISDpNTTpTU1xuICovXG5jb25zdCBmb3JtYXRUYWJsZVRpbWVzdGFtcCA9IChcbiAgdmFsdWU6IERhdGUsXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge30sXG4gIGRpc3BsYXlTZXR0aW5ncz86IFJldHVyblR5cGU8dHlwZW9mIGdldERpc3BsYXlTZXR0aW5ncz5cbikgPT4ge1xuICAvLyBGb3JtYXQgSVNPIHRpbWUgd2l0aG91dCBUIGFuZCBaXG4gIGNvbnN0IGlzb1RpbWUgPSBmb3JtYXRJU09EYXRlKHZhbHVlKTtcblxuICAvLyBTaG93IHJlbGF0aXZlIHRpbWUgb25seSBpZjpcbiAgLy8gLSBOb3QgaW4gQ0kgbW9kZVxuICAvLyAtIERpc3BsYXkgc2V0dGluZ3MgYWxsb3cgaXQgKGJhc2VkIG9uIHRlcm1pbmFsIHdpZHRoKVxuICAvLyAtIHdpdGhEYXRhIGlzIGRpc2FibGVkIChtb3JlIHNwYWNlIGF2YWlsYWJsZSlcbiAgLy8gLSBOb3QgaW4gSlNPTiBtb2RlXG4gIC8vIC0gZGlzYWJsZVJlbGF0aXZlRGF0ZXMgaXMgbm90IHNldFxuICBjb25zdCBzaG91bGRTaG93UmVsYXRpdmUgPVxuICAgICFpc0NJKCkgJiZcbiAgICBkaXNwbGF5U2V0dGluZ3M/LnNob3dSZWxhdGl2ZURhdGVzICE9PSBmYWxzZSAmJlxuICAgICFvcHRzLndpdGhEYXRhICYmXG4gICAgIW9wdHMuanNvbiAmJlxuICAgICFvcHRzLmRpc2FibGVSZWxhdGl2ZURhdGVzO1xuXG4gIGlmIChzaG91bGRTaG93UmVsYXRpdmUpIHtcbiAgICBjb25zdCByZWxhdGl2ZSA9IGZvcm1hdERpc3RhbmNlKHZhbHVlLCBuZXcgRGF0ZSgpLCB7IGFkZFN1ZmZpeDogdHJ1ZSB9KTtcbiAgICByZXR1cm4gYCR7aXNvVGltZX0gKCR7cmVsYXRpdmV9KWA7XG4gIH1cblxuICByZXR1cm4gaXNvVGltZTtcbn07XG5cbmNvbnN0IHRydW5jYXRlU3RyaW5nID0gKFxuICBzdHI6IHN0cmluZyxcbiAgbWF4TGVuZ3RoOiBudW1iZXIgPSBUQUJMRV9UUlVOQ0FURV9JT19MRU5HVEhcbikgPT4ge1xuICByZXR1cm4gc3RyICYmIHN0ci5sZW5ndGggPiBtYXhMZW5ndGhcbiAgICA/IGAke3N0ci5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoKX0uLi5gXG4gICAgOiBzdHI7XG59O1xuXG5jb25zdCB0cnVuY2F0ZUlkVG9MYXN0Q2hhcnMgPSAoaWQ6IHN0cmluZywgY2hhcnM6IG51bWJlciA9IDQpOiBzdHJpbmcgPT4ge1xuICBpZiAoIWlkIHx8IGlkLmxlbmd0aCA8PSBjaGFycykgcmV0dXJuIGlkO1xuICByZXR1cm4gYC4uLiR7aWQuc3Vic3RyaW5nKGlkLmxlbmd0aCAtIGNoYXJzKX1gO1xufTtcblxuY29uc3Qgc2hvd0luc3BlY3RJbmZvQm94ID0gKHJlc291cmNlOiBzdHJpbmcpID0+IHtcbiAgbG9nZ2VyLmluZm8oXG4gICAgYFRvIHZpZXcgZGV0YWlscyBmb3IgYSAke3Jlc291cmNlfSwgdXNlIFxcYHdvcmtmbG93IGluc3BlY3QgJHtyZXNvdXJjZX1cXGAgPGlkPmBcbiAgKTtcbiAgbG9nZ2VyLmluZm8oXG4gICAgYFRvIHZpZXcgdGhlIGNvbnRlbnQgb2YgYW55IHN0cmVhbSwgdXNlIFxcYHdvcmtmbG93IGluc3BlY3Qgc3RyZWFtIDxzdHJlYW0taWQ+XFxgYFxuICApO1xufTtcblxuY29uc3QgRVhQSVJFRF9EQVRBX01FU1NBR0UgPSBjaGFsay5ncmF5KCc8ZGF0YSBleHBpcmVkPicpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIHJ1biBoYXMgZXhwaXJlZCBkYXRhIHN0b3JhZ2UgKHJ1bi1sZXZlbCBleHBpcmVkQXQgZmllbGQpLlxuICogT25seSByZXR1cm5zIHRydWUgd2hlbiBgZXhwaXJlZEF0YCBpcyBpbiB0aGUgcGFzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGhhc0V4cGlyZWREYXRhID0gKHJ1bjogV29ya2Zsb3dSdW4pOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIChcbiAgICAnZXhwaXJlZEF0JyBpbiBydW4gJiZcbiAgICBydW4uZXhwaXJlZEF0ICE9IG51bGwgJiZcbiAgICBuZXcgRGF0ZShydW4uZXhwaXJlZEF0KSA8IG5ldyBEYXRlKClcbiAgKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFueSBkYXRhIGZpZWxkIGluIGEgaHlkcmF0ZWQgcmVzb3VyY2UgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBhblxuICogZXhwaXJlZCBwbGFjZWhvbGRlci4gV29ya3MgZm9yIHJ1bnMsIHN0ZXBzLCBob29rcywgYW5kIGV2ZW50cyDigJQgdW5saWtlXG4gKiBgaGFzRXhwaXJlZERhdGFgIHdoaWNoIG9ubHkgY2hlY2tzIHRoZSBydW4tbGV2ZWwgYGV4cGlyZWRBdGAgZmllbGQuXG4gKi9cbmNvbnN0IGhhc0V4cGlyZWRGaWVsZHMgPSAocmVzb3VyY2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBbJ2lucHV0JywgJ291dHB1dCcsICdlcnJvcicsICdtZXRhZGF0YSddLnNvbWUoKGtleSkgPT5cbiAgICBpc0V4cGlyZWRSZWYocmVzb3VyY2Vba2V5XSlcbiAgKTtcbn07XG5cbi8qKlxuICogVGFrZXMgaHlkcmF0ZWQgc3RlcC93b3JrZmxvdyBpbnB1dC9vdXRwdXQgYW5kIHNlcmlhbGl6ZXMgaXQgZm9yIGlubGluZSBkaXNwbGF5LlxuICovXG5jb25zdCBpbmxpbmVGb3JtYXRJTyA9IDxUPihpbzogVCwgdG9wTGV2ZWw6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiBpbztcbiAgbGV0IHZhbHVlID0gJyc7XG4gIGlmIChpbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsdWUgPSAnPGVtcHR5Pic7XG4gIH0gZWxzZSBpZiAoaW8gPT09IG51bGwpIHtcbiAgICB2YWx1ZSA9ICc8bnVsbD4nO1xuICB9IGVsc2UgaWYgKGlzRW5jcnlwdGVkUmVmKGlvKSkge1xuICAgIHZhbHVlID0gY2hhbGsuZGltLnllbGxvdygnXFx1ezFGNTEyfSBFbmNyeXB0ZWQnKTtcbiAgfSBlbHNlIGlmIChpc0V4cGlyZWRSZWYoaW8pKSB7XG4gICAgdmFsdWUgPSBjaGFsay5ncmF5KCc8ZGF0YSBleHBpcmVkPicpO1xuICB9IGVsc2UgaWYgKGlvICYmIEFycmF5LmlzQXJyYXkoaW8pKSB7XG4gICAgaWYgKGlvLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdmFsdWUgPSAnPGVtcHR5Pic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gaW9cbiAgICAgICAgLm1hcCgoaXRlbSkgPT4gaW5saW5lRm9ybWF0SU8oaXRlbSwgZmFsc2UpKVxuICAgICAgICAuam9pbignLCcpO1xuICAgICAgaWYgKHN0cmluZ2lmaWVkLmxlbmd0aCA+IFRBQkxFX1RSVU5DQVRFX0lPX0xFTkdUSCAmJiB0b3BMZXZlbCkge1xuICAgICAgICB2YWx1ZSA9IGNoYWxrLnllbGxvdyhgJHtpby5sZW5ndGh9IGFyZ3NgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gc3RyaW5naWZpZWQ7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKGlvIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgdmFsdWUgPSBpby50b0lTT1N0cmluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IHRydW5jYXRlU3RyaW5nKEpTT04uc3RyaW5naWZ5KGlvKSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKFsnc3RyaW5nJywgJ251bWJlcicsICdib29sZWFuJ10uaW5jbHVkZXModHlwZSkpIHtcbiAgICBpZiAoaXNTdHJlYW1JZChpbyBhcyBzdHJpbmcpKSB7XG4gICAgICB2YWx1ZSA9IGlvLnRvU3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiAoaW8gYXMgc3RyaW5nKS5pbmNsdWRlcygnc3RybV8nKSkge1xuICAgICAgdmFsdWUgPSBpbyBhcyBzdHJpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gdHJ1bmNhdGVTdHJpbmcoU3RyaW5nKGlvKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gYDwke3R5cGV9PmA7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqXG4gKiBMaXN0IHZpZXdzIHN1cmZhY2UgbWV0YWRhdGEgb25seS4gV2hlbiB0aGUgYWN0aXZlIGJhY2tlbmQgZXhwb3NlcyB0aGVcbiAqIG9wdGlvbmFsIGB3b3JsZC5hbmFseXRpY3NgIHJlYWQgbmFtZXNwYWNlIHdlIHJlYWQgbGlzdCBwYWdlcyBmcm9tIGl0XG4gKiAobWV0YWRhdGEtb25seSDigJQgbm8gcGF5bG9hZCByZXNvbHV0aW9uKTsgb3RoZXJ3aXNlIHdlIGZhbGwgYmFjayB0byB0aGVcbiAqIHJ1bnRpbWUgc3RvcmFnZSBBUElzIHdpdGggYHJlc29sdmVEYXRhOiAnbm9uZSdgLlxuICpcbiAqIGAtLXdpdGhEYXRhYCBmb3JjZXMgdGhlIHJ1bnRpbWUgcGF0aCBzbyBwYXlsb2FkcyBjYW4gYmUgcmVzb2x2ZWQgaW50byB0aGVcbiAqIHRhYmxlLiBJdCBpcyBkZXByZWNhdGVkIGZvciBsaXN0IHZpZXdzOiB2aWV3IHBheWxvYWRzIHBlci1yZXNvdXJjZSB3aXRoXG4gKiBgd29ya2Zsb3cgaW5zcGVjdCA8cmVzb3VyY2U+IDxpZD5gLlxuICovXG5jb25zdCB3YXJuV2l0aERhdGFEZXByZWNhdGVkRm9yTGlzdCA9IChzaW5ndWxhcjogc3RyaW5nKTogdm9pZCA9PiB7XG4gIGxvZ2dlci53YXJuKFxuICAgIGAnLS13aXRoRGF0YScgaXMgZGVwcmVjYXRlZCBmb3IgbGlzdCB2aWV3cyBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuIFVzZSAnd29ya2Zsb3cgaW5zcGVjdCAke3Npbmd1bGFyfSA8aWQ+JyB0byB2aWV3IHBheWxvYWRzIGZvciBhIHNpbmdsZSAke3Npbmd1bGFyfS5gXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgbGlzdFJ1bnMgPSBhc3luYyAod29ybGQ6IFdvcmxkLCBvcHRzOiBJbnNwZWN0Q0xJT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHJlc29sdmVLZXkgPSBjcmVhdGVSZXNvbHZlcih3b3JsZCwgb3B0cz8uZGVjcnlwdCA/PyBmYWxzZSk7XG5cbiAgaWYgKG9wdHMuc3RlcElkIHx8IG9wdHMucnVuSWQpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgc3RlcC1pZCBvciBydW4taWQgaXMgbm90IHN1cHBvcnRlZCBpbiBsaXN0IGNhbGxzLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cblxuICBpZiAob3B0cy53aXRoRGF0YSkge1xuICAgIHdhcm5XaXRoRGF0YURlcHJlY2F0ZWRGb3JMaXN0KCdydW4nKTtcbiAgfVxuXG4gIGNvbnN0IHVzZUFuYWx5dGljcyA9ICFvcHRzLndpdGhEYXRhICYmIEJvb2xlYW4od29ybGQuYW5hbHl0aWNzKTtcbiAgY29uc3QgcmVzb2x2ZURhdGEgPSBvcHRzLndpdGhEYXRhID8gJ2FsbCcgOiAnbm9uZSc7XG4gIGNvbnN0IHN0YXR1cyA9IG9wdHMuc3RhdHVzIGFzIFdvcmtmbG93UnVuWydzdGF0dXMnXSB8IHVuZGVmaW5lZDtcblxuICAvLyBSZXNvbHZlIC0tc2luY2UvLS11bnRpbCBpbnRvIGFuIGV4cGxpY2l0IGxpc3Rpbmcgd2luZG93LiBPbmx5IHRoZVxuICAvLyBhbmFseXRpY3MgcmVhZCBwYXRoIHN1cHBvcnRzIG9uZTsgdGhlIHJ1bnRpbWUgc3RvcmFnZSBBUElzIGhhdmUgbm8gdGltZVxuICAvLyBmaWx0ZXIuIFdpdGhvdXQgdGhlIGZsYWdzIHRoZSBiYWNrZW5kIGFwcGxpZXMgaXRzIGRlZmF1bHQgd2luZG93XG4gIC8vICh0cmFpbGluZyAyNGggb24gdGhlIFZlcmNlbCBiYWNrZW5kKS5cbiAgY29uc3QgdGltZVdpbmRvdyA9IHJlc29sdmVUaW1lV2luZG93KG9wdHMpO1xuICBpZiAodGltZVdpbmRvdyAmJiAhdXNlQW5hbHl0aWNzKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnLS1zaW5jZS8tLXVudGlsIHJlcXVpcmUgdGhlIGFuYWx5dGljcyByZWFkIHBhdGggYW5kIGFyZSBpZ25vcmVkIGJ5IHRoaXMgYmFja2VuZC4nXG4gICAgKTtcbiAgfVxuXG4gIC8vIERldGVybWluZSB3aGljaCBwcm9wcyB0byBzaG93IGJhc2VkIG9uIHdpdGhEYXRhIGZsYWdcbiAgY29uc3QgcHJvcHMgPSBvcHRzLndpdGhEYXRhXG4gICAgPyBXT1JLRkxPV19SVU5fTElTVEVEX1BST1BTXG4gICAgOiBXT1JLRkxPV19SVU5fTElTVEVEX1BST1BTLmZpbHRlcihcbiAgICAgICAgKHByb3ApID0+ICFXT1JLRkxPV19SVU5fSU9fUFJPUFMuaW5jbHVkZXMocHJvcClcbiAgICAgICk7XG5cbiAgY29uc3QgZmV0Y2hSdW5zUGFnZSA9IGFzeW5jIChcbiAgICBjdXJzb3I6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiBQcm9taXNlPFBhZ2VEYXRhPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4gPT4ge1xuICAgIGNvbnN0IHBhZ2luYXRpb24gPSB7XG4gICAgICBzb3J0T3JkZXI6IG9wdHMuc29ydCB8fCAnZGVzYycsXG4gICAgICBjdXJzb3IsXG4gICAgICBsaW1pdDogb3B0cy5saW1pdCB8fCBERUZBVUxUX1BBR0VfU0laRSxcbiAgICB9O1xuICAgIGlmICh1c2VBbmFseXRpY3MgJiYgd29ybGQuYW5hbHl0aWNzKSB7XG4gICAgICBjb25zdCBydW5zID0gYXdhaXQgd29ybGQuYW5hbHl0aWNzLnJ1bnMubGlzdCh7XG4gICAgICAgIHdvcmtmbG93TmFtZTogb3B0cy53b3JrZmxvd05hbWUsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgLi4uKHRpbWVXaW5kb3cgPz8ge30pLFxuICAgICAgICBwYWdpbmF0aW9uLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBydW5zLmRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICAgICAgICBjdXJzb3I6IHJ1bnMuY3Vyc29yLFxuICAgICAgICBoYXNNb3JlOiBydW5zLmhhc01vcmUsXG4gICAgICAgIHBhZ2VJbmZvOiBnZXRQYWdlSW5mbyhydW5zKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJ1bnMgPSBhd2FpdCB3b3JsZC5ydW5zLmxpc3Qoe1xuICAgICAgd29ya2Zsb3dOYW1lOiBvcHRzLndvcmtmbG93TmFtZSxcbiAgICAgIHN0YXR1cyxcbiAgICAgIHBhZ2luYXRpb24sXG4gICAgICByZXNvbHZlRGF0YSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBydW5zLmRhdGEubWFwKChyKSA9PiBoeWRyYXRlUmVzb3VyY2VJTyhyLCByZXNvbHZlS2V5KSlcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbiAgICAgIGN1cnNvcjogcnVucy5jdXJzb3IsXG4gICAgICBoYXNNb3JlOiBydW5zLmhhc01vcmUsXG4gICAgICBwYWdlSW5mbzogZ2V0UGFnZUluZm8ocnVucyksXG4gICAgfTtcbiAgfTtcblxuICAvLyBGb3IgSlNPTiBvdXRwdXQsIGp1c3QgZmV0Y2ggb25jZSBhbmQgcmV0dXJuXG4gIGlmIChvcHRzLmpzb24pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IGZldGNoUnVuc1BhZ2Uob3B0cy5jdXJzb3IpO1xuICAgICAgc2hvd0pzb25QYWdlKHBhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgc2V0dXBMaXN0UGFnaW5hdGlvbjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oe1xuICAgIGluaXRpYWxDdXJzb3I6IG9wdHMuY3Vyc29yLFxuICAgIGludGVyYWN0aXZlOiBvcHRzLmludGVyYWN0aXZlLFxuICAgIGZldGNoUGFnZTogYXN5bmMgKGN1cnNvcikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZldGNoUnVuc1BhZ2UoY3Vyc29yKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRpc3BsYXlQYWdlOiBhc3luYyAocnVucykgPT4ge1xuICAgICAgbG9nZ2VyLmxvZyhzaG93VGFibGUocnVucywgcHJvcHMsIG9wdHMpKTtcbiAgICB9LFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZWNlbnRSdW4gPSBhc3luYyAoXG4gIHdvcmxkOiBXb3JsZCxcbiAgb3B0czogSW5zcGVjdENMSU9wdGlvbnMgPSB7fVxuKSA9PiB7XG4gIGNvbnN0IHJlc29sdmVLZXkgPSBjcmVhdGVSZXNvbHZlcih3b3JsZCwgb3B0cz8uZGVjcnlwdCA/PyBmYWxzZSk7XG5cbiAgbG9nZ2VyLndhcm4oYE5vIHJ1bklkIHByb3ZpZGVkLCBmZXRjaGluZyBkYXRhIGZvciBsYXRlc3QgcnVuIGluc3RlYWQuYCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcnVucyA9IGF3YWl0IHdvcmxkLnJ1bnMubGlzdCh7XG4gICAgICBwYWdpbmF0aW9uOiB7IGxpbWl0OiAxLCBzb3J0T3JkZXI6IG9wdHMuc29ydCB8fCAnZGVzYycgfSxcbiAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsIC8vIERvbid0IG5lZWQgZGF0YSBmb3IganVzdCBnZXR0aW5nIHRoZSBJRFxuICAgIH0pO1xuICAgIHJ1bnMuZGF0YSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcnVucy5kYXRhLm1hcCgocikgPT4gaHlkcmF0ZVJlc291cmNlSU8ociwgcmVzb2x2ZUtleSkpXG4gICAgKTtcbiAgICByZXR1cm4gcnVucy5kYXRhWzBdO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNob3dSdW4gPSBhc3luYyAoXG4gIHdvcmxkOiBXb3JsZCxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgb3B0czogSW5zcGVjdENMSU9wdGlvbnMgPSB7fVxuKSA9PiB7XG4gIGNvbnN0IHJlc29sdmVLZXkgPSBjcmVhdGVSZXNvbHZlcih3b3JsZCwgb3B0cz8uZGVjcnlwdCA/PyBmYWxzZSk7XG5cbiAgaWYgKG9wdHMud2l0aERhdGEpIHtcbiAgICBsb2dnZXIud2FybignYHdpdGhEYXRhYCBmbGFnIGlzIGlnbm9yZWQgd2hlbiBzaG93aW5nIGluZGl2aWR1YWwgcmVzb3VyY2VzJyk7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB3b3JsZC5ydW5zLmdldChydW5JZCwgeyByZXNvbHZlRGF0YTogJ2FsbCcgfSk7XG4gICAgY29uc3QgcnVuV2l0aEh5ZHJhdGVkSU8gPSBhd2FpdCBoeWRyYXRlUmVzb3VyY2VJTyhydW4sIHJlc29sdmVLZXkpO1xuICAgIGlmIChvcHRzLmpzb24pIHtcbiAgICAgIHNob3dKc29uKHJ1bldpdGhIeWRyYXRlZElPKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGhhc0V4cGlyZWREYXRhKHJ1bikpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgXCJUaGlzIHJ1bidzIGRhdGEgKGlucHV0L291dHB1dC9lcnJvcikgaGFzIGV4cGlyZWQgYW5kIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5sb2cocnVuV2l0aEh5ZHJhdGVkSU8pO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBsaXN0U3RlcHMgPSBhc3luYyAoXG4gIHdvcmxkOiBXb3JsZCxcbiAgb3B0czogSW5zcGVjdENMSU9wdGlvbnMgPSB7XG4gICAgcnVuSWQ6IHVuZGVmaW5lZCxcbiAgfVxuKSA9PiB7XG4gIGNvbnN0IHJlc29sdmVLZXkgPSBjcmVhdGVSZXNvbHZlcih3b3JsZCwgb3B0cz8uZGVjcnlwdCA/PyBmYWxzZSk7XG5cbiAgaWYgKG9wdHMuc3RlcElkKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnRmlsdGVyaW5nIGJ5IHN0ZXAtaWQgaXMgbm90IHN1cHBvcnRlZCBpbiBsaXN0IGNhbGxzLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cbiAgaWYgKG9wdHMud29ya2Zsb3dOYW1lKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnRmlsdGVyaW5nIGJ5IHdvcmtmbG93LW5hbWUgaXMgbm90IHN1cHBvcnRlZCBmb3Igc3RlcHMsIGlnbm9yaW5nIGZpbHRlci4nXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHJ1bklkID0gb3B0cy5ydW5JZFxuICAgID8gb3B0cy5ydW5JZFxuICAgIDogKGF3YWl0IGdldFJlY2VudFJ1bih3b3JsZCwgb3B0cykpPy5ydW5JZDtcbiAgaWYgKCFydW5JZCkge1xuICAgIGxvZ2dlci5lcnJvcignTm8gcnVuIGZvdW5kLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvcHRzLndpdGhEYXRhKSB7XG4gICAgd2FybldpdGhEYXRhRGVwcmVjYXRlZEZvckxpc3QoJ3N0ZXAnKTtcbiAgfVxuXG4gIGNvbnN0IHVzZUFuYWx5dGljcyA9ICFvcHRzLndpdGhEYXRhICYmIEJvb2xlYW4od29ybGQuYW5hbHl0aWNzKTtcbiAgY29uc3QgcmVzb2x2ZURhdGEgPSBvcHRzLndpdGhEYXRhID8gJ2FsbCcgOiAnbm9uZSc7XG5cbiAgLy8gRGV0ZXJtaW5lIHdoaWNoIHByb3BzIHRvIHNob3cgYmFzZWQgb24gd2l0aERhdGEgZmxhZ1xuICBjb25zdCBwcm9wcyA9IG9wdHMud2l0aERhdGFcbiAgICA/IFNURVBfTElTVEVEX1BST1BTXG4gICAgOiBTVEVQX0xJU1RFRF9QUk9QUy5maWx0ZXIoKHByb3ApID0+ICFTVEVQX0lPX1BST1BTLmluY2x1ZGVzKHByb3ApKTtcblxuICBjb25zdCBmZXRjaFN0ZXBzUGFnZSA9IGFzeW5jIChcbiAgICBjdXJzb3I6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiBQcm9taXNlPFBhZ2VEYXRhPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4gPT4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhgRmV0Y2hpbmcgc3RlcHMgZm9yIHJ1biAke3J1bklkfWApO1xuICAgIGNvbnN0IHBhZ2luYXRpb24gPSB7XG4gICAgICBzb3J0T3JkZXI6IG9wdHMuc29ydCB8fCAnZGVzYycsXG4gICAgICBjdXJzb3IsXG4gICAgICBsaW1pdDogb3B0cy5saW1pdCB8fCBERUZBVUxUX1BBR0VfU0laRSxcbiAgICB9O1xuICAgIGlmICh1c2VBbmFseXRpY3MgJiYgd29ybGQuYW5hbHl0aWNzKSB7XG4gICAgICBjb25zdCBzdGVwcyA9IGF3YWl0IHdvcmxkLmFuYWx5dGljcy5zdGVwcy5saXN0KHsgcnVuSWQsIHBhZ2luYXRpb24gfSk7XG4gICAgICBjb25zdCBwYWdlID0ge1xuICAgICAgICBkYXRhOiBzdGVwcy5kYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbiAgICAgICAgY3Vyc29yOiBzdGVwcy5jdXJzb3IsXG4gICAgICAgIGhhc01vcmU6IHN0ZXBzLmhhc01vcmUsXG4gICAgICAgIHBhZ2VJbmZvOiBnZXRQYWdlSW5mbyhzdGVwcyksXG4gICAgICB9O1xuICAgICAgaWYgKGN1cnNvciB8fCBwYWdlLmRhdGEubGVuZ3RoID4gMCB8fCBwYWdlLmhhc01vcmUpIHtcbiAgICAgICAgcmV0dXJuIHBhZ2U7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIGBObyBhbmFseXRpY3Mgc3RlcHMgZm91bmQgZm9yIHJ1biAke3J1bklkfTsgZmFsbGluZyBiYWNrIHRvIHN0b3JhZ2VgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzdGVwQ2h1bmtzID0gYXdhaXQgd29ybGQuc3RlcHMubGlzdCh7XG4gICAgICBydW5JZCxcbiAgICAgIHBhZ2luYXRpb24sXG4gICAgICByZXNvbHZlRGF0YSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdGVwQ2h1bmtzLmRhdGEubWFwKChzKSA9PiBoeWRyYXRlUmVzb3VyY2VJTyhzLCByZXNvbHZlS2V5KSlcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbiAgICAgIGN1cnNvcjogc3RlcENodW5rcy5jdXJzb3IsXG4gICAgICBoYXNNb3JlOiBzdGVwQ2h1bmtzLmhhc01vcmUsXG4gICAgICBwYWdlSW5mbzogZ2V0UGFnZUluZm8oc3RlcENodW5rcyksXG4gICAgfTtcbiAgfTtcblxuICAvLyBGb3IgSlNPTiBvdXRwdXQsIGp1c3QgZmV0Y2ggb25jZSBhbmQgcmV0dXJuXG4gIGlmIChvcHRzLmpzb24pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IGZldGNoU3RlcHNQYWdlKG9wdHMuY3Vyc29yKTtcbiAgICAgIHNob3dKc29uKHBhZ2UuZGF0YSk7XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBhd2FpdCBzZXR1cExpc3RQYWdpbmF0aW9uPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih7XG4gICAgaW5pdGlhbEN1cnNvcjogb3B0cy5jdXJzb3IsXG4gICAgaW50ZXJhY3RpdmU6IG9wdHMuaW50ZXJhY3RpdmUsXG4gICAgZmV0Y2hQYWdlOiBhc3luYyAoY3Vyc29yKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZmV0Y2hTdGVwc1BhZ2UoY3Vyc29yKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRpc3BsYXlQYWdlOiBhc3luYyAoc3RlcHMpID0+IHtcbiAgICAgIGxvZ2dlci5sb2coc2hvd1RhYmxlKHN0ZXBzLCBwcm9wcywgb3B0cykpO1xuICAgICAgc2hvd0luc3BlY3RJbmZvQm94KCdzdGVwJyk7XG4gICAgfSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2hvd1N0ZXAgPSBhc3luYyAoXG4gIHdvcmxkOiBXb3JsZCxcbiAgc3RlcElkOiBzdHJpbmcsXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge31cbikgPT4ge1xuICBjb25zdCByZXNvbHZlS2V5ID0gY3JlYXRlUmVzb2x2ZXIod29ybGQsIG9wdHM/LmRlY3J5cHQgPz8gZmFsc2UpO1xuXG4gIGlmIChvcHRzLndpdGhEYXRhKSB7XG4gICAgbG9nZ2VyLndhcm4oJ2B3aXRoRGF0YWAgZmxhZyBpcyBpZ25vcmVkIHdoZW4gc2hvd2luZyBpbmRpdmlkdWFsIHJlc291cmNlcycpO1xuICB9XG4gIGlmIChvcHRzLnN0ZXBJZCkge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgJ0ZpbHRlcmluZyBieSBzdGVwLWlkIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZ2V0IGNhbGxzLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cblxuICBjb25zdCBydW5JZCA9IG9wdHMucnVuSWQgPz8gKGF3YWl0IGdldFJlY2VudFJ1bih3b3JsZCwgb3B0cykpPy5ydW5JZDtcbiAgaWYgKCFydW5JZCkge1xuICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICdydW4taWQgaXMgcmVxdWlyZWQgZm9yIHNob3dpbmcgYSBzdGVwLiBVc2FnZTogYHdvcmtmbG93IGluc3BlY3Qgc3RlcCA8U1RFUF9JRD4gLS1ydW5JZD08UlVOX0lEPmAnXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHN0ZXAgPSBhd2FpdCB3b3JsZC5zdGVwcy5nZXQocnVuSWQsIHN0ZXBJZCwge1xuICAgICAgcmVzb2x2ZURhdGE6ICdhbGwnLFxuICAgIH0pO1xuICAgIGNvbnN0IHN0ZXBXaXRoSHlkcmF0ZWRJTyA9IGF3YWl0IGh5ZHJhdGVSZXNvdXJjZUlPKHN0ZXAsIHJlc29sdmVLZXkpO1xuICAgIGlmIChvcHRzLmpzb24pIHtcbiAgICAgIHNob3dKc29uKHN0ZXBXaXRoSHlkcmF0ZWRJTyk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChcbiAgICAgICAgaGFzRXhwaXJlZEZpZWxkcyhcbiAgICAgICAgICBzdGVwV2l0aEh5ZHJhdGVkSU8gYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgXCJUaGlzIHN0ZXAncyBkYXRhIChpbnB1dC9vdXRwdXQvZXJyb3IpIGhhcyBleHBpcmVkIGFuZCBpcyBubyBsb25nZXIgYXZhaWxhYmxlLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsb2dnZXIubG9nKHN0ZXBXaXRoSHlkcmF0ZWRJTyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNob3dTdHJlYW0gPSBhc3luYyAoXG4gIHdvcmxkOiBXb3JsZCxcbiAgc3RyZWFtSWQ6IHN0cmluZyxcbiAgb3B0czogSW5zcGVjdENMSU9wdGlvbnMgPSB7fVxuKSA9PiB7XG4gIGlmIChvcHRzLnN0ZXBJZCkge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgJ0ZpbHRlcmluZyBieSBzdGVwLWlkIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiBzaG93aW5nIGEgc3RyZWFtLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cbiAgaWYgKCFvcHRzLnJ1bklkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCctLXJ1biBpcyByZXF1aXJlZCB3aGVuIHNob3dpbmcgYSBzdHJlYW0nKTtcbiAgfVxuICBjb25zdCByYXdTdHJlYW0gPSBhd2FpdCB3b3JsZC5zdHJlYW1zLmdldChvcHRzLnJ1bklkLCBzdHJlYW1JZCk7XG5cbiAgLy8gT25seSByZXNvbHZlIHRoZSBlbmNyeXB0aW9uIGtleSB3aGVuIC0tZGVjcnlwdCBpcyBwYXNzZWQgYW5kIC0tcnVuIGlzIHByb3ZpZGVkLlxuICAvLyBXZSBmZXRjaCB0aGUgZnVsbCBXb3JrZmxvd1J1biBvYmplY3Qgc28gdGhhdCBnZXRFbmNyeXB0aW9uS2V5Rm9yUnVuIGhhc1xuICAvLyBhY2Nlc3MgdG8gdGhlIGRlcGxveW1lbnRJZCAobmVlZGVkIGZvciBBUEktYmFzZWQga2V5IHJlc29sdXRpb24pLlxuICBsZXQgZW5jcnlwdGlvbktleTogRW5jcnlwdGlvbktleVBhcmFtO1xuICBpZiAob3B0cy5kZWNyeXB0ICYmIG9wdHMucnVuSWQpIHtcbiAgICBlbmNyeXB0aW9uS2V5ID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJ1biA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KG9wdHMucnVuSWQhKTtcbiAgICAgIGNvbnN0IHJhd0tleSA9IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW4pO1xuICAgICAgcmV0dXJuIHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xuICAgIH0pKCk7XG4gIH0gZWxzZSBpZiAob3B0cy5kZWNyeXB0ICYmICFvcHRzLnJ1bklkKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnQ2Fubm90IGRlY3J5cHQgc3RyZWFtIGNvbnRlbnQgd2l0aG91dCBhIHJ1biBJRC4gVXNlIC0tcnVuPTxydW4taWQ+IHdpdGggLS1kZWNyeXB0LidcbiAgICApO1xuICB9XG5cbiAgLy8gRGVzZXJpYWxpemUgdGhlIHN0cmVhbSB0byBnZXQgSmF2YVNjcmlwdCBvYmplY3RzXG4gIGNvbnN0IHJldml2ZXJzID0gZ2V0RXh0ZXJuYWxSZXZpdmVycyhcbiAgICBnbG9iYWxUaGlzLFxuICAgIFtdLFxuICAgIG9wdHMucnVuSWQgPz8gJycsXG4gICAgZW5jcnlwdGlvbktleVxuICApO1xuICBjb25zdCB0cmFuc2Zvcm0gPSBnZXREZXNlcmlhbGl6ZVN0cmVhbShyZXZpdmVycywgZW5jcnlwdGlvbktleSk7XG4gIGNvbnN0IHN0cmVhbSA9IHJhd1N0cmVhbS5waXBlVGhyb3VnaCh0cmFuc2Zvcm0pO1xuXG4gIGxvZ2dlci5pbmZvKCdTdHJlYW1pbmcgdG8gc3Rkb3V0LCBwcmVzcyBDVFJMK0MgdG8gYWJvcnQuJyk7XG4gIGxvZ2dlci5pbmZvKFxuICAgICdVc2UgLS1qc29uIHRvIG91dHB1dCB0aGUgc3RyZWFtIGFzIG5ld2xpbmUtZGVsaW1pdGVkIEpTT04gd2l0aG91dCBpbmZvIGxvZ3MuXFxuJ1xuICApO1xuICBhd2FpdCBzdHJlYW1Ub0NvbnNvbGUoc3RyZWFtLCBzdHJlYW1JZCwgb3B0cyk7XG59O1xuXG4vKipcbiAqIExpc3Rpbmcgc3RyZWFtcyBvbmx5IGxpc3RzIGF2YWlsYWJsZSBzdHJlYW0gSURzIGJhc2VkIG9uIHJ1bi9zdGVwIHBhc3NlZCxcbiAqIGFuZCBkb2Vzbid0IHJlYWQgYW55IGRhdGEgZnJvbSB0aGUgc3RyZWFtcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGxpc3RTdHJlYW1zQnlSdW5JZCA9IGFzeW5jIChcbiAgd29ybGQ6IFdvcmxkLFxuICBvcHRzOiBJbnNwZWN0Q0xJT3B0aW9ucyA9IHt9XG4pID0+IHtcbiAgaWYgKG9wdHMud2l0aERhdGEpIHtcbiAgICBsb2dnZXIud2FybignYHdpdGhEYXRhYCBmbGFnIGlzIGlnbm9yZWQgd2hlbiBsaXN0aW5nIHN0cmVhbXMnKTtcbiAgfVxuICBpZiAob3B0cy53b3JrZmxvd05hbWUpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgd29ya2Zsb3ctbmFtZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBzdHJlYW1zLCBpZ25vcmluZyBmaWx0ZXIuJ1xuICAgICk7XG4gIH1cbiAgaWYgKG9wdHMuc3RlcElkKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnRmlsdGVyaW5nIGJ5IHN0ZXAtaWQgaXMgbm90IHN1cHBvcnRlZCBmb3Igc3RyZWFtcywgaWdub3JpbmcgZmlsdGVyLidcbiAgICApO1xuICB9XG5cbiAgbGV0IHJ1bklkID0gb3B0cy5ydW5JZDtcbiAgaWYgKCFydW5JZCkge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgJ05vIHJ1bi1pZCBwcm92aWRlZC4gTGlzdGluZyBzdHJlYW1zIGZvciBsYXRlc3QgcnVuIGluc3RlYWQuJyxcbiAgICAgICdVc2UgLS1ydW49PHJ1bi1pZD4gdG8gZmlsdGVyIHN0cmVhbXMgYnkgcnVuLidcbiAgICApO1xuICAgIGNvbnN0IHJ1biA9IGF3YWl0IGdldFJlY2VudFJ1bih3b3JsZCwgb3B0cyk7XG4gICAgaWYgKCFydW4pIHtcbiAgICAgIGxvZ2dlci53YXJuKCdObyBydW5zIGZvdW5kLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBydW5JZCA9IHJ1bi5ydW5JZDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3RyZWFtSWRzID0gYXdhaXQgd29ybGQuc3RyZWFtcy5saXN0KHJ1bklkKTtcbiAgICBjb25zdCBtYXRjaGluZ1N0cmVhbXMgPSBzdHJlYW1JZHMubWFwKChzdHJlYW1JZCkgPT4gKHtcbiAgICAgIHJ1bklkLFxuICAgICAgc3RyZWFtSWQsXG4gICAgfSkpO1xuXG4gICAgaWYgKG9wdHMuanNvbikge1xuICAgICAgc2hvd0pzb24obWF0Y2hpbmdTdHJlYW1zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbG9nZ2VyLmxvZyhzaG93VGFibGUobWF0Y2hpbmdTdHJlYW1zLCBbJ3J1bklkJywgJ3N0cmVhbUlkJ10pKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBsaXN0RXZlbnRzID0gYXN5bmMgKFxuICB3b3JsZDogV29ybGQsXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge31cbikgPT4ge1xuICBjb25zdCByZXNvbHZlS2V5ID0gY3JlYXRlUmVzb2x2ZXIod29ybGQsIG9wdHM/LmRlY3J5cHQgPz8gZmFsc2UpO1xuICBpZiAob3B0cy53b3JrZmxvd05hbWUpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgd29ya2Zsb3ctbmFtZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBldmVudHMsIGlnbm9yaW5nIGZpbHRlci4nXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHJ1bklkID0gb3B0cy5ydW5JZCA/PyAoYXdhaXQgZ2V0UmVjZW50UnVuKHdvcmxkLCBvcHRzKSk/LnJ1bklkO1xuICBpZiAoIXJ1bklkKSB7XG4gICAgbG9nZ2VyLmVycm9yKCdObyBydW4gZm91bmQuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdHMud2l0aERhdGEpIHtcbiAgICB3YXJuV2l0aERhdGFEZXByZWNhdGVkRm9yTGlzdCgnZXZlbnQnKTtcbiAgfVxuXG4gIGNvbnN0IHVzZUFuYWx5dGljcyA9ICFvcHRzLndpdGhEYXRhICYmIEJvb2xlYW4od29ybGQuYW5hbHl0aWNzKTtcbiAgY29uc3QgY29ycmVsYXRpb25JZEZpbHRlciA9IG9wdHMuaG9va0lkIHx8IG9wdHMuc3RlcElkO1xuXG4gIC8vIERldGVybWluZSB3aGljaCBwcm9wcyB0byBzaG93IGJhc2VkIG9uIHdpdGhEYXRhIGZsYWdcbiAgY29uc3QgcHJvcHMgPSBvcHRzLndpdGhEYXRhXG4gICAgPyBFVkVOVF9MSVNURURfUFJPUFNcbiAgICA6IEVWRU5UX0xJU1RFRF9QUk9QUy5maWx0ZXIoKHByb3ApID0+ICFFVkVOVF9JT19QUk9QUy5pbmNsdWRlcyhwcm9wKSk7XG5cbiAgY29uc3QgZmV0Y2hFdmVudHNQYWdlID0gYXN5bmMgKFxuICAgIGN1cnNvcjogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IFByb21pc2U8UGFnZURhdGE8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+PiA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKGBGZXRjaGluZyBldmVudHMgZm9yIHJ1biAke3J1bklkfWApO1xuICAgIGNvbnN0IHBhZ2luYXRpb24gPSB7XG4gICAgICBzb3J0T3JkZXI6IG9wdHMuc29ydCB8fCAnZGVzYycsXG4gICAgICBjdXJzb3IsXG4gICAgICBsaW1pdDogb3B0cy5saW1pdCB8fCBERUZBVUxUX1BBR0VfU0laRSxcbiAgICB9O1xuICAgIGlmICh1c2VBbmFseXRpY3MgJiYgd29ybGQuYW5hbHl0aWNzKSB7XG4gICAgICBjb25zdCBldmVudHMgPSBhd2FpdCB3b3JsZC5hbmFseXRpY3MuZXZlbnRzLmxpc3Qoe1xuICAgICAgICBydW5JZCxcbiAgICAgICAgY29ycmVsYXRpb25JZDogY29ycmVsYXRpb25JZEZpbHRlcixcbiAgICAgICAgcGFnaW5hdGlvbixcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcGFnZSA9IHtcbiAgICAgICAgZGF0YTogZXZlbnRzLmRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICAgICAgICBjdXJzb3I6IGV2ZW50cy5jdXJzb3IsXG4gICAgICAgIGhhc01vcmU6IGV2ZW50cy5oYXNNb3JlLFxuICAgICAgICBwYWdlSW5mbzogZ2V0UGFnZUluZm8oZXZlbnRzKSxcbiAgICAgIH07XG4gICAgICBpZiAoY3Vyc29yIHx8IHBhZ2UuZGF0YS5sZW5ndGggPiAwIHx8IHBhZ2UuaGFzTW9yZSkge1xuICAgICAgICByZXR1cm4gcGFnZTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYE5vIGFuYWx5dGljcyBldmVudHMgZm91bmQgZm9yIHJ1biAke3J1bklkfTsgZmFsbGluZyBiYWNrIHRvIHN0b3JhZ2VgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3b3JsZC5ldmVudHMubGlzdCh7XG4gICAgICBydW5JZCxcbiAgICAgIHBhZ2luYXRpb24sXG4gICAgICByZXNvbHZlRGF0YTogb3B0cy53aXRoRGF0YSA/ICdhbGwnIDogJ25vbmUnLFxuICAgIH0pO1xuICAgIGNvbnN0IGZpbHRlcmVkID0gY29ycmVsYXRpb25JZEZpbHRlclxuICAgICAgPyByZXN1bHQuZGF0YS5maWx0ZXIoKGUpID0+IGUuY29ycmVsYXRpb25JZCA9PT0gY29ycmVsYXRpb25JZEZpbHRlcilcbiAgICAgIDogcmVzdWx0LmRhdGE7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsdGVyZWQubWFwKChlKSA9PiBoeWRyYXRlUmVzb3VyY2VJTyhlLCByZXNvbHZlS2V5KSlcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbiAgICAgIGN1cnNvcjogcmVzdWx0LmN1cnNvcixcbiAgICAgIGhhc01vcmU6IHJlc3VsdC5oYXNNb3JlLFxuICAgICAgcGFnZUluZm86IGdldFBhZ2VJbmZvKHJlc3VsdCksXG4gICAgfTtcbiAgfTtcblxuICAvLyBGb3IgSlNPTiBvdXRwdXQsIGp1c3QgZmV0Y2ggb25jZSBhbmQgcmV0dXJuXG4gIGlmIChvcHRzLmpzb24pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IGZldGNoRXZlbnRzUGFnZShvcHRzLmN1cnNvcik7XG4gICAgICBzaG93SnNvbihwYWdlLmRhdGEpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaGFuZGxlQXBpRXJyb3IoZXJyb3IsIG9wdHMuYmFja2VuZCkpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgc2V0dXBMaXN0UGFnaW5hdGlvbjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oe1xuICAgIGluaXRpYWxDdXJzb3I6IG9wdHMuY3Vyc29yLFxuICAgIGludGVyYWN0aXZlOiBvcHRzLmludGVyYWN0aXZlLFxuICAgIGZldGNoUGFnZTogYXN5bmMgKGN1cnNvcikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZldGNoRXZlbnRzUGFnZShjdXJzb3IpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGhhbmRsZUFwaUVycm9yKGVycm9yLCBvcHRzLmJhY2tlbmQpKSB7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGlzcGxheVBhZ2U6IGFzeW5jIChldmVudHMpID0+IHtcbiAgICAgIGxvZ2dlci5sb2coc2hvd1RhYmxlKGV2ZW50cywgcHJvcHMsIG9wdHMpKTtcbiAgICAgIHNob3dJbnNwZWN0SW5mb0JveCgnZXZlbnQnKTtcbiAgICB9LFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBsaXN0SG9va3MgPSBhc3luYyAod29ybGQ6IFdvcmxkLCBvcHRzOiBJbnNwZWN0Q0xJT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHJlc29sdmVLZXkgPSBjcmVhdGVSZXNvbHZlcih3b3JsZCwgb3B0cz8uZGVjcnlwdCA/PyBmYWxzZSk7XG5cbiAgaWYgKG9wdHMud29ya2Zsb3dOYW1lKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnRmlsdGVyaW5nIGJ5IHdvcmtmbG93LW5hbWUgaXMgbm90IHN1cHBvcnRlZCBmb3IgaG9va3MsIGlnbm9yaW5nIGZpbHRlci4nXG4gICAgKTtcbiAgfVxuICBpZiAob3B0cy5zdGVwSWQpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgc3RlcC1pZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBob29rcywgaWdub3JpbmcgZmlsdGVyLidcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcnVuSWQgPSBvcHRzLnJ1bklkO1xuICBjb25zdCByZXNvbHZlRGF0YSA9IG9wdHMud2l0aERhdGEgPyAnYWxsJyA6ICdub25lJztcbiAgLy8gSG9va3MgYWx3YXlzIHJlYWQgZnJvbSB0aGUgcnVudGltZSBzdG9yYWdlIEFQSS4gVW5saWtlIHJ1bnMvc3RlcHMvZXZlbnRzLFxuICAvLyB0aGUgYW5hbHl0aWNzIHJlYWQgcGF0aCBvbWl0cyBgb3duZXJJZGAgKGFuZCB0aGUgc2VjcmV0IGhvb2sgdG9rZW4gdXNlZCBieVxuICAvLyByZXN1bWUvY29weS10b2tlbiBzdXJmYWNlcyksIHNvIGhvb2sgbGlzdGluZyBzdGF5cyBvbiB0aGUgY2Fub25pY2FsIEFQSXMuXG4gIGNvbnN0IGZldGNoSG9va3NQYWdlID0gYXN5bmMgKFxuICAgIGN1cnNvcjogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IFByb21pc2U8UGFnZURhdGE8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+PiA9PiB7XG4gICAgaWYgKCFydW5JZCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdGZXRjaGluZyBhbGwgaG9va3MnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBGZXRjaGluZyBob29rcyBmb3IgcnVuICR7cnVuSWR9YCk7XG4gICAgfVxuICAgIGNvbnN0IHBhZ2luYXRpb24gPSB7XG4gICAgICBzb3J0T3JkZXI6IG9wdHMuc29ydCB8fCAnZGVzYycsXG4gICAgICBjdXJzb3IsXG4gICAgICBsaW1pdDogb3B0cy5saW1pdCB8fCBERUZBVUxUX1BBR0VfU0laRSxcbiAgICB9O1xuICAgIGNvbnN0IGhvb2tzID0gYXdhaXQgd29ybGQuaG9va3MubGlzdCh7IHJ1bklkLCBwYWdpbmF0aW9uLCByZXNvbHZlRGF0YSB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBob29rcy5kYXRhLm1hcCgoaCkgPT4gaHlkcmF0ZVJlc291cmNlSU8oaCwgcmVzb2x2ZUtleSkpXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogZGF0YSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG4gICAgICBjdXJzb3I6IGhvb2tzLmN1cnNvcixcbiAgICAgIGhhc01vcmU6IGhvb2tzLmhhc01vcmUsXG4gICAgICBwYWdlSW5mbzogZ2V0UGFnZUluZm8oaG9va3MpLFxuICAgIH07XG4gIH07XG5cbiAgLy8gRm9yIEpTT04gb3V0cHV0LCBqdXN0IGZldGNoIG9uY2UgYW5kIHJldHVyblxuICBpZiAob3B0cy5qc29uKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBmZXRjaEhvb2tzUGFnZShvcHRzLmN1cnNvcik7XG4gICAgICBzaG93SnNvblBhZ2UocGFnZSk7XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvLyBTZXR1cCBwYWdpbmF0aW9uIHdpdGggbmV3IG1lY2hhbmlzbVxuICBhd2FpdCBzZXR1cExpc3RQYWdpbmF0aW9uPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih7XG4gICAgaW5pdGlhbEN1cnNvcjogb3B0cy5jdXJzb3IsXG4gICAgaW50ZXJhY3RpdmU6IG9wdHMuaW50ZXJhY3RpdmUsXG4gICAgZmV0Y2hQYWdlOiBhc3luYyAoY3Vyc29yKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZmV0Y2hIb29rc1BhZ2UoY3Vyc29yKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRpc3BsYXlQYWdlOiBhc3luYyAoaG9va3MpID0+IHtcbiAgICAgIGxvZ2dlci5sb2coc2hvd1RhYmxlKGhvb2tzLCBIT09LX0xJU1RFRF9QUk9QUywgb3B0cykpO1xuICAgICAgc2hvd0luc3BlY3RJbmZvQm94KCdob29rJyk7XG4gICAgfSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2hvd0hvb2sgPSBhc3luYyAoXG4gIHdvcmxkOiBXb3JsZCxcbiAgaG9va0lkOiBzdHJpbmcsXG4gIG9wdHM6IEluc3BlY3RDTElPcHRpb25zID0ge31cbikgPT4ge1xuICBjb25zdCByZXNvbHZlS2V5ID0gY3JlYXRlUmVzb2x2ZXIod29ybGQsIG9wdHM/LmRlY3J5cHQgPz8gZmFsc2UpO1xuXG4gIGlmIChvcHRzLndpdGhEYXRhKSB7XG4gICAgbG9nZ2VyLndhcm4oJ2B3aXRoRGF0YWAgZmxhZyBpcyBpZ25vcmVkIHdoZW4gc2hvd2luZyBpbmRpdmlkdWFsIHJlc291cmNlcycpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgaG9vayA9IGF3YWl0IHdvcmxkLmhvb2tzLmdldChob29rSWQsIHtcbiAgICAgIHJlc29sdmVEYXRhOiAnYWxsJyxcbiAgICB9KTtcbiAgICBjb25zdCBoeWRyYXRlZEhvb2sgPSBhd2FpdCBoeWRyYXRlUmVzb3VyY2VJTyhob29rLCByZXNvbHZlS2V5KTtcbiAgICBpZiAob3B0cy5qc29uKSB7XG4gICAgICBzaG93SnNvbihoeWRyYXRlZEhvb2spO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgIGhhc0V4cGlyZWRGaWVsZHMoaHlkcmF0ZWRIb29rIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgXCJUaGlzIGhvb2sncyBkYXRhIChtZXRhZGF0YSkgaGFzIGV4cGlyZWQgYW5kIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5sb2coaHlkcmF0ZWRIb29rKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGhhbmRsZUFwaUVycm9yKGVycm9yLCBvcHRzLmJhY2tlbmQpKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG4vKipcbiAqIExpc3Qgd2FpdHMvc2xlZXBzIHZpYSB0aGUgYW5hbHl0aWNzIHJlYWQgcGF0aC4gVGhlIGFuYWx5dGljcyB3YWl0IHNoYXBlIGlzXG4gKiBrZXllZCBieSBgd2FpdElkYC9gc3RhdHVzYCByYXRoZXIgdGhhbiB0aGUgYGNvcnJlbGF0aW9uSWRgL2BldmVudElkYCBjb2x1bW5zXG4gKiByZWNvbnN0cnVjdGVkIGZyb20gdGhlIGV2ZW50IHN0cmVhbSBpbiB0aGUgZmFsbGJhY2sgcGF0aC5cbiAqL1xuY29uc3QgbGlzdFNsZWVwc1ZpYUFuYWx5dGljcyA9IGFzeW5jIChcbiAgYW5hbHl0aWNzOiBOb25OdWxsYWJsZTxXb3JsZFsnYW5hbHl0aWNzJ10+LFxuICBvcHRzOiBJbnNwZWN0Q0xJT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGZldGNoU2xlZXBzUGFnZSA9IGFzeW5jIChcbiAgICBjdXJzb3I6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiBQcm9taXNlPFBhZ2VEYXRhPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4gPT4ge1xuICAgIGNvbnN0IHdhaXRzID0gYXdhaXQgYW5hbHl0aWNzLndhaXRzLmxpc3Qoe1xuICAgICAgcnVuSWQ6IG9wdHMucnVuSWQgYXMgc3RyaW5nLFxuICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICBzb3J0T3JkZXI6IG9wdHMuc29ydCB8fCAnZGVzYycsXG4gICAgICAgIGN1cnNvcixcbiAgICAgICAgbGltaXQ6IG9wdHMubGltaXQgfHwgREVGQVVMVF9QQUdFX1NJWkUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IHdhaXRzLmRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICAgICAgY3Vyc29yOiB3YWl0cy5jdXJzb3IsXG4gICAgICBoYXNNb3JlOiB3YWl0cy5oYXNNb3JlLFxuICAgICAgcGFnZUluZm86IGdldFBhZ2VJbmZvKHdhaXRzKSxcbiAgICB9O1xuICB9O1xuXG4gIGlmIChvcHRzLmpzb24pIHtcbiAgICBjb25zdCBwYWdlID0gYXdhaXQgZmV0Y2hTbGVlcHNQYWdlKG9wdHMuY3Vyc29yKTtcbiAgICBzaG93SnNvbihwYWdlLmRhdGEpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IHNldHVwTGlzdFBhZ2luYXRpb248UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHtcbiAgICBpbml0aWFsQ3Vyc29yOiBvcHRzLmN1cnNvcixcbiAgICBpbnRlcmFjdGl2ZTogb3B0cy5pbnRlcmFjdGl2ZSxcbiAgICBmZXRjaFBhZ2U6IGZldGNoU2xlZXBzUGFnZSxcbiAgICBkaXNwbGF5UGFnZTogYXN5bmMgKHdhaXRzKSA9PiB7XG4gICAgICBsb2dnZXIubG9nKFxuICAgICAgICBzaG93VGFibGUoXG4gICAgICAgICAgd2FpdHMsXG4gICAgICAgICAgWyd3YWl0SWQnLCAnc3RhdHVzJywgJ2NyZWF0ZWRBdCcsICdyZXN1bWVBdCcsICdjb21wbGV0ZWRBdCddLFxuICAgICAgICAgIHsgLi4ub3B0cywgZGlzYWJsZVJlbGF0aXZlRGF0ZXM6IHRydWUgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGxpc3RTbGVlcHMgPSBhc3luYyAoXG4gIHdvcmxkOiBXb3JsZCxcbiAgb3B0czogSW5zcGVjdENMSU9wdGlvbnMgPSB7fVxuKSA9PiB7XG4gIGlmICghb3B0cy5ydW5JZCkge1xuICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICdydW4taWQgaXMgcmVxdWlyZWQgZm9yIGxpc3Rpbmcgc2xlZXBzLiBVc2FnZTogYHdvcmtmbG93IGluc3BlY3Qgc2xlZXBzIC0tcnVuSWQ9PGlkPmAnXG4gICAgKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAob3B0cy5zdGVwSWQpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgc3RlcC1pZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBzbGVlcHMsIGlnbm9yaW5nIGZpbHRlci4nXG4gICAgKTtcbiAgfVxuICBpZiAob3B0cy53b3JrZmxvd05hbWUpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgICdGaWx0ZXJpbmcgYnkgd29ya2Zsb3ctbmFtZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBzbGVlcHMsIGlnbm9yaW5nIGZpbHRlci4nXG4gICAgKTtcbiAgfVxuICBpZiAob3B0cy53aXRoRGF0YSkge1xuICAgIGxvZ2dlci53YXJuKCdgd2l0aERhdGFgIGZsYWcgaXMgaWdub3JlZCB3aGVuIGxpc3Rpbmcgc2xlZXBzJyk7XG4gIH1cblxuICAvLyBQcmVmZXIgdGhlIGFuYWx5dGljcyByZWFkIHBhdGggZm9yIHdhaXQvc2xlZXAgbGlzdGluZyB3aGVuIGF2YWlsYWJsZS5cbiAgaWYgKHdvcmxkLmFuYWx5dGljcykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBsaXN0U2xlZXBzVmlhQW5hbHl0aWNzKHdvcmxkLmFuYWx5dGljcywgb3B0cyk7XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChoYW5kbGVBcGlFcnJvcihlcnJvciwgb3B0cy5iYWNrZW5kKSkge1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIC8vIEZldGNoIGFsbCBldmVudHMgZm9yIHRoZSBydW4gd2l0aCByZXNvbHZlRGF0YT0nYWxsJyB0byBnZXQgd2FpdCBldmVudERhdGFcbiAgICBjb25zdCBldmVudHMgPSBhd2FpdCB3b3JsZC5ldmVudHMubGlzdCh7XG4gICAgICBydW5JZDogb3B0cy5ydW5JZCxcbiAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgc29ydE9yZGVyOiBvcHRzLnNvcnQgfHwgJ2Rlc2MnLFxuICAgICAgICBsaW1pdDogMTAwMCxcbiAgICAgIH0sXG4gICAgICByZXNvbHZlRGF0YTogJ2FsbCcsXG4gICAgfSk7XG5cbiAgICAvLyBTaG93IGluZm8gbWVzc2FnZSBpZiB0aGVyZSBtaWdodCBiZSBtb3JlIHNsZWVwc1xuICAgIGlmIChldmVudHMuaGFzTW9yZSkge1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICdXYXJuaW5nOiBUaGlzIHJ1biBoYXMgbW9yZSB0aGFuIDEwMDAgZXZlbnRzLiBTb21lIHNsZWVwcyBtaWdodCBub3QgYmUgc2hvd24uIFBsZWFzZSB1c2UgdGhlIHdlYiBVSSB0byBlbnN1cmUgZ2V0dGluZyBhIGNvbXBsZXRlIGxpc3QuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBHcm91cCB3YWl0IGV2ZW50cyBieSBjb3JyZWxhdGlvbklkXG4gICAgY29uc3Qgd2FpdEV2ZW50c0J5Q29ycmVsYXRpb24gPSBuZXcgTWFwPHN0cmluZywgRXZlbnRbXT4oKTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cy5kYXRhKSB7XG4gICAgICBpZiAoZXZlbnQuY29ycmVsYXRpb25JZD8uc3RhcnRzV2l0aCgnd2FpdF8nKSkge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHdhaXRFdmVudHNCeUNvcnJlbGF0aW9uLmdldChldmVudC5jb3JyZWxhdGlvbklkKSA/PyBbXTtcbiAgICAgICAgZXhpc3RpbmcucHVzaChldmVudCk7XG4gICAgICAgIHdhaXRFdmVudHNCeUNvcnJlbGF0aW9uLnNldChldmVudC5jb3JyZWxhdGlvbklkLCBleGlzdGluZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdhaXRFdmVudHNCeUNvcnJlbGF0aW9uLnNpemUgPT09IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKCdObyBzbGVlcHMgZm91bmQgZm9yIHRoaXMgcnVuLicpO1xuICAgICAgaWYgKG9wdHMuanNvbikge1xuICAgICAgICBzaG93SnNvbihbXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIubG9nKFxuICAgICAgICAgIHNob3dUYWJsZShbXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLCBXQUlUX0xJU1RFRF9QUk9QUywge1xuICAgICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgICAgIGRpc2FibGVSZWxhdGl2ZURhdGVzOiB0cnVlLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgc2xlZXBzIGZyb20gZ3JvdXBlZCB3YWl0IGV2ZW50c1xuICAgIGNvbnN0IHNsZWVwczogU2xlZXBbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2NvcnJlbGF0aW9uSWQsIGNvcnJlbGF0aW9uRXZlbnRzXSBvZiB3YWl0RXZlbnRzQnlDb3JyZWxhdGlvbikge1xuICAgICAgLy8gU3RpdGNoIHVwIHdhaXRfY3JlYXRlZCBhbmQgd2FpdF9jb21wbGV0ZWQgZXZlbnRzXG4gICAgICBjb25zdCB3YWl0Q3JlYXRlZCA9IGNvcnJlbGF0aW9uRXZlbnRzLmZpbmQoXG4gICAgICAgIChlOiBFdmVudCkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnXG4gICAgICApO1xuICAgICAgY29uc3Qgd2FpdENvbXBsZXRlZCA9IGNvcnJlbGF0aW9uRXZlbnRzLmZpbmQoXG4gICAgICAgIChlOiBFdmVudCkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCdcbiAgICAgICk7XG5cbiAgICAgIGlmICh3YWl0Q3JlYXRlZCkge1xuICAgICAgICBjb25zdCBzbGVlcDogU2xlZXAgPSB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBydW5JZDogd2FpdENyZWF0ZWQucnVuSWQsXG4gICAgICAgICAgZXZlbnRJZDogd2FpdENyZWF0ZWQuZXZlbnRJZCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IHdhaXRDcmVhdGVkLmNyZWF0ZWRBdCxcbiAgICAgICAgICByZXN1bWVBdDpcbiAgICAgICAgICAgIHdhaXRDcmVhdGVkLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCdcbiAgICAgICAgICAgICAgPyB3YWl0Q3JlYXRlZC5ldmVudERhdGEucmVzdW1lQXRcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgY29tcGxldGVkQXQ6IHdhaXRDb21wbGV0ZWQ/LmNyZWF0ZWRBdCxcbiAgICAgICAgfTtcbiAgICAgICAgc2xlZXBzLnB1c2goc2xlZXApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNvcnQgc2xlZXBzIGJ5IGNyZWF0ZWRBdFxuICAgIHNsZWVwcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCB0aW1lQSA9IGEuY3JlYXRlZEF0LmdldFRpbWUoKTtcbiAgICAgIGNvbnN0IHRpbWVCID0gYi5jcmVhdGVkQXQuZ2V0VGltZSgpO1xuICAgICAgcmV0dXJuIG9wdHMuc29ydCA9PT0gJ2FzYycgPyB0aW1lQSAtIHRpbWVCIDogdGltZUIgLSB0aW1lQTtcbiAgICB9KTtcblxuICAgIGlmIChvcHRzLmpzb24pIHtcbiAgICAgIHNob3dKc29uKHNsZWVwcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nZ2VyLmxvZyhcbiAgICAgIHNob3dUYWJsZShcbiAgICAgICAgc2xlZXBzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbiAgICAgICAgV0FJVF9MSVNURURfUFJPUFMsXG4gICAgICAgIHsgLi4ub3B0cywgZGlzYWJsZVJlbGF0aXZlRGF0ZXM6IHRydWUgfVxuICAgICAgKVxuICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGhhbmRsZUFwaUVycm9yKGVycm9yLCBvcHRzLmJhY2tlbmQpKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuIl19