@eqproject/eqp-dynamic-module 2.10.65 → 2.10.67

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/esm2020/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.mjs +33 -16
  2. package/esm2020/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.mjs +656 -32
  3. package/esm2020/lib/components/private/action-button-creator/action-button-creator.component.mjs +2 -2
  4. package/esm2020/lib/components/private/add-form-field/add-form-field.component.mjs +809 -15
  5. package/esm2020/lib/components/private/dynamic-module-field-fix/dynamic-module-field.component.mjs +1 -1
  6. package/esm2020/lib/components/private/field-templates/action-button-field-template/action-button-field-template.component.mjs +98 -20
  7. package/esm2020/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.mjs +132 -69
  8. package/esm2020/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.mjs +159 -24
  9. package/esm2020/lib/components/private/field-templates/date-field-template/date-field-template.component.mjs +152 -7
  10. package/esm2020/lib/components/private/field-templates/image-field-selector-template/image-field-selector-template.component.mjs +180 -39
  11. package/esm2020/lib/components/private/field-templates/image-field-template/image-field-template.component.mjs +100 -78
  12. package/esm2020/lib/components/private/field-templates/image-with-markers-field-template/image-with-markers-field-template.component.mjs +103 -88
  13. package/esm2020/lib/components/private/field-templates/label-field-template/label-field-template.component.mjs +90 -17
  14. package/esm2020/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.mjs +217 -54
  15. package/esm2020/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.mjs +220 -37
  16. package/esm2020/lib/components/private/field-templates/text-field-template/text-field-template.component.mjs +263 -29
  17. package/esm2020/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.mjs +210 -18
  18. package/esm2020/lib/components/private/form-records/add-form-record/add-form-record.component.mjs +33 -13
  19. package/esm2020/lib/components/private/form-records/hlist-form-record/hlist-form-record.component.mjs +1 -1
  20. package/esm2020/lib/components/private/form-records/list-view-form-record/list-view-form-record.component.mjs +1 -1
  21. package/esm2020/lib/components/private/form-records/list-view-form-record/single-record/single-record.component.mjs +1 -1
  22. package/esm2020/lib/components/private/form-statistics/filter-templates/date-filter-template/date-filter-template.component.mjs +1 -1
  23. package/esm2020/lib/components/private/graphs/graphs.component.mjs +1 -1
  24. package/esm2020/lib/components/private/tmw-image-marker/tmw-image-marker.component.mjs +4 -3
  25. package/esm2020/lib/components/private/trigger-creator/trigger-creator.component.mjs +2 -2
  26. package/esm2020/lib/components/private/trigger-creator/trigger-templates/date-trigger-template/date-trigger-template.component.mjs +1 -1
  27. package/esm2020/lib/models/endPointConfiguration.model.mjs +7 -2
  28. package/esm2020/lib/models/fields/actionButton.model.mjs +3 -1
  29. package/esm2020/lib/models/fields/attachmentField.model.mjs +3 -1
  30. package/esm2020/lib/models/fields/booleanField.model.mjs +3 -1
  31. package/esm2020/lib/models/fields/dateField.model.mjs +6 -4
  32. package/esm2020/lib/models/fields/imageField.model.mjs +3 -1
  33. package/esm2020/lib/models/fields/imageSelectorField.model.mjs +3 -1
  34. package/esm2020/lib/models/fields/imageWithMarkersField.model.mjs +3 -1
  35. package/esm2020/lib/models/fields/labelField.model.mjs +3 -1
  36. package/esm2020/lib/models/fields/listValueField.model.mjs +3 -1
  37. package/esm2020/lib/models/fields/numericField.model.mjs +8 -1
  38. package/esm2020/lib/models/fields/textField.model.mjs +3 -1
  39. package/esm2020/lib/models/fields/textareaField.model.mjs +8 -1
  40. package/esm2020/lib/models/form.model.mjs +1 -1
  41. package/fesm2015/eqproject-eqp-dynamic-module.mjs +3540 -535
  42. package/fesm2015/eqproject-eqp-dynamic-module.mjs.map +1 -1
  43. package/fesm2020/eqproject-eqp-dynamic-module.mjs +3459 -547
  44. package/fesm2020/eqproject-eqp-dynamic-module.mjs.map +1 -1
  45. package/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.d.ts +5 -1
  46. package/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.d.ts +74 -6
  47. package/lib/components/private/add-form-field/add-form-field.component.d.ts +208 -1
  48. package/lib/components/private/field-templates/action-button-field-template/action-button-field-template.component.d.ts +16 -10
  49. package/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.d.ts +17 -33
  50. package/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.d.ts +24 -11
  51. package/lib/components/private/field-templates/date-field-template/date-field-template.component.d.ts +21 -4
  52. package/lib/components/private/field-templates/image-field-selector-template/image-field-selector-template.component.d.ts +20 -16
  53. package/lib/components/private/field-templates/image-field-template/image-field-template.component.d.ts +15 -36
  54. package/lib/components/private/field-templates/image-with-markers-field-template/image-with-markers-field-template.component.d.ts +16 -37
  55. package/lib/components/private/field-templates/label-field-template/label-field-template.component.d.ts +16 -12
  56. package/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.d.ts +21 -28
  57. package/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.d.ts +25 -18
  58. package/lib/components/private/field-templates/text-field-template/text-field-template.component.d.ts +38 -10
  59. package/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.d.ts +26 -12
  60. package/lib/components/private/form-records/add-form-record/add-form-record.component.d.ts +12 -2
  61. package/lib/models/endPointConfiguration.model.d.ts +1 -0
  62. package/lib/models/fields/actionButton.model.d.ts +12 -0
  63. package/lib/models/fields/attachmentField.model.d.ts +31 -3
  64. package/lib/models/fields/booleanField.model.d.ts +15 -0
  65. package/lib/models/fields/dateField.model.d.ts +49 -3
  66. package/lib/models/fields/imageField.model.d.ts +9 -0
  67. package/lib/models/fields/imageSelectorField.model.d.ts +23 -0
  68. package/lib/models/fields/imageWithMarkersField.model.d.ts +9 -0
  69. package/lib/models/fields/labelField.model.d.ts +5 -0
  70. package/lib/models/fields/listValueField.model.d.ts +38 -0
  71. package/lib/models/fields/numericField.model.d.ts +34 -0
  72. package/lib/models/fields/textField.model.d.ts +33 -0
  73. package/lib/models/fields/textareaField.model.d.ts +39 -0
  74. package/lib/models/form.model.d.ts +6 -0
  75. package/package.json +3 -3
@@ -8,24 +8,29 @@ import * as i1 from "@angular/material/dialog";
8
8
  import * as i2 from "../../../../services/utilityHelper.services";
9
9
  import * as i3 from "@angular/common";
10
10
  import * as i4 from "../../tmw-image-marker/tmw-image-marker.component";
11
- /**
12
- * Metodo per recuperare, a partire da un Blob, la stringa contenente il base64 del file.
13
- * Usato per prendere il base64 dell'immagine dopo che l'utente ci ha disegnato sopra.
14
- * @param file Blob che rappresenta l'immagine.
15
- */
16
11
  const toBase64 = file => new Promise((resolve, reject) => {
17
12
  const reader = new FileReader();
18
13
  reader.readAsDataURL(file);
19
14
  reader.onload = () => resolve(reader.result.toString());
20
15
  reader.onerror = error => reject(error);
21
16
  });
17
+ const ELEMENT_SELECTORS = {
18
+ Container: ' .imageContainer',
19
+ Descrizione: ' .image-label',
20
+ BottoneMarca: ' .markButton button.btn',
21
+ };
22
+ const ELEMENTS = Object.keys(ELEMENT_SELECTORS);
23
+ const STATES = ['Normale', 'Mouseover'];
24
+ const DEFAULT_FIELD_STYLES = {};
22
25
  export class ImageWithMarkersFieldTemplateComponent {
23
- //#endregion
24
- constructor(dialog, utilityHelperService) {
26
+ constructor(dialog, utilityHelperService, renderer) {
25
27
  this.dialog = dialog;
26
28
  this.utilityHelperService = utilityHelperService;
29
+ this.renderer = renderer;
27
30
  this.formulaObject = {};
28
31
  this.inConfig = false;
32
+ this.styleVersion = 0;
33
+ this.forceState = null;
29
34
  this.recordChange = new EventEmitter();
30
35
  this.imageMark = new EventEmitter();
31
36
  this.imageWidth = 0;
@@ -34,12 +39,19 @@ export class ImageWithMarkersFieldTemplateComponent {
34
39
  this.MarkFileBase64 = "";
35
40
  this.FileDataBase64 = "";
36
41
  this.extraJSON = null;
37
- //preLoadedImageMetadataFormGroup: UntypedFormGroup;
38
- //#region Proprietà per configurare il componente ngx-image-Marking e aprire il relativo dialog.
39
42
  this.width = null;
40
43
  this.height = null;
44
+ this.styleEl = null;
41
45
  }
42
46
  ngOnInit() {
47
+ this.fieldUid = 'iwm-' + Math.random().toString(36).slice(2, 10);
48
+ this.injectStyles();
49
+ // In anteprima configuratore senza un'immagine reale: non caricare DynAttachment
50
+ if (this.inConfig && !this.field.DynAttachment) {
51
+ this.imageWidth = 200;
52
+ this.updateField();
53
+ return;
54
+ }
43
55
  if (this.record[this.field.Name] == null || this.record[this.field.Name] == 0) {
44
56
  this.FileDataBase64 = this.field.DynAttachment.FileDataBase64;
45
57
  this.imageWidth = (this.field.DynAttachment.ResizedImageHeightPx / this.field.DynAttachment.ImageHeightPx * this.field.DynAttachment.ImageWidthPx) + 50;
@@ -66,30 +78,81 @@ export class ImageWithMarkersFieldTemplateComponent {
66
78
  this.AttachmentID = this.field.DynAttachment.ID;
67
79
  }
68
80
  this.recordChange.emit(this.record);
69
- // Clono l'attachment originale, gli cambio il FileBase e gli azzero l'ID
70
- // this.imageMarkAttachment.FileName = "";
71
- // this.imageMarkAttachment.FilePath = "";
72
81
  this.imageMark.emit(this.imageMarkAttachment);
73
82
  this.updateField();
74
83
  }
75
84
  ngOnChanges(changes) {
76
- // Se viene modificato il valore di "ngModelInput" allora aggiorna l'input
85
+ if (changes['styleVersion'] && !changes['styleVersion'].firstChange) {
86
+ this.injectStyles();
87
+ this.updateStateClasses();
88
+ }
89
+ if (changes['forceState']) {
90
+ this.updateStateClasses();
91
+ }
77
92
  if (changes['record'] != undefined && changes['record'].firstChange == false && JSON.stringify(changes['record'].currentValue) != JSON.stringify(changes['record'].previousValue)) {
78
93
  this.record = changes['record'].currentValue;
79
94
  this.updateField();
80
95
  }
81
96
  }
82
- // updateMetadataValidity() {
83
- // if (this.preLoadedImageMetadataFormGroup.invalid) {
84
- // this.field.FormFormGroup.controls[this.field.Name].setErrors({ 'incorrect': true });
85
- // } else {
86
- // this.field.FormFormGroup.controls[this.field.Name].setErrors(null);
87
- // }
88
- // this.onRecordValueChange();
89
- // }
90
- /**
91
- * Metodo per aggiornare il valore del campo quando questo è rappresentato da una formula.
92
- */
97
+ ngOnDestroy() {
98
+ if (this.styleEl?.parentNode) {
99
+ this.styleEl.parentNode.removeChild(this.styleEl);
100
+ }
101
+ }
102
+ injectStyles() {
103
+ if (!this.fieldUid)
104
+ return;
105
+ const css = this.field?.ImageWithMarkersFieldStyleCSS ?? {};
106
+ const rules = this.buildCssRules(this.fieldUid, css);
107
+ if (!this.styleEl) {
108
+ this.styleEl = this.renderer.createElement('style');
109
+ this.styleEl.id = 'style-' + this.fieldUid;
110
+ this.renderer.appendChild(document.head, this.styleEl);
111
+ }
112
+ this.styleEl.textContent = rules;
113
+ }
114
+ getSelector(uid, state, s) {
115
+ switch (state) {
116
+ case 'Normale': return `#${uid}${s}`;
117
+ case 'Mouseover': return `#${uid}:hover${s}, #${uid}.eqp-state-hover${s}`;
118
+ default: return null;
119
+ }
120
+ }
121
+ buildCssRules(uid, css) {
122
+ const lines = [];
123
+ for (const el of ELEMENTS) {
124
+ const s = ELEMENT_SELECTORS[el];
125
+ for (const state of STATES) {
126
+ const key = el + state;
127
+ const defaultVal = DEFAULT_FIELD_STYLES[key];
128
+ const userVal = css[key];
129
+ if (!defaultVal?.trim() && !userVal?.trim())
130
+ continue;
131
+ const selector = this.getSelector(uid, state, s);
132
+ if (!selector)
133
+ continue;
134
+ if (defaultVal?.trim())
135
+ lines.push(`${selector} { ${defaultVal} }`);
136
+ if (userVal?.trim())
137
+ lines.push(`${selector} { ${userVal} }`);
138
+ }
139
+ }
140
+ return lines.join('\n');
141
+ }
142
+ updateStateClasses() {
143
+ if (!this.fieldUid)
144
+ return;
145
+ const wrapper = document.getElementById(this.fieldUid);
146
+ if (!wrapper)
147
+ return;
148
+ this.toggleClass(wrapper, 'eqp-state-hover', this.forceState === 'Mouseover');
149
+ }
150
+ toggleClass(el, cls, condition) {
151
+ if (condition)
152
+ this.renderer.addClass(el, cls);
153
+ else
154
+ this.renderer.removeClass(el, cls);
155
+ }
93
156
  updateField() {
94
157
  if ((this.field.DataGetter.DataGetterType == DataGetterTypeEnum.Manuale || this.field.DataGetter.DataGetterType == DataGetterTypeEnum.Formula) && this.field.Formula) {
95
158
  this.record[this.field.Name] = UtilityHelperService.EvaluateFieldFormula(this.field.Formula, this.record, this.formulaObject);
@@ -101,39 +164,14 @@ export class ImageWithMarkersFieldTemplateComponent {
101
164
  resetPreLoadedImage() {
102
165
  this.width = null;
103
166
  this.height = null;
104
- /*this.record[this.field.Name] = [JSON.parse(JSON.stringify(this.field.ContextualAttachment))];*/
105
167
  this.getImageDimensions();
106
168
  }
107
- /**
108
- * Metodo invocato quando vengono aggiunti o eliminati gli allegati nel componente AttachmentFieldTemplate.
109
- * Se l'ImageField è abilitato al disegno (EnableMarking == true), non permette allegati multipli (IsMulitAttach == false)
110
- * e nel Record corrente è presente l'immagine caricata dall'utente allora recupera le dimensioni dell'immagine e
111
- * apre il dialog con il componente image-Marking per permettere il disegno sull'immagine appena caricata.
112
- */
113
- onAttachmentsChange() {
114
- /*
115
- if (!this.field.AttachDefinition.IsMultiAttach && this.field.EnableMarking && this.record[this.field.Name] && this.record[this.field.Name][0]) {
116
- this.getImageDimensions();
117
- this.dialogImageDrowingRef = this.dialog.open(this.dialogImageDrowing, {
118
- disableClose: true,
119
- hasBackdrop: true,
120
- width: '75%'
121
- });
122
- }
123
- */
124
- }
125
- /**
126
- * Metodo invocato al salvataggio dell'immagine dal componente image-Marking.
127
- * Trasforma il Blob ricevuto in un base64, aggiorna il FileContetType e il FileDataBase64
128
- * dell'allegato caricato e chiude il dialog in cui disegnare.
129
- * @param MarknPicture Blob dell'immagine disegnata.
130
- */
169
+ onAttachmentsChange() { }
131
170
  async saveMark(markedImage) {
132
171
  let base64File = await toBase64(markedImage.image);
133
172
  if (base64File) {
134
173
  this.MarkFileBase64 = base64File.split(",")[1];
135
174
  this.FileDataBase64 = this.MarkFileBase64;
136
- // Clono l'attachment originale, gli cambio il FileBase e gli azzero l'ID
137
175
  this.imageMarkAttachment.FileDataBase64 = this.MarkFileBase64;
138
176
  this.imageMarkAttachment.ExtraJSON = JSON.stringify(markedImage.outmarkers);
139
177
  this.extraJSON = this.imageMarkAttachment.ExtraJSON;
@@ -143,19 +181,11 @@ export class ImageWithMarkersFieldTemplateComponent {
143
181
  this.closeDialog();
144
182
  }
145
183
  }
146
- /**
147
- * Metodo per chiudere il dialog in cui disegnare sull'immagine cariata e svuotare le dimensioni.
148
- */
149
184
  closeDialog() {
150
185
  this.dialogImageMarkingRef.close();
151
186
  this.width = null;
152
187
  this.height = null;
153
188
  }
154
- /**
155
- * Metodo per recuperare le dimensioni dell'immagine caricata per mostrare correttamente
156
- * il componente image-Marking. Se non viene eseguito questo passaggio l'area in cui disegnare
157
- * è più grande dell'immagine stessa e al salvataggio i tratti disegnati vengono spostati.
158
- */
159
189
  getImageDimensions() {
160
190
  var blob = this.getBlobFromBase64();
161
191
  const reader = new FileReader();
@@ -169,12 +199,6 @@ export class ImageWithMarkersFieldTemplateComponent {
169
199
  };
170
200
  reader.readAsDataURL(blob);
171
201
  }
172
- /**
173
- * Metodo per convertire il base64 di un'immagine in un Blob.
174
- * Necessario per il recupero delle dimensioni dell'immagine caricata a partire dal suo base64.
175
- * Viene eseguito solo nel caso in cui l'ImageField non ammette allegati multipli.
176
- * @returns Restituisce il Blob dell'immagine caricata.
177
- */
178
202
  getBlobFromBase64() {
179
203
  const byteCharacters = atob(this.record[this.field.Name][0].FileDataBase64);
180
204
  const byteNumbers = new Array(byteCharacters.length);
@@ -184,9 +208,6 @@ export class ImageWithMarkersFieldTemplateComponent {
184
208
  const byteArray = new Uint8Array(byteNumbers);
185
209
  return new Blob([byteArray], { type: this.record[this.field.Name][0].FileContentType });
186
210
  }
187
- /**
188
- * Metodo per emettere l'evento che il valore del record è cambiato.
189
- */
190
211
  onRecordValueChange() {
191
212
  if (!this.field.Formula) {
192
213
  this.recordChange.emit(this.record);
@@ -197,9 +218,9 @@ export class ImageWithMarkersFieldTemplateComponent {
197
218
  disableClose: true,
198
219
  hasBackdrop: true,
199
220
  panelClass: 'image-modal',
200
- width: '75%',
201
- // maxHeight: '90%', tolto perchè la max rompe la dimensione giusta
202
- height: '90%'
221
+ width: '90vw',
222
+ height: '90vh',
223
+ maxWidth: '100vw',
203
224
  });
204
225
  if (this.AttachmentID != null && Number(this.AttachmentID) > 0) {
205
226
  this.load(this.AttachmentID, [ImageFolderEnum.Regular]);
@@ -211,32 +232,22 @@ export class ImageWithMarkersFieldTemplateComponent {
211
232
  }
212
233
  load(ID, Types) {
213
234
  this.MarkingLoaded = false;
214
- // preparo la versione corretta del form
215
235
  var dynamicModuleParams = [
216
- {
217
- ParamName: "AttachmentID",
218
- ParamValue: ID,
219
- ParamType: ParamTypeEnum["Query param"],
220
- },
221
- {
222
- ParamName: "Types",
223
- ParamValue: Types,
224
- ParamType: ParamTypeEnum["Query param"],
225
- },
236
+ { ParamName: "AttachmentID", ParamValue: ID, ParamType: ParamTypeEnum["Query param"] },
237
+ { ParamName: "Types", ParamValue: Types, ParamType: ParamTypeEnum["Query param"] },
226
238
  ];
227
239
  this.utilityHelperService.RunEndPointCall(this.endPointConfiguration.Forms.GetAttachmentWithBases64, dynamicModuleParams, (res) => {
228
240
  this.FileBase64 = res.FileBases64[ImageFolderEnum.Regular];
229
241
  this.MarkingLoaded = true;
230
- }, (err) => {
231
- });
242
+ }, (err) => { });
232
243
  }
233
244
  }
234
- ImageWithMarkersFieldTemplateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ImageWithMarkersFieldTemplateComponent, deps: [{ token: i1.MatDialog }, { token: i2.UtilityHelperService }], target: i0.ɵɵFactoryTarget.Component });
235
- ImageWithMarkersFieldTemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ImageWithMarkersFieldTemplateComponent, selector: "image-with-markers-field-template", inputs: { endPointConfiguration: "endPointConfiguration", record: "record", formulaObject: "formulaObject", field: "field", inConfig: "inConfig" }, outputs: { recordChange: "recordChange", imageMark: "imageMark" }, viewQueries: [{ propertyName: "dialogImageMarking", first: true, predicate: ["dialogImageMarking"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"row imageContainer\" style=\"width: {{imageWidth}}px;\">\r\n <div class=\"row\">\r\n <div class=\"col-12\">{{field.Description}}</div>\r\n <div class=\"col-12\">\r\n <img *ngIf=\"field.DynAttachment\"\r\n src=\"data:{{field.DynAttachment.FileContentType}};base64,{{FileDataBase64}}\"\r\n [height]=\"field.DynAttachment.ResizedImageHeightPx != null ? field.DynAttachment.ResizedImageHeightPx : 128\"\r\n class=\"singleImage\"\r\n >\r\n </div>\r\n <div class=\"col-12 drawButton\">\r\n <button class=\"btn btn-primary btn-w100\" (click)=\"openMark()\">Marca</button>\r\n </div>\r\n <div *ngIf=\"field.DynAttachment.ButtonKey != null && field.DynAttachment.ButtonKey != ''\" class=\"col-12 flex justify-content-around buttonkey\">\r\n <div>Etichetta</div><div>{{field.DynAttachment.ButtonKey}}</div>\r\n </div>\r\n <div *ngIf=\"field.DynAttachment.ButtonValue != null && field.DynAttachment.ButtonValue != ''\" class=\"col-12 flex justify-content-around buttonvalue\"> \r\n <div>Valore</div>\r\n <div>{{field.DynAttachment.ButtonValue}}</div>\r\n </div>\r\n </div> \r\n</div>\r\n\r\n<!-- DIALOG PER DISEGNARE SUL NUOVO ALLEGATO CARICATO -->\r\n<ng-template #dialogImageMarking>\r\n <div class=\"padder h-100\">\r\n <div class=\"row h-100\">\r\n <div class=\"col-sm-12 col-md-12 h-100\">\r\n <tmw-image-marker *ngIf=\"MarkingLoaded\"\r\n class=\" h-100\"\r\n [src]=\"'data:'+ field.DynAttachment.FileContentType + ';base64,'+ FileBase64\" \r\n [inConfig]=\"inConfig\" \r\n [savedMarkers]=\"extraJSON\"\r\n (save)=\"saveMark($event)\" \r\n (closeDialog)=\"closeDialog()\"\r\n [width]=\"field.DynAttachment.ImageWidthPx\" \r\n [height]=\"field.DynAttachment.ImageHeightPx\" \r\n >\r\n </tmw-image-marker>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: ["::ng-deep image-drawing>button{background-color:var(--primary)!important;color:#fff!important}.imageContainer .singleImage{margin-top:5px;display:block}.drawButton{margin:5px 0}.buttonkey{border-top:1px solid black;padding-top:10px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.TmwImageMarkerComponent, selector: "tmw-image-marker", inputs: ["src", "width", "height", "inConfig", "savedMarkers", "outputMimeType", "outputQuality", "forceSizeCanvas"], outputs: ["closeDialog", "save"] }] });
245
+ ImageWithMarkersFieldTemplateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ImageWithMarkersFieldTemplateComponent, deps: [{ token: i1.MatDialog }, { token: i2.UtilityHelperService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
246
+ ImageWithMarkersFieldTemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ImageWithMarkersFieldTemplateComponent, selector: "image-with-markers-field-template", inputs: { endPointConfiguration: "endPointConfiguration", record: "record", formulaObject: "formulaObject", field: "field", inConfig: "inConfig", styleVersion: "styleVersion", forceState: "forceState" }, outputs: { recordChange: "recordChange", imageMark: "imageMark" }, viewQueries: [{ propertyName: "dialogImageMarking", first: true, predicate: ["dialogImageMarking"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"{{fieldUid}}\">\r\n <div class=\"row imageContainer\">\r\n <div class=\"row\">\r\n <div class=\"col-12 image-label\">{{field.Description}}</div>\r\n <div class=\"col-12\">\r\n <img *ngIf=\"field.DynAttachment\"\r\n src=\"data:{{field.DynAttachment.FileContentType}};base64,{{FileDataBase64}}\"\r\n [height]=\"field.DynAttachment.ResizedImageHeightPx != null ? field.DynAttachment.ResizedImageHeightPx : 128\"\r\n class=\"singleImage\"\r\n >\r\n </div>\r\n <div class=\"col-12 markButton\">\r\n <button class=\"btn btn-primary btn-w100\" (click)=\"openMark()\">Marca</button>\r\n </div>\r\n <div *ngIf=\"field.DynAttachment.ButtonKey != null && field.DynAttachment.ButtonKey != ''\" class=\"col-12 flex justify-content-around buttonkey\">\r\n <div>Etichetta</div><div>{{field.DynAttachment.ButtonKey}}</div>\r\n </div>\r\n <div *ngIf=\"field.DynAttachment.ButtonValue != null && field.DynAttachment.ButtonValue != ''\" class=\"col-12 flex justify-content-around buttonvalue\">\r\n <div>Valore</div>\r\n <div>{{field.DynAttachment.ButtonValue}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- DIALOG PER MARCATURA -->\r\n<ng-template #dialogImageMarking>\r\n <tmw-image-marker *ngIf=\"MarkingLoaded\"\r\n [src]=\"'data:'+ field.DynAttachment.FileContentType + ';base64,'+ FileBase64\"\r\n [inConfig]=\"inConfig\"\r\n [savedMarkers]=\"extraJSON\"\r\n (save)=\"saveMark($event)\"\r\n (closeDialog)=\"closeDialog()\"\r\n [width]=\"field.DynAttachment.ImageWidthPx\"\r\n [height]=\"field.DynAttachment.ImageHeightPx\"\r\n >\r\n </tmw-image-marker>\r\n</ng-template>\r\n", styles: ["::ng-deep image-drawing>button{background-color:var(--primary)!important;color:#fff!important}.imageContainer .singleImage{margin-top:5px;display:block}.drawButton{margin:5px 0}.buttonkey{border-top:1px solid black;padding-top:10px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.TmwImageMarkerComponent, selector: "tmw-image-marker", inputs: ["src", "width", "height", "inConfig", "savedMarkers", "outputMimeType", "outputQuality", "forceSizeCanvas"], outputs: ["closeDialog", "save"] }] });
236
247
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ImageWithMarkersFieldTemplateComponent, decorators: [{
237
248
  type: Component,
238
- args: [{ selector: 'image-with-markers-field-template', template: "<div class=\"row imageContainer\" style=\"width: {{imageWidth}}px;\">\r\n <div class=\"row\">\r\n <div class=\"col-12\">{{field.Description}}</div>\r\n <div class=\"col-12\">\r\n <img *ngIf=\"field.DynAttachment\"\r\n src=\"data:{{field.DynAttachment.FileContentType}};base64,{{FileDataBase64}}\"\r\n [height]=\"field.DynAttachment.ResizedImageHeightPx != null ? field.DynAttachment.ResizedImageHeightPx : 128\"\r\n class=\"singleImage\"\r\n >\r\n </div>\r\n <div class=\"col-12 drawButton\">\r\n <button class=\"btn btn-primary btn-w100\" (click)=\"openMark()\">Marca</button>\r\n </div>\r\n <div *ngIf=\"field.DynAttachment.ButtonKey != null && field.DynAttachment.ButtonKey != ''\" class=\"col-12 flex justify-content-around buttonkey\">\r\n <div>Etichetta</div><div>{{field.DynAttachment.ButtonKey}}</div>\r\n </div>\r\n <div *ngIf=\"field.DynAttachment.ButtonValue != null && field.DynAttachment.ButtonValue != ''\" class=\"col-12 flex justify-content-around buttonvalue\"> \r\n <div>Valore</div>\r\n <div>{{field.DynAttachment.ButtonValue}}</div>\r\n </div>\r\n </div> \r\n</div>\r\n\r\n<!-- DIALOG PER DISEGNARE SUL NUOVO ALLEGATO CARICATO -->\r\n<ng-template #dialogImageMarking>\r\n <div class=\"padder h-100\">\r\n <div class=\"row h-100\">\r\n <div class=\"col-sm-12 col-md-12 h-100\">\r\n <tmw-image-marker *ngIf=\"MarkingLoaded\"\r\n class=\" h-100\"\r\n [src]=\"'data:'+ field.DynAttachment.FileContentType + ';base64,'+ FileBase64\" \r\n [inConfig]=\"inConfig\" \r\n [savedMarkers]=\"extraJSON\"\r\n (save)=\"saveMark($event)\" \r\n (closeDialog)=\"closeDialog()\"\r\n [width]=\"field.DynAttachment.ImageWidthPx\" \r\n [height]=\"field.DynAttachment.ImageHeightPx\" \r\n >\r\n </tmw-image-marker>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: ["::ng-deep image-drawing>button{background-color:var(--primary)!important;color:#fff!important}.imageContainer .singleImage{margin-top:5px;display:block}.drawButton{margin:5px 0}.buttonkey{border-top:1px solid black;padding-top:10px}\n"] }]
239
- }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.UtilityHelperService }]; }, propDecorators: { endPointConfiguration: [{
249
+ args: [{ selector: 'image-with-markers-field-template', template: "<div id=\"{{fieldUid}}\">\r\n <div class=\"row imageContainer\">\r\n <div class=\"row\">\r\n <div class=\"col-12 image-label\">{{field.Description}}</div>\r\n <div class=\"col-12\">\r\n <img *ngIf=\"field.DynAttachment\"\r\n src=\"data:{{field.DynAttachment.FileContentType}};base64,{{FileDataBase64}}\"\r\n [height]=\"field.DynAttachment.ResizedImageHeightPx != null ? field.DynAttachment.ResizedImageHeightPx : 128\"\r\n class=\"singleImage\"\r\n >\r\n </div>\r\n <div class=\"col-12 markButton\">\r\n <button class=\"btn btn-primary btn-w100\" (click)=\"openMark()\">Marca</button>\r\n </div>\r\n <div *ngIf=\"field.DynAttachment.ButtonKey != null && field.DynAttachment.ButtonKey != ''\" class=\"col-12 flex justify-content-around buttonkey\">\r\n <div>Etichetta</div><div>{{field.DynAttachment.ButtonKey}}</div>\r\n </div>\r\n <div *ngIf=\"field.DynAttachment.ButtonValue != null && field.DynAttachment.ButtonValue != ''\" class=\"col-12 flex justify-content-around buttonvalue\">\r\n <div>Valore</div>\r\n <div>{{field.DynAttachment.ButtonValue}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- DIALOG PER MARCATURA -->\r\n<ng-template #dialogImageMarking>\r\n <tmw-image-marker *ngIf=\"MarkingLoaded\"\r\n [src]=\"'data:'+ field.DynAttachment.FileContentType + ';base64,'+ FileBase64\"\r\n [inConfig]=\"inConfig\"\r\n [savedMarkers]=\"extraJSON\"\r\n (save)=\"saveMark($event)\"\r\n (closeDialog)=\"closeDialog()\"\r\n [width]=\"field.DynAttachment.ImageWidthPx\"\r\n [height]=\"field.DynAttachment.ImageHeightPx\"\r\n >\r\n </tmw-image-marker>\r\n</ng-template>\r\n", styles: ["::ng-deep image-drawing>button{background-color:var(--primary)!important;color:#fff!important}.imageContainer .singleImage{margin-top:5px;display:block}.drawButton{margin:5px 0}.buttonkey{border-top:1px solid black;padding-top:10px}\n"] }]
250
+ }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.UtilityHelperService }, { type: i0.Renderer2 }]; }, propDecorators: { endPointConfiguration: [{
240
251
  type: Input
241
252
  }], record: [{
242
253
  type: Input
@@ -246,6 +257,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
246
257
  type: Input
247
258
  }], inConfig: [{
248
259
  type: Input
260
+ }], styleVersion: [{
261
+ type: Input
262
+ }], forceState: [{
263
+ type: Input
249
264
  }], recordChange: [{
250
265
  type: Output
251
266
  }], imageMark: [{
@@ -254,4 +269,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
254
269
  type: ViewChild,
255
270
  args: ["dialogImageMarking", { static: true }]
256
271
  }] } });
257
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2Utd2l0aC1tYXJrZXJzLWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9maWVsZC10ZW1wbGF0ZXMvaW1hZ2Utd2l0aC1tYXJrZXJzLWZpZWxkLXRlbXBsYXRlL2ltYWdlLXdpdGgtbWFya2Vycy1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZmllbGQtdGVtcGxhdGVzL2ltYWdlLXdpdGgtbWFya2Vycy1maWVsZC10ZW1wbGF0ZS9pbWFnZS13aXRoLW1hcmtlcnMtZmllbGQtdGVtcGxhdGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQThCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqSSxPQUFPLEVBQWMsZUFBZSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFekYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFFbkYsT0FBTyxFQUF5QixhQUFhLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUl0RyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7O0FBRXhFOzs7O0dBSUc7QUFDSCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO0lBQy9ELE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7SUFDaEMsTUFBTSxDQUFDLGFB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O3NCQUFsQixNQUFNO2dCQXFCNEMsa0JBQWtCO3NCQUFwRSxTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBJbWFnZUZpZWxkLCBJbWFnZUZvbGRlckVudW0gfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvZmllbGRzL2ltYWdlRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBSZWNvcmQgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvcmVjb3JkLm1vZGVsJztcclxuaW1wb3J0IHsgVXRpbGl0eUhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy91dGlsaXR5SGVscGVyLnNlcnZpY2VzJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBFbmRQb2ludENvbmZpZ3VyYXRpb24sIFBhcmFtVHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvZW5kUG9pbnRDb25maWd1cmF0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgRHluQXR0YWNobWVudCB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9keW5BdHRhY2htZW50JztcclxuaW1wb3J0IHsgTWFya2VkSW1hZ2UgfSBmcm9tICcuLi8uLi90bXctaW1hZ2UtbWFya2VyL3Rtdy1pbWFnZS1tYXJrZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgSW1hZ2VXaXRoTWFya2Vyc0ZpZWxkIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2ZpZWxkcy9pbWFnZVdpdGhNYXJrZXJzRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBEYXRhR2V0dGVyVHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvYmFzZUZpZWxkLm1vZGVsJztcclxuXHJcbi8qKlxyXG4gKiBNZXRvZG8gcGVyIHJlY3VwZXJhcmUsIGEgcGFydGlyZSBkYSB1biBCbG9iLCBsYSBzdHJpbmdhIGNvbnRlbmVudGUgaWwgYmFzZTY0IGRlbCBmaWxlLlxyXG4gKiBVc2F0byBwZXIgcHJlbmRlcmUgaWwgYmFzZTY0IGRlbGwnaW1tYWdpbmUgZG9wbyBjaGUgbCd1dGVudGUgY2kgaGEgZGlzZWduYXRvIHNvcHJhLlxyXG4gKiBAcGFyYW0gZmlsZSBCbG9iIGNoZSByYXBwcmVzZW50YSBsJ2ltbWFnaW5lLlxyXG4gKi9cclxuY29uc3QgdG9CYXNlNjQgPSBmaWxlID0+IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUocmVhZGVyLnJlc3VsdC50b1N0cmluZygpKTtcclxuICByZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlamVjdChlcnJvcik7XHJcbn0pO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdpbWFnZS13aXRoLW1hcmtlcnMtZmllbGQtdGVtcGxhdGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9pbWFnZS13aXRoLW1hcmtlcnMtZmllbGQtdGVtcGxhdGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2ltYWdlLXdpdGgtbWFya2Vycy1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgSW1hZ2VXaXRoTWFya2Vyc0ZpZWxkVGVtcGxhdGVDb21wb25lbnQge1xyXG5cclxuICBASW5wdXQoKSBlbmRQb2ludENvbmZpZ3VyYXRpb246IEVuZFBvaW50Q29uZmlndXJhdGlvbjtcclxuICBASW5wdXQoKSByZWNvcmQ6IFJlY29yZDtcclxuICBASW5wdXQoKSBmb3JtdWxhT2JqZWN0OiBhbnkgPSB7fTtcclxuICBASW5wdXQoKSBmaWVsZDogSW1hZ2VXaXRoTWFya2Vyc0ZpZWxkO1xyXG4gIEBJbnB1dCgpIGluQ29uZmlnOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQE91dHB1dCgpIHJlY29yZENoYW5nZTogRXZlbnRFbWl0dGVyPFJlY29yZD4gPSBuZXcgRXZlbnRFbWl0dGVyPFJlY29yZD4oKTtcclxuICBAT3V0cHV0KCkgaW1hZ2VNYXJrOiBFdmVudEVtaXR0ZXI8RHluQXR0YWNobWVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPER5bkF0dGFjaG1lbnQ+KCk7XHJcblxyXG4gIGltYWdlV2lkdGg6IG51bWJlciA9IDA7XHJcbiAgTWFya2luZ0xvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEZpbGVCYXNlNjQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgTWFya0ZpbGVCYXNlNjQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgRmlsZURhdGFCYXNlNjQ6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIEF0dGFjaG1lbnRJRDogc3RyaW5nIHwgbnVtYmVyO1xyXG5cclxuICBpbWFnZU1hcmtBdHRhY2htZW50OiBEeW5BdHRhY2htZW50O1xyXG4gIGV4dHJhSlNPTjogc3RyaW5nID0gbnVsbDtcclxuICBcclxuXHJcbiAgLy9wcmVMb2FkZWRJbWFnZU1ldGFkYXRhRm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwO1xyXG5cclxuICAvLyNyZWdpb24gUHJvcHJpZXTDoCBwZXIgY29uZmlndXJhcmUgaWwgY29tcG9uZW50ZSBuZ3gtaW1hZ2UtTWFya2luZyBlIGFwcmlyZSBpbCByZWxhdGl2byBkaWFsb2cuXHJcbiAgcHVibGljIHdpZHRoID0gbnVsbDtcclxuICBwdWJsaWMgaGVpZ2h0ID0gbnVsbDtcclxuXHJcbiAgZGlhbG9nSW1hZ2VNYXJraW5nUmVmOiBNYXREaWFsb2dSZWY8VGVtcGxhdGVSZWY8YW55Pj47XHJcbiAgQFZpZXdDaGlsZChcImRpYWxvZ0ltYWdlTWFya2luZ1wiLCB7IHN0YXRpYzogdHJ1ZSB9KSBkaWFsb2dJbWFnZU1hcmtpbmc6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgdXRpbGl0eUhlbHBlclNlcnZpY2U6IFV0aWxpdHlIZWxwZXJTZXJ2aWNlXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gPT0gbnVsbCB8fCB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdID09IDApe1xyXG4gICAgICB0aGlzLkZpbGVEYXRhQmFzZTY0ID0gdGhpcy5maWVsZC5EeW5BdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0O1xyXG4gICAgICB0aGlzLmltYWdlV2lkdGggPSAgKHRoaXMuZmllbGQuRHluQXR0YWNobWVudC5SZXNpemVkSW1hZ2VIZWlnaHRQeCAvIHRoaXMuZmllbGQuRHluQXR0YWNobWVudC5JbWFnZUhlaWdodFB4ICogdGhpcy5maWVsZC5EeW5BdHRhY2htZW50LkltYWdlV2lkdGhQeCkgKyA1MDtcclxuICAgICAgdGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSA9IHRoaXMuZmllbGQuRHluQXR0YWNobWVudDtcclxuXHJcbiAgICAgIHRoaXMuaW1hZ2VNYXJrQXR0YWNobWVudCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5maWVsZC5EeW5BdHRhY2htZW50KSk7XHJcbiAgICAgIHRoaXMuaW1hZ2VNYXJrQXR0YWNobWVudC5JRCA9IDA7XHJcblxyXG4gICAgICB0aGlzLkF0dGFjaG1lbnRJRCA9IHRoaXMuZmllbGQuRHluQXR0YWNobWVudC5JRDsgXHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHR5cGVvZiB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdID09PSAnc3RyaW5nJyl7XHJcbiAgICAgICAgdGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSA9IEpTT04ucGFyc2UodGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pbWFnZVdpZHRoID0gICh0aGlzLmZpZWxkLkR5bkF0dGFjaG1lbnQuUmVzaXplZEltYWdlSGVpZ2h0UHggLyB0aGlzLmZpZWxkLkR5bkF0dGFjaG1lbnQuSW1hZ2VIZWlnaHRQeCAqIHRoaXMuZmllbGQuRHluQXR0YWNobWVudC5JbWFnZVdpZHRoUHgpICsgNTA7XHJcblxyXG4gICAgICBpZiAoKHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gYXMgRHluQXR0YWNobWVudCkuRmlsZUJhc2VzNjQgIT0gbnVsbCl7XHJcbiAgICAgICAgdGhpcy5GaWxlRGF0YUJhc2U2NCA9ICh0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdIGFzIER5bkF0dGFjaG1lbnQpLkZpbGVCYXNlczY0W0ltYWdlRm9sZGVyRW51bS5SZWd1bGFyXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLkZpbGVEYXRhQmFzZTY0ID0gKHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gYXMgRHluQXR0YWNobWVudCkuRmlsZURhdGFCYXNlNjQ7XHJcbiAgICAgIH0gICAgICBcclxuXHJcbiAgICAgICh0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdIGFzIER5bkF0dGFjaG1lbnQpLkZpbGVEYXRhQmFzZTY0ID0gdGhpcy5GaWxlRGF0YUJhc2U2NDtcclxuICAgICAgdGhpcy5leHRyYUpTT04gPSAodGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSBhcyBEeW5BdHRhY2htZW50KS5FeHRyYUpTT047XHJcblxyXG4gICAgICB0aGlzLmltYWdlTWFya0F0dGFjaG1lbnQgPSB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdO1xyXG4gICAgICB0aGlzLmltYWdlTWFya0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgPSB0aGlzLkZpbGVEYXRhQmFzZTY0O1xyXG5cclxuICAgICAgdGhpcy5BdHRhY2htZW50SUQgPSB0aGlzLmZpZWxkLkR5bkF0dGFjaG1lbnQuSUQ7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZWNvcmRDaGFuZ2UuZW1pdCh0aGlzLnJlY29yZCk7XHJcblxyXG5cclxuICAgIC8vIENsb25vIGwnYXR0YWNobWVudCBvcmlnaW5hbGUsIGdsaSBjYW1iaW8gaWwgRmlsZUJhc2UgZSBnbGkgYXp6ZXJvIGwnSURcclxuXHJcbiAgICAvLyB0aGlzLmltYWdlTWFya0F0dGFjaG1lbnQuRmlsZU5hbWUgPSBcIlwiO1xyXG4gICAgLy8gdGhpcy5pbWFnZU1hcmtBdHRhY2htZW50LkZpbGVQYXRoID0gXCJcIjtcclxuXHJcbiAgICB0aGlzLmltYWdlTWFyay5lbWl0KHRoaXMuaW1hZ2VNYXJrQXR0YWNobWVudCk7XHJcblxyXG5cclxuXHJcblxyXG5cclxuICAgIHRoaXMudXBkYXRlRmllbGQoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIC8vIFNlIHZpZW5lIG1vZGlmaWNhdG8gaWwgdmFsb3JlIGRpIFwibmdNb2RlbElucHV0XCIgYWxsb3JhIGFnZ2lvcm5hIGwnaW5wdXRcclxuICAgIGlmIChjaGFuZ2VzWydyZWNvcmQnXSAhPSB1bmRlZmluZWQgJiYgY2hhbmdlc1sncmVjb3JkJ10uZmlyc3RDaGFuZ2UgPT0gZmFsc2UgJiYgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1sncmVjb3JkJ10uY3VycmVudFZhbHVlKSAhPSBKU09OLnN0cmluZ2lmeShjaGFuZ2VzWydyZWNvcmQnXS5wcmV2aW91c1ZhbHVlKSkge1xyXG4gICAgICB0aGlzLnJlY29yZCA9IGNoYW5nZXNbJ3JlY29yZCddLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgdGhpcy51cGRhdGVGaWVsZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vIHVwZGF0ZU1ldGFkYXRhVmFsaWRpdHkoKSB7XHJcbiAgLy8gICBpZiAodGhpcy5wcmVMb2FkZWRJbWFnZU1ldGFkYXRhRm9ybUdyb3VwLmludmFsaWQpIHtcclxuICAvLyAgICAgdGhpcy5maWVsZC5Gb3JtRm9ybUdyb3VwLmNvbnRyb2xzW3RoaXMuZmllbGQuTmFtZV0uc2V0RXJyb3JzKHsgJ2luY29ycmVjdCc6IHRydWUgfSk7XHJcbiAgLy8gICB9IGVsc2Uge1xyXG4gIC8vICAgICB0aGlzLmZpZWxkLkZvcm1Gb3JtR3JvdXAuY29udHJvbHNbdGhpcy5maWVsZC5OYW1lXS5zZXRFcnJvcnMobnVsbCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICB0aGlzLm9uUmVjb3JkVmFsdWVDaGFuZ2UoKTtcclxuICAvLyB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGFnZ2lvcm5hcmUgaWwgdmFsb3JlIGRlbCBjYW1wbyBxdWFuZG8gcXVlc3RvIMOoIHJhcHByZXNlbnRhdG8gZGEgdW5hIGZvcm11bGEuXHJcbiAgICovXHJcbiAgdXBkYXRlRmllbGQoKSB7XHJcbiAgICBpZiAoKHRoaXMuZmllbGQuRGF0YUdldHRlci5EYXRhR2V0dGVyVHlwZSA9PSBEYXRhR2V0dGVyVHlwZUVudW0uTWFudWFsZSB8fCB0aGlzLmZpZWxkLkRhdGFHZXR0ZXIuRGF0YUdldHRlclR5cGUgPT0gRGF0YUdldHRlclR5cGVFbnVtLkZvcm11bGEpICYmIHRoaXMuZmllbGQuRm9ybXVsYSkge1xyXG4gICAgICB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdID0gVXRpbGl0eUhlbHBlclNlcnZpY2UuRXZhbHVhdGVGaWVsZEZvcm11bGEodGhpcy5maWVsZC5Gb3JtdWxhLCB0aGlzLnJlY29yZCwgdGhpcy5mb3JtdWxhT2JqZWN0KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZpZWxkLlZpc2libGVJZikge1xyXG4gICAgICB0aGlzLmZpZWxkLkluTGlzdFZpZXcgPSBVdGlsaXR5SGVscGVyU2VydmljZS5FdmFsdWF0ZUZpZWxkRm9ybXVsYSh0aGlzLmZpZWxkLlZpc2libGVJZiwgdGhpcy5yZWNvcmQsIHRoaXMuZm9ybXVsYU9iamVjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcmVzZXRQcmVMb2FkZWRJbWFnZSgpIHtcclxuICAgIHRoaXMud2lkdGggPSBudWxsO1xyXG4gICAgdGhpcy5oZWlnaHQgPSBudWxsO1xyXG4gICAgLyp0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdID0gW0pTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5maWVsZC5Db250ZXh0dWFsQXR0YWNobWVudCkpXTsqL1xyXG4gICAgdGhpcy5nZXRJbWFnZURpbWVuc2lvbnMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBpbnZvY2F0byBxdWFuZG8gdmVuZ29ubyBhZ2dpdW50aSBvIGVsaW1pbmF0aSBnbGkgYWxsZWdhdGkgbmVsIGNvbXBvbmVudGUgQXR0YWNobWVudEZpZWxkVGVtcGxhdGUuXHJcbiAgICogU2UgbCdJbWFnZUZpZWxkIMOoIGFiaWxpdGF0byBhbCBkaXNlZ25vIChFbmFibGVNYXJraW5nID09IHRydWUpLCBub24gcGVybWV0dGUgYWxsZWdhdGkgbXVsdGlwbGkgKElzTXVsaXRBdHRhY2ggPT0gZmFsc2UpXHJcbiAgICogZSBuZWwgUmVjb3JkIGNvcnJlbnRlIMOoIHByZXNlbnRlIGwnaW1tYWdpbmUgY2FyaWNhdGEgZGFsbCd1dGVudGUgYWxsb3JhIHJlY3VwZXJhIGxlIGRpbWVuc2lvbmkgZGVsbCdpbW1hZ2luZSBlXHJcbiAgICogYXByZSBpbCBkaWFsb2cgY29uIGlsIGNvbXBvbmVudGUgaW1hZ2UtTWFya2luZyBwZXIgcGVybWV0dGVyZSBpbCBkaXNlZ25vIHN1bGwnaW1tYWdpbmUgYXBwZW5hIGNhcmljYXRhLlxyXG4gICAqL1xyXG4gIG9uQXR0YWNobWVudHNDaGFuZ2UoKSB7XHJcbiAgICAvKlxyXG4gICAgaWYgKCF0aGlzLmZpZWxkLkF0dGFjaERlZmluaXRpb24uSXNNdWx0aUF0dGFjaCAmJiB0aGlzLmZpZWxkLkVuYWJsZU1hcmtpbmcgJiYgdGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSAmJiB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdWzBdKSB7XHJcbiAgICAgIHRoaXMuZ2V0SW1hZ2VEaW1lbnNpb25zKCk7XHJcbiAgICAgIHRoaXMuZGlhbG9nSW1hZ2VEcm93aW5nUmVmID0gdGhpcy5kaWFsb2cub3Blbih0aGlzLmRpYWxvZ0ltYWdlRHJvd2luZywge1xyXG4gICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcclxuICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcclxuICAgICAgICB3aWR0aDogJzc1JSdcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAqL1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIGludm9jYXRvIGFsIHNhbHZhdGFnZ2lvIGRlbGwnaW1tYWdpbmUgZGFsIGNvbXBvbmVudGUgaW1hZ2UtTWFya2luZy5cclxuICAgKiBUcmFzZm9ybWEgaWwgQmxvYiByaWNldnV0byBpbiB1biBiYXNlNjQsIGFnZ2lvcm5hIGlsIEZpbGVDb250ZXRUeXBlIGUgaWwgRmlsZURhdGFCYXNlNjRcclxuICAgKiBkZWxsJ2FsbGVnYXRvIGNhcmljYXRvIGUgY2hpdWRlIGlsIGRpYWxvZyBpbiBjdWkgZGlzZWduYXJlLlxyXG4gICAqIEBwYXJhbSBNYXJrblBpY3R1cmUgQmxvYiBkZWxsJ2ltbWFnaW5lIGRpc2VnbmF0YS5cclxuICAgKi9cclxuICBhc3luYyBzYXZlTWFyayhtYXJrZWRJbWFnZTogTWFya2VkSW1hZ2UpIHtcclxuICAgIGxldCBiYXNlNjRGaWxlID0gYXdhaXQgdG9CYXNlNjQobWFya2VkSW1hZ2UuaW1hZ2UpO1xyXG4gICAgaWYgKGJhc2U2NEZpbGUpIHtcclxuICAgICAgdGhpcy5NYXJrRmlsZUJhc2U2NCA9IGJhc2U2NEZpbGUuc3BsaXQoXCIsXCIpWzFdO1xyXG4gICAgICB0aGlzLkZpbGVEYXRhQmFzZTY0ID0gdGhpcy5NYXJrRmlsZUJhc2U2NDtcclxuXHJcbiAgICAgIC8vIENsb25vIGwnYXR0YWNobWVudCBvcmlnaW5hbGUsIGdsaSBjYW1iaW8gaWwgRmlsZUJhc2UgZSBnbGkgYXp6ZXJvIGwnSURcclxuICAgICAgdGhpcy5pbWFnZU1hcmtBdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0ID0gdGhpcy5NYXJrRmlsZUJhc2U2NDtcclxuICAgICAgdGhpcy5pbWFnZU1hcmtBdHRhY2htZW50LkV4dHJhSlNPTiA9IEpTT04uc3RyaW5naWZ5KG1hcmtlZEltYWdlLm91dG1hcmtlcnMpO1xyXG4gICAgICB0aGlzLmV4dHJhSlNPTiA9IHRoaXMuaW1hZ2VNYXJrQXR0YWNobWVudC5FeHRyYUpTT047XHJcblxyXG4gICAgICB0aGlzLmltYWdlTWFyay5lbWl0KHRoaXMuaW1hZ2VNYXJrQXR0YWNobWVudCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRpYWxvZ0ltYWdlTWFya2luZ1JlZikge1xyXG4gICAgICB0aGlzLmNsb3NlRGlhbG9nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGNoaXVkZXJlIGlsIGRpYWxvZyBpbiBjdWkgZGlzZWduYXJlIHN1bGwnaW1tYWdpbmUgY2FyaWF0YSBlIHN2dW90YXJlIGxlIGRpbWVuc2lvbmkuXHJcbiAgICovXHJcbiAgY2xvc2VEaWFsb2coKSB7XHJcbiAgICB0aGlzLmRpYWxvZ0ltYWdlTWFya2luZ1JlZi5jbG9zZSgpO1xyXG4gICAgdGhpcy53aWR0aCA9IG51bGw7XHJcbiAgICB0aGlzLmhlaWdodCA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIHJlY3VwZXJhcmUgbGUgZGltZW5zaW9uaSBkZWxsJ2ltbWFnaW5lIGNhcmljYXRhIHBlciBtb3N0cmFyZSBjb3JyZXR0YW1lbnRlXHJcbiAgICogaWwgY29tcG9uZW50ZSBpbWFnZS1NYXJraW5nLiBTZSBub24gdmllbmUgZXNlZ3VpdG8gcXVlc3RvIHBhc3NhZ2dpbyBsJ2FyZWEgaW4gY3VpIGRpc2VnbmFyZSBcclxuICAgKiDDqCBwacO5IGdyYW5kZSBkZWxsJ2ltbWFnaW5lIHN0ZXNzYSBlIGFsIHNhbHZhdGFnZ2lvIGkgdHJhdHRpIGRpc2VnbmF0aSB2ZW5nb25vIHNwb3N0YXRpLiBcclxuICAgKi9cclxuICBwcml2YXRlIGdldEltYWdlRGltZW5zaW9ucygpIHtcclxuICAgIHZhciBibG9iOiBCbG9iID0gdGhpcy5nZXRCbG9iRnJvbUJhc2U2NCgpO1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XHJcbiAgICAgIGltYWdlLnNyYyA9IGUudGFyZ2V0LnJlc3VsdDtcclxuICAgICAgaW1hZ2Uub25sb2FkID0gcnMgPT4ge1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gcnMuY3VycmVudFRhcmdldFsnaGVpZ2h0J107XHJcbiAgICAgICAgdGhpcy53aWR0aCA9IHJzLmN1cnJlbnRUYXJnZXRbJ3dpZHRoJ107XHJcbiAgICAgIH07XHJcbiAgICB9O1xyXG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGNvbnZlcnRpcmUgaWwgYmFzZTY0IGRpIHVuJ2ltbWFnaW5lIGluIHVuIEJsb2IuXHJcbiAgICogTmVjZXNzYXJpbyBwZXIgaWwgcmVjdXBlcm8gZGVsbGUgZGltZW5zaW9uaSBkZWxsJ2ltbWFnaW5lIGNhcmljYXRhIGEgcGFydGlyZSBkYWwgc3VvIGJhc2U2NC5cclxuICAgKiBWaWVuZSBlc2VndWl0byBzb2xvIG5lbCBjYXNvIGluIGN1aSBsJ0ltYWdlRmllbGQgbm9uIGFtbWV0dGUgYWxsZWdhdGkgbXVsdGlwbGkuXHJcbiAgICogQHJldHVybnMgUmVzdGl0dWlzY2UgaWwgQmxvYiBkZWxsJ2ltbWFnaW5lIGNhcmljYXRhLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0QmxvYkZyb21CYXNlNjQoKSB7XHJcbiAgICBjb25zdCBieXRlQ2hhcmFjdGVycyA9IGF0b2IodGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXVswXS5GaWxlRGF0YUJhc2U2NCk7XHJcbiAgICBjb25zdCBieXRlTnVtYmVycyA9IG5ldyBBcnJheShieXRlQ2hhcmFjdGVycy5sZW5ndGgpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlQ2hhcmFjdGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBieXRlTnVtYmVyc1tpXSA9IGJ5dGVDaGFyYWN0ZXJzLmNoYXJDb2RlQXQoaSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBieXRlQXJyYXkgPSBuZXcgVWludDhBcnJheShieXRlTnVtYmVycyk7XHJcbiAgICByZXR1cm4gbmV3IEJsb2IoW2J5dGVBcnJheV0sIHsgdHlwZTogdGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXVswXS5GaWxlQ29udGVudFR5cGUgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGVtZXR0ZXJlIGwnZXZlbnRvIGNoZSBpbCB2YWxvcmUgZGVsIHJlY29yZCDDqCBjYW1iaWF0by5cclxuICAgKi9cclxuICBwcml2YXRlIG9uUmVjb3JkVmFsdWVDaGFuZ2UoKSB7XHJcbiAgICBpZiAoIXRoaXMuZmllbGQuRm9ybXVsYSkge1xyXG4gICAgICB0aGlzLnJlY29yZENoYW5nZS5lbWl0KHRoaXMucmVjb3JkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvcGVuTWFyaygpe1xyXG4gICAgdGhpcy5kaWFsb2dJbWFnZU1hcmtpbmdSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMuZGlhbG9nSW1hZ2VNYXJraW5nLCB7XHJcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcclxuICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXHJcbiAgICAgIHBhbmVsQ2xhc3M6ICdpbWFnZS1tb2RhbCcsXHJcbiAgICAgIHdpZHRoOiAnNzUlJyxcclxuICAgICAgLy8gbWF4SGVpZ2h0OiAnOTAlJywgdG9sdG8gcGVyY2jDqCBsYSBtYXggcm9tcGUgbGEgZGltZW5zaW9uZSBnaXVzdGFcclxuICAgICAgaGVpZ2h0Oic5MCUnXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5BdHRhY2htZW50SUQgIT0gbnVsbCAmJiBOdW1iZXIodGhpcy5BdHRhY2htZW50SUQpID4gMCl7XHJcbiAgICAgIHRoaXMubG9hZCh0aGlzLkF0dGFjaG1lbnRJRCxbSW1hZ2VGb2xkZXJFbnVtLlJlZ3VsYXJdKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuRmlsZUJhc2U2NCA9IHRoaXMuRmlsZURhdGFCYXNlNjQ7XHJcbiAgICAgIHRoaXMuTWFya2luZ0xvYWRlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgbG9hZChJRCxUeXBlcyl7XHJcblxyXG4gICAgdGhpcy5NYXJraW5nTG9hZGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAvLyBwcmVwYXJvIGxhIHZlcnNpb25lIGNvcnJldHRhIGRlbCBmb3JtXHJcbiAgICAgIHZhciBkeW5hbWljTW9kdWxlUGFyYW1zID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIFBhcmFtTmFtZTogXCJBdHRhY2htZW50SURcIixcclxuICAgICAgICAgIFBhcmFtVmFsdWU6IElELFxyXG4gICAgICAgICAgUGFyYW1UeXBlOiBQYXJhbVR5cGVFbnVtW1wiUXVlcnkgcGFyYW1cIl0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBQYXJhbU5hbWU6IFwiVHlwZXNcIixcclxuICAgICAgICAgIFBhcmFtVmFsdWU6IFR5cGVzLFxyXG4gICAgICAgICAgUGFyYW1UeXBlOiBQYXJhbVR5cGVFbnVtW1wiUXVlcnkgcGFyYW1cIl0sXHJcbiAgICAgICAgfSxcclxuICAgICAgXTsgICAgXHJcbiAgICAgIFxyXG4gICAgdGhpcy51dGlsaXR5SGVscGVyU2VydmljZS5SdW5FbmRQb2ludENhbGwoXHJcbiAgICAgIHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uLkZvcm1zLkdldEF0dGFjaG1lbnRXaXRoQmFzZXM2NCxcclxuICAgICAgZHluYW1pY01vZHVsZVBhcmFtcyxcclxuICAgICAgKHJlczogRHluQXR0YWNobWVudCkgPT4ge1xyXG5cclxuICAgICAgICB0aGlzLkZpbGVCYXNlNjQgPSByZXMuRmlsZUJhc2VzNjRbSW1hZ2VGb2xkZXJFbnVtLlJlZ3VsYXJdO1xyXG4gICAgICAgIHRoaXMuTWFya2luZ0xvYWRlZCA9IHRydWU7XHJcblxyXG4gICAgICB9LFxyXG4gICAgICAoZXJyKSA9PiB7XHJcblxyXG4gICAgICB9XHJcbiAgICApOyAgICBcclxuICB9XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJyb3cgaW1hZ2VDb250YWluZXJcIiBzdHlsZT1cIndpZHRoOiB7e2ltYWdlV2lkdGh9fXB4O1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj57e2ZpZWxkLkRlc2NyaXB0aW9ufX08L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgICAgPGltZyAqbmdJZj1cImZpZWxkLkR5bkF0dGFjaG1lbnRcIlxyXG4gICAgICAgIHNyYz1cImRhdGE6e3tmaWVsZC5EeW5BdHRhY2htZW50LkZpbGVDb250ZW50VHlwZX19O2Jhc2U2NCx7e0ZpbGVEYXRhQmFzZTY0fX1cIlxyXG4gICAgICAgIFtoZWlnaHRdPVwiZmllbGQuRHluQXR0YWNobWVudC5SZXNpemVkSW1hZ2VIZWlnaHRQeCAhPSBudWxsID8gZmllbGQuRHluQXR0YWNobWVudC5SZXNpemVkSW1hZ2VIZWlnaHRQeCA6IDEyOFwiXHJcbiAgICAgICAgY2xhc3M9XCJzaW5nbGVJbWFnZVwiXHJcbiAgICAgID5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMiBkcmF3QnV0dG9uXCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXcxMDBcIiAoY2xpY2spPVwib3Blbk1hcmsoKVwiPk1hcmNhPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCJmaWVsZC5EeW5BdHRhY2htZW50LkJ1dHRvbktleSAhPSBudWxsICYmIGZpZWxkLkR5bkF0dGFjaG1lbnQuQnV0dG9uS2V5ICE9ICcnXCIgY2xhc3M9XCJjb2wtMTIgZmxleCBqdXN0aWZ5LWNvbnRlbnQtYXJvdW5kIGJ1dHRvbmtleVwiPlxyXG4gICAgICA8ZGl2PkV0aWNoZXR0YTwvZGl2PjxkaXY+e3tmaWVsZC5EeW5BdHRhY2htZW50LkJ1dHRvbktleX19PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCJmaWVsZC5EeW5BdHRhY2htZW50LkJ1dHRvblZhbHVlICE9IG51bGwgJiYgZmllbGQuRHluQXR0YWNobWVudC5CdXR0b25WYWx1ZSAhPSAnJ1wiIGNsYXNzPVwiY29sLTEyIGZsZXgganVzdGlmeS1jb250ZW50LWFyb3VuZCBidXR0b252YWx1ZVwiPiBcclxuICAgICAgPGRpdj5WYWxvcmU8L2Rpdj5cclxuICAgICAgPGRpdj57e2ZpZWxkLkR5bkF0dGFjaG1lbnQuQnV0dG9uVmFsdWV9fTwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+ICAgXHJcbjwvZGl2PlxyXG5cclxuPCEtLSBESUFMT0cgUEVSIERJU0VHTkFSRSBTVUwgTlVPVk8gQUxMRUdBVE8gQ0FSSUNBVE8gLS0+XHJcbjxuZy10ZW1wbGF0ZSAjZGlhbG9nSW1hZ2VNYXJraW5nPlxyXG4gIDxkaXYgY2xhc3M9XCJwYWRkZXIgaC0xMDBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgaC0xMDBcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMiBjb2wtbWQtMTIgaC0xMDBcIj5cclxuICAgICAgICA8dG13LWltYWdlLW1hcmtlciAqbmdJZj1cIk1hcmtpbmdMb2FkZWRcIlxyXG4gICAgICAgICAgY2xhc3M9XCIgaC0xMDBcIlxyXG4gICAgICAgICAgW3NyY109XCInZGF0YTonKyBmaWVsZC5EeW5BdHRhY2htZW50LkZpbGVDb250ZW50VHlwZSArICc7YmFzZTY0LCcrIEZpbGVCYXNlNjRcIiBcclxuICAgICAgICAgIFtpbkNvbmZpZ109XCJpbkNvbmZpZ1wiIFxyXG4gICAgICAgICAgW3NhdmVkTWFya2Vyc109XCJleHRyYUpTT05cIlxyXG4gICAgICAgICAgKHNhdmUpPVwic2F2ZU1hcmsoJGV2ZW50KVwiIFxyXG4gICAgICAgICAgKGNsb3NlRGlhbG9nKT1cImNsb3NlRGlhbG9nKClcIlxyXG4gICAgICAgICAgW3dpZHRoXT1cImZpZWxkLkR5bkF0dGFjaG1lbnQuSW1hZ2VXaWR0aFB4XCIgXHJcbiAgICAgICAgICBbaGVpZ2h0XT1cImZpZWxkLkR5bkF0dGFjaG1lbnQuSW1hZ2VIZWlnaHRQeFwiIFxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvdG13LWltYWdlLW1hcmtlcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
272
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2Utd2l0aC1tYXJrZXJzLWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9maWVsZC10ZW1wbGF0ZXMvaW1hZ2Utd2l0aC1tYXJrZXJzLWZpZWxkLXRlbXBsYXRlL2ltYWdlLXdpdGgtbWFya2Vycy1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZmllbGQtdGVtcGxhdGVzL2ltYWdlLXdpdGgtbWFya2Vycy1maWVsZC10ZW1wbGF0ZS9pbWFnZS13aXRoLW1hcmtlcnMtZmllbGQtdGVtcGxhdGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQXlDLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2SixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFHN0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFFbkYsT0FBTyxFQUF5QixhQUFhLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUd0RyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7O0FBRXhFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7SUFDL0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUNoQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUks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QUFsQixNQUFNO2dCQWdCNEMsa0JBQWtCO3NCQUFwRSxTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBSZW5kZXJlcjIsIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSW1hZ2VGb2xkZXJFbnVtIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2ZpZWxkcy9pbWFnZUZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgSW1hZ2VXaXRoTWFya2Vyc0ZpZWxkLCBJbWFnZVdpdGhNYXJrZXJzRmllbGRTdHlsZUNTUyB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9maWVsZHMvaW1hZ2VXaXRoTWFya2Vyc0ZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL3JlY29yZC5tb2RlbCc7XHJcbmltcG9ydCB7IFV0aWxpdHlIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0eUhlbHBlci5zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgRW5kUG9pbnRDb25maWd1cmF0aW9uLCBQYXJhbVR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2VuZFBvaW50Q29uZmlndXJhdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IER5bkF0dGFjaG1lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvZHluQXR0YWNobWVudCc7XHJcbmltcG9ydCB7IE1hcmtlZEltYWdlIH0gZnJvbSAnLi4vLi4vdG13LWltYWdlLW1hcmtlci90bXctaW1hZ2UtbWFya2VyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERhdGFHZXR0ZXJUeXBlRW51bSB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9iYXNlRmllbGQubW9kZWwnO1xyXG5cclxuY29uc3QgdG9CYXNlNjQgPSBmaWxlID0+IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUocmVhZGVyLnJlc3VsdC50b1N0cmluZygpKTtcclxuICByZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlamVjdChlcnJvcik7XHJcbn0pO1xyXG5cclxuY29uc3QgRUxFTUVOVF9TRUxFQ1RPUlM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XHJcbiAgQ29udGFpbmVyOiAgICAnIC5pbWFnZUNvbnRhaW5lcicsXHJcbiAgRGVzY3JpemlvbmU6ICAnIC5pbWFnZS1sYWJlbCcsXHJcbiAgQm90dG9uZU1hcmNhOiAnIC5tYXJrQnV0dG9uIGJ1dHRvbi5idG4nLFxyXG59O1xyXG5jb25zdCBFTEVNRU5UUyA9IE9iamVjdC5rZXlzKEVMRU1FTlRfU0VMRUNUT1JTKTtcclxuY29uc3QgU1RBVEVTID0gWydOb3JtYWxlJywgJ01vdXNlb3ZlciddO1xyXG5jb25zdCBERUZBVUxUX0ZJRUxEX1NUWUxFUzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdpbWFnZS13aXRoLW1hcmtlcnMtZmllbGQtdGVtcGxhdGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9pbWFnZS13aXRoLW1hcmtlcnMtZmllbGQtdGVtcGxhdGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2ltYWdlLXdpdGgtbWFya2Vycy1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJbWFnZVdpdGhNYXJrZXJzRmllbGRUZW1wbGF0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG5cclxuICBASW5wdXQoKSBlbmRQb2ludENvbmZpZ3VyYXRpb246IEVuZFBvaW50Q29uZmlndXJhdGlvbjtcclxuICBASW5wdXQoKSByZWNvcmQ6IFJlY29yZDtcclxuICBASW5wdXQoKSBmb3JtdWxhT2JqZWN0OiBhbnkgPSB7fTtcclxuICBASW5wdXQoKSBmaWVsZDogSW1hZ2VXaXRoTWFya2Vyc0ZpZWxkO1xyXG4gIEBJbnB1dCgpIGluQ29uZmlnOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc3R5bGVWZXJzaW9uOiBudW1iZXIgPSAwO1xyXG4gIEBJbnB1dCgpIGZvcmNlU3RhdGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIEBPdXRwdXQoKSByZWNvcmRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxSZWNvcmQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ+KCk7XHJcbiAgQE91dHB1dCgpIGltYWdlTWFyazogRXZlbnRFbWl0dGVyPER5bkF0dGFjaG1lbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEeW5BdHRhY2htZW50PigpO1xyXG5cclxuICBpbWFnZVdpZHRoOiBudW1iZXIgPSAwO1xyXG4gIE1hcmtpbmdMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBGaWxlQmFzZTY0OiBzdHJpbmcgPSBcIlwiO1xyXG4gIE1hcmtGaWxlQmFzZTY0OiBzdHJpbmcgPSBcIlwiO1xyXG4gIEZpbGVEYXRhQmFzZTY0OiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICBBdHRhY2htZW50SUQ6IHN0cmluZyB8IG51bWJlcjtcclxuICBpbWFnZU1hcmtBdHRhY2htZW50OiBEeW5BdHRhY2htZW50O1xyXG4gIGV4dHJhSlNPTjogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgcHVibGljIHdpZHRoID0gbnVsbDtcclxuICBwdWJsaWMgaGVpZ2h0ID0gbnVsbDtcclxuXHJcbiAgZGlhbG9nSW1hZ2VNYXJraW5nUmVmOiBNYXREaWFsb2dSZWY8VGVtcGxhdGVSZWY8YW55Pj47XHJcbiAgQFZpZXdDaGlsZChcImRpYWxvZ0ltYWdlTWFya2luZ1wiLCB7IHN0YXRpYzogdHJ1ZSB9KSBkaWFsb2dJbWFnZU1hcmtpbmc6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIGZpZWxkVWlkOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBzdHlsZUVsOiBIVE1MU3R5bGVFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgdXRpbGl0eUhlbHBlclNlcnZpY2U6IFV0aWxpdHlIZWxwZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZpZWxkVWlkID0gJ2l3bS0nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApO1xyXG4gICAgdGhpcy5pbmplY3RTdHlsZXMoKTtcclxuXHJcbiAgICAvLyBJbiBhbnRlcHJpbWEgY29uZmlndXJhdG9yZSBzZW56YSB1bidpbW1hZ2luZSByZWFsZTogbm9uIGNhcmljYXJlIER5bkF0dGFjaG1lbnRcclxuICAgIGlmICh0aGlzLmluQ29uZmlnICYmICF0aGlzLmZpZWxkLkR5bkF0dGFjaG1lbnQpIHtcclxuICAgICAgdGhpcy5pbWFnZVdpZHRoID0gMjAwO1xyXG4gICAgICB0aGlzLnVwZGF0ZUZpZWxkKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSA9PSBudWxsIHx8IHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gPT0gMCkge1xyXG4gICAgICB0aGlzLkZpbGVEYXRhQmFzZTY0ID0gdGhpcy5maWVsZC5EeW5BdHRhY2htZW50LkZpbGVEYXRhQmFzZTY0O1xyXG4gICAgICB0aGlzLmltYWdlV2lkdGggPSAodGhpcy5maWVsZC5EeW5BdHRhY2htZW50LlJlc2l6ZWRJbWFnZUhlaWdodFB4IC8gdGhpcy5maWVsZC5EeW5BdHRhY2htZW50LkltYWdlSGVpZ2h0UHggKiB0aGlzLmZpZWxkLkR5bkF0dGFjaG1lbnQuSW1hZ2VXaWR0aFB4KSArIDUwO1xyXG4gICAgICB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdID0gdGhpcy5maWVsZC5EeW5BdHRhY2htZW50O1xyXG5cclxuICAgICAgdGhpcy5pbWFnZU1hcmtBdHRhY2htZW50ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmZpZWxkLkR5bkF0dGFjaG1lbnQpKTtcclxuICAgICAgdGhpcy5pbWFnZU1hcmtBdHRhY2htZW50LklEID0gMDtcclxuXHJcbiAgICAgIHRoaXMuQXR0YWNobWVudElEID0gdGhpcy5maWVsZC5EeW5BdHRhY2htZW50LklEO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdID0gSlNPTi5wYXJzZSh0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmltYWdlV2lkdGggPSAodGhpcy5maWVsZC5EeW5BdHRhY2htZW50LlJlc2l6ZWRJbWFnZUhlaWdodFB4IC8gdGhpcy5maWVsZC5EeW5BdHRhY2htZW50LkltYWdlSGVpZ2h0UHggKiB0aGlzLmZpZWxkLkR5bkF0dGFjaG1lbnQuSW1hZ2VXaWR0aFB4KSArIDUwO1xyXG5cclxuICAgICAgaWYgKCh0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdIGFzIER5bkF0dGFjaG1lbnQpLkZpbGVCYXNlczY0ICE9IG51bGwpIHtcclxuICAgICAgICB0aGlzLkZpbGVEYXRhQmFzZTY0ID0gKHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gYXMgRHluQXR0YWNobWVudCkuRmlsZUJhc2VzNjRbSW1hZ2VGb2xkZXJFbnVtLlJlZ3VsYXJdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuRmlsZURhdGFCYXNlNjQgPSAodGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSBhcyBEeW5BdHRhY2htZW50KS5GaWxlRGF0YUJhc2U2NDtcclxuICAgICAgfVxyXG5cclxuICAgICAgKHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gYXMgRHluQXR0YWNobWVudCkuRmlsZURhdGFCYXNlNjQgPSB0aGlzLkZpbGVEYXRhQmFzZTY0O1xyXG4gICAgICB0aGlzLmV4dHJhSlNPTiA9ICh0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdIGFzIER5bkF0dGFjaG1lbnQpLkV4dHJhSlNPTjtcclxuXHJcbiAgICAgIHRoaXMuaW1hZ2VNYXJrQXR0YWNobWVudCA9IHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV07XHJcbiAgICAgIHRoaXMuaW1hZ2VNYXJrQXR0YWNobWVudC5GaWxlRGF0YUJhc2U2NCA9IHRoaXMuRmlsZURhdGFCYXNlNjQ7XHJcblxyXG4gICAgICB0aGlzLkF0dGFjaG1lbnRJRCA9IHRoaXMuZmllbGQuRHluQXR0YWNobWVudC5JRDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlY29yZENoYW5nZS5lbWl0KHRoaXMucmVjb3JkKTtcclxuICAgIHRoaXMuaW1hZ2VNYXJrLmVtaXQodGhpcy5pbWFnZU1hcmtBdHRhY2htZW50KTtcclxuICAgIHRoaXMudXBkYXRlRmllbGQoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzWydzdHlsZVZlcnNpb24nXSAmJiAhY2hhbmdlc1snc3R5bGVWZXJzaW9uJ10uZmlyc3RDaGFuZ2UpIHtcclxuICAgICAgdGhpcy5pbmplY3RTdHlsZXMoKTtcclxuICAgICAgdGhpcy51cGRhdGVTdGF0ZUNsYXNzZXMoKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydmb3JjZVN0YXRlJ10pIHtcclxuICAgICAgdGhpcy51cGRhdGVTdGF0ZUNsYXNzZXMoKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydyZWNvcmQnXSAhPSB1bmRlZmluZWQgJiYgY2hhbmdlc1sncmVjb3JkJ10uZmlyc3RDaGFuZ2UgPT0gZmFsc2UgJiYgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1sncmVjb3JkJ10uY3VycmVudFZhbHVlKSAhPSBKU09OLnN0cmluZ2lmeShjaGFuZ2VzWydyZWNvcmQnXS5wcmV2aW91c1ZhbHVlKSkge1xyXG4gICAgICB0aGlzLnJlY29yZCA9IGNoYW5nZXNbJ3JlY29yZCddLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgdGhpcy51cGRhdGVGaWVsZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zdHlsZUVsPy5wYXJlbnROb2RlKSB7XHJcbiAgICAgIHRoaXMuc3R5bGVFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc3R5bGVFbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluamVjdFN0eWxlcygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5maWVsZFVpZCkgcmV0dXJuO1xyXG4gICAgY29uc3QgY3NzID0gKHRoaXMuZmllbGQgYXMgSW1hZ2VXaXRoTWFya2Vyc0ZpZWxkKT8uSW1hZ2VXaXRoTWFya2Vyc0ZpZWxkU3R5bGVDU1MgPz8gKHt9IGFzIEltYWdlV2l0aE1hcmtlcnNGaWVsZFN0eWxlQ1NTKTtcclxuICAgIGNvbnN0IHJ1bGVzID0gdGhpcy5idWlsZENzc1J1bGVzKHRoaXMuZmllbGRVaWQsIGNzcyk7XHJcblxyXG4gICAgaWYgKCF0aGlzLnN0eWxlRWwpIHtcclxuICAgICAgdGhpcy5zdHlsZUVsID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzdHlsZScpIGFzIEhUTUxTdHlsZUVsZW1lbnQ7XHJcbiAgICAgIHRoaXMuc3R5bGVFbC5pZCA9ICdzdHlsZS0nICsgdGhpcy5maWVsZFVpZDtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5oZWFkLCB0aGlzLnN0eWxlRWwpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdHlsZUVsLnRleHRDb250ZW50ID0gcnVsZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlbGVjdG9yKHVpZDogc3RyaW5nLCBzdGF0ZTogc3RyaW5nLCBzOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHN3aXRjaCAoc3RhdGUpIHtcclxuICAgICAgY2FzZSAnTm9ybWFsZSc6ICAgcmV0dXJuIGAjJHt1aWR9JHtzfWA7XHJcbiAgICAgIGNhc2UgJ01vdXNlb3Zlcic6IHJldHVybiBgIyR7dWlkfTpob3ZlciR7c30sICMke3VpZH0uZXFwLXN0YXRlLWhvdmVyJHtzfWA7XHJcbiAgICAgIGRlZmF1bHQ6ICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZENzc1J1bGVzKHVpZDogc3RyaW5nLCBjc3M6IEltYWdlV2l0aE1hcmtlcnNGaWVsZFN0eWxlQ1NTKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBlbCBvZiBFTEVNRU5UUykge1xyXG4gICAgICBjb25zdCBzID0gRUxFTUVOVF9TRUxFQ1RPUlNbZWxdO1xyXG4gICAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIFNUQVRFUykge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGVsICsgc3RhdGU7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbDogc3RyaW5nIHwgdW5kZWZpbmVkID0gREVGQVVMVF9GSUVMRF9TVFlMRVNba2V5XTtcclxuICAgICAgICBjb25zdCB1c2VyVmFsOiBzdHJpbmcgfCB1bmRlZmluZWQgPSAoY3NzIGFzIGFueSlba2V5XTtcclxuICAgICAgICBpZiAoIWRlZmF1bHRWYWw/LnRyaW0oKSAmJiAhdXNlclZhbD8udHJpbSgpKSBjb250aW51ZTtcclxuICAgICAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMuZ2V0U2VsZWN0b3IodWlkLCBzdGF0ZSwgcyk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3RvcikgY29udGludWU7XHJcbiAgICAgICAgaWYgKGRlZmF1bHRWYWw/LnRyaW0oKSkgbGluZXMucHVzaChgJHtzZWxlY3Rvcn0geyAke2RlZmF1bHRWYWx9IH1gKTtcclxuICAgICAgICBpZiAodXNlclZhbD8udHJpbSgpKSAgICBsaW5lcy5wdXNoKGAke3NlbGVjdG9yfSB7ICR7dXNlclZhbH0gfWApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVN0YXRlQ2xhc3NlcygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5maWVsZFVpZCkgcmV0dXJuO1xyXG4gICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZmllbGRVaWQpO1xyXG4gICAgaWYgKCF3cmFwcGVyKSByZXR1cm47XHJcbiAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtc3RhdGUtaG92ZXInLCB0aGlzLmZvcmNlU3RhdGUgPT09ICdNb3VzZW92ZXInKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9nZ2xlQ2xhc3MoZWw6IEVsZW1lbnQsIGNsczogc3RyaW5nLCBjb25kaXRpb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChjb25kaXRpb24pIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWwsIGNscyk7XHJcbiAgICBlbHNlIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZWwsIGNscyk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGaWVsZCgpIHtcclxuICAgIGlmICgodGhpcy5maWVsZC5EYXRhR2V0dGVyLkRhdGFHZXR0ZXJUeXBlID09IERhdGFHZXR0ZXJUeXBlRW51bS5NYW51YWxlIHx8IHRoaXMuZmllbGQuRGF0YUdldHRlci5EYXRhR2V0dGVyVHlwZSA9PSBEYXRhR2V0dGVyVHlwZUVudW0uRm9ybXVsYSkgJiYgdGhpcy5maWVsZC5Gb3JtdWxhKSB7XHJcbiAgICAgIHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gPSBVdGlsaXR5SGVscGVyU2VydmljZS5FdmFsdWF0ZUZpZWxkRm9ybXVsYSh0aGlzLmZpZWxkLkZvcm11bGEsIHRoaXMucmVjb3JkLCB0aGlzLmZvcm11bGFPYmplY3QpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZmllbGQuVmlzaWJsZUlmKSB7XHJcbiAgICAgIHRoaXMuZmllbGQuSW5MaXN0VmlldyA9IFV0aWxpdHlIZWxwZXJTZXJ2aWNlLkV2YWx1YXRlRmllbGRGb3JtdWxhKHRoaXMuZmllbGQuVmlzaWJsZUlmLCB0aGlzLnJlY29yZCwgdGhpcy5mb3JtdWxhT2JqZWN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc2V0UHJlTG9hZGVkSW1hZ2UoKSB7XHJcbiAgICB0aGlzLndpZHRoID0gbnVsbDtcclxuICAgIHRoaXMuaGVpZ2h0ID0gbnVsbDtcclxuICAgIHRoaXMuZ2V0SW1hZ2VEaW1lbnNpb25zKCk7XHJcbiAgfVxyXG5cclxuICBvbkF0dGFjaG1lbnRzQ2hhbmdlKCkgeyB9XHJcblxyXG4gIGFzeW5jIHNhdmVNYXJrKG1hcmtlZEltYWdlOiBNYXJrZWRJbWFnZSkge1xyXG4gICAgbGV0IGJhc2U2NEZpbGUgPSBhd2FpdCB0b0Jhc2U2NChtYXJrZWRJbWFnZS5pbWFnZSk7XHJcbiAgICBpZiAoYmFzZTY0RmlsZSkge1xyXG4gICAgICB0aGlzLk1hcmtGaWxlQmFzZTY0ID0gYmFzZTY0RmlsZS5zcGxpdChcIixcIilbMV07XHJcbiAgICAgIHRoaXMuRmlsZURhdGFCYXNlNjQgPSB0aGlzLk1hcmtGaWxlQmFzZTY0O1xyXG4gICAgICB0aGlzLmltYWdlTWFya0F0dGFjaG1lbnQuRmlsZURhdGFCYXNlNjQgPSB0aGlzLk1hcmtGaWxlQmFzZTY0O1xyXG4gICAgICB0aGlzLmltYWdlTWFya0F0dGFjaG1lbnQuRXh0cmFKU09OID0gSlNPTi5zdHJpbmdpZnkobWFya2VkSW1hZ2Uub3V0bWFya2Vycyk7XHJcbiAgICAgIHRoaXMuZXh0cmFKU09OID0gdGhpcy5pbWFnZU1hcmtBdHRhY2htZW50LkV4dHJhSlNPTjtcclxuICAgICAgdGhpcy5pbWFnZU1hcmsuZW1pdCh0aGlzLmltYWdlTWFya0F0dGFjaG1lbnQpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZGlhbG9nSW1hZ2VNYXJraW5nUmVmKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VEaWFsb2coKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlRGlhbG9nKCkge1xyXG4gICAgdGhpcy5kaWFsb2dJbWFnZU1hcmtpbmdSZWYuY2xvc2UoKTtcclxuICAgIHRoaXMud2lkdGggPSBudWxsO1xyXG4gICAgdGhpcy5oZWlnaHQgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRJbWFnZURpbWVuc2lvbnMoKSB7XHJcbiAgICB2YXIgYmxvYjogQmxvYiA9IHRoaXMuZ2V0QmxvYkZyb21CYXNlNjQoKTtcclxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICBpbWFnZS5zcmMgPSBlLnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgIGltYWdlLm9ubG9hZCA9IHJzID0+IHtcclxuICAgICAgICB0aGlzLmhlaWdodCA9IHJzLmN1cnJlbnRUYXJnZXRbJ2hlaWdodCddO1xyXG4gICAgICAgIHRoaXMud2lkdGggPSBycy5jdXJyZW50VGFyZ2V0Wyd3aWR0aCddO1xyXG4gICAgICB9O1xyXG4gICAgfTtcclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRCbG9iRnJvbUJhc2U2NCgpIHtcclxuICAgIGNvbnN0IGJ5dGVDaGFyYWN0ZXJzID0gYXRvYih0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdWzBdLkZpbGVEYXRhQmFzZTY0KTtcclxuICAgIGNvbnN0IGJ5dGVOdW1iZXJzID0gbmV3IEFycmF5KGJ5dGVDaGFyYWN0ZXJzLmxlbmd0aCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVDaGFyYWN0ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGJ5dGVOdW1iZXJzW2ldID0gYnl0ZUNoYXJhY3RlcnMuY2hhckNvZGVBdChpKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGJ5dGVBcnJheSA9IG5ldyBVaW50OEFycmF5KGJ5dGVOdW1iZXJzKTtcclxuICAgIHJldHVybiBuZXcgQmxvYihbYnl0ZUFycmF5XSwgeyB0eXBlOiB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdWzBdLkZpbGVDb250ZW50VHlwZSB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25SZWNvcmRWYWx1ZUNoYW5nZSgpIHtcclxuICAgIGlmICghdGhpcy5maWVsZC5Gb3JtdWxhKSB7XHJcbiAgICAgIHRoaXMucmVjb3JkQ2hhbmdlLmVtaXQodGhpcy5yZWNvcmQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wZW5NYXJrKCkge1xyXG4gICAgdGhpcy5kaWFsb2dJbWFnZU1hcmtpbmdSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMuZGlhbG9nSW1hZ2VNYXJraW5nLCB7XHJcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcclxuICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXHJcbiAgICAgIHBhbmVsQ2xhc3M6ICdpbWFnZS1tb2RhbCcsXHJcbiAgICAgIHdpZHRoOiAnOTB2dycsXHJcbiAgICAgIGhlaWdodDogJzkwdmgnLFxyXG4gICAgICBtYXhXaWR0aDogJzEwMHZ3JyxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLkF0dGFjaG1lbnRJRCAhPSBudWxsICYmIE51bWJlcih0aGlzLkF0dGFjaG1lbnRJRCkgPiAwKSB7XHJcbiAgICAgIHRoaXMubG9hZCh0aGlzLkF0dGFjaG1lbnRJRCwgW0ltYWdlRm9sZGVyRW51bS5SZWd1bGFyXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLkZpbGVCYXNlNjQgPSB0aGlzLkZpbGVEYXRhQmFzZTY0O1xyXG4gICAgICB0aGlzLk1hcmtpbmdMb2FkZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZChJRCwgVHlwZXMpIHtcclxuICAgIHRoaXMuTWFya2luZ0xvYWRlZCA9IGZhbHNlO1xyXG4gICAgdmFyIGR5bmFtaWNNb2R1bGVQYXJhbXMgPSBbXHJcbiAgICAgIHsgUGFyYW1OYW1lOiBcIkF0dGFjaG1lbnRJRFwiLCBQYXJhbVZhbHVlOiBJRCwgICAgUGFyYW1UeXBlOiBQYXJhbVR5cGVFbnVtW1wiUXVlcnkgcGFyYW1cIl0gfSxcclxuICAgICAgeyBQYXJhbU5hbWU6IFwiVHlwZXNcIiwgICAgICAgIFBhcmFtVmFsdWU6IFR5cGVzLCBQYXJhbVR5cGU6IFBhcmFtVHlwZUVudW1bXCJRdWVyeSBwYXJhbVwiXSB9LFxyXG4gICAgXTtcclxuICAgIHRoaXMudXRpbGl0eUhlbHBlclNlcnZpY2UuUnVuRW5kUG9pbnRDYWxsKFxyXG4gICAgICB0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbi5Gb3Jtcy5HZXRBdHRhY2htZW50V2l0aEJhc2VzNjQsXHJcbiAgICAgIGR5bmFtaWNNb2R1bGVQYXJhbXMsXHJcbiAgICAgIChyZXM6IER5bkF0dGFjaG1lbnQpID0+IHtcclxuICAgICAgICB0aGlzLkZpbGVCYXNlNjQgPSByZXMuRmlsZUJhc2VzNjRbSW1hZ2VGb2xkZXJFbnVtLlJlZ3VsYXJdO1xyXG4gICAgICAgIHRoaXMuTWFya2luZ0xvYWRlZCA9IHRydWU7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnIpID0+IHt9XHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGlkPVwie3tmaWVsZFVpZH19XCI+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBpbWFnZUNvbnRhaW5lclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGltYWdlLWxhYmVsXCI+e3tmaWVsZC5EZXNjcmlwdGlvbn19PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgICAgICA8aW1nICpuZ0lmPVwiZmllbGQuRHluQXR0YWNobWVudFwiXHJcbiAgICAgICAgICBzcmM9XCJkYXRhOnt7ZmllbGQuRHluQXR0YWNobWVudC5GaWxlQ29udGVudFR5cGV9fTtiYXNlNjQse3tGaWxlRGF0YUJhc2U2NH19XCJcclxuICAgICAgICAgIFtoZWlnaHRdPVwiZmllbGQuRHluQXR0YWNobWVudC5SZXNpemVkSW1hZ2VIZWlnaHRQeCAhPSBudWxsID8gZmllbGQuRHluQXR0YWNobWVudC5SZXNpemVkSW1hZ2VIZWlnaHRQeCA6IDEyOFwiXHJcbiAgICAgICAgICBjbGFzcz1cInNpbmdsZUltYWdlXCJcclxuICAgICAgICA+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1hcmtCdXR0b25cIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi13MTAwXCIgKGNsaWNrKT1cIm9wZW5NYXJrKClcIj5NYXJjYTwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLkR5bkF0dGFjaG1lbnQuQnV0dG9uS2V5ICE9IG51bGwgJiYgZmllbGQuRHluQXR0YWNobWVudC5CdXR0b25LZXkgIT0gJydcIiBjbGFzcz1cImNvbC0xMiBmbGV4IGp1c3RpZnktY29udGVudC1hcm91bmQgYnV0dG9ua2V5XCI+XHJcbiAgICAgICAgPGRpdj5FdGljaGV0dGE8L2Rpdj48ZGl2Pnt7ZmllbGQuRHluQXR0YWNobWVudC5CdXR0b25LZXl9fTwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLkR5bkF0dGFjaG1lbnQuQnV0dG9uVmFsdWUgIT0gbnVsbCAmJiBmaWVsZC5EeW5BdHRhY2htZW50LkJ1dHRvblZhbHVlICE9ICcnXCIgY2xhc3M9XCJjb2wtMTIgZmxleCBqdXN0aWZ5LWNvbnRlbnQtYXJvdW5kIGJ1dHRvbnZhbHVlXCI+XHJcbiAgICAgICAgPGRpdj5WYWxvcmU8L2Rpdj5cclxuICAgICAgICA8ZGl2Pnt7ZmllbGQuRHluQXR0YWNobWVudC5CdXR0b25WYWx1ZX19PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBESUFMT0cgUEVSIE1BUkNBVFVSQSAtLT5cclxuPG5nLXRlbXBsYXRlICNkaWFsb2dJbWFnZU1hcmtpbmc+XHJcbiAgPHRtdy1pbWFnZS1tYXJrZXIgKm5nSWY9XCJNYXJraW5nTG9hZGVkXCJcclxuICAgIFtzcmNdPVwiJ2RhdGE6JysgZmllbGQuRHluQXR0YWNobWVudC5GaWxlQ29udGVudFR5cGUgKyAnO2Jhc2U2NCwnKyBGaWxlQmFzZTY0XCJcclxuICAgIFtpbkNvbmZpZ109XCJpbkNvbmZpZ1wiXHJcbiAgICBbc2F2ZWRNYXJrZXJzXT1cImV4dHJhSlNPTlwiXHJcbiAgICAoc2F2ZSk9XCJzYXZlTWFyaygkZXZlbnQpXCJcclxuICAgIChjbG9zZURpYWxvZyk9XCJjbG9zZURpYWxvZygpXCJcclxuICAgIFt3aWR0aF09XCJmaWVsZC5EeW5BdHRhY2htZW50LkltYWdlV2lkdGhQeFwiXHJcbiAgICBbaGVpZ2h0XT1cImZpZWxkLkR5bkF0dGFjaG1lbnQuSW1hZ2VIZWlnaHRQeFwiXHJcbiAgPlxyXG4gIDwvdG13LWltYWdlLW1hcmtlcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19