speechrecorderng 3.3.2 → 3.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +92 -77
- package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +11 -5
- package/esm2020/lib/speechrecorder/session/controlpanel.mjs +50 -37
- package/esm2020/lib/speechrecorder/session/prompting.mjs +19 -15
- package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +14 -11
- package/esm2020/lib/speechrecorder/session/recording_list.mjs +2 -2
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +9 -9
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +3 -3
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +3 -3
- package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +77 -62
- package/esm2020/lib/speechrecorderng.component.mjs +2 -1
- package/esm2020/lib/speechrecorderng.module.mjs +5 -5
- package/esm2020/lib/spr.module.version.mjs +2 -2
- package/esm2020/lib/ui/recordingitem_display.mjs +29 -25
- package/esm2020/lib/ui/responsive_component.mjs +24 -0
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/speechrecorderng.mjs +283 -205
- package/fesm2015/speechrecorderng.mjs.map +1 -1
- package/fesm2020/speechrecorderng.mjs +283 -205
- package/fesm2020/speechrecorderng.mjs.map +1 -1
- package/lib/speechrecorder/session/audiorecorder.d.ts +5 -3
- package/lib/speechrecorder/session/basicrecorder.d.ts +6 -3
- package/lib/speechrecorder/session/controlpanel.d.ts +9 -3
- package/lib/speechrecorder/session/prompting.d.ts +5 -1
- package/lib/speechrecorder/session/recorder_combi_pane.d.ts +5 -2
- package/lib/speechrecorder/session/sessionmanager.d.ts +5 -3
- package/lib/speechrecorderng.component.d.ts +1 -1
- package/lib/speechrecorderng.module.d.ts +18 -19
- package/lib/spr.module.version.d.ts +1 -1
- package/lib/ui/recordingitem_display.d.ts +8 -4
- package/lib/ui/responsive_component.d.ts +9 -0
- package/package.json +1 -2
- package/public-api.d.ts +1 -0
|
@@ -18,26 +18,26 @@ import { RecorderComponent } from "../../recorder_component";
|
|
|
18
18
|
import { AudioBufferSource, AudioDataHolder } from "../../audio/audio_data_holder";
|
|
19
19
|
import { NetAudioBuffer } from "../../audio/net_audio_buffer";
|
|
20
20
|
import * as i0 from "@angular/core";
|
|
21
|
-
import * as i1 from "@angular/
|
|
22
|
-
import * as i2 from "@angular/
|
|
23
|
-
import * as i3 from "
|
|
24
|
-
import * as i4 from "
|
|
25
|
-
import * as i5 from "../
|
|
26
|
-
import * as i6 from "
|
|
27
|
-
import * as i7 from "@angular/
|
|
28
|
-
import * as i8 from "@angular/
|
|
29
|
-
import * as i9 from "@angular/material/
|
|
30
|
-
import * as i10 from "
|
|
31
|
-
import * as i11 from "
|
|
32
|
-
import * as i12 from "
|
|
33
|
-
import * as i13 from "
|
|
34
|
-
import * as i14 from "./
|
|
35
|
-
import * as i15 from "
|
|
36
|
-
import * as i16 from "
|
|
37
|
-
import * as i17 from "../project/project.service";
|
|
21
|
+
import * as i1 from "@angular/cdk/layout";
|
|
22
|
+
import * as i2 from "@angular/router";
|
|
23
|
+
import * as i3 from "@angular/material/dialog";
|
|
24
|
+
import * as i4 from "./session.service";
|
|
25
|
+
import * as i5 from "../recordings/recordings.service";
|
|
26
|
+
import * as i6 from "../spruploader";
|
|
27
|
+
import * as i7 from "@angular/common";
|
|
28
|
+
import * as i8 from "@angular/material/icon";
|
|
29
|
+
import * as i9 from "@angular/material/button";
|
|
30
|
+
import * as i10 from "../../audio/ui/livelevel";
|
|
31
|
+
import * as i11 from "./controlpanel";
|
|
32
|
+
import * as i12 from "../../ui/recordingitem_display";
|
|
33
|
+
import * as i13 from "./warning_bar";
|
|
34
|
+
import * as i14 from "./recorder_combi_pane";
|
|
35
|
+
import * as i15 from "../../spr.config";
|
|
36
|
+
import * as i16 from "../project/project.service";
|
|
38
37
|
export class AudioRecorder extends BasicRecorder {
|
|
39
|
-
constructor(changeDetectorRef, renderer, route, dialog, sessionService, recFileService, uploader, config) {
|
|
40
|
-
super(changeDetectorRef, dialog, sessionService, uploader, config);
|
|
38
|
+
constructor(bpo, changeDetectorRef, renderer, route, dialog, sessionService, recFileService, uploader, config) {
|
|
39
|
+
super(bpo, changeDetectorRef, dialog, sessionService, uploader, config);
|
|
40
|
+
this.bpo = bpo;
|
|
41
41
|
this.renderer = renderer;
|
|
42
42
|
this.route = route;
|
|
43
43
|
this.recFileService = recFileService;
|
|
@@ -156,7 +156,7 @@ export class AudioRecorder extends BasicRecorder {
|
|
|
156
156
|
this.transportActions.stopAction.onAction = () => this.stopItem();
|
|
157
157
|
this.transportActions.nextAction.onAction = () => this.stopItem();
|
|
158
158
|
//this.transportActions.pauseAction.onAction = () => this.pauseItem();
|
|
159
|
-
this.playStartAction.onAction = () => this.controlAudioPlayer
|
|
159
|
+
this.playStartAction.onAction = () => this.controlAudioPlayer?.start();
|
|
160
160
|
}
|
|
161
161
|
this.uploader.listener = (ue) => {
|
|
162
162
|
this.uploadUpdate(ue);
|
|
@@ -425,14 +425,18 @@ export class AudioRecorder extends BasicRecorder {
|
|
|
425
425
|
this.displayAudioClip = new AudioClip(adh);
|
|
426
426
|
//this.audioLoaded=true;
|
|
427
427
|
//console.debug(" set recording file: display audio clip set");
|
|
428
|
-
this.
|
|
428
|
+
if (this._controlAudioPlayer) {
|
|
429
|
+
this._controlAudioPlayer.audioClip = this.displayAudioClip;
|
|
430
|
+
}
|
|
429
431
|
this.showRecording();
|
|
430
432
|
}
|
|
431
433
|
else {
|
|
432
434
|
// clear for now ...
|
|
433
435
|
this.displayAudioClip = null;
|
|
434
436
|
//console.debug("set recording file: display audio clip null");
|
|
435
|
-
this.
|
|
437
|
+
if (this._controlAudioPlayer) {
|
|
438
|
+
this._controlAudioPlayer.audioClip = null;
|
|
439
|
+
}
|
|
436
440
|
if (this._controlAudioPlayer && this._session) {
|
|
437
441
|
//... and try to fetch from server
|
|
438
442
|
this.liveLevelDisplayState = LiveLevelState.LOADING;
|
|
@@ -486,7 +490,9 @@ export class AudioRecorder extends BasicRecorder {
|
|
|
486
490
|
// this.displayAudioClip could have been changed meanwhile, but the recorder unsubcribes before changing the item. Therefore, there should be no risk to set to wrong item
|
|
487
491
|
this.displayAudioClip = new AudioClip(fabDh);
|
|
488
492
|
}
|
|
489
|
-
this.
|
|
493
|
+
if (this._controlAudioPlayer) {
|
|
494
|
+
this._controlAudioPlayer.audioClip = this.displayAudioClip;
|
|
495
|
+
}
|
|
490
496
|
this.showRecording();
|
|
491
497
|
},
|
|
492
498
|
error: err => {
|
|
@@ -530,7 +536,9 @@ export class AudioRecorder extends BasicRecorder {
|
|
|
530
536
|
// this.audioLoaded=true;
|
|
531
537
|
// }
|
|
532
538
|
}
|
|
533
|
-
this.
|
|
539
|
+
if (this._controlAudioPlayer) {
|
|
540
|
+
this._controlAudioPlayer.audioClip = this.displayAudioClip;
|
|
541
|
+
}
|
|
534
542
|
this.showRecording();
|
|
535
543
|
},
|
|
536
544
|
error: err => {
|
|
@@ -569,7 +577,9 @@ export class AudioRecorder extends BasicRecorder {
|
|
|
569
577
|
this.displayAudioClip = new AudioClip(fabDh);
|
|
570
578
|
//this.audioLoaded=true;
|
|
571
579
|
}
|
|
572
|
-
this.
|
|
580
|
+
if (this._controlAudioPlayer) {
|
|
581
|
+
this._controlAudioPlayer.audioClip = this.displayAudioClip;
|
|
582
|
+
}
|
|
573
583
|
this.showRecording();
|
|
574
584
|
},
|
|
575
585
|
error: err => {
|
|
@@ -603,7 +613,9 @@ export class AudioRecorder extends BasicRecorder {
|
|
|
603
613
|
//this.audioLoaded=true;
|
|
604
614
|
//console.debug("set recording file: display audio clip from fetched audio buffer");
|
|
605
615
|
}
|
|
606
|
-
this.
|
|
616
|
+
if (this._controlAudioPlayer) {
|
|
617
|
+
this._controlAudioPlayer.audioClip = this.displayAudioClip;
|
|
618
|
+
}
|
|
607
619
|
this.showRecording();
|
|
608
620
|
}, error: err => {
|
|
609
621
|
console.error("Could not load recording file from server: " + err);
|
|
@@ -623,7 +635,9 @@ export class AudioRecorder extends BasicRecorder {
|
|
|
623
635
|
else {
|
|
624
636
|
//console.debug("recording file null");
|
|
625
637
|
this.displayAudioClip = null;
|
|
626
|
-
this.
|
|
638
|
+
if (this._controlAudioPlayer) {
|
|
639
|
+
this._controlAudioPlayer.audioClip = null;
|
|
640
|
+
}
|
|
627
641
|
}
|
|
628
642
|
this.showRecording();
|
|
629
643
|
}
|
|
@@ -909,9 +923,12 @@ export class AudioRecorder extends BasicRecorder {
|
|
|
909
923
|
}
|
|
910
924
|
}
|
|
911
925
|
updateControlPlaybackPosition() {
|
|
912
|
-
if (this._controlAudioPlayer
|
|
913
|
-
|
|
914
|
-
|
|
926
|
+
if (this._controlAudioPlayer) {
|
|
927
|
+
const ppFrames = this._controlAudioPlayer.playPositionFrames;
|
|
928
|
+
if (ppFrames !== null) {
|
|
929
|
+
this.recorderCombiPane.audioDisplay.playFramePosition = ppFrames;
|
|
930
|
+
this.liveLevelDisplay.playFramePosition = ppFrames;
|
|
931
|
+
}
|
|
915
932
|
}
|
|
916
933
|
}
|
|
917
934
|
audioPlayerUpdate(e) {
|
|
@@ -930,7 +947,7 @@ export class AudioRecorder extends BasicRecorder {
|
|
|
930
947
|
}
|
|
931
948
|
}
|
|
932
949
|
}
|
|
933
|
-
AudioRecorder.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioRecorder, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token:
|
|
950
|
+
AudioRecorder.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioRecorder, deps: [{ token: i1.BreakpointObserver }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i2.ActivatedRoute }, { token: i3.MatDialog }, { token: i4.SessionService }, { token: i5.RecordingService }, { token: i6.SpeechRecorderUploader }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
|
|
934
951
|
AudioRecorder.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: AudioRecorder, selector: "app-audiorecorder", inputs: { projectName: "projectName", dataSaved: "dataSaved" }, host: { listeners: { "window:keypress": "onKeyPress($event)", "window:keydown": "onKeyDown($event)" } }, providers: [SessionService], viewQueries: [{ propertyName: "recorderCombiPane", first: true, predicate: RecorderCombiPane, descendants: true, static: true }, { propertyName: "liveLevelDisplay", first: true, predicate: LevelBar, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
|
|
935
952
|
<app-warningbar [show]="isTestSession()" warningText="Test recording only!"></app-warningbar>
|
|
936
953
|
<app-warningbar [show]="isDefaultAudioTestSession()"
|
|
@@ -940,18 +957,17 @@ AudioRecorder.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version:
|
|
|
940
957
|
[selectedRecordingFile]="displayRecFile"
|
|
941
958
|
[selectDisabled]="isActive()"
|
|
942
959
|
[displayAudioClip]="displayAudioClip"
|
|
943
|
-
[playStartAction]="controlAudioPlayer
|
|
944
|
-
[playStopAction]="controlAudioPlayer
|
|
945
|
-
[playSelectionAction]="controlAudioPlayer
|
|
946
|
-
[autoPlayOnSelectToggleAction]="controlAudioPlayer
|
|
960
|
+
[playStartAction]="controlAudioPlayer?.startAction"
|
|
961
|
+
[playStopAction]="controlAudioPlayer?.stopAction"
|
|
962
|
+
[playSelectionAction]="controlAudioPlayer?.startSelectionAction"
|
|
963
|
+
[autoPlayOnSelectToggleAction]="controlAudioPlayer?.autoPlayOnSelectToggleAction"
|
|
947
964
|
></app-recordercombipane>
|
|
948
965
|
|
|
949
|
-
<div
|
|
950
|
-
|
|
951
|
-
<audio-levelbar fxFlex="1 0 1" [streamingMode]="isRecording() || keepLiveLevel" [state]="liveLevelDisplayState"
|
|
966
|
+
<div [class]="{audioStatusDisplay:!screenXs,audioStatusDisplayXs:screenXs}">
|
|
967
|
+
<audio-levelbar style="flex:1 0 1%" [streamingMode]="isRecording() || keepLiveLevel" [state]="liveLevelDisplayState"
|
|
952
968
|
[displayLevelInfos]="displayAudioClip?.levelInfos"></audio-levelbar>
|
|
953
|
-
<div
|
|
954
|
-
<spr-recordingitemcontrols
|
|
969
|
+
<div style="flex-direction: row">
|
|
970
|
+
<spr-recordingitemcontrols style="flex:10 0 1%"
|
|
955
971
|
[disableAudioDetails]="disableAudioDetails"
|
|
956
972
|
[audioLoaded]="audioLoaded"
|
|
957
973
|
[playStartAction]="controlAudioPlayer?.startAction"
|
|
@@ -961,19 +977,19 @@ AudioRecorder.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version:
|
|
|
961
977
|
(onShowRecordingDetails)="audioSignalCollapsed=!audioSignalCollapsed">
|
|
962
978
|
</spr-recordingitemcontrols>
|
|
963
979
|
|
|
964
|
-
<app-uploadstatus class="ricontrols dark"
|
|
980
|
+
<app-uploadstatus *ngIf="screenXs && enableUploadRecordings" class="ricontrols dark" style="flex:0 0 0"
|
|
965
981
|
[value]="uploadProgress"
|
|
966
982
|
[status]="uploadStatus" [awaitNewUpload]="processingRecording"></app-uploadstatus>
|
|
967
|
-
<app-wakelockindicator class="ricontrols dark"
|
|
968
|
-
<app-readystateindicator class="ricontrols dark"
|
|
983
|
+
<app-wakelockindicator *ngIf="screenXs" class="ricontrols dark" style="flex:0 0 0" [screenLocked]="screenLocked"></app-wakelockindicator>
|
|
984
|
+
<app-readystateindicator *ngIf="screenXs" class="ricontrols dark" style="flex:0 0 0"
|
|
969
985
|
[ready]="dataSaved && !isActive()"></app-readystateindicator>
|
|
970
986
|
</div>
|
|
971
987
|
</div>
|
|
972
|
-
<div #controlpanel class="controlpanel"
|
|
973
|
-
<app-sprstatusdisplay
|
|
988
|
+
<div #controlpanel class="controlpanel">
|
|
989
|
+
<app-sprstatusdisplay *ngIf="!screenXs" style="flex:0.333 1 30%" [statusMsg]="statusMsg" [statusAlertType]="statusAlertType"
|
|
974
990
|
[statusWaiting]="statusWaiting"
|
|
975
991
|
class="hidden-xs"></app-sprstatusdisplay>
|
|
976
|
-
<div
|
|
992
|
+
<div style="flex:1 0 100%" class="startstop">
|
|
977
993
|
<div style="align-content: center">
|
|
978
994
|
<button (click)="startStopPerform()" [disabled]="startDisabled() && stopDisabled()" mat-raised-button class="bigbutton">
|
|
979
995
|
<mat-icon [style.color]="startStopNextIconColor()" inline="true">{{startStopNextIconName()}}</mat-icon>
|
|
@@ -981,18 +997,18 @@ AudioRecorder.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version:
|
|
|
981
997
|
</button>
|
|
982
998
|
</div>
|
|
983
999
|
</div>
|
|
984
|
-
<div
|
|
985
|
-
<div
|
|
1000
|
+
<div style="flex:0.333 1 30%" >
|
|
1001
|
+
<div style="flex:1 1 auto"></div>
|
|
986
1002
|
|
|
987
|
-
<app-uploadstatus class="ricontrols"
|
|
1003
|
+
<app-uploadstatus *ngIf="!screenXs && enableUploadRecordings" class="ricontrols" style="flex:0 0 0"
|
|
988
1004
|
[value]="uploadProgress"
|
|
989
1005
|
[status]="uploadStatus" [awaitNewUpload]="processingRecording"></app-uploadstatus>
|
|
990
|
-
<app-wakelockindicator class="ricontrols"
|
|
991
|
-
<app-readystateindicator class="ricontrols"
|
|
1006
|
+
<app-wakelockindicator *ngIf="!screenXs" class="ricontrols" [screenLocked]="screenLocked"></app-wakelockindicator>
|
|
1007
|
+
<app-readystateindicator *ngIf="!screenXs" class="ricontrols"
|
|
992
1008
|
[ready]="dataSaved && !isActive()"></app-readystateindicator>
|
|
993
1009
|
</div>
|
|
994
1010
|
</div>
|
|
995
|
-
`, isInline: true, styles: [":host{flex:2;background:lightgrey;display:flex;flex-direction:column;margin:0;padding:0;height:100%;min-height:0px;overflow:hidden}\n", ".ricontrols{padding:4px;box-sizing:border-box;height:100%}\n", ".dark{background:darkgray}\n", ".controlpanel{align-content:center;align-items:center;margin:0;padding:20px;min-height:min-content}\n", ".startstop{width:100%;text-align:center;align-content:center;align-items:center}\n", ".bigbutton{min-width:70px;min-height:50px;font-size:50px;border-radius:20px}\n"
|
|
1011
|
+
`, isInline: true, styles: [":host{flex:2;background:lightgrey;display:flex;flex-direction:column;margin:0;padding:0;height:100%;min-height:0px;overflow:hidden}\n", ".ricontrols{padding:4px;box-sizing:border-box;height:100%}\n", ".dark{background:darkgray}\n", ".controlpanel{display:flex;flex-direction:row;align-content:center;align-items:center;margin:0;padding:20px;min-height:min-content}\n", ".startstop{width:100%;text-align:center;align-content:center;align-items:center}\n", ".bigbutton{min-width:70px;min-height:50px;font-size:50px;border-radius:20px}\n", ".audioStatusDisplay{display:flex;flex-direction:row;height:100px;min-height:100px}\n", ".audioStatusDisplayXs{display:flex;flex-direction:column;height:125px;min-height:125px}\n"], dependencies: [{ kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i10.LevelBar, selector: "audio-levelbar", inputs: ["streamingMode", "displayLevelInfos", "state"] }, { kind: "component", type: i11.StatusDisplay, selector: "app-sprstatusdisplay", inputs: ["statusAlertType", "statusMsg", "statusWaiting"] }, { kind: "component", type: i12.RecordingItemControls, selector: "spr-recordingitemcontrols", inputs: ["audioSignalCollapsed", "enableDownload", "peakDbLvl", "agc", "disableAudioDetails", "audioLoaded", "playStartAction", "playStopAction", "displayLevelInfos"], outputs: ["onShowRecordingDetails", "onDownloadRecording"] }, { kind: "component", type: i11.UploadStatus, selector: "app-uploadstatus", inputs: ["value", "awaitNewUpload", "status"] }, { kind: "component", type: i11.WakeLockIndicator, selector: "app-wakelockindicator", inputs: ["screenLocked"] }, { kind: "component", type: i11.ReadyStateIndicator, selector: "app-readystateindicator", inputs: ["ready"] }, { kind: "component", type: i13.WarningBar, selector: "app-warningbar", inputs: ["warningText", "show"] }, { kind: "component", type: i14.RecorderCombiPane, selector: "app-recordercombipane", inputs: ["selectDisabled", "selectedRecordingFile", "audioSignalCollapsed", "displayAudioClip", "playStartAction", "playSelectionAction", "autoPlayOnSelectToggleAction", "playStopAction"], outputs: ["selectedRecordingFileChanged"] }] });
|
|
996
1012
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioRecorder, decorators: [{
|
|
997
1013
|
type: Component,
|
|
998
1014
|
args: [{ selector: 'app-audiorecorder', providers: [SessionService], template: `
|
|
@@ -1004,18 +1020,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
1004
1020
|
[selectedRecordingFile]="displayRecFile"
|
|
1005
1021
|
[selectDisabled]="isActive()"
|
|
1006
1022
|
[displayAudioClip]="displayAudioClip"
|
|
1007
|
-
[playStartAction]="controlAudioPlayer
|
|
1008
|
-
[playStopAction]="controlAudioPlayer
|
|
1009
|
-
[playSelectionAction]="controlAudioPlayer
|
|
1010
|
-
[autoPlayOnSelectToggleAction]="controlAudioPlayer
|
|
1023
|
+
[playStartAction]="controlAudioPlayer?.startAction"
|
|
1024
|
+
[playStopAction]="controlAudioPlayer?.stopAction"
|
|
1025
|
+
[playSelectionAction]="controlAudioPlayer?.startSelectionAction"
|
|
1026
|
+
[autoPlayOnSelectToggleAction]="controlAudioPlayer?.autoPlayOnSelectToggleAction"
|
|
1011
1027
|
></app-recordercombipane>
|
|
1012
1028
|
|
|
1013
|
-
<div
|
|
1014
|
-
|
|
1015
|
-
<audio-levelbar fxFlex="1 0 1" [streamingMode]="isRecording() || keepLiveLevel" [state]="liveLevelDisplayState"
|
|
1029
|
+
<div [class]="{audioStatusDisplay:!screenXs,audioStatusDisplayXs:screenXs}">
|
|
1030
|
+
<audio-levelbar style="flex:1 0 1%" [streamingMode]="isRecording() || keepLiveLevel" [state]="liveLevelDisplayState"
|
|
1016
1031
|
[displayLevelInfos]="displayAudioClip?.levelInfos"></audio-levelbar>
|
|
1017
|
-
<div
|
|
1018
|
-
<spr-recordingitemcontrols
|
|
1032
|
+
<div style="flex-direction: row">
|
|
1033
|
+
<spr-recordingitemcontrols style="flex:10 0 1%"
|
|
1019
1034
|
[disableAudioDetails]="disableAudioDetails"
|
|
1020
1035
|
[audioLoaded]="audioLoaded"
|
|
1021
1036
|
[playStartAction]="controlAudioPlayer?.startAction"
|
|
@@ -1025,19 +1040,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
1025
1040
|
(onShowRecordingDetails)="audioSignalCollapsed=!audioSignalCollapsed">
|
|
1026
1041
|
</spr-recordingitemcontrols>
|
|
1027
1042
|
|
|
1028
|
-
<app-uploadstatus class="ricontrols dark"
|
|
1043
|
+
<app-uploadstatus *ngIf="screenXs && enableUploadRecordings" class="ricontrols dark" style="flex:0 0 0"
|
|
1029
1044
|
[value]="uploadProgress"
|
|
1030
1045
|
[status]="uploadStatus" [awaitNewUpload]="processingRecording"></app-uploadstatus>
|
|
1031
|
-
<app-wakelockindicator class="ricontrols dark"
|
|
1032
|
-
<app-readystateindicator class="ricontrols dark"
|
|
1046
|
+
<app-wakelockindicator *ngIf="screenXs" class="ricontrols dark" style="flex:0 0 0" [screenLocked]="screenLocked"></app-wakelockindicator>
|
|
1047
|
+
<app-readystateindicator *ngIf="screenXs" class="ricontrols dark" style="flex:0 0 0"
|
|
1033
1048
|
[ready]="dataSaved && !isActive()"></app-readystateindicator>
|
|
1034
1049
|
</div>
|
|
1035
1050
|
</div>
|
|
1036
|
-
<div #controlpanel class="controlpanel"
|
|
1037
|
-
<app-sprstatusdisplay
|
|
1051
|
+
<div #controlpanel class="controlpanel">
|
|
1052
|
+
<app-sprstatusdisplay *ngIf="!screenXs" style="flex:0.333 1 30%" [statusMsg]="statusMsg" [statusAlertType]="statusAlertType"
|
|
1038
1053
|
[statusWaiting]="statusWaiting"
|
|
1039
1054
|
class="hidden-xs"></app-sprstatusdisplay>
|
|
1040
|
-
<div
|
|
1055
|
+
<div style="flex:1 0 100%" class="startstop">
|
|
1041
1056
|
<div style="align-content: center">
|
|
1042
1057
|
<button (click)="startStopPerform()" [disabled]="startDisabled() && stopDisabled()" mat-raised-button class="bigbutton">
|
|
1043
1058
|
<mat-icon [style.color]="startStopNextIconColor()" inline="true">{{startStopNextIconName()}}</mat-icon>
|
|
@@ -1045,19 +1060,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
1045
1060
|
</button>
|
|
1046
1061
|
</div>
|
|
1047
1062
|
</div>
|
|
1048
|
-
<div
|
|
1049
|
-
<div
|
|
1063
|
+
<div style="flex:0.333 1 30%" >
|
|
1064
|
+
<div style="flex:1 1 auto"></div>
|
|
1050
1065
|
|
|
1051
|
-
<app-uploadstatus class="ricontrols"
|
|
1066
|
+
<app-uploadstatus *ngIf="!screenXs && enableUploadRecordings" class="ricontrols" style="flex:0 0 0"
|
|
1052
1067
|
[value]="uploadProgress"
|
|
1053
1068
|
[status]="uploadStatus" [awaitNewUpload]="processingRecording"></app-uploadstatus>
|
|
1054
|
-
<app-wakelockindicator class="ricontrols"
|
|
1055
|
-
<app-readystateindicator class="ricontrols"
|
|
1069
|
+
<app-wakelockindicator *ngIf="!screenXs" class="ricontrols" [screenLocked]="screenLocked"></app-wakelockindicator>
|
|
1070
|
+
<app-readystateindicator *ngIf="!screenXs" class="ricontrols"
|
|
1056
1071
|
[ready]="dataSaved && !isActive()"></app-readystateindicator>
|
|
1057
1072
|
</div>
|
|
1058
1073
|
</div>
|
|
1059
|
-
`, styles: [":host{flex:2;background:lightgrey;display:flex;flex-direction:column;margin:0;padding:0;height:100%;min-height:0px;overflow:hidden}\n", ".ricontrols{padding:4px;box-sizing:border-box;height:100%}\n", ".dark{background:darkgray}\n", ".controlpanel{align-content:center;align-items:center;margin:0;padding:20px;min-height:min-content}\n", ".startstop{width:100%;text-align:center;align-content:center;align-items:center}\n", ".bigbutton{min-width:70px;min-height:50px;font-size:50px;border-radius:20px}\n"] }]
|
|
1060
|
-
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type:
|
|
1074
|
+
`, styles: [":host{flex:2;background:lightgrey;display:flex;flex-direction:column;margin:0;padding:0;height:100%;min-height:0px;overflow:hidden}\n", ".ricontrols{padding:4px;box-sizing:border-box;height:100%}\n", ".dark{background:darkgray}\n", ".controlpanel{display:flex;flex-direction:row;align-content:center;align-items:center;margin:0;padding:20px;min-height:min-content}\n", ".startstop{width:100%;text-align:center;align-content:center;align-items:center}\n", ".bigbutton{min-width:70px;min-height:50px;font-size:50px;border-radius:20px}\n", ".audioStatusDisplay{display:flex;flex-direction:row;height:100px;min-height:100px}\n", ".audioStatusDisplayXs{display:flex;flex-direction:column;height:125px;min-height:125px}\n"] }]
|
|
1075
|
+
}], ctorParameters: function () { return [{ type: i1.BreakpointObserver }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i2.ActivatedRoute }, { type: i3.MatDialog }, { type: i4.SessionService }, { type: i5.RecordingService }, { type: i6.SpeechRecorderUploader }, { type: i15.SpeechRecorderConfig, decorators: [{
|
|
1061
1076
|
type: Inject,
|
|
1062
1077
|
args: [SPEECHRECORDER_CONFIG]
|
|
1063
1078
|
}] }]; }, propDecorators: { projectName: [{
|
|
@@ -1202,7 +1217,7 @@ export class AudioRecorderComponent extends RecorderComponent {
|
|
|
1202
1217
|
return this.dataSaved && !this.ar.isActive();
|
|
1203
1218
|
}
|
|
1204
1219
|
}
|
|
1205
|
-
AudioRecorderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioRecorderComponent, deps: [{ token:
|
|
1220
|
+
AudioRecorderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioRecorderComponent, deps: [{ token: i2.ActivatedRoute }, { token: i2.Router }, { token: i0.ChangeDetectorRef }, { token: i4.SessionService }, { token: i16.ProjectService }, { token: i6.SpeechRecorderUploader }], target: i0.ɵɵFactoryTarget.Component });
|
|
1206
1221
|
AudioRecorderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: AudioRecorderComponent, selector: "app-audiorecorder-comp", providers: [SessionService], viewQueries: [{ propertyName: "ar", first: true, predicate: AudioRecorder, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
|
|
1207
1222
|
<app-audiorecorder [projectName]="_project?.name" [dataSaved]="dataSaved"></app-audiorecorder>
|
|
1208
1223
|
`, isInline: true, styles: [":host{flex:2;display:flex;height:100%;flex-direction:column;min-height:0}\n"], dependencies: [{ kind: "component", type: AudioRecorder, selector: "app-audiorecorder", inputs: ["projectName", "dataSaved"] }] });
|
|
@@ -1211,8 +1226,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
1211
1226
|
args: [{ selector: 'app-audiorecorder-comp', providers: [SessionService], template: `
|
|
1212
1227
|
<app-audiorecorder [projectName]="_project?.name" [dataSaved]="dataSaved"></app-audiorecorder>
|
|
1213
1228
|
`, styles: [":host{flex:2;display:flex;height:100%;flex-direction:column;min-height:0}\n"] }]
|
|
1214
|
-
}], ctorParameters: function () { return [{ type:
|
|
1229
|
+
}], ctorParameters: function () { return [{ type: i2.ActivatedRoute }, { type: i2.Router }, { type: i0.ChangeDetectorRef }, { type: i4.SessionService }, { type: i16.ProjectService }, { type: i6.SpeechRecorderUploader }]; }, propDecorators: { ar: [{
|
|
1215
1230
|
type: ViewChild,
|
|
1216
1231
|
args: [AudioRecorder, { static: true }]
|
|
1217
1232
|
}] } });
|
|
1218
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9yZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9zcGVlY2hyZWNvcmRlci9zZXNzaW9uL2F1ZGlvcmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBdUIsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQUMsV0FBVyxFQUFvQixTQUFTLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQTtBQUNwRixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sNEJBQTRCLENBQUE7QUFDcEQsT0FBTyxFQUFDLGFBQWEsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUM5RCxPQUFPLEVBR0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUlMLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHakQsT0FBTyxFQUFDLHFCQUFxQixFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBRTdFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBVyxXQUFXLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFFbEUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRWhELE9BQU8sRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUE2QixZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRyxPQUFPLEVBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxjQUFjLEVBQUMsTUFBTSwwQkFBMEIs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YyxDQUFDLDhEQXdCaEIsYUFBYSxxRkF2QmQ7O0dBRVQscUpBdjlCVSxhQUFhOzRGQWsrQmIsc0JBQXNCO2tCQWhCbEMsU0FBUzsrQkFDRSx3QkFBd0IsYUFDdkIsQ0FBQyxjQUFjLENBQUMsWUFDakI7O0dBRVQ7MFBBcUIyQyxFQUFFO3NCQUE3QyxTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0F1ZGlvQ2FwdHVyZSwgQXVkaW9DYXB0dXJlTGlzdGVuZXJ9IGZyb20gJy4uLy4uL2F1ZGlvL2NhcHR1cmUvY2FwdHVyZSc7XHJcbmltcG9ydCB7QXVkaW9QbGF5ZXIsIEF1ZGlvUGxheWVyRXZlbnQsIEV2ZW50VHlwZX0gZnJvbSAnLi4vLi4vYXVkaW8vcGxheWJhY2svcGxheWVyJ1xyXG5pbXBvcnQge1dhdldyaXRlcn0gZnJvbSAnLi4vLi4vYXVkaW8vaW1wbC93YXZ3cml0ZXInXHJcbmltcG9ydCB7UmVjb3JkaW5nRmlsZSwgUmVjb3JkaW5nRmlsZVV0aWxzfSBmcm9tICcuLi9yZWNvcmRpbmcnXHJcbmltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIFJlbmRlcmVyMixcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1Nlc3Npb25TZXJ2aWNlfSBmcm9tIFwiLi9zZXNzaW9uLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtNYXREaWFsb2d9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2dcIjtcclxuaW1wb3J0IHtTcGVlY2hSZWNvcmRlclVwbG9hZGVyfSBmcm9tIFwiLi4vc3BydXBsb2FkZXJcIjtcclxuaW1wb3J0IHtTUEVFQ0hSRUNPUkRFUl9DT05GSUcsIFNwZWVjaFJlY29yZGVyQ29uZmlnfSBmcm9tIFwiLi4vLi4vc3ByLmNvbmZpZ1wiO1xyXG5pbXBvcnQge1Nlc3Npb259IGZyb20gXCIuL3Nlc3Npb25cIjtcclxuaW1wb3J0IHtBdWRpb1N0b3JhZ2VUeXBlLCBQcm9qZWN0LCBQcm9qZWN0VXRpbH0gZnJvbSBcIi4uL3Byb2plY3QvcHJvamVjdFwiO1xyXG5pbXBvcnQge01lc3NhZ2VEaWFsb2d9IGZyb20gXCIuLi8uLi91aS9tZXNzYWdlX2RpYWxvZ1wiO1xyXG5pbXBvcnQge1JlY29yZGluZ1NlcnZpY2V9IGZyb20gXCIuLi9yZWNvcmRpbmdzL3JlY29yZGluZ3Muc2VydmljZVwiO1xyXG5cclxuaW1wb3J0IHtBdWRpb0NvbnRleHRQcm92aWRlcn0gZnJvbSBcIi4uLy4uL2F1ZGlvL2NvbnRleHRcIjtcclxuaW1wb3J0IHtBdWRpb0NsaXB9IGZyb20gXCIuLi8uLi9hdWRpby9wZXJzaXN0b3JcIjtcclxuXHJcbmltcG9ydCB7VXBsb2FkLCBVcGxvYWRlclN0YXR1cywgVXBsb2FkZXJTdGF0dXNDaGFuZ2VFdmVudCwgVXBsb2FkSG9sZGVyfSBmcm9tIFwiLi4vLi4vbmV0L3VwbG9hZGVyXCI7XHJcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIFBhcmFtcywgUm91dGVyfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7UHJvamVjdFNlcnZpY2V9IGZyb20gXCIuLi9wcm9qZWN0L3Byb2plY3Quc2VydmljZVwiO1xyXG5pbXBvcnQge0xldmVsQmFyLCBTdGF0ZSBhcyBMaXZlTGV2ZWxTdGF0ZX0gZnJvbSBcIi4uLy4uL2F1ZGlvL3VpL2xpdmVsZXZlbFwiO1xyXG5pbXBvcnQge1JlY29yZGVyQ29tYmlQYW5lfSBmcm9tIFwiLi9yZWNvcmRlcl9jb21iaV9wYW5lXCI7XHJcbmltcG9ydCB7QmFzaWNSZWNvcmRlciwgQ2h1bmtBdWRpb0J1ZmZlclJlY2VpdmVyLCBNQVhfUkVDT1JESU5HX1RJTUVfTVMsIFJFQ0ZJTEVfQVBJX0NUWH0gZnJvbSBcIi4vYmFzaWNyZWNvcmRlclwiO1xyXG5pbXBvcnQge1JlYWR5U3RhdGVQcm92aWRlciwgUmVjb3JkZXJDb21wb25lbnR9IGZyb20gXCIuLi8uLi9yZWNvcmRlcl9jb21wb25lbnRcIjtcclxuaW1wb3J0IHtNb2RlfSBmcm9tIFwiLi4vLi4vc3BlZWNocmVjb3JkZXJuZy5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtBdWRpb0J1ZmZlclNvdXJjZSwgQXVkaW9EYXRhSG9sZGVyLCBBdWRpb1NvdXJjZX0gZnJvbSBcIi4uLy4uL2F1ZGlvL2F1ZGlvX2RhdGFfaG9sZGVyXCI7XHJcbmltcG9ydCB7QXJyYXlBdWRpb0J1ZmZlcn0gZnJvbSBcIi4uLy4uL2F1ZGlvL2FycmF5X2F1ZGlvX2J1ZmZlclwiO1xyXG5pbXBvcnQge05ldEF1ZGlvQnVmZmVyfSBmcm9tIFwiLi4vLi4vYXVkaW8vbmV0X2F1ZGlvX2J1ZmZlclwiO1xyXG5pbXBvcnQge0luZGV4ZWREYkF1ZGlvQnVmZmVyfSBmcm9tIFwiLi4vLi4vYXVkaW8vaW5kZGJfYXVkaW9fYnVmZmVyXCI7XHJcblxyXG5leHBvcnQgY29uc3QgZW51bSBTdGF0dXMge1xyXG4gIEJMT0NLRUQsIElETEUsU1RBUlRJTkcsIFJFQ09SRElORywgIFNUT1BQSU5HX1NUT1AsIEVSUk9SXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWF1ZGlvcmVjb3JkZXInLFxyXG4gIHByb3ZpZGVyczogW1Nlc3Npb25TZXJ2aWNlXSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGFwcC13YXJuaW5nYmFyIFtzaG93XT1cImlzVGVzdFNlc3Npb24oKVwiIHdhcm5pbmdUZXh0PVwiVGVzdCByZWNvcmRpbmcgb25seSFcIj48L2FwcC13YXJuaW5nYmFyPlxyXG4gICAgPGFwcC13YXJuaW5nYmFyIFtzaG93XT1cImlzRGVmYXVsdEF1ZGlvVGVzdFNlc3Npb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgd2FybmluZ1RleHQ9XCJUaGlzIHRlc3QgdXNlcyBkZWZhdWx0IGF1ZGlvIGRldmljZSEgUmVndWxhciBzZXNzaW9ucyBtYXkgcmVxdWlyZSBhIHBhcnRpY3VsYXIgYXVkaW8gZGV2aWNlIChtaWNyb3Bob25lKSFcIj48L2FwcC13YXJuaW5nYmFyPlxyXG4gICAgPGFwcC1yZWNvcmRlcmNvbWJpcGFuZSAoc2VsZWN0ZWRSZWNvcmRpbmdGaWxlQ2hhbmdlZCk9XCJzZWxlY3RSZWNvcmRpbmdGaWxlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbYXVkaW9TaWduYWxDb2xsYXBzZWRdPVwiYXVkaW9TaWduYWxDb2xsYXBzZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRSZWNvcmRpbmdGaWxlXT1cImRpc3BsYXlSZWNGaWxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdERpc2FibGVkXT1cImlzQWN0aXZlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheUF1ZGlvQ2xpcF09XCJkaXNwbGF5QXVkaW9DbGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdGFydEFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXIuc3RhcnRBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxheVN0b3BBY3Rpb25dPVwiY29udHJvbEF1ZGlvUGxheWVyLnN0b3BBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxheVNlbGVjdGlvbkFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXIuc3RhcnRTZWxlY3Rpb25BY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXIuYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvblwiXHJcbiAgICA+PC9hcHAtcmVjb3JkZXJjb21iaXBhbmU+XHJcblxyXG4gICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0LnhzPVwiY29sdW1uXCIgW25nU3R5bGVdPVwieydoZWlnaHQucHgnOjEwMCwnbWluLWhlaWdodC5weCc6IDEwMH1cIlxyXG4gICAgICAgICBbbmdTdHlsZS54c109XCJ7J2hlaWdodC5weCc6MTI1LCdtaW4taGVpZ2h0LnB4JzogMTI1fVwiPlxyXG4gICAgICA8YXVkaW8tbGV2ZWxiYXIgZnhGbGV4PVwiMSAwIDFcIiBbc3RyZWFtaW5nTW9kZV09XCJpc1JlY29yZGluZygpIHx8IGtlZXBMaXZlTGV2ZWxcIiBbc3RhdGVdPVwibGl2ZUxldmVsRGlzcGxheVN0YXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5TGV2ZWxJbmZvc109XCJkaXNwbGF5QXVkaW9DbGlwPy5sZXZlbEluZm9zXCI+PC9hdWRpby1sZXZlbGJhcj5cclxuICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiPlxyXG4gICAgICAgIDxzcHItcmVjb3JkaW5naXRlbWNvbnRyb2xzIGZ4RmxleD1cIjEwIDAgMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVBdWRpb0RldGFpbHNdPVwiZGlzYWJsZUF1ZGlvRGV0YWlsc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1ZGlvTG9hZGVkXT1cImF1ZGlvTG9hZGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxheVN0YXJ0QWN0aW9uXT1cImNvbnRyb2xBdWRpb1BsYXllcj8uc3RhcnRBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RvcEFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXI/LnN0b3BBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwZWFrRGJMdmxdPVwicGVha0xldmVsSW5EYlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FnY109XCJ0aGlzLmFjPy5hZ2NTdGF0dXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNob3dSZWNvcmRpbmdEZXRhaWxzKT1cImF1ZGlvU2lnbmFsQ29sbGFwc2VkPSFhdWRpb1NpZ25hbENvbGxhcHNlZFwiPlxyXG4gICAgICAgIDwvc3ByLXJlY29yZGluZ2l0ZW1jb250cm9scz5cclxuXHJcbiAgICAgICAgPGFwcC11cGxvYWRzdGF0dXMgY2xhc3M9XCJyaWNvbnRyb2xzIGRhcmtcIiBmeEhpZGUgZnhTaG93LnhzIGZ4RmxleD1cIjAgMCAwXCIgKm5nSWY9XCJlbmFibGVVcGxvYWRSZWNvcmRpbmdzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidXBsb2FkUHJvZ3Jlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGF0dXNdPVwidXBsb2FkU3RhdHVzXCIgW2F3YWl0TmV3VXBsb2FkXT1cInByb2Nlc3NpbmdSZWNvcmRpbmdcIj48L2FwcC11cGxvYWRzdGF0dXM+XHJcbiAgICAgICAgPGFwcC13YWtlbG9ja2luZGljYXRvciBjbGFzcz1cInJpY29udHJvbHMgZGFya1wiIGZ4SGlkZSBmeFNob3cueHMgZnhGbGV4PVwiMCAwIDBcIiBbc2NyZWVuTG9ja2VkXT1cInNjcmVlbkxvY2tlZFwiPjwvYXBwLXdha2Vsb2NraW5kaWNhdG9yPlxyXG4gICAgICAgIDxhcHAtcmVhZHlzdGF0ZWluZGljYXRvciBjbGFzcz1cInJpY29udHJvbHMgZGFya1wiIGZ4SGlkZSBmeFNob3cueHMgZnhGbGV4PVwiMCAwIDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZHldPVwiZGF0YVNhdmVkICYmICFpc0FjdGl2ZSgpXCI+PC9hcHAtcmVhZHlzdGF0ZWluZGljYXRvcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgI2NvbnRyb2xwYW5lbCBjbGFzcz1cImNvbnRyb2xwYW5lbFwiIGZ4TGF5b3V0PVwicm93XCI+XHJcbiAgICAgIDxhcHAtc3Byc3RhdHVzZGlzcGxheSBmeEhpZGUueHMgZnhGbGV4PVwiMzAlIDEgMzAlXCIgW3N0YXR1c01zZ109XCJzdGF0dXNNc2dcIiBbc3RhdHVzQWxlcnRUeXBlXT1cInN0YXR1c0FsZXJ0VHlwZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RhdHVzV2FpdGluZ109XCJzdGF0dXNXYWl0aW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaGlkZGVuLXhzXCI+PC9hcHAtc3Byc3RhdHVzZGlzcGxheT5cclxuICAgICAgPGRpdiBmeEZsZXg9XCIxMDAlIDAgMTAwJVwiIGNsYXNzPVwic3RhcnRzdG9wXCI+XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cImFsaWduLWNvbnRlbnQ6IGNlbnRlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwic3RhcnRTdG9wUGVyZm9ybSgpXCIgW2Rpc2FibGVkXT1cInN0YXJ0RGlzYWJsZWQoKSAmJiBzdG9wRGlzYWJsZWQoKVwiIG1hdC1yYWlzZWQtYnV0dG9uIGNsYXNzPVwiYmlnYnV0dG9uXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbiBbc3R5bGUuY29sb3JdPVwic3RhcnRTdG9wTmV4dEljb25Db2xvcigpXCIgaW5saW5lPVwidHJ1ZVwiPnt7c3RhcnRTdG9wTmV4dEljb25OYW1lKCl9fTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IGJvbGRlcjtmb250LXNpemU6IDE0cHhcIj57e3N0YXJ0U3RvcE5leHROYW1lKCl9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBmeEZsZXg9XCIzMCUgMSAzMCVcIiA+XHJcbiAgICAgICAgPGRpdiBmeEZsZXg9XCIxIDEgYXV0b1wiPjwvZGl2PlxyXG5cclxuICAgICAgICA8YXBwLXVwbG9hZHN0YXR1cyBjbGFzcz1cInJpY29udHJvbHNcIiBmeEhpZGUueHMgZnhGbGV4PVwiMCAwIDBcIiAqbmdJZj1cImVuYWJsZVVwbG9hZFJlY29yZGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ1cGxvYWRQcm9ncmVzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0YXR1c109XCJ1cGxvYWRTdGF0dXNcIiBbYXdhaXROZXdVcGxvYWRdPVwicHJvY2Vzc2luZ1JlY29yZGluZ1wiPjwvYXBwLXVwbG9hZHN0YXR1cz5cclxuICAgICAgICA8YXBwLXdha2Vsb2NraW5kaWNhdG9yIGNsYXNzPVwicmljb250cm9sc1wiIGZ4SGlkZS54cyBbc2NyZWVuTG9ja2VkXT1cInNjcmVlbkxvY2tlZFwiPjwvYXBwLXdha2Vsb2NraW5kaWNhdG9yPlxyXG4gICAgICAgIDxhcHAtcmVhZHlzdGF0ZWluZGljYXRvciBjbGFzcz1cInJpY29udHJvbHNcIiBmeEhpZGUueHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWR5XT1cImRhdGFTYXZlZCAmJiAhaXNBY3RpdmUoKVwiPjwvYXBwLXJlYWR5c3RhdGVpbmRpY2F0b3I+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgOmhvc3Qge1xyXG4gICAgZmxleDogMjtcclxuICAgIGJhY2tncm91bmQ6IGxpZ2h0Z3JleTtcclxuICAgIGRpc3BsYXk6IGZsZXg7IC8qIFZlcnRpY2FsIGZsZXggY29udGFpbmVyOiBCb3R0b20gdHJhbnNwb3J0IHBhbmVsLCBhYm92ZSBwcm9tcHRpbmcgcGFuZWwgKi9cclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgbWluLWhlaWdodDogMHB4O1xyXG4gICAgICAvKiBQcmV2ZW50cyBob3Jpem9udGFsIHNjcm9sbCBiYXIgb24gc3dpcGUgcmlnaHQgKi9cclxuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9YCxgLnJpY29udHJvbHMge1xyXG4gICAgICAgIHBhZGRpbmc6IDRweDtcclxuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgIH1gLGAuZGFyayB7XHJcbiAgICBiYWNrZ3JvdW5kOiBkYXJrZ3JheTtcclxuICB9YCxgLmNvbnRyb2xwYW5lbCB7XHJcbiAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMjBweDtcclxuICAgIG1pbi1oZWlnaHQ6IG1pbi1jb250ZW50OyAvKiBpbXBvcnRhbnQgKi9cclxuICB9YCxgLnN0YXJ0c3RvcCB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgfWAsYC5iaWdidXR0b24ge1xyXG4gICAgbWluLXdpZHRoOiA3MHB4O1xyXG4gICAgbWluLWhlaWdodDogNTBweDtcclxuICAgIGZvbnQtc2l6ZTogNTBweDtcclxuICAgIGJvcmRlci1yYWRpdXM6IDIwcHg7XHJcbiAgfWBcclxuICAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXVkaW9SZWNvcmRlciBleHRlbmRzIEJhc2ljUmVjb3JkZXIgaW1wbGVtZW50cyBPbkluaXQsQWZ0ZXJWaWV3SW5pdCxPbkRlc3Ryb3ksIEF1ZGlvQ2FwdHVyZUxpc3RlbmVyLFJlYWR5U3RhdGVQcm92aWRlcixDaHVua0F1ZGlvQnVmZmVyUmVjZWl2ZXIge1xyXG5cclxuICBfcHJvamVjdDpQcm9qZWN0fHVuZGVmaW5lZHwgbnVsbD1udWxsO1xyXG4gIEBJbnB1dCgpIHByb2plY3ROYW1lOnN0cmluZ3x1bmRlZmluZWR8bnVsbD1udWxsO1xyXG4gIGVuYWJsZVVwbG9hZFJlY29yZGluZ3M6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGVuYWJsZURvd25sb2FkUmVjb3JkaW5nczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHN0YXR1czogU3RhdHVzID0gU3RhdHVzLkJMT0NLRUQ7XHJcblxyXG4gIEBWaWV3Q2hpbGQoUmVjb3JkZXJDb21iaVBhbmUsIHsgc3RhdGljOiB0cnVlIH0pIHJlY29yZGVyQ29tYmlQYW5lITogUmVjb3JkZXJDb21iaVBhbmU7XHJcbiAgQFZpZXdDaGlsZChMZXZlbEJhciwgeyBzdGF0aWM6IHRydWUgfSkgbGl2ZUxldmVsRGlzcGxheSE6IExldmVsQmFyO1xyXG5cclxuICBASW5wdXQoKSBkYXRhU2F2ZWQ9dHJ1ZVxyXG5cclxuXHJcblxyXG5cclxuICBzdGFydFN0b3BOZXh0QnV0dG9uTmFtZSE6c3RyaW5nO1xyXG4gIHN0YXJ0U3RvcE5leHRCdXR0b25JY29uTmFtZSE6c3RyaW5nO1xyXG5cclxuICBhdWRpbzogYW55O1xyXG5cclxuICBwcml2YXRlIF9kaXNwbGF5UmVjRmlsZTogUmVjb3JkaW5nRmlsZSB8IG51bGw9bnVsbDtcclxuICBwcml2YXRlIGRpc3BsYXlSZWNGaWxlVmVyc2lvbjogbnVtYmVyPTA7XHJcblxyXG5cclxuICBjb25zdHJ1Y3RvcihjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgICAgIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgICAgICAgICAgIHNlc3Npb25TZXJ2aWNlOlNlc3Npb25TZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVjRmlsZVNlcnZpY2U6UmVjb3JkaW5nU2VydmljZSxcclxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgdXBsb2FkZXI6IFNwZWVjaFJlY29yZGVyVXBsb2FkZXIsXHJcbiAgICAgICAgICAgICAgQEluamVjdChTUEVFQ0hSRUNPUkRFUl9DT05GSUcpIGNvbmZpZz86IFNwZWVjaFJlY29yZGVyQ29uZmlnKSB7XHJcbiAgICBzdXBlcihjaGFuZ2VEZXRlY3RvclJlZixkaWFsb2csc2Vzc2lvblNlcnZpY2UsdXBsb2FkZXIsY29uZmlnKTtcclxuXHJcbiAgICAvL3N1cGVyKGluamVjdG9yKTtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLklETEU7XHJcblxyXG4gICAgdGhpcy5hdWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpbycpO1xyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5lbmFibGVVcGxvYWRSZWNvcmRpbmdzICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5lbmFibGVVcGxvYWRSZWNvcmRpbmdzID0gdGhpcy5jb25maWcuZW5hYmxlVXBsb2FkUmVjb3JkaW5ncztcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5lbmFibGVEb3dubG9hZFJlY29yZGluZ3MgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmVuYWJsZURvd25sb2FkUmVjb3JkaW5ncyA9IHRoaXMuY29uZmlnLmVuYWJsZURvd25sb2FkUmVjb3JkaW5ncztcclxuICAgIH1cclxuICAgIC8vdGhpcy5pbml0KCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG5cclxuICAgIHRoaXMuc3RyZWFtTGV2ZWxNZWFzdXJlLmxldmVsTGlzdGVuZXIgPSB0aGlzLmxpdmVMZXZlbERpc3BsYXk7XHJcbiAgICB0aGlzLnN0cmVhbUxldmVsTWVhc3VyZS5wZWFrTGV2ZWxMaXN0ZW5lcj0ocGVha0x2bEluRGIpPT57XHJcbiAgICAgIHRoaXMucGVha0xldmVsSW5EYj1wZWFrTHZsSW5EYjtcclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgICAvL2xldCB3YWtlTG9ja1N1cHA9KCd3YWtlTG9jaycgaW4gbmF2aWdhdG9yKTtcclxuICAgIC8vYWxlcnQoJ1dha2UgbG9jayBBUEkgc3VwcG9ydGVkOiAnK3dha2VMb2NrU3VwcCk7XHJcbiAgfVxyXG5cclxuICByZWFkeSgpOmJvb2xlYW57XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhU2F2ZWQgJiYgIXRoaXMuaXNBY3RpdmUoKVxyXG4gIH1cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICB0aGlzLmRpc2FibGVXYWtlTG9ja0NvbmQoKTtcclxuICAgICAgIHRoaXMuZGVzdHJveWVkPXRydWU7XHJcbiAgICAgICAvLyBUT0RPIHN0b3AgY2FwdHVyZSAvcGxheWJhY2tcclxuICAgIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuXHJcbiAgICAvL3RoaXMuYXVkaW9Mb2FkZWQ9ZmFsc2U7XHJcblxyXG4gICAgbGV0IGNvbnRleHQ6QXVkaW9Db250ZXh0fG51bGw9bnVsbDtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnRleHQgPSBBdWRpb0NvbnRleHRQcm92aWRlci5hdWRpb0NvbnRleHRJbnN0YW5jZSgpXHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuRVJST1I7XHJcbiAgICAgIGxldCBlcnJNc2cgPSAnVW5rbm93biBlcnJvcic7XHJcbiAgICAgIGlmKGVyciBpbnN0YW5jZW9mIEVycm9yKXtcclxuICAgICAgICBlcnJNc2c9ZXJyLm1lc3NhZ2U7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnRVJST1I6ICcgKyBlcnJNc2c7XHJcbiAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgdGhpcy5kaWFsb2cub3BlbihNZXNzYWdlRGlhbG9nLCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgdHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgIHRpdGxlOiAnRXJyb3InLFxyXG4gICAgICAgICAgbXNnOiBlcnJNc2csXHJcbiAgICAgICAgICBhZHZpc2U6ICdQbGVhc2UgdXNlIGEgc3VwcG9ydGVkIGJyb3dzZXIuJyxcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZihjb250ZXh0KSB7XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlN0YXRlIG9mIGF1ZGlvIGNvbnRleHQ6IFwiICsgY29udGV4dC5zdGF0ZSlcclxuICAgIH1lbHNle1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJObyBhdWRpbyBjb250ZXh0IGF2YWlsYWJsZSFcIik7XHJcbiAgICB9XHJcbiAgICBpZiAoIWNvbnRleHQgfHwgIW5hdmlnYXRvci5tZWRpYURldmljZXMpIHtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuRVJST1I7XHJcbiAgICAgIGxldCBlcnJNc2cgPSAnQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IE1lZGlhIHN0cmVhbXMhJztcclxuICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnRVJST1I6ICcgKyBlcnJNc2c7XHJcbiAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgdGhpcy5kaWFsb2cub3BlbihNZXNzYWdlRGlhbG9nLCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgdHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgIHRpdGxlOiAnRXJyb3InLFxyXG4gICAgICAgICAgbXNnOiBlcnJNc2csXHJcbiAgICAgICAgICBhZHZpc2U6ICdQbGVhc2UgdXNlIGEgc3VwcG9ydGVkIGJyb3dzZXIuJyxcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvL3RoaXMuY29udHJvbEF1ZGlvUGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKGNvbnRleHQsIHRoaXMpO1xyXG4gICAgICB0aGlzLmFjID0gbmV3IEF1ZGlvQ2FwdHVyZShjb250ZXh0KTtcclxuICAgICAgaWYgKHRoaXMuYWMpIHtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLnN0YXJ0SXRlbSgpO1xyXG4gICAgICAgIHRoaXMuYWMubGlzdGVuZXIgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuY29uZmlndXJlU3RyZWFtQ2FwdHVyZVN0cmVhbSgpO1xyXG5cclxuICAgICAgICAvLyBEb24ndCBsaXN0IHRoZSBkZXZpY2VzIGhlcmUuIElmIHdlIGRvIG5vdCBoYXZlIGF1ZGlvIHBlcm1pc3Npb25zIHdlIG9ubHkgZ2V0IGFub255bWl6ZWQgZGV2aWNlcyB3aXRob3V0IGxhYmVscy5cclxuICAgICAgICAvL3RoaXMuYWMubGlzdERldmljZXMoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIGxldCBlcnJNc2cgPSAnQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IE1lZGlhL0F1ZGlvIEFQSSEnO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ0VSUk9SOiAnICsgZXJyTXNnO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKE1lc3NhZ2VEaWFsb2csIHtcclxuICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgICAgdGl0bGU6ICdFcnJvcicsXHJcbiAgICAgICAgICAgIG1zZzogZXJyTXNnLFxyXG4gICAgICAgICAgICBhZHZpc2U6ICdQbGVhc2UgdXNlIGEgc3VwcG9ydGVkIGJyb3dzZXIuJyxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLnN0b3BJdGVtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5zdG9wSXRlbSgpO1xyXG4gICAgICAvL3RoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMucGF1c2VJdGVtKCk7XHJcblxyXG4gICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMuY29udHJvbEF1ZGlvUGxheWVyLnN0YXJ0KCk7XHJcblxyXG4gICAgfVxyXG4gICAgdGhpcy51cGxvYWRlci5saXN0ZW5lciA9ICh1ZSkgPT4ge1xyXG4gICAgICB0aGlzLnVwbG9hZFVwZGF0ZSh1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5cHJlc3MnLCBbJyRldmVudCddKVxyXG4gIG9uS2V5UHJlc3Moa2U6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmIChrZS5rZXkgPT0gJyAnKSB7XHJcbiAgICAgIC8vdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLnBlcmZvcm0oKTtcclxuICAgICAgLy90aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgb25LZXlEb3duKGtlOiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoa2Uua2V5ID09ICcgJykge1xyXG4gICAgICBpZighdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLmRpc2FibGVkKXtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgICB9ZWxzZSBpZighdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24uZGlzYWJsZWQpIHtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChrZS5rZXkgPT0gJ3AnKSB7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoa2Uua2V5ID09ICdFc2NhcGUnKSB7XHJcbiAgICAgIGlmICghdGhpcy5hdWRpb1NpZ25hbENvbGxhcHNlZCkge1xyXG4gICAgICAgIHRoaXMuYXVkaW9TaWduYWxDb2xsYXBzZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoa2Uua2V5ID09ICdNZWRpYVBsYXlQYXVzZScpIHtcclxuICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGtlLmtleSA9PT0gJ0Fycm93UmlnaHQnKSB7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGtlLmtleSA9PT0gJ0Fycm93TGVmdCcpIHtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc1Rlc3RTZXNzaW9uKCk6Ym9vbGVhbiB7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9zZXNzaW9uIT1udWxsKSAmJiAodGhpcy5fc2Vzc2lvbi50eXBlID09PSAnVEVTVCcgfHwgdGhpcy5fc2Vzc2lvbi50eXBlPT09J1RFU1RfREVGX0EnIHx8IHRoaXMuX3Nlc3Npb24udHlwZSA9PT0gJ1NJTlVTX1RFU1QnKSk7XHJcbiAgfVxyXG5cclxuICBpc0RlZmF1bHRBdWRpb1Rlc3RTZXNzaW9uKCk6Ym9vbGVhbiB7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9zZXNzaW9uIT1udWxsKSAmJiAodGhpcy5fc2Vzc2lvbi50eXBlPT09J1RFU1RfREVGX0EnKSk7XHJcbiAgfVxyXG5cclxuICBpc0RlZmF1bHRBdWRpb1Rlc3RTZXNzaW9uT3ZlcndyaXRlaW5nUHJvamVjdFJlcXVpcmVtZW50cygpOmJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICgodGhpcy5fc2Vzc2lvbiE9bnVsbCkgJiYgKHRoaXMuX3Nlc3Npb24udHlwZT09PSdURVNUX0RFRl9BJykgJiYgKHRoaXMuYXVkaW9EZXZpY2VzIT1udWxsKSAmJiB0aGlzLmF1ZGlvRGV2aWNlcy5sZW5ndGg+MClcclxuICB9XHJcblxyXG5cclxuXHJcbiAgZmV0Y2hSZWNvcmRpbmdzKHNlc3M6U2Vzc2lvbil7XHJcbiAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZT0naW5mbyc7XHJcbiAgICB0aGlzLnN0YXR1c01zZyA9ICdGZXRjaGluZyBpbmZvcyBvZiByZWNvcmRpbmdzLi4uJztcclxuICAgIHRoaXMuc3RhdHVzV2FpdGluZz10cnVlO1xyXG4gICAgLy9sZXQgcHJObTpzdHJpbmd8bnVsbD1udWxsO1xyXG4gICAgaWYodGhpcy5wcm9qZWN0KSB7XHJcbiAgICAgIGxldCByZnNPYnMgPSB0aGlzLnJlY0ZpbGVTZXJ2aWNlLnJlY29yZGluZ0ZpbGVMaXN0KHRoaXMucHJvamVjdC5uYW1lLCBzZXNzLnNlc3Npb25JZCk7XHJcbiAgICAgIHJmc09icy5zdWJzY3JpYmUoe25leHQ6KHJmczogQXJyYXk8UmVjb3JkaW5nRmlsZT4pID0+IHtcclxuICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgICAgICB0aGlzLnN0YXR1c01zZyA9ICdSZWNlaXZlZCBpbmZvcyBvZiByZWNvcmRpbmdzLic7XHJcbiAgICAgICAgdGhpcy5zdGF0dXNXYWl0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHJmcykge1xyXG4gICAgICAgICAgaWYgKHJmcyBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgIHJmcy5mb3JFYWNoKChyZikgPT4ge1xyXG4gICAgICAgICAgICAgIC8vIHRoZSBsaXN0IGNvbWVzIGZyb20gdGhlIHNlcnZlciwgYXNzc3VlbSBhbGwgcmVjb3JkaW5nIGZpbGVzIGFzIHNlcnZlciBwZXJzaXN0ZWRcclxuICAgICAgICAgICAgICByZi5zZXJ2ZXJQZXJzaXN0ZWQ9dHJ1ZTtcclxuICAgICAgICAgICAgICBpZihyZi5zdGFydGVkRGF0ZSl7XHJcbiAgICAgICAgICAgICAgICByZi5fc3RhcnRlZEFzRGF0ZU9iaj1uZXcgRGF0ZShyZi5zdGFydGVkRGF0ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmKHJmLmRhdGUpe1xyXG4gICAgICAgICAgICAgICAgcmYuX2RhdGVBc0RhdGVPYmo9bmV3IERhdGUocmYuZGF0ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMucmVjb3JkZXJDb21iaVBhbmUuYWRkUmVjRmlsZShyZik7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFeHBlY3RlZCB0eXBlIGFycmF5IGZvciBsaXN0IG9mIGFscmVhZHkgcmVjb3JkZWQgZmlsZXMgJylcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlJlY29yZGluZyBmaWxlIGxpc3Q6IFwiICsgcmZzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIGVycm9yOihlcnIpID0+IHtcclxuICAgICAgICAvLyBGYWlsZWQgZmV0Y2hpbmcgZXhpc3RpbmcsIGJ1dCB3ZSBzdGFydCB0aGUgc2Vzc2lvbiBhbnl3YXlcclxuICAgICAgICB0aGlzLnN0YXJ0KClcclxuICAgICAgfSwgY29tcGxldGU6KCkgPT4ge1xyXG4gICAgICAgIC8vIE5vcm1hbCBzdGFydFxyXG4gICAgICAgIHRoaXMuc3RhcnQoKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIC8vIE5vIHByb2plY3QgZGVmIC0+IGVycm9yXHJcbiAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnTm8gcHJvamVjdCBkZWZpbml0b24uJztcclxuICAgICAgdGhpcy5zdGF0dXNXYWl0aW5nID0gZmFsc2U7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5zdGF0dXNNc2cpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHNldCBwcm9qZWN0KHByb2plY3Q6IFByb2plY3R8dW5kZWZpbmVkfG51bGwpIHtcclxuICAgIHRoaXMuX3Byb2plY3QgPSBwcm9qZWN0O1xyXG4gICAgbGV0IGNoQ250ID0gUHJvamVjdFV0aWwuREVGQVVMVF9BVURJT19DSEFOTkVMX0NPVU5UO1xyXG5cclxuICAgIGlmIChwcm9qZWN0KSB7XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlByb2plY3QgbmFtZTogXCIgKyBwcm9qZWN0Lm5hbWUpXHJcbiAgICAgIGlmIChwcm9qZWN0LnJlY29yZGluZ0RldmljZVdha2VMb2NrID09PSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy53YWtlTG9jayA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5hdWRpb0RldmljZXMgPSBwcm9qZWN0LmF1ZGlvRGV2aWNlcztcclxuICAgICAgY2hDbnQgPSBQcm9qZWN0VXRpbC5hdWRpb0NoYW5uZWxDb3VudChwcm9qZWN0KTtcclxuICAgICAgY29uc29sZS5pbmZvKFwiUHJvamVjdCByZXF1ZXN0ZWQgcmVjb3JkaW5nIGNoYW5uZWwgY291bnQ6IFwiICsgY2hDbnQpO1xyXG4gICAgICB0aGlzLmF1dG9HYWluQ29udHJvbENvbmZpZ3MgPSBwcm9qZWN0LmF1dG9HYWluQ29udHJvbENvbmZpZ3M7XHJcbiAgICAgIGlmIChwcm9qZWN0LmNodW5rZWRSZWNvcmRpbmcgPT09IHRydWUpIHtcclxuICAgICAgICB0aGlzLnVwbG9hZENodW5rU2l6ZVNlY29uZHMgPSBCYXNpY1JlY29yZGVyLkRFRkFVTFRfQ0hVTktfU0laRV9TRUNPTkRTO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudXBsb2FkQ2h1bmtTaXplU2Vjb25kcyA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHByb2plY3QuY2xpZW50QXVkaW9TdG9yYWdlVHlwZSkge1xyXG4gICAgICAgIHRoaXMuY2xpZW50QXVkaW9TdG9yYWdlVHlwZSA9IHByb2plY3QuY2xpZW50QXVkaW9TdG9yYWdlVHlwZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIkVtcHR5IHByb2plY3QgY29uZmlndXJhdGlvbiFcIilcclxuICAgIH1cclxuICAgIHRoaXMuY2hhbm5lbENvdW50ID0gY2hDbnQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0IHByb2plY3QoKTpQcm9qZWN0fHVuZGVmaW5lZHxudWxse1xyXG4gICAgcmV0dXJuIHRoaXMuX3Byb2plY3Q7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RSZWNvcmRpbmdGaWxlKHJmOlJlY29yZGluZ0ZpbGUpe1xyXG4gICAgdGhpcy5saXZlTGV2ZWxEaXNwbGF5U3RhdGU9TGl2ZUxldmVsU3RhdGUuUkVBRFk7XHJcbiAgICB0aGlzLmtlZXBMaXZlTGV2ZWw9ZmFsc2U7XHJcbiAgICB0aGlzLmRpc3BsYXlSZWNGaWxlPXJmO1xyXG4gIH1cclxuXHJcbiAgdXBsb2FkVXBkYXRlKHVlOiBVcGxvYWRlclN0YXR1c0NoYW5nZUV2ZW50KSB7XHJcbiAgICBsZXQgdXBTdGF0dXMgPSB1ZS5zdGF0dXM7XHJcbiAgICB0aGlzLmRhdGFTYXZlZCA9IChVcGxvYWRlclN0YXR1cy5ET05FID09PSB1cFN0YXR1cyk7XHJcbiAgICBsZXQgcGVyY2VudFVwbCA9IHVlLnBlcmNlbnREb25lKCk7XHJcbiAgICBpZiAoVXBsb2FkZXJTdGF0dXMuRVJSID09PSB1cFN0YXR1cykge1xyXG4gICAgICB0aGlzLnVwbG9hZFN0YXR1cyA9ICd3YXJuJ1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHBlcmNlbnRVcGwgPCA1MCkge1xyXG4gICAgICAgIHRoaXMudXBsb2FkU3RhdHVzID0gJ2FjY2VudCdcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnVwbG9hZFN0YXR1cyA9ICdzdWNjZXNzJ1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudXBsb2FkUHJvZ3Jlc3MgPSBwZXJjZW50VXBsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgfVxyXG5cclxuICBzZXQgY29udHJvbEF1ZGlvUGxheWVyKGNvbnRyb2xBdWRpb1BsYXllcjogQXVkaW9QbGF5ZXIpIHtcclxuICAgIHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllcj1jb250cm9sQXVkaW9QbGF5ZXI7XHJcbiAgICBpZiAodGhpcy5fY29udHJvbEF1ZGlvUGxheWVyKSB7XHJcbiAgICAgIHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5saXN0ZW5lciA9IHRoaXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgY29udHJvbEF1ZGlvUGxheWVyKCk6IEF1ZGlvUGxheWVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXI7XHJcbiAgfVxyXG5cclxuICB1cGRhdGUoZTogQXVkaW9QbGF5ZXJFdmVudCkge1xyXG4gICAgaWYgKGUudHlwZSA9PSBFdmVudFR5cGUuU1RBUlRFRCkge1xyXG4gICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMudXBkYXRlVGltZXJJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgLy90aGlzLmF1ZGlvU2lnbmFsLnBsYXlGcmFtZVBvc2l0aW9uID0gdGhpcy5hcC5wbGF5UG9zaXRpb25GcmFtZXM7XHJcbiAgICAgIH0sIDUwKTtcclxuICAgIH0gZWxzZSBpZiAoZS50eXBlID09IEV2ZW50VHlwZS5TVE9QUEVEIHx8IGUudHlwZSA9PSBFdmVudFR5cGUuRU5ERUQpIHtcclxuICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy51cGRhdGVUaW1lcklkKTtcclxuICAgICAgLy9jb25zb2xlLmRlYnVnKFwiRW5hYmxlIHBsYXkgc3RhcnQgYWN0aW9uIChieSBwbGF5ZXIgZXZlbnRzIHN0b3BwZWQgb3IgZW5kZWQpOiBcIisoISh0aGlzLmRpc3BsYXlSZWNGaWxlKSkpO1xyXG4gICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5kaXNhYmxlZCA9ICghKHRoaXMuZGlzcGxheVJlY0ZpbGUpKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGFydERpc2FibGVkKCkge1xyXG4gICAgcmV0dXJuICF0aGlzLnRyYW5zcG9ydEFjdGlvbnMgfHwgdGhpcy5yZWFkb25seSB8fCB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24uZGlzYWJsZWRcclxuICB9XHJcblxyXG4gIHN0b3BEaXNhYmxlZCgpIHtcclxuICAgIHJldHVybiAhdGhpcy50cmFuc3BvcnRBY3Rpb25zIHx8IHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLmRpc2FibGVkXHJcbiAgfVxyXG5cclxuICBzdGFydFN0b3BOZXh0TmFtZSgpOnN0cmluZ3tcclxuICAgIGlmKCF0aGlzLnN0YXJ0RGlzYWJsZWQoKSl7XHJcbiAgICAgIHRoaXMuc3RhcnRTdG9wTmV4dEJ1dHRvbk5hbWU9XCJTdGFydFwiXHJcbiAgICB9ZWxzZSBpZighdGhpcy5zdG9wRGlzYWJsZWQoKSkge1xyXG4gICAgICB0aGlzLnN0YXJ0U3RvcE5leHRCdXR0b25OYW1lID0gXCJTdG9wXCJcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnN0YXJ0U3RvcE5leHRCdXR0b25OYW1lO1xyXG4gIH1cclxuICBzdGFydFN0b3BOZXh0SWNvbk5hbWUoKTpzdHJpbmd7XHJcbiAgICBpZighdGhpcy5zdGFydERpc2FibGVkKCkpe1xyXG4gICAgICB0aGlzLnN0YXJ0U3RvcE5leHRCdXR0b25JY29uTmFtZT1cImZpYmVyX21hbnVhbF9yZWNvcmRcIlxyXG4gICAgfWVsc2UgaWYoIXRoaXMuc3RvcERpc2FibGVkKCkpe1xyXG4gICAgICB0aGlzLnN0YXJ0U3RvcE5leHRCdXR0b25JY29uTmFtZT1cInN0b3BcIlxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuc3RhcnRTdG9wTmV4dEJ1dHRvbkljb25OYW1lXHJcbiAgfVxyXG4gIHN0YXJ0U3RvcE5leHRJY29uQ29sb3IoKTpzdHJpbmd7XHJcbiAgICBpZighdGhpcy5zdGFydERpc2FibGVkKCkpe1xyXG4gICAgICByZXR1cm4gXCJyZWRcIlxyXG4gICAgfWVsc2UgaWYoIXRoaXMuc3RvcERpc2FibGVkKCkpe1xyXG4gICAgICByZXR1cm4gXCJ5ZWxsb3dcIlxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHJldHVybiBcImdyZXlcIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXJ0U3RvcFBlcmZvcm0oKXtcclxuICAgIGlmKCF0aGlzLnN0YXJ0RGlzYWJsZWQoKSl7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9ZWxzZSBpZighdGhpcy5zdG9wRGlzYWJsZWQoKSl7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXJ0SXRlbSgpIHtcclxuICAgIHRoaXMuc3RhdHVzPVN0YXR1cy5TVEFSVElORztcclxuICAgIHN1cGVyLnN0YXJ0SXRlbSgpO1xyXG4gICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgdGhpcy5zdGF0dXM9U3RhdHVzLklETEU7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZEFjdGlvbi5kaXNhYmxlZCA9IHRydWVcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2ROZXh0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5kaXNhYmxlZCA9IHRydWVcclxuICAgIHRoaXMuZGlzcGxheVJlY0ZpbGUgPSBudWxsO1xyXG4gICAgdGhpcy5kaXNwbGF5UmVjRmlsZVZlcnNpb24gPSAwO1xyXG4gICAgdGhpcy5kaXNwbGF5QXVkaW9DbGlwID0gbnVsbDtcclxuICAgIHRoaXMubGl2ZUxldmVsRGlzcGxheS5yZXNldCh0cnVlKTtcclxuICAgIHRoaXMubGl2ZUxldmVsRGlzcGxheVN0YXRlPUxpdmVMZXZlbFN0YXRlLlJFQURZO1xyXG4gICAgdGhpcy5zaG93UmVjb3JkaW5nKCk7XHJcblxyXG4gICAgdGhpcy5zdGFydENhcHR1cmUoKTtcclxuICB9XHJcblxyXG5cclxuICBkb3dubG9hZFJlY29yZGluZygpIHtcclxuICAgIGlmICh0aGlzLmRpc3BsYXlSZWNGaWxlKSB7XHJcbiAgICAgIGxldCBhYjogQXVkaW9EYXRhSG9sZGVyIHwgbnVsbCA9IHRoaXMuZGlzcGxheVJlY0ZpbGUuYXVkaW9EYXRhSG9sZGVyO1xyXG4gICAgICBsZXQgd3cgPSBuZXcgV2F2V3JpdGVyKCk7XHJcbiAgICAgIGxldCBhcz1hYj8uYXVkaW9Tb3VyY2U7XHJcbiAgICAgIGlmKGFzIGluc3RhbmNlb2YgQXVkaW9CdWZmZXJTb3VyY2UpIHtcclxuICAgICAgICAgIHd3LndyaXRlQXN5bmMoYXMuYXVkaW9CdWZmZXIsICh3YXZGaWxlKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBibG9iID0gbmV3IEJsb2IoW3dhdkZpbGVdLCB7dHlwZTogJ2F1ZGlvL3dhdid9KTtcclxuICAgICAgICAgICAgbGV0IHJmVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBkYXRhRG5sTG5rID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgICAgICAgIC8vZGF0YURubExuay5uYW1lID0gJ1JlY29yZGluZyc7XHJcbiAgICAgICAgICAgIGRhdGFEbmxMbmsuaHJlZiA9IHJmVXJsO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5ib2R5LCBkYXRhRG5sTG5rKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGRvd25sb2FkIHByb3BlcnR5IG5vdCB5ZXQgaW4gVFMgZGVmXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXlSZWNGaWxlKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGZuID0gdGhpcy5kaXNwbGF5UmVjRmlsZS5maWxlbmFtZVN0cmluZygpO1xyXG4gICAgICAgICAgICAgIGZuICs9ICdfJyArIHRoaXMuZGlzcGxheVJlY0ZpbGVWZXJzaW9uO1xyXG4gICAgICAgICAgICAgIGZuICs9ICcud2F2JztcclxuICAgICAgICAgICAgICBkYXRhRG5sTG5rLmRvd25sb2FkID0gZm47XHJcbiAgICAgICAgICAgICAgZGF0YURubExuay5jbGljaygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQoZG9jdW1lbnQuYm9keSwgZGF0YURubExuayk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0IGRpc3BsYXlSZWNGaWxlKGRpc3BsYXlSZWNGaWxlOiBSZWNvcmRpbmdGaWxlIHwgbnVsbCkge1xyXG4gICAgLy90aGlzLmF1ZGlvTG9hZGVkPWZhbHNlO1xyXG4gICAgdGhpcy5fZGlzcGxheVJlY0ZpbGUgPSBkaXNwbGF5UmVjRmlsZTtcclxuICAgIGlmICh0aGlzLl9kaXNwbGF5UmVjRmlsZSkge1xyXG4gICAgICBsZXQgYWRoOiBBdWRpb0RhdGFIb2xkZXJ8IG51bGwgPSB0aGlzLl9kaXNwbGF5UmVjRmlsZS5hdWRpb0RhdGFIb2xkZXI7XHJcbiAgICAgIGlmKGFkaCkge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCA9IG5ldyBBdWRpb0NsaXAoYWRoKTtcclxuICAgICAgICAvL3RoaXMuYXVkaW9Mb2FkZWQ9dHJ1ZTtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCIgc2V0IHJlY29yZGluZyBmaWxlOiBkaXNwbGF5IGF1ZGlvIGNsaXAgc2V0XCIpO1xyXG4gICAgICAgIHRoaXMuY29udHJvbEF1ZGlvUGxheWVyLmF1ZGlvQ2xpcCA9IHRoaXMuZGlzcGxheUF1ZGlvQ2xpcDtcclxuICAgICAgICB0aGlzLnNob3dSZWNvcmRpbmcoKTtcclxuICAgICAgfWVsc2Uge1xyXG4gICAgICAgIC8vIGNsZWFyIGZvciBub3cgLi4uXHJcbiAgICAgICAgdGhpcy5kaXNwbGF5QXVkaW9DbGlwID0gbnVsbDtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJzZXQgcmVjb3JkaW5nIGZpbGU6IGRpc3BsYXkgYXVkaW8gY2xpcCBudWxsXCIpO1xyXG4gICAgICAgIHRoaXMuY29udHJvbEF1ZGlvUGxheWVyLmF1ZGlvQ2xpcCA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIgJiYgdGhpcy5fc2Vzc2lvbikge1xyXG4gICAgICAgICAgLy8uLi4gYW5kIHRyeSB0byBmZXRjaCBmcm9tIHNlcnZlclxyXG4gICAgICAgICAgdGhpcy5saXZlTGV2ZWxEaXNwbGF5U3RhdGU9TGl2ZUxldmVsU3RhdGUuTE9BRElORztcclxuICAgICAgICAgIGNvbnN0IHJmPXRoaXMuX2Rpc3BsYXlSZWNGaWxlO1xyXG5cclxuICAgICAgICAgIGxldCBhdWRpb0Rvd25sb2FkVHlwZT10aGlzLl9jbGllbnRBdWRpb1N0b3JhZ2VUeXBlO1xyXG4gICAgICAgICAgaWYoQXVkaW9TdG9yYWdlVHlwZS5NRU1fRU5USVJFX0FVVE9fTkVUX0NIVU5LRUQ9PT10aGlzLl9jbGllbnRBdWRpb1N0b3JhZ2VUeXBlIHx8IEF1ZGlvU3RvcmFnZVR5cGUuTUVNX0NIVU5LRURfQVVUT19ORVRfQ0hVTktFRD09PXRoaXMuX2NsaWVudEF1ZGlvU3RvcmFnZVR5cGUpIHtcclxuICAgICAgICAgICAgLy8gRGVmYXVsdCBpcyBuZXR3b3JrIG1vZGVcclxuICAgICAgICAgICAgYXVkaW9Eb3dubG9hZFR5cGU9QXVkaW9TdG9yYWdlVHlwZS5ORVRfQ0hVTktFRDtcclxuICAgICAgICAgICAgaWYgKHJmLmNoYW5uZWxzICYmIHJmLmZyYW1lcykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHNhbXBsZXMgPSByZi5jaGFubmVscyAqIHJmLmZyYW1lcztcclxuICAgICAgICAgICAgICBpZiAoc2FtcGxlcyA8PSB0aGlzLl9tYXhBdXRvTmV0TWVtU3RvcmVTYW1wbGVzKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBCdXQgaWYgYXVkaW8gZmlsZSBpcyBzbWFsbCwgbG9hZCBpbiBjb250aW51b3VzIHJlc3AuIGNodW5rZWQgbW9kZVxyXG4gICAgICAgICAgICAgICAgaWYoQXVkaW9TdG9yYWdlVHlwZS5NRU1fRU5USVJFX0FVVE9fTkVUX0NIVU5LRUQ9PT10aGlzLl9jbGllbnRBdWRpb1N0b3JhZ2VUeXBlKXtcclxuICAgICAgICAgICAgICAgICAgYXVkaW9Eb3dubG9hZFR5cGU9QXVkaW9TdG9yYWdlVHlwZS5NRU1fRU5USVJFO1xyXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoQXVkaW9TdG9yYWdlVHlwZS5NRU1fQ0hVTktFRF9BVVRPX05FVF9DSFVOS0VEPT09dGhpcy5fY2xpZW50QXVkaW9TdG9yYWdlVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICBhdWRpb0Rvd25sb2FkVHlwZSA9IEF1ZGlvU3RvcmFnZVR5cGUuTUVNX0NIVU5LRUQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYoQXVkaW9TdG9yYWdlVHlwZS5EQl9DSFVOS0VEPT09dGhpcy5fY2xpZW50QXVkaW9TdG9yYWdlVHlwZSl7XHJcbiAgICAgICAgICAgIC8vIEZldGNoIGNodW5rZWQgaW5kZXhlZCBkYiBhdWRpbyBidWZmZXJcclxuICAgICAgICAgICAgbGV0IG5leHRJYWI6IEluZGV4ZWREYkF1ZGlvQnVmZmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmKCF0aGlzLl9wZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0KXtcclxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcignRXJyb3I6IFBlcnNpc3RlbnQgc3RvcmFnZSB0YXJnZXQgbm90IHNldC4nKTtcclxuICAgICAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkZldGNoIGF1ZGlvIGFuZCBzdG9yZSB0byBpbmRleGVkIGRiLi4uXCIpO1xyXG4gICAgICAgICAgICAgIHRoaXMuYXVkaW9GZXRjaFN1YnNjcmlwdGlvbiA9IHRoaXMucmVjRmlsZVNlcnZpY2UuZmV0Y2hSZWNvcmRpbmdGaWxlSW5kRGJBdWRpb0J1ZmZlcih0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIuY29udGV4dCwgdGhpcy5fcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldCwgdGhpcy5fc2Vzc2lvbi5wcm9qZWN0LCByZikuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgIG5leHQ6IChpYWIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU2Vzc2lvbm1hbmFnZXI6IFJlY2VpdmVkIGluZGRiIGF1ZGlvIGJ1ZmZlcjogXCIraWFiKTtcclxuICAgICAgICAgICAgICAgICAgbmV4dElhYiA9IGlhYjtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmxpdmVMZXZlbERpc3BsYXlTdGF0ZSA9IExpdmVMZXZlbFN0YXRlLlJFQURZO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgZmFiRGggPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICBpZiAobmV4dElhYikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZiApIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZhYkRoID0gbmV3IEF1ZGlvRGF0YUhvbGRlcihuZXh0SWFiKTtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcy5hdWRpb0xvYWRlZD10cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvcmRlckNvbWJpUGFuZS5zZXRSZWNGaWxlQXVkaW9EYXRhKHJmLCBmYWJEaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBhY3R1YWxseSBiZSBoYW5kbGVkIGJ5IHRoZSBlcnJvciByZXNvbHZlclxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZyBmaWxlIGNvdWxkIG5vdCBiZSBsb2FkZWQuJ1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJ1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGlmIChmYWJEaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCBjb3VsZCBoYXZlIGJlZW4gY2hhbmdlZCBtZWFud2hpbGUsIGJ1dCB0aGUgcmVjb3JkZXIgdW5zdWJjcmliZXMgYmVmb3JlIGNoYW5naW5nIHRoZSBpdGVtLiBUaGVyZWZvcmUsIHRoZXJlIHNob3VsZCBiZSBubyByaXNrIHRvIHNldCB0byB3cm9uZyBpdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5QXVkaW9DbGlwID0gbmV3IEF1ZGlvQ2xpcChmYWJEaCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIuYXVkaW9DbGlwID0gdGhpcy5kaXNwbGF5QXVkaW9DbGlwXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1JlY29yZGluZygpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IGxvYWQgcmVjb3JkaW5nIGZpbGUgZnJvbSBzZXJ2ZXI6IFwiICsgZXJyKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5saXZlTGV2ZWxEaXNwbGF5U3RhdGUgPSBMaXZlTGV2ZWxTdGF0ZS5SRUFEWTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGxvYWRlZDogJyArIGVycjtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2UgaWYoQXVkaW9TdG9yYWdlVHlwZS5ORVRfQ0hVTktFRD09PWF1ZGlvRG93bmxvYWRUeXBlKXtcclxuICAgICAgICAgICAgLy8gRmV0Y2ggY2h1bmtlZCBhdWRpbyBidWZmZXIgZnJvbSBuZXR3b3JrXHJcbiAgICAgICAgICAgIGxldCBuZXh0TmV0QWI6IE5ldEF1ZGlvQnVmZmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJGZXRjaCBjaHVua2VkIGF1ZGlvIGZyb20gbmV0d29ya1wiKTtcclxuICAgICAgICAgICAgdGhpcy5hdWRpb0ZldGNoU3Vic2NyaXB0aW9uID0gdGhpcy5yZWNGaWxlU2VydmljZS5mZXRjaFJlY29yZGluZ0ZpbGVOZXRBdWRpb0J1ZmZlcih0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIuY29udGV4dCwgdGhpcy5fc2Vzc2lvbi5wcm9qZWN0LCByZikuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICBuZXh0OiAobmV0QWIpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlNlc3Npb25tYW5hZ2VyOiBSZWNlaXZlZCBuZXQgYXVkaW8gYnVmZmVyOiBcIituZXRBYik7XHJcbiAgICAgICAgICAgICAgICBuZXh0TmV0QWIgPSBuZXRBYjtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpdmVMZXZlbERpc3BsYXlTdGF0ZSA9IExpdmVMZXZlbFN0YXRlLlJFQURZO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZhYkRoID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmIChuZXh0TmV0QWIpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHJmKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmFiRGggPSBuZXcgQXVkaW9EYXRhSG9sZGVyKG5leHROZXRBYik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb3JkZXJDb21iaVBhbmUuc2V0UmVjRmlsZUF1ZGlvRGF0YShyZiwgZmFiRGgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAvLyBTaG91bGQgYWN0dWFsbHkgYmUgaGFuZGxlZCBieSB0aGUgZXJyb3IgcmVzb2x2ZXJcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGxvYWRlZC4nXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGZhYkRoKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCBjb3VsZCBoYXZlIGJlZW4gY2hhbmdlZCBtZWFud2hpbGUsIGJ1dCB0aGUgcmVjb3JkZXIgdW5zdWJjcmliZXMgYmVmb3JlIGNoYW5naW5nIHRoZSBpdGVtLiBUaGVyZWZvcmUsIHRoZXJlIHNob3VsZCBiZSBubyByaXNrIHRvIHNldCB0byB3cm9uZyBpdGVtXHJcbiAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcInNldCBkaXNwbGF5UmVjRmlsZSgpOiBmZXRjaCBuZXQgYWIgY29tcGxldGUsIHNldCBkaXNwbGF5QXVkaW9DbGlwLlwiKVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBuZXcgQXVkaW9DbGlwKGZhYkRoKTtcclxuICAgICAgICAgICAgICAgICAgLy8gZmFiRGgub25SZWFkeT0oKT0+e1xyXG4gICAgICAgICAgICAgICAgICAvLyAgIHRoaXMuYXVkaW9Mb2FkZWQ9dHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIuYXVkaW9DbGlwID0gdGhpcy5kaXNwbGF5QXVkaW9DbGlwXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dSZWNvcmRpbmcoKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGVycm9yOiBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkNvdWxkIG5vdCBsb2FkIHJlY29yZGluZyBmaWxlIGZyb20gc2VydmVyOiBcIiArIGVycik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpdmVMZXZlbERpc3BsYXlTdGF0ZSA9IExpdmVMZXZlbFN0YXRlLlJFQURZO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGxvYWRlZDogJyArIGVycjtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgfWVsc2UgaWYoQXVkaW9TdG9yYWdlVHlwZS5NRU1fQ0hVTktFRD09PWF1ZGlvRG93bmxvYWRUeXBlKXtcclxuICAgICAgICAgICAgLy8gRmV0Y2ggY2h1bmtlZCBhcnJheSBhdWRpbyBidWZmZXJcclxuICAgICAgICAgICAgbGV0IG5leHRBYWI6IEFycmF5QXVkaW9CdWZmZXIgfCBudWxsID0gbnVsbDtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiRmV0Y2ggYXVkaW8gYW5kIHN0b3JlIHRvIChjaHVua2VkKSBhcnJheSBidWZmZXIuLi5cIik7XHJcbiAgICAgICAgICAgIHRoaXMuYXVkaW9GZXRjaFN1YnNjcmlwdGlvbiA9IHRoaXMucmVjRmlsZVNlcnZpY2UuZmV0Y2hSZWNvcmRpbmdGaWxlQXJyYXlBdWRpb0J1ZmZlcih0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIuY29udGV4dCwgdGhpcy5fc2Vzc2lvbi5wcm9qZWN0LCByZikuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICBuZXh0OiAoYWFiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBuZXh0QWFiID0gYWFiO1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGl2ZUxldmVsRGlzcGxheVN0YXRlID0gTGl2ZUxldmVsU3RhdGUuUkVBRFk7XHJcbiAgICAgICAgICAgICAgICBsZXQgZmFiRGggPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5leHRBYWIpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHJmICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZhYkRoID0gbmV3IEF1ZGlvRGF0YUhvbGRlcihuZXh0QWFiKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY29yZGVyQ29tYmlQYW5lLnNldFJlY0ZpbGVBdWRpb0RhdGEocmYsIGZhYkRoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGFjdHVhbGx5IGJlIGhhbmRsZWQgYnkgdGhlIGVycm9yIHJlc29sdmVyXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZyBmaWxlIGNvdWxkIG5vdCBiZSBsb2FkZWQuJ1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcidcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChmYWJEaCkge1xyXG4gICAgICAgICAgICAgICAgICAvLyB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgY291bGQgaGF2ZSBiZWVuIGNoYW5nZWQgbWVhbndoaWxlLCBidXQgdGhlIHJlY29yZGVyIHVuc3ViY3JpYmVzIGJlZm9yZSBjaGFuZ2luZyB0aGUgaXRlbS4gVGhlcmVmb3JlLCB0aGVyZSBzaG91bGQgYmUgbm8gcmlzayB0byBzZXQgdG8gd3JvbmcgaXRlbVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBuZXcgQXVkaW9DbGlwKGZhYkRoKTtcclxuICAgICAgICAgICAgICAgICAgLy90aGlzLmF1ZGlvTG9hZGVkPXRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xBdWRpb1BsYXllci5hdWRpb0NsaXAgPSB0aGlzLmRpc3BsYXlBdWRpb0NsaXBcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1JlY29yZGluZygpO1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgZXJyb3I6IGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IGxvYWQgcmVjb3JkaW5nIGZpbGUgZnJvbSBzZXJ2ZXI6IFwiICsgZXJyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGl2ZUxldmVsRGlzcGxheVN0YXRlID0gTGl2ZUxldmVsU3RhdGUuUkVBRFk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c01zZyA9ICdSZWNvcmRpbmcgZmlsZSBjb3VsZCBub3QgYmUgbG9hZGVkOiAnICsgZXJyO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hdWRpb0ZldGNoU3Vic2NyaXB0aW9uID0gdGhpcy5yZWNGaWxlU2VydmljZS5mZXRjaFJlY29yZGluZ0ZpbGVBdWRpb0J1ZmZlcih0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIuY29udGV4dCwgdGhpcy5fc2Vzc2lvbi5wcm9qZWN0LCByZikuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICBuZXh0OiBhYiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpdmVMZXZlbERpc3BsYXlTdGF0ZSA9IExpdmVMZXZlbFN0YXRlLlJFQURZO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZhYkRoID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmIChhYikge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgYWJTcmM9bmV3IEF1ZGlvQnVmZmVyU291cmNlKGFiKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHJmKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmFiRGggPSBuZXcgQXVkaW9EYXRhSG9sZGVyKGFiU3JjKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY29yZGVyQ29tYmlQYW5lLnNldFJlY0ZpbGVBdWRpb0RhdGEocmYsIGZhYkRoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGxvYWRlZC4nKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGxvYWRlZC4nO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZmFiRGgpIHtcclxuICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kaXNwbGF5QXVkaW9DbGlwIGNvdWxkIGhhdmUgYmVlbiBjaGFuZ2VkIG1lYW53aGlsZSwgYnV0IHRoZSByZWNvcmRlciB1bnN1YmNyaWJlcyBiZWZvcmUgY2hhbmdpbmcgdGhlIGl0ZW0uIFRoZXJlZm9yZSwgdGhlcmUgc2hvdWxkIGJlIG5vIHJpc2sgdG8gc2V0IHRvIHdyb25nIGl0ZW1cclxuICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5QXVkaW9DbGlwID0gbmV3IEF1ZGlvQ2xpcChmYWJEaCk7XHJcbiAgICAgICAgICAgICAgICAgIC8vdGhpcy5hdWRpb0xvYWRlZD10cnVlO1xyXG4gICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJzZXQgcmVjb3JkaW5nIGZpbGU6IGRpc3BsYXkgYXVkaW8gY2xpcCBmcm9tIGZldGNoZWQgYXVkaW8gYnVmZmVyXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIuYXVkaW9DbGlwID0gdGhpcy5kaXNwbGF5QXVkaW9DbGlwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93UmVjb3JkaW5nKCk7XHJcbiAgICAgICAgICAgICAgfSwgZXJyb3I6IGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IGxvYWQgcmVjb3JkaW5nIGZpbGUgZnJvbSBzZXJ2ZXI6IFwiICsgZXJyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGl2ZUxldmVsRGlzcGxheVN0YXRlID0gTGl2ZUxldmVsU3RhdGUuUkVBRFk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c01zZyA9ICdSZWNvcmRpbmcgZmlsZSBjb3VsZCBub3QgYmUgbG9hZGVkOiAnICsgZXJyO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZyBmaWxlIGNvdWxkIG5vdCBiZSBkZWNvZGVkLiBBdWRpbyBjb250ZXh0IHVuYXZhaWxhYmxlLic7XHJcbiAgICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcic7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy9jb25zb2xlLmRlYnVnKFwicmVjb3JkaW5nIGZpbGUgbnVsbFwiKTtcclxuICAgICAgdGhpcy5kaXNwbGF5QXVkaW9DbGlwID0gbnVsbDtcclxuICAgICAgdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIuYXVkaW9DbGlwID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMuc2hvd1JlY29yZGluZygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRpc3BsYXlSZWNGaWxlKCk6IFJlY29yZGluZ0ZpbGUgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5UmVjRmlsZTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVN0YXJ0QWN0aW9uRGlzYWJsZVN0YXRlKCl7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24uZGlzYWJsZWQ9ISh0aGlzLmFjKTtcclxuICB9XHJcblxyXG4gIHN0YXJ0KCkge1xyXG4gICAgc3VwZXIuc3RhcnQoKTtcclxuICAgIHRoaXMucmVjb3JkZXJDb21iaVBhbmUuc2VsZWN0VG9wKCk7XHJcbiAgICB0aGlzLmVuYWJsZU5hdmlnYXRpb24oKTtcclxuICAgIHRoaXMudXBkYXRlU3RhcnRBY3Rpb25EaXNhYmxlU3RhdGUoKTtcclxuXHJcbiAgfVxyXG5cclxuICBpc1JlY29yZGluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodGhpcy5zdGF0dXMgPT09IFN0YXR1cy5SRUNPUkRJTkcgfHwgdGhpcy5zdGF0dXM9PT1TdGF0dXMuU1RPUFBJTkdfU1RPUCk7XHJcbiAgfVxyXG5cclxuICBpc0FjdGl2ZSgpOiBib29sZWFue1xyXG4gICAgcmV0dXJuICghKHRoaXMuc3RhdHVzID09PSBTdGF0dXMuQkxPQ0tFRCB8fCB0aGlzLnN0YXR1cz09PSBTdGF0dXMuSURMRSB8fCB0aGlzLnN0YXR1cz09PVN0YXR1cy5FUlJPUikgfHwgdGhpcy5wcm9jZXNzaW5nUmVjb3JkaW5nIHx8IHRoaXMuc2Vzc2lvblNlcnZpY2UudXBsb2FkQ291bnQ+MClcclxuICB9XHJcblxyXG5cclxuICB1cGRhdGVXYWtlTG9jayhkYXRhU2F2ZWQ6Ym9vbGVhbj10aGlzLmRhdGFTYXZlZCl7XHJcbiAgICAvL2NvbnNvbGUuZGVidWcoXCJVcGRhdGUgd2FrZSBsb2NrOiBkYXRhU2F2ZWQ6IFwiK2RhdGFTYXZlZCtcIiwgbm90IGFjdGl2ZTogXCIrISB0aGlzLmlzQWN0aXZlKCkpXHJcbiAgICBpZihkYXRhU2F2ZWQgJiYgISB0aGlzLmlzQWN0aXZlKCkpe1xyXG4gICAgICB0aGlzLmRpc2FibGVXYWtlTG9ja0NvbmQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKXtcclxuXHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkQWN0aW9uLmRpc2FibGVkID0gdGhpcy5uYXZpZ2F0aW9uRGlzYWJsZWQ7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuYndkQWN0aW9uLmRpc2FibGVkID0gdGhpcy5uYXZpZ2F0aW9uRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBlbmFibGVTdGFydFVzZXJHZXN0dXJlKCkge1xyXG4gICAgc3VwZXIuZW5hYmxlU3RhcnRVc2VyR2VzdHVyZSgpO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLmRpc2FibGVkPSEodGhpcy5hYyk7XHJcbiAgfVxyXG5cclxuICBlbmFibGVOYXZpZ2F0aW9uKCl7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25EaXNhYmxlZD1mYWxzZTtcclxuICAgIHRoaXMudXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHN0YXJ0ZWQoKSB7XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5SRUNPUkRJTkc7XHJcbiAgICBzdXBlci5zdGFydGVkKCk7XHJcbiAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZy4uLic7XHJcblxyXG4gICAgbGV0IHNlc3NJZDogc3RyaW5nIHwgbnVtYmVyID0gMDtcclxuICAgIGlmKHRoaXMuX3Nlc3Npb24pe1xyXG4gICAgICBzZXNzSWQ9dGhpcy5fc2Vzc2lvbi5zZXNzaW9uSWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYodGhpcy5yZlV1aWQpIHtcclxuICAgICAgbGV0IHJmID0gbmV3IFJlY29yZGluZ0ZpbGUodGhpcy5yZlV1aWQsIHNlc3NJZCwgbnVsbCk7XHJcbiAgICAgIHJmLl9zdGFydGVkQXNEYXRlT2JqID0gdGhpcy5zdGFydGVkRGF0ZTtcclxuICAgICAgaWYgKHJmLl9zdGFydGVkQXNEYXRlT2JqKSB7XHJcbiAgICAgICAgcmYuc3RhcnRlZERhdGUgPSByZi5fc3RhcnRlZEFzRGF0ZU9iai50b1N0cmluZygpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3JlY29yZGluZ0ZpbGUgPSByZjtcclxuICAgIH1cclxuICAgIGxldCBtYXhSZWNvcmRpbmdUaW1lTXMgPSBNQVhfUkVDT1JESU5HX1RJTUVfTVM7XHJcbiAgICB0aGlzLm1heFJlY1RpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc3RvcFJlY29yZGluZ01heFJlYygpXHJcbiAgICB9LCBtYXhSZWNvcmRpbmdUaW1lTXMpO1xyXG4gICAgdGhpcy5tYXhSZWNUaW1lclJ1bm5pbmcgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHN0b3BJdGVtKCkge1xyXG5cclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlNUT1BQSU5HX1NUT1A7XHJcbiAgICB0aGlzLnN0b3BSZWNvcmRpbmcoKTtcclxuXHJcbiAgfVxyXG5cclxuICBzdG9wUmVjb3JkaW5nKCkge1xyXG4gICAgaWYgKHRoaXMubWF4UmVjVGltZXJSdW5uaW5nICYmIHRoaXMubWF4UmVjVGltZXJJZCE9bnVsbCkge1xyXG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMubWF4UmVjVGltZXJJZCk7XHJcbiAgICAgIHRoaXMubWF4UmVjVGltZXJSdW5uaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLmFjKSB7XHJcbiAgICAgIHRoaXMuYWMuc3RvcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RvcFJlY29yZGluZ01heFJlYygpe1xyXG5cclxuICAgIHRoaXMubWF4UmVjVGltZXJSdW5uaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5TVE9QUElOR19TVE9QO1xyXG4gICAgaWYodGhpcy5hYykge1xyXG4gICAgICB0aGlzLmFjLnN0b3AoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0b3BwZWQoKSB7XHJcbiAgICB0aGlzLnVwZGF0ZVN0YXJ0QWN0aW9uRGlzYWJsZVN0YXRlKClcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGVkLic7XHJcblxyXG4gICAgbGV0IGFkOkF1ZGlvQnVmZmVyfG51bGw9bnVsbDtcclxuXHJcbiAgICBpZih0aGlzLmFjKSB7XHJcbiAgICAgIGxldCBhZGg6QXVkaW9EYXRhSG9sZGVyfG51bGw9bnVsbDtcclxuICAgICAgbGV0IGFzOkF1ZGlvU291cmNlfG51bGw9bnVsbDtcclxuICAgICAgaWYodGhpcy5hYykge1xyXG4gICAgICAgIGlmIChBdWRpb1N0b3JhZ2VUeXBlLk5FVF9DSFVOS0VEID09PSB0aGlzLmFjLmF1ZGlvU3RvcmFnZVR5cGUpIHtcclxuICAgICAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgIC8vdGhpcy5hdWRpb0xvYWRlZD1mYWxzZTtcclxuICAgICAgICAgIHRoaXMua2VlcExpdmVMZXZlbD10cnVlO1xyXG4gICAgICAgICAgbGV0IHJVVUlEOnN0cmluZ3xudWxsPW51bGw7XHJcbiAgICAgICAgICAgIGxldCBidXJsOnN0cmluZ3xudWxsPW51bGw7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuX3Nlc3Npb24pIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5fcmVjb3JkaW5nRmlsZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCByZiA9IHRoaXMuX3JlY29yZGluZ0ZpbGU7XHJcbiAgICAgICAgICAgICAgICByZi5mcmFtZXM9dGhpcy5hYy5mcmFtZXNSZWNvcmRlZDtcclxuICAgICAgICAgICAgICAgIHJVVUlEPXJmLnV1aWQ7XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJzdG9wcGVkKCk6IFNldCBmcmFtZXM6IFwiK3JmLmZyYW1lcytcIiBvbiByZklkOiBcIit0aGlzLmRpc3BsYXlSZWNGaWxlPy5yZWNvcmRpbmdGaWxlSWQpO1xyXG4gICAgICAgICAgICAgICAgYnVybCA9IHRoaXMucmVjRmlsZVNlcnZpY2UuYXVkaW9GaWxlVXJsKHRoaXMuX3Nlc3Npb24/LnByb2plY3QsIHJmKTtcclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2Vzc2lvbj8ucHJvamVjdCkge1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5hYy5yZWNVVUlEKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJVVUlEPXRoaXMuYWMucmVjVVVJRDtcclxuICAgICAgICAgICAgICAgICAgYnVybCA9IHRoaXMucmVjRmlsZVNlcnZpY2UuYXVkaW9GaWxlVXJsQnlVVUlEKHRoaXMuc2Vzc2lvbi5wcm9qZWN0LCB0aGlzLnNlc3Npb24uc2Vzc2lvbklkLCByVVVJRCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IGNyZWF0ZSBuZXQgYXVkaW8gYnVmZmVyLlwiKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGJ1cmwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNyID0gdGhpcy5hYy5jdXJyZW50U2FtcGxlUmF0ZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoRmw9c3IqUmVjb3JkaW5nU2VydmljZS5ERUZBVUxUX0NIVU5LRURfRE9XTkxPQURfU0VDT05EUztcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcInN0b3BwZWQoKTogcmZJRDogXCIrdGhpcy5fcmVjb3JkaW5nRmlsZT8ucmVjb3JkaW5nRmlsZUlkK1wiLCBuZXQgYWIgdXJsOiBcIiArIGJ1cmwrXCIsIGZyYW1lczogXCIrdGhpcy5hYy5mcmFtZXNSZWNvcmRlZCtcIiwgc2FtcGxlIHJhdGU6IFwiK3NyKTtcclxuICAgICAgICAgICAgICAgIGxldCBuZXRBcyA9IG5ldyBOZXRBdWRpb0J1ZmZlcih0aGlzLmFjLmNvbnRleHQsIHRoaXMucmVjRmlsZVNlcnZpY2UsIGJ1cmwsIHRoaXMuYWMuY2hhbm5lbENvdW50LCBzciwgY2hGbCwgdGhpcy5hYy5mcmFtZXNSZWNvcmRlZCwgclVVSUQsIGNoRmwpO1xyXG4gICAgICAgICAgICAgICAgYXM9bmV0QXM7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLnVwbG9hZFNldCl7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkU2V0Lm9uRG9uZT0odXBsb2FkU2V0KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcInVwbG9hZCBzZXQgb24gZG9uZTogQ2FsbCByZWFkeSBwcm92aWRlci5yZWFkeVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBuZXRBcy5yZWFkeSgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9ZWxzZSBpZiAoQXVkaW9TdG9yYWdlVHlwZS5NRU1fRU5USVJFX0FVVE9fTkVUX0NIVU5LRUQgPT09IHRoaXMuYWMuYXVkaW9TdG9yYWdlVHlwZSB8fCBBdWRpb1N0b3JhZ2VUeXBlLk1FTV9DSFVOS0VEX0FVVE9fTkVUX0NIVU5LRUQgPT09IHRoaXMuYWMuYXVkaW9TdG9yYWdlVHlwZSkge1xyXG4gICAgICAgICAgaWYgKEF1ZGlvU3RvcmFnZVR5cGUuTUVNX0VOVElSRV9BVVRPX05FVF9DSFVOS0VEID09PSB0aGlzLmFjLmF1ZGlvU3RvcmFnZVR5cGUpe1xyXG4gICAgICAgICAgICBjb25zdCBhY0FiPXRoaXMuYWMuYXVkaW9CdWZmZXIoKTtcclxuICAgICAgICAgICAgaWYoYWNBYikge1xyXG4gICAgICAgICAgICAgIGFzID0gbmV3IEF1ZGlvQnVmZmVyU291cmNlKGFjQWIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZihBdWRpb1N0b3JhZ2VUeXBlLk1FTV9DSFVOS0VEX0FVVE9fTkVUX0NIVU5LRUQgPT09IHRoaXMuYWMuYXVkaW9TdG9yYWdlVHlwZSl7XHJcbiAgICAgICAgICAgIGFzID0gdGhpcy5hYy5hdWRpb0J1ZmZlckFycmF5KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZighYXMpe1xyXG4gICAgICAgICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMua2VlcExpdmVMZXZlbD10cnVlO1xyXG4gICAgICAgICAgICBsZXQgclVVSUQ6c3RyaW5nfG51bGw9bnVsbDtcclxuICAgICAgICAgICAgbGV0IGJ1cmw6c3RyaW5nfG51bGw9bnVsbDtcclxuICAgICAgICAgICAgaWYodGhpcy5fc2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLl9yZWNvcmRpbmdGaWxlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmYgPSB0aGlzLl9yZWNvcmRpbmdGaWxlO1xyXG4gICAgICAgICAgICAgICAgcmYuZnJhbWVzPXRoaXMuYWMuZnJhbWVzUmVjb3JkZWQ7XHJcbiAgICAgICAgICAgICAgICByVVVJRD1yZi51dWlkO1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwic3RvcHBlZCgpOiBTZXQgZnJhbWVzOiBcIityZi5mcmFtZXMrXCIgb24gcmZJZDogXCIrdGhpcy5kaXNwbGF5UmVjRmlsZT8ucmVjb3JkaW5nRmlsZUlkKTtcclxuICAgICAgICAgICAgICAgIGJ1cmwgPSB0aGlzLnJlY0ZpbGVTZXJ2aWNlLmF1ZGlvRmlsZVVybCh0aGlzLl9zZXNzaW9uPy5wcm9qZWN0LCByZik7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlc3Npb24/LnByb2plY3QpIHtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuYWMucmVjVVVJRCkge1xyXG4gICAgICAgICAgICAgICAgICByVVVJRD10aGlzLmFjLnJlY1VVSUQ7XHJcbiAgICAgICAgICAgICAgICAgIGJ1cmwgPSB0aGlzLnJlY0ZpbGVTZXJ2aWNlLmF1ZGlvRmlsZVVybEJ5VVVJRCh0aGlzLnNlc3Npb24ucHJvamVjdCwgdGhpcy5zZXNzaW9uLnNlc3Npb25JZCwgclVVSUQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkNvdWxkIG5vdCBjcmVhdGUgbmV0IGF1ZGlvIGJ1ZmZlci5cIik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChidXJsKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzciA9IHRoaXMuYWMuY3VycmVudFNhbXBsZVJhdGU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaEZsPXNyKlJlY29yZGluZ1NlcnZpY2UuREVGQVVMVF9DSFVOS0VEX0RPV05MT0FEX1NFQ09ORFM7XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJzdG9wcGVkKCk6IHJmSUQ6IFwiK3RoaXMuX3JlY29yZGluZ0ZpbGU/LnJlY29yZGluZ0ZpbGVJZCtcIiwgbmV0IGFiIHVybDogXCIgKyBidXJsK1wiLCBmcmFtZXM6IFwiK3RoaXMuYWMuZnJhbWVzUmVjb3JkZWQrXCIsIHNhbXBsZSByYXRlOiBcIitzcik7XHJcbiAgICAgICAgICAgICAgICBsZXQgbmV0QXMgPSBuZXcgTmV0QXVkaW9CdWZmZXIodGhpcy5hYy5jb250ZXh0LCB0aGlzLnJlY0ZpbGVTZXJ2aWNlLCBidXJsLCB0aGlzLmFjLmNoYW5uZWxDb3VudCwgc3IsIGNoRmwsIHRoaXMuYWMuZnJhbWVzUmVjb3JkZWQsIHJVVUlELCBjaEZsKTtcclxuICAgICAgICAgICAgICAgIGFzID0gbmV0QXM7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy51cGxvYWRTZXQpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRTZXQub25Eb25lID0gKHVwbG9hZFNldCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcInVwbG9hZCBzZXQgb24gZG9uZTogQ2FsbCByZWFkeSBwcm92aWRlci5yZWFkeVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBuZXRBcy5yZWFkeSgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChBdWRpb1N0b3JhZ2VUeXBlLkRCX0NIVU5LRUQgPT09IHRoaXMuYWMuYXVkaW9TdG9yYWdlVHlwZSkge1xyXG4gICAgICAgICAgYXMgPSB0aGlzLmFjLmluZGRiQXVkaW9CdWZmZXJBcnJheSgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoQXVkaW9TdG9yYWdlVHlwZS5NRU1fQ0hVTktFRCA9PT0gdGhpcy5hYy5hdWRpb1N0b3JhZ2VUeXBlKSB7XHJcbiAgICAgICAgICBhcyA9IHRoaXMuYWMuYXVkaW9CdWZmZXJBcnJheSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgYWIgPSB0aGlzLmFjLmF1ZGlvQnVmZmVyKCk7XHJcbiAgICAgICAgICBpZihhYikge1xyXG4gICAgICAgICAgICBhcyA9IG5ldyBBdWRpb0J1ZmZlclNvdXJjZShhYik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhcykge1xyXG4gICAgICAgICAgYWRoID0gbmV3IEF1ZGlvRGF0YUhvbGRlcihhcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgc2Vzc0lkOiBzdHJpbmcgfCBudW1iZXIgPSAwO1xyXG4gICAgICBpZih0aGlzLl9zZXNzaW9uKXtcclxuICAgICAgICBzZXNzSWQ9dGhpcy5fc2Vzc2lvbi5zZXNzaW9uSWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmKHRoaXMuX3JlY29yZGluZ0ZpbGUpIHtcclxuICAgICAgICAvL3RoaXMuX3JlY29yZGluZ0ZpbGUuc2FtcGxlcmF0ZT10aGlzLmFjLmN1cnJlbnRTYW1wbGVSYXRlO1xyXG4gICAgICAgIC8vIFVzZSBhbiBvd24gcmVmZXJlbmNlIHNpbmNlIHRoZSB3cml0aW5nIG9mIHRoZSB3YXZlIGZpbGUgaXMgYXN5bmNocm9ub3VzIGFuZCB0aGlzLl9yZWNvcmRpbmdGaWxlIG1pZ2h0IGFscmVhZHkgY29udGFpbiB0aGUgbmV4dCByZWNvcmRpbmdcclxuICAgICAgICBsZXQgcmYgPSB0aGlzLl9yZWNvcmRpbmdGaWxlO1xyXG4gICAgICAgIFJlY29yZGluZ0ZpbGVVdGlscy5zZXRBdWRpb0RhdGEocmYsYWRoKTtcclxuICAgICAgICB0aGlzLnJlY29yZGVyQ29tYmlQYW5lLmFkZFJlY0ZpbGUocmYpO1xyXG5cclxuICAgICAgICAvLyBVcGxvYWQgaWYgdXBsb2FkIGVuYWJsZWQgYW5kIG5vdCBpbiBjaHVua2VkIHVwbG9hZCBtb2RlXHJcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlVXBsb2FkUmVjb3JkaW5ncyAmJiAhdGhpcy51cGxvYWRDaHVua1NpemVTZWNvbmRzICYmIHJmICE9IG51bGwgJiYgYWQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgbGV0IGFwaUVuZFBvaW50ID0gJyc7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaUVuZFBvaW50KSB7XHJcbiAgICAgICAgICAgIGFwaUVuZFBvaW50ID0gdGhpcy5jb25maWcuYXBpRW5kUG9pbnQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoYXBpRW5kUG9pbnQgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIGFwaUVuZFBvaW50ID0gYXBpRW5kUG9pbnQgKyAnLydcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgc2Vzc2lvbnNVcmwgPSBhcGlFbmRQb2ludCArIFNlc3Npb25TZXJ2aWNlLlNFU1NJT05fQVBJX0NUWDtcclxuICAgICAgICAgIGxldCByZWNVcmw6IHN0cmluZyA9IHNlc3Npb25zVXJsICsgJy8nICsgcmYuc2Vzc2lvbiArICcvJyArIFJFQ0ZJTEVfQVBJX0NUWCArICcvJyArIHJmLnV1aWQ7XHJcblxyXG4gICAgICAgICAgLy8gY29udmVydCBhc3luY2hyb25vdXNseSB0byAxNi1iaXQgaW50ZWdlciBQQ01cclxuICAgICAgICAgIC8vIFRPRE8gY291bGQgd2UgYXZvaWQgY29udmVyc2lvbiB0byBzYXZlIENQVSByZXNvdXJjZXMgYW5kIHRyYW5zZmVyIGZsb2F0IFBDTSBkaXJlY3RseT9cclxuICAgICAgICAgIC8vIFRPRE8gZHVwbGljYXRlIGNvbnZlcnNpb24gZm9yIG1hbnVhbCBkb3dubG9hZFxyXG5cclxuICAgICAgICAgIHRoaXMucHJvY2Vzc2luZ1JlY29yZGluZyA9IHRydWVcclxuICAgICAgICAgIGxldCB3dyA9IG5ldyBXYXZXcml0ZXIoKTtcclxuICAgICAgICAgIHd3LndyaXRlQXN5bmMoYWQsICh3YXZGaWxlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucG9zdFJlY29yZGluZ011bHRpcGFydCh3YXZGaWxlLHJlY1VybCxyZik7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc2luZ1JlY29yZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdha2VMb2NrKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmRpc3BsYXlSZWNGaWxlID0gdGhpcy5fcmVjb3JkaW5nRmlsZTtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLklETEU7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25EaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy51cGRhdGVOYXZpZ2F0aW9uQWN0aW9ucygpO1xyXG4gICAgdGhpcy51cGRhdGVXYWtlTG9jaygpO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBlcnJvcihtc2c9J0FuIHVua25vd24gZXJyb3Igb2NjdXJlZCBkdXJpbmcgcmVjb3JkaW5nLicsYWR2aWNlOnN0cmluZz0nUGxlYXNlIHJldHJ5LicpIHtcclxuICAgIHRoaXMuc3RhdHVzPVN0YXR1cy5FUlJPUjtcclxuICAgIHN1cGVyLmVycm9yKG1zZyxhZHZpY2UpO1xyXG4gICAgdGhpcy51cGRhdGVOYXZpZ2F0aW9uQWN0aW9ucygpO1xyXG4gICAgdGhpcy51cGRhdGVTdGFydEFjdGlvbkRpc2FibGVTdGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcG9zdFJlY29yZGluZ011bHRpcGFydCh3YXZGaWxlOiBVaW50OEFycmF5LHJlY1VybDogc3RyaW5nLHJmOlJlY29yZGluZ0ZpbGUpIHtcclxuICAgIGxldCB3YXZCbG9iID0gbmV3IEJsb2IoW3dhdkZpbGVdLCB7dHlwZTogJ2F1ZGlvL3dhdid9KTtcclxuXHJcbiAgICBsZXQgZmQ9bmV3IEZvcm1EYXRhKCk7XHJcbiAgICBpZihyZi51dWlkKSB7XHJcbiAgICAgIGZkLnNldCgndXVpZCcsIHJmLnV1aWQpO1xyXG4gICAgfVxyXG4gICAgaWYocmYuc2Vzc2lvbiE9PW51bGwpIHtcclxuICAgICAgZmQuc2V0KCdzZXNzaW9uSWQnLCByZi5zZXNzaW9uLnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG4gICAgaWYocmYuX3N0YXJ0ZWRBc0RhdGVPYmope1xyXG4gICAgICBmZC5zZXQoJ3N0YXJ0ZWREYXRlJyxyZi5fc3RhcnRlZEFzRGF0ZU9iai50b0pTT04oKSk7XHJcbiAgICB9XHJcbiAgICBmZC5zZXQoJ2F1ZGlvJyx3YXZCbG9iKTtcclxuICAgIGxldCB1bCA9IG5ldyBVcGxvYWQoZmQsIHJlY1VybCxyZik7XHJcbiAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlVXBsb2FkKHVsKTtcclxuICB9XHJcblxyXG4gIHBvc3RDaHVua0F1ZGlvQnVmZmVyKGF1ZGlvQnVmZmVyOiBBdWRpb0J1ZmZlciwgY2h1bmtJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5wcm9jZXNzaW5nUmVjb3JkaW5nID0gdHJ1ZTtcclxuICAgIGxldCB3dyA9IG5ldyBXYXZXcml0ZXIoKTtcclxuICAgIGxldCBzZXNzaW9uc1VybCA9IHRoaXMuc2Vzc2lvbnNCYXNlVXJsKCk7XHJcbiAgICBsZXQgcmVjVXJsOiBzdHJpbmcgPSBzZXNzaW9uc1VybCArICcvJyArIHRoaXMuc2Vzc2lvbj8uc2Vzc2lvbklkICsgJy8nICsgUkVDRklMRV9BUElfQ1RYICsgJy8nICsgdGhpcy5yZlV1aWQrJy8nK2NodW5rSWR4O1xyXG4gICAgbGV0IHJmPXRoaXMuX3JlY29yZGluZ0ZpbGU7XHJcblxyXG4gICAgLy8gVGhlIHVwbG9hZCBob2xkZXIgaXMgcmVxdWlyZWQgdG8gYWRkIHRoZSB1cGxvYWQgbm93IHRvIHRoZSB1cGxvYWQgc2V0LiBUaGUgcmVhbCB1cGxvYWQgaXMgY3JlYXRlZCBhc3luYyBpbiBwb3N0cmVjb3JkaW5nIGFuZCB0aGUgdXBsb2FkIHNldCBpcyBhbHJlYWR5IGNvbXBsZXRlIGF0IHRoYXQgdGltZS5cclxuICAgIGxldCB1bGg9bmV3IFVwbG9hZEhvbGRlcigpO1xyXG4gICAgaWYodGhpcy51cGxvYWRTZXQpe1xyXG4gICAgICB0aGlzLnVwbG9hZFNldC5hZGQodWxoKTtcclxuICAgIH1cclxuICAgIHd3LndyaXRlQXN5bmMoYXVkaW9CdWZmZXIsICh3YXZGaWxlKSA9PiB7XHJcbiAgICAgIHRoaXMucG9zdFJlY29yZGluZyh3YXZGaWxlLCByZWNVcmwscmYsdWxoKTtcclxuICAgICAgdGhpcy5wcm9jZXNzaW5nUmVjb3JkaW5nID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHN0b3AoKSB7XHJcbiAgICBpZih0aGlzLmFjKSB7XHJcbiAgICAgIHRoaXMuYWMuY2xvc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQ29udHJvbFBsYXliYWNrUG9zaXRpb24oKSB7XHJcbiAgICBpZiAodGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLnBsYXlQb3NpdGlvbkZyYW1lcykge1xyXG4gICAgICB0aGlzLnJlY29yZGVyQ29tYmlQYW5lLmF1ZGlvRGlzcGxheS5wbGF5RnJhbWVQb3NpdGlvbiA9IHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5wbGF5UG9zaXRpb25GcmFtZXM7XHJcbiAgICAgIHRoaXMubGl2ZUxldmVsRGlzcGxheS5wbGF5RnJhbWVQb3NpdGlvbiA9IHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5wbGF5UG9zaXRpb25GcmFtZXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhdWRpb1BsYXllclVwZGF0ZShlOiBBdWRpb1BsYXllckV2ZW50KSB7XHJcbiAgICBpZiAoRXZlbnRUeXBlLlJFQURZID09PSBlLnR5cGUpIHtcclxuXHJcbiAgICB9IGVsc2UgaWYgKEV2ZW50VHlwZS5TVEFSVEVEID09PSBlLnR5cGUpIHtcclxuICAgICAgLy90aGlzLnN0YXR1cyA9ICdQbGF5YmFjay4uLic7XHJcbiAgICAgIHRoaXMudXBkYXRlVGltZXJJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB0aGlzLnVwZGF0ZUNvbnRyb2xQbGF5YmFja1Bvc2l0aW9uKCksIDUwKTtcclxuXHJcbiAgICB9IGVsc2UgaWYgKEV2ZW50VHlwZS5FTkRFRCA9PT0gZS50eXBlKSB7XHJcbiAgICAgIC8vLnN0YXR1cz0nUmVhZHkuJztcclxuICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy51cGRhdGVUaW1lcklkKTtcclxuXHJcbiAgICB9XHJcbiAgICBpZighdGhpcy5kZXN0cm95ZWQpIHtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWF1ZGlvcmVjb3JkZXItY29tcCcsXHJcbiAgcHJvdmlkZXJzOiBbU2Vzc2lvblNlcnZpY2VdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8YXBwLWF1ZGlvcmVjb3JkZXIgW3Byb2plY3ROYW1lXT1cIl9wcm9qZWN0Py5uYW1lXCIgW2RhdGFTYXZlZF09XCJkYXRhU2F2ZWRcIj48L2FwcC1hdWRpb3JlY29yZGVyPlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYDpob3N0e1xyXG4gICAgZmxleDogMjtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGhlaWdodDogMTAwJTtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBtaW4taGVpZ2h0OjA7XHJcblxyXG4gIH1gXVxyXG5cclxufSlcclxuZXhwb3J0IGNsYXNzIEF1ZGlvUmVjb3JkZXJDb21wb25lbnQgZXh0ZW5kcyBSZWNvcmRlckNvbXBvbmVudCAgaW1wbGVtZW50cyBPbkluaXQsT25EZXN0cm95LEFmdGVyVmlld0luaXQsUmVhZHlTdGF0ZVByb3ZpZGVyIHtcclxuXHJcbiAgbW9kZSE6TW9kZTtcclxuICBjb250cm9sQXVkaW9QbGF5ZXIhOkF1ZGlvUGxheWVyO1xyXG4gIGF1ZGlvOmFueTtcclxuXHJcbiAgX3Byb2plY3Q6UHJvamVjdHx1bmRlZmluZWQ7XHJcbiAgc2Vzc2lvbklkITogc3RyaW5nO1xyXG4gIHNlc3Npb24hOlNlc3Npb247XHJcblxyXG4gIEBWaWV3Q2hpbGQoQXVkaW9SZWNvcmRlciwgeyBzdGF0aWM6IHRydWUgfSkgYXIhOkF1ZGlvUmVjb3JkZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzZXNzaW9uU2VydmljZTpTZXNzaW9uU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIHByb2plY3RTZXJ2aWNlOlByb2plY3RTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByb3RlY3RlZCB1cGxvYWRlcjpTcGVlY2hSZWNvcmRlclVwbG9hZGVyXHJcbiAgKSB7XHJcbiAgICBzdXBlcih1cGxvYWRlcik7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIC8vc3VwZXIubmdPbkluaXQoKTtcclxuICAgIGxldCBhdWRpb0NvbnRleHQgPSBBdWRpb0NvbnRleHRQcm92aWRlci5hdWRpb0NvbnRleHRJbnN0YW5jZSgpO1xyXG4gICAgaWYoYXVkaW9Db250ZXh0KSB7XHJcbiAgICAgIHRoaXMuY29udHJvbEF1ZGlvUGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKGF1ZGlvQ29udGV4dCx0aGlzLmFyKTtcclxuICAgIH1cclxuICAgIHRoaXMuYXIuY29udHJvbEF1ZGlvUGxheWVyPXRoaXMuY29udHJvbEF1ZGlvUGxheWVyO1xyXG5cclxuICAgIC8vVE9ETyBEdXBsaWNhdGUgY29kZSBpbiBTcGVlY2hSZWNvcmRlckNvbXBvbmVudFxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIChlKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJCZWZvcmUgcGFnZSB1bmxvYWQgZXZlbnRcIik7XHJcblxyXG4gICAgICBpZiAodGhpcy5yZWFkeSgpKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGFsbCB0aGlzIGF0dGVtcHRzIHRvIGN1c3RvbWl6ZSB0aGUgbWVzc2FnZSBkbyBub3Qgd29yayBhbnltb3JlIChmb3Igc2VjdXJpdHkgcmVhc29ucykhIVxyXG4gICAgICAgIHZhciBtZXNzYWdlID0gXCJQbGVhc2UgZG8gbm90IGxlYXZlIHRoZSBwYWdlLCB1bnRpbCBhbGwgcmVjb3JkaW5ncyBhcmUgdXBsb2FkZWQhXCI7XHJcbiAgICAgICAgYWxlcnQobWVzc2FnZSk7XHJcbiAgICAgICAgZSA9IGUgfHwgd2luZG93LmV2ZW50O1xyXG5cclxuICAgICAgICBpZiAoZSkge1xyXG4gICAgICAgICAgZS5yZXR1cm5WYWx1ZSA9IG1lc3NhZ2U7XHJcbiAgICAgICAgICBlLmNhbmNlbEJ1YmJsZSA9IHRydWU7XHJcbiAgICAgICAgICBpZiAoZS5zdG9wUHJvcGFnYXRpb24pIHtcclxuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuXHJcbiAgICAvLyBUT0RPIGNhbGwgcHJlcGFyZSAhIVxyXG5cclxuICAgIHRoaXMudXBsb2FkZXIubGlzdGVuZXIgPSAodWUpID0+IHtcclxuICAgICAgdGhpcy51cGxvYWRVcGRhdGUodWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5zdWJzY3JpYmUoKHBhcmFtczogUGFyYW1zKSA9PiB7XHJcbiAgICAgIGlmIChwYXJhbXNbJ3Nlc3Npb25JZCddKSB7XHJcbiAgICAgICAgdGhpcy5mZXRjaFNlc3Npb24ocGFyYW1zWydzZXNzaW9uSWQnXSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKChwYXJhbXM6IFBhcmFtcykgPT4ge1xyXG4gICAgICBsZXQgcm91dGVQYXJhbXNJZCA9IHBhcmFtc1snaWQnXTtcclxuICAgICAgaWYgKHJvdXRlUGFyYW1zSWQpIHtcclxuICAgICAgICB0aGlzLmZldGNoU2Vzc2lvbihyb3V0ZVBhcmFtc0lkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIC8vc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICB9XHJcblxyXG4gIGdldCBzY3JlZW5Mb2NrZWQoKTpib29sZWFue1xyXG4gICAgcmV0dXJuICB0aGlzLmFyLnNjcmVlbkxvY2tlZDtcclxuICB9XHJcblxyXG4gIGZldGNoU2Vzc2lvbihzZXNzaW9uSWQ6c3RyaW5nKXtcclxuXHJcbiAgICBsZXQgc2Vzc09icz0gdGhpcy5zZXNzaW9uU2VydmljZS5zZXNzaW9uT2JzZXJ2ZXIoc2Vzc2lvbklkKTtcclxuXHJcbiAgICBpZihzZXNzT2JzKSB7XHJcbiAgICAgIHNlc3NPYnMuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OihzZXNzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmFyLnN0YXR1c0FsZXJ0VHlwZT0naW5mbyc7XHJcbiAgICAgICAgICB0aGlzLmFyLnN0YXR1c01zZyA9ICdSZWNlaXZlZCBzZXNzaW9uIGluZm8uJztcclxuICAgICAgICAgIHRoaXMuYXIuc3RhdHVzV2FpdGluZz1mYWxzZTtcclxuICAgICAgICAgIHRoaXMuc2Vzc2lvbj1zZXNzO1xyXG4gICAgICAgICAgdGhpcy5hci5zZXNzaW9uPXNlc3M7XHJcbiAgICAgICAgICBpZiAoc2Vzcy5wcm9qZWN0KSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlNlc3Npb24gYXNzb2NpYXRlZCBwcm9qZWN0OiBcIitzZXNzLnByb2plY3QpXHJcbiAgICAgICAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdE9ic2VydmFibGUoc2Vzcy5wcm9qZWN0KS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgIG5leHQ6KHByb2plY3QpPT57XHJcbiAgICAgICAgICAgICAgdGhpcy5hci5wcm9qZWN0PXByb2plY3Q7XHJcbiAgICAgICAgICAgICAgdGhpcy5hci5mZXRjaFJlY29yZGluZ3Moc2Vzcyk7XHJcbiAgICAgICAgICAgIH0sZXJyb3I6KHJlYXNvbikgPT57XHJcbiAgICAgICAgICAgICAgdGhpcy5hci5zdGF0dXNNc2c9cmVhc29uO1xyXG4gICAgICAgICAgICAgIHRoaXMuYXIuc3RhdHVzQWxlcnRUeXBlPSdlcnJvcic7XHJcbiAgICAgICAgICAgICAgdGhpcy5hci5zdGF0dXNXYWl0aW5nPWZhbHNlO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBwcm9qZWN0IGNvbmZpZzogXCIrcmVhc29uKVxyXG4gICAgICAgICAgICB9fSk7XHJcblxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiU2Vzc2lvbiBoYXMgbm8gYXNzb2NpYXRlZCBwcm9qZWN0LiBVc2luZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uXCIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjoocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmFyLnN0YXR1c01zZyA9IHJlYXNvbjtcclxuICAgICAgICAgIHRoaXMuYXIuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgICAgIHRoaXMuYXIuc3RhdHVzV2FpdGluZz1mYWxzZTtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBzZXNzaW9uIFwiICsgcmVhc29uKVxyXG4gICAgICAgIH19KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwbG9hZFVwZGF0ZSh1ZTogVXBsb2FkZXJTdGF0dXNDaGFuZ2VFdmVudCkge1xyXG4gICAgbGV0IHVwU3RhdHVzID0gdWUuc3RhdHVzO1xyXG4gICAgdGhpcy5kYXRhU2F2ZWQgPSAoVXBsb2FkZXJTdGF0dXMuRE9ORSA9PT0gdXBTdGF0dXMpO1xyXG4gICAgbGV0IHBlcmNlbnRVcGwgPSB1ZS5wZXJjZW50RG9uZSgpO1xyXG4gICAgaWYgKFVwbG9hZGVyU3RhdHVzLkVSUiA9PT0gdXBTdGF0dXMpIHtcclxuICAgICAgdGhpcy5hci51cGxvYWRTdGF0dXMgPSAnd2FybidcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChwZXJjZW50VXBsIDwgNTApIHtcclxuICAgICAgICB0aGlzLmFyLnVwbG9hZFN0YXR1cyA9ICdhY2NlbnQnXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hci51cGxvYWRTdGF0dXMgPSAnc3VjY2VzcydcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmFyLnVwbG9hZFByb2dyZXNzID0gcGVyY2VudFVwbDtcclxuICAgIH1cclxuICAgIHRoaXMuYXIudXBkYXRlV2FrZUxvY2sodGhpcy5kYXRhU2F2ZWQpO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKClcclxuICB9XHJcblxyXG5cclxuICByZWFkeSgpOmJvb2xlYW57XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhU2F2ZWQgJiYgIXRoaXMuYXIuaXNBY3RpdmUoKVxyXG4gIH1cclxuXHJcbn1cclxuIl19
|
|
1233
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9yZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9zcGVlY2hyZWNvcmRlci9zZXNzaW9uL2F1ZGlvcmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBdUIsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQUMsV0FBVyxFQUFvQixTQUFTLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQTtBQUNwRixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sNEJBQTRCLENBQUE7QUFDcEQsT0FBTyxFQUFDLGFBQWEsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUM5RCxPQUFPLEVBR0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUlMLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHakQsT0FBTyxFQUFDLHFCQUFxQixFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBRTdFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBVyxXQUFXLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFFbEUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRWhELE9BQU8sRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUE2QixZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRyxPQUFPLEVBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxjQUFjLEVBQUMsTUFBTSwwQkFBMEIs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aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFBO2FBQ2pDO1lBQ0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDO1NBQ3JDO1FBQ0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUN4QyxDQUFDO0lBR0QsS0FBSztRQUNILE9BQU8sSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUE7SUFDOUMsQ0FBQzs7b0hBakpVLHNCQUFzQjt3R0FBdEIsc0JBQXNCLGlEQWR0QixDQUFDLGNBQWMsQ0FBQyw4REF3QmhCLGFBQWEscUZBdkJkOztHQUVULHFKQXgrQlUsYUFBYTs0RkFtL0JiLHNCQUFzQjtrQkFoQmxDLFNBQVM7K0JBQ0Usd0JBQXdCLGFBQ3ZCLENBQUMsY0FBYyxDQUFDLFlBQ2pCOztHQUVUOzBQQXFCMkMsRUFBRTtzQkFBN0MsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBdWRpb0NhcHR1cmUsIEF1ZGlvQ2FwdHVyZUxpc3RlbmVyfSBmcm9tICcuLi8uLi9hdWRpby9jYXB0dXJlL2NhcHR1cmUnO1xyXG5pbXBvcnQge0F1ZGlvUGxheWVyLCBBdWRpb1BsYXllckV2ZW50LCBFdmVudFR5cGV9IGZyb20gJy4uLy4uL2F1ZGlvL3BsYXliYWNrL3BsYXllcidcclxuaW1wb3J0IHtXYXZXcml0ZXJ9IGZyb20gJy4uLy4uL2F1ZGlvL2ltcGwvd2F2d3JpdGVyJ1xyXG5pbXBvcnQge1JlY29yZGluZ0ZpbGUsIFJlY29yZGluZ0ZpbGVVdGlsc30gZnJvbSAnLi4vcmVjb3JkaW5nJ1xyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBSZW5kZXJlcjIsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtTZXNzaW9uU2VydmljZX0gZnJvbSBcIi4vc2Vzc2lvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7U3BlZWNoUmVjb3JkZXJVcGxvYWRlcn0gZnJvbSBcIi4uL3NwcnVwbG9hZGVyXCI7XHJcbmltcG9ydCB7U1BFRUNIUkVDT1JERVJfQ09ORklHLCBTcGVlY2hSZWNvcmRlckNvbmZpZ30gZnJvbSBcIi4uLy4uL3Nwci5jb25maWdcIjtcclxuaW1wb3J0IHtTZXNzaW9ufSBmcm9tIFwiLi9zZXNzaW9uXCI7XHJcbmltcG9ydCB7QXVkaW9TdG9yYWdlVHlwZSwgUHJvamVjdCwgUHJvamVjdFV0aWx9IGZyb20gXCIuLi9wcm9qZWN0L3Byb2plY3RcIjtcclxuaW1wb3J0IHtNZXNzYWdlRGlhbG9nfSBmcm9tIFwiLi4vLi4vdWkvbWVzc2FnZV9kaWFsb2dcIjtcclxuaW1wb3J0IHtSZWNvcmRpbmdTZXJ2aWNlfSBmcm9tIFwiLi4vcmVjb3JkaW5ncy9yZWNvcmRpbmdzLnNlcnZpY2VcIjtcclxuXHJcbmltcG9ydCB7QXVkaW9Db250ZXh0UHJvdmlkZXJ9IGZyb20gXCIuLi8uLi9hdWRpby9jb250ZXh0XCI7XHJcbmltcG9ydCB7QXVkaW9DbGlwfSBmcm9tIFwiLi4vLi4vYXVkaW8vcGVyc2lzdG9yXCI7XHJcblxyXG5pbXBvcnQge1VwbG9hZCwgVXBsb2FkZXJTdGF0dXMsIFVwbG9hZGVyU3RhdHVzQ2hhbmdlRXZlbnQsIFVwbG9hZEhvbGRlcn0gZnJvbSBcIi4uLy4uL25ldC91cGxvYWRlclwiO1xyXG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlLCBQYXJhbXMsIFJvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge1Byb2plY3RTZXJ2aWNlfSBmcm9tIFwiLi4vcHJvamVjdC9wcm9qZWN0LnNlcnZpY2VcIjtcclxuaW1wb3J0IHtMZXZlbEJhciwgU3RhdGUgYXMgTGl2ZUxldmVsU3RhdGV9IGZyb20gXCIuLi8uLi9hdWRpby91aS9saXZlbGV2ZWxcIjtcclxuaW1wb3J0IHtSZWNvcmRlckNvbWJpUGFuZX0gZnJvbSBcIi4vcmVjb3JkZXJfY29tYmlfcGFuZVwiO1xyXG5pbXBvcnQge0Jhc2ljUmVjb3JkZXIsIENodW5rQXVkaW9CdWZmZXJSZWNlaXZlciwgTUFYX1JFQ09SRElOR19USU1FX01TLCBSRUNGSUxFX0FQSV9DVFh9IGZyb20gXCIuL2Jhc2ljcmVjb3JkZXJcIjtcclxuaW1wb3J0IHtSZWFkeVN0YXRlUHJvdmlkZXIsIFJlY29yZGVyQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vcmVjb3JkZXJfY29tcG9uZW50XCI7XHJcbmltcG9ydCB7TW9kZX0gZnJvbSBcIi4uLy4uL3NwZWVjaHJlY29yZGVybmcuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7QXVkaW9CdWZmZXJTb3VyY2UsIEF1ZGlvRGF0YUhvbGRlciwgQXVkaW9Tb3VyY2V9IGZyb20gXCIuLi8uLi9hdWRpby9hdWRpb19kYXRhX2hvbGRlclwiO1xyXG5pbXBvcnQge0FycmF5QXVkaW9CdWZmZXJ9IGZyb20gXCIuLi8uLi9hdWRpby9hcnJheV9hdWRpb19idWZmZXJcIjtcclxuaW1wb3J0IHtOZXRBdWRpb0J1ZmZlcn0gZnJvbSBcIi4uLy4uL2F1ZGlvL25ldF9hdWRpb19idWZmZXJcIjtcclxuaW1wb3J0IHtJbmRleGVkRGJBdWRpb0J1ZmZlcn0gZnJvbSBcIi4uLy4uL2F1ZGlvL2luZGRiX2F1ZGlvX2J1ZmZlclwiO1xyXG5pbXBvcnQge0JyZWFrcG9pbnRPYnNlcnZlcn0gZnJvbSBcIkBhbmd1bGFyL2Nkay9sYXlvdXRcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBlbnVtIFN0YXR1cyB7XHJcbiAgQkxPQ0tFRCwgSURMRSxTVEFSVElORywgUkVDT1JESU5HLCAgU1RPUFBJTkdfU1RPUCwgRVJST1JcclxufVxyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWF1ZGlvcmVjb3JkZXInLFxyXG4gIHByb3ZpZGVyczogW1Nlc3Npb25TZXJ2aWNlXSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGFwcC13YXJuaW5nYmFyIFtzaG93XT1cImlzVGVzdFNlc3Npb24oKVwiIHdhcm5pbmdUZXh0PVwiVGVzdCByZWNvcmRpbmcgb25seSFcIj48L2FwcC13YXJuaW5nYmFyPlxyXG4gICAgPGFwcC13YXJuaW5nYmFyIFtzaG93XT1cImlzRGVmYXVsdEF1ZGlvVGVzdFNlc3Npb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgd2FybmluZ1RleHQ9XCJUaGlzIHRlc3QgdXNlcyBkZWZhdWx0IGF1ZGlvIGRldmljZSEgUmVndWxhciBzZXNzaW9ucyBtYXkgcmVxdWlyZSBhIHBhcnRpY3VsYXIgYXVkaW8gZGV2aWNlIChtaWNyb3Bob25lKSFcIj48L2FwcC13YXJuaW5nYmFyPlxyXG4gICAgPGFwcC1yZWNvcmRlcmNvbWJpcGFuZSAoc2VsZWN0ZWRSZWNvcmRpbmdGaWxlQ2hhbmdlZCk9XCJzZWxlY3RSZWNvcmRpbmdGaWxlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbYXVkaW9TaWduYWxDb2xsYXBzZWRdPVwiYXVkaW9TaWduYWxDb2xsYXBzZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRSZWNvcmRpbmdGaWxlXT1cImRpc3BsYXlSZWNGaWxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdERpc2FibGVkXT1cImlzQWN0aXZlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheUF1ZGlvQ2xpcF09XCJkaXNwbGF5QXVkaW9DbGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdGFydEFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXI/LnN0YXJ0QWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdG9wQWN0aW9uXT1cImNvbnRyb2xBdWRpb1BsYXllcj8uc3RvcEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U2VsZWN0aW9uQWN0aW9uXT1cImNvbnRyb2xBdWRpb1BsYXllcj8uc3RhcnRTZWxlY3Rpb25BY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXI/LmF1dG9QbGF5T25TZWxlY3RUb2dnbGVBY3Rpb25cIlxyXG4gICAgPjwvYXBwLXJlY29yZGVyY29tYmlwYW5lPlxyXG5cclxuICAgIDxkaXYgW2NsYXNzXT1cInthdWRpb1N0YXR1c0Rpc3BsYXk6IXNjcmVlblhzLGF1ZGlvU3RhdHVzRGlzcGxheVhzOnNjcmVlblhzfVwiPlxyXG4gICAgICA8YXVkaW8tbGV2ZWxiYXIgc3R5bGU9XCJmbGV4OjEgMCAxJVwiIFtzdHJlYW1pbmdNb2RlXT1cImlzUmVjb3JkaW5nKCkgfHwga2VlcExpdmVMZXZlbFwiIFtzdGF0ZV09XCJsaXZlTGV2ZWxEaXNwbGF5U3RhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlMZXZlbEluZm9zXT1cImRpc3BsYXlBdWRpb0NsaXA/LmxldmVsSW5mb3NcIj48L2F1ZGlvLWxldmVsYmFyPlxyXG4gICAgICA8ZGl2IHN0eWxlPVwiZmxleC1kaXJlY3Rpb246IHJvd1wiPlxyXG4gICAgICAgIDxzcHItcmVjb3JkaW5naXRlbWNvbnRyb2xzIHN0eWxlPVwiZmxleDoxMCAwIDElXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZUF1ZGlvRGV0YWlsc109XCJkaXNhYmxlQXVkaW9EZXRhaWxzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXVkaW9Mb2FkZWRdPVwiYXVkaW9Mb2FkZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RhcnRBY3Rpb25dPVwiY29udHJvbEF1ZGlvUGxheWVyPy5zdGFydEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdG9wQWN0aW9uXT1cImNvbnRyb2xBdWRpb1BsYXllcj8uc3RvcEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BlYWtEYkx2bF09XCJwZWFrTGV2ZWxJbkRiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWdjXT1cInRoaXMuYWM/LmFnY1N0YXR1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2hvd1JlY29yZGluZ0RldGFpbHMpPVwiYXVkaW9TaWduYWxDb2xsYXBzZWQ9IWF1ZGlvU2lnbmFsQ29sbGFwc2VkXCI+XHJcbiAgICAgICAgPC9zcHItcmVjb3JkaW5naXRlbWNvbnRyb2xzPlxyXG5cclxuICAgICAgICA8YXBwLXVwbG9hZHN0YXR1cyAqbmdJZj1cInNjcmVlblhzICYmIGVuYWJsZVVwbG9hZFJlY29yZGluZ3NcIiBjbGFzcz1cInJpY29udHJvbHMgZGFya1wiIHN0eWxlPVwiZmxleDowIDAgMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInVwbG9hZFByb2dyZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RhdHVzXT1cInVwbG9hZFN0YXR1c1wiIFthd2FpdE5ld1VwbG9hZF09XCJwcm9jZXNzaW5nUmVjb3JkaW5nXCI+PC9hcHAtdXBsb2Fkc3RhdHVzPlxyXG4gICAgICAgIDxhcHAtd2FrZWxvY2tpbmRpY2F0b3IgKm5nSWY9XCJzY3JlZW5Yc1wiIGNsYXNzPVwicmljb250cm9scyBkYXJrXCIgc3R5bGU9XCJmbGV4OjAgMCAwXCIgW3NjcmVlbkxvY2tlZF09XCJzY3JlZW5Mb2NrZWRcIj48L2FwcC13YWtlbG9ja2luZGljYXRvcj5cclxuICAgICAgICA8YXBwLXJlYWR5c3RhdGVpbmRpY2F0b3IgKm5nSWY9XCJzY3JlZW5Yc1wiIGNsYXNzPVwicmljb250cm9scyBkYXJrXCIgc3R5bGU9XCJmbGV4OjAgMCAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWR5XT1cImRhdGFTYXZlZCAmJiAhaXNBY3RpdmUoKVwiPjwvYXBwLXJlYWR5c3RhdGVpbmRpY2F0b3I+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICNjb250cm9scGFuZWwgY2xhc3M9XCJjb250cm9scGFuZWxcIj5cclxuICAgICAgPGFwcC1zcHJzdGF0dXNkaXNwbGF5ICpuZ0lmPVwiIXNjcmVlblhzXCIgc3R5bGU9XCJmbGV4OjAuMzMzIDEgMzAlXCIgW3N0YXR1c01zZ109XCJzdGF0dXNNc2dcIiBbc3RhdHVzQWxlcnRUeXBlXT1cInN0YXR1c0FsZXJ0VHlwZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RhdHVzV2FpdGluZ109XCJzdGF0dXNXYWl0aW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaGlkZGVuLXhzXCI+PC9hcHAtc3Byc3RhdHVzZGlzcGxheT5cclxuICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MSAwIDEwMCVcIiBjbGFzcz1cInN0YXJ0c3RvcFwiPlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJhbGlnbi1jb250ZW50OiBjZW50ZXJcIj5cclxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInN0YXJ0U3RvcFBlcmZvcm0oKVwiIFtkaXNhYmxlZF09XCJzdGFydERpc2FibGVkKCkgJiYgc3RvcERpc2FibGVkKClcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjbGFzcz1cImJpZ2J1dHRvblwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gW3N0eWxlLmNvbG9yXT1cInN0YXJ0U3RvcE5leHRJY29uQ29sb3IoKVwiIGlubGluZT1cInRydWVcIj57e3N0YXJ0U3RvcE5leHRJY29uTmFtZSgpfX08L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiBib2xkZXI7Zm9udC1zaXplOiAxNHB4XCI+e3tzdGFydFN0b3BOZXh0TmFtZSgpfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjAuMzMzIDEgMzAlXCIgPlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjEgMSBhdXRvXCI+PC9kaXY+XHJcblxyXG4gICAgICAgIDxhcHAtdXBsb2Fkc3RhdHVzICpuZ0lmPVwiIXNjcmVlblhzICYmIGVuYWJsZVVwbG9hZFJlY29yZGluZ3NcIiBjbGFzcz1cInJpY29udHJvbHNcIiBzdHlsZT1cImZsZXg6MCAwIDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ1cGxvYWRQcm9ncmVzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0YXR1c109XCJ1cGxvYWRTdGF0dXNcIiBbYXdhaXROZXdVcGxvYWRdPVwicHJvY2Vzc2luZ1JlY29yZGluZ1wiPjwvYXBwLXVwbG9hZHN0YXR1cz5cclxuICAgICAgICA8YXBwLXdha2Vsb2NraW5kaWNhdG9yICAqbmdJZj1cIiFzY3JlZW5Yc1wiIGNsYXNzPVwicmljb250cm9sc1wiIFtzY3JlZW5Mb2NrZWRdPVwic2NyZWVuTG9ja2VkXCI+PC9hcHAtd2FrZWxvY2tpbmRpY2F0b3I+XHJcbiAgICAgICAgPGFwcC1yZWFkeXN0YXRlaW5kaWNhdG9yICAqbmdJZj1cIiFzY3JlZW5Yc1wiIGNsYXNzPVwicmljb250cm9sc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkeV09XCJkYXRhU2F2ZWQgJiYgIWlzQWN0aXZlKClcIj48L2FwcC1yZWFkeXN0YXRlaW5kaWNhdG9yPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IHtcclxuICAgIGZsZXg6IDI7XHJcbiAgICBiYWNrZ3JvdW5kOiBsaWdodGdyZXk7XHJcbiAgICBkaXNwbGF5OiBmbGV4OyAvKiBWZXJ0aWNhbCBmbGV4IGNvbnRhaW5lcjogQm90dG9tIHRyYW5zcG9ydCBwYW5lbCwgYWJvdmUgcHJvbXB0aW5nIHBhbmVsICovXHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIG1pbi1oZWlnaHQ6IDBweDtcclxuICAgICAgLyogUHJldmVudHMgaG9yaXpvbnRhbCBzY3JvbGwgYmFyIG9uIHN3aXBlIHJpZ2h0ICovXHJcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfWAsYC5yaWNvbnRyb2xzIHtcclxuICAgICAgICBwYWRkaW5nOiA0cHg7XHJcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICB9YCxgLmRhcmsge1xyXG4gICAgYmFja2dyb3VuZDogZGFya2dyYXk7XHJcbiAgfWAsYC5jb250cm9scGFuZWwge1xyXG4gICAgZGlzcGxheTpmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAyMHB4O1xyXG4gICAgbWluLWhlaWdodDogbWluLWNvbnRlbnQ7IC8qIGltcG9ydGFudCAqL1xyXG4gIH1gLGAuc3RhcnRzdG9wIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgYWxpZ24tY29udGVudDogY2VudGVyO1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICB9YCxgLmJpZ2J1dHRvbiB7XHJcbiAgICBtaW4td2lkdGg6IDcwcHg7XHJcbiAgICBtaW4taGVpZ2h0OiA1MHB4O1xyXG4gICAgZm9udC1zaXplOiA1MHB4O1xyXG4gICAgYm9yZGVyLXJhZGl1czogMjBweDtcclxuICB9YCxgLmF1ZGlvU3RhdHVzRGlzcGxheXtcclxuICAgIGRpc3BsYXk6ZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAgICBoZWlnaHQ6MTAwcHg7XHJcbiAgICBtaW4taGVpZ2h0OiAxMDBweDtcclxuICB9YCxgLmF1ZGlvU3RhdHVzRGlzcGxheVhze1xyXG4gICAgZGlzcGxheTpmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIGhlaWdodDoxMjVweDtcclxuICAgIG1pbi1oZWlnaHQ6IDEyNXB4O1xyXG4gIH1gXHJcbiAgIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEF1ZGlvUmVjb3JkZXIgZXh0ZW5kcyBCYXNpY1JlY29yZGVyIGltcGxlbWVudHMgT25Jbml0LEFmdGVyVmlld0luaXQsT25EZXN0cm95LCBBdWRpb0NhcHR1cmVMaXN0ZW5lcixSZWFkeVN0YXRlUHJvdmlkZXIsQ2h1bmtBdWRpb0J1ZmZlclJlY2VpdmVyIHtcclxuXHJcbiAgX3Byb2plY3Q6UHJvamVjdHx1bmRlZmluZWR8IG51bGw9bnVsbDtcclxuICBASW5wdXQoKSBwcm9qZWN0TmFtZTpzdHJpbmd8dW5kZWZpbmVkfG51bGw9bnVsbDtcclxuICBlbmFibGVVcGxvYWRSZWNvcmRpbmdzOiBib29sZWFuID0gdHJ1ZTtcclxuICBlbmFibGVEb3dubG9hZFJlY29yZGluZ3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzdGF0dXM6IFN0YXR1cyA9IFN0YXR1cy5CTE9DS0VEO1xyXG5cclxuICBAVmlld0NoaWxkKFJlY29yZGVyQ29tYmlQYW5lLCB7IHN0YXRpYzogdHJ1ZSB9KSByZWNvcmRlckNvbWJpUGFuZSE6IFJlY29yZGVyQ29tYmlQYW5lO1xyXG4gIEBWaWV3Q2hpbGQoTGV2ZWxCYXIsIHsgc3RhdGljOiB0cnVlIH0pIGxpdmVMZXZlbERpc3BsYXkhOiBMZXZlbEJhcjtcclxuXHJcbiAgQElucHV0KCkgZGF0YVNhdmVkPXRydWVcclxuXHJcblxyXG5cclxuXHJcbiAgc3RhcnRTdG9wTmV4dEJ1dHRvbk5hbWUhOnN0cmluZztcclxuICBzdGFydFN0b3BOZXh0QnV0dG9uSWNvbk5hbWUhOnN0cmluZztcclxuXHJcbiAgYXVkaW86IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBfZGlzcGxheVJlY0ZpbGU6IFJlY29yZGluZ0ZpbGUgfCBudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBkaXNwbGF5UmVjRmlsZVZlcnNpb246IG51bWJlcj0wO1xyXG5cclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGJwbzpCcmVha3BvaW50T2JzZXJ2ZXIsY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgICAgICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICAgICAgICBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgICAgICAgICAgICBzZXNzaW9uU2VydmljZTpTZXNzaW9uU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIHJlY0ZpbGVTZXJ2aWNlOlJlY29yZGluZ1NlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHVwbG9hZGVyOiBTcGVlY2hSZWNvcmRlclVwbG9hZGVyLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoU1BFRUNIUkVDT1JERVJfQ09ORklHKSBjb25maWc/OiBTcGVlY2hSZWNvcmRlckNvbmZpZykge1xyXG4gICAgc3VwZXIoYnBvLGNoYW5nZURldGVjdG9yUmVmLGRpYWxvZyxzZXNzaW9uU2VydmljZSx1cGxvYWRlcixjb25maWcpO1xyXG5cclxuICAgIC8vc3VwZXIoaW5qZWN0b3IpO1xyXG4gICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuSURMRTtcclxuXHJcbiAgICB0aGlzLmF1ZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGlvJyk7XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmVuYWJsZVVwbG9hZFJlY29yZGluZ3MgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmVuYWJsZVVwbG9hZFJlY29yZGluZ3MgPSB0aGlzLmNvbmZpZy5lbmFibGVVcGxvYWRSZWNvcmRpbmdzO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmVuYWJsZURvd25sb2FkUmVjb3JkaW5ncyAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuZW5hYmxlRG93bmxvYWRSZWNvcmRpbmdzID0gdGhpcy5jb25maWcuZW5hYmxlRG93bmxvYWRSZWNvcmRpbmdzO1xyXG4gICAgfVxyXG4gICAgLy90aGlzLmluaXQoKTtcclxuICB9XHJcblxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcblxyXG4gICAgdGhpcy5zdHJlYW1MZXZlbE1lYXN1cmUubGV2ZWxMaXN0ZW5lciA9IHRoaXMubGl2ZUxldmVsRGlzcGxheTtcclxuICAgIHRoaXMuc3RyZWFtTGV2ZWxNZWFzdXJlLnBlYWtMZXZlbExpc3RlbmVyPShwZWFrTHZsSW5EYik9PntcclxuICAgICAgdGhpcy5wZWFrTGV2ZWxJbkRiPXBlYWtMdmxJbkRiO1xyXG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICAgIC8vbGV0IHdha2VMb2NrU3VwcD0oJ3dha2VMb2NrJyBpbiBuYXZpZ2F0b3IpO1xyXG4gICAgLy9hbGVydCgnV2FrZSBsb2NrIEFQSSBzdXBwb3J0ZWQ6ICcrd2FrZUxvY2tTdXBwKTtcclxuICB9XHJcblxyXG4gIHJlYWR5KCk6Ym9vbGVhbntcclxuICAgIHJldHVybiB0aGlzLmRhdGFTYXZlZCAmJiAhdGhpcy5pc0FjdGl2ZSgpXHJcbiAgfVxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgIHRoaXMuZGlzYWJsZVdha2VMb2NrQ29uZCgpO1xyXG4gICAgICAgdGhpcy5kZXN0cm95ZWQ9dHJ1ZTtcclxuICAgICAgIC8vIFRPRE8gc3RvcCBjYXB0dXJlIC9wbGF5YmFja1xyXG4gICAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgIC8vdGhpcy5hdWRpb0xvYWRlZD1mYWxzZTtcclxuXHJcbiAgICBsZXQgY29udGV4dDpBdWRpb0NvbnRleHR8bnVsbD1udWxsO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29udGV4dCA9IEF1ZGlvQ29udGV4dFByb3ZpZGVyLmF1ZGlvQ29udGV4dEluc3RhbmNlKClcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5FUlJPUjtcclxuICAgICAgbGV0IGVyck1zZyA9ICdVbmtub3duIGVycm9yJztcclxuICAgICAgaWYoZXJyIGluc3RhbmNlb2YgRXJyb3Ipe1xyXG4gICAgICAgIGVyck1zZz1lcnIubWVzc2FnZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnN0YXR1c01zZyA9ICdFUlJPUjogJyArIGVyck1zZztcclxuICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICB0aGlzLmRpYWxvZy5vcGVuKE1lc3NhZ2VEaWFsb2csIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICB0eXBlOiAnZXJyb3InLFxyXG4gICAgICAgICAgdGl0bGU6ICdFcnJvcicsXHJcbiAgICAgICAgICBtc2c6IGVyck1zZyxcclxuICAgICAgICAgIGFkdmlzZTogJ1BsZWFzZSB1c2UgYSBzdXBwb3J0ZWQgYnJvd3Nlci4nLFxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmKGNvbnRleHQpIHtcclxuICAgICAgY29uc29sZS5pbmZvKFwiU3RhdGUgb2YgYXVkaW8gY29udGV4dDogXCIgKyBjb250ZXh0LnN0YXRlKVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIk5vIGF1ZGlvIGNvbnRleHQgYXZhaWxhYmxlIVwiKTtcclxuICAgIH1cclxuICAgIGlmICghY29udGV4dCB8fCAhbmF2aWdhdG9yLm1lZGlhRGV2aWNlcykge1xyXG4gICAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5FUlJPUjtcclxuICAgICAgbGV0IGVyck1zZyA9ICdCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgTWVkaWEgc3RyZWFtcyEnO1xyXG4gICAgICB0aGlzLnN0YXR1c01zZyA9ICdFUlJPUjogJyArIGVyck1zZztcclxuICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICB0aGlzLmRpYWxvZy5vcGVuKE1lc3NhZ2VEaWFsb2csIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICB0eXBlOiAnZXJyb3InLFxyXG4gICAgICAgICAgdGl0bGU6ICdFcnJvcicsXHJcbiAgICAgICAgICBtc2c6IGVyck1zZyxcclxuICAgICAgICAgIGFkdmlzZTogJ1BsZWFzZSB1c2UgYSBzdXBwb3J0ZWQgYnJvd3Nlci4nLFxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIgPSBuZXcgQXVkaW9QbGF5ZXIoY29udGV4dCwgdGhpcyk7XHJcbiAgICAgIHRoaXMuYWMgPSBuZXcgQXVkaW9DYXB0dXJlKGNvbnRleHQpO1xyXG4gICAgICBpZiAodGhpcy5hYykge1xyXG4gICAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMuc3RhcnRJdGVtKCk7XHJcbiAgICAgICAgdGhpcy5hYy5saXN0ZW5lciA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5jb25maWd1cmVTdHJlYW1DYXB0dXJlU3RyZWFtKCk7XHJcblxyXG4gICAgICAgIC8vIERvbid0IGxpc3QgdGhlIGRldmljZXMgaGVyZS4gSWYgd2UgZG8gbm90IGhhdmUgYXVkaW8gcGVybWlzc2lvbnMgd2Ugb25seSBnZXQgYW5vbnltaXplZCBkZXZpY2VzIHdpdGhvdXQgbGFiZWxzLlxyXG4gICAgICAgIC8vdGhpcy5hYy5saXN0RGV2aWNlcygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgbGV0IGVyck1zZyA9ICdCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgTWVkaWEvQXVkaW8gQVBJISc7XHJcbiAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnRVJST1I6ICcgKyBlcnJNc2c7XHJcbiAgICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTWVzc2FnZURpYWxvZywge1xyXG4gICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxyXG4gICAgICAgICAgICB0aXRsZTogJ0Vycm9yJyxcclxuICAgICAgICAgICAgbXNnOiBlcnJNc2csXHJcbiAgICAgICAgICAgIGFkdmlzZTogJ1BsZWFzZSB1c2UgYSBzdXBwb3J0ZWQgYnJvd3Nlci4nLFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMuc3RvcEl0ZW0oKTtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLnN0b3BJdGVtKCk7XHJcbiAgICAgIC8vdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5wYXVzZUl0ZW0oKTtcclxuXHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5jb250cm9sQXVkaW9QbGF5ZXI/LnN0YXJ0KCk7XHJcblxyXG4gICAgfVxyXG4gICAgdGhpcy51cGxvYWRlci5saXN0ZW5lciA9ICh1ZSkgPT4ge1xyXG4gICAgICB0aGlzLnVwbG9hZFVwZGF0ZSh1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5cHJlc3MnLCBbJyRldmVudCddKVxyXG4gIG9uS2V5UHJlc3Moa2U6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmIChrZS5rZXkgPT0gJyAnKSB7XHJcbiAgICAgIC8vdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLnBlcmZvcm0oKTtcclxuICAgICAgLy90aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgb25LZXlEb3duKGtlOiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoa2Uua2V5ID09ICcgJykge1xyXG4gICAgICBpZighdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLmRpc2FibGVkKXtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgICB9ZWxzZSBpZighdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24uZGlzYWJsZWQpIHtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChrZS5rZXkgPT0gJ3AnKSB7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoa2Uua2V5ID09ICdFc2NhcGUnKSB7XHJcbiAgICAgIGlmICghdGhpcy5hdWRpb1NpZ25hbENvbGxhcHNlZCkge1xyXG4gICAgICAgIHRoaXMuYXVkaW9TaWduYWxDb2xsYXBzZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoa2Uua2V5ID09ICdNZWRpYVBsYXlQYXVzZScpIHtcclxuICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGtlLmtleSA9PT0gJ0Fycm93UmlnaHQnKSB7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGtlLmtleSA9PT0gJ0Fycm93TGVmdCcpIHtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc1Rlc3RTZXNzaW9uKCk6Ym9vbGVhbiB7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9zZXNzaW9uIT1udWxsKSAmJiAodGhpcy5fc2Vzc2lvbi50eXBlID09PSAnVEVTVCcgfHwgdGhpcy5fc2Vzc2lvbi50eXBlPT09J1RFU1RfREVGX0EnIHx8IHRoaXMuX3Nlc3Npb24udHlwZSA9PT0gJ1NJTlVTX1RFU1QnKSk7XHJcbiAgfVxyXG5cclxuICBpc0RlZmF1bHRBdWRpb1Rlc3RTZXNzaW9uKCk6Ym9vbGVhbiB7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9zZXNzaW9uIT1udWxsKSAmJiAodGhpcy5fc2Vzc2lvbi50eXBlPT09J1RFU1RfREVGX0EnKSk7XHJcbiAgfVxyXG5cclxuICBpc0RlZmF1bHRBdWRpb1Rlc3RTZXNzaW9uT3ZlcndyaXRlaW5nUHJvamVjdFJlcXVpcmVtZW50cygpOmJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICgodGhpcy5fc2Vzc2lvbiE9bnVsbCkgJiYgKHRoaXMuX3Nlc3Npb24udHlwZT09PSdURVNUX0RFRl9BJykgJiYgKHRoaXMuYXVkaW9EZXZpY2VzIT1udWxsKSAmJiB0aGlzLmF1ZGlvRGV2aWNlcy5sZW5ndGg+MClcclxuICB9XHJcblxyXG5cclxuXHJcbiAgZmV0Y2hSZWNvcmRpbmdzKHNlc3M6U2Vzc2lvbil7XHJcbiAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZT0naW5mbyc7XHJcbiAgICB0aGlzLnN0YXR1c01zZyA9ICdGZXRjaGluZyBpbmZvcyBvZiByZWNvcmRpbmdzLi4uJztcclxuICAgIHRoaXMuc3RhdHVzV2FpdGluZz10cnVlO1xyXG4gICAgLy9sZXQgcHJObTpzdHJpbmd8bnVsbD1udWxsO1xyXG4gICAgaWYodGhpcy5wcm9qZWN0KSB7XHJcbiAgICAgIGxldCByZnNPYnMgPSB0aGlzLnJlY0ZpbGVTZXJ2aWNlLnJlY29yZGluZ0ZpbGVMaXN0KHRoaXMucHJvamVjdC5uYW1lLCBzZXNzLnNlc3Npb25JZCk7XHJcbiAgICAgIHJmc09icy5zdWJzY3JpYmUoe25leHQ6KHJmczogQXJyYXk8UmVjb3JkaW5nRmlsZT4pID0+IHtcclxuICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgICAgICB0aGlzLnN0YXR1c01zZyA9ICdSZWNlaXZlZCBpbmZvcyBvZiByZWNvcmRpbmdzLic7XHJcbiAgICAgICAgdGhpcy5zdGF0dXNXYWl0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHJmcykge1xyXG4gICAgICAgICAgaWYgKHJmcyBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgIHJmcy5mb3JFYWNoKChyZikgPT4ge1xyXG4gICAgICAgICAgICAgIC8vIHRoZSBsaXN0IGNvbWVzIGZyb20gdGhlIHNlcnZlciwgYXNzc3VlbSBhbGwgcmVjb3JkaW5nIGZpbGVzIGFzIHNlcnZlciBwZXJzaXN0ZWRcclxuICAgICAgICAgICAgICByZi5zZXJ2ZXJQZXJzaXN0ZWQ9dHJ1ZTtcclxuICAgICAgICAgICAgICBpZihyZi5zdGFydGVkRGF0ZSl7XHJcbiAgICAgICAgICAgICAgICByZi5fc3RhcnRlZEFzRGF0ZU9iaj1uZXcgRGF0ZShyZi5zdGFydGVkRGF0ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmKHJmLmRhdGUpe1xyXG4gICAgICAgICAgICAgICAgcmYuX2RhdGVBc0RhdGVPYmo9bmV3IERhdGUocmYuZGF0ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMucmVjb3JkZXJDb21iaVBhbmUuYWRkUmVjRmlsZShyZik7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFeHBlY3RlZCB0eXBlIGFycmF5IGZvciBsaXN0IG9mIGFscmVhZHkgcmVjb3JkZWQgZmlsZXMgJylcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlJlY29yZGluZyBmaWxlIGxpc3Q6IFwiICsgcmZzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIGVycm9yOihlcnIpID0+IHtcclxuICAgICAgICAvLyBGYWlsZWQgZmV0Y2hpbmcgZXhpc3RpbmcsIGJ1dCB3ZSBzdGFydCB0aGUgc2Vzc2lvbiBhbnl3YXlcclxuICAgICAgICB0aGlzLnN0YXJ0KClcclxuICAgICAgfSwgY29tcGxldGU6KCkgPT4ge1xyXG4gICAgICAgIC8vIE5vcm1hbCBzdGFydFxyXG4gICAgICAgIHRoaXMuc3RhcnQoKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIC8vIE5vIHByb2plY3QgZGVmIC0+IGVycm9yXHJcbiAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnTm8gcHJvamVjdCBkZWZpbml0b24uJztcclxuICAgICAgdGhpcy5zdGF0dXNXYWl0aW5nID0gZmFsc2U7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5zdGF0dXNNc2cpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHNldCBwcm9qZWN0KHByb2plY3Q6IFByb2plY3R8dW5kZWZpbmVkfG51bGwpIHtcclxuICAgIHRoaXMuX3Byb2plY3QgPSBwcm9qZWN0O1xyXG4gICAgbGV0IGNoQ250ID0gUHJvamVjdFV0aWwuREVGQVVMVF9BVURJT19DSEFOTkVMX0NPVU5UO1xyXG5cclxuICAgIGlmIChwcm9qZWN0KSB7XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlByb2plY3QgbmFtZTogXCIgKyBwcm9qZWN0Lm5hbWUpXHJcbiAgICAgIGlmIChwcm9qZWN0LnJlY29yZGluZ0RldmljZVdha2VMb2NrID09PSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy53YWtlTG9jayA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5hdWRpb0RldmljZXMgPSBwcm9qZWN0LmF1ZGlvRGV2aWNlcztcclxuICAgICAgY2hDbnQgPSBQcm9qZWN0VXRpbC5hdWRpb0NoYW5uZWxDb3VudChwcm9qZWN0KTtcclxuICAgICAgY29uc29sZS5pbmZvKFwiUHJvamVjdCByZXF1ZXN0ZWQgcmVjb3JkaW5nIGNoYW5uZWwgY291bnQ6IFwiICsgY2hDbnQpO1xyXG4gICAgICB0aGlzLmF1dG9HYWluQ29udHJvbENvbmZpZ3MgPSBwcm9qZWN0LmF1dG9HYWluQ29udHJvbENvbmZpZ3M7XHJcbiAgICAgIGlmIChwcm9qZWN0LmNodW5rZWRSZWNvcmRpbmcgPT09IHRydWUpIHtcclxuICAgICAgICB0aGlzLnVwbG9hZENodW5rU2l6ZVNlY29uZHMgPSBCYXNpY1JlY29yZGVyLkRFRkFVTFRfQ0hVTktfU0laRV9TRUNPTkRTO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudXBsb2FkQ2h1bmtTaXplU2Vjb25kcyA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHByb2plY3QuY2xpZW50QXVkaW9TdG9yYWdlVHlwZSkge1xyXG4gICAgICAgIHRoaXMuY2xpZW50QXVkaW9TdG9yYWdlVHlwZSA9IHByb2plY3QuY2xpZW50QXVkaW9TdG9yYWdlVHlwZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIkVtcHR5IHByb2plY3QgY29uZmlndXJhdGlvbiFcIilcclxuICAgIH1cclxuICAgIHRoaXMuY2hhbm5lbENvdW50ID0gY2hDbnQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0IHByb2plY3QoKTpQcm9qZWN0fHVuZGVmaW5lZHxudWxse1xyXG4gICAgcmV0dXJuIHRoaXMuX3Byb2plY3Q7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RSZWNvcmRpbmdGaWxlKHJmOlJlY29yZGluZ0ZpbGUpe1xyXG4gICAgdGhpcy5saXZlTGV2ZWxEaXNwbGF5U3RhdGU9TGl2ZUxldmVsU3RhdGUuUkVBRFk7XHJcbiAgICB0aGlzLmtlZXBMaXZlTGV2ZWw9ZmFsc2U7XHJcbiAgICB0aGlzLmRpc3BsYXlSZWNGaWxlPXJmO1xyXG4gIH1cclxuXHJcbiAgdXBsb2FkVXBkYXRlKHVlOiBVcGxvYWRlclN0YXR1c0NoYW5nZUV2ZW50KSB7XHJcbiAgICBsZXQgdXBTdGF0dXMgPSB1ZS5zdGF0dXM7XHJcbiAgICB0aGlzLmRhdGFTYXZlZCA9IChVcGxvYWRlclN0YXR1cy5ET05FID09PSB1cFN0YXR1cyk7XHJcbiAgICBsZXQgcGVyY2VudFVwbCA9IHVlLnBlcmNlbnREb25lKCk7XHJcbiAgICBpZiAoVXBsb2FkZXJTdGF0dXMuRVJSID09PSB1cFN0YXR1cykge1xyXG4gICAgICB0aGlzLnVwbG9hZFN0YXR1cyA9ICd3YXJuJ1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHBlcmNlbnRVcGwgPCA1MCkge1xyXG4gICAgICAgIHRoaXMudXBsb2FkU3RhdHVzID0gJ2FjY2VudCdcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnVwbG9hZFN0YXR1cyA9ICdzdWNjZXNzJ1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudXBsb2FkUHJvZ3Jlc3MgPSBwZXJjZW50VXBsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgfVxyXG5cclxuICBzZXQgY29udHJvbEF1ZGlvUGxheWVyKGNvbnRyb2xBdWRpb1BsYXllcjogQXVkaW9QbGF5ZXJ8bnVsbCkge1xyXG4gICAgdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyPWNvbnRyb2xBdWRpb1BsYXllcjtcclxuICAgIGlmICh0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIpIHtcclxuICAgICAgdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLmxpc3RlbmVyID0gdGhpcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBjb250cm9sQXVkaW9QbGF5ZXIoKTogQXVkaW9QbGF5ZXJ8bnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlKGU6IEF1ZGlvUGxheWVyRXZlbnQpIHtcclxuICAgIGlmIChlLnR5cGUgPT0gRXZlbnRUeXBlLlNUQVJURUQpIHtcclxuICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLnVwZGF0ZVRpbWVySWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICAgIC8vdGhpcy5hdWRpb1NpZ25hbC5wbGF5RnJhbWVQb3NpdGlvbiA9IHRoaXMuYXAucGxheVBvc2l0aW9uRnJhbWVzO1xyXG4gICAgICB9LCA1MCk7XHJcbiAgICB9IGVsc2UgaWYgKGUudHlwZSA9PSBFdmVudFR5cGUuU1RPUFBFRCB8fCBlLnR5cGUgPT0gRXZlbnRUeXBlLkVOREVEKSB7XHJcbiAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMudXBkYXRlVGltZXJJZCk7XHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkVuYWJsZSBwbGF5IHN0YXJ0IGFjdGlvbiAoYnkgcGxheWVyIGV2ZW50cyBzdG9wcGVkIG9yIGVuZGVkKTogXCIrKCEodGhpcy5kaXNwbGF5UmVjRmlsZSkpKTtcclxuICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24uZGlzYWJsZWQgPSAoISh0aGlzLmRpc3BsYXlSZWNGaWxlKSk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhcnREaXNhYmxlZCgpIHtcclxuICAgIHJldHVybiAhdGhpcy50cmFuc3BvcnRBY3Rpb25zIHx8IHRoaXMucmVhZG9ubHkgfHwgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLmRpc2FibGVkXHJcbiAgfVxyXG5cclxuICBzdG9wRGlzYWJsZWQoKSB7XHJcbiAgICByZXR1cm4gIXRoaXMudHJhbnNwb3J0QWN0aW9ucyB8fCB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5kaXNhYmxlZFxyXG4gIH1cclxuXHJcbiAgc3RhcnRTdG9wTmV4dE5hbWUoKTpzdHJpbmd7XHJcbiAgICBpZighdGhpcy5zdGFydERpc2FibGVkKCkpe1xyXG4gICAgICB0aGlzLnN0YXJ0U3RvcE5leHRCdXR0b25OYW1lPVwiU3RhcnRcIlxyXG4gICAgfWVsc2UgaWYoIXRoaXMuc3RvcERpc2FibGVkKCkpIHtcclxuICAgICAgdGhpcy5zdGFydFN0b3BOZXh0QnV0dG9uTmFtZSA9IFwiU3RvcFwiXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5zdGFydFN0b3BOZXh0QnV0dG9uTmFtZTtcclxuICB9XHJcbiAgc3RhcnRTdG9wTmV4dEljb25OYW1lKCk6c3RyaW5ne1xyXG4gICAgaWYoIXRoaXMuc3RhcnREaXNhYmxlZCgpKXtcclxuICAgICAgdGhpcy5zdGFydFN0b3BOZXh0QnV0dG9uSWNvbk5hbWU9XCJmaWJlcl9tYW51YWxfcmVjb3JkXCJcclxuICAgIH1lbHNlIGlmKCF0aGlzLnN0b3BEaXNhYmxlZCgpKXtcclxuICAgICAgdGhpcy5zdGFydFN0b3BOZXh0QnV0dG9uSWNvbk5hbWU9XCJzdG9wXCJcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnN0YXJ0U3RvcE5leHRCdXR0b25JY29uTmFtZVxyXG4gIH1cclxuICBzdGFydFN0b3BOZXh0SWNvbkNvbG9yKCk6c3RyaW5ne1xyXG4gICAgaWYoIXRoaXMuc3RhcnREaXNhYmxlZCgpKXtcclxuICAgICAgcmV0dXJuIFwicmVkXCJcclxuICAgIH1lbHNlIGlmKCF0aGlzLnN0b3BEaXNhYmxlZCgpKXtcclxuICAgICAgcmV0dXJuIFwieWVsbG93XCJcclxuICAgIH1lbHNle1xyXG4gICAgICByZXR1cm4gXCJncmV5XCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGFydFN0b3BQZXJmb3JtKCl7XHJcbiAgICBpZighdGhpcy5zdGFydERpc2FibGVkKCkpe1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfWVsc2UgaWYoIXRoaXMuc3RvcERpc2FibGVkKCkpe1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGFydEl0ZW0oKSB7XHJcbiAgICB0aGlzLnN0YXR1cz1TdGF0dXMuU1RBUlRJTkc7XHJcbiAgICBzdXBlci5zdGFydEl0ZW0oKTtcclxuICAgIGlmICh0aGlzLnJlYWRvbmx5KSB7XHJcbiAgICAgIHRoaXMuc3RhdHVzPVN0YXR1cy5JRExFO1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24uZGlzYWJsZWQgPSB0cnVlXHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkTmV4dEFjdGlvbi5kaXNhYmxlZCA9IHRydWVcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5id2RBY3Rpb24uZGlzYWJsZWQgPSB0cnVlXHJcbiAgICB0aGlzLmRpc3BsYXlSZWNGaWxlID0gbnVsbDtcclxuICAgIHRoaXMuZGlzcGxheVJlY0ZpbGVWZXJzaW9uID0gMDtcclxuICAgIHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCA9IG51bGw7XHJcbiAgICB0aGlzLmxpdmVMZXZlbERpc3BsYXkucmVzZXQodHJ1ZSk7XHJcbiAgICB0aGlzLmxpdmVMZXZlbERpc3BsYXlTdGF0ZT1MaXZlTGV2ZWxTdGF0ZS5SRUFEWTtcclxuICAgIHRoaXMuc2hvd1JlY29yZGluZygpO1xyXG5cclxuICAgIHRoaXMuc3RhcnRDYXB0dXJlKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZG93bmxvYWRSZWNvcmRpbmcoKSB7XHJcbiAgICBpZiAodGhpcy5kaXNwbGF5UmVjRmlsZSkge1xyXG4gICAgICBsZXQgYWI6IEF1ZGlvRGF0YUhvbGRlciB8IG51bGwgPSB0aGlzLmRpc3BsYXlSZWNGaWxlLmF1ZGlvRGF0YUhvbGRlcjtcclxuICAgICAgbGV0IHd3ID0gbmV3IFdhdldyaXRlcigpO1xyXG4gICAgICBsZXQgYXM9YWI/LmF1ZGlvU291cmNlO1xyXG4gICAgICBpZihhcyBpbnN0YW5jZW9mIEF1ZGlvQnVmZmVyU291cmNlKSB7XHJcbiAgICAgICAgICB3dy53cml0ZUFzeW5jKGFzLmF1ZGlvQnVmZmVyLCAod2F2RmlsZSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgYmxvYiA9IG5ldyBCbG9iKFt3YXZGaWxlXSwge3R5cGU6ICdhdWRpby93YXYnfSk7XHJcbiAgICAgICAgICAgIGxldCByZlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcblxyXG4gICAgICAgICAgICBsZXQgZGF0YURubExuayA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgICAgICAvL2RhdGFEbmxMbmsubmFtZSA9ICdSZWNvcmRpbmcnO1xyXG4gICAgICAgICAgICBkYXRhRG5sTG5rLmhyZWYgPSByZlVybDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuYm9keSwgZGF0YURubExuayk7XHJcblxyXG4gICAgICAgICAgICAvLyBkb3dubG9hZCBwcm9wZXJ0eSBub3QgeWV0IGluIFRTIGRlZlxyXG4gICAgICAgICAgICBpZiAodGhpcy5kaXNwbGF5UmVjRmlsZSkge1xyXG4gICAgICAgICAgICAgIGxldCBmbiA9IHRoaXMuZGlzcGxheVJlY0ZpbGUuZmlsZW5hbWVTdHJpbmcoKTtcclxuICAgICAgICAgICAgICBmbiArPSAnXycgKyB0aGlzLmRpc3BsYXlSZWNGaWxlVmVyc2lvbjtcclxuICAgICAgICAgICAgICBmbiArPSAnLndhdic7XHJcbiAgICAgICAgICAgICAgZGF0YURubExuay5kb3dubG9hZCA9IGZuO1xyXG4gICAgICAgICAgICAgIGRhdGFEbmxMbmsuY2xpY2soKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKGRvY3VtZW50LmJvZHksIGRhdGFEbmxMbmspO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldCBkaXNwbGF5UmVjRmlsZShkaXNwbGF5UmVjRmlsZTogUmVjb3JkaW5nRmlsZSB8IG51bGwpIHtcclxuICAgIC8vdGhpcy5hdWRpb0xvYWRlZD1mYWxzZTtcclxuICAgIHRoaXMuX2Rpc3BsYXlSZWNGaWxlID0gZGlzcGxheVJlY0ZpbGU7XHJcbiAgICBpZiAodGhpcy5fZGlzcGxheVJlY0ZpbGUpIHtcclxuICAgICAgbGV0IGFkaDogQXVkaW9EYXRhSG9sZGVyfCBudWxsID0gdGhpcy5fZGlzcGxheVJlY0ZpbGUuYXVkaW9EYXRhSG9sZGVyO1xyXG4gICAgICBpZihhZGgpIHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBuZXcgQXVkaW9DbGlwKGFkaCk7XHJcbiAgICAgICAgLy90aGlzLmF1ZGlvTG9hZGVkPXRydWU7XHJcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiIHNldCByZWNvcmRpbmcgZmlsZTogZGlzcGxheSBhdWRpbyBjbGlwIHNldFwiKTtcclxuICAgICAgICBpZih0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIpIHtcclxuICAgICAgICAgIHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5hdWRpb0NsaXAgPSB0aGlzLmRpc3BsYXlBdWRpb0NsaXA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2hvd1JlY29yZGluZygpO1xyXG4gICAgICB9ZWxzZSB7XHJcbiAgICAgICAgLy8gY2xlYXIgZm9yIG5vdyAuLi5cclxuICAgICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBudWxsO1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcInNldCByZWNvcmRpbmcgZmlsZTogZGlzcGxheSBhdWRpbyBjbGlwIG51bGxcIik7XHJcbiAgICAgICAgaWYodGhpcy5fY29udHJvbEF1ZGlvUGxheWVyKSB7XHJcbiAgICAgICAgICB0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIuYXVkaW9DbGlwID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIgJiYgdGhpcy5fc2Vzc2lvbikge1xyXG4gICAgICAgICAgLy8uLi4gYW5kIHRyeSB0byBmZXRjaCBmcm9tIHNlcnZlclxyXG4gICAgICAgICAgdGhpcy5saXZlTGV2ZWxEaXNwbGF5U3RhdGU9TGl2ZUxldmVsU3RhdGUuTE9BRElORztcclxuICAgICAgICAgIGNvbnN0IHJmPXRoaXMuX2Rpc3BsYXlSZWNGaWxlO1xyXG5cclxuICAgICAgICAgIGxldCBhdWRpb0Rvd25sb2FkVHlwZT10aGlzLl9jbGllbnRBdWRpb1N0b3JhZ2VUeXBlO1xyXG4gICAgICAgICAgaWYoQXVkaW9TdG9yYWdlVHlwZS5NRU1fRU5USVJFX0FVVE9fTkVUX0NIVU5LRUQ9PT10aGlzLl9jbGllbnRBdWRpb1N0b3JhZ2VUeXBlIHx8IEF1ZGlvU3RvcmFnZVR5cGUuTUVNX0NIVU5LRURfQVVUT19ORVRfQ0hVTktFRD09PXRoaXMuX2NsaWVudEF1ZGlvU3RvcmFnZVR5cGUpIHtcclxuICAgICAgICAgICAgLy8gRGVmYXVsdCBpcyBuZXR3b3JrIG1vZGVcclxuICAgICAgICAgICAgYXVkaW9Eb3dubG9hZFR5cGU9QXVkaW9TdG9yYWdlVHlwZS5ORVRfQ0hVTktFRDtcclxuICAgICAgICAgICAgaWYgKHJmLmNoYW5uZWxzICYmIHJmLmZyYW1lcykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHNhbXBsZXMgPSByZi5jaGFubmVscyAqIHJmLmZyYW1lcztcclxuICAgICAgICAgICAgICBpZiAoc2FtcGxlcyA8PSB0aGlzLl9tYXhBdXRvTmV0TWVtU3RvcmVTYW1wbGVzKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBCdXQgaWYgYXVkaW8gZmlsZSBpcyBzbWFsbCwgbG9hZCBpbiBjb250aW51b3VzIHJlc3AuIGNodW5rZWQgbW9kZVxyXG4gICAgICAgICAgICAgICAgaWYoQXVkaW9TdG9yYWdlVHlwZS5NRU1fRU5USVJFX0FVVE9fTkVUX0NIVU5LRUQ9PT10aGlzLl9jbGllbnRBdWRpb1N0b3JhZ2VUeXBlKXtcclxuICAgICAgICAgICAgICAgICAgYXVkaW9Eb3dubG9hZFR5cGU9QXVkaW9TdG9yYWdlVHlwZS5NRU1fRU5USVJFO1xyXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoQXVkaW9TdG9yYWdlVHlwZS5NRU1fQ0hVTktFRF9BVVRPX05FVF9DSFVOS0VEPT09dGhpcy5fY2xpZW50QXVkaW9TdG9yYWdlVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICBhdWRpb0Rvd25sb2FkVHlwZSA9IEF1ZGlvU3RvcmFnZVR5cGUuTUVNX0NIVU5LRUQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYoQXVkaW9TdG9yYWdlVHlwZS5EQl9DSFVOS0VEPT09dGhpcy5fY2xpZW50QXVkaW9TdG9yYWdlVHlwZSl7XHJcbiAgICAgICAgICAgIC8vIEZldGNoIGNodW5rZWQgaW5kZXhlZCBkYiBhdWRpbyBidWZmZXJcclxuICAgICAgICAgICAgbGV0IG5leHRJYWI6IEluZGV4ZWREYkF1ZGlvQnVmZmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmKCF0aGlzLl9wZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0KXtcclxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcignRXJyb3I6IFBlcnNpc3RlbnQgc3RvcmFnZSB0YXJnZXQgbm90IHNldC4nKTtcclxuICAgICAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkZldGNoIGF1ZGlvIGFuZCBzdG9yZSB0byBpbmRleGVkIGRiLi4uXCIpO1xyXG4gICAgICAgICAgICAgIHRoaXMuYXVkaW9GZXRjaFN1YnNjcmlwdGlvbiA9IHRoaXMucmVjRmlsZVNlcnZpY2UuZmV0Y2hSZWNvcmRpbmdGaWxlSW5kRGJBdWRpb0J1ZmZlcih0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIuY29udGV4dCwgdGhpcy5fcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldCwgdGhpcy5fc2Vzc2lvbi5wcm9qZWN0LCByZikuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgIG5leHQ6IChpYWIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU2Vzc2lvbm1hbmFnZXI6IFJlY2VpdmVkIGluZGRiIGF1ZGlvIGJ1ZmZlcjogXCIraWFiKTtcclxuICAgICAgICAgICAgICAgICAgbmV4dElhYiA9IGlhYjtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmxpdmVMZXZlbERpc3BsYXlTdGF0ZSA9IExpdmVMZXZlbFN0YXRlLlJFQURZO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgZmFiRGggPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICBpZiAobmV4dElhYikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZiApIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZhYkRoID0gbmV3IEF1ZGlvRGF0YUhvbGRlcihuZXh0SWFiKTtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcy5hdWRpb0xvYWRlZD10cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvcmRlckNvbWJpUGFuZS5zZXRSZWNGaWxlQXVkaW9EYXRhKHJmLCBmYWJEaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBhY3R1YWxseSBiZSBoYW5kbGVkIGJ5IHRoZSBlcnJvciByZXNvbHZlclxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZyBmaWxlIGNvdWxkIG5vdCBiZSBsb2FkZWQuJ1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJ1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGlmIChmYWJEaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCBjb3VsZCBoYXZlIGJlZW4gY2hhbmdlZCBtZWFud2hpbGUsIGJ1dCB0aGUgcmVjb3JkZXIgdW5zdWJjcmliZXMgYmVmb3JlIGNoYW5naW5nIHRoZSBpdGVtLiBUaGVyZWZvcmUsIHRoZXJlIHNob3VsZCBiZSBubyByaXNrIHRvIHNldCB0byB3cm9uZyBpdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5QXVkaW9DbGlwID0gbmV3IEF1ZGlvQ2xpcChmYWJEaCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgaWYodGhpcy5fY29udHJvbEF1ZGlvUGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLmF1ZGlvQ2xpcCA9IHRoaXMuZGlzcGxheUF1ZGlvQ2xpcFxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1JlY29yZGluZygpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IGxvYWQgcmVjb3JkaW5nIGZpbGUgZnJvbSBzZXJ2ZXI6IFwiICsgZXJyKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5saXZlTGV2ZWxEaXNwbGF5U3RhdGUgPSBMaXZlTGV2ZWxTdGF0ZS5SRUFEWTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGxvYWRlZDogJyArIGVycjtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2UgaWYoQXVkaW9TdG9yYWdlVHlwZS5ORVRfQ0hVTktFRD09PWF1ZGlvRG93bmxvYWRUeXBlKXtcclxuICAgICAgICAgICAgLy8gRmV0Y2ggY2h1bmtlZCBhdWRpbyBidWZmZXIgZnJvbSBuZXR3b3JrXHJcbiAgICAgICAgICAgIGxldCBuZXh0TmV0QWI6IE5ldEF1ZGlvQnVmZmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJGZXRjaCBjaHVua2VkIGF1ZGlvIGZyb20gbmV0d29ya1wiKTtcclxuICAgICAgICAgICAgdGhpcy5hdWRpb0ZldGNoU3Vic2NyaXB0aW9uID0gdGhpcy5yZWNGaWxlU2VydmljZS5mZXRjaFJlY29yZGluZ0ZpbGVOZXRBdWRpb0J1ZmZlcih0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIuY29udGV4dCwgdGhpcy5fc2Vzc2lvbi5wcm9qZWN0LCByZikuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICBuZXh0OiAobmV0QWIpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlNlc3Npb25tYW5hZ2VyOiBSZWNlaXZlZCBuZXQgYXVkaW8gYnVmZmVyOiBcIituZXRBYik7XHJcbiAgICAgICAgICAgICAgICBuZXh0TmV0QWIgPSBuZXRBYjtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpdmVMZXZlbERpc3BsYXlTdGF0ZSA9IExpdmVMZXZlbFN0YXRlLlJFQURZO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZhYkRoID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmIChuZXh0TmV0QWIpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHJmKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmFiRGggPSBuZXcgQXVkaW9EYXRhSG9sZGVyKG5leHROZXRBYik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb3JkZXJDb21iaVBhbmUuc2V0UmVjRmlsZUF1ZGlvRGF0YShyZiwgZmFiRGgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAvLyBTaG91bGQgYWN0dWFsbHkgYmUgaGFuZGxlZCBieSB0aGUgZXJyb3IgcmVzb2x2ZXJcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGxvYWRlZC4nXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGZhYkRoKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCBjb3VsZCBoYXZlIGJlZW4gY2hhbmdlZCBtZWFud2hpbGUsIGJ1dCB0aGUgcmVjb3JkZXIgdW5zdWJjcmliZXMgYmVmb3JlIGNoYW5naW5nIHRoZSBpdGVtLiBUaGVyZWZvcmUsIHRoZXJlIHNob3VsZCBiZSBubyByaXNrIHRvIHNldCB0byB3cm9uZyBpdGVtXHJcbiAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcInNldCBkaXNwbGF5UmVjRmlsZSgpOiBmZXRjaCBuZXQgYWIgY29tcGxldGUsIHNldCBkaXNwbGF5QXVkaW9DbGlwLlwiKVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBuZXcgQXVkaW9DbGlwKGZhYkRoKTtcclxuICAgICAgICAgICAgICAgICAgLy8gZmFiRGgub25SZWFkeT0oKT0+e1xyXG4gICAgICAgICAgICAgICAgICAvLyAgIHRoaXMuYXVkaW9Mb2FkZWQ9dHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5fY29udHJvbEF1ZGlvUGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5hdWRpb0NsaXAgPSB0aGlzLmRpc3BsYXlBdWRpb0NsaXA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dSZWNvcmRpbmcoKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGVycm9yOiBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkNvdWxkIG5vdCBsb2FkIHJlY29yZGluZyBmaWxlIGZyb20gc2VydmVyOiBcIiArIGVycik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpdmVMZXZlbERpc3BsYXlTdGF0ZSA9IExpdmVMZXZlbFN0YXRlLlJFQURZO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGxvYWRlZDogJyArIGVycjtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgfWVsc2UgaWYoQXVkaW9TdG9yYWdlVHlwZS5NRU1fQ0hVTktFRD09PWF1ZGlvRG93bmxvYWRUeXBlKXtcclxuICAgICAgICAgICAgLy8gRmV0Y2ggY2h1bmtlZCBhcnJheSBhdWRpbyBidWZmZXJcclxuICAgICAgICAgICAgbGV0IG5leHRBYWI6IEFycmF5QXVkaW9CdWZmZXIgfCBudWxsID0gbnVsbDtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiRmV0Y2ggYXVkaW8gYW5kIHN0b3JlIHRvIChjaHVua2VkKSBhcnJheSBidWZmZXIuLi5cIik7XHJcbiAgICAgICAgICAgIHRoaXMuYXVkaW9GZXRjaFN1YnNjcmlwdGlvbiA9IHRoaXMucmVjRmlsZVNlcnZpY2UuZmV0Y2hSZWNvcmRpbmdGaWxlQXJyYXlBdWRpb0J1ZmZlcih0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIuY29udGV4dCwgdGhpcy5fc2Vzc2lvbi5wcm9qZWN0LCByZikuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICBuZXh0OiAoYWFiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBuZXh0QWFiID0gYWFiO1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGl2ZUxldmVsRGlzcGxheVN0YXRlID0gTGl2ZUxldmVsU3RhdGUuUkVBRFk7XHJcbiAgICAgICAgICAgICAgICBsZXQgZmFiRGggPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5leHRBYWIpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHJmICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZhYkRoID0gbmV3IEF1ZGlvRGF0YUhvbGRlcihuZXh0QWFiKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY29yZGVyQ29tYmlQYW5lLnNldFJlY0ZpbGVBdWRpb0RhdGEocmYsIGZhYkRoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGFjdHVhbGx5IGJlIGhhbmRsZWQgYnkgdGhlIGVycm9yIHJlc29sdmVyXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZyBmaWxlIGNvdWxkIG5vdCBiZSBsb2FkZWQuJ1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcidcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChmYWJEaCkge1xyXG4gICAgICAgICAgICAgICAgICAvLyB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgY291bGQgaGF2ZSBiZWVuIGNoYW5nZWQgbWVhbndoaWxlLCBidXQgdGhlIHJlY29yZGVyIHVuc3ViY3JpYmVzIGJlZm9yZSBjaGFuZ2luZyB0aGUgaXRlbS4gVGhlcmVmb3JlLCB0aGVyZSBzaG91bGQgYmUgbm8gcmlzayB0byBzZXQgdG8gd3JvbmcgaXRlbVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBuZXcgQXVkaW9DbGlwKGZhYkRoKTtcclxuICAgICAgICAgICAgICAgICAgLy90aGlzLmF1ZGlvTG9hZGVkPXRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLmF1ZGlvQ2xpcCA9IHRoaXMuZGlzcGxheUF1ZGlvQ2xpcDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1JlY29yZGluZygpO1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgZXJyb3I6IGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IGxvYWQgcmVjb3JkaW5nIGZpbGUgZnJvbSBzZXJ2ZXI6IFwiICsgZXJyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGl2ZUxldmVsRGlzcGxheVN0YXRlID0gTGl2ZUxldmVsU3RhdGUuUkVBRFk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c01zZyA9ICdSZWNvcmRpbmcgZmlsZSBjb3VsZCBub3QgYmUgbG9hZGVkOiAnICsgZXJyO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hdWRpb0ZldGNoU3Vic2NyaXB0aW9uID0gdGhpcy5yZWNGaWxlU2VydmljZS5mZXRjaFJlY29yZGluZ0ZpbGVBdWRpb0J1ZmZlcih0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIuY29udGV4dCwgdGhpcy5fc2Vzc2lvbi5wcm9qZWN0LCByZikuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICBuZXh0OiBhYiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpdmVMZXZlbERpc3BsYXlTdGF0ZSA9IExpdmVMZXZlbFN0YXRlLlJFQURZO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZhYkRoID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmIChhYikge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgYWJTcmM9bmV3IEF1ZGlvQnVmZmVyU291cmNlKGFiKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHJmKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmFiRGggPSBuZXcgQXVkaW9EYXRhSG9sZGVyKGFiU3JjKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY29yZGVyQ29tYmlQYW5lLnNldFJlY0ZpbGVBdWRpb0RhdGEocmYsIGZhYkRoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGxvYWRlZC4nKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGxvYWRlZC4nO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZmFiRGgpIHtcclxuICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kaXNwbGF5QXVkaW9DbGlwIGNvdWxkIGhhdmUgYmVlbiBjaGFuZ2VkIG1lYW53aGlsZSwgYnV0IHRoZSByZWNvcmRlciB1bnN1YmNyaWJlcyBiZWZvcmUgY2hhbmdpbmcgdGhlIGl0ZW0uIFRoZXJlZm9yZSwgdGhlcmUgc2hvdWxkIGJlIG5vIHJpc2sgdG8gc2V0IHRvIHdyb25nIGl0ZW1cclxuICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5QXVkaW9DbGlwID0gbmV3IEF1ZGlvQ2xpcChmYWJEaCk7XHJcbiAgICAgICAgICAgICAgICAgIC8vdGhpcy5hdWRpb0xvYWRlZD10cnVlO1xyXG4gICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJzZXQgcmVjb3JkaW5nIGZpbGU6IGRpc3BsYXkgYXVkaW8gY2xpcCBmcm9tIGZldGNoZWQgYXVkaW8gYnVmZmVyXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5fY29udHJvbEF1ZGlvUGxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5hdWRpb0NsaXAgPSB0aGlzLmRpc3BsYXlBdWRpb0NsaXA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dSZWNvcmRpbmcoKTtcclxuICAgICAgICAgICAgICB9LCBlcnJvcjogZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDb3VsZCBub3QgbG9hZCByZWNvcmRpbmcgZmlsZSBmcm9tIHNlcnZlcjogXCIgKyBlcnIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXZlTGV2ZWxEaXNwbGF5U3RhdGUgPSBMaXZlTGV2ZWxTdGF0ZS5SRUFEWTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZyBmaWxlIGNvdWxkIG5vdCBiZSBsb2FkZWQ6ICcgKyBlcnI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcic7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGRlY29kZWQuIEF1ZGlvIGNvbnRleHQgdW5hdmFpbGFibGUuJztcclxuICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvL2NvbnNvbGUuZGVidWcoXCJyZWNvcmRpbmcgZmlsZSBudWxsXCIpO1xyXG4gICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBudWxsO1xyXG4gICAgICBpZih0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIpIHtcclxuICAgICAgICB0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIuYXVkaW9DbGlwID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5zaG93UmVjb3JkaW5nKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGlzcGxheVJlY0ZpbGUoKTogUmVjb3JkaW5nRmlsZSB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlSZWNGaWxlO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlU3RhcnRBY3Rpb25EaXNhYmxlU3RhdGUoKXtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5kaXNhYmxlZD0hKHRoaXMuYWMpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnQoKSB7XHJcbiAgICBzdXBlci5zdGFydCgpO1xyXG4gICAgdGhpcy5yZWNvcmRlckNvbWJpUGFuZS5zZWxlY3RUb3AoKTtcclxuICAgIHRoaXMuZW5hYmxlTmF2aWdhdGlvbigpO1xyXG4gICAgdGhpcy51cGRhdGVTdGFydEFjdGlvbkRpc2FibGVTdGF0ZSgpO1xyXG5cclxuICB9XHJcblxyXG4gIGlzUmVjb3JkaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLnN0YXR1cyA9PT0gU3RhdHVzLlJFQ09SRElORyB8fCB0aGlzLnN0YXR1cz09PVN0YXR1cy5TVE9QUElOR19TVE9QKTtcclxuICB9XHJcblxyXG4gIGlzQWN0aXZlKCk6IGJvb2xlYW57XHJcbiAgICByZXR1cm4gKCEodGhpcy5zdGF0dXMgPT09IFN0YXR1cy5CTE9DS0VEIHx8IHRoaXMuc3RhdHVzPT09IFN0YXR1cy5JRExFIHx8IHRoaXMuc3RhdHVzPT09U3RhdHVzLkVSUk9SKSB8fCB0aGlzLnByb2Nlc3NpbmdSZWNvcmRpbmcgfHwgdGhpcy5zZXNzaW9uU2VydmljZS51cGxvYWRDb3VudD4wKVxyXG4gIH1cclxuXHJcblxyXG4gIHVwZGF0ZVdha2VMb2NrKGRhdGFTYXZlZDpib29sZWFuPXRoaXMuZGF0YVNhdmVkKXtcclxuICAgIC8vY29uc29sZS5kZWJ1ZyhcIlVwZGF0ZSB3YWtlIGxvY2s6IGRhdGFTYXZlZDogXCIrZGF0YVNhdmVkK1wiLCBub3QgYWN0aXZlOiBcIishIHRoaXMuaXNBY3RpdmUoKSlcclxuICAgIGlmKGRhdGFTYXZlZCAmJiAhIHRoaXMuaXNBY3RpdmUoKSl7XHJcbiAgICAgIHRoaXMuZGlzYWJsZVdha2VMb2NrQ29uZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVOYXZpZ2F0aW9uQWN0aW9ucygpe1xyXG5cclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24uZGlzYWJsZWQgPSB0aGlzLm5hdmlnYXRpb25EaXNhYmxlZDtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5id2RBY3Rpb24uZGlzYWJsZWQgPSB0aGlzLm5hdmlnYXRpb25EaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIGVuYWJsZVN0YXJ0VXNlckdlc3R1cmUoKSB7XHJcbiAgICBzdXBlci5lbmFibGVTdGFydFVzZXJHZXN0dXJlKCk7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24uZGlzYWJsZWQ9ISh0aGlzLmFjKTtcclxuICB9XHJcblxyXG4gIGVuYWJsZU5hdmlnYXRpb24oKXtcclxuICAgIHRoaXMubmF2aWdhdGlvbkRpc2FibGVkPWZhbHNlO1xyXG4gICAgdGhpcy51cGRhdGVOYXZpZ2F0aW9uQWN0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRlZCgpIHtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlJFQ09SRElORztcclxuICAgIHN1cGVyLnN0YXJ0ZWQoKTtcclxuICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2luZm8nO1xyXG4gICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nLi4uJztcclxuXHJcbiAgICBsZXQgc2Vzc0lkOiBzdHJpbmcgfCBudW1iZXIgPSAwO1xyXG4gICAgaWYodGhpcy5fc2Vzc2lvbil7XHJcbiAgICAgIHNlc3NJZD10aGlzLl9zZXNzaW9uLnNlc3Npb25JZDtcclxuICAgIH1cclxuXHJcbiAgICBpZih0aGlzLnJmVXVpZCkge1xyXG4gICAgICBsZXQgcmYgPSBuZXcgUmVjb3JkaW5nRmlsZSh0aGlzLnJmVXVpZCwgc2Vzc0lkLCBudWxsKTtcclxuICAgICAgcmYuX3N0YXJ0ZWRBc0RhdGVPYmogPSB0aGlzLnN0YXJ0ZWREYXRlO1xyXG4gICAgICBpZiAocmYuX3N0YXJ0ZWRBc0RhdGVPYmopIHtcclxuICAgICAgICByZi5zdGFydGVkRGF0ZSA9IHJmLl9zdGFydGVkQXNEYXRlT2JqLnRvU3RyaW5nKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fcmVjb3JkaW5nRmlsZSA9IHJmO1xyXG4gICAgfVxyXG4gICAgbGV0IG1heFJlY29yZGluZ1RpbWVNcyA9IE1BWF9SRUNPUkRJTkdfVElNRV9NUztcclxuICAgIHRoaXMubWF4UmVjVGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nTWF4UmVjKClcclxuICAgIH0sIG1heFJlY29yZGluZ1RpbWVNcyk7XHJcbiAgICB0aGlzLm1heFJlY1RpbWVyUnVubmluZyA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgc3RvcEl0ZW0oKSB7XHJcblxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuU1RPUFBJTkdfU1RPUDtcclxuICAgIHRoaXMuc3RvcFJlY29yZGluZygpO1xyXG5cclxuICB9XHJcblxyXG4gIHN0b3BSZWNvcmRpbmcoKSB7XHJcbiAgICBpZiAodGhpcy5tYXhSZWNUaW1lclJ1bm5pbmcgJiYgdGhpcy5tYXhSZWNUaW1lcklkIT1udWxsKSB7XHJcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5tYXhSZWNUaW1lcklkKTtcclxuICAgICAgdGhpcy5tYXhSZWNUaW1lclJ1bm5pbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuYWMpIHtcclxuICAgICAgdGhpcy5hYy5zdG9wKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdG9wUmVjb3JkaW5nTWF4UmVjKCl7XHJcblxyXG4gICAgdGhpcy5tYXhSZWNUaW1lclJ1bm5pbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlNUT1BQSU5HX1NUT1A7XHJcbiAgICBpZih0aGlzLmFjKSB7XHJcbiAgICAgIHRoaXMuYWMuc3RvcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RvcHBlZCgpIHtcclxuICAgIHRoaXMudXBkYXRlU3RhcnRBY3Rpb25EaXNhYmxlU3RhdGUoKVxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2luZm8nO1xyXG4gICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkZWQuJztcclxuXHJcbiAgICBsZXQgYWQ6QXVkaW9CdWZmZXJ8bnVsbD1udWxsO1xyXG5cclxuICAgIGlmKHRoaXMuYWMpIHtcclxuICAgICAgbGV0IGFkaDpBdWRpb0RhdGFIb2xkZXJ8bnVsbD1udWxsO1xyXG4gICAgICBsZXQgYXM6QXVkaW9Tb3VyY2V8bnVsbD1udWxsO1xyXG4gICAgICBpZih0aGlzLmFjKSB7XHJcbiAgICAgICAgaWYgKEF1ZGlvU3RvcmFnZVR5cGUuTkVUX0NIVU5LRUQgPT09IHRoaXMuYWMuYXVkaW9TdG9yYWdlVHlwZSkge1xyXG4gICAgICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgLy90aGlzLmF1ZGlvTG9hZGVkPWZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5rZWVwTGl2ZUxldmVsPXRydWU7XHJcbiAgICAgICAgICBsZXQgclVVSUQ6c3RyaW5nfG51bGw9bnVsbDtcclxuICAgICAgICAgICAgbGV0IGJ1cmw6c3RyaW5nfG51bGw9bnVsbDtcclxuICAgICAgICAgICAgaWYodGhpcy5fc2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLl9yZWNvcmRpbmdGaWxlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHJmID0gdGhpcy5fcmVjb3JkaW5nRmlsZTtcclxuICAgICAgICAgICAgICAgIHJmLmZyYW1lcz10aGlzLmFjLmZyYW1lc1JlY29yZGVkO1xyXG4gICAgICAgICAgICAgICAgclVVSUQ9cmYudXVpZDtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcInN0b3BwZWQoKTogU2V0IGZyYW1lczogXCIrcmYuZnJhbWVzK1wiIG9uIHJmSWQ6IFwiK3RoaXMuZGlzcGxheVJlY0ZpbGU/LnJlY29yZGluZ0ZpbGVJZCk7XHJcbiAgICAgICAgICAgICAgICBidXJsID0gdGhpcy5yZWNGaWxlU2VydmljZS5hdWRpb0ZpbGVVcmwodGhpcy5fc2Vzc2lvbj8ucHJvamVjdCwgcmYpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZXNzaW9uPy5wcm9qZWN0KSB7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLmFjLnJlY1VVSUQpIHtcclxuICAgICAgICAgICAgICAgICAgclVVSUQ9dGhpcy5hYy5yZWNVVUlEO1xyXG4gICAgICAgICAgICAgICAgICBidXJsID0gdGhpcy5yZWNGaWxlU2VydmljZS5hdWRpb0ZpbGVVcmxCeVVVSUQodGhpcy5zZXNzaW9uLnByb2plY3QsIHRoaXMuc2Vzc2lvbi5zZXNzaW9uSWQsIHJVVUlEKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDb3VsZCBub3QgY3JlYXRlIG5ldCBhdWRpbyBidWZmZXIuXCIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoYnVybCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3IgPSB0aGlzLmFjLmN1cnJlbnRTYW1wbGVSYXRlO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hGbD1zcipSZWNvcmRpbmdTZXJ2aWNlLkRFRkFVTFRfQ0hVTktFRF9ET1dOTE9BRF9TRUNPTkRTO1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwic3RvcHBlZCgpOiByZklEOiBcIit0aGlzLl9yZWNvcmRpbmdGaWxlPy5yZWNvcmRpbmdGaWxlSWQrXCIsIG5ldCBhYiB1cmw6IFwiICsgYnVybCtcIiwgZnJhbWVzOiBcIit0aGlzLmFjLmZyYW1lc1JlY29yZGVkK1wiLCBzYW1wbGUgcmF0ZTogXCIrc3IpO1xyXG4gICAgICAgICAgICAgICAgbGV0IG5ldEFzID0gbmV3IE5ldEF1ZGlvQnVmZmVyKHRoaXMuYWMuY29udGV4dCwgdGhpcy5yZWNGaWxlU2VydmljZSwgYnVybCwgdGhpcy5hYy5jaGFubmVsQ291bnQsIHNyLCBjaEZsLCB0aGlzLmFjLmZyYW1lc1JlY29yZGVkLCByVVVJRCwgY2hGbCk7XHJcbiAgICAgICAgICAgICAgICBhcz1uZXRBcztcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMudXBsb2FkU2V0KXtcclxuICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRTZXQub25Eb25lPSh1cGxvYWRTZXQpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwidXBsb2FkIHNldCBvbiBkb25lOiBDYWxsIHJlYWR5IHByb3ZpZGVyLnJlYWR5XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5ldEFzLnJlYWR5KCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1lbHNlIGlmIChBdWRpb1N0b3JhZ2VUeXBlLk1FTV9FTlRJUkVfQVVUT19ORVRfQ0hVTktFRCA9PT0gdGhpcy5hYy5hdWRpb1N0b3JhZ2VUeXBlIHx8IEF1ZGlvU3RvcmFnZVR5cGUuTUVNX0NIVU5LRURfQVVUT19ORVRfQ0hVTktFRCA9PT0gdGhpcy5hYy5hdWRpb1N0b3JhZ2VUeXBlKSB7XHJcbiAgICAgICAgICBpZiAoQXVkaW9TdG9yYWdlVHlwZS5NRU1fRU5USVJFX0FVVE9fTkVUX0NIVU5LRUQgPT09IHRoaXMuYWMuYXVkaW9TdG9yYWdlVHlwZSl7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjQWI9dGhpcy5hYy5hdWRpb0J1ZmZlcigpO1xyXG4gICAgICAgICAgICBpZihhY0FiKSB7XHJcbiAgICAgICAgICAgICAgYXMgPSBuZXcgQXVkaW9CdWZmZXJTb3VyY2UoYWNBYik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKEF1ZGlvU3RvcmFnZVR5cGUuTUVNX0NIVU5LRURfQVVUT19ORVRfQ0hVTktFRCA9PT0gdGhpcy5hYy5hdWRpb1N0b3JhZ2VUeXBlKXtcclxuICAgICAgICAgICAgYXMgPSB0aGlzLmFjLmF1ZGlvQnVmZmVyQXJyYXkoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKCFhcyl7XHJcbiAgICAgICAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5rZWVwTGl2ZUxldmVsPXRydWU7XHJcbiAgICAgICAgICAgIGxldCByVVVJRDpzdHJpbmd8bnVsbD1udWxsO1xyXG4gICAgICAgICAgICBsZXQgYnVybDpzdHJpbmd8bnVsbD1udWxsO1xyXG4gICAgICAgICAgICBpZih0aGlzLl9zZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX3JlY29yZGluZ0ZpbGUpIHtcclxuICAgICAgICAgICAgICAgIGxldCByZiA9IHRoaXMuX3JlY29yZGluZ0ZpbGU7XHJcbiAgICAgICAgICAgICAgICByZi5mcmFtZXM9dGhpcy5hYy5mcmFtZXNSZWNvcmRlZDtcclxuICAgICAgICAgICAgICAgIHJVVUlEPXJmLnV1aWQ7XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJzdG9wcGVkKCk6IFNldCBmcmFtZXM6IFwiK3JmLmZyYW1lcytcIiBvbiByZklkOiBcIit0aGlzLmRpc3BsYXlSZWNGaWxlPy5yZWNvcmRpbmdGaWxlSWQpO1xyXG4gICAgICAgICAgICAgICAgYnVybCA9IHRoaXMucmVjRmlsZVNlcnZpY2UuYXVkaW9GaWxlVXJsKHRoaXMuX3Nlc3Npb24/LnByb2plY3QsIHJmKTtcclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2Vzc2lvbj8ucHJvamVjdCkge1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5hYy5yZWNVVUlEKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJVVUlEPXRoaXMuYWMucmVjVVVJRDtcclxuICAgICAgICAgICAgICAgICAgYnVybCA9IHRoaXMucmVjRmlsZVNlcnZpY2UuYXVkaW9GaWxlVXJsQnlVVUlEKHRoaXMuc2Vzc2lvbi5wcm9qZWN0LCB0aGlzLnNlc3Npb24uc2Vzc2lvbklkLCByVVVJRCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IGNyZWF0ZSBuZXQgYXVkaW8gYnVmZmVyLlwiKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGJ1cmwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNyID0gdGhpcy5hYy5jdXJyZW50U2FtcGxlUmF0ZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoRmw9c3IqUmVjb3JkaW5nU2VydmljZS5ERUZBVUxUX0NIVU5LRURfRE9XTkxPQURfU0VDT05EUztcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcInN0b3BwZWQoKTogcmZJRDogXCIrdGhpcy5fcmVjb3JkaW5nRmlsZT8ucmVjb3JkaW5nRmlsZUlkK1wiLCBuZXQgYWIgdXJsOiBcIiArIGJ1cmwrXCIsIGZyYW1lczogXCIrdGhpcy5hYy5mcmFtZXNSZWNvcmRlZCtcIiwgc2FtcGxlIHJhdGU6IFwiK3NyKTtcclxuICAgICAgICAgICAgICAgIGxldCBuZXRBcyA9IG5ldyBOZXRBdWRpb0J1ZmZlcih0aGlzLmFjLmNvbnRleHQsIHRoaXMucmVjRmlsZVNlcnZpY2UsIGJ1cmwsIHRoaXMuYWMuY2hhbm5lbENvdW50LCBzciwgY2hGbCwgdGhpcy5hYy5mcmFtZXNSZWNvcmRlZCwgclVVSUQsIGNoRmwpO1xyXG4gICAgICAgICAgICAgICAgYXMgPSBuZXRBcztcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVwbG9hZFNldCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZFNldC5vbkRvbmUgPSAodXBsb2FkU2V0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwidXBsb2FkIHNldCBvbiBkb25lOiBDYWxsIHJlYWR5IHByb3ZpZGVyLnJlYWR5XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5ldEFzLnJlYWR5KCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKEF1ZGlvU3RvcmFnZVR5cGUuREJfQ0hVTktFRCA9PT0gdGhpcy5hYy5hdWRpb1N0b3JhZ2VUeXBlKSB7XHJcbiAgICAgICAgICBhcyA9IHRoaXMuYWMuaW5kZGJBdWRpb0J1ZmZlckFycmF5KCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChBdWRpb1N0b3JhZ2VUeXBlLk1FTV9DSFVOS0VEID09PSB0aGlzLmFjLmF1ZGlvU3RvcmFnZVR5cGUpIHtcclxuICAgICAgICAgIGFzID0gdGhpcy5hYy5hdWRpb0J1ZmZlckFycmF5KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCBhYiA9IHRoaXMuYWMuYXVkaW9CdWZmZXIoKTtcclxuICAgICAgICAgIGlmKGFiKSB7XHJcbiAgICAgICAgICAgIGFzID0gbmV3IEF1ZGlvQnVmZmVyU291cmNlKGFiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFzKSB7XHJcbiAgICAgICAgICBhZGggPSBuZXcgQXVkaW9EYXRhSG9sZGVyKGFzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBzZXNzSWQ6IHN0cmluZyB8IG51bWJlciA9IDA7XHJcbiAgICAgIGlmKHRoaXMuX3Nlc3Npb24pe1xyXG4gICAgICAgIHNlc3NJZD10aGlzLl9zZXNzaW9uLnNlc3Npb25JZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYodGhpcy5fcmVjb3JkaW5nRmlsZSkge1xyXG4gICAgICAgIC8vdGhpcy5fcmVjb3JkaW5nRmlsZS5zYW1wbGVyYXRlPXRoaXMuYWMuY3VycmVudFNhbXBsZVJhdGU7XHJcbiAgICAgICAgLy8gVXNlIGFuIG93biByZWZlcmVuY2Ugc2luY2UgdGhlIHdyaXRpbmcgb2YgdGhlIHdhdmUgZmlsZSBpcyBhc3luY2hyb25vdXMgYW5kIHRoaXMuX3JlY29yZGluZ0ZpbGUgbWlnaHQgYWxyZWFkeSBjb250YWluIHRoZSBuZXh0IHJlY29yZGluZ1xyXG4gICAgICAgIGxldCByZiA9IHRoaXMuX3JlY29yZGluZ0ZpbGU7XHJcbiAgICAgICAgUmVjb3JkaW5nRmlsZVV0aWxzLnNldEF1ZGlvRGF0YShyZixhZGgpO1xyXG4gICAgICAgIHRoaXMucmVjb3JkZXJDb21iaVBhbmUuYWRkUmVjRmlsZShyZik7XHJcblxyXG4gICAgICAgIC8vIFVwbG9hZCBpZiB1cGxvYWQgZW5hYmxlZCBhbmQgbm90IGluIGNodW5rZWQgdXBsb2FkIG1vZGVcclxuICAgICAgICBpZiAodGhpcy5lbmFibGVVcGxvYWRSZWNvcmRpbmdzICYmICF0aGlzLnVwbG9hZENodW5rU2l6ZVNlY29uZHMgJiYgcmYgIT0gbnVsbCAmJiBhZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICBsZXQgYXBpRW5kUG9pbnQgPSAnJztcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuYXBpRW5kUG9pbnQpIHtcclxuICAgICAgICAgICAgYXBpRW5kUG9pbnQgPSB0aGlzLmNvbmZpZy5hcGlFbmRQb2ludDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChhcGlFbmRQb2ludCAhPT0gJycpIHtcclxuICAgICAgICAgICAgYXBpRW5kUG9pbnQgPSBhcGlFbmRQb2ludCArICcvJ1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCBzZXNzaW9uc1VybCA9IGFwaUVuZFBvaW50ICsgU2Vzc2lvblNlcnZpY2UuU0VTU0lPTl9BUElfQ1RYO1xyXG4gICAgICAgICAgbGV0IHJlY1VybDogc3RyaW5nID0gc2Vzc2lvbnNVcmwgKyAnLycgKyByZi5zZXNzaW9uICsgJy8nICsgUkVDRklMRV9BUElfQ1RYICsgJy8nICsgcmYudXVpZDtcclxuXHJcbiAgICAgICAgICAvLyBjb252ZXJ0IGFzeW5jaHJvbm91c2x5IHRvIDE2LWJpdCBpbnRlZ2VyIFBDTVxyXG4gICAgICAgICAgLy8gVE9ETyBjb3VsZCB3ZSBhdm9pZCBjb252ZXJzaW9uIHRvIHNhdmUgQ1BVIHJlc291cmNlcyBhbmQgdHJhbnNmZXIgZmxvYXQgUENNIGRpcmVjdGx5P1xyXG4gICAgICAgICAgLy8gVE9ETyBkdXBsaWNhdGUgY29udmVyc2lvbiBmb3IgbWFudWFsIGRvd25sb2FkXHJcblxyXG4gICAgICAgICAgdGhpcy5wcm9jZXNzaW5nUmVjb3JkaW5nID0gdHJ1ZVxyXG4gICAgICAgICAgbGV0IHd3ID0gbmV3IFdhdldyaXRlcigpO1xyXG4gICAgICAgICAgd3cud3JpdGVBc3luYyhhZCwgKHdhdkZpbGUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wb3N0UmVjb3JkaW5nTXVsdGlwYXJ0KHdhdkZpbGUscmVjVXJsLHJmKTtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzaW5nUmVjb3JkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV2FrZUxvY2soKTtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZGlzcGxheVJlY0ZpbGUgPSB0aGlzLl9yZWNvcmRpbmdGaWxlO1xyXG4gICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuSURMRTtcclxuICAgIHRoaXMubmF2aWdhdGlvbkRpc2FibGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLnVwZGF0ZU5hdmlnYXRpb25BY3Rpb25zKCk7XHJcbiAgICB0aGlzLnVwZGF0ZVdha2VMb2NrKCk7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIGVycm9yKG1zZz0nQW4gdW5rbm93biBlcnJvciBvY2N1cmVkIGR1cmluZyByZWNvcmRpbmcuJyxhZHZpY2U6c3RyaW5nPSdQbGVhc2UgcmV0cnkuJykge1xyXG4gICAgdGhpcy5zdGF0dXM9U3RhdHVzLkVSUk9SO1xyXG4gICAgc3VwZXIuZXJyb3IobXNnLGFkdmljZSk7XHJcbiAgICB0aGlzLnVwZGF0ZU5hdmlnYXRpb25BY3Rpb25zKCk7XHJcbiAgICB0aGlzLnVwZGF0ZVN0YXJ0QWN0aW9uRGlzYWJsZVN0YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwb3N0UmVjb3JkaW5nTXVsdGlwYXJ0KHdhdkZpbGU6IFVpbnQ4QXJyYXkscmVjVXJsOiBzdHJpbmcscmY6UmVjb3JkaW5nRmlsZSkge1xyXG4gICAgbGV0IHdhdkJsb2IgPSBuZXcgQmxvYihbd2F2RmlsZV0sIHt0eXBlOiAnYXVkaW8vd2F2J30pO1xyXG5cclxuICAgIGxldCBmZD1uZXcgRm9ybURhdGEoKTtcclxuICAgIGlmKHJmLnV1aWQpIHtcclxuICAgICAgZmQuc2V0KCd1dWlkJywgcmYudXVpZCk7XHJcbiAgICB9XHJcbiAgICBpZihyZi5zZXNzaW9uIT09bnVsbCkge1xyXG4gICAgICBmZC5zZXQoJ3Nlc3Npb25JZCcsIHJmLnNlc3Npb24udG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcbiAgICBpZihyZi5fc3RhcnRlZEFzRGF0ZU9iail7XHJcbiAgICAgIGZkLnNldCgnc3RhcnRlZERhdGUnLHJmLl9zdGFydGVkQXNEYXRlT2JqLnRvSlNPTigpKTtcclxuICAgIH1cclxuICAgIGZkLnNldCgnYXVkaW8nLHdhdkJsb2IpO1xyXG4gICAgbGV0IHVsID0gbmV3IFVwbG9hZChmZCwgcmVjVXJsLHJmKTtcclxuICAgIHRoaXMudXBsb2FkZXIucXVldWVVcGxvYWQodWwpO1xyXG4gIH1cclxuXHJcbiAgcG9zdENodW5rQXVkaW9CdWZmZXIoYXVkaW9CdWZmZXI6IEF1ZGlvQnVmZmVyLCBjaHVua0lkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnByb2Nlc3NpbmdSZWNvcmRpbmcgPSB0cnVlO1xyXG4gICAgbGV0IHd3ID0gbmV3IFdhdldyaXRlcigpO1xyXG4gICAgbGV0IHNlc3Npb25zVXJsID0gdGhpcy5zZXNzaW9uc0Jhc2VVcmwoKTtcclxuICAgIGxldCByZWNVcmw6IHN0cmluZyA9IHNlc3Npb25zVXJsICsgJy8nICsgdGhpcy5zZXNzaW9uPy5zZXNzaW9uSWQgKyAnLycgKyBSRUNGSUxFX0FQSV9DVFggKyAnLycgKyB0aGlzLnJmVXVpZCsnLycrY2h1bmtJZHg7XHJcbiAgICBsZXQgcmY9dGhpcy5fcmVjb3JkaW5nRmlsZTtcclxuXHJcbiAgICAvLyBUaGUgdXBsb2FkIGhvbGRlciBpcyByZXF1aXJlZCB0byBhZGQgdGhlIHVwbG9hZCBub3cgdG8gdGhlIHVwbG9hZCBzZXQuIFRoZSByZWFsIHVwbG9hZCBpcyBjcmVhdGVkIGFzeW5jIGluIHBvc3RyZWNvcmRpbmcgYW5kIHRoZSB1cGxvYWQgc2V0IGlzIGFscmVhZHkgY29tcGxldGUgYXQgdGhhdCB0aW1lLlxyXG4gICAgbGV0IHVsaD1uZXcgVXBsb2FkSG9sZGVyKCk7XHJcbiAgICBpZih0aGlzLnVwbG9hZFNldCl7XHJcbiAgICAgIHRoaXMudXBsb2FkU2V0LmFkZCh1bGgpO1xyXG4gICAgfVxyXG4gICAgd3cud3JpdGVBc3luYyhhdWRpb0J1ZmZlciwgKHdhdkZpbGUpID0+IHtcclxuICAgICAgdGhpcy5wb3N0UmVjb3JkaW5nKHdhdkZpbGUsIHJlY1VybCxyZix1bGgpO1xyXG4gICAgICB0aGlzLnByb2Nlc3NpbmdSZWNvcmRpbmcgPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3RvcCgpIHtcclxuICAgIGlmKHRoaXMuYWMpIHtcclxuICAgICAgdGhpcy5hYy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVDb250cm9sUGxheWJhY2tQb3NpdGlvbigpIHtcclxuICAgIGlmKHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllcil7XHJcbiAgICAgIGNvbnN0IHBwRnJhbWVzPXRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5wbGF5UG9zaXRpb25GcmFtZXM7XHJcbiAgICAgIGlmIChwcEZyYW1lcyE9PW51bGwpIHtcclxuICAgICAgICB0aGlzLnJlY29yZGVyQ29tYmlQYW5lLmF1ZGlvRGlzcGxheS5wbGF5RnJhbWVQb3NpdGlvbiA9IHBwRnJhbWVzO1xyXG4gICAgICAgIHRoaXMubGl2ZUxldmVsRGlzcGxheS5wbGF5RnJhbWVQb3NpdGlvbiA9IHBwRnJhbWVzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhdWRpb1BsYXllclVwZGF0ZShlOiBBdWRpb1BsYXllckV2ZW50KSB7XHJcbiAgICBpZiAoRXZlbnRUeXBlLlJFQURZID09PSBlLnR5cGUpIHtcclxuXHJcbiAgICB9IGVsc2UgaWYgKEV2ZW50VHlwZS5TVEFSVEVEID09PSBlLnR5cGUpIHtcclxuICAgICAgLy90aGlzLnN0YXR1cyA9ICdQbGF5YmFjay4uLic7XHJcbiAgICAgIHRoaXMudXBkYXRlVGltZXJJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB0aGlzLnVwZGF0ZUNvbnRyb2xQbGF5YmFja1Bvc2l0aW9uKCksIDUwKTtcclxuXHJcbiAgICB9IGVsc2UgaWYgKEV2ZW50VHlwZS5FTkRFRCA9PT0gZS50eXBlKSB7XHJcbiAgICAgIC8vLnN0YXR1cz0nUmVhZHkuJztcclxuICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy51cGRhdGVUaW1lcklkKTtcclxuXHJcbiAgICB9XHJcbiAgICBpZighdGhpcy5kZXN0cm95ZWQpIHtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWF1ZGlvcmVjb3JkZXItY29tcCcsXHJcbiAgcHJvdmlkZXJzOiBbU2Vzc2lvblNlcnZpY2VdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8YXBwLWF1ZGlvcmVjb3JkZXIgW3Byb2plY3ROYW1lXT1cIl9wcm9qZWN0Py5uYW1lXCIgW2RhdGFTYXZlZF09XCJkYXRhU2F2ZWRcIj48L2FwcC1hdWRpb3JlY29yZGVyPlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYDpob3N0e1xyXG4gICAgZmxleDogMjtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGhlaWdodDogMTAwJTtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBtaW4taGVpZ2h0OjA7XHJcblxyXG4gIH1gXVxyXG5cclxufSlcclxuZXhwb3J0IGNsYXNzIEF1ZGlvUmVjb3JkZXJDb21wb25lbnQgZXh0ZW5kcyBSZWNvcmRlckNvbXBvbmVudCAgaW1wbGVtZW50cyBPbkluaXQsT25EZXN0cm95LEFmdGVyVmlld0luaXQsUmVhZHlTdGF0ZVByb3ZpZGVyIHtcclxuXHJcbiAgbW9kZSE6TW9kZTtcclxuICBjb250cm9sQXVkaW9QbGF5ZXIhOkF1ZGlvUGxheWVyO1xyXG4gIGF1ZGlvOmFueTtcclxuXHJcbiAgX3Byb2plY3Q6UHJvamVjdHx1bmRlZmluZWQ7XHJcbiAgc2Vzc2lvbklkITogc3RyaW5nO1xyXG4gIHNlc3Npb24hOlNlc3Npb247XHJcblxyXG4gIEBWaWV3Q2hpbGQoQXVkaW9SZWNvcmRlciwgeyBzdGF0aWM6IHRydWUgfSkgYXIhOkF1ZGlvUmVjb3JkZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzZXNzaW9uU2VydmljZTpTZXNzaW9uU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIHByb2plY3RTZXJ2aWNlOlByb2plY3RTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByb3RlY3RlZCB1cGxvYWRlcjpTcGVlY2hSZWNvcmRlclVwbG9hZGVyXHJcbiAgKSB7XHJcbiAgICBzdXBlcih1cGxvYWRlcik7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIC8vc3VwZXIubmdPbkluaXQoKTtcclxuICAgIGxldCBhdWRpb0NvbnRleHQgPSBBdWRpb0NvbnRleHRQcm92aWRlci5hdWRpb0NvbnRleHRJbnN0YW5jZSgpO1xyXG4gICAgaWYoYXVkaW9Db250ZXh0KSB7XHJcbiAgICAgIHRoaXMuY29udHJvbEF1ZGlvUGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKGF1ZGlvQ29udGV4dCx0aGlzLmFyKTtcclxuICAgIH1cclxuICAgIHRoaXMuYXIuY29udHJvbEF1ZGlvUGxheWVyPXRoaXMuY29udHJvbEF1ZGlvUGxheWVyO1xyXG5cclxuICAgIC8vVE9ETyBEdXBsaWNhdGUgY29kZSBpbiBTcGVlY2hSZWNvcmRlckNvbXBvbmVudFxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIChlKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJCZWZvcmUgcGFnZSB1bmxvYWQgZXZlbnRcIik7XHJcblxyXG4gICAgICBpZiAodGhpcy5yZWFkeSgpKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGFsbCB0aGlzIGF0dGVtcHRzIHRvIGN1c3RvbWl6ZSB0aGUgbWVzc2FnZSBkbyBub3Qgd29yayBhbnltb3JlIChmb3Igc2VjdXJpdHkgcmVhc29ucykhIVxyXG4gICAgICAgIHZhciBtZXNzYWdlID0gXCJQbGVhc2UgZG8gbm90IGxlYXZlIHRoZSBwYWdlLCB1bnRpbCBhbGwgcmVjb3JkaW5ncyBhcmUgdXBsb2FkZWQhXCI7XHJcbiAgICAgICAgYWxlcnQobWVzc2FnZSk7XHJcbiAgICAgICAgZSA9IGUgfHwgd2luZG93LmV2ZW50O1xyXG5cclxuICAgICAgICBpZiAoZSkge1xyXG4gICAgICAgICAgZS5yZXR1cm5WYWx1ZSA9IG1lc3NhZ2U7XHJcbiAgICAgICAgICBlLmNhbmNlbEJ1YmJsZSA9IHRydWU7XHJcbiAgICAgICAgICBpZiAoZS5zdG9wUHJvcGFnYXRpb24pIHtcclxuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuXHJcbiAgICAvLyBUT0RPIGNhbGwgcHJlcGFyZSAhIVxyXG5cclxuICAgIHRoaXMudXBsb2FkZXIubGlzdGVuZXIgPSAodWUpID0+IHtcclxuICAgICAgdGhpcy51cGxvYWRVcGRhdGUodWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5zdWJzY3JpYmUoKHBhcmFtczogUGFyYW1zKSA9PiB7XHJcbiAgICAgIGlmIChwYXJhbXNbJ3Nlc3Npb25JZCddKSB7XHJcbiAgICAgICAgdGhpcy5mZXRjaFNlc3Npb24ocGFyYW1zWydzZXNzaW9uSWQnXSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKChwYXJhbXM6IFBhcmFtcykgPT4ge1xyXG4gICAgICBsZXQgcm91dGVQYXJhbXNJZCA9IHBhcmFtc1snaWQnXTtcclxuICAgICAgaWYgKHJvdXRlUGFyYW1zSWQpIHtcclxuICAgICAgICB0aGlzLmZldGNoU2Vzc2lvbihyb3V0ZVBhcmFtc0lkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIC8vc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICB9XHJcblxyXG4gIGdldCBzY3JlZW5Mb2NrZWQoKTpib29sZWFue1xyXG4gICAgcmV0dXJuICB0aGlzLmFyLnNjcmVlbkxvY2tlZDtcclxuICB9XHJcblxyXG4gIGZldGNoU2Vzc2lvbihzZXNzaW9uSWQ6c3RyaW5nKXtcclxuXHJcbiAgICBsZXQgc2Vzc09icz0gdGhpcy5zZXNzaW9uU2VydmljZS5zZXNzaW9uT2JzZXJ2ZXIoc2Vzc2lvbklkKTtcclxuXHJcbiAgICBpZihzZXNzT2JzKSB7XHJcbiAgICAgIHNlc3NPYnMuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OihzZXNzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmFyLnN0YXR1c0FsZXJ0VHlwZT0naW5mbyc7XHJcbiAgICAgICAgICB0aGlzLmFyLnN0YXR1c01zZyA9ICdSZWNlaXZlZCBzZXNzaW9uIGluZm8uJztcclxuICAgICAgICAgIHRoaXMuYXIuc3RhdHVzV2FpdGluZz1mYWxzZTtcclxuICAgICAgICAgIHRoaXMuc2Vzc2lvbj1zZXNzO1xyXG4gICAgICAgICAgdGhpcy5hci5zZXNzaW9uPXNlc3M7XHJcbiAgICAgICAgICBpZiAoc2Vzcy5wcm9qZWN0KSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlNlc3Npb24gYXNzb2NpYXRlZCBwcm9qZWN0OiBcIitzZXNzLnByb2plY3QpXHJcbiAgICAgICAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdE9ic2VydmFibGUoc2Vzcy5wcm9qZWN0KS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgIG5leHQ6KHByb2plY3QpPT57XHJcbiAgICAgICAgICAgICAgdGhpcy5hci5wcm9qZWN0PXByb2plY3Q7XHJcbiAgICAgICAgICAgICAgdGhpcy5hci5mZXRjaFJlY29yZGluZ3Moc2Vzcyk7XHJcbiAgICAgICAgICAgIH0sZXJyb3I6KHJlYXNvbikgPT57XHJcbiAgICAgICAgICAgICAgdGhpcy5hci5zdGF0dXNNc2c9cmVhc29uO1xyXG4gICAgICAgICAgICAgIHRoaXMuYXIuc3RhdHVzQWxlcnRUeXBlPSdlcnJvcic7XHJcbiAgICAgICAgICAgICAgdGhpcy5hci5zdGF0dXNXYWl0aW5nPWZhbHNlO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBwcm9qZWN0IGNvbmZpZzogXCIrcmVhc29uKVxyXG4gICAgICAgICAgICB9fSk7XHJcblxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiU2Vzc2lvbiBoYXMgbm8gYXNzb2NpYXRlZCBwcm9qZWN0LiBVc2luZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uXCIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjoocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmFyLnN0YXR1c01zZyA9IHJlYXNvbjtcclxuICAgICAgICAgIHRoaXMuYXIuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgICAgIHRoaXMuYXIuc3RhdHVzV2FpdGluZz1mYWxzZTtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBzZXNzaW9uIFwiICsgcmVhc29uKVxyXG4gICAgICAgIH19KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwbG9hZFVwZGF0ZSh1ZTogVXBsb2FkZXJTdGF0dXNDaGFuZ2VFdmVudCkge1xyXG4gICAgbGV0IHVwU3RhdHVzID0gdWUuc3RhdHVzO1xyXG4gICAgdGhpcy5kYXRhU2F2ZWQgPSAoVXBsb2FkZXJTdGF0dXMuRE9ORSA9PT0gdXBTdGF0dXMpO1xyXG4gICAgbGV0IHBlcmNlbnRVcGwgPSB1ZS5wZXJjZW50RG9uZSgpO1xyXG4gICAgaWYgKFVwbG9hZGVyU3RhdHVzLkVSUiA9PT0gdXBTdGF0dXMpIHtcclxuICAgICAgdGhpcy5hci51cGxvYWRTdGF0dXMgPSAnd2FybidcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChwZXJjZW50VXBsIDwgNTApIHtcclxuICAgICAgICB0aGlzLmFyLnVwbG9hZFN0YXR1cyA9ICdhY2NlbnQnXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hci51cGxvYWRTdGF0dXMgPSAnc3VjY2VzcydcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmFyLnVwbG9hZFByb2dyZXNzID0gcGVyY2VudFVwbDtcclxuICAgIH1cclxuICAgIHRoaXMuYXIudXBkYXRlV2FrZUxvY2sodGhpcy5kYXRhU2F2ZWQpO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKClcclxuICB9XHJcblxyXG5cclxuICByZWFkeSgpOmJvb2xlYW57XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhU2F2ZWQgJiYgIXRoaXMuYXIuaXNBY3RpdmUoKVxyXG4gIH1cclxuXHJcbn1cclxuIl19
|