speechrecorderng 2.22.4 → 2.23.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.
@@ -1,4 +1,3 @@
1
- import { Action } from '../../action/action';
2
1
  import { AudioCapture } from '../../audio/capture/capture';
3
2
  import { EventType } from '../../audio/playback/player';
4
3
  import { WavWriter } from '../../audio/impl/wavwriter';
@@ -8,18 +7,15 @@ import { Upload } from '../../net/uploader';
8
7
  import { Component, HostListener, Inject, Input, ViewChild } from "@angular/core";
9
8
  import { SessionService } from "./session.service";
10
9
  import { SPEECHRECORDER_CONFIG } from "../../spr.config";
11
- import { MIN_DB_LEVEL } from "../../ui/recordingitem_display";
12
- import { LevelMeasure, StreamLevelMeasure } from "../../audio/dsp/level_measure";
13
10
  import { Prompting } from "./prompting";
14
11
  import { SequenceAudioFloat32ChunkerOutStream } from "../../audio/io/stream";
15
- import { TransportActions } from "./controlpanel";
16
12
  import { SessionFinishedDialog } from "./session_finished_dialog";
17
13
  import { MessageDialog } from "../../ui/message_dialog";
18
14
  import { AudioContextProvider } from "../../audio/context";
19
15
  import { AudioClip } from "../../audio/persistor";
20
16
  import { Item } from "./item";
21
- import { Browser, UserAgentBuilder } from "../../utils/ua-parser";
22
17
  import { LevelBar } from "../../audio/ui/livelevel";
18
+ import { BasicRecorder, LEVEL_BAR_INTERVALL_SECONDS, MAX_RECORDING_TIME_MS, RECFILE_API_CTX } from "./basicrecorder";
23
19
  import * as i0 from "@angular/core";
24
20
  import * as i1 from "@angular/material/dialog";
25
21
  import * as i2 from "./session.service";
@@ -35,16 +31,11 @@ import * as i11 from "@angular/flex-layout/extended";
35
31
  import * as i12 from "@angular/flex-layout/flex";
36
32
  import * as i13 from "@angular/common";
37
33
  import * as i14 from "../../spr.config";
38
- export const FORCE_REQUEST_AUDIO_PERMISSIONS = false;
39
- export const RECFILE_API_CTX = 'recfile';
40
- const MAX_RECORDING_TIME_MS = 1000 * 60 * 60 * 60; // 1 hour
41
34
  const DEFAULT_PRE_REC_DELAY = 1000;
42
35
  const DEFAULT_POST_REC_DELAY = 500;
43
- const LEVEL_BAR_INTERVALL_SECONDS = 0.1; // 100ms
44
- // TODO enum not possible in template language , use string for now
45
- //export enum StatusAlertType {INFO,WARN,ERROR};
46
- export class SessionManager {
36
+ export class SessionManager extends BasicRecorder {
47
37
  constructor(changeDetectorRef, renderer, dialog, sessionService, recFileService, uploader, config) {
38
+ super(dialog, sessionService);
48
39
  this.changeDetectorRef = changeDetectorRef;
49
40
  this.renderer = renderer;
50
41
  this.dialog = dialog;
@@ -55,9 +46,6 @@ export class SessionManager {
55
46
  this.enableUploadRecordings = true;
56
47
  this.enableDownloadRecordings = false;
57
48
  this.status = 0 /* BLOCKED */;
58
- this.ac = null;
59
- this._channelCount = 2; //TODO define constant for default format
60
- this._selectedDeviceId = undefined;
61
49
  this.dataSaved = true;
62
50
  this.preRecTimerId = null;
63
51
  this.preRecTimerRunning = null;
@@ -65,32 +53,12 @@ export class SessionManager {
65
53
  this.postRecTimerRunning = null;
66
54
  this.maxRecTimerId = null;
67
55
  this.maxRecTimerRunning = null;
68
- this._session = null;
69
56
  this._promptIndex = 0;
70
57
  this.items = null;
71
58
  //selectedItemIdx: number;
72
59
  this._displayRecFile = null;
73
- this.displayAudioClip = null;
74
- this.displayLevelInfos = null;
75
- this.peakLevelInDb = MIN_DB_LEVEL;
76
- this.readonly = false;
77
- this.processingRecording = false;
78
- this.uploadProgress = 100;
79
- this.uploadStatus = 'ok';
80
- this.audioSignalCollapsed = true;
81
- this.audioFetchSubscription = null;
82
- this.destroyed = false;
83
- this.navigationDisabled = true;
84
60
  this.status = 1 /* IDLE */;
85
- this.transportActions = new TransportActions();
86
- this.playStartAction = new Action('Play');
87
61
  this.audio = document.getElementById('audio');
88
- this.selCaptureDeviceId = null;
89
- this.levelMeasure = new LevelMeasure();
90
- this.streamLevelMeasure = new StreamLevelMeasure();
91
- this.userAgent = UserAgentBuilder.userAgent();
92
- console.debug("Detected platform: " + this.userAgent.detectedPlatform);
93
- console.debug("Detected browser: " + this.userAgent.detectedBrowser);
94
62
  if (this.config && this.config.enableUploadRecordings !== undefined) {
95
63
  this.enableUploadRecordings = this.config.enableUploadRecordings;
96
64
  }
@@ -255,22 +223,10 @@ export class SessionManager {
255
223
  get controlAudioPlayer() {
256
224
  return this._controlAudioPlayer;
257
225
  }
258
- set session(session) {
259
- this._session = session;
260
- }
261
226
  set script(script) {
262
227
  this._script = script;
263
228
  this.loadScript();
264
229
  }
265
- set channelCount(channelCount) {
266
- this._channelCount = channelCount;
267
- }
268
- set audioDevices(audioDevices) {
269
- this._audioDevices = audioDevices;
270
- }
271
- set autoGainControlConfigs(autoGainControlConfigs) {
272
- this._autoGainControlConfigs = autoGainControlConfigs;
273
- }
274
230
  update(e) {
275
231
  if (e.type == EventType.STARTED) {
276
232
  this.playStartAction.disabled = true;
@@ -558,210 +514,7 @@ export class SessionManager {
558
514
  this.updateNavigationActions();
559
515
  }
560
516
  start() {
561
- this.statusAlertType = 'info';
562
- this.statusMsg = 'Starting session...';
563
- this.statusWaiting = false;
564
- if (this._session) {
565
- if (this._session.sealed) {
566
- this.readonly = true;
567
- this.statusMsg = 'Session sealed!';
568
- //let dialogRef = this.dialog.open(SessionSealedDialog, {});
569
- this.dialog.open(MessageDialog, {
570
- data: {
571
- type: 'error',
572
- title: 'Error',
573
- msg: "This session is sealed. Recordings cannot be added anymore.",
574
- advise: 'Please ask your experimenter what to do (e.g start a new session).',
575
- }
576
- });
577
- }
578
- else {
579
- let body = {};
580
- if (this._session.status === "CREATED") {
581
- this._session.status = "LOADED";
582
- body.status = this._session.status;
583
- if (!this._session.loadedDate) {
584
- this._session.loadedDate = new Date();
585
- body.loadedDate = this._session.loadedDate;
586
- }
587
- }
588
- else {
589
- this._session.restartedDate = new Date();
590
- body.restartedDate = this._session.restartedDate;
591
- }
592
- this.sessionService.patchSessionObserver(this._session, body).subscribe();
593
- }
594
- }
595
- // Check browser compatibility
596
- if (this.userAgent.detectedBrowser === Browser.Safari && this._channelCount > 1) {
597
- let eMsg = "Error: Safari browser does not support stereo recordings.";
598
- console.error(eMsg);
599
- this.dialog.open(MessageDialog, {
600
- data: {
601
- type: 'error',
602
- title: 'Browser not supported',
603
- msg: eMsg,
604
- advice: "Please use a supported browser, e.g. Mozilla Firefox."
605
- }
606
- });
607
- }
608
- //console.log("Session ID: "+this._session.session+ " status: "+this._session.status)
609
- this._selectedDeviceId = undefined;
610
- if (!this.readonly && this.ac && (FORCE_REQUEST_AUDIO_PERMISSIONS || (this._audioDevices && this._audioDevices.length > 0))) {
611
- this.statusMsg = 'Requesting audio permissions...';
612
- this.statusAlertType = 'info';
613
- this.ac.deviceInfos((mdis) => {
614
- let audioCaptureDeviceAvail = false;
615
- let audioPlayDeviceAvail = false;
616
- if (mdis) {
617
- if (this.ac) {
618
- this.ac.printDevices(mdis);
619
- }
620
- if (mdis.length > 0) {
621
- for (let mdii = 0; mdii < mdis.length; mdii++) {
622
- let mdi = mdis[mdii];
623
- let kind = mdi.kind;
624
- if (kind === "audioinput") {
625
- audioCaptureDeviceAvail = true;
626
- }
627
- else if (kind === "audiooutput") {
628
- audioPlayDeviceAvail = true;
629
- }
630
- }
631
- }
632
- if (this._session && this._session.type !== 'TEST_DEF_A' && this._audioDevices && this._audioDevices.length > 0) {
633
- let fdi = null;
634
- for (let adI = 0; adI < this._audioDevices.length; adI++) {
635
- let ad = this._audioDevices[adI];
636
- if (ad.playback) {
637
- // project audio device config for playback device
638
- // not used for now
639
- continue;
640
- }
641
- for (let mdii = 0; mdii < mdis.length; mdii++) {
642
- let mdi = mdis[mdii];
643
- let kind = mdi.kind;
644
- if (kind === "audioinput") {
645
- audioCaptureDeviceAvail = true;
646
- }
647
- else if (kind === "audiooutput") {
648
- audioPlayDeviceAvail = true;
649
- }
650
- if (ad.regex) {
651
- //console.log("Match?: \'"+mdi.label+"\' \'"+ad.name+"\'");
652
- if (mdi.label.match(ad.name)) {
653
- fdi = mdi;
654
- //console.log("Match!");
655
- }
656
- }
657
- else {
658
- if (mdi.label.trim() === ad.name.trim()) {
659
- fdi = mdi;
660
- }
661
- }
662
- if (fdi) {
663
- break;
664
- }
665
- }
666
- if (fdi) {
667
- break;
668
- }
669
- }
670
- if (fdi) {
671
- // matching device found
672
- // Not able to open device here since Chrome 71
673
- // Chrome 71 requires a user gesture before the AudioContext can be resumed
674
- // sessionmanager.ts:712 Open session with default audio device for 1 channels
675
- // capture.ts:128 The AudioContext was not allowed to start. It must be resumed (or created) after a user gesture on the page. https://goo.gl/7K7WLu
676
- // push../projects/speechrecorderng/src/lib/audio/capture/capture.ts.AudioCapture.open @ capture.ts:128
677
- //this.ac.open(this._channelCount, fdi.deviceId);
678
- console.info("Set selected audio device: \'" + fdi.label + "\' Id: \'" + fdi.deviceId + "\'");
679
- this._selectedDeviceId = fdi.deviceId;
680
- this.enableStartUserGesture();
681
- }
682
- else {
683
- // device not found
684
- this.statusMsg = 'ERROR: Required audio device not available!';
685
- this.statusAlertType = 'error';
686
- this.readonly = true;
687
- this.dialog.open(MessageDialog, {
688
- data: {
689
- type: 'error',
690
- title: 'Required audio device',
691
- msg: "Required audio device not found",
692
- advice: "Please connect a suitable audio device for this project and retry (press the browser reload button)."
693
- }
694
- });
695
- }
696
- }
697
- else {
698
- if (!audioCaptureDeviceAvail && !audioPlayDeviceAvail) {
699
- // no device found
700
- this.statusMsg = 'ERROR: No audio device available!';
701
- this.statusAlertType = 'warn';
702
- //this.readonly = true;
703
- this.dialog.open(MessageDialog, {
704
- data: {
705
- type: 'warn',
706
- title: 'No audio device',
707
- msg: "No audio device found",
708
- advice: "Please connect an audio device and retry (press the browser reload button) or try to continue anyway."
709
- }
710
- });
711
- }
712
- else {
713
- if (!this.readonly && !audioCaptureDeviceAvail) {
714
- // no device found
715
- this.statusMsg = 'WARNING: No audio capture device available!';
716
- this.statusAlertType = 'warning';
717
- //this.readonly = true;
718
- this.dialog.open(MessageDialog, {
719
- data: {
720
- type: 'warning',
721
- title: 'No audio capture device',
722
- msg: "No audio capture device found",
723
- advice: "Please connect an audio capture device and retry (press the browser reload button) or try to continue anyway."
724
- }
725
- });
726
- }
727
- // Safari does not list playback devices
728
- if (!audioPlayDeviceAvail) {
729
- // Firefox does not enumerate audiooutput devices
730
- // Do not show this warning, because it would always appear on Firefox
731
- // When https://bugzilla.mozilla.org/show_bug.cgi?id=1498512 is fixed the warning can be enabled for Firefox as well
732
- // It is already implemneted but kept behind a preference setting https://bugzilla.mozilla.org/show_bug.cgi?id=1152401
733
- // Output devices are listed if about:config media.setsinkid.enabled=true
734
- // but default setting is false
735
- // Same problem with Safari
736
- if (!(this.userAgent.detectedBrowser === Browser.Safari || this.userAgent.detectedBrowser === Browser.Firefox)) {
737
- // no device found
738
- this.statusMsg = 'WARNING: No audio playback device available!';
739
- this.statusAlertType = 'warn';
740
- //this.readonly = true;
741
- this.dialog.open(MessageDialog, {
742
- data: {
743
- type: 'warn',
744
- title: 'No audio playback device',
745
- msg: "No audio playback device found",
746
- advice: "Please connect an audio playback device and retry (press the browser reload button) or try to continue anyway."
747
- }
748
- });
749
- }
750
- }
751
- }
752
- // Not able to open device here since Chrome 71
753
- // Chrome 71 requires a user gesture before the AudioContext can be resumed
754
- // sessionmanager.ts:712 Open session with default audio device for 1 channels
755
- // capture.ts:128 The AudioContext was not allowed to start. It must be resumed (or created) after a user gesture on the page. https://goo.gl/7K7WLu
756
- // push../projects/speechrecorderng/src/lib/audio/capture/capture.ts.AudioCapture.open @ capture.ts:128
757
- //console.log("Open session with default audio device for "+this._channelCount+" channels");
758
- //this.ac.open(this._channelCount);
759
- // enable start gesture anyway
760
- this.enableStartUserGesture();
761
- }
762
- }
763
- });
764
- }
517
+ super.start();
765
518
  if (this.promptItemCount > 0) {
766
519
  this.promptIndex = 0;
767
520
  }
@@ -819,9 +572,7 @@ export class SessionManager {
819
572
  }
820
573
  }
821
574
  enableStartUserGesture() {
822
- this.statusAlertType = 'info';
823
- this.statusMsg = 'Ready.';
824
- //this.updateStartActionDisableState()
575
+ super.enableStartUserGesture();
825
576
  this.transportActions.startAction.disabled = !(this.ac && this.isRecordingItem());
826
577
  }
827
578
  enableNavigation() {
@@ -829,11 +580,6 @@ export class SessionManager {
829
580
  this.updateNavigationActions();
830
581
  }
831
582
  opened() {
832
- // this.statusAlertType = 'info';
833
- // this.statusMsg = 'Ready.';
834
- // this.updateStartActionDisableState()
835
- // this.transportActions.fwdAction.disabled = false
836
- // this.transportActions.bwdAction.disabled = false
837
583
  if (this.ac) {
838
584
  this.ac.start();
839
585
  }
@@ -864,7 +610,7 @@ export class SessionManager {
864
610
  this.sessionService.patchSessionObserver(this._session, body).subscribe();
865
611
  }
866
612
  }
867
- if (this.section.promptphase === 'PRERECORDING') {
613
+ if (this.section.promptphase === 'PRERECORDING' || this.section.promptphase === 'PRERECORDINGONLY') {
868
614
  this.applyPrompt();
869
615
  }
870
616
  this.statusAlertType = 'info';
@@ -878,7 +624,7 @@ export class SessionManager {
878
624
  postDelay = this.promptItem.postrecording;
879
625
  }
880
626
  let maxRecordingTimeMs = MAX_RECORDING_TIME_MS;
881
- if (this.promptItem.recduration) {
627
+ if (this.promptItem.recduration !== null && this.promptItem.recduration !== undefined) {
882
628
  maxRecordingTimeMs = preDelay + this.promptItem.recduration + postDelay;
883
629
  }
884
630
  this.maxRecTimerId = window.setTimeout(() => {
@@ -899,6 +645,9 @@ export class SessionManager {
899
645
  if (this.section.promptphase === 'RECORDING') {
900
646
  this.applyPrompt();
901
647
  }
648
+ if (this.section.promptphase === 'PRERECORDINGONLY') {
649
+ this.clearPrompt();
650
+ }
902
651
  }, preDelay);
903
652
  this.preRecTimerRunning = true;
904
653
  }
@@ -1118,25 +867,9 @@ export class SessionManager {
1118
867
  this.changeDetectorRef.detectChanges();
1119
868
  }
1120
869
  }
1121
- closed() {
1122
- this.statusAlertType = 'info';
1123
- this.statusMsg = 'Session closed.';
1124
- }
1125
- error(msg = 'An unknown error occured during recording.', advice = 'Please retry.') {
1126
- this.statusMsg = 'ERROR: Recording.';
1127
- this.statusAlertType = 'error';
1128
- this.dialog.open(MessageDialog, {
1129
- data: {
1130
- type: 'error',
1131
- title: 'Recording error',
1132
- msg: msg,
1133
- advice: advice
1134
- }
1135
- });
1136
- }
1137
870
  }
1138
871
  SessionManager.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: SessionManager, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i1.MatDialog }, { token: i2.SessionService }, { token: i3.RecordingService }, { token: i4.SpeechRecorderUploader }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
1139
- SessionManager.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.1", type: SessionManager, selector: "app-sprrecordingsession", inputs: { projectName: "projectName", dataSaved: "dataSaved" }, host: { listeners: { "window:keypress": "onKeyPress($event)", "window:keydown": "onKeyDown($event)" } }, providers: [SessionService], viewQueries: [{ propertyName: "prompting", first: true, predicate: Prompting, descendants: true, static: true }, { propertyName: "liveLevelDisplay", first: true, predicate: LevelBar, descendants: true, static: true }], ngImport: i0, template: `
872
+ SessionManager.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.1", type: SessionManager, selector: "app-sprrecordingsession", inputs: { projectName: "projectName", dataSaved: "dataSaved" }, host: { listeners: { "window:keypress": "onKeyPress($event)", "window:keydown": "onKeyDown($event)" } }, providers: [SessionService], viewQueries: [{ propertyName: "prompting", first: true, predicate: Prompting, descendants: true, static: true }, { propertyName: "liveLevelDisplay", first: true, predicate: LevelBar, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
1140
873
  <app-warningbar [show]="isTestSession()" warningText="Test recording only!"></app-warningbar>
1141
874
  <app-warningbar [show]="isDefaultAudioTestSession()" warningText="This test uses default audio device! Regular sessions may require a particular audio device (microphone)!"></app-warningbar>
1142
875
  <app-sprprompting [projectName]="projectName"
@@ -1278,4 +1011,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImpor
1278
1011
  type: HostListener,
1279
1012
  args: ['window:keydown', ['$event']]
1280
1013
  }] } });
1281
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbm1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9zZXNzaW9ubWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0scUJBQXFCLENBQUE7QUFDMUMsT0FBTyxFQUFDLFlBQVksRUFBdUIsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQWdDLFNBQVMsRUFBQyxNQUFNLDZCQUE2QixDQUFBO0FBQ3BGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQTtBQUNwRCxPQUFPLEVBQW9CLGNBQWMsRUFBa0IsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRixPQUFPLEVBQUMsZ0JBQWdCLEVBQThCLE1BQU0sY0FBYyxDQUFBO0FBQzFFLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBR0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFJakQsT0FBTyxFQUFDLHFCQUFxQixFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBRzdFLE9BQU8sRUFBQyxZQUFZLEVBQXVCLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEYsT0FBTyxFQUFZLFlBQVksRUFBRSxrQkFBa0IsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQzFGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9DQUFvQyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDM0UsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FB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RTtnQkFDSixJQUFJLEVBQUUsT0FBTztnQkFDYixLQUFLLEVBQUUsaUJBQWlCO2dCQUN4QixHQUFHLEVBQUUsR0FBRztnQkFDUixNQUFNLEVBQUUsTUFBTTthQUNmO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7MkdBL3VDVSxjQUFjLHlNQWdHTCxxQkFBcUI7K0ZBaEc5QixjQUFjLDJOQXhFZCxDQUFDLGNBQWMsQ0FBQyxxRUFrRmhCLFNBQVMsaUdBQ1QsUUFBUSw4REFsRlQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZDVDsyRkEwQlUsY0FBYztrQkEzRTFCLFNBQVM7bUJBQUM7b0JBRVQsUUFBUSxFQUFFLHlCQUF5QjtvQkFDbkMsU0FBUyxFQUFFLENBQUMsY0FBYyxDQUFDO29CQUMzQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZDVDtvQkFDRCxNQUFNLEVBQUUsQ0FBQzs7Ozs7Ozs7Ozs7SUFXUCxFQUFDOzs7O01BSUMsRUFBQzs7SUFFSCxFQUFDOzs7Ozs7SUFNRCxDQUFDO2lCQUNKOzswQkFpR2MsTUFBTTsyQkFBQyxxQkFBcUI7NENBOUZoQyxXQUFXO3NCQUFuQixLQUFLO2dCQVFrQyxTQUFTO3NCQUFoRCxTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ0MsZ0JBQWdCO3NCQUF0RCxTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRTVCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBNE1OLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFTM0MsU0FBUztzQkFEUixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBY3Rpb259IGZyb20gJy4uLy4uL2FjdGlvbi9hY3Rpb24nXHJcbmltcG9ydCB7QXVkaW9DYXB0dXJlLCBBdWRpb0NhcHR1cmVMaXN0ZW5lcn0gZnJvbSAnLi4vLi4vYXVkaW8vY2FwdHVyZS9jYXB0dXJlJztcclxuaW1wb3J0IHtBdWRpb1BsYXllciwgQXVkaW9QbGF5ZXJFdmVudCwgRXZlbnRUeXBlfSBmcm9tICcuLi8uLi9hdWRpby9wbGF5YmFjay9wbGF5ZXInXHJcbmltcG9ydCB7V2F2V3JpdGVyfSBmcm9tICcuLi8uLi9hdWRpby9pbXBsL3dhdndyaXRlcidcclxuaW1wb3J0IHtHcm91cCwgUHJvbXB0SXRlbSwgUHJvbXB0aXRlbVV0aWwsIFNjcmlwdCwgU2VjdGlvbn0gZnJvbSAnLi4vc2NyaXB0L3NjcmlwdCc7XHJcbmltcG9ydCB7U3ByUmVjb3JkaW5nRmlsZSwgUmVjb3JkaW5nRmlsZURlc2NyaXB0b3JJbXBsfSBmcm9tICcuLi9yZWNvcmRpbmcnXHJcbmltcG9ydCB7VXBsb2FkfSBmcm9tICcuLi8uLi9uZXQvdXBsb2FkZXInO1xyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIFJlbmRlcmVyMixcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1Nlc3Npb25TZXJ2aWNlfSBmcm9tIFwiLi9zZXNzaW9uLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtTdGF0ZSBhcyBTdGFydFN0b3BTaWduYWxTdGF0ZX0gZnJvbSBcIi4uL3N0YXJ0c3RvcHNpZ25hbC9zdGFydHN0b3BzaWduYWxcIjtcclxuaW1wb3J0IHtNYXREaWFsb2d9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2dcIjtcclxuaW1wb3J0IHtTcGVlY2hSZWNvcmRlclVwbG9hZGVyfSBmcm9tIFwiLi4vc3BydXBsb2FkZXJcIjtcclxuaW1wb3J0IHtTUEVFQ0hSRUNPUkRFUl9DT05GSUcsIFNwZWVjaFJlY29yZGVyQ29uZmlnfSBmcm9tIFwiLi4vLi4vc3ByLmNvbmZpZ1wiO1xyXG5pbXBvcnQge1Nlc3Npb259IGZyb20gXCIuL3Nlc3Npb25cIjtcclxuaW1wb3J0IHtBdWRpb0RldmljZSwgQXV0b0dhaW5Db250cm9sQ29uZmlnfSBmcm9tIFwiLi4vcHJvamVjdC9wcm9qZWN0XCI7XHJcbmltcG9ydCB7TUlOX0RCX0xFVkVMLCBSZWNvcmRpbmdJdGVtRGlzcGxheX0gZnJvbSBcIi4uLy4uL3VpL3JlY29yZGluZ2l0ZW1fZGlzcGxheVwiO1xyXG5pbXBvcnQge0xldmVsSW5mb3MsTGV2ZWxNZWFzdXJlLCBTdHJlYW1MZXZlbE1lYXN1cmV9IGZyb20gXCIuLi8uLi9hdWRpby9kc3AvbGV2ZWxfbWVhc3VyZVwiO1xyXG5pbXBvcnQge1Byb21wdGluZ30gZnJvbSBcIi4vcHJvbXB0aW5nXCI7XHJcbmltcG9ydCB7U2VxdWVuY2VBdWRpb0Zsb2F0MzJDaHVua2VyT3V0U3RyZWFtfSBmcm9tIFwiLi4vLi4vYXVkaW8vaW8vc3RyZWFtXCI7XHJcbmltcG9ydCB7VHJhbnNwb3J0QWN0aW9uc30gZnJvbSBcIi4vY29udHJvbHBhbmVsXCI7XHJcbmltcG9ydCB7U2Vzc2lvbkZpbmlzaGVkRGlhbG9nfSBmcm9tIFwiLi9zZXNzaW9uX2ZpbmlzaGVkX2RpYWxvZ1wiO1xyXG5pbXBvcnQge01lc3NhZ2VEaWFsb2d9IGZyb20gXCIuLi8uLi91aS9tZXNzYWdlX2RpYWxvZ1wiO1xyXG5pbXBvcnQge1JlY29yZGluZ1NlcnZpY2V9IGZyb20gXCIuLi9yZWNvcmRpbmdzL3JlY29yZGluZ3Muc2VydmljZVwiO1xyXG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtBdWRpb0NvbnRleHRQcm92aWRlcn0gZnJvbSBcIi4uLy4uL2F1ZGlvL2NvbnRleHRcIjtcclxuaW1wb3J0IHtBdWRpb0NsaXB9IGZyb20gXCIuLi8uLi9hdWRpby9wZXJzaXN0b3JcIjtcclxuaW1wb3J0IHtJdGVtfSBmcm9tIFwiLi9pdGVtXCI7XHJcbmltcG9ydCB7QnJvd3NlciwgVXNlckFnZW50LCBVc2VyQWdlbnRCdWlsZGVyfSBmcm9tIFwiLi4vLi4vdXRpbHMvdWEtcGFyc2VyXCI7XHJcbmltcG9ydCB7TGV2ZWxCYXJ9IGZyb20gXCIuLi8uLi9hdWRpby91aS9saXZlbGV2ZWxcIjtcclxuXHJcblxyXG5leHBvcnQgY29uc3QgRk9SQ0VfUkVRVUVTVF9BVURJT19QRVJNSVNTSU9OUz1mYWxzZTtcclxuZXhwb3J0IGNvbnN0IFJFQ0ZJTEVfQVBJX0NUWCA9ICdyZWNmaWxlJztcclxuXHJcblxyXG5jb25zdCBNQVhfUkVDT1JESU5HX1RJTUVfTVMgPSAxMDAwICogNjAgKiA2MCAqIDYwOyAvLyAxIGhvdXJcclxuY29uc3QgREVGQVVMVF9QUkVfUkVDX0RFTEFZPTEwMDA7XHJcbmNvbnN0IERFRkFVTFRfUE9TVF9SRUNfREVMQVk9NTAwO1xyXG5cclxuY29uc3QgTEVWRUxfQkFSX0lOVEVSVkFMTF9TRUNPTkRTID0gMC4xOyAgLy8gMTAwbXNcclxuZXhwb3J0IGNvbnN0IGVudW0gTW9kZSB7U0VSVkVSX0JPVU5ELCBTVEFORF9BTE9ORX1cclxuXHJcbmV4cG9ydCBjb25zdCBlbnVtIFN0YXR1cyB7XHJcbiAgQkxPQ0tFRCwgSURMRSwgUFJFX1JFQ09SRElORywgUkVDT1JESU5HLCBQT1NUX1JFQ19TVE9QLCBQT1NUX1JFQ19QQVVTRSwgU1RPUFBJTkdfU1RPUCwgU1RPUFBJTkdfUEFVU0UsIEVSUk9SXHJcbn1cclxuXHJcblxyXG5cclxuLy8gVE9ETyBlbnVtIG5vdCBwb3NzaWJsZSBpbiB0ZW1wbGF0ZSBsYW5ndWFnZSAsIHVzZSBzdHJpbmcgZm9yIG5vd1xyXG4vL2V4cG9ydCBlbnVtIFN0YXR1c0FsZXJ0VHlwZSB7SU5GTyxXQVJOLEVSUk9SfTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2FwcC1zcHJyZWNvcmRpbmdzZXNzaW9uJyxcclxuICBwcm92aWRlcnM6IFtTZXNzaW9uU2VydmljZV0sXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxhcHAtd2FybmluZ2JhciBbc2hvd109XCJpc1Rlc3RTZXNzaW9uKClcIiB3YXJuaW5nVGV4dD1cIlRlc3QgcmVjb3JkaW5nIG9ubHkhXCI+PC9hcHAtd2FybmluZ2Jhcj5cclxuICAgIDxhcHAtd2FybmluZ2JhciBbc2hvd109XCJpc0RlZmF1bHRBdWRpb1Rlc3RTZXNzaW9uKClcIiB3YXJuaW5nVGV4dD1cIlRoaXMgdGVzdCB1c2VzIGRlZmF1bHQgYXVkaW8gZGV2aWNlISBSZWd1bGFyIHNlc3Npb25zIG1heSByZXF1aXJlIGEgcGFydGljdWxhciBhdWRpbyBkZXZpY2UgKG1pY3JvcGhvbmUpIVwiPjwvYXBwLXdhcm5pbmdiYXI+XHJcbiAgICAgIDxhcHAtc3BycHJvbXB0aW5nIFtwcm9qZWN0TmFtZV09XCJwcm9qZWN0TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdGFydFN0b3BTaWduYWxTdGF0ZV09XCJzdGFydFN0b3BTaWduYWxTdGF0ZVwiIFtwcm9tcHRJdGVtXT1cInByb21wdEl0ZW1cIiBbc2hvd1Byb21wdF09XCJzaG93UHJvbXB0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cIml0ZW1zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zcG9ydEFjdGlvbnNdPVwidHJhbnNwb3J0QWN0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZEl0ZW1JZHhdPVwicHJvbXB0SW5kZXhcIiAob25JdGVtU2VsZWN0KT1cIml0ZW1TZWxlY3QoJGV2ZW50KVwiIChvbk5leHRJdGVtKT1cIm5leHRJdGVtKClcIiAob25QcmV2SXRlbSk9XCJwcmV2SXRlbSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F1ZGlvU2lnbmFsQ29sbGFwc2VkXT1cImF1ZGlvU2lnbmFsQ29sbGFwc2VkXCIgW2Rpc3BsYXlBdWRpb0NsaXBdPVwiZGlzcGxheUF1ZGlvQ2xpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RhcnRBY3Rpb25dPVwiY29udHJvbEF1ZGlvUGxheWVyPy5zdGFydEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U2VsZWN0aW9uQWN0aW9uXT1cImNvbnRyb2xBdWRpb1BsYXllcj8uc3RhcnRTZWxlY3Rpb25BY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXI/LmF1dG9QbGF5T25TZWxlY3RUb2dnbGVBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxheVN0b3BBY3Rpb25dPVwiY29udHJvbEF1ZGlvUGxheWVyPy5zdG9wQWN0aW9uXCI+XHJcblxyXG4gICAgPC9hcHAtc3BycHJvbXB0aW5nPlxyXG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgW3ZhbHVlXT1cInByb2dyZXNzUGVyY2VudFZhbHVlKClcIiBmeFNob3c9XCJmYWxzZVwiIGZ4U2hvdy54cz1cInRydWVcIiA+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxyXG5cclxuXHJcbiAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXQueHM9XCJjb2x1bW5cIiBbbmdTdHlsZV09XCJ7J2hlaWdodC5weCc6MTAwLCdtaW4taGVpZ2h0LnB4JzogMTAwfVwiIFtuZ1N0eWxlLnhzXT1cInsnaGVpZ2h0LnB4JzoxMjUsJ21pbi1oZWlnaHQucHgnOiAxMjV9XCI+XHJcbiAgICAgIDxhdWRpby1sZXZlbGJhciBmeEZsZXg9XCIxIDAgMVwiIFtzdHJlYW1pbmdNb2RlXT1cImlzUmVjb3JkaW5nKClcIiBbZGlzcGxheUxldmVsSW5mb3NdPVwiZGlzcGxheUxldmVsSW5mb3NcIj48L2F1ZGlvLWxldmVsYmFyPlxyXG4gICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCI+XHJcbiAgICAgIDxzcHItcmVjb3JkaW5naXRlbWNvbnRyb2xzIGZ4RmxleD1cIjEwIDAgMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdWRpb0xvYWRlZF09XCJkaXNwbGF5QXVkaW9DbGlwPy5idWZmZXIhPT1udWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdGFydEFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXI/LnN0YXJ0QWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdG9wQWN0aW9uXT1cImNvbnRyb2xBdWRpb1BsYXllcj8uc3RvcEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwZWFrRGJMdmxdPVwicGVha0xldmVsSW5EYlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthZ2NdPVwidGhpcy5hYz8uYWdjU3RhdHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2hvd1JlY29yZGluZ0RldGFpbHMpPVwiYXVkaW9TaWduYWxDb2xsYXBzZWQ9IWF1ZGlvU2lnbmFsQ29sbGFwc2VkXCI+XHJcbiAgICAgIDwvc3ByLXJlY29yZGluZ2l0ZW1jb250cm9scz5cclxuICAgICAgPGFwcC11cGxvYWRzdGF0dXMgY2xhc3M9XCJyaWNvbnRyb2xzIGRhcmtcIiBmeEhpZGUgZnhTaG93LnhzICBmeEZsZXg9XCIwIDAgMFwiICpuZ0lmPVwiZW5hYmxlVXBsb2FkUmVjb3JkaW5nc1wiIFt2YWx1ZV09XCJ1cGxvYWRQcm9ncmVzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RhdHVzXT1cInVwbG9hZFN0YXR1c1wiIFthd2FpdE5ld1VwbG9hZF09XCJwcm9jZXNzaW5nUmVjb3JkaW5nXCI+PC9hcHAtdXBsb2Fkc3RhdHVzPlxyXG4gICAgICA8YXBwLXJlYWR5c3RhdGVpbmRpY2F0b3IgY2xhc3M9XCJyaWNvbnRyb2xzIGRhcmtcIiAgZnhIaWRlIGZ4U2hvdy54cyBmeEZsZXg9XCIwIDAgMFwiIFtyZWFkeV09XCJkYXRhU2F2ZWQgJiYgIWlzQWN0aXZlKClcIj48L2FwcC1yZWFkeXN0YXRlaW5kaWNhdG9yPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8ZGl2ICNjb250cm9scGFuZWwgY2xhc3M9XCJjb250cm9scGFuZWxcIiBmeExheW91dD1cInJvd1wiPlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIjEgMSAzMCVcIiBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCI+XHJcbiAgICAgICAgPGFwcC1zcHJzdGF0dXNkaXNwbGF5IGZ4SGlkZS54cyBbc3RhdHVzTXNnXT1cInN0YXR1c01zZ1wiIFtzdGF0dXNBbGVydFR5cGVdPVwic3RhdHVzQWxlcnRUeXBlXCIgW3N0YXR1c1dhaXRpbmddPVwic3RhdHVzV2FpdGluZ1wiPjwvYXBwLXNwcnN0YXR1c2Rpc3BsYXk+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPGFwcC1zcHJ0cmFuc3BvcnQgZnhGbGV4PVwiMTAgMCAzMCVcIiBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiIFtyZWFkb25seV09XCJyZWFkb25seVwiIFthY3Rpb25zXT1cInRyYW5zcG9ydEFjdGlvbnNcIiBbbmF2aWdhdGlvbkVuYWJsZWRdPVwiaXRlbXM9PW51bGwgfHwgaXRlbXMubGVuZ3RoPjFcIj48L2FwcC1zcHJ0cmFuc3BvcnQ+XHJcbiAgICA8ZGl2IGZ4RmxleD1cIjEgMSAzMCVcIiBmeExheW91dEFsaWduPVwiZW5kIGNlbnRlclwiIGZ4TGF5b3V0PVwicm93XCI+XHJcbiAgICAgIDxhcHAtdXBsb2Fkc3RhdHVzIGNsYXNzPVwicmljb250cm9sc1wiIGZ4SGlkZS54cyBmeExheW91dEFsaWduPVwiZW5kIGNlbnRlclwiICpuZ0lmPVwiZW5hYmxlVXBsb2FkUmVjb3JkaW5nc1wiIFt2YWx1ZV09XCJ1cGxvYWRQcm9ncmVzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbc3RhdHVzXT1cInVwbG9hZFN0YXR1c1wiIFthd2FpdE5ld1VwbG9hZF09XCJwcm9jZXNzaW5nUmVjb3JkaW5nXCI+PC9hcHAtdXBsb2Fkc3RhdHVzPlxyXG4gICAgICA8YXBwLXJlYWR5c3RhdGVpbmRpY2F0b3IgY2xhc3M9XCJyaWNvbnRyb2xzXCIgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIiBmeEhpZGUueHMgW3JlYWR5XT1cImRhdGFTYXZlZCAmJiAhaXNBY3RpdmUoKVwiPjwvYXBwLXJlYWR5c3RhdGVpbmRpY2F0b3I+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IHtcclxuICAgIGZsZXg6IDI7XHJcbiAgICBiYWNrZ3JvdW5kOiBsaWdodGdyZXk7XHJcbiAgICBkaXNwbGF5OiBmbGV4OyAvKiBWZXJ0aWNhbCBmbGV4IGNvbnRhaW5lcjogQm90dG9tIHRyYW5zcG9ydCBwYW5lbCwgYWJvdmUgcHJvbXB0aW5nIHBhbmVsICovXHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG1pbi1oZWlnaHQ6IDBweDtcclxuXHJcbiAgICAgIC8qIFByZXZlbnRzIGhvcml6b250YWwgc2Nyb2xsIGJhciBvbiBzd2lwZSByaWdodCAqL1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1gLGAucmljb250cm9scyB7XHJcbiAgICAgICAgcGFkZGluZzogNHB4O1xyXG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgfWAsYC5kYXJrIHtcclxuICAgIGJhY2tncm91bmQ6IGRhcmtncmF5O1xyXG4gIH1gLGAuY29udHJvbHBhbmVsIHtcclxuICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAyMHB4O1xyXG4gICAgbWluLWhlaWdodDogbWluLWNvbnRlbnQ7IC8qIGltcG9ydGFudCAqL1xyXG4gIH1gXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2Vzc2lvbk1hbmFnZXIgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LE9uRGVzdHJveSwgQXVkaW9DYXB0dXJlTGlzdGVuZXIge1xyXG5cclxuICBASW5wdXQoKSBwcm9qZWN0TmFtZTpzdHJpbmd8dW5kZWZpbmVkO1xyXG4gIGVuYWJsZVVwbG9hZFJlY29yZGluZ3M6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGVuYWJsZURvd25sb2FkUmVjb3JkaW5nczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHN0YXR1czogU3RhdHVzID0gU3RhdHVzLkJMT0NLRUQ7XHJcblxyXG4gIGFjOiBBdWRpb0NhcHR1cmV8bnVsbD1udWxsO1xyXG4gIHByaXZhdGUgX2NoYW5uZWxDb3VudCA9IDI7IC8vVE9ETyBkZWZpbmUgY29uc3RhbnQgZm9yIGRlZmF1bHQgZm9ybWF0XHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWREZXZpY2VJZDpzdHJpbmd8dW5kZWZpbmVkPXVuZGVmaW5lZDtcclxuICBAVmlld0NoaWxkKFByb21wdGluZywgeyBzdGF0aWM6IHRydWUgfSkgcHJvbXB0aW5nITogUHJvbXB0aW5nO1xyXG4gIEBWaWV3Q2hpbGQoTGV2ZWxCYXIsIHsgc3RhdGljOiB0cnVlIH0pIGxpdmVMZXZlbERpc3BsYXkhOiBMZXZlbEJhcjtcclxuXHJcbiAgQElucHV0KCkgZGF0YVNhdmVkPXRydWVcclxuXHJcblxyXG4gIHN0YXJ0U3RvcFNpZ25hbFN0YXRlITogU3RhcnRTdG9wU2lnbmFsU3RhdGU7XHJcbiAgLy8gUHJvcGVydHkgYXVkaW9EZXZpY2VzIGZyb20gcHJvamVjdCBjb25maWc6IGxpc3Qgb2YgbmFtZXMgb2YgYWxsb3dlZCBhdWRpbyBkZXZpY2VzLlxyXG4gIHByaXZhdGUgX2F1ZGlvRGV2aWNlczogQXJyYXk8QXVkaW9EZXZpY2U+IHwgbnVsbHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgc2VsQ2FwdHVyZURldmljZUlkOiBDb25zdHJhaW5ET01TdHJpbmcgfCBudWxsO1xyXG5cclxuICBwcml2YXRlIF9hdXRvR2FpbkNvbnRyb2xDb25maWdzOiBBcnJheTxBdXRvR2FpbkNvbnRyb2xDb25maWc+IHwgbnVsbHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIHVwZGF0ZVRpbWVySWQ6IGFueTtcclxuICBwcml2YXRlIHByZVJlY1RpbWVySWQ6IG51bWJlcnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBwcmVSZWNUaW1lclJ1bm5pbmc6IGJvb2xlYW58bnVsbD1udWxsO1xyXG4gIHByaXZhdGUgcG9zdFJlY1RpbWVySWQ6IG51bWJlcnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBwb3N0UmVjVGltZXJSdW5uaW5nOiBib29sZWFufG51bGw9bnVsbDtcclxuICBwcml2YXRlIG1heFJlY1RpbWVySWQ6IG51bWJlcnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBtYXhSZWNUaW1lclJ1bm5pbmc6IGJvb2xlYW58bnVsbD1udWxsO1xyXG5cclxuICB0cmFuc3BvcnRBY3Rpb25zOiBUcmFuc3BvcnRBY3Rpb25zO1xyXG4gIGRubExuayE6IEhUTUxBbmNob3JFbGVtZW50O1xyXG4gIHBsYXlTdGFydEFjdGlvbjogQWN0aW9uPHZvaWQ+O1xyXG4gIGF1ZGlvOiBhbnk7XHJcblxyXG4gIF9zZXNzaW9uOiBTZXNzaW9ufG51bGw9bnVsbDtcclxuICBfc2NyaXB0ITogU2NyaXB0O1xyXG5cclxuICBwcml2YXRlIF9wcm9tcHRJbmRleD0wO1xyXG4gIHByaXZhdGUgc2VjdGlvbiE6IFNlY3Rpb247XHJcbiAgZ3JvdXAhOiBHcm91cDtcclxuICBwcm9tcHRJdGVtITpQcm9tcHRJdGVtO1xyXG4gIHNob3dQcm9tcHQhOiBib29sZWFuO1xyXG5cclxuICAvLyBpbmRleCBvZiBjdXJyZW50IHNlY3Rpb25cclxuICBzZWN0SWR4ITogbnVtYmVyO1xyXG4gIC8vIGluZGV4IG9mIGN1cnJlbnQgZ3JvdXAgaW4gc2VjdGlvblxyXG4gIGdyb3VwSWR4SW5TZWN0aW9uITogbnVtYmVyO1xyXG4gIC8vIGluZGV4IG9mIGN1cnJlbnQgcHJvbXB0IGl0ZW0gaW4gZ3JvdXBcclxuICBwcm9tcHRJdGVtSWR4SW5Hcm91cCE6IG51bWJlcjtcclxuXHJcbiAgcHJpdmF0ZSBhdXRvcmVjb3JkaW5nITogYm9vbGVhbjtcclxuXHJcbiAgaXRlbXM6IEFycmF5PEl0ZW0+fG51bGw9bnVsbDtcclxuICAvL3NlbGVjdGVkSXRlbUlkeDogbnVtYmVyO1xyXG4gIHByaXZhdGUgX2Rpc3BsYXlSZWNGaWxlOiBTcHJSZWNvcmRpbmdGaWxlIHwgbnVsbD1udWxsO1xyXG4gIHByaXZhdGUgZGlzcGxheVJlY0ZpbGVWZXJzaW9uITogbnVtYmVyO1xyXG4gIGRpc3BsYXlBdWRpb0NsaXA6IEF1ZGlvQ2xpcCB8IG51bGw9bnVsbDtcclxuXHJcbiAgZGlzcGxheUxldmVsSW5mb3M6IExldmVsSW5mb3MgfCBudWxsPW51bGw7XHJcblxyXG4gIHBlYWtMZXZlbEluRGI6bnVtYmVyPU1JTl9EQl9MRVZFTDtcclxuXHJcbiAgcHJvbXB0SXRlbUNvdW50ITogbnVtYmVyO1xyXG5cclxuICByZWFkb25seT1mYWxzZVxyXG5cclxuICBzdGF0dXNNc2chOiBzdHJpbmc7XHJcbiAgc3RhdHVzQWxlcnRUeXBlITogc3RyaW5nO1xyXG4gIHN0YXR1c1dhaXRpbmchOiBib29sZWFuO1xyXG5cclxuICBwcm9jZXNzaW5nUmVjb3JkaW5nPWZhbHNlXHJcblxyXG4gIHVwbG9hZFByb2dyZXNzOiBudW1iZXIgPSAxMDA7XHJcbiAgdXBsb2FkU3RhdHVzOiBzdHJpbmcgPSAnb2snXHJcbiAgYXVkaW9TaWduYWxDb2xsYXBzZWQgPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIHN0cmVhbUxldmVsTWVhc3VyZTogU3RyZWFtTGV2ZWxNZWFzdXJlO1xyXG4gIHByaXZhdGUgbGV2ZWxNZWFzdXJlOiBMZXZlbE1lYXN1cmU7XHJcbiAgcHJpdmF0ZSBfY29udHJvbEF1ZGlvUGxheWVyITogQXVkaW9QbGF5ZXI7XHJcblxyXG4gIHByaXZhdGUgYXVkaW9GZXRjaFN1YnNjcmlwdGlvbjpTdWJzY3JpcHRpb258bnVsbD1udWxsO1xyXG5cclxuICBwcml2YXRlIGRlc3Ryb3llZD1mYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uRGlzYWJsZWQ9dHJ1ZTtcclxuXHJcbiAgcHJpdmF0ZSB1c2VyQWdlbnQ6VXNlckFnZW50O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgICAgICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgc2Vzc2lvblNlcnZpY2U6U2Vzc2lvblNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZWNGaWxlU2VydmljZTpSZWNvcmRpbmdTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgdXBsb2FkZXI6IFNwZWVjaFJlY29yZGVyVXBsb2FkZXIsXHJcbiAgICAgICAgICAgICAgQEluamVjdChTUEVFQ0hSRUNPUkRFUl9DT05GSUcpIHB1YmxpYyBjb25maWc/OiBTcGVlY2hSZWNvcmRlckNvbmZpZykge1xyXG4gICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuSURMRTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucyA9IG5ldyBUcmFuc3BvcnRBY3Rpb25zKCk7XHJcbiAgICB0aGlzLnBsYXlTdGFydEFjdGlvbiA9IG5ldyBBY3Rpb24oJ1BsYXknKTtcclxuICAgIHRoaXMuYXVkaW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaW8nKTtcclxuICAgIHRoaXMuc2VsQ2FwdHVyZURldmljZUlkID0gbnVsbDtcclxuICAgIHRoaXMubGV2ZWxNZWFzdXJlID0gbmV3IExldmVsTWVhc3VyZSgpO1xyXG4gICAgdGhpcy5zdHJlYW1MZXZlbE1lYXN1cmUgPSBuZXcgU3RyZWFtTGV2ZWxNZWFzdXJlKCk7XHJcbiAgICB0aGlzLnVzZXJBZ2VudD1Vc2VyQWdlbnRCdWlsZGVyLnVzZXJBZ2VudCgpO1xyXG4gICAgY29uc29sZS5kZWJ1ZyhcIkRldGVjdGVkIHBsYXRmb3JtOiBcIit0aGlzLnVzZXJBZ2VudC5kZXRlY3RlZFBsYXRmb3JtKTtcclxuICAgIGNvbnNvbGUuZGVidWcoXCJEZXRlY3RlZCBicm93c2VyOiBcIit0aGlzLnVzZXJBZ2VudC5kZXRlY3RlZEJyb3dzZXIpO1xyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5lbmFibGVVcGxvYWRSZWNvcmRpbmdzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5lbmFibGVVcGxvYWRSZWNvcmRpbmdzID0gdGhpcy5jb25maWcuZW5hYmxlVXBsb2FkUmVjb3JkaW5ncztcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5lbmFibGVEb3dubG9hZFJlY29yZGluZ3MgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmVuYWJsZURvd25sb2FkUmVjb3JkaW5ncyA9IHRoaXMuY29uZmlnLmVuYWJsZURvd25sb2FkUmVjb3JkaW5ncztcclxuICAgIH1cclxuICAgIHRoaXMuaW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5zdHJlYW1MZXZlbE1lYXN1cmUubGV2ZWxMaXN0ZW5lciA9IHRoaXMubGl2ZUxldmVsRGlzcGxheTtcclxuICAgIHRoaXMuc3RyZWFtTGV2ZWxNZWFzdXJlLnBlYWtMZXZlbExpc3RlbmVyPShwZWFrTHZsSW5EYik9PntcclxuICAgICAgdGhpcy5wZWFrTGV2ZWxJbkRiPXBlYWtMdmxJbkRiO1xyXG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgIHRoaXMuZGVzdHJveWVkPXRydWU7XHJcbiAgICAgICAvLyBUT0RPIHN0b3AgY2FwdHVyZSAvcGxheWJhY2tcclxuICAgIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0KCkge1xyXG4gICAgdGhpcy5zZWN0SWR4ID0gMDtcclxuICAgIHRoaXMuZ3JvdXBJZHhJblNlY3Rpb24gPSAwO1xyXG4gICAgdGhpcy5wcm9tcHRJdGVtSWR4SW5Hcm91cCA9IDA7XHJcbiAgICB0aGlzLmF1dG9yZWNvcmRpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgbGV0IGNvbnRleHQ6QXVkaW9Db250ZXh0fG51bGw9bnVsbDtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnRleHQgPSBBdWRpb0NvbnRleHRQcm92aWRlci5hdWRpb0NvbnRleHRJbnN0YW5jZSgpXHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuRVJST1I7XHJcbiAgICAgIGxldCBlcnJNc2cgPSAnVW5rbm93biBlcnJvcic7XHJcbiAgICAgIGlmKGVyciBpbnN0YW5jZW9mIEVycm9yKXtcclxuICAgICAgICBlcnJNc2c9ZXJyLm1lc3NhZ2U7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnRVJST1I6ICcgKyBlcnJNc2c7XHJcbiAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgdGhpcy5kaWFsb2cub3BlbihNZXNzYWdlRGlhbG9nLCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgdHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgIHRpdGxlOiAnRXJyb3InLFxyXG4gICAgICAgICAgbXNnOiBlcnJNc2csXHJcbiAgICAgICAgICBhZHZpc2U6ICdQbGVhc2UgdXNlIGEgc3VwcG9ydGVkIGJyb3dzZXIuJyxcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZihjb250ZXh0KSB7XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlN0YXRlIG9mIGF1ZGlvIGNvbnRleHQ6IFwiICsgY29udGV4dC5zdGF0ZSlcclxuICAgIH1lbHNle1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJObyBhdWRpbyBjb250ZXh0IGF2YWlsYWJsZSFcIik7XHJcbiAgICB9XHJcbiAgICBpZiAoIWNvbnRleHQgfHwgIW5hdmlnYXRvci5tZWRpYURldmljZXMpIHtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuRVJST1I7XHJcbiAgICAgIGxldCBlcnJNc2cgPSAnQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IE1lZGlhIHN0cmVhbXMhJztcclxuICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnRVJST1I6ICcgKyBlcnJNc2c7XHJcbiAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgdGhpcy5kaWFsb2cub3BlbihNZXNzYWdlRGlhbG9nLCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgdHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgIHRpdGxlOiAnRXJyb3InLFxyXG4gICAgICAgICAgbXNnOiBlcnJNc2csXHJcbiAgICAgICAgICBhZHZpc2U6ICdQbGVhc2UgdXNlIGEgc3VwcG9ydGVkIGJyb3dzZXIuJyxcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFjID0gbmV3IEF1ZGlvQ2FwdHVyZShjb250ZXh0KTtcclxuICAgICAgaWYgKHRoaXMuYWMpIHtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLnN0YXJ0SXRlbSgpO1xyXG4gICAgICAgIHRoaXMuYWMubGlzdGVuZXIgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuYWMuYXVkaW9PdXRTdHJlYW0gPSBuZXcgU2VxdWVuY2VBdWRpb0Zsb2F0MzJDaHVua2VyT3V0U3RyZWFtKHRoaXMuc3RyZWFtTGV2ZWxNZWFzdXJlLCBMRVZFTF9CQVJfSU5URVJWQUxMX1NFQ09ORFMpO1xyXG4gICAgICAgIC8vIERvbid0IGxpc3QgdGhlIGRldmljZXMgaGVyZS4gSWYgd2UgZG8gbm90IGhhdmUgYXVkaW8gcGVybWlzc2lvbnMgd2Ugb25seSBnZXQgYW5vbnltaXplZCBkZXZpY2VzIHdpdGhvdXQgbGFiZWxzLlxyXG4gICAgICAgIC8vdGhpcy5hYy5saXN0RGV2aWNlcygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgbGV0IGVyck1zZyA9ICdCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgTWVkaWEvQXVkaW8gQVBJISc7XHJcbiAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnRVJST1I6ICcgKyBlcnJNc2c7XHJcbiAgICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTWVzc2FnZURpYWxvZywge1xyXG4gICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxyXG4gICAgICAgICAgICB0aXRsZTogJ0Vycm9yJyxcclxuICAgICAgICAgICAgbXNnOiBlcnJNc2csXHJcbiAgICAgICAgICAgIGFkdmlzZTogJ1BsZWFzZSB1c2UgYSBzdXBwb3J0ZWQgYnJvd3Nlci4nLFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMuc3RvcEl0ZW0oKTtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLnN0b3BJdGVtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMucGF1c2VJdGVtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLm5leHRJdGVtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2ROZXh0QWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5uZXh0VW5yZWNvcmRlZEl0ZW0oKTtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMucHJldkl0ZW0oKTtcclxuICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLmNvbnRyb2xBdWRpb1BsYXllci5zdGFydCgpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN0YXJ0U3RvcFNpZ25hbFN0YXRlID0gU3RhcnRTdG9wU2lnbmFsU3RhdGUuT0ZGO1xyXG5cclxufVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5cHJlc3MnLCBbJyRldmVudCddKVxyXG4gIG9uS2V5UHJlc3Moa2U6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmIChrZS5rZXkgPT0gJyAnKSB7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBvbktleURvd24oa2U6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmIChrZS5rZXkgPT0gJyAnKSB7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuICAgIGlmIChrZS5rZXkgPT0gJ3AnKSB7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGtlLmtleSA9PSAnRXNjYXBlJykge1xyXG4gICAgICBpZighdGhpcy5hdWRpb1NpZ25hbENvbGxhcHNlZCl7XHJcbiAgICAgICAgdGhpcy5hdWRpb1NpZ25hbENvbGxhcHNlZD10cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoa2Uua2V5ID09ICdNZWRpYVBsYXlQYXVzZScpIHtcclxuICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGtlLmtleSA9PT0gJ0Fycm93UmlnaHQnKSB7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGtlLmtleSA9PT0gJ0Fycm93TGVmdCcpIHtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm9ncmVzc1BlcmNlbnRWYWx1ZSgpOm51bWJlciB7XHJcbiAgICBsZXQgdj0xMDA7XHJcbiAgICBpZih0aGlzLml0ZW1zKSB7XHJcbiAgICAgIHY9dGhpcy5wcm9tcHRJbmRleCAqIDEwMCAvICh0aGlzLml0ZW1zLmxlbmd0aCAtIDEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfVxyXG4gIGlzVGVzdFNlc3Npb24oKTpib29sZWFuIHtcclxuICAgIHJldHVybiAoKHRoaXMuX3Nlc3Npb24hPW51bGwpICYmICh0aGlzLl9zZXNzaW9uLnR5cGUgPT09ICdURVNUJyB8fCB0aGlzLl9zZXNzaW9uLnR5cGU9PT0nVEVTVF9ERUZfQScgfHwgdGhpcy5fc2Vzc2lvbi50eXBlID09PSAnU0lOVVNfVEVTVCcpKTtcclxuICB9XHJcblxyXG4gIGlzRGVmYXVsdEF1ZGlvVGVzdFNlc3Npb24oKTpib29sZWFuIHtcclxuICAgIHJldHVybiAoKHRoaXMuX3Nlc3Npb24hPW51bGwpICYmICh0aGlzLl9zZXNzaW9uLnR5cGU9PT0nVEVTVF9ERUZfQScpKTtcclxuICB9XHJcblxyXG4gIGlzRGVmYXVsdEF1ZGlvVGVzdFNlc3Npb25PdmVyd3JpdGVpbmdQcm9qZWN0UmVxdWlyZW1lbnRzKCk6Ym9vbGVhbiB7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9zZXNzaW9uIT1udWxsKSAmJiAodGhpcy5fc2Vzc2lvbi50eXBlPT09J1RFU1RfREVGX0EnKSAmJiAodGhpcy5hdWRpb0RldmljZXMhPW51bGwpICYmIHRoaXMuYXVkaW9EZXZpY2VzLmxlbmd0aD4wKVxyXG4gIH1cclxuXHJcblxyXG4gIHNldCBjb250cm9sQXVkaW9QbGF5ZXIoY29udHJvbEF1ZGlvUGxheWVyOiBBdWRpb1BsYXllcikge1xyXG4gICAgaWYgKHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllcikge1xyXG4gICAgICAvL3RoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5saXN0ZW5lcj1udWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyID0gY29udHJvbEF1ZGlvUGxheWVyO1xyXG4gICAgaWYgKHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllcikge1xyXG4gICAgICB0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIubGlzdGVuZXIgPSB0aGlzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbnRyb2xBdWRpb1BsYXllcigpOiBBdWRpb1BsYXllciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyO1xyXG4gIH1cclxuXHJcbiAgc2V0IHNlc3Npb24oc2Vzc2lvbjogU2Vzc2lvbikge1xyXG4gICAgdGhpcy5fc2Vzc2lvbiA9IHNlc3Npb247XHJcbiAgfVxyXG5cclxuICBzZXQgc2NyaXB0KHNjcmlwdDogYW55KSB7XHJcbiAgICB0aGlzLl9zY3JpcHQgPSBzY3JpcHQ7XHJcbiAgICB0aGlzLmxvYWRTY3JpcHQoKTtcclxuICB9XHJcblxyXG4gIHNldCBjaGFubmVsQ291bnQoY2hhbm5lbENvdW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2NoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDtcclxuICB9XHJcblxyXG4gIHNldCBhdWRpb0RldmljZXMoYXVkaW9EZXZpY2VzOiBBcnJheTxBdWRpb0RldmljZT4gfCBudWxsfHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fYXVkaW9EZXZpY2VzID0gYXVkaW9EZXZpY2VzO1xyXG4gIH1cclxuXHJcbiAgc2V0IGF1dG9HYWluQ29udHJvbENvbmZpZ3MoYXV0b0dhaW5Db250cm9sQ29uZmlnczogQXJyYXk8QXV0b0dhaW5Db250cm9sQ29uZmlnPnxudWxsfHVuZGVmaW5lZCl7XHJcbiAgICB0aGlzLl9hdXRvR2FpbkNvbnRyb2xDb25maWdzPWF1dG9HYWluQ29udHJvbENvbmZpZ3M7XHJcbiAgfVxyXG5cclxuICB1cGRhdGUoZTogQXVkaW9QbGF5ZXJFdmVudCkge1xyXG4gICAgaWYgKGUudHlwZSA9PSBFdmVudFR5cGUuU1RBUlRFRCkge1xyXG4gICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMudXBkYXRlVGltZXJJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgLy90aGlzLmF1ZGlvU2lnbmFsLnBsYXlGcmFtZVBvc2l0aW9uID0gdGhpcy5hcC5wbGF5UG9zaXRpb25GcmFtZXM7XHJcbiAgICAgIH0sIDUwKTtcclxuICAgIH0gZWxzZSBpZiAoZS50eXBlID09IEV2ZW50VHlwZS5TVE9QUEVEIHx8IGUudHlwZSA9PSBFdmVudFR5cGUuRU5ERUQpIHtcclxuICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy51cGRhdGVUaW1lcklkKTtcclxuICAgICAgLy8gdGhpcy5hdWRpb1NpZ25hbC5wbGF5RnJhbWVQb3NpdGlvbiA9IHRoaXMuYXAucGxheVBvc2l0aW9uRnJhbWVzO1xyXG4gICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5kaXNhYmxlZCA9ICghKHRoaXMuZGlzcGxheVJlY0ZpbGUpKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgcHJvbXB0SW5kZXgoKTpudW1iZXJ7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJvbXB0SW5kZXg7XHJcbiAgfVxyXG5cclxuICBzZXQgcHJvbXB0SW5kZXgocHJvbXB0SW5kZXg6bnVtYmVyKXtcclxuICAgIGlmKHByb21wdEluZGV4PDAgfHwgcHJvbXB0SW5kZXg+PXRoaXMucHJvbXB0SXRlbUNvdW50KXtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJvbXB0IGluZGV4IG91dCBvZiByYW5nZVwiKVxyXG4gICAgfVxyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgbGV0IHNlY3Rpb25zPXRoaXMuX3NjcmlwdC5zZWN0aW9ucztcclxuICAgIGxldCBmb3VuZD1mYWxzZTtcclxuICAgIGZvciAobGV0IHNpID0gMDsgc2kgPCBzZWN0aW9ucy5sZW5ndGggJiYgIWZvdW5kOyBzaSsrKSB7XHJcbiAgICAgIGxldCBzZWN0aW9uID0gc2VjdGlvbnNbc2ldO1xyXG4gICAgICBsZXQgZ3MgPSBzZWN0aW9uLl9zaHVmZmxlZEdyb3VwcztcclxuICAgICAgZm9yIChsZXQgZ2kgPSAwOyBnaSA8IGdzLmxlbmd0aDsgZ2krKykge1xyXG4gICAgICAgIGxldCBwaXM9Z3NbZ2ldLl9zaHVmZmxlZFByb21wdEl0ZW1zO1xyXG5cclxuICAgICAgICBsZXQgcGlzU2l6ZSA9IHBpcy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHByb21wdEluZGV4IDwgaSArIHBpc1NpemUpIHtcclxuICAgICAgICAgIHRoaXMuc2VjdElkeCA9IHNpO1xyXG4gICAgICAgICAgdGhpcy5ncm91cElkeEluU2VjdGlvbj1naTtcclxuICAgICAgICAgIHRoaXMucHJvbXB0SXRlbUlkeEluR3JvdXAgPSBwcm9tcHRJbmRleCAtIGk7XHJcbiAgICAgICAgICBmb3VuZD10cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGkgKz0gcGlzU2l6ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmKGZvdW5kKXtcclxuICAgICAgdGhpcy5fcHJvbXB0SW5kZXg9cHJvbXB0SW5kZXg7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW50ZXJuYWwgZXJyb3I6IFByb21wdCBpbmRleCBub3QgZm91bmRcIilcclxuICAgIH1cclxuICAgIHRoaXMuYXBwbHlJdGVtKCk7XHJcbiAgfVxyXG5cclxuICBpdGVtU2VsZWN0KGl0ZW1JZHg6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSBTdGF0dXMuSURMRSkge1xyXG4gICAgICB0aGlzLnByb21wdEluZGV4PWl0ZW1JZHg7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG5cclxuICBzdGFydEl0ZW0oKSB7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIGlmKHRoaXMucmVhZG9ubHkpe1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24uZGlzYWJsZWQgPSB0cnVlXHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkTmV4dEFjdGlvbi5kaXNhYmxlZCA9IHRydWVcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5id2RBY3Rpb24uZGlzYWJsZWQgPSB0cnVlXHJcbiAgICB0aGlzLmRpc3BsYXlSZWNGaWxlID0gbnVsbDtcclxuICAgIHRoaXMuZGlzcGxheVJlY0ZpbGVWZXJzaW9uID0gMDtcclxuICAgIHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCA9IG51bGw7XHJcbiAgICB0aGlzLnNob3dSZWNvcmRpbmcoKTtcclxuICAgIGlmICh0aGlzLnNlY3Rpb24ubW9kZSA9PT0gJ0FVVE9SRUNPUkRJTkcnKSB7XHJcbiAgICAgIHRoaXMuYXV0b3JlY29yZGluZyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYodGhpcy5hYyE9bnVsbCkge1xyXG4gICAgICBpZiAoIXRoaXMuYWMub3BlbmVkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkRGV2aWNlSWQpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiT3BlbiBzZXNzaW9uIHdpdGggYXVkaW8gZGV2aWNlIElkOiBcXCdcIiArIHRoaXMuX3NlbGVjdGVkRGV2aWNlSWQgKyBcIlxcJyBmb3IgXCIgKyB0aGlzLl9jaGFubmVsQ291bnQgKyBcIiBjaGFubmVsc1wiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJPcGVuIHNlc3Npb24gd2l0aCBkZWZhdWx0IGF1ZGlvIGRldmljZSBmb3IgXCIgKyB0aGlzLl9jaGFubmVsQ291bnQgKyBcIiBjaGFubmVsc1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hYy5vcGVuKHRoaXMuX2NoYW5uZWxDb3VudCwgdGhpcy5fc2VsZWN0ZWREZXZpY2VJZCx0aGlzLl9hdXRvR2FpbkNvbnRyb2xDb25maWdzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmFjLnN0YXJ0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIGxvYWRTY3JpcHQoKSB7XHJcbiAgICB0aGlzLnByb21wdEl0ZW1Db3VudCA9IDA7XHJcblxyXG4gICAgdGhpcy5pdGVtcyA9IG5ldyBBcnJheTxJdGVtPigpO1xyXG4gICAgbGV0IGxuID0gMDtcclxuXHJcbiAgICAvL1RPRE8gcmFuZG9taXplIG5vdCBzdXBwb3J0ZWRcclxuICAgIGZvciAobGV0IHNpID0gMDsgc2kgPCB0aGlzLl9zY3JpcHQuc2VjdGlvbnMubGVuZ3RoOyBzaSsrKSB7XHJcbiAgICAgIGxldCBzZWN0aW9uID0gdGhpcy5fc2NyaXB0LnNlY3Rpb25zW3NpXTtcclxuICAgICAgbGV0IGdzID0gc2VjdGlvbi5fc2h1ZmZsZWRHcm91cHM7XHJcbiAgICAgIGZvcihsZXQgZ2k9MDtnaTxncy5sZW5ndGg7Z2krKykge1xyXG5cclxuICAgICAgICAgIGxldCBwaXMgPSBnc1tnaV0uX3NodWZmbGVkUHJvbXB0SXRlbXM7XHJcblxyXG4gICAgICAgICAgbGV0IHBpc0xlbiA9IHBpcy5sZW5ndGg7XHJcbiAgICAgICAgICB0aGlzLnByb21wdEl0ZW1Db3VudCArPSBwaXNMZW47XHJcbiAgICAgICAgICBmb3IgKGxldCBwaVNlY3RJZHggPSAwOyBwaVNlY3RJZHggPCBwaXNMZW47IHBpU2VjdElkeCsrKSB7XHJcbiAgICAgICAgICAgIGxldCBwaSA9IHBpc1twaVNlY3RJZHhdO1xyXG4gICAgICAgICAgICBsZXQgcHJvbXB0QXNTdHIgPSBQcm9tcHRpdGVtVXRpbC50b1BsYWluVGV4dFN0cmluZyhwaSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgaXQgPSBuZXcgSXRlbShwcm9tcHRBc1N0ciwgc2VjdGlvbi50cmFpbmluZywoIXBpLnR5cGUgfHwgcGkudHlwZT09PSdyZWNvcmRpbmcnKSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbXMucHVzaChpdCk7XHJcbiAgICAgICAgICAgIGxuKys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb21wdEluZGV4QnlJdGVtY29kZShpdGVtY29kZTpzdHJpbmcpOm51bWJlcnxudWxse1xyXG4gICAgbGV0IHBpeCA9IDA7XHJcblxyXG4gICAgZm9yIChsZXQgc2kgPSAwOyBzaSA8IHRoaXMuX3NjcmlwdC5zZWN0aW9ucy5sZW5ndGg7IHNpKyspIHtcclxuICAgICAgbGV0IHNlY3Rpb24gPSB0aGlzLl9zY3JpcHQuc2VjdGlvbnNbc2ldO1xyXG4gICAgICBsZXQgZ3MgPSBzZWN0aW9uLl9zaHVmZmxlZEdyb3VwcztcclxuICAgICAgZm9yKGxldCBnaT0wO2dpPGdzLmxlbmd0aDtnaSsrKSB7XHJcbiAgICAgICAgbGV0IHBpcz1nc1tnaV0uX3NodWZmbGVkUHJvbXB0SXRlbXM7XHJcbiAgICAgICAgbGV0IHBpc0xlbiA9IHBpcy5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgcGlTZWN0SWR4ID0gMDsgcGlTZWN0SWR4IDwgcGlzTGVuOyBwaVNlY3RJZHgrKykge1xyXG4gICAgICAgICAgbGV0IHBpID0gcGlzW3BpU2VjdElkeF07XHJcbiAgICAgICAgICBsZXQgaWM9cGkuaXRlbWNvZGU7XHJcbiAgICAgICAgICBpZihpYyA9PT0gaXRlbWNvZGUpe1xyXG4gICAgICAgICAgICByZXR1cm4gcGl4O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcGl4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGNsZWFyUHJvbXB0KCkge1xyXG4gICAgLy90aGlzLnByb21wdGluZy5wcm9tcHRDb250YWluZXIucHJvbXB0ZXIucHJvbXB0VGV4dD0nJztcclxuICAgIC8vdGhpcy5tZWRpYWl0ZW0gPSBudWxsO1xyXG4gICAgdGhpcy5zaG93UHJvbXB0ID0gZmFsc2U7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKVxyXG4gIH1cclxuXHJcbiAgYXBwbHlQcm9tcHQoKSB7XHJcbiAgICAvL3RoaXMucHJvbXB0aW5nLnByb21wdENvbnRhaW5lci5wcm9tcHRlci5wcm9tcHRUZXh0PXRoaXMucHJvbXB0VW5pdC5tZWRpYWl0ZW1zWzBdLnRleHQ7XHJcbiAgICAvL3RoaXMucHJvbXB0VGV4dCA9IHRoaXMucHJvbXB0VW5pdC5tZWRpYWl0ZW1zWzBdLnRleHQ7XHJcbiAgICAvL3RoaXMubWVkaWFpdGVtPXRoaXMucHJvbXB0VW5pdC5tZWRpYWl0ZW1zWzBdO1xyXG4gICAgdGhpcy5zaG93UHJvbXB0ID0gdHJ1ZTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgfVxyXG5cclxuICBkb3dubG9hZFJlY29yZGluZygpIHtcclxuICAgIGlmICh0aGlzLmRpc3BsYXlSZWNGaWxlKSB7XHJcbiAgICAgIGxldCBhYjogQXVkaW9CdWZmZXJ8bnVsbCA9IHRoaXMuZGlzcGxheVJlY0ZpbGUuYXVkaW9CdWZmZXI7XHJcbiAgICAgIGxldCB3dyA9IG5ldyBXYXZXcml0ZXIoKTtcclxuICAgICAgaWYoYWIpIHtcclxuICAgICAgICBsZXQgd2F2RmlsZSA9IHd3LndyaXRlQXN5bmMoYWIsICh3YXZGaWxlKSA9PiB7XHJcbiAgICAgICAgICBsZXQgYmxvYiA9IG5ldyBCbG9iKFt3YXZGaWxlXSwge3R5cGU6ICdhdWRpby93YXYnfSk7XHJcbiAgICAgICAgICBsZXQgcmZVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG5cclxuICAgICAgICAgIGxldCBkYXRhRG5sTG5rID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgICAgICAvL2RhdGFEbmxMbmsubmFtZSA9ICdSZWNvcmRpbmcnO1xyXG4gICAgICAgICAgZGF0YURubExuay5ocmVmID0gcmZVcmw7XHJcblxyXG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5ib2R5LCBkYXRhRG5sTG5rKTtcclxuXHJcbiAgICAgICAgICAvLyBkb3dubG9hZCBwcm9wZXJ0eSBub3QgeWV0IGluIFRTIGRlZlxyXG4gICAgICAgICAgaWYgKHRoaXMuZGlzcGxheVJlY0ZpbGUpIHtcclxuICAgICAgICAgICAgbGV0IGZuID0gdGhpcy5kaXNwbGF5UmVjRmlsZS5maWxlbmFtZVN0cmluZygpO1xyXG4gICAgICAgICAgICBmbiArPSAnXycgKyB0aGlzLmRpc3BsYXlSZWNGaWxlVmVyc2lvbjtcclxuICAgICAgICAgICAgZm4gKz0gJy53YXYnO1xyXG4gICAgICAgICAgICBkYXRhRG5sTG5rLmRvd25sb2FkID0gZm47XHJcbiAgICAgICAgICAgIGRhdGFEbmxMbmsuY2xpY2soKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQoZG9jdW1lbnQuYm9keSwgZGF0YURubExuayk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldCBkaXNwbGF5UmVjRmlsZShkaXNwbGF5UmVjRmlsZTogU3ByUmVjb3JkaW5nRmlsZSB8IG51bGwpIHtcclxuICAgIHRoaXMuX2Rpc3BsYXlSZWNGaWxlID0gZGlzcGxheVJlY0ZpbGU7XHJcbiAgICBpZiAodGhpcy5fZGlzcGxheVJlY0ZpbGUpIHtcclxuICAgICAgbGV0IGFiOiBBdWRpb0J1ZmZlcnxudWxsID0gdGhpcy5fZGlzcGxheVJlY0ZpbGUuYXVkaW9CdWZmZXI7XHJcbiAgICAgIGlmKGFiKSB7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5QXVkaW9DbGlwID0gbmV3IEF1ZGlvQ2xpcChhYik7XHJcbiAgICAgICAgdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIuYXVkaW9DbGlwID0gdGhpcy5kaXNwbGF5QXVkaW9DbGlwO1xyXG4gICAgICB9ZWxzZSB7XHJcbiAgICAgICAgLy8gY2xlYXIgZm9yIG5vdyAuLi5cclxuICAgICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY29udHJvbEF1ZGlvUGxheWVyLmF1ZGlvQ2xpcCA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllciAmJiB0aGlzLl9zZXNzaW9uKSB7XHJcbiAgICAgICAgICAvLy4uLiBhbmQgdHJ5IHRvIGZldGNoIGZyb20gc2VydmVyXHJcbiAgICAgICAgICB0aGlzLmF1ZGlvRmV0Y2hTdWJzY3JpcHRpb24gPSB0aGlzLnJlY0ZpbGVTZXJ2aWNlLmZldGNoQW5kQXBwbHlTcHJSZWNvcmRpbmdGaWxlKHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5jb250ZXh0LCB0aGlzLl9zZXNzaW9uLnByb2plY3QsIHRoaXMuX2Rpc3BsYXlSZWNGaWxlKS5zdWJzY3JpYmUoKHJmKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBmYWIgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAocmYgJiYgdGhpcy5fZGlzcGxheVJlY0ZpbGUpIHtcclxuICAgICAgICAgICAgICBmYWIgPSB0aGlzLl9kaXNwbGF5UmVjRmlsZS5hdWRpb0J1ZmZlcjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnN0YXR1c01zZyA9ICdSZWNvcmRpbmcgZmlsZSBjb3VsZCBub3QgYmUgbG9hZGVkLidcclxuICAgICAgICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcidcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZmFiKXtcclxuICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBuZXcgQXVkaW9DbGlwKGZhYik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIuYXVkaW9DbGlwID10aGlzLmRpc3BsYXlBdWRpb0NsaXBcclxuICAgICAgICAgICAgdGhpcy5zaG93UmVjb3JkaW5nKCk7XHJcblxyXG4gICAgICAgICAgfSwgZXJyID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkNvdWxkIG5vdCBsb2FkIHJlY29yZGluZyBmaWxlIGZyb20gc2VydmVyOiBcIiArIGVycilcclxuICAgICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGxvYWRlZDogJyArIGVyclxyXG4gICAgICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcidcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICB0aGlzLnN0YXR1c01zZyA9ICdSZWNvcmRpbmcgZmlsZSBjb3VsZCBub3QgYmUgZGVjb2RlZC4gQXVkaW8gY29udGV4dCB1bmF2YWlsYWJsZS4nXHJcbiAgICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcidcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBudWxsO1xyXG4gICAgICB0aGlzLmNvbnRyb2xBdWRpb1BsYXllci5hdWRpb0NsaXAgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGRpc3BsYXlSZWNGaWxlKCk6IFNwclJlY29yZGluZ0ZpbGUgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5UmVjRmlsZTtcclxuICB9XHJcblxyXG4gIHNob3dSZWNvcmRpbmcoKSB7XHJcbiAgICB0aGlzLmNvbnRyb2xBdWRpb1BsYXllci5zdG9wKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCkge1xyXG5cclxuICAgICAgdGhpcy5sZXZlbE1lYXN1cmUuY2FsY0J1ZmZlckxldmVsSW5mb3ModGhpcy5kaXNwbGF5QXVkaW9DbGlwLmJ1ZmZlciwgTEVWRUxfQkFSX0lOVEVSVkFMTF9TRUNPTkRTKS50aGVuKChsZXZlbEluZm9zKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5TGV2ZWxJbmZvcyA9IGxldmVsSW5mb3M7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAvLyBUT0RPXHJcbiAgICAgIC8vIFNldHRpbmcgdG8gbnVsbCBkb2VzIG5vdCB0cmlnZ2VyIGEgY2hhbmdlIGlmIGl0IHdhcyAgbnVsbCBiZWZvcmUgKGhhcHBlbnMgYWZ0ZXIgbmV4dGl0ZW0oKSBpbiBBVVRPUFJPR1JFU1MgbW9kZSlcclxuICAgICAgLy8gVGhlIGxldmVsIGJhciBkaXNwbGF5IGRvZXMgbm90IGNsZWFyLCBpdCBzaG93cyB0aGUgbGFzdCBjYXB0dXJlZCBzdHJlYW1cclxuICAgICAgdGhpcy5kaXNwbGF5TGV2ZWxJbmZvcyA9IG51bGw7XHJcblxyXG4gICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcblxyXG4gICAgICAvLyBDb2xsYXBzZSBhdWRpbyBzaWduYWwgZGlzcGxheSBpZiBvcGVuXHJcbiAgICAgIGlmICghdGhpcy5hdWRpb1NpZ25hbENvbGxhcHNlZCkge1xyXG4gICAgICAgIHRoaXMuYXVkaW9TaWduYWxDb2xsYXBzZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG5cclxuICBpc1JlY29yZGluZ0l0ZW0oKTpib29sZWFue1xyXG4gICAgcmV0dXJuKHRoaXMucHJvbXB0SXRlbSE9bnVsbCAmJiB0aGlzLnByb21wdEl0ZW0udHlwZSE9PSdub25yZWNvcmRpbmcnKVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlU3RhcnRBY3Rpb25EaXNhYmxlU3RhdGUoKXtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5kaXNhYmxlZD0hKHRoaXMuYWMgICYmIHRoaXMuaXNSZWNvcmRpbmdJdGVtKCkpO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlJdGVtKHRlbXBvcmFyeT1mYWxzZSkge1xyXG5cclxuICAgIHRoaXMuc2VjdGlvbiA9IHRoaXMuX3NjcmlwdC5zZWN0aW9uc1t0aGlzLnNlY3RJZHhdXHJcbiAgICB0aGlzLmdyb3VwID0gdGhpcy5zZWN0aW9uLl9zaHVmZmxlZEdyb3Vwc1t0aGlzLmdyb3VwSWR4SW5TZWN0aW9uXTtcclxuICAgIHRoaXMucHJvbXB0SXRlbSA9IHRoaXMuZ3JvdXAuX3NodWZmbGVkUHJvbXB0SXRlbXNbdGhpcy5wcm9tcHRJdGVtSWR4SW5Hcm91cF07XHJcblxyXG4gICAgLy90aGlzLnNlbGVjdGVkSXRlbUlkeCA9IHRoaXMucHJvbXB0SW5kZXg7XHJcblxyXG4gICAgaWYodGhpcy5hdWRpb0ZldGNoU3Vic2NyaXB0aW9uKXtcclxuICAgICAgdGhpcy5hdWRpb0ZldGNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNsZWFyUHJvbXB0KCk7XHJcblxyXG4gICAgbGV0IGlzTm9ucmVjb3JkaW5nPSh0aGlzLnByb21wdEl0ZW0udHlwZT09PSdub25yZWNvcmRpbmcnKVxyXG5cclxuICAgIGlmIChpc05vbnJlY29yZGluZyB8fCAhdGhpcy5zZWN0aW9uLnByb21wdHBoYXNlIHx8IHRoaXMuc2VjdGlvbi5wcm9tcHRwaGFzZSA9PT0gJ0lETEUnKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlQcm9tcHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZihpc05vbnJlY29yZGluZyl7XHJcbiAgICAgIHRoaXMuc3RhcnRTdG9wU2lnbmFsU3RhdGUgPSBTdGFydFN0b3BTaWduYWxTdGF0ZS5PRkY7XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgbGV0IGl0ID0gdGhpcy5pdGVtc1t0aGlzLnByb21wdEluZGV4XTtcclxuICAgICAgICBpZiAoIWl0LnJlY3MpIHtcclxuICAgICAgICAgIGl0LnJlY3MgPSBuZXcgQXJyYXk8U3ByUmVjb3JkaW5nRmlsZT4oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCByZWNlbnRSZWNGaWxlOiBTcHJSZWNvcmRpbmdGaWxlIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgbGV0IGF2YWlsUmVjZmlsZXM6IG51bWJlciA9IGl0LnJlY3MubGVuZ3RoO1xyXG4gICAgICAgIGlmIChhdmFpbFJlY2ZpbGVzID4gMCkge1xyXG4gICAgICAgICAgbGV0IHJmVmVyczogbnVtYmVyID0gYXZhaWxSZWNmaWxlcyAtIDE7XHJcbiAgICAgICAgICByZWNlbnRSZWNGaWxlID0gaXQucmVjc1tyZlZlcnNdO1xyXG4gICAgICAgICAgdGhpcy5kaXNwbGF5UmVjRmlsZSA9IHJlY2VudFJlY0ZpbGU7XHJcbiAgICAgICAgICB0aGlzLmRpc3BsYXlSZWNGaWxlVmVyc2lvbiA9IHJmVmVycztcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZGlzcGxheVJlY0ZpbGUgPSBudWxsO1xyXG4gICAgICAgICAgdGhpcy5kaXNwbGF5UmVjRmlsZVZlcnNpb24gPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoIXRlbXBvcmFyeSkge1xyXG4gICAgICAgIHRoaXMuc2hvd1JlY29yZGluZygpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKCF0aGlzLnJlYWRvbmx5KSB7XHJcbiAgICAgICAgdGhpcy5zdGFydFN0b3BTaWduYWxTdGF0ZSA9IFN0YXJ0U3RvcFNpZ25hbFN0YXRlLklETEU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlU3RhcnRBY3Rpb25EaXNhYmxlU3RhdGUoKVxyXG4gICAgdGhpcy51cGRhdGVOYXZpZ2F0aW9uQWN0aW9ucygpXHJcbiAgfVxyXG5cclxuXHJcbiAgc3RhcnQoKSB7XHJcbiAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgIHRoaXMuc3RhdHVzTXNnID0gJ1N0YXJ0aW5nIHNlc3Npb24uLi4nO1xyXG4gICAgdGhpcy5zdGF0dXNXYWl0aW5nPWZhbHNlO1xyXG4gICAgaWYodGhpcy5fc2Vzc2lvbikge1xyXG4gICAgICBpZiAodGhpcy5fc2Vzc2lvbi5zZWFsZWQpIHtcclxuICAgICAgICB0aGlzLnJlYWRvbmx5ID0gdHJ1ZVxyXG4gICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1Nlc3Npb24gc2VhbGVkISc7XHJcbiAgICAgICAgLy9sZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihTZXNzaW9uU2VhbGVkRGlhbG9nLCB7fSk7XHJcbiAgICAgICAgdGhpcy5kaWFsb2cub3BlbihNZXNzYWdlRGlhbG9nLCB7XHJcbiAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgICAgIHRpdGxlOiAnRXJyb3InLFxyXG4gICAgICAgICAgICBtc2c6IFwiVGhpcyBzZXNzaW9uIGlzIHNlYWxlZC4gUmVjb3JkaW5ncyBjYW5ub3QgYmUgYWRkZWQgYW55bW9yZS5cIixcclxuICAgICAgICAgICAgYWR2aXNlOiAnUGxlYXNlIGFzayB5b3VyIGV4cGVyaW1lbnRlciB3aGF0IHRvIGRvIChlLmcgc3RhcnQgYSBuZXcgc2Vzc2lvbikuJyxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgYm9keTogYW55ID0ge307XHJcbiAgICAgICAgaWYgKHRoaXMuX3Nlc3Npb24uc3RhdHVzID09PSBcIkNSRUFURURcIikge1xyXG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbi5zdGF0dXMgPSBcIkxPQURFRFwiO1xyXG4gICAgICAgICAgYm9keS5zdGF0dXMgPSB0aGlzLl9zZXNzaW9uLnN0YXR1cztcclxuICAgICAgICAgIGlmICghdGhpcy5fc2Vzc2lvbi5sb2FkZWREYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Nlc3Npb24ubG9hZGVkRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgIGJvZHkubG9hZGVkRGF0ZSA9IHRoaXMuX3Nlc3Npb24ubG9hZGVkRGF0ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbi5yZXN0YXJ0ZWREYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgIGJvZHkucmVzdGFydGVkRGF0ZSA9IHRoaXMuX3Nlc3Npb24ucmVzdGFydGVkRGF0ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXNzaW9uU2VydmljZS5wYXRjaFNlc3Npb25PYnNlcnZlcih0aGlzLl9zZXNzaW9uLCBib2R5KS5zdWJzY3JpYmUoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgYnJvd3NlciBjb21wYXRpYmlsaXR5XHJcbiAgICBpZih0aGlzLnVzZXJBZ2VudC5kZXRlY3RlZEJyb3dzZXI9PT1Ccm93c2VyLlNhZmFyaSAmJiB0aGlzLl9jaGFubmVsQ291bnQ+MSl7XHJcbiAgICAgIGxldCBlTXNnPVwiRXJyb3I6IFNhZmFyaSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgc3RlcmVvIHJlY29yZGluZ3MuXCI7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZU1zZyk7XHJcbiAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTWVzc2FnZURpYWxvZywge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgICB0aXRsZTogJ0Jyb3dzZXIgbm90IHN1cHBvcnRlZCcsXHJcbiAgICAgICAgICBtc2c6IGVNc2csXHJcbiAgICAgICAgICBhZHZpY2U6IFwiUGxlYXNlIHVzZSBhIHN1cHBvcnRlZCBicm93c2VyLCBlLmcuIE1vemlsbGEgRmlyZWZveC5cIlxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICAvL2NvbnNvbGUubG9nKFwiU2Vzc2lvbiBJRDogXCIrdGhpcy5fc2Vzc2lvbi5zZXNzaW9uKyBcIiBzdGF0dXM6IFwiK3RoaXMuX3Nlc3Npb24uc3RhdHVzKVxyXG4gICAgdGhpcy5fc2VsZWN0ZWREZXZpY2VJZD11bmRlZmluZWQ7XHJcblxyXG4gICAgaWYgKCF0aGlzLnJlYWRvbmx5ICYmIHRoaXMuYWMgJiYgKEZPUkNFX1JFUVVFU1RfQVVESU9fUEVSTUlTU0lPTlMgfHwgKHRoaXMuX2F1ZGlvRGV2aWNlcyAmJiB0aGlzLl9hdWRpb0RldmljZXMubGVuZ3RoID4gMCkpKSB7XHJcbiAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlcXVlc3RpbmcgYXVkaW8gcGVybWlzc2lvbnMuLi4nO1xyXG4gICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuXHJcbiAgICAgIHRoaXMuYWMuZGV2aWNlSW5mb3MoKG1kaXMpID0+IHtcclxuICAgICAgICBsZXQgYXVkaW9DYXB0dXJlRGV2aWNlQXZhaWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICBsZXQgYXVkaW9QbGF5RGV2aWNlQXZhaWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICBpZiAobWRpcykge1xyXG4gICAgICAgICAgaWYodGhpcy5hYykge1xyXG4gICAgICAgICAgICB0aGlzLmFjLnByaW50RGV2aWNlcyhtZGlzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChtZGlzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgbWRpaSA9IDA7IG1kaWkgPCBtZGlzLmxlbmd0aDsgbWRpaSsrKSB7XHJcbiAgICAgICAgICAgICAgbGV0IG1kaSA9IG1kaXNbbWRpaV07XHJcbiAgICAgICAgICAgICAgbGV0IGtpbmQ9bWRpLmtpbmQ7XHJcbiAgICAgICAgICAgICAgaWYoa2luZCA9PT0gXCJhdWRpb2lucHV0XCIpe1xyXG4gICAgICAgICAgICAgICAgYXVkaW9DYXB0dXJlRGV2aWNlQXZhaWw9dHJ1ZTtcclxuICAgICAgICAgICAgICB9ZWxzZSBpZihraW5kPT09IFwiYXVkaW9vdXRwdXRcIil7XHJcbiAgICAgICAgICAgICAgICBhdWRpb1BsYXlEZXZpY2VBdmFpbD10cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0aGlzLl9zZXNzaW9uICYmIHRoaXMuX3Nlc3Npb24udHlwZSAhPT0gJ1RFU1RfREVGX0EnICYmIHRoaXMuX2F1ZGlvRGV2aWNlcyAmJiB0aGlzLl9hdWRpb0RldmljZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgZmRpOiBNZWRpYURldmljZUluZm8gfCBudWxsID0gbnVsbDtcclxuICAgICAgICAgICAgZm9yIChsZXQgYWRJID0gMDsgYWRJIDwgdGhpcy5fYXVkaW9EZXZpY2VzLmxlbmd0aDsgYWRJKyspIHtcclxuICAgICAgICAgICAgICBsZXQgYWQgPSB0aGlzLl9hdWRpb0RldmljZXNbYWRJXTtcclxuICAgICAgICAgICAgICBpZiAoYWQucGxheWJhY2spIHtcclxuICAgICAgICAgICAgICAgIC8vIHByb2plY3QgYXVkaW8gZGV2aWNlIGNvbmZpZyBmb3IgcGxheWJhY2sgZGV2aWNlXHJcbiAgICAgICAgICAgICAgICAvLyBub3QgdXNlZCBmb3Igbm93XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgbWRpaSA9IDA7IG1kaWkgPCBtZGlzLmxlbmd0aDsgbWRpaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWRpID0gbWRpc1ttZGlpXTtcclxuICAgICAgICAgICAgICAgIGxldCBraW5kPW1kaS5raW5kO1xyXG4gICAgICAgICAgICAgICAgaWYoa2luZCA9PT0gXCJhdWRpb2lucHV0XCIpe1xyXG4gICAgICAgICAgICAgICAgICBhdWRpb0NhcHR1cmVEZXZpY2VBdmFpbD10cnVlO1xyXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoa2luZD09PSBcImF1ZGlvb3V0cHV0XCIpe1xyXG4gICAgICAgICAgICAgICAgICBhdWRpb1BsYXlEZXZpY2VBdmFpbD10cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGFkLnJlZ2V4KSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJNYXRjaD86IFxcJ1wiK21kaS5sYWJlbCtcIlxcJyBcXCdcIithZC5uYW1lK1wiXFwnXCIpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAobWRpLmxhYmVsLm1hdGNoKGFkLm5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmRpID0gbWRpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJNYXRjaCFcIik7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChtZGkubGFiZWwudHJpbSgpID09PSBhZC5uYW1lLnRyaW0oKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZkaSA9IG1kaTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGZkaSkge1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGZkaSkge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZmRpKSB7XHJcbiAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcgZGV2aWNlIGZvdW5kXHJcblxyXG4gICAgICAgICAgICAgIC8vIE5vdCBhYmxlIHRvIG9wZW4gZGV2aWNlIGhlcmUgc2luY2UgQ2hyb21lIDcxXHJcbiAgICAgICAgICAgICAgLy8gQ2hyb21lIDcxIHJlcXVpcmVzIGEgdXNlciBnZXN0dXJlIGJlZm9yZSB0aGUgQXVkaW9Db250ZXh0IGNhbiBiZSByZXN1bWVkXHJcbiAgICAgICAgICAgICAgLy8gc2Vzc2lvbm1hbmFnZXIudHM6NzEyIE9wZW4gc2Vzc2lvbiB3aXRoIGRlZmF1bHQgYXVkaW8gZGV2aWNlIGZvciAxIGNoYW5uZWxzXHJcbiAgICAgICAgICAgICAgLy8gY2FwdHVyZS50czoxMjggVGhlIEF1ZGlvQ29udGV4dCB3YXMgbm90IGFsbG93ZWQgdG8gc3RhcnQuIEl0IG11c3QgYmUgcmVzdW1lZCAob3IgY3JlYXRlZCkgYWZ0ZXIgYSB1c2VyIGdlc3R1cmUgb24gdGhlIHBhZ2UuIGh0dHBzOi8vZ29vLmdsLzdLN1dMdVxyXG4gICAgICAgICAgICAgIC8vIHB1c2guLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvYXVkaW8vY2FwdHVyZS9jYXB0dXJlLnRzLkF1ZGlvQ2FwdHVyZS5vcGVuIEAgY2FwdHVyZS50czoxMjhcclxuXHJcbiAgICAgICAgICAgICAgLy90aGlzLmFjLm9wZW4odGhpcy5fY2hhbm5lbENvdW50LCBmZGkuZGV2aWNlSWQpO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlNldCBzZWxlY3RlZCBhdWRpbyBkZXZpY2U6IFxcJ1wiICsgZmRpLmxhYmVsICsgXCJcXCcgSWQ6IFxcJ1wiICsgZmRpLmRldmljZUlkICsgXCJcXCdcIik7XHJcbiAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWREZXZpY2VJZCA9IGZkaS5kZXZpY2VJZDtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5lbmFibGVTdGFydFVzZXJHZXN0dXJlKClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBkZXZpY2Ugbm90IGZvdW5kXHJcbiAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnRVJST1I6IFJlcXVpcmVkIGF1ZGlvIGRldmljZSBub3QgYXZhaWxhYmxlISc7XHJcbiAgICAgICAgICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICAgICAgICAgIHRoaXMucmVhZG9ubHkgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKE1lc3NhZ2VEaWFsb2csIHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgICAgICAgICAgdGl0bGU6ICdSZXF1aXJlZCBhdWRpbyBkZXZpY2UnLFxyXG4gICAgICAgICAgICAgICAgICBtc2c6IFwiUmVxdWlyZWQgYXVkaW8gZGV2aWNlIG5vdCBmb3VuZFwiLFxyXG4gICAgICAgICAgICAgICAgICBhZHZpY2U6IFwiUGxlYXNlIGNvbm5lY3QgYSBzdWl0YWJsZSBhdWRpbyBkZXZpY2UgZm9yIHRoaXMgcHJvamVjdCBhbmQgcmV0cnkgKHByZXNzIHRoZSBicm93c2VyIHJlbG9hZCBidXR0b24pLlwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGlmKCFhdWRpb0NhcHR1cmVEZXZpY2VBdmFpbCAmJiAhYXVkaW9QbGF5RGV2aWNlQXZhaWwpe1xyXG4gICAgICAgICAgICAgIC8vIG5vIGRldmljZSBmb3VuZFxyXG4gICAgICAgICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ0VSUk9SOiBObyBhdWRpbyBkZXZpY2UgYXZhaWxhYmxlISc7XHJcbiAgICAgICAgICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnd2Fybic7XHJcbiAgICAgICAgICAgICAgLy90aGlzLnJlYWRvbmx5ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5kaWFsb2cub3BlbihNZXNzYWdlRGlhbG9nLCB7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuJyxcclxuICAgICAgICAgICAgICAgICAgdGl0bGU6ICdObyBhdWRpbyBkZXZpY2UnLFxyXG4gICAgICAgICAgICAgICAgICBtc2c6IFwiTm8gYXVkaW8gZGV2aWNlIGZvdW5kXCIsXHJcbiAgICAgICAgICAgICAgICAgIGFkdmljZTogXCJQbGVhc2UgY29ubmVjdCBhbiBhdWRpbyBkZXZpY2UgYW5kIHJldHJ5IChwcmVzcyB0aGUgYnJvd3NlciByZWxvYWQgYnV0dG9uKSBvciB0cnkgdG8gY29udGludWUgYW55d2F5LlwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5yZWFkb25seSAmJiAhYXVkaW9DYXB0dXJlRGV2aWNlQXZhaWwpIHtcclxuICAgICAgICAgICAgICAgIC8vIG5vIGRldmljZSBmb3VuZFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnV0FSTklORzogTm8gYXVkaW8gY2FwdHVyZSBkZXZpY2UgYXZhaWxhYmxlISc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICd3YXJuaW5nJztcclxuICAgICAgICAgICAgICAgIC8vdGhpcy5yZWFkb25seSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5kaWFsb2cub3BlbihNZXNzYWdlRGlhbG9nLCB7XHJcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycsXHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdObyBhdWRpbyBjYXB0dXJlIGRldmljZScsXHJcbiAgICAgICAgICAgICAgICAgICAgbXNnOiBcIk5vIGF1ZGlvIGNhcHR1cmUgZGV2aWNlIGZvdW5kXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgYWR2aWNlOiBcIlBsZWFzZSBjb25uZWN0IGFuIGF1ZGlvIGNhcHR1cmUgZGV2aWNlIGFuZCByZXRyeSAocHJlc3MgdGhlIGJyb3dzZXIgcmVsb2FkIGJ1dHRvbikgb3IgdHJ5IHRvIGNvbnRpbnVlIGFueXdheS5cIlxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvLyBTYWZhcmkgZG9lcyBub3QgbGlzdCBwbGF5YmFjayBkZXZpY2VzXHJcbiAgICAgICAgICAgICAgaWYgKCFhdWRpb1BsYXlEZXZpY2VBdmFpbCkge1xyXG4gICAgICAgICAgICAgICAgICAvLyBGaXJlZm94IGRvZXMgbm90IGVudW1lcmF0ZSBhdWRpb291dHB1dCBkZXZpY2VzXHJcbiAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBzaG93IHRoaXMgd2FybmluZywgYmVjYXVzZSBpdCB3b3VsZCBhbHdheXMgYXBwZWFyIG9uIEZpcmVmb3hcclxuICAgICAgICAgICAgICAgICAgLy8gV2hlbiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDk4NTEyIGlzIGZpeGVkIHRoZSB3YXJuaW5nIGNhbiBiZSBlbmFibGVkIGZvciBGaXJlZm94IGFzIHdlbGxcclxuXHJcbiAgICAgICAgICAgICAgICAgIC8vIEl0IGlzIGFscmVhZHkgaW1wbGVtbmV0ZWQgYnV0IGtlcHQgYmVoaW5kIGEgcHJlZmVyZW5jZSBzZXR0aW5nIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTExNTI0MDFcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAvLyBPdXRwdXQgZGV2aWNlcyBhcmUgbGlzdGVkIGlmIGFib3V0OmNvbmZpZyBtZWRpYS5zZXRzaW5raWQuZW5hYmxlZD10cnVlXHJcbiAgICAgICAgICAgICAgICAgIC8vIGJ1dCBkZWZhdWx0IHNldHRpbmcgaXMgZmFsc2VcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAvLyBTYW1lIHByb2JsZW0gd2l0aCBTYWZhcmlcclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMudXNlckFnZW50LmRldGVjdGVkQnJvd3Nlcj09PUJyb3dzZXIuU2FmYXJpIHx8IHRoaXMudXNlckFnZW50LmRldGVjdGVkQnJvd3Nlcj09PUJyb3dzZXIuRmlyZWZveCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGRldmljZSBmb3VuZFxyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnV0FSTklORzogTm8gYXVkaW8gcGxheWJhY2sgZGV2aWNlIGF2YWlsYWJsZSEnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnd2Fybic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMucmVhZG9ubHkgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTWVzc2FnZURpYWxvZywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm4nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ05vIGF1ZGlvIHBsYXliYWNrIGRldmljZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZzogXCJObyBhdWRpbyBwbGF5YmFjayBkZXZpY2UgZm91bmRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2aWNlOiBcIlBsZWFzZSBjb25uZWN0IGFuIGF1ZGlvIHBsYXliYWNrIGRldmljZSBhbmQgcmV0cnkgKHByZXNzIHRoZSBicm93c2VyIHJlbG9hZCBidXR0b24pIG9yIHRyeSB0byBjb250aW51ZSBhbnl3YXkuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIC8vIE5vdCBhYmxlIHRvIG9wZW4gZGV2aWNlIGhlcmUgc2luY2UgQ2hyb21lIDcxXHJcbiAgICAgICAgICAgICAgLy8gQ2hyb21lIDcxIHJlcXVpcmVzIGEgdXNlciBnZXN0dXJlIGJlZm9yZSB0aGUgQXVkaW9Db250ZXh0IGNhbiBiZSByZXN1bWVkXHJcbiAgICAgICAgICAgICAgLy8gc2Vzc2lvbm1hbmFnZXIudHM6NzEyIE9wZW4gc2Vzc2lvbiB3aXRoIGRlZmF1bHQgYXVkaW8gZGV2aWNlIGZvciAxIGNoYW5uZWxzXHJcbiAgICAgICAgICAgICAgLy8gY2FwdHVyZS50czoxMjggVGhlIEF1ZGlvQ29udGV4dCB3YXMgbm90IGFsbG93ZWQgdG8gc3RhcnQuIEl0IG11c3QgYmUgcmVzdW1lZCAob3IgY3JlYXRlZCkgYWZ0ZXIgYSB1c2VyIGdlc3R1cmUgb24gdGhlIHBhZ2UuIGh0dHBzOi8vZ29vLmdsLzdLN1dMdVxyXG4gICAgICAgICAgICAgIC8vIHB1c2guLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvYXVkaW8vY2FwdHVyZS9jYXB0dXJlLnRzLkF1ZGlvQ2FwdHVyZS5vcGVuIEAgY2FwdHVyZS50czoxMjhcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiT3BlbiBzZXNzaW9uIHdpdGggZGVmYXVsdCBhdWRpbyBkZXZpY2UgZm9yIFwiK3RoaXMuX2NoYW5uZWxDb3VudCtcIiBjaGFubmVsc1wiKTtcclxuICAgICAgICAgICAgICAvL3RoaXMuYWMub3Blbih0aGlzLl9jaGFubmVsQ291bnQpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBlbmFibGUgc3RhcnQgZ2VzdHVyZSBhbnl3YXlcclxuICAgICAgICAgICAgICB0aGlzLmVuYWJsZVN0YXJ0VXNlckdlc3R1cmUoKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5wcm9tcHRJdGVtQ291bnQ+MCkge1xyXG4gICAgICB0aGlzLnByb21wdEluZGV4ID0gMDtcclxuICAgIH1cclxuICAgIHRoaXMuZW5hYmxlTmF2aWdhdGlvbigpXHJcbiAgfVxyXG5cclxuICBpc1JlY29yZGluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodGhpcy5zdGF0dXMgPT09IFN0YXR1cy5QUkVfUkVDT1JESU5HIHx8IHRoaXMuc3RhdHVzID09PSBTdGF0dXMuUkVDT1JESU5HKTtcclxuICB9XHJcblxyXG4gIGlzQWN0aXZlKCk6IGJvb2xlYW57XHJcbiAgICByZXR1cm4gKCEodGhpcy5zdGF0dXMgPT09IFN0YXR1cy5CTE9DS0VEIHx8IHRoaXMuc3RhdHVzPT09IFN0YXR1cy5JRExFIHx8IHRoaXMuc3RhdHVzPT09U3RhdHVzLkVSUk9SKSB8fCB0aGlzLnByb2Nlc3NpbmdSZWNvcmRpbmcgfHwgdGhpcy5zZXNzaW9uU2VydmljZS51cGxvYWRDb3VudD4wKVxyXG4gIH1cclxuXHJcbiAgICBwcmV2SXRlbSgpIHtcclxuICAgICAgIGxldCBuZXdQcklkeD10aGlzLl9wcm9tcHRJbmRleDtcclxuICAgICAgIG5ld1BySWR4LS07XHJcbiAgICAgICBpZihuZXdQcklkeDwwKXtcclxuICAgICAgICAgbmV3UHJJZHg9dGhpcy5wcm9tcHRJdGVtQ291bnQtMTtcclxuICAgICAgIH1cclxuICAgICAgIHRoaXMucHJvbXB0SW5kZXg9bmV3UHJJZHg7XHJcbiAgICAgIC8vdGhpcy51cGRhdGVOYXZpZ2F0aW9uQWN0aW9ucygpXHJcbiAgICB9XHJcblxyXG5cclxuICBuZXh0SXRlbSgpIHtcclxuICAgIGxldCBuZXdQcklkeD10aGlzLl9wcm9tcHRJbmRleDtcclxuICAgIG5ld1BySWR4Kys7XHJcbiAgICBpZihuZXdQcklkeD49dGhpcy5wcm9tcHRJdGVtQ291bnQpe1xyXG4gICAgICBuZXdQcklkeD0wO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wcm9tcHRJbmRleD1uZXdQcklkeDtcclxuICAgIC8vdGhpcy51cGRhdGVOYXZpZ2F0aW9uQWN0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVOYXZpZ2F0aW9uQWN0aW9ucygpe1xyXG4gICAgbGV0IGZ3ZE54dEFjdGlvbkRpc2FibGVkPXRydWU7XHJcbiAgICBpZih0aGlzLml0ZW1zKXtcclxuICAgICAgbGV0IGN1cnJSZWNzPXRoaXMuaXRlbXNbdGhpcy5fcHJvbXB0SW5kZXhdLnJlY3M7XHJcbiAgICAgIGZ3ZE54dEFjdGlvbkRpc2FibGVkPSAhIChjdXJyUmVjcyE9bnVsbCAmJiBjdXJyUmVjcy5sZW5ndGg+MCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkTmV4dEFjdGlvbi5kaXNhYmxlZCA9IHRoaXMubmF2aWdhdGlvbkRpc2FibGVkIHx8IGZ3ZE54dEFjdGlvbkRpc2FibGVkO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZEFjdGlvbi5kaXNhYmxlZCA9IHRoaXMubmF2aWdhdGlvbkRpc2FibGVkO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5kaXNhYmxlZCA9IHRoaXMubmF2aWdhdGlvbkRpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgbmV4dFVucmVjb3JkZWRJdGVtKCkge1xyXG4gICAgbGV0IG5ld1BySWR4ID0gdGhpcy5fcHJvbXB0SW5kZXg7XHJcbiAgICBuZXdQcklkeCsrO1xyXG4gICAgaWYgKG5ld1BySWR4ID49IHRoaXMucHJvbXB0SXRlbUNvdW50KSB7XHJcbiAgICAgIG5ld1BySWR4ID0gMDtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuaXRlbXMhPW51bGwpIHtcclxuICAgICAgbGV0IGl0UmVjcz10aGlzLml0ZW1zW25ld1BySWR4XS5yZWNzO1xyXG4gICAgICB3aGlsZSAoaXRSZWNzIT1udWxsICYmIChpdFJlY3MubGVuZ3RoID4gMCkgJiYgbmV3UHJJZHggPCB0aGlzLnByb21wdEl0ZW1Db3VudCkge1xyXG4gICAgICAgIG5ld1BySWR4Kys7XHJcbiAgICAgICAgaXRSZWNzPXRoaXMuaXRlbXNbbmV3UHJJZHhdLnJlY3M7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFpdFJlY3MgfHwgaXRSZWNzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgdGhpcy5wcm9tcHRJbmRleCA9IG5ld1BySWR4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBlbmFibGVTdGFydFVzZXJHZXN0dXJlKCkge1xyXG4gICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnaW5mbyc7XHJcbiAgICB0aGlzLnN0YXR1c01zZyA9ICdSZWFkeS4nO1xyXG4gICAgLy90aGlzLnVwZGF0ZVN0YXJ0QWN0aW9uRGlzYWJsZVN0YXRlKClcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5kaXNhYmxlZD0hKHRoaXMuYWMgJiYgdGhpcy5pc1JlY29yZGluZ0l0ZW0oKSk7XHJcblxyXG4gIH1cclxuXHJcbiAgZW5hYmxlTmF2aWdhdGlvbigpe1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uRGlzYWJsZWQ9ZmFsc2U7XHJcbiAgICB0aGlzLnVwZGF0ZU5hdmlnYXRpb25BY3Rpb25zKCk7XHJcbiAgfVxyXG5cclxuICBvcGVuZWQoKSB7XHJcbiAgICAvLyB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgIC8vIHRoaXMuc3RhdHVzTXNnID0gJ1JlYWR5Lic7XHJcbiAgICAvLyB0aGlzLnVwZGF0ZVN0YXJ0QWN0aW9uRGlzYWJsZVN0YXRlKClcclxuICAgIC8vIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZVxyXG4gICAgLy8gdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlXHJcbiAgICBpZih0aGlzLmFjKSB7XHJcbiAgICAgIHRoaXMuYWMuc3RhcnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXJ0ZWQoKSB7XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5QUkVfUkVDT1JESU5HO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RhcnRTdG9wU2lnbmFsU3RhdGUgPSBTdGFydFN0b3BTaWduYWxTdGF0ZS5QUkVSRUNPUkRJTkc7XHJcbiAgICBpZih0aGlzLl9zZXNzaW9uKSB7XHJcbiAgICAgIGlmICh0aGlzLl9zZXNzaW9uLnN0YXR1cyA9PT0gXCJMT0FERURcIikge1xyXG4gICAgICAgIGxldCBib2R5OiBhbnkgPSB7fTtcclxuICAgICAgICBpZiAodGhpcy5zZWN0aW9uLnRyYWluaW5nKSB7XHJcbiAgICAgICAgICB0aGlzLl9zZXNzaW9uLnN0YXR1cyA9IFwiU1RBUlRFRF9UUkFJTklOR1wiXHJcbiAgICAgICAgICBib2R5LnN0YXR1cyA9IHRoaXMuX3Nlc3Npb24uc3RhdHVzO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLl9zZXNzaW9uLnN0YXJ0ZWRUcmFpbmluZ0RhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbi5zdGFydGVkVHJhaW5pbmdEYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgYm9keS5zdGFydGVkVHJhaW5pbmdEYXRlID0gdGhpcy5fc2Vzc2lvbi5zdGFydGVkVHJhaW5pbmdEYXRlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9zZXNzaW9uLnN0YXR1cyA9IFwiU1RBUlRFRFwiXHJcbiAgICAgICAgICBib2R5LnN0YXR1cyA9IHRoaXMuX3Nlc3Npb24uc3RhdHVzO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLl9zZXNzaW9uLnN0YXJ0ZWREYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Nlc3Npb24uc3RhcnRlZERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBib2R5LnN0YXJ0ZWREYXRlID0gdGhpcy5fc2Vzc2lvbi5zdGFydGVkRGF0ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXNzaW9uU2VydmljZS5wYXRjaFNlc3Npb25PYnNlcnZlcih0aGlzLl9zZXNzaW9uLCBib2R5KS5zdWJzY3JpYmUoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZWN0aW9uLnByb21wdHBoYXNlID09PSAnUFJFUkVDT1JESU5HJykge1xyXG4gICAgICB0aGlzLmFwcGx5UHJvbXB0KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZy4uLic7XHJcblxyXG4gICAgbGV0IHByZURlbGF5ID0gREVGQVVMVF9QUkVfUkVDX0RFTEFZO1xyXG4gICAgaWYgKHRoaXMucHJvbXB0SXRlbS5wcmVyZWNvcmRpbmcpIHtcclxuICAgICAgcHJlRGVsYXkgPSB0aGlzLnByb21wdEl0ZW0ucHJlcmVjb3JkaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBwb3N0RGVsYXk9REVGQVVMVF9QT1NUX1JFQ19ERUxBWTtcclxuICAgIGlmKHRoaXMucHJvbXB0SXRlbS5wb3N0cmVjb3JkaW5nKXtcclxuICAgICAgcG9zdERlbGF5PXRoaXMucHJvbXB0SXRlbS5wb3N0cmVjb3JkaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBtYXhSZWNvcmRpbmdUaW1lTXMgPSBNQVhfUkVDT1JESU5HX1RJTUVfTVM7XHJcbiAgICBpZiAodGhpcy5wcm9tcHRJdGVtLnJlY2R1cmF0aW9uKSB7XHJcbiAgICAgIG1heFJlY29yZGluZ1RpbWVNcyA9IHByZURlbGF5K3RoaXMucHJvbXB0SXRlbS5yZWNkdXJhdGlvbitwb3N0RGVsYXk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1heFJlY1RpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc3RvcFJlY29yZGluZ01heFJlYygpXHJcbiAgICB9LCBtYXhSZWNvcmRpbmdUaW1lTXMpO1xyXG4gICAgdGhpcy5tYXhSZWNUaW1lclJ1bm5pbmcgPSB0cnVlO1xyXG5cclxuXHJcblxyXG4gICAgdGhpcy5wcmVSZWNUaW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG5cclxuICAgICAgdGhpcy5wcmVSZWNUaW1lclJ1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuUkVDT1JESU5HO1xyXG4gICAgICB0aGlzLnN0YXJ0U3RvcFNpZ25hbFN0YXRlID0gU3RhcnRTdG9wU2lnbmFsU3RhdGUuUkVDT1JESU5HO1xyXG4gICAgICBpZiAodGhpcy5zZWN0aW9uLm1vZGUgPT09ICdBVVRPUkVDT1JESU5HJykge1xyXG4gICAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5zZWN0aW9uLnByb21wdHBoYXNlID09PSAnUkVDT1JESU5HJykge1xyXG4gICAgICAgIHRoaXMuYXBwbHlQcm9tcHQoKTtcclxuICAgICAgfVxyXG4gICAgfSwgcHJlRGVsYXkpO1xyXG4gICAgdGhpcy5wcmVSZWNUaW1lclJ1bm5pbmcgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgc3RvcEl0ZW0oKSB7XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5QT1NUX1JFQ19TVE9QO1xyXG4gICAgdGhpcy5zdGFydFN0b3BTaWduYWxTdGF0ZSA9IFN0YXJ0U3RvcFNpZ25hbFN0YXRlLlBPU1RSRUNPUkRJTkc7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICBsZXQgcG9zdERlbGF5ID0gNTAwO1xyXG4gICAgaWYgKHRoaXMucHJvbXB0SXRlbS5wb3N0cmVjb3JkaW5nKSB7XHJcbiAgICAgIHBvc3REZWxheSA9IHRoaXMucHJvbXB0SXRlbS5wb3N0cmVjb3JkaW5nO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wb3N0UmVjVGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5wb3N0UmVjVGltZXJSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlNUT1BQSU5HX1NUT1A7XHJcbiAgICAgIHRoaXMuc3RvcFJlY29yZGluZygpO1xyXG4gICAgfSwgcG9zdERlbGF5KTtcclxuICAgIHRoaXMucG9zdFJlY1RpbWVyUnVubmluZyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwYXVzZUl0ZW0oKSB7XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5QT1NUX1JFQ19QQVVTRTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnN0YXJ0U3RvcFNpZ25hbFN0YXRlID0gU3RhcnRTdG9wU2lnbmFsU3RhdGUuUE9TVFJFQ09SRElORztcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICBsZXQgcG9zdERlbGF5ID0gNTAwO1xyXG4gICAgaWYgKHRoaXMucHJvbXB0SXRlbS5wb3N0cmVjb3JkaW5nKSB7XHJcbiAgICAgIHBvc3REZWxheSA9IHRoaXMucHJvbXB0SXRlbS5wb3N0cmVjb3JkaW5nO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICB0aGlzLnBvc3RSZWNUaW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnBvc3RSZWNUaW1lclJ1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuU1RPUFBJTkdfUEFVU0U7XHJcbiAgICAgIHRoaXMuc3RvcFJlY29yZGluZygpO1xyXG4gICAgfSwgcG9zdERlbGF5KTtcclxuICAgIHRoaXMucG9zdFJlY1RpbWVyUnVubmluZyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBzdG9wUmVjb3JkaW5nKCkge1xyXG4gICAgaWYgKHRoaXMubWF4UmVjVGltZXJSdW5uaW5nKSB7XHJcbiAgICAgIGlmKHRoaXMubWF4UmVjVGltZXJJZCkge1xyXG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5tYXhSZWNUaW1lcklkKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLm1heFJlY1RpbWVyUnVubmluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5hYykge1xyXG4gICAgICB0aGlzLmFjLnN0b3AoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0b3BSZWNvcmRpbmdNYXhSZWMoKXtcclxuICAgIGlmKHRoaXMucG9zdFJlY1RpbWVyUnVubmluZyl7XHJcbiAgICAgIGlmKHRoaXMucG9zdFJlY1RpbWVySWQpIHtcclxuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMucG9zdFJlY1RpbWVySWQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucG9zdFJlY1RpbWVyUnVubmluZz1mYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMubWF4UmVjVGltZXJSdW5uaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5TVE9QUElOR19TVE9QO1xyXG4gICAgaWYodGhpcy5hYykge1xyXG4gICAgICB0aGlzLmFjLnN0b3AoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZFJlY29yZGluZ0ZpbGVCeURlc2NyaXB0b3IocmZkOlJlY29yZGluZ0ZpbGVEZXNjcmlwdG9ySW1wbCl7XHJcbiAgICBpZihyZmQucmVjb3JkaW5nICYmIHJmZC5yZWNvcmRpbmcuaXRlbWNvZGUpIHtcclxuICAgICAgbGV0IHBySWR4ID0gdGhpcy5wcm9tcHRJbmRleEJ5SXRlbWNvZGUocmZkLnJlY29yZGluZy5pdGVtY29kZSk7XHJcbiAgICAgIGlmICh0aGlzLml0ZW1zIT1udWxsICYmIHBySWR4ICE9PSBudWxsKSB7XHJcbiAgICAgICAgbGV0IGl0ID0gdGhpcy5pdGVtc1twcklkeF07XHJcbiAgICAgICAgaWYgKGl0ICYmIHRoaXMuX3Nlc3Npb24pIHtcclxuICAgICAgICAgIGlmICghaXQucmVjcykge1xyXG4gICAgICAgICAgICBpdC5yZWNzID0gbmV3IEFycmF5PFNwclJlY29yZGluZ0ZpbGU+KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgcmYgPSBuZXcgU3ByUmVjb3JkaW5nRmlsZSh0aGlzLl9zZXNzaW9uLnNlc3Npb25JZCwgcmZkLnJlY29yZGluZy5pdGVtY29kZSwgcmZkLnZlcnNpb24sIG51bGwpO1xyXG4gICAgICAgICAgaXQucmVjc1tyZmQudmVyc2lvbl0gPSByZjtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIldBUk46IE5vIHJlY29yZGluZyBpdGVtIHdpdGggY29kZTogXFxcIlwiICtyZmQucmVjb3JkaW5nLml0ZW1jb2RlKyBcIlxcXCIgZm91bmQuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJXQVJOOiBObyByZWNvcmRpbmcgaXRlbSB3aXRoIGNvZGU6IFxcXCJcIiArcmZkLnJlY29yZGluZy5pdGVtY29kZSsgXCJcXFwiIGZvdW5kLlwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkUmVjb3JkaW5nRmlsZUJ5UHJvbXB0SW5kZXgocHJvbXB0SW5kZXg6bnVtYmVyLCByZjpTcHJSZWNvcmRpbmdGaWxlKXtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgc3RvcHBlZCgpIHtcclxuICAgIHRoaXMudXBkYXRlU3RhcnRBY3Rpb25EaXNhYmxlU3RhdGUoKVxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2luZm8nO1xyXG4gICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkZWQuJztcclxuICAgIHRoaXMuc3RhcnRTdG9wU2lnbmFsU3RhdGUgPSBTdGFydFN0b3BTaWduYWxTdGF0ZS5JRExFO1xyXG5cclxuICAgIGxldCBhZCA9IG51bGw7XHJcbiAgICBpZih0aGlzLmFjIT1udWxsKXtcclxuICAgICAgYWQ9dGhpcy5hYy5hdWRpb0J1ZmZlcigpO1xyXG4gICAgfVxyXG4gICAgbGV0IGljID0gdGhpcy5wcm9tcHRJdGVtLml0ZW1jb2RlO1xyXG4gICAgbGV0IHJmPW51bGw7XHJcbiAgICBpZiAodGhpcy5fc2Vzc2lvbiAmJiBpYykge1xyXG4gICAgICBsZXQgc2Vzc0lkOiBzdHJpbmcgfCBudW1iZXIgPSB0aGlzLl9zZXNzaW9uLnNlc3Npb25JZDtcclxuICAgICAgbGV0IGNwSWR4ID0gdGhpcy5wcm9tcHRJbmRleDtcclxuICAgICAgaWYgKHRoaXMuaXRlbXMpIHtcclxuICAgICAgICBsZXQgaXQ9dGhpcy5pdGVtc1tjcElkeF07XHJcbiAgICAgICAgaWYgKCFpdC5yZWNzKSB7XHJcbiAgICAgICAgICBpdC5yZWNzID0gbmV3IEFycmF5PFNwclJlY29yZGluZ0ZpbGU+KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJmID0gbmV3IFNwclJlY29yZGluZ0ZpbGUoc2Vzc0lkLCBpYywgaXQucmVjcy5sZW5ndGgsIGFkKTtcclxuICAgICAgICBpdC5yZWNzLnB1c2gocmYpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmVuYWJsZVVwbG9hZFJlY29yZGluZ3MpIHtcclxuICAgICAgICAvLyBUT0RPIHVzZSBTcGVlY2hSZWNvcmRlcmNvbmZpZyByZXNwLiBSZWNmaWxlU2VydmljZVxyXG4gICAgICAgIC8vIGNvbnZlcnQgYXN5bmNocm9ub3VzbHkgdG8gMTYtYml0IGludGVnZXIgUENNXHJcbiAgICAgICAgLy8gVE9ETyBjb3VsZCB3ZSBhdm9pZCBjb252ZXJzaW9uIHRvIHNhdmUgQ1BVIHJlc291cmNlcyBhbmQgdHJhbnNmZXIgZmxvYXQgUENNIGRpcmVjdGx5P1xyXG4gICAgICAgIC8vIFRPRE8gZHVwbGljYXRlIGNvbnZlcnNpb24gZm9yIG1hbnVhbCBkb3dubG9hZFxyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCJCdWlsZCB3YXYgd3JpdGVyLi4uXCIpO1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc2luZ1JlY29yZGluZz10cnVlXHJcbiAgICAgICAgaWYoYWQgJiYgcmYpIHtcclxuICAgICAgICAgIGxldCB3dyA9IG5ldyBXYXZXcml0ZXIoKTtcclxuICAgICAgICAgIC8vbmV3IFJFU1QgQVBJIFVSTFxyXG4gICAgICAgICAgbGV0IGFwaUVuZFBvaW50ID0gJyc7XHJcbiAgICAgICAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuYXBpRW5kUG9pbnQpIHtcclxuICAgICAgICAgICAgYXBpRW5kUG9pbnQgPSB0aGlzLmNvbmZpZy5hcGlFbmRQb2ludDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChhcGlFbmRQb2ludCAhPT0gJycpIHtcclxuICAgICAgICAgICAgYXBpRW5kUG9pbnQgPSBhcGlFbmRQb2ludCArICcvJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IHNlc3Npb25zVXJsID0gYXBpRW5kUG9pbnQgKyBTZXNzaW9uU2VydmljZS5TRVNTSU9OX0FQSV9DVFg7XHJcbiAgICAgICAgICBsZXQgcmVjVXJsOiBzdHJpbmcgPSBzZXNzaW9uc1VybCArICcvJyArIHJmLnNlc3Npb24gKyAnLycgKyBSRUNGSUxFX0FQSV9DVFggKyAnLycgKyByZi5pdGVtQ29kZTtcclxuICAgICAgICAgIHd3LndyaXRlQXN5bmMoYWQsICh3YXZGaWxlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucG9zdFJlY29yZGluZyh3YXZGaWxlLCByZWNVcmwpO1xyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NpbmdSZWNvcmRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2hlY2sgY29tcGxldGUgc2Vzc2lvblxyXG4gICAgbGV0IGNvbXBsZXRlID0gdHJ1ZTtcclxuICAgIGlmKHRoaXMuaXRlbXMpIHtcclxuICAgICAgLy8gc2VhcmNoIGJhY2t3YXJkcywgdG8gZ2FpbiBmYXN0ZXIgZGV0ZWN0aW9uIG9mIGluY29tcGxldGUgc3RhdGVcclxuICAgICAgZm9yIChsZXQgcmkgPSB0aGlzLml0ZW1zLmxlbmd0aCAtIDE7IHJpID49IDA7IHJpLS0pIHtcclxuICAgICAgICBsZXQgaXQgPSB0aGlzLml0ZW1zW3JpXTtcclxuICAgICAgICBpZiAoaXQucmVjb3JkaW5nICYmICFpdC50cmFpbmluZyAmJiAoIWl0LnJlY3MgfHwgaXQucmVjcy5sZW5ndGggPT0gMCkpIHtcclxuICAgICAgICAgIGNvbXBsZXRlID0gZmFsc2U7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgYXV0b1N0YXJ0ID0gKHRoaXMuc3RhdHVzID09PSBTdGF0dXMuU1RPUFBJTkdfU1RPUCk7XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5JRExFO1xyXG4gICAgbGV0IHN0YXJ0TmV4dD1mYWxzZTtcclxuICAgIGlmIChjb21wbGV0ZSkge1xyXG4gICAgICBpZih0aGlzLl9zZXNzaW9uIT1udWxsKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9zZXNzaW9uLnNlYWxlZCAmJiB0aGlzLl9zZXNzaW9uLnN0YXR1cyAhPT0gXCJDT01QTEVURURcIikge1xyXG4gICAgICAgICAgbGV0IGJvZHk6IGFueSA9IHt9XHJcbiAgICAgICAgICB0aGlzLl9zZXNzaW9uLnN0YXR1cyA9IFwiQ09NUExFVEVEXCI7XHJcbiAgICAgICAgICBib2R5LnN0YXR1cyA9IHRoaXMuX3Nlc3Npb24uc3RhdHVzO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLl9zZXNzaW9uLmNvbXBsZXRlZERhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbi5jb21wbGV0ZWREYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgYm9keS5jb21wbGV0ZWREYXRlID0gdGhpcy5fc2Vzc2lvbi5jb21wbGV0ZWREYXRlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zZXNzaW9uU2VydmljZS5wYXRjaFNlc3Npb25PYnNlcnZlcih0aGlzLl9zZXNzaW9uLCBib2R5KS5zdWJzY3JpYmUoKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnN0YXR1c01zZyA9ICdTZXNzaW9uIGNvbXBsZXRlISc7XHJcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFNlc3Npb25GaW5pc2hlZERpYWxvZywge30pO1xyXG5cclxuICAgICAgLy8gZW5hYmxlIG5hdmlnYXRpb25cclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlXHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5id2RBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZVxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIGlmICh0aGlzLnNlY3Rpb24ubW9kZSA9PT0gJ0FVVE9QUk9HUkVTUycgfHwgdGhpcy5zZWN0aW9uLm1vZGUgPT09ICdBVVRPUkVDT1JESU5HJykge1xyXG4gICAgICAgIHRoaXMubmV4dEl0ZW0oKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuc2VjdGlvbi5tb2RlID09PSAnQVVUT1JFQ09SRElORycgJiYgdGhpcy5hdXRvcmVjb3JkaW5nICYmIGF1dG9TdGFydCkge1xyXG4gICAgICAgIHN0YXJ0TmV4dD10cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy51cGRhdGVOYXZpZ2F0aW9uQWN0aW9ucygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBhcHBseSByZWNvcmRlZCBpdGVtXHJcbiAgICB0aGlzLmFwcGx5SXRlbShzdGFydE5leHQpO1xyXG4gICAgaWYoc3RhcnROZXh0KXtcclxuICAgICAgdGhpcy5zdGFydEl0ZW0oKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcG9zdFJlY29yZGluZyh3YXZGaWxlOiBVaW50OEFycmF5LCByZWNVcmw6IHN0cmluZykge1xyXG4gICAgbGV0IHdhdkJsb2IgPSBuZXcgQmxvYihbd2F2RmlsZV0sIHt0eXBlOiAnYXVkaW8vd2F2J30pO1xyXG4gICAgbGV0IHVsID0gbmV3IFVwbG9hZCh3YXZCbG9iLCByZWNVcmwpO1xyXG4gICAgdGhpcy51cGxvYWRlci5xdWV1ZVVwbG9hZCh1bCk7XHJcbiAgfVxyXG5cclxuICBzdG9wKCkge1xyXG4gICAgaWYodGhpcy5hYyE9bnVsbCl7XHJcbiAgICAgIHRoaXMuYWMuY2xvc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQ29udHJvbFBsYXliYWNrUG9zaXRpb24oKSB7XHJcbiAgICBpZiAodGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLnBsYXlQb3NpdGlvbkZyYW1lcykge1xyXG4gICAgICB0aGlzLnByb21wdGluZy5hdWRpb0Rpc3BsYXkucGxheUZyYW1lUG9zaXRpb24gPSB0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIucGxheVBvc2l0aW9uRnJhbWVzO1xyXG4gICAgICB0aGlzLmxpdmVMZXZlbERpc3BsYXkucGxheUZyYW1lUG9zaXRpb24gPSB0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIucGxheVBvc2l0aW9uRnJhbWVzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXVkaW9QbGF5ZXJVcGRhdGUoZTogQXVkaW9QbGF5ZXJFdmVudCkge1xyXG4gICAgaWYgKEV2ZW50VHlwZS5SRUFEWSA9PT0gZS50eXBlKSB7XHJcblxyXG4gICAgfSBlbHNlIGlmIChFdmVudFR5cGUuU1RBUlRFRCA9PT0gZS50eXBlKSB7XHJcbiAgICAgIC8vdGhpcy5zdGF0dXMgPSAnUGxheWJhY2suLi4nO1xyXG4gICAgICB0aGlzLnVwZGF0ZVRpbWVySWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy51cGRhdGVDb250cm9sUGxheWJhY2tQb3NpdGlvbigpLCA1MCk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChFdmVudFR5cGUuRU5ERUQgPT09IGUudHlwZSkge1xyXG4gICAgICAvLy5zdGF0dXM9J1JlYWR5Lic7XHJcbiAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMudXBkYXRlVGltZXJJZCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGlmKCF0aGlzLmRlc3Ryb3llZCkge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGNsb3NlZCgpIHtcclxuICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2luZm8nO1xyXG4gICAgdGhpcy5zdGF0dXNNc2cgPSAnU2Vzc2lvbiBjbG9zZWQuJztcclxuICB9XHJcblxyXG5cclxuICBlcnJvcihtc2c9J0FuIHVua25vd24gZXJyb3Igb2NjdXJlZCBkdXJpbmcgcmVjb3JkaW5nLicsYWR2aWNlOnN0cmluZz0nUGxlYXNlIHJldHJ5LicpIHtcclxuICAgIHRoaXMuc3RhdHVzTXNnID0gJ0VSUk9SOiBSZWNvcmRpbmcuJztcclxuICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgIHRoaXMuZGlhbG9nLm9wZW4oTWVzc2FnZURpYWxvZywge1xyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgdHlwZTogJ2Vycm9yJyxcclxuICAgICAgICB0aXRsZTogJ1JlY29yZGluZyBlcnJvcicsXHJcbiAgICAgICAgbXNnOiBtc2csXHJcbiAgICAgICAgYWR2aWNlOiBhZHZpY2VcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG4iXX0=
1014
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbm1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9zZXNzaW9ubWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsWUFBWSxFQUF1QixNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBZ0MsU0FBUyxFQUFDLE1BQU0sNkJBQTZCLENBQUE7QUFDcEYsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDRCQUE0QixDQUFBO0FBQ3BELE9BQU8sRUFBb0IsY0FBYyxFQUFrQixNQUFNLGtCQUFrQixDQUFDO0FBQ3BGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBOEIsTUFBTSxjQUFjLENBQUE7QUFDMUUsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzFDLE9BQU8sRUFHTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUlqRCxPQUFPLEVBQUMscUJBQXFCLEVBQXVCLE1BQU0sa0JBQWtCLENBQUM7QUFDN0UsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEVBQUMsb0NBQW9DLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2hELE9BQU8sRUFBQyxJQUFJ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QztTQUUxQztRQUVELElBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUMxQztJQUVILENBQUM7OzJHQTc3QlUsY0FBYyx5TUFzREwscUJBQXFCOytGQXREOUIsY0FBYywyTkF4RWQsQ0FBQyxjQUFjLENBQUMscUVBK0VoQixTQUFTLGlHQUNULFFBQVEscUZBL0VUOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Q1Q7MkZBMEJVLGNBQWM7a0JBMUUxQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx5QkFBeUI7b0JBQ25DLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQztvQkFDM0IsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Q1Q7b0JBQ0QsTUFBTSxFQUFFLENBQUM7Ozs7Ozs7Ozs7O0lBV1AsRUFBQzs7OztNQUlDLEVBQUM7O0lBRUgsRUFBQzs7Ozs7O0lBTUQsQ0FBQztpQkFDSjs7MEJBdURjLE1BQU07MkJBQUMscUJBQXFCOzRDQXBEaEMsV0FBVztzQkFBbkIsS0FBSztnQkFLa0MsU0FBUztzQkFBaEQsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNDLGdCQUFnQjtzQkFBdEQsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUU1QixTQUFTO3NCQUFqQixLQUFLO2dCQTZKTixVQUFVO3NCQURULFlBQVk7dUJBQUMsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBUzNDLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXVkaW9DYXB0dXJlLCBBdWRpb0NhcHR1cmVMaXN0ZW5lcn0gZnJvbSAnLi4vLi4vYXVkaW8vY2FwdHVyZS9jYXB0dXJlJztcclxuaW1wb3J0IHtBdWRpb1BsYXllciwgQXVkaW9QbGF5ZXJFdmVudCwgRXZlbnRUeXBlfSBmcm9tICcuLi8uLi9hdWRpby9wbGF5YmFjay9wbGF5ZXInXHJcbmltcG9ydCB7V2F2V3JpdGVyfSBmcm9tICcuLi8uLi9hdWRpby9pbXBsL3dhdndyaXRlcidcclxuaW1wb3J0IHtHcm91cCwgUHJvbXB0SXRlbSwgUHJvbXB0aXRlbVV0aWwsIFNjcmlwdCwgU2VjdGlvbn0gZnJvbSAnLi4vc2NyaXB0L3NjcmlwdCc7XHJcbmltcG9ydCB7U3ByUmVjb3JkaW5nRmlsZSwgUmVjb3JkaW5nRmlsZURlc2NyaXB0b3JJbXBsfSBmcm9tICcuLi9yZWNvcmRpbmcnXHJcbmltcG9ydCB7VXBsb2FkfSBmcm9tICcuLi8uLi9uZXQvdXBsb2FkZXInO1xyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIFJlbmRlcmVyMixcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1Nlc3Npb25TZXJ2aWNlfSBmcm9tIFwiLi9zZXNzaW9uLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtTdGF0ZSBhcyBTdGFydFN0b3BTaWduYWxTdGF0ZX0gZnJvbSBcIi4uL3N0YXJ0c3RvcHNpZ25hbC9zdGFydHN0b3BzaWduYWxcIjtcclxuaW1wb3J0IHtNYXREaWFsb2d9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2dcIjtcclxuaW1wb3J0IHtTcGVlY2hSZWNvcmRlclVwbG9hZGVyfSBmcm9tIFwiLi4vc3BydXBsb2FkZXJcIjtcclxuaW1wb3J0IHtTUEVFQ0hSRUNPUkRFUl9DT05GSUcsIFNwZWVjaFJlY29yZGVyQ29uZmlnfSBmcm9tIFwiLi4vLi4vc3ByLmNvbmZpZ1wiO1xyXG5pbXBvcnQge1Byb21wdGluZ30gZnJvbSBcIi4vcHJvbXB0aW5nXCI7XHJcbmltcG9ydCB7U2VxdWVuY2VBdWRpb0Zsb2F0MzJDaHVua2VyT3V0U3RyZWFtfSBmcm9tIFwiLi4vLi4vYXVkaW8vaW8vc3RyZWFtXCI7XHJcbmltcG9ydCB7U2Vzc2lvbkZpbmlzaGVkRGlhbG9nfSBmcm9tIFwiLi9zZXNzaW9uX2ZpbmlzaGVkX2RpYWxvZ1wiO1xyXG5pbXBvcnQge01lc3NhZ2VEaWFsb2d9IGZyb20gXCIuLi8uLi91aS9tZXNzYWdlX2RpYWxvZ1wiO1xyXG5pbXBvcnQge1JlY29yZGluZ1NlcnZpY2V9IGZyb20gXCIuLi9yZWNvcmRpbmdzL3JlY29yZGluZ3Muc2VydmljZVwiO1xyXG5pbXBvcnQge0F1ZGlvQ29udGV4dFByb3ZpZGVyfSBmcm9tIFwiLi4vLi4vYXVkaW8vY29udGV4dFwiO1xyXG5pbXBvcnQge0F1ZGlvQ2xpcH0gZnJvbSBcIi4uLy4uL2F1ZGlvL3BlcnNpc3RvclwiO1xyXG5pbXBvcnQge0l0ZW19IGZyb20gXCIuL2l0ZW1cIjtcclxuaW1wb3J0IHtMZXZlbEJhcn0gZnJvbSBcIi4uLy4uL2F1ZGlvL3VpL2xpdmVsZXZlbFwiO1xyXG5pbXBvcnQge0Jhc2ljUmVjb3JkZXIsIExFVkVMX0JBUl9JTlRFUlZBTExfU0VDT05EUywgTUFYX1JFQ09SRElOR19USU1FX01TLCBSRUNGSUxFX0FQSV9DVFh9IGZyb20gXCIuL2Jhc2ljcmVjb3JkZXJcIjtcclxuXHJcbmNvbnN0IERFRkFVTFRfUFJFX1JFQ19ERUxBWT0xMDAwO1xyXG5jb25zdCBERUZBVUxUX1BPU1RfUkVDX0RFTEFZPTUwMDtcclxuXHJcbmV4cG9ydCBjb25zdCBlbnVtIFN0YXR1cyB7XHJcbiAgQkxPQ0tFRCwgSURMRSwgUFJFX1JFQ09SRElORywgUkVDT1JESU5HLCBQT1NUX1JFQ19TVE9QLCBQT1NUX1JFQ19QQVVTRSwgU1RPUFBJTkdfU1RPUCwgU1RPUFBJTkdfUEFVU0UsIEVSUk9SXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXNwcnJlY29yZGluZ3Nlc3Npb24nLFxyXG4gIHByb3ZpZGVyczogW1Nlc3Npb25TZXJ2aWNlXSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGFwcC13YXJuaW5nYmFyIFtzaG93XT1cImlzVGVzdFNlc3Npb24oKVwiIHdhcm5pbmdUZXh0PVwiVGVzdCByZWNvcmRpbmcgb25seSFcIj48L2FwcC13YXJuaW5nYmFyPlxyXG4gICAgPGFwcC13YXJuaW5nYmFyIFtzaG93XT1cImlzRGVmYXVsdEF1ZGlvVGVzdFNlc3Npb24oKVwiIHdhcm5pbmdUZXh0PVwiVGhpcyB0ZXN0IHVzZXMgZGVmYXVsdCBhdWRpbyBkZXZpY2UhIFJlZ3VsYXIgc2Vzc2lvbnMgbWF5IHJlcXVpcmUgYSBwYXJ0aWN1bGFyIGF1ZGlvIGRldmljZSAobWljcm9waG9uZSkhXCI+PC9hcHAtd2FybmluZ2Jhcj5cclxuICAgICAgPGFwcC1zcHJwcm9tcHRpbmcgW3Byb2plY3ROYW1lXT1cInByb2plY3ROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0YXJ0U3RvcFNpZ25hbFN0YXRlXT1cInN0YXJ0U3RvcFNpZ25hbFN0YXRlXCIgW3Byb21wdEl0ZW1dPVwicHJvbXB0SXRlbVwiIFtzaG93UHJvbXB0XT1cInNob3dQcm9tcHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiaXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNwb3J0QWN0aW9uc109XCJ0cmFuc3BvcnRBY3Rpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkSXRlbUlkeF09XCJwcm9tcHRJbmRleFwiIChvbkl0ZW1TZWxlY3QpPVwiaXRlbVNlbGVjdCgkZXZlbnQpXCIgKG9uTmV4dEl0ZW0pPVwibmV4dEl0ZW0oKVwiIChvblByZXZJdGVtKT1cInByZXZJdGVtKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXVkaW9TaWduYWxDb2xsYXBzZWRdPVwiYXVkaW9TaWduYWxDb2xsYXBzZWRcIiBbZGlzcGxheUF1ZGlvQ2xpcF09XCJkaXNwbGF5QXVkaW9DbGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdGFydEFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXI/LnN0YXJ0QWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTZWxlY3Rpb25BY3Rpb25dPVwiY29udHJvbEF1ZGlvUGxheWVyPy5zdGFydFNlbGVjdGlvbkFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvUGxheU9uU2VsZWN0VG9nZ2xlQWN0aW9uXT1cImNvbnRyb2xBdWRpb1BsYXllcj8uYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RvcEFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXI/LnN0b3BBY3Rpb25cIj5cclxuXHJcbiAgICA8L2FwcC1zcHJwcm9tcHRpbmc+XHJcbiAgICA8bWF0LXByb2dyZXNzLWJhciBbdmFsdWVdPVwicHJvZ3Jlc3NQZXJjZW50VmFsdWUoKVwiIGZ4U2hvdz1cImZhbHNlXCIgZnhTaG93LnhzPVwidHJ1ZVwiID48L21hdC1wcm9ncmVzcy1iYXI+XHJcblxyXG5cclxuICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dC54cz1cImNvbHVtblwiIFtuZ1N0eWxlXT1cInsnaGVpZ2h0LnB4JzoxMDAsJ21pbi1oZWlnaHQucHgnOiAxMDB9XCIgW25nU3R5bGUueHNdPVwieydoZWlnaHQucHgnOjEyNSwnbWluLWhlaWdodC5weCc6IDEyNX1cIj5cclxuICAgICAgPGF1ZGlvLWxldmVsYmFyIGZ4RmxleD1cIjEgMCAxXCIgW3N0cmVhbWluZ01vZGVdPVwiaXNSZWNvcmRpbmcoKVwiIFtkaXNwbGF5TGV2ZWxJbmZvc109XCJkaXNwbGF5TGV2ZWxJbmZvc1wiPjwvYXVkaW8tbGV2ZWxiYXI+XHJcbiAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIj5cclxuICAgICAgPHNwci1yZWNvcmRpbmdpdGVtY29udHJvbHMgZnhGbGV4PVwiMTAgMCAxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1ZGlvTG9hZGVkXT1cImRpc3BsYXlBdWRpb0NsaXA/LmJ1ZmZlciE9PW51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxheVN0YXJ0QWN0aW9uXT1cImNvbnRyb2xBdWRpb1BsYXllcj8uc3RhcnRBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxheVN0b3BBY3Rpb25dPVwiY29udHJvbEF1ZGlvUGxheWVyPy5zdG9wQWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BlYWtEYkx2bF09XCJwZWFrTGV2ZWxJbkRiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FnY109XCJ0aGlzLmFjPy5hZ2NTdGF0dXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TaG93UmVjb3JkaW5nRGV0YWlscyk9XCJhdWRpb1NpZ25hbENvbGxhcHNlZD0hYXVkaW9TaWduYWxDb2xsYXBzZWRcIj5cclxuICAgICAgPC9zcHItcmVjb3JkaW5naXRlbWNvbnRyb2xzPlxyXG4gICAgICA8YXBwLXVwbG9hZHN0YXR1cyBjbGFzcz1cInJpY29udHJvbHMgZGFya1wiIGZ4SGlkZSBmeFNob3cueHMgIGZ4RmxleD1cIjAgMCAwXCIgKm5nSWY9XCJlbmFibGVVcGxvYWRSZWNvcmRpbmdzXCIgW3ZhbHVlXT1cInVwbG9hZFByb2dyZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGF0dXNdPVwidXBsb2FkU3RhdHVzXCIgW2F3YWl0TmV3VXBsb2FkXT1cInByb2Nlc3NpbmdSZWNvcmRpbmdcIj48L2FwcC11cGxvYWRzdGF0dXM+XHJcbiAgICAgIDxhcHAtcmVhZHlzdGF0ZWluZGljYXRvciBjbGFzcz1cInJpY29udHJvbHMgZGFya1wiICBmeEhpZGUgZnhTaG93LnhzIGZ4RmxleD1cIjAgMCAwXCIgW3JlYWR5XT1cImRhdGFTYXZlZCAmJiAhaXNBY3RpdmUoKVwiPjwvYXBwLXJlYWR5c3RhdGVpbmRpY2F0b3I+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDxkaXYgI2NvbnRyb2xwYW5lbCBjbGFzcz1cImNvbnRyb2xwYW5lbFwiIGZ4TGF5b3V0PVwicm93XCI+XHJcbiAgICAgIDxkaXYgZnhGbGV4PVwiMSAxIDMwJVwiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIj5cclxuICAgICAgICA8YXBwLXNwcnN0YXR1c2Rpc3BsYXkgZnhIaWRlLnhzIFtzdGF0dXNNc2ddPVwic3RhdHVzTXNnXCIgW3N0YXR1c0FsZXJ0VHlwZV09XCJzdGF0dXNBbGVydFR5cGVcIiBbc3RhdHVzV2FpdGluZ109XCJzdGF0dXNXYWl0aW5nXCI+PC9hcHAtc3Byc3RhdHVzZGlzcGxheT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8YXBwLXNwcnRyYW5zcG9ydCBmeEZsZXg9XCIxMCAwIDMwJVwiIGZ4TGF5b3V0QWxpZ249XCJjZW50ZXIgY2VudGVyXCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCIgW2FjdGlvbnNdPVwidHJhbnNwb3J0QWN0aW9uc1wiIFtuYXZpZ2F0aW9uRW5hYmxlZF09XCJpdGVtcz09bnVsbCB8fCBpdGVtcy5sZW5ndGg+MVwiPjwvYXBwLXNwcnRyYW5zcG9ydD5cclxuICAgIDxkaXYgZnhGbGV4PVwiMSAxIDMwJVwiIGZ4TGF5b3V0QWxpZ249XCJlbmQgY2VudGVyXCIgZnhMYXlvdXQ9XCJyb3dcIj5cclxuICAgICAgPGFwcC11cGxvYWRzdGF0dXMgY2xhc3M9XCJyaWNvbnRyb2xzXCIgZnhIaWRlLnhzIGZ4TGF5b3V0QWxpZ249XCJlbmQgY2VudGVyXCIgKm5nSWY9XCJlbmFibGVVcGxvYWRSZWNvcmRpbmdzXCIgW3ZhbHVlXT1cInVwbG9hZFByb2dyZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzdGF0dXNdPVwidXBsb2FkU3RhdHVzXCIgW2F3YWl0TmV3VXBsb2FkXT1cInByb2Nlc3NpbmdSZWNvcmRpbmdcIj48L2FwcC11cGxvYWRzdGF0dXM+XHJcbiAgICAgIDxhcHAtcmVhZHlzdGF0ZWluZGljYXRvciBjbGFzcz1cInJpY29udHJvbHNcIiBmeExheW91dEFsaWduPVwiZW5kIGNlbnRlclwiIGZ4SGlkZS54cyBbcmVhZHldPVwiZGF0YVNhdmVkICYmICFpc0FjdGl2ZSgpXCI+PC9hcHAtcmVhZHlzdGF0ZWluZGljYXRvcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgOmhvc3Qge1xyXG4gICAgZmxleDogMjtcclxuICAgIGJhY2tncm91bmQ6IGxpZ2h0Z3JleTtcclxuICAgIGRpc3BsYXk6IGZsZXg7IC8qIFZlcnRpY2FsIGZsZXggY29udGFpbmVyOiBCb3R0b20gdHJhbnNwb3J0IHBhbmVsLCBhYm92ZSBwcm9tcHRpbmcgcGFuZWwgKi9cclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gICAgbWluLWhlaWdodDogMHB4O1xyXG5cclxuICAgICAgLyogUHJldmVudHMgaG9yaXpvbnRhbCBzY3JvbGwgYmFyIG9uIHN3aXBlIHJpZ2h0ICovXHJcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfWAsYC5yaWNvbnRyb2xzIHtcclxuICAgICAgICBwYWRkaW5nOiA0cHg7XHJcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICB9YCxgLmRhcmsge1xyXG4gICAgYmFja2dyb3VuZDogZGFya2dyYXk7XHJcbiAgfWAsYC5jb250cm9scGFuZWwge1xyXG4gICAgYWxpZ24tY29udGVudDogY2VudGVyO1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDIwcHg7XHJcbiAgICBtaW4taGVpZ2h0OiBtaW4tY29udGVudDsgLyogaW1wb3J0YW50ICovXHJcbiAgfWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZXNzaW9uTWFuYWdlciBleHRlbmRzIEJhc2ljUmVjb3JkZXIgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LE9uRGVzdHJveSwgQXVkaW9DYXB0dXJlTGlzdGVuZXIge1xyXG5cclxuICBASW5wdXQoKSBwcm9qZWN0TmFtZTpzdHJpbmd8dW5kZWZpbmVkO1xyXG4gIGVuYWJsZVVwbG9hZFJlY29yZGluZ3M6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGVuYWJsZURvd25sb2FkUmVjb3JkaW5nczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHN0YXR1czogU3RhdHVzID0gU3RhdHVzLkJMT0NLRUQ7XHJcblxyXG4gIEBWaWV3Q2hpbGQoUHJvbXB0aW5nLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcm9tcHRpbmchOiBQcm9tcHRpbmc7XHJcbiAgQFZpZXdDaGlsZChMZXZlbEJhciwgeyBzdGF0aWM6IHRydWUgfSkgbGl2ZUxldmVsRGlzcGxheSE6IExldmVsQmFyO1xyXG5cclxuICBASW5wdXQoKSBkYXRhU2F2ZWQ9dHJ1ZVxyXG5cclxuICBzdGFydFN0b3BTaWduYWxTdGF0ZSE6IFN0YXJ0U3RvcFNpZ25hbFN0YXRlO1xyXG5cclxuICBwcml2YXRlIHVwZGF0ZVRpbWVySWQ6IGFueTtcclxuICBwcml2YXRlIHByZVJlY1RpbWVySWQ6IG51bWJlcnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBwcmVSZWNUaW1lclJ1bm5pbmc6IGJvb2xlYW58bnVsbD1udWxsO1xyXG4gIHByaXZhdGUgcG9zdFJlY1RpbWVySWQ6IG51bWJlcnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBwb3N0UmVjVGltZXJSdW5uaW5nOiBib29sZWFufG51bGw9bnVsbDtcclxuICBwcml2YXRlIG1heFJlY1RpbWVySWQ6IG51bWJlcnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBtYXhSZWNUaW1lclJ1bm5pbmc6IGJvb2xlYW58bnVsbD1udWxsO1xyXG5cclxuICBkbmxMbmshOiBIVE1MQW5jaG9yRWxlbWVudDtcclxuXHJcbiAgYXVkaW86IGFueTtcclxuICBfc2NyaXB0ITogU2NyaXB0O1xyXG4gIHByaXZhdGUgX3Byb21wdEluZGV4PTA7XHJcbiAgcHJpdmF0ZSBzZWN0aW9uITogU2VjdGlvbjtcclxuICBncm91cCE6IEdyb3VwO1xyXG4gIHByb21wdEl0ZW0hOlByb21wdEl0ZW07XHJcbiAgc2hvd1Byb21wdCE6IGJvb2xlYW47XHJcblxyXG4gIC8vIGluZGV4IG9mIGN1cnJlbnQgc2VjdGlvblxyXG4gIHNlY3RJZHghOiBudW1iZXI7XHJcbiAgLy8gaW5kZXggb2YgY3VycmVudCBncm91cCBpbiBzZWN0aW9uXHJcbiAgZ3JvdXBJZHhJblNlY3Rpb24hOiBudW1iZXI7XHJcbiAgLy8gaW5kZXggb2YgY3VycmVudCBwcm9tcHQgaXRlbSBpbiBncm91cFxyXG4gIHByb21wdEl0ZW1JZHhJbkdyb3VwITogbnVtYmVyO1xyXG5cclxuICBwcml2YXRlIGF1dG9yZWNvcmRpbmchOiBib29sZWFuO1xyXG5cclxuICBpdGVtczogQXJyYXk8SXRlbT58bnVsbD1udWxsO1xyXG4gIC8vc2VsZWN0ZWRJdGVtSWR4OiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfZGlzcGxheVJlY0ZpbGU6IFNwclJlY29yZGluZ0ZpbGUgfCBudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBkaXNwbGF5UmVjRmlsZVZlcnNpb24hOiBudW1iZXI7XHJcblxyXG4gIHByb21wdEl0ZW1Db3VudCE6IG51bWJlcjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgICAgICAgICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgc2Vzc2lvblNlcnZpY2U6U2Vzc2lvblNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZWNGaWxlU2VydmljZTpSZWNvcmRpbmdTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgdXBsb2FkZXI6IFNwZWVjaFJlY29yZGVyVXBsb2FkZXIsXHJcbiAgICAgICAgICAgICAgQEluamVjdChTUEVFQ0hSRUNPUkRFUl9DT05GSUcpIHB1YmxpYyBjb25maWc/OiBTcGVlY2hSZWNvcmRlckNvbmZpZykge1xyXG4gICAgc3VwZXIoZGlhbG9nLHNlc3Npb25TZXJ2aWNlKTtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLklETEU7XHJcbiAgICB0aGlzLmF1ZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGlvJyk7XHJcbiAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuZW5hYmxlVXBsb2FkUmVjb3JkaW5ncyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuZW5hYmxlVXBsb2FkUmVjb3JkaW5ncyA9IHRoaXMuY29uZmlnLmVuYWJsZVVwbG9hZFJlY29yZGluZ3M7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuZW5hYmxlRG93bmxvYWRSZWNvcmRpbmdzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5lbmFibGVEb3dubG9hZFJlY29yZGluZ3MgPSB0aGlzLmNvbmZpZy5lbmFibGVEb3dubG9hZFJlY29yZGluZ3M7XHJcbiAgICB9XHJcbiAgICB0aGlzLmluaXQoKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuc3RyZWFtTGV2ZWxNZWFzdXJlLmxldmVsTGlzdGVuZXIgPSB0aGlzLmxpdmVMZXZlbERpc3BsYXk7XHJcbiAgICB0aGlzLnN0cmVhbUxldmVsTWVhc3VyZS5wZWFrTGV2ZWxMaXN0ZW5lcj0ocGVha0x2bEluRGIpPT57XHJcbiAgICAgIHRoaXMucGVha0xldmVsSW5EYj1wZWFrTHZsSW5EYjtcclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICB0aGlzLmRlc3Ryb3llZD10cnVlO1xyXG4gICAgICAgLy8gVE9ETyBzdG9wIGNhcHR1cmUgL3BsYXliYWNrXHJcbiAgICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdCgpIHtcclxuICAgIHRoaXMuc2VjdElkeCA9IDA7XHJcbiAgICB0aGlzLmdyb3VwSWR4SW5TZWN0aW9uID0gMDtcclxuICAgIHRoaXMucHJvbXB0SXRlbUlkeEluR3JvdXAgPSAwO1xyXG4gICAgdGhpcy5hdXRvcmVjb3JkaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIGxldCBjb250ZXh0OkF1ZGlvQ29udGV4dHxudWxsPW51bGw7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb250ZXh0ID0gQXVkaW9Db250ZXh0UHJvdmlkZXIuYXVkaW9Db250ZXh0SW5zdGFuY2UoKVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLkVSUk9SO1xyXG4gICAgICBsZXQgZXJyTXNnID0gJ1Vua25vd24gZXJyb3InO1xyXG4gICAgICBpZihlcnIgaW5zdGFuY2VvZiBFcnJvcil7XHJcbiAgICAgICAgZXJyTXNnPWVyci5tZXNzYWdlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ0VSUk9SOiAnICsgZXJyTXNnO1xyXG4gICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcic7XHJcbiAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTWVzc2FnZURpYWxvZywge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgICB0aXRsZTogJ0Vycm9yJyxcclxuICAgICAgICAgIG1zZzogZXJyTXNnLFxyXG4gICAgICAgICAgYWR2aXNlOiAnUGxlYXNlIHVzZSBhIHN1cHBvcnRlZCBicm93c2VyLicsXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYoY29udGV4dCkge1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJTdGF0ZSBvZiBhdWRpbyBjb250ZXh0OiBcIiArIGNvbnRleHQuc3RhdGUpXHJcbiAgICB9ZWxzZXtcclxuICAgICAgY29uc29sZS5pbmZvKFwiTm8gYXVkaW8gY29udGV4dCBhdmFpbGFibGUhXCIpO1xyXG4gICAgfVxyXG4gICAgaWYgKCFjb250ZXh0IHx8ICFuYXZpZ2F0b3IubWVkaWFEZXZpY2VzKSB7XHJcbiAgICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLkVSUk9SO1xyXG4gICAgICBsZXQgZXJyTXNnID0gJ0Jyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBNZWRpYSBzdHJlYW1zISc7XHJcbiAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ0VSUk9SOiAnICsgZXJyTXNnO1xyXG4gICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcic7XHJcbiAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTWVzc2FnZURpYWxvZywge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgICB0aXRsZTogJ0Vycm9yJyxcclxuICAgICAgICAgIG1zZzogZXJyTXNnLFxyXG4gICAgICAgICAgYWR2aXNlOiAnUGxlYXNlIHVzZSBhIHN1cHBvcnRlZCBicm93c2VyLicsXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hYyA9IG5ldyBBdWRpb0NhcHR1cmUoY29udGV4dCk7XHJcbiAgICAgIGlmICh0aGlzLmFjKSB7XHJcbiAgICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5zdGFydEl0ZW0oKTtcclxuICAgICAgICB0aGlzLmFjLmxpc3RlbmVyID0gdGhpcztcclxuICAgICAgICB0aGlzLmFjLmF1ZGlvT3V0U3RyZWFtID0gbmV3IFNlcXVlbmNlQXVkaW9GbG9hdDMyQ2h1bmtlck91dFN0cmVhbSh0aGlzLnN0cmVhbUxldmVsTWVhc3VyZSwgTEVWRUxfQkFSX0lOVEVSVkFMTF9TRUNPTkRTKTtcclxuICAgICAgICAvLyBEb24ndCBsaXN0IHRoZSBkZXZpY2VzIGhlcmUuIElmIHdlIGRvIG5vdCBoYXZlIGF1ZGlvIHBlcm1pc3Npb25zIHdlIG9ubHkgZ2V0IGFub255bWl6ZWQgZGV2aWNlcyB3aXRob3V0IGxhYmVscy5cclxuICAgICAgICAvL3RoaXMuYWMubGlzdERldmljZXMoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIGxldCBlcnJNc2cgPSAnQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IE1lZGlhL0F1ZGlvIEFQSSEnO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ0VSUk9SOiAnICsgZXJyTXNnO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKE1lc3NhZ2VEaWFsb2csIHtcclxuICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgICAgdGl0bGU6ICdFcnJvcicsXHJcbiAgICAgICAgICAgIG1zZzogZXJyTXNnLFxyXG4gICAgICAgICAgICBhZHZpc2U6ICdQbGVhc2UgdXNlIGEgc3VwcG9ydGVkIGJyb3dzZXIuJyxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLnN0b3BJdGVtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5zdG9wSXRlbSgpO1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLnBhdXNlSXRlbSgpO1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkQWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5uZXh0SXRlbSgpO1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkTmV4dEFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMubmV4dFVucmVjb3JkZWRJdGVtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5id2RBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLnByZXZJdGVtKCk7XHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIuc3RhcnQoKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdGFydFN0b3BTaWduYWxTdGF0ZSA9IFN0YXJ0U3RvcFNpZ25hbFN0YXRlLk9GRjtcclxuXHJcbn1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXByZXNzJywgWyckZXZlbnQnXSlcclxuICBvbktleVByZXNzKGtlOiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoa2Uua2V5ID09ICcgJykge1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgb25LZXlEb3duKGtlOiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoa2Uua2V5ID09ICcgJykge1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoa2Uua2V5ID09ICdwJykge1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChrZS5rZXkgPT0gJ0VzY2FwZScpIHtcclxuICAgICAgaWYoIXRoaXMuYXVkaW9TaWduYWxDb2xsYXBzZWQpe1xyXG4gICAgICAgIHRoaXMuYXVkaW9TaWduYWxDb2xsYXBzZWQ9dHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGtlLmtleSA9PSAnTWVkaWFQbGF5UGF1c2UnKSB7XHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuICAgIGlmIChrZS5rZXkgPT09ICdBcnJvd1JpZ2h0Jykge1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuICAgIGlmIChrZS5rZXkgPT09ICdBcnJvd0xlZnQnKSB7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5id2RBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvZ3Jlc3NQZXJjZW50VmFsdWUoKTpudW1iZXIge1xyXG4gICAgbGV0IHY9MTAwO1xyXG4gICAgaWYodGhpcy5pdGVtcykge1xyXG4gICAgICB2PXRoaXMucHJvbXB0SW5kZXggKiAxMDAgLyAodGhpcy5pdGVtcy5sZW5ndGggLSAxKTtcclxuICAgIH1cclxuICAgIHJldHVybiB2O1xyXG4gIH1cclxuICBpc1Rlc3RTZXNzaW9uKCk6Ym9vbGVhbiB7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9zZXNzaW9uIT1udWxsKSAmJiAodGhpcy5fc2Vzc2lvbi50eXBlID09PSAnVEVTVCcgfHwgdGhpcy5fc2Vzc2lvbi50eXBlPT09J1RFU1RfREVGX0EnIHx8IHRoaXMuX3Nlc3Npb24udHlwZSA9PT0gJ1NJTlVTX1RFU1QnKSk7XHJcbiAgfVxyXG5cclxuICBpc0RlZmF1bHRBdWRpb1Rlc3RTZXNzaW9uKCk6Ym9vbGVhbiB7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9zZXNzaW9uIT1udWxsKSAmJiAodGhpcy5fc2Vzc2lvbi50eXBlPT09J1RFU1RfREVGX0EnKSk7XHJcbiAgfVxyXG5cclxuICBpc0RlZmF1bHRBdWRpb1Rlc3RTZXNzaW9uT3ZlcndyaXRlaW5nUHJvamVjdFJlcXVpcmVtZW50cygpOmJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICgodGhpcy5fc2Vzc2lvbiE9bnVsbCkgJiYgKHRoaXMuX3Nlc3Npb24udHlwZT09PSdURVNUX0RFRl9BJykgJiYgKHRoaXMuYXVkaW9EZXZpY2VzIT1udWxsKSAmJiB0aGlzLmF1ZGlvRGV2aWNlcy5sZW5ndGg+MClcclxuICB9XHJcblxyXG5cclxuICBzZXQgY29udHJvbEF1ZGlvUGxheWVyKGNvbnRyb2xBdWRpb1BsYXllcjogQXVkaW9QbGF5ZXIpIHtcclxuICAgIGlmICh0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIpIHtcclxuICAgICAgLy90aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIubGlzdGVuZXI9bnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllciA9IGNvbnRyb2xBdWRpb1BsYXllcjtcclxuICAgIGlmICh0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIpIHtcclxuICAgICAgdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLmxpc3RlbmVyID0gdGhpcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBjb250cm9sQXVkaW9QbGF5ZXIoKTogQXVkaW9QbGF5ZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllcjtcclxuICB9XHJcblxyXG4gIHNldCBzY3JpcHQoc2NyaXB0OiBhbnkpIHtcclxuICAgIHRoaXMuX3NjcmlwdCA9IHNjcmlwdDtcclxuICAgIHRoaXMubG9hZFNjcmlwdCgpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlKGU6IEF1ZGlvUGxheWVyRXZlbnQpIHtcclxuICAgIGlmIChlLnR5cGUgPT0gRXZlbnRUeXBlLlNUQVJURUQpIHtcclxuICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLnVwZGF0ZVRpbWVySWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICAgIC8vdGhpcy5hdWRpb1NpZ25hbC5wbGF5RnJhbWVQb3NpdGlvbiA9IHRoaXMuYXAucGxheVBvc2l0aW9uRnJhbWVzO1xyXG4gICAgICB9LCA1MCk7XHJcbiAgICB9IGVsc2UgaWYgKGUudHlwZSA9PSBFdmVudFR5cGUuU1RPUFBFRCB8fCBlLnR5cGUgPT0gRXZlbnRUeXBlLkVOREVEKSB7XHJcbiAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMudXBkYXRlVGltZXJJZCk7XHJcbiAgICAgIC8vIHRoaXMuYXVkaW9TaWduYWwucGxheUZyYW1lUG9zaXRpb24gPSB0aGlzLmFwLnBsYXlQb3NpdGlvbkZyYW1lcztcclxuICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24uZGlzYWJsZWQgPSAoISh0aGlzLmRpc3BsYXlSZWNGaWxlKSk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHByb21wdEluZGV4KCk6bnVtYmVye1xyXG4gICAgcmV0dXJuIHRoaXMuX3Byb21wdEluZGV4O1xyXG4gIH1cclxuXHJcbiAgc2V0IHByb21wdEluZGV4KHByb21wdEluZGV4Om51bWJlcil7XHJcbiAgICBpZihwcm9tcHRJbmRleDwwIHx8IHByb21wdEluZGV4Pj10aGlzLnByb21wdEl0ZW1Db3VudCl7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlByb21wdCBpbmRleCBvdXQgb2YgcmFuZ2VcIilcclxuICAgIH1cclxuICAgIGxldCBpID0gMDtcclxuICAgIGxldCBzZWN0aW9ucz10aGlzLl9zY3JpcHQuc2VjdGlvbnM7XHJcbiAgICBsZXQgZm91bmQ9ZmFsc2U7XHJcbiAgICBmb3IgKGxldCBzaSA9IDA7IHNpIDwgc2VjdGlvbnMubGVuZ3RoICYmICFmb3VuZDsgc2krKykge1xyXG4gICAgICBsZXQgc2VjdGlvbiA9IHNlY3Rpb25zW3NpXTtcclxuICAgICAgbGV0IGdzID0gc2VjdGlvbi5fc2h1ZmZsZWRHcm91cHM7XHJcbiAgICAgIGZvciAobGV0IGdpID0gMDsgZ2kgPCBncy5sZW5ndGg7IGdpKyspIHtcclxuICAgICAgICBsZXQgcGlzPWdzW2dpXS5fc2h1ZmZsZWRQcm9tcHRJdGVtcztcclxuXHJcbiAgICAgICAgbGV0IHBpc1NpemUgPSBwaXMubGVuZ3RoO1xyXG4gICAgICAgIGlmIChwcm9tcHRJbmRleCA8IGkgKyBwaXNTaXplKSB7XHJcbiAgICAgICAgICB0aGlzLnNlY3RJZHggPSBzaTtcclxuICAgICAgICAgIHRoaXMuZ3JvdXBJZHhJblNlY3Rpb249Z2k7XHJcbiAgICAgICAgICB0aGlzLnByb21wdEl0ZW1JZHhJbkdyb3VwID0gcHJvbXB0SW5kZXggLSBpO1xyXG4gICAgICAgICAgZm91bmQ9dHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpICs9IHBpc1NpemU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZihmb3VuZCl7XHJcbiAgICAgIHRoaXMuX3Byb21wdEluZGV4PXByb21wdEluZGV4O1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludGVybmFsIGVycm9yOiBQcm9tcHQgaW5kZXggbm90IGZvdW5kXCIpXHJcbiAgICB9XHJcbiAgICB0aGlzLmFwcGx5SXRlbSgpO1xyXG4gIH1cclxuXHJcbiAgaXRlbVNlbGVjdChpdGVtSWR4OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gU3RhdHVzLklETEUpIHtcclxuICAgICAgdGhpcy5wcm9tcHRJbmRleD1pdGVtSWR4O1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG5cclxuXHJcbiAgc3RhcnRJdGVtKCkge1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICBpZih0aGlzLnJlYWRvbmx5KXtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkQWN0aW9uLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZE5leHRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlXHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuYndkQWN0aW9uLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgdGhpcy5kaXNwbGF5UmVjRmlsZSA9IG51bGw7XHJcbiAgICB0aGlzLmRpc3BsYXlSZWNGaWxlVmVyc2lvbiA9IDA7XHJcbiAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBudWxsO1xyXG4gICAgdGhpcy5zaG93UmVjb3JkaW5nKCk7XHJcbiAgICBpZiAodGhpcy5zZWN0aW9uLm1vZGUgPT09ICdBVVRPUkVDT1JESU5HJykge1xyXG4gICAgICB0aGlzLmF1dG9yZWNvcmRpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKHRoaXMuYWMhPW51bGwpIHtcclxuICAgICAgaWYgKCF0aGlzLmFjLm9wZW5lZCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZERldmljZUlkKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIk9wZW4gc2Vzc2lvbiB3aXRoIGF1ZGlvIGRldmljZSBJZDogXFwnXCIgKyB0aGlzLl9zZWxlY3RlZERldmljZUlkICsgXCJcXCcgZm9yIFwiICsgdGhpcy5fY2hhbm5lbENvdW50ICsgXCIgY2hhbm5lbHNcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiT3BlbiBzZXNzaW9uIHdpdGggZGVmYXVsdCBhdWRpbyBkZXZpY2UgZm9yIFwiICsgdGhpcy5fY2hhbm5lbENvdW50ICsgXCIgY2hhbm5lbHNcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWMub3Blbih0aGlzLl9jaGFubmVsQ291bnQsIHRoaXMuX3NlbGVjdGVkRGV2aWNlSWQsdGhpcy5fYXV0b0dhaW5Db250cm9sQ29uZmlncyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hYy5zdGFydCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBsb2FkU2NyaXB0KCkge1xyXG4gICAgdGhpcy5wcm9tcHRJdGVtQ291bnQgPSAwO1xyXG5cclxuICAgIHRoaXMuaXRlbXMgPSBuZXcgQXJyYXk8SXRlbT4oKTtcclxuICAgIGxldCBsbiA9IDA7XHJcblxyXG4gICAgLy9UT0RPIHJhbmRvbWl6ZSBub3Qgc3VwcG9ydGVkXHJcbiAgICBmb3IgKGxldCBzaSA9IDA7IHNpIDwgdGhpcy5fc2NyaXB0LnNlY3Rpb25zLmxlbmd0aDsgc2krKykge1xyXG4gICAgICBsZXQgc2VjdGlvbiA9IHRoaXMuX3NjcmlwdC5zZWN0aW9uc1tzaV07XHJcbiAgICAgIGxldCBncyA9IHNlY3Rpb24uX3NodWZmbGVkR3JvdXBzO1xyXG4gICAgICBmb3IobGV0IGdpPTA7Z2k8Z3MubGVuZ3RoO2dpKyspIHtcclxuXHJcbiAgICAgICAgICBsZXQgcGlzID0gZ3NbZ2ldLl9zaHVmZmxlZFByb21wdEl0ZW1zO1xyXG5cclxuICAgICAgICAgIGxldCBwaXNMZW4gPSBwaXMubGVuZ3RoO1xyXG4gICAgICAgICAgdGhpcy5wcm9tcHRJdGVtQ291bnQgKz0gcGlzTGVuO1xyXG4gICAgICAgICAgZm9yIChsZXQgcGlTZWN0SWR4ID0gMDsgcGlTZWN0SWR4IDwgcGlzTGVuOyBwaVNlY3RJZHgrKykge1xyXG4gICAgICAgICAgICBsZXQgcGkgPSBwaXNbcGlTZWN0SWR4XTtcclxuICAgICAgICAgICAgbGV0IHByb21wdEFzU3RyID0gUHJvbXB0aXRlbVV0aWwudG9QbGFpblRleHRTdHJpbmcocGkpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGl0ID0gbmV3IEl0ZW0ocHJvbXB0QXNTdHIsIHNlY3Rpb24udHJhaW5pbmcsKCFwaS50eXBlIHx8IHBpLnR5cGU9PT0ncmVjb3JkaW5nJykpO1xyXG4gICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2goaXQpO1xyXG4gICAgICAgICAgICBsbisrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm9tcHRJbmRleEJ5SXRlbWNvZGUoaXRlbWNvZGU6c3RyaW5nKTpudW1iZXJ8bnVsbHtcclxuICAgIGxldCBwaXggPSAwO1xyXG5cclxuICAgIGZvciAobGV0IHNpID0gMDsgc2kgPCB0aGlzLl9zY3JpcHQuc2VjdGlvbnMubGVuZ3RoOyBzaSsrKSB7XHJcbiAgICAgIGxldCBzZWN0aW9uID0gdGhpcy5fc2NyaXB0LnNlY3Rpb25zW3NpXTtcclxuICAgICAgbGV0IGdzID0gc2VjdGlvbi5fc2h1ZmZsZWRHcm91cHM7XHJcbiAgICAgIGZvcihsZXQgZ2k9MDtnaTxncy5sZW5ndGg7Z2krKykge1xyXG4gICAgICAgIGxldCBwaXM9Z3NbZ2ldLl9zaHVmZmxlZFByb21wdEl0ZW1zO1xyXG4gICAgICAgIGxldCBwaXNMZW4gPSBwaXMubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IHBpU2VjdElkeCA9IDA7IHBpU2VjdElkeCA8IHBpc0xlbjsgcGlTZWN0SWR4KyspIHtcclxuICAgICAgICAgIGxldCBwaSA9IHBpc1twaVNlY3RJZHhdO1xyXG4gICAgICAgICAgbGV0IGljPXBpLml0ZW1jb2RlO1xyXG4gICAgICAgICAgaWYoaWMgPT09IGl0ZW1jb2RlKXtcclxuICAgICAgICAgICAgcmV0dXJuIHBpeDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHBpeCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBjbGVhclByb21wdCgpIHtcclxuICAgIC8vdGhpcy5wcm9tcHRpbmcucHJvbXB0Q29udGFpbmVyLnByb21wdGVyLnByb21wdFRleHQ9Jyc7XHJcbiAgICAvL3RoaXMubWVkaWFpdGVtID0gbnVsbDtcclxuICAgIHRoaXMuc2hvd1Byb21wdCA9IGZhbHNlO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKClcclxuICB9XHJcblxyXG4gIGFwcGx5UHJvbXB0KCkge1xyXG4gICAgLy90aGlzLnByb21wdGluZy5wcm9tcHRDb250YWluZXIucHJvbXB0ZXIucHJvbXB0VGV4dD10aGlzLnByb21wdFVuaXQubWVkaWFpdGVtc1swXS50ZXh0O1xyXG4gICAgLy90aGlzLnByb21wdFRleHQgPSB0aGlzLnByb21wdFVuaXQubWVkaWFpdGVtc1swXS50ZXh0O1xyXG4gICAgLy90aGlzLm1lZGlhaXRlbT10aGlzLnByb21wdFVuaXQubWVkaWFpdGVtc1swXTtcclxuICAgIHRoaXMuc2hvd1Byb21wdCA9IHRydWU7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKVxyXG4gIH1cclxuXHJcbiAgZG93bmxvYWRSZWNvcmRpbmcoKSB7XHJcbiAgICBpZiAodGhpcy5kaXNwbGF5UmVjRmlsZSkge1xyXG4gICAgICBsZXQgYWI6IEF1ZGlvQnVmZmVyfG51bGwgPSB0aGlzLmRpc3BsYXlSZWNGaWxlLmF1ZGlvQnVmZmVyO1xyXG4gICAgICBsZXQgd3cgPSBuZXcgV2F2V3JpdGVyKCk7XHJcbiAgICAgIGlmKGFiKSB7XHJcbiAgICAgICAgbGV0IHdhdkZpbGUgPSB3dy53cml0ZUFzeW5jKGFiLCAod2F2RmlsZSkgPT4ge1xyXG4gICAgICAgICAgbGV0IGJsb2IgPSBuZXcgQmxvYihbd2F2RmlsZV0sIHt0eXBlOiAnYXVkaW8vd2F2J30pO1xyXG4gICAgICAgICAgbGV0IHJmVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuXHJcbiAgICAgICAgICBsZXQgZGF0YURubExuayA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgICAgLy9kYXRhRG5sTG5rLm5hbWUgPSAnUmVjb3JkaW5nJztcclxuICAgICAgICAgIGRhdGFEbmxMbmsuaHJlZiA9IHJmVXJsO1xyXG5cclxuICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuYm9keSwgZGF0YURubExuayk7XHJcblxyXG4gICAgICAgICAgLy8gZG93bmxvYWQgcHJvcGVydHkgbm90IHlldCBpbiBUUyBkZWZcclxuICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXlSZWNGaWxlKSB7XHJcbiAgICAgICAgICAgIGxldCBmbiA9IHRoaXMuZGlzcGxheVJlY0ZpbGUuZmlsZW5hbWVTdHJpbmcoKTtcclxuICAgICAgICAgICAgZm4gKz0gJ18nICsgdGhpcy5kaXNwbGF5UmVjRmlsZVZlcnNpb247XHJcbiAgICAgICAgICAgIGZuICs9ICcud2F2JztcclxuICAgICAgICAgICAgZGF0YURubExuay5kb3dubG9hZCA9IGZuO1xyXG4gICAgICAgICAgICBkYXRhRG5sTG5rLmNsaWNrKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKGRvY3VtZW50LmJvZHksIGRhdGFEbmxMbmspO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXQgZGlzcGxheVJlY0ZpbGUoZGlzcGxheVJlY0ZpbGU6IFNwclJlY29yZGluZ0ZpbGUgfCBudWxsKSB7XHJcbiAgICB0aGlzLl9kaXNwbGF5UmVjRmlsZSA9IGRpc3BsYXlSZWNGaWxlO1xyXG4gICAgaWYgKHRoaXMuX2Rpc3BsYXlSZWNGaWxlKSB7XHJcbiAgICAgIGxldCBhYjogQXVkaW9CdWZmZXJ8bnVsbCA9IHRoaXMuX2Rpc3BsYXlSZWNGaWxlLmF1ZGlvQnVmZmVyO1xyXG4gICAgICBpZihhYikge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCA9IG5ldyBBdWRpb0NsaXAoYWIpO1xyXG4gICAgICAgIHRoaXMuY29udHJvbEF1ZGlvUGxheWVyLmF1ZGlvQ2xpcCA9IHRoaXMuZGlzcGxheUF1ZGlvQ2xpcDtcclxuICAgICAgfWVsc2Uge1xyXG4gICAgICAgIC8vIGNsZWFyIGZvciBub3cgLi4uXHJcbiAgICAgICAgdGhpcy5kaXNwbGF5QXVkaW9DbGlwID0gbnVsbDtcclxuICAgICAgICB0aGlzLmNvbnRyb2xBdWRpb1BsYXllci5hdWRpb0NsaXAgPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIgJiYgdGhpcy5fc2Vzc2lvbikge1xyXG4gICAgICAgICAgLy8uLi4gYW5kIHRyeSB0byBmZXRjaCBmcm9tIHNlcnZlclxyXG4gICAgICAgICAgdGhpcy5hdWRpb0ZldGNoU3Vic2NyaXB0aW9uID0gdGhpcy5yZWNGaWxlU2VydmljZS5mZXRjaEFuZEFwcGx5U3ByUmVjb3JkaW5nRmlsZSh0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIuY29udGV4dCwgdGhpcy5fc2Vzc2lvbi5wcm9qZWN0LCB0aGlzLl9kaXNwbGF5UmVjRmlsZSkuc3Vic2NyaWJlKChyZikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZmFiID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHJmICYmIHRoaXMuX2Rpc3BsYXlSZWNGaWxlKSB7XHJcbiAgICAgICAgICAgICAgZmFiID0gdGhpcy5fZGlzcGxheVJlY0ZpbGUuYXVkaW9CdWZmZXI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGxvYWRlZC4nXHJcbiAgICAgICAgICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGZhYil7XHJcbiAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5QXVkaW9DbGlwID0gbmV3IEF1ZGlvQ2xpcChmYWIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbEF1ZGlvUGxheWVyLmF1ZGlvQ2xpcCA9dGhpcy5kaXNwbGF5QXVkaW9DbGlwXHJcbiAgICAgICAgICAgIHRoaXMuc2hvd1JlY29yZGluZygpO1xyXG5cclxuICAgICAgICAgIH0sIGVyciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDb3VsZCBub3QgbG9hZCByZWNvcmRpbmcgZmlsZSBmcm9tIHNlcnZlcjogXCIgKyBlcnIpXHJcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZyBmaWxlIGNvdWxkIG5vdCBiZSBsb2FkZWQ6ICcgKyBlcnJcclxuICAgICAgICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGRlY29kZWQuIEF1ZGlvIGNvbnRleHQgdW5hdmFpbGFibGUuJ1xyXG4gICAgICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kaXNwbGF5QXVkaW9DbGlwID0gbnVsbDtcclxuICAgICAgdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIuYXVkaW9DbGlwID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBkaXNwbGF5UmVjRmlsZSgpOiBTcHJSZWNvcmRpbmdGaWxlIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGlzcGxheVJlY0ZpbGU7XHJcbiAgfVxyXG5cclxuICBzaG93UmVjb3JkaW5nKCkge1xyXG4gICAgdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIuc3RvcCgpO1xyXG5cclxuICAgIGlmICh0aGlzLmRpc3BsYXlBdWRpb0NsaXApIHtcclxuXHJcbiAgICAgIHRoaXMubGV2ZWxNZWFzdXJlLmNhbGNCdWZmZXJMZXZlbEluZm9zKHRoaXMuZGlzcGxheUF1ZGlvQ2xpcC5idWZmZXIsIExFVkVMX0JBUl9JTlRFUlZBTExfU0VDT05EUykudGhlbigobGV2ZWxJbmZvcykgPT4ge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheUxldmVsSW5mb3MgPSBsZXZlbEluZm9zO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgLy8gVE9ET1xyXG4gICAgICAvLyBTZXR0aW5nIHRvIG51bGwgZG9lcyBub3QgdHJpZ2dlciBhIGNoYW5nZSBpZiBpdCB3YXMgIG51bGwgYmVmb3JlIChoYXBwZW5zIGFmdGVyIG5leHRpdGVtKCkgaW4gQVVUT1BST0dSRVNTIG1vZGUpXHJcbiAgICAgIC8vIFRoZSBsZXZlbCBiYXIgZGlzcGxheSBkb2VzIG5vdCBjbGVhciwgaXQgc2hvd3MgdGhlIGxhc3QgY2FwdHVyZWQgc3RyZWFtXHJcbiAgICAgIHRoaXMuZGlzcGxheUxldmVsSW5mb3MgPSBudWxsO1xyXG5cclxuICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gQ29sbGFwc2UgYXVkaW8gc2lnbmFsIGRpc3BsYXkgaWYgb3BlblxyXG4gICAgICBpZiAoIXRoaXMuYXVkaW9TaWduYWxDb2xsYXBzZWQpIHtcclxuICAgICAgICB0aGlzLmF1ZGlvU2lnbmFsQ29sbGFwc2VkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgaXNSZWNvcmRpbmdJdGVtKCk6Ym9vbGVhbntcclxuICAgIHJldHVybih0aGlzLnByb21wdEl0ZW0hPW51bGwgJiYgdGhpcy5wcm9tcHRJdGVtLnR5cGUhPT0nbm9ucmVjb3JkaW5nJylcclxuICB9XHJcblxyXG4gIHVwZGF0ZVN0YXJ0QWN0aW9uRGlzYWJsZVN0YXRlKCl7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24uZGlzYWJsZWQ9ISh0aGlzLmFjICAmJiB0aGlzLmlzUmVjb3JkaW5nSXRlbSgpKTtcclxuICB9XHJcblxyXG4gIGFwcGx5SXRlbSh0ZW1wb3Jhcnk9ZmFsc2UpIHtcclxuXHJcbiAgICB0aGlzLnNlY3Rpb24gPSB0aGlzLl9zY3JpcHQuc2VjdGlvbnNbdGhpcy5zZWN0SWR4XVxyXG4gICAgdGhpcy5ncm91cCA9IHRoaXMuc2VjdGlvbi5fc2h1ZmZsZWRHcm91cHNbdGhpcy5ncm91cElkeEluU2VjdGlvbl07XHJcbiAgICB0aGlzLnByb21wdEl0ZW0gPSB0aGlzLmdyb3VwLl9zaHVmZmxlZFByb21wdEl0ZW1zW3RoaXMucHJvbXB0SXRlbUlkeEluR3JvdXBdO1xyXG5cclxuICAgIC8vdGhpcy5zZWxlY3RlZEl0ZW1JZHggPSB0aGlzLnByb21wdEluZGV4O1xyXG5cclxuICAgIGlmKHRoaXMuYXVkaW9GZXRjaFN1YnNjcmlwdGlvbil7XHJcbiAgICAgIHRoaXMuYXVkaW9GZXRjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jbGVhclByb21wdCgpO1xyXG5cclxuICAgIGxldCBpc05vbnJlY29yZGluZz0odGhpcy5wcm9tcHRJdGVtLnR5cGU9PT0nbm9ucmVjb3JkaW5nJylcclxuXHJcbiAgICBpZiAoaXNOb25yZWNvcmRpbmcgfHwgIXRoaXMuc2VjdGlvbi5wcm9tcHRwaGFzZSB8fCB0aGlzLnNlY3Rpb24ucHJvbXB0cGhhc2UgPT09ICdJRExFJykge1xyXG4gICAgICB0aGlzLmFwcGx5UHJvbXB0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYoaXNOb25yZWNvcmRpbmcpe1xyXG4gICAgICB0aGlzLnN0YXJ0U3RvcFNpZ25hbFN0YXRlID0gU3RhcnRTdG9wU2lnbmFsU3RhdGUuT0ZGO1xyXG4gICAgfWVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5pdGVtcykge1xyXG4gICAgICAgIGxldCBpdCA9IHRoaXMuaXRlbXNbdGhpcy5wcm9tcHRJbmRleF07XHJcbiAgICAgICAgaWYgKCFpdC5yZWNzKSB7XHJcbiAgICAgICAgICBpdC5yZWNzID0gbmV3IEFycmF5PFNwclJlY29yZGluZ0ZpbGU+KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcmVjZW50UmVjRmlsZTogU3ByUmVjb3JkaW5nRmlsZSB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIGxldCBhdmFpbFJlY2ZpbGVzOiBudW1iZXIgPSBpdC5yZWNzLmxlbmd0aDtcclxuICAgICAgICBpZiAoYXZhaWxSZWNmaWxlcyA+IDApIHtcclxuICAgICAgICAgIGxldCByZlZlcnM6IG51bWJlciA9IGF2YWlsUmVjZmlsZXMgLSAxO1xyXG4gICAgICAgICAgcmVjZW50UmVjRmlsZSA9IGl0LnJlY3NbcmZWZXJzXTtcclxuICAgICAgICAgIHRoaXMuZGlzcGxheVJlY0ZpbGUgPSByZWNlbnRSZWNGaWxlO1xyXG4gICAgICAgICAgdGhpcy5kaXNwbGF5UmVjRmlsZVZlcnNpb24gPSByZlZlcnM7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmRpc3BsYXlSZWNGaWxlID0gbnVsbDtcclxuICAgICAgICAgIHRoaXMuZGlzcGxheVJlY0ZpbGVWZXJzaW9uID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0ZW1wb3JhcnkpIHtcclxuICAgICAgICB0aGlzLnNob3dSZWNvcmRpbmcoKTtcclxuICAgICAgfVxyXG4gICAgICBpZighdGhpcy5yZWFkb25seSkge1xyXG4gICAgICAgIHRoaXMuc3RhcnRTdG9wU2lnbmFsU3RhdGUgPSBTdGFydFN0b3BTaWduYWxTdGF0ZS5JRExFO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZVN0YXJ0QWN0aW9uRGlzYWJsZVN0YXRlKClcclxuICAgIHRoaXMudXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKVxyXG4gIH1cclxuXHJcblxyXG4gIHN0YXJ0KCkge1xyXG4gICAgc3VwZXIuc3RhcnQoKTtcclxuICAgIGlmKHRoaXMucHJvbXB0SXRlbUNvdW50PjApIHtcclxuICAgICAgdGhpcy5wcm9tcHRJbmRleCA9IDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLmVuYWJsZU5hdmlnYXRpb24oKVxyXG4gIH1cclxuXHJcbiAgaXNSZWNvcmRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuc3RhdHVzID09PSBTdGF0dXMuUFJFX1JFQ09SRElORyB8fCB0aGlzLnN0YXR1cyA9PT0gU3RhdHVzLlJFQ09SRElORyk7XHJcbiAgfVxyXG5cclxuICBpc0FjdGl2ZSgpOiBib29sZWFue1xyXG4gICAgcmV0dXJuICghKHRoaXMuc3RhdHVzID09PSBTdGF0dXMuQkxPQ0tFRCB8fCB0aGlzLnN0YXR1cz09PSBTdGF0dXMuSURMRSB8fCB0aGlzLnN0YXR1cz09PVN0YXR1cy5FUlJPUikgfHwgdGhpcy5wcm9jZXNzaW5nUmVjb3JkaW5nIHx8IHRoaXMuc2Vzc2lvblNlcnZpY2UudXBsb2FkQ291bnQ+MClcclxuICB9XHJcblxyXG4gICAgcHJldkl0ZW0oKSB7XHJcbiAgICAgICBsZXQgbmV3UHJJZHg9dGhpcy5fcHJvbXB0SW5kZXg7XHJcbiAgICAgICBuZXdQcklkeC0tO1xyXG4gICAgICAgaWYobmV3UHJJZHg8MCl7XHJcbiAgICAgICAgIG5ld1BySWR4PXRoaXMucHJvbXB0SXRlbUNvdW50LTE7XHJcbiAgICAgICB9XHJcbiAgICAgICB0aGlzLnByb21wdEluZGV4PW5ld1BySWR4O1xyXG4gICAgICAvL3RoaXMudXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgbmV4dEl0ZW0oKSB7XHJcbiAgICBsZXQgbmV3UHJJZHg9dGhpcy5fcHJvbXB0SW5kZXg7XHJcbiAgICBuZXdQcklkeCsrO1xyXG4gICAgaWYobmV3UHJJZHg+PXRoaXMucHJvbXB0SXRlbUNvdW50KXtcclxuICAgICAgbmV3UHJJZHg9MDtcclxuICAgIH1cclxuICAgIHRoaXMucHJvbXB0SW5kZXg9bmV3UHJJZHg7XHJcbiAgICAvL3RoaXMudXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKXtcclxuICAgIGxldCBmd2ROeHRBY3Rpb25EaXNhYmxlZD10cnVlO1xyXG4gICAgaWYodGhpcy5pdGVtcyl7XHJcbiAgICAgIGxldCBjdXJyUmVjcz10aGlzLml0ZW1zW3RoaXMuX3Byb21wdEluZGV4XS5yZWNzO1xyXG4gICAgICBmd2ROeHRBY3Rpb25EaXNhYmxlZD0gISAoY3VyclJlY3MhPW51bGwgJiYgY3VyclJlY3MubGVuZ3RoPjApO1xyXG4gICAgfVxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZE5leHRBY3Rpb24uZGlzYWJsZWQgPSB0aGlzLm5hdmlnYXRpb25EaXNhYmxlZCB8fCBmd2ROeHRBY3Rpb25EaXNhYmxlZDtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24uZGlzYWJsZWQgPSB0aGlzLm5hdmlnYXRpb25EaXNhYmxlZDtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5id2RBY3Rpb24uZGlzYWJsZWQgPSB0aGlzLm5hdmlnYXRpb25EaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIG5leHRVbnJlY29yZGVkSXRlbSgpIHtcclxuICAgIGxldCBuZXdQcklkeCA9IHRoaXMuX3Byb21wdEluZGV4O1xyXG4gICAgbmV3UHJJZHgrKztcclxuICAgIGlmIChuZXdQcklkeCA+PSB0aGlzLnByb21wdEl0ZW1Db3VudCkge1xyXG4gICAgICBuZXdQcklkeCA9IDA7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLml0ZW1zIT1udWxsKSB7XHJcbiAgICAgIGxldCBpdFJlY3M9dGhpcy5pdGVtc1tuZXdQcklkeF0ucmVjcztcclxuICAgICAgd2hpbGUgKGl0UmVjcyE9bnVsbCAmJiAoaXRSZWNzLmxlbmd0aCA+IDApICYmIG5ld1BySWR4IDwgdGhpcy5wcm9tcHRJdGVtQ291bnQpIHtcclxuICAgICAgICBuZXdQcklkeCsrO1xyXG4gICAgICAgIGl0UmVjcz10aGlzLml0ZW1zW25ld1BySWR4XS5yZWNzO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghaXRSZWNzIHx8IGl0UmVjcy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgIHRoaXMucHJvbXB0SW5kZXggPSBuZXdQcklkeDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZW5hYmxlU3RhcnRVc2VyR2VzdHVyZSgpIHtcclxuICAgIHN1cGVyLmVuYWJsZVN0YXJ0VXNlckdlc3R1cmUoKTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5kaXNhYmxlZD0hKHRoaXMuYWMgJiYgdGhpcy5pc1JlY29yZGluZ0l0ZW0oKSk7XHJcbiAgfVxyXG5cclxuICBlbmFibGVOYXZpZ2F0aW9uKCl7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25EaXNhYmxlZD1mYWxzZTtcclxuICAgIHRoaXMudXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIG9wZW5lZCgpIHtcclxuICAgIGlmKHRoaXMuYWMpIHtcclxuICAgICAgdGhpcy5hYy5zdGFydCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhcnRlZCgpIHtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlBSRV9SRUNPUkRJTkc7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5zdGFydFN0b3BTaWduYWxTdGF0ZSA9IFN0YXJ0U3RvcFNpZ25hbFN0YXRlLlBSRVJFQ09SRElORztcclxuICAgIGlmKHRoaXMuX3Nlc3Npb24pIHtcclxuICAgICAgaWYgKHRoaXMuX3Nlc3Npb24uc3RhdHVzID09PSBcIkxPQURFRFwiKSB7XHJcbiAgICAgICAgbGV0IGJvZHk6IGFueSA9IHt9O1xyXG4gICAgICAgIGlmICh0aGlzLnNlY3Rpb24udHJhaW5pbmcpIHtcclxuICAgICAgICAgIHRoaXMuX3Nlc3Npb24uc3RhdHVzID0gXCJTVEFSVEVEX1RSQUlOSU5HXCJcclxuICAgICAgICAgIGJvZHkuc3RhdHVzID0gdGhpcy5fc2Vzc2lvbi5zdGF0dXM7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX3Nlc3Npb24uc3RhcnRlZFRyYWluaW5nRGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXNzaW9uLnN0YXJ0ZWRUcmFpbmluZ0RhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBib2R5LnN0YXJ0ZWRUcmFpbmluZ0RhdGUgPSB0aGlzLl9zZXNzaW9uLnN0YXJ0ZWRUcmFpbmluZ0RhdGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX3Nlc3Npb24uc3RhdHVzID0gXCJTVEFSVEVEXCJcclxuICAgICAgICAgIGJvZHkuc3RhdHVzID0gdGhpcy5fc2Vzc2lvbi5zdGF0dXM7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX3Nlc3Npb24uc3RhcnRlZERhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2Vzc2lvbi5zdGFydGVkRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgIGJvZHkuc3RhcnRlZERhdGUgPSB0aGlzLl9zZXNzaW9uLnN0YXJ0ZWREYXRlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlLnBhdGNoU2Vzc2lvbk9ic2VydmVyKHRoaXMuX3Nlc3Npb24sIGJvZHkpLnN1YnNjcmliZSgpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlY3Rpb24ucHJvbXB0cGhhc2UgPT09ICdQUkVSRUNPUkRJTkcnIHx8IHRoaXMuc2VjdGlvbi5wcm9tcHRwaGFzZSA9PT0gJ1BSRVJFQ09SRElOR09OTFknKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlQcm9tcHQoKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2luZm8nO1xyXG4gICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nLi4uJztcclxuXHJcbiAgICBsZXQgcHJlRGVsYXkgPSBERUZBVUxUX1BSRV9SRUNfREVMQVk7XHJcbiAgICBpZiAodGhpcy5wcm9tcHRJdGVtLnByZXJlY29yZGluZykge1xyXG4gICAgICBwcmVEZWxheSA9IHRoaXMucHJvbXB0SXRlbS5wcmVyZWNvcmRpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBvc3REZWxheT1ERUZBVUxUX1BPU1RfUkVDX0RFTEFZO1xyXG4gICAgaWYodGhpcy5wcm9tcHRJdGVtLnBvc3RyZWNvcmRpbmcpe1xyXG4gICAgICBwb3N0RGVsYXk9dGhpcy5wcm9tcHRJdGVtLnBvc3RyZWNvcmRpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG1heFJlY29yZGluZ1RpbWVNcyA9IE1BWF9SRUNPUkRJTkdfVElNRV9NUztcclxuICAgIGlmICh0aGlzLnByb21wdEl0ZW0ucmVjZHVyYXRpb24hPT1udWxsICYmIHRoaXMucHJvbXB0SXRlbS5yZWNkdXJhdGlvbiE9PXVuZGVmaW5lZCkge1xyXG4gICAgICBtYXhSZWNvcmRpbmdUaW1lTXMgPSBwcmVEZWxheSt0aGlzLnByb21wdEl0ZW0ucmVjZHVyYXRpb24rcG9zdERlbGF5O1xyXG4gICAgfVxyXG4gICAgdGhpcy5tYXhSZWNUaW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnN0b3BSZWNvcmRpbmdNYXhSZWMoKVxyXG4gICAgfSwgbWF4UmVjb3JkaW5nVGltZU1zKTtcclxuICAgIHRoaXMubWF4UmVjVGltZXJSdW5uaW5nID0gdHJ1ZTtcclxuXHJcblxyXG5cclxuICAgIHRoaXMucHJlUmVjVGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgIHRoaXMucHJlUmVjVGltZXJSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlJFQ09SRElORztcclxuICAgICAgdGhpcy5zdGFydFN0b3BTaWduYWxTdGF0ZSA9IFN0YXJ0U3RvcFNpZ25hbFN0YXRlLlJFQ09SRElORztcclxuICAgICAgaWYgKHRoaXMuc2VjdGlvbi5tb2RlID09PSAnQVVUT1JFQ09SRElORycpIHtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuc2VjdGlvbi5wcm9tcHRwaGFzZSA9PT0gJ1JFQ09SRElORycpIHtcclxuICAgICAgICB0aGlzLmFwcGx5UHJvbXB0KCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuc2VjdGlvbi5wcm9tcHRwaGFzZSA9PT0gJ1BSRVJFQ09SRElOR09OTFknKXtcclxuICAgICAgICB0aGlzLmNsZWFyUHJvbXB0KCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9LCBwcmVEZWxheSk7XHJcbiAgICB0aGlzLnByZVJlY1RpbWVyUnVubmluZyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBzdG9wSXRlbSgpIHtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlBPU1RfUkVDX1NUT1A7XHJcbiAgICB0aGlzLnN0YXJ0U3RvcFNpZ25hbFN0YXRlID0gU3RhcnRTdG9wU2lnbmFsU3RhdGUuUE9TVFJFQ09SRElORztcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIGxldCBwb3N0RGVsYXkgPSA1MDA7XHJcbiAgICBpZiAodGhpcy5wcm9tcHRJdGVtLnBvc3RyZWNvcmRpbmcpIHtcclxuICAgICAgcG9zdERlbGF5ID0gdGhpcy5wcm9tcHRJdGVtLnBvc3RyZWNvcmRpbmc7XHJcbiAgICB9XHJcbiAgICB0aGlzLnBvc3RSZWNUaW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnBvc3RSZWNUaW1lclJ1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuU1RPUFBJTkdfU1RPUDtcclxuICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nKCk7XHJcbiAgICB9LCBwb3N0RGVsYXkpO1xyXG4gICAgdGhpcy5wb3N0UmVjVGltZXJSdW5uaW5nID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHBhdXNlSXRlbSgpIHtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlBPU1RfUkVDX1BBVVNFO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RhcnRTdG9wU2lnbmFsU3RhdGUgPSBTdGFydFN0b3BTaWduYWxTdGF0ZS5QT1NUUkVDT1JESU5HO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIGxldCBwb3N0RGVsYXkgPSA1MDA7XHJcbiAgICBpZiAodGhpcy5wcm9tcHRJdGVtLnBvc3RyZWNvcmRpbmcpIHtcclxuICAgICAgcG9zdERlbGF5ID0gdGhpcy5wcm9tcHRJdGVtLnBvc3RyZWNvcmRpbmc7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHRoaXMucG9zdFJlY1RpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucG9zdFJlY1RpbWVyUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5TVE9QUElOR19QQVVTRTtcclxuICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nKCk7XHJcbiAgICB9LCBwb3N0RGVsYXkpO1xyXG4gICAgdGhpcy5wb3N0UmVjVGltZXJSdW5uaW5nID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHN0b3BSZWNvcmRpbmcoKSB7XHJcbiAgICBpZiAodGhpcy5tYXhSZWNUaW1lclJ1bm5pbmcpIHtcclxuICAgICAgaWYodGhpcy5tYXhSZWNUaW1lcklkKSB7XHJcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLm1heFJlY1RpbWVySWQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubWF4UmVjVGltZXJSdW5uaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLmFjKSB7XHJcbiAgICAgIHRoaXMuYWMuc3RvcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RvcFJlY29yZGluZ01heFJlYygpe1xyXG4gICAgaWYodGhpcy5wb3N0UmVjVGltZXJSdW5uaW5nKXtcclxuICAgICAgaWYodGhpcy5wb3N0UmVjVGltZXJJZCkge1xyXG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5wb3N0UmVjVGltZXJJZCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wb3N0UmVjVGltZXJSdW5uaW5nPWZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tYXhSZWNUaW1lclJ1bm5pbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlNUT1BQSU5HX1NUT1A7XHJcbiAgICBpZih0aGlzLmFjKSB7XHJcbiAgICAgIHRoaXMuYWMuc3RvcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkUmVjb3JkaW5nRmlsZUJ5RGVzY3JpcHRvcihyZmQ6UmVjb3JkaW5nRmlsZURlc2NyaXB0b3JJbXBsKXtcclxuICAgIGlmKHJmZC5yZWNvcmRpbmcgJiYgcmZkLnJlY29yZGluZy5pdGVtY29kZSkge1xyXG4gICAgICBsZXQgcHJJZHggPSB0aGlzLnByb21wdEluZGV4QnlJdGVtY29kZShyZmQucmVjb3JkaW5nLml0ZW1jb2RlKTtcclxuICAgICAgaWYgKHRoaXMuaXRlbXMhPW51bGwgJiYgcHJJZHggIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgaXQgPSB0aGlzLml0ZW1zW3BySWR4XTtcclxuICAgICAgICBpZiAoaXQgJiYgdGhpcy5fc2Vzc2lvbikge1xyXG4gICAgICAgICAgaWYgKCFpdC5yZWNzKSB7XHJcbiAgICAgICAgICAgIGl0LnJlY3MgPSBuZXcgQXJyYXk8U3ByUmVjb3JkaW5nRmlsZT4oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCByZiA9IG5ldyBTcHJSZWNvcmRpbmdGaWxlKHRoaXMuX3Nlc3Npb24uc2Vzc2lvbklkLCByZmQucmVjb3JkaW5nLml0ZW1jb2RlLCByZmQudmVyc2lvbiwgbnVsbCk7XHJcbiAgICAgICAgICBpdC5yZWNzW3JmZC52ZXJzaW9uXSA9IHJmO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiV0FSTjogTm8gcmVjb3JkaW5nIGl0ZW0gd2l0aCBjb2RlOiBcXFwiXCIgK3JmZC5yZWNvcmRpbmcuaXRlbWNvZGUrIFwiXFxcIiBmb3VuZC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIldBUk46IE5vIHJlY29yZGluZyBpdGVtIHdpdGggY29kZTogXFxcIlwiICtyZmQucmVjb3JkaW5nLml0ZW1jb2RlKyBcIlxcXCIgZm91bmQuXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRSZWNvcmRpbmdGaWxlQnlQcm9tcHRJbmRleChwcm9tcHRJbmRleDpudW1iZXIsIHJmOlNwclJlY29yZGluZ0ZpbGUpe1xyXG5cclxuICB9XHJcblxyXG5cclxuICBzdG9wcGVkKCkge1xyXG4gICAgdGhpcy51cGRhdGVTdGFydEFjdGlvbkRpc2FibGVTdGF0ZSgpXHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnaW5mbyc7XHJcbiAgICB0aGlzLnN0YXR1c01zZyA9ICdSZWNvcmRlZC4nO1xyXG4gICAgdGhpcy5zdGFydFN0b3BTaWduYWxTdGF0ZSA9IFN0YXJ0U3RvcFNpZ25hbFN0YXRlLklETEU7XHJcblxyXG4gICAgbGV0IGFkOkF1ZGlvQnVmZmVyfG51bGwgPSBudWxsO1xyXG4gICAgaWYodGhpcy5hYyE9bnVsbCl7XHJcbiAgICAgIGFkPXRoaXMuYWMuYXVkaW9CdWZmZXIoKTtcclxuICAgIH1cclxuICAgIGxldCBpYyA9IHRoaXMucHJvbXB0SXRlbS5pdGVtY29kZTtcclxuICAgIGxldCByZj1udWxsO1xyXG4gICAgaWYgKHRoaXMuX3Nlc3Npb24gJiYgaWMpIHtcclxuICAgICAgbGV0IHNlc3NJZDogc3RyaW5nIHwgbnVtYmVyID0gdGhpcy5fc2Vzc2lvbi5zZXNzaW9uSWQ7XHJcbiAgICAgIGxldCBjcElkeCA9IHRoaXMucHJvbXB0SW5kZXg7XHJcbiAgICAgIGlmICh0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgbGV0IGl0PXRoaXMuaXRlbXNbY3BJZHhdO1xyXG4gICAgICAgIGlmICghaXQucmVjcykge1xyXG4gICAgICAgICAgaXQucmVjcyA9IG5ldyBBcnJheTxTcHJSZWNvcmRpbmdGaWxlPigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZiA9IG5ldyBTcHJSZWNvcmRpbmdGaWxlKHNlc3NJZCwgaWMsIGl0LnJlY3MubGVuZ3RoLCBhZCk7XHJcbiAgICAgICAgaXQucmVjcy5wdXNoKHJmKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5lbmFibGVVcGxvYWRSZWNvcmRpbmdzKSB7XHJcbiAgICAgICAgLy8gVE9ETyB1c2UgU3BlZWNoUmVjb3JkZXJjb25maWcgcmVzcC4gUmVjZmlsZVNlcnZpY2VcclxuICAgICAgICAvLyBjb252ZXJ0IGFzeW5jaHJvbm91c2x5IHRvIDE2LWJpdCBpbnRlZ2VyIFBDTVxyXG4gICAgICAgIC8vIFRPRE8gY291bGQgd2UgYXZvaWQgY29udmVyc2lvbiB0byBzYXZlIENQVSByZXNvdXJjZXMgYW5kIHRyYW5zZmVyIGZsb2F0IFBDTSBkaXJlY3RseT9cclxuICAgICAgICAvLyBUT0RPIGR1cGxpY2F0ZSBjb252ZXJzaW9uIGZvciBtYW51YWwgZG93bmxvYWRcclxuICAgICAgICAvL2NvbnNvbGUubG9nKFwiQnVpbGQgd2F2IHdyaXRlci4uLlwiKTtcclxuICAgICAgICB0aGlzLnByb2Nlc3NpbmdSZWNvcmRpbmc9dHJ1ZVxyXG4gICAgICAgIGlmKGFkICYmIHJmKSB7XHJcbiAgICAgICAgICBsZXQgd3cgPSBuZXcgV2F2V3JpdGVyKCk7XHJcbiAgICAgICAgICAvL25ldyBSRVNUIEFQSSBVUkxcclxuICAgICAgICAgIGxldCBhcGlFbmRQb2ludCA9ICcnO1xyXG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaUVuZFBvaW50KSB7XHJcbiAgICAgICAgICAgIGFwaUVuZFBvaW50ID0gdGhpcy5jb25maWcuYXBpRW5kUG9pbnQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoYXBpRW5kUG9pbnQgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIGFwaUVuZFBvaW50ID0gYXBpRW5kUG9pbnQgKyAnLydcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBzZXNzaW9uc1VybCA9IGFwaUVuZFBvaW50ICsgU2Vzc2lvblNlcnZpY2UuU0VTU0lPTl9BUElfQ1RYO1xyXG4gICAgICAgICAgbGV0IHJlY1VybDogc3RyaW5nID0gc2Vzc2lvbnNVcmwgKyAnLycgKyByZi5zZXNzaW9uICsgJy8nICsgUkVDRklMRV9BUElfQ1RYICsgJy8nICsgcmYuaXRlbUNvZGU7XHJcbiAgICAgICAgICB3dy53cml0ZUFzeW5jKGFkLCAod2F2RmlsZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBvc3RSZWNvcmRpbmcod2F2RmlsZSwgcmVjVXJsKTtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzaW5nUmVjb3JkaW5nID0gZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGNoZWNrIGNvbXBsZXRlIHNlc3Npb25cclxuICAgIGxldCBjb21wbGV0ZSA9IHRydWU7XHJcbiAgICBpZih0aGlzLml0ZW1zKSB7XHJcbiAgICAgIC8vIHNlYXJjaCBiYWNrd2FyZHMsIHRvIGdhaW4gZmFzdGVyIGRldGVjdGlvbiBvZiBpbmNvbXBsZXRlIHN0YXRlXHJcbiAgICAgIGZvciAobGV0IHJpID0gdGhpcy5pdGVtcy5sZW5ndGggLSAxOyByaSA+PSAwOyByaS0tKSB7XHJcbiAgICAgICAgbGV0IGl0ID0gdGhpcy5pdGVtc1tyaV07XHJcbiAgICAgICAgaWYgKGl0LnJlY29yZGluZyAmJiAhaXQudHJhaW5pbmcgJiYgKCFpdC5yZWNzIHx8IGl0LnJlY3MubGVuZ3RoID09IDApKSB7XHJcbiAgICAgICAgICBjb21wbGV0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGF1dG9TdGFydCA9ICh0aGlzLnN0YXR1cyA9PT0gU3RhdHVzLlNUT1BQSU5HX1NUT1ApO1xyXG4gICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuSURMRTtcclxuICAgIGxldCBzdGFydE5leHQ9ZmFsc2U7XHJcbiAgICBpZiAoY29tcGxldGUpIHtcclxuICAgICAgaWYodGhpcy5fc2Vzc2lvbiE9bnVsbCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fc2Vzc2lvbi5zZWFsZWQgJiYgdGhpcy5fc2Vzc2lvbi5zdGF0dXMgIT09IFwiQ09NUExFVEVEXCIpIHtcclxuICAgICAgICAgIGxldCBib2R5OiBhbnkgPSB7fVxyXG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbi5zdGF0dXMgPSBcIkNPTVBMRVRFRFwiO1xyXG4gICAgICAgICAgYm9keS5zdGF0dXMgPSB0aGlzLl9zZXNzaW9uLnN0YXR1cztcclxuICAgICAgICAgIGlmICghdGhpcy5fc2Vzc2lvbi5jb21wbGV0ZWREYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Nlc3Npb24uY29tcGxldGVkRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgIGJvZHkuY29tcGxldGVkRGF0ZSA9IHRoaXMuX3Nlc3Npb24uY29tcGxldGVkRGF0ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuc2Vzc2lvblNlcnZpY2UucGF0Y2hTZXNzaW9uT2JzZXJ2ZXIodGhpcy5fc2Vzc2lvbiwgYm9keSkuc3Vic2NyaWJlKClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnU2Vzc2lvbiBjb21wbGV0ZSEnO1xyXG4gICAgICBsZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihTZXNzaW9uRmluaXNoZWREaWFsb2csIHt9KTtcclxuXHJcbiAgICAgIC8vIGVuYWJsZSBuYXZpZ2F0aW9uXHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZVxyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuYndkQWN0aW9uLmRpc2FibGVkID0gZmFsc2VcclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICBpZiAodGhpcy5zZWN0aW9uLm1vZGUgPT09ICdBVVRPUFJPR1JFU1MnIHx8IHRoaXMuc2VjdGlvbi5tb2RlID09PSAnQVVUT1JFQ09SRElORycpIHtcclxuICAgICAgICB0aGlzLm5leHRJdGVtKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnNlY3Rpb24ubW9kZSA9PT0gJ0FVVE9SRUNPUkRJTkcnICYmIHRoaXMuYXV0b3JlY29yZGluZyAmJiBhdXRvU3RhcnQpIHtcclxuICAgICAgICBzdGFydE5leHQ9dHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRpb25EaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gYXBwbHkgcmVjb3JkZWQgaXRlbVxyXG4gICAgdGhpcy5hcHBseUl0ZW0oc3RhcnROZXh0KTtcclxuICAgIGlmKHN0YXJ0TmV4dCl7XHJcbiAgICAgIHRoaXMuc3RhcnRJdGVtKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHBvc3RSZWNvcmRpbmcod2F2RmlsZTogVWludDhBcnJheSwgcmVjVXJsOiBzdHJpbmcpIHtcclxuICAgIGxldCB3YXZCbG9iID0gbmV3IEJsb2IoW3dhdkZpbGVdLCB7dHlwZTogJ2F1ZGlvL3dhdid9KTtcclxuICAgIGxldCB1bCA9IG5ldyBVcGxvYWQod2F2QmxvYiwgcmVjVXJsKTtcclxuICAgIHRoaXMudXBsb2FkZXIucXVldWVVcGxvYWQodWwpO1xyXG4gIH1cclxuXHJcbiAgc3RvcCgpIHtcclxuICAgIGlmKHRoaXMuYWMhPW51bGwpe1xyXG4gICAgICB0aGlzLmFjLmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUNvbnRyb2xQbGF5YmFja1Bvc2l0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5wbGF5UG9zaXRpb25GcmFtZXMpIHtcclxuICAgICAgdGhpcy5wcm9tcHRpbmcuYXVkaW9EaXNwbGF5LnBsYXlGcmFtZVBvc2l0aW9uID0gdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLnBsYXlQb3NpdGlvbkZyYW1lcztcclxuICAgICAgdGhpcy5saXZlTGV2ZWxEaXNwbGF5LnBsYXlGcmFtZVBvc2l0aW9uID0gdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLnBsYXlQb3NpdGlvbkZyYW1lcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGF1ZGlvUGxheWVyVXBkYXRlKGU6IEF1ZGlvUGxheWVyRXZlbnQpIHtcclxuICAgIGlmIChFdmVudFR5cGUuUkVBRFkgPT09IGUudHlwZSkge1xyXG5cclxuICAgIH0gZWxzZSBpZiAoRXZlbnRUeXBlLlNUQVJURUQgPT09IGUudHlwZSkge1xyXG4gICAgICAvL3RoaXMuc3RhdHVzID0gJ1BsYXliYWNrLi4uJztcclxuICAgICAgdGhpcy51cGRhdGVUaW1lcklkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHRoaXMudXBkYXRlQ29udHJvbFBsYXliYWNrUG9zaXRpb24oKSwgNTApO1xyXG5cclxuICAgIH0gZWxzZSBpZiAoRXZlbnRUeXBlLkVOREVEID09PSBlLnR5cGUpIHtcclxuICAgICAgLy8uc3RhdHVzPSdSZWFkeS4nO1xyXG4gICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVwZGF0ZVRpbWVySWQpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBpZighdGhpcy5kZXN0cm95ZWQpIHtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG59XHJcblxyXG4iXX0=