@ethlete/cdk 4.47.0 → 4.48.1

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 (29) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/esm2022/lib/components/bracket/components/new-bracket/bracket-new.mjs +170 -69
  3. package/esm2022/lib/components/bracket/components/new-bracket/draw-man.mjs +75 -32
  4. package/esm2022/lib/components/bracket/components/new-bracket/grid-placements.mjs +8 -3
  5. package/esm2022/lib/components/bracket/components/new-bracket/journey-highlight.mjs +18 -0
  6. package/esm2022/lib/components/bracket/components/new-bracket/new-bracket.component.mjs +47 -9
  7. package/esm2022/lib/components/bracket/stories/dummy-data/ET_DUMMY_DATA_DOUBLE_SYNC.mjs +1116 -0
  8. package/esm2022/lib/components/bracket/stories/dummy-data/ET_DUMMY_DATA_SINGLE.mjs +2691 -0
  9. package/esm2022/lib/components/bracket/stories/dummy-data/ET_DUMMY_DATA_SWISS.mjs +72479 -0
  10. package/esm2022/lib/components/bracket/stories/dummy-data/ET_DUMMY_DATE_DOUBLE_ASYNC.mjs +1275 -0
  11. package/esm2022/lib/components/bracket/stories/dummy-data/FIFA_DUMMY_DATA_DOUBLE.mjs +2453 -0
  12. package/esm2022/lib/components/bracket/stories/dummy-data/FIFA_DUMMY_DATA_SINGLE.mjs +2570 -0
  13. package/esm2022/lib/components/bracket/stories/dummy-data/index.mjs +7 -0
  14. package/fesm2022/ethlete-cdk.mjs +315 -109
  15. package/fesm2022/ethlete-cdk.mjs.map +1 -1
  16. package/lib/components/bracket/components/new-bracket/bracket-new.d.ts +1632 -18
  17. package/lib/components/bracket/components/new-bracket/draw-man.d.ts +5 -3
  18. package/lib/components/bracket/components/new-bracket/grid-placements.d.ts +4 -0
  19. package/lib/components/bracket/components/new-bracket/journey-highlight.d.ts +2 -0
  20. package/lib/components/bracket/components/new-bracket/new-bracket.component.d.ts +7 -2
  21. package/lib/components/bracket/stories/dummy-data/ET_DUMMY_DATA_DOUBLE_SYNC.d.ts +149 -0
  22. package/lib/components/bracket/stories/dummy-data/ET_DUMMY_DATA_SINGLE.d.ts +184 -0
  23. package/lib/components/bracket/stories/dummy-data/ET_DUMMY_DATA_SWISS.d.ts +214 -0
  24. package/lib/components/bracket/stories/dummy-data/ET_DUMMY_DATE_DOUBLE_ASYNC.d.ts +149 -0
  25. package/lib/components/bracket/stories/dummy-data/FIFA_DUMMY_DATA_DOUBLE.d.ts +1640 -0
  26. package/lib/components/bracket/stories/dummy-data/FIFA_DUMMY_DATA_SINGLE.d.ts +2388 -0
  27. package/lib/components/bracket/stories/dummy-data/index.d.ts +6 -0
  28. package/lib/components/query-error/directives/query-error/query-error.directive.d.ts +1 -1
  29. package/package.json +1 -1
@@ -28,12 +28,18 @@ export const BRACKET_ROUND_MIRROR_TYPE = {
28
28
  LEFT: 'left',
29
29
  RIGHT: 'right',
30
30
  };
31
- export const generateRoundTypeFromEthleteRoundType = (type, tournamentMode) => {
31
+ export const generateRoundTypeFromEthleteRoundType = (type, tournamentMode, roundMatchCount) => {
32
32
  switch (type) {
33
33
  case 'normal':
34
34
  switch (tournamentMode) {
35
35
  case 'single-elimination':
36
- return SINGLE_ELIMINATION_BRACKET_ROUND_TYPE.SINGLE_ELIMINATION_BRACKET;
36
+ // This might break if the single elimination contains a 3rd place match + round
37
+ if (roundMatchCount === 1) {
38
+ return COMMON_BRACKET_ROUND_TYPE.FINAL;
39
+ }
40
+ else {
41
+ return SINGLE_ELIMINATION_BRACKET_ROUND_TYPE.SINGLE_ELIMINATION_BRACKET;
42
+ }
37
43
  case 'group':
38
44
  return GROUP_BRACKET_ROUND_TYPE.GROUP;
39
45
  case 'swiss':
@@ -152,13 +158,18 @@ export const generateRoundRelations = (bracketData) => {
152
158
  const hasLowerRounds = lowerRounds.length > 0;
153
159
  const lastLowerRound = lowerRounds[lowerRounds.length - 1] || null;
154
160
  for (const [currentUpperRoundIndex, currentUpperRound] of upperRounds.entries()) {
155
- const previousUpperRound = upperRounds[currentUpperRoundIndex - 1] || null;
156
- const nextUpperRound = upperRounds[currentUpperRoundIndex + 1] || null;
161
+ const isLeftToRight = currentUpperRound.mirrorRoundType === null ||
162
+ currentUpperRound.mirrorRoundType === BRACKET_ROUND_MIRROR_TYPE.LEFT;
163
+ const relativePreviousUpperRound = upperRounds[currentUpperRoundIndex - 1] || null;
164
+ const relativeNextUpperRound = upperRounds[currentUpperRoundIndex + 1] || null;
165
+ const previousUpperRound = isLeftToRight ? relativePreviousUpperRound : relativeNextUpperRound;
166
+ const nextUpperRound = isLeftToRight ? relativeNextUpperRound : relativePreviousUpperRound;
157
167
  const currentLowerRound = lowerRounds[currentUpperRoundIndex] || null;
158
168
  const previousLowerRound = lowerRounds[currentUpperRoundIndex - 1] || null;
159
169
  const nextLowerRound = lowerRounds[currentUpperRoundIndex + 1] || null;
160
- const isFirstRound = currentUpperRoundIndex === 0;
161
- const isLastUpperRound = currentUpperRoundIndex === upperRounds.length - 1;
170
+ const isLastUpperRound = !nextUpperRound ||
171
+ (nextUpperRound.mirrorRoundType === BRACKET_ROUND_MIRROR_TYPE.RIGHT &&
172
+ currentUpperRound.mirrorRoundType === null);
162
173
  const isFinal = currentUpperRound.type === COMMON_BRACKET_ROUND_TYPE.FINAL;
163
174
  if (isFinal && hasLowerRounds) {
164
175
  // two to one relation
@@ -274,7 +285,7 @@ export const generateRoundRelations = (bracketData) => {
274
285
  rootRoundMatchFactor: firstUpperRound.matchCount / currentUpperRound.matchCount,
275
286
  });
276
287
  }
277
- else if (isFirstRound) {
288
+ else if (currentUpperRound.isFirstRound) {
278
289
  // nothing to one relation
279
290
  if (!nextUpperRound)
280
291
  throw new Error('nextUpperRound is null');
@@ -339,10 +350,10 @@ export const generateMatchRelations = (bracketData, roundRelations, matchPositio
339
350
  const currentRelation = roundRelations.get(match.round.id);
340
351
  if (!currentRelation)
341
352
  throw new Error('Match round not found');
342
- const { nextUpperRoundMatchPosition, nextLowerRoundMatchPosition, previousLowerRoundMatchPosition, previousUpperRoundMatchPosition, } = generateMatchRelationPositions(currentRelation, match);
353
+ const { nextRoundMatchPosition, previousLowerRoundMatchPosition, previousUpperRoundMatchPosition } = generateMatchRelationPositions(currentRelation, match);
343
354
  switch (currentRelation.type) {
344
355
  case 'nothing-to-one': {
345
- const nextMatch = matchPositionMaps.get(currentRelation.nextRound.id)?.get(nextUpperRoundMatchPosition);
356
+ const nextMatch = matchPositionMaps.get(currentRelation.nextRound.id)?.get(nextRoundMatchPosition);
346
357
  if (!nextMatch)
347
358
  throw new Error('Next round match not found');
348
359
  // means left is nothing. right is one
@@ -391,7 +402,7 @@ export const generateMatchRelations = (bracketData, roundRelations, matchPositio
391
402
  break;
392
403
  }
393
404
  case 'one-to-one': {
394
- const nextMatch = matchPositionMaps.get(currentRelation.nextRound.id)?.get(nextUpperRoundMatchPosition);
405
+ const nextMatch = matchPositionMaps.get(currentRelation.nextRound.id)?.get(nextRoundMatchPosition);
395
406
  const previousUpperMatch = matchPositionMaps
396
407
  .get(currentRelation.previousRound.id)
397
408
  ?.get(previousUpperRoundMatchPosition);
@@ -406,12 +417,7 @@ export const generateMatchRelations = (bracketData, roundRelations, matchPositio
406
417
  throw new Error('Previous lower round match not found');
407
418
  // can be either one to one or two to one
408
419
  const isLeftOne = previousUpperRoundMatchPosition === previousLowerRoundMatchPosition;
409
- const isRightOne = nextUpperRoundMatchPosition === nextLowerRoundMatchPosition;
410
- if (currentRelation.currentRound.mirrorRoundType === BRACKET_ROUND_MIRROR_TYPE.RIGHT) {
411
- console.log(match, generateMatchRelationPositions(currentRelation, match));
412
- }
413
- // TODO: Implement one to two
414
- if (isLeftOne && isRightOne) {
420
+ if (isLeftOne) {
415
421
  // one-to-one
416
422
  matchRelations.set(match.id, {
417
423
  type: 'one-to-one',
@@ -423,7 +429,7 @@ export const generateMatchRelations = (bracketData, roundRelations, matchPositio
423
429
  nextRound: currentRelation.nextRound,
424
430
  });
425
431
  }
426
- else if (!isLeftOne) {
432
+ else {
427
433
  // two-to-one
428
434
  matchRelations.set(match.id, {
429
435
  type: 'two-to-one',
@@ -437,27 +443,10 @@ export const generateMatchRelations = (bracketData, roundRelations, matchPositio
437
443
  nextRound: currentRelation.nextRound,
438
444
  });
439
445
  }
440
- else if (!isRightOne) {
441
- const nextLowerMatch = matchPositionMaps.get(currentRelation.nextRound.id)?.get(nextLowerRoundMatchPosition);
442
- if (!nextLowerMatch)
443
- throw new Error('Next lower round match not found');
444
- // one-to-two
445
- matchRelations.set(match.id, {
446
- type: 'one-to-two',
447
- currentMatch: match,
448
- currentRound: currentRelation.currentRound,
449
- previousMatch: previousUpperMatch,
450
- previousRound: currentRelation.previousRound,
451
- nextUpperMatch: nextMatch,
452
- nextUpperRound: currentRelation.nextRound,
453
- nextLowerMatch,
454
- nextLowerRound: nextLowerMatch.round,
455
- });
456
- }
457
446
  break;
458
447
  }
459
448
  case 'two-to-one': {
460
- const nextMatch = matchPositionMaps.get(currentRelation.nextRound.id)?.get(nextUpperRoundMatchPosition);
449
+ const nextMatch = matchPositionMaps.get(currentRelation.nextRound.id)?.get(nextRoundMatchPosition);
461
450
  const previousUpperMatch = matchPositionMaps
462
451
  .get(currentRelation.previousUpperRound.id)
463
452
  ?.get(previousUpperRoundMatchPosition);
@@ -513,8 +502,7 @@ export const generateMatchRelationPositions = (currentRelation, match) => {
513
502
  switch (currentRelation.type) {
514
503
  case 'nothing-to-one': {
515
504
  return {
516
- nextUpperRoundMatchPosition: generateMatchPosition(match, currentRelation.nextRoundMatchFactor),
517
- nextLowerRoundMatchPosition: FALLBACK_MATCH_POSITION,
505
+ nextRoundMatchPosition: generateMatchPosition(match, currentRelation.nextRoundMatchFactor),
518
506
  previousUpperRoundMatchPosition: FALLBACK_MATCH_POSITION,
519
507
  previousLowerRoundMatchPosition: FALLBACK_MATCH_POSITION,
520
508
  };
@@ -523,8 +511,7 @@ export const generateMatchRelationPositions = (currentRelation, match) => {
523
511
  const previousRoundHasDoubleTheMatchCount = currentRelation.previousRoundMatchFactor === 2;
524
512
  const doubleUpperMatchCountShift = previousRoundHasDoubleTheMatchCount ? 1 : 0;
525
513
  return {
526
- nextUpperRoundMatchPosition: FALLBACK_MATCH_POSITION,
527
- nextLowerRoundMatchPosition: FALLBACK_MATCH_POSITION,
514
+ nextRoundMatchPosition: FALLBACK_MATCH_POSITION,
528
515
  previousUpperRoundMatchPosition: (generateMatchPosition(match, currentRelation.previousRoundMatchFactor) -
529
516
  doubleUpperMatchCountShift),
530
517
  previousLowerRoundMatchPosition: generateMatchPosition(match, currentRelation.previousRoundMatchFactor),
@@ -532,13 +519,9 @@ export const generateMatchRelationPositions = (currentRelation, match) => {
532
519
  }
533
520
  case 'one-to-one': {
534
521
  const previousRoundHasDoubleTheMatchCount = currentRelation.previousRoundMatchFactor === 2;
535
- const nextRoundHasDoubleTheMatchCount = currentRelation.nextRoundMatchFactor === 2;
536
522
  const doubleUpperMatchCountShift = previousRoundHasDoubleTheMatchCount ? 1 : 0;
537
- const doubleLowerMatchCountShift = nextRoundHasDoubleTheMatchCount ? 1 : 0;
538
523
  return {
539
- nextUpperRoundMatchPosition: (generateMatchPosition(match, currentRelation.nextRoundMatchFactor) -
540
- doubleLowerMatchCountShift),
541
- nextLowerRoundMatchPosition: generateMatchPosition(match, currentRelation.nextRoundMatchFactor),
524
+ nextRoundMatchPosition: generateMatchPosition(match, currentRelation.nextRoundMatchFactor),
542
525
  previousUpperRoundMatchPosition: (generateMatchPosition(match, currentRelation.previousRoundMatchFactor) -
543
526
  doubleUpperMatchCountShift),
544
527
  previousLowerRoundMatchPosition: generateMatchPosition(match, currentRelation.previousRoundMatchFactor),
@@ -546,16 +529,14 @@ export const generateMatchRelationPositions = (currentRelation, match) => {
546
529
  }
547
530
  case 'two-to-one': {
548
531
  return {
549
- nextLowerRoundMatchPosition: FALLBACK_MATCH_POSITION,
550
- nextUpperRoundMatchPosition: generateMatchPosition(match, currentRelation.nextRoundMatchFactor),
532
+ nextRoundMatchPosition: generateMatchPosition(match, currentRelation.nextRoundMatchFactor),
551
533
  previousUpperRoundMatchPosition: generateMatchPosition(match, currentRelation.previousUpperRoundMatchFactor),
552
534
  previousLowerRoundMatchPosition: generateMatchPosition(match, currentRelation.previousLowerRoundMatchFactor),
553
535
  };
554
536
  }
555
537
  case 'two-to-nothing': {
556
538
  return {
557
- nextLowerRoundMatchPosition: FALLBACK_MATCH_POSITION,
558
- nextUpperRoundMatchPosition: FALLBACK_MATCH_POSITION,
539
+ nextRoundMatchPosition: FALLBACK_MATCH_POSITION,
559
540
  previousUpperRoundMatchPosition: generateMatchPosition(match, currentRelation.previousUpperRoundMatchFactor),
560
541
  previousLowerRoundMatchPosition: generateMatchPosition(match, currentRelation.previousLowerRoundMatchFactor),
561
542
  };
@@ -601,9 +582,9 @@ export const generateMatchParticipantMap = (bracketData) => {
601
582
  let lossesTilNow = 0;
602
583
  let tiesTilNow = 0;
603
584
  for (const matchParticipantMatch of participant.matches.values()) {
604
- const isWinner = matchParticipantMatch.bracketMatch.winner === matchParticipantMatch.side;
605
- const isLooser = matchParticipantMatch.bracketMatch.winner &&
606
- matchParticipantMatch.bracketMatch.winner !== matchParticipantMatch.side;
585
+ const isWinner = matchParticipantMatch.bracketMatch.winnerSide === matchParticipantMatch.side;
586
+ const isLooser = matchParticipantMatch.bracketMatch.winnerSide &&
587
+ matchParticipantMatch.bracketMatch.winnerSide !== matchParticipantMatch.side;
607
588
  const isTie = matchParticipantMatch.bracketMatch.status === 'completed' && !matchParticipantMatch.bracketMatch.winner;
608
589
  if (isWinner) {
609
590
  winsTilNow++;
@@ -712,8 +693,8 @@ export const generateBracketRoundSwissGroupMaps = (bracketData, matchParticipant
712
693
  }
713
694
  const emptyMatchIds = [];
714
695
  for (const match of bracketRound.matches.values()) {
715
- const participantHome = match.home ? (matchParticipantMap.get(match.home) ?? null) : null;
716
- const participantAway = match.away ? (matchParticipantMap.get(match.away) ?? null) : null;
696
+ const participantHome = match.home ? (matchParticipantMap.get(match.home.id) ?? null) : null;
697
+ const participantAway = match.away ? (matchParticipantMap.get(match.away.id) ?? null) : null;
717
698
  const anyParticipant = participantHome || participantAway;
718
699
  if (!anyParticipant) {
719
700
  emptyMatchIds.push(match.id);
@@ -760,7 +741,7 @@ export const generateBracketDataForEthlete = (source) => {
760
741
  if (bracketData.rounds.some((r) => r.id === currentItem.round.id)) {
761
742
  throw new Error(`Round with id ${currentItem.round.id} already exists in the bracket data.`);
762
743
  }
763
- const roundType = generateRoundTypeFromEthleteRoundType(currentItem.round.type, tournamentMode);
744
+ const roundType = generateRoundTypeFromEthleteRoundType(currentItem.round.type, tournamentMode, currentItem.matches.length);
764
745
  const bracketRound = {
765
746
  type: roundType,
766
747
  id: currentItem.round.id,
@@ -788,39 +769,46 @@ export const generateBracketDataForEthlete = (source) => {
788
769
  };
789
770
  const generateAndSetBracketMatchWithParticipants = (match, options) => {
790
771
  const matchId = match.id;
791
- const { bracketData, bracketRound, currentIndexInRound } = options;
772
+ const { bracketData, bracketRound, currentIndexInRound, participantCounter } = options;
773
+ let localParticipantCounter = participantCounter;
792
774
  const bracketMatch = {
793
775
  id: matchId,
794
776
  indexInRound: currentIndexInRound,
795
777
  position: (currentIndexInRound + 1),
796
778
  data: match.data,
797
779
  round: bracketRound,
798
- home: match.home,
799
- away: match.away,
800
- winner: match.winner,
780
+ home: null,
781
+ away: null,
801
782
  status: match.status,
783
+ winnerSide: match.winner,
784
+ winner: null,
802
785
  };
803
786
  bracketData.matches.set(matchId, bracketMatch);
804
787
  bracketRound.matches.set(matchId, bracketMatch);
805
- const participants = [bracketMatch.home, bracketMatch.away];
806
- for (const [participantIndex, participant] of participants.entries()) {
807
- if (!participant)
788
+ const participantIds = [match.home, match.away];
789
+ for (const [participantIndex, participantId] of participantIds.entries()) {
790
+ if (!participantId)
808
791
  continue;
809
- const side = participantIndex === 0 ? 'Homeside' : 'Awayside';
810
- if (!bracketData.participants.has(participant)) {
811
- bracketData.participants.set(participant, {
812
- id: participant,
792
+ const side = participantIndex === 0 ? 'home' : 'away';
793
+ if (!bracketData.participants.has(participantId)) {
794
+ bracketData.participants.set(participantId, {
795
+ id: participantId,
796
+ shortId: `p${localParticipantCounter++}`,
813
797
  name: `${side} ${currentIndexInRound}`,
814
798
  matches: new Map(),
815
799
  });
816
800
  }
817
- const participantData = bracketData.participants.get(participant);
801
+ const participantData = bracketData.participants.get(participantId);
818
802
  if (!participantData.matches.has(bracketMatch.id)) {
819
803
  participantData.matches.set(bracketMatch.id, {
820
- side: bracketMatch.home === participant ? 'home' : 'away',
804
+ side: match.home === participantId ? 'home' : 'away',
821
805
  bracketMatch,
822
806
  });
823
807
  }
808
+ bracketMatch[side] = participantData;
809
+ if (bracketMatch.winnerSide === side) {
810
+ bracketMatch.winner = participantData;
811
+ }
824
812
  }
825
813
  return bracketMatch;
826
814
  };
@@ -840,11 +828,12 @@ export const generateBracketData = (source, options) => {
840
828
  let currentUpperBracketIndex = 0;
841
829
  let currentLowerBracketIndex = 0;
842
830
  const splitRoundsRest = [];
843
- for (const round of source.rounds) {
831
+ for (const [roundIndex, round] of source.rounds.entries()) {
844
832
  const isLowerBracket = round.type === DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.LOWER_BRACKET;
845
833
  const matches = source.matches.filter((m) => m.roundId === round.id);
846
834
  const roundId = round.id;
847
835
  const shouldSplitRound = shouldSplitRoundsInTwo && matches.length % 2 === 0;
836
+ const isFirstRound = roundIndex === 0;
848
837
  if (shouldSplitRound) {
849
838
  const firstHalfMatchesMaxIndex = matches.length / 2 - 1;
850
839
  const firstHalfRoundId = `${roundId}--half-1`;
@@ -859,6 +848,7 @@ export const generateBracketData = (source, options) => {
859
848
  matchCount: matches.length / 2,
860
849
  matches: new Map(),
861
850
  mirrorRoundType: BRACKET_ROUND_MIRROR_TYPE.LEFT,
851
+ isFirstRound,
862
852
  };
863
853
  const bracketRoundSecondHalf = {
864
854
  type: round.type,
@@ -870,6 +860,7 @@ export const generateBracketData = (source, options) => {
870
860
  matchCount: matches.length / 2,
871
861
  matches: new Map(),
872
862
  mirrorRoundType: BRACKET_ROUND_MIRROR_TYPE.RIGHT,
863
+ isFirstRound,
873
864
  };
874
865
  bracketData.roundIds.push(firstHalfRoundId);
875
866
  bracketData.rounds.set(firstHalfRoundId, bracketRoundFirstHalf);
@@ -879,15 +870,20 @@ export const generateBracketData = (source, options) => {
879
870
  const matchSecond = matches[firstHalfMatchesMaxIndex + 1 + index];
880
871
  if (!matchFirst || !matchSecond)
881
872
  throw new Error('Match not found');
873
+ const participantCounter = bracketData.participants.size;
882
874
  const bracketMatchFirst = generateAndSetBracketMatchWithParticipants(matchFirst, {
883
875
  bracketData,
884
876
  bracketRound: bracketRoundFirstHalf,
885
877
  currentIndexInRound: index,
878
+ participantCounter,
886
879
  });
880
+ // The participant counter might have changed after the first half
881
+ const updatedParticipantCounter = bracketData.participants.size;
887
882
  const bracketMatchSecond = generateAndSetBracketMatchWithParticipants(matchSecond, {
888
883
  bracketData,
889
884
  bracketRound: bracketRoundSecondHalf,
890
885
  currentIndexInRound: index,
886
+ participantCounter: updatedParticipantCounter,
891
887
  });
892
888
  bracketData.matchIds.push(bracketMatchFirst.id, bracketMatchSecond.id);
893
889
  }
@@ -903,15 +899,18 @@ export const generateBracketData = (source, options) => {
903
899
  matchCount: matches.length,
904
900
  matches: new Map(),
905
901
  mirrorRoundType: null,
902
+ isFirstRound,
906
903
  };
907
904
  bracketData.roundIds.push(roundId);
908
905
  bracketData.rounds.set(roundId, bracketRound);
909
906
  let currentIndexInRound = 0;
910
907
  for (const match of matches) {
908
+ const participantCounter = bracketData.participants.size;
911
909
  const bracketMatch = generateAndSetBracketMatchWithParticipants(match, {
912
910
  bracketData,
913
911
  bracketRound,
914
912
  currentIndexInRound,
913
+ participantCounter,
915
914
  });
916
915
  bracketData.matchIds.push(bracketMatch.id);
917
916
  currentIndexInRound++;
@@ -940,4 +939,106 @@ export const generateBracketData = (source, options) => {
940
939
  }
941
940
  return bracketData;
942
941
  };
943
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhY2tldC1uZXcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvYnJhY2tldC9jb21wb25lbnRzL25ldy1icmFja2V0L2JyYWNrZXQtbmV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWtCQSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQXlCLENBQUM7QUFFbEUsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHO0lBQzdCLGtCQUFrQixFQUFFLG9CQUFvQjtJQUN4QyxrQkFBa0IsRUFBRSxvQkFBb0I7SUFDeEMsS0FBSyxFQUFFLE9BQU87SUFDZCxLQUFLLEVBQUUsT0FBTztJQUNkLHNCQUFzQixFQUFFLHdCQUF3QjtDQUN4QyxDQUFDO0FBSVgsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUc7SUFDdkMsV0FBVyxFQUFFLGFBQWE7SUFDMUIsS0FBSyxFQUFFLE9BQU87Q0FDTixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0scUNBQXFDLEdBQUc7SUFDbkQsMEJBQTBCLEVBQUUsNEJBQTRCO0NBQ2hELENBQUM7QUFFWCxNQUFNLENBQUMsTUFBTSxxQ0FBcUMsR0FBRztJQUNuRCxhQUFhLEVBQUUsZUFBZTtJQUM5QixhQUFhLEVBQUUsZUFBZTtJQUM5QixhQUFhLEVBQUUsZUFBZTtDQUN0QixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUc7SUFDdEMsS0FBSyxFQUFFLE9BQU87Q0FDTixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUc7SUFDdEMsS0FBSyxFQUFFLE9BQU87Q0FDTixDQUFDO0FBeUJYLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHO0lBQ3ZDLElBQUksRUFBRSxNQUFNO0lBQ1osS0FBSyxFQUFFLE9BQU87Q0FDTixDQUFDO0FBeVJYLE1BQU0sQ0FBQyxNQUFNLHFDQUFxQyxHQUFHLENB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Y2hMaXN0Vmlld1VuaW9uLFxuICBPcHBvbmVudFNpZGUsXG4gIFJvdW5kU3RhZ2VTdHJ1Y3R1cmVWaWV3LFxuICBSb3VuZFN0YWdlU3RydWN0dXJlV2l0aE1hdGNoZXNWaWV3LFxuICBSb3VuZFR5cGUsXG59IGZyb20gJ0BldGhsZXRlL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kSWQgPSBzdHJpbmcgJiB7IF9fYnJhbmQ6ICdCcmFja2V0Um91bmRJZCcgfTtcbmV4cG9ydCB0eXBlIEJyYWNrZXRNYXRjaElkID0gc3RyaW5nICYgeyBfX2JyYW5kOiAnQnJhY2tldE1hdGNoSWQnIH07XG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmRQb3NpdGlvbiA9IG51bWJlciAmIHsgX19icmFuZDogJ0JyYWNrZXRSb3VuZFBvc2l0aW9uJyB9O1xuZXhwb3J0IHR5cGUgQnJhY2tldE1hdGNoUG9zaXRpb24gPSBudW1iZXIgJiB7IF9fYnJhbmQ6ICdCcmFja2V0TWF0Y2hQb3NpdGlvbicgfTtcbmV4cG9ydCB0eXBlIE1hdGNoUGFydGljaXBhbnRJZCA9IHN0cmluZyAmIHsgX19icmFuZDogJ01hdGNoUGFydGljaXBhbnRJZCcgfTtcbmV4cG9ydCB0eXBlIEJyYWNrZXRSb3VuZFN3aXNzR3JvdXBJZCA9IHN0cmluZyAmIHsgX19icmFuZDogJ0JyYWNrZXRSb3VuZFN3aXNzR3JvdXBJZCcgfTtcblxuLy8gV2lsbCB1c3VhbGx5IGJlIDAuNSwgMSBvciAyLiBJbiBTd2lzcyB0aGlzIHZhbHVlIHdpbGwgYmUgZ2liYmVyaXNoXG5leHBvcnQgdHlwZSBNYXRjaEZhY3RvciA9IG51bWJlcjtcblxuZXhwb3J0IGNvbnN0IEZBTExCQUNLX01BVENIX1BPU0lUSU9OID0gLTEgYXMgQnJhY2tldE1hdGNoUG9zaXRpb247XG5cbmV4cG9ydCBjb25zdCBUT1VSTkFNRU5UX01PREUgPSB7XG4gIFNJTkdMRV9FTElNSU5BVElPTjogJ3NpbmdsZS1lbGltaW5hdGlvbicsXG4gIERPVUJMRV9FTElNSU5BVElPTjogJ2RvdWJsZS1lbGltaW5hdGlvbicsXG4gIEdST1VQOiAnZ3JvdXAnLFxuICBTV0lTUzogJ3N3aXNzJyxcbiAgU1dJU1NfV0lUSF9FTElNSU5BVElPTjogJ3N3aXNzLXdpdGgtZWxpbWluYXRpb24nLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVG91cm5hbWVudE1vZGUgPSAodHlwZW9mIFRPVVJOQU1FTlRfTU9ERSlba2V5b2YgdHlwZW9mIFRPVVJOQU1FTlRfTU9ERV07XG5cbmV4cG9ydCBjb25zdCBDT01NT05fQlJBQ0tFVF9ST1VORF9UWVBFID0ge1xuICBUSElSRF9QTEFDRTogJ3RoaXJkLXBsYWNlJyxcbiAgRklOQUw6ICdmaW5hbCcsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgU0lOR0xFX0VMSU1JTkFUSU9OX0JSQUNLRVRfUk9VTkRfVFlQRSA9IHtcbiAgU0lOR0xFX0VMSU1JTkFUSU9OX0JSQUNLRVQ6ICdzaW5nbGUtZWxpbWluYXRpb24tYnJhY2tldCcsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgRE9VQkxFX0VMSU1JTkFUSU9OX0JSQUNLRVRfUk9VTkRfVFlQRSA9IHtcbiAgVVBQRVJfQlJBQ0tFVDogJ3VwcGVyLWJyYWNrZXQnLFxuICBMT1dFUl9CUkFDS0VUOiAnbG93ZXItYnJhY2tldCcsXG4gIFJFVkVSU0VfRklOQUw6ICdyZXZlcnNlLWZpbmFsJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBTV0lTU19CUkFDS0VUX1JPVU5EX1RZUEUgPSB7XG4gIFNXSVNTOiAnc3dpc3MnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IEdST1VQX0JSQUNLRVRfUk9VTkRfVFlQRSA9IHtcbiAgR1JPVVA6ICdncm91cCcsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBDb21tb25CcmFja2V0Um91bmRUeXBlID0gKHR5cGVvZiBDT01NT05fQlJBQ0tFVF9ST1VORF9UWVBFKVtrZXlvZiB0eXBlb2YgQ09NTU9OX0JSQUNLRVRfUk9VTkRfVFlQRV07XG5leHBvcnQgdHlwZSBTaW5nbGVFbGltaW5hdGlvbkJyYWNrZXRSb3VuZFR5cGUgPVxuICB8IENvbW1vbkJyYWNrZXRSb3VuZFR5cGVcbiAgfCAodHlwZW9mIFNJTkdMRV9FTElNSU5BVElPTl9CUkFDS0VUX1JPVU5EX1RZUEUpW2tleW9mIHR5cGVvZiBTSU5HTEVfRUxJTUlOQVRJT05fQlJBQ0tFVF9ST1VORF9UWVBFXTtcbmV4cG9ydCB0eXBlIERvdWJsZUVsaW1pbmF0aW9uQnJhY2tldFJvdW5kVHlwZSA9XG4gIHwgQ29tbW9uQnJhY2tldFJvdW5kVHlwZVxuICB8ICh0eXBlb2YgRE9VQkxFX0VMSU1JTkFUSU9OX0JSQUNLRVRfUk9VTkRfVFlQRSlba2V5b2YgdHlwZW9mIERPVUJMRV9FTElNSU5BVElPTl9CUkFDS0VUX1JPVU5EX1RZUEVdO1xuZXhwb3J0IHR5cGUgU3dpc3NCcmFja2V0Um91bmRUeXBlID0gKHR5cGVvZiBTV0lTU19CUkFDS0VUX1JPVU5EX1RZUEUpW2tleW9mIHR5cGVvZiBTV0lTU19CUkFDS0VUX1JPVU5EX1RZUEVdO1xuZXhwb3J0IHR5cGUgR3JvdXBCcmFja2V0Um91bmRUeXBlID0gKHR5cGVvZiBHUk9VUF9CUkFDS0VUX1JPVU5EX1RZUEUpW2tleW9mIHR5cGVvZiBHUk9VUF9CUkFDS0VUX1JPVU5EX1RZUEVdO1xuXG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmRUeXBlID1cbiAgfCBTaW5nbGVFbGltaW5hdGlvbkJyYWNrZXRSb3VuZFR5cGVcbiAgfCBEb3VibGVFbGltaW5hdGlvbkJyYWNrZXRSb3VuZFR5cGVcbiAgfCBTd2lzc0JyYWNrZXRSb3VuZFR5cGVcbiAgfCBHcm91cEJyYWNrZXRSb3VuZFR5cGU7XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRSb3VuZFNvdXJjZTxUUm91bmREYXRhPiA9IHtcbiAgdHlwZTogQnJhY2tldFJvdW5kVHlwZTtcbiAgaWQ6IHN0cmluZztcbiAgZGF0YTogVFJvdW5kRGF0YTtcbiAgbmFtZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IEJSQUNLRVRfUk9VTkRfTUlSUk9SX1RZUEUgPSB7XG4gIExFRlQ6ICdsZWZ0JyxcbiAgUklHSFQ6ICdyaWdodCcsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmRNaXJyb3JUeXBlID0gKHR5cGVvZiBCUkFDS0VUX1JPVU5EX01JUlJPUl9UWVBFKVtrZXlvZiB0eXBlb2YgQlJBQ0tFVF9ST1VORF9NSVJST1JfVFlQRV07XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgLy8gTk9URTogVGhpcyBpcyB0aGUgbG9naWNhbCBpbmRleCBpbnNpZGUgdGhlIGJyYWNrZXQuXG4gIC8vIEluIGEgZG91YmxlIGVsaW1pbmF0aW9uIGJyYWNrZXQsIHRoZSBmaXJzdCByb3VuZCBvZiB0aGUgbG93ZXIgYnJhY2tldCB3aWxsIGhhdmUgdGhlIHNhbWUgaW5kZXggYXMgdGhlIGZpbmFsIHJvdW5kIG9mIHRoZSB1cHBlciBicmFja2V0XG4gIGluZGV4OiBudW1iZXI7XG4gIHR5cGU6IEJyYWNrZXRSb3VuZFR5cGU7XG4gIGlkOiBCcmFja2V0Um91bmRJZDtcbiAgZGF0YTogVFJvdW5kRGF0YTtcbiAgcG9zaXRpb246IEJyYWNrZXRSb3VuZFBvc2l0aW9uO1xuICBuYW1lOiBzdHJpbmc7XG4gIG1hdGNoQ291bnQ6IG51bWJlcjtcbiAgbWF0Y2hlczogQnJhY2tldE1hdGNoTWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBtaXJyb3JSb3VuZFR5cGU6IEJyYWNrZXRSb3VuZE1pcnJvclR5cGUgfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgQnJhY2tldE1hdGNoU3RhdHVzID0gJ2NvbXBsZXRlZCcgfCAncGVuZGluZyc7XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgZGF0YTogVE1hdGNoRGF0YTtcbiAgaW5kZXhJblJvdW5kOiBudW1iZXI7XG4gIGlkOiBCcmFja2V0TWF0Y2hJZDtcbiAgcm91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcG9zaXRpb246IEJyYWNrZXRNYXRjaFBvc2l0aW9uO1xuICBob21lOiBNYXRjaFBhcnRpY2lwYW50SWQgfCBudWxsO1xuICBhd2F5OiBNYXRjaFBhcnRpY2lwYW50SWQgfCBudWxsO1xuICB3aW5uZXI6IE9wcG9uZW50U2lkZSB8IG51bGw7XG4gIHN0YXR1czogQnJhY2tldE1hdGNoU3RhdHVzO1xufTtcblxuZXhwb3J0IHR5cGUgQnJhY2tldE1hdGNoU291cmNlPFRNYXRjaERhdGE+ID0ge1xuICBkYXRhOiBUTWF0Y2hEYXRhO1xuICBpZDogc3RyaW5nO1xuICByb3VuZElkOiBzdHJpbmc7XG4gIGhvbWU6IHN0cmluZyB8IG51bGw7XG4gIGF3YXk6IHN0cmluZyB8IG51bGw7XG4gIHdpbm5lcjogT3Bwb25lbnRTaWRlIHwgbnVsbDtcbiAgc3RhdHVzOiBCcmFja2V0TWF0Y2hTdGF0dXM7XG59O1xuXG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmRNYXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSBNYXA8QnJhY2tldFJvdW5kSWQsIEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPj47XG5leHBvcnQgdHlwZSBCcmFja2V0TWF0Y2hNYXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSBNYXA8QnJhY2tldE1hdGNoSWQsIEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPj47XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXREYXRhPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICByb3VuZHM6IEJyYWNrZXRSb3VuZE1hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcm91bmRJZHM6IEJyYWNrZXRSb3VuZElkW107XG4gIG1hdGNoZXM6IEJyYWNrZXRNYXRjaE1hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgbWF0Y2hJZHM6IEJyYWNrZXRNYXRjaElkW107XG4gIHBhcnRpY2lwYW50czogQnJhY2tldFBhcnRpY2lwYW50TWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBtb2RlOiBUb3VybmFtZW50TW9kZTtcbn07XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXREYXRhU291cmNlPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICByb3VuZHM6IEJyYWNrZXRSb3VuZFNvdXJjZTxUUm91bmREYXRhPltdO1xuICBtYXRjaGVzOiBCcmFja2V0TWF0Y2hTb3VyY2U8VE1hdGNoRGF0YT5bXTtcbiAgbW9kZTogVG91cm5hbWVudE1vZGU7XG59O1xuXG5leHBvcnQgdHlwZSBBbnlCcmFja2V0RGF0YSA9IEJyYWNrZXREYXRhPHVua25vd24sIHVua25vd24+O1xuXG4vLyBPbmUgbWF0Y2ggaGFzIG9uZSBwcmV2aW91cyBtYXRjaCBhbmQgb25lIG5leHQgbWF0Y2ggKHRoaXMgd291bGQgYmUgdGhlIGNhc2UsIGlmIGEgZ3JvdXAgdG91cm5hbWVudCBpcyBiZWluZyBkaXNwbGF5ZWQgdmlhIGEgYnJhY2tldClcbmV4cG9ydCB0eXBlIEJyYWNrZXRNYXRjaFJlbGF0aW9uT25lVG9PbmU8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gIHR5cGU6ICdvbmUtdG8tb25lJztcbiAgY3VycmVudE1hdGNoOiBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIGN1cnJlbnRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c01hdGNoOiBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzUm91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgbmV4dE1hdGNoOiBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIG5leHRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xufTtcblxuLy8gVGhlIG1hdGNoIGhhcyBubyBwcmV2aW91cyBtYXRjaCBidXQgYSBzaW5nbGUgbmV4dCBtYXRjaCAoZWcuIHRoZSBzdGFydCBvZiB0aGUgYnJhY2tldClcbmV4cG9ydCB0eXBlIEJyYWNrZXRNYXRjaFJlbGF0aW9uTm90aGluZ1RvT25lPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICB0eXBlOiAnbm90aGluZy10by1vbmUnO1xuICBjdXJyZW50TWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgY3VycmVudFJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIG5leHRNYXRjaDogQnJhY2tldE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBuZXh0Um91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbn07XG5cbi8vIFRoZSBtYXRjaCBoYXMgbm8gbmV4dCBtYXRjaCBidXQgYSBzaW5nbGUgcHJldmlvdXMgbWF0Y2ggKGVnLiByZXZlcnNlIGZpbmFscylcbmV4cG9ydCB0eXBlIEJyYWNrZXRNYXRjaFJlbGF0aW9uT25lVG9Ob3RoaW5nPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICB0eXBlOiAnb25lLXRvLW5vdGhpbmcnO1xuICBjdXJyZW50TWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgY3VycmVudFJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzTWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xufTtcblxuLy8gVGhlIG1hdGNoIGhhcyB0d28gcHJldmlvdXMgbWF0Y2hlcyBhbmQgb25lIG5leHQgbWF0Y2ggKGVnLiBhIG5vcm1hbCBtYXRjaCBpbiB0aGUgYnJhY2tldCB0aGF0IGlzIG5laXRoZXIgdGhlIHN0YXJ0IG5vciB0aGUgZW5kKVxuZXhwb3J0IHR5cGUgQnJhY2tldE1hdGNoUmVsYXRpb25Ud29Ub09uZTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgdHlwZTogJ3R3by10by1vbmUnO1xuICBjdXJyZW50TWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgY3VycmVudFJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzVXBwZXJNYXRjaDogQnJhY2tldE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c1VwcGVyUm91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNMb3dlck1hdGNoOiBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzTG93ZXJSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBuZXh0TWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgbmV4dFJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG59O1xuXG4vLyBUaGUgbWF0Y2ggaGFzIHR3byBwcmV2aW91cyBtYXRjaGVzIGFuZCBvbmUgbmV4dCBtYXRjaCAodGhlIHJvbGVzIGFyZSByZXZlcnNlZCBoZXJlLiBUaGlzIGhhcHBlbnMgaWYgdGhlIGJyYWNrZXQgZ2V0cyBzcGxpdC9taXJyb3JlZClcbmV4cG9ydCB0eXBlIEJyYWNrZXRNYXRjaFJlbGF0aW9uT25lVG9Ud288VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gIHR5cGU6ICdvbmUtdG8tdHdvJztcbiAgY3VycmVudE1hdGNoOiBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIGN1cnJlbnRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c01hdGNoOiBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzUm91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgbmV4dFVwcGVyTWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgbmV4dFVwcGVyUm91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgbmV4dExvd2VyTWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgbmV4dExvd2VyUm91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbn07XG5cbi8vIFRoZSBtYXRjaCBoYXMgdHdvIHByZXZpb3VzIG1hdGNoZXMgYW5kIG5vIG5leHQgbWF0Y2ggKGVnLiB0aGUgZmluYWxzIGluIGEgc2luZ2xlIGVsaW1pbmF0aW9uIGJyYWNrZXQpXG5leHBvcnQgdHlwZSBCcmFja2V0TWF0Y2hSZWxhdGlvblR3b1RvTm90aGluZzxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgdHlwZTogJ3R3by10by1ub3RoaW5nJztcbiAgY3VycmVudE1hdGNoOiBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIGN1cnJlbnRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c1VwcGVyTWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNVcHBlclJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzTG93ZXJNYXRjaDogQnJhY2tldE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c0xvd2VyUm91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbn07XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRNYXRjaFJlbGF0aW9uPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID1cbiAgfCBCcmFja2V0TWF0Y2hSZWxhdGlvbk9uZVRvT25lPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+XG4gIHwgQnJhY2tldE1hdGNoUmVsYXRpb25Ud29Ub09uZTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPlxuICB8IEJyYWNrZXRNYXRjaFJlbGF0aW9uT25lVG9Ud288VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT5cbiAgfCBCcmFja2V0TWF0Y2hSZWxhdGlvbk5vdGhpbmdUb09uZTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPlxuICB8IEJyYWNrZXRNYXRjaFJlbGF0aW9uT25lVG9Ob3RoaW5nPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+XG4gIHwgQnJhY2tldE1hdGNoUmVsYXRpb25Ud29Ub05vdGhpbmc8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRNYXRjaFJlbGF0aW9uc01hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IE1hcDxcbiAgQnJhY2tldE1hdGNoSWQsXG4gIEJyYWNrZXRNYXRjaFJlbGF0aW9uPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+XG4+O1xuXG4vLyBPbmUgcm91bmQgaGFzIG9uZSBuZXh0IHJvdW5kICh0aGUgZmlyc3Qgcm91bmQgb2YgdGhlIGJyYWNrZXQpXG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmRSZWxhdGlvbk5vdGhpbmdUb09uZTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgdHlwZTogJ25vdGhpbmctdG8tb25lJztcbiAgY3VycmVudFJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIG5leHRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBuZXh0Um91bmRNYXRjaEZhY3RvcjogbnVtYmVyO1xufTtcblxuLy8gT25lIHJvdW5kIGhhcyBvbmUgcHJldmlvdXMgcm91bmQgKGVnLiB0aGUgZmluYWxzIHJvdW5kIG9mIHRoZSBicmFja2V0IGluIGNhc2Ugb2YgYSBzaW5nbGUgZWxpbWluYXRpb24gYnJhY2tldClcbmV4cG9ydCB0eXBlIEJyYWNrZXRSb3VuZFJlbGF0aW9uT25lVG9Ob3RoaW5nPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICB0eXBlOiAnb25lLXRvLW5vdGhpbmcnO1xuICBjdXJyZW50Um91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3I6IG51bWJlcjtcbiAgcm9vdFJvdW5kTWF0Y2hGYWN0b3I6IG51bWJlcjtcbn07XG5cbi8vIE9uZSByb3VuZCBoYXMgb25lIHByZXZpb3VzIHJvdW5kIGFuZCBvbmUgbmV4dCByb3VuZCAoZWcuIGEgbm9ybWFsIHJvdW5kIGluIHRoZSBicmFja2V0IHRoYXQgaXMgbmVpdGhlciB0aGUgc3RhcnQgbm9yIHRoZSBlbmQpXG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmRSZWxhdGlvbk9uZVRvT25lPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICB0eXBlOiAnb25lLXRvLW9uZSc7XG4gIGN1cnJlbnRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c1JvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIG5leHRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBuZXh0Um91bmRNYXRjaEZhY3RvcjogbnVtYmVyO1xuICBwcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3I6IG51bWJlcjtcbiAgcm9vdFJvdW5kTWF0Y2hGYWN0b3I6IG51bWJlcjtcbn07XG5cbi8vIE9uZSByb3VuZCBoYXMgdHdvIHByZXZpb3VzIHJvdW5kcyBhbmQgb25lIG5leHQgcm91bmQgKGVnLiB0aGUgZmluYWxzIHJvdW5kIGluIGEgZG91YmxlIGVsaW1pbmF0aW9uIGJyYWNrZXQgd2hlbiB0aGUgcmV2ZXJzZSBmaW5hbHMgaXMgYWxzbyBiZWluZyBwbGF5ZWQpXG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmRSZWxhdGlvblR3b1RvT25lPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICB0eXBlOiAndHdvLXRvLW9uZSc7XG4gIGN1cnJlbnRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c1VwcGVyUm91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNMb3dlclJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIG5leHRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBuZXh0Um91bmRNYXRjaEZhY3RvcjogbnVtYmVyO1xuICBwcmV2aW91c1VwcGVyUm91bmRNYXRjaEZhY3RvcjogbnVtYmVyO1xuICBwcmV2aW91c0xvd2VyUm91bmRNYXRjaEZhY3RvcjogbnVtYmVyO1xuICB1cHBlclJvb3RSb3VuZE1hdGNoRmFjdG9yOiBudW1iZXI7XG4gIGxvd2VyUm9vdFJvdW5kTWF0Y2hGYWN0b3I6IG51bWJlcjtcbn07XG5cbi8vIE9uZSByb3VuZCBoYXMgdHdvIHByZXZpb3VzIHJvdW5kcyBhbmQgbm8gbmV4dCByb3VuZCAoZWcuIHRoZSBmaW5hbHMgcm91bmQgaW4gYSBkb3VibGUgZWxpbWluYXRpb24gYnJhY2tldCB3aGVuIHRoZSByZXZlcnNlIGZpbmFscyBpcyBub3QgYmVpbmcgcGxheWVkKVxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kUmVsYXRpb25Ud29Ub05vdGhpbmc8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gIHR5cGU6ICd0d28tdG8tbm90aGluZyc7XG4gIGN1cnJlbnRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c1VwcGVyUm91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNMb3dlclJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzVXBwZXJSb3VuZE1hdGNoRmFjdG9yOiBudW1iZXI7XG4gIHByZXZpb3VzTG93ZXJSb3VuZE1hdGNoRmFjdG9yOiBudW1iZXI7XG4gIHVwcGVyUm9vdFJvdW5kTWF0Y2hGYWN0b3I6IG51bWJlcjtcbiAgbG93ZXJSb290Um91bmRNYXRjaEZhY3RvcjogbnVtYmVyO1xufTtcblxuLy8gVE9ETzogQWRkIG9uZSB0byB0d28gdG8gc3VwcG9ydCBzcGxpdCBkb3VibGUgZWxpbWluYXRpb24gYnJhY2tldHNcbmV4cG9ydCB0eXBlIEJyYWNrZXRSb3VuZFJlbGF0aW9uPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID1cbiAgfCBCcmFja2V0Um91bmRSZWxhdGlvbk5vdGhpbmdUb09uZTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPlxuICB8IEJyYWNrZXRSb3VuZFJlbGF0aW9uT25lVG9Ob3RoaW5nPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+XG4gIHwgQnJhY2tldFJvdW5kUmVsYXRpb25PbmVUb09uZTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPlxuICB8IEJyYWNrZXRSb3VuZFJlbGF0aW9uVHdvVG9PbmU8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT5cbiAgfCBCcmFja2V0Um91bmRSZWxhdGlvblR3b1RvTm90aGluZzxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcblxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kUmVsYXRpb25zPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0gTWFwPFxuICBCcmFja2V0Um91bmRJZCxcbiAgQnJhY2tldFJvdW5kUmVsYXRpb248VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT5cbj47XG5cbmV4cG9ydCB0eXBlIE1hdGNoUG9zaXRpb25NYXBzPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0gTWFwPFxuICBCcmFja2V0Um91bmRJZCxcbiAgTWFwPEJyYWNrZXRNYXRjaFBvc2l0aW9uLCBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4+XG4+O1xuXG5leHBvcnQgdHlwZSBQYXJ0aWNpcGFudE1hdGNoUmVzdWx0ID0gJ3dpbicgfCAnbG9zcycgfCAndGllJztcbmV4cG9ydCB0eXBlIFBhcnRpY2lwYW50TWF0Y2hUeXBlID0gQnJhY2tldFJvdW5kVHlwZTtcblxuZXhwb3J0IHR5cGUgTWF0Y2hQYXJ0aWNpcGFudE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICBicmFja2V0TWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcmVzdWx0OiBQYXJ0aWNpcGFudE1hdGNoUmVzdWx0IHwgbnVsbDtcbiAgaXNFbGltaW5hdGVkOiBib29sZWFuO1xuICBpc0VsaW1pbmF0aW9uTWF0Y2g6IGJvb2xlYW47XG4gIGlzRmlyc3RSb3VuZDogYm9vbGVhbjtcbiAgaXNMYXN0Um91bmQ6IGJvb2xlYW47XG4gIHRpZUNvdW50OiBudW1iZXI7XG4gIHdpbkNvdW50OiBudW1iZXI7XG4gIGxvc3NDb3VudDogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTWF0Y2hQYXJ0aWNpcGFudDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgaWQ6IE1hdGNoUGFydGljaXBhbnRJZDtcbiAgbmFtZTogc3RyaW5nO1xuICBtYXRjaGVzOiBNYXA8QnJhY2tldE1hdGNoSWQsIE1hdGNoUGFydGljaXBhbnRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPj47XG59O1xuXG5leHBvcnQgdHlwZSBCcmFja2V0UGFydGljaXBhbnRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgc2lkZTogT3Bwb25lbnRTaWRlO1xuICBicmFja2V0TWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbn07XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRQYXJ0aWNpcGFudDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgaWQ6IE1hdGNoUGFydGljaXBhbnRJZDtcbiAgbmFtZTogc3RyaW5nO1xuICBtYXRjaGVzOiBNYXA8QnJhY2tldE1hdGNoSWQsIEJyYWNrZXRQYXJ0aWNpcGFudE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+Pjtcbn07XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRQYXJ0aWNpcGFudE1hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IE1hcDxcbiAgTWF0Y2hQYXJ0aWNpcGFudElkLFxuICBCcmFja2V0UGFydGljaXBhbnQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT5cbj47XG5cbmV4cG9ydCB0eXBlIE1hdGNoUGFydGljaXBhbnRNYXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSBNYXA8XG4gIE1hdGNoUGFydGljaXBhbnRJZCxcbiAgTWF0Y2hQYXJ0aWNpcGFudDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPlxuPjtcblxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kU3dpc3NHcm91cDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgaWQ6IEJyYWNrZXRSb3VuZFN3aXNzR3JvdXBJZDtcbiAgbmFtZTogc3RyaW5nO1xuICBtYXRjaGVzOiBCcmFja2V0TWF0Y2hNYXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIGFsbG93ZWRNYXRjaENvdW50OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmRTd2lzc0dyb3VwTWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0gTWFwPFxuICBCcmFja2V0Um91bmRTd2lzc0dyb3VwSWQsXG4gIEJyYWNrZXRSb3VuZFN3aXNzR3JvdXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT5cbj47XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRSb3VuZFN3aXNzRGF0YTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgZ3JvdXBzOiBCcmFja2V0Um91bmRTd2lzc0dyb3VwTWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xufTtcblxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kTWFwV2l0aFN3aXNzRGF0YTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IE1hcDxcbiAgQnJhY2tldFJvdW5kSWQsXG4gIEJyYWNrZXRSb3VuZFN3aXNzRGF0YTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPlxuPjtcblxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kVHlwZU1hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IE1hcDxcbiAgQnJhY2tldFJvdW5kVHlwZSxcbiAgQnJhY2tldFJvdW5kTWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+XG4+O1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVSb3VuZFR5cGVGcm9tRXRobGV0ZVJvdW5kVHlwZSA9IChcbiAgdHlwZTogUm91bmRUeXBlLFxuICB0b3VybmFtZW50TW9kZTogVG91cm5hbWVudE1vZGUsXG4pOiBCcmFja2V0Um91bmRUeXBlID0+IHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnbm9ybWFsJzpcbiAgICAgIHN3aXRjaCAodG91cm5hbWVudE1vZGUpIHtcbiAgICAgICAgY2FzZSAnc2luZ2xlLWVsaW1pbmF0aW9uJzpcbiAgICAgICAgICByZXR1cm4gU0lOR0xFX0VMSU1JTkFUSU9OX0JSQUNLRVRfUk9VTkRfVFlQRS5TSU5HTEVfRUxJTUlOQVRJT05fQlJBQ0tFVDtcbiAgICAgICAgY2FzZSAnZ3JvdXAnOlxuICAgICAgICAgIHJldHVybiBHUk9VUF9CUkFDS0VUX1JPVU5EX1RZUEUuR1JPVVA7XG4gICAgICAgIGNhc2UgJ3N3aXNzJzpcbiAgICAgICAgICByZXR1cm4gU1dJU1NfQlJBQ0tFVF9ST1VORF9UWVBFLlNXSVNTO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdG91cm5hbWVudCBtb2RlIGZvciBhIG5vcm1hbCB0eXBlIHJvdW5kOiAke3RvdXJuYW1lbnRNb2RlfWApO1xuICAgICAgfVxuICAgIGNhc2UgJ3RoaXJkX3BsYWNlJzpcbiAgICAgIHJldHVybiBDT01NT05fQlJBQ0tFVF9ST1VORF9UWVBFLlRISVJEX1BMQUNFO1xuICAgIGNhc2UgJ2ZpbmFsJzpcbiAgICAgIHJldHVybiBDT01NT05fQlJBQ0tFVF9ST1VORF9UWVBFLkZJTkFMO1xuICAgIGNhc2UgJ3JldmVyc2VfZmluYWwnOlxuICAgICAgcmV0dXJuIERPVUJMRV9FTElNSU5BVElPTl9CUkFDS0VUX1JPVU5EX1RZUEUuUkVWRVJTRV9GSU5BTDtcbiAgICBjYXNlICd3aW5uZXJfYnJhY2tldCc6XG4gICAgICByZXR1cm4gRE9VQkxFX0VMSU1JTkFUSU9OX0JSQUNLRVRfUk9VTkRfVFlQRS5VUFBFUl9CUkFDS0VUO1xuICAgIGNhc2UgJ2xvc2VyX2JyYWNrZXQnOlxuICAgICAgcmV0dXJuIERPVUJMRV9FTElNSU5BVElPTl9CUkFDS0VUX1JPVU5EX1RZUEUuTE9XRVJfQlJBQ0tFVDtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlVG91cm5hbWVudE1vZGVGb3JtRXRobGV0ZVJvdW5kcyA9IChcbiAgc291cmNlOiBSb3VuZFN0YWdlU3RydWN0dXJlV2l0aE1hdGNoZXNWaWV3W10sXG4pOiBUb3VybmFtZW50TW9kZSA9PiB7XG4gIGNvbnN0IGZpcnN0Um91bmQgPSBzb3VyY2VbMF07XG4gIGNvbnN0IGZpcnN0TWF0Y2ggPSBmaXJzdFJvdW5kPy5tYXRjaGVzWzBdO1xuXG4gIGlmICghZmlyc3RSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCdObyByb3VuZHMgZm91bmQnKTtcbiAgaWYgKCFmaXJzdE1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoJ05vIG1hdGNoZXMgZm91bmQnKTtcblxuICBzd2l0Y2ggKGZpcnN0TWF0Y2gubWF0Y2hUeXBlKSB7XG4gICAgY2FzZSAnZ3JvdXBzJzpcbiAgICAgIHJldHVybiBUT1VSTkFNRU5UX01PREUuR1JPVVA7XG4gICAgY2FzZSAnZmlmYV9zd2lzcyc6IHtcbiAgICAgIGNvbnN0IGxhc3RSb3VuZCA9IHNvdXJjZVtzb3VyY2UubGVuZ3RoIC0gMV07XG5cbiAgICAgIGlmICghbGFzdFJvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ05vIGxhc3Qgcm91bmQgZm91bmQnKTtcblxuICAgICAgaWYgKGxhc3RSb3VuZC5tYXRjaGVzLmxlbmd0aCAhPT0gZmlyc3RSb3VuZC5tYXRjaGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gVE9VUk5BTUVOVF9NT0RFLlNXSVNTX1dJVEhfRUxJTUlOQVRJT047XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVE9VUk5BTUVOVF9NT0RFLlNXSVNTO1xuICAgICAgfVxuICAgIH1cbiAgICBjYXNlICdkb3VibGVfZWxpbWluYXRpb24nOlxuICAgICAgcmV0dXJuIFRPVVJOQU1FTlRfTU9ERS5ET1VCTEVfRUxJTUlOQVRJT047XG4gICAgY2FzZSAnc2luZ2xlX2VsaW1pbmF0aW9uJzpcbiAgICAgIHJldHVybiBUT1VSTkFNRU5UX01PREUuU0lOR0xFX0VMSU1JTkFUSU9OO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHRvdXJuYW1lbnQgbW9kZTogJHtmaXJzdE1hdGNoLm1hdGNoVHlwZX1gKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNhblJlbmRlckxheW91dEluVG91cm5hbWVudE1vZGUgPSAobGF5b3V0OiBCcmFja2V0RGF0YUxheW91dCwgbW9kZTogVG91cm5hbWVudE1vZGUpOiBib29sZWFuID0+IHtcbiAgc3dpdGNoIChtb2RlKSB7XG4gICAgY2FzZSBUT1VSTkFNRU5UX01PREUuU0lOR0xFX0VMSU1JTkFUSU9OOlxuICAgICAgcmV0dXJuIGxheW91dCA9PT0gQlJBQ0tFVF9EQVRBX0xBWU9VVC5MRUZUX1RPX1JJR0hUIHx8IGxheW91dCA9PT0gQlJBQ0tFVF9EQVRBX0xBWU9VVC5NSVJST1JFRDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGxheW91dCA9PT0gQlJBQ0tFVF9EQVRBX0xBWU9VVC5MRUZUX1RPX1JJR0hUO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgQlJBQ0tFVF9EQVRBX0xBWU9VVCA9IHtcbiAgTEVGVF9UT19SSUdIVDogJ2xlZnQtdG8tcmlnaHQnLFxuXG4gIC8vIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBpbiBzaW5nbGUgZWxpbWluYXRpb24gYnJhY2tldHMuIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdXNlZCBpbiBvdGhlciBicmFja2V0IHR5cGVzXG4gIE1JUlJPUkVEOiAnbWlycm9yZWQnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQnJhY2tldERhdGFMYXlvdXQgPSAodHlwZW9mIEJSQUNLRVRfREFUQV9MQVlPVVQpW2tleW9mIHR5cGVvZiBCUkFDS0VUX0RBVEFfTEFZT1VUXTtcblxuZXhwb3J0IGNvbnN0IEZJUlNUX1JPVU5EU19UWVBFID0ge1xuICBTSU5HTEU6ICdzaW5nbGUnLFxuICBET1VCTEU6ICdkb3VibGUnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRmlyc3RSb3VuZHNUeXBlID0gKHR5cGVvZiBGSVJTVF9ST1VORFNfVFlQRSlba2V5b2YgdHlwZW9mIEZJUlNUX1JPVU5EU19UWVBFXTtcblxuZXhwb3J0IHR5cGUgRmlyc3RTaW5nbGVSb3VuZHM8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gIHR5cGU6IHR5cGVvZiBGSVJTVF9ST1VORFNfVFlQRS5TSU5HTEU7XG4gIGZpcnN0OiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG59O1xuXG5leHBvcnQgdHlwZSBGaXJzdERvdWJsZVJvdW5kczxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgdHlwZTogdHlwZW9mIEZJUlNUX1JPVU5EU19UWVBFLkRPVUJMRTtcbiAgdXBwZXI6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgbG93ZXI6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbn07XG5cbmV4cG9ydCB0eXBlIEZpcnN0Um91bmRzPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID1cbiAgfCBGaXJzdFNpbmdsZVJvdW5kczxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPlxuICB8IEZpcnN0RG91YmxlUm91bmRzPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuXG5leHBvcnQgY29uc3QgZ2V0Rmlyc3RSb3VuZHMgPSA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4oXG4gIGJyYWNrZXREYXRhOiBCcmFja2V0RGF0YTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPixcbiAgcm91bmRUeXBlTWFwOiBCcmFja2V0Um91bmRUeXBlTWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+LFxuKTogRmlyc3RSb3VuZHM8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPT4ge1xuICBpZiAoYnJhY2tldERhdGEubW9kZSA9PT0gVE9VUk5BTUVOVF9NT0RFLkRPVUJMRV9FTElNSU5BVElPTikge1xuICAgIGNvbnN0IHVwcGVyID0gcm91bmRUeXBlTWFwLmdldChET1VCTEVfRUxJTUlOQVRJT05fQlJBQ0tFVF9ST1VORF9UWVBFLlVQUEVSX0JSQUNLRVQpPy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgY29uc3QgbG93ZXIgPSByb3VuZFR5cGVNYXAuZ2V0KERPVUJMRV9FTElNSU5BVElPTl9CUkFDS0VUX1JPVU5EX1RZUEUuTE9XRVJfQlJBQ0tFVCk/LnZhbHVlcygpLm5leHQoKS52YWx1ZTtcblxuICAgIGlmICghdXBwZXIgfHwgIWxvd2VyKSB0aHJvdyBuZXcgRXJyb3IoJ1VwcGVyIG9yIGxvd2VyIGJyYWNrZXQgaXMgbnVsbCcpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IEZJUlNUX1JPVU5EU19UWVBFLkRPVUJMRSxcbiAgICAgIHVwcGVyLFxuICAgICAgbG93ZXIsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0ID0gYnJhY2tldERhdGEucm91bmRzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcblxuICBpZiAoIWZpcnN0KSB0aHJvdyBuZXcgRXJyb3IoJ0ZpcnN0IHJvdW5kIGlzIG51bGwnKTtcblxuICByZXR1cm4ge1xuICAgIHR5cGU6IEZJUlNUX1JPVU5EU19UWVBFLlNJTkdMRSxcbiAgICBmaXJzdCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZU1hdGNoUG9zaXRpb25NYXBzID0gPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+KGJyYWNrZXREYXRhOiBCcmFja2V0RGF0YTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPikgPT4ge1xuICBjb25zdCBtYXRjaFBvc2l0aW9uTWFwczogTWF0Y2hQb3NpdGlvbk1hcHM8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSBuZXcgTWFwKCk7XG5cbiAgZm9yIChjb25zdCByb3VuZCBvZiBicmFja2V0RGF0YS5yb3VuZHMudmFsdWVzKCkpIHtcbiAgICBjb25zdCBtYXRjaE1hcCA9IG5ldyBNYXAoWy4uLnJvdW5kLm1hdGNoZXMudmFsdWVzKCldLm1hcCgobSkgPT4gW20ucG9zaXRpb24sIG1dKSk7XG5cbiAgICBtYXRjaFBvc2l0aW9uTWFwcy5zZXQocm91bmQuaWQsIG1hdGNoTWFwKTtcbiAgfVxuXG4gIHJldHVybiBtYXRjaFBvc2l0aW9uTWFwcztcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUJyYWNrZXRSb3VuZFR5cGVNYXAgPSA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4oXG4gIGJyYWNrZXREYXRhOiBCcmFja2V0RGF0YTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPixcbikgPT4ge1xuICBjb25zdCByb3VuZEFtb3VudE1hcDogQnJhY2tldFJvdW5kVHlwZU1hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IHJvdW5kIG9mIGJyYWNrZXREYXRhLnJvdW5kcy52YWx1ZXMoKSkge1xuICAgIGlmICghcm91bmRBbW91bnRNYXAuaGFzKHJvdW5kLnR5cGUpKSB7XG4gICAgICByb3VuZEFtb3VudE1hcC5zZXQocm91bmQudHlwZSwgbmV3IE1hcChbW3JvdW5kLmlkLCByb3VuZF1dKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICByb3VuZEFtb3VudE1hcC5zZXQocm91bmQudHlwZSwgcm91bmRBbW91bnRNYXAuZ2V0KHJvdW5kLnR5cGUpIS5zZXQocm91bmQuaWQsIHJvdW5kKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJvdW5kQW1vdW50TWFwO1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlUm91bmRSZWxhdGlvbnMgPSA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4oYnJhY2tldERhdGE6IEJyYWNrZXREYXRhPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+KSA9PiB7XG4gIGNvbnN0IHJvdW5kUmVsYXRpb25zOiBCcmFja2V0Um91bmRSZWxhdGlvbnM8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3QgYWxsUm91bmRzID0gYnJhY2tldERhdGEucm91bmRJZHMubWFwKChpZCkgPT4gYnJhY2tldERhdGEucm91bmRzLmdldChpZCkpLmZpbHRlcigocikgPT4gISFyKTtcbiAgY29uc3QgdXBwZXJSb3VuZHMgPSBhbGxSb3VuZHMuZmlsdGVyKChyKSA9PiByLnR5cGUgIT09IERPVUJMRV9FTElNSU5BVElPTl9CUkFDS0VUX1JPVU5EX1RZUEUuTE9XRVJfQlJBQ0tFVCk7XG4gIGNvbnN0IGxvd2VyUm91bmRzID0gYWxsUm91bmRzLmZpbHRlcigocikgPT4gci50eXBlID09PSBET1VCTEVfRUxJTUlOQVRJT05fQlJBQ0tFVF9ST1VORF9UWVBFLkxPV0VSX0JSQUNLRVQpO1xuXG4gIGNvbnN0IGZpcnN0VXBwZXJSb3VuZCA9IHVwcGVyUm91bmRzWzBdIHx8IG51bGw7XG4gIGNvbnN0IGZpcnN0TG93ZXJSb3VuZCA9IGxvd2VyUm91bmRzWzBdIHx8IG51bGw7XG5cbiAgaWYgKCFmaXJzdFVwcGVyUm91bmQpIHRocm93IG5ldyBFcnJvcignZmlyc3RVcHBlclJvdW5kIGlzIG51bGwnKTtcblxuICBjb25zdCBoYXNMb3dlclJvdW5kcyA9IGxvd2VyUm91bmRzLmxlbmd0aCA+IDA7XG4gIGNvbnN0IGxhc3RMb3dlclJvdW5kID0gbG93ZXJSb3VuZHNbbG93ZXJSb3VuZHMubGVuZ3RoIC0gMV0gfHwgbnVsbDtcblxuICBmb3IgKGNvbnN0IFtjdXJyZW50VXBwZXJSb3VuZEluZGV4LCBjdXJyZW50VXBwZXJSb3VuZF0gb2YgdXBwZXJSb3VuZHMuZW50cmllcygpKSB7XG4gICAgY29uc3QgcHJldmlvdXNVcHBlclJvdW5kID0gdXBwZXJSb3VuZHNbY3VycmVudFVwcGVyUm91bmRJbmRleCAtIDFdIHx8IG51bGw7XG4gICAgY29uc3QgbmV4dFVwcGVyUm91bmQgPSB1cHBlclJvdW5kc1tjdXJyZW50VXBwZXJSb3VuZEluZGV4ICsgMV0gfHwgbnVsbDtcblxuICAgIGNvbnN0IGN1cnJlbnRMb3dlclJvdW5kID0gbG93ZXJSb3VuZHNbY3VycmVudFVwcGVyUm91bmRJbmRleF0gfHwgbnVsbDtcbiAgICBjb25zdCBwcmV2aW91c0xvd2VyUm91bmQgPSBsb3dlclJvdW5kc1tjdXJyZW50VXBwZXJSb3VuZEluZGV4IC0gMV0gfHwgbnVsbDtcbiAgICBjb25zdCBuZXh0TG93ZXJSb3VuZCA9IGxvd2VyUm91bmRzW2N1cnJlbnRVcHBlclJvdW5kSW5kZXggKyAxXSB8fCBudWxsO1xuXG4gICAgY29uc3QgaXNGaXJzdFJvdW5kID0gY3VycmVudFVwcGVyUm91bmRJbmRleCA9PT0gMDtcbiAgICBjb25zdCBpc0xhc3RVcHBlclJvdW5kID0gY3VycmVudFVwcGVyUm91bmRJbmRleCA9PT0gdXBwZXJSb3VuZHMubGVuZ3RoIC0gMTtcblxuICAgIGNvbnN0IGlzRmluYWwgPSBjdXJyZW50VXBwZXJSb3VuZC50eXBlID09PSBDT01NT05fQlJBQ0tFVF9ST1VORF9UWVBFLkZJTkFMO1xuXG4gICAgaWYgKGlzRmluYWwgJiYgaGFzTG93ZXJSb3VuZHMpIHtcbiAgICAgIC8vIHR3byB0byBvbmUgcmVsYXRpb25cblxuICAgICAgaWYgKCFsYXN0TG93ZXJSb3VuZCB8fCAhY3VycmVudExvd2VyUm91bmQgfHwgIXByZXZpb3VzVXBwZXJSb3VuZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsYXN0TG93ZXJSb3VuZCBvciBjdXJyZW50TG93ZXJSb3VuZCBvciBwcmV2aW91c1VwcGVyUm91bmQgaXMgbnVsbCcpO1xuXG4gICAgICAvLyBpbiBhIHN5bmMgZG91YmxlIGVsaW1pbmF0aW9uIGJyYWNrZXQsIHRoZSBmaW5hbCByb3VuZCBoYXMgdGhlIHNhbWUgaW5kZXggYXMgdGhlIGxhc3QgbG93ZXIgcm91bmRcbiAgICAgIC8vIGluIGFuIGFzeW5jIG9uZSwgdGhlcmUgaXMgYWx3YXlzIG9uZSBtb3JlIHJvdW5kIGluIHRoZSBsb3dlciBicmFja2V0IHNpbmNlIHdlIG9ubHkgZGlzcGxheSBhIHNlY3Rpb24gb2YgdGhlIHdob2xlIHRvdXJuYW1lbnRcbiAgICAgIGNvbnN0IGlzQXN5bmNCcmFja2V0ID0gY3VycmVudExvd2VyUm91bmQuaWQgIT09IGxhc3RMb3dlclJvdW5kLmlkO1xuICAgICAgY29uc3QgZmluYWxMb3dlclJvdW5kID0gaXNBc3luY0JyYWNrZXQgPyBuZXh0TG93ZXJSb3VuZCA6IGN1cnJlbnRMb3dlclJvdW5kO1xuXG4gICAgICBpZiAoIWZpbmFsTG93ZXJSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCdmaW5hbExvd2VyUm91bmQgaXMgbnVsbCcpO1xuICAgICAgaWYgKCFmaXJzdExvd2VyUm91bmQpIHRocm93IG5ldyBFcnJvcignZmlyc3RMb3dlclJvdW5kIGlzIG51bGwnKTtcblxuICAgICAgaWYgKGZpbmFsTG93ZXJSb3VuZC5pZCAhPT0gbGFzdExvd2VyUm91bmQuaWQpIHRocm93IG5ldyBFcnJvcignZmluYWxMb3dlclJvdW5kIGlzIG5vdCB0aGUgbGFzdCBsb3dlciByb3VuZCcpO1xuXG4gICAgICAvLyBpZiB3ZSBoYXZlIGEgcmV2ZXJzZSBmaW5hbFxuICAgICAgaWYgKG5leHRVcHBlclJvdW5kKSB7XG4gICAgICAgIC8vIGZvciB0aGUgZmluYWxcbiAgICAgICAgcm91bmRSZWxhdGlvbnMuc2V0KGN1cnJlbnRVcHBlclJvdW5kLmlkLCB7XG4gICAgICAgICAgdHlwZTogJ3R3by10by1vbmUnLFxuICAgICAgICAgIHByZXZpb3VzVXBwZXJSb3VuZDogcHJldmlvdXNVcHBlclJvdW5kLFxuICAgICAgICAgIHByZXZpb3VzTG93ZXJSb3VuZDogZmluYWxMb3dlclJvdW5kLFxuICAgICAgICAgIG5leHRSb3VuZDogbmV4dFVwcGVyUm91bmQsXG4gICAgICAgICAgY3VycmVudFJvdW5kOiBjdXJyZW50VXBwZXJSb3VuZCxcbiAgICAgICAgICBuZXh0Um91bmRNYXRjaEZhY3RvcjogbmV4dFVwcGVyUm91bmQubWF0Y2hDb3VudCAvIGN1cnJlbnRVcHBlclJvdW5kLm1hdGNoQ291bnQsXG4gICAgICAgICAgcHJldmlvdXNVcHBlclJvdW5kTWF0Y2hGYWN0b3I6IHByZXZpb3VzVXBwZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgICBwcmV2aW91c0xvd2VyUm91bmRNYXRjaEZhY3RvcjogZmluYWxMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50VXBwZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgIHVwcGVyUm9vdFJvdW5kTWF0Y2hGYWN0b3I6IGZpcnN0VXBwZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgICBsb3dlclJvb3RSb3VuZE1hdGNoRmFjdG9yOiBmaXJzdExvd2VyUm91bmQubWF0Y2hDb3VudCAvIGN1cnJlbnRVcHBlclJvdW5kLm1hdGNoQ291bnQsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm8gcmV2ZXJzZSBmaW5hbCBtZWFucyB0aGUgZmluYWwgaXMgdGhlIGxhc3Qgcm91bmRcblxuICAgICAgICAvLyBmb3IgdGhlIGZpbmFsXG4gICAgICAgIHJvdW5kUmVsYXRpb25zLnNldChjdXJyZW50VXBwZXJSb3VuZC5pZCwge1xuICAgICAgICAgIHR5cGU6ICd0d28tdG8tbm90aGluZycsXG4gICAgICAgICAgcHJldmlvdXNVcHBlclJvdW5kOiBwcmV2aW91c1VwcGVyUm91bmQsXG4gICAgICAgICAgcHJldmlvdXNMb3dlclJvdW5kOiBmaW5hbExvd2VyUm91bmQsXG4gICAgICAgICAgY3VycmVudFJvdW5kOiBjdXJyZW50VXBwZXJSb3VuZCxcbiAgICAgICAgICBwcmV2aW91c0xvd2VyUm91bmRNYXRjaEZhY3RvcjogZmluYWxMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50VXBwZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgIHByZXZpb3VzVXBwZXJSb3VuZE1hdGNoRmFjdG9yOiBwcmV2aW91c1VwcGVyUm91bmQubWF0Y2hDb3VudCAvIGN1cnJlbnRVcHBlclJvdW5kLm1hdGNoQ291bnQsXG4gICAgICAgICAgbG93ZXJSb290Um91bmRNYXRjaEZhY3RvcjogZmlyc3RMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50VXBwZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgIHVwcGVyUm9vdFJvdW5kTWF0Y2hGYWN0b3I6IGZpcnN0VXBwZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FzeW5jQnJhY2tldCkge1xuICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGFzeW5jIGJyYWNrZXQsIHdlIG5lZWQgdG8gc2V0IHRoZSByZWxhdGlvbnMgZm9yIHRoZSAyIGxhc3QgbG93ZXIgcm91bmRzIHNpbmNlIHRoZXkgd2lsbCBiZSBza2lwcGVkIGJ5IHRoZSBkZWZhdWx0IG9uZSB0byBvbmUgbG9naWNcbiAgICAgICAgY29uc3QgcHJlRmluYWxMb3dlclJvdW5kID0gbG93ZXJSb3VuZHNbbG93ZXJSb3VuZHMubGVuZ3RoIC0gMl0gfHwgbnVsbDtcbiAgICAgICAgY29uc3QgcHJlUHJlRmluYWxMb3dlclJvdW5kID0gbG93ZXJSb3VuZHNbbG93ZXJSb3VuZHMubGVuZ3RoIC0gM10gfHwgbnVsbDtcblxuICAgICAgICBpZiAoIXByZUZpbmFsTG93ZXJSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCdwcmVGaW5hbExvd2VyUm91bmQgaXMgbnVsbCcpO1xuXG4gICAgICAgIGlmICghZmlyc3RMb3dlclJvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ2ZpcnN0TG93ZXJSb3VuZCBpcyBudWxsJyk7XG5cbiAgICAgICAgLy8gZm9yIHRoZSBsYXN0IGxvd2VyIHJvdW5kXG4gICAgICAgIHJvdW5kUmVsYXRpb25zLnNldChmaW5hbExvd2VyUm91bmQuaWQsIHtcbiAgICAgICAgICB0eXBlOiAnb25lLXRvLW9uZScsXG4gICAgICAgICAgcHJldmlvdXNSb3VuZDogcHJlRmluYWxMb3dlclJvdW5kLFxuICAgICAgICAgIG5leHRSb3VuZDogY3VycmVudFVwcGVyUm91bmQsXG4gICAgICAgICAgY3VycmVudFJvdW5kOiBmaW5hbExvd2VyUm91bmQsXG4gICAgICAgICAgbmV4dFJvdW5kTWF0Y2hGYWN0b3I6IGN1cnJlbnRVcHBlclJvdW5kLm1hdGNoQ291bnQgLyBmaW5hbExvd2VyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgICBwcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3I6IHByZUZpbmFsTG93ZXJSb3VuZC5tYXRjaENvdW50IC8gZmluYWxMb3dlclJvdW5kLm1hdGNoQ291bnQsXG4gICAgICAgICAgcm9vdFJvdW5kTWF0Y2hGYWN0b3I6IGZpcnN0TG93ZXJSb3VuZC5tYXRjaENvdW50IC8gZmluYWxMb3dlclJvdW5kLm1hdGNoQ291bnQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChwcmVQcmVGaW5hbExvd2VyUm91bmQpIHtcbiAgICAgICAgICAvLyBmb3IgdGhlIHByZSBmaW5hbCBsb3dlciByb3VuZFxuICAgICAgICAgIHJvdW5kUmVsYXRpb25zLnNldChwcmVGaW5hbExvd2VyUm91bmQuaWQsIHtcbiAgICAgICAgICAgIHR5cGU6ICdvbmUtdG8tb25lJyxcbiAgICAgICAgICAgIHByZXZpb3VzUm91bmQ6IHByZVByZUZpbmFsTG93ZXJSb3VuZCxcbiAgICAgICAgICAgIG5leHRSb3VuZDogZmluYWxMb3dlclJvdW5kLFxuICAgICAgICAgICAgY3VycmVudFJvdW5kOiBwcmVGaW5hbExvd2VyUm91bmQsXG4gICAgICAgICAgICBuZXh0Um91bmRNYXRjaEZhY3RvcjogZmluYWxMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBwcmVGaW5hbExvd2VyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgICAgIHByZXZpb3VzUm91bmRNYXRjaEZhY3RvcjogcHJlUHJlRmluYWxMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBwcmVGaW5hbExvd2VyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgICAgIHJvb3RSb3VuZE1hdGNoRmFjdG9yOiBmaXJzdExvd2VyUm91bmQubWF0Y2hDb3VudCAvIHByZUZpbmFsTG93ZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGZvciB0aGUgZmlyc3QgbG93ZXIgcm91bmRcbiAgICAgICAgICByb3VuZFJlbGF0aW9ucy5zZXQocHJlRmluYWxMb3dlclJvdW5kLmlkLCB7XG4gICAgICAgICAgICB0eXBlOiAnbm90aGluZy10by1vbmUnLFxuICAgICAgICAgICAgbmV4dFJvdW5kOiBmaW5hbExvd2VyUm91bmQsXG4gICAgICAgICAgICBjdXJyZW50Um91bmQ6IHByZUZpbmFsTG93ZXJSb3VuZCxcbiAgICAgICAgICAgIG5leHRSb3VuZE1hdGNoRmFjdG9yOiBmaW5hbExvd2VyUm91bmQubWF0Y2hDb3VudCAvIHByZUZpbmFsTG93ZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGlzIGlzIGEgc3luYyBicmFja2V0LCB3ZSBvbmx5IG5lZWQgdG8gc2V0IHRoZSByZWxhdGlvbiBmb3IgdGhlIGxhc3QgbG93ZXIgcm91bmRcbiAgICAgICAgaWYgKCFwcmV2aW91c0xvd2VyUm91bmQpIHRocm93IG5ldyBFcnJvcigncHJldmlvdXNMb3dlclJvdW5kIGlzIG51bGwnKTtcbiAgICAgICAgaWYgKCFmaXJzdExvd2VyUm91bmQpIHRocm93IG5ldyBFcnJvcignZmlyc3RMb3dlclJvdW5kIGlzIG51bGwnKTtcblxuICAgICAgICAvLyBmb3IgdGhlIGxhc3QgbG93ZXIgcm91bmRcbiAgICAgICAgcm91bmRSZWxhdGlvbnMuc2V0KGZpbmFsTG93ZXJSb3VuZC5pZCwge1xuICAgICAgICAgIHR5cGU6ICdvbmUtdG8tb25lJyxcbiAgICAgICAgICBwcmV2aW91c1JvdW5kOiBwcmV2aW91c0xvd2VyUm91bmQsXG4gICAgICAgICAgbmV4dFJvdW5kOiBjdXJyZW50VXBwZXJSb3VuZCxcbiAgICAgICAgICBjdXJyZW50Um91bmQ6IGZpbmFsTG93ZXJSb3VuZCxcbiAgICAgICAgICBuZXh0Um91bmRNYXRjaEZhY3RvcjogY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCAvIGZpbmFsTG93ZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgIHByZXZpb3VzUm91bmRNYXRjaEZhY3RvcjogcHJldmlvdXNMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBmaW5hbExvd2VyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgICByb290Um91bmRNYXRjaEZhY3RvcjogZmlyc3RMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBmaW5hbExvd2VyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0xhc3RVcHBlclJvdW5kKSB7XG4gICAgICAvLyBvbmUgdG8gbm90aGluZyByZWxhdGlvblxuXG4gICAgICBpZiAoIXByZXZpb3VzVXBwZXJSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCdwcmV2aW91c1VwcGVyUm91bmQgaXMgbnVsbCcpO1xuXG4gICAgICByb3VuZFJlbGF0aW9ucy5zZXQoY3VycmVudFVwcGVyUm91bmQuaWQsIHtcbiAgICAgICAgdHlwZTogJ29uZS10by1ub3RoaW5nJyxcbiAgICAgICAgcHJldmlvdXNSb3VuZDogcHJldmlvdXNVcHBlclJvdW5kLFxuICAgICAgICBjdXJyZW50Um91bmQ6IGN1cnJlbnRVcHBlclJvdW5kLFxuICAgICAgICBwcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3I6IHByZXZpb3VzVXBwZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgcm9vdFJvdW5kTWF0Y2hGYWN0b3I6IGZpcnN0VXBwZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNGaXJzdFJvdW5kKSB7XG4gICAgICAvLyBub3RoaW5nIHRvIG9uZSByZWxhdGlvblxuXG4gICAgICBpZiAoIW5leHRVcHBlclJvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ25leHRVcHBlclJvdW5kIGlzIG51bGwnKTtcblxuICAgICAgcm91bmRSZWxhdGlvbnMuc2V0KGN1cnJlbnRVcHBlclJvdW5kLmlkLCB7XG4gICAgICAgIHR5cGU6ICdub3RoaW5nLXRvLW9uZScsXG4gICAgICAgIG5leHRSb3VuZDogbmV4dFVwcGVyUm91bmQsXG4gICAgICAgIGN1cnJlbnRSb3VuZDogY3VycmVudFVwcGVyUm91bmQsXG4gICAgICAgIG5leHRSb3VuZE1hdGNoRmFjdG9yOiBuZXh0VXBwZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoY3VycmVudExvd2VyUm91bmQpIHtcbiAgICAgICAgaWYgKCFuZXh0TG93ZXJSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCduZXh0TG93ZXJSb3VuZCBpcyBudWxsJyk7XG5cbiAgICAgICAgcm91bmRSZWxhdGlvbnMuc2V0KGN1cnJlbnRMb3dlclJvdW5kLmlkLCB7XG4gICAgICAgICAgdHlwZTogJ25vdGhpbmctdG8tb25lJyxcbiAgICAgICAgICBuZXh0Um91bmQ6IG5leHRMb3dlclJvdW5kLFxuICAgICAgICAgIGN1cnJlbnRSb3VuZDogY3VycmVudExvd2VyUm91bmQsXG4gICAgICAgICAgbmV4dFJvdW5kTWF0Y2hGYWN0b3I6IG5leHRMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50TG93ZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb25lIHRvIG9uZSByZWxhdGlvblxuXG4gICAgICBpZiAoIXByZXZpb3VzVXBwZXJSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCdwcmV2aW91c1VwcGVyUm91bmQgaXMgbnVsbCcpO1xuICAgICAgaWYgKCFuZXh0VXBwZXJSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCduZXh0VXBwZXJSb3VuZCBpcyBudWxsJyk7XG5cbiAgICAgIHJvdW5kUmVsYXRpb25zLnNldChjdXJyZW50VXBwZXJSb3VuZC5pZCwge1xuICAgICAgICB0eXBlOiAnb25lLXRvLW9uZScsXG4gICAgICAgIHByZXZpb3VzUm91bmQ6IHByZXZpb3VzVXBwZXJSb3VuZCxcbiAgICAgICAgbmV4dFJvdW5kOiBuZXh0VXBwZXJSb3VuZCxcbiAgICAgICAgY3VycmVudFJvdW5kOiBjdXJyZW50VXBwZXJSb3VuZCxcbiAgICAgICAgbmV4dFJvdW5kTWF0Y2hGYWN0b3I6IG5leHRVcHBlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50VXBwZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICBwcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3I6IHByZXZpb3VzVXBwZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgcm9vdFJvdW5kTWF0Y2hGYWN0b3I6IGZpcnN0VXBwZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyB3ZSBvbmx5IHdhbnQgdG8gc2V0IGxvd2VyIHJvdW5kcyBoZXJlIHVudGlsIHRoZSBzcGVjaWFsIG1lcmdpbmcgcG9pbnQgb2YgdGhlIGZpbmFsLlxuICAgICAgLy8gbG93ZXIgYnJhY2tldCByb3VuZHMgYWZ0ZXIgYW5kIGluY2x1ZGluZyB0aGUgZmluYWwgd2lsbCBiZSBzZXQgaW4gdGhlIGZpbmFsIHJvdW5kIGJsb2NrXG4gICAgICBpZiAoY3VycmVudExvd2VyUm91bmQgJiYgY3VycmVudFVwcGVyUm91bmQudHlwZSA9PT0gRE9VQkxFX0VMSU1JTkFUSU9OX0JSQUNLRVRfUk9VTkRfVFlQRS5VUFBFUl9CUkFDS0VUKSB7XG4gICAgICAgIGlmICghcHJldmlvdXNMb3dlclJvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ3ByZXZpb3VzTG93ZXJSb3VuZCBpcyBudWxsJyk7XG4gICAgICAgIGlmICghbmV4dExvd2VyUm91bmQpIHRocm93IG5ldyBFcnJvcignbmV4dExvd2VyUm91bmQgaXMgbnVsbCcpO1xuICAgICAgICBpZiAoIWZpcnN0TG93ZXJSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCdmaXJzdExvd2VyUm91bmQgaXMgbnVsbCcpO1xuXG4gICAgICAgIHJvdW5kUmVsYXRpb25zLnNldChjdXJyZW50TG93ZXJSb3VuZC5pZCwge1xuICAgICAgICAgIHR5cGU6ICdvbmUtdG8tb25lJyxcbiAgICAgICAgICBwcmV2aW91c1JvdW5kOiBwcmV2aW91c0xvd2VyUm91bmQsXG4gICAgICAgICAgbmV4dFJvdW5kOiBuZXh0TG93ZXJSb3VuZCxcbiAgICAgICAgICBjdXJyZW50Um91bmQ6IGN1cnJlbnRMb3dlclJvdW5kLFxuICAgICAgICAgIG5leHRSb3VuZE1hdGNoRmFjdG9yOiBuZXh0TG93ZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudExvd2VyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgICBwcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3I6IHByZXZpb3VzTG93ZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudExvd2VyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgICByb290Um91bmRNYXRjaEZhY3RvcjogZmlyc3RMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50TG93ZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcm91bmRSZWxhdGlvbnM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVNYXRjaFJlbGF0aW9ucyA9IDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPihcbiAgYnJhY2tldERhdGE6IEJyYWNrZXREYXRhPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+LFxuICByb3VuZFJlbGF0aW9uczogQnJhY2tldFJvdW5kUmVsYXRpb25zPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+LFxuICBtYXRjaFBvc2l0aW9uTWFwczogTWF0Y2hQb3NpdGlvbk1hcHM8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4sXG4pID0+IHtcbiAgY29uc3QgbWF0Y2hSZWxhdGlvbnM6IEJyYWNrZXRNYXRjaFJlbGF0aW9uc01hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IG1hdGNoIG9mIGJyYWNrZXREYXRhLm1hdGNoZXMudmFsdWVzKCkpIHtcbiAgICBjb25zdCBjdXJyZW50UmVsYXRpb24gPSByb3VuZFJlbGF0aW9ucy5nZXQobWF0Y2gucm91bmQuaWQpO1xuXG4gICAgaWYgKCFjdXJyZW50UmVsYXRpb24pIHRocm93IG5ldyBFcnJvcignTWF0Y2ggcm91bmQgbm90IGZvdW5kJyk7XG5cbiAgICBjb25zdCB7XG4gICAgICBuZXh0VXBwZXJSb3VuZE1hdGNoUG9zaXRpb24sXG4gICAgICBuZXh0TG93ZXJSb3VuZE1hdGNoUG9zaXRpb24sXG4gICAgICBwcmV2aW91c0xvd2VyUm91bmRNYXRjaFBvc2l0aW9uLFxuICAgICAgcHJldmlvdXNVcHBlclJvdW5kTWF0Y2hQb3NpdGlvbixcbiAgICB9ID0gZ2VuZXJhdGVNYXRjaFJlbGF0aW9uUG9zaXRpb25zKGN1cnJlbnRSZWxhdGlvbiwgbWF0Y2gpO1xuXG4gICAgc3dpdGNoIChjdXJyZW50UmVsYXRpb24udHlwZSkge1xuICAgICAgY2FzZSAnbm90aGluZy10by1vbmUnOiB7XG4gICAgICAgIGNvbnN0IG5leHRNYXRjaCA9IG1hdGNoUG9zaXRpb25NYXBzLmdldChjdXJyZW50UmVsYXRpb24ubmV4dFJvdW5kLmlkKT8uZ2V0KG5leHRVcHBlclJvdW5kTWF0Y2hQb3NpdGlvbik7XG5cbiAgICAgICAgaWYgKCFuZXh0TWF0Y2gpIHRocm93IG5ldyBFcnJvcignTmV4dCByb3VuZCBtYXRjaCBub3QgZm91bmQnKTtcblxuICAgICAgICAvLyBtZWFucyBsZWZ0IGlzIG5vdGhpbmcuIHJpZ2h0IGlzIG9uZVxuICAgICAgICBtYXRjaFJlbGF0aW9ucy5zZXQobWF0Y2guaWQsIHtcbiAgICAgICAgICB0eXBlOiAnbm90aGluZy10by1vbmUnLFxuICAgICAgICAgIGN1cnJlbnRNYXRjaDogbWF0Y2gsXG4gICAgICAgICAgY3VycmVudFJvdW5kOiBjdXJyZW50UmVsYXRpb24uY3VycmVudFJvdW5kLFxuICAgICAgICAgIG5leHRSb3VuZDogY3VycmVudFJlbGF0aW9uLm5leHRSb3VuZCxcbiAgICAgICAgICBuZXh0TWF0Y2gsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnb25lLXRvLW5vdGhpbmcnOiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVXBwZXJNYXRjaCA9IG1hdGNoUG9zaXRpb25NYXBzXG4gICAgICAgICAgLmdldChjdXJyZW50UmVsYXRpb24ucHJldmlvdXNSb3VuZC5pZClcbiAgICAgICAgICA/LmdldChwcmV2aW91c1VwcGVyUm91bmRNYXRjaFBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNMb3dlck1hdGNoID0gbWF0Y2hQb3NpdGlvbk1hcHNcbiAgICAgICAgICAuZ2V0KGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1JvdW5kLmlkKVxuICAgICAgICAgID8uZ2V0KHByZXZpb3VzTG93ZXJSb3VuZE1hdGNoUG9zaXRpb24pO1xuXG4gICAgICAgIGlmICghcHJldmlvdXNVcHBlck1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoJ1ByZXZpb3VzIHJvdW5kIG1hdGNoIG5vdCBmb3VuZCcpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c1VwcGVyUm91bmRNYXRjaFBvc2l0aW9uICE9PSBwcmV2aW91c0xvd2VyUm91bmRNYXRjaFBvc2l0aW9uKSB7XG4gICAgICAgICAgLy8gbWVhbnMgbGVmdCBpcyB0d28uIHJpZ2h0IGlzIG9uZVxuXG4gICAgICAgICAgaWYgKCFwcmV2aW91c0xvd2VyTWF0Y2gpIHRocm93IG5ldyBFcnJvcignUHJldmlvdXMgbG93ZXIgcm91bmQgbWF0Y2ggbm90IGZvdW5kJyk7XG5cbiAgICAgICAgICBtYXRjaFJlbGF0aW9ucy5zZXQobWF0Y2guaWQsIHtcbiAgICAgICAgICAgIHR5cGU6ICd0d28tdG8tbm90aGluZycsXG4gICAgICAgICAgICBjdXJyZW50TWF0Y2g6IG1hdGNoLFxuICAgICAgICAgICAgY3VycmVudFJvdW5kOiBjdXJyZW50UmVsYXRpb24uY3VycmVudFJvdW5kLFxuICAgICAgICAgICAgcHJldmlvdXNVcHBlck1hdGNoLFxuICAgICAgICAgICAgcHJldmlvdXNVcHBlclJvdW5kOiBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNSb3VuZCxcbiAgICAgICAgICAgIHByZXZpb3VzTG93ZXJNYXRjaCxcbiAgICAgICAgICAgIHByZXZpb3VzTG93ZXJSb3VuZDogY3VycmVudFJlbGF0aW9uLnByZXZpb3VzUm91bmQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbWVhbnMgbGVmdCBpcyBvbmUuIHJpZ2h0IGlzIG5vdGhpbmdcbiAgICAgICAgICBtYXRjaFJlbGF0aW9ucy5zZXQobWF0Y2guaWQsIHtcbiAgICAgICAgICAgIHR5cGU6ICdvbmUtdG8tbm90aGluZycsXG4gICAgICAgICAgICBjdXJyZW50TWF0Y2g6IG1hdGNoLFxuICAgICAgICAgICAgY3VycmVudFJvdW5kOiBjdXJyZW50UmVsYXRpb24uY3VycmVudFJvdW5kLFxuICAgICAgICAgICAgcHJldmlvdXNNYXRjaDogcHJldmlvdXNVcHBlck1hdGNoLFxuICAgICAgICAgICAgcHJldmlvdXNSb3VuZDogY3VycmVudFJlbGF0aW9uLnByZXZpb3VzUm91bmQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSAnb25lLXRvLW9uZSc6IHtcbiAgICAgICAgY29uc3QgbmV4dE1hdGNoID0gbWF0Y2hQb3NpdGlvbk1hcHMuZ2V0KGN1cnJlbnRSZWxhdGlvbi5uZXh0Um91bmQuaWQpPy5nZXQobmV4dFVwcGVyUm91bmRNYXRjaFBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNVcHBlck1hdGNoID0gbWF0Y2hQb3NpdGlvbk1hcHNcbiAgICAgICAgICAuZ2V0KGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1JvdW5kLmlkKVxuICAgICAgICAgID8uZ2V0KHByZXZpb3VzVXBwZXJSb3VuZE1hdGNoUG9zaXRpb24pO1xuICAgICAgICBjb25zdCBwcmV2aW91c0xvd2VyTWF0Y2ggPSBtYXRjaFBvc2l0aW9uTWFwc1xuICAgICAgICAgIC5nZXQoY3VycmVudFJlbGF0aW9uLnByZXZpb3VzUm91bmQuaWQpXG4gICAgICAgICAgPy5nZXQocHJldmlvdXNMb3dlclJvdW5kTWF0Y2hQb3NpdGlvbik7XG5cbiAgICAgICAgaWYgKCFuZXh0TWF0Y2gpIHRocm93IG5ldyBFcnJvcignTmV4dCByb3VuZCBtYXRjaCBub3QgZm91bmQnKTtcbiAgICAgICAgaWYgKCFwcmV2aW91c1VwcGVyTWF0Y2gpIHRocm93IG5ldyBFcnJvcihgUHJldmlvdXMgdXBwZXIgcm91bmQgbWF0Y2ggbm90IGZvdW5kYCk7XG4gICAgICAgIGlmICghcHJldmlvdXNMb3dlck1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoJ1ByZXZpb3VzIGxvd2VyIHJvdW5kIG1hdGNoIG5vdCBmb3VuZCcpO1xuXG4gICAgICAgIC8vIGNhbiBiZSBlaXRoZXIgb25lIHRvIG9uZSBvciB0d28gdG8gb25lXG4gICAgICAgIGNvbnN0IGlzTGVmdE9uZSA9IHByZXZpb3VzVXBwZXJSb3VuZE1hdGNoUG9zaXRpb24gPT09IHByZXZpb3VzTG93ZXJSb3VuZE1hdGNoUG9zaXRpb247XG4gICAgICAgIGNvbnN0IGlzUmlnaHRPbmUgPSBuZXh0VXBwZXJSb3VuZE1hdGNoUG9zaXRpb24gPT09IG5leHRMb3dlclJvdW5kTWF0Y2hQb3NpdGlvbjtcblxuICAgICAgICBpZiAoY3VycmVudFJlbGF0aW9uLmN1cnJlbnRSb3VuZC5taXJyb3JSb3VuZFR5cGUgPT09IEJSQUNLRVRfUk9VTkRfTUlSUk9SX1RZUEUuUklHSFQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhtYXRjaCwgZ2VuZXJhdGVNYXRjaFJlbGF0aW9uUG9zaXRpb25zKGN1cnJlbnRSZWxhdGlvbiwgbWF0Y2gpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IEltcGxlbWVudCBvbmUgdG8gdHdvXG4gICAgICAgIGlmIChpc0xlZnRPbmUgJiYgaXNSaWdodE9uZSkge1xuICAgICAgICAgIC8vIG9uZS10by1vbmVcbiAgICAgICAgICBtYXRjaFJlbGF0aW9ucy5zZXQobWF0Y2guaWQsIHtcbiAgICAgICAgICAgIHR5cGU6ICdvbmUtdG8tb25lJyxcbiAgICAgICAgICAgIGN1cnJlbnRNYXRjaDogbWF0Y2gsXG4gICAgICAgICAgICBjdXJyZW50Um91bmQ6IGN1cnJlbnRSZWxhdGlvbi5jdXJyZW50Um91bmQsXG4gICAgICAgICAgICBwcmV2aW91c01hdGNoOiBwcmV2aW91c1VwcGVyTWF0Y2gsXG4gICAgICAgICAgICBwcmV2aW91c1JvdW5kOiBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNSb3VuZCxcbiAgICAgICAgICAgIG5leHRNYXRjaCxcbiAgICAgICAgICAgIG5leHRSb3VuZDogY3VycmVudFJlbGF0aW9uLm5leHRSb3VuZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNMZWZ0T25lKSB7XG4gICAgICAgICAgLy8gdHdvLXRvLW9uZVxuICAgICAgICAgIG1hdGNoUmVsYXRpb25zLnNldChtYXRjaC5pZCwge1xuICAgICAgICAgICAgdHlwZTogJ3R3by10by1vbmUnLFxuICAgICAgICAgICAgY3VycmVudE1hdGNoOiBtYXRjaCxcbiAgICAgICAgICAgIGN1cnJlbnRSb3VuZDogY3VycmVudFJlbGF0aW9uLmN1cnJlbnRSb3VuZCxcbiAgICAgICAgICAgIHByZXZpb3VzVXBwZXJNYXRjaCxcbiAgICAgICAgICAgIHByZXZpb3VzVXBwZXJSb3VuZDogY3VycmVudFJlbGF0aW9uLnByZXZpb3VzUm91bmQsXG4gICAgICAgICAgICBwcmV2aW91c0xvd2VyTWF0Y2gsXG4gICAgICAgICAgICBwcmV2aW91c0xvd2VyUm91bmQ6IGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1JvdW5kLFxuICAgICAgICAgICAgbmV4dE1hdGNoLFxuICAgICAgICAgICAgbmV4dFJvdW5kOiBjdXJyZW50UmVsYXRpb24ubmV4dFJvdW5kLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc1JpZ2h0T25lKSB7XG4gICAgICAgICAgY29uc3QgbmV4dExvd2VyTWF0Y2ggPSBtYXRjaFBvc2l0aW9uTWFwcy5nZXQoY3VycmVudFJlbGF0aW9uLm5leHRSb3VuZC5pZCk/LmdldChuZXh0TG93ZXJSb3VuZE1hdGNoUG9zaXRpb24pO1xuXG4gICAgICAgICAgaWYgKCFuZXh0TG93ZXJNYXRjaCkgdGhyb3cgbmV3IEVycm9yKCdOZXh0IGxvd2VyIHJvdW5kIG1hdGNoIG5vdCBmb3VuZCcpO1xuXG4gICAgICAgICAgLy8gb25lLXRvLXR3b1xuICAgICAgICAgIG1hdGNoUmVsYXRpb25zLnNldChtYXRjaC5pZCwge1xuICAgICAgICAgICAgdHlwZTogJ29uZS10by10d28nLFxuICAgICAgICAgICAgY3VycmVudE1hdGNoOiBtYXRjaCxcbiAgICAgICAgICAgIGN1cnJlbnRSb3VuZDogY3VycmVudFJlbGF0aW9uLmN1cnJlbnRSb3VuZCxcbiAgICAgICAgICAgIHByZXZpb3VzTWF0Y2g6IHByZXZpb3VzVXBwZXJNYXRjaCxcbiAgICAgICAgICAgIHByZXZpb3VzUm91bmQ6IGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1JvdW5kLFxuICAgICAgICAgICAgbmV4dFVwcGVyTWF0Y2g6IG5leHRNYXRjaCxcbiAgICAgICAgICAgIG5leHRVcHBlclJvdW5kOiBjdXJyZW50UmVsYXRpb24ubmV4dFJvdW5kLFxuICAgICAgICAgICAgbmV4dExvd2VyTWF0Y2gsXG4gICAgICAgICAgICBuZXh0TG93ZXJSb3VuZDogbmV4dExvd2VyTWF0Y2gucm91bmQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3R3by10by1vbmUnOiB7XG4gICAgICAgIGNvbnN0IG5leHRNYXRjaCA9IG1hdGNoUG9zaXRpb25NYXBzLmdldChjdXJyZW50UmVsYXRpb24ubmV4dFJvdW5kLmlkKT8uZ2V0KG5leHRVcHBlclJvdW5kTWF0Y2hQb3NpdGlvbik7XG5cbiAgICAgICAgY29uc3QgcHJldmlvdXNVcHBlck1hdGNoID0gbWF0Y2hQb3NpdGlvbk1hcHNcbiAgICAgICAgICAuZ2V0KGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1VwcGVyUm91bmQuaWQpXG4gICAgICAgICAgPy5nZXQocHJldmlvdXNVcHBlclJvdW5kTWF0Y2hQb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzTG93ZXJNYXRjaCA9IG1hdGNoUG9zaXRpb25NYXBzXG4gICAgICAgICAgLmdldChjdXJyZW50UmVsYXRpb24ucHJldmlvdXNMb3dlclJvdW5kLmlkKVxuICAgICAgICAgID8uZ2V0KHByZXZpb3VzTG93ZXJSb3VuZE1hdGNoUG9zaXRpb24pO1xuXG4gICAgICAgIGlmICghbmV4dE1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoJ05leHQgcm91bmQgbWF0Y2ggbm90IGZvdW5kJyk7XG4gICAgICAgIGlmICghcHJldmlvdXNVcHBlck1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoYFByZXZpb3VzIHVwcGVyIHJvdW5kIG1hdGNoIG5vdCBmb3VuZGApO1xuICAgICAgICBpZiAoIXByZXZpb3VzTG93ZXJNYXRjaCkgdGhyb3cgbmV3IEVycm9yKCdQcmV2aW91cyBsb3dlciByb3VuZCBtYXRjaCBub3QgZm91bmQnKTtcblxuICAgICAgICBtYXRjaFJlbGF0aW9ucy5zZXQobWF0Y2guaWQsIHtcbiAgICAgICAgICB0eXBlOiAndHdvLXRvLW9uZScsXG4gICAgICAgICAgY3VycmVudE1hdGNoOiBtYXRjaCxcbiAgICAgICAgICBjdXJyZW50Um91bmQ6IGN1cnJlbnRSZWxhdGlvbi5jdXJyZW50Um91bmQsXG4gICAgICAgICAgcHJldmlvdXNVcHBlck1hdGNoLFxuICAgICAgICAgIHByZXZpb3VzVXBwZXJSb3VuZDogY3VycmVudFJlbGF0aW9uLnByZXZpb3VzVXBwZXJSb3VuZCxcbiAgICAgICAgICBwcmV2aW91c0xvd2VyTWF0Y2gsXG4gICAgICAgICAgcHJldmlvdXNMb3dlclJvdW5kOiBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNMb3dlclJvdW5kLFxuICAgICAgICAgIG5leHRNYXRjaCxcbiAgICAgICAgICBuZXh0Um91bmQ6IGN1cnJlbnRSZWxhdGlvbi5uZXh0Um91bmQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAndHdvLXRvLW5vdGhpbmcnOiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVXBwZXJNYXRjaCA9IG1hdGNoUG9zaXRpb25NYXBzXG4gICAgICAgICAgLmdldChjdXJyZW50UmVsYXRpb24ucHJldmlvdXNVcHBlclJvdW5kLmlkKVxuICAgICAgICAgID8uZ2V0KHByZXZpb3VzVXBwZXJSb3VuZE1hdGNoUG9zaXRpb24pO1xuICAgICAgICBjb25zdCBwcmV2aW91c0xvd2VyTWF0Y2ggPSBtYXRjaFBvc2l0aW9uTWFwc1xuICAgICAgICAgIC5nZXQoY3VycmVudFJlbGF0aW9uLnByZXZpb3VzVXBwZXJSb3VuZC5pZClcbiAgICAgICAgICA/LmdldChwcmV2aW91c0xvd2VyUm91bmRNYXRjaFBvc2l0aW9uKTtcblxuICAgICAgICBpZiAoIXByZXZpb3VzVXBwZXJNYXRjaCkgdGhyb3cgbmV3IEVycm9yKGBQcmV2aW91cyB1cHBlciByb3VuZCBtYXRjaCBub3QgZm91bmRgKTtcbiAgICAgICAgaWYgKCFwcmV2aW91c0xvd2VyTWF0Y2gpIHRocm93IG5ldyBFcnJvcignUHJldmlvdXMgbG93ZXIgcm91bmQgbWF0Y2ggbm90IGZvdW5kJyk7XG5cbiAgICAgICAgbWF0Y2hSZWxhdGlvbnMuc2V0KG1hdGNoLmlkLCB7XG4gICAgICAgICAgdHlwZTogJ3R3by10by1ub3RoaW5nJyxcbiAgICAgICAgICBjdXJyZW50TWF0Y2g6IG1hdGNoLFxuICAgICAgICAgIGN1cnJlbnRSb3VuZDogY3VycmVudFJlbGF0aW9uLmN1cnJlbnRSb3VuZCxcbiAgICAgICAgICBwcmV2aW91c1VwcGVyTWF0Y2gsXG4gICAgICAgICAgcHJldmlvdXNVcHBlclJvdW5kOiBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNVcHBlclJvdW5kLFxuICAgICAgICAgIHByZXZpb3VzTG93ZXJNYXRjaCxcbiAgICAgICAgICBwcmV2aW91c0xvd2VyUm91bmQ6IGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1VwcGVyUm91bmQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtYXRjaFJlbGF0aW9ucztcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZU1hdGNoUmVsYXRpb25Qb3NpdGlvbnMgPSA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4oXG4gIGN1cnJlbnRSZWxhdGlvbjogQnJhY2tldFJvdW5kUmVsYXRpb248VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4sXG4gIG1hdGNoOiBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4sXG4pID0+IHtcbiAgc3dpdGNoIChjdXJyZW50UmVsYXRpb24udHlwZSkge1xuICAgIGNhc2UgJ25vdGhpbmctdG8tb25lJzoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dFVwcGVyUm91bmRNYXRjaFBvc2l0aW9uOiBnZW5lcmF0ZU1hdGNoUG9zaXRpb24obWF0Y2gsIGN1cnJlbnRSZWxhdGlvbi5uZXh0Um91bmRNYXRjaEZhY3RvciksXG4gICAgICAgIG5leHRMb3dlclJvdW5kTWF0Y2hQb3NpdGlvbjogRkFMTEJBQ0tfTUFUQ0hfUE9TSVRJT04sXG4gICAgICAgIHByZXZpb3VzVXBwZXJSb3VuZE1hdGNoUG9zaXRpb246IEZBTExCQUNLX01BVENIX1BPU0lUSU9OLFxuICAgICAgICBwcmV2aW91c0xvd2VyUm91bmRNYXRjaFBvc2l0aW9uOiBGQUxMQkFDS19NQVRDSF9QT1NJVElPTixcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ29uZS10by1ub3RoaW5nJzoge1xuICAgICAgY29uc3QgcHJldmlvdXNSb3VuZEhhc0RvdWJsZVRoZU1hdGNoQ291bnQgPSBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNSb3VuZE1hdGNoRmFjdG9yID09PSAyO1xuICAgICAgY29uc3QgZG91YmxlVXBwZXJNYXRjaENvdW50U2hpZnQgPSBwcmV2aW91c1JvdW5kSGFzRG91YmxlVGhlTWF0Y2hDb3VudCA/IDEgOiAwO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0VXBwZXJSb3VuZE1hdGNoUG9zaXRpb246IEZBTExCQUNLX01BVENIX1BPU0lUSU9OLFxuICAgICAgICBuZXh0TG93ZXJSb3VuZE1hdGNoUG9zaXRpb246IEZBTExCQUNLX01BVENIX1BPU0lUSU9OLFxuICAgICAgICBwcmV2aW91c1VwcGVyUm91bmRNYXRjaFBvc2l0aW9uOiAoZ2VuZXJhdGVNYXRjaFBvc2l0aW9uKG1hdGNoLCBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNSb3VuZE1hdGNoRmFjdG9yKSAtXG4gICAgICAgICAgZG91YmxlVXBwZXJNYXRjaENvdW50U2hpZnQpIGFzIEJyYWNrZXRNYXRjaFBvc2l0aW9uLFxuICAgICAgICBwcmV2aW91c0xvd2VyUm91bmRNYXRjaFBvc2l0aW9uOiBnZW5lcmF0ZU1hdGNoUG9zaXRpb24obWF0Y2gsIGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3IpLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnb25lLXRvLW9uZSc6IHtcbiAgICAgIGNvbnN0IHByZXZpb3VzUm91bmRIYXNEb3VibGVUaGVNYXRjaENvdW50ID0gY3VycmVudFJlbGF0aW9uLnByZXZpb3VzUm91bmRNYXRjaEZhY3RvciA9PT0gMjtcbiAgICAgIGNvbnN0IG5leHRSb3VuZEhhc0RvdWJsZVRoZU1hdGNoQ291bnQgPSBjdXJyZW50UmVsYXRpb24ubmV4dFJvdW5kTWF0Y2hGYWN0b3IgPT09IDI7XG4gICAgICBjb25zdCBkb3VibGVVcHBlck1hdGNoQ291bnRTaGlmdCA9IHByZXZpb3VzUm91bmRIYXNEb3VibGVUaGVNYXRjaENvdW50ID8gMSA6IDA7XG4gICAgICBjb25zdCBkb3VibGVMb3dlck1hdGNoQ291bnRTaGlmdCA9IG5leHRSb3VuZEhhc0RvdWJsZVRoZU1hdGNoQ291bnQgPyAxIDogMDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dFVwcGVyUm91bmRNYXRjaFBvc2l0aW9uOiAoZ2VuZXJhdGVNYXRjaFBvc2l0aW9uKG1hdGNoLCBjdXJyZW50UmVsYXRpb24ubmV4dFJvdW5kTWF0Y2hGYWN0b3IpIC1cbiAgICAgICAgICBkb3VibGVMb3dlck1hdGNoQ291bnRTaGlmdCkgYXMgQnJhY2tldE1hdGNoUG9zaXRpb24sXG4gICAgICAgIG5leHRMb3dlclJvdW5kTWF0Y2hQb3NpdGlvbjogZ2VuZXJhdGVNYXRjaFBvc2l0aW9uKG1hdGNoLCBjdXJyZW50UmVsYXRpb24ubmV4dFJvdW5kTWF0Y2hGYWN0b3IpLFxuICAgICAgICBwcmV2aW91c1VwcGVyUm91bmRNYXRjaFBvc2l0aW9uOiAoZ2VuZXJhdGVNYXRjaFBvc2l0aW9uKG1hdGNoLCBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNSb3VuZE1hdGNoRmFjdG9yKSAtXG4gICAgICAgICAgZG91YmxlVXBwZXJNYXRjaENvdW50U2hpZnQpIGFzIEJyYWNrZXRNYXRjaFBvc2l0aW9uLFxuICAgICAgICBwcmV2aW91c0xvd2VyUm91bmRNYXRjaFBvc2l0aW9uOiBnZW5lcmF0ZU1hdGNoUG9zaXRpb24obWF0Y2gsIGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3IpLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAndHdvLXRvLW9uZSc6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHRMb3dlclJvdW5kTWF0Y2hQb3NpdGlvbjogRkFMTEJBQ0tfTUFUQ0hfUE9TSVRJT04sXG4gICAgICAgIG5leHRVcHBlclJvdW5kTWF0Y2hQb3NpdGlvbjogZ2VuZXJhdGVNYXRjaFBvc2l0aW9uKG1hdGNoLCBjdXJyZW50UmVsYXRpb24ubmV4dFJvdW5kTWF0Y2hGYWN0b3IpLFxuICAgICAgICBwcmV2aW91c1VwcGVyUm91bmRNYXRjaFBvc2l0aW9uOiBnZW5lcmF0ZU1hdGNoUG9zaXRpb24obWF0Y2gsIGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1VwcGVyUm91bmRNYXRjaEZhY3RvciksXG4gICAgICAgIHByZXZpb3VzTG93ZXJSb3VuZE1hdGNoUG9zaXRpb246IGdlbmVyYXRlTWF0Y2hQb3NpdGlvbihtYXRjaCwgY3VycmVudFJlbGF0aW9uLnByZXZpb3VzTG93ZXJSb3VuZE1hdGNoRmFjdG9yKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ3R3by10by1ub3RoaW5nJzoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dExvd2VyUm91bmRNYXRjaFBvc2l0aW9uOiBGQUxMQkFDS19NQVRDSF9QT1NJVElPTixcbiAgICAgICAgbmV4dFVwcGVyUm91bmRNYXRjaFBvc2l0aW9uOiBGQUxMQkFDS19NQVRDSF9QT1NJVElPTixcbiAgICAgICAgcHJldmlvdXNVcHBlclJvdW5kTWF0Y2hQb3NpdGlvbjogZ2VuZXJhdGVNYXRjaFBvc2l0aW9uKG1hdGNoLCBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNVcHBlclJvdW5kTWF0Y2hGYWN0b3IpLFxuICAgICAgICBwcmV2aW91c0xvd2VyUm91bmRNYXRjaFBvc2l0aW9uOiBnZW5lcmF0ZU1hdGNoUG9zaXRpb24obWF0Y2gsIGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c0xvd2VyUm91bmRNYXRjaEZhY3RvciksXG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlTWF0Y2hQb3NpdGlvbiA9IChtYXRjaDogQnJhY2tldE1hdGNoPHVua25vd24sIHVua25vd24+LCBmYWN0b3I6IE1hdGNoRmFjdG9yKSA9PiB7XG4gIHJldHVybiBNYXRoLmNlaWwobWF0Y2gucG9zaXRpb24gKiBmYWN0b3IpIGFzIEJyYWNrZXRNYXRjaFBvc2l0aW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IGxvZ1JvdW5kUmVsYXRpb25zID0gKFxuICByb3VuZFJlbGF0aW9uczogQnJhY2tldFJvdW5kUmVsYXRpb25zPHVua25vd24sIHVua25vd24+LFxuICBicmFja2V0RGF0YTogQnJhY2tldERhdGE8dW5rbm93biwgdW5rbm93bj4sXG4pID0+IHtcbiAgZm9yIChjb25zdCBbcm91bmRJZCwgcmVsYXRpb25dIG9mIHJvdW5kUmVsYXRpb25zLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IHJvdW5kID0gYnJhY2tldERhdGEucm91bmRzLmdldChyb3VuZElkKTtcblxuICAgIGlmICghcm91bmQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFJvdW5kIHdpdGggaWQgJHtyb3VuZElkfSBub3QgZm91bmQgaW4gYnJhY2tldCBkYXRhLiBUaGUgYnJhY2tldCB3aWxsIGJlIG1hbGZvcm1lZC5gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHN3aXRjaCAocmVsYXRpb24udHlwZSkge1xuICAgICAgY2FzZSAnbm90aGluZy10by1vbmUnOlxuICAgICAgICBjb25zb2xlLmxvZyhgU1RBUlQ6ICR7cm91bmQubmFtZX0gLT4gJHtyZWxhdGlvbi5uZXh0Um91bmQubmFtZX0gKEY6ICR7cmVsYXRpb24ubmV4dFJvdW5kTWF0Y2hGYWN0b3J9KWApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29uZS10by1ub3RoaW5nJzpcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYCR7cmVsYXRpb24ucHJldmlvdXNSb3VuZC5uYW1lfSAoRjogJHtyZWxhdGlvbi5wcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3J9KSA8LSBFTkRJTkc6ICR7cm91bmQubmFtZX1gLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29uZS10by1vbmUnOlxuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgJHtyZWxhdGlvbi5wcmV2aW91c1JvdW5kLm5hbWV9IChGOiAke3JlbGF0aW9uLnByZXZpb3VzUm91bmRNYXRjaEZhY3Rvcn0pIDwtICR7cm91bmQubmFtZX0gLT4gJHtyZWxhdGlvbi5uZXh0Um91bmQubmFtZX0gKEY6ICR7cmVsYXRpb24ubmV4dFJvdW5kTWF0Y2hGYWN0b3J9KWAsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndHdvLXRvLW9uZSc6XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBNRVJHRVI6ICR7cmVsYXRpb24ucHJldmlvdXNVcHBlclJvdW5kLm5hbWV9IChGOiAke3JlbGF0aW9uLnByZXZpb3VzVXBwZXJSb3VuZE1hdGNoRmFjdG9yfSkgQU5EICR7cmVsYXRpb24ucHJldmlvdXNMb3dlclJvdW5kLm5hbWV9IChGOiAke3JlbGF0aW9uLnByZXZpb3VzTG93ZXJSb3VuZE1hdGNoRmFjdG9yfSkgPC0gJHtyb3VuZC5uYW1lfSAtPiAke3JlbGF0aW9uLm5leHRSb3VuZC5uYW1lfSAoRjogJHtyZWxhdGlvbi5uZXh0Um91bmRNYXRjaEZhY3Rvcn0pYCxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0d28tdG8tbm90aGluZyc6XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBNRVJHRVI6ICR7cmVsYXRpb24ucHJldmlvdXNVcHBlclJvdW5kLm5hbWV9IChGOiAke3JlbGF0aW9uLnByZXZpb3VzVXBwZXJSb3VuZE1hdGNoRmFjdG9yfSkgQU5EICR7cmVsYXRpb24ucHJldmlvdXNMb3dlclJvdW5kLm5hbWV9IChGOiAke3JlbGF0aW9uLnByZXZpb3VzTG93ZXJSb3VuZE1hdGNoRmFjdG9yfSkgPC0gRU5ESU5HOiAke3JvdW5kLm5hbWV9YCxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVNYXRjaFBhcnRpY2lwYW50TWFwID0gPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+KFxuICBicmFja2V0RGF0YTogQnJhY2tldERhdGE8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4sXG4pID0+IHtcbiAgY29uc3QgbWF0Y2hQYXJ0aWNpcGFudE1hcDogTWF0Y2hQYXJ0aWNpcGFudE1hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBoYXNFbGltaW5hdGlvbiA9XG4gICAgYnJhY2tldERhdGEubW9kZSA9PT0gVE9VUk5BTUVOVF9NT0RFLlNJTkdMRV9FTElNSU5BVElPTiB8fFxuICAgIGJyYWNrZXREYXRhLm1vZGUgPT09IFRPVVJOQU1FTlRfTU9ERS5ET1VCTEVfRUxJTUlOQVRJT04gfHxcbiAgICBicmFja2V0RGF0YS5tb2RlID09PSBUT1VSTkFNRU5UX01PREUuU1dJU1NfV0lUSF9FTElNSU5BVElPTjtcblxuICBmb3IgKGNvbnN0IHBhcnRpY2lwYW50IG9mIGJyYWNrZXREYXRhLnBhcnRpY2lwYW50cy52YWx1ZXMoKSkge1xuICAgIGxldCB3aW5zVGlsTm93ID0gMDtcbiAgICBsZXQgbG9zc2VzVGlsTm93ID0gMDtcbiAgICBsZXQgdGllc1RpbE5vdyA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IG1hdGNoUGFydGljaXBhbnRNYXRjaCBvZiBwYXJ0aWNpcGFudC5tYXRjaGVzLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCBpc1dpbm5lciA9IG1hdGNoUGFydGljaXBhbnRNYXRjaC5icmFja2V0TWF0Y2gud2lubmVyID09PSBtYXRjaFBhcnRpY2lwYW50TWF0Y2guc2lkZTtcbiAgICAgIGNvbnN0IGlzTG9vc2VyID1cbiAgICAgICAgbWF0Y2hQYXJ0aWNpcGFudE1hdGNoLmJyYWNrZXRNYXRjaC53aW5uZXIgJiZcbiAgICAgICAgbWF0Y2hQYXJ0aWNpcGFudE1hdGNoLmJyYWNrZXRNYXRjaC53aW5uZXIgIT09IG1hdGNoUGFydGljaXBhbnRNYXRjaC5zaWRlO1xuICAgICAgY29uc3QgaXNUaWUgPVxuICAgICAgICBtYXRjaFBhcnRpY2lwYW50TWF0Y2guYnJhY2tldE1hdGNoLnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcgJiYgIW1hdGNoUGFydGljaXBhbnRNYXRjaC5icmFja2V0TWF0Y2gud2lubmVyO1xuXG4gICAgICBpZiAoaXNXaW5uZXIpIHtcbiAgICAgICAgd2luc1RpbE5vdysrO1xuICAgICAgfSBlbHNlIGlmIChpc0xvb3Nlcikge1xuICAgICAgICBsb3NzZXNUaWxOb3crKztcbiAgICAgIH0gZWxzZSBpZiAoaXNUaWUpIHtcbiAgICAgICAgdGllc1RpbE5vdysrO1xuICAgICAgfVxuXG4gICAgICBsZXQgaXNFbGltaW5hdGVkID0gZmFsc2U7XG4gICAgICBsZXQgaXNFbGltaW5hdGlvbk1hdGNoID0gZmFsc2U7XG5cbiAgICAgIGlmIChoYXNFbGltaW5hdGlvbikge1xuICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgZWxpbWluYXRpb24gbG9naWNcblxuICAgICAgICAvLyBNZWFucyB0aGUgY3VycmVudCBtYXRjaCBpcyBsb3NzIGFuZCBpdCdzIHRoZSBsYXN0IG1hdGNoIG9mIHRoZSBwYXJ0aWNpcGFudFxuICAgICAgICBpc0VsaW1pbmF0ZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBBbHdheXMgdHJ1ZSBmb3Igc2luZ2xlIGVsaW1pbmF0aW9uLCBuZXZlciBmb3IgZS5nLiBncm91cHMsIGRlcGVuZHMgb24gdGhlIHJvdW5kIGZvciBkb3VibGUgZWxpbWluYXRpb24sIGRlcGVuZHMgb24gdGhlIGxvc3MgY291bnQgZm9yIHN3aXNzIHdpdGggZWxpbWluYXRpb25cbiAgICAgICAgaXNFbGltaW5hdGlvbk1hdGNoID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IEltcGxlbWVudCByb3VuZCBsb2dpY1xuICAgICAgLy8gdHJ1ZSBpZiBpdHMgdGhlIGZpcnN0IHJvdW5kIG9mIHRoZSBicmFja2V0XG4gICAgICBjb25zdCBpc0ZpcnN0Um91bmQgPSBmYWxzZTtcblxuICAgICAgLy8gdHJ1ZSBpZiBpdHMgdGhlIGxhc3Qgcm91bmQgb2YgdGhlIGJyYWNrZXQgKGVnLiBmaW5hbCBmb3Igc2luZ2xlIGVsaW1pbmF0aW9uKVxuICAgICAgY29uc3QgaXNMYXN0Um91bmQgPSBmYWxzZTtcblxuICAgICAgY29uc3QgcGFydGljaXBhbnRNYXRjaERhdGE6IE1hdGNoUGFydGljaXBhbnRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgICAgICAgYnJhY2tldE1hdGNoOiBtYXRjaFBhcnRpY2lwYW50TWF0Y2guYnJhY2tldE1hdGNoLFxuICAgICAgICByZXN1bHQ6IGlzV2lubmVyID8gJ3dpbicgOiBpc0xvb3NlciA/ICdsb3NzJyA6IGlzVGllID8gJ3RpZScgOiBudWxsLFxuICAgICAgICBpc0VsaW1pbmF0ZWQsXG4gICAgICAgIGlzRWxpbWluYXRpb25NYXRjaCxcbiAgICAgICAgaXNGaXJzdFJvdW5kLFxuICAgICAgICBpc0xhc3RSb3VuZCxcbiAgICAgICAgdGllQ291bnQ6IHRpZXNUaWxOb3csXG4gICAgICAgIHdpbkNvdW50OiB3aW5zVGlsTm93LFxuICAgICAgICBsb3NzQ291bnQ6IGxvc3Nlc1RpbE5vdyxcbiAgICAgIH07XG5cbiAgICAgIGlmICghbWF0Y2hQYXJ0aWNpcGFudE1hcC5oYXMocGFydGljaXBhbnQuaWQpKSB7XG4gICAgICAgIG1hdGNoUGFydGljaXBhbnRNYXAuc2V0KHBhcnRpY2lwYW50LmlkLCB7XG4gICAgICAgICAgaWQ6IHBhcnRpY2lwYW50LmlkLFxuICAgICAgICAgIG5hbWU6IHBhcnRpY2lwYW50Lm5hbWUsXG4gICAgICAgICAgbWF0Y2hlczogbmV3IE1hcCgpLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFydGljaXBhbnREYXRhID0gbWF0Y2hQYXJ0aWNpcGFudE1hcC5nZXQocGFydGljaXBhbnQuaWQpIGFzIE1hdGNoUGFydGljaXBhbnQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gICAgICBwYXJ0aWNpcGFudERhdGEubWF0Y2hlcy5zZXQobWF0Y2hQYXJ0aWNpcGFudE1hdGNoLmJyYWNrZXRNYXRjaC5pZCwgcGFydGljaXBhbnRNYXRjaERhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtYXRjaFBhcnRpY2lwYW50TWFwO1xufTtcblxuY29uc3QgZmFjdG9yaWFsQ2FjaGUgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuXG5leHBvcnQgY29uc3QgZ2V0QXZhaWxhYmxlU3dpc3NHcm91cHNGb3JSb3VuZCA9IChyb3VuZE51bWJlcjogbnVtYmVyLCB0b3RhbE1hdGNoZXNJblJvdW5kOiBudW1iZXIpID0+IHtcbiAgY29uc3QgQURWQU5DRV9XSU5TID0gMztcbiAgY29uc3QgRUxJTUlOQVRFX0xPU1NFUyA9IDM7XG5cbiAgLy8gQ2FjaGUgZmFjdG9yaWFsIGNhbGN1bGF0aW9uc1xuICBjb25zdCBnZXRGYWN0b3JpYWwgPSAobjogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICBpZiAobiA8PSAxKSByZXR1cm4gMTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgIGlmIChmYWN0b3JpYWxDYWNoZS5oYXMobikpIHJldHVybiBmYWN0b3JpYWxDYWNoZS5nZXQobikhO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gbiAqIGdldEZhY3RvcmlhbChuIC0gMSk7XG4gICAgZmFjdG9yaWFsQ2FjaGUuc2V0KG4sIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBQcmUtY2FsY3VsYXRlIHJvdW5kRmFjdG9yaWFsXG4gIGNvbnN0IHJvdW5kRmFjdCA9IGdldEZhY3RvcmlhbChyb3VuZE51bWJlcik7XG5cbiAgbGV0IHRvdGFsQ29tYmluYXRpb25zID0gMDtcbiAgY29uc3QgdmFsaWRHcm91cHM6IHsgd2luczogbnVtYmVyOyBsb3NzZXM6IG51bWJlcjsgY29tYmluYXRpb25zOiBudW1iZXIgfVtdID0gW107XG5cbiAgLy8gU2luZ2xlIGxvb3AgdG8gZ2F0aGVyIHZhbGlkIGdyb3VwcyBhbmQgdG90YWwgY29tYmluYXRpb25zXG4gIGZvciAobGV0IHdpbnMgPSByb3VuZE51bWJlcjsgd2lucyA+PSAwOyB3aW5zLS0pIHtcbiAgICBjb25zdCBsb3NzZXMgPSByb3VuZE51bWJlciAtIHdpbnM7XG4gICAgY29uc3QgcmVtYWluaW5nR2FtZXMgPSBBRFZBTkNFX1dJTlMgKyBFTElNSU5BVEVfTE9TU0VTIC0gKHdpbnMgKyBsb3NzZXMpIC0gMTtcbiAgICBjb25zdCBub3RZZXRFbGltaW5hdGVkID0gbG9zc2VzIDwgRUxJTUlOQVRFX0xPU1NFUztcbiAgICBjb25zdCBjYW5TdGlsbEFkdmFuY2UgPSB3aW5zIDwgQURWQU5DRV9XSU5TICYmIHJlbWFpbmluZ0dhbWVzID49IDA7XG5cbiAgICBpZiAoIWNhblN0aWxsQWR2YW5jZSB8fCAhbm90WWV0RWxpbWluYXRlZCkgY29udGludWU7XG5cbiAgICBjb25zdCBjb21iaW5hdGlvbnMgPSByb3VuZEZhY3QgLyAoZ2V0RmFjdG9yaWFsKHdpbnMpICogZ2V0RmFjdG9yaWFsKGxvc3NlcykpO1xuICAgIHRvdGFsQ29tYmluYXRpb25zICs9IGNvbWJpbmF0aW9ucztcbiAgICB2YWxpZEdyb3Vwcy5wdXNoKHsgd2lucywgbG9zc2VzLCBjb21iaW5hdGlvbnMgfSk7XG4gIH1cblxuICAvLyBDcmVhdGUgZmluYWwgZ3JvdXBzIHdpdGggY2FsY3VsYXRlZCBwcm9wb3J0aW9uc1xuICByZXR1cm4gdmFsaWRHcm91cHMubWFwKCh7IHdpbnMsIGxvc3NlcywgY29tYmluYXRpb25zIH0pID0+ICh7XG4gICAgaWQ6IGAke3dpbnN9LSR7bG9zc2VzfWAgYXMgQnJhY2tldFJvdW5kU3dpc3NHcm91cElkLFxuICAgIG5hbWU6IGAke3dpbnN9LSR7bG9zc2VzfWAsXG4gICAgbWF0Y2hlc0luR3JvdXA6IE1hdGgucm91bmQoKGNvbWJpbmF0aW9ucyAvIHRvdGFsQ29tYmluYXRpb25zKSAqIHRvdGFsTWF0Y2hlc0luUm91bmQpLFxuICB9KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVCcmFja2V0Um91bmRTd2lzc0dyb3VwTWFwcyA9IDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPihcbiAgYnJhY2tldERhdGE6IEJyYWNrZXREYXRhPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+LFxuICBtYXRjaFBhcnRpY2lwYW50TWFwOiBNYXRjaFBhcnRpY2lwYW50TWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+LFxuKSA9PiB7XG4gIGlmIChicmFja2V0RGF0YS5tb2RlICE9PSBUT1VSTkFNRU5UX01PREUuU1dJU1NfV0lUSF9FTElNSU5BVElPTikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgcm91bmRzV2l0aFN3aXNzR3JvdXBzOiBCcmFja2V0Um91bmRNYXBXaXRoU3dpc3NEYXRhPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0gbmV3IE1hcCgpO1xuXG4gIGxldCByb3VuZE51bWJlciA9IDA7XG4gIGZvciAoY29uc3QgYnJhY2tldFJvdW5kIG9mIGJyYWNrZXREYXRhLnJvdW5kcy52YWx1ZXMoKSkge1xuICAgIGNvbnN0IGF2YWlsYWJsZUdyb3VwcyA9IGdldEF2YWlsYWJsZVN3aXNzR3JvdXBzRm9yUm91bmQocm91bmROdW1iZXIsIGJyYWNrZXRSb3VuZC5tYXRjaENvdW50KTtcblxuICAgIGNvbnN0IHJvdW5kU3dpc3NEYXRhOiBCcmFja2V0Um91bmRTd2lzc0RhdGE8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gICAgICBncm91cHM6IG5ldyBNYXAoKSxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiBhdmFpbGFibGVHcm91cHMpIHtcbiAgICAgIGNvbnN0IHN1Ykdyb3VwOiBCcmFja2V0Um91bmRTd2lzc0dyb3VwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICAgICAgICBpZDogZ3JvdXAuaWQsXG4gICAgICAgIG5hbWU6IGdyb3VwLm5hbWUsXG4gICAgICAgIG1hdGNoZXM6IG5ldyBNYXAoKSxcbiAgICAgICAgYWxsb3dlZE1hdGNoQ291bnQ6IGdyb3VwLm1hdGNoZXNJbkdyb3VwLFxuICAgICAgfTtcblxuICAgICAgcm91bmRTd2lzc0RhdGEuZ3JvdXBzLnNldChncm91cC5pZCwgc3ViR3JvdXApO1xuICAgIH1cblxuICAgIGNvbnN0IGVtcHR5TWF0Y2hJZHM6IEJyYWNrZXRNYXRjaElkW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgYnJhY2tldFJvdW5kLm1hdGNoZXMudmFsdWVzKCkpIHtcbiAgICAgIGNvbnN0IHBhcnRpY2lwYW50SG9tZSA9IG1hdGNoLmhvbWUgPyAobWF0Y2hQYXJ0aWNpcGFudE1hcC5nZXQobWF0Y2guaG9tZSkgPz8gbnVsbCkgOiBudWxsO1xuICAgICAgY29uc3QgcGFydGljaXBhbnRBd2F5ID0gbWF0Y2guYXdheSA/IChtYXRjaFBhcnRpY2lwYW50TWFwLmdldChtYXRjaC5hd2F5KSA/PyBudWxsKSA6IG51bGw7XG5cbiAgICAgIGNvbnN0IGFueVBhcnRpY2lwYW50ID0gcGFydGljaXBhbnRIb21lIHx8IHBhcnRpY2lwYW50QXdheTtcblxuICAgICAgaWYgKCFhbnlQYXJ0aWNpcGFudCkge1xuICAgICAgICBlbXB0eU1hdGNoSWRzLnB1c2gobWF0Y2guaWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF0Y2hQYXJ0aWNpcGFudE1hdGNoID0gYW55UGFydGljaXBhbnQubWF0Y2hlcy5nZXQobWF0Y2guaWQpO1xuXG4gICAgICBpZiAoIW1hdGNoUGFydGljaXBhbnRNYXRjaCkgdGhyb3cgbmV3IEVycm9yKCdNYXRjaCBwYXJ0aWNpcGFudCBtYXRjaCBub3QgZm91bmQnKTtcblxuICAgICAgY29uc3Qgd2lucyA9IG1hdGNoUGFydGljaXBhbnRNYXRjaC53aW5Db3VudDtcbiAgICAgIGNvbnN0IGxvc3NlcyA9IG1hdGNoUGFydGljaXBhbnRNYXRjaC5sb3NzQ291bnQ7XG5cbiAgICAgIGNvbnN0IGdyb3VwID0gcm91bmRTd2lzc0RhdGEuZ3JvdXBzLmdldChgJHt3aW5zfS0ke2xvc3Nlc31gIGFzIEJyYWNrZXRSb3VuZFN3aXNzR3JvdXBJZCk7XG5cbiAgICAgIGlmICghZ3JvdXApIHRocm93IG5ldyBFcnJvcignR3JvdXAgbm90IGZvdW5kIGZvciBtYXRjaDogJyArIG1hdGNoLmlkKTtcblxuICAgICAgZ3JvdXAubWF0Y2hlcy5zZXQobWF0Y2guaWQsIG1hdGNoKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVtcHR5TWF0Y2hJZCBvZiBlbXB0eU1hdGNoSWRzKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGJyYWNrZXRSb3VuZC5tYXRjaGVzLmdldChlbXB0eU1hdGNoSWQpO1xuXG4gICAgICBpZiAoIW1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoJ0VtcHR5IG1hdGNoIG5vdCBmb3VuZCcpO1xuXG4gICAgICBsZXQgZ3JvdXBGb3VuZCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBncm91cCBvZiByb3VuZFN3aXNzRGF0YS5ncm91cHMudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKGdyb3VwLm1hdGNoZXMuc2l6ZSA8IGdyb3VwLmFsbG93ZWRNYXRjaENvdW50KSB7XG4gICAgICAgICAgZ3JvdXAubWF0Y2hlcy5zZXQobWF0Y2guaWQsIG1hdGNoKTtcbiAgICAgICAgICBncm91cEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWdyb3VwRm91bmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBncm91cCBmb3VuZCBmb3IgZW1wdHkgbWF0Y2gnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByb3VuZE51bWJlcisrO1xuICB9XG5cbiAgcmV0dXJuIHJvdW5kc1dpdGhTd2lzc0dyb3Vwcztcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUJyYWNrZXREYXRhRm9yRXRobGV0ZSA9IChzb3VyY2U6IFJvdW5kU3RhZ2VTdHJ1Y3R1cmVXaXRoTWF0Y2hlc1ZpZXdbXSkgPT4ge1xuICBjb25zdCB0b3VybmFtZW50TW9kZSA9IGdlbmVyYXRlVG91cm5hbWVudE1vZGVGb3JtRXRobGV0ZVJvdW5kcyhzb3VyY2UpO1xuXG4gIGNvbnN0IGJyYWNrZXREYXRhOiBCcmFja2V0RGF0YVNvdXJjZTxSb3VuZFN0YWdlU3RydWN0dXJlVmlldywgTWF0Y2hMaXN0Vmlld1VuaW9uPiA9IHtcbiAgICByb3VuZHM6IFtdLFxuICAgIG1hdGNoZXM6IFtdLFxuICAgIG1vZGU6IHRvdXJuYW1lbnRNb2RlLFxuICB9O1xuXG4gIGZvciAoY29uc3QgY3VycmVudEl0ZW0gb2Ygc291cmNlKSB7XG4gICAgaWYgKGJyYWNrZXREYXRhLnJvdW5kcy5zb21lKChyKSA9PiByLmlkID09PSBjdXJyZW50SXRlbS5yb3VuZC5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUm91bmQgd2l0aCBpZCAke2N1cnJlbnRJdGVtLnJvdW5kLmlkfSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgYnJhY2tldCBkYXRhLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHJvdW5kVHlwZSA9IGdlbmVyYXRlUm91bmRUeXBlRnJvbUV0aGxldGVSb3VuZFR5cGUoY3VycmVudEl0ZW0ucm91bmQudHlwZSwgdG91cm5hbWVudE1vZGUpO1xuXG4gICAgY29uc3QgYnJhY2tldFJvdW5kOiBCcmFja2V0Um91bmRTb3VyY2U8Um91bmRTdGFnZVN0cnVjdHVyZVZpZXc+ID0ge1xuICAgICAgdHlwZTogcm91bmRUeXBlLFxuICAgICAgaWQ6IGN1cnJlbnRJdGVtLnJvdW5kLmlkLFxuICAgICAgZGF0YTogY3VycmVudEl0ZW0ucm91bmQsXG4gICAgICBuYW1lOiBjdXJyZW50SXRlbS5yb3VuZC5uYW1lIHx8IGN1cnJlbnRJdGVtLnJvdW5kLnR5cGUsXG4gICAgfTtcblxuICAgIGJyYWNrZXREYXRhLnJvdW5kcy5wdXNoKGJyYWNrZXRSb3VuZCk7XG5cbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGN1cnJlbnRJdGVtLm1hdGNoZXMpIHtcbiAgICAgIGlmIChicmFja2V0RGF0YS5tYXRjaGVzLnNvbWUoKG0pID0+IG0uaWQgPT09IG1hdGNoLmlkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hdGNoIHdpdGggaWQgJHttYXRjaC5pZH0gYWxyZWFkeSBleGlzdHMgaW4gdGhlIGJyYWNrZXQgZGF0YS5gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnJhY2tldE1hdGNoOiBCcmFja2V0TWF0Y2hTb3VyY2U8TWF0Y2hMaXN0Vmlld1VuaW9uPiA9IHtcbiAgICAgICAgaWQ6IG1hdGNoLmlkLFxuICAgICAgICBkYXRhOiBtYXRjaCxcbiAgICAgICAgcm91bmRJZDogY3VycmVudEl0ZW0ucm91bmQuaWQsXG4gICAgICAgIGhvbWU6IG1hdGNoLmhvbWU/LmlkIHx8IG51bGwsXG4gICAgICAgIGF3YXk6IG1hdGNoLmF3YXk/LmlkIHx8IG51bGwsXG4gICAgICAgIHdpbm5lcjogbWF0Y2gud2lubmluZ1NpZGUsXG4gICAgICAgIHN0YXR1czogbWF0Y2guc3RhdHVzID09PSAncHVibGlzaGVkJyA/ICdjb21wbGV0ZWQnIDogJ3BlbmRpbmcnLFxuICAgICAgfTtcblxuICAgICAgYnJhY2tldERhdGEubWF0Y2hlcy5wdXNoKGJyYWNrZXRNYXRjaCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJyYWNrZXREYXRhO1xufTtcblxudHlwZSBHZW5lcmF0ZUJyYWNrZXRNYXRjaE9wdGlvbnM8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gIGJyYWNrZXREYXRhOiBCcmFja2V0RGF0YTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgYnJhY2tldFJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIGN1cnJlbnRJbmRleEluUm91bmQ6IG51bWJlcjtcbn07XG5cbmNvbnN0IGdlbmVyYXRlQW5kU2V0QnJhY2tldE1hdGNoV2l0aFBhcnRpY2lwYW50cyA9IDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPihcbiAgbWF0Y2g6IEJyYWNrZXRNYXRjaFNvdXJjZTxUTWF0Y2hEYXRhPixcbiAgb3B0aW9uczogR2VuZXJhdGVCcmFja2V0TWF0Y2hPcHRpb25zPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+LFxuKSA9PiB7XG4gIGNvbnN0IG1hdGNoSWQgPSBtYXRjaC5pZCBhcyBCcmFja2V0TWF0Y2hJZDtcbiAgY29uc3QgeyBicmFja2V0RGF0YSwgYnJhY2tldFJvdW5kLCBjdXJyZW50SW5kZXhJblJvdW5kIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IGJyYWNrZXRNYXRjaDogQnJhY2tldE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICAgIGlkOiBtYXRjaElkLFxuICAgIGluZGV4SW5Sb3VuZDogY3VycmVudEluZGV4SW5Sb3VuZCxcbiAgICBwb3NpdGlvbjogKGN1cnJlbnRJbmRleEluUm91bmQgKyAxKSBhcyBCcmFja2V0TWF0Y2hQb3NpdGlvbixcbiAgICBkYXRhOiBtYXRjaC5kYXRhLFxuICAgIHJvdW5kOiBicmFja2V0Um91bmQsXG4gICAgaG9tZTogbWF0Y2guaG9tZSBhcyBNYXRjaFBhcnRpY2lwYW50SWQgfCBudWxsLFxuICAgIGF3YXk6IG1hdGNoLmF3YXkgYXMgTWF0Y2hQYXJ0aWNpcGFudElkIHwgbnVsbCxcbiAgICB3aW5uZXI6IG1hdGNoLndpbm5lcixcbiAgICBzdGF0dXM6IG1hdGNoLnN0YXR1cyxcbiAgfTtcblxuICBicmFja2V0RGF0YS5tYXRjaGVzLnNldChtYXRjaElkLCBicmFja2V0TWF0Y2gpO1xuICBicmFja2V0Um91bmQubWF0Y2hlcy5zZXQobWF0Y2hJZCwgYnJhY2tldE1hdGNoKTtcblxuICBjb25zdCBwYXJ0aWNpcGFudHMgPSBbYnJhY2tldE1hdGNoLmhvbWUsIGJyYWNrZXRNYXRjaC5hd2F5XTtcblxuICBmb3IgKGNvbnN0IFtwYXJ0aWNpcGFudEluZGV4LCBwYXJ0aWNpcGFudF0gb2YgcGFydGljaXBhbnRzLmVudHJpZXMoKSkge1xuICAgIGlmICghcGFydGljaXBhbnQpIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qgc2lkZSA9IHBhcnRpY2lwYW50SW5kZXggPT09IDAgPyAnSG9tZXNpZGUnIDogJ0F3YXlzaWRlJztcblxuICAgIGlmICghYnJhY2tldERhdGEucGFydGljaXBhbnRzLmhhcyhwYXJ0aWNpcGFudCkpIHtcbiAgICAgIGJyYWNrZXREYXRhLnBhcnRpY2lwYW50cy5zZXQocGFydGljaXBhbnQsIHtcbiAgICAgICAgaWQ6IHBhcnRpY2lwYW50LFxuICAgICAgICBuYW1lOiBgJHtzaWRlfSAke2N1cnJlbnRJbmRleEluUm91bmR9YCxcbiAgICAgICAgbWF0Y2hlczogbmV3IE1hcCgpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydGljaXBhbnREYXRhID0gYnJhY2tldERhdGEucGFydGljaXBhbnRzLmdldChwYXJ0aWNpcGFudCkgYXMgQnJhY2tldFBhcnRpY2lwYW50PFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuXG4gICAgaWYgKCFwYXJ0aWNpcGFudERhdGEubWF0Y2hlcy5oYXMoYnJhY2tldE1hdGNoLmlkKSkge1xuICAgICAgcGFydGljaXBhbnREYXRhLm1hdGNoZXMuc2V0KGJyYWNrZXRNYXRjaC5pZCwge1xuICAgICAgICBzaWRlOiBicmFja2V0TWF0Y2guaG9tZSA9PT0gcGFydGljaXBhbnQgPyAnaG9tZScgOiAnYXdheScsXG4gICAgICAgIGJyYWNrZXRNYXRjaCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBicmFja2V0TWF0Y2g7XG59O1xuXG5leHBvcnQgdHlwZSBHZW5lcmF0ZUJyYWNrZXREYXRhT3B0aW9ucyA9IHtcbiAgbGF5b3V0OiBCcmFja2V0RGF0YUxheW91dDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUJyYWNrZXREYXRhID0gPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+KFxuICBzb3VyY2U6IEJyYWNrZXREYXRhU291cmNlPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+LFxuICBvcHRpb25zOiBHZW5lcmF0ZUJyYWNrZXREYXRhT3B0aW9ucyxcbikgPT4ge1xuICBpZiAoIWNhblJlbmRlckxheW91dEluVG91cm5hbWVudE1vZGUob3B0aW9ucy5sYXlvdXQsIHNvdXJjZS5tb2RlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlbmRlciBsYXlvdXQgJHtvcHRpb25zLmxheW91dH0gaW4gbW9kZSAke3NvdXJjZS5tb2RlfWApO1xuICB9XG5cbiAgY29uc3Qgc2hvdWxkU3BsaXRSb3VuZHNJblR3byA9IG9wdGlvbnMubGF5b3V0ID09PSBCUkFDS0VUX0RBVEFfTEFZT1VULk1JUlJPUkVEO1xuXG4gIGNvbnN0IGJyYWNrZXREYXRhOiBCcmFja2V0RGF0YTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgICBtYXRjaGVzOiBuZXcgTWFwKCksXG4gICAgbW9kZTogc291cmNlLm1vZGUsXG4gICAgcGFydGljaXBhbnRzOiBuZXcgTWFwKCksXG4gICAgcm91bmRzOiBuZXcgTWFwKCksXG4gICAgcm91bmRJZHM6IFtdLFxuICAgIG1hdGNoSWRzOiBbXSxcbiAgfTtcblxuICBsZXQgY3VycmVudFVwcGVyQnJhY2tldEluZGV4ID0gMDtcbiAgbGV0IGN1cnJlbnRMb3dlckJyYWNrZXRJbmRleCA9IDA7XG5cbiAgY29uc3Qgc3BsaXRSb3VuZHNSZXN0OiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT5bXSA9IFtdO1xuXG4gIGZvciAoY29uc3Qgcm91bmQgb2Ygc291cmNlLnJvdW5kcykge1xuICAgIGNvbnN0IGlzTG93ZXJCcmFja2V0ID0gcm91bmQudHlwZSA9PT0gRE9VQkxFX0VMSU1JTkFUSU9OX0JSQUNLRVRfUk9VTkRfVFlQRS5MT1dFUl9CUkFDS0VUO1xuICAgIGNvbnN0IG1hdGNoZXMgPSBzb3VyY2UubWF0Y2hlcy5maWx0ZXIoKG0pID0+IG0ucm91bmRJZCA9PT0gcm91bmQuaWQpO1xuICAgIGNvbnN0IHJvdW5kSWQgPSByb3VuZC5pZCBhcyBCcmFja2V0Um91bmRJZDtcbiAgICBjb25zdCBzaG91bGRTcGxpdFJvdW5kID0gc2hvdWxkU3BsaXRSb3VuZHNJblR3byAmJiBtYXRjaGVzLmxlbmd0aCAlIDIgPT09IDA7XG5cbiAgICBpZiAoc2hvdWxkU3BsaXRSb3VuZCkge1xuICAgICAgY29uc3QgZmlyc3RIYWxmTWF0Y2hlc01heEluZGV4ID0gbWF0Y2hlcy5sZW5ndGggLyAyIC0gMTtcblxuICAgICAgY29uc3QgZmlyc3RIYWxmUm91bmRJZCA9IGAke3JvdW5kSWR9LS1oYWxmLTFgIGFzIEJyYWNrZXRSb3VuZElkO1xuICAgICAgY29uc3Qgc2Vjb25kSGFsZlJvdW5kSWQgPSBgJHtyb3VuZElkfS0taGFsZi0yYCBhcyBCcmFja2V0Um91bmRJZDtcblxuICAgICAgY29uc3QgYnJhY2tldFJvdW5kRmlyc3RIYWxmOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gICAgICAgIHR5cGU6IHJvdW5kLnR5cGUsXG4gICAgICAgIGlkOiBmaXJzdEhhbGZSb3VuZElkLFxuICAgICAgICBpbmRleDogaXNMb3dlckJyYWNrZXQgPyBjdXJyZW50TG93ZXJCcmFja2V0SW5kZXggOiBjdXJyZW50VXBwZXJCcmFja2V0SW5kZXgsXG4gICAgICAgIGRhdGE6IHJvdW5kLmRhdGEsXG4gICAgICAgIHBvc2l0aW9uOiAoKGlzTG93ZXJCcmFja2V0ID8gY3VycmVudExvd2VyQnJhY2tldEluZGV4IDogY3VycmVudFVwcGVyQnJhY2tldEluZGV4KSArIDEpIGFzIEJyYWNrZXRSb3VuZFBvc2l0aW9uLFxuICAgICAgICBuYW1lOiByb3VuZC5uYW1lLFxuICAgICAgICBtYXRjaENvdW50OiBtYXRjaGVzLmxlbmd0aCAvIDIsXG4gICAgICAgIG1hdGNoZXM6IG5ldyBNYXAoKSxcbiAgICAgICAgbWlycm9yUm91bmRUeXBlOiBCUkFDS0VUX1JPVU5EX01JUlJPUl9UWVBFLkxFRlQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBicmFja2V0Um91bmRTZWNvbmRIYWxmOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gICAgICAgIHR5cGU6IHJvdW5kLnR5cGUsXG4gICAgICAgIGlkOiBzZWNvbmRIYWxmUm91bmRJZCxcbiAgICAgICAgaW5kZXg6IC0xLFxuICAgICAgICBkYXRhOiByb3VuZC5kYXRhLFxuICAgICAgICBwb3NpdGlvbjogLTEgYXMgQnJhY2tldFJvdW5kUG9zaXRpb24sXG4gICAgICAgIG5hbWU6IHJvdW5kLm5hbWUsXG4gICAgICAgIG1hdGNoQ291bnQ6IG1hdGNoZXMubGVuZ3RoIC8gMixcbiAgICAgICAgbWF0Y2hlczogbmV3IE1hcCgpLFxuICAgICAgICBtaXJyb3JSb3VuZFR5cGU6IEJSQUNLRVRfUk9VTkRfTUlSUk9SX1RZUEUuUklHSFQsXG4gICAgICB9O1xuXG4gICAgICBicmFja2V0RGF0YS5yb3VuZElkcy5wdXNoKGZpcnN0SGFsZlJvdW5kSWQpO1xuICAgICAgYnJhY2tldERhdGEucm91bmRzLnNldChmaXJzdEhhbGZSb3VuZElkLCBicmFja2V0Um91bmRGaXJzdEhhbGYpO1xuICAgICAgc3BsaXRSb3VuZHNSZXN0LnVuc2hpZnQoYnJhY2tldFJvdW5kU2Vjb25kSGFsZik7XG5cbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPD0gZmlyc3RIYWxmTWF0Y2hlc01heEluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoRmlyc3QgPSBtYXRjaGVzW2luZGV4XTtcbiAgICAgICAgY29uc3QgbWF0Y2hTZWNvbmQgPSBtYXRjaGVzW2ZpcnN0SGFsZk1hdGNoZXNNYXhJbmRleCArIDEgKyBpbmRleF07XG5cbiAgICAgICAgaWYgKCFtYXRjaEZpcnN0IHx8ICFtYXRjaFNlY29uZCkgdGhyb3cgbmV3IEVycm9yKCdNYXRjaCBub3QgZm91bmQnKTtcblxuICAgICAgICBjb25zdCBicmFja2V0TWF0Y2hGaXJzdCA9IGdlbmVyYXRlQW5kU2V0QnJhY2tldE1hdGNoV2l0aFBhcnRpY2lwYW50cyhtYXRjaEZpcnN0LCB7XG4gICAgICAgICAgYnJhY2tldERhdGEsXG4gICAgICAgICAgYnJhY2tldFJvdW5kOiBicmFja2V0Um91bmRGaXJzdEhhbGYsXG4gICAgICAgICAgY3VycmVudEluZGV4SW5Sb3VuZDogaW5kZXgsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBicmFja2V0TWF0Y2hTZWNvbmQgPSBnZW5lcmF0ZUFuZFNldEJyYWNrZXRNYXRjaFdpdGhQYXJ0aWNpcGFudHMobWF0Y2hTZWNvbmQsIHtcbiAgICAgICAgICBicmFja2V0RGF0YSxcbiAgICAgICAgICBicmFja2V0Um91bmQ6IGJyYWNrZXRSb3VuZFNlY29uZEhhbGYsXG4gICAgICAgICAgY3VycmVudEluZGV4SW5Sb3VuZDogaW5kZXgsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJyYWNrZXREYXRhLm1hdGNoSWRzLnB1c2goYnJhY2tldE1hdGNoRmlyc3QuaWQsIGJyYWNrZXRNYXRjaFNlY29uZC5pZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJyYWNrZXRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICAgICAgICB0eXBlOiByb3VuZC50eXBlLFxuICAgICAgICBpZDogcm91bmRJZCxcbiAgICAgICAgaW5kZXg6IGlzTG93ZXJCcmFja2V0ID8gY3VycmVudExvd2VyQnJhY2tldEluZGV4IDogY3VycmVudFVwcGVyQnJhY2tldEluZGV4LFxuICAgICAgICBkYXRhOiByb3VuZC5kYXRhLFxuICAgICAgICBwb3NpdGlvbjogKChpc0xvd2VyQnJhY2tldCA/IGN1cnJlbnRMb3dlckJyYWNrZXRJbmRleCA6IGN1cnJlbnRVcHBlckJyYWNrZXRJbmRleCkgKyAxKSBhcyBCcmFja2V0Um91bmRQb3NpdGlvbixcbiAgICAgICAgbmFtZTogcm91bmQubmFtZSxcbiAgICAgICAgbWF0Y2hDb3VudDogbWF0Y2hlcy5sZW5ndGgsXG4gICAgICAgIG1hdGNoZXM6IG5ldyBNYXAoKSxcbiAgICAgICAgbWlycm9yUm91bmRUeXBlOiBudWxsLFxuICAgICAgfTtcblxuICAgICAgYnJhY2tldERhdGEucm91bmRJZHMucHVzaChyb3VuZElkKTtcbiAgICAgIGJyYWNrZXREYXRhLnJvdW5kcy5zZXQocm91bmRJZCwgYnJhY2tldFJvdW5kKTtcblxuICAgICAgbGV0IGN1cnJlbnRJbmRleEluUm91bmQgPSAwO1xuXG4gICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgY29uc3QgYnJhY2tldE1hdGNoID0gZ2VuZXJhdGVBbmRTZXRCcmFja2V0TWF0Y2hXaXRoUGFydGljaXBhbnRzKG1hdGNoLCB7XG4gICAgICAgICAgYnJhY2tldERhdGEsXG4gICAgICAgICAgYnJhY2tldFJvdW5kLFxuICAgICAgICAgIGN1cnJlbnRJbmRleEluUm91bmQsXG4gICAgICAgIH0pO1xuICAgICAgICBicmFja2V0RGF0YS5tYXRjaElkcy5wdXNoKGJyYWNrZXRNYXRjaC5pZCk7XG4gICAgICAgIGN1cnJlbnRJbmRleEluUm91bmQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNMb3dlckJyYWNrZXQpIHtcbiAgICAgIGN1cnJlbnRMb3dlckJyYWNrZXRJbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50VXBwZXJCcmFja2V0SW5kZXgrKztcbiAgICB9XG4gIH1cblxuICBpZiAoc3BsaXRSb3VuZHNSZXN0Lmxlbmd0aCkge1xuICAgIGNvbnN0IGxhc3RSb3VuZElkID0gYnJhY2tldERhdGEucm91bmRJZHNbYnJhY2tldERhdGEucm91bmRJZHMubGVuZ3RoIC0gMV07XG5cbiAgICBpZiAoIWxhc3RSb3VuZElkKSB0aHJvdyBuZXcgRXJyb3IoJ0xhc3Qgcm91bmQgaWQgbm90IGZvdW5kJyk7XG5cbiAgICBjb25zdCBsYXN0Um91bmQgPSBicmFja2V0RGF0YS5yb3VuZHMuZ2V0KGxhc3RSb3VuZElkKTtcblxuICAgIGlmICghbGFzdFJvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ0xhc3Qgcm91bmQgbm90IGZvdW5kJyk7XG5cbiAgICBmb3IgKGNvbnN0IFtzcGxpdFJvdW5kSW5kZXgsIHNwbGl0Um91bmRdIG9mIHNwbGl0Um91bmRzUmVzdC5lbnRyaWVzKCkpIHtcbiAgICAgIHNwbGl0Um91bmQuaW5kZXggPSBsYXN0Um91bmQuaW5kZXggKyBzcGxpdFJvdW5kSW5kZXggKyAxO1xuICAgICAgc3BsaXRSb3VuZC5wb3NpdGlvbiA9IChsYXN0Um91bmQucG9zaXRpb24gKyBzcGxpdFJvdW5kSW5kZXggKyAxKSBhcyBCcmFja2V0Um91bmRQb3NpdGlvbjtcbiAgICAgIGJyYWNrZXREYXRhLnJvdW5kcy5zZXQoc3BsaXRSb3VuZC5pZCwgc3BsaXRSb3VuZCk7XG4gICAgICBicmFja2V0RGF0YS5yb3VuZElkcy5wdXNoKHNwbGl0Um91bmQuaWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBicmFja2V0RGF0YTtcbn07XG4iXX0=
942
+ export const generateTournamentModeFormGgData = (source) => {
943
+ switch (source.mode) {
944
+ // case 'groups':
945
+ // return TOURNAMENT_MODE.GROUP;
946
+ // case 'fifa_swiss': {
947
+ // const lastRound = source[source.length - 1];
948
+ // if (!lastRound) throw new Error('No last round found');
949
+ // if (lastRound.matches.length !== firstRound.matches.length) {
950
+ // return TOURNAMENT_MODE.SWISS_WITH_ELIMINATION;
951
+ // } else {
952
+ // return TOURNAMENT_MODE.SWISS;
953
+ // }
954
+ // }
955
+ case 'double-elimination':
956
+ return TOURNAMENT_MODE.DOUBLE_ELIMINATION;
957
+ case 'single-elimination':
958
+ return TOURNAMENT_MODE.SINGLE_ELIMINATION;
959
+ default:
960
+ throw new Error(`Unsupported tournament mode: ${source.mode}`);
961
+ }
962
+ };
963
+ export const generateRoundTypeFromGgMatch = (tournamentMode, bracketType, // 'winner' | 'looser' | null,
964
+ stageNumber, matchCount) => {
965
+ switch (tournamentMode) {
966
+ case 'double-elimination': {
967
+ switch (stageNumber) {
968
+ case 1: {
969
+ switch (bracketType) {
970
+ case 'winner':
971
+ return DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.UPPER_BRACKET;
972
+ case 'looser':
973
+ return DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.LOWER_BRACKET;
974
+ default:
975
+ throw new Error(`Unsupported bracket type: ${bracketType}`);
976
+ }
977
+ }
978
+ case 2: {
979
+ return COMMON_BRACKET_ROUND_TYPE.FINAL;
980
+ }
981
+ case 3: {
982
+ return DOUBLE_ELIMINATION_BRACKET_ROUND_TYPE.REVERSE_FINAL;
983
+ }
984
+ default: {
985
+ throw new Error(`Unsupported stage number: ${stageNumber}`);
986
+ }
987
+ }
988
+ }
989
+ case 'single-elimination': {
990
+ if (matchCount === 1) {
991
+ return COMMON_BRACKET_ROUND_TYPE.FINAL;
992
+ }
993
+ else {
994
+ return SINGLE_ELIMINATION_BRACKET_ROUND_TYPE.SINGLE_ELIMINATION_BRACKET;
995
+ }
996
+ }
997
+ default: {
998
+ throw new Error(`Unsupported tournament mode: ${tournamentMode}`);
999
+ }
1000
+ }
1001
+ };
1002
+ export const generateBracketDataForGg = (source) => {
1003
+ const tournamentMode = generateTournamentModeFormGgData(source);
1004
+ const bracketData = {
1005
+ rounds: [],
1006
+ matches: [],
1007
+ mode: tournamentMode,
1008
+ };
1009
+ const matchesGrouped = new Map();
1010
+ for (const match of source.matches) {
1011
+ const roundId = `${match.roundNumber}-${match.stageNumber}-${match.bracketType || null}`;
1012
+ if (!matchesGrouped.has(roundId)) {
1013
+ matchesGrouped.set(roundId, []);
1014
+ }
1015
+ matchesGrouped.get(roundId)?.push(match);
1016
+ }
1017
+ for (const [roundId, matches] of matchesGrouped.entries()) {
1018
+ const firstMatch = matches[0];
1019
+ if (!firstMatch)
1020
+ throw new Error('First match not found');
1021
+ const roundType = generateRoundTypeFromGgMatch(tournamentMode, firstMatch.bracketType, firstMatch.stageNumber, matches.length);
1022
+ const bracketRound = {
1023
+ type: roundType,
1024
+ id: roundId,
1025
+ data: null,
1026
+ name: firstMatch.roundTitle,
1027
+ };
1028
+ bracketData.rounds.push(bracketRound);
1029
+ for (const match of matches) {
1030
+ const bracketMatch = {
1031
+ id: match.id,
1032
+ data: match,
1033
+ roundId: roundId,
1034
+ home: match.homeMatchSide.participant?.id || null,
1035
+ away: match.awayMatchSide.participant?.id || null,
1036
+ winner: match.winningSide,
1037
+ status: match.status === 'completed' ? 'completed' : 'pending',
1038
+ };
1039
+ bracketData.matches.push(bracketMatch);
1040
+ }
1041
+ }
1042
+ return bracketData;
1043
+ };
1044
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhY2tldC1uZXcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvYnJhY2tldC9jb21wb25lbnRzL25ldy1icmFja2V0L2JyYWNrZXQtbmV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW9CQSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQXlCLENBQUM7QUFFbEUsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHO0lBQzdCLGtCQUFrQixFQUFFLG9CQUFvQjtJQUN4QyxrQkFBa0IsRUFBRSxvQkFBb0I7SUFDeEMsS0FBSyxFQUFFLE9BQU87SUFDZCxLQUFLLEVBQUUsT0FBTztJQUNkLHNCQUFzQixFQUFFLHdCQUF3QjtDQUN4QyxDQUFDO0FBSVgsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUc7SUFDdkMsV0FBVyxFQUFFLGFBQWE7SUFDMUIsS0FBSyxFQUFFLE9BQU87Q0FDTixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0scUNBQXFDLEdBQUc7SUFDbkQsMEJBQTBCLEVBQUUsNEJBQTRCO0NBQ2hELENBQUM7QUFFWCxNQUFNLENBQUMsTUFBTSxxQ0FBcUMsR0FBRztJQUNuRCxhQUFhLEVBQUUsZUFBZTtJQUM5QixhQUFhLEVBQUUsZUFBZTtJQUM5QixhQUFhLEVBQUUsZUFBZTtDQUN0QixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUc7SUFDdEMsS0FBSyxFQUFFLE9BQU87Q0FDTixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUc7SUFDdEMsS0FBSyxFQUFFLE9BQU87Q0FDTixDQUFDO0FBeUJYLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHO0lBQ3ZDLElBQUksRUFBRSxNQUFNO0lBQ1osS0FBSyxFQUFFLE9BQU87Q0FDTixDQUFDO0FBNlFYLE1BQU0sQ0FBQyxNQUFNLHFDQUFxQyxHQUFHLENB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LENBQUMsU0FBUzthQUMvRCxDQUFDO1lBRUYsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDekMsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBNYXRjaExpc3RWaWV3VW5pb24sXG4gIE9wcG9uZW50U2lkZSxcbiAgUm91bmRTdGFnZVN0cnVjdHVyZVZpZXcsXG4gIFJvdW5kU3RhZ2VTdHJ1Y3R1cmVXaXRoTWF0Y2hlc1ZpZXcsXG4gIFJvdW5kVHlwZSxcbn0gZnJvbSAnQGV0aGxldGUvdHlwZXMnO1xuaW1wb3J0IHsgR2dEYXRhIH0gZnJvbSAnLi4vLi4vc3Rvcmllcy9kdW1teS1kYXRhJztcblxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kSWQgPSBzdHJpbmcgJiB7IF9fYnJhbmQ6ICdCcmFja2V0Um91bmRJZCcgfTtcbmV4cG9ydCB0eXBlIEJyYWNrZXRNYXRjaElkID0gc3RyaW5nICYgeyBfX2JyYW5kOiAnQnJhY2tldE1hdGNoSWQnIH07XG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmRQb3NpdGlvbiA9IG51bWJlciAmIHsgX19icmFuZDogJ0JyYWNrZXRSb3VuZFBvc2l0aW9uJyB9O1xuZXhwb3J0IHR5cGUgQnJhY2tldE1hdGNoUG9zaXRpb24gPSBudW1iZXIgJiB7IF9fYnJhbmQ6ICdCcmFja2V0TWF0Y2hQb3NpdGlvbicgfTtcbmV4cG9ydCB0eXBlIE1hdGNoUGFydGljaXBhbnRJZCA9IHN0cmluZyAmIHsgX19icmFuZDogJ01hdGNoUGFydGljaXBhbnRJZCcgfTtcbmV4cG9ydCB0eXBlIE1hdGNoUGFydGljaXBhbnRTaG9ydElkID0gc3RyaW5nICYgeyBfX2JyYW5kOiAnTWF0Y2hQYXJ0aWNpcGFudFNob3J0SWQnIH07XG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmRTd2lzc0dyb3VwSWQgPSBzdHJpbmcgJiB7IF9fYnJhbmQ6ICdCcmFja2V0Um91bmRTd2lzc0dyb3VwSWQnIH07XG5cbi8vIFdpbGwgdXN1YWxseSBiZSAwLjUsIDEgb3IgMi4gSW4gU3dpc3MgdGhpcyB2YWx1ZSB3aWxsIGJlIGdpYmJlcmlzaFxuZXhwb3J0IHR5cGUgTWF0Y2hGYWN0b3IgPSBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCBGQUxMQkFDS19NQVRDSF9QT1NJVElPTiA9IC0xIGFzIEJyYWNrZXRNYXRjaFBvc2l0aW9uO1xuXG5leHBvcnQgY29uc3QgVE9VUk5BTUVOVF9NT0RFID0ge1xuICBTSU5HTEVfRUxJTUlOQVRJT046ICdzaW5nbGUtZWxpbWluYXRpb24nLFxuICBET1VCTEVfRUxJTUlOQVRJT046ICdkb3VibGUtZWxpbWluYXRpb24nLFxuICBHUk9VUDogJ2dyb3VwJyxcbiAgU1dJU1M6ICdzd2lzcycsXG4gIFNXSVNTX1dJVEhfRUxJTUlOQVRJT046ICdzd2lzcy13aXRoLWVsaW1pbmF0aW9uJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRvdXJuYW1lbnRNb2RlID0gKHR5cGVvZiBUT1VSTkFNRU5UX01PREUpW2tleW9mIHR5cGVvZiBUT1VSTkFNRU5UX01PREVdO1xuXG5leHBvcnQgY29uc3QgQ09NTU9OX0JSQUNLRVRfUk9VTkRfVFlQRSA9IHtcbiAgVEhJUkRfUExBQ0U6ICd0aGlyZC1wbGFjZScsXG4gIEZJTkFMOiAnZmluYWwnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFNJTkdMRV9FTElNSU5BVElPTl9CUkFDS0VUX1JPVU5EX1RZUEUgPSB7XG4gIFNJTkdMRV9FTElNSU5BVElPTl9CUkFDS0VUOiAnc2luZ2xlLWVsaW1pbmF0aW9uLWJyYWNrZXQnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IERPVUJMRV9FTElNSU5BVElPTl9CUkFDS0VUX1JPVU5EX1RZUEUgPSB7XG4gIFVQUEVSX0JSQUNLRVQ6ICd1cHBlci1icmFja2V0JyxcbiAgTE9XRVJfQlJBQ0tFVDogJ2xvd2VyLWJyYWNrZXQnLFxuICBSRVZFUlNFX0ZJTkFMOiAncmV2ZXJzZS1maW5hbCcsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgU1dJU1NfQlJBQ0tFVF9ST1VORF9UWVBFID0ge1xuICBTV0lTUzogJ3N3aXNzJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBHUk9VUF9CUkFDS0VUX1JPVU5EX1RZUEUgPSB7XG4gIEdST1VQOiAnZ3JvdXAnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQ29tbW9uQnJhY2tldFJvdW5kVHlwZSA9ICh0eXBlb2YgQ09NTU9OX0JSQUNLRVRfUk9VTkRfVFlQRSlba2V5b2YgdHlwZW9mIENPTU1PTl9CUkFDS0VUX1JPVU5EX1RZUEVdO1xuZXhwb3J0IHR5cGUgU2luZ2xlRWxpbWluYXRpb25CcmFja2V0Um91bmRUeXBlID1cbiAgfCBDb21tb25CcmFja2V0Um91bmRUeXBlXG4gIHwgKHR5cGVvZiBTSU5HTEVfRUxJTUlOQVRJT05fQlJBQ0tFVF9ST1VORF9UWVBFKVtrZXlvZiB0eXBlb2YgU0lOR0xFX0VMSU1JTkFUSU9OX0JSQUNLRVRfUk9VTkRfVFlQRV07XG5leHBvcnQgdHlwZSBEb3VibGVFbGltaW5hdGlvbkJyYWNrZXRSb3VuZFR5cGUgPVxuICB8IENvbW1vbkJyYWNrZXRSb3VuZFR5cGVcbiAgfCAodHlwZW9mIERPVUJMRV9FTElNSU5BVElPTl9CUkFDS0VUX1JPVU5EX1RZUEUpW2tleW9mIHR5cGVvZiBET1VCTEVfRUxJTUlOQVRJT05fQlJBQ0tFVF9ST1VORF9UWVBFXTtcbmV4cG9ydCB0eXBlIFN3aXNzQnJhY2tldFJvdW5kVHlwZSA9ICh0eXBlb2YgU1dJU1NfQlJBQ0tFVF9ST1VORF9UWVBFKVtrZXlvZiB0eXBlb2YgU1dJU1NfQlJBQ0tFVF9ST1VORF9UWVBFXTtcbmV4cG9ydCB0eXBlIEdyb3VwQnJhY2tldFJvdW5kVHlwZSA9ICh0eXBlb2YgR1JPVVBfQlJBQ0tFVF9ST1VORF9UWVBFKVtrZXlvZiB0eXBlb2YgR1JPVVBfQlJBQ0tFVF9ST1VORF9UWVBFXTtcblxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kVHlwZSA9XG4gIHwgU2luZ2xlRWxpbWluYXRpb25CcmFja2V0Um91bmRUeXBlXG4gIHwgRG91YmxlRWxpbWluYXRpb25CcmFja2V0Um91bmRUeXBlXG4gIHwgU3dpc3NCcmFja2V0Um91bmRUeXBlXG4gIHwgR3JvdXBCcmFja2V0Um91bmRUeXBlO1xuXG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmRTb3VyY2U8VFJvdW5kRGF0YT4gPSB7XG4gIHR5cGU6IEJyYWNrZXRSb3VuZFR5cGU7XG4gIGlkOiBzdHJpbmc7XG4gIGRhdGE6IFRSb3VuZERhdGE7XG4gIG5hbWU6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCBCUkFDS0VUX1JPVU5EX01JUlJPUl9UWVBFID0ge1xuICBMRUZUOiAnbGVmdCcsXG4gIFJJR0hUOiAncmlnaHQnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kTWlycm9yVHlwZSA9ICh0eXBlb2YgQlJBQ0tFVF9ST1VORF9NSVJST1JfVFlQRSlba2V5b2YgdHlwZW9mIEJSQUNLRVRfUk9VTkRfTUlSUk9SX1RZUEVdO1xuXG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gIC8vIE5PVEU6IFRoaXMgaXMgdGhlIGxvZ2ljYWwgaW5kZXggaW5zaWRlIHRoZSBicmFja2V0LlxuICAvLyBJbiBhIGRvdWJsZSBlbGltaW5hdGlvbiBicmFja2V0LCB0aGUgZmlyc3Qgcm91bmQgb2YgdGhlIGxvd2VyIGJyYWNrZXQgd2lsbCBoYXZlIHRoZSBzYW1lIGluZGV4IGFzIHRoZSBmaW5hbCByb3VuZCBvZiB0aGUgdXBwZXIgYnJhY2tldFxuICBpbmRleDogbnVtYmVyO1xuICB0eXBlOiBCcmFja2V0Um91bmRUeXBlO1xuICBpZDogQnJhY2tldFJvdW5kSWQ7XG4gIGRhdGE6IFRSb3VuZERhdGE7XG4gIHBvc2l0aW9uOiBCcmFja2V0Um91bmRQb3NpdGlvbjtcbiAgbmFtZTogc3RyaW5nO1xuICBtYXRjaENvdW50OiBudW1iZXI7XG4gIG1hdGNoZXM6IEJyYWNrZXRNYXRjaE1hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgbWlycm9yUm91bmRUeXBlOiBCcmFja2V0Um91bmRNaXJyb3JUeXBlIHwgbnVsbDtcbiAgaXNGaXJzdFJvdW5kOiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgQnJhY2tldE1hdGNoU3RhdHVzID0gJ2NvbXBsZXRlZCcgfCAncGVuZGluZyc7XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgZGF0YTogVE1hdGNoRGF0YTtcbiAgaW5kZXhJblJvdW5kOiBudW1iZXI7XG4gIGlkOiBCcmFja2V0TWF0Y2hJZDtcbiAgcm91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcG9zaXRpb246IEJyYWNrZXRNYXRjaFBvc2l0aW9uO1xuICBob21lOiBCcmFja2V0UGFydGljaXBhbnQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gfCBudWxsO1xuICBhd2F5OiBCcmFja2V0UGFydGljaXBhbnQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gfCBudWxsO1xuICB3aW5uZXJTaWRlOiBPcHBvbmVudFNpZGUgfCBudWxsO1xuICB3aW5uZXI6IEJyYWNrZXRQYXJ0aWNpcGFudDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiB8IG51bGw7XG4gIHN0YXR1czogQnJhY2tldE1hdGNoU3RhdHVzO1xufTtcblxuZXhwb3J0IHR5cGUgQnJhY2tldE1hdGNoU291cmNlPFRNYXRjaERhdGE+ID0ge1xuICBkYXRhOiBUTWF0Y2hEYXRhO1xuICBpZDogc3RyaW5nO1xuICByb3VuZElkOiBzdHJpbmc7XG4gIGhvbWU6IHN0cmluZyB8IG51bGw7XG4gIGF3YXk6IHN0cmluZyB8IG51bGw7XG4gIHdpbm5lcjogT3Bwb25lbnRTaWRlIHwgbnVsbDtcbiAgc3RhdHVzOiBCcmFja2V0TWF0Y2hTdGF0dXM7XG59O1xuXG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmRNYXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSBNYXA8QnJhY2tldFJvdW5kSWQsIEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPj47XG5leHBvcnQgdHlwZSBCcmFja2V0TWF0Y2hNYXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSBNYXA8QnJhY2tldE1hdGNoSWQsIEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPj47XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXREYXRhPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICByb3VuZHM6IEJyYWNrZXRSb3VuZE1hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcm91bmRJZHM6IEJyYWNrZXRSb3VuZElkW107XG4gIG1hdGNoZXM6IEJyYWNrZXRNYXRjaE1hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgbWF0Y2hJZHM6IEJyYWNrZXRNYXRjaElkW107XG4gIHBhcnRpY2lwYW50czogQnJhY2tldFBhcnRpY2lwYW50TWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBtb2RlOiBUb3VybmFtZW50TW9kZTtcbn07XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXREYXRhU291cmNlPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICByb3VuZHM6IEJyYWNrZXRSb3VuZFNvdXJjZTxUUm91bmREYXRhPltdO1xuICBtYXRjaGVzOiBCcmFja2V0TWF0Y2hTb3VyY2U8VE1hdGNoRGF0YT5bXTtcbiAgbW9kZTogVG91cm5hbWVudE1vZGU7XG59O1xuXG5leHBvcnQgdHlwZSBBbnlCcmFja2V0RGF0YSA9IEJyYWNrZXREYXRhPHVua25vd24sIHVua25vd24+O1xuXG4vLyBPbmUgbWF0Y2ggaGFzIG9uZSBwcmV2aW91cyBtYXRjaCBhbmQgb25lIG5leHQgbWF0Y2ggKHRoaXMgd291bGQgYmUgdGhlIGNhc2UsIGlmIGEgZ3JvdXAgdG91cm5hbWVudCBpcyBiZWluZyBkaXNwbGF5ZWQgdmlhIGEgYnJhY2tldClcbmV4cG9ydCB0eXBlIEJyYWNrZXRNYXRjaFJlbGF0aW9uT25lVG9PbmU8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gIHR5cGU6ICdvbmUtdG8tb25lJztcbiAgY3VycmVudE1hdGNoOiBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIGN1cnJlbnRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c01hdGNoOiBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzUm91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgbmV4dE1hdGNoOiBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIG5leHRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xufTtcblxuLy8gVGhlIG1hdGNoIGhhcyBubyBwcmV2aW91cyBtYXRjaCBidXQgYSBzaW5nbGUgbmV4dCBtYXRjaCAoZWcuIHRoZSBzdGFydCBvZiB0aGUgYnJhY2tldClcbmV4cG9ydCB0eXBlIEJyYWNrZXRNYXRjaFJlbGF0aW9uTm90aGluZ1RvT25lPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICB0eXBlOiAnbm90aGluZy10by1vbmUnO1xuICBjdXJyZW50TWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgY3VycmVudFJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIG5leHRNYXRjaDogQnJhY2tldE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBuZXh0Um91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbn07XG5cbi8vIFRoZSBtYXRjaCBoYXMgbm8gbmV4dCBtYXRjaCBidXQgYSBzaW5nbGUgcHJldmlvdXMgbWF0Y2ggKGVnLiByZXZlcnNlIGZpbmFscylcbmV4cG9ydCB0eXBlIEJyYWNrZXRNYXRjaFJlbGF0aW9uT25lVG9Ob3RoaW5nPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICB0eXBlOiAnb25lLXRvLW5vdGhpbmcnO1xuICBjdXJyZW50TWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgY3VycmVudFJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzTWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xufTtcblxuLy8gVGhlIG1hdGNoIGhhcyB0d28gcHJldmlvdXMgbWF0Y2hlcyBhbmQgb25lIG5leHQgbWF0Y2ggKGVnLiBhIG5vcm1hbCBtYXRjaCBpbiB0aGUgYnJhY2tldCB0aGF0IGlzIG5laXRoZXIgdGhlIHN0YXJ0IG5vciB0aGUgZW5kKVxuZXhwb3J0IHR5cGUgQnJhY2tldE1hdGNoUmVsYXRpb25Ud29Ub09uZTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgdHlwZTogJ3R3by10by1vbmUnO1xuICBjdXJyZW50TWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgY3VycmVudFJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzVXBwZXJNYXRjaDogQnJhY2tldE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c1VwcGVyUm91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNMb3dlck1hdGNoOiBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzTG93ZXJSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBuZXh0TWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgbmV4dFJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG59O1xuXG4vLyBUaGUgbWF0Y2ggaGFzIHR3byBwcmV2aW91cyBtYXRjaGVzIGFuZCBubyBuZXh0IG1hdGNoIChlZy4gdGhlIGZpbmFscyBpbiBhIHNpbmdsZSBlbGltaW5hdGlvbiBicmFja2V0KVxuZXhwb3J0IHR5cGUgQnJhY2tldE1hdGNoUmVsYXRpb25Ud29Ub05vdGhpbmc8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gIHR5cGU6ICd0d28tdG8tbm90aGluZyc7XG4gIGN1cnJlbnRNYXRjaDogQnJhY2tldE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBjdXJyZW50Um91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNVcHBlck1hdGNoOiBCcmFja2V0TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzVXBwZXJSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c0xvd2VyTWF0Y2g6IEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNMb3dlclJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG59O1xuXG5leHBvcnQgdHlwZSBCcmFja2V0TWF0Y2hSZWxhdGlvbjxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9XG4gIHwgQnJhY2tldE1hdGNoUmVsYXRpb25PbmVUb09uZTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPlxuICB8IEJyYWNrZXRNYXRjaFJlbGF0aW9uVHdvVG9PbmU8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT5cbiAgfCBCcmFja2V0TWF0Y2hSZWxhdGlvbk5vdGhpbmdUb09uZTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPlxuICB8IEJyYWNrZXRNYXRjaFJlbGF0aW9uT25lVG9Ob3RoaW5nPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+XG4gIHwgQnJhY2tldE1hdGNoUmVsYXRpb25Ud29Ub05vdGhpbmc8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRNYXRjaFJlbGF0aW9uc01hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IE1hcDxcbiAgQnJhY2tldE1hdGNoSWQsXG4gIEJyYWNrZXRNYXRjaFJlbGF0aW9uPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+XG4+O1xuXG4vLyBPbmUgcm91bmQgaGFzIG9uZSBuZXh0IHJvdW5kICh0aGUgZmlyc3Qgcm91bmQgb2YgdGhlIGJyYWNrZXQpXG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmRSZWxhdGlvbk5vdGhpbmdUb09uZTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgdHlwZTogJ25vdGhpbmctdG8tb25lJztcbiAgY3VycmVudFJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIG5leHRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBuZXh0Um91bmRNYXRjaEZhY3RvcjogbnVtYmVyO1xufTtcblxuLy8gT25lIHJvdW5kIGhhcyBvbmUgcHJldmlvdXMgcm91bmQgKGVnLiB0aGUgZmluYWxzIHJvdW5kIG9mIHRoZSBicmFja2V0IGluIGNhc2Ugb2YgYSBzaW5nbGUgZWxpbWluYXRpb24gYnJhY2tldClcbmV4cG9ydCB0eXBlIEJyYWNrZXRSb3VuZFJlbGF0aW9uT25lVG9Ob3RoaW5nPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICB0eXBlOiAnb25lLXRvLW5vdGhpbmcnO1xuICBjdXJyZW50Um91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3I6IG51bWJlcjtcbiAgcm9vdFJvdW5kTWF0Y2hGYWN0b3I6IG51bWJlcjtcbn07XG5cbi8vIE9uZSByb3VuZCBoYXMgb25lIHByZXZpb3VzIHJvdW5kIGFuZCBvbmUgbmV4dCByb3VuZCAoZWcuIGEgbm9ybWFsIHJvdW5kIGluIHRoZSBicmFja2V0IHRoYXQgaXMgbmVpdGhlciB0aGUgc3RhcnQgbm9yIHRoZSBlbmQpXG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmRSZWxhdGlvbk9uZVRvT25lPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICB0eXBlOiAnb25lLXRvLW9uZSc7XG4gIGN1cnJlbnRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c1JvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIG5leHRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBuZXh0Um91bmRNYXRjaEZhY3RvcjogbnVtYmVyO1xuICBwcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3I6IG51bWJlcjtcbiAgcm9vdFJvdW5kTWF0Y2hGYWN0b3I6IG51bWJlcjtcbn07XG5cbi8vIE9uZSByb3VuZCBoYXMgdHdvIHByZXZpb3VzIHJvdW5kcyBhbmQgb25lIG5leHQgcm91bmQgKGVnLiB0aGUgZmluYWxzIHJvdW5kIGluIGEgZG91YmxlIGVsaW1pbmF0aW9uIGJyYWNrZXQgd2hlbiB0aGUgcmV2ZXJzZSBmaW5hbHMgaXMgYWxzbyBiZWluZyBwbGF5ZWQpXG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmRSZWxhdGlvblR3b1RvT25lPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICB0eXBlOiAndHdvLXRvLW9uZSc7XG4gIGN1cnJlbnRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c1VwcGVyUm91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNMb3dlclJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIG5leHRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBuZXh0Um91bmRNYXRjaEZhY3RvcjogbnVtYmVyO1xuICBwcmV2aW91c1VwcGVyUm91bmRNYXRjaEZhY3RvcjogbnVtYmVyO1xuICBwcmV2aW91c0xvd2VyUm91bmRNYXRjaEZhY3RvcjogbnVtYmVyO1xuICB1cHBlclJvb3RSb3VuZE1hdGNoRmFjdG9yOiBudW1iZXI7XG4gIGxvd2VyUm9vdFJvdW5kTWF0Y2hGYWN0b3I6IG51bWJlcjtcbn07XG5cbi8vIE9uZSByb3VuZCBoYXMgdHdvIHByZXZpb3VzIHJvdW5kcyBhbmQgbm8gbmV4dCByb3VuZCAoZWcuIHRoZSBmaW5hbHMgcm91bmQgaW4gYSBkb3VibGUgZWxpbWluYXRpb24gYnJhY2tldCB3aGVuIHRoZSByZXZlcnNlIGZpbmFscyBpcyBub3QgYmVpbmcgcGxheWVkKVxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kUmVsYXRpb25Ud29Ub05vdGhpbmc8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gIHR5cGU6ICd0d28tdG8tbm90aGluZyc7XG4gIGN1cnJlbnRSb3VuZDogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBwcmV2aW91c1VwcGVyUm91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgcHJldmlvdXNMb3dlclJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIHByZXZpb3VzVXBwZXJSb3VuZE1hdGNoRmFjdG9yOiBudW1iZXI7XG4gIHByZXZpb3VzTG93ZXJSb3VuZE1hdGNoRmFjdG9yOiBudW1iZXI7XG4gIHVwcGVyUm9vdFJvdW5kTWF0Y2hGYWN0b3I6IG51bWJlcjtcbiAgbG93ZXJSb290Um91bmRNYXRjaEZhY3RvcjogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kUmVsYXRpb248VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPVxuICB8IEJyYWNrZXRSb3VuZFJlbGF0aW9uTm90aGluZ1RvT25lPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+XG4gIHwgQnJhY2tldFJvdW5kUmVsYXRpb25PbmVUb05vdGhpbmc8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT5cbiAgfCBCcmFja2V0Um91bmRSZWxhdGlvbk9uZVRvT25lPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+XG4gIHwgQnJhY2tldFJvdW5kUmVsYXRpb25Ud29Ub09uZTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPlxuICB8IEJyYWNrZXRSb3VuZFJlbGF0aW9uVHdvVG9Ob3RoaW5nPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuXG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmRSZWxhdGlvbnM8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSBNYXA8XG4gIEJyYWNrZXRSb3VuZElkLFxuICBCcmFja2V0Um91bmRSZWxhdGlvbjxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPlxuPjtcblxuZXhwb3J0IHR5cGUgTWF0Y2hQb3NpdGlvbk1hcHM8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSBNYXA8XG4gIEJyYWNrZXRSb3VuZElkLFxuICBNYXA8QnJhY2tldE1hdGNoUG9zaXRpb24sIEJyYWNrZXRNYXRjaDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPj5cbj47XG5cbmV4cG9ydCB0eXBlIFBhcnRpY2lwYW50TWF0Y2hSZXN1bHQgPSAnd2luJyB8ICdsb3NzJyB8ICd0aWUnO1xuZXhwb3J0IHR5cGUgUGFydGljaXBhbnRNYXRjaFR5cGUgPSBCcmFja2V0Um91bmRUeXBlO1xuXG5leHBvcnQgdHlwZSBNYXRjaFBhcnRpY2lwYW50TWF0Y2g8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gIGJyYWNrZXRNYXRjaDogQnJhY2tldE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICByZXN1bHQ6IFBhcnRpY2lwYW50TWF0Y2hSZXN1bHQgfCBudWxsO1xuICBpc0VsaW1pbmF0ZWQ6IGJvb2xlYW47XG4gIGlzRWxpbWluYXRpb25NYXRjaDogYm9vbGVhbjtcbiAgaXNGaXJzdFJvdW5kOiBib29sZWFuO1xuICBpc0xhc3RSb3VuZDogYm9vbGVhbjtcbiAgdGllQ291bnQ6IG51bWJlcjtcbiAgd2luQ291bnQ6IG51bWJlcjtcbiAgbG9zc0NvdW50OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBNYXRjaFBhcnRpY2lwYW50PFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICBpZDogTWF0Y2hQYXJ0aWNpcGFudElkO1xuICBuYW1lOiBzdHJpbmc7XG4gIG1hdGNoZXM6IE1hcDxCcmFja2V0TWF0Y2hJZCwgTWF0Y2hQYXJ0aWNpcGFudE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+Pjtcbn07XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRQYXJ0aWNpcGFudE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICBzaWRlOiBPcHBvbmVudFNpZGU7XG4gIGJyYWNrZXRNYXRjaDogQnJhY2tldE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xufTtcblxuZXhwb3J0IHR5cGUgQnJhY2tldFBhcnRpY2lwYW50PFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICBpZDogTWF0Y2hQYXJ0aWNpcGFudElkO1xuICBzaG9ydElkOiBNYXRjaFBhcnRpY2lwYW50U2hvcnRJZDtcbiAgbmFtZTogc3RyaW5nO1xuICBtYXRjaGVzOiBNYXA8QnJhY2tldE1hdGNoSWQsIEJyYWNrZXRQYXJ0aWNpcGFudE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+Pjtcbn07XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRQYXJ0aWNpcGFudE1hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IE1hcDxcbiAgTWF0Y2hQYXJ0aWNpcGFudElkLFxuICBCcmFja2V0UGFydGljaXBhbnQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT5cbj47XG5cbmV4cG9ydCB0eXBlIE1hdGNoUGFydGljaXBhbnRNYXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSBNYXA8XG4gIE1hdGNoUGFydGljaXBhbnRJZCxcbiAgTWF0Y2hQYXJ0aWNpcGFudDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPlxuPjtcblxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kU3dpc3NHcm91cDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgaWQ6IEJyYWNrZXRSb3VuZFN3aXNzR3JvdXBJZDtcbiAgbmFtZTogc3RyaW5nO1xuICBtYXRjaGVzOiBCcmFja2V0TWF0Y2hNYXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG4gIGFsbG93ZWRNYXRjaENvdW50OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBCcmFja2V0Um91bmRTd2lzc0dyb3VwTWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0gTWFwPFxuICBCcmFja2V0Um91bmRTd2lzc0dyb3VwSWQsXG4gIEJyYWNrZXRSb3VuZFN3aXNzR3JvdXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT5cbj47XG5cbmV4cG9ydCB0eXBlIEJyYWNrZXRSb3VuZFN3aXNzRGF0YTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgZ3JvdXBzOiBCcmFja2V0Um91bmRTd2lzc0dyb3VwTWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xufTtcblxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kTWFwV2l0aFN3aXNzRGF0YTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IE1hcDxcbiAgQnJhY2tldFJvdW5kSWQsXG4gIEJyYWNrZXRSb3VuZFN3aXNzRGF0YTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPlxuPjtcblxuZXhwb3J0IHR5cGUgQnJhY2tldFJvdW5kVHlwZU1hcDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IE1hcDxcbiAgQnJhY2tldFJvdW5kVHlwZSxcbiAgQnJhY2tldFJvdW5kTWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+XG4+O1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVSb3VuZFR5cGVGcm9tRXRobGV0ZVJvdW5kVHlwZSA9IChcbiAgdHlwZTogUm91bmRUeXBlLFxuICB0b3VybmFtZW50TW9kZTogVG91cm5hbWVudE1vZGUsXG4gIHJvdW5kTWF0Y2hDb3VudDogbnVtYmVyLFxuKTogQnJhY2tldFJvdW5kVHlwZSA9PiB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ25vcm1hbCc6XG4gICAgICBzd2l0Y2ggKHRvdXJuYW1lbnRNb2RlKSB7XG4gICAgICAgIGNhc2UgJ3NpbmdsZS1lbGltaW5hdGlvbic6XG4gICAgICAgICAgLy8gVGhpcyBtaWdodCBicmVhayBpZiB0aGUgc2luZ2xlIGVsaW1pbmF0aW9uIGNvbnRhaW5zIGEgM3JkIHBsYWNlIG1hdGNoICsgcm91bmRcbiAgICAgICAgICBpZiAocm91bmRNYXRjaENvdW50ID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gQ09NTU9OX0JSQUNLRVRfUk9VTkRfVFlQRS5GSU5BTDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFNJTkdMRV9FTElNSU5BVElPTl9CUkFDS0VUX1JPVU5EX1RZUEUuU0lOR0xFX0VMSU1JTkFUSU9OX0JSQUNLRVQ7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdncm91cCc6XG4gICAgICAgICAgcmV0dXJuIEdST1VQX0JSQUNLRVRfUk9VTkRfVFlQRS5HUk9VUDtcbiAgICAgICAgY2FzZSAnc3dpc3MnOlxuICAgICAgICAgIHJldHVybiBTV0lTU19CUkFDS0VUX1JPVU5EX1RZUEUuU1dJU1M7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB0b3VybmFtZW50IG1vZGUgZm9yIGEgbm9ybWFsIHR5cGUgcm91bmQ6ICR7dG91cm5hbWVudE1vZGV9YCk7XG4gICAgICB9XG4gICAgY2FzZSAndGhpcmRfcGxhY2UnOlxuICAgICAgcmV0dXJuIENPTU1PTl9CUkFDS0VUX1JPVU5EX1RZUEUuVEhJUkRfUExBQ0U7XG4gICAgY2FzZSAnZmluYWwnOlxuICAgICAgcmV0dXJuIENPTU1PTl9CUkFDS0VUX1JPVU5EX1RZUEUuRklOQUw7XG4gICAgY2FzZSAncmV2ZXJzZV9maW5hbCc6XG4gICAgICByZXR1cm4gRE9VQkxFX0VMSU1JTkFUSU9OX0JSQUNLRVRfUk9VTkRfVFlQRS5SRVZFUlNFX0ZJTkFMO1xuICAgIGNhc2UgJ3dpbm5lcl9icmFja2V0JzpcbiAgICAgIHJldHVybiBET1VCTEVfRUxJTUlOQVRJT05fQlJBQ0tFVF9ST1VORF9UWVBFLlVQUEVSX0JSQUNLRVQ7XG4gICAgY2FzZSAnbG9zZXJfYnJhY2tldCc6XG4gICAgICByZXR1cm4gRE9VQkxFX0VMSU1JTkFUSU9OX0JSQUNLRVRfUk9VTkRfVFlQRS5MT1dFUl9CUkFDS0VUO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVUb3VybmFtZW50TW9kZUZvcm1FdGhsZXRlUm91bmRzID0gKFxuICBzb3VyY2U6IFJvdW5kU3RhZ2VTdHJ1Y3R1cmVXaXRoTWF0Y2hlc1ZpZXdbXSxcbik6IFRvdXJuYW1lbnRNb2RlID0+IHtcbiAgY29uc3QgZmlyc3RSb3VuZCA9IHNvdXJjZVswXTtcbiAgY29uc3QgZmlyc3RNYXRjaCA9IGZpcnN0Um91bmQ/Lm1hdGNoZXNbMF07XG5cbiAgaWYgKCFmaXJzdFJvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ05vIHJvdW5kcyBmb3VuZCcpO1xuICBpZiAoIWZpcnN0TWF0Y2gpIHRocm93IG5ldyBFcnJvcignTm8gbWF0Y2hlcyBmb3VuZCcpO1xuXG4gIHN3aXRjaCAoZmlyc3RNYXRjaC5tYXRjaFR5cGUpIHtcbiAgICBjYXNlICdncm91cHMnOlxuICAgICAgcmV0dXJuIFRPVVJOQU1FTlRfTU9ERS5HUk9VUDtcbiAgICBjYXNlICdmaWZhX3N3aXNzJzoge1xuICAgICAgY29uc3QgbGFzdFJvdW5kID0gc291cmNlW3NvdXJjZS5sZW5ndGggLSAxXTtcblxuICAgICAgaWYgKCFsYXN0Um91bmQpIHRocm93IG5ldyBFcnJvcignTm8gbGFzdCByb3VuZCBmb3VuZCcpO1xuXG4gICAgICBpZiAobGFzdFJvdW5kLm1hdGNoZXMubGVuZ3RoICE9PSBmaXJzdFJvdW5kLm1hdGNoZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBUT1VSTkFNRU5UX01PREUuU1dJU1NfV0lUSF9FTElNSU5BVElPTjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBUT1VSTkFNRU5UX01PREUuU1dJU1M7XG4gICAgICB9XG4gICAgfVxuICAgIGNhc2UgJ2RvdWJsZV9lbGltaW5hdGlvbic6XG4gICAgICByZXR1cm4gVE9VUk5BTUVOVF9NT0RFLkRPVUJMRV9FTElNSU5BVElPTjtcbiAgICBjYXNlICdzaW5nbGVfZWxpbWluYXRpb24nOlxuICAgICAgcmV0dXJuIFRPVVJOQU1FTlRfTU9ERS5TSU5HTEVfRUxJTUlOQVRJT047XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdG91cm5hbWVudCBtb2RlOiAke2ZpcnN0TWF0Y2gubWF0Y2hUeXBlfWApO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY2FuUmVuZGVyTGF5b3V0SW5Ub3VybmFtZW50TW9kZSA9IChsYXlvdXQ6IEJyYWNrZXREYXRhTGF5b3V0LCBtb2RlOiBUb3VybmFtZW50TW9kZSk6IGJvb2xlYW4gPT4ge1xuICBzd2l0Y2ggKG1vZGUpIHtcbiAgICBjYXNlIFRPVVJOQU1FTlRfTU9ERS5TSU5HTEVfRUxJTUlOQVRJT046XG4gICAgICByZXR1cm4gbGF5b3V0ID09PSBCUkFDS0VUX0RBVEFfTEFZT1VULkxFRlRfVE9fUklHSFQgfHwgbGF5b3V0ID09PSBCUkFDS0VUX0RBVEFfTEFZT1VULk1JUlJPUkVEO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbGF5b3V0ID09PSBCUkFDS0VUX0RBVEFfTEFZT1VULkxFRlRfVE9fUklHSFQ7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBCUkFDS0VUX0RBVEFfTEFZT1VUID0ge1xuICBMRUZUX1RPX1JJR0hUOiAnbGVmdC10by1yaWdodCcsXG5cbiAgLy8gQ3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGluIHNpbmdsZSBlbGltaW5hdGlvbiBicmFja2V0cy4gV2lsbCB0aHJvdyBhbiBlcnJvciBpZiB1c2VkIGluIG90aGVyIGJyYWNrZXQgdHlwZXNcbiAgTUlSUk9SRUQ6ICdtaXJyb3JlZCcsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBCcmFja2V0RGF0YUxheW91dCA9ICh0eXBlb2YgQlJBQ0tFVF9EQVRBX0xBWU9VVClba2V5b2YgdHlwZW9mIEJSQUNLRVRfREFUQV9MQVlPVVRdO1xuXG5leHBvcnQgY29uc3QgRklSU1RfUk9VTkRTX1RZUEUgPSB7XG4gIFNJTkdMRTogJ3NpbmdsZScsXG4gIERPVUJMRTogJ2RvdWJsZScsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBGaXJzdFJvdW5kc1R5cGUgPSAodHlwZW9mIEZJUlNUX1JPVU5EU19UWVBFKVtrZXlvZiB0eXBlb2YgRklSU1RfUk9VTkRTX1RZUEVdO1xuXG5leHBvcnQgdHlwZSBGaXJzdFNpbmdsZVJvdW5kczxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgdHlwZTogdHlwZW9mIEZJUlNUX1JPVU5EU19UWVBFLlNJTkdMRTtcbiAgZmlyc3Q6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbn07XG5cbmV4cG9ydCB0eXBlIEZpcnN0RG91YmxlUm91bmRzPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICB0eXBlOiB0eXBlb2YgRklSU1RfUk9VTkRTX1RZUEUuRE9VQkxFO1xuICB1cHBlcjogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBsb3dlcjogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xufTtcblxuZXhwb3J0IHR5cGUgRmlyc3RSb3VuZHM8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPVxuICB8IEZpcnN0U2luZ2xlUm91bmRzPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+XG4gIHwgRmlyc3REb3VibGVSb3VuZHM8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT47XG5cbmV4cG9ydCBjb25zdCBnZXRGaXJzdFJvdW5kcyA9IDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPihcbiAgYnJhY2tldERhdGE6IEJyYWNrZXREYXRhPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+LFxuICByb3VuZFR5cGVNYXA6IEJyYWNrZXRSb3VuZFR5cGVNYXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4sXG4pOiBGaXJzdFJvdW5kczxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9PiB7XG4gIGlmIChicmFja2V0RGF0YS5tb2RlID09PSBUT1VSTkFNRU5UX01PREUuRE9VQkxFX0VMSU1JTkFUSU9OKSB7XG4gICAgY29uc3QgdXBwZXIgPSByb3VuZFR5cGVNYXAuZ2V0KERPVUJMRV9FTElNSU5BVElPTl9CUkFDS0VUX1JPVU5EX1RZUEUuVVBQRVJfQlJBQ0tFVCk/LnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICBjb25zdCBsb3dlciA9IHJvdW5kVHlwZU1hcC5nZXQoRE9VQkxFX0VMSU1JTkFUSU9OX0JSQUNLRVRfUk9VTkRfVFlQRS5MT1dFUl9CUkFDS0VUKT8udmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuXG4gICAgaWYgKCF1cHBlciB8fCAhbG93ZXIpIHRocm93IG5ldyBFcnJvcignVXBwZXIgb3IgbG93ZXIgYnJhY2tldCBpcyBudWxsJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogRklSU1RfUk9VTkRTX1RZUEUuRE9VQkxFLFxuICAgICAgdXBwZXIsXG4gICAgICBsb3dlcixcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgZmlyc3QgPSBicmFja2V0RGF0YS5yb3VuZHMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuXG4gIGlmICghZmlyc3QpIHRocm93IG5ldyBFcnJvcignRmlyc3Qgcm91bmQgaXMgbnVsbCcpO1xuXG4gIHJldHVybiB7XG4gICAgdHlwZTogRklSU1RfUk9VTkRTX1RZUEUuU0lOR0xFLFxuICAgIGZpcnN0LFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlTWF0Y2hQb3NpdGlvbk1hcHMgPSA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4oYnJhY2tldERhdGE6IEJyYWNrZXREYXRhPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+KSA9PiB7XG4gIGNvbnN0IG1hdGNoUG9zaXRpb25NYXBzOiBNYXRjaFBvc2l0aW9uTWFwczxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IHJvdW5kIG9mIGJyYWNrZXREYXRhLnJvdW5kcy52YWx1ZXMoKSkge1xuICAgIGNvbnN0IG1hdGNoTWFwID0gbmV3IE1hcChbLi4ucm91bmQubWF0Y2hlcy52YWx1ZXMoKV0ubWFwKChtKSA9PiBbbS5wb3NpdGlvbiwgbV0pKTtcblxuICAgIG1hdGNoUG9zaXRpb25NYXBzLnNldChyb3VuZC5pZCwgbWF0Y2hNYXApO1xuICB9XG5cbiAgcmV0dXJuIG1hdGNoUG9zaXRpb25NYXBzO1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlQnJhY2tldFJvdW5kVHlwZU1hcCA9IDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPihcbiAgYnJhY2tldERhdGE6IEJyYWNrZXREYXRhPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+LFxuKSA9PiB7XG4gIGNvbnN0IHJvdW5kQW1vdW50TWFwOiBCcmFja2V0Um91bmRUeXBlTWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0gbmV3IE1hcCgpO1xuXG4gIGZvciAoY29uc3Qgcm91bmQgb2YgYnJhY2tldERhdGEucm91bmRzLnZhbHVlcygpKSB7XG4gICAgaWYgKCFyb3VuZEFtb3VudE1hcC5oYXMocm91bmQudHlwZSkpIHtcbiAgICAgIHJvdW5kQW1vdW50TWFwLnNldChyb3VuZC50eXBlLCBuZXcgTWFwKFtbcm91bmQuaWQsIHJvdW5kXV0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgIHJvdW5kQW1vdW50TWFwLnNldChyb3VuZC50eXBlLCByb3VuZEFtb3VudE1hcC5nZXQocm91bmQudHlwZSkhLnNldChyb3VuZC5pZCwgcm91bmQpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcm91bmRBbW91bnRNYXA7XG59O1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVSb3VuZFJlbGF0aW9ucyA9IDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPihicmFja2V0RGF0YTogQnJhY2tldERhdGE8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4pID0+IHtcbiAgY29uc3Qgcm91bmRSZWxhdGlvbnM6IEJyYWNrZXRSb3VuZFJlbGF0aW9uczxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBhbGxSb3VuZHMgPSBicmFja2V0RGF0YS5yb3VuZElkcy5tYXAoKGlkKSA9PiBicmFja2V0RGF0YS5yb3VuZHMuZ2V0KGlkKSkuZmlsdGVyKChyKSA9PiAhIXIpO1xuICBjb25zdCB1cHBlclJvdW5kcyA9IGFsbFJvdW5kcy5maWx0ZXIoKHIpID0+IHIudHlwZSAhPT0gRE9VQkxFX0VMSU1JTkFUSU9OX0JSQUNLRVRfUk9VTkRfVFlQRS5MT1dFUl9CUkFDS0VUKTtcbiAgY29uc3QgbG93ZXJSb3VuZHMgPSBhbGxSb3VuZHMuZmlsdGVyKChyKSA9PiByLnR5cGUgPT09IERPVUJMRV9FTElNSU5BVElPTl9CUkFDS0VUX1JPVU5EX1RZUEUuTE9XRVJfQlJBQ0tFVCk7XG5cbiAgY29uc3QgZmlyc3RVcHBlclJvdW5kID0gdXBwZXJSb3VuZHNbMF0gfHwgbnVsbDtcbiAgY29uc3QgZmlyc3RMb3dlclJvdW5kID0gbG93ZXJSb3VuZHNbMF0gfHwgbnVsbDtcblxuICBpZiAoIWZpcnN0VXBwZXJSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCdmaXJzdFVwcGVyUm91bmQgaXMgbnVsbCcpO1xuXG4gIGNvbnN0IGhhc0xvd2VyUm91bmRzID0gbG93ZXJSb3VuZHMubGVuZ3RoID4gMDtcbiAgY29uc3QgbGFzdExvd2VyUm91bmQgPSBsb3dlclJvdW5kc1tsb3dlclJvdW5kcy5sZW5ndGggLSAxXSB8fCBudWxsO1xuXG4gIGZvciAoY29uc3QgW2N1cnJlbnRVcHBlclJvdW5kSW5kZXgsIGN1cnJlbnRVcHBlclJvdW5kXSBvZiB1cHBlclJvdW5kcy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBpc0xlZnRUb1JpZ2h0ID1cbiAgICAgIGN1cnJlbnRVcHBlclJvdW5kLm1pcnJvclJvdW5kVHlwZSA9PT0gbnVsbCB8fFxuICAgICAgY3VycmVudFVwcGVyUm91bmQubWlycm9yUm91bmRUeXBlID09PSBCUkFDS0VUX1JPVU5EX01JUlJPUl9UWVBFLkxFRlQ7XG5cbiAgICBjb25zdCByZWxhdGl2ZVByZXZpb3VzVXBwZXJSb3VuZCA9IHVwcGVyUm91bmRzW2N1cnJlbnRVcHBlclJvdW5kSW5kZXggLSAxXSB8fCBudWxsO1xuICAgIGNvbnN0IHJlbGF0aXZlTmV4dFVwcGVyUm91bmQgPSB1cHBlclJvdW5kc1tjdXJyZW50VXBwZXJSb3VuZEluZGV4ICsgMV0gfHwgbnVsbDtcblxuICAgIGNvbnN0IHByZXZpb3VzVXBwZXJSb3VuZCA9IGlzTGVmdFRvUmlnaHQgPyByZWxhdGl2ZVByZXZpb3VzVXBwZXJSb3VuZCA6IHJlbGF0aXZlTmV4dFVwcGVyUm91bmQ7XG4gICAgY29uc3QgbmV4dFVwcGVyUm91bmQgPSBpc0xlZnRUb1JpZ2h0ID8gcmVsYXRpdmVOZXh0VXBwZXJSb3VuZCA6IHJlbGF0aXZlUHJldmlvdXNVcHBlclJvdW5kO1xuXG4gICAgY29uc3QgY3VycmVudExvd2VyUm91bmQgPSBsb3dlclJvdW5kc1tjdXJyZW50VXBwZXJSb3VuZEluZGV4XSB8fCBudWxsO1xuICAgIGNvbnN0IHByZXZpb3VzTG93ZXJSb3VuZCA9IGxvd2VyUm91bmRzW2N1cnJlbnRVcHBlclJvdW5kSW5kZXggLSAxXSB8fCBudWxsO1xuICAgIGNvbnN0IG5leHRMb3dlclJvdW5kID0gbG93ZXJSb3VuZHNbY3VycmVudFVwcGVyUm91bmRJbmRleCArIDFdIHx8IG51bGw7XG5cbiAgICBjb25zdCBpc0xhc3RVcHBlclJvdW5kID1cbiAgICAgICFuZXh0VXBwZXJSb3VuZCB8fFxuICAgICAgKG5leHRVcHBlclJvdW5kLm1pcnJvclJvdW5kVHlwZSA9PT0gQlJBQ0tFVF9ST1VORF9NSVJST1JfVFlQRS5SSUdIVCAmJlxuICAgICAgICBjdXJyZW50VXBwZXJSb3VuZC5taXJyb3JSb3VuZFR5cGUgPT09IG51bGwpO1xuXG4gICAgY29uc3QgaXNGaW5hbCA9IGN1cnJlbnRVcHBlclJvdW5kLnR5cGUgPT09IENPTU1PTl9CUkFDS0VUX1JPVU5EX1RZUEUuRklOQUw7XG5cbiAgICBpZiAoaXNGaW5hbCAmJiBoYXNMb3dlclJvdW5kcykge1xuICAgICAgLy8gdHdvIHRvIG9uZSByZWxhdGlvblxuXG4gICAgICBpZiAoIWxhc3RMb3dlclJvdW5kIHx8ICFjdXJyZW50TG93ZXJSb3VuZCB8fCAhcHJldmlvdXNVcHBlclJvdW5kKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xhc3RMb3dlclJvdW5kIG9yIGN1cnJlbnRMb3dlclJvdW5kIG9yIHByZXZpb3VzVXBwZXJSb3VuZCBpcyBudWxsJyk7XG5cbiAgICAgIC8vIGluIGEgc3luYyBkb3VibGUgZWxpbWluYXRpb24gYnJhY2tldCwgdGhlIGZpbmFsIHJvdW5kIGhhcyB0aGUgc2FtZSBpbmRleCBhcyB0aGUgbGFzdCBsb3dlciByb3VuZFxuICAgICAgLy8gaW4gYW4gYXN5bmMgb25lLCB0aGVyZSBpcyBhbHdheXMgb25lIG1vcmUgcm91bmQgaW4gdGhlIGxvd2VyIGJyYWNrZXQgc2luY2Ugd2Ugb25seSBkaXNwbGF5IGEgc2VjdGlvbiBvZiB0aGUgd2hvbGUgdG91cm5hbWVudFxuICAgICAgY29uc3QgaXNBc3luY0JyYWNrZXQgPSBjdXJyZW50TG93ZXJSb3VuZC5pZCAhPT0gbGFzdExvd2VyUm91bmQuaWQ7XG4gICAgICBjb25zdCBmaW5hbExvd2VyUm91bmQgPSBpc0FzeW5jQnJhY2tldCA/IG5leHRMb3dlclJvdW5kIDogY3VycmVudExvd2VyUm91bmQ7XG5cbiAgICAgIGlmICghZmluYWxMb3dlclJvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ2ZpbmFsTG93ZXJSb3VuZCBpcyBudWxsJyk7XG4gICAgICBpZiAoIWZpcnN0TG93ZXJSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCdmaXJzdExvd2VyUm91bmQgaXMgbnVsbCcpO1xuXG4gICAgICBpZiAoZmluYWxMb3dlclJvdW5kLmlkICE9PSBsYXN0TG93ZXJSb3VuZC5pZCkgdGhyb3cgbmV3IEVycm9yKCdmaW5hbExvd2VyUm91bmQgaXMgbm90IHRoZSBsYXN0IGxvd2VyIHJvdW5kJyk7XG5cbiAgICAgIC8vIGlmIHdlIGhhdmUgYSByZXZlcnNlIGZpbmFsXG4gICAgICBpZiAobmV4dFVwcGVyUm91bmQpIHtcbiAgICAgICAgLy8gZm9yIHRoZSBmaW5hbFxuICAgICAgICByb3VuZFJlbGF0aW9ucy5zZXQoY3VycmVudFVwcGVyUm91bmQuaWQsIHtcbiAgICAgICAgICB0eXBlOiAndHdvLXRvLW9uZScsXG4gICAgICAgICAgcHJldmlvdXNVcHBlclJvdW5kOiBwcmV2aW91c1VwcGVyUm91bmQsXG4gICAgICAgICAgcHJldmlvdXNMb3dlclJvdW5kOiBmaW5hbExvd2VyUm91bmQsXG4gICAgICAgICAgbmV4dFJvdW5kOiBuZXh0VXBwZXJSb3VuZCxcbiAgICAgICAgICBjdXJyZW50Um91bmQ6IGN1cnJlbnRVcHBlclJvdW5kLFxuICAgICAgICAgIG5leHRSb3VuZE1hdGNoRmFjdG9yOiBuZXh0VXBwZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgICBwcmV2aW91c1VwcGVyUm91bmRNYXRjaEZhY3RvcjogcHJldmlvdXNVcHBlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50VXBwZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgIHByZXZpb3VzTG93ZXJSb3VuZE1hdGNoRmFjdG9yOiBmaW5hbExvd2VyUm91bmQubWF0Y2hDb3VudCAvIGN1cnJlbnRVcHBlclJvdW5kLm1hdGNoQ291bnQsXG4gICAgICAgICAgdXBwZXJSb290Um91bmRNYXRjaEZhY3RvcjogZmlyc3RVcHBlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50VXBwZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgIGxvd2VyUm9vdFJvdW5kTWF0Y2hGYWN0b3I6IGZpcnN0TG93ZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBubyByZXZlcnNlIGZpbmFsIG1lYW5zIHRoZSBmaW5hbCBpcyB0aGUgbGFzdCByb3VuZFxuXG4gICAgICAgIC8vIGZvciB0aGUgZmluYWxcbiAgICAgICAgcm91bmRSZWxhdGlvbnMuc2V0KGN1cnJlbnRVcHBlclJvdW5kLmlkLCB7XG4gICAgICAgICAgdHlwZTogJ3R3by10by1ub3RoaW5nJyxcbiAgICAgICAgICBwcmV2aW91c1VwcGVyUm91bmQ6IHByZXZpb3VzVXBwZXJSb3VuZCxcbiAgICAgICAgICBwcmV2aW91c0xvd2VyUm91bmQ6IGZpbmFsTG93ZXJSb3VuZCxcbiAgICAgICAgICBjdXJyZW50Um91bmQ6IGN1cnJlbnRVcHBlclJvdW5kLFxuICAgICAgICAgIHByZXZpb3VzTG93ZXJSb3VuZE1hdGNoRmFjdG9yOiBmaW5hbExvd2VyUm91bmQubWF0Y2hDb3VudCAvIGN1cnJlbnRVcHBlclJvdW5kLm1hdGNoQ291bnQsXG4gICAgICAgICAgcHJldmlvdXNVcHBlclJvdW5kTWF0Y2hGYWN0b3I6IHByZXZpb3VzVXBwZXJSb3VuZC5tYXRjaENvdW50IC8gY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgICBsb3dlclJvb3RSb3VuZE1hdGNoRmFjdG9yOiBmaXJzdExvd2VyUm91bmQubWF0Y2hDb3VudCAvIGN1cnJlbnRVcHBlclJvdW5kLm1hdGNoQ291bnQsXG4gICAgICAgICAgdXBwZXJSb290Um91bmRNYXRjaEZhY3RvcjogZmlyc3RVcHBlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50VXBwZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXN5bmNCcmFja2V0KSB7XG4gICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gYXN5bmMgYnJhY2tldCwgd2UgbmVlZCB0byBzZXQgdGhlIHJlbGF0aW9ucyBmb3IgdGhlIDIgbGFzdCBsb3dlciByb3VuZHMgc2luY2UgdGhleSB3aWxsIGJlIHNraXBwZWQgYnkgdGhlIGRlZmF1bHQgb25lIHRvIG9uZSBsb2dpY1xuICAgICAgICBjb25zdCBwcmVGaW5hbExvd2VyUm91bmQgPSBsb3dlclJvdW5kc1tsb3dlclJvdW5kcy5sZW5ndGggLSAyXSB8fCBudWxsO1xuICAgICAgICBjb25zdCBwcmVQcmVGaW5hbExvd2VyUm91bmQgPSBsb3dlclJvdW5kc1tsb3dlclJvdW5kcy5sZW5ndGggLSAzXSB8fCBudWxsO1xuXG4gICAgICAgIGlmICghcHJlRmluYWxMb3dlclJvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ3ByZUZpbmFsTG93ZXJSb3VuZCBpcyBudWxsJyk7XG5cbiAgICAgICAgaWYgKCFmaXJzdExvd2VyUm91bmQpIHRocm93IG5ldyBFcnJvcignZmlyc3RMb3dlclJvdW5kIGlzIG51bGwnKTtcblxuICAgICAgICAvLyBmb3IgdGhlIGxhc3QgbG93ZXIgcm91bmRcbiAgICAgICAgcm91bmRSZWxhdGlvbnMuc2V0KGZpbmFsTG93ZXJSb3VuZC5pZCwge1xuICAgICAgICAgIHR5cGU6ICdvbmUtdG8tb25lJyxcbiAgICAgICAgICBwcmV2aW91c1JvdW5kOiBwcmVGaW5hbExvd2VyUm91bmQsXG4gICAgICAgICAgbmV4dFJvdW5kOiBjdXJyZW50VXBwZXJSb3VuZCxcbiAgICAgICAgICBjdXJyZW50Um91bmQ6IGZpbmFsTG93ZXJSb3VuZCxcbiAgICAgICAgICBuZXh0Um91bmRNYXRjaEZhY3RvcjogY3VycmVudFVwcGVyUm91bmQubWF0Y2hDb3VudCAvIGZpbmFsTG93ZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgIHByZXZpb3VzUm91bmRNYXRjaEZhY3RvcjogcHJlRmluYWxMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBmaW5hbExvd2VyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgICByb290Um91bmRNYXRjaEZhY3RvcjogZmlyc3RMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBmaW5hbExvd2VyUm91bmQubWF0Y2hDb3VudCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHByZVByZUZpbmFsTG93ZXJSb3VuZCkge1xuICAgICAgICAgIC8vIGZvciB0aGUgcHJlIGZpbmFsIGxvd2VyIHJvdW5kXG4gICAgICAgICAgcm91bmRSZWxhdGlvbnMuc2V0KHByZUZpbmFsTG93ZXJSb3VuZC5pZCwge1xuICAgICAgICAgICAgdHlwZTogJ29uZS10by1vbmUnLFxuICAgICAgICAgICAgcHJldmlvdXNSb3VuZDogcHJlUHJlRmluYWxMb3dlclJvdW5kLFxuICAgICAgICAgICAgbmV4dFJvdW5kOiBmaW5hbExvd2VyUm91bmQsXG4gICAgICAgICAgICBjdXJyZW50Um91bmQ6IHByZUZpbmFsTG93ZXJSb3VuZCxcbiAgICAgICAgICAgIG5leHRSb3VuZE1hdGNoRmFjdG9yOiBmaW5hbExvd2VyUm91bmQubWF0Y2hDb3VudCAvIHByZUZpbmFsTG93ZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgICAgcHJldmlvdXNSb3VuZE1hdGNoRmFjdG9yOiBwcmVQcmVGaW5hbExvd2VyUm91bmQubWF0Y2hDb3VudCAvIHByZUZpbmFsTG93ZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgICAgcm9vdFJvdW5kTWF0Y2hGYWN0b3I6IGZpcnN0TG93ZXJSb3VuZC5tYXRjaENvdW50IC8gcHJlRmluYWxMb3dlclJvdW5kLm1hdGNoQ291bnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZm9yIHRoZSBmaXJzdCBsb3dlciByb3VuZFxuICAgICAgICAgIHJvdW5kUmVsYXRpb25zLnNldChwcmVGaW5hbExvd2VyUm91bmQuaWQsIHtcbiAgICAgICAgICAgIHR5cGU6ICdub3RoaW5nLXRvLW9uZScsXG4gICAgICAgICAgICBuZXh0Um91bmQ6IGZpbmFsTG93ZXJSb3VuZCxcbiAgICAgICAgICAgIGN1cnJlbnRSb3VuZDogcHJlRmluYWxMb3dlclJvdW5kLFxuICAgICAgICAgICAgbmV4dFJvdW5kTWF0Y2hGYWN0b3I6IGZpbmFsTG93ZXJSb3VuZC5tYXRjaENvdW50IC8gcHJlRmluYWxMb3dlclJvdW5kLm1hdGNoQ291bnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRoaXMgaXMgYSBzeW5jIGJyYWNrZXQsIHdlIG9ubHkgbmVlZCB0byBzZXQgdGhlIHJlbGF0aW9uIGZvciB0aGUgbGFzdCBsb3dlciByb3VuZFxuICAgICAgICBpZiAoIXByZXZpb3VzTG93ZXJSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCdwcmV2aW91c0xvd2VyUm91bmQgaXMgbnVsbCcpO1xuICAgICAgICBpZiAoIWZpcnN0TG93ZXJSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCdmaXJzdExvd2VyUm91bmQgaXMgbnVsbCcpO1xuXG4gICAgICAgIC8vIGZvciB0aGUgbGFzdCBsb3dlciByb3VuZFxuICAgICAgICByb3VuZFJlbGF0aW9ucy5zZXQoZmluYWxMb3dlclJvdW5kLmlkLCB7XG4gICAgICAgICAgdHlwZTogJ29uZS10by1vbmUnLFxuICAgICAgICAgIHByZXZpb3VzUm91bmQ6IHByZXZpb3VzTG93ZXJSb3VuZCxcbiAgICAgICAgICBuZXh0Um91bmQ6IGN1cnJlbnRVcHBlclJvdW5kLFxuICAgICAgICAgIGN1cnJlbnRSb3VuZDogZmluYWxMb3dlclJvdW5kLFxuICAgICAgICAgIG5leHRSb3VuZE1hdGNoRmFjdG9yOiBjdXJyZW50VXBwZXJSb3VuZC5tYXRjaENvdW50IC8gZmluYWxMb3dlclJvdW5kLm1hdGNoQ291bnQsXG4gICAgICAgICAgcHJldmlvdXNSb3VuZE1hdGNoRmFjdG9yOiBwcmV2aW91c0xvd2VyUm91bmQubWF0Y2hDb3VudCAvIGZpbmFsTG93ZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgIHJvb3RSb3VuZE1hdGNoRmFjdG9yOiBmaXJzdExvd2VyUm91bmQubWF0Y2hDb3VudCAvIGZpbmFsTG93ZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzTGFzdFVwcGVyUm91bmQpIHtcbiAgICAgIC8vIG9uZSB0byBub3RoaW5nIHJlbGF0aW9uXG5cbiAgICAgIGlmICghcHJldmlvdXNVcHBlclJvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ3ByZXZpb3VzVXBwZXJSb3VuZCBpcyBudWxsJyk7XG5cbiAgICAgIHJvdW5kUmVsYXRpb25zLnNldChjdXJyZW50VXBwZXJSb3VuZC5pZCwge1xuICAgICAgICB0eXBlOiAnb25lLXRvLW5vdGhpbmcnLFxuICAgICAgICBwcmV2aW91c1JvdW5kOiBwcmV2aW91c1VwcGVyUm91bmQsXG4gICAgICAgIGN1cnJlbnRSb3VuZDogY3VycmVudFVwcGVyUm91bmQsXG4gICAgICAgIHByZXZpb3VzUm91bmRNYXRjaEZhY3RvcjogcHJldmlvdXNVcHBlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50VXBwZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICByb290Um91bmRNYXRjaEZhY3RvcjogZmlyc3RVcHBlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50VXBwZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50VXBwZXJSb3VuZC5pc0ZpcnN0Um91bmQpIHtcbiAgICAgIC8vIG5vdGhpbmcgdG8gb25lIHJlbGF0aW9uXG5cbiAgICAgIGlmICghbmV4dFVwcGVyUm91bmQpIHRocm93IG5ldyBFcnJvcignbmV4dFVwcGVyUm91bmQgaXMgbnVsbCcpO1xuXG4gICAgICByb3VuZFJlbGF0aW9ucy5zZXQoY3VycmVudFVwcGVyUm91bmQuaWQsIHtcbiAgICAgICAgdHlwZTogJ25vdGhpbmctdG8tb25lJyxcbiAgICAgICAgbmV4dFJvdW5kOiBuZXh0VXBwZXJSb3VuZCxcbiAgICAgICAgY3VycmVudFJvdW5kOiBjdXJyZW50VXBwZXJSb3VuZCxcbiAgICAgICAgbmV4dFJvdW5kTWF0Y2hGYWN0b3I6IG5leHRVcHBlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50VXBwZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChjdXJyZW50TG93ZXJSb3VuZCkge1xuICAgICAgICBpZiAoIW5leHRMb3dlclJvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ25leHRMb3dlclJvdW5kIGlzIG51bGwnKTtcblxuICAgICAgICByb3VuZFJlbGF0aW9ucy5zZXQoY3VycmVudExvd2VyUm91bmQuaWQsIHtcbiAgICAgICAgICB0eXBlOiAnbm90aGluZy10by1vbmUnLFxuICAgICAgICAgIG5leHRSb3VuZDogbmV4dExvd2VyUm91bmQsXG4gICAgICAgICAgY3VycmVudFJvdW5kOiBjdXJyZW50TG93ZXJSb3VuZCxcbiAgICAgICAgICBuZXh0Um91bmRNYXRjaEZhY3RvcjogbmV4dExvd2VyUm91bmQubWF0Y2hDb3VudCAvIGN1cnJlbnRMb3dlclJvdW5kLm1hdGNoQ291bnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvbmUgdG8gb25lIHJlbGF0aW9uXG5cbiAgICAgIGlmICghcHJldmlvdXNVcHBlclJvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ3ByZXZpb3VzVXBwZXJSb3VuZCBpcyBudWxsJyk7XG4gICAgICBpZiAoIW5leHRVcHBlclJvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ25leHRVcHBlclJvdW5kIGlzIG51bGwnKTtcblxuICAgICAgcm91bmRSZWxhdGlvbnMuc2V0KGN1cnJlbnRVcHBlclJvdW5kLmlkLCB7XG4gICAgICAgIHR5cGU6ICdvbmUtdG8tb25lJyxcbiAgICAgICAgcHJldmlvdXNSb3VuZDogcHJldmlvdXNVcHBlclJvdW5kLFxuICAgICAgICBuZXh0Um91bmQ6IG5leHRVcHBlclJvdW5kLFxuICAgICAgICBjdXJyZW50Um91bmQ6IGN1cnJlbnRVcHBlclJvdW5kLFxuICAgICAgICBuZXh0Um91bmRNYXRjaEZhY3RvcjogbmV4dFVwcGVyUm91bmQubWF0Y2hDb3VudCAvIGN1cnJlbnRVcHBlclJvdW5kLm1hdGNoQ291bnQsXG4gICAgICAgIHByZXZpb3VzUm91bmRNYXRjaEZhY3RvcjogcHJldmlvdXNVcHBlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50VXBwZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICByb290Um91bmRNYXRjaEZhY3RvcjogZmlyc3RVcHBlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50VXBwZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHdlIG9ubHkgd2FudCB0byBzZXQgbG93ZXIgcm91bmRzIGhlcmUgdW50aWwgdGhlIHNwZWNpYWwgbWVyZ2luZyBwb2ludCBvZiB0aGUgZmluYWwuXG4gICAgICAvLyBsb3dlciBicmFja2V0IHJvdW5kcyBhZnRlciBhbmQgaW5jbHVkaW5nIHRoZSBmaW5hbCB3aWxsIGJlIHNldCBpbiB0aGUgZmluYWwgcm91bmQgYmxvY2tcbiAgICAgIGlmIChjdXJyZW50TG93ZXJSb3VuZCAmJiBjdXJyZW50VXBwZXJSb3VuZC50eXBlID09PSBET1VCTEVfRUxJTUlOQVRJT05fQlJBQ0tFVF9ST1VORF9UWVBFLlVQUEVSX0JSQUNLRVQpIHtcbiAgICAgICAgaWYgKCFwcmV2aW91c0xvd2VyUm91bmQpIHRocm93IG5ldyBFcnJvcigncHJldmlvdXNMb3dlclJvdW5kIGlzIG51bGwnKTtcbiAgICAgICAgaWYgKCFuZXh0TG93ZXJSb3VuZCkgdGhyb3cgbmV3IEVycm9yKCduZXh0TG93ZXJSb3VuZCBpcyBudWxsJyk7XG4gICAgICAgIGlmICghZmlyc3RMb3dlclJvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ2ZpcnN0TG93ZXJSb3VuZCBpcyBudWxsJyk7XG5cbiAgICAgICAgcm91bmRSZWxhdGlvbnMuc2V0KGN1cnJlbnRMb3dlclJvdW5kLmlkLCB7XG4gICAgICAgICAgdHlwZTogJ29uZS10by1vbmUnLFxuICAgICAgICAgIHByZXZpb3VzUm91bmQ6IHByZXZpb3VzTG93ZXJSb3VuZCxcbiAgICAgICAgICBuZXh0Um91bmQ6IG5leHRMb3dlclJvdW5kLFxuICAgICAgICAgIGN1cnJlbnRSb3VuZDogY3VycmVudExvd2VyUm91bmQsXG4gICAgICAgICAgbmV4dFJvdW5kTWF0Y2hGYWN0b3I6IG5leHRMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50TG93ZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgIHByZXZpb3VzUm91bmRNYXRjaEZhY3RvcjogcHJldmlvdXNMb3dlclJvdW5kLm1hdGNoQ291bnQgLyBjdXJyZW50TG93ZXJSb3VuZC5tYXRjaENvdW50LFxuICAgICAgICAgIHJvb3RSb3VuZE1hdGNoRmFjdG9yOiBmaXJzdExvd2VyUm91bmQubWF0Y2hDb3VudCAvIGN1cnJlbnRMb3dlclJvdW5kLm1hdGNoQ291bnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByb3VuZFJlbGF0aW9ucztcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZU1hdGNoUmVsYXRpb25zID0gPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+KFxuICBicmFja2V0RGF0YTogQnJhY2tldERhdGE8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4sXG4gIHJvdW5kUmVsYXRpb25zOiBCcmFja2V0Um91bmRSZWxhdGlvbnM8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4sXG4gIG1hdGNoUG9zaXRpb25NYXBzOiBNYXRjaFBvc2l0aW9uTWFwczxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPixcbikgPT4ge1xuICBjb25zdCBtYXRjaFJlbGF0aW9uczogQnJhY2tldE1hdGNoUmVsYXRpb25zTWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0gbmV3IE1hcCgpO1xuXG4gIGZvciAoY29uc3QgbWF0Y2ggb2YgYnJhY2tldERhdGEubWF0Y2hlcy52YWx1ZXMoKSkge1xuICAgIGNvbnN0IGN1cnJlbnRSZWxhdGlvbiA9IHJvdW5kUmVsYXRpb25zLmdldChtYXRjaC5yb3VuZC5pZCk7XG5cbiAgICBpZiAoIWN1cnJlbnRSZWxhdGlvbikgdGhyb3cgbmV3IEVycm9yKCdNYXRjaCByb3VuZCBub3QgZm91bmQnKTtcblxuICAgIGNvbnN0IHsgbmV4dFJvdW5kTWF0Y2hQb3NpdGlvbiwgcHJldmlvdXNMb3dlclJvdW5kTWF0Y2hQb3NpdGlvbiwgcHJldmlvdXNVcHBlclJvdW5kTWF0Y2hQb3NpdGlvbiB9ID1cbiAgICAgIGdlbmVyYXRlTWF0Y2hSZWxhdGlvblBvc2l0aW9ucyhjdXJyZW50UmVsYXRpb24sIG1hdGNoKTtcblxuICAgIHN3aXRjaCAoY3VycmVudFJlbGF0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgJ25vdGhpbmctdG8tb25lJzoge1xuICAgICAgICBjb25zdCBuZXh0TWF0Y2ggPSBtYXRjaFBvc2l0aW9uTWFwcy5nZXQoY3VycmVudFJlbGF0aW9uLm5leHRSb3VuZC5pZCk/LmdldChuZXh0Um91bmRNYXRjaFBvc2l0aW9uKTtcblxuICAgICAgICBpZiAoIW5leHRNYXRjaCkgdGhyb3cgbmV3IEVycm9yKCdOZXh0IHJvdW5kIG1hdGNoIG5vdCBmb3VuZCcpO1xuXG4gICAgICAgIC8vIG1lYW5zIGxlZnQgaXMgbm90aGluZy4gcmlnaHQgaXMgb25lXG4gICAgICAgIG1hdGNoUmVsYXRpb25zLnNldChtYXRjaC5pZCwge1xuICAgICAgICAgIHR5cGU6ICdub3RoaW5nLXRvLW9uZScsXG4gICAgICAgICAgY3VycmVudE1hdGNoOiBtYXRjaCxcbiAgICAgICAgICBjdXJyZW50Um91bmQ6IGN1cnJlbnRSZWxhdGlvbi5jdXJyZW50Um91bmQsXG4gICAgICAgICAgbmV4dFJvdW5kOiBjdXJyZW50UmVsYXRpb24ubmV4dFJvdW5kLFxuICAgICAgICAgIG5leHRNYXRjaCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdvbmUtdG8tbm90aGluZyc6IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNVcHBlck1hdGNoID0gbWF0Y2hQb3NpdGlvbk1hcHNcbiAgICAgICAgICAuZ2V0KGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1JvdW5kLmlkKVxuICAgICAgICAgID8uZ2V0KHByZXZpb3VzVXBwZXJSb3VuZE1hdGNoUG9zaXRpb24pO1xuICAgICAgICBjb25zdCBwcmV2aW91c0xvd2VyTWF0Y2ggPSBtYXRjaFBvc2l0aW9uTWFwc1xuICAgICAgICAgIC5nZXQoY3VycmVudFJlbGF0aW9uLnByZXZpb3VzUm91bmQuaWQpXG4gICAgICAgICAgPy5nZXQocHJldmlvdXNMb3dlclJvdW5kTWF0Y2hQb3NpdGlvbik7XG5cbiAgICAgICAgaWYgKCFwcmV2aW91c1VwcGVyTWF0Y2gpIHRocm93IG5ldyBFcnJvcignUHJldmlvdXMgcm91bmQgbWF0Y2ggbm90IGZvdW5kJyk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzVXBwZXJSb3VuZE1hdGNoUG9zaXRpb24gIT09IHByZXZpb3VzTG93ZXJSb3VuZE1hdGNoUG9zaXRpb24pIHtcbiAgICAgICAgICAvLyBtZWFucyBsZWZ0IGlzIHR3by4gcmlnaHQgaXMgb25lXG5cbiAgICAgICAgICBpZiAoIXByZXZpb3VzTG93ZXJNYXRjaCkgdGhyb3cgbmV3IEVycm9yKCdQcmV2aW91cyBsb3dlciByb3VuZCBtYXRjaCBub3QgZm91bmQnKTtcblxuICAgICAgICAgIG1hdGNoUmVsYXRpb25zLnNldChtYXRjaC5pZCwge1xuICAgICAgICAgICAgdHlwZTogJ3R3by10by1ub3RoaW5nJyxcbiAgICAgICAgICAgIGN1cnJlbnRNYXRjaDogbWF0Y2gsXG4gICAgICAgICAgICBjdXJyZW50Um91bmQ6IGN1cnJlbnRSZWxhdGlvbi5jdXJyZW50Um91bmQsXG4gICAgICAgICAgICBwcmV2aW91c1VwcGVyTWF0Y2gsXG4gICAgICAgICAgICBwcmV2aW91c1VwcGVyUm91bmQ6IGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1JvdW5kLFxuICAgICAgICAgICAgcHJldmlvdXNMb3dlck1hdGNoLFxuICAgICAgICAgICAgcHJldmlvdXNMb3dlclJvdW5kOiBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNSb3VuZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBtZWFucyBsZWZ0IGlzIG9uZS4gcmlnaHQgaXMgbm90aGluZ1xuICAgICAgICAgIG1hdGNoUmVsYXRpb25zLnNldChtYXRjaC5pZCwge1xuICAgICAgICAgICAgdHlwZTogJ29uZS10by1ub3RoaW5nJyxcbiAgICAgICAgICAgIGN1cnJlbnRNYXRjaDogbWF0Y2gsXG4gICAgICAgICAgICBjdXJyZW50Um91bmQ6IGN1cnJlbnRSZWxhdGlvbi5jdXJyZW50Um91bmQsXG4gICAgICAgICAgICBwcmV2aW91c01hdGNoOiBwcmV2aW91c1VwcGVyTWF0Y2gsXG4gICAgICAgICAgICBwcmV2aW91c1JvdW5kOiBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNSb3VuZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdvbmUtdG8tb25lJzoge1xuICAgICAgICBjb25zdCBuZXh0TWF0Y2ggPSBtYXRjaFBvc2l0aW9uTWFwcy5nZXQoY3VycmVudFJlbGF0aW9uLm5leHRSb3VuZC5pZCk/LmdldChuZXh0Um91bmRNYXRjaFBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNVcHBlck1hdGNoID0gbWF0Y2hQb3NpdGlvbk1hcHNcbiAgICAgICAgICAuZ2V0KGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1JvdW5kLmlkKVxuICAgICAgICAgID8uZ2V0KHByZXZpb3VzVXBwZXJSb3VuZE1hdGNoUG9zaXRpb24pO1xuICAgICAgICBjb25zdCBwcmV2aW91c0xvd2VyTWF0Y2ggPSBtYXRjaFBvc2l0aW9uTWFwc1xuICAgICAgICAgIC5nZXQoY3VycmVudFJlbGF0aW9uLnByZXZpb3VzUm91bmQuaWQpXG4gICAgICAgICAgPy5nZXQocHJldmlvdXNMb3dlclJvdW5kTWF0Y2hQb3NpdGlvbik7XG5cbiAgICAgICAgaWYgKCFuZXh0TWF0Y2gpIHRocm93IG5ldyBFcnJvcignTmV4dCByb3VuZCBtYXRjaCBub3QgZm91bmQnKTtcbiAgICAgICAgaWYgKCFwcmV2aW91c1VwcGVyTWF0Y2gpIHRocm93IG5ldyBFcnJvcihgUHJldmlvdXMgdXBwZXIgcm91bmQgbWF0Y2ggbm90IGZvdW5kYCk7XG4gICAgICAgIGlmICghcHJldmlvdXNMb3dlck1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoJ1ByZXZpb3VzIGxvd2VyIHJvdW5kIG1hdGNoIG5vdCBmb3VuZCcpO1xuXG4gICAgICAgIC8vIGNhbiBiZSBlaXRoZXIgb25lIHRvIG9uZSBvciB0d28gdG8gb25lXG4gICAgICAgIGNvbnN0IGlzTGVmdE9uZSA9IHByZXZpb3VzVXBwZXJSb3VuZE1hdGNoUG9zaXRpb24gPT09IHByZXZpb3VzTG93ZXJSb3VuZE1hdGNoUG9zaXRpb247XG5cbiAgICAgICAgaWYgKGlzTGVmdE9uZSkge1xuICAgICAgICAgIC8vIG9uZS10by1vbmVcbiAgICAgICAgICBtYXRjaFJlbGF0aW9ucy5zZXQobWF0Y2guaWQsIHtcbiAgICAgICAgICAgIHR5cGU6ICdvbmUtdG8tb25lJyxcbiAgICAgICAgICAgIGN1cnJlbnRNYXRjaDogbWF0Y2gsXG4gICAgICAgICAgICBjdXJyZW50Um91bmQ6IGN1cnJlbnRSZWxhdGlvbi5jdXJyZW50Um91bmQsXG4gICAgICAgICAgICBwcmV2aW91c01hdGNoOiBwcmV2aW91c1VwcGVyTWF0Y2gsXG4gICAgICAgICAgICBwcmV2aW91c1JvdW5kOiBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNSb3VuZCxcbiAgICAgICAgICAgIG5leHRNYXRjaCxcbiAgICAgICAgICAgIG5leHRSb3VuZDogY3VycmVudFJlbGF0aW9uLm5leHRSb3VuZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0d28tdG8tb25lXG4gICAgICAgICAgbWF0Y2hSZWxhdGlvbnMuc2V0KG1hdGNoLmlkLCB7XG4gICAgICAgICAgICB0eXBlOiAndHdvLXRvLW9uZScsXG4gICAgICAgICAgICBjdXJyZW50TWF0Y2g6IG1hdGNoLFxuICAgICAgICAgICAgY3VycmVudFJvdW5kOiBjdXJyZW50UmVsYXRpb24uY3VycmVudFJvdW5kLFxuICAgICAgICAgICAgcHJldmlvdXNVcHBlck1hdGNoLFxuICAgICAgICAgICAgcHJldmlvdXNVcHBlclJvdW5kOiBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNSb3VuZCxcbiAgICAgICAgICAgIHByZXZpb3VzTG93ZXJNYXRjaCxcbiAgICAgICAgICAgIHByZXZpb3VzTG93ZXJSb3VuZDogY3VycmVudFJlbGF0aW9uLnByZXZpb3VzUm91bmQsXG4gICAgICAgICAgICBuZXh0TWF0Y2gsXG4gICAgICAgICAgICBuZXh0Um91bmQ6IGN1cnJlbnRSZWxhdGlvbi5uZXh0Um91bmQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3R3by10by1vbmUnOiB7XG4gICAgICAgIGNvbnN0IG5leHRNYXRjaCA9IG1hdGNoUG9zaXRpb25NYXBzLmdldChjdXJyZW50UmVsYXRpb24ubmV4dFJvdW5kLmlkKT8uZ2V0KG5leHRSb3VuZE1hdGNoUG9zaXRpb24pO1xuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzVXBwZXJNYXRjaCA9IG1hdGNoUG9zaXRpb25NYXBzXG4gICAgICAgICAgLmdldChjdXJyZW50UmVsYXRpb24ucHJldmlvdXNVcHBlclJvdW5kLmlkKVxuICAgICAgICAgID8uZ2V0KHByZXZpb3VzVXBwZXJSb3VuZE1hdGNoUG9zaXRpb24pO1xuICAgICAgICBjb25zdCBwcmV2aW91c0xvd2VyTWF0Y2ggPSBtYXRjaFBvc2l0aW9uTWFwc1xuICAgICAgICAgIC5nZXQoY3VycmVudFJlbGF0aW9uLnByZXZpb3VzTG93ZXJSb3VuZC5pZClcbiAgICAgICAgICA/LmdldChwcmV2aW91c0xvd2VyUm91bmRNYXRjaFBvc2l0aW9uKTtcblxuICAgICAgICBpZiAoIW5leHRNYXRjaCkgdGhyb3cgbmV3IEVycm9yKCdOZXh0IHJvdW5kIG1hdGNoIG5vdCBmb3VuZCcpO1xuICAgICAgICBpZiAoIXByZXZpb3VzVXBwZXJNYXRjaCkgdGhyb3cgbmV3IEVycm9yKGBQcmV2aW91cyB1cHBlciByb3VuZCBtYXRjaCBub3QgZm91bmRgKTtcbiAgICAgICAgaWYgKCFwcmV2aW91c0xvd2VyTWF0Y2gpIHRocm93IG5ldyBFcnJvcignUHJldmlvdXMgbG93ZXIgcm91bmQgbWF0Y2ggbm90IGZvdW5kJyk7XG5cbiAgICAgICAgbWF0Y2hSZWxhdGlvbnMuc2V0KG1hdGNoLmlkLCB7XG4gICAgICAgICAgdHlwZTogJ3R3by10by1vbmUnLFxuICAgICAgICAgIGN1cnJlbnRNYXRjaDogbWF0Y2gsXG4gICAgICAgICAgY3VycmVudFJvdW5kOiBjdXJyZW50UmVsYXRpb24uY3VycmVudFJvdW5kLFxuICAgICAgICAgIHByZXZpb3VzVXBwZXJNYXRjaCxcbiAgICAgICAgICBwcmV2aW91c1VwcGVyUm91bmQ6IGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1VwcGVyUm91bmQsXG4gICAgICAgICAgcHJldmlvdXNMb3dlck1hdGNoLFxuICAgICAgICAgIHByZXZpb3VzTG93ZXJSb3VuZDogY3VycmVudFJlbGF0aW9uLnByZXZpb3VzTG93ZXJSb3VuZCxcbiAgICAgICAgICBuZXh0TWF0Y2gsXG4gICAgICAgICAgbmV4dFJvdW5kOiBjdXJyZW50UmVsYXRpb24ubmV4dFJvdW5kLFxuICAgICAgICB9KTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3R3by10by1ub3RoaW5nJzoge1xuICAgICAgICBjb25zdCBwcmV2aW91c1VwcGVyTWF0Y2ggPSBtYXRjaFBvc2l0aW9uTWFwc1xuICAgICAgICAgIC5nZXQoY3VycmVudFJlbGF0aW9uLnByZXZpb3VzVXBwZXJSb3VuZC5pZClcbiAgICAgICAgICA/LmdldChwcmV2aW91c1VwcGVyUm91bmRNYXRjaFBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNMb3dlck1hdGNoID0gbWF0Y2hQb3NpdGlvbk1hcHNcbiAgICAgICAgICAuZ2V0KGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1VwcGVyUm91bmQuaWQpXG4gICAgICAgICAgPy5nZXQocHJldmlvdXNMb3dlclJvdW5kTWF0Y2hQb3NpdGlvbik7XG5cbiAgICAgICAgaWYgKCFwcmV2aW91c1VwcGVyTWF0Y2gpIHRocm93IG5ldyBFcnJvcihgUHJldmlvdXMgdXBwZXIgcm91bmQgbWF0Y2ggbm90IGZvdW5kYCk7XG4gICAgICAgIGlmICghcHJldmlvdXNMb3dlck1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoJ1ByZXZpb3VzIGxvd2VyIHJvdW5kIG1hdGNoIG5vdCBmb3VuZCcpO1xuXG4gICAgICAgIG1hdGNoUmVsYXRpb25zLnNldChtYXRjaC5pZCwge1xuICAgICAgICAgIHR5cGU6ICd0d28tdG8tbm90aGluZycsXG4gICAgICAgICAgY3VycmVudE1hdGNoOiBtYXRjaCxcbiAgICAgICAgICBjdXJyZW50Um91bmQ6IGN1cnJlbnRSZWxhdGlvbi5jdXJyZW50Um91bmQsXG4gICAgICAgICAgcHJldmlvdXNVcHBlck1hdGNoLFxuICAgICAgICAgIHByZXZpb3VzVXBwZXJSb3VuZDogY3VycmVudFJlbGF0aW9uLnByZXZpb3VzVXBwZXJSb3VuZCxcbiAgICAgICAgICBwcmV2aW91c0xvd2VyTWF0Y2gsXG4gICAgICAgICAgcHJldmlvdXNMb3dlclJvdW5kOiBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNVcHBlclJvdW5kLFxuICAgICAgICB9KTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWF0Y2hSZWxhdGlvbnM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVNYXRjaFJlbGF0aW9uUG9zaXRpb25zID0gPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+KFxuICBjdXJyZW50UmVsYXRpb246IEJyYWNrZXRSb3VuZFJlbGF0aW9uPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+LFxuICBtYXRjaDogQnJhY2tldE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+LFxuKSA9PiB7XG4gIHN3aXRjaCAoY3VycmVudFJlbGF0aW9uLnR5cGUpIHtcbiAgICBjYXNlICdub3RoaW5nLXRvLW9uZSc6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHRSb3VuZE1hdGNoUG9zaXRpb246IGdlbmVyYXRlTWF0Y2hQb3NpdGlvbihtYXRjaCwgY3VycmVudFJlbGF0aW9uLm5leHRSb3VuZE1hdGNoRmFjdG9yKSxcbiAgICAgICAgcHJldmlvdXNVcHBlclJvdW5kTWF0Y2hQb3NpdGlvbjogRkFMTEJBQ0tfTUFUQ0hfUE9TSVRJT04sXG4gICAgICAgIHByZXZpb3VzTG93ZXJSb3VuZE1hdGNoUG9zaXRpb246IEZBTExCQUNLX01BVENIX1BPU0lUSU9OLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnb25lLXRvLW5vdGhpbmcnOiB7XG4gICAgICBjb25zdCBwcmV2aW91c1JvdW5kSGFzRG91YmxlVGhlTWF0Y2hDb3VudCA9IGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3IgPT09IDI7XG4gICAgICBjb25zdCBkb3VibGVVcHBlck1hdGNoQ291bnRTaGlmdCA9IHByZXZpb3VzUm91bmRIYXNEb3VibGVUaGVNYXRjaENvdW50ID8gMSA6IDA7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHRSb3VuZE1hdGNoUG9zaXRpb246IEZBTExCQUNLX01BVENIX1BPU0lUSU9OLFxuICAgICAgICBwcmV2aW91c1VwcGVyUm91bmRNYXRjaFBvc2l0aW9uOiAoZ2VuZXJhdGVNYXRjaFBvc2l0aW9uKG1hdGNoLCBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNSb3VuZE1hdGNoRmFjdG9yKSAtXG4gICAgICAgICAgZG91YmxlVXBwZXJNYXRjaENvdW50U2hpZnQpIGFzIEJyYWNrZXRNYXRjaFBvc2l0aW9uLFxuICAgICAgICBwcmV2aW91c0xvd2VyUm91bmRNYXRjaFBvc2l0aW9uOiBnZW5lcmF0ZU1hdGNoUG9zaXRpb24obWF0Y2gsIGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3IpLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnb25lLXRvLW9uZSc6IHtcbiAgICAgIGNvbnN0IHByZXZpb3VzUm91bmRIYXNEb3VibGVUaGVNYXRjaENvdW50ID0gY3VycmVudFJlbGF0aW9uLnByZXZpb3VzUm91bmRNYXRjaEZhY3RvciA9PT0gMjtcbiAgICAgIGNvbnN0IGRvdWJsZVVwcGVyTWF0Y2hDb3VudFNoaWZ0ID0gcHJldmlvdXNSb3VuZEhhc0RvdWJsZVRoZU1hdGNoQ291bnQgPyAxIDogMDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dFJvdW5kTWF0Y2hQb3NpdGlvbjogZ2VuZXJhdGVNYXRjaFBvc2l0aW9uKG1hdGNoLCBjdXJyZW50UmVsYXRpb24ubmV4dFJvdW5kTWF0Y2hGYWN0b3IpLFxuICAgICAgICBwcmV2aW91c1VwcGVyUm91bmRNYXRjaFBvc2l0aW9uOiAoZ2VuZXJhdGVNYXRjaFBvc2l0aW9uKG1hdGNoLCBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNSb3VuZE1hdGNoRmFjdG9yKSAtXG4gICAgICAgICAgZG91YmxlVXBwZXJNYXRjaENvdW50U2hpZnQpIGFzIEJyYWNrZXRNYXRjaFBvc2l0aW9uLFxuICAgICAgICBwcmV2aW91c0xvd2VyUm91bmRNYXRjaFBvc2l0aW9uOiBnZW5lcmF0ZU1hdGNoUG9zaXRpb24obWF0Y2gsIGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1JvdW5kTWF0Y2hGYWN0b3IpLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAndHdvLXRvLW9uZSc6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHRSb3VuZE1hdGNoUG9zaXRpb246IGdlbmVyYXRlTWF0Y2hQb3NpdGlvbihtYXRjaCwgY3VycmVudFJlbGF0aW9uLm5leHRSb3VuZE1hdGNoRmFjdG9yKSxcbiAgICAgICAgcHJldmlvdXNVcHBlclJvdW5kTWF0Y2hQb3NpdGlvbjogZ2VuZXJhdGVNYXRjaFBvc2l0aW9uKG1hdGNoLCBjdXJyZW50UmVsYXRpb24ucHJldmlvdXNVcHBlclJvdW5kTWF0Y2hGYWN0b3IpLFxuICAgICAgICBwcmV2aW91c0xvd2VyUm91bmRNYXRjaFBvc2l0aW9uOiBnZW5lcmF0ZU1hdGNoUG9zaXRpb24obWF0Y2gsIGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c0xvd2VyUm91bmRNYXRjaEZhY3RvciksXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICd0d28tdG8tbm90aGluZyc6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHRSb3VuZE1hdGNoUG9zaXRpb246IEZBTExCQUNLX01BVENIX1BPU0lUSU9OLFxuICAgICAgICBwcmV2aW91c1VwcGVyUm91bmRNYXRjaFBvc2l0aW9uOiBnZW5lcmF0ZU1hdGNoUG9zaXRpb24obWF0Y2gsIGN1cnJlbnRSZWxhdGlvbi5wcmV2aW91c1VwcGVyUm91bmRNYXRjaEZhY3RvciksXG4gICAgICAgIHByZXZpb3VzTG93ZXJSb3VuZE1hdGNoUG9zaXRpb246IGdlbmVyYXRlTWF0Y2hQb3NpdGlvbihtYXRjaCwgY3VycmVudFJlbGF0aW9uLnByZXZpb3VzTG93ZXJSb3VuZE1hdGNoRmFjdG9yKSxcbiAgICAgIH07XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVNYXRjaFBvc2l0aW9uID0gKG1hdGNoOiBCcmFja2V0TWF0Y2g8dW5rbm93biwgdW5rbm93bj4sIGZhY3RvcjogTWF0Y2hGYWN0b3IpID0+IHtcbiAgcmV0dXJuIE1hdGguY2VpbChtYXRjaC5wb3NpdGlvbiAqIGZhY3RvcikgYXMgQnJhY2tldE1hdGNoUG9zaXRpb247XG59O1xuXG5leHBvcnQgY29uc3QgbG9nUm91bmRSZWxhdGlvbnMgPSAoXG4gIHJvdW5kUmVsYXRpb25zOiBCcmFja2V0Um91bmRSZWxhdGlvbnM8dW5rbm93biwgdW5rbm93bj4sXG4gIGJyYWNrZXREYXRhOiBCcmFja2V0RGF0YTx1bmtub3duLCB1bmtub3duPixcbikgPT4ge1xuICBmb3IgKGNvbnN0IFtyb3VuZElkLCByZWxhdGlvbl0gb2Ygcm91bmRSZWxhdGlvbnMuZW50cmllcygpKSB7XG4gICAgY29uc3Qgcm91bmQgPSBicmFja2V0RGF0YS5yb3VuZHMuZ2V0KHJvdW5kSWQpO1xuXG4gICAgaWYgKCFyb3VuZCkge1xuICAgICAgY29uc29sZS5lcnJvcihgUm91bmQgd2l0aCBpZCAke3JvdW5kSWR9IG5vdCBmb3VuZCBpbiBicmFja2V0IGRhdGEuIFRoZSBicmFja2V0IHdpbGwgYmUgbWFsZm9ybWVkLmApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZWxhdGlvbi50eXBlKSB7XG4gICAgICBjYXNlICdub3RoaW5nLXRvLW9uZSc6XG4gICAgICAgIGNvbnNvbGUubG9nKGBTVEFSVDogJHtyb3VuZC5uYW1lfSAtPiAke3JlbGF0aW9uLm5leHRSb3VuZC5uYW1lfSAoRjogJHtyZWxhdGlvbi5uZXh0Um91bmRNYXRjaEZhY3Rvcn0pYCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnb25lLXRvLW5vdGhpbmcnOlxuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgJHtyZWxhdGlvbi5wcmV2aW91c1JvdW5kLm5hbWV9IChGOiAke3JlbGF0aW9uLnByZXZpb3VzUm91bmRNYXRjaEZhY3Rvcn0pIDwtIEVORElORzogJHtyb3VuZC5uYW1lfWAsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnb25lLXRvLW9uZSc6XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGAke3JlbGF0aW9uLnByZXZpb3VzUm91bmQubmFtZX0gKEY6ICR7cmVsYXRpb24ucHJldmlvdXNSb3VuZE1hdGNoRmFjdG9yfSkgPC0gJHtyb3VuZC5uYW1lfSAtPiAke3JlbGF0aW9uLm5leHRSb3VuZC5uYW1lfSAoRjogJHtyZWxhdGlvbi5uZXh0Um91bmRNYXRjaEZhY3Rvcn0pYCxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0d28tdG8tb25lJzpcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYE1FUkdFUjogJHtyZWxhdGlvbi5wcmV2aW91c1VwcGVyUm91bmQubmFtZX0gKEY6ICR7cmVsYXRpb24ucHJldmlvdXNVcHBlclJvdW5kTWF0Y2hGYWN0b3J9KSBBTkQgJHtyZWxhdGlvbi5wcmV2aW91c0xvd2VyUm91bmQubmFtZX0gKEY6ICR7cmVsYXRpb24ucHJldmlvdXNMb3dlclJvdW5kTWF0Y2hGYWN0b3J9KSA8LSAke3JvdW5kLm5hbWV9IC0+ICR7cmVsYXRpb24ubmV4dFJvdW5kLm5hbWV9IChGOiAke3JlbGF0aW9uLm5leHRSb3VuZE1hdGNoRmFjdG9yfSlgLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3R3by10by1ub3RoaW5nJzpcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYE1FUkdFUjogJHtyZWxhdGlvbi5wcmV2aW91c1VwcGVyUm91bmQubmFtZX0gKEY6ICR7cmVsYXRpb24ucHJldmlvdXNVcHBlclJvdW5kTWF0Y2hGYWN0b3J9KSBBTkQgJHtyZWxhdGlvbi5wcmV2aW91c0xvd2VyUm91bmQubmFtZX0gKEY6ICR7cmVsYXRpb24ucHJldmlvdXNMb3dlclJvdW5kTWF0Y2hGYWN0b3J9KSA8LSBFTkRJTkc6ICR7cm91bmQubmFtZX1gLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZU1hdGNoUGFydGljaXBhbnRNYXAgPSA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4oXG4gIGJyYWNrZXREYXRhOiBCcmFja2V0RGF0YTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPixcbikgPT4ge1xuICBjb25zdCBtYXRjaFBhcnRpY2lwYW50TWFwOiBNYXRjaFBhcnRpY2lwYW50TWFwPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0IGhhc0VsaW1pbmF0aW9uID1cbiAgICBicmFja2V0RGF0YS5tb2RlID09PSBUT1VSTkFNRU5UX01PREUuU0lOR0xFX0VMSU1JTkFUSU9OIHx8XG4gICAgYnJhY2tldERhdGEubW9kZSA9PT0gVE9VUk5BTUVOVF9NT0RFLkRPVUJMRV9FTElNSU5BVElPTiB8fFxuICAgIGJyYWNrZXREYXRhLm1vZGUgPT09IFRPVVJOQU1FTlRfTU9ERS5TV0lTU19XSVRIX0VMSU1JTkFUSU9OO1xuXG4gIGZvciAoY29uc3QgcGFydGljaXBhbnQgb2YgYnJhY2tldERhdGEucGFydGljaXBhbnRzLnZhbHVlcygpKSB7XG4gICAgbGV0IHdpbnNUaWxOb3cgPSAwO1xuICAgIGxldCBsb3NzZXNUaWxOb3cgPSAwO1xuICAgIGxldCB0aWVzVGlsTm93ID0gMDtcblxuICAgIGZvciAoY29uc3QgbWF0Y2hQYXJ0aWNpcGFudE1hdGNoIG9mIHBhcnRpY2lwYW50Lm1hdGNoZXMudmFsdWVzKCkpIHtcbiAgICAgIGNvbnN0IGlzV2lubmVyID0gbWF0Y2hQYXJ0aWNpcGFudE1hdGNoLmJyYWNrZXRNYXRjaC53aW5uZXJTaWRlID09PSBtYXRjaFBhcnRpY2lwYW50TWF0Y2guc2lkZTtcbiAgICAgIGNvbnN0IGlzTG9vc2VyID1cbiAgICAgICAgbWF0Y2hQYXJ0aWNpcGFudE1hdGNoLmJyYWNrZXRNYXRjaC53aW5uZXJTaWRlICYmXG4gICAgICAgIG1hdGNoUGFydGljaXBhbnRNYXRjaC5icmFja2V0TWF0Y2gud2lubmVyU2lkZSAhPT0gbWF0Y2hQYXJ0aWNpcGFudE1hdGNoLnNpZGU7XG4gICAgICBjb25zdCBpc1RpZSA9XG4gICAgICAgIG1hdGNoUGFydGljaXBhbnRNYXRjaC5icmFja2V0TWF0Y2guc3RhdHVzID09PSAnY29tcGxldGVkJyAmJiAhbWF0Y2hQYXJ0aWNpcGFudE1hdGNoLmJyYWNrZXRNYXRjaC53aW5uZXI7XG5cbiAgICAgIGlmIChpc1dpbm5lcikge1xuICAgICAgICB3aW5zVGlsTm93Kys7XG4gICAgICB9IGVsc2UgaWYgKGlzTG9vc2VyKSB7XG4gICAgICAgIGxvc3Nlc1RpbE5vdysrO1xuICAgICAgfSBlbHNlIGlmIChpc1RpZSkge1xuICAgICAgICB0aWVzVGlsTm93Kys7XG4gICAgICB9XG5cbiAgICAgIGxldCBpc0VsaW1pbmF0ZWQgPSBmYWxzZTtcbiAgICAgIGxldCBpc0VsaW1pbmF0aW9uTWF0Y2ggPSBmYWxzZTtcblxuICAgICAgaWYgKGhhc0VsaW1pbmF0aW9uKSB7XG4gICAgICAgIC8vIFRPRE86IEltcGxlbWVudCBlbGltaW5hdGlvbiBsb2dpY1xuXG4gICAgICAgIC8vIE1lYW5zIHRoZSBjdXJyZW50IG1hdGNoIGlzIGxvc3MgYW5kIGl0J3MgdGhlIGxhc3QgbWF0Y2ggb2YgdGhlIHBhcnRpY2lwYW50XG4gICAgICAgIGlzRWxpbWluYXRlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEFsd2F5cyB0cnVlIGZvciBzaW5nbGUgZWxpbWluYXRpb24sIG5ldmVyIGZvciBlLmcuIGdyb3VwcywgZGVwZW5kcyBvbiB0aGUgcm91bmQgZm9yIGRvdWJsZSBlbGltaW5hdGlvbiwgZGVwZW5kcyBvbiB0aGUgbG9zcyBjb3VudCBmb3Igc3dpc3Mgd2l0aCBlbGltaW5hdGlvblxuICAgICAgICBpc0VsaW1pbmF0aW9uTWF0Y2ggPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gVE9ETzogSW1wbGVtZW50IHJvdW5kIGxvZ2ljXG4gICAgICAvLyB0cnVlIGlmIGl0cyB0aGUgZmlyc3Qgcm91bmQgb2YgdGhlIGJyYWNrZXRcbiAgICAgIGNvbnN0IGlzRmlyc3RSb3VuZCA9IGZhbHNlO1xuXG4gICAgICAvLyB0cnVlIGlmIGl0cyB0aGUgbGFzdCByb3VuZCBvZiB0aGUgYnJhY2tldCAoZWcuIGZpbmFsIGZvciBzaW5nbGUgZWxpbWluYXRpb24pXG4gICAgICBjb25zdCBpc0xhc3RSb3VuZCA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBwYXJ0aWNpcGFudE1hdGNoRGF0YTogTWF0Y2hQYXJ0aWNpcGFudE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICAgICAgICBicmFja2V0TWF0Y2g6IG1hdGNoUGFydGljaXBhbnRNYXRjaC5icmFja2V0TWF0Y2gsXG4gICAgICAgIHJlc3VsdDogaXNXaW5uZXIgPyAnd2luJyA6IGlzTG9vc2VyID8gJ2xvc3MnIDogaXNUaWUgPyAndGllJyA6IG51bGwsXG4gICAgICAgIGlzRWxpbWluYXRlZCxcbiAgICAgICAgaXNFbGltaW5hdGlvbk1hdGNoLFxuICAgICAgICBpc0ZpcnN0Um91bmQsXG4gICAgICAgIGlzTGFzdFJvdW5kLFxuICAgICAgICB0aWVDb3VudDogdGllc1RpbE5vdyxcbiAgICAgICAgd2luQ291bnQ6IHdpbnNUaWxOb3csXG4gICAgICAgIGxvc3NDb3VudDogbG9zc2VzVGlsTm93LFxuICAgICAgfTtcblxuICAgICAgaWYgKCFtYXRjaFBhcnRpY2lwYW50TWFwLmhhcyhwYXJ0aWNpcGFudC5pZCkpIHtcbiAgICAgICAgbWF0Y2hQYXJ0aWNpcGFudE1hcC5zZXQocGFydGljaXBhbnQuaWQsIHtcbiAgICAgICAgICBpZDogcGFydGljaXBhbnQuaWQsXG4gICAgICAgICAgbmFtZTogcGFydGljaXBhbnQubmFtZSxcbiAgICAgICAgICBtYXRjaGVzOiBuZXcgTWFwKCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJ0aWNpcGFudERhdGEgPSBtYXRjaFBhcnRpY2lwYW50TWFwLmdldChwYXJ0aWNpcGFudC5pZCkgYXMgTWF0Y2hQYXJ0aWNpcGFudDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgICAgIHBhcnRpY2lwYW50RGF0YS5tYXRjaGVzLnNldChtYXRjaFBhcnRpY2lwYW50TWF0Y2guYnJhY2tldE1hdGNoLmlkLCBwYXJ0aWNpcGFudE1hdGNoRGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1hdGNoUGFydGljaXBhbnRNYXA7XG59O1xuXG5jb25zdCBmYWN0b3JpYWxDYWNoZSA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG5cbmV4cG9ydCBjb25zdCBnZXRBdmFpbGFibGVTd2lzc0dyb3Vwc0ZvclJvdW5kID0gKHJvdW5kTnVtYmVyOiBudW1iZXIsIHRvdGFsTWF0Y2hlc0luUm91bmQ6IG51bWJlcikgPT4ge1xuICBjb25zdCBBRFZBTkNFX1dJTlMgPSAzO1xuICBjb25zdCBFTElNSU5BVEVfTE9TU0VTID0gMztcblxuICAvLyBDYWNoZSBmYWN0b3JpYWwgY2FsY3VsYXRpb25zXG4gIGNvbnN0IGdldEZhY3RvcmlhbCA9IChuOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgIGlmIChuIDw9IDEpIHJldHVybiAxO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgaWYgKGZhY3RvcmlhbENhY2hlLmhhcyhuKSkgcmV0dXJuIGZhY3RvcmlhbENhY2hlLmdldChuKSE7XG5cbiAgICBjb25zdCByZXN1bHQgPSBuICogZ2V0RmFjdG9yaWFsKG4gLSAxKTtcbiAgICBmYWN0b3JpYWxDYWNoZS5zZXQobiwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIFByZS1jYWxjdWxhdGUgcm91bmRGYWN0b3JpYWxcbiAgY29uc3Qgcm91bmRGYWN0ID0gZ2V0RmFjdG9yaWFsKHJvdW5kTnVtYmVyKTtcblxuICBsZXQgdG90YWxDb21iaW5hdGlvbnMgPSAwO1xuICBjb25zdCB2YWxpZEdyb3VwczogeyB3aW5zOiBudW1iZXI7IGxvc3NlczogbnVtYmVyOyBjb21iaW5hdGlvbnM6IG51bWJlciB9W10gPSBbXTtcblxuICAvLyBTaW5nbGUgbG9vcCB0byBnYXRoZXIgdmFsaWQgZ3JvdXBzIGFuZCB0b3RhbCBjb21iaW5hdGlvbnNcbiAgZm9yIChsZXQgd2lucyA9IHJvdW5kTnVtYmVyOyB3aW5zID49IDA7IHdpbnMtLSkge1xuICAgIGNvbnN0IGxvc3NlcyA9IHJvdW5kTnVtYmVyIC0gd2lucztcbiAgICBjb25zdCByZW1haW5pbmdHYW1lcyA9IEFEVkFOQ0VfV0lOUyArIEVMSU1JTkFURV9MT1NTRVMgLSAod2lucyArIGxvc3NlcykgLSAxO1xuICAgIGNvbnN0IG5vdFlldEVsaW1pbmF0ZWQgPSBsb3NzZXMgPCBFTElNSU5BVEVfTE9TU0VTO1xuICAgIGNvbnN0IGNhblN0aWxsQWR2YW5jZSA9IHdpbnMgPCBBRFZBTkNFX1dJTlMgJiYgcmVtYWluaW5nR2FtZXMgPj0gMDtcblxuICAgIGlmICghY2FuU3RpbGxBZHZhbmNlIHx8ICFub3RZZXRFbGltaW5hdGVkKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGNvbWJpbmF0aW9ucyA9IHJvdW5kRmFjdCAvIChnZXRGYWN0b3JpYWwod2lucykgKiBnZXRGYWN0b3JpYWwobG9zc2VzKSk7XG4gICAgdG90YWxDb21iaW5hdGlvbnMgKz0gY29tYmluYXRpb25zO1xuICAgIHZhbGlkR3JvdXBzLnB1c2goeyB3aW5zLCBsb3NzZXMsIGNvbWJpbmF0aW9ucyB9KTtcbiAgfVxuXG4gIC8vIENyZWF0ZSBmaW5hbCBncm91cHMgd2l0aCBjYWxjdWxhdGVkIHByb3BvcnRpb25zXG4gIHJldHVybiB2YWxpZEdyb3Vwcy5tYXAoKHsgd2lucywgbG9zc2VzLCBjb21iaW5hdGlvbnMgfSkgPT4gKHtcbiAgICBpZDogYCR7d2luc30tJHtsb3NzZXN9YCBhcyBCcmFja2V0Um91bmRTd2lzc0dyb3VwSWQsXG4gICAgbmFtZTogYCR7d2luc30tJHtsb3NzZXN9YCxcbiAgICBtYXRjaGVzSW5Hcm91cDogTWF0aC5yb3VuZCgoY29tYmluYXRpb25zIC8gdG90YWxDb21iaW5hdGlvbnMpICogdG90YWxNYXRjaGVzSW5Sb3VuZCksXG4gIH0pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUJyYWNrZXRSb3VuZFN3aXNzR3JvdXBNYXBzID0gPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+KFxuICBicmFja2V0RGF0YTogQnJhY2tldERhdGE8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4sXG4gIG1hdGNoUGFydGljaXBhbnRNYXA6IE1hdGNoUGFydGljaXBhbnRNYXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4sXG4pID0+IHtcbiAgaWYgKGJyYWNrZXREYXRhLm1vZGUgIT09IFRPVVJOQU1FTlRfTU9ERS5TV0lTU19XSVRIX0VMSU1JTkFUSU9OKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCByb3VuZHNXaXRoU3dpc3NHcm91cHM6IEJyYWNrZXRSb3VuZE1hcFdpdGhTd2lzc0RhdGE8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSBuZXcgTWFwKCk7XG5cbiAgbGV0IHJvdW5kTnVtYmVyID0gMDtcbiAgZm9yIChjb25zdCBicmFja2V0Um91bmQgb2YgYnJhY2tldERhdGEucm91bmRzLnZhbHVlcygpKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlR3JvdXBzID0gZ2V0QXZhaWxhYmxlU3dpc3NHcm91cHNGb3JSb3VuZChyb3VuZE51bWJlciwgYnJhY2tldFJvdW5kLm1hdGNoQ291bnQpO1xuXG4gICAgY29uc3Qgcm91bmRTd2lzc0RhdGE6IEJyYWNrZXRSb3VuZFN3aXNzRGF0YTxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgICAgIGdyb3VwczogbmV3IE1hcCgpLFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIGF2YWlsYWJsZUdyb3Vwcykge1xuICAgICAgY29uc3Qgc3ViR3JvdXA6IEJyYWNrZXRSb3VuZFN3aXNzR3JvdXA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gICAgICAgIGlkOiBncm91cC5pZCxcbiAgICAgICAgbmFtZTogZ3JvdXAubmFtZSxcbiAgICAgICAgbWF0Y2hlczogbmV3IE1hcCgpLFxuICAgICAgICBhbGxvd2VkTWF0Y2hDb3VudDogZ3JvdXAubWF0Y2hlc0luR3JvdXAsXG4gICAgICB9O1xuXG4gICAgICByb3VuZFN3aXNzRGF0YS5ncm91cHMuc2V0KGdyb3VwLmlkLCBzdWJHcm91cCk7XG4gICAgfVxuXG4gICAgY29uc3QgZW1wdHlNYXRjaElkczogQnJhY2tldE1hdGNoSWRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBicmFja2V0Um91bmQubWF0Y2hlcy52YWx1ZXMoKSkge1xuICAgICAgY29uc3QgcGFydGljaXBhbnRIb21lID0gbWF0Y2guaG9tZSA/IChtYXRjaFBhcnRpY2lwYW50TWFwLmdldChtYXRjaC5ob21lLmlkKSA/PyBudWxsKSA6IG51bGw7XG4gICAgICBjb25zdCBwYXJ0aWNpcGFudEF3YXkgPSBtYXRjaC5hd2F5ID8gKG1hdGNoUGFydGljaXBhbnRNYXAuZ2V0KG1hdGNoLmF3YXkuaWQpID8/IG51bGwpIDogbnVsbDtcblxuICAgICAgY29uc3QgYW55UGFydGljaXBhbnQgPSBwYXJ0aWNpcGFudEhvbWUgfHwgcGFydGljaXBhbnRBd2F5O1xuXG4gICAgICBpZiAoIWFueVBhcnRpY2lwYW50KSB7XG4gICAgICAgIGVtcHR5TWF0Y2hJZHMucHVzaChtYXRjaC5pZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaFBhcnRpY2lwYW50TWF0Y2ggPSBhbnlQYXJ0aWNpcGFudC5tYXRjaGVzLmdldChtYXRjaC5pZCk7XG5cbiAgICAgIGlmICghbWF0Y2hQYXJ0aWNpcGFudE1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoJ01hdGNoIHBhcnRpY2lwYW50IG1hdGNoIG5vdCBmb3VuZCcpO1xuXG4gICAgICBjb25zdCB3aW5zID0gbWF0Y2hQYXJ0aWNpcGFudE1hdGNoLndpbkNvdW50O1xuICAgICAgY29uc3QgbG9zc2VzID0gbWF0Y2hQYXJ0aWNpcGFudE1hdGNoLmxvc3NDb3VudDtcblxuICAgICAgY29uc3QgZ3JvdXAgPSByb3VuZFN3aXNzRGF0YS5ncm91cHMuZ2V0KGAke3dpbnN9LSR7bG9zc2VzfWAgYXMgQnJhY2tldFJvdW5kU3dpc3NHcm91cElkKTtcblxuICAgICAgaWYgKCFncm91cCkgdGhyb3cgbmV3IEVycm9yKCdHcm91cCBub3QgZm91bmQgZm9yIG1hdGNoOiAnICsgbWF0Y2guaWQpO1xuXG4gICAgICBncm91cC5tYXRjaGVzLnNldChtYXRjaC5pZCwgbWF0Y2gpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZW1wdHlNYXRjaElkIG9mIGVtcHR5TWF0Y2hJZHMpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gYnJhY2tldFJvdW5kLm1hdGNoZXMuZ2V0KGVtcHR5TWF0Y2hJZCk7XG5cbiAgICAgIGlmICghbWF0Y2gpIHRocm93IG5ldyBFcnJvcignRW1wdHkgbWF0Y2ggbm90IGZvdW5kJyk7XG5cbiAgICAgIGxldCBncm91cEZvdW5kID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHJvdW5kU3dpc3NEYXRhLmdyb3Vwcy52YWx1ZXMoKSkge1xuICAgICAgICBpZiAoZ3JvdXAubWF0Y2hlcy5zaXplIDwgZ3JvdXAuYWxsb3dlZE1hdGNoQ291bnQpIHtcbiAgICAgICAgICBncm91cC5tYXRjaGVzLnNldChtYXRjaC5pZCwgbWF0Y2gpO1xuICAgICAgICAgIGdyb3VwRm91bmQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghZ3JvdXBGb3VuZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGdyb3VwIGZvdW5kIGZvciBlbXB0eSBtYXRjaCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJvdW5kTnVtYmVyKys7XG4gIH1cblxuICByZXR1cm4gcm91bmRzV2l0aFN3aXNzR3JvdXBzO1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlQnJhY2tldERhdGFGb3JFdGhsZXRlID0gKHNvdXJjZTogUm91bmRTdGFnZVN0cnVjdHVyZVdpdGhNYXRjaGVzVmlld1tdKSA9PiB7XG4gIGNvbnN0IHRvdXJuYW1lbnRNb2RlID0gZ2VuZXJhdGVUb3VybmFtZW50TW9kZUZvcm1FdGhsZXRlUm91bmRzKHNvdXJjZSk7XG5cbiAgY29uc3QgYnJhY2tldERhdGE6IEJyYWNrZXREYXRhU291cmNlPFJvdW5kU3RhZ2VTdHJ1Y3R1cmVWaWV3LCBNYXRjaExpc3RWaWV3VW5pb24+ID0ge1xuICAgIHJvdW5kczogW10sXG4gICAgbWF0Y2hlczogW10sXG4gICAgbW9kZTogdG91cm5hbWVudE1vZGUsXG4gIH07XG5cbiAgZm9yIChjb25zdCBjdXJyZW50SXRlbSBvZiBzb3VyY2UpIHtcbiAgICBpZiAoYnJhY2tldERhdGEucm91bmRzLnNvbWUoKHIpID0+IHIuaWQgPT09IGN1cnJlbnRJdGVtLnJvdW5kLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3VuZCB3aXRoIGlkICR7Y3VycmVudEl0ZW0ucm91bmQuaWR9IGFscmVhZHkgZXhpc3RzIGluIHRoZSBicmFja2V0IGRhdGEuYCk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm91bmRUeXBlID0gZ2VuZXJhdGVSb3VuZFR5cGVGcm9tRXRobGV0ZVJvdW5kVHlwZShcbiAgICAgIGN1cnJlbnRJdGVtLnJvdW5kLnR5cGUsXG4gICAgICB0b3VybmFtZW50TW9kZSxcbiAgICAgIGN1cnJlbnRJdGVtLm1hdGNoZXMubGVuZ3RoLFxuICAgICk7XG5cbiAgICBjb25zdCBicmFja2V0Um91bmQ6IEJyYWNrZXRSb3VuZFNvdXJjZTxSb3VuZFN0YWdlU3RydWN0dXJlVmlldz4gPSB7XG4gICAgICB0eXBlOiByb3VuZFR5cGUsXG4gICAgICBpZDogY3VycmVudEl0ZW0ucm91bmQuaWQsXG4gICAgICBkYXRhOiBjdXJyZW50SXRlbS5yb3VuZCxcbiAgICAgIG5hbWU6IGN1cnJlbnRJdGVtLnJvdW5kLm5hbWUgfHwgY3VycmVudEl0ZW0ucm91bmQudHlwZSxcbiAgICB9O1xuXG4gICAgYnJhY2tldERhdGEucm91bmRzLnB1c2goYnJhY2tldFJvdW5kKTtcblxuICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgY3VycmVudEl0ZW0ubWF0Y2hlcykge1xuICAgICAgaWYgKGJyYWNrZXREYXRhLm1hdGNoZXMuc29tZSgobSkgPT4gbS5pZCA9PT0gbWF0Y2guaWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWF0Y2ggd2l0aCBpZCAke21hdGNoLmlkfSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgYnJhY2tldCBkYXRhLmApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBicmFja2V0TWF0Y2g6IEJyYWNrZXRNYXRjaFNvdXJjZTxNYXRjaExpc3RWaWV3VW5pb24+ID0ge1xuICAgICAgICBpZDogbWF0Y2guaWQsXG4gICAgICAgIGRhdGE6IG1hdGNoLFxuICAgICAgICByb3VuZElkOiBjdXJyZW50SXRlbS5yb3VuZC5pZCxcbiAgICAgICAgaG9tZTogbWF0Y2guaG9tZT8uaWQgfHwgbnVsbCxcbiAgICAgICAgYXdheTogbWF0Y2guYXdheT8uaWQgfHwgbnVsbCxcbiAgICAgICAgd2lubmVyOiBtYXRjaC53aW5uaW5nU2lkZSxcbiAgICAgICAgc3RhdHVzOiBtYXRjaC5zdGF0dXMgPT09ICdwdWJsaXNoZWQnID8gJ2NvbXBsZXRlZCcgOiAncGVuZGluZycsXG4gICAgICB9O1xuXG4gICAgICBicmFja2V0RGF0YS5tYXRjaGVzLnB1c2goYnJhY2tldE1hdGNoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnJhY2tldERhdGE7XG59O1xuXG50eXBlIEdlbmVyYXRlQnJhY2tldE1hdGNoT3B0aW9uczxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPiA9IHtcbiAgYnJhY2tldERhdGE6IEJyYWNrZXREYXRhPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuICBicmFja2V0Um91bmQ6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPjtcbiAgY3VycmVudEluZGV4SW5Sb3VuZDogbnVtYmVyO1xuICBwYXJ0aWNpcGFudENvdW50ZXI6IG51bWJlcjtcbn07XG5cbmNvbnN0IGdlbmVyYXRlQW5kU2V0QnJhY2tldE1hdGNoV2l0aFBhcnRpY2lwYW50cyA9IDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPihcbiAgbWF0Y2g6IEJyYWNrZXRNYXRjaFNvdXJjZTxUTWF0Y2hEYXRhPixcbiAgb3B0aW9uczogR2VuZXJhdGVCcmFja2V0TWF0Y2hPcHRpb25zPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+LFxuKSA9PiB7XG4gIGNvbnN0IG1hdGNoSWQgPSBtYXRjaC5pZCBhcyBCcmFja2V0TWF0Y2hJZDtcbiAgY29uc3QgeyBicmFja2V0RGF0YSwgYnJhY2tldFJvdW5kLCBjdXJyZW50SW5kZXhJblJvdW5kLCBwYXJ0aWNpcGFudENvdW50ZXIgfSA9IG9wdGlvbnM7XG5cbiAgbGV0IGxvY2FsUGFydGljaXBhbnRDb3VudGVyID0gcGFydGljaXBhbnRDb3VudGVyO1xuXG4gIGNvbnN0IGJyYWNrZXRNYXRjaDogQnJhY2tldE1hdGNoPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICAgIGlkOiBtYXRjaElkLFxuICAgIGluZGV4SW5Sb3VuZDogY3VycmVudEluZGV4SW5Sb3VuZCxcbiAgICBwb3NpdGlvbjogKGN1cnJlbnRJbmRleEluUm91bmQgKyAxKSBhcyBCcmFja2V0TWF0Y2hQb3NpdGlvbixcbiAgICBkYXRhOiBtYXRjaC5kYXRhLFxuICAgIHJvdW5kOiBicmFja2V0Um91bmQsXG4gICAgaG9tZTogbnVsbCxcbiAgICBhd2F5OiBudWxsLFxuICAgIHN0YXR1czogbWF0Y2guc3RhdHVzLFxuICAgIHdpbm5lclNpZGU6IG1hdGNoLndpbm5lcixcbiAgICB3aW5uZXI6IG51bGwsXG4gIH07XG5cbiAgYnJhY2tldERhdGEubWF0Y2hlcy5zZXQobWF0Y2hJZCwgYnJhY2tldE1hdGNoKTtcbiAgYnJhY2tldFJvdW5kLm1hdGNoZXMuc2V0KG1hdGNoSWQsIGJyYWNrZXRNYXRjaCk7XG5cbiAgY29uc3QgcGFydGljaXBhbnRJZHMgPSBbbWF0Y2guaG9tZSwgbWF0Y2guYXdheV0gYXMgKE1hdGNoUGFydGljaXBhbnRJZCB8IG51bGwpW107XG5cbiAgZm9yIChjb25zdCBbcGFydGljaXBhbnRJbmRleCwgcGFydGljaXBhbnRJZF0gb2YgcGFydGljaXBhbnRJZHMuZW50cmllcygpKSB7XG4gICAgaWYgKCFwYXJ0aWNpcGFudElkKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHNpZGU6IE9wcG9uZW50U2lkZSA9IHBhcnRpY2lwYW50SW5kZXggPT09IDAgPyAnaG9tZScgOiAnYXdheSc7XG5cbiAgICBpZiAoIWJyYWNrZXREYXRhLnBhcnRpY2lwYW50cy5oYXMocGFydGljaXBhbnRJZCkpIHtcbiAgICAgIGJyYWNrZXREYXRhLnBhcnRpY2lwYW50cy5zZXQocGFydGljaXBhbnRJZCwge1xuICAgICAgICBpZDogcGFydGljaXBhbnRJZCxcbiAgICAgICAgc2hvcnRJZDogYHAke2xvY2FsUGFydGljaXBhbnRDb3VudGVyKyt9YCBhcyBNYXRjaFBhcnRpY2lwYW50U2hvcnRJZCxcbiAgICAgICAgbmFtZTogYCR7c2lkZX0gJHtjdXJyZW50SW5kZXhJblJvdW5kfWAsXG4gICAgICAgIG1hdGNoZXM6IG5ldyBNYXAoKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRpY2lwYW50RGF0YSA9IGJyYWNrZXREYXRhLnBhcnRpY2lwYW50cy5nZXQocGFydGljaXBhbnRJZCkgYXMgQnJhY2tldFBhcnRpY2lwYW50PFRSb3VuZERhdGEsIFRNYXRjaERhdGE+O1xuXG4gICAgaWYgKCFwYXJ0aWNpcGFudERhdGEubWF0Y2hlcy5oYXMoYnJhY2tldE1hdGNoLmlkKSkge1xuICAgICAgcGFydGljaXBhbnREYXRhLm1hdGNoZXMuc2V0KGJyYWNrZXRNYXRjaC5pZCwge1xuICAgICAgICBzaWRlOiBtYXRjaC5ob21lID09PSBwYXJ0aWNpcGFudElkID8gJ2hvbWUnIDogJ2F3YXknLFxuICAgICAgICBicmFja2V0TWF0Y2gsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBicmFja2V0TWF0Y2hbc2lkZV0gPSBwYXJ0aWNpcGFudERhdGE7XG5cbiAgICBpZiAoYnJhY2tldE1hdGNoLndpbm5lclNpZGUgPT09IHNpZGUpIHtcbiAgICAgIGJyYWNrZXRNYXRjaC53aW5uZXIgPSBwYXJ0aWNpcGFudERhdGE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJyYWNrZXRNYXRjaDtcbn07XG5cbmV4cG9ydCB0eXBlIEdlbmVyYXRlQnJhY2tldERhdGFPcHRpb25zID0ge1xuICBsYXlvdXQ6IEJyYWNrZXREYXRhTGF5b3V0O1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlQnJhY2tldERhdGEgPSA8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4oXG4gIHNvdXJjZTogQnJhY2tldERhdGFTb3VyY2U8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4sXG4gIG9wdGlvbnM6IEdlbmVyYXRlQnJhY2tldERhdGFPcHRpb25zLFxuKSA9PiB7XG4gIGlmICghY2FuUmVuZGVyTGF5b3V0SW5Ub3VybmFtZW50TW9kZShvcHRpb25zLmxheW91dCwgc291cmNlLm1vZGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVuZGVyIGxheW91dCAke29wdGlvbnMubGF5b3V0fSBpbiBtb2RlICR7c291cmNlLm1vZGV9YCk7XG4gIH1cblxuICBjb25zdCBzaG91bGRTcGxpdFJvdW5kc0luVHdvID0gb3B0aW9ucy5sYXlvdXQgPT09IEJSQUNLRVRfREFUQV9MQVlPVVQuTUlSUk9SRUQ7XG5cbiAgY29uc3QgYnJhY2tldERhdGE6IEJyYWNrZXREYXRhPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICAgIG1hdGNoZXM6IG5ldyBNYXAoKSxcbiAgICBtb2RlOiBzb3VyY2UubW9kZSxcbiAgICBwYXJ0aWNpcGFudHM6IG5ldyBNYXAoKSxcbiAgICByb3VuZHM6IG5ldyBNYXAoKSxcbiAgICByb3VuZElkczogW10sXG4gICAgbWF0Y2hJZHM6IFtdLFxuICB9O1xuXG4gIGxldCBjdXJyZW50VXBwZXJCcmFja2V0SW5kZXggPSAwO1xuICBsZXQgY3VycmVudExvd2VyQnJhY2tldEluZGV4ID0gMDtcblxuICBjb25zdCBzcGxpdFJvdW5kc1Jlc3Q6IEJyYWNrZXRSb3VuZDxUUm91bmREYXRhLCBUTWF0Y2hEYXRhPltdID0gW107XG5cbiAgZm9yIChjb25zdCBbcm91bmRJbmRleCwgcm91bmRdIG9mIHNvdXJjZS5yb3VuZHMuZW50cmllcygpKSB7XG4gICAgY29uc3QgaXNMb3dlckJyYWNrZXQgPSByb3VuZC50eXBlID09PSBET1VCTEVfRUxJTUlOQVRJT05fQlJBQ0tFVF9ST1VORF9UWVBFLkxPV0VSX0JSQUNLRVQ7XG4gICAgY29uc3QgbWF0Y2hlcyA9IHNvdXJjZS5tYXRjaGVzLmZpbHRlcigobSkgPT4gbS5yb3VuZElkID09PSByb3VuZC5pZCk7XG4gICAgY29uc3Qgcm91bmRJZCA9IHJvdW5kLmlkIGFzIEJyYWNrZXRSb3VuZElkO1xuICAgIGNvbnN0IHNob3VsZFNwbGl0Um91bmQgPSBzaG91bGRTcGxpdFJvdW5kc0luVHdvICYmIG1hdGNoZXMubGVuZ3RoICUgMiA9PT0gMDtcbiAgICBjb25zdCBpc0ZpcnN0Um91bmQgPSByb3VuZEluZGV4ID09PSAwO1xuXG4gICAgaWYgKHNob3VsZFNwbGl0Um91bmQpIHtcbiAgICAgIGNvbnN0IGZpcnN0SGFsZk1hdGNoZXNNYXhJbmRleCA9IG1hdGNoZXMubGVuZ3RoIC8gMiAtIDE7XG5cbiAgICAgIGNvbnN0IGZpcnN0SGFsZlJvdW5kSWQgPSBgJHtyb3VuZElkfS0taGFsZi0xYCBhcyBCcmFja2V0Um91bmRJZDtcbiAgICAgIGNvbnN0IHNlY29uZEhhbGZSb3VuZElkID0gYCR7cm91bmRJZH0tLWhhbGYtMmAgYXMgQnJhY2tldFJvdW5kSWQ7XG5cbiAgICAgIGNvbnN0IGJyYWNrZXRSb3VuZEZpcnN0SGFsZjogQnJhY2tldFJvdW5kPFRSb3VuZERhdGEsIFRNYXRjaERhdGE+ID0ge1xuICAgICAgICB0eXBlOiByb3VuZC50eXBlLFxuICAgICAgICBpZDogZmlyc3RIYWxmUm91bmRJZCxcbiAgICAgICAgaW5kZXg6IGlzTG93ZXJCcmFja2V0ID8gY3VycmVudExvd2VyQnJhY2tldEluZGV4IDogY3VycmVudFVwcGVyQnJhY2tldEluZGV4LFxuICAgICAgICBkYXRhOiByb3VuZC5kYXRhLFxuICAgICAgICBwb3NpdGlvbjogKChpc0xvd2VyQnJhY2tldCA/IGN1cnJlbnRMb3dlckJyYWNrZXRJbmRleCA6IGN1cnJlbnRVcHBlckJyYWNrZXRJbmRleCkgKyAxKSBhcyBCcmFja2V0Um91bmRQb3NpdGlvbixcbiAgICAgICAgbmFtZTogcm91bmQubmFtZSxcbiAgICAgICAgbWF0Y2hDb3VudDogbWF0Y2hlcy5sZW5ndGggLyAyLFxuICAgICAgICBtYXRjaGVzOiBuZXcgTWFwKCksXG4gICAgICAgIG1pcnJvclJvdW5kVHlwZTogQlJBQ0tFVF9ST1VORF9NSVJST1JfVFlQRS5MRUZULFxuICAgICAgICBpc0ZpcnN0Um91bmQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBicmFja2V0Um91bmRTZWNvbmRIYWxmOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gICAgICAgIHR5cGU6IHJvdW5kLnR5cGUsXG4gICAgICAgIGlkOiBzZWNvbmRIYWxmUm91bmRJZCxcbiAgICAgICAgaW5kZXg6IC0xLFxuICAgICAgICBkYXRhOiByb3VuZC5kYXRhLFxuICAgICAgICBwb3NpdGlvbjogLTEgYXMgQnJhY2tldFJvdW5kUG9zaXRpb24sXG4gICAgICAgIG5hbWU6IHJvdW5kLm5hbWUsXG4gICAgICAgIG1hdGNoQ291bnQ6IG1hdGNoZXMubGVuZ3RoIC8gMixcbiAgICAgICAgbWF0Y2hlczogbmV3IE1hcCgpLFxuICAgICAgICBtaXJyb3JSb3VuZFR5cGU6IEJSQUNLRVRfUk9VTkRfTUlSUk9SX1RZUEUuUklHSFQsXG4gICAgICAgIGlzRmlyc3RSb3VuZCxcbiAgICAgIH07XG5cbiAgICAgIGJyYWNrZXREYXRhLnJvdW5kSWRzLnB1c2goZmlyc3RIYWxmUm91bmRJZCk7XG4gICAgICBicmFja2V0RGF0YS5yb3VuZHMuc2V0KGZpcnN0SGFsZlJvdW5kSWQsIGJyYWNrZXRSb3VuZEZpcnN0SGFsZik7XG4gICAgICBzcGxpdFJvdW5kc1Jlc3QudW5zaGlmdChicmFja2V0Um91bmRTZWNvbmRIYWxmKTtcblxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8PSBmaXJzdEhhbGZNYXRjaGVzTWF4SW5kZXg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgbWF0Y2hGaXJzdCA9IG1hdGNoZXNbaW5kZXhdO1xuICAgICAgICBjb25zdCBtYXRjaFNlY29uZCA9IG1hdGNoZXNbZmlyc3RIYWxmTWF0Y2hlc01heEluZGV4ICsgMSArIGluZGV4XTtcblxuICAgICAgICBpZiAoIW1hdGNoRmlyc3QgfHwgIW1hdGNoU2Vjb25kKSB0aHJvdyBuZXcgRXJyb3IoJ01hdGNoIG5vdCBmb3VuZCcpO1xuXG4gICAgICAgIGNvbnN0IHBhcnRpY2lwYW50Q291bnRlciA9IGJyYWNrZXREYXRhLnBhcnRpY2lwYW50cy5zaXplO1xuXG4gICAgICAgIGNvbnN0IGJyYWNrZXRNYXRjaEZpcnN0ID0gZ2VuZXJhdGVBbmRTZXRCcmFja2V0TWF0Y2hXaXRoUGFydGljaXBhbnRzKG1hdGNoRmlyc3QsIHtcbiAgICAgICAgICBicmFja2V0RGF0YSxcbiAgICAgICAgICBicmFja2V0Um91bmQ6IGJyYWNrZXRSb3VuZEZpcnN0SGFsZixcbiAgICAgICAgICBjdXJyZW50SW5kZXhJblJvdW5kOiBpbmRleCxcbiAgICAgICAgICBwYXJ0aWNpcGFudENvdW50ZXIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRoZSBwYXJ0aWNpcGFudCBjb3VudGVyIG1pZ2h0IGhhdmUgY2hhbmdlZCBhZnRlciB0aGUgZmlyc3QgaGFsZlxuICAgICAgICBjb25zdCB1cGRhdGVkUGFydGljaXBhbnRDb3VudGVyID0gYnJhY2tldERhdGEucGFydGljaXBhbnRzLnNpemU7XG5cbiAgICAgICAgY29uc3QgYnJhY2tldE1hdGNoU2Vjb25kID0gZ2VuZXJhdGVBbmRTZXRCcmFja2V0TWF0Y2hXaXRoUGFydGljaXBhbnRzKG1hdGNoU2Vjb25kLCB7XG4gICAgICAgICAgYnJhY2tldERhdGEsXG4gICAgICAgICAgYnJhY2tldFJvdW5kOiBicmFja2V0Um91bmRTZWNvbmRIYWxmLFxuICAgICAgICAgIGN1cnJlbnRJbmRleEluUm91bmQ6IGluZGV4LFxuICAgICAgICAgIHBhcnRpY2lwYW50Q291bnRlcjogdXBkYXRlZFBhcnRpY2lwYW50Q291bnRlcixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnJhY2tldERhdGEubWF0Y2hJZHMucHVzaChicmFja2V0TWF0Y2hGaXJzdC5pZCwgYnJhY2tldE1hdGNoU2Vjb25kLmlkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYnJhY2tldFJvdW5kOiBCcmFja2V0Um91bmQ8VFJvdW5kRGF0YSwgVE1hdGNoRGF0YT4gPSB7XG4gICAgICAgIHR5cGU6IHJvdW5kLnR5cGUsXG4gICAgICAgIGlkOiByb3VuZElkLFxuICAgICAgICBpbmRleDogaXNMb3dlckJyYWNrZXQgPyBjdXJyZW50TG93ZXJCcmFja2V0SW5kZXggOiBjdXJyZW50VXBwZXJCcmFja2V0SW5kZXgsXG4gICAgICAgIGRhdGE6IHJvdW5kLmRhdGEsXG4gICAgICAgIHBvc2l0aW9uOiAoKGlzTG93ZXJCcmFja2V0ID8gY3VycmVudExvd2VyQnJhY2tldEluZGV4IDogY3VycmVudFVwcGVyQnJhY2tldEluZGV4KSArIDEpIGFzIEJyYWNrZXRSb3VuZFBvc2l0aW9uLFxuICAgICAgICBuYW1lOiByb3VuZC5uYW1lLFxuICAgICAgICBtYXRjaENvdW50OiBtYXRjaGVzLmxlbmd0aCxcbiAgICAgICAgbWF0Y2hlczogbmV3IE1hcCgpLFxuICAgICAgICBtaXJyb3JSb3VuZFR5cGU6IG51bGwsXG4gICAgICAgIGlzRmlyc3RSb3VuZCxcbiAgICAgIH07XG5cbiAgICAgIGJyYWNrZXREYXRhLnJvdW5kSWRzLnB1c2gocm91bmRJZCk7XG4gICAgICBicmFja2V0RGF0YS5yb3VuZHMuc2V0KHJvdW5kSWQsIGJyYWNrZXRSb3VuZCk7XG5cbiAgICAgIGxldCBjdXJyZW50SW5kZXhJblJvdW5kID0gMDtcblxuICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgIGNvbnN0IHBhcnRpY2lwYW50Q291bnRlciA9IGJyYWNrZXREYXRhLnBhcnRpY2lwYW50cy5zaXplO1xuXG4gICAgICAgIGNvbnN0IGJyYWNrZXRNYXRjaCA9IGdlbmVyYXRlQW5kU2V0QnJhY2tldE1hdGNoV2l0aFBhcnRpY2lwYW50cyhtYXRjaCwge1xuICAgICAgICAgIGJyYWNrZXREYXRhLFxuICAgICAgICAgIGJyYWNrZXRSb3VuZCxcbiAgICAgICAgICBjdXJyZW50SW5kZXhJblJvdW5kLFxuICAgICAgICAgIHBhcnRpY2lwYW50Q291bnRlcixcbiAgICAgICAgfSk7XG4gICAgICAgIGJyYWNrZXREYXRhLm1hdGNoSWRzLnB1c2goYnJhY2tldE1hdGNoLmlkKTtcbiAgICAgICAgY3VycmVudEluZGV4SW5Sb3VuZCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0xvd2VyQnJhY2tldCkge1xuICAgICAgY3VycmVudExvd2VyQnJhY2tldEluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRVcHBlckJyYWNrZXRJbmRleCsrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzcGxpdFJvdW5kc1Jlc3QubGVuZ3RoKSB7XG4gICAgY29uc3QgbGFzdFJvdW5kSWQgPSBicmFja2V0RGF0YS5yb3VuZElkc1ticmFja2V0RGF0YS5yb3VuZElkcy5sZW5ndGggLSAxXTtcblxuICAgIGlmICghbGFzdFJvdW5kSWQpIHRocm93IG5ldyBFcnJvcignTGFzdCByb3VuZCBpZCBub3QgZm91bmQnKTtcblxuICAgIGNvbnN0IGxhc3RSb3VuZCA9IGJyYWNrZXREYXRhLnJvdW5kcy5nZXQobGFzdFJvdW5kSWQpO1xuXG4gICAgaWYgKCFsYXN0Um91bmQpIHRocm93IG5ldyBFcnJvcignTGFzdCByb3VuZCBub3QgZm91bmQnKTtcblxuICAgIGZvciAoY29uc3QgW3NwbGl0Um91bmRJbmRleCwgc3BsaXRSb3VuZF0gb2Ygc3BsaXRSb3VuZHNSZXN0LmVudHJpZXMoKSkge1xuICAgICAgc3BsaXRSb3VuZC5pbmRleCA9IGxhc3RSb3VuZC5pbmRleCArIHNwbGl0Um91bmRJbmRleCArIDE7XG4gICAgICBzcGxpdFJvdW5kLnBvc2l0aW9uID0gKGxhc3RSb3VuZC5wb3NpdGlvbiArIHNwbGl0Um91bmRJbmRleCArIDEpIGFzIEJyYWNrZXRSb3VuZFBvc2l0aW9uO1xuICAgICAgYnJhY2tldERhdGEucm91bmRzLnNldChzcGxpdFJvdW5kLmlkLCBzcGxpdFJvdW5kKTtcbiAgICAgIGJyYWNrZXREYXRhLnJvdW5kSWRzLnB1c2goc3BsaXRSb3VuZC5pZCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJyYWNrZXREYXRhO1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlVG91cm5hbWVudE1vZGVGb3JtR2dEYXRhID0gKHNvdXJjZTogR2dEYXRhKTogVG91cm5hbWVudE1vZGUgPT4ge1xuICBzd2l0Y2ggKHNvdXJjZS5tb2RlKSB7XG4gICAgLy8gY2FzZSAnZ3JvdXBzJzpcbiAgICAvLyAgIHJldHVybiBUT1VSTkFNRU5UX01PREUuR1JPVVA7XG4gICAgLy8gY2FzZSAnZmlmYV9zd2lzcyc6IHtcbiAgICAvLyAgIGNvbnN0IGxhc3RSb3VuZCA9IHNvdXJjZVtzb3VyY2UubGVuZ3RoIC0gMV07XG5cbiAgICAvLyAgIGlmICghbGFzdFJvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ05vIGxhc3Qgcm91bmQgZm91bmQnKTtcblxuICAgIC8vICAgaWYgKGxhc3RSb3VuZC5tYXRjaGVzLmxlbmd0aCAhPT0gZmlyc3RSb3VuZC5tYXRjaGVzLmxlbmd0aCkge1xuICAgIC8vICAgICByZXR1cm4gVE9VUk5BTUVOVF9NT0RFLlNXSVNTX1dJVEhfRUxJTUlOQVRJT047XG4gICAgLy8gICB9IGVsc2Uge1xuICAgIC8vICAgICByZXR1cm4gVE9VUk5BTUVOVF9NT0RFLlNXSVNTO1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgICBjYXNlICdkb3VibGUtZWxpbWluYXRpb24nOlxuICAgICAgcmV0dXJuIFRPVVJOQU1FTlRfTU9ERS5ET1VCTEVfRUxJTUlOQVRJT047XG4gICAgY2FzZSAnc2luZ2xlLWVsaW1pbmF0aW9uJzpcbiAgICAgIHJldHVybiBUT1VSTkFNRU5UX01PREUuU0lOR0xFX0VMSU1JTkFUSU9OO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHRvdXJuYW1lbnQgbW9kZTogJHtzb3VyY2UubW9kZX1gKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlUm91bmRUeXBlRnJvbUdnTWF0Y2ggPSAoXG4gIHRvdXJuYW1lbnRNb2RlOiBUb3VybmFtZW50TW9kZSxcbiAgYnJhY2tldFR5cGU6IHN0cmluZyB8IG51bGwsIC8vICd3aW5uZXInIHwgJ2xvb3NlcicgfCBudWxsLFxuICBzdGFnZU51bWJlcjogbnVtYmVyLFxuICBtYXRjaENvdW50OiBudW1iZXIsXG4pOiBCcmFja2V0Um91bmRUeXBlID0+IHtcbiAgc3dpdGNoICh0b3VybmFtZW50TW9kZSkge1xuICAgIGNhc2UgJ2RvdWJsZS1lbGltaW5hdGlvbic6IHtcbiAgICAgIHN3aXRjaCAoc3RhZ2VOdW1iZXIpIHtcbiAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgc3dpdGNoIChicmFja2V0VHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnd2lubmVyJzpcbiAgICAgICAgICAgICAgcmV0dXJuIERPVUJMRV9FTElNSU5BVElPTl9CUkFDS0VUX1JPVU5EX1RZUEUuVVBQRVJfQlJBQ0tFVDtcbiAgICAgICAgICAgIGNhc2UgJ2xvb3Nlcic6XG4gICAgICAgICAgICAgIHJldHVybiBET1VCTEVfRUxJTUlOQVRJT05fQlJBQ0tFVF9ST1VORF9UWVBFLkxPV0VSX0JSQUNLRVQ7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGJyYWNrZXQgdHlwZTogJHticmFja2V0VHlwZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAyOiB7XG4gICAgICAgICAgcmV0dXJuIENPTU1PTl9CUkFDS0VUX1JPVU5EX1RZUEUuRklOQUw7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAzOiB7XG4gICAgICAgICAgcmV0dXJuIERPVUJMRV9FTElNSU5BVElPTl9CUkFDS0VUX1JPVU5EX1RZUEUuUkVWRVJTRV9GSU5BTDtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzdGFnZSBudW1iZXI6ICR7c3RhZ2VOdW1iZXJ9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY2FzZSAnc2luZ2xlLWVsaW1pbmF0aW9uJzoge1xuICAgICAgaWYgKG1hdGNoQ291bnQgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIENPTU1PTl9CUkFDS0VUX1JPVU5EX1RZUEUuRklOQUw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gU0lOR0xFX0VMSU1JTkFUSU9OX0JSQUNLRVRfUk9VTkRfVFlQRS5TSU5HTEVfRUxJTUlOQVRJT05fQlJBQ0tFVDtcbiAgICAgIH1cbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB0b3VybmFtZW50IG1vZGU6ICR7dG91cm5hbWVudE1vZGV9YCk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVCcmFja2V0RGF0YUZvckdnID0gKHNvdXJjZTogR2dEYXRhKSA9PiB7XG4gIC8vIHJvdW5kTnVtYmVyLXN0YWdlTnVtYmVyLWJyYWNrZXRUeXBlXG4gIHR5cGUgR2dNYXRjaFJvdW5kSWQgPSBgJHtudW1iZXJ9LSR7bnVtYmVyfS0ke3N0cmluZyB8IG51bGx9YDtcblxuICBjb25zdCB0b3VybmFtZW50TW9kZSA9IGdlbmVyYXRlVG91cm5hbWVudE1vZGVGb3JtR2dEYXRhKHNvdXJjZSk7XG5cbiAgY29uc3QgYnJhY2tldERhdGE6IEJyYWNrZXREYXRhU291cmNlPG51bGwsIEdnRGF0YVsnbWF0Y2hlcyddW251bWJlcl0+ID0ge1xuICAgIHJvdW5kczogW10sXG4gICAgbWF0Y2hlczogW10sXG4gICAgbW9kZTogdG91cm5hbWVudE1vZGUsXG4gIH07XG5cbiAgY29uc3QgbWF0Y2hlc0dyb3VwZWQ6IE1hcDxHZ01hdGNoUm91bmRJZCwgR2dEYXRhWydtYXRjaGVzJ10+ID0gbmV3IE1hcCgpO1xuXG4gIGZvciAoY29uc3QgbWF0Y2ggb2Ygc291cmNlLm1hdGNoZXMpIHtcbiAgICBjb25zdCByb3VuZElkID0gYCR7bWF0Y2gucm91bmROdW1iZXJ9LSR7bWF0Y2guc3RhZ2VOdW1iZXJ9LSR7bWF0Y2guYnJhY2tldFR5cGUgfHwgbnVsbH1gIGFzIEdnTWF0Y2hSb3VuZElkO1xuXG4gICAgaWYgKCFtYXRjaGVzR3JvdXBlZC5oYXMocm91bmRJZCkpIHtcbiAgICAgIG1hdGNoZXNHcm91cGVkLnNldChyb3VuZElkLCBbXSk7XG4gICAgfVxuXG4gICAgbWF0Y2hlc0dyb3VwZWQuZ2V0KHJvdW5kSWQpPy5wdXNoKG1hdGNoKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW3JvdW5kSWQsIG1hdGNoZXNdIG9mIG1hdGNoZXNHcm91cGVkLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IGZpcnN0TWF0Y2ggPSBtYXRjaGVzWzBdO1xuXG4gICAgaWYgKCFmaXJzdE1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoJ0ZpcnN0IG1hdGNoIG5vdCBmb3VuZCcpO1xuXG4gICAgY29uc3Qgcm91bmRUeXBlID0gZ2VuZXJhdGVSb3VuZFR5cGVGcm9tR2dNYXRjaChcbiAgICAgIHRvdXJuYW1lbnRNb2RlLFxuICAgICAgZmlyc3RNYXRjaC5icmFja2V0VHlwZSxcbiAgICAgIGZpcnN0TWF0Y2guc3RhZ2VOdW1iZXIsXG4gICAgICBtYXRjaGVzLmxlbmd0aCxcbiAgICApO1xuXG4gICAgY29uc3QgYnJhY2tldFJvdW5kOiBCcmFja2V0Um91bmRTb3VyY2U8bnVsbD4gPSB7XG4gICAgICB0eXBlOiByb3VuZFR5cGUsXG4gICAgICBpZDogcm91bmRJZCxcbiAgICAgIGRhdGE6IG51bGwsXG4gICAgICBuYW1lOiBmaXJzdE1hdGNoLnJvdW5kVGl0bGUsXG4gICAgfTtcblxuICAgIGJyYWNrZXREYXRhLnJvdW5kcy5wdXNoKGJyYWNrZXRSb3VuZCk7XG5cbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgIGNvbnN0IGJyYWNrZXRNYXRjaDogQnJhY2tldE1hdGNoU291cmNlPEdnRGF0YVsnbWF0Y2hlcyddW251bWJlcl0+ID0ge1xuICAgICAgICBpZDogbWF0Y2guaWQsXG4gICAgICAgIGRhdGE6IG1hdGNoLFxuICAgICAgICByb3VuZElkOiByb3VuZElkLFxuICAgICAgICBob21lOiBtYXRjaC5ob21lTWF0Y2hTaWRlLnBhcnRpY2lwYW50Py5pZCB8fCBudWxsLFxuICAgICAgICBhd2F5OiBtYXRjaC5hd2F5TWF0Y2hTaWRlLnBhcnRpY2lwYW50Py5pZCB8fCBudWxsLFxuICAgICAgICB3aW5uZXI6IG1hdGNoLndpbm5pbmdTaWRlIGFzIE9wcG9uZW50U2lkZSB8IG51bGwsXG4gICAgICAgIHN0YXR1czogbWF0Y2guc3RhdHVzID09PSAnY29tcGxldGVkJyA/ICdjb21wbGV0ZWQnIDogJ3BlbmRpbmcnLFxuICAgICAgfTtcblxuICAgICAgYnJhY2tldERhdGEubWF0Y2hlcy5wdXNoKGJyYWNrZXRNYXRjaCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJyYWNrZXREYXRhO1xufTtcbiJdfQ==