speechrecorderng 2.25.3 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/esm2020/lib/audio/array_audio_buffer.mjs +101 -0
  2. package/esm2020/lib/audio/array_audio_buffer_input_stream.mjs +86 -0
  3. package/esm2020/lib/audio/audio_data_holder.mjs +109 -0
  4. package/esm2020/lib/audio/audio_display.mjs +5 -5
  5. package/esm2020/lib/audio/audio_player.mjs +9 -7
  6. package/esm2020/lib/audio/capture/capture.mjs +6 -1
  7. package/esm2020/lib/audio/dsp/level_measure.mjs +97 -55
  8. package/esm2020/lib/audio/io/stream.mjs +3 -3
  9. package/esm2020/lib/audio/persistor.mjs +5 -6
  10. package/esm2020/lib/audio/playback/array_audio_buffer_source_node.mjs +265 -0
  11. package/esm2020/lib/audio/playback/player.mjs +184 -50
  12. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +25 -13
  13. package/esm2020/lib/audio/ui/audio_display_scroll_pane.mjs +2 -2
  14. package/esm2020/lib/audio/ui/audiosignal.mjs +206 -77
  15. package/esm2020/lib/audio/ui/container.mjs +14 -14
  16. package/esm2020/lib/audio/ui/livelevel.mjs +15 -2
  17. package/esm2020/lib/audio/ui/sonagram.mjs +343 -160
  18. package/esm2020/lib/io/stream.mjs +77 -1
  19. package/esm2020/lib/net/uploader.mjs +15 -3
  20. package/esm2020/lib/speechrecorder/recording.mjs +52 -7
  21. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +99 -7
  22. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +117 -101
  23. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +34 -6
  24. package/esm2020/lib/speechrecorder/session/progress.mjs +2 -2
  25. package/esm2020/lib/speechrecorder/session/prompting.mjs +2 -2
  26. package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +6 -3
  27. package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +182 -0
  28. package/esm2020/lib/speechrecorder/session/recording_list.mjs +23 -10
  29. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +12 -6
  30. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +5 -5
  31. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +13 -9
  32. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +8 -5
  33. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +118 -95
  34. package/esm2020/lib/speechrecorderng.component.mjs +2 -2
  35. package/esm2020/lib/speechrecorderng.module.mjs +5 -4
  36. package/esm2020/lib/spr.module.version.mjs +2 -2
  37. package/esm2020/lib/ui/recordingitem_display.mjs +2 -2
  38. package/fesm2015/speechrecorderng.mjs +2321 -743
  39. package/fesm2015/speechrecorderng.mjs.map +1 -1
  40. package/fesm2020/speechrecorderng.mjs +2321 -753
  41. package/fesm2020/speechrecorderng.mjs.map +1 -1
  42. package/lib/audio/array_audio_buffer.d.ts +15 -0
  43. package/lib/audio/array_audio_buffer_input_stream.d.ts +14 -0
  44. package/lib/audio/audio_data_holder.d.ts +29 -0
  45. package/lib/audio/audio_display.d.ts +2 -1
  46. package/lib/audio/audio_player.d.ts +2 -1
  47. package/lib/audio/capture/capture.d.ts +2 -0
  48. package/lib/audio/dsp/level_measure.d.ts +2 -1
  49. package/lib/audio/persistor.d.ts +4 -3
  50. package/lib/audio/playback/array_audio_buffer_source_node.d.ts +24 -0
  51. package/lib/audio/playback/player.d.ts +6 -0
  52. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +4 -1
  53. package/lib/audio/ui/audio_display_scroll_pane.d.ts +2 -1
  54. package/lib/audio/ui/audiosignal.d.ts +3 -2
  55. package/lib/audio/ui/container.d.ts +3 -2
  56. package/lib/audio/ui/livelevel.d.ts +3 -1
  57. package/lib/audio/ui/sonagram.d.ts +3 -2
  58. package/lib/io/stream.d.ts +17 -0
  59. package/lib/net/uploader.d.ts +6 -1
  60. package/lib/speechrecorder/recording.d.ts +15 -3
  61. package/lib/speechrecorder/recordings/recordings.service.d.ts +2 -0
  62. package/lib/speechrecorder/session/audiorecorder.d.ts +2 -7
  63. package/lib/speechrecorder/session/basicrecorder.d.ts +9 -3
  64. package/lib/speechrecorder/session/progress.d.ts +1 -1
  65. package/lib/speechrecorder/session/prompting.d.ts +1 -1
  66. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +3 -1
  67. package/lib/speechrecorder/session/recording_file_cache.d.ts +30 -0
  68. package/lib/speechrecorder/session/recording_list.d.ts +3 -1
  69. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +2 -1
  70. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +1 -0
  71. package/lib/speechrecorder/session/sessionmanager.d.ts +5 -11
  72. package/lib/speechrecorderng.module.d.ts +2 -1
  73. package/lib/spr.module.version.d.ts +1 -1
  74. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import { AudioCapture } from '../../audio/capture/capture';
2
2
  import { AudioPlayer, EventType } from '../../audio/playback/player';
3
3
  import { WavWriter } from '../../audio/impl/wavwriter';
4
- import { RecordingFile } from '../recording';
4
+ import { RecordingFile, RecordingFileUtils } from '../recording';
5
5
  import { Component, ViewChild, Inject, HostListener, Input } from "@angular/core";
6
6
  import { SessionService } from "./session.service";
7
7
  import { SPEECHRECORDER_CONFIG } from "../../spr.config";
@@ -13,8 +13,9 @@ import { Upload, UploaderStatus } from "../../net/uploader";
13
13
  import { UUID } from "../../utils/utils";
14
14
  import { LevelBar } from "../../audio/ui/livelevel";
15
15
  import { RecorderCombiPane } from "./recorder_combi_pane";
16
- import { BasicRecorder, LEVEL_BAR_INTERVALL_SECONDS, MAX_RECORDING_TIME_MS, RECFILE_API_CTX } from "./basicrecorder";
16
+ import { BasicRecorder, MAX_RECORDING_TIME_MS, RECFILE_API_CTX } from "./basicrecorder";
17
17
  import { RecorderComponent } from "../../recorder_component";
18
+ import { AudioDataHolder } from "../../audio/audio_data_holder";
18
19
  import * as i0 from "@angular/core";
19
20
  import * as i1 from "@angular/router";
20
21
  import * as i2 from "@angular/material/dialog";
@@ -42,15 +43,11 @@ export class Item {
42
43
  }
43
44
  export class AudioRecorder extends BasicRecorder {
44
45
  constructor(changeDetectorRef, renderer, route, dialog, sessionService, recFileService, uploader, config) {
45
- super(dialog, sessionService, uploader, config);
46
- this.changeDetectorRef = changeDetectorRef;
46
+ super(changeDetectorRef, dialog, sessionService, uploader, config);
47
47
  this.renderer = renderer;
48
48
  this.route = route;
49
- this.dialog = dialog;
50
- this.sessionService = sessionService;
51
49
  this.recFileService = recFileService;
52
50
  this.uploader = uploader;
53
- this.config = config;
54
51
  this._project = null;
55
52
  this.projectName = null;
56
53
  this.enableUploadRecordings = true;
@@ -233,13 +230,15 @@ export class AudioRecorder extends BasicRecorder {
233
230
  if (rfs) {
234
231
  if (rfs instanceof Array) {
235
232
  rfs.forEach((rf) => {
233
+ // the list comes from the server, asssuem all recording files as server persisted
234
+ rf.serverPersisted = true;
236
235
  if (rf.startedDate) {
237
236
  rf._startedAsDateObj = new Date(rf.startedDate);
238
237
  }
239
238
  if (rf.date) {
240
239
  rf._dateAsDateObj = new Date(rf.date);
241
240
  }
242
- this.recorderCombiPane.push(rf);
241
+ this.recorderCombiPane.addRecFile(rf);
243
242
  });
244
243
  }
245
244
  else {
@@ -293,6 +292,7 @@ export class AudioRecorder extends BasicRecorder {
293
292
  return this._project;
294
293
  }
295
294
  selectRecordingFile(rf) {
295
+ this.audioFetching = false;
296
296
  this.displayRecFile = rf;
297
297
  }
298
298
  uploadUpdate(ue) {
@@ -314,9 +314,6 @@ export class AudioRecorder extends BasicRecorder {
314
314
  this.changeDetectorRef.detectChanges();
315
315
  }
316
316
  set controlAudioPlayer(controlAudioPlayer) {
317
- if (this._controlAudioPlayer) {
318
- //this._controlAudioPlayer.listener=null;
319
- }
320
317
  this._controlAudioPlayer = controlAudioPlayer;
321
318
  if (this._controlAudioPlayer) {
322
319
  this._controlAudioPlayer.listener = this;
@@ -396,6 +393,7 @@ export class AudioRecorder extends BasicRecorder {
396
393
  this.displayAudioClip = null;
397
394
  this.showRecording();
398
395
  if (this.ac) {
396
+ this.audioFetching = false;
399
397
  if (!this.ac.opened) {
400
398
  if (this._selectedDeviceId) {
401
399
  console.log("Open session with audio device Id: \'" + this._selectedDeviceId + "\' for " + this._channelCount + " channels");
@@ -412,10 +410,10 @@ export class AudioRecorder extends BasicRecorder {
412
410
  }
413
411
  downloadRecording() {
414
412
  if (this.displayRecFile) {
415
- let ab = this.displayRecFile.audioBuffer;
413
+ let ab = this.displayRecFile.audioDataHolder;
416
414
  let ww = new WavWriter();
417
- if (ab) {
418
- let wavFile = ww.writeAsync(ab, (wavFile) => {
415
+ if (ab?.buffer) {
416
+ let wavFile = ww.writeAsync(ab.buffer, (wavFile) => {
419
417
  let blob = new Blob([wavFile], { type: 'audio/wav' });
420
418
  let rfUrl = URL.createObjectURL(blob);
421
419
  let dataDnlLnk = this.renderer.createElement('a');
@@ -438,35 +436,50 @@ export class AudioRecorder extends BasicRecorder {
438
436
  set displayRecFile(displayRecFile) {
439
437
  this._displayRecFile = displayRecFile;
440
438
  if (this._displayRecFile) {
441
- let ab = this._displayRecFile.audioBuffer;
442
- if (ab) {
443
- this.displayAudioClip = new AudioClip(ab);
439
+ let adh = this._displayRecFile.audioDataHolder;
440
+ if (adh) {
441
+ this.displayAudioClip = new AudioClip(adh);
442
+ console.debug(" set recording file: display audio clip set");
444
443
  this.controlAudioPlayer.audioClip = this.displayAudioClip;
445
444
  }
446
445
  else {
447
446
  // clear for now ...
448
447
  this.displayAudioClip = null;
448
+ console.debug("set recording file: display audio clip null");
449
449
  this.controlAudioPlayer.audioClip = null;
450
450
  if (this._controlAudioPlayer && this._session) {
451
451
  //... and try to fetch from server
452
- this.audioFetchSubscription = this.recFileService.fetchAndApplyRecordingFile(this._controlAudioPlayer.context, this._session.project, this._displayRecFile).subscribe((rf) => {
453
- let fab = null;
454
- if (rf && this._displayRecFile) {
455
- fab = this._displayRecFile.audioBuffer;
456
- }
457
- else {
458
- this.statusMsg = 'Recording file could not be loaded.';
452
+ this.audioFetching = true;
453
+ let rf = this._displayRecFile;
454
+ let clip = this.displayAudioClip;
455
+ this.audioFetchSubscription = this.recFileService.fetchRecordingFileAudioBuffer(this._controlAudioPlayer.context, this._session.project, rf).subscribe({
456
+ next: ab => {
457
+ this.audioFetching = false;
458
+ let fabDh = null;
459
+ if (ab) {
460
+ if (rf) {
461
+ fabDh = new AudioDataHolder(ab);
462
+ this.recorderCombiPane.setRecFileAudioData(rf, fabDh);
463
+ }
464
+ }
465
+ else {
466
+ console.error('Recording file could not be loaded.');
467
+ this.statusMsg = 'Recording file could not be loaded.';
468
+ this.statusAlertType = 'error';
469
+ }
470
+ if (fabDh) {
471
+ // 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
472
+ this.displayAudioClip = new AudioClip(fabDh);
473
+ //console.debug("set recording file: display audio clip from fetched audio buffer");
474
+ }
475
+ this.controlAudioPlayer.audioClip = this.displayAudioClip;
476
+ this.showRecording();
477
+ }, error: err => {
478
+ console.error("Could not load recording file from server: " + err);
479
+ this.audioFetching = false;
480
+ this.statusMsg = 'Recording file could not be loaded: ' + err;
459
481
  this.statusAlertType = 'error';
460
482
  }
461
- if (fab) {
462
- this.displayAudioClip = new AudioClip(fab);
463
- }
464
- this.controlAudioPlayer.audioClip = this.displayAudioClip;
465
- this.showRecording();
466
- }, err => {
467
- console.error("Could not load recording file from server: " + err);
468
- this.statusMsg = 'Recording file could not be loaded: ' + err;
469
- this.statusAlertType = 'error';
470
483
  });
471
484
  }
472
485
  else {
@@ -476,6 +489,7 @@ export class AudioRecorder extends BasicRecorder {
476
489
  }
477
490
  }
478
491
  else {
492
+ console.debug("recording file null");
479
493
  this.displayAudioClip = null;
480
494
  this.controlAudioPlayer.audioClip = null;
481
495
  }
@@ -484,25 +498,6 @@ export class AudioRecorder extends BasicRecorder {
484
498
  get displayRecFile() {
485
499
  return this._displayRecFile;
486
500
  }
487
- showRecording() {
488
- this.controlAudioPlayer.stop();
489
- if (this.displayAudioClip) {
490
- let dap = this.displayAudioClip;
491
- this.levelMeasure.calcBufferLevelInfos(dap.buffer, LEVEL_BAR_INTERVALL_SECONDS).then((levelInfos) => {
492
- dap.levelInfos = levelInfos;
493
- this.changeDetectorRef.detectChanges();
494
- });
495
- this.playStartAction.disabled = false;
496
- }
497
- else {
498
- this.playStartAction.disabled = true;
499
- // Collapse audio signal display if open
500
- if (!this.audioSignalCollapsed) {
501
- this.audioSignalCollapsed = true;
502
- }
503
- }
504
- this.changeDetectorRef.detectChanges();
505
- }
506
501
  updateStartActionDisableState() {
507
502
  this.transportActions.startAction.disabled = !(this.ac);
508
503
  }
@@ -546,6 +541,19 @@ export class AudioRecorder extends BasicRecorder {
546
541
  super.started();
547
542
  this.statusAlertType = 'info';
548
543
  this.statusMsg = 'Recording...';
544
+ if (!this.rfUuid) {
545
+ this.rfUuid = UUID.generate();
546
+ }
547
+ let sessId = 0;
548
+ if (this._session) {
549
+ sessId = this._session.sessionId;
550
+ }
551
+ let rf = new RecordingFile(this.rfUuid, sessId, null);
552
+ rf._startedAsDateObj = this.startedDate;
553
+ if (rf._startedAsDateObj) {
554
+ rf.startedDate = rf._startedAsDateObj.toString();
555
+ }
556
+ this._recordingFile = rf;
549
557
  let maxRecordingTimeMs = MAX_RECORDING_TIME_MS;
550
558
  this.maxRecTimerId = window.setTimeout(() => {
551
559
  this.stopRecordingMaxRec();
@@ -582,68 +590,75 @@ export class AudioRecorder extends BasicRecorder {
582
590
  this.transportActions.pauseAction.disabled = true;
583
591
  this.statusAlertType = 'info';
584
592
  this.statusMsg = 'Recorded.';
585
- let ad;
593
+ let ad = null;
594
+ let ada = null;
595
+ let adh = null;
596
+ let frameLen = 0;
586
597
  if (this.ac) {
587
- ad = this.ac.audioBuffer();
598
+ if (this.uploadChunkSizeSeconds || AudioRecorder.FORCE_ARRRAY_AUDIO_BUFFER) {
599
+ ada = this.ac.audioBufferArray();
600
+ frameLen = ada.frameLen;
601
+ }
602
+ else {
603
+ ad = this.ac.audioBuffer();
604
+ frameLen = ad.length;
605
+ }
606
+ adh = new AudioDataHolder(ad, ada);
588
607
  let sessId = 0;
589
608
  if (this._session) {
590
609
  sessId = this._session.sessionId;
591
610
  }
592
- if (!this.rfUuid) {
593
- this.rfUuid = UUID.generate();
594
- }
595
- let rf = new RecordingFile(this.rfUuid, sessId, ad);
596
- rf._startedAsDateObj = this.startedDate;
597
- if (rf._startedAsDateObj) {
598
- rf.startedDate = rf._startedAsDateObj.toString();
599
- }
600
- rf.frames = ad.length;
601
- this.displayRecFile = rf;
602
- this.recorderCombiPane.push(rf);
603
- // Upload if upload enabled and not in chunked upload mode
604
- if (this.enableUploadRecordings && !this.uploadChunkSizeSeconds) {
605
- let apiEndPoint = '';
606
- if (this.config && this.config.apiEndPoint) {
607
- apiEndPoint = this.config.apiEndPoint;
608
- }
609
- if (apiEndPoint !== '') {
610
- apiEndPoint = apiEndPoint + '/';
611
+ if (this._recordingFile) {
612
+ // Use an own reference since the writing of the wave file is asynchronous and this._recordingFile might already contain the next recording
613
+ let rf = this._recordingFile;
614
+ RecordingFileUtils.setAudioData(rf, adh);
615
+ this.recorderCombiPane.addRecFile(rf);
616
+ // Upload if upload enabled and not in chunked upload mode
617
+ if (this.enableUploadRecordings && !this.uploadChunkSizeSeconds && rf != null && ad != null) {
618
+ let apiEndPoint = '';
619
+ if (this.config && this.config.apiEndPoint) {
620
+ apiEndPoint = this.config.apiEndPoint;
621
+ }
622
+ if (apiEndPoint !== '') {
623
+ apiEndPoint = apiEndPoint + '/';
624
+ }
625
+ let sessionsUrl = apiEndPoint + SessionService.SESSION_API_CTX;
626
+ let recUrl = sessionsUrl + '/' + rf.session + '/' + RECFILE_API_CTX + '/' + rf.uuid;
627
+ // convert asynchronously to 16-bit integer PCM
628
+ // TODO could we avoid conversion to save CPU resources and transfer float PCM directly?
629
+ // TODO duplicate conversion for manual download
630
+ this.processingRecording = true;
631
+ let ww = new WavWriter();
632
+ ww.writeAsync(ad, (wavFile) => {
633
+ this.postRecordingMultipart(wavFile, recUrl, rf);
634
+ this.processingRecording = false;
635
+ this.updateWakeLock();
636
+ this.changeDetectorRef.detectChanges();
637
+ });
611
638
  }
612
- let sessionsUrl = apiEndPoint + SessionService.SESSION_API_CTX;
613
- let recUrl = sessionsUrl + '/' + rf.session + '/' + RECFILE_API_CTX + '/' + rf.uuid;
614
- // convert asynchronously to 16-bit integer PCM
615
- // TODO could we avoid conversion to save CPU resources and transfer float PCM directly?
616
- // TODO duplicate conversion for manual download
617
- this.processingRecording = true;
618
- let ww = new WavWriter();
619
- ww.writeAsync(ad, (wavFile) => {
620
- this.postRecordingMultipart(wavFile, rf.uuid, rf.session, rf._startedAsDateObj, recUrl);
621
- this.processingRecording = false;
622
- this.updateWakeLock();
623
- this.changeDetectorRef.detectChanges();
624
- });
625
639
  }
626
640
  }
641
+ this.displayRecFile = this._recordingFile;
627
642
  this.status = 1 /* IDLE */;
628
643
  this.navigationDisabled = false;
629
644
  this.updateNavigationActions();
630
645
  this.updateWakeLock();
631
646
  this.changeDetectorRef.detectChanges();
632
647
  }
633
- postRecordingMultipart(wavFile, uuid, sessionId, startedDate, recUrl) {
648
+ postRecordingMultipart(wavFile, recUrl, rf) {
634
649
  let wavBlob = new Blob([wavFile], { type: 'audio/wav' });
635
650
  let fd = new FormData();
636
- if (uuid) {
637
- fd.set('uuid', uuid);
651
+ if (rf.uuid) {
652
+ fd.set('uuid', rf.uuid);
638
653
  }
639
- if (sessionId !== null) {
640
- fd.set('sessionId', sessionId.toString());
654
+ if (rf.session !== null) {
655
+ fd.set('sessionId', rf.session.toString());
641
656
  }
642
- if (startedDate) {
643
- fd.set('startedDate', startedDate.toJSON());
657
+ if (rf._startedAsDateObj) {
658
+ fd.set('startedDate', rf._startedAsDateObj.toJSON());
644
659
  }
645
660
  fd.set('audio', wavBlob);
646
- let ul = new Upload(fd, recUrl);
661
+ let ul = new Upload(fd, recUrl, rf);
647
662
  this.uploader.queueUpload(ul);
648
663
  }
649
664
  postChunkAudioBuffer(audioBuffer, chunkIdx) {
@@ -659,8 +674,9 @@ export class AudioRecorder extends BasicRecorder {
659
674
  }
660
675
  let sessionsUrl = apiEndPoint + SessionService.SESSION_API_CTX;
661
676
  let recUrl = sessionsUrl + '/' + this.session?.sessionId + '/' + RECFILE_API_CTX + '/' + this.rfUuid + '/' + chunkIdx;
677
+ let rf = this._recordingFile;
662
678
  ww.writeAsync(audioBuffer, (wavFile) => {
663
- this.postRecording(wavFile, recUrl);
679
+ this.postRecording(wavFile, recUrl, rf);
664
680
  this.processingRecording = false;
665
681
  });
666
682
  }
@@ -709,11 +725,11 @@ AudioRecorder.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version:
709
725
 
710
726
  <div fxLayout="row" fxLayout.xs="column" [ngStyle]="{'height.px':100,'min-height.px': 100}"
711
727
  [ngStyle.xs]="{'height.px':125,'min-height.px': 125}">
712
- <audio-levelbar fxFlex="1 0 1" [streamingMode]="isRecording()"
728
+ <audio-levelbar fxFlex="1 0 1" [streamingMode]="isRecording()" [stateLoading]="audioFetching"
713
729
  [displayLevelInfos]="displayAudioClip?.levelInfos"></audio-levelbar>
714
730
  <div fxLayout="row">
715
731
  <spr-recordingitemcontrols fxFlex="10 0 1"
716
- [audioLoaded]="displayAudioClip?.buffer!==null"
732
+ [audioLoaded]="displayAudioClip?.audioDataHolder!==null"
717
733
  [playStartAction]="controlAudioPlayer?.startAction"
718
734
  [playStopAction]="controlAudioPlayer?.stopAction"
719
735
  [peakDbLvl]="peakLevelInDb"
@@ -752,7 +768,7 @@ AudioRecorder.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version:
752
768
  [ready]="dataSaved && !isActive()"></app-readystateindicator>
753
769
  </div>
754
770
  </div>
755
- `, 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"], components: [{ type: i6.WarningBar, selector: "app-warningbar", inputs: ["warningText", "show"] }, { type: i7.RecorderCombiPane, selector: "app-recordercombipane", inputs: ["selectDisabled", "selectedRecordingFile", "audioSignalCollapsed", "displayAudioClip", "playStartAction", "playSelectionAction", "autoPlayOnSelectToggleAction", "playStopAction"], outputs: ["selectedRecordingFileChanged"] }, { type: i8.LevelBar, selector: "audio-levelbar", inputs: ["streamingMode", "displayLevelInfos"] }, { type: i9.RecordingItemControls, selector: "spr-recordingitemcontrols", inputs: ["audioSignalCollapsed", "enableDownload", "peakDbLvl", "agc", "audioLoaded", "playStartAction", "playStopAction", "displayLevelInfos"], outputs: ["onShowRecordingDetails", "onDownloadRecording"] }, { type: i10.UploadStatus, selector: "app-uploadstatus", inputs: ["value", "awaitNewUpload", "status"] }, { type: i10.WakeLockIndicator, selector: "app-wakelockindicator", inputs: ["screenLocked"] }, { type: i10.ReadyStateIndicator, selector: "app-readystateindicator", inputs: ["ready"] }, { type: i10.StatusDisplay, selector: "app-sprstatusdisplay", inputs: ["statusAlertType", "statusMsg", "statusWaiting"] }, { type: i11.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"] }, { type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i13.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i14.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { type: i15.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i13.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i15.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i14.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }] });
771
+ `, 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"], components: [{ type: i6.WarningBar, selector: "app-warningbar", inputs: ["warningText", "show"] }, { type: i7.RecorderCombiPane, selector: "app-recordercombipane", inputs: ["selectDisabled", "selectedRecordingFile", "audioSignalCollapsed", "displayAudioClip", "playStartAction", "playSelectionAction", "autoPlayOnSelectToggleAction", "playStopAction"], outputs: ["selectedRecordingFileChanged"] }, { type: i8.LevelBar, selector: "audio-levelbar", inputs: ["streamingMode", "displayLevelInfos", "stateLoading"] }, { type: i9.RecordingItemControls, selector: "spr-recordingitemcontrols", inputs: ["audioSignalCollapsed", "enableDownload", "peakDbLvl", "agc", "audioLoaded", "playStartAction", "playStopAction", "displayLevelInfos"], outputs: ["onShowRecordingDetails", "onDownloadRecording"] }, { type: i10.UploadStatus, selector: "app-uploadstatus", inputs: ["value", "awaitNewUpload", "status"] }, { type: i10.WakeLockIndicator, selector: "app-wakelockindicator", inputs: ["screenLocked"] }, { type: i10.ReadyStateIndicator, selector: "app-readystateindicator", inputs: ["ready"] }, { type: i10.StatusDisplay, selector: "app-sprstatusdisplay", inputs: ["statusAlertType", "statusMsg", "statusWaiting"] }, { type: i11.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"] }, { type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i13.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i14.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { type: i15.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i13.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i15.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i14.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }] });
756
772
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AudioRecorder, decorators: [{
757
773
  type: Component,
758
774
  args: [{
@@ -775,11 +791,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
775
791
 
776
792
  <div fxLayout="row" fxLayout.xs="column" [ngStyle]="{'height.px':100,'min-height.px': 100}"
777
793
  [ngStyle.xs]="{'height.px':125,'min-height.px': 125}">
778
- <audio-levelbar fxFlex="1 0 1" [streamingMode]="isRecording()"
794
+ <audio-levelbar fxFlex="1 0 1" [streamingMode]="isRecording()" [stateLoading]="audioFetching"
779
795
  [displayLevelInfos]="displayAudioClip?.levelInfos"></audio-levelbar>
780
796
  <div fxLayout="row">
781
797
  <spr-recordingitemcontrols fxFlex="10 0 1"
782
- [audioLoaded]="displayAudioClip?.buffer!==null"
798
+ [audioLoaded]="displayAudioClip?.audioDataHolder!==null"
783
799
  [playStartAction]="controlAudioPlayer?.startAction"
784
800
  [playStopAction]="controlAudioPlayer?.stopAction"
785
801
  [peakDbLvl]="peakLevelInDb"
@@ -1025,4 +1041,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
1025
1041
  type: ViewChild,
1026
1042
  args: [AudioRecorder, { static: true }]
1027
1043
  }] } });
1028
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9yZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9zcGVlY2hyZWNvcmRlci9zZXNzaW9uL2F1ZGlvcmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBdUIsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQUMsV0FBVyxFQUFvQixTQUFTLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQTtBQUNwRixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sNEJBQTRCLENBQUE7QUFDcEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUMxQyxPQUFPLEVBQ0wsU0FBUyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxFQUNoQyxZQUFZLEVBQWEsS0FBSyxFQUM5QyxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHakQsT0FBTyxFQUFDLHFCQUFxQixFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBRTdFLE9BQU8sRUFBVyxXQUFXLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFHdEQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRWhELE9BQU8sRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUE0QixNQUFNLG9CQUFvQixDQUFDO0FBR3JGLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUN2QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDbEQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFD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RSxDQUFBO0lBQ3hDLENBQUM7SUFHRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUM5QyxDQUFDOztvSEE5SVUsc0JBQXNCO3dHQUF0QixzQkFBc0IsaURBZHRCLENBQUMsY0FBYyxDQUFDLDhEQXdCaEIsYUFBYSxxRkF2QmQ7O0dBRVQsZ0lBeHVCVSxhQUFhOzRGQW12QmIsc0JBQXNCO2tCQWhCbEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsd0JBQXdCO29CQUNsQyxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUM7b0JBQzNCLFFBQVEsRUFBRTs7R0FFVDtvQkFDRCxNQUFNLEVBQUUsQ0FBQzs7Ozs7OztJQU9QLENBQUM7aUJBRUo7aVJBVzZDLEVBQUU7c0JBQTdDLFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXVkaW9DYXB0dXJlLCBBdWRpb0NhcHR1cmVMaXN0ZW5lcn0gZnJvbSAnLi4vLi4vYXVkaW8vY2FwdHVyZS9jYXB0dXJlJztcclxuaW1wb3J0IHtBdWRpb1BsYXllciwgQXVkaW9QbGF5ZXJFdmVudCwgRXZlbnRUeXBlfSBmcm9tICcuLi8uLi9hdWRpby9wbGF5YmFjay9wbGF5ZXInXHJcbmltcG9ydCB7V2F2V3JpdGVyfSBmcm9tICcuLi8uLi9hdWRpby9pbXBsL3dhdndyaXRlcidcclxuaW1wb3J0IHtSZWNvcmRpbmdGaWxlfSBmcm9tICcuLi9yZWNvcmRpbmcnXHJcbmltcG9ydCB7XHJcbiAgQ29tcG9uZW50LCBWaWV3Q2hpbGQsIENoYW5nZURldGVjdG9yUmVmLCBJbmplY3QsXHJcbiAgQWZ0ZXJWaWV3SW5pdCwgSG9zdExpc3RlbmVyLCBPbkRlc3Ryb3ksIElucHV0LCBSZW5kZXJlcjIsIE9uSW5pdCwgSW5qZWN0b3JcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1Nlc3Npb25TZXJ2aWNlfSBmcm9tIFwiLi9zZXNzaW9uLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xyXG5pbXBvcnQge1NwZWVjaFJlY29yZGVyVXBsb2FkZXJ9IGZyb20gXCIuLi9zcHJ1cGxvYWRlclwiO1xyXG5pbXBvcnQge1NQRUVDSFJFQ09SREVSX0NPTkZJRywgU3BlZWNoUmVjb3JkZXJDb25maWd9IGZyb20gXCIuLi8uLi9zcHIuY29uZmlnXCI7XHJcbmltcG9ydCB7U2Vzc2lvbn0gZnJvbSBcIi4vc2Vzc2lvblwiO1xyXG5pbXBvcnQgeyBQcm9qZWN0LCBQcm9qZWN0VXRpbH0gZnJvbSBcIi4uL3Byb2plY3QvcHJvamVjdFwiO1xyXG5pbXBvcnQge01lc3NhZ2VEaWFsb2d9IGZyb20gXCIuLi8uLi91aS9tZXNzYWdlX2RpYWxvZ1wiO1xyXG5pbXBvcnQge1JlY29yZGluZ1NlcnZpY2V9IGZyb20gXCIuLi9yZWNvcmRpbmdzL3JlY29yZGluZ3Muc2VydmljZVwiO1xyXG5cclxuaW1wb3J0IHtBdWRpb0NvbnRleHRQcm92aWRlcn0gZnJvbSBcIi4uLy4uL2F1ZGlvL2NvbnRleHRcIjtcclxuaW1wb3J0IHtBdWRpb0NsaXB9IGZyb20gXCIuLi8uLi9hdWRpby9wZXJzaXN0b3JcIjtcclxuXHJcbmltcG9ydCB7VXBsb2FkLCBVcGxvYWRlclN0YXR1cywgVXBsb2FkZXJTdGF0dXNDaGFuZ2VFdmVudH0gZnJvbSBcIi4uLy4uL25ldC91cGxvYWRlclwiO1xyXG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlLCBQYXJhbXMsIFJvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge1Byb2plY3RTZXJ2aWNlfSBmcm9tIFwiLi4vcHJvamVjdC9wcm9qZWN0LnNlcnZpY2VcIjtcclxuaW1wb3J0IHtVVUlEfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcclxuaW1wb3J0IHtMZXZlbEJhcn0gZnJvbSBcIi4uLy4uL2F1ZGlvL3VpL2xpdmVsZXZlbFwiO1xyXG5pbXBvcnQge1JlY29yZGVyQ29tYmlQYW5lfSBmcm9tIFwiLi9yZWNvcmRlcl9jb21iaV9wYW5lXCI7XHJcbmltcG9ydCB7QmFzaWNSZWNvcmRlciwgTEVWRUxfQkFSX0lOVEVSVkFMTF9TRUNPTkRTLCBNQVhfUkVDT1JESU5HX1RJTUVfTVMsIFJFQ0ZJTEVfQVBJX0NUWH0gZnJvbSBcIi4vYmFzaWNyZWNvcmRlclwiO1xyXG5pbXBvcnQge1JlYWR5U3RhdGVQcm92aWRlciwgUmVjb3JkZXJDb21wb25lbnR9IGZyb20gXCIuLi8uLi9yZWNvcmRlcl9jb21wb25lbnRcIjtcclxuaW1wb3J0IHtNb2RlfSBmcm9tIFwiLi4vLi4vc3BlZWNocmVjb3JkZXJuZy5jb21wb25lbnRcIjtcclxuXHJcblxyXG5leHBvcnQgY29uc3QgZW51bSBTdGF0dXMge1xyXG4gIEJMT0NLRUQsIElETEUsU1RBUlRJTkcsIFJFQ09SRElORywgIFNUT1BQSU5HX1NUT1AsIEVSUk9SXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBJdGVtIHtcclxuICBwcm9tcHRBc1N0cmluZzogc3RyaW5nO1xyXG4gIHRyYWluaW5nOiBib29sZWFuO1xyXG4gIHJlY3M6IEFycmF5PFJlY29yZGluZ0ZpbGU+IHwgbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvbXB0QXNTdHJpbmc6IHN0cmluZywgdHJhaW5pbmc6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMucHJvbXB0QXNTdHJpbmcgPSBwcm9tcHRBc1N0cmluZztcclxuICAgIHRoaXMudHJhaW5pbmcgPSB0cmFpbmluZztcclxuICAgIHRoaXMucmVjcyA9IG51bGw7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtYXVkaW9yZWNvcmRlcicsXHJcbiAgcHJvdmlkZXJzOiBbU2Vzc2lvblNlcnZpY2VdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8YXBwLXdhcm5pbmdiYXIgW3Nob3ddPVwiaXNUZXN0U2Vzc2lvbigpXCIgd2FybmluZ1RleHQ9XCJUZXN0IHJlY29yZGluZyBvbmx5IVwiPjwvYXBwLXdhcm5pbmdiYXI+XHJcbiAgICA8YXBwLXdhcm5pbmdiYXIgW3Nob3ddPVwiaXNEZWZhdWx0QXVkaW9UZXN0U2Vzc2lvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICB3YXJuaW5nVGV4dD1cIlRoaXMgdGVzdCB1c2VzIGRlZmF1bHQgYXVkaW8gZGV2aWNlISBSZWd1bGFyIHNlc3Npb25zIG1heSByZXF1aXJlIGEgcGFydGljdWxhciBhdWRpbyBkZXZpY2UgKG1pY3JvcGhvbmUpIVwiPjwvYXBwLXdhcm5pbmdiYXI+XHJcbiAgICA8YXBwLXJlY29yZGVyY29tYmlwYW5lIChzZWxlY3RlZFJlY29yZGluZ0ZpbGVDaGFuZ2VkKT1cInNlbGVjdFJlY29yZGluZ0ZpbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdWRpb1NpZ25hbENvbGxhcHNlZF09XCJhdWRpb1NpZ25hbENvbGxhcHNlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZFJlY29yZGluZ0ZpbGVdPVwiZGlzcGxheVJlY0ZpbGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0RGlzYWJsZWRdPVwiaXNBY3RpdmUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5QXVkaW9DbGlwXT1cImRpc3BsYXlBdWRpb0NsaXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxheVN0YXJ0QWN0aW9uXT1cImNvbnRyb2xBdWRpb1BsYXllci5zdGFydEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RvcEFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXIuc3RvcEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U2VsZWN0aW9uQWN0aW9uXT1cImNvbnRyb2xBdWRpb1BsYXllci5zdGFydFNlbGVjdGlvbkFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvUGxheU9uU2VsZWN0VG9nZ2xlQWN0aW9uXT1cImNvbnRyb2xBdWRpb1BsYXllci5hdXRvUGxheU9uU2VsZWN0VG9nZ2xlQWN0aW9uXCJcclxuICAgID48L2FwcC1yZWNvcmRlcmNvbWJpcGFuZT5cclxuXHJcbiAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXQueHM9XCJjb2x1bW5cIiBbbmdTdHlsZV09XCJ7J2hlaWdodC5weCc6MTAwLCdtaW4taGVpZ2h0LnB4JzogMTAwfVwiXHJcbiAgICAgICAgIFtuZ1N0eWxlLnhzXT1cInsnaGVpZ2h0LnB4JzoxMjUsJ21pbi1oZWlnaHQucHgnOiAxMjV9XCI+XHJcbiAgICAgIDxhdWRpby1sZXZlbGJhciBmeEZsZXg9XCIxIDAgMVwiIFtzdHJlYW1pbmdNb2RlXT1cImlzUmVjb3JkaW5nKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlMZXZlbEluZm9zXT1cImRpc3BsYXlBdWRpb0NsaXA/LmxldmVsSW5mb3NcIj48L2F1ZGlvLWxldmVsYmFyPlxyXG4gICAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCI+XHJcbiAgICAgICAgPHNwci1yZWNvcmRpbmdpdGVtY29udHJvbHMgZnhGbGV4PVwiMTAgMCAxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXVkaW9Mb2FkZWRdPVwiZGlzcGxheUF1ZGlvQ2xpcD8uYnVmZmVyIT09bnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdGFydEFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXI/LnN0YXJ0QWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxheVN0b3BBY3Rpb25dPVwiY29udHJvbEF1ZGlvUGxheWVyPy5zdG9wQWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGVha0RiTHZsXT1cInBlYWtMZXZlbEluRGJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthZ2NdPVwidGhpcy5hYz8uYWdjU3RhdHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TaG93UmVjb3JkaW5nRGV0YWlscyk9XCJhdWRpb1NpZ25hbENvbGxhcHNlZD0hYXVkaW9TaWduYWxDb2xsYXBzZWRcIj5cclxuICAgICAgICA8L3Nwci1yZWNvcmRpbmdpdGVtY29udHJvbHM+XHJcblxyXG4gICAgICAgIDxhcHAtdXBsb2Fkc3RhdHVzIGNsYXNzPVwicmljb250cm9scyBkYXJrXCIgZnhIaWRlIGZ4U2hvdy54cyBmeEZsZXg9XCIwIDAgMFwiICpuZ0lmPVwiZW5hYmxlVXBsb2FkUmVjb3JkaW5nc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInVwbG9hZFByb2dyZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RhdHVzXT1cInVwbG9hZFN0YXR1c1wiIFthd2FpdE5ld1VwbG9hZF09XCJwcm9jZXNzaW5nUmVjb3JkaW5nXCI+PC9hcHAtdXBsb2Fkc3RhdHVzPlxyXG4gICAgICAgIDxhcHAtd2FrZWxvY2tpbmRpY2F0b3IgY2xhc3M9XCJyaWNvbnRyb2xzIGRhcmtcIiBmeEhpZGUgZnhTaG93LnhzIGZ4RmxleD1cIjAgMCAwXCIgW3NjcmVlbkxvY2tlZF09XCJzY3JlZW5Mb2NrZWRcIj48L2FwcC13YWtlbG9ja2luZGljYXRvcj5cclxuICAgICAgICA8YXBwLXJlYWR5c3RhdGVpbmRpY2F0b3IgY2xhc3M9XCJyaWNvbnRyb2xzIGRhcmtcIiBmeEhpZGUgZnhTaG93LnhzIGZ4RmxleD1cIjAgMCAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWR5XT1cImRhdGFTYXZlZCAmJiAhaXNBY3RpdmUoKVwiPjwvYXBwLXJlYWR5c3RhdGVpbmRpY2F0b3I+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICNjb250cm9scGFuZWwgY2xhc3M9XCJjb250cm9scGFuZWxcIiBmeExheW91dD1cInJvd1wiPlxyXG4gICAgICA8YXBwLXNwcnN0YXR1c2Rpc3BsYXkgZnhIaWRlLnhzIGZ4RmxleD1cIjMwJSAxIDMwJVwiIFtzdGF0dXNNc2ddPVwic3RhdHVzTXNnXCIgW3N0YXR1c0FsZXJ0VHlwZV09XCJzdGF0dXNBbGVydFR5cGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0YXR1c1dhaXRpbmddPVwic3RhdHVzV2FpdGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhpZGRlbi14c1wiPjwvYXBwLXNwcnN0YXR1c2Rpc3BsYXk+XHJcbiAgICAgIDxkaXYgZnhGbGV4PVwiMTAwJSAwIDEwMCVcIiBjbGFzcz1cInN0YXJ0c3RvcFwiPlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJhbGlnbi1jb250ZW50OiBjZW50ZXJcIj5cclxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInN0YXJ0U3RvcFBlcmZvcm0oKVwiIFtkaXNhYmxlZF09XCJzdGFydERpc2FibGVkKCkgJiYgc3RvcERpc2FibGVkKClcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjbGFzcz1cImJpZ2J1dHRvblwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gW3N0eWxlLmNvbG9yXT1cInN0YXJ0U3RvcE5leHRJY29uQ29sb3IoKVwiIGlubGluZT1cInRydWVcIj57e3N0YXJ0U3RvcE5leHRJY29uTmFtZSgpfX08L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiBib2xkZXI7Zm9udC1zaXplOiAxNHB4XCI+e3tzdGFydFN0b3BOZXh0TmFtZSgpfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgZnhGbGV4PVwiMzAlIDEgMzAlXCIgPlxyXG4gICAgICAgIDxkaXYgZnhGbGV4PVwiMSAxIGF1dG9cIj48L2Rpdj5cclxuXHJcbiAgICAgICAgPGFwcC11cGxvYWRzdGF0dXMgY2xhc3M9XCJyaWNvbnRyb2xzXCIgZnhIaWRlLnhzIGZ4RmxleD1cIjAgMCAwXCIgKm5nSWY9XCJlbmFibGVVcGxvYWRSZWNvcmRpbmdzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidXBsb2FkUHJvZ3Jlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGF0dXNdPVwidXBsb2FkU3RhdHVzXCIgW2F3YWl0TmV3VXBsb2FkXT1cInByb2Nlc3NpbmdSZWNvcmRpbmdcIj48L2FwcC11cGxvYWRzdGF0dXM+XHJcbiAgICAgICAgPGFwcC13YWtlbG9ja2luZGljYXRvciBjbGFzcz1cInJpY29udHJvbHNcIiBmeEhpZGUueHMgW3NjcmVlbkxvY2tlZF09XCJzY3JlZW5Mb2NrZWRcIj48L2FwcC13YWtlbG9ja2luZGljYXRvcj5cclxuICAgICAgICA8YXBwLXJlYWR5c3RhdGVpbmRpY2F0b3IgY2xhc3M9XCJyaWNvbnRyb2xzXCIgZnhIaWRlLnhzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkeV09XCJkYXRhU2F2ZWQgJiYgIWlzQWN0aXZlKClcIj48L2FwcC1yZWFkeXN0YXRlaW5kaWNhdG9yPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IHtcclxuICAgIGZsZXg6IDI7XHJcbiAgICBiYWNrZ3JvdW5kOiBsaWdodGdyZXk7XHJcbiAgICBkaXNwbGF5OiBmbGV4OyAvKiBWZXJ0aWNhbCBmbGV4IGNvbnRhaW5lcjogQm90dG9tIHRyYW5zcG9ydCBwYW5lbCwgYWJvdmUgcHJvbXB0aW5nIHBhbmVsICovXHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIG1pbi1oZWlnaHQ6IDBweDtcclxuICAgICAgLyogUHJldmVudHMgaG9yaXpvbnRhbCBzY3JvbGwgYmFyIG9uIHN3aXBlIHJpZ2h0ICovXHJcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfWAsYC5yaWNvbnRyb2xzIHtcclxuICAgICAgICBwYWRkaW5nOiA0cHg7XHJcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICB9YCxgLmRhcmsge1xyXG4gICAgYmFja2dyb3VuZDogZGFya2dyYXk7XHJcbiAgfWAsYC5jb250cm9scGFuZWwge1xyXG4gICAgYWxpZ24tY29udGVudDogY2VudGVyO1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDIwcHg7XHJcbiAgICBtaW4taGVpZ2h0OiBtaW4tY29udGVudDsgLyogaW1wb3J0YW50ICovXHJcbiAgfWAsYC5zdGFydHN0b3Age1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIH1gLGAuYmlnYnV0dG9uIHtcclxuICAgIG1pbi13aWR0aDogNzBweDtcclxuICAgIG1pbi1oZWlnaHQ6IDUwcHg7XHJcbiAgICBmb250LXNpemU6IDUwcHg7XHJcbiAgICBib3JkZXItcmFkaXVzOiAyMHB4O1xyXG4gIH1gXHJcbiAgIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEF1ZGlvUmVjb3JkZXIgZXh0ZW5kcyBCYXNpY1JlY29yZGVyIGltcGxlbWVudHMgT25Jbml0LEFmdGVyVmlld0luaXQsT25EZXN0cm95LCBBdWRpb0NhcHR1cmVMaXN0ZW5lcixSZWFkeVN0YXRlUHJvdmlkZXIge1xyXG5cclxuICBfcHJvamVjdDpQcm9qZWN0fHVuZGVmaW5lZHwgbnVsbD1udWxsO1xyXG4gIEBJbnB1dCgpIHByb2plY3ROYW1lOnN0cmluZ3x1bmRlZmluZWR8bnVsbD1udWxsO1xyXG4gIGVuYWJsZVVwbG9hZFJlY29yZGluZ3M6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGVuYWJsZURvd25sb2FkUmVjb3JkaW5nczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHN0YXR1czogU3RhdHVzID0gU3RhdHVzLkJMT0NLRUQ7XHJcblxyXG4gIEBWaWV3Q2hpbGQoUmVjb3JkZXJDb21iaVBhbmUsIHsgc3RhdGljOiB0cnVlIH0pIHJlY29yZGVyQ29tYmlQYW5lITogUmVjb3JkZXJDb21iaVBhbmU7XHJcbiAgQFZpZXdDaGlsZChMZXZlbEJhciwgeyBzdGF0aWM6IHRydWUgfSkgbGl2ZUxldmVsRGlzcGxheSE6IExldmVsQmFyO1xyXG5cclxuICBASW5wdXQoKSBkYXRhU2F2ZWQ9dHJ1ZVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBtYXhSZWNUaW1lcklkOiBudW1iZXJ8bnVsbD1udWxsO1xyXG4gIHByaXZhdGUgbWF4UmVjVGltZXJSdW5uaW5nOiBib29sZWFuPWZhbHNlO1xyXG4gIHByaXZhdGUgdXBkYXRlVGltZXJJZDogYW55O1xyXG5cclxuICBzdGFydFN0b3BOZXh0QnV0dG9uTmFtZSE6c3RyaW5nO1xyXG4gIHN0YXJ0U3RvcE5leHRCdXR0b25JY29uTmFtZSE6c3RyaW5nO1xyXG5cclxuICBhdWRpbzogYW55O1xyXG5cclxuICBwcml2YXRlIF9wcm9tcHRJbmRleDpudW1iZXJ8bnVsbD1udWxsO1xyXG5cclxuICAvL2l0ZW1zOiBBcnJheTxJdGVtPnxudWxsPW51bGw7XHJcbiAgLy9zZWxlY3RlZEl0ZW1JZHg6IG51bWJlcjtcclxuICBwcml2YXRlIF9kaXNwbGF5UmVjRmlsZTogUmVjb3JkaW5nRmlsZSB8IG51bGw9bnVsbDtcclxuICBwcml2YXRlIGRpc3BsYXlSZWNGaWxlVmVyc2lvbjogbnVtYmVyPTA7XHJcblxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgICAgICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBzZXNzaW9uU2VydmljZTpTZXNzaW9uU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIHJlY0ZpbGVTZXJ2aWNlOlJlY29yZGluZ1NlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHVwbG9hZGVyOiBTcGVlY2hSZWNvcmRlclVwbG9hZGVyLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoU1BFRUNIUkVDT1JERVJfQ09ORklHKSBwdWJsaWMgY29uZmlnPzogU3BlZWNoUmVjb3JkZXJDb25maWcpIHtcclxuICAgIHN1cGVyKGRpYWxvZyxzZXNzaW9uU2VydmljZSx1cGxvYWRlcixjb25maWcpO1xyXG5cclxuICAgIC8vc3VwZXIoaW5qZWN0b3IpO1xyXG4gICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuSURMRTtcclxuXHJcbiAgICB0aGlzLmF1ZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGlvJyk7XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmVuYWJsZVVwbG9hZFJlY29yZGluZ3MgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmVuYWJsZVVwbG9hZFJlY29yZGluZ3MgPSB0aGlzLmNvbmZpZy5lbmFibGVVcGxvYWRSZWNvcmRpbmdzO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmVuYWJsZURvd25sb2FkUmVjb3JkaW5ncyAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuZW5hYmxlRG93bmxvYWRSZWNvcmRpbmdzID0gdGhpcy5jb25maWcuZW5hYmxlRG93bmxvYWRSZWNvcmRpbmdzO1xyXG4gICAgfVxyXG4gICAgLy90aGlzLmluaXQoKTtcclxuICB9XHJcblxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcblxyXG4gICAgdGhpcy5zdHJlYW1MZXZlbE1lYXN1cmUubGV2ZWxMaXN0ZW5lciA9IHRoaXMubGl2ZUxldmVsRGlzcGxheTtcclxuICAgIHRoaXMuc3RyZWFtTGV2ZWxNZWFzdXJlLnBlYWtMZXZlbExpc3RlbmVyPShwZWFrTHZsSW5EYik9PntcclxuICAgICAgdGhpcy5wZWFrTGV2ZWxJbkRiPXBlYWtMdmxJbkRiO1xyXG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICAgIC8vbGV0IHdha2VMb2NrU3VwcD0oJ3dha2VMb2NrJyBpbiBuYXZpZ2F0b3IpO1xyXG4gICAgLy9hbGVydCgnV2FrZSBsb2NrIEFQSSBzdXBwb3J0ZWQ6ICcrd2FrZUxvY2tTdXBwKTtcclxuICB9XHJcblxyXG4gIHJlYWR5KCk6Ym9vbGVhbntcclxuICAgIHJldHVybiB0aGlzLmRhdGFTYXZlZCAmJiAhdGhpcy5pc0FjdGl2ZSgpXHJcbiAgfVxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgIHRoaXMuZGlzYWJsZVdha2VMb2NrQ29uZCgpO1xyXG4gICAgICAgdGhpcy5kZXN0cm95ZWQ9dHJ1ZTtcclxuICAgICAgIC8vIFRPRE8gc3RvcCBjYXB0dXJlIC9wbGF5YmFja1xyXG4gICAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgIGxldCBjb250ZXh0OkF1ZGlvQ29udGV4dHxudWxsPW51bGw7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb250ZXh0ID0gQXVkaW9Db250ZXh0UHJvdmlkZXIuYXVkaW9Db250ZXh0SW5zdGFuY2UoKVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLkVSUk9SO1xyXG4gICAgICBsZXQgZXJyTXNnID0gJ1Vua25vd24gZXJyb3InO1xyXG4gICAgICBpZihlcnIgaW5zdGFuY2VvZiBFcnJvcil7XHJcbiAgICAgICAgZXJyTXNnPWVyci5tZXNzYWdlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ0VSUk9SOiAnICsgZXJyTXNnO1xyXG4gICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcic7XHJcbiAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTWVzc2FnZURpYWxvZywge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgICB0aXRsZTogJ0Vycm9yJyxcclxuICAgICAgICAgIG1zZzogZXJyTXNnLFxyXG4gICAgICAgICAgYWR2aXNlOiAnUGxlYXNlIHVzZSBhIHN1cHBvcnRlZCBicm93c2VyLicsXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYoY29udGV4dCkge1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJTdGF0ZSBvZiBhdWRpbyBjb250ZXh0OiBcIiArIGNvbnRleHQuc3RhdGUpXHJcbiAgICB9ZWxzZXtcclxuICAgICAgY29uc29sZS5pbmZvKFwiTm8gYXVkaW8gY29udGV4dCBhdmFpbGFibGUhXCIpO1xyXG4gICAgfVxyXG4gICAgaWYgKCFjb250ZXh0IHx8ICFuYXZpZ2F0b3IubWVkaWFEZXZpY2VzKSB7XHJcbiAgICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLkVSUk9SO1xyXG4gICAgICBsZXQgZXJyTXNnID0gJ0Jyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBNZWRpYSBzdHJlYW1zISc7XHJcbiAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ0VSUk9SOiAnICsgZXJyTXNnO1xyXG4gICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcic7XHJcbiAgICAgIHRoaXMuZGlhbG9nLm9wZW4oTWVzc2FnZURpYWxvZywge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgICB0aXRsZTogJ0Vycm9yJyxcclxuICAgICAgICAgIG1zZzogZXJyTXNnLFxyXG4gICAgICAgICAgYWR2aXNlOiAnUGxlYXNlIHVzZSBhIHN1cHBvcnRlZCBicm93c2VyLicsXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy90aGlzLmNvbnRyb2xBdWRpb1BsYXllciA9IG5ldyBBdWRpb1BsYXllcihjb250ZXh0LCB0aGlzKTtcclxuICAgICAgdGhpcy5hYyA9IG5ldyBBdWRpb0NhcHR1cmUoY29udGV4dCk7XHJcbiAgICAgIGlmICh0aGlzLmFjKSB7XHJcbiAgICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5zdGFydEl0ZW0oKTtcclxuICAgICAgICB0aGlzLmFjLmxpc3RlbmVyID0gdGhpcztcclxuICAgICAgICB0aGlzLmNvbmZpZ3VyZVN0cmVhbUNhcHR1cmVTdHJlYW0oKTtcclxuXHJcbiAgICAgICAgLy8gRG9uJ3QgbGlzdCB0aGUgZGV2aWNlcyBoZXJlLiBJZiB3ZSBkbyBub3QgaGF2ZSBhdWRpbyBwZXJtaXNzaW9ucyB3ZSBvbmx5IGdldCBhbm9ueW1pemVkIGRldmljZXMgd2l0aG91dCBsYWJlbHMuXHJcbiAgICAgICAgLy90aGlzLmFjLmxpc3REZXZpY2VzKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICBsZXQgZXJyTXNnID0gJ0Jyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBNZWRpYS9BdWRpbyBBUEkhJztcclxuICAgICAgICB0aGlzLnN0YXR1c01zZyA9ICdFUlJPUjogJyArIGVyck1zZztcclxuICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcic7XHJcbiAgICAgICAgdGhpcy5kaWFsb2cub3BlbihNZXNzYWdlRGlhbG9nLCB7XHJcbiAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgICAgIHRpdGxlOiAnRXJyb3InLFxyXG4gICAgICAgICAgICBtc2c6IGVyck1zZyxcclxuICAgICAgICAgICAgYWR2aXNlOiAnUGxlYXNlIHVzZSBhIHN1cHBvcnRlZCBicm93c2VyLicsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5zdG9wSXRlbSgpO1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMuc3RvcEl0ZW0oKTtcclxuICAgICAgLy90aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLnBhdXNlSXRlbSgpO1xyXG5cclxuICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLmNvbnRyb2xBdWRpb1BsYXllci5zdGFydCgpO1xyXG5cclxuICAgIH1cclxuICAgIHRoaXMudXBsb2FkZXIubGlzdGVuZXIgPSAodWUpID0+IHtcclxuICAgICAgdGhpcy51cGxvYWRVcGRhdGUodWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXByZXNzJywgWyckZXZlbnQnXSlcclxuICBvbktleVByZXNzKGtlOiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoa2Uua2V5ID09ICcgJykge1xyXG4gICAgICAvL3RoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICAgIC8vdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWRvd24nLCBbJyRldmVudCddKVxyXG4gIG9uS2V5RG93bihrZTogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgaWYgKGtlLmtleSA9PSAnICcpIHtcclxuICAgICAgaWYoIXRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5kaXNhYmxlZCl7XHJcbiAgICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLnBlcmZvcm0oKTtcclxuICAgICAgfWVsc2UgaWYoIXRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLmRpc2FibGVkKSB7XHJcbiAgICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoa2Uua2V5ID09ICdwJykge1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGtlLmtleSA9PSAnRXNjYXBlJykge1xyXG4gICAgICBpZiAoIXRoaXMuYXVkaW9TaWduYWxDb2xsYXBzZWQpIHtcclxuICAgICAgICB0aGlzLmF1ZGlvU2lnbmFsQ29sbGFwc2VkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGtlLmtleSA9PSAnTWVkaWFQbGF5UGF1c2UnKSB7XHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuICAgIGlmIChrZS5rZXkgPT09ICdBcnJvd1JpZ2h0Jykge1xyXG4gICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuICAgIGlmIChrZS5rZXkgPT09ICdBcnJvd0xlZnQnKSB7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5id2RBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNUZXN0U2Vzc2lvbigpOmJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICgodGhpcy5fc2Vzc2lvbiE9bnVsbCkgJiYgKHRoaXMuX3Nlc3Npb24udHlwZSA9PT0gJ1RFU1QnIHx8IHRoaXMuX3Nlc3Npb24udHlwZT09PSdURVNUX0RFRl9BJyB8fCB0aGlzLl9zZXNzaW9uLnR5cGUgPT09ICdTSU5VU19URVNUJykpO1xyXG4gIH1cclxuXHJcbiAgaXNEZWZhdWx0QXVkaW9UZXN0U2Vzc2lvbigpOmJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICgodGhpcy5fc2Vzc2lvbiE9bnVsbCkgJiYgKHRoaXMuX3Nlc3Npb24udHlwZT09PSdURVNUX0RFRl9BJykpO1xyXG4gIH1cclxuXHJcbiAgaXNEZWZhdWx0QXVkaW9UZXN0U2Vzc2lvbk92ZXJ3cml0ZWluZ1Byb2plY3RSZXF1aXJlbWVudHMoKTpib29sZWFuIHtcclxuICAgIHJldHVybiAoKHRoaXMuX3Nlc3Npb24hPW51bGwpICYmICh0aGlzLl9zZXNzaW9uLnR5cGU9PT0nVEVTVF9ERUZfQScpICYmICh0aGlzLmF1ZGlvRGV2aWNlcyE9bnVsbCkgJiYgdGhpcy5hdWRpb0RldmljZXMubGVuZ3RoPjApXHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGZldGNoUmVjb3JkaW5ncyhzZXNzOlNlc3Npb24pe1xyXG4gICAgdGhpcy5zdGF0dXNBbGVydFR5cGU9J2luZm8nO1xyXG4gICAgdGhpcy5zdGF0dXNNc2cgPSAnRmV0Y2hpbmcgaW5mb3Mgb2YgcmVjb3JkaW5ncy4uLic7XHJcbiAgICB0aGlzLnN0YXR1c1dhaXRpbmc9dHJ1ZTtcclxuICAgIGxldCBwck5tOnN0cmluZ3xudWxsPW51bGw7XHJcbiAgICBpZih0aGlzLnByb2plY3QpIHtcclxuICAgICAgbGV0IHJmc09icyA9IHRoaXMucmVjRmlsZVNlcnZpY2UucmVjb3JkaW5nRmlsZUxpc3QodGhpcy5wcm9qZWN0Lm5hbWUsIHNlc3Muc2Vzc2lvbklkKTtcclxuICAgICAgcmZzT2JzLnN1YnNjcmliZSh7bmV4dDoocmZzOiBBcnJheTxSZWNvcmRpbmdGaWxlPikgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2luZm8nO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY2VpdmVkIGluZm9zIG9mIHJlY29yZGluZ3MuJztcclxuICAgICAgICB0aGlzLnN0YXR1c1dhaXRpbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAocmZzKSB7XHJcbiAgICAgICAgICBpZiAocmZzIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgcmZzLmZvckVhY2goKHJmKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYocmYuc3RhcnRlZERhdGUpe1xyXG4gICAgICAgICAgICAgICAgcmYuX3N0YXJ0ZWRBc0RhdGVPYmo9bmV3IERhdGUocmYuc3RhcnRlZERhdGUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZihyZi5kYXRlKXtcclxuICAgICAgICAgICAgICAgIHJmLl9kYXRlQXNEYXRlT2JqPW5ldyBEYXRlKHJmLmRhdGUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLnJlY29yZGVyQ29tYmlQYW5lLnB1c2gocmYpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXhwZWN0ZWQgdHlwZSBhcnJheSBmb3IgbGlzdCBvZiBhbHJlYWR5IHJlY29yZGVkIGZpbGVzICcpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJSZWNvcmRpbmcgZmlsZSBsaXN0OiBcIiArIHJmcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCBlcnJvcjooZXJyKSA9PiB7XHJcbiAgICAgICAgLy8gRmFpbGVkIGZldGNoaW5nIGV4aXN0aW5nLCBidXQgd2Ugc3RhcnQgdGhlIHNlc3Npb24gYW55d2F5XHJcbiAgICAgICAgdGhpcy5zdGFydCgpXHJcbiAgICAgIH0sIGNvbXBsZXRlOigpID0+IHtcclxuICAgICAgICAvLyBOb3JtYWwgc3RhcnRcclxuICAgICAgICB0aGlzLnN0YXJ0KClcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIH1lbHNle1xyXG4gICAgICAvLyBObyBwcm9qZWN0IGRlZiAtPiBlcnJvclxyXG4gICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcic7XHJcbiAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ05vIHByb2plY3QgZGVmaW5pdG9uLic7XHJcbiAgICAgIHRoaXMuc3RhdHVzV2FpdGluZyA9IGZhbHNlO1xyXG4gICAgICBjb25zb2xlLmVycm9yKHRoaXMuc3RhdHVzTXNnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBzZXQgcHJvamVjdChwcm9qZWN0OiBQcm9qZWN0fHVuZGVmaW5lZHxudWxsKSB7XHJcbiAgICB0aGlzLl9wcm9qZWN0ID0gcHJvamVjdDtcclxuICAgIGxldCBjaENudCA9IFByb2plY3RVdGlsLkRFRkFVTFRfQVVESU9fQ0hBTk5FTF9DT1VOVDtcclxuXHJcbiAgICBpZiAocHJvamVjdCkge1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJQcm9qZWN0IG5hbWU6IFwiICsgcHJvamVjdC5uYW1lKVxyXG4gICAgICBpZihwcm9qZWN0LnJlY29yZGluZ0RldmljZVdha2VMb2NrPT09dHJ1ZSl7XHJcbiAgICAgICAgdGhpcy53YWtlTG9jaz10cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYXVkaW9EZXZpY2VzID0gcHJvamVjdC5hdWRpb0RldmljZXM7XHJcbiAgICAgIGNoQ250ID0gUHJvamVjdFV0aWwuYXVkaW9DaGFubmVsQ291bnQocHJvamVjdCk7XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlByb2plY3QgcmVxdWVzdGVkIHJlY29yZGluZyBjaGFubmVsIGNvdW50OiBcIiArIGNoQ250KTtcclxuICAgICAgdGhpcy5hdXRvR2FpbkNvbnRyb2xDb25maWdzPXByb2plY3QuYXV0b0dhaW5Db250cm9sQ29uZmlncztcclxuICAgICAgaWYocHJvamVjdC5jaHVua2VkUmVjb3JkaW5nPT09dHJ1ZSl7XHJcbiAgICAgICAgdGhpcy51cGxvYWRDaHVua1NpemVTZWNvbmRzPUJhc2ljUmVjb3JkZXIuREVGQVVMVF9DSFVOS19TSVpFX1NFQ09ORFM7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHRoaXMudXBsb2FkQ2h1bmtTaXplU2Vjb25kcz1udWxsO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiRW1wdHkgcHJvamVjdCBjb25maWd1cmF0aW9uIVwiKVxyXG4gICAgfVxyXG4gICAgdGhpcy5jaGFubmVsQ291bnQgPSBjaENudDtcclxuICB9XHJcblxyXG5cclxuICBnZXQgcHJvamVjdCgpOlByb2plY3R8dW5kZWZpbmVkfG51bGx7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJvamVjdDtcclxuICB9XHJcblxyXG4gIHNlbGVjdFJlY29yZGluZ0ZpbGUocmY6UmVjb3JkaW5nRmlsZSl7XHJcbiAgICB0aGlzLmRpc3BsYXlSZWNGaWxlPXJmO1xyXG4gIH1cclxuXHJcbiAgdXBsb2FkVXBkYXRlKHVlOiBVcGxvYWRlclN0YXR1c0NoYW5nZUV2ZW50KSB7XHJcbiAgICBsZXQgdXBTdGF0dXMgPSB1ZS5zdGF0dXM7XHJcbiAgICB0aGlzLmRhdGFTYXZlZCA9IChVcGxvYWRlclN0YXR1cy5ET05FID09PSB1cFN0YXR1cyk7XHJcbiAgICBsZXQgcGVyY2VudFVwbCA9IHVlLnBlcmNlbnREb25lKCk7XHJcbiAgICBpZiAoVXBsb2FkZXJTdGF0dXMuRVJSID09PSB1cFN0YXR1cykge1xyXG4gICAgICB0aGlzLnVwbG9hZFN0YXR1cyA9ICd3YXJuJ1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHBlcmNlbnRVcGwgPCA1MCkge1xyXG4gICAgICAgIHRoaXMudXBsb2FkU3RhdHVzID0gJ2FjY2VudCdcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnVwbG9hZFN0YXR1cyA9ICdzdWNjZXNzJ1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudXBsb2FkUHJvZ3Jlc3MgPSBwZXJjZW50VXBsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgfVxyXG5cclxuICBzZXQgY29udHJvbEF1ZGlvUGxheWVyKGNvbnRyb2xBdWRpb1BsYXllcjogQXVkaW9QbGF5ZXIpIHtcclxuICAgIGlmICh0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIpIHtcclxuICAgICAgLy90aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIubGlzdGVuZXI9bnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllciA9IGNvbnRyb2xBdWRpb1BsYXllcjtcclxuICAgIGlmICh0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIpIHtcclxuICAgICAgdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLmxpc3RlbmVyID0gdGhpcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBjb250cm9sQXVkaW9QbGF5ZXIoKTogQXVkaW9QbGF5ZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllcjtcclxuICB9XHJcblxyXG4gIHVwZGF0ZShlOiBBdWRpb1BsYXllckV2ZW50KSB7XHJcbiAgICBpZiAoZS50eXBlID09IEV2ZW50VHlwZS5TVEFSVEVEKSB7XHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy51cGRhdGVUaW1lcklkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAvL3RoaXMuYXVkaW9TaWduYWwucGxheUZyYW1lUG9zaXRpb24gPSB0aGlzLmFwLnBsYXlQb3NpdGlvbkZyYW1lcztcclxuICAgICAgfSwgNTApO1xyXG4gICAgfSBlbHNlIGlmIChlLnR5cGUgPT0gRXZlbnRUeXBlLlNUT1BQRUQgfHwgZS50eXBlID09IEV2ZW50VHlwZS5FTkRFRCkge1xyXG4gICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVwZGF0ZVRpbWVySWQpO1xyXG4gICAgICAvLyB0aGlzLmF1ZGlvU2lnbmFsLnBsYXlGcmFtZVBvc2l0aW9uID0gdGhpcy5hcC5wbGF5UG9zaXRpb25GcmFtZXM7XHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gKCEodGhpcy5kaXNwbGF5UmVjRmlsZSkpO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXJ0RGlzYWJsZWQoKSB7XHJcbiAgICByZXR1cm4gIXRoaXMudHJhbnNwb3J0QWN0aW9ucyB8fCB0aGlzLnJlYWRvbmx5IHx8IHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5kaXNhYmxlZFxyXG4gIH1cclxuXHJcbiAgc3RvcERpc2FibGVkKCkge1xyXG4gICAgcmV0dXJuICF0aGlzLnRyYW5zcG9ydEFjdGlvbnMgfHwgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24uZGlzYWJsZWRcclxuICB9XHJcblxyXG4gIHN0YXJ0U3RvcE5leHROYW1lKCk6c3RyaW5ne1xyXG4gICAgaWYoIXRoaXMuc3RhcnREaXNhYmxlZCgpKXtcclxuICAgICAgdGhpcy5zdGFydFN0b3BOZXh0QnV0dG9uTmFtZT1cIlN0YXJ0XCJcclxuICAgIH1lbHNlIGlmKCF0aGlzLnN0b3BEaXNhYmxlZCgpKSB7XHJcbiAgICAgIHRoaXMuc3RhcnRTdG9wTmV4dEJ1dHRvbk5hbWUgPSBcIlN0b3BcIlxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuc3RhcnRTdG9wTmV4dEJ1dHRvbk5hbWU7XHJcbiAgfVxyXG4gIHN0YXJ0U3RvcE5leHRJY29uTmFtZSgpOnN0cmluZ3tcclxuICAgIGlmKCF0aGlzLnN0YXJ0RGlzYWJsZWQoKSl7XHJcbiAgICAgIHRoaXMuc3RhcnRTdG9wTmV4dEJ1dHRvbkljb25OYW1lPVwiZmliZXJfbWFudWFsX3JlY29yZFwiXHJcbiAgICB9ZWxzZSBpZighdGhpcy5zdG9wRGlzYWJsZWQoKSl7XHJcbiAgICAgIHRoaXMuc3RhcnRTdG9wTmV4dEJ1dHRvbkljb25OYW1lPVwic3RvcFwiXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5zdGFydFN0b3BOZXh0QnV0dG9uSWNvbk5hbWVcclxuICB9XHJcbiAgc3RhcnRTdG9wTmV4dEljb25Db2xvcigpOnN0cmluZ3tcclxuICAgIGlmKCF0aGlzLnN0YXJ0RGlzYWJsZWQoKSl7XHJcbiAgICAgIHJldHVybiBcInJlZFwiXHJcbiAgICB9ZWxzZSBpZighdGhpcy5zdG9wRGlzYWJsZWQoKSl7XHJcbiAgICAgIHJldHVybiBcInllbGxvd1wiXHJcbiAgICB9ZWxzZXtcclxuICAgICAgcmV0dXJuIFwiZ3JleVwiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhcnRTdG9wUGVyZm9ybSgpe1xyXG4gICAgaWYoIXRoaXMuc3RhcnREaXNhYmxlZCgpKXtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1lbHNlIGlmKCF0aGlzLnN0b3BEaXNhYmxlZCgpKXtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhcnRJdGVtKCkge1xyXG4gICAgdGhpcy5zdGF0dXM9U3RhdHVzLlNUQVJUSU5HO1xyXG4gICAgc3VwZXIuc3RhcnRJdGVtKCk7XHJcbiAgICBpZiAodGhpcy5yZWFkb25seSkge1xyXG4gICAgICB0aGlzLnN0YXR1cz1TdGF0dXMuSURMRTtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkQWN0aW9uLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZE5leHRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlXHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuYndkQWN0aW9uLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgdGhpcy5kaXNwbGF5UmVjRmlsZSA9IG51bGw7XHJcbiAgICB0aGlzLmRpc3BsYXlSZWNGaWxlVmVyc2lvbiA9IDA7XHJcbiAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBudWxsO1xyXG4gICAgdGhpcy5zaG93UmVjb3JkaW5nKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuYWMpIHtcclxuICAgICAgaWYgKCF0aGlzLmFjLm9wZW5lZCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZERldmljZUlkKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIk9wZW4gc2Vzc2lvbiB3aXRoIGF1ZGlvIGRldmljZSBJZDogXFwnXCIgKyB0aGlzLl9zZWxlY3RlZERldmljZUlkICsgXCJcXCcgZm9yIFwiICsgdGhpcy5fY2hhbm5lbENvdW50ICsgXCIgY2hhbm5lbHNcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiT3BlbiBzZXNzaW9uIHdpdGggZGVmYXVsdCBhdWRpbyBkZXZpY2UgZm9yIFwiICsgdGhpcy5fY2hhbm5lbENvdW50ICsgXCIgY2hhbm5lbHNcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWMub3Blbih0aGlzLl9jaGFubmVsQ291bnQsIHRoaXMuX3NlbGVjdGVkRGV2aWNlSWQsdGhpcy5fYXV0b0dhaW5Db250cm9sQ29uZmlncyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hYy5zdGFydCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZG93bmxvYWRSZWNvcmRpbmcoKSB7XHJcbiAgICBpZiAodGhpcy5kaXNwbGF5UmVjRmlsZSkge1xyXG4gICAgICBsZXQgYWI6IEF1ZGlvQnVmZmVyIHwgbnVsbCA9IHRoaXMuZGlzcGxheVJlY0ZpbGUuYXVkaW9CdWZmZXI7XHJcbiAgICAgIGxldCB3dyA9IG5ldyBXYXZXcml0ZXIoKTtcclxuICAgICAgaWYgKGFiKSB7XHJcbiAgICAgICAgbGV0IHdhdkZpbGUgPSB3dy53cml0ZUFzeW5jKGFiLCAod2F2RmlsZSkgPT4ge1xyXG4gICAgICAgICAgbGV0IGJsb2IgPSBuZXcgQmxvYihbd2F2RmlsZV0sIHt0eXBlOiAnYXVkaW8vd2F2J30pO1xyXG4gICAgICAgICAgbGV0IHJmVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuXHJcbiAgICAgICAgICBsZXQgZGF0YURubExuayA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgICAgLy9kYXRhRG5sTG5rLm5hbWUgPSAnUmVjb3JkaW5nJztcclxuICAgICAgICAgIGRhdGFEbmxMbmsuaHJlZiA9IHJmVXJsO1xyXG5cclxuICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuYm9keSwgZGF0YURubExuayk7XHJcblxyXG4gICAgICAgICAgLy8gZG93bmxvYWQgcHJvcGVydHkgbm90IHlldCBpbiBUUyBkZWZcclxuICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXlSZWNGaWxlKSB7XHJcbiAgICAgICAgICAgIGxldCBmbiA9IHRoaXMuZGlzcGxheVJlY0ZpbGUuZmlsZW5hbWVTdHJpbmcoKTtcclxuICAgICAgICAgICAgZm4gKz0gJ18nICsgdGhpcy5kaXNwbGF5UmVjRmlsZVZlcnNpb247XHJcbiAgICAgICAgICAgIGZuICs9ICcud2F2JztcclxuICAgICAgICAgICAgZGF0YURubExuay5kb3dubG9hZCA9IGZuO1xyXG4gICAgICAgICAgICBkYXRhRG5sTG5rLmNsaWNrKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKGRvY3VtZW50LmJvZHksIGRhdGFEbmxMbmspO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXQgZGlzcGxheVJlY0ZpbGUoZGlzcGxheVJlY0ZpbGU6IFJlY29yZGluZ0ZpbGUgfCBudWxsKSB7XHJcbiAgICB0aGlzLl9kaXNwbGF5UmVjRmlsZSA9IGRpc3BsYXlSZWNGaWxlO1xyXG4gICAgaWYgKHRoaXMuX2Rpc3BsYXlSZWNGaWxlKSB7XHJcbiAgICAgIGxldCBhYjogQXVkaW9CdWZmZXJ8IG51bGwgPSB0aGlzLl9kaXNwbGF5UmVjRmlsZS5hdWRpb0J1ZmZlcjtcclxuICAgICAgaWYoYWIpIHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBuZXcgQXVkaW9DbGlwKGFiKTtcclxuICAgICAgICB0aGlzLmNvbnRyb2xBdWRpb1BsYXllci5hdWRpb0NsaXAgPSB0aGlzLmRpc3BsYXlBdWRpb0NsaXA7XHJcbiAgICAgIH1lbHNlIHtcclxuICAgICAgICAvLyBjbGVhciBmb3Igbm93IC4uLlxyXG4gICAgICAgIHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIuYXVkaW9DbGlwID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllciAmJiB0aGlzLl9zZXNzaW9uKSB7XHJcbiAgICAgICAgICAgIC8vLi4uIGFuZCB0cnkgdG8gZmV0Y2ggZnJvbSBzZXJ2ZXJcclxuICAgICAgICAgICAgdGhpcy5hdWRpb0ZldGNoU3Vic2NyaXB0aW9uID0gdGhpcy5yZWNGaWxlU2VydmljZS5mZXRjaEFuZEFwcGx5UmVjb3JkaW5nRmlsZSh0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIuY29udGV4dCwgdGhpcy5fc2Vzc2lvbi5wcm9qZWN0LCB0aGlzLl9kaXNwbGF5UmVjRmlsZSkuc3Vic2NyaWJlKChyZikgPT4ge1xyXG4gICAgICAgICAgICAgIGxldCBmYWIgPSBudWxsO1xyXG4gICAgICAgICAgICAgIGlmIChyZiAmJiB0aGlzLl9kaXNwbGF5UmVjRmlsZSkge1xyXG4gICAgICAgICAgICAgICAgZmFiID0gdGhpcy5fZGlzcGxheVJlY0ZpbGUuYXVkaW9CdWZmZXI7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZyBmaWxlIGNvdWxkIG5vdCBiZSBsb2FkZWQuJ1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChmYWIpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5QXVkaW9DbGlwID0gbmV3IEF1ZGlvQ2xpcChmYWIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xBdWRpb1BsYXllci5hdWRpb0NsaXAgPXRoaXMuZGlzcGxheUF1ZGlvQ2xpcFxyXG4gICAgICAgICAgICAgIHRoaXMuc2hvd1JlY29yZGluZygpO1xyXG5cclxuICAgICAgICAgICAgfSwgZXJyID0+IHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IGxvYWQgcmVjb3JkaW5nIGZpbGUgZnJvbSBzZXJ2ZXI6IFwiICsgZXJyKVxyXG4gICAgICAgICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZyBmaWxlIGNvdWxkIG5vdCBiZSBsb2FkZWQ6ICcgKyBlcnJcclxuICAgICAgICAgICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcidcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZyBmaWxlIGNvdWxkIG5vdCBiZSBkZWNvZGVkLiBBdWRpbyBjb250ZXh0IHVuYXZhaWxhYmxlLidcclxuICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJ1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCA9IG51bGw7XHJcbiAgICAgIHRoaXMuY29udHJvbEF1ZGlvUGxheWVyLmF1ZGlvQ2xpcCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNob3dSZWNvcmRpbmcoKTtcclxuICB9XHJcblxyXG4gIGdldCBkaXNwbGF5UmVjRmlsZSgpOiBSZWNvcmRpbmdGaWxlIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGlzcGxheVJlY0ZpbGU7XHJcbiAgfVxyXG5cclxuICBzaG93UmVjb3JkaW5nKCkge1xyXG4gICAgdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIuc3RvcCgpO1xyXG5cclxuICAgIGlmICh0aGlzLmRpc3BsYXlBdWRpb0NsaXApIHtcclxuICAgICAgbGV0IGRhcD10aGlzLmRpc3BsYXlBdWRpb0NsaXA7XHJcbiAgICAgIHRoaXMubGV2ZWxNZWFzdXJlLmNhbGNCdWZmZXJMZXZlbEluZm9zKGRhcC5idWZmZXIsIExFVkVMX0JBUl9JTlRFUlZBTExfU0VDT05EUykudGhlbigobGV2ZWxJbmZvcykgPT4ge1xyXG4gICAgICAgICAgZGFwLmxldmVsSW5mb3MgPSBsZXZlbEluZm9zO1xyXG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcblxyXG4gICAgICAvLyBDb2xsYXBzZSBhdWRpbyBzaWduYWwgZGlzcGxheSBpZiBvcGVuXHJcbiAgICAgIGlmICghdGhpcy5hdWRpb1NpZ25hbENvbGxhcHNlZCkge1xyXG4gICAgICAgIHRoaXMuYXVkaW9TaWduYWxDb2xsYXBzZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVN0YXJ0QWN0aW9uRGlzYWJsZVN0YXRlKCl7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24uZGlzYWJsZWQ9ISh0aGlzLmFjKTtcclxuICB9XHJcblxyXG4gIHN0YXJ0KCkge1xyXG4gICAgc3VwZXIuc3RhcnQoKTtcclxuICAgIHRoaXMucmVjb3JkZXJDb21iaVBhbmUuc2VsZWN0VG9wKCk7XHJcbiAgICB0aGlzLmVuYWJsZU5hdmlnYXRpb24oKTtcclxuICAgIHRoaXMudXBkYXRlU3RhcnRBY3Rpb25EaXNhYmxlU3RhdGUoKTtcclxuXHJcbiAgfVxyXG5cclxuICBpc1JlY29yZGluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodGhpcy5zdGF0dXMgPT09IFN0YXR1cy5SRUNPUkRJTkcpO1xyXG4gIH1cclxuXHJcbiAgaXNBY3RpdmUoKTogYm9vbGVhbntcclxuICAgIHJldHVybiAoISh0aGlzLnN0YXR1cyA9PT0gU3RhdHVzLkJMT0NLRUQgfHwgdGhpcy5zdGF0dXM9PT0gU3RhdHVzLklETEUgfHwgdGhpcy5zdGF0dXM9PT1TdGF0dXMuRVJST1IpIHx8IHRoaXMucHJvY2Vzc2luZ1JlY29yZGluZyB8fCB0aGlzLnNlc3Npb25TZXJ2aWNlLnVwbG9hZENvdW50PjApXHJcbiAgfVxyXG5cclxuXHJcbiAgdXBkYXRlV2FrZUxvY2soZGF0YVNhdmVkOmJvb2xlYW49dGhpcy5kYXRhU2F2ZWQpe1xyXG4gICAgLy9jb25zb2xlLmRlYnVnKFwiVXBkYXRlIHdha2UgbG9jazogZGF0YVNhdmVkOiBcIitkYXRhU2F2ZWQrXCIsIG5vdCBhY3RpdmU6IFwiKyEgdGhpcy5pc0FjdGl2ZSgpKVxyXG4gICAgaWYoZGF0YVNhdmVkICYmICEgdGhpcy5pc0FjdGl2ZSgpKXtcclxuICAgICAgdGhpcy5kaXNhYmxlV2FrZUxvY2tDb25kKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZU5hdmlnYXRpb25BY3Rpb25zKCl7XHJcblxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZEFjdGlvbi5kaXNhYmxlZCA9IHRoaXMubmF2aWdhdGlvbkRpc2FibGVkO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5kaXNhYmxlZCA9IHRoaXMubmF2aWdhdGlvbkRpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgZW5hYmxlU3RhcnRVc2VyR2VzdHVyZSgpIHtcclxuICAgIHN1cGVyLmVuYWJsZVN0YXJ0VXNlckdlc3R1cmUoKTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5kaXNhYmxlZD0hKHRoaXMuYWMpO1xyXG4gIH1cclxuXHJcbiAgZW5hYmxlTmF2aWdhdGlvbigpe1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uRGlzYWJsZWQ9ZmFsc2U7XHJcbiAgICB0aGlzLnVwZGF0ZU5hdmlnYXRpb25BY3Rpb25zKCk7XHJcbiAgfVxyXG5cclxuICBvcGVuZWQoKSB7XHJcbiAgICBpZih0aGlzLmFjKSB7XHJcbiAgICAgIHRoaXMuYWMuc3RhcnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXJ0ZWQoKSB7XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5SRUNPUkRJTkc7XHJcbiAgICBzdXBlci5zdGFydGVkKCk7XHJcbiAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZy4uLic7XHJcblxyXG4gICAgbGV0IG1heFJlY29yZGluZ1RpbWVNcyA9IE1BWF9SRUNPUkRJTkdfVElNRV9NUztcclxuICAgIHRoaXMubWF4UmVjVGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nTWF4UmVjKClcclxuICAgIH0sIG1heFJlY29yZGluZ1RpbWVNcyk7XHJcbiAgICB0aGlzLm1heFJlY1RpbWVyUnVubmluZyA9IHRydWU7XHJcblxyXG5cclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBzdG9wSXRlbSgpIHtcclxuXHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5TVE9QUElOR19TVE9QO1xyXG4gICAgdGhpcy5zdG9wUmVjb3JkaW5nKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgc3RvcFJlY29yZGluZygpIHtcclxuICAgIGlmICh0aGlzLm1heFJlY1RpbWVyUnVubmluZyAmJiB0aGlzLm1heFJlY1RpbWVySWQhPW51bGwpIHtcclxuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLm1heFJlY1RpbWVySWQpO1xyXG4gICAgICB0aGlzLm1heFJlY1RpbWVyUnVubmluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5hYykge1xyXG4gICAgICB0aGlzLmFjLnN0b3AoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0b3BSZWNvcmRpbmdNYXhSZWMoKXtcclxuXHJcbiAgICB0aGlzLm1heFJlY1RpbWVyUnVubmluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuU1RPUFBJTkdfU1RPUDtcclxuICAgIGlmKHRoaXMuYWMpIHtcclxuICAgICAgdGhpcy5hYy5zdG9wKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdG9wcGVkKCkge1xyXG4gICAgdGhpcy51cGRhdGVTdGFydEFjdGlvbkRpc2FibGVTdGF0ZSgpXHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMucGF1c2VBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnaW5mbyc7XHJcbiAgICB0aGlzLnN0YXR1c01zZyA9ICdSZWNvcmRlZC4nO1xyXG5cclxuICAgIGxldCBhZDpBdWRpb0J1ZmZlcjtcclxuICAgIGlmKHRoaXMuYWMpIHtcclxuICAgICAgYWQgPSB0aGlzLmFjLmF1ZGlvQnVmZmVyKCk7XHJcbiAgICAgIGxldCBzZXNzSWQ6IHN0cmluZyB8IG51bWJlciA9IDA7XHJcbiAgICAgIGlmKHRoaXMuX3Nlc3Npb24pe1xyXG4gICAgICAgIHNlc3NJZD10aGlzLl9zZXNzaW9uLnNlc3Npb25JZDtcclxuICAgICAgfVxyXG4gICAgICBpZighdGhpcy5yZlV1aWQpe1xyXG4gICAgICAgIHRoaXMucmZVdWlkPVVVSUQuZ2VuZXJhdGUoKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCByZiA9IG5ldyBSZWNvcmRpbmdGaWxlKHRoaXMucmZVdWlkLHNlc3NJZCxhZCk7XHJcbiAgICAgIHJmLl9zdGFydGVkQXNEYXRlT2JqPXRoaXMuc3RhcnRlZERhdGU7XHJcbiAgICAgIGlmKHJmLl9zdGFydGVkQXNEYXRlT2JqKSB7XHJcbiAgICAgICAgcmYuc3RhcnRlZERhdGUgPSByZi5fc3RhcnRlZEFzRGF0ZU9iai50b1N0cmluZygpO1xyXG4gICAgICB9XHJcbiAgICAgIHJmLmZyYW1lcyA9IGFkLmxlbmd0aDtcclxuICAgICAgdGhpcy5kaXNwbGF5UmVjRmlsZSA9IHJmO1xyXG4gICAgICB0aGlzLnJlY29yZGVyQ29tYmlQYW5lLnB1c2gocmYpO1xyXG5cclxuICAgICAgLy8gVXBsb2FkIGlmIHVwbG9hZCBlbmFibGVkIGFuZCBub3QgaW4gY2h1bmtlZCB1cGxvYWQgbW9kZVxyXG4gICAgICBpZiAodGhpcy5lbmFibGVVcGxvYWRSZWNvcmRpbmdzICYmICF0aGlzLnVwbG9hZENodW5rU2l6ZVNlY29uZHMpIHtcclxuICAgICAgICBsZXQgYXBpRW5kUG9pbnQgPSAnJztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaUVuZFBvaW50KSB7XHJcbiAgICAgICAgICBhcGlFbmRQb2ludCA9IHRoaXMuY29uZmlnLmFwaUVuZFBvaW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYXBpRW5kUG9pbnQgIT09ICcnKSB7XHJcbiAgICAgICAgICBhcGlFbmRQb2ludCA9IGFwaUVuZFBvaW50ICsgJy8nXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc2Vzc2lvbnNVcmwgPSBhcGlFbmRQb2ludCArIFNlc3Npb25TZXJ2aWNlLlNFU1NJT05fQVBJX0NUWDtcclxuICAgICAgICBsZXQgcmVjVXJsOiBzdHJpbmcgPSBzZXNzaW9uc1VybCArICcvJyArIHJmLnNlc3Npb24gKyAnLycgKyBSRUNGSUxFX0FQSV9DVFggKyAnLycgKyByZi51dWlkO1xyXG5cclxuICAgICAgICAvLyBjb252ZXJ0IGFzeW5jaHJvbm91c2x5IHRvIDE2LWJpdCBpbnRlZ2VyIFBDTVxyXG4gICAgICAgIC8vIFRPRE8gY291bGQgd2UgYXZvaWQgY29udmVyc2lvbiB0byBzYXZlIENQVSByZXNvdXJjZXMgYW5kIHRyYW5zZmVyIGZsb2F0IFBDTSBkaXJlY3RseT9cclxuICAgICAgICAvLyBUT0RPIGR1cGxpY2F0ZSBjb252ZXJzaW9uIGZvciBtYW51YWwgZG93bmxvYWRcclxuXHJcbiAgICAgICAgdGhpcy5wcm9jZXNzaW5nUmVjb3JkaW5nID0gdHJ1ZVxyXG4gICAgICAgIGxldCB3dyA9IG5ldyBXYXZXcml0ZXIoKTtcclxuICAgICAgICB3dy53cml0ZUFzeW5jKGFkLCAod2F2RmlsZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wb3N0UmVjb3JkaW5nTXVsdGlwYXJ0KHdhdkZpbGUsIHJmLnV1aWQsIHJmLnNlc3Npb24sIHJmLl9zdGFydGVkQXNEYXRlT2JqLCByZWNVcmwpO1xyXG4gICAgICAgICAgdGhpcy5wcm9jZXNzaW5nUmVjb3JkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVdha2VMb2NrKCk7XHJcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuSURMRTtcclxuICAgIHRoaXMubmF2aWdhdGlvbkRpc2FibGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLnVwZGF0ZU5hdmlnYXRpb25BY3Rpb25zKCk7XHJcbiAgICB0aGlzLnVwZGF0ZVdha2VMb2NrKCk7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgcG9zdFJlY29yZGluZ011bHRpcGFydCh3YXZGaWxlOiBVaW50OEFycmF5LCB1dWlkOnN0cmluZ3xudWxsLHNlc3Npb25JZDpzdHJpbmd8bnVtYmVyfG51bGwsc3RhcnRlZERhdGU6RGF0ZXxudWxsfHVuZGVmaW5lZCxyZWNVcmw6IHN0cmluZykge1xyXG4gICAgbGV0IHdhdkJsb2IgPSBuZXcgQmxvYihbd2F2RmlsZV0sIHt0eXBlOiAnYXVkaW8vd2F2J30pO1xyXG5cclxuICAgIGxldCBmZD1uZXcgRm9ybURhdGEoKTtcclxuICAgIGlmKHV1aWQpIHtcclxuICAgICAgZmQuc2V0KCd1dWlkJywgdXVpZCk7XHJcbiAgICB9XHJcbiAgICBpZihzZXNzaW9uSWQhPT1udWxsKSB7XHJcbiAgICAgIGZkLnNldCgnc2Vzc2lvbklkJywgc2Vzc2lvbklkLnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG4gICAgaWYoc3RhcnRlZERhdGUpe1xyXG4gICAgICBmZC5zZXQoJ3N0YXJ0ZWREYXRlJyxzdGFydGVkRGF0ZS50b0pTT04oKSk7XHJcbiAgICB9XHJcbiAgICBmZC5zZXQoJ2F1ZGlvJyx3YXZCbG9iKTtcclxuICAgIGxldCB1bCA9IG5ldyBVcGxvYWQoZmQsIHJlY1VybCk7XHJcbiAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlVXBsb2FkKHVsKTtcclxuICB9XHJcblxyXG4gIHBvc3RDaHVua0F1ZGlvQnVmZmVyKGF1ZGlvQnVmZmVyOiBBdWRpb0J1ZmZlciwgY2h1bmtJZHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5wcm9jZXNzaW5nUmVjb3JkaW5nID0gdHJ1ZTtcclxuICAgIGxldCB3dyA9IG5ldyBXYXZXcml0ZXIoKTtcclxuICAgIC8vbmV3IFJFU1QgQVBJIFVSTFxyXG4gICAgbGV0IGFwaUVuZFBvaW50ID0gJyc7XHJcbiAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuYXBpRW5kUG9pbnQpIHtcclxuICAgICAgYXBpRW5kUG9pbnQgPSB0aGlzLmNvbmZpZy5hcGlFbmRQb2ludDtcclxuICAgIH1cclxuICAgIGlmIChhcGlFbmRQb2ludCAhPT0gJycpIHtcclxuICAgICAgYXBpRW5kUG9pbnQgPSBhcGlFbmRQb2ludCArICcvJ1xyXG4gICAgfVxyXG4gICAgbGV0IHNlc3Npb25zVXJsID0gYXBpRW5kUG9pbnQgKyBTZXNzaW9uU2VydmljZS5TRVNTSU9OX0FQSV9DVFg7XHJcbiAgICBsZXQgcmVjVXJsOiBzdHJpbmcgPSBzZXNzaW9uc1VybCArICcvJyArIHRoaXMuc2Vzc2lvbj8uc2Vzc2lvbklkICsgJy8nICsgUkVDRklMRV9BUElfQ1RYICsgJy8nICsgdGhpcy5yZlV1aWQrJy8nK2NodW5rSWR4O1xyXG4gICAgd3cud3JpdGVBc3luYyhhdWRpb0J1ZmZlciwgKHdhdkZpbGUpID0+IHtcclxuICAgICAgdGhpcy5wb3N0UmVjb3JkaW5nKHdhdkZpbGUsIHJlY1VybCk7XHJcbiAgICAgIHRoaXMucHJvY2Vzc2luZ1JlY29yZGluZyA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdG9wKCkge1xyXG4gICAgaWYodGhpcy5hYykge1xyXG4gICAgICB0aGlzLmFjLmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUNvbnRyb2xQbGF5YmFja1Bvc2l0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5wbGF5UG9zaXRpb25GcmFtZXMpIHtcclxuICAgICAgdGhpcy5yZWNvcmRlckNvbWJpUGFuZS5hdWRpb0Rpc3BsYXkucGxheUZyYW1lUG9zaXRpb24gPSB0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIucGxheVBvc2l0aW9uRnJhbWVzO1xyXG4gICAgICB0aGlzLmxpdmVMZXZlbERpc3BsYXkucGxheUZyYW1lUG9zaXRpb24gPSB0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIucGxheVBvc2l0aW9uRnJhbWVzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXVkaW9QbGF5ZXJVcGRhdGUoZTogQXVkaW9QbGF5ZXJFdmVudCkge1xyXG4gICAgaWYgKEV2ZW50VHlwZS5SRUFEWSA9PT0gZS50eXBlKSB7XHJcblxyXG4gICAgfSBlbHNlIGlmIChFdmVudFR5cGUuU1RBUlRFRCA9PT0gZS50eXBlKSB7XHJcbiAgICAgIC8vdGhpcy5zdGF0dXMgPSAnUGxheWJhY2suLi4nO1xyXG4gICAgICB0aGlzLnVwZGF0ZVRpbWVySWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy51cGRhdGVDb250cm9sUGxheWJhY2tQb3NpdGlvbigpLCA1MCk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChFdmVudFR5cGUuRU5ERUQgPT09IGUudHlwZSkge1xyXG4gICAgICAvLy5zdGF0dXM9J1JlYWR5Lic7XHJcbiAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMudXBkYXRlVGltZXJJZCk7XHJcblxyXG4gICAgfVxyXG4gICAgaWYoIXRoaXMuZGVzdHJveWVkKSB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1hdWRpb3JlY29yZGVyLWNvbXAnLFxyXG4gIHByb3ZpZGVyczogW1Nlc3Npb25TZXJ2aWNlXSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGFwcC1hdWRpb3JlY29yZGVyIFtwcm9qZWN0TmFtZV09XCJfcHJvamVjdD8ubmFtZVwiIFtkYXRhU2F2ZWRdPVwiZGF0YVNhdmVkXCI+PC9hcHAtYXVkaW9yZWNvcmRlcj5cclxuICBgLFxyXG4gIHN0eWxlczogW2A6aG9zdHtcclxuICAgIGZsZXg6IDI7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgbWluLWhlaWdodDowO1xyXG5cclxuICB9YF1cclxuXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdWRpb1JlY29yZGVyQ29tcG9uZW50IGV4dGVuZHMgUmVjb3JkZXJDb21wb25lbnQgIGltcGxlbWVudHMgT25Jbml0LE9uRGVzdHJveSxBZnRlclZpZXdJbml0LFJlYWR5U3RhdGVQcm92aWRlciB7XHJcblxyXG4gIG1vZGUhOk1vZGU7XHJcbiAgY29udHJvbEF1ZGlvUGxheWVyITpBdWRpb1BsYXllcjtcclxuICBhdWRpbzphbnk7XHJcblxyXG4gIF9wcm9qZWN0OlByb2plY3R8dW5kZWZpbmVkO1xyXG4gIHNlc3Npb25JZCE6IHN0cmluZztcclxuICBzZXNzaW9uITpTZXNzaW9uO1xyXG5cclxuICBAVmlld0NoaWxkKEF1ZGlvUmVjb3JkZXIsIHsgc3RhdGljOiB0cnVlIH0pIGFyITpBdWRpb1JlY29yZGVyO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaW5qZWN0b3I6SW5qZWN0b3IscHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgICAgICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICAgICAgICBwcml2YXRlIHNlc3Npb25TZXJ2aWNlOlNlc3Npb25TZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcHJvamVjdFNlcnZpY2U6UHJvamVjdFNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHVwbG9hZGVyOlNwZWVjaFJlY29yZGVyVXBsb2FkZXJcclxuICApIHtcclxuICAgIHN1cGVyKHVwbG9hZGVyKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLy9zdXBlci5uZ09uSW5pdCgpO1xyXG4gICAgbGV0IGF1ZGlvQ29udGV4dCA9IEF1ZGlvQ29udGV4dFByb3ZpZGVyLmF1ZGlvQ29udGV4dEluc3RhbmNlKCk7XHJcbiAgICBpZihhdWRpb0NvbnRleHQpIHtcclxuICAgICAgdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIgPSBuZXcgQXVkaW9QbGF5ZXIoYXVkaW9Db250ZXh0LHRoaXMuYXIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hci5jb250cm9sQXVkaW9QbGF5ZXI9dGhpcy5jb250cm9sQXVkaW9QbGF5ZXI7XHJcblxyXG4gICAgLy9UT0RPIER1cGxpY2F0ZSBjb2RlIGluIFNwZWVjaFJlY29yZGVyQ29tcG9uZW50XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgKGUpID0+IHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkJlZm9yZSBwYWdlIHVubG9hZCBldmVudFwiKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnJlYWR5KCkpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gYWxsIHRoaXMgYXR0ZW1wdHMgdG8gY3VzdG9taXplIHRoZSBtZXNzYWdlIGRvIG5vdCB3b3JrIGFueW1vcmUgKGZvciBzZWN1cml0eSByZWFzb25zKSEhXHJcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBcIlBsZWFzZSBkbyBub3QgbGVhdmUgdGhlIHBhZ2UsIHVudGlsIGFsbCByZWNvcmRpbmdzIGFyZSB1cGxvYWRlZCFcIjtcclxuICAgICAgICBhbGVydChtZXNzYWdlKTtcclxuICAgICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnQ7XHJcblxyXG4gICAgICAgIGlmIChlKSB7XHJcbiAgICAgICAgICBlLnJldHVyblZhbHVlID0gbWVzc2FnZTtcclxuICAgICAgICAgIGUuY2FuY2VsQnViYmxlID0gdHJ1ZTtcclxuICAgICAgICAgIGlmIChlLnN0b3BQcm9wYWdhdGlvbikge1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGUucHJldmVudERlZmF1bHQpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy51cGxvYWRlci5saXN0ZW5lciA9ICh1ZSkgPT4ge1xyXG4gICAgICB0aGlzLnVwbG9hZFVwZGF0ZSh1ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocGFyYW1zOiBQYXJhbXMpID0+IHtcclxuICAgICAgaWYgKHBhcmFtc1snc2Vzc2lvbklkJ10pIHtcclxuICAgICAgICB0aGlzLmZldGNoU2Vzc2lvbihwYXJhbXNbJ3Nlc3Npb25JZCddKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5zdWJzY3JpYmUoKHBhcmFtczogUGFyYW1zKSA9PiB7XHJcbiAgICAgIGxldCByb3V0ZVBhcmFtc0lkID0gcGFyYW1zWydpZCddO1xyXG4gICAgICBpZiAocm91dGVQYXJhbXNJZCkge1xyXG4gICAgICAgIHRoaXMuZmV0Y2hTZXNzaW9uKHJvdXRlUGFyYW1zSWQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgLy9zdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNjcmVlbkxvY2tlZCgpOmJvb2xlYW57XHJcbiAgICByZXR1cm4gIHRoaXMuYXIuc2NyZWVuTG9ja2VkO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hTZXNzaW9uKHNlc3Npb25JZDpzdHJpbmcpe1xyXG5cclxuICAgIGxldCBzZXNzT2JzPSB0aGlzLnNlc3Npb25TZXJ2aWNlLnNlc3Npb25PYnNlcnZlcihzZXNzaW9uSWQpO1xyXG5cclxuICAgIGlmKHNlc3NPYnMpIHtcclxuICAgICAgc2Vzc09icy5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6KHNlc3MpID0+IHtcclxuICAgICAgICAgIHRoaXMuYXIuc3RhdHVzQWxlcnRUeXBlPSdpbmZvJztcclxuICAgICAgICAgIHRoaXMuYXIuc3RhdHVzTXNnID0gJ1JlY2VpdmVkIHNlc3Npb24gaW5mby4nO1xyXG4gICAgICAgICAgdGhpcy5hci5zdGF0dXNXYWl0aW5nPWZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5zZXNzaW9uPXNlc3M7XHJcbiAgICAgICAgICB0aGlzLmFyLnNlc3Npb249c2VzcztcclxuICAgICAgICAgIGlmIChzZXNzLnByb2plY3QpIHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU2Vzc2lvbiBhc3NvY2lhdGVkIHByb2plY3Q6IFwiK3Nlc3MucHJvamVjdClcclxuICAgICAgICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0T2JzZXJ2YWJsZShzZXNzLnByb2plY3QpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgbmV4dDoocHJvamVjdCk9PntcclxuICAgICAgICAgICAgICB0aGlzLmFyLnByb2plY3Q9cHJvamVjdDtcclxuICAgICAgICAgICAgICB0aGlzLmFyLmZldGNoUmVjb3JkaW5ncyhzZXNzKTtcclxuICAgICAgICAgICAgfSxlcnJvcjoocmVhc29uKSA9PntcclxuICAgICAgICAgICAgICB0aGlzLmFyLnN0YXR1c01zZz1yZWFzb247XHJcbiAgICAgICAgICAgICAgdGhpcy5hci5zdGF0dXNBbGVydFR5cGU9J2Vycm9yJztcclxuICAgICAgICAgICAgICB0aGlzLmFyLnN0YXR1c1dhaXRpbmc9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIHByb2plY3QgY29uZmlnOiBcIityZWFzb24pXHJcbiAgICAgICAgICAgIH19KTtcclxuXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmluZm8oXCJTZXNzaW9uIGhhcyBubyBhc3NvY2lhdGVkIHByb2plY3QuIFVzaW5nIGRlZmF1bHQgY29uZmlndXJhdGlvbi5cIilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOihyZWFzb24pID0+IHtcclxuICAgICAgICAgIHRoaXMuYXIuc3RhdHVzTXNnID0gcmVhc29uO1xyXG4gICAgICAgICAgdGhpcy5hci5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICAgICAgdGhpcy5hci5zdGF0dXNXYWl0aW5nPWZhbHNlO1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIHNlc3Npb24gXCIgKyByZWFzb24pXHJcbiAgICAgICAgfX0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBsb2FkVXBkYXRlKHVlOiBVcGxvYWRlclN0YXR1c0NoYW5nZUV2ZW50KSB7XHJcbiAgICBsZXQgdXBTdGF0dXMgPSB1ZS5zdGF0dXM7XHJcbiAgICB0aGlzLmRhdGFTYXZlZCA9IChVcGxvYWRlclN0YXR1cy5ET05FID09PSB1cFN0YXR1cyk7XHJcbiAgICBsZXQgcGVyY2VudFVwbCA9IHVlLnBlcmNlbnREb25lKCk7XHJcbiAgICBpZiAoVXBsb2FkZXJTdGF0dXMuRVJSID09PSB1cFN0YXR1cykge1xyXG4gICAgICB0aGlzLmFyLnVwbG9hZFN0YXR1cyA9ICd3YXJuJ1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHBlcmNlbnRVcGwgPCA1MCkge1xyXG4gICAgICAgIHRoaXMuYXIudXBsb2FkU3RhdHVzID0gJ2FjY2VudCdcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmFyLnVwbG9hZFN0YXR1cyA9ICdzdWNjZXNzJ1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYXIudXBsb2FkUHJvZ3Jlc3MgPSBwZXJjZW50VXBsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hci51cGRhdGVXYWtlTG9jayh0aGlzLmRhdGFTYXZlZCk7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKVxyXG4gIH1cclxuXHJcblxyXG4gIHJlYWR5KCk6Ym9vbGVhbntcclxuICAgIHJldHVybiB0aGlzLmRhdGFTYXZlZCAmJiAhdGhpcy5hci5pc0FjdGl2ZSgpXHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
1044
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9yZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9zcGVlY2hyZWNvcmRlci9zZXNzaW9uL2F1ZGlvcmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBdUIsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQUMsV0FBVyxFQUFvQixTQUFTLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQTtBQUNwRixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sNEJBQTRCLENBQUE7QUFDcEQsT0FBTyxFQUFDLGFBQWEsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUM5RCxPQUFPLEVBQ0wsU0FBUyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxFQUNoQyxZQUFZLEVBQWEsS0FBSyxFQUM5QyxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHakQsT0FBTyxFQUFDLHFCQUFxQixFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBRTdFLE9BQU8sRUFBVyxXQUFXLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFHdEQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRWhELE9BQU8sRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUE0QixNQUFNLG9CQUFvQixDQUFDO0FBR3JGLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUN2QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDbEQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUJB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RSx3QkFBd0I7b0JBQ2xDLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQztvQkFDM0IsUUFBUSxFQUFFOztHQUVUO29CQUNELE1BQU0sRUFBRSxDQUFDOzs7Ozs7O0lBT1AsQ0FBQztpQkFFSjtpUkFXNkMsRUFBRTtzQkFBN0MsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBdWRpb0NhcHR1cmUsIEF1ZGlvQ2FwdHVyZUxpc3RlbmVyfSBmcm9tICcuLi8uLi9hdWRpby9jYXB0dXJlL2NhcHR1cmUnO1xyXG5pbXBvcnQge0F1ZGlvUGxheWVyLCBBdWRpb1BsYXllckV2ZW50LCBFdmVudFR5cGV9IGZyb20gJy4uLy4uL2F1ZGlvL3BsYXliYWNrL3BsYXllcidcclxuaW1wb3J0IHtXYXZXcml0ZXJ9IGZyb20gJy4uLy4uL2F1ZGlvL2ltcGwvd2F2d3JpdGVyJ1xyXG5pbXBvcnQge1JlY29yZGluZ0ZpbGUsIFJlY29yZGluZ0ZpbGVVdGlsc30gZnJvbSAnLi4vcmVjb3JkaW5nJ1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCwgVmlld0NoaWxkLCBDaGFuZ2VEZXRlY3RvclJlZiwgSW5qZWN0LFxyXG4gIEFmdGVyVmlld0luaXQsIEhvc3RMaXN0ZW5lciwgT25EZXN0cm95LCBJbnB1dCwgUmVuZGVyZXIyLCBPbkluaXQsIEluamVjdG9yXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtTZXNzaW9uU2VydmljZX0gZnJvbSBcIi4vc2Vzc2lvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2dcIjtcclxuaW1wb3J0IHtTcGVlY2hSZWNvcmRlclVwbG9hZGVyfSBmcm9tIFwiLi4vc3BydXBsb2FkZXJcIjtcclxuaW1wb3J0IHtTUEVFQ0hSRUNPUkRFUl9DT05GSUcsIFNwZWVjaFJlY29yZGVyQ29uZmlnfSBmcm9tIFwiLi4vLi4vc3ByLmNvbmZpZ1wiO1xyXG5pbXBvcnQge1Nlc3Npb259IGZyb20gXCIuL3Nlc3Npb25cIjtcclxuaW1wb3J0IHsgUHJvamVjdCwgUHJvamVjdFV0aWx9IGZyb20gXCIuLi9wcm9qZWN0L3Byb2plY3RcIjtcclxuaW1wb3J0IHtNZXNzYWdlRGlhbG9nfSBmcm9tIFwiLi4vLi4vdWkvbWVzc2FnZV9kaWFsb2dcIjtcclxuaW1wb3J0IHtSZWNvcmRpbmdTZXJ2aWNlfSBmcm9tIFwiLi4vcmVjb3JkaW5ncy9yZWNvcmRpbmdzLnNlcnZpY2VcIjtcclxuXHJcbmltcG9ydCB7QXVkaW9Db250ZXh0UHJvdmlkZXJ9IGZyb20gXCIuLi8uLi9hdWRpby9jb250ZXh0XCI7XHJcbmltcG9ydCB7QXVkaW9DbGlwfSBmcm9tIFwiLi4vLi4vYXVkaW8vcGVyc2lzdG9yXCI7XHJcblxyXG5pbXBvcnQge1VwbG9hZCwgVXBsb2FkZXJTdGF0dXMsIFVwbG9hZGVyU3RhdHVzQ2hhbmdlRXZlbnR9IGZyb20gXCIuLi8uLi9uZXQvdXBsb2FkZXJcIjtcclxuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zLCBSb3V0ZXJ9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuaW1wb3J0IHtQcm9qZWN0U2VydmljZX0gZnJvbSBcIi4uL3Byb2plY3QvcHJvamVjdC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7VVVJRH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XHJcbmltcG9ydCB7TGV2ZWxCYXJ9IGZyb20gXCIuLi8uLi9hdWRpby91aS9saXZlbGV2ZWxcIjtcclxuaW1wb3J0IHtSZWNvcmRlckNvbWJpUGFuZX0gZnJvbSBcIi4vcmVjb3JkZXJfY29tYmlfcGFuZVwiO1xyXG5pbXBvcnQge0Jhc2ljUmVjb3JkZXIsIExFVkVMX0JBUl9JTlRFUlZBTExfU0VDT05EUywgTUFYX1JFQ09SRElOR19USU1FX01TLCBSRUNGSUxFX0FQSV9DVFh9IGZyb20gXCIuL2Jhc2ljcmVjb3JkZXJcIjtcclxuaW1wb3J0IHtSZWFkeVN0YXRlUHJvdmlkZXIsIFJlY29yZGVyQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vcmVjb3JkZXJfY29tcG9uZW50XCI7XHJcbmltcG9ydCB7TW9kZX0gZnJvbSBcIi4uLy4uL3NwZWVjaHJlY29yZGVybmcuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7QXVkaW9EYXRhSG9sZGVyfSBmcm9tIFwiLi4vLi4vYXVkaW8vYXVkaW9fZGF0YV9ob2xkZXJcIjtcclxuaW1wb3J0IHtBcnJheUF1ZGlvQnVmZmVyfSBmcm9tIFwiLi4vLi4vYXVkaW8vYXJyYXlfYXVkaW9fYnVmZmVyXCI7XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IGVudW0gU3RhdHVzIHtcclxuICBCTE9DS0VELCBJRExFLFNUQVJUSU5HLCBSRUNPUkRJTkcsICBTVE9QUElOR19TVE9QLCBFUlJPUlxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSXRlbSB7XHJcbiAgcHJvbXB0QXNTdHJpbmc6IHN0cmluZztcclxuICB0cmFpbmluZzogYm9vbGVhbjtcclxuICByZWNzOiBBcnJheTxSZWNvcmRpbmdGaWxlPiB8IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb21wdEFzU3RyaW5nOiBzdHJpbmcsIHRyYWluaW5nOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnByb21wdEFzU3RyaW5nID0gcHJvbXB0QXNTdHJpbmc7XHJcbiAgICB0aGlzLnRyYWluaW5nID0gdHJhaW5pbmc7XHJcbiAgICB0aGlzLnJlY3MgPSBudWxsO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWF1ZGlvcmVjb3JkZXInLFxyXG4gIHByb3ZpZGVyczogW1Nlc3Npb25TZXJ2aWNlXSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGFwcC13YXJuaW5nYmFyIFtzaG93XT1cImlzVGVzdFNlc3Npb24oKVwiIHdhcm5pbmdUZXh0PVwiVGVzdCByZWNvcmRpbmcgb25seSFcIj48L2FwcC13YXJuaW5nYmFyPlxyXG4gICAgPGFwcC13YXJuaW5nYmFyIFtzaG93XT1cImlzRGVmYXVsdEF1ZGlvVGVzdFNlc3Npb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgd2FybmluZ1RleHQ9XCJUaGlzIHRlc3QgdXNlcyBkZWZhdWx0IGF1ZGlvIGRldmljZSEgUmVndWxhciBzZXNzaW9ucyBtYXkgcmVxdWlyZSBhIHBhcnRpY3VsYXIgYXVkaW8gZGV2aWNlIChtaWNyb3Bob25lKSFcIj48L2FwcC13YXJuaW5nYmFyPlxyXG4gICAgPGFwcC1yZWNvcmRlcmNvbWJpcGFuZSAoc2VsZWN0ZWRSZWNvcmRpbmdGaWxlQ2hhbmdlZCk9XCJzZWxlY3RSZWNvcmRpbmdGaWxlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbYXVkaW9TaWduYWxDb2xsYXBzZWRdPVwiYXVkaW9TaWduYWxDb2xsYXBzZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRSZWNvcmRpbmdGaWxlXT1cImRpc3BsYXlSZWNGaWxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdERpc2FibGVkXT1cImlzQWN0aXZlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheUF1ZGlvQ2xpcF09XCJkaXNwbGF5QXVkaW9DbGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdGFydEFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXIuc3RhcnRBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxheVN0b3BBY3Rpb25dPVwiY29udHJvbEF1ZGlvUGxheWVyLnN0b3BBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxheVNlbGVjdGlvbkFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXIuc3RhcnRTZWxlY3Rpb25BY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvbl09XCJjb250cm9sQXVkaW9QbGF5ZXIuYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvblwiXHJcbiAgICA+PC9hcHAtcmVjb3JkZXJjb21iaXBhbmU+XHJcblxyXG4gICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0LnhzPVwiY29sdW1uXCIgW25nU3R5bGVdPVwieydoZWlnaHQucHgnOjEwMCwnbWluLWhlaWdodC5weCc6IDEwMH1cIlxyXG4gICAgICAgICBbbmdTdHlsZS54c109XCJ7J2hlaWdodC5weCc6MTI1LCdtaW4taGVpZ2h0LnB4JzogMTI1fVwiPlxyXG4gICAgICA8YXVkaW8tbGV2ZWxiYXIgZnhGbGV4PVwiMSAwIDFcIiBbc3RyZWFtaW5nTW9kZV09XCJpc1JlY29yZGluZygpXCIgW3N0YXRlTG9hZGluZ109XCJhdWRpb0ZldGNoaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5TGV2ZWxJbmZvc109XCJkaXNwbGF5QXVkaW9DbGlwPy5sZXZlbEluZm9zXCI+PC9hdWRpby1sZXZlbGJhcj5cclxuICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiPlxyXG4gICAgICAgIDxzcHItcmVjb3JkaW5naXRlbWNvbnRyb2xzIGZ4RmxleD1cIjEwIDAgMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1ZGlvTG9hZGVkXT1cImRpc3BsYXlBdWRpb0NsaXA/LmF1ZGlvRGF0YUhvbGRlciE9PW51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RhcnRBY3Rpb25dPVwiY29udHJvbEF1ZGlvUGxheWVyPy5zdGFydEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdG9wQWN0aW9uXT1cImNvbnRyb2xBdWRpb1BsYXllcj8uc3RvcEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BlYWtEYkx2bF09XCJwZWFrTGV2ZWxJbkRiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWdjXT1cInRoaXMuYWM/LmFnY1N0YXR1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2hvd1JlY29yZGluZ0RldGFpbHMpPVwiYXVkaW9TaWduYWxDb2xsYXBzZWQ9IWF1ZGlvU2lnbmFsQ29sbGFwc2VkXCI+XHJcbiAgICAgICAgPC9zcHItcmVjb3JkaW5naXRlbWNvbnRyb2xzPlxyXG5cclxuICAgICAgICA8YXBwLXVwbG9hZHN0YXR1cyBjbGFzcz1cInJpY29udHJvbHMgZGFya1wiIGZ4SGlkZSBmeFNob3cueHMgZnhGbGV4PVwiMCAwIDBcIiAqbmdJZj1cImVuYWJsZVVwbG9hZFJlY29yZGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ1cGxvYWRQcm9ncmVzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0YXR1c109XCJ1cGxvYWRTdGF0dXNcIiBbYXdhaXROZXdVcGxvYWRdPVwicHJvY2Vzc2luZ1JlY29yZGluZ1wiPjwvYXBwLXVwbG9hZHN0YXR1cz5cclxuICAgICAgICA8YXBwLXdha2Vsb2NraW5kaWNhdG9yIGNsYXNzPVwicmljb250cm9scyBkYXJrXCIgZnhIaWRlIGZ4U2hvdy54cyBmeEZsZXg9XCIwIDAgMFwiIFtzY3JlZW5Mb2NrZWRdPVwic2NyZWVuTG9ja2VkXCI+PC9hcHAtd2FrZWxvY2tpbmRpY2F0b3I+XHJcbiAgICAgICAgPGFwcC1yZWFkeXN0YXRlaW5kaWNhdG9yIGNsYXNzPVwicmljb250cm9scyBkYXJrXCIgZnhIaWRlIGZ4U2hvdy54cyBmeEZsZXg9XCIwIDAgMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkeV09XCJkYXRhU2F2ZWQgJiYgIWlzQWN0aXZlKClcIj48L2FwcC1yZWFkeXN0YXRlaW5kaWNhdG9yPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAjY29udHJvbHBhbmVsIGNsYXNzPVwiY29udHJvbHBhbmVsXCIgZnhMYXlvdXQ9XCJyb3dcIj5cclxuICAgICAgPGFwcC1zcHJzdGF0dXNkaXNwbGF5IGZ4SGlkZS54cyBmeEZsZXg9XCIzMCUgMSAzMCVcIiBbc3RhdHVzTXNnXT1cInN0YXR1c01zZ1wiIFtzdGF0dXNBbGVydFR5cGVdPVwic3RhdHVzQWxlcnRUeXBlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGF0dXNXYWl0aW5nXT1cInN0YXR1c1dhaXRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoaWRkZW4teHNcIj48L2FwcC1zcHJzdGF0dXNkaXNwbGF5PlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIjEwMCUgMCAxMDAlXCIgY2xhc3M9XCJzdGFydHN0b3BcIj5cclxuICAgICAgICA8ZGl2IHN0eWxlPVwiYWxpZ24tY29udGVudDogY2VudGVyXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJzdGFydFN0b3BQZXJmb3JtKClcIiBbZGlzYWJsZWRdPVwic3RhcnREaXNhYmxlZCgpICYmIHN0b3BEaXNhYmxlZCgpXCIgbWF0LXJhaXNlZC1idXR0b24gY2xhc3M9XCJiaWdidXR0b25cIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJzdGFydFN0b3BOZXh0SWNvbkNvbG9yKClcIiBpbmxpbmU9XCJ0cnVlXCI+e3tzdGFydFN0b3BOZXh0SWNvbk5hbWUoKX19PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogYm9sZGVyO2ZvbnQtc2l6ZTogMTRweFwiPnt7c3RhcnRTdG9wTmV4dE5hbWUoKX19PC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGZ4RmxleD1cIjMwJSAxIDMwJVwiID5cclxuICAgICAgICA8ZGl2IGZ4RmxleD1cIjEgMSBhdXRvXCI+PC9kaXY+XHJcblxyXG4gICAgICAgIDxhcHAtdXBsb2Fkc3RhdHVzIGNsYXNzPVwicmljb250cm9sc1wiIGZ4SGlkZS54cyBmeEZsZXg9XCIwIDAgMFwiICpuZ0lmPVwiZW5hYmxlVXBsb2FkUmVjb3JkaW5nc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInVwbG9hZFByb2dyZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RhdHVzXT1cInVwbG9hZFN0YXR1c1wiIFthd2FpdE5ld1VwbG9hZF09XCJwcm9jZXNzaW5nUmVjb3JkaW5nXCI+PC9hcHAtdXBsb2Fkc3RhdHVzPlxyXG4gICAgICAgIDxhcHAtd2FrZWxvY2tpbmRpY2F0b3IgY2xhc3M9XCJyaWNvbnRyb2xzXCIgZnhIaWRlLnhzIFtzY3JlZW5Mb2NrZWRdPVwic2NyZWVuTG9ja2VkXCI+PC9hcHAtd2FrZWxvY2tpbmRpY2F0b3I+XHJcbiAgICAgICAgPGFwcC1yZWFkeXN0YXRlaW5kaWNhdG9yIGNsYXNzPVwicmljb250cm9sc1wiIGZ4SGlkZS54c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZHldPVwiZGF0YVNhdmVkICYmICFpc0FjdGl2ZSgpXCI+PC9hcHAtcmVhZHlzdGF0ZWluZGljYXRvcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICBgLFxyXG4gIHN0eWxlczogW2A6aG9zdCB7XHJcbiAgICBmbGV4OiAyO1xyXG4gICAgYmFja2dyb3VuZDogbGlnaHRncmV5O1xyXG4gICAgZGlzcGxheTogZmxleDsgLyogVmVydGljYWwgZmxleCBjb250YWluZXI6IEJvdHRvbSB0cmFuc3BvcnQgcGFuZWwsIGFib3ZlIHByb21wdGluZyBwYW5lbCAqL1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBtaW4taGVpZ2h0OiAwcHg7XHJcbiAgICAgIC8qIFByZXZlbnRzIGhvcml6b250YWwgc2Nyb2xsIGJhciBvbiBzd2lwZSByaWdodCAqL1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1gLGAucmljb250cm9scyB7XHJcbiAgICAgICAgcGFkZGluZzogNHB4O1xyXG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgfWAsYC5kYXJrIHtcclxuICAgIGJhY2tncm91bmQ6IGRhcmtncmF5O1xyXG4gIH1gLGAuY29udHJvbHBhbmVsIHtcclxuICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAyMHB4O1xyXG4gICAgbWluLWhlaWdodDogbWluLWNvbnRlbnQ7IC8qIGltcG9ydGFudCAqL1xyXG4gIH1gLGAuc3RhcnRzdG9wIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgYWxpZ24tY29udGVudDogY2VudGVyO1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICB9YCxgLmJpZ2J1dHRvbiB7XHJcbiAgICBtaW4td2lkdGg6IDcwcHg7XHJcbiAgICBtaW4taGVpZ2h0OiA1MHB4O1xyXG4gICAgZm9udC1zaXplOiA1MHB4O1xyXG4gICAgYm9yZGVyLXJhZGl1czogMjBweDtcclxuICB9YFxyXG4gICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdWRpb1JlY29yZGVyIGV4dGVuZHMgQmFzaWNSZWNvcmRlciBpbXBsZW1lbnRzIE9uSW5pdCxBZnRlclZpZXdJbml0LE9uRGVzdHJveSwgQXVkaW9DYXB0dXJlTGlzdGVuZXIsUmVhZHlTdGF0ZVByb3ZpZGVyIHtcclxuXHJcbiAgX3Byb2plY3Q6UHJvamVjdHx1bmRlZmluZWR8IG51bGw9bnVsbDtcclxuICBASW5wdXQoKSBwcm9qZWN0TmFtZTpzdHJpbmd8dW5kZWZpbmVkfG51bGw9bnVsbDtcclxuICBlbmFibGVVcGxvYWRSZWNvcmRpbmdzOiBib29sZWFuID0gdHJ1ZTtcclxuICBlbmFibGVEb3dubG9hZFJlY29yZGluZ3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzdGF0dXM6IFN0YXR1cyA9IFN0YXR1cy5CTE9DS0VEO1xyXG5cclxuICBAVmlld0NoaWxkKFJlY29yZGVyQ29tYmlQYW5lLCB7IHN0YXRpYzogdHJ1ZSB9KSByZWNvcmRlckNvbWJpUGFuZSE6IFJlY29yZGVyQ29tYmlQYW5lO1xyXG4gIEBWaWV3Q2hpbGQoTGV2ZWxCYXIsIHsgc3RhdGljOiB0cnVlIH0pIGxpdmVMZXZlbERpc3BsYXkhOiBMZXZlbEJhcjtcclxuXHJcbiAgQElucHV0KCkgZGF0YVNhdmVkPXRydWVcclxuXHJcblxyXG4gIHByaXZhdGUgbWF4UmVjVGltZXJJZDogbnVtYmVyfG51bGw9bnVsbDtcclxuICBwcml2YXRlIG1heFJlY1RpbWVyUnVubmluZzogYm9vbGVhbj1mYWxzZTtcclxuICBwcml2YXRlIHVwZGF0ZVRpbWVySWQ6IGFueTtcclxuXHJcbiAgc3RhcnRTdG9wTmV4dEJ1dHRvbk5hbWUhOnN0cmluZztcclxuICBzdGFydFN0b3BOZXh0QnV0dG9uSWNvbk5hbWUhOnN0cmluZztcclxuXHJcbiAgYXVkaW86IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBfcHJvbXB0SW5kZXg6bnVtYmVyfG51bGw9bnVsbDtcclxuXHJcbiAgLy9pdGVtczogQXJyYXk8SXRlbT58bnVsbD1udWxsO1xyXG4gIC8vc2VsZWN0ZWRJdGVtSWR4OiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfZGlzcGxheVJlY0ZpbGU6IFJlY29yZGluZ0ZpbGUgfCBudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBkaXNwbGF5UmVjRmlsZVZlcnNpb246IG51bWJlcj0wO1xyXG5cclxuXHJcbiAgY29uc3RydWN0b3IoY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgICAgICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICAgICAgICBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgICAgICAgICAgICBzZXNzaW9uU2VydmljZTpTZXNzaW9uU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIHJlY0ZpbGVTZXJ2aWNlOlJlY29yZGluZ1NlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHVwbG9hZGVyOiBTcGVlY2hSZWNvcmRlclVwbG9hZGVyLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoU1BFRUNIUkVDT1JERVJfQ09ORklHKSBjb25maWc/OiBTcGVlY2hSZWNvcmRlckNvbmZpZykge1xyXG4gICAgc3VwZXIoY2hhbmdlRGV0ZWN0b3JSZWYsZGlhbG9nLHNlc3Npb25TZXJ2aWNlLHVwbG9hZGVyLGNvbmZpZyk7XHJcblxyXG4gICAgLy9zdXBlcihpbmplY3Rvcik7XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5JRExFO1xyXG5cclxuICAgIHRoaXMuYXVkaW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaW8nKTtcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuZW5hYmxlVXBsb2FkUmVjb3JkaW5ncyAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuZW5hYmxlVXBsb2FkUmVjb3JkaW5ncyA9IHRoaXMuY29uZmlnLmVuYWJsZVVwbG9hZFJlY29yZGluZ3M7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuZW5hYmxlRG93bmxvYWRSZWNvcmRpbmdzICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5lbmFibGVEb3dubG9hZFJlY29yZGluZ3MgPSB0aGlzLmNvbmZpZy5lbmFibGVEb3dubG9hZFJlY29yZGluZ3M7XHJcbiAgICB9XHJcbiAgICAvL3RoaXMuaW5pdCgpO1xyXG4gIH1cclxuXHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuXHJcbiAgICB0aGlzLnN0cmVhbUxldmVsTWVhc3VyZS5sZXZlbExpc3RlbmVyID0gdGhpcy5saXZlTGV2ZWxEaXNwbGF5O1xyXG4gICAgdGhpcy5zdHJlYW1MZXZlbE1lYXN1cmUucGVha0xldmVsTGlzdGVuZXI9KHBlYWtMdmxJbkRiKT0+e1xyXG4gICAgICB0aGlzLnBlYWtMZXZlbEluRGI9cGVha0x2bEluRGI7XHJcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gICAgLy9sZXQgd2FrZUxvY2tTdXBwPSgnd2FrZUxvY2snIGluIG5hdmlnYXRvcik7XHJcbiAgICAvL2FsZXJ0KCdXYWtlIGxvY2sgQVBJIHN1cHBvcnRlZDogJyt3YWtlTG9ja1N1cHApO1xyXG4gIH1cclxuXHJcbiAgcmVhZHkoKTpib29sZWFue1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YVNhdmVkICYmICF0aGlzLmlzQWN0aXZlKClcclxuICB9XHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgdGhpcy5kaXNhYmxlV2FrZUxvY2tDb25kKCk7XHJcbiAgICAgICB0aGlzLmRlc3Ryb3llZD10cnVlO1xyXG4gICAgICAgLy8gVE9ETyBzdG9wIGNhcHR1cmUgL3BsYXliYWNrXHJcbiAgICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcblxyXG4gICAgbGV0IGNvbnRleHQ6QXVkaW9Db250ZXh0fG51bGw9bnVsbDtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnRleHQgPSBBdWRpb0NvbnRleHRQcm92aWRlci5hdWRpb0NvbnRleHRJbnN0YW5jZSgpXHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuRVJST1I7XHJcbiAgICAgIGxldCBlcnJNc2cgPSAnVW5rbm93biBlcnJvcic7XHJcbiAgICAgIGlmKGVyciBpbnN0YW5jZW9mIEVycm9yKXtcclxuICAgICAgICBlcnJNc2c9ZXJyLm1lc3NhZ2U7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnRVJST1I6ICcgKyBlcnJNc2c7XHJcbiAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgdGhpcy5kaWFsb2cub3BlbihNZXNzYWdlRGlhbG9nLCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgdHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgIHRpdGxlOiAnRXJyb3InLFxyXG4gICAgICAgICAgbXNnOiBlcnJNc2csXHJcbiAgICAgICAgICBhZHZpc2U6ICdQbGVhc2UgdXNlIGEgc3VwcG9ydGVkIGJyb3dzZXIuJyxcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZihjb250ZXh0KSB7XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlN0YXRlIG9mIGF1ZGlvIGNvbnRleHQ6IFwiICsgY29udGV4dC5zdGF0ZSlcclxuICAgIH1lbHNle1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJObyBhdWRpbyBjb250ZXh0IGF2YWlsYWJsZSFcIik7XHJcbiAgICB9XHJcbiAgICBpZiAoIWNvbnRleHQgfHwgIW5hdmlnYXRvci5tZWRpYURldmljZXMpIHtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuRVJST1I7XHJcbiAgICAgIGxldCBlcnJNc2cgPSAnQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IE1lZGlhIHN0cmVhbXMhJztcclxuICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnRVJST1I6ICcgKyBlcnJNc2c7XHJcbiAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgdGhpcy5kaWFsb2cub3BlbihNZXNzYWdlRGlhbG9nLCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgdHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgIHRpdGxlOiAnRXJyb3InLFxyXG4gICAgICAgICAgbXNnOiBlcnJNc2csXHJcbiAgICAgICAgICBhZHZpc2U6ICdQbGVhc2UgdXNlIGEgc3VwcG9ydGVkIGJyb3dzZXIuJyxcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvL3RoaXMuY29udHJvbEF1ZGlvUGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKGNvbnRleHQsIHRoaXMpO1xyXG4gICAgICB0aGlzLmFjID0gbmV3IEF1ZGlvQ2FwdHVyZShjb250ZXh0KTtcclxuICAgICAgaWYgKHRoaXMuYWMpIHtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLnN0YXJ0SXRlbSgpO1xyXG4gICAgICAgIHRoaXMuYWMubGlzdGVuZXIgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuY29uZmlndXJlU3RyZWFtQ2FwdHVyZVN0cmVhbSgpO1xyXG5cclxuICAgICAgICAvLyBEb24ndCBsaXN0IHRoZSBkZXZpY2VzIGhlcmUuIElmIHdlIGRvIG5vdCBoYXZlIGF1ZGlvIHBlcm1pc3Npb25zIHdlIG9ubHkgZ2V0IGFub255bWl6ZWQgZGV2aWNlcyB3aXRob3V0IGxhYmVscy5cclxuICAgICAgICAvL3RoaXMuYWMubGlzdERldmljZXMoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIGxldCBlcnJNc2cgPSAnQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IE1lZGlhL0F1ZGlvIEFQSSEnO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ0VSUk9SOiAnICsgZXJyTXNnO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKE1lc3NhZ2VEaWFsb2csIHtcclxuICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgICAgdGl0bGU6ICdFcnJvcicsXHJcbiAgICAgICAgICAgIG1zZzogZXJyTXNnLFxyXG4gICAgICAgICAgICBhZHZpc2U6ICdQbGVhc2UgdXNlIGEgc3VwcG9ydGVkIGJyb3dzZXIuJyxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLnN0b3BJdGVtKCk7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5uZXh0QWN0aW9uLm9uQWN0aW9uID0gKCkgPT4gdGhpcy5zdG9wSXRlbSgpO1xyXG4gICAgICAvL3RoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMucGF1c2VJdGVtKCk7XHJcblxyXG4gICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMuY29udHJvbEF1ZGlvUGxheWVyLnN0YXJ0KCk7XHJcblxyXG4gICAgfVxyXG4gICAgdGhpcy51cGxvYWRlci5saXN0ZW5lciA9ICh1ZSkgPT4ge1xyXG4gICAgICB0aGlzLnVwbG9hZFVwZGF0ZSh1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5cHJlc3MnLCBbJyRldmVudCddKVxyXG4gIG9uS2V5UHJlc3Moa2U6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmIChrZS5rZXkgPT0gJyAnKSB7XHJcbiAgICAgIC8vdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLnBlcmZvcm0oKTtcclxuICAgICAgLy90aGlzLnRyYW5zcG9ydEFjdGlvbnMubmV4dEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgb25LZXlEb3duKGtlOiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoa2Uua2V5ID09ICcgJykge1xyXG4gICAgICBpZighdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLmRpc2FibGVkKXtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgICB9ZWxzZSBpZighdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24uZGlzYWJsZWQpIHtcclxuICAgICAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChrZS5rZXkgPT0gJ3AnKSB7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5wYXVzZUFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoa2Uua2V5ID09ICdFc2NhcGUnKSB7XHJcbiAgICAgIGlmICghdGhpcy5hdWRpb1NpZ25hbENvbGxhcHNlZCkge1xyXG4gICAgICAgIHRoaXMuYXVkaW9TaWduYWxDb2xsYXBzZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoa2Uua2V5ID09ICdNZWRpYVBsYXlQYXVzZScpIHtcclxuICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGtlLmtleSA9PT0gJ0Fycm93UmlnaHQnKSB7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2RBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGtlLmtleSA9PT0gJ0Fycm93TGVmdCcpIHtcclxuICAgICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc1Rlc3RTZXNzaW9uKCk6Ym9vbGVhbiB7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9zZXNzaW9uIT1udWxsKSAmJiAodGhpcy5fc2Vzc2lvbi50eXBlID09PSAnVEVTVCcgfHwgdGhpcy5fc2Vzc2lvbi50eXBlPT09J1RFU1RfREVGX0EnIHx8IHRoaXMuX3Nlc3Npb24udHlwZSA9PT0gJ1NJTlVTX1RFU1QnKSk7XHJcbiAgfVxyXG5cclxuICBpc0RlZmF1bHRBdWRpb1Rlc3RTZXNzaW9uKCk6Ym9vbGVhbiB7XHJcbiAgICByZXR1cm4gKCh0aGlzLl9zZXNzaW9uIT1udWxsKSAmJiAodGhpcy5fc2Vzc2lvbi50eXBlPT09J1RFU1RfREVGX0EnKSk7XHJcbiAgfVxyXG5cclxuICBpc0RlZmF1bHRBdWRpb1Rlc3RTZXNzaW9uT3ZlcndyaXRlaW5nUHJvamVjdFJlcXVpcmVtZW50cygpOmJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICgodGhpcy5fc2Vzc2lvbiE9bnVsbCkgJiYgKHRoaXMuX3Nlc3Npb24udHlwZT09PSdURVNUX0RFRl9BJykgJiYgKHRoaXMuYXVkaW9EZXZpY2VzIT1udWxsKSAmJiB0aGlzLmF1ZGlvRGV2aWNlcy5sZW5ndGg+MClcclxuICB9XHJcblxyXG5cclxuXHJcbiAgZmV0Y2hSZWNvcmRpbmdzKHNlc3M6U2Vzc2lvbil7XHJcbiAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZT0naW5mbyc7XHJcbiAgICB0aGlzLnN0YXR1c01zZyA9ICdGZXRjaGluZyBpbmZvcyBvZiByZWNvcmRpbmdzLi4uJztcclxuICAgIHRoaXMuc3RhdHVzV2FpdGluZz10cnVlO1xyXG4gICAgbGV0IHByTm06c3RyaW5nfG51bGw9bnVsbDtcclxuICAgIGlmKHRoaXMucHJvamVjdCkge1xyXG4gICAgICBsZXQgcmZzT2JzID0gdGhpcy5yZWNGaWxlU2VydmljZS5yZWNvcmRpbmdGaWxlTGlzdCh0aGlzLnByb2plY3QubmFtZSwgc2Vzcy5zZXNzaW9uSWQpO1xyXG4gICAgICByZnNPYnMuc3Vic2NyaWJlKHtuZXh0OihyZnM6IEFycmF5PFJlY29yZGluZ0ZpbGU+KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnaW5mbyc7XHJcbiAgICAgICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjZWl2ZWQgaW5mb3Mgb2YgcmVjb3JkaW5ncy4nO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzV2FpdGluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChyZnMpIHtcclxuICAgICAgICAgIGlmIChyZnMgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICByZnMuZm9yRWFjaCgocmYpID0+IHtcclxuICAgICAgICAgICAgICAvLyB0aGUgbGlzdCBjb21lcyBmcm9tIHRoZSBzZXJ2ZXIsIGFzc3N1ZW0gYWxsIHJlY29yZGluZyBmaWxlcyBhcyBzZXJ2ZXIgcGVyc2lzdGVkXHJcbiAgICAgICAgICAgICAgcmYuc2VydmVyUGVyc2lzdGVkPXRydWU7XHJcbiAgICAgICAgICAgICAgaWYocmYuc3RhcnRlZERhdGUpe1xyXG4gICAgICAgICAgICAgICAgcmYuX3N0YXJ0ZWRBc0RhdGVPYmo9bmV3IERhdGUocmYuc3RhcnRlZERhdGUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZihyZi5kYXRlKXtcclxuICAgICAgICAgICAgICAgIHJmLl9kYXRlQXNEYXRlT2JqPW5ldyBEYXRlKHJmLmRhdGUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLnJlY29yZGVyQ29tYmlQYW5lLmFkZFJlY0ZpbGUocmYpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXhwZWN0ZWQgdHlwZSBhcnJheSBmb3IgbGlzdCBvZiBhbHJlYWR5IHJlY29yZGVkIGZpbGVzICcpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJSZWNvcmRpbmcgZmlsZSBsaXN0OiBcIiArIHJmcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCBlcnJvcjooZXJyKSA9PiB7XHJcbiAgICAgICAgLy8gRmFpbGVkIGZldGNoaW5nIGV4aXN0aW5nLCBidXQgd2Ugc3RhcnQgdGhlIHNlc3Npb24gYW55d2F5XHJcbiAgICAgICAgdGhpcy5zdGFydCgpXHJcbiAgICAgIH0sIGNvbXBsZXRlOigpID0+IHtcclxuICAgICAgICAvLyBOb3JtYWwgc3RhcnRcclxuICAgICAgICB0aGlzLnN0YXJ0KClcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIH1lbHNle1xyXG4gICAgICAvLyBObyBwcm9qZWN0IGRlZiAtPiBlcnJvclxyXG4gICAgICB0aGlzLnN0YXR1c0FsZXJ0VHlwZSA9ICdlcnJvcic7XHJcbiAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ05vIHByb2plY3QgZGVmaW5pdG9uLic7XHJcbiAgICAgIHRoaXMuc3RhdHVzV2FpdGluZyA9IGZhbHNlO1xyXG4gICAgICBjb25zb2xlLmVycm9yKHRoaXMuc3RhdHVzTXNnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBzZXQgcHJvamVjdChwcm9qZWN0OiBQcm9qZWN0fHVuZGVmaW5lZHxudWxsKSB7XHJcbiAgICB0aGlzLl9wcm9qZWN0ID0gcHJvamVjdDtcclxuICAgIGxldCBjaENudCA9IFByb2plY3RVdGlsLkRFRkFVTFRfQVVESU9fQ0hBTk5FTF9DT1VOVDtcclxuXHJcbiAgICBpZiAocHJvamVjdCkge1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJQcm9qZWN0IG5hbWU6IFwiICsgcHJvamVjdC5uYW1lKVxyXG4gICAgICBpZihwcm9qZWN0LnJlY29yZGluZ0RldmljZVdha2VMb2NrPT09dHJ1ZSl7XHJcbiAgICAgICAgdGhpcy53YWtlTG9jaz10cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYXVkaW9EZXZpY2VzID0gcHJvamVjdC5hdWRpb0RldmljZXM7XHJcbiAgICAgIGNoQ250ID0gUHJvamVjdFV0aWwuYXVkaW9DaGFubmVsQ291bnQocHJvamVjdCk7XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlByb2plY3QgcmVxdWVzdGVkIHJlY29yZGluZyBjaGFubmVsIGNvdW50OiBcIiArIGNoQ250KTtcclxuICAgICAgdGhpcy5hdXRvR2FpbkNvbnRyb2xDb25maWdzPXByb2plY3QuYXV0b0dhaW5Db250cm9sQ29uZmlncztcclxuICAgICAgaWYocHJvamVjdC5jaHVua2VkUmVjb3JkaW5nPT09dHJ1ZSl7XHJcbiAgICAgICAgdGhpcy51cGxvYWRDaHVua1NpemVTZWNvbmRzPUJhc2ljUmVjb3JkZXIuREVGQVVMVF9DSFVOS19TSVpFX1NFQ09ORFM7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHRoaXMudXBsb2FkQ2h1bmtTaXplU2Vjb25kcz1udWxsO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiRW1wdHkgcHJvamVjdCBjb25maWd1cmF0aW9uIVwiKVxyXG4gICAgfVxyXG4gICAgdGhpcy5jaGFubmVsQ291bnQgPSBjaENudDtcclxuICB9XHJcblxyXG5cclxuICBnZXQgcHJvamVjdCgpOlByb2plY3R8dW5kZWZpbmVkfG51bGx7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJvamVjdDtcclxuICB9XHJcblxyXG4gIHNlbGVjdFJlY29yZGluZ0ZpbGUocmY6UmVjb3JkaW5nRmlsZSl7XHJcbiAgICB0aGlzLmF1ZGlvRmV0Y2hpbmc9ZmFsc2U7XHJcbiAgICB0aGlzLmRpc3BsYXlSZWNGaWxlPXJmO1xyXG4gIH1cclxuXHJcbiAgdXBsb2FkVXBkYXRlKHVlOiBVcGxvYWRlclN0YXR1c0NoYW5nZUV2ZW50KSB7XHJcbiAgICBsZXQgdXBTdGF0dXMgPSB1ZS5zdGF0dXM7XHJcbiAgICB0aGlzLmRhdGFTYXZlZCA9IChVcGxvYWRlclN0YXR1cy5ET05FID09PSB1cFN0YXR1cyk7XHJcbiAgICBsZXQgcGVyY2VudFVwbCA9IHVlLnBlcmNlbnREb25lKCk7XHJcbiAgICBpZiAoVXBsb2FkZXJTdGF0dXMuRVJSID09PSB1cFN0YXR1cykge1xyXG4gICAgICB0aGlzLnVwbG9hZFN0YXR1cyA9ICd3YXJuJ1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHBlcmNlbnRVcGwgPCA1MCkge1xyXG4gICAgICAgIHRoaXMudXBsb2FkU3RhdHVzID0gJ2FjY2VudCdcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnVwbG9hZFN0YXR1cyA9ICdzdWNjZXNzJ1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudXBsb2FkUHJvZ3Jlc3MgPSBwZXJjZW50VXBsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgfVxyXG5cclxuICBzZXQgY29udHJvbEF1ZGlvUGxheWVyKGNvbnRyb2xBdWRpb1BsYXllcjogQXVkaW9QbGF5ZXIpIHtcclxuICAgIHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllcj1jb250cm9sQXVkaW9QbGF5ZXI7XHJcbiAgICBpZiAodGhpcy5fY29udHJvbEF1ZGlvUGxheWVyKSB7XHJcbiAgICAgIHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5saXN0ZW5lciA9IHRoaXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgY29udHJvbEF1ZGlvUGxheWVyKCk6IEF1ZGlvUGxheWVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXI7XHJcbiAgfVxyXG5cclxuICB1cGRhdGUoZTogQXVkaW9QbGF5ZXJFdmVudCkge1xyXG4gICAgaWYgKGUudHlwZSA9PSBFdmVudFR5cGUuU1RBUlRFRCkge1xyXG4gICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMudXBkYXRlVGltZXJJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgLy90aGlzLmF1ZGlvU2lnbmFsLnBsYXlGcmFtZVBvc2l0aW9uID0gdGhpcy5hcC5wbGF5UG9zaXRpb25GcmFtZXM7XHJcbiAgICAgIH0sIDUwKTtcclxuICAgIH0gZWxzZSBpZiAoZS50eXBlID09IEV2ZW50VHlwZS5TVE9QUEVEIHx8IGUudHlwZSA9PSBFdmVudFR5cGUuRU5ERUQpIHtcclxuICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy51cGRhdGVUaW1lcklkKTtcclxuICAgICAgLy8gdGhpcy5hdWRpb1NpZ25hbC5wbGF5RnJhbWVQb3NpdGlvbiA9IHRoaXMuYXAucGxheVBvc2l0aW9uRnJhbWVzO1xyXG4gICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5kaXNhYmxlZCA9ICghKHRoaXMuZGlzcGxheVJlY0ZpbGUpKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGFydERpc2FibGVkKCkge1xyXG4gICAgcmV0dXJuICF0aGlzLnRyYW5zcG9ydEFjdGlvbnMgfHwgdGhpcy5yZWFkb25seSB8fCB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RhcnRBY3Rpb24uZGlzYWJsZWRcclxuICB9XHJcblxyXG4gIHN0b3BEaXNhYmxlZCgpIHtcclxuICAgIHJldHVybiAhdGhpcy50cmFuc3BvcnRBY3Rpb25zIHx8IHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLmRpc2FibGVkXHJcbiAgfVxyXG5cclxuICBzdGFydFN0b3BOZXh0TmFtZSgpOnN0cmluZ3tcclxuICAgIGlmKCF0aGlzLnN0YXJ0RGlzYWJsZWQoKSl7XHJcbiAgICAgIHRoaXMuc3RhcnRTdG9wTmV4dEJ1dHRvbk5hbWU9XCJTdGFydFwiXHJcbiAgICB9ZWxzZSBpZighdGhpcy5zdG9wRGlzYWJsZWQoKSkge1xyXG4gICAgICB0aGlzLnN0YXJ0U3RvcE5leHRCdXR0b25OYW1lID0gXCJTdG9wXCJcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnN0YXJ0U3RvcE5leHRCdXR0b25OYW1lO1xyXG4gIH1cclxuICBzdGFydFN0b3BOZXh0SWNvbk5hbWUoKTpzdHJpbmd7XHJcbiAgICBpZighdGhpcy5zdGFydERpc2FibGVkKCkpe1xyXG4gICAgICB0aGlzLnN0YXJ0U3RvcE5leHRCdXR0b25JY29uTmFtZT1cImZpYmVyX21hbnVhbF9yZWNvcmRcIlxyXG4gICAgfWVsc2UgaWYoIXRoaXMuc3RvcERpc2FibGVkKCkpe1xyXG4gICAgICB0aGlzLnN0YXJ0U3RvcE5leHRCdXR0b25JY29uTmFtZT1cInN0b3BcIlxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuc3RhcnRTdG9wTmV4dEJ1dHRvbkljb25OYW1lXHJcbiAgfVxyXG4gIHN0YXJ0U3RvcE5leHRJY29uQ29sb3IoKTpzdHJpbmd7XHJcbiAgICBpZighdGhpcy5zdGFydERpc2FibGVkKCkpe1xyXG4gICAgICByZXR1cm4gXCJyZWRcIlxyXG4gICAgfWVsc2UgaWYoIXRoaXMuc3RvcERpc2FibGVkKCkpe1xyXG4gICAgICByZXR1cm4gXCJ5ZWxsb3dcIlxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHJldHVybiBcImdyZXlcIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXJ0U3RvcFBlcmZvcm0oKXtcclxuICAgIGlmKCF0aGlzLnN0YXJ0RGlzYWJsZWQoKSl7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9ZWxzZSBpZighdGhpcy5zdG9wRGlzYWJsZWQoKSl7XHJcbiAgICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdG9wQWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXJ0SXRlbSgpIHtcclxuICAgIHRoaXMuc3RhdHVzPVN0YXR1cy5TVEFSVElORztcclxuICAgIHN1cGVyLnN0YXJ0SXRlbSgpO1xyXG4gICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgdGhpcy5zdGF0dXM9U3RhdHVzLklETEU7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmZ3ZEFjdGlvbi5kaXNhYmxlZCA9IHRydWVcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5md2ROZXh0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLmJ3ZEFjdGlvbi5kaXNhYmxlZCA9IHRydWVcclxuICAgIHRoaXMuZGlzcGxheVJlY0ZpbGUgPSBudWxsO1xyXG4gICAgdGhpcy5kaXNwbGF5UmVjRmlsZVZlcnNpb24gPSAwO1xyXG4gICAgdGhpcy5kaXNwbGF5QXVkaW9DbGlwID0gbnVsbDtcclxuICAgIHRoaXMuc2hvd1JlY29yZGluZygpO1xyXG5cclxuICAgIGlmICh0aGlzLmFjKSB7XHJcbiAgICAgIHRoaXMuYXVkaW9GZXRjaGluZz1mYWxzZTtcclxuICAgICAgaWYgKCF0aGlzLmFjLm9wZW5lZCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZERldmljZUlkKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIk9wZW4gc2Vzc2lvbiB3aXRoIGF1ZGlvIGRldmljZSBJZDogXFwnXCIgKyB0aGlzLl9zZWxlY3RlZERldmljZUlkICsgXCJcXCcgZm9yIFwiICsgdGhpcy5fY2hhbm5lbENvdW50ICsgXCIgY2hhbm5lbHNcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiT3BlbiBzZXNzaW9uIHdpdGggZGVmYXVsdCBhdWRpbyBkZXZpY2UgZm9yIFwiICsgdGhpcy5fY2hhbm5lbENvdW50ICsgXCIgY2hhbm5lbHNcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWMub3Blbih0aGlzLl9jaGFubmVsQ291bnQsIHRoaXMuX3NlbGVjdGVkRGV2aWNlSWQsdGhpcy5fYXV0b0dhaW5Db250cm9sQ29uZmlncyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hYy5zdGFydCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZG93bmxvYWRSZWNvcmRpbmcoKSB7XHJcbiAgICBpZiAodGhpcy5kaXNwbGF5UmVjRmlsZSkge1xyXG4gICAgICBsZXQgYWI6IEF1ZGlvRGF0YUhvbGRlciB8IG51bGwgPSB0aGlzLmRpc3BsYXlSZWNGaWxlLmF1ZGlvRGF0YUhvbGRlcjtcclxuICAgICAgbGV0IHd3ID0gbmV3IFdhdldyaXRlcigpO1xyXG4gICAgICBpZiAoYWI/LmJ1ZmZlcikge1xyXG4gICAgICAgIGxldCB3YXZGaWxlID0gd3cud3JpdGVBc3luYyhhYi5idWZmZXIsICh3YXZGaWxlKSA9PiB7XHJcbiAgICAgICAgICBsZXQgYmxvYiA9IG5ldyBCbG9iKFt3YXZGaWxlXSwge3R5cGU6ICdhdWRpby93YXYnfSk7XHJcbiAgICAgICAgICBsZXQgcmZVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG5cclxuICAgICAgICAgIGxldCBkYXRhRG5sTG5rID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgICAgICAvL2RhdGFEbmxMbmsubmFtZSA9ICdSZWNvcmRpbmcnO1xyXG4gICAgICAgICAgZGF0YURubExuay5ocmVmID0gcmZVcmw7XHJcblxyXG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5ib2R5LCBkYXRhRG5sTG5rKTtcclxuXHJcbiAgICAgICAgICAvLyBkb3dubG9hZCBwcm9wZXJ0eSBub3QgeWV0IGluIFRTIGRlZlxyXG4gICAgICAgICAgaWYgKHRoaXMuZGlzcGxheVJlY0ZpbGUpIHtcclxuICAgICAgICAgICAgbGV0IGZuID0gdGhpcy5kaXNwbGF5UmVjRmlsZS5maWxlbmFtZVN0cmluZygpO1xyXG4gICAgICAgICAgICBmbiArPSAnXycgKyB0aGlzLmRpc3BsYXlSZWNGaWxlVmVyc2lvbjtcclxuICAgICAgICAgICAgZm4gKz0gJy53YXYnO1xyXG4gICAgICAgICAgICBkYXRhRG5sTG5rLmRvd25sb2FkID0gZm47XHJcbiAgICAgICAgICAgIGRhdGFEbmxMbmsuY2xpY2soKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQoZG9jdW1lbnQuYm9keSwgZGF0YURubExuayk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldCBkaXNwbGF5UmVjRmlsZShkaXNwbGF5UmVjRmlsZTogUmVjb3JkaW5nRmlsZSB8IG51bGwpIHtcclxuICAgIHRoaXMuX2Rpc3BsYXlSZWNGaWxlID0gZGlzcGxheVJlY0ZpbGU7XHJcbiAgICBpZiAodGhpcy5fZGlzcGxheVJlY0ZpbGUpIHtcclxuICAgICAgbGV0IGFkaDogQXVkaW9EYXRhSG9sZGVyfCBudWxsID0gdGhpcy5fZGlzcGxheVJlY0ZpbGUuYXVkaW9EYXRhSG9sZGVyO1xyXG4gICAgICBpZihhZGgpIHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBuZXcgQXVkaW9DbGlwKGFkaCk7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhcIiBzZXQgcmVjb3JkaW5nIGZpbGU6IGRpc3BsYXkgYXVkaW8gY2xpcCBzZXRcIik7XHJcbiAgICAgICAgdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIuYXVkaW9DbGlwID0gdGhpcy5kaXNwbGF5QXVkaW9DbGlwO1xyXG4gICAgICB9ZWxzZSB7XHJcbiAgICAgICAgLy8gY2xlYXIgZm9yIG5vdyAuLi5cclxuICAgICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBudWxsO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJzZXQgcmVjb3JkaW5nIGZpbGU6IGRpc3BsYXkgYXVkaW8gY2xpcCBudWxsXCIpO1xyXG4gICAgICAgIHRoaXMuY29udHJvbEF1ZGlvUGxheWVyLmF1ZGlvQ2xpcCA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIgJiYgdGhpcy5fc2Vzc2lvbikge1xyXG4gICAgICAgICAgLy8uLi4gYW5kIHRyeSB0byBmZXRjaCBmcm9tIHNlcnZlclxyXG4gICAgICAgICAgdGhpcy5hdWRpb0ZldGNoaW5nPXRydWU7XHJcbiAgICAgICAgICBsZXQgcmY9dGhpcy5fZGlzcGxheVJlY0ZpbGU7XHJcbiAgICAgICAgICBsZXQgY2xpcD10aGlzLmRpc3BsYXlBdWRpb0NsaXA7XHJcbiAgICAgICAgICB0aGlzLmF1ZGlvRmV0Y2hTdWJzY3JpcHRpb24gPSB0aGlzLnJlY0ZpbGVTZXJ2aWNlLmZldGNoUmVjb3JkaW5nRmlsZUF1ZGlvQnVmZmVyKHRoaXMuX2NvbnRyb2xBdWRpb1BsYXllci5jb250ZXh0LCB0aGlzLl9zZXNzaW9uLnByb2plY3QsIHJmKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiBhYiA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hdWRpb0ZldGNoaW5nPWZhbHNlO1xyXG4gICAgICAgICAgICAgIGxldCBmYWJEaCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgaWYoYWIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZikge1xyXG4gICAgICAgICAgICAgICAgICBmYWJEaCA9IG5ldyBBdWRpb0RhdGFIb2xkZXIoYWIpO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnJlY29yZGVyQ29tYmlQYW5lLnNldFJlY0ZpbGVBdWRpb0RhdGEocmYsIGZhYkRoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignUmVjb3JkaW5nIGZpbGUgY291bGQgbm90IGJlIGxvYWRlZC4nKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTXNnID0gJ1JlY29yZGluZyBmaWxlIGNvdWxkIG5vdCBiZSBsb2FkZWQuJztcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGZhYkRoKXtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCBjb3VsZCBoYXZlIGJlZW4gY2hhbmdlZCBtZWFud2hpbGUsIGJ1dCB0aGUgcmVjb3JkZXIgdW5zdWJjcmliZXMgYmVmb3JlIGNoYW5naW5nIHRoZSBpdGVtLiBUaGVyZWZvcmUgdGhlcmUgc2hvdWxkIGJlIG5vIHJpc2sgdG8gc2V0IHRvIHdyb25nIGl0ZW1cclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUF1ZGlvQ2xpcCA9IG5ldyBBdWRpb0NsaXAoZmFiRGgpO1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwic2V0IHJlY29yZGluZyBmaWxlOiBkaXNwbGF5IGF1ZGlvIGNsaXAgZnJvbSBmZXRjaGVkIGF1ZGlvIGJ1ZmZlclwiKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIuYXVkaW9DbGlwID10aGlzLmRpc3BsYXlBdWRpb0NsaXA7XHJcbiAgICAgICAgICAgICAgdGhpcy5zaG93UmVjb3JkaW5nKCk7XHJcbiAgICAgICAgICAgIH0sIGVycm9yOiBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDb3VsZCBub3QgbG9hZCByZWNvcmRpbmcgZmlsZSBmcm9tIHNlcnZlcjogXCIgKyBlcnIpO1xyXG4gICAgICAgICAgICAgIHRoaXMuYXVkaW9GZXRjaGluZz1mYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLnN0YXR1c01zZyA9ICdSZWNvcmRpbmcgZmlsZSBjb3VsZCBub3QgYmUgbG9hZGVkOiAnICsgZXJyO1xyXG4gICAgICAgICAgICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgICAgICAgfX0pXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICB0aGlzLnN0YXR1c01zZyA9ICdSZWNvcmRpbmcgZmlsZSBjb3VsZCBub3QgYmUgZGVjb2RlZC4gQXVkaW8gY29udGV4dCB1bmF2YWlsYWJsZS4nO1xyXG4gICAgICAgICAgdGhpcy5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJyZWNvcmRpbmcgZmlsZSBudWxsXCIpO1xyXG4gICAgICB0aGlzLmRpc3BsYXlBdWRpb0NsaXAgPSBudWxsO1xyXG4gICAgICB0aGlzLmNvbnRyb2xBdWRpb1BsYXllci5hdWRpb0NsaXAgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zaG93UmVjb3JkaW5nKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGlzcGxheVJlY0ZpbGUoKTogUmVjb3JkaW5nRmlsZSB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlSZWNGaWxlO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlU3RhcnRBY3Rpb25EaXNhYmxlU3RhdGUoKXtcclxuICAgIHRoaXMudHJhbnNwb3J0QWN0aW9ucy5zdGFydEFjdGlvbi5kaXNhYmxlZD0hKHRoaXMuYWMpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnQoKSB7XHJcbiAgICBzdXBlci5zdGFydCgpO1xyXG4gICAgdGhpcy5yZWNvcmRlckNvbWJpUGFuZS5zZWxlY3RUb3AoKTtcclxuICAgIHRoaXMuZW5hYmxlTmF2aWdhdGlvbigpO1xyXG4gICAgdGhpcy51cGRhdGVTdGFydEFjdGlvbkRpc2FibGVTdGF0ZSgpO1xyXG5cclxuICB9XHJcblxyXG4gIGlzUmVjb3JkaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh0aGlzLnN0YXR1cyA9PT0gU3RhdHVzLlJFQ09SRElORyk7XHJcbiAgfVxyXG5cclxuICBpc0FjdGl2ZSgpOiBib29sZWFue1xyXG4gICAgcmV0dXJuICghKHRoaXMuc3RhdHVzID09PSBTdGF0dXMuQkxPQ0tFRCB8fCB0aGlzLnN0YXR1cz09PSBTdGF0dXMuSURMRSB8fCB0aGlzLnN0YXR1cz09PVN0YXR1cy5FUlJPUikgfHwgdGhpcy5wcm9jZXNzaW5nUmVjb3JkaW5nIHx8IHRoaXMuc2Vzc2lvblNlcnZpY2UudXBsb2FkQ291bnQ+MClcclxuICB9XHJcblxyXG5cclxuICB1cGRhdGVXYWtlTG9jayhkYXRhU2F2ZWQ6Ym9vbGVhbj10aGlzLmRhdGFTYXZlZCl7XHJcbiAgICAvL2NvbnNvbGUuZGVidWcoXCJVcGRhdGUgd2FrZSBsb2NrOiBkYXRhU2F2ZWQ6IFwiK2RhdGFTYXZlZCtcIiwgbm90IGFjdGl2ZTogXCIrISB0aGlzLmlzQWN0aXZlKCkpXHJcbiAgICBpZihkYXRhU2F2ZWQgJiYgISB0aGlzLmlzQWN0aXZlKCkpe1xyXG4gICAgICB0aGlzLmRpc2FibGVXYWtlTG9ja0NvbmQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKXtcclxuXHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuZndkQWN0aW9uLmRpc2FibGVkID0gdGhpcy5uYXZpZ2F0aW9uRGlzYWJsZWQ7XHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuYndkQWN0aW9uLmRpc2FibGVkID0gdGhpcy5uYXZpZ2F0aW9uRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBlbmFibGVTdGFydFVzZXJHZXN0dXJlKCkge1xyXG4gICAgc3VwZXIuZW5hYmxlU3RhcnRVc2VyR2VzdHVyZSgpO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0YXJ0QWN0aW9uLmRpc2FibGVkPSEodGhpcy5hYyk7XHJcbiAgfVxyXG5cclxuICBlbmFibGVOYXZpZ2F0aW9uKCl7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25EaXNhYmxlZD1mYWxzZTtcclxuICAgIHRoaXMudXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIG9wZW5lZCgpIHtcclxuICAgIGlmKHRoaXMuYWMpIHtcclxuICAgICAgdGhpcy5hYy5zdGFydCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhcnRlZCgpIHtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlJFQ09SRElORztcclxuICAgIHN1cGVyLnN0YXJ0ZWQoKTtcclxuICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2luZm8nO1xyXG4gICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkaW5nLi4uJztcclxuXHJcbiAgICBpZighdGhpcy5yZlV1aWQpe1xyXG4gICAgICB0aGlzLnJmVXVpZD1VVUlELmdlbmVyYXRlKClcclxuICAgIH1cclxuICAgIGxldCBzZXNzSWQ6IHN0cmluZyB8IG51bWJlciA9IDA7XHJcbiAgICBpZih0aGlzLl9zZXNzaW9uKXtcclxuICAgICAgc2Vzc0lkPXRoaXMuX3Nlc3Npb24uc2Vzc2lvbklkO1xyXG4gICAgfVxyXG4gICAgbGV0IHJmID0gbmV3IFJlY29yZGluZ0ZpbGUodGhpcy5yZlV1aWQsc2Vzc0lkLG51bGwpO1xyXG4gICAgcmYuX3N0YXJ0ZWRBc0RhdGVPYmo9dGhpcy5zdGFydGVkRGF0ZTtcclxuICAgIGlmKHJmLl9zdGFydGVkQXNEYXRlT2JqKSB7XHJcbiAgICAgIHJmLnN0YXJ0ZWREYXRlID0gcmYuX3N0YXJ0ZWRBc0RhdGVPYmoudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9yZWNvcmRpbmdGaWxlPXJmO1xyXG5cclxuICAgIGxldCBtYXhSZWNvcmRpbmdUaW1lTXMgPSBNQVhfUkVDT1JESU5HX1RJTUVfTVM7XHJcbiAgICB0aGlzLm1heFJlY1RpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc3RvcFJlY29yZGluZ01heFJlYygpXHJcbiAgICB9LCBtYXhSZWNvcmRpbmdUaW1lTXMpO1xyXG4gICAgdGhpcy5tYXhSZWNUaW1lclJ1bm5pbmcgPSB0cnVlO1xyXG5cclxuXHJcbiAgICB0aGlzLnRyYW5zcG9ydEFjdGlvbnMuc3RvcEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgc3RvcEl0ZW0oKSB7XHJcblxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuU1RPUFBJTkdfU1RPUDtcclxuICAgIHRoaXMuc3RvcFJlY29yZGluZygpO1xyXG5cclxuICB9XHJcblxyXG4gIHN0b3BSZWNvcmRpbmcoKSB7XHJcbiAgICBpZiAodGhpcy5tYXhSZWNUaW1lclJ1bm5pbmcgJiYgdGhpcy5tYXhSZWNUaW1lcklkIT1udWxsKSB7XHJcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5tYXhSZWNUaW1lcklkKTtcclxuICAgICAgdGhpcy5tYXhSZWNUaW1lclJ1bm5pbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuYWMpIHtcclxuICAgICAgdGhpcy5hYy5zdG9wKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdG9wUmVjb3JkaW5nTWF4UmVjKCl7XHJcblxyXG4gICAgdGhpcy5tYXhSZWNUaW1lclJ1bm5pbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuc3RhdHVzID0gU3RhdHVzLlNUT1BQSU5HX1NUT1A7XHJcbiAgICBpZih0aGlzLmFjKSB7XHJcbiAgICAgIHRoaXMuYWMuc3RvcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RvcHBlZCgpIHtcclxuICAgIHRoaXMudXBkYXRlU3RhcnRBY3Rpb25EaXNhYmxlU3RhdGUoKVxyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnN0b3BBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLm5leHRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmFuc3BvcnRBY3Rpb25zLnBhdXNlQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RhdHVzQWxlcnRUeXBlID0gJ2luZm8nO1xyXG4gICAgdGhpcy5zdGF0dXNNc2cgPSAnUmVjb3JkZWQuJztcclxuXHJcbiAgICBsZXQgYWQ6QXVkaW9CdWZmZXJ8bnVsbD1udWxsO1xyXG4gICAgbGV0IGFkYTpBcnJheUF1ZGlvQnVmZmVyfG51bGw9bnVsbDtcclxuICAgIGxldCBhZGg6QXVkaW9EYXRhSG9sZGVyfG51bGw9bnVsbDtcclxuICAgIGxldCBmcmFtZUxlbjpudW1iZXI9MDtcclxuICAgIGlmKHRoaXMuYWMpIHtcclxuICAgICAgaWYodGhpcy51cGxvYWRDaHVua1NpemVTZWNvbmRzIHx8IEF1ZGlvUmVjb3JkZXIuRk9SQ0VfQVJSUkFZX0FVRElPX0JVRkZFUil7XHJcbiAgICAgICAgYWRhPXRoaXMuYWMuYXVkaW9CdWZmZXJBcnJheSgpO1xyXG4gICAgICAgIGZyYW1lTGVuID0gYWRhLmZyYW1lTGVuO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBhZD10aGlzLmFjLmF1ZGlvQnVmZmVyKCk7XHJcbiAgICAgICAgZnJhbWVMZW49YWQubGVuZ3RoO1xyXG4gICAgICB9XHJcbiAgICAgIGFkaD1uZXcgQXVkaW9EYXRhSG9sZGVyKGFkLGFkYSk7XHJcblxyXG4gICAgICBsZXQgc2Vzc0lkOiBzdHJpbmcgfCBudW1iZXIgPSAwO1xyXG4gICAgICBpZih0aGlzLl9zZXNzaW9uKXtcclxuICAgICAgICBzZXNzSWQ9dGhpcy5fc2Vzc2lvbi5zZXNzaW9uSWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmKHRoaXMuX3JlY29yZGluZ0ZpbGUpIHtcclxuICAgICAgICAvLyBVc2UgYW4gb3duIHJlZmVyZW5jZSBzaW5jZSB0aGUgd3JpdGluZyBvZiB0aGUgd2F2ZSBmaWxlIGlzIGFzeW5jaHJvbm91cyBhbmQgdGhpcy5fcmVjb3JkaW5nRmlsZSBtaWdodCBhbHJlYWR5IGNvbnRhaW4gdGhlIG5leHQgcmVjb3JkaW5nXHJcbiAgICAgICAgbGV0IHJmID0gdGhpcy5fcmVjb3JkaW5nRmlsZTtcclxuICAgICAgICBSZWNvcmRpbmdGaWxlVXRpbHMuc2V0QXVkaW9EYXRhKHJmLGFkaCk7XHJcbiAgICAgICAgdGhpcy5yZWNvcmRlckNvbWJpUGFuZS5hZGRSZWNGaWxlKHJmKTtcclxuXHJcbiAgICAgICAgLy8gVXBsb2FkIGlmIHVwbG9hZCBlbmFibGVkIGFuZCBub3QgaW4gY2h1bmtlZCB1cGxvYWQgbW9kZVxyXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVVwbG9hZFJlY29yZGluZ3MgJiYgIXRoaXMudXBsb2FkQ2h1bmtTaXplU2Vjb25kcyAmJiByZiAhPSBudWxsICYmIGFkICE9IG51bGwpIHtcclxuICAgICAgICAgIGxldCBhcGlFbmRQb2ludCA9ICcnO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlFbmRQb2ludCkge1xyXG4gICAgICAgICAgICBhcGlFbmRQb2ludCA9IHRoaXMuY29uZmlnLmFwaUVuZFBvaW50O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGFwaUVuZFBvaW50ICE9PSAnJykge1xyXG4gICAgICAgICAgICBhcGlFbmRQb2ludCA9IGFwaUVuZFBvaW50ICsgJy8nXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbGV0IHNlc3Npb25zVXJsID0gYXBpRW5kUG9pbnQgKyBTZXNzaW9uU2VydmljZS5TRVNTSU9OX0FQSV9DVFg7XHJcbiAgICAgICAgICBsZXQgcmVjVXJsOiBzdHJpbmcgPSBzZXNzaW9uc1VybCArICcvJyArIHJmLnNlc3Npb24gKyAnLycgKyBSRUNGSUxFX0FQSV9DVFggKyAnLycgKyByZi51dWlkO1xyXG5cclxuICAgICAgICAgIC8vIGNvbnZlcnQgYXN5bmNocm9ub3VzbHkgdG8gMTYtYml0IGludGVnZXIgUENNXHJcbiAgICAgICAgICAvLyBUT0RPIGNvdWxkIHdlIGF2b2lkIGNvbnZlcnNpb24gdG8gc2F2ZSBDUFUgcmVzb3VyY2VzIGFuZCB0cmFuc2ZlciBmbG9hdCBQQ00gZGlyZWN0bHk/XHJcbiAgICAgICAgICAvLyBUT0RPIGR1cGxpY2F0ZSBjb252ZXJzaW9uIGZvciBtYW51YWwgZG93bmxvYWRcclxuXHJcbiAgICAgICAgICB0aGlzLnByb2Nlc3NpbmdSZWNvcmRpbmcgPSB0cnVlXHJcbiAgICAgICAgICBsZXQgd3cgPSBuZXcgV2F2V3JpdGVyKCk7XHJcbiAgICAgICAgICB3dy53cml0ZUFzeW5jKGFkLCAod2F2RmlsZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBvc3RSZWNvcmRpbmdNdWx0aXBhcnQod2F2RmlsZSxyZWNVcmwscmYpO1xyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NpbmdSZWNvcmRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVXYWtlTG9jaygpO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5kaXNwbGF5UmVjRmlsZSA9IHRoaXMuX3JlY29yZGluZ0ZpbGU7XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5JRExFO1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgIHRoaXMudXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKTtcclxuICAgIHRoaXMudXBkYXRlV2FrZUxvY2soKTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBwb3N0UmVjb3JkaW5nTXVsdGlwYXJ0KHdhdkZpbGU6IFVpbnQ4QXJyYXkscmVjVXJsOiBzdHJpbmcscmY6UmVjb3JkaW5nRmlsZSkge1xyXG4gICAgbGV0IHdhdkJsb2IgPSBuZXcgQmxvYihbd2F2RmlsZV0sIHt0eXBlOiAnYXVkaW8vd2F2J30pO1xyXG5cclxuICAgIGxldCBmZD1uZXcgRm9ybURhdGEoKTtcclxuICAgIGlmKHJmLnV1aWQpIHtcclxuICAgICAgZmQuc2V0KCd1dWlkJywgcmYudXVpZCk7XHJcbiAgICB9XHJcbiAgICBpZihyZi5zZXNzaW9uIT09bnVsbCkge1xyXG4gICAgICBmZC5zZXQoJ3Nlc3Npb25JZCcsIHJmLnNlc3Npb24udG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcbiAgICBpZihyZi5fc3RhcnRlZEFzRGF0ZU9iail7XHJcbiAgICAgIGZkLnNldCgnc3RhcnRlZERhdGUnLHJmLl9zdGFydGVkQXNEYXRlT2JqLnRvSlNPTigpKTtcclxuICAgIH1cclxuICAgIGZkLnNldCgnYXVkaW8nLHdhdkJsb2IpO1xyXG4gICAgbGV0IHVsID0gbmV3IFVwbG9hZChmZCwgcmVjVXJsLHJmKTtcclxuICAgIHRoaXMudXBsb2FkZXIucXVldWVVcGxvYWQodWwpO1xyXG4gIH1cclxuXHJcbiAgcG9zdENodW5rQXVkaW9CdWZmZXIoYXVkaW9CdWZmZXI6IEF1ZGlvQnVmZmVyLCBjaHVua0lkeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnByb2Nlc3NpbmdSZWNvcmRpbmcgPSB0cnVlO1xyXG4gICAgbGV0IHd3ID0gbmV3IFdhdldyaXRlcigpO1xyXG4gICAgLy9uZXcgUkVTVCBBUEkgVVJMXHJcbiAgICBsZXQgYXBpRW5kUG9pbnQgPSAnJztcclxuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlFbmRQb2ludCkge1xyXG4gICAgICBhcGlFbmRQb2ludCA9IHRoaXMuY29uZmlnLmFwaUVuZFBvaW50O1xyXG4gICAgfVxyXG4gICAgaWYgKGFwaUVuZFBvaW50ICE9PSAnJykge1xyXG4gICAgICBhcGlFbmRQb2ludCA9IGFwaUVuZFBvaW50ICsgJy8nXHJcbiAgICB9XHJcbiAgICBsZXQgc2Vzc2lvbnNVcmwgPSBhcGlFbmRQb2ludCArIFNlc3Npb25TZXJ2aWNlLlNFU1NJT05fQVBJX0NUWDtcclxuICAgIGxldCByZWNVcmw6IHN0cmluZyA9IHNlc3Npb25zVXJsICsgJy8nICsgdGhpcy5zZXNzaW9uPy5zZXNzaW9uSWQgKyAnLycgKyBSRUNGSUxFX0FQSV9DVFggKyAnLycgKyB0aGlzLnJmVXVpZCsnLycrY2h1bmtJZHg7XHJcbiAgICBsZXQgcmY9dGhpcy5fcmVjb3JkaW5nRmlsZTtcclxuICAgIHd3LndyaXRlQXN5bmMoYXVkaW9CdWZmZXIsICh3YXZGaWxlKSA9PiB7XHJcbiAgICAgIHRoaXMucG9zdFJlY29yZGluZyh3YXZGaWxlLCByZWNVcmwscmYpO1xyXG4gICAgICB0aGlzLnByb2Nlc3NpbmdSZWNvcmRpbmcgPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3RvcCgpIHtcclxuICAgIGlmKHRoaXMuYWMpIHtcclxuICAgICAgdGhpcy5hYy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVDb250cm9sUGxheWJhY2tQb3NpdGlvbigpIHtcclxuICAgIGlmICh0aGlzLl9jb250cm9sQXVkaW9QbGF5ZXIucGxheVBvc2l0aW9uRnJhbWVzKSB7XHJcbiAgICAgIHRoaXMucmVjb3JkZXJDb21iaVBhbmUuYXVkaW9EaXNwbGF5LnBsYXlGcmFtZVBvc2l0aW9uID0gdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLnBsYXlQb3NpdGlvbkZyYW1lcztcclxuICAgICAgdGhpcy5saXZlTGV2ZWxEaXNwbGF5LnBsYXlGcmFtZVBvc2l0aW9uID0gdGhpcy5fY29udHJvbEF1ZGlvUGxheWVyLnBsYXlQb3NpdGlvbkZyYW1lcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGF1ZGlvUGxheWVyVXBkYXRlKGU6IEF1ZGlvUGxheWVyRXZlbnQpIHtcclxuICAgIGlmIChFdmVudFR5cGUuUkVBRFkgPT09IGUudHlwZSkge1xyXG5cclxuICAgIH0gZWxzZSBpZiAoRXZlbnRUeXBlLlNUQVJURUQgPT09IGUudHlwZSkge1xyXG4gICAgICAvL3RoaXMuc3RhdHVzID0gJ1BsYXliYWNrLi4uJztcclxuICAgICAgdGhpcy51cGRhdGVUaW1lcklkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHRoaXMudXBkYXRlQ29udHJvbFBsYXliYWNrUG9zaXRpb24oKSwgNTApO1xyXG5cclxuICAgIH0gZWxzZSBpZiAoRXZlbnRUeXBlLkVOREVEID09PSBlLnR5cGUpIHtcclxuICAgICAgLy8uc3RhdHVzPSdSZWFkeS4nO1xyXG4gICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVwZGF0ZVRpbWVySWQpO1xyXG5cclxuICAgIH1cclxuICAgIGlmKCF0aGlzLmRlc3Ryb3llZCkge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtYXVkaW9yZWNvcmRlci1jb21wJyxcclxuICBwcm92aWRlcnM6IFtTZXNzaW9uU2VydmljZV0sXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxhcHAtYXVkaW9yZWNvcmRlciBbcHJvamVjdE5hbWVdPVwiX3Byb2plY3Q/Lm5hbWVcIiBbZGF0YVNhdmVkXT1cImRhdGFTYXZlZFwiPjwvYXBwLWF1ZGlvcmVjb3JkZXI+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgOmhvc3R7XHJcbiAgICBmbGV4OiAyO1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIG1pbi1oZWlnaHQ6MDtcclxuXHJcbiAgfWBdXHJcblxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXVkaW9SZWNvcmRlckNvbXBvbmVudCBleHRlbmRzIFJlY29yZGVyQ29tcG9uZW50ICBpbXBsZW1lbnRzIE9uSW5pdCxPbkRlc3Ryb3ksQWZ0ZXJWaWV3SW5pdCxSZWFkeVN0YXRlUHJvdmlkZXIge1xyXG5cclxuICBtb2RlITpNb2RlO1xyXG4gIGNvbnRyb2xBdWRpb1BsYXllciE6QXVkaW9QbGF5ZXI7XHJcbiAgYXVkaW86YW55O1xyXG5cclxuICBfcHJvamVjdDpQcm9qZWN0fHVuZGVmaW5lZDtcclxuICBzZXNzaW9uSWQhOiBzdHJpbmc7XHJcbiAgc2Vzc2lvbiE6U2Vzc2lvbjtcclxuXHJcbiAgQFZpZXdDaGlsZChBdWRpb1JlY29yZGVyLCB7IHN0YXRpYzogdHJ1ZSB9KSBhciE6QXVkaW9SZWNvcmRlcjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGluamVjdG9yOkluamVjdG9yLHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzZXNzaW9uU2VydmljZTpTZXNzaW9uU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIHByb2plY3RTZXJ2aWNlOlByb2plY3RTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByb3RlY3RlZCB1cGxvYWRlcjpTcGVlY2hSZWNvcmRlclVwbG9hZGVyXHJcbiAgKSB7XHJcbiAgICBzdXBlcih1cGxvYWRlcik7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIC8vc3VwZXIubmdPbkluaXQoKTtcclxuICAgIGxldCBhdWRpb0NvbnRleHQgPSBBdWRpb0NvbnRleHRQcm92aWRlci5hdWRpb0NvbnRleHRJbnN0YW5jZSgpO1xyXG4gICAgaWYoYXVkaW9Db250ZXh0KSB7XHJcbiAgICAgIHRoaXMuY29udHJvbEF1ZGlvUGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKGF1ZGlvQ29udGV4dCx0aGlzLmFyKTtcclxuICAgIH1cclxuICAgIHRoaXMuYXIuY29udHJvbEF1ZGlvUGxheWVyPXRoaXMuY29udHJvbEF1ZGlvUGxheWVyO1xyXG5cclxuICAgIC8vVE9ETyBEdXBsaWNhdGUgY29kZSBpbiBTcGVlY2hSZWNvcmRlckNvbXBvbmVudFxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIChlKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJCZWZvcmUgcGFnZSB1bmxvYWQgZXZlbnRcIik7XHJcblxyXG4gICAgICBpZiAodGhpcy5yZWFkeSgpKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGFsbCB0aGlzIGF0dGVtcHRzIHRvIGN1c3RvbWl6ZSB0aGUgbWVzc2FnZSBkbyBub3Qgd29yayBhbnltb3JlIChmb3Igc2VjdXJpdHkgcmVhc29ucykhIVxyXG4gICAgICAgIHZhciBtZXNzYWdlID0gXCJQbGVhc2UgZG8gbm90IGxlYXZlIHRoZSBwYWdlLCB1bnRpbCBhbGwgcmVjb3JkaW5ncyBhcmUgdXBsb2FkZWQhXCI7XHJcbiAgICAgICAgYWxlcnQobWVzc2FnZSk7XHJcbiAgICAgICAgZSA9IGUgfHwgd2luZG93LmV2ZW50O1xyXG5cclxuICAgICAgICBpZiAoZSkge1xyXG4gICAgICAgICAgZS5yZXR1cm5WYWx1ZSA9IG1lc3NhZ2U7XHJcbiAgICAgICAgICBlLmNhbmNlbEJ1YmJsZSA9IHRydWU7XHJcbiAgICAgICAgICBpZiAoZS5zdG9wUHJvcGFnYXRpb24pIHtcclxuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMudXBsb2FkZXIubGlzdGVuZXIgPSAodWUpID0+IHtcclxuICAgICAgdGhpcy51cGxvYWRVcGRhdGUodWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5zdWJzY3JpYmUoKHBhcmFtczogUGFyYW1zKSA9PiB7XHJcbiAgICAgIGlmIChwYXJhbXNbJ3Nlc3Npb25JZCddKSB7XHJcbiAgICAgICAgdGhpcy5mZXRjaFNlc3Npb24ocGFyYW1zWydzZXNzaW9uSWQnXSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKChwYXJhbXM6IFBhcmFtcykgPT4ge1xyXG4gICAgICBsZXQgcm91dGVQYXJhbXNJZCA9IHBhcmFtc1snaWQnXTtcclxuICAgICAgaWYgKHJvdXRlUGFyYW1zSWQpIHtcclxuICAgICAgICB0aGlzLmZldGNoU2Vzc2lvbihyb3V0ZVBhcmFtc0lkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIC8vc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICB9XHJcblxyXG4gIGdldCBzY3JlZW5Mb2NrZWQoKTpib29sZWFue1xyXG4gICAgcmV0dXJuICB0aGlzLmFyLnNjcmVlbkxvY2tlZDtcclxuICB9XHJcblxyXG4gIGZldGNoU2Vzc2lvbihzZXNzaW9uSWQ6c3RyaW5nKXtcclxuXHJcbiAgICBsZXQgc2Vzc09icz0gdGhpcy5zZXNzaW9uU2VydmljZS5zZXNzaW9uT2JzZXJ2ZXIoc2Vzc2lvbklkKTtcclxuXHJcbiAgICBpZihzZXNzT2JzKSB7XHJcbiAgICAgIHNlc3NPYnMuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OihzZXNzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmFyLnN0YXR1c0FsZXJ0VHlwZT0naW5mbyc7XHJcbiAgICAgICAgICB0aGlzLmFyLnN0YXR1c01zZyA9ICdSZWNlaXZlZCBzZXNzaW9uIGluZm8uJztcclxuICAgICAgICAgIHRoaXMuYXIuc3RhdHVzV2FpdGluZz1mYWxzZTtcclxuICAgICAgICAgIHRoaXMuc2Vzc2lvbj1zZXNzO1xyXG4gICAgICAgICAgdGhpcy5hci5zZXNzaW9uPXNlc3M7XHJcbiAgICAgICAgICBpZiAoc2Vzcy5wcm9qZWN0KSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlNlc3Npb24gYXNzb2NpYXRlZCBwcm9qZWN0OiBcIitzZXNzLnByb2plY3QpXHJcbiAgICAgICAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdE9ic2VydmFibGUoc2Vzcy5wcm9qZWN0KS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgIG5leHQ6KHByb2plY3QpPT57XHJcbiAgICAgICAgICAgICAgdGhpcy5hci5wcm9qZWN0PXByb2plY3Q7XHJcbiAgICAgICAgICAgICAgdGhpcy5hci5mZXRjaFJlY29yZGluZ3Moc2Vzcyk7XHJcbiAgICAgICAgICAgIH0sZXJyb3I6KHJlYXNvbikgPT57XHJcbiAgICAgICAgICAgICAgdGhpcy5hci5zdGF0dXNNc2c9cmVhc29uO1xyXG4gICAgICAgICAgICAgIHRoaXMuYXIuc3RhdHVzQWxlcnRUeXBlPSdlcnJvcic7XHJcbiAgICAgICAgICAgICAgdGhpcy5hci5zdGF0dXNXYWl0aW5nPWZhbHNlO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBwcm9qZWN0IGNvbmZpZzogXCIrcmVhc29uKVxyXG4gICAgICAgICAgICB9fSk7XHJcblxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiU2Vzc2lvbiBoYXMgbm8gYXNzb2NpYXRlZCBwcm9qZWN0LiBVc2luZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uXCIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjoocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmFyLnN0YXR1c01zZyA9IHJlYXNvbjtcclxuICAgICAgICAgIHRoaXMuYXIuc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgICAgIHRoaXMuYXIuc3RhdHVzV2FpdGluZz1mYWxzZTtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBzZXNzaW9uIFwiICsgcmVhc29uKVxyXG4gICAgICAgIH19KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwbG9hZFVwZGF0ZSh1ZTogVXBsb2FkZXJTdGF0dXNDaGFuZ2VFdmVudCkge1xyXG4gICAgbGV0IHVwU3RhdHVzID0gdWUuc3RhdHVzO1xyXG4gICAgdGhpcy5kYXRhU2F2ZWQgPSAoVXBsb2FkZXJTdGF0dXMuRE9ORSA9PT0gdXBTdGF0dXMpO1xyXG4gICAgbGV0IHBlcmNlbnRVcGwgPSB1ZS5wZXJjZW50RG9uZSgpO1xyXG4gICAgaWYgKFVwbG9hZGVyU3RhdHVzLkVSUiA9PT0gdXBTdGF0dXMpIHtcclxuICAgICAgdGhpcy5hci51cGxvYWRTdGF0dXMgPSAnd2FybidcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChwZXJjZW50VXBsIDwgNTApIHtcclxuICAgICAgICB0aGlzLmFyLnVwbG9hZFN0YXR1cyA9ICdhY2NlbnQnXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hci51cGxvYWRTdGF0dXMgPSAnc3VjY2VzcydcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmFyLnVwbG9hZFByb2dyZXNzID0gcGVyY2VudFVwbDtcclxuICAgIH1cclxuICAgIHRoaXMuYXIudXBkYXRlV2FrZUxvY2sodGhpcy5kYXRhU2F2ZWQpO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKClcclxuICB9XHJcblxyXG5cclxuICByZWFkeSgpOmJvb2xlYW57XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhU2F2ZWQgJiYgIXRoaXMuYXIuaXNBY3RpdmUoKVxyXG4gIH1cclxuXHJcbn1cclxuIl19