@eqproject/eqp-dynamic-module 2.11.6 → 2.11.8

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 (31) hide show
  1. package/USERGUIDE.md +437 -437
  2. package/esm2020/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.mjs +2 -2
  3. package/esm2020/lib/components/private/field-graphics-editor/field-graphics-editor.component.mjs +115 -27
  4. package/esm2020/lib/components/private/field-templates/date-field-template/date-field-template.component.mjs +28 -6
  5. package/esm2020/lib/components/private/field-templates/image-field-selector-template/image-field-selector-template.component.mjs +25 -5
  6. package/esm2020/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.mjs +12 -3
  7. package/esm2020/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.mjs +26 -4
  8. package/esm2020/lib/components/private/field-templates/text-field-template/text-field-template.component.mjs +26 -4
  9. package/esm2020/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.mjs +26 -4
  10. package/esm2020/lib/components/private/form-records/list-form-record/list-form-record.component.mjs +1 -1
  11. package/esm2020/lib/components/private/form-records/list-view-form-record/list-view-form-record.component.mjs +3 -3
  12. package/esm2020/lib/components/private/form-statistics/filter-form-statistic/filter-form-statistic.component.mjs +1 -1
  13. package/esm2020/lib/components/private/graphs/graph/graph.component.mjs +3 -3
  14. package/esm2020/lib/utils/css-property-catalog.mjs +45 -2
  15. package/esm2020/lib/utils/field-style-catalog.mjs +45 -19
  16. package/esm2020/lib/utils/floating-label-styles.mjs +155 -0
  17. package/esm2020/lib/utils/refresh-outline-notch.mjs +38 -0
  18. package/fesm2015/eqproject-eqp-dynamic-module.mjs +782 -327
  19. package/fesm2015/eqproject-eqp-dynamic-module.mjs.map +1 -1
  20. package/fesm2020/eqproject-eqp-dynamic-module.mjs +762 -313
  21. package/fesm2020/eqproject-eqp-dynamic-module.mjs.map +1 -1
  22. package/lib/components/private/field-graphics-editor/field-graphics-editor.component.d.ts +19 -1
  23. package/lib/components/private/field-templates/image-field-selector-template/image-field-selector-template.component.d.ts +6 -2
  24. package/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.d.ts +6 -2
  25. package/lib/components/private/field-templates/text-field-template/text-field-template.component.d.ts +6 -2
  26. package/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.d.ts +6 -2
  27. package/lib/utils/css-property-catalog.d.ts +25 -0
  28. package/lib/utils/field-style-catalog.d.ts +5 -0
  29. package/lib/utils/floating-label-styles.d.ts +73 -0
  30. package/lib/utils/refresh-outline-notch.d.ts +15 -0
  31. package/package.json +1 -1
@@ -1,4 +1,7 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
1
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import { MatFormField } from '@angular/material/form-field';
3
+ import { refreshOutlineNotch, watchOutlineNotch } from '../../../../utils/refresh-outline-notch';
4
+ import { buildFloatingLabelBaseRules, cssSetsTop, LABEL_FLOATING_SUFFIX, readStyleCss } from '../../../../utils/floating-label-styles';
2
5
  import { TextFieldIconPositionEnum, TextMaskEnum } from '../../../../models/fields/textField.model';
3
6
  import { UtilityHelperService } from '../../../../services/utilityHelper.services';
4
7
  import { interval } from 'rxjs';
@@ -24,6 +27,9 @@ const ELEMENT_SELECTORS = {
24
27
  Container: ' .mat-mdc-text-field-wrapper',
25
28
  Input: ' .mat-mdc-form-field-infix',
26
29
  Descrizione: ' label.mat-mdc-floating-label',
30
+ // Descrizione: grafica base della label, sempre valida. Sollevata (virtuale, salvata dentro
31
+ // Descrizione): override quando è sul bordo
32
+ DescrizioneSollevata: ' label.mat-mdc-floating-label' + LABEL_FLOATING_SUFFIX,
27
33
  Icona: [' .mat-mdc-form-field-icon-prefix', ' .mat-mdc-form-field-icon-suffix'],
28
34
  Microfono: ' .mat-mdc-form-field-icon-suffix',
29
35
  Errore: ' mat-error',
@@ -57,6 +63,7 @@ export class TextFieldTemplateComponent {
57
63
  this.platform = Capacitor.getPlatform();
58
64
  this.styleEl = null;
59
65
  this.statusSub = null;
66
+ this.notchObserver = null;
60
67
  }
61
68
  ngOnInit() {
62
69
  this.fieldUid = 'tf-' + Math.random().toString(36).slice(2, 10);
@@ -73,6 +80,9 @@ export class TextFieldTemplateComponent {
73
80
  if (changes['forceState']) {
74
81
  this.updateStateClasses();
75
82
  }
83
+ if (changes['styleVersion'] || changes['forceState']) {
84
+ refreshOutlineNotch(this.formField);
85
+ }
76
86
  if (changes['record'] != undefined && changes['record'].firstChange == false
77
87
  && JSON.stringify(changes['record'].currentValue) != JSON.stringify(changes['record'].previousValue)) {
78
88
  this.record = changes['record'].currentValue;
@@ -80,7 +90,11 @@ export class TextFieldTemplateComponent {
80
90
  this.updateStateClasses();
81
91
  }
82
92
  }
93
+ ngAfterViewInit() {
94
+ this.notchObserver = watchOutlineNotch(this.formField);
95
+ }
83
96
  ngOnDestroy() {
97
+ this.notchObserver?.disconnect();
84
98
  if (this.styleEl?.parentNode) {
85
99
  this.styleEl.parentNode.removeChild(this.styleEl);
86
100
  }
@@ -200,13 +214,14 @@ export class TextFieldTemplateComponent {
200
214
  // qualsiasi valore ereditato dal wrapper. Con color:inherit forziamo l'ereditarietà
201
215
  // (specificità 1,1,1 > 0,3,0), così il color impostato su InputNormale si propaga al testo.
202
216
  lines.push(`#${uid} input.mat-mdc-input-element { color: inherit; }`);
217
+ lines.push(...buildFloatingLabelBaseRules(uid, ELEMENT_SELECTORS.Descrizione, css));
203
218
  for (const el of ELEMENTS) {
204
219
  const sEntry = ELEMENT_SELECTORS[el];
205
220
  const selList = Array.isArray(sEntry) ? sEntry : [sEntry];
206
221
  for (const state of STATES) {
207
222
  const key = el + state;
208
223
  const defaultVal = DEFAULT_FIELD_STYLES[key];
209
- const userVal = css[key];
224
+ const userVal = readStyleCss(css, key);
210
225
  if (!defaultVal?.trim() && !userVal?.trim())
211
226
  continue;
212
227
  for (const s of selList) {
@@ -218,6 +233,10 @@ export class TextFieldTemplateComponent {
218
233
  lines.push(`${selector} { ${defaultVal} }`);
219
234
  if (userVal?.trim())
220
235
  lines.push(`${selector} { ${userVal} }`);
236
+ if (userVal?.trim() && el === 'Descrizione') {
237
+ if (cssSetsTop(userVal))
238
+ lines.push(this.getSelector(uid, el, state, s + LABEL_FLOATING_SUFFIX, sub) + ' { top: 0; }');
239
+ }
221
240
  // Per Container: propaga le proprietà border ai segmenti MDC (notched-outline__*).
222
241
  // Se il CSS imposta uno spessore (border/border-width) → il bordo visivo è già sul
223
242
  // wrapper, i segmenti vengono soppressi (border-color:transparent) per evitare il
@@ -318,7 +337,7 @@ export class TextFieldTemplateComponent {
318
337
  }
319
338
  }
320
339
  TextFieldTemplateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TextFieldTemplateComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
321
- TextFieldTemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TextFieldTemplateComponent, selector: "text-field-template", inputs: { field: "field", record: "record", formulaObject: "formulaObject", inConfig: "inConfig", styleVersion: "styleVersion", forceState: "forceState" }, outputs: { recordChange: "recordChange" }, usesOnChanges: true, ngImport: i0, template: "<div [id]=\"fieldUid\" class=\"eqp-tf-wrapper\">\r\n <mat-form-field [formGroup]=\"field.FormFormGroup\" appearance=\"outline\">\r\n <mat-label class=\"pt-1\" [ngStyle]=\"LabelstyleObj\">\r\n {{ field.Description }}\r\n </mat-label>\r\n <tmw-icon class=\"mat-icon\" *ngIf=\"field.IconName && field.IconPosition != TextFieldIconPositionEnum.Destra\" matPrefix\r\n [name]=\"field.IconName\">\r\n </tmw-icon>\r\n <input\r\n [ngStyle]=\"FieldstyleObj\"\r\n matInput\r\n [type]=\"getInputType()\"\r\n [formControlName]=\"field.Name\"\r\n [readonly]=\"field.Readonly || (field.Formula != null && field.Formula != '')\"\r\n [required]=\"field.Required\"\r\n [(ngModel)]=\"record[field.Name]\"\r\n (ngModelChange)=\"onRecordValueChange()\"\r\n />\r\n <mat-error\r\n *ngIf=\"\r\n !field.FormFormGroup.valid &&\r\n field.FormFormGroup.controls[field.Name].touched &&\r\n !field.Readonly\r\n \"\r\n >\r\n Min. Caratteri: {{ field.MinLenght }} - Max. Caratteri:\r\n {{ field.MaxLenght }}\r\n </mat-error>\r\n <tmw-icon class=\"mat-icon\"\r\n *ngIf=\"field.IconName && field.IconPosition == TextFieldIconPositionEnum.Destra\"\r\n matSuffix\r\n [name]=\"field.IconName\">\r\n </tmw-icon>\r\n <tmw-icon class=\"mat-icon eqp-microfono\"\r\n [hidden]=\"!field.Microphone || platform != 'web'\"\r\n matSuffix\r\n SpeechToText\r\n #micSpeech=\"speechToText\"\r\n [(bindedText)]=\"record[field.Name]\"\r\n [variant]=\"micSpeech.isListening ? 'filled' : 'outline'\"\r\n style=\"cursor: pointer\"\r\n name=\"microphone\">\r\n </tmw-icon>\r\n </mat-form-field>\r\n</div>\r\n", styles: [".eqp-tf-wrapper{display:block;width:100%}.keyboard_speaking{color:red}\n"], dependencies: [{ kind: "directive", type: i1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.TmwIconComponent, selector: "tmw-icon", inputs: ["name", "size", "ariaLabel", "variant", "strokeWidth"] }, { kind: "directive", type: i6.SpeechToTextDirective, selector: "[SpeechToText]", inputs: ["bindedText"], outputs: ["bindedTextChange"], exportAs: ["speechToText"] }] });
340
+ TextFieldTemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TextFieldTemplateComponent, selector: "text-field-template", inputs: { field: "field", record: "record", formulaObject: "formulaObject", inConfig: "inConfig", styleVersion: "styleVersion", forceState: "forceState" }, outputs: { recordChange: "recordChange" }, viewQueries: [{ propertyName: "formField", first: true, predicate: MatFormField, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [id]=\"fieldUid\" class=\"eqp-tf-wrapper\">\r\n <mat-form-field [formGroup]=\"field.FormFormGroup\" appearance=\"outline\">\r\n <mat-label class=\"pt-1\" [ngStyle]=\"LabelstyleObj\">\r\n {{ field.Description }}\r\n </mat-label>\r\n <tmw-icon class=\"mat-icon\" *ngIf=\"field.IconName && field.IconPosition != TextFieldIconPositionEnum.Destra\" matPrefix\r\n [name]=\"field.IconName\">\r\n </tmw-icon>\r\n <input\r\n [ngStyle]=\"FieldstyleObj\"\r\n matInput\r\n [type]=\"getInputType()\"\r\n [formControlName]=\"field.Name\"\r\n [readonly]=\"field.Readonly || (field.Formula != null && field.Formula != '')\"\r\n [required]=\"field.Required\"\r\n [(ngModel)]=\"record[field.Name]\"\r\n (ngModelChange)=\"onRecordValueChange()\"\r\n />\r\n <mat-error\r\n *ngIf=\"\r\n !field.FormFormGroup.valid &&\r\n field.FormFormGroup.controls[field.Name].touched &&\r\n !field.Readonly\r\n \"\r\n >\r\n Min. Caratteri: {{ field.MinLenght }} - Max. Caratteri:\r\n {{ field.MaxLenght }}\r\n </mat-error>\r\n <tmw-icon class=\"mat-icon\"\r\n *ngIf=\"field.IconName && field.IconPosition == TextFieldIconPositionEnum.Destra\"\r\n matSuffix\r\n [name]=\"field.IconName\">\r\n </tmw-icon>\r\n <tmw-icon class=\"mat-icon eqp-microfono\"\r\n [hidden]=\"!field.Microphone || platform != 'web'\"\r\n matSuffix\r\n SpeechToText\r\n #micSpeech=\"speechToText\"\r\n [(bindedText)]=\"record[field.Name]\"\r\n [variant]=\"micSpeech.isListening ? 'filled' : 'outline'\"\r\n style=\"cursor: pointer\"\r\n name=\"microphone\">\r\n </tmw-icon>\r\n </mat-form-field>\r\n</div>\r\n", styles: [".eqp-tf-wrapper{display:block;width:100%}.keyboard_speaking{color:red}\n"], dependencies: [{ kind: "directive", type: i1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.TmwIconComponent, selector: "tmw-icon", inputs: ["name", "size", "ariaLabel", "variant", "strokeWidth"] }, { kind: "directive", type: i6.SpeechToTextDirective, selector: "[SpeechToText]", inputs: ["bindedText"], outputs: ["bindedTextChange"], exportAs: ["speechToText"] }] });
322
341
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TextFieldTemplateComponent, decorators: [{
323
342
  type: Component,
324
343
  args: [{ selector: 'text-field-template', template: "<div [id]=\"fieldUid\" class=\"eqp-tf-wrapper\">\r\n <mat-form-field [formGroup]=\"field.FormFormGroup\" appearance=\"outline\">\r\n <mat-label class=\"pt-1\" [ngStyle]=\"LabelstyleObj\">\r\n {{ field.Description }}\r\n </mat-label>\r\n <tmw-icon class=\"mat-icon\" *ngIf=\"field.IconName && field.IconPosition != TextFieldIconPositionEnum.Destra\" matPrefix\r\n [name]=\"field.IconName\">\r\n </tmw-icon>\r\n <input\r\n [ngStyle]=\"FieldstyleObj\"\r\n matInput\r\n [type]=\"getInputType()\"\r\n [formControlName]=\"field.Name\"\r\n [readonly]=\"field.Readonly || (field.Formula != null && field.Formula != '')\"\r\n [required]=\"field.Required\"\r\n [(ngModel)]=\"record[field.Name]\"\r\n (ngModelChange)=\"onRecordValueChange()\"\r\n />\r\n <mat-error\r\n *ngIf=\"\r\n !field.FormFormGroup.valid &&\r\n field.FormFormGroup.controls[field.Name].touched &&\r\n !field.Readonly\r\n \"\r\n >\r\n Min. Caratteri: {{ field.MinLenght }} - Max. Caratteri:\r\n {{ field.MaxLenght }}\r\n </mat-error>\r\n <tmw-icon class=\"mat-icon\"\r\n *ngIf=\"field.IconName && field.IconPosition == TextFieldIconPositionEnum.Destra\"\r\n matSuffix\r\n [name]=\"field.IconName\">\r\n </tmw-icon>\r\n <tmw-icon class=\"mat-icon eqp-microfono\"\r\n [hidden]=\"!field.Microphone || platform != 'web'\"\r\n matSuffix\r\n SpeechToText\r\n #micSpeech=\"speechToText\"\r\n [(bindedText)]=\"record[field.Name]\"\r\n [variant]=\"micSpeech.isListening ? 'filled' : 'outline'\"\r\n style=\"cursor: pointer\"\r\n name=\"microphone\">\r\n </tmw-icon>\r\n </mat-form-field>\r\n</div>\r\n", styles: [".eqp-tf-wrapper{display:block;width:100%}.keyboard_speaking{color:red}\n"] }]
@@ -332,9 +351,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
332
351
  type: Input
333
352
  }], styleVersion: [{
334
353
  type: Input
354
+ }], formField: [{
355
+ type: ViewChild,
356
+ args: [MatFormField]
335
357
  }], forceState: [{
336
358
  type: Input
337
359
  }], recordChange: [{
338
360
  type: Output
339
361
  }] } });
340
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZmllbGQtdGVtcGxhdGVzL3RleHQtZmllbGQtdGVtcGxhdGUvdGV4dC1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZmllbGQtdGVtcGxhdGVzL3RleHQtZmllbGQtdGVtcGxhdGUvdGV4dC1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBNEIsTUFBTSxlQUFlLENBQUM7QUFFL0gsT0FBTyxFQUFFLHlCQUF5QixFQUFxQixZQUFZLEVBQWEsTUFBTSwyQ0FBMkMsQ0FBQztBQUVsSSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNuRixPQUFPLEVBQUUsUUFBUSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7O0FBRTVDLDJDQUEyQztBQUMzQyxrRkFBa0Y7QUFDbEYsb0dBQW9HO0FBQ3BHLDhGQUE4RjtBQUM5RixvR0FBb0c7QUFDcEcsMkVBQTJFO0FBQzNFLDJFQUEyRTtBQUMzRSxxRkFBcUY7QUFDckYsOEZBQThGO0FBQzlGLE1BQU0saUJBQWlCLEdBQXlDO0lBQzlELFNBQVMsRUFBRSw4QkFBOEI7SUFDekMsS0FBSyxFQUFFLDRC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RkRBYSwwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ0UscUJBQXFCO2dHQVV0QixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBS0ksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBSZW5kZXJlcjIsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL3JlY29yZC5tb2RlbCc7XHJcbmltcG9ydCB7IFRleHRGaWVsZEljb25Qb3NpdGlvbkVudW0sIFRleHRGaWVsZFN0eWxlQ1NTLCBUZXh0TWFza0VudW0sIFRleHRGaWVsZCB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9maWVsZHMvdGV4dEZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgSUJhc2VGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL2ludGVyZmFjZXMvaUJhc2VGaWVsZENvbXBvbmVudC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBVdGlsaXR5SGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3V0aWxpdHlIZWxwZXIuc2VydmljZXMnO1xyXG5pbXBvcnQgeyBpbnRlcnZhbCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IERhdGFHZXR0ZXJUeXBlRW51bSB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9iYXNlRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBDYXBhY2l0b3IgfSBmcm9tICdAY2FwYWNpdG9yL2NvcmUnO1xyXG5cclxuLy8gU2VsZXR0b3JpIENTUyBNREMgKEFuZ3VsYXIgTWF0ZXJpYWwgMTUpLlxyXG4vLyBDb250YWluZXIg4oaSIC5tYXQtbWRjLXRleHQtZmllbGQtd3JhcHBlcjogYm94IHZpc3VhbGUgZXN0ZXJubyBkZWwgY2FtcG8gb3V0bGluZWRcclxuLy8gICAoZXNjbHVzbyAubWF0LW1kYy1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyKS4gR2VzdGlzY2Ugc2ZvbmRvLCBib3JkbywgYm9yZGVyLXJhZGl1cyBlc3Rlcm5vLlxyXG4vLyAgIExlIHJlZ29sZSBkaSBDb250YWluZXIgdmVuZ29ubyBkdXBsaWNhdGUgYW5jaGUgc3VpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX18qIHBlciBwZXJtZXR0ZXJlXHJcbi8vICAgZGkgc292cmFzY3JpdmVyZSBpbCBib3JkbyBkaSBmb2N1cy9ob3ZlciBkaSBNYXRlcmlhbCBjb24gbGEgcHJvcHJpZXTDoCBib3JkZXItY29sb3IgZGVsbCd1dGVudGUuXHJcbi8vIElucHV0IOKGkiAubWF0LW1kYy1mb3JtLWZpZWxkLWluZml4OiBhcmVhIGludGVybmEgZG92ZSBzaSBkaWdpdGEgaWwgdGVzdG8uXHJcbi8vICAgSW5kaXBlbmRlbnRlIGRhIENvbnRhaW5lcjogaWwgc3VvIGJhY2tncm91bmQgbm9uIGNvcHJlIGlsIGJveCBlc3Rlcm5vLlxyXG4vLyBJY29uYSDihpIgY29udGFpbmVyIHByZWZpeCArIHN1ZmZpeCAoYWxpZ24tc2VsZjogc3RyZXRjaCBpbmlldHRhdG8gc3RydXR0dXJhbG1lbnRlKS5cclxuLy8gTWljcm9mb25vIOKGkiBzdGVzc28gY29udGFpbmVyIHN1ZmZpeCAodmllbmUgZG9wbyBJY29uYSBuZWwgbG9vcCwgc292cmFzY3JpdmUgcGVyIGlsIHN1ZmZpeCkuXHJcbmNvbnN0IEVMRU1FTlRfU0VMRUNUT1JTOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH0gPSB7XHJcbiAgQ29udGFpbmVyOiAnIC5tYXQtbWRjLXRleHQtZmllbGQtd3JhcHBlcicsXHJcbiAgSW5wdXQ6ICcgLm1hdC1tZGMtZm9ybS1maWVsZC1pbmZpeCcsXHJcbiAgRGVzY3JpemlvbmU6ICcgbGFiZWwubWF0LW1kYy1mbG9hdGluZy1sYWJlbCcsXHJcbiAgSWNvbmE6IFsnIC5tYXQtbWRjLWZvcm0tZmllbGQtaWNvbi1wcmVmaXgnLCAnIC5tYXQtbWRjLWZvcm0tZmllbGQtaWNvbi1zdWZmaXgnXSxcclxuICBNaWNyb2Zvbm86ICcgLm1hdC1tZGMtZm9ybS1maWVsZC1pY29uLXN1ZmZpeCcsXHJcbiAgRXJyb3JlOiAnIG1hdC1lcnJvcicsXHJcbn07XHJcbmNvbnN0IEVMRU1FTlRTID0gT2JqZWN0LmtleXMoRUxFTUVOVF9TRUxFQ1RPUlMpO1xyXG5jb25zdCBTVEFURVMgPSBbJ05vcm1hbGUnLCAnTW91c2VvdmVyJywgJ0ZvY3VzZWQnLCAnTm90VmFsaWQnLCAnUmVhZG9ubHknXTtcclxuXHJcbi8vIFN0aWxpIGRpIGRlZmF1bHQgcGVyIGVsZW1lbnRvK3N0YXRvOiBlbWVzc2kgcHJpbWEgZGVsbGUgcmVnb2xlIHV0ZW50ZSxcclxuLy8gY2hlIGxlIHNvdnJhc2NyaXZvbm8gcGVyIGVmZmV0dG8gZGVsIGNhc2NhZGUgQ1NTIChzdGVzc2Egc3BlY2lmaWNpdMOgICN1aWQsIHBvc2l6aW9uZSBzdWNjZXNzaXZhKS5cclxuY29uc3QgREVGQVVMVF9GSUVMRF9TVFlMRVM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XHJcbiAgLy8gRGVzY3JpemlvbmVOb3JtYWxlOiAnZm9udC1zaXplOiB4LWxhcmdlOycsXHJcbiAgLy8gSWwgd3JhcHBlciBvdXRsaW5lZCBoYSBvdmVyZmxvdzp2aXNpYmxlLCBxdWluZGkgc2VuemEgYm9yZGVyLXJhZGl1cyBpbCBiYWNrZ3JvdW5kXHJcbiAgLy8gbm9uIHJpc3BldHRlcmViYmUgZ2xpIGFuZ29saSBhcnJvdG9uZGF0aSBkZWwgbm90Y2hlZC1vdXRsaW5lICg0cHggZGVmYXVsdCBBbmd1bGFyIE1hdGVyaWFsKS5cclxuICBDb250YWluZXJOb3JtYWxlOiAnYm9yZGVyLXJhZGl1czogNHB4OycsXHJcbiAgLy8gUmllbnRyYSBpbCB0ZXN0byBkYWxsYSBzaW5pc3RyYSBkZWxsJ2luZml4IChwYWRkaW5nLWxlZnQgcmltb3NzbyBkYWwgd3JhcHBlciBjb24gaWwgZml4IGljb25lKS5cclxuICBJbnB1dE5vcm1hbGU6ICdwYWRkaW5nLWxlZnQ6IDVweDsnLFxyXG59O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0ZXh0LWZpZWxkLXRlbXBsYXRlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGV4dC1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGV4dC1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUZXh0RmllbGRUZW1wbGF0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIElCYXNlRmllbGRDb21wb25lbnQge1xyXG4gIGlzU3RpbGxSZWNvZ2luemUgPSBmYWxzZTtcclxuICBzb3VyY2UgPSBpbnRlcnZhbCgyMDApO1xyXG4gIG5ld3RleHQ6IHN0cmluZztcclxuICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgQElucHV0KCkgZmllbGQ6IFRleHRGaWVsZDtcclxuICBASW5wdXQoKSByZWNvcmQ6IFJlY29yZDtcclxuICBASW5wdXQoKSBmb3JtdWxhT2JqZWN0OiBhbnkgPSB7fTtcclxuICBASW5wdXQoKSBpbkNvbmZpZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8qKiBJbmNyZW1lbnRhIGRhbGwnZXN0ZXJubyBwZXIgZm9yemFyZSBpbCByaWNhbGNvbG8gZGVnbGkgc3RpbGkgQ1NTIChlcy4gZGFsIGNvbmZpZ3VyYXRvcmUpICovXHJcbiAgQElucHV0KCkgc3R5bGVWZXJzaW9uOiBudW1iZXIgPSAwO1xyXG4gIC8qKiBGb3J6YSB2aXNpdmFtZW50ZSB1bm8gc3RhdG8gc3BlY2lmaWNvIG5lbGwnYW50ZXByaW1hIGRlbCBjb25maWd1cmF0b3JlICovXHJcbiAgQElucHV0KCkgZm9yY2VTdGF0ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIEZpZWxkc3R5bGVPYmo6IGFueTtcclxuICBMYWJlbHN0eWxlT2JqOiBhbnk7XHJcblxyXG4gIEBPdXRwdXQoKSByZWNvcmRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxSZWNvcmQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ+KCk7XHJcbiAgSW5wdXRNYXNrRW51bSA9IFRleHRNYXNrRW51bTtcclxuICBUZXh0RmllbGRJY29uUG9zaXRpb25FbnVtID0gVGV4dEZpZWxkSWNvblBvc2l0aW9uRW51bTtcclxuXHJcbiAgcGxhdGZvcm06IHN0cmluZyA9IENhcGFjaXRvci5nZXRQbGF0Zm9ybSgpO1xyXG5cclxuICBmaWVsZFVpZDogc3RyaW5nO1xyXG4gIHByaXZhdGUgc3R5bGVFbDogSFRNTFN0eWxlRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgc3RhdHVzU3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZmllbGRVaWQgPSAndGYtJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEwKTtcclxuICAgIHRoaXMudXBkYXRlRmllbGQoKTtcclxuICAgIHRoaXMuaW5pdFN0eWxlcygpO1xyXG4gICAgdGhpcy5pbmplY3RUZXh0RmllbGRTdHlsZXMoKTtcclxuICAgIHRoaXMuc3Vic2NyaWJlVG9Gb3JtU3RhdHVzKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlc1snc3R5bGVWZXJzaW9uJ10gJiYgIWNoYW5nZXNbJ3N0eWxlVmVyc2lvbiddLmZpcnN0Q2hhbmdlKSB7XHJcbiAgICAgIHRoaXMuaW5qZWN0VGV4dEZpZWxkU3R5bGVzKCk7XHJcbiAgICAgIHRoaXMudXBkYXRlU3RhdGVDbGFzc2VzKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1snZm9yY2VTdGF0ZSddKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlU3RhdGVDbGFzc2VzKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1sncmVjb3JkJ10gIT0gdW5kZWZpbmVkICYmIGNoYW5nZXNbJ3JlY29yZCddLmZpcnN0Q2hhbmdlID09IGZhbHNlXHJcbiAgICAgICYmIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbJ3JlY29yZCddLmN1cnJlbnRWYWx1ZSkgIT0gSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1sncmVjb3JkJ10ucHJldmlvdXNWYWx1ZSkpIHtcclxuICAgICAgdGhpcy5yZWNvcmQgPSBjaGFuZ2VzWydyZWNvcmQnXS5jdXJyZW50VmFsdWU7XHJcbiAgICAgIHRoaXMudXBkYXRlRmllbGQoKTtcclxuICAgICAgdGhpcy51cGRhdGVTdGF0ZUNsYXNzZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc3R5bGVFbD8ucGFyZW50Tm9kZSkge1xyXG4gICAgICB0aGlzLnN0eWxlRWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnN0eWxlRWwpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdGF0dXNTdWI/LnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBpbml0U3R5bGVzKCkge1xyXG4gICAgaWYgKHRoaXMuZmllbGQuRmllbGRzdHlsZUNTUyAhPSBudWxsIHx8IHRoaXMuZmllbGQuRmllbGRzdHlsZUNTUyAhPSB1bmRlZmluZWQpXHJcbiAgICAgIHRoaXMuRmllbGRzdHlsZU9iaiA9IFV0aWxpdHlIZWxwZXJTZXJ2aWNlLmluaXRTdHlsZXModGhpcy5maWVsZC5GaWVsZHN0eWxlQ1NTKTtcclxuICAgIGlmICh0aGlzLmZpZWxkLkxhYmVsc3R5bGVDU1MgIT0gbnVsbCB8fCB0aGlzLmZpZWxkLkxhYmVsc3R5bGVDU1MgIT0gdW5kZWZpbmVkKVxyXG4gICAgICB0aGlzLkxhYmVsc3R5bGVPYmogPSBVdGlsaXR5SGVscGVyU2VydmljZS5pbml0U3R5bGVzKHRoaXMuZmllbGQuTGFiZWxzdHlsZUNTUyk7XHJcbiAgfVxyXG5cclxuICAvKiogUmlnZW5lcmEgaWwgdGFnIDxzdHlsZT4gY29uIGRlZmF1bHRzICsgcmVnb2xlIHV0ZW50ZSwgZW50cmFtYmkgc2NvcGVkIHBlciAjdWlkICovXHJcbiAgaW5qZWN0VGV4dEZpZWxkU3R5bGVzKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmZpZWxkVWlkKSByZXR1cm47XHJcbiAgICBjb25zdCBjc3MgPSAodGhpcy5maWVsZCBhcyBUZXh0RmllbGQpPy5UZXh0RmllbGRTdHlsZUNTUyA/PyAoe30gYXMgVGV4dEZpZWxkU3R5bGVDU1MpO1xyXG4gICAgbGV0IHJ1bGVzID0gdGhpcy5idWlsZENzc1J1bGVzKHRoaXMuZmllbGRVaWQsIGNzcyk7XHJcbiAgICAvLyBJbiBhbnRlcHJpbWEgY29uZmlndXJhdG9yZSBsYSBzcGF6aWF0dXJhIGluZmVyaW9yZSBkZWwgc3Vic2NyaXB0LXdyYXBwZXIgw6ggaW5kZXNpZGVyYXRhOlxyXG4gICAgLy8gZXNpc3RlIHBlciBpbCBsYXlvdXQgZGVsIGZvcm0gdmVybyBtYSBuZWwgcGFubmVsbG8gZGkgY29uZmlndXJhemlvbmUgY29tcHJpbWUgbCdhbnRlcHJpbWEuXHJcbiAgICBpZiAodGhpcy5pbkNvbmZpZykge1xyXG4gICAgICBydWxlcyArPSBgXFxuIyR7dGhpcy5maWVsZFVpZH0gLm1hdC1tZGMtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlciB7IGRpc3BsYXk6IG5vbmU7IH1gO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5zdHlsZUVsKSB7XHJcbiAgICAgIHRoaXMuc3R5bGVFbCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3R5bGUnKSBhcyBIVE1MU3R5bGVFbGVtZW50O1xyXG4gICAgICB0aGlzLnN0eWxlRWwuaWQgPSAnc3R5bGUtJyArIHRoaXMuZmllbGRVaWQ7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuaGVhZCwgdGhpcy5zdHlsZUVsKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3R5bGVFbC50ZXh0Q29udGVudCA9IHJ1bGVzO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvc3RydWlzY2UgaWwgc2VsZXR0b3JlIENTUyBwZXIgdW4gZGF0byBlbGVtZW50byBlIHN0YXRvICovXHJcbiAgcHJpdmF0ZSBnZXRTZWxlY3Rvcih1aWQ6IHN0cmluZywgX2VsOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcsIHM6IHN0cmluZywgX3N1Yjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBzd2l0Y2ggKHN0YXRlKSB7XHJcbiAgICAgIGNhc2UgJ05vcm1hbGUnOiAgIHJldHVybiBgIyR7dWlkfSR7c31gO1xyXG4gICAgICBjYXNlICdNb3VzZW92ZXInOiByZXR1cm4gYCMke3VpZH06aG92ZXIke3N9LCAjJHt1aWR9LmVxcC1zdGF0ZS1ob3ZlciR7c31gO1xyXG4gICAgICBjYXNlICdGb2N1c2VkJzogICByZXR1cm4gYCMke3VpZH06Zm9jdXMtd2l0aGluJHtzfSwgIyR7dWlkfS5lcXAtc3RhdGUtZm9jdXNlZCR7c31gO1xyXG4gICAgICBjYXNlICdOb3RWYWxpZCc6ICByZXR1cm4gYCMke3VpZH0uZXFwLWludmFsaWQke3N9YDtcclxuICAgICAgY2FzZSAnUmVhZG9ubHknOiAgcmV0dXJuIGAjJHt1aWR9LmVxcC1yZWFkb25seSR7c31gO1xyXG4gICAgICBkZWZhdWx0OiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBQcm9wYWdhIGdsaSBzdGlsaSBib3JkZXIgZGkgQ29udGFpbmVyIGFpIHNlZ21lbnRpIGRlbCBib3JkbyBNREMgKGxlYWRpbmcvbm90Y2gvdHJhaWxpbmcpXHJcbiAgICogIGNvbiBsb2dpY2EgZGlmZmVyZW56aWF0YSBwZXIgZXZpdGFyZSBpbCBkb3BwaW8gYm9yZG86XHJcbiAgICogIC0gYGJvcmRlcmAgc2hvcnRoYW5kIG8gYGJvcmRlci13aWR0aGAg4oaSIGlsIGJvcmRvIHZpc2l2byDDqCBnacOgIHN1bCB3cmFwcGVyIOKGkiBpIHNlZ21lbnRpXHJcbiAgICogICAgdmVuZ29ubyBzb3BwcmVzc2kgY29uIGJvcmRlci1jb2xvcjp0cmFuc3BhcmVudC5cclxuICAgKiAgLSBTb2xvIGBib3JkZXItY29sb3JgIOKGkiBhcHBsaWNhdG8gYWkgc2VnbWVudGkgcGVyIHNvdnJhc2NyaXZlcmUgaWwgcmluZyBibHUvaG92ZXIgZGlcclxuICAgKiAgICBNYXRlcmlhbCAoc3BlY2lmaWNpdMOgICN1aWQgPiBzcGVjaWZpY2l0w6AgZGkgY2xhc3NlIE1hdGVyaWFsKS5cclxuICAgKiAgLSBgYm9yZGVyLXJhZGl1c2AgZSBhbHRyZSBwcm9wcmlldMOgIGJvcmRlci0qIG5vbiB2ZW5nb25vIHByb3BhZ2F0ZSBhaSBzZWdtZW50aS4gKi9cclxuICBwcml2YXRlIGFwcGx5Qm9yZGVyVG9PdXRsaW5lKHNlbGVjdG9yOiBzdHJpbmcsIGNzczogc3RyaW5nLCBsaW5lczogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgIGlmICghY3NzPy50cmltKCkpIHJldHVybjtcclxuICAgIGNvbnN0IGRlY2xzID0gY3NzLnNwbGl0KCc7JykubWFwKGQgPT4gZC50cmltKCkpLmZpbHRlcihkID0+IC9eYm9yZGVyL2kudGVzdChkKSAmJiBkLmxlbmd0aCA+IDApO1xyXG4gICAgaWYgKCFkZWNscy5sZW5ndGgpIHJldHVybjtcclxuICAgIGlmIChkZWNscy5zb21lKGQgPT4gL15ib3JkZXIoPyEtKGNvbG9yfHJhZGl1cykpL2kudGVzdChkKSkpIHtcclxuICAgICAgbGluZXMucHVzaChgJHtzZWxlY3Rvcn0geyBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50OyB9YCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBjb2xvckRlY2xzID0gZGVjbHMuZmlsdGVyKGQgPT4gL15ib3JkZXItY29sb3IvaS50ZXN0KGQpKS5qb2luKCc7ICcpO1xyXG4gICAgICBpZiAoY29sb3JEZWNscy50cmltKCkpIGxpbmVzLnB1c2goYCR7c2VsZWN0b3J9IHsgJHtjb2xvckRlY2xzfTsgfWApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFNlbGV0dG9yZSBjb21iaW5hdG8gcGVyIGkgdHJlIHNlZ21lbnRpIGRlbCBib3JkbyBNREMgb3V0bGluZWQgKGxlYWRpbmcsIG5vdGNoLCB0cmFpbGluZykuXHJcbiAgICogIFVzYXRvIHBlciBkdXBsaWNhcmUgaWwgQ1NTIGRpIENvbnRhaW5lciBzdWwgYm9yZG8gdmlzdWFsZSBlIHBlcm1ldHRlcmUgbCdvdmVycmlkZSBkZWwgcmluZy4gKi9cclxuICBwcml2YXRlIGdldE91dGxpbmVTZWxlY3Rvcih1aWQ6IHN0cmluZywgc3RhdGU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3Qgc2VncyA9IChwcmVmOiBzdHJpbmcpID0+IFtcclxuICAgICAgYCMke3VpZH0ke3ByZWZ9IC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nYCxcclxuICAgICAgYCMke3VpZH0ke3ByZWZ9IC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaGAsXHJcbiAgICAgIGAjJHt1aWR9JHtwcmVmfSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmdgLFxyXG4gICAgXS5qb2luKCcsICcpO1xyXG4gICAgc3dpdGNoIChzdGF0ZSkge1xyXG4gICAgICBjYXNlICdOb3JtYWxlJzogICByZXR1cm4gc2VncygnJyk7XHJcbiAgICAgIGNhc2UgJ01vdXNlb3Zlcic6IHJldHVybiBgJHtzZWdzKCc6aG92ZXInKX0sICR7c2VncygnLmVxcC1zdGF0ZS1ob3ZlcicpfWA7XHJcbiAgICAgIGNhc2UgJ0ZvY3VzZWQnOiAgIHJldHVybiBgJHtzZWdzKCc6Zm9jdXMtd2l0aGluJyl9LCAke3NlZ3MoJy5lcXAtc3RhdGUtZm9jdXNlZCcpfWA7XHJcbiAgICAgIGNhc2UgJ05vdFZhbGlkJzogIHJldHVybiBzZWdzKCcuZXFwLWludmFsaWQnKTtcclxuICAgICAgY2FzZSAnUmVhZG9ubHknOiAgcmV0dXJuIHNlZ3MoJy5lcXAtcmVhZG9ubHknKTtcclxuICAgICAgZGVmYXVsdDogICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbWV0dGUgaSBkZWZhdWx0IHByaW1hLCBpIHZhbG9yaSB1dGVudGUgZG9wby5cclxuICAgKiBTdGVzc2Egc3BlY2lmaWNpdMOgICN1aWQg4oaSIGlsIHZhbG9yZSB1dGVudGUgdmluY2UgcGVyIHBvc2l6aW9uZSBuZWwgY2FzY2FkZS5cclxuICAgKiBJY29uYSBoYSBkdWUgc2VsZXR0b3JpIChwcmVmaXggKyBzdWZmaXgpOiBsYSBzdGVzc2EgcmVnb2xhIHZpZW5lIGVtZXNzYSBwZXIgZW50cmFtYmkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBidWlsZENzc1J1bGVzKHVpZDogc3RyaW5nLCBjc3M6IFRleHRGaWVsZFN0eWxlQ1NTKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIC8vIEZpeCBzdHJ1dHR1cmFsZSBpY29uZSDigJQgdHV0dG8gc2NvcGVkIGEgI3VpZCBwZXIgbm9uIHRvY2NhcmUgYWx0cmkgY29tcG9uZW50aTpcclxuICAgIC8vXHJcbiAgICAvLyAxLiBNYXRlcmlhbCBhcHBsaWNhIC5tYXQtbWRjLWZvcm0tZmllbGQtaGFzLWljb24tc3VmZml4IC5tYXQtbWRjLXRleHQtZmllbGQtd3JhcHBlclxyXG4gICAgLy8gICAgeyBwYWRkaW5nLXJpZ2h0OiAwIH0gbWEgbGFzY2lhIGlsIHBhZGRpbmctbGVmdCBpbnRhdHRvLiBRdWVsIHBhZGRpbmctbGVmdCByZXNpZHVvXHJcbiAgICAvLyAgICBjcmVhIHVubyBzdHJpcCBjb2xvcmF0byBhIHNpbmlzdHJhIHNlIENvbnRhaW5lciBoYSB1biBiYWNrZ3JvdW5kLiBMbyBhenplcmlhbW8uXHJcbiAgICAvLyAgICAobWF0LW1kYy1mb3JtLWZpZWxkLWhhcy1pY29uLXN1ZmZpeCDDqCBzZW1wcmUgcHJlc2VudGUgcGVyY2jDqSBpbCBtaWNyb2Zvbm8gw6ggc2VtcHJlXHJcbiAgICAvLyAgICB1biBtYXRTdWZmaXggbmVsIERPTSwgYW5jaGUgcXVhbmRvIFtoaWRkZW5dLilcclxuICAgIGxpbmVzLnB1c2goXHJcbiAgICAgIGAjJHt1aWR9IG1hdC1mb3JtLWZpZWxkLm1hdC1tZGMtZm9ybS1maWVsZC1oYXMtaWNvbi1zdWZmaXggLm1hdC1tZGMtdGV4dC1maWVsZC13cmFwcGVyYCArXHJcbiAgICAgIGAgeyBwYWRkaW5nLWxlZnQ6IDA7IH1gXHJcbiAgICApO1xyXG4gICAgbGluZXMucHVzaChcclxuICAgICAgYCMke3VpZH0gbWF0LWZvcm0tZmllbGQubWF0LW1kYy1mb3JtLWZpZWxkLWhhcy1pY29uLXByZWZpeCAubWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXJgICtcclxuICAgICAgYCB7IHBhZGRpbmctcmlnaHQ6IDA7IH1gXHJcbiAgICApO1xyXG4gICAgLy9cclxuICAgIC8vIDIuIFByZWZpeDogTWF0ZXJpYWwgZGVmYXVsdCDDqCBwYWRkaW5nOiAwIDRweCAwIDAg4oCUIHF1ZWwgNHB4IGNyZWEgbG8gc3RyaXAgYSBzaW5pc3RyYVxyXG4gICAgLy8gICAgYW5jaGUgc2VuemEgaWNvbmEuIExvIGF6emVyaWFtbyBzZW1wcmUuIFF1YW5kbyBsJ2ljb25hIG5vbiBjJ8OoOiBkaXNwbGF5Om5vbmUuXHJcbiAgICAvLyAzLiBTdWZmaXg6IHF1YW5kbyBub24gYyfDqCBuw6kgaWNvbmEgZGVzdHJhIG7DqSBtaWNyb2Zvbm8gYXR0aXZvOiBkaXNwbGF5Om5vbmUgKE1hdGVyaWFsXHJcbiAgICAvLyAgICBsYXNjaWEgZGlzcGxheTpmbGV4IHN1bCBjb250YWluZXIgYW5jaGUgcXVhbmRvIGlsIGNvbnRlbnV0byDDqCBbaGlkZGVuXSkuXHJcbiAgICBjb25zdCB0ZiA9IHRoaXMuZmllbGQgYXMgVGV4dEZpZWxkO1xyXG4gICAgY29uc3QgaGFzUHJlZml4ID0gISEodGYuSWNvbk5hbWUgJiYgdGYuSWNvblBvc2l0aW9uICE9PSBUZXh0RmllbGRJY29uUG9zaXRpb25FbnVtLkRlc3RyYSk7XHJcbiAgICBjb25zdCBoYXNTdWZmaXggPSAhISh0Zi5JY29uTmFtZSAmJiB0Zi5JY29uUG9zaXRpb24gPT09IFRleHRGaWVsZEljb25Qb3NpdGlvbkVudW0uRGVzdHJhKVxyXG4gICAgICAgICAgICAgICAgICAgIHx8ICEhKHRmLk1pY3JvcGhvbmUgJiYgdGhpcy5wbGF0Zm9ybSA9PT0gJ3dlYicpO1xyXG4gICAgbGluZXMucHVzaChcclxuICAgICAgYCMke3VpZH0gLm1hdC1tZGMtZm9ybS1maWVsZC1pY29uLXByZWZpeCB7ICR7aGFzUHJlZml4XHJcbiAgICAgICAgPyAnYWxpZ24tc2VsZjogc3RyZXRjaDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgcGFkZGluZzogMDsnXHJcbiAgICAgICAgOiAnZGlzcGxheTogbm9uZTsnfSB9YFxyXG4gICAgKTtcclxuICAgIGxpbmVzLnB1c2goXHJcbiAgICAgIGAjJHt1aWR9IC5tYXQtbWRjLWZvcm0tZmllbGQtaWNvbi1zdWZmaXggeyAke2hhc1N1ZmZpeFxyXG4gICAgICAgID8gJ2FsaWduLXNlbGY6IHN0cmV0Y2g7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IHBhZGRpbmc6IDA7J1xyXG4gICAgICAgIDogJ2Rpc3BsYXk6IG5vbmU7J30gfWBcclxuICAgICk7XHJcbiAgICAvLyBJbCAubWRjLW5vdGNoZWQtb3V0bGluZSAocGFyZW50IGRlaSB0cmUgc2VnbWVudGkgZGkgYm9yZG8gTURDKSBub24gZGV2ZSBhdmVyZSBtYWkgdW5cclxuICAgIC8vIGJvcmRvIHByb3ByaW86IGlsIGJvcmRvIHZpc2l2byBkZWwgY2FtcG8gdmllbmUgZGFpIHNlZ21lbnRpIGZpZ2xpIG8gZGFsIHdyYXBwZXIgQ29udGFpbmVyLlxyXG4gICAgbGluZXMucHVzaChgIyR7dWlkfSAubWRjLW5vdGNoZWQtb3V0bGluZSB7IGJvcmRlcjogMDsgfWApO1xyXG4gICAgLy8gQW5ndWxhciBNYXRlcmlhbCBpbXBvc3RhIGNvbG9yIGRpcmV0dGFtZW50ZSBzdWxsJ2lucHV0IChzcGVjaWZpY2l0w6AgMCwzLDApLCBjaGUgYmF0dGVcclxuICAgIC8vIHF1YWxzaWFzaSB2YWxvcmUgZXJlZGl0YXRvIGRhbCB3cmFwcGVyLiBDb24gY29sb3I6aW5oZXJpdCBmb3J6aWFtbyBsJ2VyZWRpdGFyaWV0w6BcclxuICAgIC8vIChzcGVjaWZpY2l0w6AgMSwxLDEgPiAwLDMsMCksIGNvc8OsIGlsIGNvbG9yIGltcG9zdGF0byBzdSBJbnB1dE5vcm1hbGUgc2kgcHJvcGFnYSBhbCB0ZXN0by5cclxuICAgIGxpbmVzLnB1c2goYCMke3VpZH0gaW5wdXQubWF0LW1kYy1pbnB1dC1lbGVtZW50IHsgY29sb3I6IGluaGVyaXQ7IH1gKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGVsIG9mIEVMRU1FTlRTKSB7XHJcbiAgICAgIGNvbnN0IHNFbnRyeSA9IEVMRU1FTlRfU0VMRUNUT1JTW2VsXTtcclxuICAgICAgY29uc3Qgc2VsTGlzdCA9IEFycmF5LmlzQXJyYXkoc0VudHJ5KSA/IHNFbnRyeSA6IFtzRW50cnldO1xyXG5cclxuICAgICAgZm9yIChjb25zdCBzdGF0ZSBvZiBTVEFURVMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBlbCArIHN0YXRlO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWw6IHN0cmluZyB8IHVuZGVmaW5lZCA9IERFRkFVTFRfRklFTERfU1RZTEVTW2tleV07XHJcbiAgICAgICAgY29uc3QgdXNlclZhbDogc3RyaW5nIHwgdW5kZWZpbmVkID0gKGNzcyBhcyBhbnkpW2tleV07XHJcblxyXG4gICAgICAgIGlmICghZGVmYXVsdFZhbD8udHJpbSgpICYmICF1c2VyVmFsPy50cmltKCkpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHMgb2Ygc2VsTGlzdCkge1xyXG4gICAgICAgICAgY29uc3Qgc3ViID0gcy50cmltKCk7XHJcbiAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMuZ2V0U2VsZWN0b3IodWlkLCBlbCwgc3RhdGUsIHMsIHN1Yik7XHJcbiAgICAgICAgICBpZiAoIXNlbGVjdG9yKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICBpZiAoZGVmYXVsdFZhbD8udHJpbSgpKSBsaW5lcy5wdXNoKGAke3NlbGVjdG9yfSB7ICR7ZGVmYXVsdFZhbH0gfWApO1xyXG4gICAgICAgICAgaWYgKHVzZXJWYWw/LnRyaW0oKSkgICAgbGluZXMucHVzaChgJHtzZWxlY3Rvcn0geyAke3VzZXJWYWx9IH1gKTtcclxuXHJcbiAgICAgICAgICAvLyBQZXIgQ29udGFpbmVyOiBwcm9wYWdhIGxlIHByb3ByaWV0w6AgYm9yZGVyIGFpIHNlZ21lbnRpIE1EQyAobm90Y2hlZC1vdXRsaW5lX18qKS5cclxuICAgICAgICAgIC8vIFNlIGlsIENTUyBpbXBvc3RhIHVubyBzcGVzc29yZSAoYm9yZGVyL2JvcmRlci13aWR0aCkg4oaSIGlsIGJvcmRvIHZpc2l2byDDqCBnacOgIHN1bFxyXG4gICAgICAgICAgLy8gd3JhcHBlciwgaSBzZWdtZW50aSB2ZW5nb25vIHNvcHByZXNzaSAoYm9yZGVyLWNvbG9yOnRyYW5zcGFyZW50KSBwZXIgZXZpdGFyZSBpbFxyXG4gICAgICAgICAgLy8gZG9wcGlvIGJvcmRvLiBTZSBpbXBvc3RhIHNvbG8gYm9yZGVyLWNvbG9yIOKGkiB2aWVuZSBhcHBsaWNhdG8gYWkgc2VnbWVudGkgcGVyXHJcbiAgICAgICAgICAvLyBzb3ZyYXNjcml2ZXJlIGlsIHJpbmcgYmx1L2hvdmVyIGRpIE1hdGVyaWFsIChzcGVjaWZpY2l0w6AgMSwyLDAgPiAwLDIsMCkuXHJcbiAgICAgICAgICBpZiAoZWwgPT09ICdDb250YWluZXInKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG91dGxpbmVTZWwgPSB0aGlzLmdldE91dGxpbmVTZWxlY3Rvcih1aWQsIHN0YXRlKTtcclxuICAgICAgICAgICAgaWYgKG91dGxpbmVTZWwpIHtcclxuICAgICAgICAgICAgICB0aGlzLmFwcGx5Qm9yZGVyVG9PdXRsaW5lKG91dGxpbmVTZWwsIGRlZmF1bHRWYWwgPz8gJycsIGxpbmVzKTtcclxuICAgICAgICAgICAgICB0aGlzLmFwcGx5Qm9yZGVyVG9PdXRsaW5lKG91dGxpbmVTZWwsIHVzZXJWYWwgPz8gJycsIGxpbmVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcclxuICB9XHJcblxyXG4gIC8qKiBBZ2dpb3JuYSBsZSBjbGFzc2kgZGkgc3RhdG8gc3VsIHdyYXBwZXIgKGVxcC1pbnZhbGlkLCBlcXAtcmVhZG9ubHksIGVxcC1zdGF0ZS0qKSAqL1xyXG4gIHByaXZhdGUgdXBkYXRlU3RhdGVDbGFzc2VzKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmZpZWxkVWlkKSByZXR1cm47XHJcbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5maWVsZFVpZCk7XHJcbiAgICBpZiAoIXdyYXBwZXIpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtc3RhdGUtaG92ZXInLCAgIHRoaXMuZm9yY2VTdGF0ZSA9PT0gJ01vdXNlb3ZlcicpO1xyXG4gICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLXN0YXRlLWZvY3VzZWQnLCB0aGlzLmZvcmNlU3RhdGUgPT09ICdGb2N1c2VkJyk7XHJcblxyXG4gICAgaWYgKHRoaXMuZm9yY2VTdGF0ZSA9PT0gJ05vdFZhbGlkJykge1xyXG4gICAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtaW52YWxpZCcsIHRydWUpO1xyXG4gICAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtcmVhZG9ubHknLCBmYWxzZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZvcmNlU3RhdGUgPT09ICdSZWFkb25seScpIHtcclxuICAgICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLXJlYWRvbmx5JywgdHJ1ZSk7XHJcbiAgICAgIHRoaXMudG9nZ2xlQ2xhc3Mod3JhcHBlciwgJ2VxcC1pbnZhbGlkJywgZmFsc2UpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5mb3JjZVN0YXRlID09PSAnTm9ybWFsZScgfHwgdGhpcy5mb3JjZVN0YXRlID09PSAnTW91c2VvdmVyJyB8fCB0aGlzLmZvcmNlU3RhdGUgPT09ICdGb2N1c2VkJykge1xyXG4gICAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtaW52YWxpZCcsIGZhbHNlKTtcclxuICAgICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLXJlYWRvbmx5JywgZmFsc2UpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNSZWFkb25seSA9IHRoaXMuZmllbGQuUmVhZG9ubHkgfHwgKHRoaXMuZmllbGQuRm9ybXVsYSAhPSBudWxsICYmIHRoaXMuZmllbGQuRm9ybXVsYSAhPT0gJycpO1xyXG4gICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLXJlYWRvbmx5JywgaXNSZWFkb25seSk7XHJcblxyXG4gICAgY29uc3QgY3RybCA9IHRoaXMuZmllbGQuRm9ybUZvcm1Hcm91cD8uY29udHJvbHM/Llt0aGlzLmZpZWxkLk5hbWVdO1xyXG4gICAgaWYgKGN0cmw/LnRvdWNoZWQpIHtcclxuICAgICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLWludmFsaWQnLCB0aGlzLmZpZWxkLkZvcm1Gb3JtR3JvdXAuaW52YWxpZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtaW52YWxpZCcsIGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9nZ2xlQ2xhc3MoZWw6IEVsZW1lbnQsIGNsczogc3RyaW5nLCBjb25kaXRpb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChjb25kaXRpb24pIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWwsIGNscyk7XHJcbiAgICBlbHNlIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZWwsIGNscyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1YnNjcmliZVRvRm9ybVN0YXR1cygpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdHVzU3ViPy51bnN1YnNjcmliZSgpO1xyXG4gICAgaWYgKHRoaXMuZmllbGQ/LkZvcm1Gb3JtR3JvdXApIHtcclxuICAgICAgdGhpcy5zdGF0dXNTdWIgPSB0aGlzLmZpZWxkLkZvcm1Gb3JtR3JvdXAuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVTdGF0ZUNsYXNzZXMoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRJbnB1dFR5cGUoKSB7XHJcbiAgICBzd2l0Y2ggKE51bWJlcih0aGlzLmZpZWxkLlRleHRNYXNrKSkge1xyXG4gICAgICBjYXNlIFRleHRNYXNrRW51bS5FbWFpbDogICAgcmV0dXJuICdlbWFpbCc7XHJcbiAgICAgIGNhc2UgVGV4dE1hc2tFbnVtLlBhc3N3b3JkOiByZXR1cm4gJ3Bhc3N3b3JkJztcclxuICAgICAgY2FzZSBUZXh0TWFza0VudW0uVGVsZWZvbm86IHJldHVybiAndGVsJztcclxuICAgICAgY2FzZSBUZXh0TWFza0VudW0uVXJsOiAgICAgIHJldHVybiAndXJsJztcclxuICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgIHJldHVybiAndGV4dCc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGaWVsZCgpIHtcclxuICAgIGlmICh0aGlzLmZpZWxkLlJlYWRvbmx5SWYpIHtcclxuICAgICAgdGhpcy5maWVsZC5SZWFkb25seSA9IFV0aWxpdHlIZWxwZXJTZXJ2aWNlLkV2YWx1YXRlRmllbGRGb3JtdWxhKHRoaXMuZmllbGQuUmVhZG9ubHlJZiwgdGhpcy5yZWNvcmQsIHRoaXMuZm9ybXVsYU9iamVjdCk7XHJcbiAgICB9XHJcbiAgICBpZiAoKHRoaXMuZmllbGQuRGF0YUdldHRlci5EYXRhR2V0dGVyVHlwZSA9PSBEYXRhR2V0dGVyVHlwZUVudW0uTWFudWFsZSB8fCB0aGlzLmZpZWxkLkRhdGFHZXR0ZXIuRGF0YUdldHRlclR5cGUgPT0gRGF0YUdldHRlclR5cGVFbnVtLkZvcm11bGEpICYmIHRoaXMuZmllbGQuRm9ybXVsYSkge1xyXG4gICAgICB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdID0gVXRpbGl0eUhlbHBlclNlcnZpY2UuRXZhbHVhdGVGaWVsZEZvcm11bGEodGhpcy5maWVsZC5Gb3JtdWxhLCB0aGlzLnJlY29yZCwgdGhpcy5mb3JtdWxhT2JqZWN0KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZpZWxkLlZpc2libGVJZikge1xyXG4gICAgICB0aGlzLmZpZWxkLkluTGlzdFZpZXcgPSBVdGlsaXR5SGVscGVyU2VydmljZS5FdmFsdWF0ZUZpZWxkRm9ybXVsYSh0aGlzLmZpZWxkLlZpc2libGVJZiwgdGhpcy5yZWNvcmQsIHRoaXMuZm9ybXVsYU9iamVjdCk7XHJcbiAgICAgIGlmICghdGhpcy5maWVsZC5Jbkxpc3RWaWV3ICYmICF0aGlzLmZpZWxkLk1haW50YWluX1ZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZpZWxkLkRhdGFHZXR0ZXIuRGF0YUdldHRlclR5cGUgPT0gRGF0YUdldHRlclR5cGVFbnVtLk1hbnVhbGUgJiYgdGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSA9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gPSB0aGlzLmZpZWxkLkRhdGFHZXR0ZXIuRGF0YUdldHRlclZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25SZWNvcmRWYWx1ZUNoYW5nZSgpIHtcclxuICAgIHRoaXMudXBkYXRlU3RhdGVDbGFzc2VzKCk7XHJcbiAgICBpZiAoIXRoaXMuZmllbGQuRm9ybXVsYSkge1xyXG4gICAgICB0aGlzLnJlY29yZENoYW5nZS5lbWl0KHRoaXMucmVjb3JkKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5maWVsZC5WaXNpYmxlSWYpIHtcclxuICAgICAgdGhpcy5yZWNvcmRDaGFuZ2UuZW1pdCh0aGlzLnJlY29yZCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgW2lkXT1cImZpZWxkVWlkXCIgY2xhc3M9XCJlcXAtdGYtd3JhcHBlclwiPlxyXG4gIDxtYXQtZm9ybS1maWVsZCBbZm9ybUdyb3VwXT1cImZpZWxkLkZvcm1Gb3JtR3JvdXBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgPG1hdC1sYWJlbCBjbGFzcz1cInB0LTFcIiBbbmdTdHlsZV09XCJMYWJlbHN0eWxlT2JqXCI+XHJcbiAgICAgIHt7IGZpZWxkLkRlc2NyaXB0aW9uIH19XHJcbiAgICA8L21hdC1sYWJlbD5cclxuICAgIDx0bXctaWNvbiBjbGFzcz1cIm1hdC1pY29uXCIgKm5nSWY9XCJmaWVsZC5JY29uTmFtZSAmJiBmaWVsZC5JY29uUG9zaXRpb24gIT0gVGV4dEZpZWxkSWNvblBvc2l0aW9uRW51bS5EZXN0cmFcIiBtYXRQcmVmaXhcclxuICAgICAgW25hbWVdPVwiZmllbGQuSWNvbk5hbWVcIj5cclxuICAgIDwvdG13LWljb24+XHJcbiAgICA8aW5wdXRcclxuICAgICAgW25nU3R5bGVdPVwiRmllbGRzdHlsZU9ialwiXHJcbiAgICAgIG1hdElucHV0XHJcbiAgICAgIFt0eXBlXT1cImdldElucHV0VHlwZSgpXCJcclxuICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5OYW1lXCJcclxuICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLlJlYWRvbmx5IHx8IChmaWVsZC5Gb3JtdWxhICE9IG51bGwgJiYgZmllbGQuRm9ybXVsYSAhPSAnJylcIlxyXG4gICAgICBbcmVxdWlyZWRdPVwiZmllbGQuUmVxdWlyZWRcIlxyXG4gICAgICBbKG5nTW9kZWwpXT1cInJlY29yZFtmaWVsZC5OYW1lXVwiXHJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uUmVjb3JkVmFsdWVDaGFuZ2UoKVwiXHJcbiAgICAvPlxyXG4gICAgPG1hdC1lcnJvclxyXG4gICAgICAqbmdJZj1cIlxyXG4gICAgICAgICFmaWVsZC5Gb3JtRm9ybUdyb3VwLnZhbGlkICYmXHJcbiAgICAgICAgZmllbGQuRm9ybUZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5OYW1lXS50b3VjaGVkICYmXHJcbiAgICAgICAgIWZpZWxkLlJlYWRvbmx5XHJcbiAgICAgIFwiXHJcbiAgICA+XHJcbiAgICAgIE1pbi4gQ2FyYXR0ZXJpOiB7eyBmaWVsZC5NaW5MZW5naHQgfX0gLSBNYXguIENhcmF0dGVyaTpcclxuICAgICAge3sgZmllbGQuTWF4TGVuZ2h0IH19XHJcbiAgICA8L21hdC1lcnJvcj5cclxuICAgIDx0bXctaWNvbiBjbGFzcz1cIm1hdC1pY29uXCJcclxuICAgICAgKm5nSWY9XCJmaWVsZC5JY29uTmFtZSAmJiBmaWVsZC5JY29uUG9zaXRpb24gPT0gVGV4dEZpZWxkSWNvblBvc2l0aW9uRW51bS5EZXN0cmFcIlxyXG4gICAgICBtYXRTdWZmaXhcclxuICAgICAgW25hbWVdPVwiZmllbGQuSWNvbk5hbWVcIj5cclxuICAgIDwvdG13LWljb24+XHJcbiAgICA8dG13LWljb24gY2xhc3M9XCJtYXQtaWNvbiBlcXAtbWljcm9mb25vXCJcclxuICAgICAgW2hpZGRlbl09XCIhZmllbGQuTWljcm9waG9uZSB8fCBwbGF0Zm9ybSAhPSAnd2ViJ1wiXHJcbiAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICBTcGVlY2hUb1RleHRcclxuICAgICAgI21pY1NwZWVjaD1cInNwZWVjaFRvVGV4dFwiXHJcbiAgICAgIFsoYmluZGVkVGV4dCldPVwicmVjb3JkW2ZpZWxkLk5hbWVdXCJcclxuICAgICAgW3ZhcmlhbnRdPVwibWljU3BlZWNoLmlzTGlzdGVuaW5nID8gJ2ZpbGxlZCcgOiAnb3V0bGluZSdcIlxyXG4gICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiXHJcbiAgICAgIG5hbWU9XCJtaWNyb3Bob25lXCI+XHJcbiAgICA8L3Rtdy1pY29uPlxyXG4gIDwvbWF0LWZvcm0tZmllbGQ+XHJcbjwvZGl2PlxyXG4iXX0=
362
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZmllbGQtdGVtcGxhdGVzL3RleHQtZmllbGQtdGVtcGxhdGUvdGV4dC1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZmllbGQtdGVtcGxhdGVzL3RleHQtZmllbGQtdGVtcGxhdGUvdGV4dC1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQTRCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6SixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLFVBQVUsRUFBRSxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUV2SSxPQUFPLEVBQUUseUJBQXlCLEVBQXFCLFlBQVksRUFBYSxNQUFNLDJDQUEyQyxDQUFDO0FBRWxJLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7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SztzQkFBYixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFDbUIsU0FBUztzQkFBakMsU0FBUzt1QkFBQyxZQUFZO2dCQUVkLFVBQVU7c0JBQWxCLEtBQUs7Z0JBS0ksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBSZW5kZXJlcjIsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuaW1wb3J0IHsgcmVmcmVzaE91dGxpbmVOb3RjaCwgd2F0Y2hPdXRsaW5lTm90Y2ggfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscy9yZWZyZXNoLW91dGxpbmUtbm90Y2gnO1xyXG5pbXBvcnQgeyBidWlsZEZsb2F0aW5nTGFiZWxCYXNlUnVsZXMsIGNzc1NldHNUb3AsIExBQkVMX0ZMT0FUSU5HX1NVRkZJWCwgcmVhZFN0eWxlQ3NzIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMvZmxvYXRpbmctbGFiZWwtc3R5bGVzJztcclxuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL3JlY29yZC5tb2RlbCc7XHJcbmltcG9ydCB7IFRleHRGaWVsZEljb25Qb3NpdGlvbkVudW0sIFRleHRGaWVsZFN0eWxlQ1NTLCBUZXh0TWFza0VudW0sIFRleHRGaWVsZCB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9maWVsZHMvdGV4dEZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgSUJhc2VGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL2ludGVyZmFjZXMvaUJhc2VGaWVsZENvbXBvbmVudC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBVdGlsaXR5SGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3V0aWxpdHlIZWxwZXIuc2VydmljZXMnO1xyXG5pbXBvcnQgeyBpbnRlcnZhbCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IERhdGFHZXR0ZXJUeXBlRW51bSB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9iYXNlRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBDYXBhY2l0b3IgfSBmcm9tICdAY2FwYWNpdG9yL2NvcmUnO1xyXG5cclxuLy8gU2VsZXR0b3JpIENTUyBNREMgKEFuZ3VsYXIgTWF0ZXJpYWwgMTUpLlxyXG4vLyBDb250YWluZXIg4oaSIC5tYXQtbWRjLXRleHQtZmllbGQtd3JhcHBlcjogYm94IHZpc3VhbGUgZXN0ZXJubyBkZWwgY2FtcG8gb3V0bGluZWRcclxuLy8gICAoZXNjbHVzbyAubWF0LW1kYy1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyKS4gR2VzdGlzY2Ugc2ZvbmRvLCBib3JkbywgYm9yZGVyLXJhZGl1cyBlc3Rlcm5vLlxyXG4vLyAgIExlIHJlZ29sZSBkaSBDb250YWluZXIgdmVuZ29ubyBkdXBsaWNhdGUgYW5jaGUgc3VpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX18qIHBlciBwZXJtZXR0ZXJlXHJcbi8vICAgZGkgc292cmFzY3JpdmVyZSBpbCBib3JkbyBkaSBmb2N1cy9ob3ZlciBkaSBNYXRlcmlhbCBjb24gbGEgcHJvcHJpZXTDoCBib3JkZXItY29sb3IgZGVsbCd1dGVudGUuXHJcbi8vIElucHV0IOKGkiAubWF0LW1kYy1mb3JtLWZpZWxkLWluZml4OiBhcmVhIGludGVybmEgZG92ZSBzaSBkaWdpdGEgaWwgdGVzdG8uXHJcbi8vICAgSW5kaXBlbmRlbnRlIGRhIENvbnRhaW5lcjogaWwgc3VvIGJhY2tncm91bmQgbm9uIGNvcHJlIGlsIGJveCBlc3Rlcm5vLlxyXG4vLyBJY29uYSDihpIgY29udGFpbmVyIHByZWZpeCArIHN1ZmZpeCAoYWxpZ24tc2VsZjogc3RyZXRjaCBpbmlldHRhdG8gc3RydXR0dXJhbG1lbnRlKS5cclxuLy8gTWljcm9mb25vIOKGkiBzdGVzc28gY29udGFpbmVyIHN1ZmZpeCAodmllbmUgZG9wbyBJY29uYSBuZWwgbG9vcCwgc292cmFzY3JpdmUgcGVyIGlsIHN1ZmZpeCkuXHJcbmNvbnN0IEVMRU1FTlRfU0VMRUNUT1JTOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH0gPSB7XHJcbiAgQ29udGFpbmVyOiAnIC5tYXQtbWRjLXRleHQtZmllbGQtd3JhcHBlcicsXHJcbiAgSW5wdXQ6ICcgLm1hdC1tZGMtZm9ybS1maWVsZC1pbmZpeCcsXHJcbiAgRGVzY3JpemlvbmU6ICcgbGFiZWwubWF0LW1kYy1mbG9hdGluZy1sYWJlbCcsXHJcbiAgLy8gRGVzY3JpemlvbmU6IGdyYWZpY2EgYmFzZSBkZWxsYSBsYWJlbCwgc2VtcHJlIHZhbGlkYS4gU29sbGV2YXRhICh2aXJ0dWFsZSwgc2FsdmF0YSBkZW50cm9cclxuICAvLyBEZXNjcml6aW9uZSk6IG92ZXJyaWRlIHF1YW5kbyDDqCBzdWwgYm9yZG9cclxuICBEZXNjcml6aW9uZVNvbGxldmF0YTogJyBsYWJlbC5tYXQtbWRjLWZsb2F0aW5nLWxhYmVsJyArIExBQkVMX0ZMT0FUSU5HX1NVRkZJWCxcclxuICBJY29uYTogWycgLm1hdC1tZGMtZm9ybS1maWVsZC1pY29uLXByZWZpeCcsICcgLm1hdC1tZGMtZm9ybS1maWVsZC1pY29uLXN1ZmZpeCddLFxyXG4gIE1pY3JvZm9ubzogJyAubWF0LW1kYy1mb3JtLWZpZWxkLWljb24tc3VmZml4JyxcclxuICBFcnJvcmU6ICcgbWF0LWVycm9yJyxcclxufTtcclxuY29uc3QgRUxFTUVOVFMgPSBPYmplY3Qua2V5cyhFTEVNRU5UX1NFTEVDVE9SUyk7XHJcbmNvbnN0IFNUQVRFUyA9IFsnTm9ybWFsZScsICdNb3VzZW92ZXInLCAnRm9jdXNlZCcsICdOb3RWYWxpZCcsICdSZWFkb25seSddO1xyXG5cclxuLy8gU3RpbGkgZGkgZGVmYXVsdCBwZXIgZWxlbWVudG8rc3RhdG86IGVtZXNzaSBwcmltYSBkZWxsZSByZWdvbGUgdXRlbnRlLFxyXG4vLyBjaGUgbGUgc292cmFzY3Jpdm9ubyBwZXIgZWZmZXR0byBkZWwgY2FzY2FkZSBDU1MgKHN0ZXNzYSBzcGVjaWZpY2l0w6AgI3VpZCwgcG9zaXppb25lIHN1Y2Nlc3NpdmEpLlxyXG5jb25zdCBERUZBVUxUX0ZJRUxEX1NUWUxFUzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcclxuICAvLyBEZXNjcml6aW9uZU5vcm1hbGU6ICdmb250LXNpemU6IHgtbGFyZ2U7JyxcclxuICAvLyBJbCB3cmFwcGVyIG91dGxpbmVkIGhhIG92ZXJmbG93OnZpc2libGUsIHF1aW5kaSBzZW56YSBib3JkZXItcmFkaXVzIGlsIGJhY2tncm91bmRcclxuICAvLyBub24gcmlzcGV0dGVyZWJiZSBnbGkgYW5nb2xpIGFycm90b25kYXRpIGRlbCBub3RjaGVkLW91dGxpbmUgKDRweCBkZWZhdWx0IEFuZ3VsYXIgTWF0ZXJpYWwpLlxyXG4gIENvbnRhaW5lck5vcm1hbGU6ICdib3JkZXItcmFkaXVzOiA0cHg7JyxcclxuICAvLyBSaWVudHJhIGlsIHRlc3RvIGRhbGxhIHNpbmlzdHJhIGRlbGwnaW5maXggKHBhZGRpbmctbGVmdCByaW1vc3NvIGRhbCB3cmFwcGVyIGNvbiBpbCBmaXggaWNvbmUpLlxyXG4gIElucHV0Tm9ybWFsZTogJ3BhZGRpbmctbGVmdDogNXB4OycsXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3RleHQtZmllbGQtdGVtcGxhdGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90ZXh0LWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90ZXh0LWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFRleHRGaWVsZFRlbXBsYXRlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgSUJhc2VGaWVsZENvbXBvbmVudCB7XHJcbiAgaXNTdGlsbFJlY29naW56ZSA9IGZhbHNlO1xyXG4gIHNvdXJjZSA9IGludGVydmFsKDIwMCk7XHJcbiAgbmV3dGV4dDogc3RyaW5nO1xyXG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBASW5wdXQoKSBmaWVsZDogVGV4dEZpZWxkO1xyXG4gIEBJbnB1dCgpIHJlY29yZDogUmVjb3JkO1xyXG4gIEBJbnB1dCgpIGZvcm11bGFPYmplY3Q6IGFueSA9IHt9O1xyXG4gIEBJbnB1dCgpIGluQ29uZmlnOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoqIEluY3JlbWVudGEgZGFsbCdlc3Rlcm5vIHBlciBmb3J6YXJlIGlsIHJpY2FsY29sbyBkZWdsaSBzdGlsaSBDU1MgKGVzLiBkYWwgY29uZmlndXJhdG9yZSkgKi9cclxuICBASW5wdXQoKSBzdHlsZVZlcnNpb246IG51bWJlciA9IDA7XHJcbiAgQFZpZXdDaGlsZChNYXRGb3JtRmllbGQpIGZvcm1GaWVsZDogTWF0Rm9ybUZpZWxkO1xyXG4gIC8qKiBGb3J6YSB2aXNpdmFtZW50ZSB1bm8gc3RhdG8gc3BlY2lmaWNvIG5lbGwnYW50ZXByaW1hIGRlbCBjb25maWd1cmF0b3JlICovXHJcbiAgQElucHV0KCkgZm9yY2VTdGF0ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIEZpZWxkc3R5bGVPYmo6IGFueTtcclxuICBMYWJlbHN0eWxlT2JqOiBhbnk7XHJcblxyXG4gIEBPdXRwdXQoKSByZWNvcmRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxSZWNvcmQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ+KCk7XHJcbiAgSW5wdXRNYXNrRW51bSA9IFRleHRNYXNrRW51bTtcclxuICBUZXh0RmllbGRJY29uUG9zaXRpb25FbnVtID0gVGV4dEZpZWxkSWNvblBvc2l0aW9uRW51bTtcclxuXHJcbiAgcGxhdGZvcm06IHN0cmluZyA9IENhcGFjaXRvci5nZXRQbGF0Zm9ybSgpO1xyXG5cclxuICBmaWVsZFVpZDogc3RyaW5nO1xyXG4gIHByaXZhdGUgc3R5bGVFbDogSFRNTFN0eWxlRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgc3RhdHVzU3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBub3RjaE9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZpZWxkVWlkID0gJ3RmLScgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMCk7XHJcbiAgICB0aGlzLnVwZGF0ZUZpZWxkKCk7XHJcbiAgICB0aGlzLmluaXRTdHlsZXMoKTtcclxuICAgIHRoaXMuaW5qZWN0VGV4dEZpZWxkU3R5bGVzKCk7XHJcbiAgICB0aGlzLnN1YnNjcmliZVRvRm9ybVN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXNbJ3N0eWxlVmVyc2lvbiddICYmICFjaGFuZ2VzWydzdHlsZVZlcnNpb24nXS5maXJzdENoYW5nZSkge1xyXG4gICAgICB0aGlzLmluamVjdFRleHRGaWVsZFN0eWxlcygpO1xyXG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlQ2xhc3NlcygpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ2ZvcmNlU3RhdGUnXSkge1xyXG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlQ2xhc3NlcygpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ3N0eWxlVmVyc2lvbiddIHx8IGNoYW5nZXNbJ2ZvcmNlU3RhdGUnXSkge1xyXG4gICAgICByZWZyZXNoT3V0bGluZU5vdGNoKHRoaXMuZm9ybUZpZWxkKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydyZWNvcmQnXSAhPSB1bmRlZmluZWQgJiYgY2hhbmdlc1sncmVjb3JkJ10uZmlyc3RDaGFuZ2UgPT0gZmFsc2VcclxuICAgICAgJiYgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1sncmVjb3JkJ10uY3VycmVudFZhbHVlKSAhPSBKU09OLnN0cmluZ2lmeShjaGFuZ2VzWydyZWNvcmQnXS5wcmV2aW91c1ZhbHVlKSkge1xyXG4gICAgICB0aGlzLnJlY29yZCA9IGNoYW5nZXNbJ3JlY29yZCddLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgdGhpcy51cGRhdGVGaWVsZCgpO1xyXG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlQ2xhc3NlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5ub3RjaE9ic2VydmVyID0gd2F0Y2hPdXRsaW5lTm90Y2godGhpcy5mb3JtRmllbGQpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLm5vdGNoT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcclxuICAgIGlmICh0aGlzLnN0eWxlRWw/LnBhcmVudE5vZGUpIHtcclxuICAgICAgdGhpcy5zdHlsZUVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zdHlsZUVsKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RhdHVzU3ViPy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgaW5pdFN0eWxlcygpIHtcclxuICAgIGlmICh0aGlzLmZpZWxkLkZpZWxkc3R5bGVDU1MgIT0gbnVsbCB8fCB0aGlzLmZpZWxkLkZpZWxkc3R5bGVDU1MgIT0gdW5kZWZpbmVkKVxyXG4gICAgICB0aGlzLkZpZWxkc3R5bGVPYmogPSBVdGlsaXR5SGVscGVyU2VydmljZS5pbml0U3R5bGVzKHRoaXMuZmllbGQuRmllbGRzdHlsZUNTUyk7XHJcbiAgICBpZiAodGhpcy5maWVsZC5MYWJlbHN0eWxlQ1NTICE9IG51bGwgfHwgdGhpcy5maWVsZC5MYWJlbHN0eWxlQ1NTICE9IHVuZGVmaW5lZClcclxuICAgICAgdGhpcy5MYWJlbHN0eWxlT2JqID0gVXRpbGl0eUhlbHBlclNlcnZpY2UuaW5pdFN0eWxlcyh0aGlzLmZpZWxkLkxhYmVsc3R5bGVDU1MpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJpZ2VuZXJhIGlsIHRhZyA8c3R5bGU+IGNvbiBkZWZhdWx0cyArIHJlZ29sZSB1dGVudGUsIGVudHJhbWJpIHNjb3BlZCBwZXIgI3VpZCAqL1xyXG4gIGluamVjdFRleHRGaWVsZFN0eWxlcygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5maWVsZFVpZCkgcmV0dXJuO1xyXG4gICAgY29uc3QgY3NzID0gKHRoaXMuZmllbGQgYXMgVGV4dEZpZWxkKT8uVGV4dEZpZWxkU3R5bGVDU1MgPz8gKHt9IGFzIFRleHRGaWVsZFN0eWxlQ1NTKTtcclxuICAgIGxldCBydWxlcyA9IHRoaXMuYnVpbGRDc3NSdWxlcyh0aGlzLmZpZWxkVWlkLCBjc3MpO1xyXG4gICAgLy8gSW4gYW50ZXByaW1hIGNvbmZpZ3VyYXRvcmUgbGEgc3BhemlhdHVyYSBpbmZlcmlvcmUgZGVsIHN1YnNjcmlwdC13cmFwcGVyIMOoIGluZGVzaWRlcmF0YTpcclxuICAgIC8vIGVzaXN0ZSBwZXIgaWwgbGF5b3V0IGRlbCBmb3JtIHZlcm8gbWEgbmVsIHBhbm5lbGxvIGRpIGNvbmZpZ3VyYXppb25lIGNvbXByaW1lIGwnYW50ZXByaW1hLlxyXG4gICAgaWYgKHRoaXMuaW5Db25maWcpIHtcclxuICAgICAgcnVsZXMgKz0gYFxcbiMke3RoaXMuZmllbGRVaWR9IC5tYXQtbWRjLWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXIgeyBkaXNwbGF5OiBub25lOyB9YDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuc3R5bGVFbCkge1xyXG4gICAgICB0aGlzLnN0eWxlRWwgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJykgYXMgSFRNTFN0eWxlRWxlbWVudDtcclxuICAgICAgdGhpcy5zdHlsZUVsLmlkID0gJ3N0eWxlLScgKyB0aGlzLmZpZWxkVWlkO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmhlYWQsIHRoaXMuc3R5bGVFbCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0eWxlRWwudGV4dENvbnRlbnQgPSBydWxlcztcclxuICB9XHJcblxyXG4gIC8qKiBDb3N0cnVpc2NlIGlsIHNlbGV0dG9yZSBDU1MgcGVyIHVuIGRhdG8gZWxlbWVudG8gZSBzdGF0byAqL1xyXG4gIHByaXZhdGUgZ2V0U2VsZWN0b3IodWlkOiBzdHJpbmcsIF9lbDogc3RyaW5nLCBzdGF0ZTogc3RyaW5nLCBzOiBzdHJpbmcsIF9zdWI6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgc3dpdGNoIChzdGF0ZSkge1xyXG4gICAgICBjYXNlICdOb3JtYWxlJzogICByZXR1cm4gYCMke3VpZH0ke3N9YDtcclxuICAgICAgY2FzZSAnTW91c2VvdmVyJzogcmV0dXJuIGAjJHt1aWR9OmhvdmVyJHtzfSwgIyR7dWlkfS5lcXAtc3RhdGUtaG92ZXIke3N9YDtcclxuICAgICAgY2FzZSAnRm9jdXNlZCc6ICAgcmV0dXJuIGAjJHt1aWR9OmZvY3VzLXdpdGhpbiR7c30sICMke3VpZH0uZXFwLXN0YXRlLWZvY3VzZWQke3N9YDtcclxuICAgICAgY2FzZSAnTm90VmFsaWQnOiAgcmV0dXJuIGAjJHt1aWR9LmVxcC1pbnZhbGlkJHtzfWA7XHJcbiAgICAgIGNhc2UgJ1JlYWRvbmx5JzogIHJldHVybiBgIyR7dWlkfS5lcXAtcmVhZG9ubHkke3N9YDtcclxuICAgICAgZGVmYXVsdDogICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogUHJvcGFnYSBnbGkgc3RpbGkgYm9yZGVyIGRpIENvbnRhaW5lciBhaSBzZWdtZW50aSBkZWwgYm9yZG8gTURDIChsZWFkaW5nL25vdGNoL3RyYWlsaW5nKVxyXG4gICAqICBjb24gbG9naWNhIGRpZmZlcmVuemlhdGEgcGVyIGV2aXRhcmUgaWwgZG9wcGlvIGJvcmRvOlxyXG4gICAqICAtIGBib3JkZXJgIHNob3J0aGFuZCBvIGBib3JkZXItd2lkdGhgIOKGkiBpbCBib3JkbyB2aXNpdm8gw6ggZ2nDoCBzdWwgd3JhcHBlciDihpIgaSBzZWdtZW50aVxyXG4gICAqICAgIHZlbmdvbm8gc29wcHJlc3NpIGNvbiBib3JkZXItY29sb3I6dHJhbnNwYXJlbnQuXHJcbiAgICogIC0gU29sbyBgYm9yZGVyLWNvbG9yYCDihpIgYXBwbGljYXRvIGFpIHNlZ21lbnRpIHBlciBzb3ZyYXNjcml2ZXJlIGlsIHJpbmcgYmx1L2hvdmVyIGRpXHJcbiAgICogICAgTWF0ZXJpYWwgKHNwZWNpZmljaXTDoCAjdWlkID4gc3BlY2lmaWNpdMOgIGRpIGNsYXNzZSBNYXRlcmlhbCkuXHJcbiAgICogIC0gYGJvcmRlci1yYWRpdXNgIGUgYWx0cmUgcHJvcHJpZXTDoCBib3JkZXItKiBub24gdmVuZ29ubyBwcm9wYWdhdGUgYWkgc2VnbWVudGkuICovXHJcbiAgcHJpdmF0ZSBhcHBseUJvcmRlclRvT3V0bGluZShzZWxlY3Rvcjogc3RyaW5nLCBjc3M6IHN0cmluZywgbGluZXM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICBpZiAoIWNzcz8udHJpbSgpKSByZXR1cm47XHJcbiAgICBjb25zdCBkZWNscyA9IGNzcy5zcGxpdCgnOycpLm1hcChkID0+IGQudHJpbSgpKS5maWx0ZXIoZCA9PiAvXmJvcmRlci9pLnRlc3QoZCkgJiYgZC5sZW5ndGggPiAwKTtcclxuICAgIGlmICghZGVjbHMubGVuZ3RoKSByZXR1cm47XHJcbiAgICBpZiAoZGVjbHMuc29tZShkID0+IC9eYm9yZGVyKD8hLShjb2xvcnxyYWRpdXMpKS9pLnRlc3QoZCkpKSB7XHJcbiAgICAgIGxpbmVzLnB1c2goYCR7c2VsZWN0b3J9IHsgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsgfWApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgY29sb3JEZWNscyA9IGRlY2xzLmZpbHRlcihkID0+IC9eYm9yZGVyLWNvbG9yL2kudGVzdChkKSkuam9pbignOyAnKTtcclxuICAgICAgaWYgKGNvbG9yRGVjbHMudHJpbSgpKSBsaW5lcy5wdXNoKGAke3NlbGVjdG9yfSB7ICR7Y29sb3JEZWNsc307IH1gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBTZWxldHRvcmUgY29tYmluYXRvIHBlciBpIHRyZSBzZWdtZW50aSBkZWwgYm9yZG8gTURDIG91dGxpbmVkIChsZWFkaW5nLCBub3RjaCwgdHJhaWxpbmcpLlxyXG4gICAqICBVc2F0byBwZXIgZHVwbGljYXJlIGlsIENTUyBkaSBDb250YWluZXIgc3VsIGJvcmRvIHZpc3VhbGUgZSBwZXJtZXR0ZXJlIGwnb3ZlcnJpZGUgZGVsIHJpbmcuICovXHJcbiAgcHJpdmF0ZSBnZXRPdXRsaW5lU2VsZWN0b3IodWlkOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGNvbnN0IHNlZ3MgPSAocHJlZjogc3RyaW5nKSA9PiBbXHJcbiAgICAgIGAjJHt1aWR9JHtwcmVmfSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZ2AsXHJcbiAgICAgIGAjJHt1aWR9JHtwcmVmfSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2hgLFxyXG4gICAgICBgIyR7dWlkfSR7cHJlZn0gLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nYCxcclxuICAgIF0uam9pbignLCAnKTtcclxuICAgIHN3aXRjaCAoc3RhdGUpIHtcclxuICAgICAgY2FzZSAnTm9ybWFsZSc6ICAgcmV0dXJuIHNlZ3MoJycpO1xyXG4gICAgICBjYXNlICdNb3VzZW92ZXInOiByZXR1cm4gYCR7c2VncygnOmhvdmVyJyl9LCAke3NlZ3MoJy5lcXAtc3RhdGUtaG92ZXInKX1gO1xyXG4gICAgICBjYXNlICdGb2N1c2VkJzogICByZXR1cm4gYCR7c2VncygnOmZvY3VzLXdpdGhpbicpfSwgJHtzZWdzKCcuZXFwLXN0YXRlLWZvY3VzZWQnKX1gO1xyXG4gICAgICBjYXNlICdOb3RWYWxpZCc6ICByZXR1cm4gc2VncygnLmVxcC1pbnZhbGlkJyk7XHJcbiAgICAgIGNhc2UgJ1JlYWRvbmx5JzogIHJldHVybiBzZWdzKCcuZXFwLXJlYWRvbmx5Jyk7XHJcbiAgICAgIGRlZmF1bHQ6ICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW1ldHRlIGkgZGVmYXVsdCBwcmltYSwgaSB2YWxvcmkgdXRlbnRlIGRvcG8uXHJcbiAgICogU3Rlc3NhIHNwZWNpZmljaXTDoCAjdWlkIOKGkiBpbCB2YWxvcmUgdXRlbnRlIHZpbmNlIHBlciBwb3NpemlvbmUgbmVsIGNhc2NhZGUuXHJcbiAgICogSWNvbmEgaGEgZHVlIHNlbGV0dG9yaSAocHJlZml4ICsgc3VmZml4KTogbGEgc3Rlc3NhIHJlZ29sYSB2aWVuZSBlbWVzc2EgcGVyIGVudHJhbWJpLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYnVpbGRDc3NSdWxlcyh1aWQ6IHN0cmluZywgY3NzOiBUZXh0RmllbGRTdHlsZUNTUyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAvLyBGaXggc3RydXR0dXJhbGUgaWNvbmUg4oCUIHR1dHRvIHNjb3BlZCBhICN1aWQgcGVyIG5vbiB0b2NjYXJlIGFsdHJpIGNvbXBvbmVudGk6XHJcbiAgICAvL1xyXG4gICAgLy8gMS4gTWF0ZXJpYWwgYXBwbGljYSAubWF0LW1kYy1mb3JtLWZpZWxkLWhhcy1pY29uLXN1ZmZpeCAubWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXJcclxuICAgIC8vICAgIHsgcGFkZGluZy1yaWdodDogMCB9IG1hIGxhc2NpYSBpbCBwYWRkaW5nLWxlZnQgaW50YXR0by4gUXVlbCBwYWRkaW5nLWxlZnQgcmVzaWR1b1xyXG4gICAgLy8gICAgY3JlYSB1bm8gc3RyaXAgY29sb3JhdG8gYSBzaW5pc3RyYSBzZSBDb250YWluZXIgaGEgdW4gYmFja2dyb3VuZC4gTG8gYXp6ZXJpYW1vLlxyXG4gICAgLy8gICAgKG1hdC1tZGMtZm9ybS1maWVsZC1oYXMtaWNvbi1zdWZmaXggw6ggc2VtcHJlIHByZXNlbnRlIHBlcmNow6kgaWwgbWljcm9mb25vIMOoIHNlbXByZVxyXG4gICAgLy8gICAgdW4gbWF0U3VmZml4IG5lbCBET00sIGFuY2hlIHF1YW5kbyBbaGlkZGVuXS4pXHJcbiAgICBsaW5lcy5wdXNoKFxyXG4gICAgICBgIyR7dWlkfSBtYXQtZm9ybS1maWVsZC5tYXQtbWRjLWZvcm0tZmllbGQtaGFzLWljb24tc3VmZml4IC5tYXQtbWRjLXRleHQtZmllbGQtd3JhcHBlcmAgK1xyXG4gICAgICBgIHsgcGFkZGluZy1sZWZ0OiAwOyB9YFxyXG4gICAgKTtcclxuICAgIGxpbmVzLnB1c2goXHJcbiAgICAgIGAjJHt1aWR9IG1hdC1mb3JtLWZpZWxkLm1hdC1tZGMtZm9ybS1maWVsZC1oYXMtaWNvbi1wcmVmaXggLm1hdC1tZGMtdGV4dC1maWVsZC13cmFwcGVyYCArXHJcbiAgICAgIGAgeyBwYWRkaW5nLXJpZ2h0OiAwOyB9YFxyXG4gICAgKTtcclxuICAgIC8vXHJcbiAgICAvLyAyLiBQcmVmaXg6IE1hdGVyaWFsIGRlZmF1bHQgw6ggcGFkZGluZzogMCA0cHggMCAwIOKAlCBxdWVsIDRweCBjcmVhIGxvIHN0cmlwIGEgc2luaXN0cmFcclxuICAgIC8vICAgIGFuY2hlIHNlbnphIGljb25hLiBMbyBhenplcmlhbW8gc2VtcHJlLiBRdWFuZG8gbCdpY29uYSBub24gYyfDqDogZGlzcGxheTpub25lLlxyXG4gICAgLy8gMy4gU3VmZml4OiBxdWFuZG8gbm9uIGMnw6ggbsOpIGljb25hIGRlc3RyYSBuw6kgbWljcm9mb25vIGF0dGl2bzogZGlzcGxheTpub25lIChNYXRlcmlhbFxyXG4gICAgLy8gICAgbGFzY2lhIGRpc3BsYXk6ZmxleCBzdWwgY29udGFpbmVyIGFuY2hlIHF1YW5kbyBpbCBjb250ZW51dG8gw6ggW2hpZGRlbl0pLlxyXG4gICAgY29uc3QgdGYgPSB0aGlzLmZpZWxkIGFzIFRleHRGaWVsZDtcclxuICAgIGNvbnN0IGhhc1ByZWZpeCA9ICEhKHRmLkljb25OYW1lICYmIHRmLkljb25Qb3NpdGlvbiAhPT0gVGV4dEZpZWxkSWNvblBvc2l0aW9uRW51bS5EZXN0cmEpO1xyXG4gICAgY29uc3QgaGFzU3VmZml4ID0gISEodGYuSWNvbk5hbWUgJiYgdGYuSWNvblBvc2l0aW9uID09PSBUZXh0RmllbGRJY29uUG9zaXRpb25FbnVtLkRlc3RyYSlcclxuICAgICAgICAgICAgICAgICAgICB8fCAhISh0Zi5NaWNyb3Bob25lICYmIHRoaXMucGxhdGZvcm0gPT09ICd3ZWInKTtcclxuICAgIGxpbmVzLnB1c2goXHJcbiAgICAgIGAjJHt1aWR9IC5tYXQtbWRjLWZvcm0tZmllbGQtaWNvbi1wcmVmaXggeyAke2hhc1ByZWZpeFxyXG4gICAgICAgID8gJ2FsaWduLXNlbGY6IHN0cmV0Y2g7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IHBhZGRpbmc6IDA7J1xyXG4gICAgICAgIDogJ2Rpc3BsYXk6IG5vbmU7J30gfWBcclxuICAgICk7XHJcbiAgICBsaW5lcy5wdXNoKFxyXG4gICAgICBgIyR7dWlkfSAubWF0LW1kYy1mb3JtLWZpZWxkLWljb24tc3VmZml4IHsgJHtoYXNTdWZmaXhcclxuICAgICAgICA/ICdhbGlnbi1zZWxmOiBzdHJldGNoOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBwYWRkaW5nOiAwOydcclxuICAgICAgICA6ICdkaXNwbGF5OiBub25lOyd9IH1gXHJcbiAgICApO1xyXG4gICAgLy8gSWwgLm1kYy1ub3RjaGVkLW91dGxpbmUgKHBhcmVudCBkZWkgdHJlIHNlZ21lbnRpIGRpIGJvcmRvIE1EQykgbm9uIGRldmUgYXZlcmUgbWFpIHVuXHJcbiAgICAvLyBib3JkbyBwcm9wcmlvOiBpbCBib3JkbyB2aXNpdm8gZGVsIGNhbXBvIHZpZW5lIGRhaSBzZWdtZW50aSBmaWdsaSBvIGRhbCB3cmFwcGVyIENvbnRhaW5lci5cclxuICAgIGxpbmVzLnB1c2goYCMke3VpZH0gLm1kYy1ub3RjaGVkLW91dGxpbmUgeyBib3JkZXI6IDA7IH1gKTtcclxuICAgIC8vIEFuZ3VsYXIgTWF0ZXJpYWwgaW1wb3N0YSBjb2xvciBkaXJldHRhbWVudGUgc3VsbCdpbnB1dCAoc3BlY2lmaWNpdMOgIDAsMywwKSwgY2hlIGJhdHRlXHJcbiAgICAvLyBxdWFsc2lhc2kgdmFsb3JlIGVyZWRpdGF0byBkYWwgd3JhcHBlci4gQ29uIGNvbG9yOmluaGVyaXQgZm9yemlhbW8gbCdlcmVkaXRhcmlldMOgXHJcbiAgICAvLyAoc3BlY2lmaWNpdMOgIDEsMSwxID4gMCwzLDApLCBjb3PDrCBpbCBjb2xvciBpbXBvc3RhdG8gc3UgSW5wdXROb3JtYWxlIHNpIHByb3BhZ2EgYWwgdGVzdG8uXHJcbiAgICBsaW5lcy5wdXNoKGAjJHt1aWR9IGlucHV0Lm1hdC1tZGMtaW5wdXQtZWxlbWVudCB7IGNvbG9yOiBpbmhlcml0OyB9YCk7XHJcblxyXG4gICAgbGluZXMucHVzaCguLi5idWlsZEZsb2F0aW5nTGFiZWxCYXNlUnVsZXModWlkLCBFTEVNRU5UX1NFTEVDVE9SUy5EZXNjcml6aW9uZSBhcyBzdHJpbmcsIGNzcyBhcyBhbnkpKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGVsIG9mIEVMRU1FTlRTKSB7XHJcbiAgICAgIGNvbnN0IHNFbnRyeSA9IEVMRU1FTlRfU0VMRUNUT1JTW2VsXTtcclxuICAgICAgY29uc3Qgc2VsTGlzdCA9IEFycmF5LmlzQXJyYXkoc0VudHJ5KSA/IHNFbnRyeSA6IFtzRW50cnldO1xyXG5cclxuICAgICAgZm9yIChjb25zdCBzdGF0ZSBvZiBTVEFURVMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBlbCArIHN0YXRlO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWw6IHN0cmluZyB8IHVuZGVmaW5lZCA9IERFRkFVTFRfRklFTERfU1RZTEVTW2tleV07XHJcbiAgICAgICAgY29uc3QgdXNlclZhbDogc3RyaW5nIHwgdW5kZWZpbmVkID0gcmVhZFN0eWxlQ3NzKGNzcyBhcyBhbnksIGtleSk7XHJcblxyXG4gICAgICAgIGlmICghZGVmYXVsdFZhbD8udHJpbSgpICYmICF1c2VyVmFsPy50cmltKCkpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHMgb2Ygc2VsTGlzdCkge1xyXG4gICAgICAgICAgY29uc3Qgc3ViID0gcy50cmltKCk7XHJcbiAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMuZ2V0U2VsZWN0b3IodWlkLCBlbCwgc3RhdGUsIHMsIHN1Yik7XHJcbiAgICAgICAgICBpZiAoIXNlbGVjdG9yKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICBpZiAoZGVmYXVsdFZhbD8udHJpbSgpKSBsaW5lcy5wdXNoKGAke3NlbGVjdG9yfSB7ICR7ZGVmYXVsdFZhbH0gfWApO1xyXG4gICAgICAgICAgaWYgKHVzZXJWYWw/LnRyaW0oKSkgICAgbGluZXMucHVzaChgJHtzZWxlY3Rvcn0geyAke3VzZXJWYWx9IH1gKTtcclxuICAgICAgICAgIGlmICh1c2VyVmFsPy50cmltKCkgJiYgZWwgPT09ICdEZXNjcml6aW9uZScpIHtcclxuICAgICAgICAgICAgaWYgKGNzc1NldHNUb3AodXNlclZhbCkpIGxpbmVzLnB1c2godGhpcy5nZXRTZWxlY3Rvcih1aWQsIGVsLCBzdGF0ZSwgcyArIExBQkVMX0ZMT0FUSU5HX1NVRkZJWCwgc3ViKSArICcgeyB0b3A6IDA7IH0nKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBQZXIgQ29udGFpbmVyOiBwcm9wYWdhIGxlIHByb3ByaWV0w6AgYm9yZGVyIGFpIHNlZ21lbnRpIE1EQyAobm90Y2hlZC1vdXRsaW5lX18qKS5cclxuICAgICAgICAgIC8vIFNlIGlsIENTUyBpbXBvc3RhIHVubyBzcGVzc29yZSAoYm9yZGVyL2JvcmRlci13aWR0aCkg4oaSIGlsIGJvcmRvIHZpc2l2byDDqCBnacOgIHN1bFxyXG4gICAgICAgICAgLy8gd3JhcHBlciwgaSBzZWdtZW50aSB2ZW5nb25vIHNvcHByZXNzaSAoYm9yZGVyLWNvbG9yOnRyYW5zcGFyZW50KSBwZXIgZXZpdGFyZSBpbFxyXG4gICAgICAgICAgLy8gZG9wcGlvIGJvcmRvLiBTZSBpbXBvc3RhIHNvbG8gYm9yZGVyLWNvbG9yIOKGkiB2aWVuZSBhcHBsaWNhdG8gYWkgc2VnbWVudGkgcGVyXHJcbiAgICAgICAgICAvLyBzb3ZyYXNjcml2ZXJlIGlsIHJpbmcgYmx1L2hvdmVyIGRpIE1hdGVyaWFsIChzcGVjaWZpY2l0w6AgMSwyLDAgPiAwLDIsMCkuXHJcbiAgICAgICAgICBpZiAoZWwgPT09ICdDb250YWluZXInKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG91dGxpbmVTZWwgPSB0aGlzLmdldE91dGxpbmVTZWxlY3Rvcih1aWQsIHN0YXRlKTtcclxuICAgICAgICAgICAgaWYgKG91dGxpbmVTZWwpIHtcclxuICAgICAgICAgICAgICB0aGlzLmFwcGx5Qm9yZGVyVG9PdXRsaW5lKG91dGxpbmVTZWwsIGRlZmF1bHRWYWwgPz8gJycsIGxpbmVzKTtcclxuICAgICAgICAgICAgICB0aGlzLmFwcGx5Qm9yZGVyVG9PdXRsaW5lKG91dGxpbmVTZWwsIHVzZXJWYWwgPz8gJycsIGxpbmVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcclxuICB9XHJcblxyXG4gIC8qKiBBZ2dpb3JuYSBsZSBjbGFzc2kgZGkgc3RhdG8gc3VsIHdyYXBwZXIgKGVxcC1pbnZhbGlkLCBlcXAtcmVhZG9ubHksIGVxcC1zdGF0ZS0qKSAqL1xyXG4gIHByaXZhdGUgdXBkYXRlU3RhdGVDbGFzc2VzKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmZpZWxkVWlkKSByZXR1cm47XHJcbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5maWVsZFVpZCk7XHJcbiAgICBpZiAoIXdyYXBwZXIpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtc3RhdGUtaG92ZXInLCAgIHRoaXMuZm9yY2VTdGF0ZSA9PT0gJ01vdXNlb3ZlcicpO1xyXG4gICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLXN0YXRlLWZvY3VzZWQnLCB0aGlzLmZvcmNlU3RhdGUgPT09ICdGb2N1c2VkJyk7XHJcblxyXG4gICAgaWYgKHRoaXMuZm9yY2VTdGF0ZSA9PT0gJ05vdFZhbGlkJykge1xyXG4gICAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtaW52YWxpZCcsIHRydWUpO1xyXG4gICAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtcmVhZG9ubHknLCBmYWxzZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZvcmNlU3RhdGUgPT09ICdSZWFkb25seScpIHtcclxuICAgICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLXJlYWRvbmx5JywgdHJ1ZSk7XHJcbiAgICAgIHRoaXMudG9nZ2xlQ2xhc3Mod3JhcHBlciwgJ2VxcC1pbnZhbGlkJywgZmFsc2UpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5mb3JjZVN0YXRlID09PSAnTm9ybWFsZScgfHwgdGhpcy5mb3JjZVN0YXRlID09PSAnTW91c2VvdmVyJyB8fCB0aGlzLmZvcmNlU3RhdGUgPT09ICdGb2N1c2VkJykge1xyXG4gICAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtaW52YWxpZCcsIGZhbHNlKTtcclxuICAgICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLXJlYWRvbmx5JywgZmFsc2UpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNSZWFkb25seSA9IHRoaXMuZmllbGQuUmVhZG9ubHkgfHwgKHRoaXMuZmllbGQuRm9ybXVsYSAhPSBudWxsICYmIHRoaXMuZmllbGQuRm9ybXVsYSAhPT0gJycpO1xyXG4gICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLXJlYWRvbmx5JywgaXNSZWFkb25seSk7XHJcblxyXG4gICAgY29uc3QgY3RybCA9IHRoaXMuZmllbGQuRm9ybUZvcm1Hcm91cD8uY29udHJvbHM/Llt0aGlzLmZpZWxkLk5hbWVdO1xyXG4gICAgaWYgKGN0cmw/LnRvdWNoZWQpIHtcclxuICAgICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLWludmFsaWQnLCB0aGlzLmZpZWxkLkZvcm1Gb3JtR3JvdXAuaW52YWxpZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtaW52YWxpZCcsIGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9nZ2xlQ2xhc3MoZWw6IEVsZW1lbnQsIGNsczogc3RyaW5nLCBjb25kaXRpb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChjb25kaXRpb24pIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWwsIGNscyk7XHJcbiAgICBlbHNlIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZWwsIGNscyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1YnNjcmliZVRvRm9ybVN0YXR1cygpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdHVzU3ViPy51bnN1YnNjcmliZSgpO1xyXG4gICAgaWYgKHRoaXMuZmllbGQ/LkZvcm1Gb3JtR3JvdXApIHtcclxuICAgICAgdGhpcy5zdGF0dXNTdWIgPSB0aGlzLmZpZWxkLkZvcm1Gb3JtR3JvdXAuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVTdGF0ZUNsYXNzZXMoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRJbnB1dFR5cGUoKSB7XHJcbiAgICBzd2l0Y2ggKE51bWJlcih0aGlzLmZpZWxkLlRleHRNYXNrKSkge1xyXG4gICAgICBjYXNlIFRleHRNYXNrRW51bS5FbWFpbDogICAgcmV0dXJuICdlbWFpbCc7XHJcbiAgICAgIGNhc2UgVGV4dE1hc2tFbnVtLlBhc3N3b3JkOiByZXR1cm4gJ3Bhc3N3b3JkJztcclxuICAgICAgY2FzZSBUZXh0TWFza0VudW0uVGVsZWZvbm86IHJldHVybiAndGVsJztcclxuICAgICAgY2FzZSBUZXh0TWFza0VudW0uVXJsOiAgICAgIHJldHVybiAndXJsJztcclxuICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgIHJldHVybiAndGV4dCc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGaWVsZCgpIHtcclxuICAgIGlmICh0aGlzLmZpZWxkLlJlYWRvbmx5SWYpIHtcclxuICAgICAgdGhpcy5maWVsZC5SZWFkb25seSA9IFV0aWxpdHlIZWxwZXJTZXJ2aWNlLkV2YWx1YXRlRmllbGRGb3JtdWxhKHRoaXMuZmllbGQuUmVhZG9ubHlJZiwgdGhpcy5yZWNvcmQsIHRoaXMuZm9ybXVsYU9iamVjdCk7XHJcbiAgICB9XHJcbiAgICBpZiAoKHRoaXMuZmllbGQuRGF0YUdldHRlci5EYXRhR2V0dGVyVHlwZSA9PSBEYXRhR2V0dGVyVHlwZUVudW0uTWFudWFsZSB8fCB0aGlzLmZpZWxkLkRhdGFHZXR0ZXIuRGF0YUdldHRlclR5cGUgPT0gRGF0YUdldHRlclR5cGVFbnVtLkZvcm11bGEpICYmIHRoaXMuZmllbGQuRm9ybXVsYSkge1xyXG4gICAgICB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdID0gVXRpbGl0eUhlbHBlclNlcnZpY2UuRXZhbHVhdGVGaWVsZEZvcm11bGEodGhpcy5maWVsZC5Gb3JtdWxhLCB0aGlzLnJlY29yZCwgdGhpcy5mb3JtdWxhT2JqZWN0KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZpZWxkLlZpc2libGVJZikge1xyXG4gICAgICB0aGlzLmZpZWxkLkluTGlzdFZpZXcgPSBVdGlsaXR5SGVscGVyU2VydmljZS5FdmFsdWF0ZUZpZWxkRm9ybXVsYSh0aGlzLmZpZWxkLlZpc2libGVJZiwgdGhpcy5yZWNvcmQsIHRoaXMuZm9ybXVsYU9iamVjdCk7XHJcbiAgICAgIGlmICghdGhpcy5maWVsZC5Jbkxpc3RWaWV3ICYmICF0aGlzLmZpZWxkLk1haW50YWluX1ZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZpZWxkLkRhdGFHZXR0ZXIuRGF0YUdldHRlclR5cGUgPT0gRGF0YUdldHRlclR5cGVFbnVtLk1hbnVhbGUgJiYgdGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSA9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gPSB0aGlzLmZpZWxkLkRhdGFHZXR0ZXIuRGF0YUdldHRlclZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25SZWNvcmRWYWx1ZUNoYW5nZSgpIHtcclxuICAgIHRoaXMudXBkYXRlU3RhdGVDbGFzc2VzKCk7XHJcbiAgICBpZiAoIXRoaXMuZmllbGQuRm9ybXVsYSkge1xyXG4gICAgICB0aGlzLnJlY29yZENoYW5nZS5lbWl0KHRoaXMucmVjb3JkKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5maWVsZC5WaXNpYmxlSWYpIHtcclxuICAgICAgdGhpcy5yZWNvcmRDaGFuZ2UuZW1pdCh0aGlzLnJlY29yZCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgW2lkXT1cImZpZWxkVWlkXCIgY2xhc3M9XCJlcXAtdGYtd3JhcHBlclwiPlxyXG4gIDxtYXQtZm9ybS1maWVsZCBbZm9ybUdyb3VwXT1cImZpZWxkLkZvcm1Gb3JtR3JvdXBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgPG1hdC1sYWJlbCBjbGFzcz1cInB0LTFcIiBbbmdTdHlsZV09XCJMYWJlbHN0eWxlT2JqXCI+XHJcbiAgICAgIHt7IGZpZWxkLkRlc2NyaXB0aW9uIH19XHJcbiAgICA8L21hdC1sYWJlbD5cclxuICAgIDx0bXctaWNvbiBjbGFzcz1cIm1hdC1pY29uXCIgKm5nSWY9XCJmaWVsZC5JY29uTmFtZSAmJiBmaWVsZC5JY29uUG9zaXRpb24gIT0gVGV4dEZpZWxkSWNvblBvc2l0aW9uRW51bS5EZXN0cmFcIiBtYXRQcmVmaXhcclxuICAgICAgW25hbWVdPVwiZmllbGQuSWNvbk5hbWVcIj5cclxuICAgIDwvdG13LWljb24+XHJcbiAgICA8aW5wdXRcclxuICAgICAgW25nU3R5bGVdPVwiRmllbGRzdHlsZU9ialwiXHJcbiAgICAgIG1hdElucHV0XHJcbiAgICAgIFt0eXBlXT1cImdldElucHV0VHlwZSgpXCJcclxuICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5OYW1lXCJcclxuICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLlJlYWRvbmx5IHx8IChmaWVsZC5Gb3JtdWxhICE9IG51bGwgJiYgZmllbGQuRm9ybXVsYSAhPSAnJylcIlxyXG4gICAgICBbcmVxdWlyZWRdPVwiZmllbGQuUmVxdWlyZWRcIlxyXG4gICAgICBbKG5nTW9kZWwpXT1cInJlY29yZFtmaWVsZC5OYW1lXVwiXHJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uUmVjb3JkVmFsdWVDaGFuZ2UoKVwiXHJcbiAgICAvPlxyXG4gICAgPG1hdC1lcnJvclxyXG4gICAgICAqbmdJZj1cIlxyXG4gICAgICAgICFmaWVsZC5Gb3JtRm9ybUdyb3VwLnZhbGlkICYmXHJcbiAgICAgICAgZmllbGQuRm9ybUZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5OYW1lXS50b3VjaGVkICYmXHJcbiAgICAgICAgIWZpZWxkLlJlYWRvbmx5XHJcbiAgICAgIFwiXHJcbiAgICA+XHJcbiAgICAgIE1pbi4gQ2FyYXR0ZXJpOiB7eyBmaWVsZC5NaW5MZW5naHQgfX0gLSBNYXguIENhcmF0dGVyaTpcclxuICAgICAge3sgZmllbGQuTWF4TGVuZ2h0IH19XHJcbiAgICA8L21hdC1lcnJvcj5cclxuICAgIDx0bXctaWNvbiBjbGFzcz1cIm1hdC1pY29uXCJcclxuICAgICAgKm5nSWY9XCJmaWVsZC5JY29uTmFtZSAmJiBmaWVsZC5JY29uUG9zaXRpb24gPT0gVGV4dEZpZWxkSWNvblBvc2l0aW9uRW51bS5EZXN0cmFcIlxyXG4gICAgICBtYXRTdWZmaXhcclxuICAgICAgW25hbWVdPVwiZmllbGQuSWNvbk5hbWVcIj5cclxuICAgIDwvdG13LWljb24+XHJcbiAgICA8dG13LWljb24gY2xhc3M9XCJtYXQtaWNvbiBlcXAtbWljcm9mb25vXCJcclxuICAgICAgW2hpZGRlbl09XCIhZmllbGQuTWljcm9waG9uZSB8fCBwbGF0Zm9ybSAhPSAnd2ViJ1wiXHJcbiAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICBTcGVlY2hUb1RleHRcclxuICAgICAgI21pY1NwZWVjaD1cInNwZWVjaFRvVGV4dFwiXHJcbiAgICAgIFsoYmluZGVkVGV4dCldPVwicmVjb3JkW2ZpZWxkLk5hbWVdXCJcclxuICAgICAgW3ZhcmlhbnRdPVwibWljU3BlZWNoLmlzTGlzdGVuaW5nID8gJ2ZpbGxlZCcgOiAnb3V0bGluZSdcIlxyXG4gICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiXHJcbiAgICAgIG5hbWU9XCJtaWNyb3Bob25lXCI+XHJcbiAgICA8L3Rtdy1pY29uPlxyXG4gIDwvbWF0LWZvcm0tZmllbGQ+XHJcbjwvZGl2PlxyXG4iXX0=
@@ -1,4 +1,7 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
1
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import { MatFormField } from '@angular/material/form-field';
3
+ import { refreshOutlineNotch, watchOutlineNotch } from '../../../../utils/refresh-outline-notch';
4
+ import { buildFloatingLabelBaseRules, cssSetsTop, LABEL_FLOATING_SUFFIX, readStyleCss } from '../../../../utils/floating-label-styles';
2
5
  import { UtilityHelperService } from '../../../../services/utilityHelper.services';
3
6
  import { TextareaFieldIconPositionEnum } from '../../../../models/fields/textareaField.model';
4
7
  import { interval } from 'rxjs';
@@ -17,6 +20,9 @@ const ELEMENT_SELECTORS = {
17
20
  Container: ' .mat-mdc-text-field-wrapper',
18
21
  Input: ' .mat-mdc-form-field-infix',
19
22
  Descrizione: ' label.mat-mdc-floating-label',
23
+ // Descrizione: grafica base della label, sempre valida. Sollevata (virtuale, salvata dentro
24
+ // Descrizione): override quando è sul bordo
25
+ DescrizioneSollevata: ' label.mat-mdc-floating-label' + LABEL_FLOATING_SUFFIX,
20
26
  Icona: [' .mat-mdc-form-field-icon-prefix', ' .mat-mdc-form-field-icon-suffix'],
21
27
  Microfono: ' .mat-mdc-form-field-icon-suffix',
22
28
  Errore: ' mat-error',
@@ -43,6 +49,7 @@ export class TextareaFieldTemplateComponent {
43
49
  this.TextareaFieldIconPositionEnum = TextareaFieldIconPositionEnum;
44
50
  this.styleEl = null;
45
51
  this.statusSub = null;
52
+ this.notchObserver = null;
46
53
  }
47
54
  ngOnInit() {
48
55
  this.fieldUid = 'ta-' + Math.random().toString(36).slice(2, 10);
@@ -59,6 +66,9 @@ export class TextareaFieldTemplateComponent {
59
66
  if (changes['forceState']) {
60
67
  this.updateStateClasses();
61
68
  }
69
+ if (changes['styleVersion'] || changes['forceState']) {
70
+ refreshOutlineNotch(this.formField);
71
+ }
62
72
  if (changes['record'] != undefined && changes['record'].firstChange == false
63
73
  && JSON.stringify(changes['record'].currentValue) != JSON.stringify(changes['record'].previousValue)) {
64
74
  this.record = changes['record'].currentValue;
@@ -66,7 +76,11 @@ export class TextareaFieldTemplateComponent {
66
76
  this.updateStateClasses();
67
77
  }
68
78
  }
79
+ ngAfterViewInit() {
80
+ this.notchObserver = watchOutlineNotch(this.formField);
81
+ }
69
82
  ngOnDestroy() {
83
+ this.notchObserver?.disconnect();
70
84
  if (this.styleEl?.parentNode) {
71
85
  this.styleEl.parentNode.removeChild(this.styleEl);
72
86
  }
@@ -152,13 +166,14 @@ export class TextareaFieldTemplateComponent {
152
166
  : 'display: none;'} }`);
153
167
  lines.push(`#${uid} .mdc-notched-outline { border: 0; }`);
154
168
  lines.push(`#${uid} textarea.mat-mdc-input-element { color: inherit; }`);
169
+ lines.push(...buildFloatingLabelBaseRules(uid, ELEMENT_SELECTORS.Descrizione, css));
155
170
  for (const el of ELEMENTS) {
156
171
  const sEntry = ELEMENT_SELECTORS[el];
157
172
  const selList = Array.isArray(sEntry) ? sEntry : [sEntry];
158
173
  for (const state of STATES) {
159
174
  const key = el + state;
160
175
  const defaultVal = DEFAULT_FIELD_STYLES[key];
161
- const userVal = css[key];
176
+ const userVal = readStyleCss(css, key);
162
177
  if (!defaultVal?.trim() && !userVal?.trim())
163
178
  continue;
164
179
  for (const s of selList) {
@@ -170,6 +185,10 @@ export class TextareaFieldTemplateComponent {
170
185
  lines.push(`${selector} { ${defaultVal} }`);
171
186
  if (userVal?.trim())
172
187
  lines.push(`${selector} { ${userVal} }`);
188
+ if (userVal?.trim() && el === 'Descrizione') {
189
+ if (cssSetsTop(userVal))
190
+ lines.push(this.getSelector(uid, el, state, s + LABEL_FLOATING_SUFFIX, sub) + ' { top: 0; }');
191
+ }
173
192
  if (el === 'Container') {
174
193
  const outlineSel = this.getOutlineSelector(uid, state);
175
194
  if (outlineSel) {
@@ -252,7 +271,7 @@ export class TextareaFieldTemplateComponent {
252
271
  }
253
272
  }
254
273
  TextareaFieldTemplateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TextareaFieldTemplateComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
255
- TextareaFieldTemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TextareaFieldTemplateComponent, selector: "textarea-field-template", inputs: { field: "field", record: "record", formulaObject: "formulaObject", inConfig: "inConfig", styleVersion: "styleVersion", forceState: "forceState" }, outputs: { recordChange: "recordChange" }, usesOnChanges: true, ngImport: i0, template: "<div [id]=\"fieldUid\">\r\n <mat-form-field [formGroup]=\"field.FormFormGroup\" appearance=\"outline\">\r\n <mat-label [ngStyle]=\"LabelstyleObj\">\r\n {{ field.Description }}\r\n </mat-label>\r\n <tmw-icon class=\"mat-icon\" matPrefix\r\n *ngIf=\"field.IconName && field.IconPosition !== TextareaFieldIconPositionEnum.Destra\"\r\n [name]=\"field.IconName\">\r\n </tmw-icon>\r\n <textarea\r\n class=\"pt-2 mt-2\"\r\n [ngStyle]=\"FieldstyleObj\"\r\n matInput\r\n [placeholder]=\"field.Description\"\r\n [rows]=\"field.Rows\"\r\n [formControlName]=\"field.Name\"\r\n [readonly]=\"field.Readonly\"\r\n [required]=\"field.Required\"\r\n [(ngModel)]=\"record[field.Name]\"\r\n (ngModelChange)=\"onRecordValueChange()\"\r\n ></textarea>\r\n <mat-error\r\n *ngIf=\"\r\n !field.FormFormGroup.valid &&\r\n field.FormFormGroup.controls[field.Name].touched &&\r\n !field.Readonly\r\n \"\r\n >\r\n Min. Caratteri: {{ field.MinLenght }} - Max. Caratteri:\r\n {{ field.MaxLenght }}\r\n </mat-error>\r\n <tmw-icon class=\"mat-icon\" matSuffix\r\n *ngIf=\"field.IconName && field.IconPosition === TextareaFieldIconPositionEnum.Destra\"\r\n [name]=\"field.IconName\">\r\n </tmw-icon>\r\n <tmw-icon class=\"mat-icon\"\r\n [hidden]=\"!field.Microphone || platform != 'web'\"\r\n matSuffix\r\n SpeechToText\r\n #micSpeech=\"speechToText\"\r\n [(bindedText)]=\"record[field.Name]\"\r\n [variant]=\"micSpeech.isListening ? 'filled' : 'outline'\"\r\n style=\"cursor: pointer\"\r\n name=\"microphone\">\r\n </tmw-icon>\r\n </mat-form-field>\r\n</div>\r\n", styles: ["input.ng-touched.ng-invalid,input.ng-dirty.ng-invalid{border:red 2px solid!important}::ng-deep .mat-input-element{background-color:#fff}::ng-deep .mat-form-field-label{font-size:x-large}::ng-deep textarea#mat-input-50{min-height:55px}::ng-deep label#mat-form-field-label-133{padding-top:7px}.keyboard_speaking{color:red}\n"], dependencies: [{ kind: "directive", type: i1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.TmwIconComponent, selector: "tmw-icon", inputs: ["name", "size", "ariaLabel", "variant", "strokeWidth"] }, { kind: "directive", type: i6.SpeechToTextDirective, selector: "[SpeechToText]", inputs: ["bindedText"], outputs: ["bindedTextChange"], exportAs: ["speechToText"] }] });
274
+ TextareaFieldTemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TextareaFieldTemplateComponent, selector: "textarea-field-template", inputs: { field: "field", record: "record", formulaObject: "formulaObject", inConfig: "inConfig", styleVersion: "styleVersion", forceState: "forceState" }, outputs: { recordChange: "recordChange" }, viewQueries: [{ propertyName: "formField", first: true, predicate: MatFormField, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [id]=\"fieldUid\">\r\n <mat-form-field [formGroup]=\"field.FormFormGroup\" appearance=\"outline\">\r\n <mat-label [ngStyle]=\"LabelstyleObj\">\r\n {{ field.Description }}\r\n </mat-label>\r\n <tmw-icon class=\"mat-icon\" matPrefix\r\n *ngIf=\"field.IconName && field.IconPosition !== TextareaFieldIconPositionEnum.Destra\"\r\n [name]=\"field.IconName\">\r\n </tmw-icon>\r\n <textarea\r\n class=\"pt-2 mt-2\"\r\n [ngStyle]=\"FieldstyleObj\"\r\n matInput\r\n [placeholder]=\"field.Description\"\r\n [rows]=\"field.Rows\"\r\n [formControlName]=\"field.Name\"\r\n [readonly]=\"field.Readonly\"\r\n [required]=\"field.Required\"\r\n [(ngModel)]=\"record[field.Name]\"\r\n (ngModelChange)=\"onRecordValueChange()\"\r\n ></textarea>\r\n <mat-error\r\n *ngIf=\"\r\n !field.FormFormGroup.valid &&\r\n field.FormFormGroup.controls[field.Name].touched &&\r\n !field.Readonly\r\n \"\r\n >\r\n Min. Caratteri: {{ field.MinLenght }} - Max. Caratteri:\r\n {{ field.MaxLenght }}\r\n </mat-error>\r\n <tmw-icon class=\"mat-icon\" matSuffix\r\n *ngIf=\"field.IconName && field.IconPosition === TextareaFieldIconPositionEnum.Destra\"\r\n [name]=\"field.IconName\">\r\n </tmw-icon>\r\n <tmw-icon class=\"mat-icon\"\r\n [hidden]=\"!field.Microphone || platform != 'web'\"\r\n matSuffix\r\n SpeechToText\r\n #micSpeech=\"speechToText\"\r\n [(bindedText)]=\"record[field.Name]\"\r\n [variant]=\"micSpeech.isListening ? 'filled' : 'outline'\"\r\n style=\"cursor: pointer\"\r\n name=\"microphone\">\r\n </tmw-icon>\r\n </mat-form-field>\r\n</div>\r\n", styles: ["input.ng-touched.ng-invalid,input.ng-dirty.ng-invalid{border:red 2px solid!important}::ng-deep .mat-input-element{background-color:#fff}::ng-deep .mat-form-field-label{font-size:x-large}::ng-deep textarea#mat-input-50{min-height:55px}::ng-deep label#mat-form-field-label-133{padding-top:7px}.keyboard_speaking{color:red}\n"], dependencies: [{ kind: "directive", type: i1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.TmwIconComponent, selector: "tmw-icon", inputs: ["name", "size", "ariaLabel", "variant", "strokeWidth"] }, { kind: "directive", type: i6.SpeechToTextDirective, selector: "[SpeechToText]", inputs: ["bindedText"], outputs: ["bindedTextChange"], exportAs: ["speechToText"] }] });
256
275
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TextareaFieldTemplateComponent, decorators: [{
257
276
  type: Component,
258
277
  args: [{ selector: 'textarea-field-template', template: "<div [id]=\"fieldUid\">\r\n <mat-form-field [formGroup]=\"field.FormFormGroup\" appearance=\"outline\">\r\n <mat-label [ngStyle]=\"LabelstyleObj\">\r\n {{ field.Description }}\r\n </mat-label>\r\n <tmw-icon class=\"mat-icon\" matPrefix\r\n *ngIf=\"field.IconName && field.IconPosition !== TextareaFieldIconPositionEnum.Destra\"\r\n [name]=\"field.IconName\">\r\n </tmw-icon>\r\n <textarea\r\n class=\"pt-2 mt-2\"\r\n [ngStyle]=\"FieldstyleObj\"\r\n matInput\r\n [placeholder]=\"field.Description\"\r\n [rows]=\"field.Rows\"\r\n [formControlName]=\"field.Name\"\r\n [readonly]=\"field.Readonly\"\r\n [required]=\"field.Required\"\r\n [(ngModel)]=\"record[field.Name]\"\r\n (ngModelChange)=\"onRecordValueChange()\"\r\n ></textarea>\r\n <mat-error\r\n *ngIf=\"\r\n !field.FormFormGroup.valid &&\r\n field.FormFormGroup.controls[field.Name].touched &&\r\n !field.Readonly\r\n \"\r\n >\r\n Min. Caratteri: {{ field.MinLenght }} - Max. Caratteri:\r\n {{ field.MaxLenght }}\r\n </mat-error>\r\n <tmw-icon class=\"mat-icon\" matSuffix\r\n *ngIf=\"field.IconName && field.IconPosition === TextareaFieldIconPositionEnum.Destra\"\r\n [name]=\"field.IconName\">\r\n </tmw-icon>\r\n <tmw-icon class=\"mat-icon\"\r\n [hidden]=\"!field.Microphone || platform != 'web'\"\r\n matSuffix\r\n SpeechToText\r\n #micSpeech=\"speechToText\"\r\n [(bindedText)]=\"record[field.Name]\"\r\n [variant]=\"micSpeech.isListening ? 'filled' : 'outline'\"\r\n style=\"cursor: pointer\"\r\n name=\"microphone\">\r\n </tmw-icon>\r\n </mat-form-field>\r\n</div>\r\n", styles: ["input.ng-touched.ng-invalid,input.ng-dirty.ng-invalid{border:red 2px solid!important}::ng-deep .mat-input-element{background-color:#fff}::ng-deep .mat-form-field-label{font-size:x-large}::ng-deep textarea#mat-input-50{min-height:55px}::ng-deep label#mat-form-field-label-133{padding-top:7px}.keyboard_speaking{color:red}\n"] }]
@@ -266,9 +285,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
266
285
  type: Input
267
286
  }], styleVersion: [{
268
287
  type: Input
288
+ }], formField: [{
289
+ type: ViewChild,
290
+ args: [MatFormField]
269
291
  }], forceState: [{
270
292
  type: Input
271
293
  }], recordChange: [{
272
294
  type: Output
273
295
  }] } });
274
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEtZmllbGQtdGVtcGxhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXFwLWR5bmFtaWMtbW9kdWxlL3NyYy9saWIvY29tcG9uZW50cy9wcml2YXRlL2ZpZWxkLXRlbXBsYXRlcy90ZXh0YXJlYS1maWVsZC10ZW1wbGF0ZS90ZXh0YXJlYS1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZmllbGQtdGVtcGxhdGVzL3RleHRhcmVhLWZpZWxkLXRlbXBsYXRlL3RleHRhcmVhLWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBZ0MsTUFBTSxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUUvSCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUVuRixPQUFPLEVBQWlCLDZCQUE2QixFQUF5QixNQUFNLCtDQUErQyxDQUFDO0FBQ3BJLE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7QUFFNUMsd0VBQXdFO0FBQ3hFLDZFQUE2RTtBQUM3RSxNQUFNLGlCQUFpQixHQUF5QztJQUM5RCxTQUFTLEVBQUUsOEJBQThCO0lBQ3pDLEtBQUssRUFBRSw0QkFBNEI7SUFDbkMsV0FBVyxFQUFFLCtCQUErQjtJQUM1QyxLQUFLLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxrQ0FBa0MsQ0FBQztJQUMvRSxT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c0JBQWxCLEtBQUs7Z0JBSUksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBSZW5kZXJlcjIsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSUJhc2VGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL2ludGVyZmFjZXMvaUJhc2VGaWVsZENvbXBvbmVudC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBVdGlsaXR5SGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3V0aWxpdHlIZWxwZXIuc2VydmljZXMnO1xyXG5pbXBvcnQgeyBSZWNvcmQgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvcmVjb3JkLm1vZGVsJztcclxuaW1wb3J0IHsgVGV4dGFyZWFGaWVsZCwgVGV4dGFyZWFGaWVsZEljb25Qb3NpdGlvbkVudW0sIFRleHRhcmVhRmllbGRTdHlsZUNTUyB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9maWVsZHMvdGV4dGFyZWFGaWVsZC5tb2RlbCc7XHJcbmltcG9ydCB7IGludGVydmFsLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgRGF0YUdldHRlclR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2Jhc2VGaWVsZC5tb2RlbCc7XHJcbmltcG9ydCB7IENhcGFjaXRvciB9IGZyb20gJ0BjYXBhY2l0b3IvY29yZSc7XHJcblxyXG4vLyBTZWxldHRvcmkgQ1NTIE1EQyAoQW5ndWxhciBNYXRlcmlhbCAxNSkg4oCUIHN0ZXNzbyBzY2hlbWEgZGkgVGV4dEZpZWxkLlxyXG4vLyBUZXh0YXJlYUZpZWxkIGhhIE1pY3JvZm9ubyAoc2VtcHJlIHN1ZmZpeCkgZSBzdXBwb3J0YSBJY29uYSBwcmVmaXgvc3VmZml4LlxyXG5jb25zdCBFTEVNRU5UX1NFTEVDVE9SUzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXSB9ID0ge1xyXG4gIENvbnRhaW5lcjogJyAubWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXInLFxyXG4gIElucHV0OiAnIC5tYXQtbWRjLWZvcm0tZmllbGQtaW5maXgnLFxyXG4gIERlc2NyaXppb25lOiAnIGxhYmVsLm1hdC1tZGMtZmxvYXRpbmctbGFiZWwnLFxyXG4gIEljb25hOiBbJyAubWF0LW1kYy1mb3JtLWZpZWxkLWljb24tcHJlZml4JywgJyAubWF0LW1kYy1mb3JtLWZpZWxkLWljb24tc3VmZml4J10sXHJcbiAgTWljcm9mb25vOiAnIC5tYXQtbWRjLWZvcm0tZmllbGQtaWNvbi1zdWZmaXgnLFxyXG4gIEVycm9yZTogJyBtYXQtZXJyb3InLFxyXG59O1xyXG5jb25zdCBFTEVNRU5UUyA9IE9iamVjdC5rZXlzKEVMRU1FTlRfU0VMRUNUT1JTKTtcclxuY29uc3QgU1RBVEVTID0gWydOb3JtYWxlJywgJ01vdXNlb3ZlcicsICdGb2N1c2VkJywgJ05vdFZhbGlkJywgJ1JlYWRvbmx5J107XHJcblxyXG5jb25zdCBERUZBVUxUX0ZJRUxEX1NUWUxFUzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcclxuICBDb250YWluZXJOb3JtYWxlOiAnYm9yZGVyLXJhZGl1czogNHB4OycsXHJcbiAgSW5wdXROb3JtYWxlOiAncGFkZGluZy1sZWZ0OiA1cHg7JyxcclxufTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndGV4dGFyZWEtZmllbGQtdGVtcGxhdGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90ZXh0YXJlYS1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGV4dGFyZWEtZmllbGQtdGVtcGxhdGUuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRleHRhcmVhRmllbGRUZW1wbGF0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIElCYXNlRmllbGRDb21wb25lbnQge1xyXG4gIGlzU3RpbGxSZWNvZ2luemUgPSBmYWxzZTtcclxuICBASW5wdXQoKSBmaWVsZDogVGV4dGFyZWFGaWVsZDtcclxuICBASW5wdXQoKSByZWNvcmQ6IFJlY29yZDtcclxuICBASW5wdXQoKSBmb3JtdWxhT2JqZWN0OiBhbnkgPSB7fTtcclxuICBASW5wdXQoKSBpbkNvbmZpZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8qKiBJbmNyZW1lbnRhIGRhbGwnZXN0ZXJubyBwZXIgZm9yemFyZSBpbCByaWNhbGNvbG8gZGVnbGkgc3RpbGkgQ1NTIChlcy4gZGFsIGNvbmZpZ3VyYXRvcmUpICovXHJcbiAgQElucHV0KCkgc3R5bGVWZXJzaW9uOiBudW1iZXIgPSAwO1xyXG4gIC8qKiBGb3J6YSB2aXNpdmFtZW50ZSB1bm8gc3RhdG8gc3BlY2lmaWNvIG5lbGwnYW50ZXByaW1hIGRlbCBjb25maWd1cmF0b3JlICovXHJcbiAgQElucHV0KCkgZm9yY2VTdGF0ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHNvdXJjZSA9IGludGVydmFsKDIwMCk7XHJcbiAgbmV3dGV4dDogc3RyaW5nO1xyXG4gIEBPdXRwdXQoKSByZWNvcmRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxSZWNvcmQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ+KCk7XHJcbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIEZpZWxkc3R5bGVPYmo6IGFueTtcclxuICBMYWJlbHN0eWxlT2JqOiBhbnk7XHJcblxyXG4gIHBsYXRmb3JtOiBzdHJpbmcgPSBDYXBhY2l0b3IuZ2V0UGxhdGZvcm0oKTtcclxuICBUZXh0YXJlYUZpZWxkSWNvblBvc2l0aW9uRW51bSA9IFRleHRhcmVhRmllbGRJY29uUG9zaXRpb25FbnVtO1xyXG5cclxuICBmaWVsZFVpZDogc3RyaW5nO1xyXG4gIHByaXZhdGUgc3R5bGVFbDogSFRNTFN0eWxlRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgc3RhdHVzU3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZmllbGRVaWQgPSAndGEtJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEwKTtcclxuICAgIHRoaXMudXBkYXRlRmllbGQoKTtcclxuICAgIHRoaXMuaW5pdFN0eWxlcygpO1xyXG4gICAgdGhpcy5pbmplY3RUZXh0YXJlYUZpZWxkU3R5bGVzKCk7XHJcbiAgICB0aGlzLnN1YnNjcmliZVRvRm9ybVN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXNbJ3N0eWxlVmVyc2lvbiddICYmICFjaGFuZ2VzWydzdHlsZVZlcnNpb24nXS5maXJzdENoYW5nZSkge1xyXG4gICAgICB0aGlzLmluamVjdFRleHRhcmVhRmllbGRTdHlsZXMoKTtcclxuICAgICAgdGhpcy51cGRhdGVTdGF0ZUNsYXNzZXMoKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydmb3JjZVN0YXRlJ10pIHtcclxuICAgICAgdGhpcy51cGRhdGVTdGF0ZUNsYXNzZXMoKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydyZWNvcmQnXSAhPSB1bmRlZmluZWQgJiYgY2hhbmdlc1sncmVjb3JkJ10uZmlyc3RDaGFuZ2UgPT0gZmFsc2VcclxuICAgICAgJiYgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1sncmVjb3JkJ10uY3VycmVudFZhbHVlKSAhPSBKU09OLnN0cmluZ2lmeShjaGFuZ2VzWydyZWNvcmQnXS5wcmV2aW91c1ZhbHVlKSkge1xyXG4gICAgICB0aGlzLnJlY29yZCA9IGNoYW5nZXNbJ3JlY29yZCddLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgdGhpcy51cGRhdGVGaWVsZCgpO1xyXG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlQ2xhc3NlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zdHlsZUVsPy5wYXJlbnROb2RlKSB7XHJcbiAgICAgIHRoaXMuc3R5bGVFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc3R5bGVFbCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0YXR1c1N1Yj8udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIGluaXRTdHlsZXMoKSB7XHJcbiAgICBpZiAodGhpcy5maWVsZC5GaWVsZHN0eWxlQ1NTICE9IG51bGwgfHwgdGhpcy5maWVsZC5GaWVsZHN0eWxlQ1NTICE9IHVuZGVmaW5lZClcclxuICAgICAgdGhpcy5GaWVsZHN0eWxlT2JqID0gVXRpbGl0eUhlbHBlclNlcnZpY2UuaW5pdFN0eWxlcyh0aGlzLmZpZWxkLkZpZWxkc3R5bGVDU1MpO1xyXG4gICAgaWYgKHRoaXMuZmllbGQuTGFiZWxzdHlsZUNTUyAhPSBudWxsIHx8IHRoaXMuZmllbGQuTGFiZWxzdHlsZUNTUyAhPSB1bmRlZmluZWQpXHJcbiAgICAgIHRoaXMuTGFiZWxzdHlsZU9iaiA9IFV0aWxpdHlIZWxwZXJTZXJ2aWNlLmluaXRTdHlsZXModGhpcy5maWVsZC5MYWJlbHN0eWxlQ1NTKTtcclxuICB9XHJcblxyXG4gIC8qKiBSaWdlbmVyYSBpbCB0YWcgPHN0eWxlPiBjb24gZGVmYXVsdHMgKyByZWdvbGUgdXRlbnRlLCBlbnRyYW1iaSBzY29wZWQgcGVyICN1aWQgKi9cclxuICBpbmplY3RUZXh0YXJlYUZpZWxkU3R5bGVzKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmZpZWxkVWlkKSByZXR1cm47XHJcbiAgICBjb25zdCBjc3MgPSAodGhpcy5maWVsZCBhcyBUZXh0YXJlYUZpZWxkKT8uVGV4dGFyZWFGaWVsZFN0eWxlQ1NTID8/ICh7fSBhcyBUZXh0YXJlYUZpZWxkU3R5bGVDU1MpO1xyXG4gICAgbGV0IHJ1bGVzID0gdGhpcy5idWlsZENzc1J1bGVzKHRoaXMuZmllbGRVaWQsIGNzcyk7XHJcbiAgICBpZiAodGhpcy5pbkNvbmZpZykge1xyXG4gICAgICBydWxlcyArPSBgXFxuIyR7dGhpcy5maWVsZFVpZH0gLm1hdC1tZGMtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlciB7IGRpc3BsYXk6IG5vbmU7IH1gO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5zdHlsZUVsKSB7XHJcbiAgICAgIHRoaXMuc3R5bGVFbCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3R5bGUnKSBhcyBIVE1MU3R5bGVFbGVtZW50O1xyXG4gICAgICB0aGlzLnN0eWxlRWwuaWQgPSAnc3R5bGUtJyArIHRoaXMuZmllbGRVaWQ7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuaGVhZCwgdGhpcy5zdHlsZUVsKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3R5bGVFbC50ZXh0Q29udGVudCA9IHJ1bGVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTZWxlY3Rvcih1aWQ6IHN0cmluZywgX2VsOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcsIHM6IHN0cmluZywgX3N1Yjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBzd2l0Y2ggKHN0YXRlKSB7XHJcbiAgICAgIGNhc2UgJ05vcm1hbGUnOiAgIHJldHVybiBgIyR7dWlkfSR7c31gO1xyXG4gICAgICBjYXNlICdNb3VzZW92ZXInOiByZXR1cm4gYCMke3VpZH06aG92ZXIke3N9LCAjJHt1aWR9LmVxcC1zdGF0ZS1ob3ZlciR7c31gO1xyXG4gICAgICBjYXNlICdGb2N1c2VkJzogICByZXR1cm4gYCMke3VpZH06Zm9jdXMtd2l0aGluJHtzfSwgIyR7dWlkfS5lcXAtc3RhdGUtZm9jdXNlZCR7c31gO1xyXG4gICAgICBjYXNlICdOb3RWYWxpZCc6ICByZXR1cm4gYCMke3VpZH0uZXFwLWludmFsaWQke3N9YDtcclxuICAgICAgY2FzZSAnUmVhZG9ubHknOiAgcmV0dXJuIGAjJHt1aWR9LmVxcC1yZWFkb25seSR7c31gO1xyXG4gICAgICBkZWZhdWx0OiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlCb3JkZXJUb091dGxpbmUoc2VsZWN0b3I6IHN0cmluZywgY3NzOiBzdHJpbmcsIGxpbmVzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgaWYgKCFjc3M/LnRyaW0oKSkgcmV0dXJuO1xyXG4gICAgY29uc3QgZGVjbHMgPSBjc3Muc3BsaXQoJzsnKS5tYXAoZCA9PiBkLnRyaW0oKSkuZmlsdGVyKGQgPT4gL15ib3JkZXIvaS50ZXN0KGQpICYmIGQubGVuZ3RoID4gMCk7XHJcbiAgICBpZiAoIWRlY2xzLmxlbmd0aCkgcmV0dXJuO1xyXG4gICAgaWYgKGRlY2xzLnNvbWUoZCA9PiAvXmJvcmRlcig/IS0oY29sb3J8cmFkaXVzKSkvaS50ZXN0KGQpKSkge1xyXG4gICAgICBsaW5lcy5wdXNoKGAke3NlbGVjdG9yfSB7IGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7IH1gKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGNvbG9yRGVjbHMgPSBkZWNscy5maWx0ZXIoZCA9PiAvXmJvcmRlci1jb2xvci9pLnRlc3QoZCkpLmpvaW4oJzsgJyk7XHJcbiAgICAgIGlmIChjb2xvckRlY2xzLnRyaW0oKSkgbGluZXMucHVzaChgJHtzZWxlY3Rvcn0geyAke2NvbG9yRGVjbHN9OyB9YCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE91dGxpbmVTZWxlY3Rvcih1aWQ6IHN0cmluZywgc3RhdGU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3Qgc2VncyA9IChwcmVmOiBzdHJpbmcpID0+IFtcclxuICAgICAgYCMke3VpZH0ke3ByZWZ9IC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5nYCxcclxuICAgICAgYCMke3VpZH0ke3ByZWZ9IC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaGAsXHJcbiAgICAgIGAjJHt1aWR9JHtwcmVmfSAubWRjLW5vdGNoZWQtb3V0bGluZV9fdHJhaWxpbmdgLFxyXG4gICAgXS5qb2luKCcsICcpO1xyXG4gICAgc3dpdGNoIChzdGF0ZSkge1xyXG4gICAgICBjYXNlICdOb3JtYWxlJzogICByZXR1cm4gc2VncygnJyk7XHJcbiAgICAgIGNhc2UgJ01vdXNlb3Zlcic6IHJldHVybiBgJHtzZWdzKCc6aG92ZXInKX0sICR7c2VncygnLmVxcC1zdGF0ZS1ob3ZlcicpfWA7XHJcbiAgICAgIGNhc2UgJ0ZvY3VzZWQnOiAgIHJldHVybiBgJHtzZWdzKCc6Zm9jdXMtd2l0aGluJyl9LCAke3NlZ3MoJy5lcXAtc3RhdGUtZm9jdXNlZCcpfWA7XHJcbiAgICAgIGNhc2UgJ05vdFZhbGlkJzogIHJldHVybiBzZWdzKCcuZXFwLWludmFsaWQnKTtcclxuICAgICAgY2FzZSAnUmVhZG9ubHknOiAgcmV0dXJuIHNlZ3MoJy5lcXAtcmVhZG9ubHknKTtcclxuICAgICAgZGVmYXVsdDogICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkQ3NzUnVsZXModWlkOiBzdHJpbmcsIGNzczogVGV4dGFyZWFGaWVsZFN0eWxlQ1NTKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIGNvbnN0IHRhID0gdGhpcy5maWVsZCBhcyBUZXh0YXJlYUZpZWxkO1xyXG4gICAgY29uc3QgaGFzUHJlZml4ID0gISEodGEuSWNvbk5hbWUgJiYgdGEuSWNvblBvc2l0aW9uICE9PSBUZXh0YXJlYUZpZWxkSWNvblBvc2l0aW9uRW51bS5EZXN0cmEpO1xyXG4gICAgY29uc3QgaGFzU3VmZml4ID0gISEodGEuSWNvbk5hbWUgJiYgdGEuSWNvblBvc2l0aW9uID09PSBUZXh0YXJlYUZpZWxkSWNvblBvc2l0aW9uRW51bS5EZXN0cmEpXHJcbiAgICAgICAgICAgICAgICAgICAgfHwgISEodGEuTWljcm9waG9uZSAmJiB0aGlzLnBsYXRmb3JtID09PSAnd2ViJyk7XHJcblxyXG4gICAgbGluZXMucHVzaChcclxuICAgICAgYCMke3VpZH0gbWF0LWZvcm0tZmllbGQubWF0LW1kYy1mb3JtLWZpZWxkLWhhcy1pY29uLXN1ZmZpeCAubWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXJgICtcclxuICAgICAgYCB7IHBhZGRpbmctbGVmdDogMDsgfWBcclxuICAgICk7XHJcbiAgICBsaW5lcy5wdXNoKFxyXG4gICAgICBgIyR7dWlkfSBtYXQtZm9ybS1maWVsZC5tYXQtbWRjLWZvcm0tZmllbGQtaGFzLWljb24tcHJlZml4IC5tYXQtbWRjLXRleHQtZmllbGQtd3JhcHBlcmAgK1xyXG4gICAgICBgIHsgcGFkZGluZy1yaWdodDogMDsgfWBcclxuICAgICk7XHJcbiAgICBsaW5lcy5wdXNoKFxyXG4gICAgICBgIyR7dWlkfSAubWF0LW1kYy1mb3JtLWZpZWxkLWljb24tcHJlZml4IHsgJHtoYXNQcmVmaXhcclxuICAgICAgICA/ICdhbGlnbi1zZWxmOiBzdHJldGNoOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBwYWRkaW5nOiAwOydcclxuICAgICAgICA6ICdkaXNwbGF5OiBub25lOyd9IH1gXHJcbiAgICApO1xyXG4gICAgbGluZXMucHVzaChcclxuICAgICAgYCMke3VpZH0gLm1hdC1tZGMtZm9ybS1maWVsZC1pY29uLXN1ZmZpeCB7ICR7aGFzU3VmZml4XHJcbiAgICAgICAgPyAnYWxpZ24tc2VsZjogc3RyZXRjaDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgcGFkZGluZzogMDsnXHJcbiAgICAgICAgOiAnZGlzcGxheTogbm9uZTsnfSB9YFxyXG4gICAgKTtcclxuICAgIGxpbmVzLnB1c2goYCMke3VpZH0gLm1kYy1ub3RjaGVkLW91dGxpbmUgeyBib3JkZXI6IDA7IH1gKTtcclxuICAgIGxpbmVzLnB1c2goYCMke3VpZH0gdGV4dGFyZWEubWF0LW1kYy1pbnB1dC1lbGVtZW50IHsgY29sb3I6IGluaGVyaXQ7IH1gKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGVsIG9mIEVMRU1FTlRTKSB7XHJcbiAgICAgIGNvbnN0IHNFbnRyeSA9IEVMRU1FTlRfU0VMRUNUT1JTW2VsXTtcclxuICAgICAgY29uc3Qgc2VsTGlzdCA9IEFycmF5LmlzQXJyYXkoc0VudHJ5KSA/IHNFbnRyeSA6IFtzRW50cnldO1xyXG5cclxuICAgICAgZm9yIChjb25zdCBzdGF0ZSBvZiBTVEFURVMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBlbCArIHN0YXRlO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWw6IHN0cmluZyB8IHVuZGVmaW5lZCA9IERFRkFVTFRfRklFTERfU1RZTEVTW2tleV07XHJcbiAgICAgICAgY29uc3QgdXNlclZhbDogc3RyaW5nIHwgdW5kZWZpbmVkID0gKGNzcyBhcyBhbnkpW2tleV07XHJcblxyXG4gICAgICAgIGlmICghZGVmYXVsdFZhbD8udHJpbSgpICYmICF1c2VyVmFsPy50cmltKCkpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHMgb2Ygc2VsTGlzdCkge1xyXG4gICAgICAgICAgY29uc3Qgc3ViID0gcy50cmltKCk7XHJcbiAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMuZ2V0U2VsZWN0b3IodWlkLCBlbCwgc3RhdGUsIHMsIHN1Yik7XHJcbiAgICAgICAgICBpZiAoIXNlbGVjdG9yKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICBpZiAoZGVmYXVsdFZhbD8udHJpbSgpKSBsaW5lcy5wdXNoKGAke3NlbGVjdG9yfSB7ICR7ZGVmYXVsdFZhbH0gfWApO1xyXG4gICAgICAgICAgaWYgKHVzZXJWYWw/LnRyaW0oKSkgICAgbGluZXMucHVzaChgJHtzZWxlY3Rvcn0geyAke3VzZXJWYWx9IH1gKTtcclxuXHJcbiAgICAgICAgICBpZiAoZWwgPT09ICdDb250YWluZXInKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG91dGxpbmVTZWwgPSB0aGlzLmdldE91dGxpbmVTZWxlY3Rvcih1aWQsIHN0YXRlKTtcclxuICAgICAgICAgICAgaWYgKG91dGxpbmVTZWwpIHtcclxuICAgICAgICAgICAgICB0aGlzLmFwcGx5Qm9yZGVyVG9PdXRsaW5lKG91dGxpbmVTZWwsIGRlZmF1bHRWYWwgPz8gJycsIGxpbmVzKTtcclxuICAgICAgICAgICAgICB0aGlzLmFwcGx5Qm9yZGVyVG9PdXRsaW5lKG91dGxpbmVTZWwsIHVzZXJWYWwgPz8gJycsIGxpbmVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU3RhdGVDbGFzc2VzKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmZpZWxkVWlkKSByZXR1cm47XHJcbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5maWVsZFVpZCk7XHJcbiAgICBpZiAoIXdyYXBwZXIpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtc3RhdGUtaG92ZXInLCAgIHRoaXMuZm9yY2VTdGF0ZSA9PT0gJ01vdXNlb3ZlcicpO1xyXG4gICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLXN0YXRlLWZvY3VzZWQnLCB0aGlzLmZvcmNlU3RhdGUgPT09ICdGb2N1c2VkJyk7XHJcblxyXG4gICAgaWYgKHRoaXMuZm9yY2VTdGF0ZSA9PT0gJ05vdFZhbGlkJykge1xyXG4gICAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtaW52YWxpZCcsIHRydWUpO1xyXG4gICAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtcmVhZG9ubHknLCBmYWxzZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZvcmNlU3RhdGUgPT09ICdSZWFkb25seScpIHtcclxuICAgICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLXJlYWRvbmx5JywgdHJ1ZSk7XHJcbiAgICAgIHRoaXMudG9nZ2xlQ2xhc3Mod3JhcHBlciwgJ2VxcC1pbnZhbGlkJywgZmFsc2UpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5mb3JjZVN0YXRlID09PSAnTm9ybWFsZScgfHwgdGhpcy5mb3JjZVN0YXRlID09PSAnTW91c2VvdmVyJyB8fCB0aGlzLmZvcmNlU3RhdGUgPT09ICdGb2N1c2VkJykge1xyXG4gICAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtaW52YWxpZCcsIGZhbHNlKTtcclxuICAgICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLXJlYWRvbmx5JywgZmFsc2UpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNSZWFkb25seSA9IHRoaXMuZmllbGQuUmVhZG9ubHkgfHwgKHRoaXMuZmllbGQuRm9ybXVsYSAhPSBudWxsICYmIHRoaXMuZmllbGQuRm9ybXVsYSAhPT0gJycpO1xyXG4gICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLXJlYWRvbmx5JywgaXNSZWFkb25seSk7XHJcblxyXG4gICAgY29uc3QgY3RybCA9IHRoaXMuZmllbGQuRm9ybUZvcm1Hcm91cD8uY29udHJvbHM/Llt0aGlzLmZpZWxkLk5hbWVdO1xyXG4gICAgaWYgKGN0cmw/LnRvdWNoZWQpIHtcclxuICAgICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLWludmFsaWQnLCB0aGlzLmZpZWxkLkZvcm1Gb3JtR3JvdXAuaW52YWxpZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtaW52YWxpZCcsIGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9nZ2xlQ2xhc3MoZWw6IEVsZW1lbnQsIGNsczogc3RyaW5nLCBjb25kaXRpb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChjb25kaXRpb24pIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWwsIGNscyk7XHJcbiAgICBlbHNlIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZWwsIGNscyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1YnNjcmliZVRvRm9ybVN0YXR1cygpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdHVzU3ViPy51bnN1YnNjcmliZSgpO1xyXG4gICAgaWYgKHRoaXMuZmllbGQ/LkZvcm1Gb3JtR3JvdXApIHtcclxuICAgICAgdGhpcy5zdGF0dXNTdWIgPSB0aGlzLmZpZWxkLkZvcm1Gb3JtR3JvdXAuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVTdGF0ZUNsYXNzZXMoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGaWVsZCgpIHtcclxuICAgIGlmICh0aGlzLmZpZWxkLlJlYWRvbmx5SWYpIHtcclxuICAgICAgdGhpcy5maWVsZC5SZWFkb25seSA9IFV0aWxpdHlIZWxwZXJTZXJ2aWNlLkV2YWx1YXRlRmllbGRGb3JtdWxhKHRoaXMuZmllbGQuUmVhZG9ubHlJZiwgdGhpcy5yZWNvcmQsIHRoaXMuZm9ybXVsYU9iamVjdCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5maWVsZC5Gb3JtdWxhKSB7XHJcbiAgICAgIHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gPSBVdGlsaXR5SGVscGVyU2VydmljZS5FdmFsdWF0ZUZpZWxkRm9ybXVsYSh0aGlzLmZpZWxkLkZvcm11bGEsIHRoaXMucmVjb3JkLCB0aGlzLmZvcm11bGFPYmplY3QpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZmllbGQuVmlzaWJsZUlmKSB7XHJcbiAgICAgIHRoaXMuZmllbGQuSW5MaXN0VmlldyA9IFV0aWxpdHlIZWxwZXJTZXJ2aWNlLkV2YWx1YXRlRmllbGRGb3JtdWxhKHRoaXMuZmllbGQuVmlzaWJsZUlmLCB0aGlzLnJlY29yZCwgdGhpcy5mb3JtdWxhT2JqZWN0KTtcclxuICAgICAgaWYgKCF0aGlzLmZpZWxkLkluTGlzdFZpZXcgJiYgIXRoaXMuZmllbGQuTWFpbnRhaW5fVmFsdWUpIHtcclxuICAgICAgICB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCh0aGlzLmZpZWxkLkRhdGFHZXR0ZXIuRGF0YUdldHRlclR5cGUgPT0gRGF0YUdldHRlclR5cGVFbnVtLk1hbnVhbGUgfHwgdGhpcy5maWVsZC5EYXRhR2V0dGVyLkRhdGFHZXR0ZXJUeXBlID09IERhdGFHZXR0ZXJUeXBlRW51bS5Gb3JtdWxhKSAmJiB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdID09IG51bGwpIHtcclxuICAgICAgdGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSA9IHRoaXMuZmllbGQuRGF0YUdldHRlci5EYXRhR2V0dGVyVmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblJlY29yZFZhbHVlQ2hhbmdlKCkge1xyXG4gICAgdGhpcy51cGRhdGVTdGF0ZUNsYXNzZXMoKTtcclxuICAgIGlmICghdGhpcy5maWVsZC5Gb3JtdWxhKSB7XHJcbiAgICAgIHRoaXMucmVjb3JkQ2hhbmdlLmVtaXQodGhpcy5yZWNvcmQpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IFtpZF09XCJmaWVsZFVpZFwiPlxyXG4gIDxtYXQtZm9ybS1maWVsZCBbZm9ybUdyb3VwXT1cImZpZWxkLkZvcm1Gb3JtR3JvdXBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgPG1hdC1sYWJlbCBbbmdTdHlsZV09XCJMYWJlbHN0eWxlT2JqXCI+XHJcbiAgICAgIHt7IGZpZWxkLkRlc2NyaXB0aW9uIH19XHJcbiAgICA8L21hdC1sYWJlbD5cclxuICAgIDx0bXctaWNvbiBjbGFzcz1cIm1hdC1pY29uXCIgbWF0UHJlZml4XHJcbiAgICAgICpuZ0lmPVwiZmllbGQuSWNvbk5hbWUgJiYgZmllbGQuSWNvblBvc2l0aW9uICE9PSBUZXh0YXJlYUZpZWxkSWNvblBvc2l0aW9uRW51bS5EZXN0cmFcIlxyXG4gICAgICBbbmFtZV09XCJmaWVsZC5JY29uTmFtZVwiPlxyXG4gICAgPC90bXctaWNvbj5cclxuICAgIDx0ZXh0YXJlYVxyXG4gICAgICBjbGFzcz1cInB0LTIgbXQtMlwiXHJcbiAgICAgIFtuZ1N0eWxlXT1cIkZpZWxkc3R5bGVPYmpcIlxyXG4gICAgICBtYXRJbnB1dFxyXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQuRGVzY3JpcHRpb25cIlxyXG4gICAgICBbcm93c109XCJmaWVsZC5Sb3dzXCJcclxuICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5OYW1lXCJcclxuICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLlJlYWRvbmx5XCJcclxuICAgICAgW3JlcXVpcmVkXT1cImZpZWxkLlJlcXVpcmVkXCJcclxuICAgICAgWyhuZ01vZGVsKV09XCJyZWNvcmRbZmllbGQuTmFtZV1cIlxyXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJvblJlY29yZFZhbHVlQ2hhbmdlKClcIlxyXG4gICAgPjwvdGV4dGFyZWE+XHJcbiAgICA8bWF0LWVycm9yXHJcbiAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgIWZpZWxkLkZvcm1Gb3JtR3JvdXAudmFsaWQgJiZcclxuICAgICAgICBmaWVsZC5Gb3JtRm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLk5hbWVdLnRvdWNoZWQgJiZcclxuICAgICAgICAhZmllbGQuUmVhZG9ubHlcclxuICAgICAgXCJcclxuICAgID5cclxuICAgICAgTWluLiBDYXJhdHRlcmk6IHt7IGZpZWxkLk1pbkxlbmdodCB9fSAtIE1heC4gQ2FyYXR0ZXJpOlxyXG4gICAgICB7eyBmaWVsZC5NYXhMZW5naHQgfX1cclxuICAgIDwvbWF0LWVycm9yPlxyXG4gICAgPHRtdy1pY29uIGNsYXNzPVwibWF0LWljb25cIiBtYXRTdWZmaXhcclxuICAgICAgKm5nSWY9XCJmaWVsZC5JY29uTmFtZSAmJiBmaWVsZC5JY29uUG9zaXRpb24gPT09IFRleHRhcmVhRmllbGRJY29uUG9zaXRpb25FbnVtLkRlc3RyYVwiXHJcbiAgICAgIFtuYW1lXT1cImZpZWxkLkljb25OYW1lXCI+XHJcbiAgICA8L3Rtdy1pY29uPlxyXG4gICAgPHRtdy1pY29uIGNsYXNzPVwibWF0LWljb25cIlxyXG4gICAgICBbaGlkZGVuXT1cIiFmaWVsZC5NaWNyb3Bob25lIHx8IHBsYXRmb3JtICE9ICd3ZWInXCJcclxuICAgICAgbWF0U3VmZml4XHJcbiAgICAgIFNwZWVjaFRvVGV4dFxyXG4gICAgICAjbWljU3BlZWNoPVwic3BlZWNoVG9UZXh0XCJcclxuICAgICAgWyhiaW5kZWRUZXh0KV09XCJyZWNvcmRbZmllbGQuTmFtZV1cIlxyXG4gICAgICBbdmFyaWFudF09XCJtaWNTcGVlY2guaXNMaXN0ZW5pbmcgPyAnZmlsbGVkJyA6ICdvdXRsaW5lJ1wiXHJcbiAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCJcclxuICAgICAgbmFtZT1cIm1pY3JvcGhvbmVcIj5cclxuICAgIDwvdG13LWljb24+XHJcbiAgPC9tYXQtZm9ybS1maWVsZD5cclxuPC9kaXY+XHJcbiJdfQ==
296
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEtZmllbGQtdGVtcGxhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXFwLWR5bmFtaWMtbW9kdWxlL3NyYy9saWIvY29tcG9uZW50cy9wcml2YXRlL2ZpZWxkLXRlbXBsYXRlcy90ZXh0YXJlYS1maWVsZC10ZW1wbGF0ZS90ZXh0YXJlYS1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZmllbGQtdGVtcGxhdGVzL3RleHRhcmVhLWZpZWxkLXRlbXBsYXRlL3RleHRhcmVhLWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBNEIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pKLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixFQUFFLFlBQVksRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRXZJLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBRW5GLE9BQU8sRUFBaUIsNkJBQTZCLEVBQXlCLE1BQU0sK0NBQStDLENBQUM7QUFDcEksT0FBTyxFQUFFLFFBQVEsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlC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Z0JBSUksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBSZW5kZXJlcjIsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuaW1wb3J0IHsgcmVmcmVzaE91dGxpbmVOb3RjaCwgd2F0Y2hPdXRsaW5lTm90Y2ggfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscy9yZWZyZXNoLW91dGxpbmUtbm90Y2gnO1xyXG5pbXBvcnQgeyBidWlsZEZsb2F0aW5nTGFiZWxCYXNlUnVsZXMsIGNzc1NldHNUb3AsIExBQkVMX0ZMT0FUSU5HX1NVRkZJWCwgcmVhZFN0eWxlQ3NzIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMvZmxvYXRpbmctbGFiZWwtc3R5bGVzJztcclxuaW1wb3J0IHsgSUJhc2VGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL2ludGVyZmFjZXMvaUJhc2VGaWVsZENvbXBvbmVudC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBVdGlsaXR5SGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3V0aWxpdHlIZWxwZXIuc2VydmljZXMnO1xyXG5pbXBvcnQgeyBSZWNvcmQgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvcmVjb3JkLm1vZGVsJztcclxuaW1wb3J0IHsgVGV4dGFyZWFGaWVsZCwgVGV4dGFyZWFGaWVsZEljb25Qb3NpdGlvbkVudW0sIFRleHRhcmVhRmllbGRTdHlsZUNTUyB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9maWVsZHMvdGV4dGFyZWFGaWVsZC5tb2RlbCc7XHJcbmltcG9ydCB7IGludGVydmFsLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgRGF0YUdldHRlclR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2Jhc2VGaWVsZC5tb2RlbCc7XHJcbmltcG9ydCB7IENhcGFjaXRvciB9IGZyb20gJ0BjYXBhY2l0b3IvY29yZSc7XHJcblxyXG4vLyBTZWxldHRvcmkgQ1NTIE1EQyAoQW5ndWxhciBNYXRlcmlhbCAxNSkg4oCUIHN0ZXNzbyBzY2hlbWEgZGkgVGV4dEZpZWxkLlxyXG4vLyBUZXh0YXJlYUZpZWxkIGhhIE1pY3JvZm9ubyAoc2VtcHJlIHN1ZmZpeCkgZSBzdXBwb3J0YSBJY29uYSBwcmVmaXgvc3VmZml4LlxyXG5jb25zdCBFTEVNRU5UX1NFTEVDVE9SUzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXSB9ID0ge1xyXG4gIENvbnRhaW5lcjogJyAubWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXInLFxyXG4gIElucHV0OiAnIC5tYXQtbWRjLWZvcm0tZmllbGQtaW5maXgnLFxyXG4gIERlc2NyaXppb25lOiAnIGxhYmVsLm1hdC1tZGMtZmxvYXRpbmctbGFiZWwnLFxyXG4gIC8vIERlc2NyaXppb25lOiBncmFmaWNhIGJhc2UgZGVsbGEgbGFiZWwsIHNlbXByZSB2YWxpZGEuIFNvbGxldmF0YSAodmlydHVhbGUsIHNhbHZhdGEgZGVudHJvXHJcbiAgLy8gRGVzY3JpemlvbmUpOiBvdmVycmlkZSBxdWFuZG8gw6ggc3VsIGJvcmRvXHJcbiAgRGVzY3JpemlvbmVTb2xsZXZhdGE6ICcgbGFiZWwubWF0LW1kYy1mbG9hdGluZy1sYWJlbCcgKyBMQUJFTF9GTE9BVElOR19TVUZGSVgsXHJcbiAgSWNvbmE6IFsnIC5tYXQtbWRjLWZvcm0tZmllbGQtaWNvbi1wcmVmaXgnLCAnIC5tYXQtbWRjLWZvcm0tZmllbGQtaWNvbi1zdWZmaXgnXSxcclxuICBNaWNyb2Zvbm86ICcgLm1hdC1tZGMtZm9ybS1maWVsZC1pY29uLXN1ZmZpeCcsXHJcbiAgRXJyb3JlOiAnIG1hdC1lcnJvcicsXHJcbn07XHJcbmNvbnN0IEVMRU1FTlRTID0gT2JqZWN0LmtleXMoRUxFTUVOVF9TRUxFQ1RPUlMpO1xyXG5jb25zdCBTVEFURVMgPSBbJ05vcm1hbGUnLCAnTW91c2VvdmVyJywgJ0ZvY3VzZWQnLCAnTm90VmFsaWQnLCAnUmVhZG9ubHknXTtcclxuXHJcbmNvbnN0IERFRkFVTFRfRklFTERfU1RZTEVTOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xyXG4gIENvbnRhaW5lck5vcm1hbGU6ICdib3JkZXItcmFkaXVzOiA0cHg7JyxcclxuICBJbnB1dE5vcm1hbGU6ICdwYWRkaW5nLWxlZnQ6IDVweDsnLFxyXG59O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0ZXh0YXJlYS1maWVsZC10ZW1wbGF0ZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RleHRhcmVhLWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90ZXh0YXJlYS1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGV4dGFyZWFGaWVsZFRlbXBsYXRlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgSUJhc2VGaWVsZENvbXBvbmVudCB7XHJcbiAgaXNTdGlsbFJlY29naW56ZSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGZpZWxkOiBUZXh0YXJlYUZpZWxkO1xyXG4gIEBJbnB1dCgpIHJlY29yZDogUmVjb3JkO1xyXG4gIEBJbnB1dCgpIGZvcm11bGFPYmplY3Q6IGFueSA9IHt9O1xyXG4gIEBJbnB1dCgpIGluQ29uZmlnOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoqIEluY3JlbWVudGEgZGFsbCdlc3Rlcm5vIHBlciBmb3J6YXJlIGlsIHJpY2FsY29sbyBkZWdsaSBzdGlsaSBDU1MgKGVzLiBkYWwgY29uZmlndXJhdG9yZSkgKi9cclxuICBASW5wdXQoKSBzdHlsZVZlcnNpb246IG51bWJlciA9IDA7XHJcbiAgQFZpZXdDaGlsZChNYXRGb3JtRmllbGQpIGZvcm1GaWVsZDogTWF0Rm9ybUZpZWxkO1xyXG4gIC8qKiBGb3J6YSB2aXNpdmFtZW50ZSB1bm8gc3RhdG8gc3BlY2lmaWNvIG5lbGwnYW50ZXByaW1hIGRlbCBjb25maWd1cmF0b3JlICovXHJcbiAgQElucHV0KCkgZm9yY2VTdGF0ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHNvdXJjZSA9IGludGVydmFsKDIwMCk7XHJcbiAgbmV3dGV4dDogc3RyaW5nO1xyXG4gIEBPdXRwdXQoKSByZWNvcmRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxSZWNvcmQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ+KCk7XHJcbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIEZpZWxkc3R5bGVPYmo6IGFueTtcclxuICBMYWJlbHN0eWxlT2JqOiBhbnk7XHJcblxyXG4gIHBsYXRmb3JtOiBzdHJpbmcgPSBDYXBhY2l0b3IuZ2V0UGxhdGZvcm0oKTtcclxuICBUZXh0YXJlYUZpZWxkSWNvblBvc2l0aW9uRW51bSA9IFRleHRhcmVhRmllbGRJY29uUG9zaXRpb25FbnVtO1xyXG5cclxuICBmaWVsZFVpZDogc3RyaW5nO1xyXG4gIHByaXZhdGUgc3R5bGVFbDogSFRNTFN0eWxlRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgc3RhdHVzU3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBub3RjaE9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZpZWxkVWlkID0gJ3RhLScgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMCk7XHJcbiAgICB0aGlzLnVwZGF0ZUZpZWxkKCk7XHJcbiAgICB0aGlzLmluaXRTdHlsZXMoKTtcclxuICAgIHRoaXMuaW5qZWN0VGV4dGFyZWFGaWVsZFN0eWxlcygpO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVUb0Zvcm1TdGF0dXMoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzWydzdHlsZVZlcnNpb24nXSAmJiAhY2hhbmdlc1snc3R5bGVWZXJzaW9uJ10uZmlyc3RDaGFuZ2UpIHtcclxuICAgICAgdGhpcy5pbmplY3RUZXh0YXJlYUZpZWxkU3R5bGVzKCk7XHJcbiAgICAgIHRoaXMudXBkYXRlU3RhdGVDbGFzc2VzKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1snZm9yY2VTdGF0ZSddKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlU3RhdGVDbGFzc2VzKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1snc3R5bGVWZXJzaW9uJ10gfHwgY2hhbmdlc1snZm9yY2VTdGF0ZSddKSB7XHJcbiAgICAgIHJlZnJlc2hPdXRsaW5lTm90Y2godGhpcy5mb3JtRmllbGQpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ3JlY29yZCddICE9IHVuZGVmaW5lZCAmJiBjaGFuZ2VzWydyZWNvcmQnXS5maXJzdENoYW5nZSA9PSBmYWxzZVxyXG4gICAgICAmJiBKU09OLnN0cmluZ2lmeShjaGFuZ2VzWydyZWNvcmQnXS5jdXJyZW50VmFsdWUpICE9IEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbJ3JlY29yZCddLnByZXZpb3VzVmFsdWUpKSB7XHJcbiAgICAgIHRoaXMucmVjb3JkID0gY2hhbmdlc1sncmVjb3JkJ10uY3VycmVudFZhbHVlO1xyXG4gICAgICB0aGlzLnVwZGF0ZUZpZWxkKCk7XHJcbiAgICAgIHRoaXMudXBkYXRlU3RhdGVDbGFzc2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLm5vdGNoT2JzZXJ2ZXIgPSB3YXRjaE91dGxpbmVOb3RjaCh0aGlzLmZvcm1GaWVsZCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMubm90Y2hPYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xyXG4gICAgaWYgKHRoaXMuc3R5bGVFbD8ucGFyZW50Tm9kZSkge1xyXG4gICAgICB0aGlzLnN0eWxlRWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnN0eWxlRWwpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdGF0dXNTdWI/LnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBpbml0U3R5bGVzKCkge1xyXG4gICAgaWYgKHRoaXMuZmllbGQuRmllbGRzdHlsZUNTUyAhPSBudWxsIHx8IHRoaXMuZmllbGQuRmllbGRzdHlsZUNTUyAhPSB1bmRlZmluZWQpXHJcbiAgICAgIHRoaXMuRmllbGRzdHlsZU9iaiA9IFV0aWxpdHlIZWxwZXJTZXJ2aWNlLmluaXRTdHlsZXModGhpcy5maWVsZC5GaWVsZHN0eWxlQ1NTKTtcclxuICAgIGlmICh0aGlzLmZpZWxkLkxhYmVsc3R5bGVDU1MgIT0gbnVsbCB8fCB0aGlzLmZpZWxkLkxhYmVsc3R5bGVDU1MgIT0gdW5kZWZpbmVkKVxyXG4gICAgICB0aGlzLkxhYmVsc3R5bGVPYmogPSBVdGlsaXR5SGVscGVyU2VydmljZS5pbml0U3R5bGVzKHRoaXMuZmllbGQuTGFiZWxzdHlsZUNTUyk7XHJcbiAgfVxyXG5cclxuICAvKiogUmlnZW5lcmEgaWwgdGFnIDxzdHlsZT4gY29uIGRlZmF1bHRzICsgcmVnb2xlIHV0ZW50ZSwgZW50cmFtYmkgc2NvcGVkIHBlciAjdWlkICovXHJcbiAgaW5qZWN0VGV4dGFyZWFGaWVsZFN0eWxlcygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5maWVsZFVpZCkgcmV0dXJuO1xyXG4gICAgY29uc3QgY3NzID0gKHRoaXMuZmllbGQgYXMgVGV4dGFyZWFGaWVsZCk/LlRleHRhcmVhRmllbGRTdHlsZUNTUyA/PyAoe30gYXMgVGV4dGFyZWFGaWVsZFN0eWxlQ1NTKTtcclxuICAgIGxldCBydWxlcyA9IHRoaXMuYnVpbGRDc3NSdWxlcyh0aGlzLmZpZWxkVWlkLCBjc3MpO1xyXG4gICAgaWYgKHRoaXMuaW5Db25maWcpIHtcclxuICAgICAgcnVsZXMgKz0gYFxcbiMke3RoaXMuZmllbGRVaWR9IC5tYXQtbWRjLWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXIgeyBkaXNwbGF5OiBub25lOyB9YDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuc3R5bGVFbCkge1xyXG4gICAgICB0aGlzLnN0eWxlRWwgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJykgYXMgSFRNTFN0eWxlRWxlbWVudDtcclxuICAgICAgdGhpcy5zdHlsZUVsLmlkID0gJ3N0eWxlLScgKyB0aGlzLmZpZWxkVWlkO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmhlYWQsIHRoaXMuc3R5bGVFbCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0eWxlRWwudGV4dENvbnRlbnQgPSBydWxlcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2VsZWN0b3IodWlkOiBzdHJpbmcsIF9lbDogc3RyaW5nLCBzdGF0ZTogc3RyaW5nLCBzOiBzdHJpbmcsIF9zdWI6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgc3dpdGNoIChzdGF0ZSkge1xyXG4gICAgICBjYXNlICdOb3JtYWxlJzogICByZXR1cm4gYCMke3VpZH0ke3N9YDtcclxuICAgICAgY2FzZSAnTW91c2VvdmVyJzogcmV0dXJuIGAjJHt1aWR9OmhvdmVyJHtzfSwgIyR7dWlkfS5lcXAtc3RhdGUtaG92ZXIke3N9YDtcclxuICAgICAgY2FzZSAnRm9jdXNlZCc6ICAgcmV0dXJuIGAjJHt1aWR9OmZvY3VzLXdpdGhpbiR7c30sICMke3VpZH0uZXFwLXN0YXRlLWZvY3VzZWQke3N9YDtcclxuICAgICAgY2FzZSAnTm90VmFsaWQnOiAgcmV0dXJuIGAjJHt1aWR9LmVxcC1pbnZhbGlkJHtzfWA7XHJcbiAgICAgIGNhc2UgJ1JlYWRvbmx5JzogIHJldHVybiBgIyR7dWlkfS5lcXAtcmVhZG9ubHkke3N9YDtcclxuICAgICAgZGVmYXVsdDogICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5Qm9yZGVyVG9PdXRsaW5lKHNlbGVjdG9yOiBzdHJpbmcsIGNzczogc3RyaW5nLCBsaW5lczogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgIGlmICghY3NzPy50cmltKCkpIHJldHVybjtcclxuICAgIGNvbnN0IGRlY2xzID0gY3NzLnNwbGl0KCc7JykubWFwKGQgPT4gZC50cmltKCkpLmZpbHRlcihkID0+IC9eYm9yZGVyL2kudGVzdChkKSAmJiBkLmxlbmd0aCA+IDApO1xyXG4gICAgaWYgKCFkZWNscy5sZW5ndGgpIHJldHVybjtcclxuICAgIGlmIChkZWNscy5zb21lKGQgPT4gL15ib3JkZXIoPyEtKGNvbG9yfHJhZGl1cykpL2kudGVzdChkKSkpIHtcclxuICAgICAgbGluZXMucHVzaChgJHtzZWxlY3Rvcn0geyBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50OyB9YCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBjb2xvckRlY2xzID0gZGVjbHMuZmlsdGVyKGQgPT4gL15ib3JkZXItY29sb3IvaS50ZXN0KGQpKS5qb2luKCc7ICcpO1xyXG4gICAgICBpZiAoY29sb3JEZWNscy50cmltKCkpIGxpbmVzLnB1c2goYCR7c2VsZWN0b3J9IHsgJHtjb2xvckRlY2xzfTsgfWApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRPdXRsaW5lU2VsZWN0b3IodWlkOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGNvbnN0IHNlZ3MgPSAocHJlZjogc3RyaW5nKSA9PiBbXHJcbiAgICAgIGAjJHt1aWR9JHtwcmVmfSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZ2AsXHJcbiAgICAgIGAjJHt1aWR9JHtwcmVmfSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2hgLFxyXG4gICAgICBgIyR7dWlkfSR7cHJlZn0gLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nYCxcclxuICAgIF0uam9pbignLCAnKTtcclxuICAgIHN3aXRjaCAoc3RhdGUpIHtcclxuICAgICAgY2FzZSAnTm9ybWFsZSc6ICAgcmV0dXJuIHNlZ3MoJycpO1xyXG4gICAgICBjYXNlICdNb3VzZW92ZXInOiByZXR1cm4gYCR7c2VncygnOmhvdmVyJyl9LCAke3NlZ3MoJy5lcXAtc3RhdGUtaG92ZXInKX1gO1xyXG4gICAgICBjYXNlICdGb2N1c2VkJzogICByZXR1cm4gYCR7c2VncygnOmZvY3VzLXdpdGhpbicpfSwgJHtzZWdzKCcuZXFwLXN0YXRlLWZvY3VzZWQnKX1gO1xyXG4gICAgICBjYXNlICdOb3RWYWxpZCc6ICByZXR1cm4gc2VncygnLmVxcC1pbnZhbGlkJyk7XHJcbiAgICAgIGNhc2UgJ1JlYWRvbmx5JzogIHJldHVybiBzZWdzKCcuZXFwLXJlYWRvbmx5Jyk7XHJcbiAgICAgIGRlZmF1bHQ6ICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZENzc1J1bGVzKHVpZDogc3RyaW5nLCBjc3M6IFRleHRhcmVhRmllbGRTdHlsZUNTUyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBjb25zdCB0YSA9IHRoaXMuZmllbGQgYXMgVGV4dGFyZWFGaWVsZDtcclxuICAgIGNvbnN0IGhhc1ByZWZpeCA9ICEhKHRhLkljb25OYW1lICYmIHRhLkljb25Qb3NpdGlvbiAhPT0gVGV4dGFyZWFGaWVsZEljb25Qb3NpdGlvbkVudW0uRGVzdHJhKTtcclxuICAgIGNvbnN0IGhhc1N1ZmZpeCA9ICEhKHRhLkljb25OYW1lICYmIHRhLkljb25Qb3NpdGlvbiA9PT0gVGV4dGFyZWFGaWVsZEljb25Qb3NpdGlvbkVudW0uRGVzdHJhKVxyXG4gICAgICAgICAgICAgICAgICAgIHx8ICEhKHRhLk1pY3JvcGhvbmUgJiYgdGhpcy5wbGF0Zm9ybSA9PT0gJ3dlYicpO1xyXG5cclxuICAgIGxpbmVzLnB1c2goXHJcbiAgICAgIGAjJHt1aWR9IG1hdC1mb3JtLWZpZWxkLm1hdC1tZGMtZm9ybS1maWVsZC1oYXMtaWNvbi1zdWZmaXggLm1hdC1tZGMtdGV4dC1maWVsZC13cmFwcGVyYCArXHJcbiAgICAgIGAgeyBwYWRkaW5nLWxlZnQ6IDA7IH1gXHJcbiAgICApO1xyXG4gICAgbGluZXMucHVzaChcclxuICAgICAgYCMke3VpZH0gbWF0LWZvcm0tZmllbGQubWF0LW1kYy1mb3JtLWZpZWxkLWhhcy1pY29uLXByZWZpeCAubWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXJgICtcclxuICAgICAgYCB7IHBhZGRpbmctcmlnaHQ6IDA7IH1gXHJcbiAgICApO1xyXG4gICAgbGluZXMucHVzaChcclxuICAgICAgYCMke3VpZH0gLm1hdC1tZGMtZm9ybS1maWVsZC1pY29uLXByZWZpeCB7ICR7aGFzUHJlZml4XHJcbiAgICAgICAgPyAnYWxpZ24tc2VsZjogc3RyZXRjaDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgcGFkZGluZzogMDsnXHJcbiAgICAgICAgOiAnZGlzcGxheTogbm9uZTsnfSB9YFxyXG4gICAgKTtcclxuICAgIGxpbmVzLnB1c2goXHJcbiAgICAgIGAjJHt1aWR9IC5tYXQtbWRjLWZvcm0tZmllbGQtaWNvbi1zdWZmaXggeyAke2hhc1N1ZmZpeFxyXG4gICAgICAgID8gJ2FsaWduLXNlbGY6IHN0cmV0Y2g7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IHBhZGRpbmc6IDA7J1xyXG4gICAgICAgIDogJ2Rpc3BsYXk6IG5vbmU7J30gfWBcclxuICAgICk7XHJcbiAgICBsaW5lcy5wdXNoKGAjJHt1aWR9IC5tZGMtbm90Y2hlZC1vdXRsaW5lIHsgYm9yZGVyOiAwOyB9YCk7XHJcbiAgICBsaW5lcy5wdXNoKGAjJHt1aWR9IHRleHRhcmVhLm1hdC1tZGMtaW5wdXQtZWxlbWVudCB7IGNvbG9yOiBpbmhlcml0OyB9YCk7XHJcblxyXG4gICAgbGluZXMucHVzaCguLi5idWlsZEZsb2F0aW5nTGFiZWxCYXNlUnVsZXModWlkLCBFTEVNRU5UX1NFTEVDVE9SUy5EZXNjcml6aW9uZSBhcyBzdHJpbmcsIGNzcyBhcyBhbnkpKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGVsIG9mIEVMRU1FTlRTKSB7XHJcbiAgICAgIGNvbnN0IHNFbnRyeSA9IEVMRU1FTlRfU0VMRUNUT1JTW2VsXTtcclxuICAgICAgY29uc3Qgc2VsTGlzdCA9IEFycmF5LmlzQXJyYXkoc0VudHJ5KSA/IHNFbnRyeSA6IFtzRW50cnldO1xyXG5cclxuICAgICAgZm9yIChjb25zdCBzdGF0ZSBvZiBTVEFURVMpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBlbCArIHN0YXRlO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWw6IHN0cmluZyB8IHVuZGVmaW5lZCA9IERFRkFVTFRfRklFTERfU1RZTEVTW2tleV07XHJcbiAgICAgICAgY29uc3QgdXNlclZhbDogc3RyaW5nIHwgdW5kZWZpbmVkID0gcmVhZFN0eWxlQ3NzKGNzcyBhcyBhbnksIGtleSk7XHJcblxyXG4gICAgICAgIGlmICghZGVmYXVsdFZhbD8udHJpbSgpICYmICF1c2VyVmFsPy50cmltKCkpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHMgb2Ygc2VsTGlzdCkge1xyXG4gICAgICAgICAgY29uc3Qgc3ViID0gcy50cmltKCk7XHJcbiAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMuZ2V0U2VsZWN0b3IodWlkLCBlbCwgc3RhdGUsIHMsIHN1Yik7XHJcbiAgICAgICAgICBpZiAoIXNlbGVjdG9yKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICBpZiAoZGVmYXVsdFZhbD8udHJpbSgpKSBsaW5lcy5wdXNoKGAke3NlbGVjdG9yfSB7ICR7ZGVmYXVsdFZhbH0gfWApO1xyXG4gICAgICAgICAgaWYgKHVzZXJWYWw/LnRyaW0oKSkgICAgbGluZXMucHVzaChgJHtzZWxlY3Rvcn0geyAke3VzZXJWYWx9IH1gKTtcclxuICAgICAgICAgIGlmICh1c2VyVmFsPy50cmltKCkgJiYgZWwgPT09ICdEZXNjcml6aW9uZScpIHtcclxuICAgICAgICAgICAgaWYgKGNzc1NldHNUb3AodXNlclZhbCkpIGxpbmVzLnB1c2godGhpcy5nZXRTZWxlY3Rvcih1aWQsIGVsLCBzdGF0ZSwgcyArIExBQkVMX0ZMT0FUSU5HX1NVRkZJWCwgc3ViKSArICcgeyB0b3A6IDA7IH0nKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZWwgPT09ICdDb250YWluZXInKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG91dGxpbmVTZWwgPSB0aGlzLmdldE91dGxpbmVTZWxlY3Rvcih1aWQsIHN0YXRlKTtcclxuICAgICAgICAgICAgaWYgKG91dGxpbmVTZWwpIHtcclxuICAgICAgICAgICAgICB0aGlzLmFwcGx5Qm9yZGVyVG9PdXRsaW5lKG91dGxpbmVTZWwsIGRlZmF1bHRWYWwgPz8gJycsIGxpbmVzKTtcclxuICAgICAgICAgICAgICB0aGlzLmFwcGx5Qm9yZGVyVG9PdXRsaW5lKG91dGxpbmVTZWwsIHVzZXJWYWwgPz8gJycsIGxpbmVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU3RhdGVDbGFzc2VzKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmZpZWxkVWlkKSByZXR1cm47XHJcbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5maWVsZFVpZCk7XHJcbiAgICBpZiAoIXdyYXBwZXIpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtc3RhdGUtaG92ZXInLCAgIHRoaXMuZm9yY2VTdGF0ZSA9PT0gJ01vdXNlb3ZlcicpO1xyXG4gICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLXN0YXRlLWZvY3VzZWQnLCB0aGlzLmZvcmNlU3RhdGUgPT09ICdGb2N1c2VkJyk7XHJcblxyXG4gICAgaWYgKHRoaXMuZm9yY2VTdGF0ZSA9PT0gJ05vdFZhbGlkJykge1xyXG4gICAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtaW52YWxpZCcsIHRydWUpO1xyXG4gICAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtcmVhZG9ubHknLCBmYWxzZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZvcmNlU3RhdGUgPT09ICdSZWFkb25seScpIHtcclxuICAgICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLXJlYWRvbmx5JywgdHJ1ZSk7XHJcbiAgICAgIHRoaXMudG9nZ2xlQ2xhc3Mod3JhcHBlciwgJ2VxcC1pbnZhbGlkJywgZmFsc2UpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5mb3JjZVN0YXRlID09PSAnTm9ybWFsZScgfHwgdGhpcy5mb3JjZVN0YXRlID09PSAnTW91c2VvdmVyJyB8fCB0aGlzLmZvcmNlU3RhdGUgPT09ICdGb2N1c2VkJykge1xyXG4gICAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtaW52YWxpZCcsIGZhbHNlKTtcclxuICAgICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLXJlYWRvbmx5JywgZmFsc2UpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNSZWFkb25seSA9IHRoaXMuZmllbGQuUmVhZG9ubHkgfHwgKHRoaXMuZmllbGQuRm9ybXVsYSAhPSBudWxsICYmIHRoaXMuZmllbGQuRm9ybXVsYSAhPT0gJycpO1xyXG4gICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLXJlYWRvbmx5JywgaXNSZWFkb25seSk7XHJcblxyXG4gICAgY29uc3QgY3RybCA9IHRoaXMuZmllbGQuRm9ybUZvcm1Hcm91cD8uY29udHJvbHM/Llt0aGlzLmZpZWxkLk5hbWVdO1xyXG4gICAgaWYgKGN0cmw/LnRvdWNoZWQpIHtcclxuICAgICAgdGhpcy50b2dnbGVDbGFzcyh3cmFwcGVyLCAnZXFwLWludmFsaWQnLCB0aGlzLmZpZWxkLkZvcm1Gb3JtR3JvdXAuaW52YWxpZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRvZ2dsZUNsYXNzKHdyYXBwZXIsICdlcXAtaW52YWxpZCcsIGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9nZ2xlQ2xhc3MoZWw6IEVsZW1lbnQsIGNsczogc3RyaW5nLCBjb25kaXRpb246IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChjb25kaXRpb24pIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZWwsIGNscyk7XHJcbiAgICBlbHNlIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZWwsIGNscyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1YnNjcmliZVRvRm9ybVN0YXR1cygpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdHVzU3ViPy51bnN1YnNjcmliZSgpO1xyXG4gICAgaWYgKHRoaXMuZmllbGQ/LkZvcm1Gb3JtR3JvdXApIHtcclxuICAgICAgdGhpcy5zdGF0dXNTdWIgPSB0aGlzLmZpZWxkLkZvcm1Gb3JtR3JvdXAuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVTdGF0ZUNsYXNzZXMoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGaWVsZCgpIHtcclxuICAgIGlmICh0aGlzLmZpZWxkLlJlYWRvbmx5SWYpIHtcclxuICAgICAgdGhpcy5maWVsZC5SZWFkb25seSA9IFV0aWxpdHlIZWxwZXJTZXJ2aWNlLkV2YWx1YXRlRmllbGRGb3JtdWxhKHRoaXMuZmllbGQuUmVhZG9ubHlJZiwgdGhpcy5yZWNvcmQsIHRoaXMuZm9ybXVsYU9iamVjdCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5maWVsZC5Gb3JtdWxhKSB7XHJcbiAgICAgIHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gPSBVdGlsaXR5SGVscGVyU2VydmljZS5FdmFsdWF0ZUZpZWxkRm9ybXVsYSh0aGlzLmZpZWxkLkZvcm11bGEsIHRoaXMucmVjb3JkLCB0aGlzLmZvcm11bGFPYmplY3QpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZmllbGQuVmlzaWJsZUlmKSB7XHJcbiAgICAgIHRoaXMuZmllbGQuSW5MaXN0VmlldyA9IFV0aWxpdHlIZWxwZXJTZXJ2aWNlLkV2YWx1YXRlRmllbGRGb3JtdWxhKHRoaXMuZmllbGQuVmlzaWJsZUlmLCB0aGlzLnJlY29yZCwgdGhpcy5mb3JtdWxhT2JqZWN0KTtcclxuICAgICAgaWYgKCF0aGlzLmZpZWxkLkluTGlzdFZpZXcgJiYgIXRoaXMuZmllbGQuTWFpbnRhaW5fVmFsdWUpIHtcclxuICAgICAgICB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCh0aGlzLmZpZWxkLkRhdGFHZXR0ZXIuRGF0YUdldHRlclR5cGUgPT0gRGF0YUdldHRlclR5cGVFbnVtLk1hbnVhbGUgfHwgdGhpcy5maWVsZC5EYXRhR2V0dGVyLkRhdGFHZXR0ZXJUeXBlID09IERhdGFHZXR0ZXJUeXBlRW51bS5Gb3JtdWxhKSAmJiB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdID09IG51bGwpIHtcclxuICAgICAgdGhpcy5yZWNvcmRbdGhpcy5maWVsZC5OYW1lXSA9IHRoaXMuZmllbGQuRGF0YUdldHRlci5EYXRhR2V0dGVyVmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblJlY29yZFZhbHVlQ2hhbmdlKCkge1xyXG4gICAgdGhpcy51cGRhdGVTdGF0ZUNsYXNzZXMoKTtcclxuICAgIGlmICghdGhpcy5maWVsZC5Gb3JtdWxhKSB7XHJcbiAgICAgIHRoaXMucmVjb3JkQ2hhbmdlLmVtaXQodGhpcy5yZWNvcmQpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IFtpZF09XCJmaWVsZFVpZFwiPlxyXG4gIDxtYXQtZm9ybS1maWVsZCBbZm9ybUdyb3VwXT1cImZpZWxkLkZvcm1Gb3JtR3JvdXBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgPG1hdC1sYWJlbCBbbmdTdHlsZV09XCJMYWJlbHN0eWxlT2JqXCI+XHJcbiAgICAgIHt7IGZpZWxkLkRlc2NyaXB0aW9uIH19XHJcbiAgICA8L21hdC1sYWJlbD5cclxuICAgIDx0bXctaWNvbiBjbGFzcz1cIm1hdC1pY29uXCIgbWF0UHJlZml4XHJcbiAgICAgICpuZ0lmPVwiZmllbGQuSWNvbk5hbWUgJiYgZmllbGQuSWNvblBvc2l0aW9uICE9PSBUZXh0YXJlYUZpZWxkSWNvblBvc2l0aW9uRW51bS5EZXN0cmFcIlxyXG4gICAgICBbbmFtZV09XCJmaWVsZC5JY29uTmFtZVwiPlxyXG4gICAgPC90bXctaWNvbj5cclxuICAgIDx0ZXh0YXJlYVxyXG4gICAgICBjbGFzcz1cInB0LTIgbXQtMlwiXHJcbiAgICAgIFtuZ1N0eWxlXT1cIkZpZWxkc3R5bGVPYmpcIlxyXG4gICAgICBtYXRJbnB1dFxyXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQuRGVzY3JpcHRpb25cIlxyXG4gICAgICBbcm93c109XCJmaWVsZC5Sb3dzXCJcclxuICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5OYW1lXCJcclxuICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLlJlYWRvbmx5XCJcclxuICAgICAgW3JlcXVpcmVkXT1cImZpZWxkLlJlcXVpcmVkXCJcclxuICAgICAgWyhuZ01vZGVsKV09XCJyZWNvcmRbZmllbGQuTmFtZV1cIlxyXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJvblJlY29yZFZhbHVlQ2hhbmdlKClcIlxyXG4gICAgPjwvdGV4dGFyZWE+XHJcbiAgICA8bWF0LWVycm9yXHJcbiAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgIWZpZWxkLkZvcm1Gb3JtR3JvdXAudmFsaWQgJiZcclxuICAgICAgICBmaWVsZC5Gb3JtRm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLk5hbWVdLnRvdWNoZWQgJiZcclxuICAgICAgICAhZmllbGQuUmVhZG9ubHlcclxuICAgICAgXCJcclxuICAgID5cclxuICAgICAgTWluLiBDYXJhdHRlcmk6IHt7IGZpZWxkLk1pbkxlbmdodCB9fSAtIE1heC4gQ2FyYXR0ZXJpOlxyXG4gICAgICB7eyBmaWVsZC5NYXhMZW5naHQgfX1cclxuICAgIDwvbWF0LWVycm9yPlxyXG4gICAgPHRtdy1pY29uIGNsYXNzPVwibWF0LWljb25cIiBtYXRTdWZmaXhcclxuICAgICAgKm5nSWY9XCJmaWVsZC5JY29uTmFtZSAmJiBmaWVsZC5JY29uUG9zaXRpb24gPT09IFRleHRhcmVhRmllbGRJY29uUG9zaXRpb25FbnVtLkRlc3RyYVwiXHJcbiAgICAgIFtuYW1lXT1cImZpZWxkLkljb25OYW1lXCI+XHJcbiAgICA8L3Rtdy1pY29uPlxyXG4gICAgPHRtdy1pY29uIGNsYXNzPVwibWF0LWljb25cIlxyXG4gICAgICBbaGlkZGVuXT1cIiFmaWVsZC5NaWNyb3Bob25lIHx8IHBsYXRmb3JtICE9ICd3ZWInXCJcclxuICAgICAgbWF0U3VmZml4XHJcbiAgICAgIFNwZWVjaFRvVGV4dFxyXG4gICAgICAjbWljU3BlZWNoPVwic3BlZWNoVG9UZXh0XCJcclxuICAgICAgWyhiaW5kZWRUZXh0KV09XCJyZWNvcmRbZmllbGQuTmFtZV1cIlxyXG4gICAgICBbdmFyaWFudF09XCJtaWNTcGVlY2guaXNMaXN0ZW5pbmcgPyAnZmlsbGVkJyA6ICdvdXRsaW5lJ1wiXHJcbiAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCJcclxuICAgICAgbmFtZT1cIm1pY3JvcGhvbmVcIj5cclxuICAgIDwvdG13LWljb24+XHJcbiAgPC9tYXQtZm9ybS1maWVsZD5cclxuPC9kaXY+XHJcbiJdfQ==