@eqproject/eqp-attachments 0.1.15 → 0.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,21 +1,23 @@
1
1
  import { __awaiter, __decorate, __generator, __read, __spread, __values } from "tslib";
2
- import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, TemplateRef, ViewChild } from '@angular/core';
3
- import { FormBuilder, FormGroup, Validators } from '@angular/forms';
4
- import { base64ToFile, ImageCropperComponent } from 'ngx-image-cropper';
5
- import imageCompression from 'browser-image-compression';
6
- import { AttachmentType } from './interfaces/IAttachment';
7
- import { TooltipPositionType, TypeColumn } from '@eqproject/eqp-table';
8
- import { MatDialog, MatDialogRef } from '@angular/material/dialog';
9
- import { AttachmentHelperService } from './helpers/attachment.helper';
10
- import { EqpAttachmentDialogService } from './services/eqp-attachment-dialog.service';
11
- import { DomSanitizer } from '@angular/platform-browser';
12
- import { HttpClient } from '@angular/common/http';
13
- var toBase64 = function (file) { return new Promise(function (resolve, reject) {
14
- var reader = new FileReader();
15
- reader.readAsDataURL(file);
16
- reader.onload = function () { return resolve(reader.result.toString()); };
17
- reader.onerror = function (error) { return reject(error); };
18
- }); };
2
+ import { HttpClient } from "@angular/common/http";
3
+ import { AfterViewInit, ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, TemplateRef, ViewChild } from "@angular/core";
4
+ import { FormBuilder, FormGroup, Validators } from "@angular/forms";
5
+ import { MatDialog, MatDialogRef } from "@angular/material/dialog";
6
+ import { DomSanitizer } from "@angular/platform-browser";
7
+ import { TooltipPositionType, TypeColumn } from "@eqproject/eqp-table";
8
+ import imageCompression from "browser-image-compression";
9
+ import { ImageCropperComponent, base64ToFile } from "ngx-image-cropper";
10
+ import { AttachmentHelperService } from "./helpers/attachment.helper";
11
+ import { AttachmentType } from "./interfaces/IAttachment";
12
+ import { EqpAttachmentDialogService } from "./services/eqp-attachment-dialog.service";
13
+ var toBase64 = function (file) {
14
+ return new Promise(function (resolve, reject) {
15
+ var reader = new FileReader();
16
+ reader.readAsDataURL(file);
17
+ reader.onload = function () { return resolve(reader.result.toString()); };
18
+ reader.onerror = function (error) { return reject(error); };
19
+ });
20
+ };
19
21
  var ɵ0 = toBase64;
20
22
  var EqpAttachmentsComponent = /** @class */ (function () {
21
23
  function EqpAttachmentsComponent(dialog, formBuilder, sanitizer, http, cd) {
@@ -94,7 +96,11 @@ var EqpAttachmentsComponent = /** @class */ (function () {
94
96
  /**
95
97
  * Opzioni per la compressione delle immagini caricate.
96
98
  */
97
- this.compressionOptions = { maxSizeMB: 0.5, maxWidthOrHeight: 1920, useWebWorker: true };
99
+ this.compressionOptions = {
100
+ maxSizeMB: 0.5,
101
+ maxWidthOrHeight: 1920,
102
+ useWebWorker: true
103
+ };
98
104
  /**
99
105
  * Array di AttachmentType che si possono aggiungere
100
106
  */
@@ -114,6 +120,10 @@ var EqpAttachmentsComponent = /** @class */ (function () {
114
120
  * per la tabella contenente l'elenco degli allegati
115
121
  */
116
122
  this.tablePaginatorSize = null;
123
+ /**
124
+ * Abilitare caricamento video
125
+ */
126
+ this.allowVideo = false;
117
127
  /**
118
128
  * Input per definire le label da usare nel componente
119
129
  */
@@ -154,6 +164,14 @@ var EqpAttachmentsComponent = /** @class */ (function () {
154
164
  * Evento di output che restituisce l'elemento eliminato prima che questo venga effettivamente rismosso dalla lista.
155
165
  */
156
166
  this.onDeleteAttachment = new EventEmitter();
167
+ /**
168
+ * Evento di output scatenato durante l'AfterViewInit del componente che restituisce l'istanza corrente del componente.
169
+ * Questo evento avvisa quando il componente è stato renderizzato, utile per esempio quando si vogliono aggiungere delle colonne
170
+ * alla visualizzazione con allegati multipli lasciando però quelle pre esistenti. Questo si può fare intervenendo sulla
171
+ * proprietà "attachmentsColumns" di questo componente tramite l'istanza passata come paramentro oppure tramite ViewChild
172
+ * dal componente che lo ospita.
173
+ */
174
+ this.onComponentLoaded = new EventEmitter();
157
175
  //#endregion
158
176
  //#region Proprietà per gestione caricamento nuovo allegato
159
177
  this.newAttachment = {};
@@ -164,8 +182,8 @@ var EqpAttachmentsComponent = /** @class */ (function () {
164
182
  this.showCropImage = false;
165
183
  //#endregion
166
184
  //#region Proprietà per gestione ridimensionamento file di tipo image
167
- this.imageChangedEvent = '';
168
- this.croppedImage = '';
185
+ this.imageChangedEvent = "";
186
+ this.croppedImage = "";
169
187
  this.transform = {};
170
188
  //#endregion
171
189
  this.AttachmentType = AttachmentType;
@@ -181,7 +199,7 @@ var EqpAttachmentsComponent = /** @class */ (function () {
181
199
  if (!this.allowedTypes || this.allowedTypes.length == 0)
182
200
  this.allowedTypes = [AttachmentType.FILE, AttachmentType.LINK];
183
201
  else if (this.allowedTypes.find(function (t) { return t != AttachmentType.FILE && t != AttachmentType.LINK; })) {
184
- EqpAttachmentDialogService.Warning("Almeno uno degli AttachmentType selezionati nel parametro \"allowedTypes\" non esiste.");
202
+ EqpAttachmentDialogService.Warning('Almeno uno degli AttachmentType selezionati nel parametro "allowedTypes" non esiste.');
185
203
  this.allowedTypes = [AttachmentType.FILE, AttachmentType.LINK];
186
204
  }
187
205
  //Se è stata richiesta la gestione multipla degli allegati allora configura l'eqp-table
@@ -192,6 +210,9 @@ var EqpAttachmentsComponent = /** @class */ (function () {
192
210
  this.attachmentsList = new Array();
193
211
  this.checkAttachmentImage();
194
212
  };
213
+ EqpAttachmentsComponent.prototype.ngAfterViewInit = function () {
214
+ this.onComponentLoaded.emit(this);
215
+ };
195
216
  EqpAttachmentsComponent.prototype.reloadData = function () {
196
217
  if (this.attachmentTable)
197
218
  this.attachmentTable.reloadDatatable();
@@ -210,27 +231,45 @@ var EqpAttachmentsComponent = /** @class */ (function () {
210
231
  this.attachmentsColumns = [];
211
232
  if (this.disableAction != true) {
212
233
  this.attachmentsColumns.push({
213
- key: "action", display: "",
214
- type: TypeColumn.MenuAction, buttonMenuIcon: "more_vert", styles: { flex: "0 0 6%" },
234
+ key: "action",
235
+ display: "",
236
+ type: TypeColumn.MenuAction,
237
+ buttonMenuIcon: "more_vert",
238
+ styles: { flex: "0 0 6%" },
215
239
  actions: [
216
- { name: this.deleteLabel, icon: "delete", fn: function (element, index, col) { return _this.deleteAttachment(element); } },
217
- ],
240
+ { name: this.deleteLabel, icon: "delete", fn: function (element, index, col) { return _this.deleteAttachment(element); } }
241
+ ]
218
242
  });
219
243
  }
220
244
  var downloadColumn = {
221
- key: "attachment", display: "",
222
- type: TypeColumn.SimpleAction, styles: { flex: "0 0 6%" },
245
+ key: "attachment",
246
+ display: "",
247
+ type: TypeColumn.SimpleAction,
248
+ styles: { flex: "0 0 6%" },
223
249
  actions: [
224
250
  {
225
- name: '', fontawesome: true,
226
- icon: function (element) { return _this.showInlinePreview ? (element.AttachmentType == AttachmentType.FILE ? "fas fa-cloud-download-alt" : "fas fa-external-link-alt") : _this.getAttachmentIcon(element); },
251
+ name: "",
252
+ fontawesome: true,
253
+ icon: function (element) {
254
+ return _this.showInlinePreview
255
+ ? element.AttachmentType == AttachmentType.FILE
256
+ ? "fas fa-cloud-download-alt"
257
+ : "fas fa-external-link-alt"
258
+ : _this.getAttachmentIcon(element);
259
+ },
227
260
  fn: function (element, col, elementIndex) { return _this.viewAttachment(element); },
228
- tooltip: { tooltipText: function (element) { return element.AttachmentType == AttachmentType.FILE ? _this.downloadLabel : _this.openLinkLabel; }, tooltipPosition: this.downloadTooltipPosition }
229
- },
261
+ tooltip: {
262
+ tooltipText: function (element) {
263
+ return element.AttachmentType == AttachmentType.FILE ? _this.downloadLabel : _this.openLinkLabel;
264
+ },
265
+ tooltipPosition: this.downloadTooltipPosition
266
+ }
267
+ }
230
268
  ]
231
269
  };
232
270
  var inlinePreviewColumn = {
233
- key: "InlinePreview", display: this.previewLabel,
271
+ key: "InlinePreview",
272
+ display: this.previewLabel,
234
273
  type: TypeColumn.ExternalTemplate,
235
274
  externalTemplate: this.inlinePreviewTemplate,
236
275
  styles: { flex: "0 0 10%" }
@@ -273,7 +312,7 @@ var EqpAttachmentsComponent = /** @class */ (function () {
273
312
  */
274
313
  EqpAttachmentsComponent.prototype.viewAttachment = function (attachment) {
275
314
  if (attachment.AttachmentType == AttachmentType.LINK) {
276
- window.open(attachment.FilePath, '_blank');
315
+ window.open(attachment.FilePath, "_blank");
277
316
  return;
278
317
  }
279
318
  if (attachment.FileDataBase64 && attachment.FileContentType && attachment.FileName) {
@@ -317,8 +356,8 @@ var EqpAttachmentsComponent = /** @class */ (function () {
317
356
  this.dialofRefAddAttachment = this.dialog.open(this.dialogAddAttachment, {
318
357
  disableClose: true,
319
358
  hasBackdrop: true,
320
- width: '60%',
321
- maxHeight: '80%'
359
+ width: "60%",
360
+ maxHeight: "80%"
322
361
  });
323
362
  };
324
363
  EqpAttachmentsComponent.prototype.createAttachmentForm = function () {
@@ -357,7 +396,10 @@ var EqpAttachmentsComponent = /** @class */ (function () {
357
396
  }
358
397
  }
359
398
  else {
360
- return this.newMultipleAttachments.filter(function (p) { return (p.AttachmentType == AttachmentType.FILE && !p.FileDataBase64) || (p.AttachmentType == AttachmentType.LINK && !p.FilePath); }).length > 0;
399
+ return (this.newMultipleAttachments.filter(function (p) {
400
+ return (p.AttachmentType == AttachmentType.FILE && !p.FileDataBase64) ||
401
+ (p.AttachmentType == AttachmentType.LINK && !p.FilePath);
402
+ }).length > 0);
361
403
  }
362
404
  };
363
405
  EqpAttachmentsComponent.prototype.confirmAddAttachment = function () {
@@ -404,8 +446,12 @@ var EqpAttachmentsComponent = /** @class */ (function () {
404
446
  }
405
447
  if (!(this.getAttachmentEndpoint && this.selectedAttachment.IsImage && !this.selectedAttachment.FileDataBase64)) return [3 /*break*/, 2];
406
448
  return [4 /*yield*/, this.getAttachmentByID()
407
- .then(function (res) { _this.selectedAttachment.FileDataBase64 = res.FileDataBase64; })
408
- .catch(function (err) { EqpAttachmentDialogService.Error(err); })];
449
+ .then(function (res) {
450
+ _this.selectedAttachment.FileDataBase64 = res.FileDataBase64;
451
+ })
452
+ .catch(function (err) {
453
+ EqpAttachmentDialogService.Error(err);
454
+ })];
409
455
  case 1:
410
456
  _a.sent();
411
457
  _a.label = 2;
@@ -413,7 +459,9 @@ var EqpAttachmentsComponent = /** @class */ (function () {
413
459
  if (this.selectedAttachment.AttachmentType == AttachmentType.LINK) {
414
460
  this.selectedAttachment.TrustedUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.selectedAttachment.FilePath);
415
461
  }
416
- else if (this.selectedAttachment.IsImage && !this.selectedAttachment.FileDataBase64 && !this.selectedAttachment.FileThumbnailBase64) {
462
+ else if (this.selectedAttachment.IsImage &&
463
+ !this.selectedAttachment.FileDataBase64 &&
464
+ !this.selectedAttachment.FileThumbnailBase64) {
417
465
  EqpAttachmentDialogService.Info("Impossibile aprire l'anteprima dell'allegato, file mancante.");
418
466
  return [2 /*return*/];
419
467
  }
@@ -432,7 +480,7 @@ var EqpAttachmentsComponent = /** @class */ (function () {
432
480
  }
433
481
  this.dialog.open(this.dialogPreview, {
434
482
  disableClose: true,
435
- hasBackdrop: true,
483
+ hasBackdrop: true
436
484
  });
437
485
  return [2 /*return*/];
438
486
  }
@@ -467,11 +515,11 @@ var EqpAttachmentsComponent = /** @class */ (function () {
467
515
  this.selectedFiles = event.target.files;
468
516
  if (!this.selectedFile)
469
517
  return [2 /*return*/];
470
- //Memorizza i dati per l'allegato
518
+ //Memorizza i dati per l'allegato
471
519
  _a = this;
472
520
  return [4 /*yield*/, this.createAttachmentFromUploadedFile(this.selectedFile, false)];
473
521
  case 1:
474
- //Memorizza i dati per l'allegato
522
+ //Memorizza i dati per l'allegato
475
523
  _a.newAttachment = _b.sent();
476
524
  this.newMultipleAttachments = new Array();
477
525
  this.newMultipleAttachments.push(this.newAttachment);
@@ -539,11 +587,11 @@ var EqpAttachmentsComponent = /** @class */ (function () {
539
587
  switch (_a.label) {
540
588
  case 0:
541
589
  newAttachment = {};
542
- //Memorizza i dati per l'allegato
590
+ //Memorizza i dati per l'allegato
543
591
  newAttachment.AttachmentType = AttachmentType.FILE;
544
592
  newAttachment.FileContentType = currentFile.type;
545
593
  newAttachment.FileName = currentFile.name;
546
- newAttachment.FileExtension = currentFile.name.substr(currentFile.name.lastIndexOf('.') + 1);
594
+ newAttachment.FileExtension = currentFile.name.substr(currentFile.name.lastIndexOf(".") + 1);
547
595
  newAttachment.IsImage = AttachmentHelperService.checkImageFromMimeType(currentFile.type);
548
596
  if (!(getBase64 == true)) return [3 /*break*/, 2];
549
597
  return [4 /*yield*/, this.getBase64FromFile(currentFile)];
@@ -596,9 +644,11 @@ var EqpAttachmentsComponent = /** @class */ (function () {
596
644
  EqpAttachmentsComponent.prototype.checkAcceptedFiles = function () {
597
645
  var e_1, _a;
598
646
  var _this = this;
599
- if ((this.loadMultipleFiles != true && this.selectedFile.type.startsWith("video"))
600
- || (this.loadMultipleFiles == true && __spread(this.selectedFiles).filter(function (p) { return p.type.startsWith("video"); }).length > 0))
601
- return false;
647
+ if (!this.allowVideo) {
648
+ if ((this.loadMultipleFiles != true && this.selectedFile.type.startsWith("video")) ||
649
+ (this.loadMultipleFiles == true && __spread(this.selectedFiles).filter(function (p) { return p.type.startsWith("video"); }).length > 0))
650
+ return false;
651
+ }
602
652
  if (this.acceptedFileTypes == "*")
603
653
  return true;
604
654
  //Verifica che i tipi del file (o dei file) caricati siano coerenti con quelli accettati dalla direttiva
@@ -657,15 +707,15 @@ var EqpAttachmentsComponent = /** @class */ (function () {
657
707
  var image = new Image();
658
708
  image.src = e.target.result;
659
709
  image.onload = function (rs) {
660
- _this.originalHeight = rs.currentTarget['height'];
661
- _this.originalWidth = rs.currentTarget['width'];
710
+ _this.originalHeight = rs.currentTarget["height"];
711
+ _this.originalWidth = rs.currentTarget["width"];
662
712
  if (_this.originalWidth > 1280) {
663
713
  _this.customWidth = 1280;
664
714
  _this.customHeight = Math.round((1280 * _this.originalHeight) / _this.originalWidth);
665
715
  }
666
716
  else {
667
- _this.customHeight = rs.currentTarget['height'];
668
- _this.customWidth = rs.currentTarget['width'];
717
+ _this.customHeight = rs.currentTarget["height"];
718
+ _this.customWidth = rs.currentTarget["width"];
669
719
  }
670
720
  };
671
721
  };
@@ -694,18 +744,18 @@ var EqpAttachmentsComponent = /** @class */ (function () {
694
744
  /**
695
745
  * Comprime l'immagine passando come parametri le options create nell'oggetto sopra, e il file dal reader principale
696
746
  */
697
- imageCompression(file, options).then((function (fileCompressed) {
747
+ imageCompression(file, options).then(function (fileCompressed) {
698
748
  var fileReader = new FileReader();
699
749
  //Faccio la push di ogni file all'interno dell'array di file dell'item da mandare al server
700
750
  fileReader.onload = function () {
701
751
  var resultReader = fileReader.result;
702
- var marker = ';base64,';
752
+ var marker = ";base64,";
703
753
  self.newAttachment.FileDataBase64 = resultReader.substring(resultReader.indexOf(marker) + marker.length);
704
754
  self.showCropImage = false;
705
755
  self.newAttachmentForm.enable();
706
756
  };
707
757
  fileReader.readAsDataURL(fileCompressed);
708
- }));
758
+ });
709
759
  };
710
760
  EqpAttachmentsComponent.prototype.confirmCrop = function () {
711
761
  this.imageCropper.crop();
@@ -714,9 +764,9 @@ var EqpAttachmentsComponent = /** @class */ (function () {
714
764
  * Annulla la selezione del file, svuotando l'input e resettando tutte le proprietà dell'IAttachmentDTO
715
765
  */
716
766
  EqpAttachmentsComponent.prototype.abortFile = function () {
717
- this.imageChangedEvent = '';
767
+ this.imageChangedEvent = "";
718
768
  if (this.imageInput)
719
- this.imageInput.nativeElement.value = '';
769
+ this.imageInput.nativeElement.value = "";
720
770
  this.selectedFile = null;
721
771
  this.selectedFiles = null;
722
772
  this.showCropImage = false;
@@ -798,6 +848,9 @@ var EqpAttachmentsComponent = /** @class */ (function () {
798
848
  __decorate([
799
849
  Input("tablePaginatorSize")
800
850
  ], EqpAttachmentsComponent.prototype, "tablePaginatorSize", void 0);
851
+ __decorate([
852
+ Input("allowVideo")
853
+ ], EqpAttachmentsComponent.prototype, "allowVideo", void 0);
801
854
  __decorate([
802
855
  Input("downloadTooltipPosition")
803
856
  ], EqpAttachmentsComponent.prototype, "downloadTooltipPosition", void 0);
@@ -868,29 +921,32 @@ var EqpAttachmentsComponent = /** @class */ (function () {
868
921
  Output("onDeleteAttachment")
869
922
  ], EqpAttachmentsComponent.prototype, "onDeleteAttachment", void 0);
870
923
  __decorate([
871
- ViewChild('dialogAddAttachment', { static: true })
924
+ Output("onComponentLoaded")
925
+ ], EqpAttachmentsComponent.prototype, "onComponentLoaded", void 0);
926
+ __decorate([
927
+ ViewChild("dialogAddAttachment", { static: true })
872
928
  ], EqpAttachmentsComponent.prototype, "dialogAddAttachment", void 0);
873
929
  __decorate([
874
- ViewChild('dialogAddMultipleAttachment', { static: true })
930
+ ViewChild("dialogAddMultipleAttachment", { static: true })
875
931
  ], EqpAttachmentsComponent.prototype, "dialogAddMultipleAttachment", void 0);
876
932
  __decorate([
877
933
  ViewChild(ImageCropperComponent)
878
934
  ], EqpAttachmentsComponent.prototype, "imageCropper", void 0);
879
935
  __decorate([
880
- ViewChild('imageInput')
936
+ ViewChild("imageInput")
881
937
  ], EqpAttachmentsComponent.prototype, "imageInput", void 0);
882
938
  __decorate([
883
- ViewChild('attachmentTable', { static: false })
939
+ ViewChild("attachmentTable", { static: false })
884
940
  ], EqpAttachmentsComponent.prototype, "attachmentTable", void 0);
885
941
  __decorate([
886
- ViewChild('inlinePreviewTemplate', { static: true })
942
+ ViewChild("inlinePreviewTemplate", { static: true })
887
943
  ], EqpAttachmentsComponent.prototype, "inlinePreviewTemplate", void 0);
888
944
  __decorate([
889
- ViewChild('dialogPreview', { static: true })
945
+ ViewChild("dialogPreview", { static: true })
890
946
  ], EqpAttachmentsComponent.prototype, "dialogPreview", void 0);
891
947
  EqpAttachmentsComponent = __decorate([
892
948
  Component({
893
- selector: 'eqp-attachments',
949
+ selector: "eqp-attachments",
894
950
  template: "<!-- Se richiesta la gestione multipla mostra il pulsante di aggiunta e la tabella con l'elenco allegati -->\r\n<div *ngIf=\"multipleAttachment == true\">\r\n <mat-card [ngStyle]=\"{ 'box-shadow': showMatCard == false ? 'none' : null }\">\r\n <mat-card-header>\r\n <div class=\"col-md-6\">\r\n <div class=\"text-nowrap eqp-attachments-header-title\" *ngIf=\"showHeader == true\">\r\n {{headerTitle}}\r\n </div>\r\n </div>\r\n <div class=\"col-md-6 text-right\">\r\n <div class=\"row justify-content-end\">\r\n <!-- Template del button per l'aggiunta di un allegato -->\r\n <ng-container *ngTemplateOutlet=\"addAttachmentButton\"></ng-container>\r\n </div>\r\n </div>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <eqp-table #attachmentTable [createMatCard]=\"false\" #table [columns]=\"attachmentsColumns\"\r\n [isMultiLanguage]=\"isEqpTableMultiLanguage\" [data]=\"attachmentsList\"\r\n [paginatorVisible]=\"tablePaginatorVisible\" [matPaginatorSize]=\"tablePaginatorSize\"\r\n [emptyTableMessage]=\"emptyTableMessage\" [searchText]=\"eqpTableSearchText\">\r\n </eqp-table>\r\n </mat-card-content>\r\n </mat-card>\r\n</div>\r\n\r\n<!-- Se richiesta la gestione singola mostra il pulsante di caricamento di un singolo file -->\r\n<div *ngIf=\"multipleAttachment != true\">\r\n <!-- Template del button per l'aggiunta di un allegato -->\r\n <ng-container *ngTemplateOutlet=\"addAttachmentButton\"></ng-container>\r\n\r\n <button class=\"mb-2 mr-2 eqp-attachments-download-btn\" (click)=\"viewAttachment(attachmentsList[0])\" type=\"button\"\r\n mat-raised-button *ngIf=\"attachmentsList && attachmentsList.length > 0 && attachmentsList[0]\" color=\"primary\">\r\n <mat-icon *ngIf=\"attachmentsList[0].AttachmentType == AttachmentType.FILE\">download</mat-icon>\r\n <mat-icon *ngIf=\"attachmentsList[0].AttachmentType != AttachmentType.FILE\">open_in_new</mat-icon>\r\n {{attachmentsList[0].AttachmentType == AttachmentType.FILE ? downloadLabel : openLinkLabel}}\r\n </button>\r\n <button class=\"mb-2 mr-2 eqp-attachments-preview-btn\" (click)=\"openPreviewDialog(attachmentsList[0])\" type=\"button\"\r\n mat-raised-button color=\"primary\"\r\n *ngIf=\"attachmentsList && attachmentsList.length > 0 && attachmentsList[0] && (!attachmentsList[0].FileContentType || (!attachmentsList[0].FileContentType.startsWith('video') && !attachmentsList[0].FileContentType.startsWith('audio')))\">\r\n <mat-icon>visibility</mat-icon> {{previewLabel}}\r\n </button>\r\n <button class=\"mb-2 eqp-attachments-delete-btn\" (click)=\"deleteAttachment(attachmentsList[0])\" type=\"button\"\r\n mat-raised-button *ngIf=\"attachmentsList && attachmentsList.length > 0 && attachmentsList[0]\"\r\n [disabled]=\"isDisabled\">\r\n <mat-icon>delete</mat-icon> {{deleteLabel}}\r\n </button>\r\n\r\n <div class=\"row\" style=\"margin-top: 10px;\"\r\n *ngIf=\"attachmentsList.length > 0 && attachmentsList[0] && attachmentsList[0].FileDataBase64 && attachmentsList[0].IsImage == true\">\r\n <div class=\"col-sm-12\">\r\n <div class=\"single-attachment-inline-preview-container\">\r\n <img src=\"data:image/png;base64,{{attachmentsList[0].FileDataBase64}}\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\" *ngIf=\"attachmentsList.length > 0 && attachmentsList[0] && attachmentsList[0].IsImage != true\">\r\n <div class=\"col-sm-12\">\r\n <mat-form-field>\r\n <mat-label>{{fileNameLabel}}</mat-label>\r\n <input readonly matInput [(ngModel)]=\"attachmentsList[0].FileName\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n<ng-template #dialogAddAttachment>\r\n <div class=\"container-fluid eqp-attachments-dialog-add-container\"\r\n style=\"max-height: 70vh !important; overflow-x: hidden; overflow-y: auto;\">\r\n <form [formGroup]=\"newAttachmentForm\" (ngSubmit)=\"confirmAddAttachment()\" *ngIf=\"newAttachmentForm\">\r\n <div class=\"row\">\r\n <div class=\"header-title-standard\"> {{addButtonLabel}} {{ newAttachment.AttachmentType ==\r\n attachmentType.FILE ?\r\n 'File' : 'Link'}} </div>\r\n </div>\r\n <div class=\"row\" style=\"margin-top: 20px;\">\r\n <div class=\"col-sm-12\" *ngIf=\"newAttachment.AttachmentType == attachmentType.FILE\">\r\n <input #imageInput style=\"display:none;\" id=\"file_attachment\"\r\n name=\"file_attachment\" type=\"file\" (change)=\"onFileInputChange($event)\"\r\n [accept]=\"acceptedFileTypes\" [multiple]=\"loadMultipleFiles\"/>\r\n <button (click)=\"imageInput.click()\" type=\"button\" style=\"margin-left: 10px;\" id=\"file_attachment\"\r\n mat-raised-button color=\"primary\" [disabled]=\"showCropImage == true\"\r\n class=\"mb-2 btn btn-primary eqp-attachments-upload-btn\" *ngIf=\"(loadMultipleFiles != true && !newAttachment.FileDataBase64) || (loadMultipleFiles == true && newMultipleAttachments && newMultipleAttachments.length == 0)\">\r\n <mat-icon>cloud_upload</mat-icon>\r\n {{uploadFileLabel}}\r\n </button>\r\n <button (click)=\"abortFile()\" type=\"button\" style=\"margin-left: 10px;\" mat-raised-button\r\n *ngIf=\"(loadMultipleFiles != true && newAttachment.FileDataBase64) || (loadMultipleFiles == true && newMultipleAttachments && newMultipleAttachments.length > 0)\" class=\"mb-2 eqp-attachments-delete-btn\">\r\n <mat-icon>delete</mat-icon> {{deleteLabel}}\r\n </button>\r\n </div>\r\n <div class=\"col-sm-12\" *ngIf=\"newAttachment.AttachmentType == 2 || (selectedFile && loadMultipleFiles != true)\">\r\n <mat-form-field style=\"width: 100%;\">\r\n <mat-label> {{fileNameLabel}} </mat-label>\r\n <input formControlName=\"name\" matInput [(ngModel)]=\"newAttachment.FileName\">\r\n </mat-form-field>\r\n </div>\r\n <div class=\"col-sm-12\" *ngIf=\"newAttachment.AttachmentType == 2\">\r\n <mat-form-field style=\"width: 100%;\">\r\n <mat-label> Link </mat-label>\r\n <input formControlName=\"path\" required matInput [(ngModel)]=\"newAttachment.FilePath\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <!-- Riporta l'elenco dei nomi dei file caricati contemporaneamente (visibile solo se loadMultipleFiles = TRUE e se ci sono realmente pi\u00F9 file senza link) -->\r\n <div class=\"row\" *ngIf=\"loadMultipleFiles == true && newMultipleAttachments && newMultipleAttachments.length > 0 && newMultipleAttachments[0].AttachmentType != attachmentType.LINK\">\r\n <div class=\"col-12\" *ngFor=\"let attach of newMultipleAttachments\">\r\n <mat-form-field style=\"width: 100%\">\r\n <mat-label> {{fileNameLabel}} </mat-label>\r\n <input disabled matInput [(ngModel)]=\"attach.FileName\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <!-- Riporta la preview dell'immagine quando \u00E8 richiesto il caricamento MULTIPLO ma \u00E8 stata selezionata una sola immagine (quindi \u00E8 entrato in gioco anche il croppie) -->\r\n <div class=\"row\" *ngIf=\"loadMultipleFiles == true && showCropImage != true && newMultipleAttachments && newMultipleAttachments.length == 1 && newMultipleAttachments[0].IsImage == true\" style=\"margin-top: 10px;\">\r\n <div class=\"col-4\">\r\n <div class=\"single-attachment-inline-preview-container\">\r\n <img src=\"data:image/png;base64,{{newMultipleAttachments[0].FileDataBase64}}\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Riporta la preview dell'immagine quando \u00E8 richiesto il caricamento SINGOLO ed \u00E8 stata selezionata un'immagine -->\r\n <div class=\"row\" *ngIf=\"loadMultipleFiles != true && showCropImage != true && newAttachment.FileDataBase64 && newAttachment.IsImage == true\" style=\"margin-top: 10px;\">\r\n <div class=\"col-4\">\r\n <div class=\"single-attachment-inline-preview-container\">\r\n <img src=\"data:image/png;base64,{{newAttachment.FileDataBase64}}\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Richiama il template per le funzionalit\u00E0 del CROPPIE -->\r\n <ng-container [ngTemplateOutlet]=\"croppieTemplate\" [ngTemplateOutletContext]=\"{form: newAttachmentForm}\" *ngIf=\"showCropImage == true\"></ng-container>\r\n\r\n <div class=\"row mt-2\">\r\n <div class=\"col-sm-12 text-right\">\r\n <button class=\"btn btn-primary mat-raised-button eqp-attachments-save-btn mr-2\" type=\"submit\"\r\n [disabled]=\"showCropImage == true || (loadMultipleFiles != true && newAttachmentForm?.disabled == true) || disableSave()\">\r\n {{saveLabel}}\r\n </button>\r\n <button class=\"btn mat-raised-button eqp-attachments-exit-btn\" (click)=\"close()\"\r\n [disabled]=\"showCropImage == true\" type=\"button\">\r\n {{exitLabel}}\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #inlinePreviewTemplate let-row=\"row\">\r\n <div class=\"inline-preview-container\" *ngIf=\"row.AttachmentType != AttachmentType.LINK && row.IsImage\" (click)=\"openPreviewDialog(row)\">\r\n <img src=\"data:image/png;base64,{{row.FileThumbnailBase64 ? row.FileThumbnailBase64 : row.FileDataBase64}}\">\r\n </div>\r\n <div class=\"inline-preview-container\" *ngIf=\"row.AttachmentType != AttachmentType.LINK && !row.IsImage\" (click)=\"openPreviewDialog(row)\">\r\n <i [ngClass]=\"getAttachmentIcon(row)\"></i>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<ng-template #dialogPreview>\r\n <div class=\"container-fluid\" style=\"max-height: 70vh !important;\" *ngIf=\"selectedAttachment\">\r\n <div class=\"row\">\r\n <div class=\"header-title-standard\">\r\n {{previewLabel}} {{ selectedAttachment?.AttachmentType == attachmentType.FILE ? 'File' : 'Link'}}\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mt-2\">\r\n <!-- ANTEPRIMA IMMAGINE -->\r\n <div class=\"col-12 text-center preview-container\" *ngIf=\"selectedAttachment.IsImage\">\r\n <img class=\"image-preview\"\r\n src=\"data:image/png;base64,{{selectedAttachment.FileDataBase64 ? selectedAttachment.FileDataBase64 : selectedAttachment.FileThumbnailBase64}}\">\r\n </div>\r\n\r\n <!-- ANTEPRIMA LINK -->\r\n <div class=\"col-12 preview-container\" *ngIf=\"!selectedAttachment.IsImage\">\r\n <iframe class=\"link-preview\" [src]=\"selectedAttachment.TrustedUrl\"\r\n [title]=\"selectedAttachment.FileName\"></iframe>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row mt-3\">\r\n <div class=\"col-sm-12 text-right\">\r\n <button class=\"btn btn-primary mat-raised-button eqp-attachments-save-btn mr-2\" type=\"submit\"\r\n (click)=\"viewAttachment(selectedAttachment)\"\r\n *ngIf=\"selectedAttachment.AttachmentType != AttachmentType.LINK\">\r\n {{downloadLabel}}\r\n </button>\r\n <button class=\"btn mat-raised-button eqp-attachments-exit-btn\" mat-dialog-close type=\"button\"\r\n (click)=\"selectedAttachment = null\">\r\n {{exitLabel}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- TEMPLATE PER IL PULSANTE DI AGGIUNTA NUOVO ALLEGATO -->\r\n<ng-template #addAttachmentButton>\r\n\r\n <!-- \r\n Pulsanti per l'aggiunta di un file o un link. Ne viene visualizzato uno se:\r\n - gli allowedTypes sono stati specificati, nell'array ne \u00E8 presente uno solo, quello inserito \u00E8 AttachmentType.FILE (o AttachmentType.LINK) \r\n e sono nella gestione di pi\u00F9 allegati (multipleAttachment == true)\r\n OPPURE\r\n - gli allowedTypes sono stati specificati, nell'array ne \u00E8 presente uno solo, quello inserito \u00E8 AttachmentType.FILE (o AttachmentType.LINK) \r\n e sono nella gestione di un singolo allegato (multipleAttachment == true) e non ne \u00E8 ancora stato selezionato uno (ovvero attachmentsList non esiste o non ha elementi)\r\n -->\r\n <button class=\"btn btn-primary mb-4 mr-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n *ngIf=\"allowedTypes && allowedTypes.length == 1 && (multipleAttachment == true || (!attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0])))\"\r\n (click)=\"openModalAddAttachment(allowedTypes[0])\" [disabled]=\"isDisabled\">\r\n <!-- Per l'aggiunta dei file mostro un'icona diversa dall'aggiunta dei link -->\r\n <mat-icon *ngIf=\"allowedTypes[0] == 1\">cloud_upload</mat-icon>\r\n <i class=\"fas fa-link\" *ngIf=\"allowedTypes[0] == 2\"></i>\r\n <span style=\"margin-left: 10px;\">{{addButtonLabel}} {{allowedTypes[0] == 1 ? \"file\" : \"link\"}}</span>\r\n </button>\r\n\r\n\r\n <!-- Pulsante per aprire il menu per la scelta del tipo di Attachment da creare -->\r\n <button class=\"btn btn-primary mb-4 mr-5 eqp-attachments-add-btn\" mat-raised-button color=\"primary\" type=\"button\"\r\n [matMenuTriggerFor]=\"attachmentTypeMenu\" [disabled]=\"isDisabled\"\r\n *ngIf=\"allowedTypes && allowedTypes.length > 1 && (multipleAttachment == true || (!attachmentsList || attachmentsList.length == 0 || (attachmentsList.length > 0 && !attachmentsList[0])))\">\r\n <mat-icon *ngIf=\"multipleAttachment != true\">cloud_upload</mat-icon>\r\n <mat-icon *ngIf=\"multipleAttachment == true\">add</mat-icon>\r\n <span style=\"margin-left: 0px;\"> {{addButtonLabel}} </span>\r\n </button>\r\n <mat-menu #attachmentTypeMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"openModalAddAttachment(1)\" class=\"eqp-attachments-file-btn\">\r\n <i class=\"fas fa-file\"></i>\r\n <span style=\"margin-left: 10px;\">File</span>\r\n </button>\r\n <button mat-menu-item (click)=\"openModalAddAttachment(2)\" class=\"eqp-attachments-link-btn\">\r\n <i class=\"fas fa-link\"></i>\r\n <span style=\"margin-left: 10px;\">Link</span>\r\n </button>\r\n </mat-menu>\r\n</ng-template>\r\n\r\n\r\n<ng-template #croppieTemplate let-form=\"form\">\r\n <div class=\"row mt-2 mb-2\" [formGroup]=\"form\">\r\n <div class=\"col-md-12 d-flex align-items-center justify-content-center\">\r\n <span class=\"mr-1\">Max H(px):</span>\r\n <mat-form-field>\r\n <input formControlName=\"customHeight\" type=\"number\" matInput [(ngModel)]=\"customHeight\"\r\n (change)=\"onDimensionsChange('H')\">\r\n </mat-form-field>\r\n\r\n <span class=\"ml-2 mr-1\">Max W(px):</span>\r\n <mat-form-field>\r\n <input formControlName=\"customWidth\" type=\"number\" matInput [(ngModel)]=\"customWidth\"\r\n (change)=\"onDimensionsChange('W')\">\r\n </mat-form-field>\r\n\r\n <button class=\"btn btn-primary mat-raised-button ml-2\" (click)=\"restoreOriginalDimensions()\"\r\n [disabled]=\"customWidth == originalWidth && customHeight == originalHeight\">\r\n <mat-icon style=\"vertical-align: middle;\">replay</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"row justify-content-center\">\r\n <div style=\"max-height: 450px; max-width: 450px;\">\r\n <image-cropper [imageChangedEvent]=\"imageChangedEvent\" [maintainAspectRatio]=\"false\"\r\n [autoCrop]=\"false\" [containWithinAspectRatio]=\"false\" [aspectRatio]=\"4/3\"\r\n [cropperMinWidth]=\"128\" [onlyScaleDown]=\"true\" [roundCropper]=\"false\" [canvasRotation]=\"0\"\r\n [transform]=\"transform\" [alignImage]=\"'left'\" format=\"png\" (imageCropped)=\"imageCropped($event)\"\r\n [resizeToWidth]=\"customWidth\" [resizeToHeight]=\"customHeight\">\r\n </image-cropper>\r\n </div>\r\n </div>\r\n <div class=\"row justify-content-center mt-2\">\r\n <div style=\"max-height: 450px; max-width: 450px;\">\r\n <button class=\"btn btn-primary mat-raised-button eqp-attachments-confirm-btn mr-2\" type=\"button\"\r\n (click)=\"confirmCrop()\">\r\n {{confirmLabel}}\r\n </button>\r\n <button class=\"btn mat-raised-button eqp-attachments-abort-btn\" type=\"button\" (click)=\"abortFile()\">\r\n {{abortLabel}}\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>",
895
951
  styles: [".eqp-attachments-header-title{font-weight:700;font-size:19px;line-height:24px;margin-bottom:auto}.single-attachment-inline-preview-container{max-height:400px;max-width:400px;display:flex;align-items:center}.single-attachment-inline-preview-container img{max-width:100%;max-height:120px}.inline-preview-container{max-height:100px;max-width:100px;display:flex;align-items:center;justify-content:center;width:100%;cursor:pointer}.inline-preview-container img{max-width:100%;max-height:100px}.inline-preview-container i{font-size:25px;margin:auto}.preview-container{max-height:60vh;max-width:100%}.preview-container .image-preview{max-width:100%;max-height:100%}.preview-container .link-preview{width:70vw;height:55vh}"]
896
952
  })
@@ -899,4 +955,4 @@ var EqpAttachmentsComponent = /** @class */ (function () {
899
955
  }());
900
956
  export { EqpAttachmentsComponent };
901
957
  export { ɵ0 };
902
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXFwLWF0dGFjaG1lbnRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BlcXByb2plY3QvZXFwLWF0dGFjaG1lbnRzLyIsInNvdXJjZXMiOlsibGliL2VxcC1hdHRhY2htZW50cy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBcUIscUJBQXFCLEVBQWtCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0csT0FBTyxnQkFBZ0IsTUFBTSwyQkFBMkIsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsY0FBYyxFQUFrQixNQUFNLDBCQUEwQixDQUFDO0FBQzFFLE9BQU8sRUFBbUMsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEcsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR2xELElBQU0sUUFBUSxHQUFHLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxPQUFPLENBQVMsVUFBQyxPQUFPLEVBQUUsTUFBTTtJQUMzRCxJQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxh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Q0FBQztrRkFBeUY7SUFDN0Y7UUFBbEMsS0FBSyxDQUFDLDBCQUEwQixDQUFDOzZFQUF1RjtJQUN0RjtRQUFsQyxLQUFLLENBQUMsMEJBQTBCLENBQUM7NkVBQXVGO0lBUS9HO1FBQVQsTUFBTSxFQUFFOzJFQUF5RztJQUt2RztRQUFULE1BQU0sRUFBRTt1RUFBaUU7SUFLN0M7UUFBN0IsTUFBTSxDQUFDLG9CQUFvQixDQUFDO3VFQUF1RjtJQUt0RjtRQUE3QixNQUFNLENBQUMsb0JBQW9CLENBQUM7dUVBQXVGO0lBYWhFO1FBQW5ELFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzt3RUFBdUM7SUFDOUI7UUFBM0QsU0FBUyxDQUFDLDZCQUE2QixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO2dGQUErQztJQU94RTtRQUFqQyxTQUFTLENBQUMscUJBQXFCLENBQUM7aUVBQXFDO0lBQzdDO1FBQXhCLFNBQVMsQ0FBQyxZQUFZLENBQUM7K0RBQWlCO0lBV1E7UUFBaEQsU0FBUyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO29FQUFvQztJQUM5QjtRQUFyRCxTQUFTLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7MEVBQXlDO0lBQ2hEO1FBQTdDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7a0VBQWlDO0lBcE1uRSx1QkFBdUI7UUFMbkMsU0FBUyxDQUFDO1lBQ1QsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixtdmpCQUErQzs7U0FFaEQsQ0FBQztPQUNXLHVCQUF1QixDQXN4Qm5DO0lBQUQsOEJBQUM7Q0FBQSxBQXR4QkQsSUFzeEJDO1NBdHhCWSx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBiYXNlNjRUb0ZpbGUsIEltYWdlQ3JvcHBlZEV2ZW50LCBJbWFnZUNyb3BwZXJDb21wb25lbnQsIEltYWdlVHJhbnNmb3JtIH0gZnJvbSAnbmd4LWltYWdlLWNyb3BwZXInO1xyXG5pbXBvcnQgaW1hZ2VDb21wcmVzc2lvbiBmcm9tICdicm93c2VyLWltYWdlLWNvbXByZXNzaW9uJ1xyXG5pbXBvcnQgeyBBdHRhY2htZW50VHlwZSwgSUF0dGFjaG1lbnREVE8gfSBmcm9tICcuL2ludGVyZmFjZXMvSUF0dGFjaG1lbnQnO1xyXG5pbXBvcnQgeyBDb25maWdDb2x1bW4sIEVxcFRhYmxlQ29tcG9uZW50LCBUb29sdGlwUG9zaXRpb25UeXBlLCBUeXBlQ29sdW1uIH0gZnJvbSAnQGVxcHJvamVjdC9lcXAtdGFibGUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IEF0dGFjaG1lbnRIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi9oZWxwZXJzL2F0dGFjaG1lbnQuaGVscGVyJztcclxuaW1wb3J0IHsgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2VxcC1hdHRhY2htZW50LWRpYWxvZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IElPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lPcHRpb25zJztcclxuXHJcbmNvbnN0IHRvQmFzZTY0ID0gZmlsZSA9PiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gIHJlYWRlci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQudG9TdHJpbmcoKSk7XHJcbiAgcmVhZGVyLm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xyXG59KTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZXFwLWF0dGFjaG1lbnRzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZXFwLWF0dGFjaG1lbnRzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9lcXAtYXR0YWNobWVudHMuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRXFwQXR0YWNobWVudHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAvLyNyZWdpb24gQElucHV0IGRlbCBjb21wb25lbnRlXHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIFRSVUUgYWxsb3JhIG5hc2NvbmRlIGxhIGNvbG9ubmEgcGVyIGxlIGF6aW9uaSBzdWxsJ2FsbGVnYXRvIChuZWwgY2FzbyBcIm11bHRpcGxlQXR0YWNobWVudFwiIMOoIFRSVUUpLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcImRpc2FibGVBY3Rpb25cIikgZGlzYWJsZUFjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBTZSBUUlVFIG1vc3RyYSBpbCB0aXRvbG8gbmVsbCdoZWFkZXIgbmVsIGNhc28gaW4gY3VpIFwibXVsdGlwbGVBdHRhY2htZW50XCIgw6ggVFJVRSAoXCJFbGVuY28gYWxsZWdhdGlcIiBkaSBkZWZhdWx0KS5cclxuICAgKi9cclxuICBASW5wdXQoXCJzaG93SGVhZGVyXCIpIHNob3dIZWFkZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBUaXRvbG8gZGEgdmlzdWFsaXp6YXJlIHNlIGlsIHBhcmFtZXRybyBcInNob3dIZWFkZXJcIiDDqCBUUlVFLiBEaSBkZXZhdWx0IHZpZW5lIHZpc3VhbGl6emF0byBcIkVsZW5jbyBhbGxlZ2F0aVwiLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcImhlYWRlclRpdGxlXCIpIGhlYWRlclRpdGxlOiBzdHJpbmcgPSBcIkVsZW5jbyBhbGxlZ2F0aVwiO1xyXG5cclxuICAvKipcclxuICAgKiBTb3JnZW50ZSBkYXRpIGRhIHZpc3VhbGl6emFyZS4gTmVsIGNhc28gc2kgdnVvbGUgZ2VzdGlyZSB1biBzaW5nb2xvIGFsbGVnYXRvIHZhIHBhc3NhdG8gaW4gb2duaSBjYXNvIGNvbWUgQXJyYXkuXHJcbiAgICovXHJcbiAgQElucHV0KFwiYXR0YWNobWVudHNMaXN0XCIpIGF0dGFjaG1lbnRzTGlzdDogQXJyYXk8SUF0dGFjaG1lbnREVE8+ID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgVFJVRSBub24gbW9zdHJhIGxhIE1hdENhcmQgKG5lbCBjYXNvIGluIGN1aSBcIm11bHRpcGxlQXR0YWNobWVudFwiIMOoIFRSVUUpLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcInNob3dNYXRDYXJkXCIpIHNob3dNYXRDYXJkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgRkFMU0UgYWxsb3JhIGlsIGNvbXBvbmVudGUgbW9zdHJhIHNvbG8gaWwgcHVsc2FudGUgZGkgY2FyaWNhbWVudG8gZGkgdW4gc2luZ29sbyBmaWxlLCB1bmEgdm9sdGEgY2FyaWNhdG8gaWwgZmlsZSBpbnZvY2EgbCdldmVudG8gZGkgb3V0cHV0IFwibG9jYWxFZGl0ZWRBdHRhY2htZW50c1wiLlxyXG4gICAqIFNlIFRSVUUgYWxsb3JhIGlsIGNvbXBvbmVudGUgbW9zdHJhIGwnZWxlbmNvIGRpIHR1dHRpIGdsaSBhbGxlZ2F0aSByaWNldnV0byBuZWwgcGFyYW1ldHJvIFwiYXR0YWNobWVudHNMaXN0XCIuXHJcbiAgICovXHJcbiAgQElucHV0KFwibXVsdGlwbGVBdHRhY2htZW50XCIpIG11bHRpcGxlQXR0YWNobWVudDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIGFzc3VtZSBpbCB2YWxvcmUgVFJVRSBhbGxvcmEgc2Fyw6AgcG9zc2liaWxlIGNhcmljYXJlIHBpw7kgZmlsZSBwZXIgdm9sdGEuIFF1ZXN0YSBmdW56aW9uYWxpdMOgIMOoIGF0dGl2YVxyXG4gICAqIFNPTE8gc2Ugc2kgZ2VzdGlzY29ubyBhbGxlZ2F0aSBtdWx0aXBsaSwgcXVpbmRpIHNlIGwnaW5wdXQgJ211bHRpcGxlQXR0YWNobWVudCcgYXNzdW1lIGlsIHZhbG9yZSBUUlVFLCBhbHRyaW1lbnRpIMOoIHNlbXByZSBkaXNhYmlsaXRhdGEuXHJcbiAgICovXHJcbiAgQElucHV0KFwibG9hZE11bHRpcGxlRmlsZXNcIikgbG9hZE11bHRpcGxlRmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ29uZmlndXJhemlvbmUgZGVsbGUgY29sb25uZSBkZWxsYSBlcXAtdGFibGUgcGVyIGxhIHZpc3VhbGl6emF6aW9uZSBkZWdsaSBhbGxlZ2F0aSAoY2FzbyBcIm11bHRpcGxlQXR0YWNobWVudFwiIMOoIFRSVUUpLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcImF0dGFjaG1lbnRzQ29sdW1uc1wiKSBhdHRhY2htZW50c0NvbHVtbnM6IEFycmF5PENvbmZpZ0NvbHVtbj4gPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBJbXBvc3RhIGlsIG1lc3NhZ2dpbyBkYSB2aXN1YWxpenphcmUgbmVsIGNhc28gaW4gY3VpIGxhIHRhYmVsbGEgZGVnbGkgYWxsZWdhdGkgKG5lbCBjYXNvIGluIGN1aSBcIm11bHRpcGxlQXR0YWNobWVudFwiIMOoIFRSVUUpIMOoIHZ1b3RhLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcImVtcHR5VGFibGVNZXNzYWdlXCIpIGVtcHR5VGFibGVNZXNzYWdlOiBzdHJpbmcgPSBcIk5lc3N1biBkYXRvIHRyb3ZhdG9cIjtcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgVFJVRSBhbGxvcmEgcGVybWV0dGUgZGkgc2VsZXppb25hcmUgc29sdGFudG8gZmlsZSBkaSB0aXBvIGltbWFnaW5lLCBhdmVudGUgdW5vIGRlaSBtaW1ldHlwZVxyXG4gICAqIHNwZWNpZmljYXRpIGRlbnRybyBBdHRhY2htZW50SGVscGVyU2VydmljZS5cclxuICAgKiBTZSBGQUxTRSBwZXJtZXR0ZSBkaSBzZWxlemlvbmFyZSBxdWFsc2lhc2kgdGlwbyBkaSBmaWxlXHJcbiAgICovXHJcbiAgQElucHV0KFwiYWxsb3dPbmx5SW1hZ2VzXCIpIGFsbG93T25seUltYWdlczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBTcGVjaWZpY2EgaSB0aXBpIGRpIGZpbGUgY2hlIMOoIHBvc3NpYmlsZSBjYXJpY2FyZVxyXG4gICAqL1xyXG4gIEBJbnB1dChcImFjY2VwdGVkRmlsZVR5cGVzXCIpIGFjY2VwdGVkRmlsZVR5cGVzOiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIFRSVUUgZGlzYWJpbGl0YSBpbCBwdWxzYW50ZSBkaSBBZ2dpdW50YSBhbGxlZ2F0byAoYSBwcmVzY2luZGVyZSBkYWwgdmFsb3JlIGRlbCBwYXJhbWV0cm8gXCJtdWx0aXBsZUF0dGFjaG1lbnRcIikuXHJcbiAgICovXHJcbiAgQElucHV0KFwiaXNEaXNhYmxlZFwiKSBpc0Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIE1vc3RyYS9uYXNjb25kZSBsYSBjb2xvbm5hIHBlciB2aXN1YWxpenphcmUgbCdhbnRlcHJpbWEgZGVpIGZpbGUgbmVsbGEgdGFiZWxsYSAoY2FzbyBtdWx0aXBsZUF0YXRjaG1lbnRzID0gdHJ1ZSkuXHJcbiAgICovXHJcbiAgQElucHV0KFwic2hvd0lubGluZVByZXZpZXdcIikgc2hvd0lubGluZVByZXZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogRW5kcG9pbnQgZGEgY2hpYW1hcmUgcGVyIHJlY3VlcHJhcmUgbCdJQXR0YWNobWVudERUTyBjb21wbGV0byBkYSB2ZWRlcmUgbmVsbCdhbnRlcHJpbWEuIExhIGNoaWFtYXRhIHNhcsOgIGluIFBPU1QgZSBuZWwgYm9keVxyXG4gICAqIGNvbnRlcnLDoCBsJ0lBdHRhY2htZW50RFRPIHNlbGV6aW9uYXRvIGRhbGwndXRlbnRlLlxyXG4gICAqIExhIGNoaWFtYXRhIHZpZW5lIGVzZWd1aXRhIHNvbG8gcGVyIGwnYW50ZXByaW1hIGRlbGxlIGltbWFnaW5pIGVzc2VuZG8gbmVjZXNzYXJpbyBpbCBiYXNlNjQgY29tcGxldG8gZGVsbCdpbW1hZ2luZSBhIGRpbWVuc2lvbmUgcmVhbGUuXHJcbiAgICogUGVyIGRvY3VtZW50aS9saW5rIGJhc3RhIGNoZSBzaWEgcG9wb2xhdGEgbGEgcHJvcHJpZXTDoCBGaWxlUGF0aCBkaSBJQXR0YWNobWVudERUTy5cclxuICAgKi9cclxuICBASW5wdXQoXCJnZXRBdHRhY2htZW50RW5kcG9pbnRcIikgZ2V0QXR0YWNobWVudEVuZHBvaW50OiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBIb3N0bmFtZSBkZWxsJ2FtYmllbnRlIGRpIHByb2R1emlvbmUgZGVsbCdhcHBsaWNhdGl2by4gTmVjZXNzYXJpbyBwZXIgdmlzdWFsaXp6YXJlIGwnYW50ZXByaW1hIGRlaSBkb2N1bWVudGlcclxuICAgKiB0cmFtaXRlIGlsIHZpZXdlciBkaSBnb29nbGUuXHJcbiAgICogTk9UQTogUGVyIHZpc3VhbGl6emFyZSBsJ2FudGVwcmltYSDDqCBuZWNlc3NhcmlvIGNoZSBsYSBwcm9yaWV0w6AgRmlsZVBhdGggZGVsbCdJQXR0YWNobWVudERUTyBzaWEgcG9wb2xhdGEgZSBjaGVcclxuICAgKiBzaWEgYWJpbGl0YXRvIGwnYWNjZXNzbyBhbGxhIGNhcnRlbGxhIHN1bCBzZXJ2ZXIgdHJhbWl0ZSBob3N0bmFtZS5cclxuICAgKi9cclxuICBASW5wdXQoXCJwcm9kdWN0aW9uQmFzZVVybFwiKSBwcm9kdWN0aW9uQmFzZVVybDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogT3B6aW9uaSBwZXIgbGEgY29tcHJlc3Npb25lIGRlbGxlIGltbWFnaW5pIGNhcmljYXRlLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcImNvbXByZXNzaW9uT3B0aW9uc1wiKSBjb21wcmVzc2lvbk9wdGlvbnM6IElPcHRpb25zID0geyBtYXhTaXplTUI6IDAuNSwgbWF4V2lkdGhPckhlaWdodDogMTkyMCwgdXNlV2ViV29ya2VyOiB0cnVlIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIEFycmF5IGRpIEF0dGFjaG1lbnRUeXBlIGNoZSBzaSBwb3Nzb25vIGFnZ2l1bmdlcmVcclxuICAgKi9cclxuICBASW5wdXQoXCJhbGxvd2VkVHlwZXNcIikgYWxsb3dlZFR5cGVzOiBBcnJheTxBdHRhY2htZW50VHlwZT4gPSBbQXR0YWNobWVudFR5cGUuRklMRSwgQXR0YWNobWVudFR5cGUuTElOS107XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1ldHRlIGRpIHN0YWJpbGlyZSBzZSBsYSBlcXAtdGFibGUgY29udGVuZW50ZSBsJ2VsZW5jbyBkZWdsaSBhbGxlZ2F0aSB1dGlsaXp6YVxyXG4gICAqIGlsIG11bHRpbGluZ3VhIG9wcHVyZSBub1xyXG4gICAqL1xyXG4gIEBJbnB1dChcImlzRXFwVGFibGVNdWx0aUxhbmd1YWdlXCIpIGlzRXFwVGFibGVNdWx0aUxhbmd1YWdlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1ldHRlIGRpIHN0YWJpbGlyZSwgaW4gY2FzbyBkaSBnZXN0aW9uZSBhbGxlZ2F0aSBtdWx0aXBsaSwgc2UgbGEgdGFiZWxsYSBjb250ZW5lbnRlIGwnZWxlbmNvIFxyXG4gICAqIGRlZ2xpIGFsbGVnYXRpIGRldmUgZXNzZXJlIHBhZ2luYXRhIG9wcHVyZSBub1xyXG4gICAqL1xyXG4gIEBJbnB1dChcInRhYmxlUGFnaW5hdG9yVmlzaWJsZVwiKSB0YWJsZVBhZ2luYXRvclZpc2libGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBJbiBjYXNvIGRpIGdlc3Rpb25lIGFsbGVnYXRpIG11bHRpcGxpLCBwZXJtZXR0ZSBkaSBzdGFiaWxpcmUgbGEgZGltZW5zaW9uZSBwYWdpbmEgZGkgZGVmYXVsdCBcclxuICAgKiBwZXIgbGEgdGFiZWxsYSBjb250ZW5lbnRlIGwnZWxlbmNvIGRlZ2xpIGFsbGVnYXRpXHJcbiAgICovXHJcbiAgQElucHV0KFwidGFibGVQYWdpbmF0b3JTaXplXCIpIHRhYmxlUGFnaW5hdG9yU2l6ZTogbnVtYmVyID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogSW5wdXQgcGVyIGRlZmluaXJlIGxlIGxhYmVsIGRhIHVzYXJlIG5lbCBjb21wb25lbnRlXHJcbiAgICovXHJcbiAgQElucHV0KFwiZG93bmxvYWRUb29sdGlwUG9zaXRpb25cIikgZG93bmxvYWRUb29sdGlwUG9zaXRpb246IFRvb2x0aXBQb3NpdGlvblR5cGUgPSBUb29sdGlwUG9zaXRpb25UeXBlLkJlbG93O1xyXG4gIEBJbnB1dChcIm9wZW5MaW5rTGFiZWxcIikgb3BlbkxpbmtMYWJlbDogc3RyaW5nID0gXCJBcHJpIGxpbmtcIjtcclxuICBASW5wdXQoXCJhZGRCdXR0b25MYWJlbFwiKSBhZGRCdXR0b25MYWJlbDogc3RyaW5nID0gXCJBZ2dpdW5naVwiO1xyXG4gIEBJbnB1dChcImRvd25sb2FkTGFiZWxcIikgZG93bmxvYWRMYWJlbDogc3RyaW5nID0gXCJEb3dubG9hZFwiO1xyXG4gIEBJbnB1dChcImRlbGV0ZUxhYmVsXCIpIGRlbGV0ZUxhYmVsOiBzdHJpbmcgPSBcIkVsaW1pbmFcIjtcclxuICBASW5wdXQoXCJmaWxlTmFtZUxhYmVsXCIpIGZpbGVOYW1lTGFiZWw6IHN0cmluZyA9IFwiTm9tZSBmaWxlXCI7XHJcbiAgQElucHV0KFwicHJldmlld0xhYmVsXCIpIHByZXZpZXdMYWJlbDogc3RyaW5nID0gXCJBbnRlcHJpbWFcIjtcclxuICBASW5wdXQoXCJ1cGxvYWRGaWxlTGFiZWxcIikgdXBsb2FkRmlsZUxhYmVsOiBzdHJpbmcgPSBcIkNhcmljYSBmaWxlXCI7XHJcbiAgQElucHV0KFwiY29uZmlybUxhYmVsXCIpIGNvbmZpcm1MYWJlbDogc3RyaW5nID0gXCJDb25mZXJtYVwiO1xyXG4gIEBJbnB1dChcImFib3J0TGFiZWxcIikgYWJvcnRMYWJlbDogc3RyaW5nID0gXCJBbm51bGxhXCI7XHJcbiAgQElucHV0KFwic2F2ZUxhYmVsXCIpIHNhdmVMYWJlbDogc3RyaW5nID0gXCJTYWx2YVwiO1xyXG4gIEBJbnB1dChcImV4aXRMYWJlbFwiKSBleGl0TGFiZWw6IHN0cmluZyA9IFwiRXNjaVwiO1xyXG4gIEBJbnB1dChcImVxcFRhYmxlU2VhcmNoVGV4dFwiKSBlcXBUYWJsZVNlYXJjaFRleHQ6IHN0cmluZyA9IFwiQ2VyY2FcIjtcclxuICBASW5wdXQoXCJkZWxldGVEaWFsb2dUaXRsZVwiKSBkZWxldGVEaWFsb2dUaXRsZTogc3RyaW5nID0gbnVsbDtcclxuICBASW5wdXQoXCJkZWxldGVEaWFsb2dNZXNzYWdlXCIpIGRlbGV0ZURpYWxvZ01lc3NhZ2U6IHN0cmluZyA9IFwiU2VpIHNpY3VybyBkaSB2b2xlciBjYW5jZWxsYXJlIHF1ZXN0J2FsbGVnYXRvP1wiO1xyXG4gIEBJbnB1dChcIm5vSW1hZ2VTZWxlY3RlZEVycm9yTWVzc2FnZVwiKSBub0ltYWdlU2VsZWN0ZWRFcnJvck1lc3NhZ2U6IHN0cmluZyA9IFwiTm9uIMOoIHBvc3NpYmlsZSBzZWxlemlvbmFyZSB1biBmaWxlIGNoZSBub24gc2lhIHVuJ2ltbWFnaW5lLlwiO1xyXG4gIEBJbnB1dChcIndyb25nVHlwZVNlbGVjdGVkRXJyb3JNZXNzYWdlXCIpIHdyb25nVHlwZVNlbGVjdGVkRXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBcIk5vbiDDqCBwb3NzaWJpbGUgY2FyaWNhcmUgaWwgZmlsZSBzZWxlemlvbmF0by5cIjtcclxuICBASW5wdXQoXCJ2aWRlb1ByZXZpZXdFcnJvck1lc3NhZ2VcIikgdmlkZW9QcmV2aWV3RXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBcIkltcG9zc2liaWxlIGFwcmlyZSBsJ2FudGVwcmltYSBkaSB1biBmaWxlIHZpZGVvLlwiO1xyXG4gIEBJbnB1dChcInZpZGVvUHJldmlld0Vycm9yTWVzc2FnZVwiKSBhdWRpb1ByZXZpZXdFcnJvck1lc3NhZ2U6IHN0cmluZyA9IFwiSW1wb3NzaWJpbGUgYXByaXJlIGwnYW50ZXByaW1hIGRpIHVuIGZpbGUgYXVkaW8uXCI7XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBAT3V0cHV0IGRlbCBjb21wb25lbnRlXHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc3RpdHVpc2NlIGxhIGxpc3RhIGFnZ2lvcm5hdGEgZGVnbGkgYWxsZWdhdGkuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIGxvY2FsRWRpdGVkQXR0YWNobWVudHM6IEV2ZW50RW1pdHRlcjxBcnJheTxJQXR0YWNobWVudERUTz4+ID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxJQXR0YWNobWVudERUTz4+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50byBzY2F0ZW5hdG8gYWxsYSBwcmVzc2lvbmUgZGVsIHB1bHNhbnRlIEVTQ0kgZGVsbGEgbW9kYWxlIGRpIGNhcmljYW1lbnRvIGZpbGUuXHJcbiAgICovXHJcbiAgIEBPdXRwdXQoKSBhYm9ydEFkZEF0dGFjaG1lbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50byBkaSBvdXRwdXQgY2hlIHJlc3RpdHVpc2NlIGwnSUF0dGFjaG1lbnREVE8gc2VsZXppb25hdG8gcGVyIGlsIGRvd25sb2FkIG5lbCBjYXNvIEZpbGVEYXRhQmFzZTY0LCBGaWxlQ29udGVudFR5cGUgbyBGaWxlTmFtZSBub24gZm9zc2VybyBzcGVjaWZpY2F0aS5cclxuICAgKi9cclxuICBAT3V0cHV0KFwiZG93bmxvYWRBdHRhY2htZW50XCIpIGRvd25sb2FkQXR0YWNobWVudDogRXZlbnRFbWl0dGVyPElBdHRhY2htZW50RFRPPiA9IG5ldyBFdmVudEVtaXR0ZXI8SUF0dGFjaG1lbnREVE8+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50byBkaSBvdXRwdXQgY2hlIHJlc3RpdHVpc2NlIGwnZWxlbWVudG8gZWxpbWluYXRvIHByaW1hIGNoZSBxdWVzdG8gdmVuZ2EgZWZmZXR0aXZhbWVudGUgcmlzbW9zc28gZGFsbGEgbGlzdGEuXHJcbiAgICovXHJcbiAgQE91dHB1dChcIm9uRGVsZXRlQXR0YWNobWVudFwiKSBvbkRlbGV0ZUF0dGFjaG1lbnQ6IEV2ZW50RW1pdHRlcjxJQXR0YWNobWVudERUTz4gPSBuZXcgRXZlbnRFbWl0dGVyPElBdHRhY2htZW50RFRPPigpO1xyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIFByb3ByaWV0w6AgcGVyIGdlc3Rpb25lIGNhcmljYW1lbnRvIG51b3ZvIGFsbGVnYXRvXHJcbiAgbmV3QXR0YWNobWVudDogSUF0dGFjaG1lbnREVE8gPSB7fSBhcyBJQXR0YWNobWVudERUTztcclxuICBuZXdNdWx0aXBsZUF0dGFjaG1lbnRzOiBBcnJheTxJQXR0YWNobWVudERUTz4gPSBbXTtcclxuICBkaWFsb2ZSZWZBZGRBdHRhY2htZW50OiBNYXREaWFsb2dSZWY8VGVtcGxhdGVSZWY8YW55Pj47XHJcbiAgYXR0YWNobWVudFR5cGUgPSBBdHRhY2htZW50VHlwZTtcclxuICBuZXdBdHRhY2htZW50Rm9ybTogRm9ybUdyb3VwO1xyXG4gIHNlbGVjdGVkRmlsZTogRmlsZSA9IG51bGw7XHJcbiAgc2VsZWN0ZWRGaWxlczogQXJyYXk8RmlsZT4gPSBudWxsO1xyXG4gIHNob3dDcm9wSW1hZ2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAVmlld0NoaWxkKCdkaWFsb2dBZGRBdHRhY2htZW50JywgeyBzdGF0aWM6IHRydWUgfSkgZGlhbG9nQWRkQXR0YWNobWVudDogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdkaWFsb2dBZGRNdWx0aXBsZUF0dGFjaG1lbnQnLCB7IHN0YXRpYzogdHJ1ZSB9KSBkaWFsb2dBZGRNdWx0aXBsZUF0dGFjaG1lbnQ6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBQcm9wcmlldMOgIHBlciBnZXN0aW9uZSByaWRpbWVuc2lvbmFtZW50byBmaWxlIGRpIHRpcG8gaW1hZ2VcclxuICBpbWFnZUNoYW5nZWRFdmVudDogYW55ID0gJyc7XHJcbiAgY3JvcHBlZEltYWdlOiBhbnkgPSAnJztcclxuICB0cmFuc2Zvcm06IEltYWdlVHJhbnNmb3JtID0ge307XHJcbiAgQFZpZXdDaGlsZChJbWFnZUNyb3BwZXJDb21wb25lbnQpIGltYWdlQ3JvcHBlcjogSW1hZ2VDcm9wcGVyQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoJ2ltYWdlSW5wdXQnKSBpbWFnZUlucHV0OiBhbnk7XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIEF0dGFjaG1lbnRUeXBlID0gQXR0YWNobWVudFR5cGU7XHJcbiAgc2VsZWN0ZWRBdHRhY2htZW50OiBJQXR0YWNobWVudERUTztcclxuXHJcbiAgb3JpZ2luYWxXaWR0aDogbnVtYmVyO1xyXG4gIG9yaWdpbmFsSGVpZ2h0OiBudW1iZXI7XHJcbiAgY3VzdG9tV2lkdGg6IG51bWJlcjtcclxuICBjdXN0b21IZWlnaHQ6IG51bWJlcjtcclxuXHJcbiAgQFZpZXdDaGlsZCgnYXR0YWNobWVudFRhYmxlJywgeyBzdGF0aWM6IGZhbHNlIH0pIGF0dGFjaG1lbnRUYWJsZTogRXFwVGFibGVDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZCgnaW5saW5lUHJldmlld1RlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSkgaW5saW5lUHJldmlld1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ2RpYWxvZ1ByZXZpZXcnLCB7IHN0YXRpYzogdHJ1ZSB9KSBkaWFsb2dQcmV2aWV3OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcblxyXG4gICAgLy9TZSDDqCBzdGF0YSByaWNoaWVzdGEgbGEgZ2VzdGlvbmUgZGVsbGUgc29sZSBpbW1hZ2luaSBhbGxvcmEgaW1wb3N0YSBpbCBmaWx0cm8gcGVyIGxlIGVzdGVuc2lvbmkgcG9zc2liaWxpIGRhIGNhcmljYXJlXHJcbiAgICBpZiAoIXRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMpXHJcbiAgICAgIGlmICh0aGlzLmFsbG93T25seUltYWdlcyA9PSB0cnVlKVxyXG4gICAgICAgIHRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMgPSBcImltYWdlLypcIjtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMgPSBcIipcIjtcclxuXHJcbiAgICAvLyBTZSBub24gc29ubyBzdGF0aSBzcGVjaWZpY2F0aSBpIHRpcGkgZGEgZ2VzdGlyZSBtYSDDqCBzdGF0byBwYXNzYXRvIG51bGwgbyB1biBhcnJheSB2dW90byBpbXBvc3RvIGkgdGlwaSBkaSBkZWZhdWx0LlxyXG4gICAgaWYgKCF0aGlzLmFsbG93ZWRUeXBlcyB8fCB0aGlzLmFsbG93ZWRUeXBlcy5sZW5ndGggPT0gMClcclxuICAgICAgdGhpcy5hbGxvd2VkVHlwZXMgPSBbQXR0YWNobWVudFR5cGUuRklMRSwgQXR0YWNobWVudFR5cGUuTElOS107XHJcbiAgICBlbHNlIGlmICh0aGlzLmFsbG93ZWRUeXBlcy5maW5kKHQgPT4gdCAhPSBBdHRhY2htZW50VHlwZS5GSUxFICYmIHQgIT0gQXR0YWNobWVudFR5cGUuTElOSykpIHtcclxuICAgICAgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UuV2FybmluZyhcIkFsbWVubyB1bm8gZGVnbGkgQXR0YWNobWVudFR5cGUgc2VsZXppb25hdGkgbmVsIHBhcmFtZXRybyBcXFwiYWxsb3dlZFR5cGVzXFxcIiBub24gZXNpc3RlLlwiKVxyXG4gICAgICB0aGlzLmFsbG93ZWRUeXBlcyA9IFtBdHRhY2htZW50VHlwZS5GSUxFLCBBdHRhY2htZW50VHlwZS5MSU5LXTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9TZSDDqCBzdGF0YSByaWNoaWVzdGEgbGEgZ2VzdGlvbmUgbXVsdGlwbGEgZGVnbGkgYWxsZWdhdGkgYWxsb3JhIGNvbmZpZ3VyYSBsJ2VxcC10YWJsZVxyXG4gICAgaWYgKHRoaXMubXVsdGlwbGVBdHRhY2htZW50ID09IHRydWUgJiYgKCF0aGlzLmF0dGFjaG1lbnRzQ29sdW1ucyB8fCB0aGlzLmF0dGFjaG1lbnRzQ29sdW1ucy5sZW5ndGggPT0gMCkpIHtcclxuICAgICAgdGhpcy5jb25maWd1cmVDb2x1bW5zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYXR0YWNobWVudHNMaXN0ID09IG51bGwpXHJcbiAgICAgIHRoaXMuYXR0YWNobWVudHNMaXN0ID0gbmV3IEFycmF5PElBdHRhY2htZW50RFRPPigpO1xyXG5cclxuICAgIHRoaXMuY2hlY2tBdHRhY2htZW50SW1hZ2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWxvYWREYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuYXR0YWNobWVudFRhYmxlKVxyXG4gICAgICB0aGlzLmF0dGFjaG1lbnRUYWJsZS5yZWxvYWREYXRhdGFibGUoKTtcclxuICB9XHJcblxyXG4gIGNoZWNrQXR0YWNobWVudEltYWdlKCkge1xyXG4gICAgdGhpcy5hdHRhY2htZW50c0xpc3QuZm9yRWFjaChhID0+IHtcclxuICAgICAgYS5Jc0ltYWdlID0gQXR0YWNobWVudEhlbHBlclNlcnZpY2UuY2hlY2tJbWFnZUZyb21NaW1lVHlwZShhLkZpbGVDb250ZW50VHlwZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBHZXN0aW9uZSBlbGVuY28gYWxsZWdhdGlcclxuXHJcbiAgLyoqXHJcbiAgICogQ29uZmlndXJhIGxlIGNvbG9ubmUgcGVyIGwnZXFwLXRhYmxlIG5lbCBjYXNvIGluIGN1aSBpbCBwYXJhbWV0cm8gXCJtdWx0aXBsZUF0dGFjaG1lbnRzXCIgw6ggVFJVRS5cclxuICAgKi9cclxuICBjb25maWd1cmVDb2x1bW5zKCkge1xyXG4gICAgdGhpcy5hdHRhY2htZW50c0NvbHVtbnMgPSBbXTtcclxuICAgIGlmICh0aGlzLmRpc2FibGVBY3Rpb24gIT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmF0dGFjaG1lbnRzQ29sdW1ucy5wdXNoKHtcclxuICAgICAgICBrZXk6IFwiYWN0aW9uXCIsIGRpc3BsYXk6IFwiXCIsXHJcbiAgICAgICAgdHlwZTogVHlwZUNvbHVtbi5NZW51QWN0aW9uLCBidXR0b25NZW51SWNvbjogXCJtb3JlX3ZlcnRcIiwgc3R5bGVzOiB7IGZsZXg6IFwiMCAwIDYlXCIgfSxcclxuICAgICAgICBhY3Rpb25zOiBbXHJcbiAgICAgICAgICB7IG5hbWU6IHRoaXMuZGVsZXRlTGFiZWwsIGljb246IFwiZGVsZXRlXCIsIGZuOiAoZWxlbWVudCwgaW5kZXgsIGNvbCkgPT4gdGhpcy5kZWxldGVBdHRhY2htZW50KGVsZW1lbnQpIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZG93bmxvYWRDb2x1bW4gPSB7XHJcbiAgICAgIGtleTogXCJhdHRhY2htZW50XCIsIGRpc3BsYXk6IFwiXCIsXHJcbiAgICAgIHR5cGU6IFR5cGVDb2x1bW4uU2ltcGxlQWN0aW9uLCBzdHlsZXM6IHsgZmxleDogXCIwIDAgNiVcIiB9LFxyXG4gICAgICBhY3Rpb25zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJycsIGZvbnRhd2Vzb21lOiB0cnVlLFxyXG4gICAgICAgICAgaWNvbjogKGVsZW1lbnQpID0+IHsgcmV0dXJuIHRoaXMuc2hvd0lubGluZVByZXZpZXcgPyAoZWxlbWVudC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5GSUxFID8gXCJmYXMgZmEtY2xvdWQtZG93bmxvYWQtYWx0XCIgOiBcImZhcyBmYS1leHRlcm5hbC1saW5rLWFsdFwiKSA6IHRoaXMuZ2V0QXR0YWNobWVudEljb24oZWxlbWVudCk7IH0sXHJcbiAgICAgICAgICBmbjogKGVsZW1lbnQsIGNvbCwgZWxlbWVudEluZGV4KSA9PiB0aGlzLnZpZXdBdHRhY2htZW50KGVsZW1lbnQpLFxyXG4gICAgICAgICAgdG9vbHRpcDogeyB0b29sdGlwVGV4dDogKGVsZW1lbnQpID0+IHsgcmV0dXJuIGVsZW1lbnQuQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuRklMRSA/IHRoaXMuZG93bmxvYWRMYWJlbCA6IHRoaXMub3BlbkxpbmtMYWJlbDsgfSwgdG9vbHRpcFBvc2l0aW9uOiB0aGlzLmRvd25sb2FkVG9vbHRpcFBvc2l0aW9uIH1cclxuICAgICAgICB9LFxyXG4gICAgICBdXHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBpbmxpbmVQcmV2aWV3Q29sdW1uID0ge1xyXG4gICAgICBrZXk6IFwiSW5saW5lUHJldmlld1wiLCBkaXNwbGF5OiB0aGlzLnByZXZpZXdMYWJlbCxcclxuICAgICAgdHlwZTogVHlwZUNvbHVtbi5FeHRlcm5hbFRlbXBsYXRlLFxyXG4gICAgICBleHRlcm5hbFRlbXBsYXRlOiB0aGlzLmlubGluZVByZXZpZXdUZW1wbGF0ZSxcclxuICAgICAgc3R5bGVzOiB7IGZsZXg6IFwiMCAwIDEwJVwiIH1cclxuICAgIH07XHJcblxyXG4gICAgbGV0IGZpbGVOYW1lQ29sdW1uID0geyBrZXk6IFwiRmlsZU5hbWVcIiwgZGlzcGxheTogdGhpcy5maWxlTmFtZUxhYmVsIH07XHJcblxyXG4gICAgaWYgKHRoaXMuc2hvd0lubGluZVByZXZpZXcpIHtcclxuICAgICAgdGhpcy5hdHRhY2htZW50c0NvbHVtbnMucHVzaChpbmxpbmVQcmV2aWV3Q29sdW1uKTtcclxuICAgICAgdGhpcy5hdHRhY2htZW50c0NvbHVtbnMucHVzaChmaWxlTmFtZUNvbHVtbik7XHJcbiAgICAgIHRoaXMuYXR0YWNobWVudHNDb2x1bW5zLnB1c2goZG93bmxvYWRDb2x1bW4pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hdHRhY2htZW50c0NvbHVtbnMucHVzaChkb3dubG9hZENvbHVtbik7XHJcbiAgICAgIHRoaXMuYXR0YWNobWVudHNDb2x1bW5zLnB1c2goZmlsZU5hbWVDb2x1bW4pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRWxpbWluYSB1biBhbGxlZ2F0byBlbGltaW5hbmRvIGFuY2hlIGlsIGZpbGUgcHJlc2VudGUgbmVsbG8gc3RvcmFnZSBkaSBhcmNoaXZpYXppb25lIHV0aWxpenphdG8gKEFXUyBvIGNhcnRlbGxhIHByb2dldHRvKVxyXG4gICAqIEBwYXJhbSBlbGVtZW50IElBdHRhY2htZW50RFRPIGRhIGNhbmNlbGxhcmVcclxuICAgKi9cclxuICBkZWxldGVBdHRhY2htZW50KGVsZW1lbnQ6IElBdHRhY2htZW50RFRPKSB7XHJcbiAgICBFcXBBdHRhY2htZW50RGlhbG9nU2VydmljZS5Db25maXJtKHRoaXMuZGVsZXRlRGlhbG9nTWVzc2FnZSwgKCkgPT4ge1xyXG4gICAgICB0aGlzLnJlbW92ZUF0dGFjaG1lbnRGcm9tTGlzdCh0aGlzLmF0dGFjaG1lbnRzTGlzdC5pbmRleE9mKGVsZW1lbnQpKTtcclxuICAgIH0sIHRydWUsIHRoaXMuZGVsZXRlRGlhbG9nVGl0bGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmltdW92ZSBsJ2FsbGVnYXRvIHNlbGV6aW9uYXRvIGRhbGxhIGxpc3RhIFwiYXR0YWNobWVudHNMaXN0XCIgZSBpbnZvY2EgbCdldmVudG8gZGkgb3V0cHV0IGNoZSByZXN0aXR1aXNjZSBsYSBsaXN0YSBhZ2dpb3JuYXRhLlxyXG4gICAqIEBwYXJhbSBhdHRhY2htZW50SW5kZXggSW5kaWNlIGRlbGwnYXR0YWNobWVudCBkYSByaW11b3ZlcmVcclxuICAgKi9cclxuICByZW1vdmVBdHRhY2htZW50RnJvbUxpc3QoYXR0YWNobWVudEluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMub25EZWxldGVBdHRhY2htZW50LmVtaXQodGhpcy5hdHRhY2htZW50c0xpc3RbYXR0YWNobWVudEluZGV4XSk7XHJcblxyXG4gICAgdGhpcy5hdHRhY2htZW50c0xpc3Quc3BsaWNlKGF0dGFjaG1lbnRJbmRleCwgMSk7XHJcbiAgICBpZiAodGhpcy5hdHRhY2htZW50VGFibGUpXHJcbiAgICAgIHRoaXMuYXR0YWNobWVudFRhYmxlLnJlbG9hZERhdGF0YWJsZSgpO1xyXG4gICAgdGhpcy5sb2NhbEVkaXRlZEF0dGFjaG1lbnRzLmVtaXQodGhpcy5hdHRhY2htZW50c0xpc3QpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFNjYXJpY2EgbCdhbGxlZ2F0byBvIGFwcmUgaWwgbGlua1xyXG4gICAqIEBwYXJhbSBlbGVtZW50IEFsbGVnYXRvIGRhIG1vc3RyYXJlXHJcbiAgICovXHJcbiAgdmlld0F0dGFjaG1lbnQoYXR0YWNobWVudDogSUF0dGFjaG1lbnREVE8pIHtcclxuXHJcbiAgICBpZiAoYXR0YWNobWVudC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5MSU5LKSB7XHJcbiAgICAgIHdpbmRvdy5vcGVuKGF0dGFjaG1lbnQuRmlsZVBhdGgsICdfYmxhbmsnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChhdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0ICYmIGF0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlICYmIGF0dGFjaG1lbnQuRmlsZU5hbWUpIHtcclxuICAgICAgbGV0IHNvdXJjZSA9IGBkYXRhOiR7YXR0YWNobWVudC5GaWxlQ29udGVudFR5cGV9O2Jhc2U2NCwke2F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjR9YDtcclxuICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICBsaW5rLmhyZWYgPSBzb3VyY2U7XHJcbiAgICAgIGxpbmsuZG93bmxvYWQgPSBgJHthdHRhY2htZW50LkZpbGVOYW1lfWBcclxuICAgICAgbGluay5jbGljaygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kb3dubG9hZEF0dGFjaG1lbnQuZW1pdChhdHRhY2htZW50KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaWRlZmluaXNjZSBsJ2ljb25hIGRhIG1vc3RyYXJlIG5lbGxhIGNvbG9ubmEgZGVsbCdlcXAtdGFibGUgcGVyIG9nbmkgZmlsZS5cclxuICAgKiBMJ2ljb25hIHZhcmlhIGluIGJhc2UgYWxsJ2VzdGVuc2lvbmUgZGVsIGZpbGVcclxuICAgKiBAcGFyYW0gYXR0YWNobWVudCBcclxuICAgKi9cclxuICBnZXRBdHRhY2htZW50SWNvbihhdHRhY2htZW50OiBJQXR0YWNobWVudERUTykge1xyXG4gICAgaWYgKGF0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuTElOSylcclxuICAgICAgcmV0dXJuIFwiZmFzIGZhLWxpbmtcIjtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIEF0dGFjaG1lbnRIZWxwZXJTZXJ2aWNlLmdldEljb25Gcm9tRmlsZUV4dGVuc2lvbmUoYXR0YWNobWVudC5GaWxlRXh0ZW5zaW9uKTtcclxuICB9XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvKipcclxuICAgKiBBcHJlIGxhIG1vZGFsZSBwZXIgbGEgZGVmaW5pemlvbmUgZGVpIHBhcmFtZXRyaSBkZWwgbnVvdm8gZmlsZVxyXG4gICAqL1xyXG4gIG9wZW5Nb2RhbEFkZEF0dGFjaG1lbnQoYXR0YWNobWVudFR5cGU6IEF0dGFjaG1lbnRUeXBlKSB7XHJcblxyXG4gICAgLy9TZSDDqCBzdGF0byByaWNoaWVzdG8gaWwgY2FyaWNhbWVudG8gZGkgdW4gTElOSyBvIMOoIGltcG9zdGF0byBpbCBjYXJpY2FtZW50byBkaSBGSUxFIFNJTkdPTE8gYWxsb3JhIGFwcmUgbGEgbW9kYWxlIHBlclxyXG4gICAgLy9pbCBjYXJpY2FtZW50byBzaW5nb2xvIGRlbCBmaWxlIGFsdHJpbWVudGkgYXByZSBxdWVsbGEgcGVyIGlsIGNhcmljYW1lbnRvIG11bHRpcGxvXHJcbiAgICAvLyBpZiAoYXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuTElOSyB8fCAoYXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuRklMRSAmJiB0aGlzLmxvYWRNdWx0aXBsZUZpbGVzICE9IHRydWUpKSB7XHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnQgPSB7fSBhcyBJQXR0YWNobWVudERUTztcclxuICAgIHRoaXMubmV3QXR0YWNobWVudC5Jc0ltYWdlID0gZmFsc2U7XHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUgPSBhdHRhY2htZW50VHlwZTtcclxuICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyA9IG5ldyBBcnJheTxJQXR0YWNobWVudERUTz4oKTtcclxuICAgIGlmKGF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkxJTkspXHJcbiAgICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cy5wdXNoKHRoaXMubmV3QXR0YWNobWVudCk7XHJcblxyXG4gICAgdGhpcy5jcmVhdGVBdHRhY2htZW50Rm9ybSgpO1xyXG5cclxuICAgIC8vQXByZSBsYSBtb2RhbGVcclxuICAgIHRoaXMuZGlhbG9mUmVmQWRkQXR0YWNobWVudCA9IHRoaXMuZGlhbG9nLm9wZW4odGhpcy5kaWFsb2dBZGRBdHRhY2htZW50LCB7XHJcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcclxuICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXHJcbiAgICAgIHdpZHRoOiAnNjAlJyxcclxuICAgICAgbWF4SGVpZ2h0OiAnODAlJ1xyXG4gICAgfSk7XHJcbiAgIFxyXG5cclxuICB9XHJcblxyXG4gIGNyZWF0ZUF0dGFjaG1lbnRGb3JtKCkge1xyXG4gICAgLy9DcmVhIGxhIGZvcm0gcGVyIGxhIHZhbGlkYXppb25lIGRlaSBjYW1waVxyXG4gICAgdGhpcy5uZXdBdHRhY2htZW50Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICB0eXBlOiBbdGhpcy5uZXdBdHRhY2htZW50LkF0dGFjaG1lbnRUeXBlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgbmFtZTogW3RoaXMubmV3QXR0YWNobWVudC5GaWxlTmFtZV0sXHJcbiAgICAgIHBhdGg6IFt0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZVBhdGhdLFxyXG4gICAgICBjdXN0b21IZWlnaHQ6IFt0aGlzLmN1c3RvbUhlaWdodF0sXHJcbiAgICAgIGN1c3RvbVdpZHRoOiBbdGhpcy5jdXN0b21XaWR0aF1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2xvc2UoZW1pdENsb3NlRXZlbnQgPSB0cnVlKSB7XHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnQgPSB7fSBhcyBJQXR0YWNobWVudERUTztcclxuICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyA9IG5ldyBBcnJheTxJQXR0YWNobWVudERUTz4oKTtcclxuICAgIHRoaXMuYWJvcnRGaWxlKCk7XHJcbiAgICBpZiAodGhpcy5uZXdBdHRhY2htZW50Rm9ybSlcclxuICAgICAgdGhpcy5uZXdBdHRhY2htZW50Rm9ybS5yZXNldCgpO1xyXG5cclxuICAgIHRoaXMuZGlhbG9mUmVmQWRkQXR0YWNobWVudC5jbG9zZSgpO1xyXG5cclxuXHJcbiAgICBpZihlbWl0Q2xvc2VFdmVudCA9PSB0cnVlICYmIHRoaXMuYWJvcnRBZGRBdHRhY2htZW50KVxyXG4gICAgICB0aGlzLmFib3J0QWRkQXR0YWNobWVudC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbiBiYXNlIGFsIHRpcG8gZGkgYWxsZWdhdG8gY29udHJvbGxhIHNlIGRpc2FiaWxpdGFyZSBvIG1lbm8gaWwgcHVsc2FudGUgcGVyIHNhbHZhcmUuXHJcbiAgICogRnVuemlvbmUgdXNhdGEgbmVsIFtkaXNhYmxlXSBkZWwgcHVsc2FudGUgXCJTYWx2YVwiIGRlbCBkaWFsb2cgcGVyIGwnYWdnaXVudGEgZGkgdW4gYWxsZWdhdG8uXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgZGlzYWJsZVNhdmUoKSB7XHJcbiAgICBpZiAodGhpcy5sb2FkTXVsdGlwbGVGaWxlcyAhPSB0cnVlKSB7XHJcbiAgICAgIGlmICh0aGlzLm5ld0F0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuRklMRSkge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5uZXdBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5uZXdBdHRhY2htZW50LkZpbGVQYXRoO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cy5maWx0ZXIocCA9PiAocC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5GSUxFICYmICFwLkZpbGVEYXRhQmFzZTY0KSB8fCAocC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5MSU5LICYmICFwLkZpbGVQYXRoKSkubGVuZ3RoID4gMDtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBjb25maXJtQWRkQXR0YWNobWVudCgpIHtcclxuXHJcbiAgICBpZiAodGhpcy5sb2FkTXVsdGlwbGVGaWxlcyAhPSB0cnVlKSB7XHJcbiAgICAgIGlmICh0aGlzLm5ld0F0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuTElOSyAmJiAhdGhpcy5uZXdBdHRhY2htZW50LkZpbGVOYW1lKVxyXG4gICAgICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlTmFtZSA9IHRoaXMubmV3QXR0YWNobWVudC5GaWxlUGF0aDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmF0dGFjaG1lbnRzTGlzdCA9PSBudWxsKVxyXG4gICAgICAgIHRoaXMuYXR0YWNobWVudHNMaXN0ID0gbmV3IEFycmF5PElBdHRhY2htZW50RFRPPigpO1xyXG5cclxuICAgICAgdGhpcy5hdHRhY2htZW50c0xpc3QucHVzaCh0aGlzLm5ld0F0dGFjaG1lbnQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMgPT0gbnVsbCB8fCB0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMubGVuZ3RoID09IDApXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKHRoaXMuYXR0YWNobWVudHNMaXN0ID09IG51bGwpXHJcbiAgICAgICAgdGhpcy5hdHRhY2htZW50c0xpc3QgPSBuZXcgQXJyYXk8SUF0dGFjaG1lbnREVE8+KCk7XHJcblxyXG4gICAgICB0aGlzLmF0dGFjaG1lbnRzTGlzdCA9IHRoaXMuYXR0YWNobWVudHNMaXN0LmNvbmNhdCh0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmF0dGFjaG1lbnRUYWJsZSlcclxuICAgICAgdGhpcy5hdHRhY2htZW50VGFibGUucmVsb2FkRGF0YXRhYmxlKCk7XHJcblxyXG4gICAgdGhpcy5sb2NhbEVkaXRlZEF0dGFjaG1lbnRzLmVtaXQodGhpcy5hdHRhY2htZW50c0xpc3QpO1xyXG4gICAgdGhpcy5jbG9zZShmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHJlIGlsIGRpYWxvZyBwZXIgbCdhbnRlcHJpbWEgZGVsbCdhbGxlZ2F0byBzZWxlemlvbmF0by5cclxuICAgKiBAcGFyYW0gcm93IFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIG9wZW5QcmV2aWV3RGlhbG9nKHJvdzogSUF0dGFjaG1lbnREVE8pIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyb3cpKTtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuRklMRSkge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoXCJ2aWRlb1wiKSkge1xyXG4gICAgICAgIEVxcEF0dGFjaG1lbnREaWFsb2dTZXJ2aWNlLldhcm5pbmcodGhpcy52aWRlb1ByZXZpZXdFcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUuc3RhcnRzV2l0aChcImF1ZGlvXCIpKSB7XHJcbiAgICAgICAgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UuV2FybmluZyh0aGlzLmF1ZGlvUHJldmlld0Vycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZ2V0QXR0YWNobWVudEVuZHBvaW50ICYmIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LklzSW1hZ2UgJiYgIXRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0KSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2V0QXR0YWNobWVudEJ5SUQoKVxyXG4gICAgICAgIC50aGVuKChyZXMpID0+IHsgdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgPSByZXMuRmlsZURhdGFCYXNlNjQ7IH0pXHJcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHsgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UuRXJyb3IoZXJyKTsgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkxJTkspIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuVHJ1c3RlZFVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCh0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlUGF0aCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LklzSW1hZ2UgJiYgIXRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0ICYmICF0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlVGh1bWJuYWlsQmFzZTY0KSB7XHJcbiAgICAgIEVxcEF0dGFjaG1lbnREaWFsb2dTZXJ2aWNlLkluZm8oXCJJbXBvc3NpYmlsZSBhcHJpcmUgbCdhbnRlcHJpbWEgZGVsbCdhbGxlZ2F0bywgZmlsZSBtYW5jYW50ZS5cIilcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIGlmICghdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuSXNJbWFnZSkge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuRmlsZVBhdGggJiYgdGhpcy5wcm9kdWN0aW9uQmFzZVVybCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LlRydXN0ZWRVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoXHJcbiAgICAgICAgICBcImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2d2aWV3P3VybD1cIiArXHJcbiAgICAgICAgICB0aGlzLnByb2R1Y3Rpb25CYXNlVXJsICtcclxuICAgICAgICAgIFwiL1wiICtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVQYXRoICtcclxuICAgICAgICAgIFwiJmVtYmVkZGVkPXRydWVcIlxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UuSW5mbyhcIkltcG9zc2liaWxlIGFwcmlyZSBsJ2FudGVwcmltYSBkZWwgZG9jdW1lbnRvIVwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRpYWxvZy5vcGVuKHRoaXMuZGlhbG9nUHJldmlldywge1xyXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXHJcbiAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRBdHRhY2htZW50QnlJRCgpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxJQXR0YWNobWVudERUTz4odGhpcy5nZXRBdHRhY2htZW50RW5kcG9pbnQsIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50KS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBHZXN0aW9uZSBjYXJpY2FtZW50byBmaWxlXHJcblxyXG4gIC8qKiBcclxuICAgKiBFdmVudG8gc2NhdGVuYXRvIGFsbGEgc2VsZXppb25lIGRlbCBmaWxlIChvIGRlaSBmaWxlKS5cclxuICAgKiBTZSBpbCBjYXJpY2FtZW50byDDqCBTSU5HT0xPIG8gc2UgY29tdW5xdWUgw6ggc3RhdG8gc2VsZXppb25hdG8gdW4gc29sbyBmaWxlIGFsbG9yYSBzaSBvY2N1cGEgZGkgY29udHJvbGxhcmUgc2Ugc2kgdHJhdHRhIGRpIHVuIGltbWFnaW5lIGluIG1vZG8gZGFcclxuICAgKiBtb3N0cmFyZSBsZSBmdW56aW9uYWxpdMOgIGRlbCBjcm9wcGllIChwZXIgcml0YWdsaWFyZSBsJ2ltbWFnaW5lKSBvcHB1cmUgbm8uXHJcbiAgICogU2UgaWwgZmlsZSBjYXJpY2F0byBub24gw6ggdW4gaW1tYWdpbmUgYWxsb3JhIGdlbmVyYSBkaXJldHRhbWVudGUgaWwgYmFzZTY0IGUgbG8gYXNzb2NpYSBhbGwnYWxsZWdhdG8gZGEgc2FsdmFyZS5cclxuICAgKiBTZSBpbnZlY2UgaWwgY2FyaWNhbWVudG8gZGVpIGZpbGUgw6ggTVVMVElQTE8gZSBzb25vIHByZXNlbnRpIHBpw7kgZmlsZSBhbGxvcmEgZXNlZ3VlIGxlIHN0ZXNzZSBvcGVyYXppb25pIGlnbm9yYW5kbyBwZXLDsiBpbCBjb250cmxsb1xyXG4gICAqIGltbWFnaW5lIHBlciBpbCBjcm9wcGllIChpbiBjYXNvIGRpIGNhcmljYW1lbnRvIG11bHRpcGxvIGxlIGZ1bnppb25hbGl0w6AgZGVsIGNyb3BwaWUgc29ubyBkaXNhYmlsaXRhdGUpLlxyXG4gICAqL1xyXG4gIGFzeW5jIG9uRmlsZUlucHV0Q2hhbmdlKGV2ZW50KSB7XHJcbiAgICB0aGlzLnNob3dDcm9wSW1hZ2UgPSBmYWxzZTtcclxuXHJcbiAgICAvL1NlIMOoIHN0YXRvIHJpY2hpZXN0byBpbCBjYXJpY2FtZW50byBTSU5HT0xPIG9wcHVyZSBzZSBpbCBjYXJpY2FtZW50byDDqCBNVUxUSVBMTyBtYSDDqCBzdGF0byBzZWxlemlvbmF0byB1biBzb2xvIGZpbGVcclxuICAgIC8vYWxsb3JhIHZlcmlmaWNhIHNlIGlsIGZpbGUgw6ggdW4gaW1tYWdpbmUgKHBlciBtb3N0cmFyZSBpbCBDUk9QUElFKVxyXG4gICAgaWYgKFsuLi5ldmVudC50YXJnZXQuZmlsZXNdLmxlbmd0aCA9PSAxIHx8IHRoaXMubG9hZE11bHRpcGxlRmlsZXMgIT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IGV2ZW50LnRhcmdldC5maWxlc1swXTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gZXZlbnQudGFyZ2V0LmZpbGVzO1xyXG4gICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGaWxlKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIC8vTWVtb3JpenphIGkgZGF0aSBwZXIgbCdhbGxlZ2F0byAgICAgICAgXHJcbiAgICAgIHRoaXMubmV3QXR0YWNobWVudCA9IGF3YWl0IHRoaXMuY3JlYXRlQXR0YWNobWVudEZyb21VcGxvYWRlZEZpbGUodGhpcy5zZWxlY3RlZEZpbGUsIGZhbHNlKTtcclxuICAgICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzID0gbmV3IEFycmF5PElBdHRhY2htZW50RFRPPigpO1xyXG4gICAgICB0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMucHVzaCh0aGlzLm5ld0F0dGFjaG1lbnQpO1xyXG5cclxuICAgICAgLy9TZSDDqCBzdGF0YSByaWNoaWVzdGEgbGEgZ2VzdGlvbmUgZGVsbGUgc29sZSBpbW1hZ2luaSBtYSBwZXIgZXJyb3JlIMOoIHN0YXRvIHNlbGV6aW9uYXRvIHVuIGZpbGUgY2hlIG5vbiDDqCB1biBpbW1hZ2luZVxyXG4gICAgICBsZXQgY2hlY2tPbmx5SW1hZ2UgPSB0aGlzLmNoZWNrQWxsb3dPbmx5SW1hZ2VGaWxlKHRoaXMubmV3QXR0YWNobWVudCk7XHJcbiAgICAgIGlmIChjaGVja09ubHlJbWFnZSA9PSBmYWxzZSlcclxuICAgICAgICByZXR1cm47XHJcblxyXG5cclxuICAgICAgaWYgKHRoaXMubG9hZE11bHRpcGxlRmlsZXMgPT0gdHJ1ZSAmJiBbLi4uZXZlbnQudGFyZ2V0LmZpbGVzXS5sZW5ndGggPT0gMSlcclxuICAgICAgICB0aGlzLmNyZWF0ZUF0dGFjaG1lbnRGb3JtKCk7XHJcblxyXG4gICAgICAvL1ZlcmlmaWNhIHNlIGlsIGZpbGUgY2FyaWNhdG8gw6ggdW4naW1tYWdpbmUgb3BwdXJlIG5vLiBTZSDDqCB1biBpbW1hZ2luZSwgcHJpbWEgZGkgY2FyaWNhcmxhIG1vc3RyYSBpbCBjcm9wcGllIHBlciBpbCByZXNpemUuXHJcbiAgICAgIC8vU2Ugbm9uIMOoIHVuIGltbWFnaW5lIGFsbG9yYSBnZW5lcmEgaWwgQmFzZTY0IFxyXG4gICAgICBpZiAodGhpcy5uZXdBdHRhY2htZW50LklzSW1hZ2UgPT0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuZ2V0SW1hZ2VEaW1lbnNpb25zKGV2ZW50LnRhcmdldC5maWxlc1swXSlcclxuXHJcbiAgICAgICAgLy9Nb3N0cmEgaWwgY3JvcHBpZSBlIGRpc2FiaWxpdGEgbGEgZm9ybSBmaW5jaMOoIG5vbiB0ZXJtaW5hIGxhIG1vZGlmaWNhIGRlbGwnaW1tYWdpbmVcclxuICAgICAgICB0aGlzLm5ld0F0dGFjaG1lbnRGb3JtLmRpc2FibGUoKTtcclxuICAgICAgICB0aGlzLm5ld0F0dGFjaG1lbnRGb3JtLmNvbnRyb2xzW1wiY3VzdG9tV2lkdGhcIl0uZW5hYmxlKCk7XHJcbiAgICAgICAgdGhpcy5uZXdBdHRhY2htZW50Rm9ybS5jb250cm9sc1tcImN1c3RvbUhlaWdodFwiXS5lbmFibGUoKTtcclxuICAgICAgICB0aGlzLnNob3dDcm9wSW1hZ2UgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaW1hZ2VDaGFuZ2VkRXZlbnQgPSBldmVudDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnNob3dDcm9wSW1hZ2UgPSBmYWxzZTtcclxuICAgICAgICBsZXQgYmFzZTY0UmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRCYXNlNjRGcm9tRmlsZSh0aGlzLnNlbGVjdGVkRmlsZSk7XHJcbiAgICAgICAgdGhpcy5uZXdBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0ID0gYmFzZTY0UmVzdWx0LkJhc2U2NEZpbGU7XHJcbiAgICAgICAgdGhpcy5uZXdBdHRhY2htZW50LkZpbGVDb250ZW50VHlwZSA9IGJhc2U2NFJlc3VsdC5Db250ZW50VHlwZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9IGV2ZW50LnRhcmdldC5maWxlcztcclxuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkRmlsZXMgfHwgdGhpcy5zZWxlY3RlZEZpbGVzLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyA9IG5ldyBBcnJheTxJQXR0YWNobWVudERUTz4oKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkRmlsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgbmV3QXR0YWNobWVudDogSUF0dGFjaG1lbnREVE8gPSBhd2FpdCB0aGlzLmNyZWF0ZUF0dGFjaG1lbnRGcm9tVXBsb2FkZWRGaWxlKHRoaXMuc2VsZWN0ZWRGaWxlc1tpXSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vU2Ugw6ggc3RhdGEgcmljaGllc3RhIGxhIGdlc3Rpb25lIGRlbGxlIHNvbGUgaW1tYWdpbmkgbWEgcGVyIGVycm9yZSDDqCBzdGF0byBzZWxlemlvbmF0byB1biBmaWxlIGNoZSBub24gw6ggdW4gaW1tYWdpbmVcclxuICAgICAgICBsZXQgY2hlY2tPbmx5SW1hZ2UgPSB0aGlzLmNoZWNrQWxsb3dPbmx5SW1hZ2VGaWxlKG5ld0F0dGFjaG1lbnQpO1xyXG4gICAgICAgIGlmIChjaGVja09ubHlJbWFnZSA9PSBmYWxzZSlcclxuICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzLnB1c2gobmV3QXR0YWNobWVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgcGFydGlyZSBkYWwgRklMRSByaWNldnV0byBpbiBpbnB1dCByaWNvc3RydWlzY2UgbCdvZ2dldHRvIElBdHRhY2htZW50RFRPIGUgbG8gcmVzdGl0dWlzY2UuXHJcbiAgICogU2UgaWwgcGFyYW1ldHJvIGdldEJhc2U2NCB2aWVuZSBwYXNzYXRvIGEgVFJVRSBhbGxvcmEsIHNlbXByZSBhIHBhcnRpcmUgZGFsIGZpbGUsZ2VuZXJhIGlsIGJhc2U2NCBlIFxyXG4gICAqIHJpY2F2YSBpbCBDb250ZW50VHlwZSBkYSBhc3NvY2lhcmUgYWxsJ29nZ2V0dG8gSUF0dGFjaG1lbnREVE8gZGEgcmVzdGl0dWlyZVxyXG4gICAqIEBwYXJhbSBjdXJyZW50RmlsZSBPZ2dldHRvIEZJTEUgZGEgcHJvY2Vzc2FyZVxyXG4gICAqIEBwYXJhbSBnZXRCYXNlNjQgU2UgVFJVRSBhbGxvcmEgY2FsY29sYSBiYXNlNjQgZSBDb250ZW50VHlwZSBkZWwgZmlsZSBwYXNzYXRvIGluIGlucHV0XHJcbiAgICogQHJldHVybnMgUmVzdGl0dWlzY2UgdW4gb2dnZXR0byBkaSB0aXBvIElBdHRhY2htZW50RFRPXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVBdHRhY2htZW50RnJvbVVwbG9hZGVkRmlsZShjdXJyZW50RmlsZTogRmlsZSwgZ2V0QmFzZTY0OiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8SUF0dGFjaG1lbnREVE8+IHtcclxuICAgIGxldCBuZXdBdHRhY2htZW50OiBJQXR0YWNobWVudERUTyA9IHt9IGFzIElBdHRhY2htZW50RFRPO1xyXG5cclxuICAgIC8vTWVtb3JpenphIGkgZGF0aSBwZXIgbCdhbGxlZ2F0byAgICAgICAgXHJcbiAgICBuZXdBdHRhY2htZW50LkF0dGFjaG1lbnRUeXBlID0gQXR0YWNobWVudFR5cGUuRklMRTtcclxuICAgIG5ld0F0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlID0gY3VycmVudEZpbGUudHlwZTtcclxuICAgIG5ld0F0dGFjaG1lbnQuRmlsZU5hbWUgPSBjdXJyZW50RmlsZS5uYW1lO1xyXG4gICAgbmV3QXR0YWNobWVudC5GaWxlRXh0ZW5zaW9uID0gY3VycmVudEZpbGUubmFtZS5zdWJzdHIoY3VycmVudEZpbGUubmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7XHJcbiAgICBuZXdBdHRhY2htZW50LklzSW1hZ2UgPSBBdHRhY2htZW50SGVscGVyU2VydmljZS5jaGVja0ltYWdlRnJvbU1pbWVUeXBlKGN1cnJlbnRGaWxlLnR5cGUpO1xyXG5cclxuICAgIGlmIChnZXRCYXNlNjQgPT0gdHJ1ZSkge1xyXG4gICAgICBsZXQgYmFzZTY0UmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRCYXNlNjRGcm9tRmlsZShjdXJyZW50RmlsZSk7XHJcbiAgICAgIG5ld0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgPSBiYXNlNjRSZXN1bHQuQmFzZTY0RmlsZTtcclxuICAgICAgbmV3QXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgPSBiYXNlNjRSZXN1bHQuQ29udGVudFR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ld0F0dGFjaG1lbnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHBhcnRpcmUgZGFsIGZpbGUgcGFzc2F0byBpbiBpbnB1dCByZXN0aXR1aXNjZSB1biBvZ2dldHRvXHJcbiAgICogY29udGVuZW50ZSBpbCBiYXNlNjQgZGVsIGZpbGUgZSBpbCBzdW8gY29udGVudFR5cGVcclxuICAgKiBAcGFyYW0gY3VycmVudEZpbGUgT2dnZXR0byBGaWxlIGRhIGN1aSBlc3RyYXBvbGFyZSBiYXNlNjQgZSBjb250ZW50VHlwZVxyXG4gICAqIEByZXR1cm5zIFJlc3RpdHVpc2NlIHVuIG9nZ2V0dG8gYXZlbnRlIGxlIHByb3ByaWV0w6AgQmFzZTY0RmlsZSBlIENvbnRlbnRUeXBlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRCYXNlNjRGcm9tRmlsZShjdXJyZW50RmlsZTogRmlsZSk6IFByb21pc2U8YW55PiB7XHJcbiAgICBsZXQgYmFzZTY0RmlsZSA9IGF3YWl0IHRvQmFzZTY0KGN1cnJlbnRGaWxlKTtcclxuICAgIGxldCBjb250ZW50VHlwZTogc3RyaW5nID0gbnVsbDtcclxuICAgIGlmIChiYXNlNjRGaWxlKSB7XHJcbiAgICAgIC8vIExvcmlzIDIwLzAxLzIwMjI6IFBST0JMRU1BIC0gUXVhbmRvIGVzZWd1byBsJ3VwbG9hZCBkaSB1biBmaWxlIC5zcWwgbm9uIHZpZW5lIHNhbHZhdG8vc2NhcmljYXRvIGNvcnJldHRhbWVudGUuXHJcbiAgICAgIC8vICAgICAgICAgICAgICAgICAgIFF1ZXN0byBzdWNjZWRlIHBlcmNow6ggbm9uIHZpZW5lIHBvcG9sYXRvIGlsIEZpbGVDb250ZW50VHlwZS4gUGVyIHJpc29sdmVyZSBpbCBwcm9ibGVtYVxyXG4gICAgICAvLyAgICAgICAgICAgICAgICAgICBmYWNjaW8gdW4gY29udHJvbGxvIGUgc2Ugbm9uIGVzaXN0ZSBpbCBGaWxlQ29udGVudFR5cGUgYWxsb3JhIGxvIHJlY3VwZXJvIGRhbCBiYXNlNjQgb3R0ZW51dG8uXHJcbiAgICAgIGNvbnRlbnRUeXBlID0gYmFzZTY0RmlsZS5zcGxpdChcIixcIilbMF0uc3BsaXQoXCI6XCIpWzFdLnNwbGl0KFwiO1wiKVswXTtcclxuICAgICAgLy8gVW4gYWx0cm8gbWV0b2RvIHBlciBsZWdnZXJlIGlsIGNjb250ZW50IHR5cGUgZGVsIGZpbGUgw6ggdHJhbWl0ZSB1bmEgcmVndWxhciBleHByZXNzaW9uOlxyXG4gICAgICBiYXNlNjRGaWxlID0gYmFzZTY0RmlsZS5zcGxpdChcIixcIilbMV07XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc3VsdCA9IHtcclxuICAgICAgQmFzZTY0RmlsZTogYmFzZTY0RmlsZSxcclxuICAgICAgQ29udGVudFR5cGU6IGNvbnRlbnRUeXBlXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnRyb2xsYSBzZSBpbCBmaWxlIGNoZSBzaSBzdGEgY2FyaWNhbmRvIMOoIHN1cHBvcnRhdG8gZGFsIHNpc3RlbWEuXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjaGVja0FjY2VwdGVkRmlsZXMoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoKHRoaXMubG9hZE11bHRpcGxlRmlsZXMgIT0gdHJ1ZSAmJiB0aGlzLnNlbGVjdGVkRmlsZS50eXBlLnN0YXJ0c1dpdGgoXCJ2aWRlb1wiKSlcclxuICAgICAgfHwgKHRoaXMubG9hZE11bHRpcGxlRmlsZXMgPT0gdHJ1ZSAmJiBbLi4udGhpcy5zZWxlY3RlZEZpbGVzXS5maWx0ZXIocCA9PiBwLnR5cGUuc3RhcnRzV2l0aChcInZpZGVvXCIpKS5sZW5ndGggPiAwKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLmFjY2VwdGVkRmlsZVR5cGVzID09IFwiKlwiKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAvL1ZlcmlmaWNhIGNoZSBpIHRpcGkgZGVsIGZpbGUgKG8gZGVpIGZpbGUpIGNhcmljYXRpIHNpYW5vIGNvZXJlbnRpIGNvbiBxdWVsbGkgYWNjZXR0YXRpIGRhbGxhIGRpcmV0dGl2YVxyXG4gICAgbGV0IGFjY2VwdGVkOiBib29sZWFuID0gdHJ1ZVxyXG4gICAgaWYgKHRoaXMubG9hZE11bHRpcGxlRmlsZXMgIT0gdHJ1ZSlcclxuICAgICAgYWNjZXB0ZWQgPSB0aGlzLmFjY2VwdGVkRmlsZVR5cGVzLmluY2x1ZGVzKHRoaXMuc2VsZWN0ZWRGaWxlLnR5cGUpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCB1cGxvYWRlZEZpbGVUeXBlczogc3RyaW5nW10gPSBbLi4udGhpcy5zZWxlY3RlZEZpbGVzXS5tYXAocCA9PiBwLnR5cGUpO1xyXG4gICAgICB1cGxvYWRlZEZpbGVUeXBlcy5mb3JFYWNoKHR5cGUgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5hY2NlcHRlZEZpbGVUeXBlcy5pbmNsdWRlcyh0eXBlKSlcclxuICAgICAgICAgIGFjY2VwdGVkID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vUXVlc3RvIGNvbnRyb2xsbyBwZXJtZXR0ZSBkaSBnZXN0aXJlIGxlIGNhc2lzdGljaGUgcGVyIGN1aSB2ZW5nb25vIGluZGljYXRpIGNvbWUgdGlwaSB2YWxpZGksIGFkIGVzZW1waW8sICdpbWFnZS8qJ1xyXG4gICAgaWYgKCFhY2NlcHRlZCAmJiB0aGlzLmxvYWRNdWx0aXBsZUZpbGVzICE9IHRydWUpIHtcclxuICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLmFjY2VwdGVkRmlsZVR5cGVzLnNwbGl0KFwiLFwiKS5maWx0ZXIodCA9PiB0LmluY2x1ZGVzKFwiKlwiKSkpIHtcclxuICAgICAgICBhY2NlcHRlZCA9IHRoaXMuc2VsZWN0ZWRGaWxlLnR5cGUuc3RhcnRzV2l0aCh0LnNwbGl0KFwiKlwiKVswXSk7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBhY2NlcHRlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIGVxcC1hdHRhY2htZW50cyDDqCBzdGF0YSBjb25maWd1cmF0YSBwZXIgaWwgY2FyaWNhbWVudG8gZGVsbGUgc29sZSBpbW1hZ2luaSBhbGxvcmEgdmVyaWZpY2EgY2hlIGlsIGZpbGUgcGFzc2F0byBpblxyXG4gICAqIGlucHV0IHNpYSBlZmZldHRpdmFtZW50ZSB1biBpbW1hZ2luZSBvIG5vLlxyXG4gICAqIFNlIGlsIGNvbnRyb2xsbyB2YSBhIGJ1b24gZmluZSByZXN0aXR1aXNjZSBUUlVFIGFsdHJpbWVudGkgbW9zdHJhIHVuIG1lc3NhZ2dpbyBkJ2Vycm9yZSBlIHJlc3RpdHVpc2NlIEZBTFNFXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjaGVja0FsbG93T25seUltYWdlRmlsZShuZXdBdHRhY2htZW50KTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5hbGxvd09ubHlJbWFnZXMgPT0gdHJ1ZSAmJiBuZXdBdHRhY2htZW50LklzSW1hZ2UgIT0gdHJ1ZSkge1xyXG4gICAgICBFcXBBdHRhY2htZW50RGlhbG9nU2VydmljZS5FcnJvcih0aGlzLm5vSW1hZ2VTZWxlY3RlZEVycm9yTWVzc2FnZSk7XHJcbiAgICAgIHRoaXMuYWJvcnRGaWxlKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSBpZiAoIXRoaXMuY2hlY2tBY2NlcHRlZEZpbGVzKCkpIHtcclxuICAgICAgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UuRXJyb3IodGhpcy53cm9uZ1R5cGVTZWxlY3RlZEVycm9yTWVzc2FnZSk7XHJcbiAgICAgIHRoaXMuYWJvcnRGaWxlKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGdldEltYWdlRGltZW5zaW9ucyhpbWc6IGFueSkge1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XHJcbiAgICAgIGltYWdlLnNyYyA9IGUudGFyZ2V0LnJlc3VsdDtcclxuICAgICAgaW1hZ2Uub25sb2FkID0gcnMgPT4ge1xyXG4gICAgICAgIHRoaXMub3JpZ2luYWxIZWlnaHQgPSBycy5jdXJyZW50VGFyZ2V0WydoZWlnaHQnXTtcclxuICAgICAgICB0aGlzLm9yaWdpbmFsV2lkdGggPSBycy5jdXJyZW50VGFyZ2V0Wyd3aWR0aCddO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5vcmlnaW5hbFdpZHRoID4gMTI4MCkge1xyXG4gICAgICAgICAgdGhpcy5jdXN0b21XaWR0aCA9IDEyODA7XHJcbiAgICAgICAgICB0aGlzLmN1c3RvbUhlaWdodCA9IE1hdGgucm91bmQoKDEyODAgKiB0aGlzLm9yaWdpbmFsSGVpZ2h0KSAvIHRoaXMub3JpZ2luYWxXaWR0aCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY3VzdG9tSGVpZ2h0ID0gcnMuY3VycmVudFRhcmdldFsnaGVpZ2h0J107XHJcbiAgICAgICAgICB0aGlzLmN1c3RvbVdpZHRoID0gcnMuY3VycmVudFRhcmdldFsnd2lkdGgnXTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9O1xyXG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoaW1nKTtcclxuICB9XHJcblxyXG4gIHJlc3RvcmVPcmlnaW5hbERpbWVuc2lvbnMoKSB7XHJcbiAgICB0aGlzLmN1c3RvbVdpZHRoID0gdGhpcy5vcmlnaW5hbFdpZHRoO1xyXG4gICAgdGhpcy5jdXN0b21IZWlnaHQgPSB0aGlzLm9yaWdpbmFsSGVpZ2h0O1xyXG4gIH1cclxuXHJcbiAgb25EaW1lbnNpb25zQ2hhbmdlKGRpbWVuc2lvbjogc3RyaW5nKSB7XHJcbiAgICBpZiAoZGltZW5zaW9uID09IFwiSFwiKSB7XHJcbiAgICAgIHRoaXMuY3VzdG9tV2lkdGggPSBNYXRoLnJvdW5kKCh0aGlzLmN1c3RvbUhlaWdodCAqIHRoaXMub3JpZ2luYWxXaWR0aCkgLyB0aGlzLm9yaWdpbmFsSGVpZ2h0KTtcclxuICAgIH0gZWxzZSBpZiAoZGltZW5zaW9uID09IFwiV1wiKSB7XHJcbiAgICAgIHRoaXMuY3VzdG9tSGVpZ2h0ID0gTWF0aC5yb3VuZCgodGhpcy5jdXN0b21XaWR0aCAqIHRoaXMub3JpZ2luYWxIZWlnaHQpIC8gdGhpcy5vcmlnaW5hbFdpZHRoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGltYWdlQ3JvcHBlZChldmVudDogSW1hZ2VDcm9wcGVkRXZlbnQpIHtcclxuICAgIHRoaXMuY3JvcHBlZEltYWdlID0gZXZlbnQuYmFzZTY0O1xyXG4gICAgdGhpcy5nZXRDcm9wcGVkQW5kVXBsb2FkKHRoaXMuY3JvcHBlZEltYWdlKTtcclxuICB9XHJcblxyXG4gIGdldENyb3BwZWRBbmRVcGxvYWQoZmlsZSkge1xyXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xyXG5cclxuICAgIHZhciBmaWxlOiBhbnkgPSBiYXNlNjRUb0ZpbGUoZmlsZSk7XHJcblxyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY29tcHJlc3Npb25PcHRpb25zO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHJpbWUgbCdpbW1hZ2luZSBwYXNzYW5kbyBjb21lIHBhcmFtZXRyaSBsZSBvcHRpb25zIGNyZWF0ZSBuZWxsJ29nZ2V0dG8gc29wcmEsIGUgaWwgZmlsZSBkYWwgcmVhZGVyIHByaW5jaXBhbGVcclxuICAgICAqL1xyXG4gICAgaW1hZ2VDb21wcmVzc2lvbihmaWxlLCBvcHRpb25zKS50aGVuKChmaWxlQ29tcHJlc3NlZCA9PiB7XHJcblxyXG4gICAgICBsZXQgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcblxyXG4gICAgICAvL0ZhY2NpbyBsYSBwdXNoIGRpIG9nbmkgZmlsZSBhbGwnaW50ZXJubyBkZWxsJ2FycmF5IGRpIGZpbGUgZGVsbCdpdGVtIGRhIG1hbmRhcmUgYWwgc2VydmVyXHJcbiAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCByZXN1bHRSZWFkZXIgPSA8c3RyaW5nPmZpbGVSZWFkZXIucmVzdWx0O1xyXG4gICAgICAgIHZhciBtYXJrZXIgPSAnO2Jhc2U2NCwnO1xyXG4gICAgICAgIHNlbGYubmV3QXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCA9IHJlc3VsdFJlYWRlci5zdWJzdHJpbmcocmVzdWx0UmVhZGVyLmluZGV4T2YobWFya2VyKSArIG1hcmtlci5sZW5ndGgpO1xyXG4gICAgICAgIHNlbGYuc2hvd0Nyb3BJbWFnZSA9IGZhbHNlO1xyXG4gICAgICAgIHNlbGYubmV3QXR0YWNobWVudEZvcm0uZW5hYmxlKCk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZUNvbXByZXNzZWQpO1xyXG5cclxuICAgIH0pKTtcclxuXHJcbiAgfVxyXG5cclxuICBjb25maXJtQ3JvcCgpIHtcclxuICAgIHRoaXMuaW1hZ2VDcm9wcGVyLmNyb3AoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFubnVsbGEgbGEgc2VsZXppb25lIGRlbCBmaWxlLCBzdnVvdGFuZG8gbCdpbnB1dCBlIHJlc2V0dGFuZG8gdHV0dGUgbGUgcHJvcHJpZXTDoCBkZWxsJ0lBdHRhY2htZW50RFRPXHJcbiAgICovXHJcbiAgYWJvcnRGaWxlKCkge1xyXG4gICAgdGhpcy5pbWFnZUNoYW5nZWRFdmVudCA9ICcnO1xyXG4gICAgaWYgKHRoaXMuaW1hZ2VJbnB1dClcclxuICAgICAgdGhpcy5pbWFnZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IG51bGw7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsZXMgPSBudWxsO1xyXG4gICAgdGhpcy5zaG93Q3JvcEltYWdlID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5uZXdBdHRhY2htZW50LklzSW1hZ2UgPSBmYWxzZTtcclxuICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCA9IG51bGw7XHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZU5hbWUgPSBudWxsO1xyXG4gICAgdGhpcy5uZXdBdHRhY2htZW50LkZpbGVFeHRlbnNpb24gPSBudWxsO1xyXG4gICAgdGhpcy5uZXdBdHRhY2htZW50LkZpbGVDb250ZW50VHlwZSA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzID0gbmV3IEFycmF5PElBdHRhY2htZW50RFRPPigpO1xyXG5cclxuICAgIHRoaXMuY3VzdG9tSGVpZ2h0ID0gbnVsbDtcclxuICAgIHRoaXMuY3VzdG9tV2lkdGggPSBudWxsO1xyXG4gICAgdGhpcy5vcmlnaW5hbEhlaWdodCA9IG51bGw7XHJcbiAgICB0aGlzLm9yaWdpbmFsV2lkdGggPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcbn0iXX0=
958
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXFwLWF0dGFjaG1lbnRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BlcXByb2plY3QvZXFwLWF0dGFjaG1lbnRzLyIsInNvdXJjZXMiOlsibGliL2VxcC1hdHRhY2htZW50cy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFtQyxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RyxPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBcUIscUJBQXFCLEVBQWtCLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxjQUFjLEVBQWtCLE1BQU0sMEJBQTBCLENBQUM7QUFFMUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFHdEYsSUFBTSxRQUFRLEdBQUcsVUFBQyxJQUFJO0lBQ3BCLE9BQUEsSUFBSSxPQUFPLENBQVMsVUFBQyxPQUFPLEVBQUUsTUFBTTtRQUNsQyxJQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2hD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RUFBRSxDQUFDOzBFQUF5QztJQUNoRDtRQUE3QyxTQUFTLENBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO2tFQUFpQztJQTFObkUsdUJBQXVCO1FBTG5DLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxpQkFBaUI7WUFDM0IsbXZqQkFBK0M7O1NBRWhELENBQUM7T0FDVyx1QkFBdUIsQ0FvekJuQztJQUFELDhCQUFDO0NBQUEsQUFwekJELElBb3pCQztTQXB6QlksdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XHJcbmltcG9ydCB7IENvbmZpZ0NvbHVtbiwgRXFwVGFibGVDb21wb25lbnQsIFRvb2x0aXBQb3NpdGlvblR5cGUsIFR5cGVDb2x1bW4gfSBmcm9tIFwiQGVxcHJvamVjdC9lcXAtdGFibGVcIjtcclxuaW1wb3J0IGltYWdlQ29tcHJlc3Npb24gZnJvbSBcImJyb3dzZXItaW1hZ2UtY29tcHJlc3Npb25cIjtcclxuaW1wb3J0IHsgSW1hZ2VDcm9wcGVkRXZlbnQsIEltYWdlQ3JvcHBlckNvbXBvbmVudCwgSW1hZ2VUcmFuc2Zvcm0sIGJhc2U2NFRvRmlsZSB9IGZyb20gXCJuZ3gtaW1hZ2UtY3JvcHBlclwiO1xyXG5pbXBvcnQgeyBBdHRhY2htZW50SGVscGVyU2VydmljZSB9IGZyb20gXCIuL2hlbHBlcnMvYXR0YWNobWVudC5oZWxwZXJcIjtcclxuaW1wb3J0IHsgQXR0YWNobWVudFR5cGUsIElBdHRhY2htZW50RFRPIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9JQXR0YWNobWVudFwiO1xyXG5pbXBvcnQgeyBJT3B0aW9ucyB9IGZyb20gXCIuL2ludGVyZmFjZXMvSU9wdGlvbnNcIjtcclxuaW1wb3J0IHsgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlcy9lcXAtYXR0YWNobWVudC1kaWFsb2cuc2VydmljZVwiO1xyXG5cclxuXHJcbmNvbnN0IHRvQmFzZTY0ID0gKGZpbGUpID0+XHJcbiAgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4gcmVzb2x2ZShyZWFkZXIucmVzdWx0LnRvU3RyaW5nKCkpO1xyXG4gICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHJlamVjdChlcnJvcik7XHJcbiAgfSk7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJlcXAtYXR0YWNobWVudHNcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2VxcC1hdHRhY2htZW50cy5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9lcXAtYXR0YWNobWVudHMuY29tcG9uZW50LnNjc3NcIl1cclxufSlcclxuZXhwb3J0IGNsYXNzIEVxcEF0dGFjaG1lbnRzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcclxuICAvLyNyZWdpb24gQElucHV0IGRlbCBjb21wb25lbnRlXHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIFRSVUUgYWxsb3JhIG5hc2NvbmRlIGxhIGNvbG9ubmEgcGVyIGxlIGF6aW9uaSBzdWxsJ2FsbGVnYXRvIChuZWwgY2FzbyBcIm11bHRpcGxlQXR0YWNobWVudFwiIMOoIFRSVUUpLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcImRpc2FibGVBY3Rpb25cIikgZGlzYWJsZUFjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBTZSBUUlVFIG1vc3RyYSBpbCB0aXRvbG8gbmVsbCdoZWFkZXIgbmVsIGNhc28gaW4gY3VpIFwibXVsdGlwbGVBdHRhY2htZW50XCIgw6ggVFJVRSAoXCJFbGVuY28gYWxsZWdhdGlcIiBkaSBkZWZhdWx0KS5cclxuICAgKi9cclxuICBASW5wdXQoXCJzaG93SGVhZGVyXCIpIHNob3dIZWFkZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBUaXRvbG8gZGEgdmlzdWFsaXp6YXJlIHNlIGlsIHBhcmFtZXRybyBcInNob3dIZWFkZXJcIiDDqCBUUlVFLiBEaSBkZXZhdWx0IHZpZW5lIHZpc3VhbGl6emF0byBcIkVsZW5jbyBhbGxlZ2F0aVwiLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcImhlYWRlclRpdGxlXCIpIGhlYWRlclRpdGxlOiBzdHJpbmcgPSBcIkVsZW5jbyBhbGxlZ2F0aVwiO1xyXG5cclxuICAvKipcclxuICAgKiBTb3JnZW50ZSBkYXRpIGRhIHZpc3VhbGl6emFyZS4gTmVsIGNhc28gc2kgdnVvbGUgZ2VzdGlyZSB1biBzaW5nb2xvIGFsbGVnYXRvIHZhIHBhc3NhdG8gaW4gb2duaSBjYXNvIGNvbWUgQXJyYXkuXHJcbiAgICovXHJcbiAgQElucHV0KFwiYXR0YWNobWVudHNMaXN0XCIpIGF0dGFjaG1lbnRzTGlzdDogQXJyYXk8SUF0dGFjaG1lbnREVE8+ID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgVFJVRSBub24gbW9zdHJhIGxhIE1hdENhcmQgKG5lbCBjYXNvIGluIGN1aSBcIm11bHRpcGxlQXR0YWNobWVudFwiIMOoIFRSVUUpLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcInNob3dNYXRDYXJkXCIpIHNob3dNYXRDYXJkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgRkFMU0UgYWxsb3JhIGlsIGNvbXBvbmVudGUgbW9zdHJhIHNvbG8gaWwgcHVsc2FudGUgZGkgY2FyaWNhbWVudG8gZGkgdW4gc2luZ29sbyBmaWxlLCB1bmEgdm9sdGEgY2FyaWNhdG8gaWwgZmlsZSBpbnZvY2EgbCdldmVudG8gZGkgb3V0cHV0IFwibG9jYWxFZGl0ZWRBdHRhY2htZW50c1wiLlxyXG4gICAqIFNlIFRSVUUgYWxsb3JhIGlsIGNvbXBvbmVudGUgbW9zdHJhIGwnZWxlbmNvIGRpIHR1dHRpIGdsaSBhbGxlZ2F0aSByaWNldnV0byBuZWwgcGFyYW1ldHJvIFwiYXR0YWNobWVudHNMaXN0XCIuXHJcbiAgICovXHJcbiAgQElucHV0KFwibXVsdGlwbGVBdHRhY2htZW50XCIpIG11bHRpcGxlQXR0YWNobWVudDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIGFzc3VtZSBpbCB2YWxvcmUgVFJVRSBhbGxvcmEgc2Fyw6AgcG9zc2liaWxlIGNhcmljYXJlIHBpw7kgZmlsZSBwZXIgdm9sdGEuIFF1ZXN0YSBmdW56aW9uYWxpdMOgIMOoIGF0dGl2YVxyXG4gICAqIFNPTE8gc2Ugc2kgZ2VzdGlzY29ubyBhbGxlZ2F0aSBtdWx0aXBsaSwgcXVpbmRpIHNlIGwnaW5wdXQgJ211bHRpcGxlQXR0YWNobWVudCcgYXNzdW1lIGlsIHZhbG9yZSBUUlVFLCBhbHRyaW1lbnRpIMOoIHNlbXByZSBkaXNhYmlsaXRhdGEuXHJcbiAgICovXHJcbiAgQElucHV0KFwibG9hZE11bHRpcGxlRmlsZXNcIikgbG9hZE11bHRpcGxlRmlsZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ29uZmlndXJhemlvbmUgZGVsbGUgY29sb25uZSBkZWxsYSBlcXAtdGFibGUgcGVyIGxhIHZpc3VhbGl6emF6aW9uZSBkZWdsaSBhbGxlZ2F0aSAoY2FzbyBcIm11bHRpcGxlQXR0YWNobWVudFwiIMOoIFRSVUUpLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcImF0dGFjaG1lbnRzQ29sdW1uc1wiKSBhdHRhY2htZW50c0NvbHVtbnM6IEFycmF5PENvbmZpZ0NvbHVtbj4gPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBJbXBvc3RhIGlsIG1lc3NhZ2dpbyBkYSB2aXN1YWxpenphcmUgbmVsIGNhc28gaW4gY3VpIGxhIHRhYmVsbGEgZGVnbGkgYWxsZWdhdGkgKG5lbCBjYXNvIGluIGN1aSBcIm11bHRpcGxlQXR0YWNobWVudFwiIMOoIFRSVUUpIMOoIHZ1b3RhLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcImVtcHR5VGFibGVNZXNzYWdlXCIpIGVtcHR5VGFibGVNZXNzYWdlOiBzdHJpbmcgPSBcIk5lc3N1biBkYXRvIHRyb3ZhdG9cIjtcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgVFJVRSBhbGxvcmEgcGVybWV0dGUgZGkgc2VsZXppb25hcmUgc29sdGFudG8gZmlsZSBkaSB0aXBvIGltbWFnaW5lLCBhdmVudGUgdW5vIGRlaSBtaW1ldHlwZVxyXG4gICAqIHNwZWNpZmljYXRpIGRlbnRybyBBdHRhY2htZW50SGVscGVyU2VydmljZS5cclxuICAgKiBTZSBGQUxTRSBwZXJtZXR0ZSBkaSBzZWxlemlvbmFyZSBxdWFsc2lhc2kgdGlwbyBkaSBmaWxlXHJcbiAgICovXHJcbiAgQElucHV0KFwiYWxsb3dPbmx5SW1hZ2VzXCIpIGFsbG93T25seUltYWdlczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBTcGVjaWZpY2EgaSB0aXBpIGRpIGZpbGUgY2hlIMOoIHBvc3NpYmlsZSBjYXJpY2FyZVxyXG4gICAqL1xyXG4gIEBJbnB1dChcImFjY2VwdGVkRmlsZVR5cGVzXCIpIGFjY2VwdGVkRmlsZVR5cGVzOiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIFRSVUUgZGlzYWJpbGl0YSBpbCBwdWxzYW50ZSBkaSBBZ2dpdW50YSBhbGxlZ2F0byAoYSBwcmVzY2luZGVyZSBkYWwgdmFsb3JlIGRlbCBwYXJhbWV0cm8gXCJtdWx0aXBsZUF0dGFjaG1lbnRcIikuXHJcbiAgICovXHJcbiAgQElucHV0KFwiaXNEaXNhYmxlZFwiKSBpc0Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIE1vc3RyYS9uYXNjb25kZSBsYSBjb2xvbm5hIHBlciB2aXN1YWxpenphcmUgbCdhbnRlcHJpbWEgZGVpIGZpbGUgbmVsbGEgdGFiZWxsYSAoY2FzbyBtdWx0aXBsZUF0YXRjaG1lbnRzID0gdHJ1ZSkuXHJcbiAgICovXHJcbiAgQElucHV0KFwic2hvd0lubGluZVByZXZpZXdcIikgc2hvd0lubGluZVByZXZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogRW5kcG9pbnQgZGEgY2hpYW1hcmUgcGVyIHJlY3VlcHJhcmUgbCdJQXR0YWNobWVudERUTyBjb21wbGV0byBkYSB2ZWRlcmUgbmVsbCdhbnRlcHJpbWEuIExhIGNoaWFtYXRhIHNhcsOgIGluIFBPU1QgZSBuZWwgYm9keVxyXG4gICAqIGNvbnRlcnLDoCBsJ0lBdHRhY2htZW50RFRPIHNlbGV6aW9uYXRvIGRhbGwndXRlbnRlLlxyXG4gICAqIExhIGNoaWFtYXRhIHZpZW5lIGVzZWd1aXRhIHNvbG8gcGVyIGwnYW50ZXByaW1hIGRlbGxlIGltbWFnaW5pIGVzc2VuZG8gbmVjZXNzYXJpbyBpbCBiYXNlNjQgY29tcGxldG8gZGVsbCdpbW1hZ2luZSBhIGRpbWVuc2lvbmUgcmVhbGUuXHJcbiAgICogUGVyIGRvY3VtZW50aS9saW5rIGJhc3RhIGNoZSBzaWEgcG9wb2xhdGEgbGEgcHJvcHJpZXTDoCBGaWxlUGF0aCBkaSBJQXR0YWNobWVudERUTy5cclxuICAgKi9cclxuICBASW5wdXQoXCJnZXRBdHRhY2htZW50RW5kcG9pbnRcIikgZ2V0QXR0YWNobWVudEVuZHBvaW50OiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBIb3N0bmFtZSBkZWxsJ2FtYmllbnRlIGRpIHByb2R1emlvbmUgZGVsbCdhcHBsaWNhdGl2by4gTmVjZXNzYXJpbyBwZXIgdmlzdWFsaXp6YXJlIGwnYW50ZXByaW1hIGRlaSBkb2N1bWVudGlcclxuICAgKiB0cmFtaXRlIGlsIHZpZXdlciBkaSBnb29nbGUuXHJcbiAgICogTk9UQTogUGVyIHZpc3VhbGl6emFyZSBsJ2FudGVwcmltYSDDqCBuZWNlc3NhcmlvIGNoZSBsYSBwcm9yaWV0w6AgRmlsZVBhdGggZGVsbCdJQXR0YWNobWVudERUTyBzaWEgcG9wb2xhdGEgZSBjaGVcclxuICAgKiBzaWEgYWJpbGl0YXRvIGwnYWNjZXNzbyBhbGxhIGNhcnRlbGxhIHN1bCBzZXJ2ZXIgdHJhbWl0ZSBob3N0bmFtZS5cclxuICAgKi9cclxuICBASW5wdXQoXCJwcm9kdWN0aW9uQmFzZVVybFwiKSBwcm9kdWN0aW9uQmFzZVVybDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogT3B6aW9uaSBwZXIgbGEgY29tcHJlc3Npb25lIGRlbGxlIGltbWFnaW5pIGNhcmljYXRlLlxyXG4gICAqL1xyXG4gIEBJbnB1dChcImNvbXByZXNzaW9uT3B0aW9uc1wiKSBjb21wcmVzc2lvbk9wdGlvbnM6IElPcHRpb25zID0ge1xyXG4gICAgbWF4U2l6ZU1COiAwLjUsXHJcbiAgICBtYXhXaWR0aE9ySGVpZ2h0OiAxOTIwLFxyXG4gICAgdXNlV2ViV29ya2VyOiB0cnVlXHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogQXJyYXkgZGkgQXR0YWNobWVudFR5cGUgY2hlIHNpIHBvc3Nvbm8gYWdnaXVuZ2VyZVxyXG4gICAqL1xyXG4gIEBJbnB1dChcImFsbG93ZWRUeXBlc1wiKSBhbGxvd2VkVHlwZXM6IEFycmF5PEF0dGFjaG1lbnRUeXBlPiA9IFtBdHRhY2htZW50VHlwZS5GSUxFLCBBdHRhY2htZW50VHlwZS5MSU5LXTtcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWV0dGUgZGkgc3RhYmlsaXJlIHNlIGxhIGVxcC10YWJsZSBjb250ZW5lbnRlIGwnZWxlbmNvIGRlZ2xpIGFsbGVnYXRpIHV0aWxpenphXHJcbiAgICogaWwgbXVsdGlsaW5ndWEgb3BwdXJlIG5vXHJcbiAgICovXHJcbiAgQElucHV0KFwiaXNFcXBUYWJsZU11bHRpTGFuZ3VhZ2VcIikgaXNFcXBUYWJsZU11bHRpTGFuZ3VhZ2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWV0dGUgZGkgc3RhYmlsaXJlLCBpbiBjYXNvIGRpIGdlc3Rpb25lIGFsbGVnYXRpIG11bHRpcGxpLCBzZSBsYSB0YWJlbGxhIGNvbnRlbmVudGUgbCdlbGVuY29cclxuICAgKiBkZWdsaSBhbGxlZ2F0aSBkZXZlIGVzc2VyZSBwYWdpbmF0YSBvcHB1cmUgbm9cclxuICAgKi9cclxuICBASW5wdXQoXCJ0YWJsZVBhZ2luYXRvclZpc2libGVcIikgdGFibGVQYWdpbmF0b3JWaXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW4gY2FzbyBkaSBnZXN0aW9uZSBhbGxlZ2F0aSBtdWx0aXBsaSwgcGVybWV0dGUgZGkgc3RhYmlsaXJlIGxhIGRpbWVuc2lvbmUgcGFnaW5hIGRpIGRlZmF1bHRcclxuICAgKiBwZXIgbGEgdGFiZWxsYSBjb250ZW5lbnRlIGwnZWxlbmNvIGRlZ2xpIGFsbGVnYXRpXHJcbiAgICovXHJcbiAgQElucHV0KFwidGFibGVQYWdpbmF0b3JTaXplXCIpIHRhYmxlUGFnaW5hdG9yU2l6ZTogbnVtYmVyID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogQWJpbGl0YXJlIGNhcmljYW1lbnRvIHZpZGVvXHJcbiAgICovXHJcbiAgQElucHV0KFwiYWxsb3dWaWRlb1wiKSBhbGxvd1ZpZGVvOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIElucHV0IHBlciBkZWZpbmlyZSBsZSBsYWJlbCBkYSB1c2FyZSBuZWwgY29tcG9uZW50ZVxyXG4gICAqL1xyXG4gIEBJbnB1dChcImRvd25sb2FkVG9vbHRpcFBvc2l0aW9uXCIpIGRvd25sb2FkVG9vbHRpcFBvc2l0aW9uOiBUb29sdGlwUG9zaXRpb25UeXBlID0gVG9vbHRpcFBvc2l0aW9uVHlwZS5CZWxvdztcclxuICBASW5wdXQoXCJvcGVuTGlua0xhYmVsXCIpIG9wZW5MaW5rTGFiZWw6IHN0cmluZyA9IFwiQXByaSBsaW5rXCI7XHJcbiAgQElucHV0KFwiYWRkQnV0dG9uTGFiZWxcIikgYWRkQnV0dG9uTGFiZWw6IHN0cmluZyA9IFwiQWdnaXVuZ2lcIjtcclxuICBASW5wdXQoXCJkb3dubG9hZExhYmVsXCIpIGRvd25sb2FkTGFiZWw6IHN0cmluZyA9IFwiRG93bmxvYWRcIjtcclxuICBASW5wdXQoXCJkZWxldGVMYWJlbFwiKSBkZWxldGVMYWJlbDogc3RyaW5nID0gXCJFbGltaW5hXCI7XHJcbiAgQElucHV0KFwiZmlsZU5hbWVMYWJlbFwiKSBmaWxlTmFtZUxhYmVsOiBzdHJpbmcgPSBcIk5vbWUgZmlsZVwiO1xyXG4gIEBJbnB1dChcInByZXZpZXdMYWJlbFwiKSBwcmV2aWV3TGFiZWw6IHN0cmluZyA9IFwiQW50ZXByaW1hXCI7XHJcbiAgQElucHV0KFwidXBsb2FkRmlsZUxhYmVsXCIpIHVwbG9hZEZpbGVMYWJlbDogc3RyaW5nID0gXCJDYXJpY2EgZmlsZVwiO1xyXG4gIEBJbnB1dChcImNvbmZpcm1MYWJlbFwiKSBjb25maXJtTGFiZWw6IHN0cmluZyA9IFwiQ29uZmVybWFcIjtcclxuICBASW5wdXQoXCJhYm9ydExhYmVsXCIpIGFib3J0TGFiZWw6IHN0cmluZyA9IFwiQW5udWxsYVwiO1xyXG4gIEBJbnB1dChcInNhdmVMYWJlbFwiKSBzYXZlTGFiZWw6IHN0cmluZyA9IFwiU2FsdmFcIjtcclxuICBASW5wdXQoXCJleGl0TGFiZWxcIikgZXhpdExhYmVsOiBzdHJpbmcgPSBcIkVzY2lcIjtcclxuICBASW5wdXQoXCJlcXBUYWJsZVNlYXJjaFRleHRcIikgZXFwVGFibGVTZWFyY2hUZXh0OiBzdHJpbmcgPSBcIkNlcmNhXCI7XHJcbiAgQElucHV0KFwiZGVsZXRlRGlhbG9nVGl0bGVcIikgZGVsZXRlRGlhbG9nVGl0bGU6IHN0cmluZyA9IG51bGw7XHJcbiAgQElucHV0KFwiZGVsZXRlRGlhbG9nTWVzc2FnZVwiKSBkZWxldGVEaWFsb2dNZXNzYWdlOiBzdHJpbmcgPSBcIlNlaSBzaWN1cm8gZGkgdm9sZXIgY2FuY2VsbGFyZSBxdWVzdCdhbGxlZ2F0bz9cIjtcclxuICBASW5wdXQoXCJub0ltYWdlU2VsZWN0ZWRFcnJvck1lc3NhZ2VcIikgbm9JbWFnZVNlbGVjdGVkRXJyb3JNZXNzYWdlOiBzdHJpbmcgPVxyXG4gICAgXCJOb24gw6ggcG9zc2liaWxlIHNlbGV6aW9uYXJlIHVuIGZpbGUgY2hlIG5vbiBzaWEgdW4naW1tYWdpbmUuXCI7XHJcbiAgQElucHV0KFwid3JvbmdUeXBlU2VsZWN0ZWRFcnJvck1lc3NhZ2VcIikgd3JvbmdUeXBlU2VsZWN0ZWRFcnJvck1lc3NhZ2U6IHN0cmluZyA9XHJcbiAgICBcIk5vbiDDqCBwb3NzaWJpbGUgY2FyaWNhcmUgaWwgZmlsZSBzZWxlemlvbmF0by5cIjtcclxuICBASW5wdXQoXCJ2aWRlb1ByZXZpZXdFcnJvck1lc3NhZ2VcIikgdmlkZW9QcmV2aWV3RXJyb3JNZXNzYWdlOiBzdHJpbmcgPVxyXG4gICAgXCJJbXBvc3NpYmlsZSBhcHJpcmUgbCdhbnRlcHJpbWEgZGkgdW4gZmlsZSB2aWRlby5cIjtcclxuICBASW5wdXQoXCJ2aWRlb1ByZXZpZXdFcnJvck1lc3NhZ2VcIikgYXVkaW9QcmV2aWV3RXJyb3JNZXNzYWdlOiBzdHJpbmcgPVxyXG4gICAgXCJJbXBvc3NpYmlsZSBhcHJpcmUgbCdhbnRlcHJpbWEgZGkgdW4gZmlsZSBhdWRpby5cIjtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIEBPdXRwdXQgZGVsIGNvbXBvbmVudGVcclxuXHJcbiAgLyoqXHJcbiAgICogUmVzdGl0dWlzY2UgbGEgbGlzdGEgYWdnaW9ybmF0YSBkZWdsaSBhbGxlZ2F0aS5cclxuICAgKi9cclxuICBAT3V0cHV0KCkgbG9jYWxFZGl0ZWRBdHRhY2htZW50czogRXZlbnRFbWl0dGVyPEFycmF5PElBdHRhY2htZW50RFRPPj4gPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PElBdHRhY2htZW50RFRPPj4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRXZlbnRvIHNjYXRlbmF0byBhbGxhIHByZXNzaW9uZSBkZWwgcHVsc2FudGUgRVNDSSBkZWxsYSBtb2RhbGUgZGkgY2FyaWNhbWVudG8gZmlsZS5cclxuICAgKi9cclxuICBAT3V0cHV0KCkgYWJvcnRBZGRBdHRhY2htZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudG8gZGkgb3V0cHV0IGNoZSByZXN0aXR1aXNjZSBsJ0lBdHRhY2htZW50RFRPIHNlbGV6aW9uYXRvIHBlciBpbCBkb3dubG9hZCBuZWwgY2FzbyBGaWxlRGF0YUJhc2U2NCwgRmlsZUNvbnRlbnRUeXBlIG8gRmlsZU5hbWUgbm9uIGZvc3Nlcm8gc3BlY2lmaWNhdGkuXHJcbiAgICovXHJcbiAgQE91dHB1dChcImRvd25sb2FkQXR0YWNobWVudFwiKSBkb3dubG9hZEF0dGFjaG1lbnQ6IEV2ZW50RW1pdHRlcjxJQXR0YWNobWVudERUTz4gPSBuZXcgRXZlbnRFbWl0dGVyPElBdHRhY2htZW50RFRPPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudG8gZGkgb3V0cHV0IGNoZSByZXN0aXR1aXNjZSBsJ2VsZW1lbnRvIGVsaW1pbmF0byBwcmltYSBjaGUgcXVlc3RvIHZlbmdhIGVmZmV0dGl2YW1lbnRlIHJpc21vc3NvIGRhbGxhIGxpc3RhLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoXCJvbkRlbGV0ZUF0dGFjaG1lbnRcIikgb25EZWxldGVBdHRhY2htZW50OiBFdmVudEVtaXR0ZXI8SUF0dGFjaG1lbnREVE8+ID0gbmV3IEV2ZW50RW1pdHRlcjxJQXR0YWNobWVudERUTz4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRXZlbnRvIGRpIG91dHB1dCBzY2F0ZW5hdG8gZHVyYW50ZSBsJ0FmdGVyVmlld0luaXQgZGVsIGNvbXBvbmVudGUgY2hlIHJlc3RpdHVpc2NlIGwnaXN0YW56YSBjb3JyZW50ZSBkZWwgY29tcG9uZW50ZS5cclxuICAgKiBRdWVzdG8gZXZlbnRvIGF2dmlzYSBxdWFuZG8gaWwgY29tcG9uZW50ZSDDqCBzdGF0byByZW5kZXJpenphdG8sIHV0aWxlIHBlciBlc2VtcGlvIHF1YW5kbyBzaSB2b2dsaW9ubyBhZ2dpdW5nZXJlIGRlbGxlIGNvbG9ubmVcclxuICAgKiBhbGxhIHZpc3VhbGl6emF6aW9uZSBjb24gYWxsZWdhdGkgbXVsdGlwbGkgbGFzY2lhbmRvIHBlcsOyIHF1ZWxsZSBwcmUgZXNpc3RlbnRpLiBRdWVzdG8gc2kgcHXDsiBmYXJlIGludGVydmVuZW5kbyBzdWxsYVxyXG4gICAqIHByb3ByaWV0w6AgXCJhdHRhY2htZW50c0NvbHVtbnNcIiBkaSBxdWVzdG8gY29tcG9uZW50ZSB0cmFtaXRlIGwnaXN0YW56YSBwYXNzYXRhIGNvbWUgcGFyYW1lbnRybyBvcHB1cmUgdHJhbWl0ZSBWaWV3Q2hpbGRcclxuICAgKiBkYWwgY29tcG9uZW50ZSBjaGUgbG8gb3NwaXRhLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoXCJvbkNvbXBvbmVudExvYWRlZFwiKSBvbkNvbXBvbmVudExvYWRlZDogRXZlbnRFbWl0dGVyPEVxcEF0dGFjaG1lbnRzQ29tcG9uZW50PiA9XHJcbiAgICBuZXcgRXZlbnRFbWl0dGVyPEVxcEF0dGFjaG1lbnRzQ29tcG9uZW50PigpO1xyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIFByb3ByaWV0w6AgcGVyIGdlc3Rpb25lIGNhcmljYW1lbnRvIG51b3ZvIGFsbGVnYXRvXHJcbiAgbmV3QXR0YWNobWVudDogSUF0dGFjaG1lbnREVE8gPSB7fSBhcyBJQXR0YWNobWVudERUTztcclxuICBuZXdNdWx0aXBsZUF0dGFjaG1lbnRzOiBBcnJheTxJQXR0YWNobWVudERUTz4gPSBbXTtcclxuICBkaWFsb2ZSZWZBZGRBdHRhY2htZW50OiBNYXREaWFsb2dSZWY8VGVtcGxhdGVSZWY8YW55Pj47XHJcbiAgYXR0YWNobWVudFR5cGUgPSBBdHRhY2htZW50VHlwZTtcclxuICBuZXdBdHRhY2htZW50Rm9ybTogRm9ybUdyb3VwO1xyXG4gIHNlbGVjdGVkRmlsZTogRmlsZSA9IG51bGw7XHJcbiAgc2VsZWN0ZWRGaWxlczogQXJyYXk8RmlsZT4gPSBudWxsO1xyXG4gIHNob3dDcm9wSW1hZ2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAVmlld0NoaWxkKFwiZGlhbG9nQWRkQXR0YWNobWVudFwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBkaWFsb2dBZGRBdHRhY2htZW50OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoXCJkaWFsb2dBZGRNdWx0aXBsZUF0dGFjaG1lbnRcIiwgeyBzdGF0aWM6IHRydWUgfSkgZGlhbG9nQWRkTXVsdGlwbGVBdHRhY2htZW50OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gUHJvcHJpZXTDoCBwZXIgZ2VzdGlvbmUgcmlkaW1lbnNpb25hbWVudG8gZmlsZSBkaSB0aXBvIGltYWdlXHJcbiAgaW1hZ2VDaGFuZ2VkRXZlbnQ6IGFueSA9IFwiXCI7XHJcbiAgY3JvcHBlZEltYWdlOiBhbnkgPSBcIlwiO1xyXG4gIHRyYW5zZm9ybTogSW1hZ2VUcmFuc2Zvcm0gPSB7fTtcclxuICBAVmlld0NoaWxkKEltYWdlQ3JvcHBlckNvbXBvbmVudCkgaW1hZ2VDcm9wcGVyOiBJbWFnZUNyb3BwZXJDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChcImltYWdlSW5wdXRcIikgaW1hZ2VJbnB1dDogYW55O1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBBdHRhY2htZW50VHlwZSA9IEF0dGFjaG1lbnRUeXBlO1xyXG4gIHNlbGVjdGVkQXR0YWNobWVudDogSUF0dGFjaG1lbnREVE87XHJcblxyXG4gIG9yaWdpbmFsV2lkdGg6IG51bWJlcjtcclxuICBvcmlnaW5hbEhlaWdodDogbnVtYmVyO1xyXG4gIGN1c3RvbVdpZHRoOiBudW1iZXI7XHJcbiAgY3VzdG9tSGVpZ2h0OiBudW1iZXI7XHJcblxyXG4gIEBWaWV3Q2hpbGQoXCJhdHRhY2htZW50VGFibGVcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIGF0dGFjaG1lbnRUYWJsZTogRXFwVGFibGVDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChcImlubGluZVByZXZpZXdUZW1wbGF0ZVwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBpbmxpbmVQcmV2aWV3VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZChcImRpYWxvZ1ByZXZpZXdcIiwgeyBzdGF0aWM6IHRydWUgfSkgZGlhbG9nUHJldmlldzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLy9TZSDDqCBzdGF0YSByaWNoaWVzdGEgbGEgZ2VzdGlvbmUgZGVsbGUgc29sZSBpbW1hZ2luaSBhbGxvcmEgaW1wb3N0YSBpbCBmaWx0cm8gcGVyIGxlIGVzdGVuc2lvbmkgcG9zc2liaWxpIGRhIGNhcmljYXJlXHJcbiAgICBpZiAoIXRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMpXHJcbiAgICAgIGlmICh0aGlzLmFsbG93T25seUltYWdlcyA9PSB0cnVlKSB0aGlzLmFjY2VwdGVkRmlsZVR5cGVzID0gXCJpbWFnZS8qXCI7XHJcbiAgICAgIGVsc2UgdGhpcy5hY2NlcHRlZEZpbGVUeXBlcyA9IFwiKlwiO1xyXG5cclxuICAgIC8vIFNlIG5vbiBzb25vIHN0YXRpIHNwZWNpZmljYXRpIGkgdGlwaSBkYSBnZXN0aXJlIG1hIMOoIHN0YXRvIHBhc3NhdG8gbnVsbCBvIHVuIGFycmF5IHZ1b3RvIGltcG9zdG8gaSB0aXBpIGRpIGRlZmF1bHQuXHJcbiAgICBpZiAoIXRoaXMuYWxsb3dlZFR5cGVzIHx8IHRoaXMuYWxsb3dlZFR5cGVzLmxlbmd0aCA9PSAwKVxyXG4gICAgICB0aGlzLmFsbG93ZWRUeXBlcyA9IFtBdHRhY2htZW50VHlwZS5GSUxFLCBBdHRhY2htZW50VHlwZS5MSU5LXTtcclxuICAgIGVsc2UgaWYgKHRoaXMuYWxsb3dlZFR5cGVzLmZpbmQoKHQpID0+IHQgIT0gQXR0YWNobWVudFR5cGUuRklMRSAmJiB0ICE9IEF0dGFjaG1lbnRUeXBlLkxJTkspKSB7XHJcbiAgICAgIEVxcEF0dGFjaG1lbnREaWFsb2dTZXJ2aWNlLldhcm5pbmcoXHJcbiAgICAgICAgJ0FsbWVubyB1bm8gZGVnbGkgQXR0YWNobWVudFR5cGUgc2VsZXppb25hdGkgbmVsIHBhcmFtZXRybyBcImFsbG93ZWRUeXBlc1wiIG5vbiBlc2lzdGUuJ1xyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmFsbG93ZWRUeXBlcyA9IFtBdHRhY2htZW50VHlwZS5GSUxFLCBBdHRhY2htZW50VHlwZS5MSU5LXTtcclxuICAgIH1cclxuXHJcbiAgICAvL1NlIMOoIHN0YXRhIHJpY2hpZXN0YSBsYSBnZXN0aW9uZSBtdWx0aXBsYSBkZWdsaSBhbGxlZ2F0aSBhbGxvcmEgY29uZmlndXJhIGwnZXFwLXRhYmxlXHJcbiAgICBpZiAodGhpcy5tdWx0aXBsZUF0dGFjaG1lbnQgPT0gdHJ1ZSAmJiAoIXRoaXMuYXR0YWNobWVudHNDb2x1bW5zIHx8IHRoaXMuYXR0YWNobWVudHNDb2x1bW5zLmxlbmd0aCA9PSAwKSkge1xyXG4gICAgICB0aGlzLmNvbmZpZ3VyZUNvbHVtbnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5hdHRhY2htZW50c0xpc3QgPT0gbnVsbCkgdGhpcy5hdHRhY2htZW50c0xpc3QgPSBuZXcgQXJyYXk8SUF0dGFjaG1lbnREVE8+KCk7XHJcblxyXG4gICAgdGhpcy5jaGVja0F0dGFjaG1lbnRJbWFnZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNvbXBvbmVudExvYWRlZC5lbWl0KHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbG9hZERhdGEoKSB7XHJcbiAgICBpZiAodGhpcy5hdHRhY2htZW50VGFibGUpIHRoaXMuYXR0YWNobWVudFRhYmxlLnJlbG9hZERhdGF0YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tBdHRhY2htZW50SW1hZ2UoKSB7XHJcbiAgICB0aGlzLmF0dGFjaG1lbnRzTGlzdC5mb3JFYWNoKChhKSA9PiB7XHJcbiAgICAgIGEuSXNJbWFnZSA9IEF0dGFjaG1lbnRIZWxwZXJTZXJ2aWNlLmNoZWNrSW1hZ2VGcm9tTWltZVR5cGUoYS5GaWxlQ29udGVudFR5cGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gR2VzdGlvbmUgZWxlbmNvIGFsbGVnYXRpXHJcblxyXG4gIC8qKlxyXG4gICAqIENvbmZpZ3VyYSBsZSBjb2xvbm5lIHBlciBsJ2VxcC10YWJsZSBuZWwgY2FzbyBpbiBjdWkgaWwgcGFyYW1ldHJvIFwibXVsdGlwbGVBdHRhY2htZW50c1wiIMOoIFRSVUUuXHJcbiAgICovXHJcbiAgY29uZmlndXJlQ29sdW1ucygpIHtcclxuICAgIHRoaXMuYXR0YWNobWVudHNDb2x1bW5zID0gW107XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlQWN0aW9uICE9IHRydWUpIHtcclxuICAgICAgdGhpcy5hdHRhY2htZW50c0NvbHVtbnMucHVzaCh7XHJcbiAgICAgICAga2V5OiBcImFjdGlvblwiLFxyXG4gICAgICAgIGRpc3BsYXk6IFwiXCIsXHJcbiAgICAgICAgdHlwZTogVHlwZUNvbHVtbi5NZW51QWN0aW9uLFxyXG4gICAgICAgIGJ1dHRvbk1lbnVJY29uOiBcIm1vcmVfdmVydFwiLFxyXG4gICAgICAgIHN0eWxlczogeyBmbGV4OiBcIjAgMCA2JVwiIH0sXHJcbiAgICAgICAgYWN0aW9uczogW1xyXG4gICAgICAgICAgeyBuYW1lOiB0aGlzLmRlbGV0ZUxhYmVsLCBpY29uOiBcImRlbGV0ZVwiLCBmbjogKGVsZW1lbnQsIGluZGV4LCBjb2wpID0+IHRoaXMuZGVsZXRlQXR0YWNobWVudChlbGVtZW50KSB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZG93bmxvYWRDb2x1bW4gPSB7XHJcbiAgICAgIGtleTogXCJhdHRhY2htZW50XCIsXHJcbiAgICAgIGRpc3BsYXk6IFwiXCIsXHJcbiAgICAgIHR5cGU6IFR5cGVDb2x1bW4uU2ltcGxlQWN0aW9uLFxyXG4gICAgICBzdHlsZXM6IHsgZmxleDogXCIwIDAgNiVcIiB9LFxyXG4gICAgICBhY3Rpb25zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogXCJcIixcclxuICAgICAgICAgIGZvbnRhd2Vzb21lOiB0cnVlLFxyXG4gICAgICAgICAgaWNvbjogKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hvd0lubGluZVByZXZpZXdcclxuICAgICAgICAgICAgICA/IGVsZW1lbnQuQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuRklMRVxyXG4gICAgICAgICAgICAgICAgPyBcImZhcyBmYS1jbG91ZC1kb3dubG9hZC1hbHRcIlxyXG4gICAgICAgICAgICAgICAgOiBcImZhcyBmYS1leHRlcm5hbC1saW5rLWFsdFwiXHJcbiAgICAgICAgICAgICAgOiB0aGlzLmdldEF0dGFjaG1lbnRJY29uKGVsZW1lbnQpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGZuOiAoZWxlbWVudCwgY29sLCBlbGVtZW50SW5kZXgpID0+IHRoaXMudmlld0F0dGFjaG1lbnQoZWxlbWVudCksXHJcbiAgICAgICAgICB0b29sdGlwOiB7XHJcbiAgICAgICAgICAgIHRvb2x0aXBUZXh0OiAoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LkF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkZJTEUgPyB0aGlzLmRvd25sb2FkTGFiZWwgOiB0aGlzLm9wZW5MaW5rTGFiZWw7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbjogdGhpcy5kb3dubG9hZFRvb2x0aXBQb3NpdGlvblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfTtcclxuXHJcbiAgICBsZXQgaW5saW5lUHJldmlld0NvbHVtbiA9IHtcclxuICAgICAga2V5OiBcIklubGluZVByZXZpZXdcIixcclxuICAgICAgZGlzcGxheTogdGhpcy5wcmV2aWV3TGFiZWwsXHJcbiAgICAgIHR5cGU6IFR5cGVDb2x1bW4uRXh0ZXJuYWxUZW1wbGF0ZSxcclxuICAgICAgZXh0ZXJuYWxUZW1wbGF0ZTogdGhpcy5pbmxpbmVQcmV2aWV3VGVtcGxhdGUsXHJcbiAgICAgIHN0eWxlczogeyBmbGV4OiBcIjAgMCAxMCVcIiB9XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBmaWxlTmFtZUNvbHVtbiA9IHsga2V5OiBcIkZpbGVOYW1lXCIsIGRpc3BsYXk6IHRoaXMuZmlsZU5hbWVMYWJlbCB9O1xyXG5cclxuICAgIGlmICh0aGlzLnNob3dJbmxpbmVQcmV2aWV3KSB7XHJcbiAgICAgIHRoaXMuYXR0YWNobWVudHNDb2x1bW5zLnB1c2goaW5saW5lUHJldmlld0NvbHVtbik7XHJcbiAgICAgIHRoaXMuYXR0YWNobWVudHNDb2x1bW5zLnB1c2goZmlsZU5hbWVDb2x1bW4pO1xyXG4gICAgICB0aGlzLmF0dGFjaG1lbnRzQ29sdW1ucy5wdXNoKGRvd25sb2FkQ29sdW1uKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYXR0YWNobWVudHNDb2x1bW5zLnB1c2goZG93bmxvYWRDb2x1bW4pO1xyXG4gICAgICB0aGlzLmF0dGFjaG1lbnRzQ29sdW1ucy5wdXNoKGZpbGVOYW1lQ29sdW1uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVsaW1pbmEgdW4gYWxsZWdhdG8gZWxpbWluYW5kbyBhbmNoZSBpbCBmaWxlIHByZXNlbnRlIG5lbGxvIHN0b3JhZ2UgZGkgYXJjaGl2aWF6aW9uZSB1dGlsaXp6YXRvIChBV1MgbyBjYXJ0ZWxsYSBwcm9nZXR0bylcclxuICAgKiBAcGFyYW0gZWxlbWVudCBJQXR0YWNobWVudERUTyBkYSBjYW5jZWxsYXJlXHJcbiAgICovXHJcbiAgZGVsZXRlQXR0YWNobWVudChlbGVtZW50OiBJQXR0YWNobWVudERUTykge1xyXG4gICAgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UuQ29uZmlybShcclxuICAgICAgdGhpcy5kZWxldGVEaWFsb2dNZXNzYWdlLFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRhY2htZW50RnJvbUxpc3QodGhpcy5hdHRhY2htZW50c0xpc3QuaW5kZXhPZihlbGVtZW50KSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHRydWUsXHJcbiAgICAgIHRoaXMuZGVsZXRlRGlhbG9nVGl0bGVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaW11b3ZlIGwnYWxsZWdhdG8gc2VsZXppb25hdG8gZGFsbGEgbGlzdGEgXCJhdHRhY2htZW50c0xpc3RcIiBlIGludm9jYSBsJ2V2ZW50byBkaSBvdXRwdXQgY2hlIHJlc3RpdHVpc2NlIGxhIGxpc3RhIGFnZ2lvcm5hdGEuXHJcbiAgICogQHBhcmFtIGF0dGFjaG1lbnRJbmRleCBJbmRpY2UgZGVsbCdhdHRhY2htZW50IGRhIHJpbXVvdmVyZVxyXG4gICAqL1xyXG4gIHJlbW92ZUF0dGFjaG1lbnRGcm9tTGlzdChhdHRhY2htZW50SW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5vbkRlbGV0ZUF0dGFjaG1lbnQuZW1pdCh0aGlzLmF0dGFjaG1lbnRzTGlzdFthdHRhY2htZW50SW5kZXhdKTtcclxuXHJcbiAgICB0aGlzLmF0dGFjaG1lbnRzTGlzdC5zcGxpY2UoYXR0YWNobWVudEluZGV4LCAxKTtcclxuICAgIGlmICh0aGlzLmF0dGFjaG1lbnRUYWJsZSkgdGhpcy5hdHRhY2htZW50VGFibGUucmVsb2FkRGF0YXRhYmxlKCk7XHJcbiAgICB0aGlzLmxvY2FsRWRpdGVkQXR0YWNobWVudHMuZW1pdCh0aGlzLmF0dGFjaG1lbnRzTGlzdCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTY2FyaWNhIGwnYWxsZWdhdG8gbyBhcHJlIGlsIGxpbmtcclxuICAgKiBAcGFyYW0gZWxlbWVudCBBbGxlZ2F0byBkYSBtb3N0cmFyZVxyXG4gICAqL1xyXG4gIHZpZXdBdHRhY2htZW50KGF0dGFjaG1lbnQ6IElBdHRhY2htZW50RFRPKSB7XHJcbiAgICBpZiAoYXR0YWNobWVudC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5MSU5LKSB7XHJcbiAgICAgIHdpbmRvdy5vcGVuKGF0dGFjaG1lbnQuRmlsZVBhdGgsIFwiX2JsYW5rXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGF0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgJiYgYXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgJiYgYXR0YWNobWVudC5GaWxlTmFtZSkge1xyXG4gICAgICBsZXQgc291cmNlID0gYGRhdGE6JHthdHRhY2htZW50LkZpbGVDb250ZW50VHlwZX07YmFzZTY0LCR7YXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NH1gO1xyXG4gICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICAgIGxpbmsuaHJlZiA9IHNvdXJjZTtcclxuICAgICAgbGluay5kb3dubG9hZCA9IGAke2F0dGFjaG1lbnQuRmlsZU5hbWV9YDtcclxuICAgICAgbGluay5jbGljaygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kb3dubG9hZEF0dGFjaG1lbnQuZW1pdChhdHRhY2htZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpZGVmaW5pc2NlIGwnaWNvbmEgZGEgbW9zdHJhcmUgbmVsbGEgY29sb25uYSBkZWxsJ2VxcC10YWJsZSBwZXIgb2duaSBmaWxlLlxyXG4gICAqIEwnaWNvbmEgdmFyaWEgaW4gYmFzZSBhbGwnZXN0ZW5zaW9uZSBkZWwgZmlsZVxyXG4gICAqIEBwYXJhbSBhdHRhY2htZW50XHJcbiAgICovXHJcbiAgZ2V0QXR0YWNobWVudEljb24oYXR0YWNobWVudDogSUF0dGFjaG1lbnREVE8pIHtcclxuICAgIGlmIChhdHRhY2htZW50LkF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkxJTkspIHJldHVybiBcImZhcyBmYS1saW5rXCI7XHJcbiAgICBlbHNlIHJldHVybiBBdHRhY2htZW50SGVscGVyU2VydmljZS5nZXRJY29uRnJvbUZpbGVFeHRlbnNpb25lKGF0dGFjaG1lbnQuRmlsZUV4dGVuc2lvbik7XHJcbiAgfVxyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLyoqXHJcbiAgICogQXByZSBsYSBtb2RhbGUgcGVyIGxhIGRlZmluaXppb25lIGRlaSBwYXJhbWV0cmkgZGVsIG51b3ZvIGZpbGVcclxuICAgKi9cclxuICBvcGVuTW9kYWxBZGRBdHRhY2htZW50KGF0dGFjaG1lbnRUeXBlOiBBdHRhY2htZW50VHlwZSkge1xyXG4gICAgLy9TZSDDqCBzdGF0byByaWNoaWVzdG8gaWwgY2FyaWNhbWVudG8gZGkgdW4gTElOSyBvIMOoIGltcG9zdGF0byBpbCBjYXJpY2FtZW50byBkaSBGSUxFIFNJTkdPTE8gYWxsb3JhIGFwcmUgbGEgbW9kYWxlIHBlclxyXG4gICAgLy9pbCBjYXJpY2FtZW50byBzaW5nb2xvIGRlbCBmaWxlIGFsdHJpbWVudGkgYXByZSBxdWVsbGEgcGVyIGlsIGNhcmljYW1lbnRvIG11bHRpcGxvXHJcbiAgICAvLyBpZiAoYXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuTElOSyB8fCAoYXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuRklMRSAmJiB0aGlzLmxvYWRNdWx0aXBsZUZpbGVzICE9IHRydWUpKSB7XHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnQgPSB7fSBhcyBJQXR0YWNobWVudERUTztcclxuICAgIHRoaXMubmV3QXR0YWNobWVudC5Jc0ltYWdlID0gZmFsc2U7XHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUgPSBhdHRhY2htZW50VHlwZTtcclxuICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyA9IG5ldyBBcnJheTxJQXR0YWNobWVudERUTz4oKTtcclxuICAgIGlmIChhdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5MSU5LKSB0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMucHVzaCh0aGlzLm5ld0F0dGFjaG1lbnQpO1xyXG5cclxuICAgIHRoaXMuY3JlYXRlQXR0YWNobWVudEZvcm0oKTtcclxuXHJcbiAgICAvL0FwcmUgbGEgbW9kYWxlXHJcbiAgICB0aGlzLmRpYWxvZlJlZkFkZEF0dGFjaG1lbnQgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMuZGlhbG9nQWRkQXR0YWNobWVudCwge1xyXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXHJcbiAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxyXG4gICAgICB3aWR0aDogXCI2MCVcIixcclxuICAgICAgbWF4SGVpZ2h0OiBcIjgwJVwiXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZUF0dGFjaG1lbnRGb3JtKCkge1xyXG4gICAgLy9DcmVhIGxhIGZvcm0gcGVyIGxhIHZhbGlkYXppb25lIGRlaSBjYW1waVxyXG4gICAgdGhpcy5uZXdBdHRhY2htZW50Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICB0eXBlOiBbdGhpcy5uZXdBdHRhY2htZW50LkF0dGFjaG1lbnRUeXBlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgbmFtZTogW3RoaXMubmV3QXR0YWNobWVudC5GaWxlTmFtZV0sXHJcbiAgICAgIHBhdGg6IFt0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZVBhdGhdLFxyXG4gICAgICBjdXN0b21IZWlnaHQ6IFt0aGlzLmN1c3RvbUhlaWdodF0sXHJcbiAgICAgIGN1c3RvbVdpZHRoOiBbdGhpcy5jdXN0b21XaWR0aF1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2xvc2UoZW1pdENsb3NlRXZlbnQgPSB0cnVlKSB7XHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnQgPSB7fSBhcyBJQXR0YWNobWVudERUTztcclxuICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyA9IG5ldyBBcnJheTxJQXR0YWNobWVudERUTz4oKTtcclxuICAgIHRoaXMuYWJvcnRGaWxlKCk7XHJcbiAgICBpZiAodGhpcy5uZXdBdHRhY2htZW50Rm9ybSkgdGhpcy5uZXdBdHRhY2htZW50Rm9ybS5yZXNldCgpO1xyXG5cclxuICAgIHRoaXMuZGlhbG9mUmVmQWRkQXR0YWNobWVudC5jbG9zZSgpO1xyXG5cclxuICAgIGlmIChlbWl0Q2xvc2VFdmVudCA9PSB0cnVlICYmIHRoaXMuYWJvcnRBZGRBdHRhY2htZW50KSB0aGlzLmFib3J0QWRkQXR0YWNobWVudC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbiBiYXNlIGFsIHRpcG8gZGkgYWxsZWdhdG8gY29udHJvbGxhIHNlIGRpc2FiaWxpdGFyZSBvIG1lbm8gaWwgcHVsc2FudGUgcGVyIHNhbHZhcmUuXHJcbiAgICogRnVuemlvbmUgdXNhdGEgbmVsIFtkaXNhYmxlXSBkZWwgcHVsc2FudGUgXCJTYWx2YVwiIGRlbCBkaWFsb2cgcGVyIGwnYWdnaXVudGEgZGkgdW4gYWxsZWdhdG8uXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBkaXNhYmxlU2F2ZSgpIHtcclxuICAgIGlmICh0aGlzLmxvYWRNdWx0aXBsZUZpbGVzICE9IHRydWUpIHtcclxuICAgICAgaWYgKHRoaXMubmV3QXR0YWNobWVudC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5GSUxFKSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZVBhdGg7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzLmZpbHRlcihcclxuICAgICAgICAgIChwKSA9PlxyXG4gICAgICAgICAgICAocC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5GSUxFICYmICFwLkZpbGVEYXRhQmFzZTY0KSB8fFxyXG4gICAgICAgICAgICAocC5BdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5MSU5LICYmICFwLkZpbGVQYXRoKVxyXG4gICAgICAgICkubGVuZ3RoID4gMFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uZmlybUFkZEF0dGFjaG1lbnQoKSB7XHJcbiAgICBpZiAodGhpcy5sb2FkTXVsdGlwbGVGaWxlcyAhPSB0cnVlKSB7XHJcbiAgICAgIGlmICh0aGlzLm5ld0F0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuTElOSyAmJiAhdGhpcy5uZXdBdHRhY2htZW50LkZpbGVOYW1lKVxyXG4gICAgICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlTmFtZSA9IHRoaXMubmV3QXR0YWNobWVudC5GaWxlUGF0aDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmF0dGFjaG1lbnRzTGlzdCA9PSBudWxsKSB0aGlzLmF0dGFjaG1lbnRzTGlzdCA9IG5ldyBBcnJheTxJQXR0YWNobWVudERUTz4oKTtcclxuXHJcbiAgICAgIHRoaXMuYXR0YWNobWVudHNMaXN0LnB1c2godGhpcy5uZXdBdHRhY2htZW50KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMgPT0gbnVsbCB8fCB0aGlzLm5ld011bHRpcGxlQXR0YWNobWVudHMubGVuZ3RoID09IDApIHJldHVybjtcclxuXHJcbiAgICAgIGlmICh0aGlzLmF0dGFjaG1lbnRzTGlzdCA9PSBudWxsKSB0aGlzLmF0dGFjaG1lbnRzTGlzdCA9IG5ldyBBcnJheTxJQXR0YWNobWVudERUTz4oKTtcclxuXHJcbiAgICAgIHRoaXMuYXR0YWNobWVudHNMaXN0ID0gdGhpcy5hdHRhY2htZW50c0xpc3QuY29uY2F0KHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYXR0YWNobWVudFRhYmxlKSB0aGlzLmF0dGFjaG1lbnRUYWJsZS5yZWxvYWREYXRhdGFibGUoKTtcclxuXHJcbiAgICB0aGlzLmxvY2FsRWRpdGVkQXR0YWNobWVudHMuZW1pdCh0aGlzLmF0dGFjaG1lbnRzTGlzdCk7XHJcbiAgICB0aGlzLmNsb3NlKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcmUgaWwgZGlhbG9nIHBlciBsJ2FudGVwcmltYSBkZWxsJ2FsbGVnYXRvIHNlbGV6aW9uYXRvLlxyXG4gICAqIEBwYXJhbSByb3dcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGFzeW5jIG9wZW5QcmV2aWV3RGlhbG9nKHJvdzogSUF0dGFjaG1lbnREVE8pIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyb3cpKTtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuQXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuRklMRSkge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoXCJ2aWRlb1wiKSkge1xyXG4gICAgICAgIEVxcEF0dGFjaG1lbnREaWFsb2dTZXJ2aWNlLldhcm5pbmcodGhpcy52aWRlb1ByZXZpZXdFcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUuc3RhcnRzV2l0aChcImF1ZGlvXCIpKSB7XHJcbiAgICAgICAgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UuV2FybmluZyh0aGlzLmF1ZGlvUHJldmlld0Vycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZ2V0QXR0YWNobWVudEVuZHBvaW50ICYmIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LklzSW1hZ2UgJiYgIXRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0KSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2V0QXR0YWNobWVudEJ5SUQoKVxyXG4gICAgICAgIC50aGVuKChyZXMpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0ID0gcmVzLkZpbGVEYXRhQmFzZTY0O1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICAgIEVxcEF0dGFjaG1lbnREaWFsb2dTZXJ2aWNlLkVycm9yKGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkF0dGFjaG1lbnRUeXBlID09IEF0dGFjaG1lbnRUeXBlLkxJTkspIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuVHJ1c3RlZFVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlUGF0aFxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuSXNJbWFnZSAmJlxyXG4gICAgICAhdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgJiZcclxuICAgICAgIXRoaXMuc2VsZWN0ZWRBdHRhY2htZW50LkZpbGVUaHVtYm5haWxCYXNlNjRcclxuICAgICkge1xyXG4gICAgICBFcXBBdHRhY2htZW50RGlhbG9nU2VydmljZS5JbmZvKFwiSW1wb3NzaWJpbGUgYXByaXJlIGwnYW50ZXByaW1hIGRlbGwnYWxsZWdhdG8sIGZpbGUgbWFuY2FudGUuXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5Jc0ltYWdlKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkQXR0YWNobWVudC5GaWxlUGF0aCAmJiB0aGlzLnByb2R1Y3Rpb25CYXNlVXJsKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuVHJ1c3RlZFVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChcclxuICAgICAgICAgIFwiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZ3ZpZXc/dXJsPVwiICtcclxuICAgICAgICAgICAgdGhpcy5wcm9kdWN0aW9uQmFzZVVybCArXHJcbiAgICAgICAgICAgIFwiL1wiICtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEF0dGFjaG1lbnQuRmlsZVBhdGggK1xyXG4gICAgICAgICAgICBcIiZlbWJlZGRlZD10cnVlXCJcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIEVxcEF0dGFjaG1lbnREaWFsb2dTZXJ2aWNlLkluZm8oXCJJbXBvc3NpYmlsZSBhcHJpcmUgbCdhbnRlcHJpbWEgZGVsIGRvY3VtZW50byFcIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kaWFsb2cub3Blbih0aGlzLmRpYWxvZ1ByZXZpZXcsIHtcclxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxyXG4gICAgICBoYXNCYWNrZHJvcDogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRBdHRhY2htZW50QnlJRCgpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxJQXR0YWNobWVudERUTz4odGhpcy5nZXRBdHRhY2htZW50RW5kcG9pbnQsIHRoaXMuc2VsZWN0ZWRBdHRhY2htZW50KS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBHZXN0aW9uZSBjYXJpY2FtZW50byBmaWxlXHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50byBzY2F0ZW5hdG8gYWxsYSBzZWxlemlvbmUgZGVsIGZpbGUgKG8gZGVpIGZpbGUpLlxyXG4gICAqIFNlIGlsIGNhcmljYW1lbnRvIMOoIFNJTkdPTE8gbyBzZSBjb211bnF1ZSDDqCBzdGF0byBzZWxlemlvbmF0byB1biBzb2xvIGZpbGUgYWxsb3JhIHNpIG9jY3VwYSBkaSBjb250cm9sbGFyZSBzZSBzaSB0cmF0dGEgZGkgdW4gaW1tYWdpbmUgaW4gbW9kbyBkYVxyXG4gICAqIG1vc3RyYXJlIGxlIGZ1bnppb25hbGl0w6AgZGVsIGNyb3BwaWUgKHBlciByaXRhZ2xpYXJlIGwnaW1tYWdpbmUpIG9wcHVyZSBuby5cclxuICAgKiBTZSBpbCBmaWxlIGNhcmljYXRvIG5vbiDDqCB1biBpbW1hZ2luZSBhbGxvcmEgZ2VuZXJhIGRpcmV0dGFtZW50ZSBpbCBiYXNlNjQgZSBsbyBhc3NvY2lhIGFsbCdhbGxlZ2F0byBkYSBzYWx2YXJlLlxyXG4gICAqIFNlIGludmVjZSBpbCBjYXJpY2FtZW50byBkZWkgZmlsZSDDqCBNVUxUSVBMTyBlIHNvbm8gcHJlc2VudGkgcGnDuSBmaWxlIGFsbG9yYSBlc2VndWUgbGUgc3Rlc3NlIG9wZXJhemlvbmkgaWdub3JhbmRvIHBlcsOyIGlsIGNvbnRybGxvXHJcbiAgICogaW1tYWdpbmUgcGVyIGlsIGNyb3BwaWUgKGluIGNhc28gZGkgY2FyaWNhbWVudG8gbXVsdGlwbG8gbGUgZnVuemlvbmFsaXTDoCBkZWwgY3JvcHBpZSBzb25vIGRpc2FiaWxpdGF0ZSkuXHJcbiAgICovXHJcbiAgYXN5bmMgb25GaWxlSW5wdXRDaGFuZ2UoZXZlbnQpIHtcclxuICAgIHRoaXMuc2hvd0Nyb3BJbWFnZSA9IGZhbHNlO1xyXG5cclxuICAgIC8vU2Ugw6ggc3RhdG8gcmljaGllc3RvIGlsIGNhcmljYW1lbnRvIFNJTkdPTE8gb3BwdXJlIHNlIGlsIGNhcmljYW1lbnRvIMOoIE1VTFRJUExPIG1hIMOoIHN0YXRvIHNlbGV6aW9uYXRvIHVuIHNvbG8gZmlsZVxyXG4gICAgLy9hbGxvcmEgdmVyaWZpY2Egc2UgaWwgZmlsZSDDqCB1biBpbW1hZ2luZSAocGVyIG1vc3RyYXJlIGlsIENST1BQSUUpXHJcbiAgICBpZiAoWy4uLmV2ZW50LnRhcmdldC5maWxlc10ubGVuZ3RoID09IDEgfHwgdGhpcy5sb2FkTXVsdGlwbGVGaWxlcyAhPSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZXMgPSBldmVudC50YXJnZXQuZmlsZXM7XHJcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZEZpbGUpIHJldHVybjtcclxuXHJcbiAgICAgIC8vTWVtb3JpenphIGkgZGF0aSBwZXIgbCdhbGxlZ2F0b1xyXG4gICAgICB0aGlzLm5ld0F0dGFjaG1lbnQgPSBhd2FpdCB0aGlzLmNyZWF0ZUF0dGFjaG1lbnRGcm9tVXBsb2FkZWRGaWxlKHRoaXMuc2VsZWN0ZWRGaWxlLCBmYWxzZSk7XHJcbiAgICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyA9IG5ldyBBcnJheTxJQXR0YWNobWVudERUTz4oKTtcclxuICAgICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzLnB1c2godGhpcy5uZXdBdHRhY2htZW50KTtcclxuXHJcbiAgICAgIC8vU2Ugw6ggc3RhdGEgcmljaGllc3RhIGxhIGdlc3Rpb25lIGRlbGxlIHNvbGUgaW1tYWdpbmkgbWEgcGVyIGVycm9yZSDDqCBzdGF0byBzZWxlemlvbmF0byB1biBmaWxlIGNoZSBub24gw6ggdW4gaW1tYWdpbmVcclxuICAgICAgbGV0IGNoZWNrT25seUltYWdlID0gdGhpcy5jaGVja0FsbG93T25seUltYWdlRmlsZSh0aGlzLm5ld0F0dGFjaG1lbnQpO1xyXG4gICAgICBpZiAoY2hlY2tPbmx5SW1hZ2UgPT0gZmFsc2UpIHJldHVybjtcclxuXHJcbiAgICAgIGlmICh0aGlzLmxvYWRNdWx0aXBsZUZpbGVzID09IHRydWUgJiYgWy4uLmV2ZW50LnRhcmdldC5maWxlc10ubGVuZ3RoID09IDEpIHRoaXMuY3JlYXRlQXR0YWNobWVudEZvcm0oKTtcclxuXHJcbiAgICAgIC8vVmVyaWZpY2Egc2UgaWwgZmlsZSBjYXJpY2F0byDDqCB1bidpbW1hZ2luZSBvcHB1cmUgbm8uIFNlIMOoIHVuIGltbWFnaW5lLCBwcmltYSBkaSBjYXJpY2FybGEgbW9zdHJhIGlsIGNyb3BwaWUgcGVyIGlsIHJlc2l6ZS5cclxuICAgICAgLy9TZSBub24gw6ggdW4gaW1tYWdpbmUgYWxsb3JhIGdlbmVyYSBpbCBCYXNlNjRcclxuICAgICAgaWYgKHRoaXMubmV3QXR0YWNobWVudC5Jc0ltYWdlID09IHRydWUpIHtcclxuICAgICAgICB0aGlzLmdldEltYWdlRGltZW5zaW9ucyhldmVudC50YXJnZXQuZmlsZXNbMF0pO1xyXG5cclxuICAgICAgICAvL01vc3RyYSBpbCBjcm9wcGllIGUgZGlzYWJpbGl0YSBsYSBmb3JtIGZpbmNow6ggbm9uIHRlcm1pbmEgbGEgbW9kaWZpY2EgZGVsbCdpbW1hZ2luZVxyXG4gICAgICAgIHRoaXMubmV3QXR0YWNobWVudEZvcm0uZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMubmV3QXR0YWNobWVudEZvcm0uY29udHJvbHNbXCJjdXN0b21XaWR0aFwiXS5lbmFibGUoKTtcclxuICAgICAgICB0aGlzLm5ld0F0dGFjaG1lbnRGb3JtLmNvbnRyb2xzW1wiY3VzdG9tSGVpZ2h0XCJdLmVuYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuc2hvd0Nyb3BJbWFnZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pbWFnZUNoYW5nZWRFdmVudCA9IGV2ZW50O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2hvd0Nyb3BJbWFnZSA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBiYXNlNjRSZXN1bHQgPSBhd2FpdCB0aGlzLmdldEJhc2U2NEZyb21GaWxlKHRoaXMuc2VsZWN0ZWRGaWxlKTtcclxuICAgICAgICB0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgPSBiYXNlNjRSZXN1bHQuQmFzZTY0RmlsZTtcclxuICAgICAgICB0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZUNvbnRlbnRUeXBlID0gYmFzZTY0UmVzdWx0LkNvbnRlbnRUeXBlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZXMgPSBldmVudC50YXJnZXQuZmlsZXM7XHJcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZEZpbGVzIHx8IHRoaXMuc2VsZWN0ZWRGaWxlcy5sZW5ndGggPT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgdGhpcy5uZXdNdWx0aXBsZUF0dGFjaG1lbnRzID0gbmV3IEFycmF5PElBdHRhY2htZW50RFRPPigpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRGaWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBuZXdBdHRhY2htZW50OiBJQXR0YWNobWVudERUTyA9IGF3YWl0IHRoaXMuY3JlYXRlQXR0YWNobWVudEZyb21VcGxvYWRlZEZpbGUodGhpcy5zZWxlY3RlZEZpbGVzW2ldLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLy9TZSDDqCBzdGF0YSByaWNoaWVzdGEgbGEgZ2VzdGlvbmUgZGVsbGUgc29sZSBpbW1hZ2luaSBtYSBwZXIgZXJyb3JlIMOoIHN0YXRvIHNlbGV6aW9uYXRvIHVuIGZpbGUgY2hlIG5vbiDDqCB1biBpbW1hZ2luZVxyXG4gICAgICAgIGxldCBjaGVja09ubHlJbWFnZSA9IHRoaXMuY2hlY2tBbGxvd09ubHlJbWFnZUZpbGUobmV3QXR0YWNobWVudCk7XHJcbiAgICAgICAgaWYgKGNoZWNrT25seUltYWdlID09IGZhbHNlKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cy5wdXNoKG5ld0F0dGFjaG1lbnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHBhcnRpcmUgZGFsIEZJTEUgcmljZXZ1dG8gaW4gaW5wdXQgcmljb3N0cnVpc2NlIGwnb2dnZXR0byBJQXR0YWNobWVudERUTyBlIGxvIHJlc3RpdHVpc2NlLlxyXG4gICAqIFNlIGlsIHBhcmFtZXRybyBnZXRCYXNlNjQgdmllbmUgcGFzc2F0byBhIFRSVUUgYWxsb3JhLCBzZW1wcmUgYSBwYXJ0aXJlIGRhbCBmaWxlLGdlbmVyYSBpbCBiYXNlNjQgZVxyXG4gICAqIHJpY2F2YSBpbCBDb250ZW50VHlwZSBkYSBhc3NvY2lhcmUgYWxsJ29nZ2V0dG8gSUF0dGFjaG1lbnREVE8gZGEgcmVzdGl0dWlyZVxyXG4gICAqIEBwYXJhbSBjdXJyZW50RmlsZSBPZ2dldHRvIEZJTEUgZGEgcHJvY2Vzc2FyZVxyXG4gICAqIEBwYXJhbSBnZXRCYXNlNjQgU2UgVFJVRSBhbGxvcmEgY2FsY29sYSBiYXNlNjQgZSBDb250ZW50VHlwZSBkZWwgZmlsZSBwYXNzYXRvIGluIGlucHV0XHJcbiAgICogQHJldHVybnMgUmVzdGl0dWlzY2UgdW4gb2dnZXR0byBkaSB0aXBvIElBdHRhY2htZW50RFRPXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVBdHRhY2htZW50RnJvbVVwbG9hZGVkRmlsZShcclxuICAgIGN1cnJlbnRGaWxlOiBGaWxlLFxyXG4gICAgZ2V0QmFzZTY0OiBib29sZWFuID0gdHJ1ZVxyXG4gICk6IFByb21pc2U8SUF0dGFjaG1lbnREVE8+IHtcclxuICAgIGxldCBuZXdBdHRhY2htZW50OiBJQXR0YWNobWVudERUTyA9IHt9IGFzIElBdHRhY2htZW50RFRPO1xyXG5cclxuICAgIC8vTWVtb3JpenphIGkgZGF0aSBwZXIgbCdhbGxlZ2F0b1xyXG4gICAgbmV3QXR0YWNobWVudC5BdHRhY2htZW50VHlwZSA9IEF0dGFjaG1lbnRUeXBlLkZJTEU7XHJcbiAgICBuZXdBdHRhY2htZW50LkZpbGVDb250ZW50VHlwZSA9IGN1cnJlbnRGaWxlLnR5cGU7XHJcbiAgICBuZXdBdHRhY2htZW50LkZpbGVOYW1lID0gY3VycmVudEZpbGUubmFtZTtcclxuICAgIG5ld0F0dGFjaG1lbnQuRmlsZUV4dGVuc2lvbiA9IGN1cnJlbnRGaWxlLm5hbWUuc3Vic3RyKGN1cnJlbnRGaWxlLm5hbWUubGFzdEluZGV4T2YoXCIuXCIpICsgMSk7XHJcbiAgICBuZXdBdHRhY2htZW50LklzSW1hZ2UgPSBBdHRhY2htZW50SGVscGVyU2VydmljZS5jaGVja0ltYWdlRnJvbU1pbWVUeXBlKGN1cnJlbnRGaWxlLnR5cGUpO1xyXG5cclxuICAgIGlmIChnZXRCYXNlNjQgPT0gdHJ1ZSkge1xyXG4gICAgICBsZXQgYmFzZTY0UmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRCYXNlNjRGcm9tRmlsZShjdXJyZW50RmlsZSk7XHJcbiAgICAgIG5ld0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgPSBiYXNlNjRSZXN1bHQuQmFzZTY0RmlsZTtcclxuICAgICAgbmV3QXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgPSBiYXNlNjRSZXN1bHQuQ29udGVudFR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ld0F0dGFjaG1lbnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHBhcnRpcmUgZGFsIGZpbGUgcGFzc2F0byBpbiBpbnB1dCByZXN0aXR1aXNjZSB1biBvZ2dldHRvXHJcbiAgICogY29udGVuZW50ZSBpbCBiYXNlNjQgZGVsIGZpbGUgZSBpbCBzdW8gY29udGVudFR5cGVcclxuICAgKiBAcGFyYW0gY3VycmVudEZpbGUgT2dnZXR0byBGaWxlIGRhIGN1aSBlc3RyYXBvbGFyZSBiYXNlNjQgZSBjb250ZW50VHlwZVxyXG4gICAqIEByZXR1cm5zIFJlc3RpdHVpc2NlIHVuIG9nZ2V0dG8gYXZlbnRlIGxlIHByb3ByaWV0w6AgQmFzZTY0RmlsZSBlIENvbnRlbnRUeXBlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRCYXNlNjRGcm9tRmlsZShjdXJyZW50RmlsZTogRmlsZSk6IFByb21pc2U8YW55PiB7XHJcbiAgICBsZXQgYmFzZTY0RmlsZSA9IGF3YWl0IHRvQmFzZTY0KGN1cnJlbnRGaWxlKTtcclxuICAgIGxldCBjb250ZW50VHlwZTogc3RyaW5nID0gbnVsbDtcclxuICAgIGlmIChiYXNlNjRGaWxlKSB7XHJcbiAgICAgIC8vIExvcmlzIDIwLzAxLzIwMjI6IFBST0JMRU1BIC0gUXVhbmRvIGVzZWd1byBsJ3VwbG9hZCBkaSB1biBmaWxlIC5zcWwgbm9uIHZpZW5lIHNhbHZhdG8vc2NhcmljYXRvIGNvcnJldHRhbWVudGUuXHJcbiAgICAgIC8vICAgICAgICAgICAgICAgICAgIFF1ZXN0byBzdWNjZWRlIHBlcmNow6ggbm9uIHZpZW5lIHBvcG9sYXRvIGlsIEZpbGVDb250ZW50VHlwZS4gUGVyIHJpc29sdmVyZSBpbCBwcm9ibGVtYVxyXG4gICAgICAvLyAgICAgICAgICAgICAgICAgICBmYWNjaW8gdW4gY29udHJvbGxvIGUgc2Ugbm9uIGVzaXN0ZSBpbCBGaWxlQ29udGVudFR5cGUgYWxsb3JhIGxvIHJlY3VwZXJvIGRhbCBiYXNlNjQgb3R0ZW51dG8uXHJcbiAgICAgIGNvbnRlbnRUeXBlID0gYmFzZTY0RmlsZS5zcGxpdChcIixcIilbMF0uc3BsaXQoXCI6XCIpWzFdLnNwbGl0KFwiO1wiKVswXTtcclxuICAgICAgLy8gVW4gYWx0cm8gbWV0b2RvIHBlciBsZWdnZXJlIGlsIGNjb250ZW50IHR5cGUgZGVsIGZpbGUgw6ggdHJhbWl0ZSB1bmEgcmVndWxhciBleHByZXNzaW9uOlxyXG4gICAgICBiYXNlNjRGaWxlID0gYmFzZTY0RmlsZS5zcGxpdChcIixcIilbMV07XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc3VsdCA9IHtcclxuICAgICAgQmFzZTY0RmlsZTogYmFzZTY0RmlsZSxcclxuICAgICAgQ29udGVudFR5cGU6IGNvbnRlbnRUeXBlXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb250cm9sbGEgc2UgaWwgZmlsZSBjaGUgc2kgc3RhIGNhcmljYW5kbyDDqCBzdXBwb3J0YXRvIGRhbCBzaXN0ZW1hLlxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjaGVja0FjY2VwdGVkRmlsZXMoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuYWxsb3dWaWRlbykge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgKHRoaXMubG9hZE11bHRpcGxlRmlsZXMgIT0gdHJ1ZSAmJiB0aGlzLnNlbGVjdGVkRmlsZS50eXBlLnN0YXJ0c1dpdGgoXCJ2aWRlb1wiKSkgfHxcclxuICAgICAgICAodGhpcy5sb2FkTXVsdGlwbGVGaWxlcyA9PSB0cnVlICYmIFsuLi50aGlzLnNlbGVjdGVkRmlsZXNdLmZpbHRlcigocCkgPT4gcC50eXBlLnN0YXJ0c1dpdGgoXCJ2aWRlb1wiKSkubGVuZ3RoID4gMClcclxuICAgICAgKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5hY2NlcHRlZEZpbGVUeXBlcyA9PSBcIipcIikgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgLy9WZXJpZmljYSBjaGUgaSB0aXBpIGRlbCBmaWxlIChvIGRlaSBmaWxlKSBjYXJpY2F0aSBzaWFubyBjb2VyZW50aSBjb24gcXVlbGxpIGFjY2V0dGF0aSBkYWxsYSBkaXJldHRpdmFcclxuICAgIGxldCBhY2NlcHRlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5sb2FkTXVsdGlwbGVGaWxlcyAhPSB0cnVlKSBhY2NlcHRlZCA9IHRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMuaW5jbHVkZXModGhpcy5zZWxlY3RlZEZpbGUudHlwZSk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHVwbG9hZGVkRmlsZVR5cGVzOiBzdHJpbmdbXSA9IFsuLi50aGlzLnNlbGVjdGVkRmlsZXNdLm1hcCgocCkgPT4gcC50eXBlKTtcclxuICAgICAgdXBsb2FkZWRGaWxlVHlwZXMuZm9yRWFjaCgodHlwZSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5hY2NlcHRlZEZpbGVUeXBlcy5pbmNsdWRlcyh0eXBlKSkgYWNjZXB0ZWQgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9RdWVzdG8gY29udHJvbGxvIHBlcm1ldHRlIGRpIGdlc3RpcmUgbGUgY2FzaXN0aWNoZSBwZXIgY3VpIHZlbmdvbm8gaW5kaWNhdGkgY29tZSB0aXBpIHZhbGlkaSwgYWQgZXNlbXBpbywgJ2ltYWdlLyonXHJcbiAgICBpZiAoIWFjY2VwdGVkICYmIHRoaXMubG9hZE11bHRpcGxlRmlsZXMgIT0gdHJ1ZSkge1xyXG4gICAgICBmb3IgKGxldCB0IG9mIHRoaXMuYWNjZXB0ZWRGaWxlVHlwZXMuc3BsaXQoXCIsXCIpLmZpbHRlcigodCkgPT4gdC5pbmNsdWRlcyhcIipcIikpKSB7XHJcbiAgICAgICAgYWNjZXB0ZWQgPSB0aGlzLnNlbGVjdGVkRmlsZS50eXBlLnN0YXJ0c1dpdGgodC5zcGxpdChcIipcIilbMF0pO1xyXG4gICAgICAgIGlmIChhY2NlcHRlZCkgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBhY2NlcHRlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIGVxcC1hdHRhY2htZW50cyDDqCBzdGF0YSBjb25maWd1cmF0YSBwZXIgaWwgY2FyaWNhbWVudG8gZGVsbGUgc29sZSBpbW1hZ2luaSBhbGxvcmEgdmVyaWZpY2EgY2hlIGlsIGZpbGUgcGFzc2F0byBpblxyXG4gICAqIGlucHV0IHNpYSBlZmZldHRpdmFtZW50ZSB1biBpbW1hZ2luZSBvIG5vLlxyXG4gICAqIFNlIGlsIGNvbnRyb2xsbyB2YSBhIGJ1b24gZmluZSByZXN0aXR1aXNjZSBUUlVFIGFsdHJpbWVudGkgbW9zdHJhIHVuIG1lc3NhZ2dpbyBkJ2Vycm9yZSBlIHJlc3RpdHVpc2NlIEZBTFNFXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjaGVja0FsbG93T25seUltYWdlRmlsZShuZXdBdHRhY2htZW50KTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5hbGxvd09ubHlJbWFnZXMgPT0gdHJ1ZSAmJiBuZXdBdHRhY2htZW50LklzSW1hZ2UgIT0gdHJ1ZSkge1xyXG4gICAgICBFcXBBdHRhY2htZW50RGlhbG9nU2VydmljZS5FcnJvcih0aGlzLm5vSW1hZ2VTZWxlY3RlZEVycm9yTWVzc2FnZSk7XHJcbiAgICAgIHRoaXMuYWJvcnRGaWxlKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSBpZiAoIXRoaXMuY2hlY2tBY2NlcHRlZEZpbGVzKCkpIHtcclxuICAgICAgRXFwQXR0YWNobWVudERpYWxvZ1NlcnZpY2UuRXJyb3IodGhpcy53cm9uZ1R5cGVTZWxlY3RlZEVycm9yTWVzc2FnZSk7XHJcbiAgICAgIHRoaXMuYWJvcnRGaWxlKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGdldEltYWdlRGltZW5zaW9ucyhpbWc6IGFueSkge1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XHJcbiAgICAgIGltYWdlLnNyYyA9IGUudGFyZ2V0LnJlc3VsdDtcclxuICAgICAgaW1hZ2Uub25sb2FkID0gKHJzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vcmlnaW5hbEhlaWdodCA9IHJzLmN1cnJlbnRUYXJnZXRbXCJoZWlnaHRcIl07XHJcbiAgICAgICAgdGhpcy5vcmlnaW5hbFdpZHRoID0gcnMuY3VycmVudFRhcmdldFtcIndpZHRoXCJdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5vcmlnaW5hbFdpZHRoID4gMTI4MCkge1xyXG4gICAgICAgICAgdGhpcy5jdXN0b21XaWR0aCA9IDEyODA7XHJcbiAgICAgICAgICB0aGlzLmN1c3RvbUhlaWdodCA9IE1hdGgucm91bmQoKDEyODAgKiB0aGlzLm9yaWdpbmFsSGVpZ2h0KSAvIHRoaXMub3JpZ2luYWxXaWR0aCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY3VzdG9tSGVpZ2h0ID0gcnMuY3VycmVudFRhcmdldFtcImhlaWdodFwiXTtcclxuICAgICAgICAgIHRoaXMuY3VzdG9tV2lkdGggPSBycy5jdXJyZW50VGFyZ2V0W1wid2lkdGhcIl07XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgfTtcclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGltZyk7XHJcbiAgfVxyXG5cclxuICByZXN0b3JlT3JpZ2luYWxEaW1lbnNpb25zKCkge1xyXG4gICAgdGhpcy5jdXN0b21XaWR0aCA9IHRoaXMub3JpZ2luYWxXaWR0aDtcclxuICAgIHRoaXMuY3VzdG9tSGVpZ2h0ID0gdGhpcy5vcmlnaW5hbEhlaWdodDtcclxuICB9XHJcblxyXG4gIG9uRGltZW5zaW9uc0NoYW5nZShkaW1lbnNpb246IHN0cmluZykge1xyXG4gICAgaWYgKGRpbWVuc2lvbiA9PSBcIkhcIikge1xyXG4gICAgICB0aGlzLmN1c3RvbVdpZHRoID0gTWF0aC5yb3VuZCgodGhpcy5jdXN0b21IZWlnaHQgKiB0aGlzLm9yaWdpbmFsV2lkdGgpIC8gdGhpcy5vcmlnaW5hbEhlaWdodCk7XHJcbiAgICB9IGVsc2UgaWYgKGRpbWVuc2lvbiA9PSBcIldcIikge1xyXG4gICAgICB0aGlzLmN1c3RvbUhlaWdodCA9IE1hdGgucm91bmQoKHRoaXMuY3VzdG9tV2lkdGggKiB0aGlzLm9yaWdpbmFsSGVpZ2h0KSAvIHRoaXMub3JpZ2luYWxXaWR0aCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbWFnZUNyb3BwZWQoZXZlbnQ6IEltYWdlQ3JvcHBlZEV2ZW50KSB7XHJcbiAgICB0aGlzLmNyb3BwZWRJbWFnZSA9IGV2ZW50LmJhc2U2NDtcclxuICAgIHRoaXMuZ2V0Q3JvcHBlZEFuZFVwbG9hZCh0aGlzLmNyb3BwZWRJbWFnZSk7XHJcbiAgfVxyXG5cclxuICBnZXRDcm9wcGVkQW5kVXBsb2FkKGZpbGUpIHtcclxuICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICB2YXIgZmlsZTogYW55ID0gYmFzZTY0VG9GaWxlKGZpbGUpO1xyXG5cclxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNvbXByZXNzaW9uT3B0aW9ucztcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXByaW1lIGwnaW1tYWdpbmUgcGFzc2FuZG8gY29tZSBwYXJhbWV0cmkgbGUgb3B0aW9ucyBjcmVhdGUgbmVsbCdvZ2dldHRvIHNvcHJhLCBlIGlsIGZpbGUgZGFsIHJlYWRlciBwcmluY2lwYWxlXHJcbiAgICAgKi9cclxuICAgIGltYWdlQ29tcHJlc3Npb24oZmlsZSwgb3B0aW9ucykudGhlbigoZmlsZUNvbXByZXNzZWQpID0+IHtcclxuICAgICAgbGV0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICAgICAgLy9GYWNjaW8gbGEgcHVzaCBkaSBvZ25pIGZpbGUgYWxsJ2ludGVybm8gZGVsbCdhcnJheSBkaSBmaWxlIGRlbGwnaXRlbSBkYSBtYW5kYXJlIGFsIHNlcnZlclxyXG4gICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgcmVzdWx0UmVhZGVyID0gPHN0cmluZz5maWxlUmVhZGVyLnJlc3VsdDtcclxuICAgICAgICB2YXIgbWFya2VyID0gXCI7YmFzZTY0LFwiO1xyXG4gICAgICAgIHNlbGYubmV3QXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCA9IHJlc3VsdFJlYWRlci5zdWJzdHJpbmcocmVzdWx0UmVhZGVyLmluZGV4T2YobWFya2VyKSArIG1hcmtlci5sZW5ndGgpO1xyXG4gICAgICAgIHNlbGYuc2hvd0Nyb3BJbWFnZSA9IGZhbHNlO1xyXG4gICAgICAgIHNlbGYubmV3QXR0YWNobWVudEZvcm0uZW5hYmxlKCk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZUNvbXByZXNzZWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjb25maXJtQ3JvcCgpIHtcclxuICAgIHRoaXMuaW1hZ2VDcm9wcGVyLmNyb3AoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFubnVsbGEgbGEgc2VsZXppb25lIGRlbCBmaWxlLCBzdnVvdGFuZG8gbCdpbnB1dCBlIHJlc2V0dGFuZG8gdHV0dGUgbGUgcHJvcHJpZXTDoCBkZWxsJ0lBdHRhY2htZW50RFRPXHJcbiAgICovXHJcbiAgYWJvcnRGaWxlKCkge1xyXG4gICAgdGhpcy5pbWFnZUNoYW5nZWRFdmVudCA9IFwiXCI7XHJcbiAgICBpZiAodGhpcy5pbWFnZUlucHV0KSB0aGlzLmltYWdlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9IFwiXCI7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBudWxsO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gbnVsbDtcclxuICAgIHRoaXMuc2hvd0Nyb3BJbWFnZSA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMubmV3QXR0YWNobWVudC5Jc0ltYWdlID0gZmFsc2U7XHJcbiAgICB0aGlzLm5ld0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgPSBudWxsO1xyXG4gICAgdGhpcy5uZXdBdHRhY2htZW50LkZpbGVOYW1lID0gbnVsbDtcclxuICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlRXh0ZW5zaW9uID0gbnVsbDtcclxuICAgIHRoaXMubmV3QXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgPSBudWxsO1xyXG5cclxuICAgIHRoaXMubmV3TXVsdGlwbGVBdHRhY2htZW50cyA9IG5ldyBBcnJheTxJQXR0YWNobWVudERUTz4oKTtcclxuXHJcbiAgICB0aGlzLmN1c3RvbUhlaWdodCA9IG51bGw7XHJcbiAgICB0aGlzLmN1c3RvbVdpZHRoID0gbnVsbDtcclxuICAgIHRoaXMub3JpZ2luYWxIZWlnaHQgPSBudWxsO1xyXG4gICAgdGhpcy5vcmlnaW5hbFdpZHRoID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG59XHJcbiJdfQ==