@firestitch/report 18.17.4 → 18.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/app/reports/api-error-message.d.ts +1 -0
  2. package/app/reports/data/report.data.d.ts +8 -0
  3. package/app/reports/dialogs/report-package-import/report-package-import.component.d.ts +37 -0
  4. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +2 -0
  5. package/app/reports/interfaces/report-package-check.interface.d.ts +21 -0
  6. package/app/reports/interfaces/report-package-finding-severity.type.d.ts +1 -0
  7. package/app/reports/interfaces/report-package-finding.interface.d.ts +7 -0
  8. package/app/reports/interfaces/report-package-import-response.interface.d.ts +6 -0
  9. package/app/reports/interfaces/report-package-imported-report.interface.d.ts +4 -0
  10. package/app/reports/views/reports/fs-ai-reports.component.d.ts +4 -0
  11. package/esm2022/app/reports/api-error-message.mjs +8 -0
  12. package/esm2022/app/reports/data/report.data.mjs +37 -1
  13. package/esm2022/app/reports/dialogs/report-package-import/report-package-import.component.mjs +144 -0
  14. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +13 -11
  15. package/esm2022/app/reports/interfaces/report-package-check.interface.mjs +2 -0
  16. package/esm2022/app/reports/interfaces/report-package-finding-severity.type.mjs +2 -0
  17. package/esm2022/app/reports/interfaces/report-package-finding.interface.mjs +2 -0
  18. package/esm2022/app/reports/interfaces/report-package-import-response.interface.mjs +2 -0
  19. package/esm2022/app/reports/interfaces/report-package-imported-report.interface.mjs +2 -0
  20. package/esm2022/app/reports/tile-loads.mjs +6 -9
  21. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +2 -2
  22. package/esm2022/app/reports/views/reports/fs-ai-reports.component.mjs +56 -9
  23. package/esm2022/public_api.mjs +6 -1
  24. package/fesm2022/{firestitch-report-echarts-BxAcubsP.mjs → firestitch-report-echarts-qh_mqik9.mjs} +2 -2
  25. package/fesm2022/{firestitch-report-echarts-BxAcubsP.mjs.map → firestitch-report-echarts-qh_mqik9.mjs.map} +1 -1
  26. package/fesm2022/{firestitch-report-firestitch-report-BtC-wiNZ.mjs → firestitch-report-firestitch-report-D-WG_G5d.mjs} +264 -59
  27. package/fesm2022/firestitch-report-firestitch-report-D-WG_G5d.mjs.map +1 -0
  28. package/fesm2022/firestitch-report.mjs +1 -1
  29. package/package.json +1 -1
  30. package/public_api.d.ts +5 -0
  31. package/fesm2022/firestitch-report-firestitch-report-BtC-wiNZ.mjs.map +0 -1
@@ -18,12 +18,14 @@ import { FsFormModule } from '@firestitch/form';
18
18
  import { FsLabelModule } from '@firestitch/label';
19
19
  import { FsMaskModule } from '@firestitch/mask';
20
20
  import { FsMessage, FsMessageModule } from '@firestitch/message';
21
+ import { FsProcess } from '@firestitch/process';
21
22
  import { FsPrompt } from '@firestitch/prompt';
22
23
  import { FsSkeletonModule } from '@firestitch/skeleton';
23
24
  import { FsTabsModule } from '@firestitch/tabs';
24
25
  import { TimezoneSelectComponent } from '../../components/timezone-select/timezone-select.component';
25
26
  import { forkJoin, from, of, throwError } from 'rxjs';
26
27
  import { catchError, concatMap, finalize, switchMap, tap, toArray } from 'rxjs/operators';
28
+ import { apiErrorMessage } from '../../api-error-message';
27
29
  import { ReportData } from '../../data/report.data';
28
30
  import { ReportValueFormat } from '../../enums/report-value-format.enum';
29
31
  import { DAY_SHORT, REPORT_FALLBACK_CURRENCY, currencyName, formatLocalDate, formatNumber, localeName, resolveReportCurrency, resolveReportLocale, } from '../../format';
@@ -182,6 +184,7 @@ export class ReportSettingsComponent {
182
184
  _reportData = inject(ReportData);
183
185
  _message = inject(FsMessage);
184
186
  _prompt = inject(FsPrompt);
187
+ _process = inject(FsProcess);
185
188
  _destroyRef = inject(DestroyRef);
186
189
  _injector = inject(Injector);
187
190
  _document = inject(DOCUMENT);
@@ -253,6 +256,12 @@ export class ReportSettingsComponent {
253
256
  this._refusedInputId = null;
254
257
  }
255
258
  }
259
+ // The report as a package (.report.zip) that another server imports as a
260
+ // new report. The file is written server-side and downloads through the
261
+ // FsProcess dock, so the dialog stays open.
262
+ exportPackage() {
263
+ this._process.download('Exporting report package', this._reportData.exportPackage(this._data.report.id));
264
+ }
256
265
  // Confirm and delete here, while the dialog is still open, then close with
257
266
  // a `deleted` result. The page reacts to the result; it no longer owns the
258
267
  // prompt or the API call.
@@ -379,7 +388,7 @@ export class ReportSettingsComponent {
379
388
  this.wrote.set(true);
380
389
  this.patchRow(row, { group: storedGroup(row.group, changes) });
381
390
  }), catchError((error) => {
382
- this._showRefusal(row, changes, refusalMessage(error));
391
+ this._showRefusal(row, changes, apiErrorMessage(error, 'The filter could not be saved.'));
383
392
  return throwError(() => error);
384
393
  }));
385
394
  }
@@ -488,7 +497,7 @@ export class ReportSettingsComponent {
488
497
  }
489
498
  }
490
499
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportSettingsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
491
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportSettingsComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <h1 mat-dialog-title>\n Report Settings\n </h1>\n <mat-dialog-content>\n <!-- One skeleton over the whole body until the locale list is in. -->\n <ng-container *fsSkeletonForm=\"ready() || null\">\n <!-- animationDone: a refused Label or Name is focused once the\n Filters tab is on screen. -->\n <mat-tab-group\n [(selected)]=\"selectedTab\"\n (animationDone)=\"focusRefusal()\">\n <mat-tab\n label=\"Settings\"\n name=\"settings\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"name\"\n name=\"name\"\n [fsFormRequired]=\"true\">\n </mat-form-field>\n <!--\n The page, typed in inches. Orientation is not asked for because it\n is not an independent choice - a page wider than it is tall IS\n landscape - so the two numbers say everything there is to say.\n -->\n <div class=\"fs-row.gap-sm.align-start\">\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Width\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"1\"\n [(ngModel)]=\"pageWidth\"\n name=\"pageWidth\"\n [fsFormRequired]=\"true\"\n [fsFormMin]=\"pageDimensionMin\"\n [fsFormMax]=\"pageDimensionMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"1\"\n [(ngModel)]=\"pageHeight\"\n name=\"pageHeight\"\n [fsFormRequired]=\"true\"\n [fsFormMin]=\"pageDimensionMin\"\n [fsFormMax]=\"pageDimensionMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n </div>\n <!--\n How deep the header and footer bands are. Their content is edited\n on the canvas (Edit layout \u2192 Header & footer); these reserve the\n space for it, and 0 means no band.\n -->\n <mat-form-field class=\"full-width\">\n <mat-label>\n Header height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"2\"\n [(ngModel)]=\"headerHeight\"\n name=\"headerHeight\"\n [fsFormMin]=\"0\"\n [fsFormMax]=\"headerFooterMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Footer height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"2\"\n [(ngModel)]=\"footerHeight\"\n name=\"footerHeight\"\n [fsFormMin]=\"0\"\n [fsFormMax]=\"headerFooterMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <fs-ai-report-timezone-select [(timezone)]=\"timezone\"></fs-ai-report-timezone-select>\n <!--\n How numbers and dates are written (formatting only: no text is\n translated) and which currency money is labeled in. Hidden on a\n server too old to resolve a report's locale.\n -->\n @if (locales()) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Locale\n </mat-label>\n <mat-select\n [ngModel]=\"locale()\"\n (ngModelChange)=\"locale.set($event)\"\n name=\"locale\">\n @for (option of localeOptions(); track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n <mat-hint>\n {{ formatExample() }}\n </mat-hint>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Currency\n </mat-label>\n <mat-select\n [ngModel]=\"currency()\"\n (ngModelChange)=\"currency.set($event)\"\n name=\"currency\">\n @for (option of currencyOptions(); track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n <mat-hint>\n Names the currency amounts are in; it does not convert them.\n </mat-hint>\n </mat-form-field>\n }\n </div>\n </mat-tab>\n <mat-tab\n label=\"Styles\"\n name=\"styles\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Heading Size\n </mat-label>\n <input\n matInput\n type=\"number\"\n step=\"1\"\n min=\"6\"\n max=\"96\"\n [(ngModel)]=\"headingSize\"\n name=\"headingSize\"\n [fsFormMin]=\"6\"\n [fsFormMax]=\"96\">\n <span matTextSuffix>\n pt\n </span>\n <mat-hint>\n Applies to component titles. Points map 1:1 to PDF and PowerPoint.\n </mat-hint>\n </mat-form-field>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Filters\"\n name=\"filters\">\n <div class=\"fs-column tab-body\">\n @if (filterRows().length) {\n <!-- One section per report bar filter: its heading, its label\n and name, then its default, one field per row. -->\n @for (row of filterRows(); track row.group.id) {\n <h3>\n {{ row.heading }}\n </h3>\n <!-- The label and the name are independent: a new label\n never changes the name, and the name is edited on its\n own. The server checks both, and its refusal shows on\n the field (refusalValidator). -->\n @if (row.showName) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Label\n </mat-label>\n <input\n matInput\n [id]=\"labelInputId(row.group.id)\"\n [ngModel]=\"row.label\"\n (ngModelChange)=\"patchRow(row, { label: $event })\"\n [name]=\"'label' + row.group.id\"\n [fsFormRequired]=\"true\"\n [fsFormMaxLength]=\"labelMaxLength\"\n [validate]=\"refusalValidator\"\n [validateData]=\"row.labelRefusal\">\n <mat-hint>\n What the filter shows. Changing it never changes the name.\n </mat-hint>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [id]=\"nameInputId(row.group.id)\"\n [ngModel]=\"row.name\"\n (ngModelChange)=\"patchRow(row, { name: $event })\"\n [name]=\"'name' + row.group.id\"\n [fsFormRequired]=\"true\"\n [fsFormPattern]=\"namePattern\"\n [fsFormPatternMessage]=\"namePatternMessage\"\n [fsFormMaxLength]=\"nameMaxLength\"\n [validate]=\"refusalValidator\"\n [validateData]=\"row.nameRefusal\">\n <mat-hint>\n How the AI refers to this filter: a letter, then letters and digits.\n </mat-hint>\n </mat-form-field>\n }\n @switch (row.group.type) {\n @case ('dateRange') {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default period\n </mat-label>\n <mat-select\n [ngModel]=\"row.period\"\n (ngModelChange)=\"patchRow(row, { period: $event })\"\n [name]=\"'period' + row.group.id\">\n @for (option of row.periodOptions; track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.name }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n @if (row.period === fixedDatesPeriod) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default from\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.start\"\n [name]=\"'start' + row.group.id\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default to\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.end\"\n [name]=\"'end' + row.group.id\">\n </mat-form-field>\n }\n }\n @case ('select') {\n <fs-label-field class=\"full-width\">\n <fs-autocomplete-chips\n class=\"full-width\"\n label=\"Default values\"\n [fetch]=\"row.fetch\"\n [(ngModel)]=\"row.values\"\n [name]=\"'values' + row.group.id\"\n [multiple]=\"true\"\n [fetchOnFocus]=\"true\">\n <ng-template\n fsAutocompleteChipsTemplate\n let-object=\"object\">\n {{ object.name }}\n </ng-template>\n </fs-autocomplete-chips>\n </fs-label-field>\n @if (row.showExclude) {\n <fs-label-field>\n <mat-slide-toggle\n [ngModel]=\"row.exclude\"\n (ngModelChange)=\"patchRow(row, { exclude: $event })\"\n [name]=\"'exclude' + row.group.id\">\n Exclude these values\n </mat-slide-toggle>\n </fs-label-field>\n }\n }\n @case ('numberRange') {\n <!-- fsMaskNumber hands back text; the check and the save\n read it through parseDefaultBound, so 0 is kept. -->\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default minimum\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [signed]=\"true\"\n [scale]=\"boundScale\"\n [ngModel]=\"row.min\"\n (ngModelChange)=\"patchRow(row, { min: $event })\"\n [name]=\"'min' + row.group.id\"\n [validate]=\"minBoundValidator\"\n [validateData]=\"row.max\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default maximum\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [signed]=\"true\"\n [scale]=\"boundScale\"\n [ngModel]=\"row.max\"\n (ngModelChange)=\"patchRow(row, { max: $event })\"\n [name]=\"'max' + row.group.id\"\n [validate]=\"maxBoundValidator\"\n [validateData]=\"row.min\">\n </mat-form-field>\n }\n @default {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default text\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"row.value\"\n [name]=\"'value' + row.group.id\">\n </mat-form-field>\n }\n }\n }\n } @else {\n <fs-message-info>\n This report has no report bar filters yet. Add a filter to a\n component (its settings \u2192 Filters) and show it in the report bar,\n then set its default here.\n </fs-message-info>\n }\n </div>\n </mat-tab>\n </mat-tab-group>\n </ng-container>\n </mat-dialog-content>\n <mat-dialog-actions>\n <fs-form-dialog-actions>\n <button\n type=\"button\"\n mat-button\n color=\"warn\"\n (click)=\"delete()\">\n Delete\n </button>\n </fs-form-dialog-actions>\n </mat-dialog-actions>\n </fs-dialog>\n</form>", styles: ["mat-form-field{width:100%}.tab-body{padding-top:16px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i2.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "dirtySubmitButton", "submit", "successDelay", "errorDelay", "deactivationGuard"], outputs: ["fsForm", "invalid", "valid", "submitted", "reseted", "cleared"], exportAs: ["fsForm"] }, { kind: "directive", type: i2.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }, { kind: "directive", type: i2.FsFormMinDirective, selector: "[fsFormMin]", inputs: ["fsFormMin", "fsFormMinMessage"] }, { kind: "directive", type: i2.FsFormMaxDirective, selector: "[fsFormMax]", inputs: ["fsFormMax", "fsFormMaxMessage"] }, { kind: "directive", type: i2.FsFormMaxLengthDirective, selector: "[fsFormMaxLength]", inputs: ["fsFormMaxLength", "fsFormMaxLengthMessage"] }, { kind: "directive", type: i2.FsFormPatternDirective, selector: "[fsFormPattern]", inputs: ["fsFormPattern", "fsFormPatternMessage"] }, { kind: "directive", type: i2.FsFormValidateDirective, selector: "[validate]", inputs: ["validate", "validateData", "validateOnSubmit"] }, { kind: "component", type: i2.FsFormDialogActionsComponent, selector: "fs-form-dialog-actions", inputs: ["save", "create", "close", "done", "closeData", "name"] }, { kind: "directive", type: i2.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "directive", type: i2.FsButtonDirective, selector: "[mat-raised-button],[mat-button],[mat-flat-button],[mat-stroked-button]", inputs: ["name", "dirtySubmit"] }, { kind: "ngmodule", type: FsLabelModule }, { kind: "component", type: i3.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["appearance", "showOutline", "disabled", "focused", "hoverable", "padless"] }, { kind: "ngmodule", type: FsMaskModule }, { kind: "directive", type: i4.FsMaskNumberDirective, selector: "[fsMaskNumber]" }, { kind: "ngmodule", type: FsDialogModule }, { kind: "component", type: i5.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout"] }, { kind: "ngmodule", type: FsMessageModule }, { kind: "component", type: i6.FsMessageInfoComponent, selector: "fs-message-info" }, { kind: "ngmodule", type: FsTabsModule }, { kind: "directive", type: i7.FsTabsHeaderTabGroupDirective, selector: "mat-tab-group, matTabGroup, [matTabGroup]", inputs: ["orientation", "selected", "selectedData"], outputs: ["selectedChange", "selectedDataChange"], exportAs: ["fsTabsHeaderTabGroup"] }, { kind: "directive", type: i7.FsTabsTabDirective, selector: "mat-tab,matTab", inputs: ["name", "data"], exportAs: ["fsTabsTab"] }, { kind: "ngmodule", type: FsSkeletonModule }, { kind: "directive", type: i8.FsSkeletonFormDirective, selector: "[fsSkeletonForm]", inputs: ["fsSkeletonForm", "fsSkeletonFormLines"] }, { kind: "ngmodule", type: FsDatePickerModule }, { kind: "component", type: i9.FsDatePickerComponent, selector: "[fsDatePicker]", inputs: ["minYear", "maxYear", "minDate", "maxDate", "startOfDay", "view", "format", "minutes", "width"], outputs: ["change"] }, { kind: "ngmodule", type: FsAutocompleteChipsModule }, { kind: "component", type: i10.FsAutocompleteChipsComponent, selector: "fs-autocomplete-chips", inputs: ["fetch", "appearance", "floatLabel", "readonly", "size", "label", "placeholder", "chipImage", "chipBackground", "chipColor", "chipIcon", "chipIconColor", "chipClass", "chipPadding", "shape", "hint", "allowText", "allowObject", "delay", "minPanelWidth", "maxPanelHeight", "validateText", "removable", "allowClear", "color", "background", "orderable", "padless", "initOnClick", "fetchOnFocus", "multiple", "multipleAdd", "confirm", "disabled", "groupBy", "panelWidth", "panelClass", "compareWith"], outputs: ["selected", "removed", "reordered", "clear", "panelOpened", "panelClosed"] }, { kind: "directive", type: i10.FsAutocompleteObjectDirective, selector: "[fsAutocompleteObject],[fsAutocompleteChipsTemplate]" }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i11.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i11.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: 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: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: TimezoneSelectComponent, selector: "fs-ai-report-timezone-select", inputs: ["placeholder", "required", "disabled", "timezone"], outputs: ["timezoneChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
500
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportSettingsComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <h1 mat-dialog-title>\n Report Settings\n </h1>\n <mat-dialog-content>\n <!-- One skeleton over the whole body until the locale list is in. -->\n <ng-container *fsSkeletonForm=\"ready() || null\">\n <!-- animationDone: a refused Label or Name is focused once the\n Filters tab is on screen. -->\n <mat-tab-group\n [(selected)]=\"selectedTab\"\n (animationDone)=\"focusRefusal()\">\n <mat-tab\n label=\"Settings\"\n name=\"settings\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"name\"\n name=\"name\"\n [fsFormRequired]=\"true\">\n </mat-form-field>\n <!--\n The page, typed in inches. Orientation is not asked for because it\n is not an independent choice - a page wider than it is tall IS\n landscape - so the two numbers say everything there is to say.\n -->\n <div class=\"fs-row.gap-sm.align-start\">\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Width\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"1\"\n [(ngModel)]=\"pageWidth\"\n name=\"pageWidth\"\n [fsFormRequired]=\"true\"\n [fsFormMin]=\"pageDimensionMin\"\n [fsFormMax]=\"pageDimensionMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"1\"\n [(ngModel)]=\"pageHeight\"\n name=\"pageHeight\"\n [fsFormRequired]=\"true\"\n [fsFormMin]=\"pageDimensionMin\"\n [fsFormMax]=\"pageDimensionMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n </div>\n <!--\n How deep the header and footer bands are. Their content is edited\n on the canvas (Edit layout \u2192 Header & footer); these reserve the\n space for it, and 0 means no band.\n -->\n <mat-form-field class=\"full-width\">\n <mat-label>\n Header height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"2\"\n [(ngModel)]=\"headerHeight\"\n name=\"headerHeight\"\n [fsFormMin]=\"0\"\n [fsFormMax]=\"headerFooterMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Footer height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"2\"\n [(ngModel)]=\"footerHeight\"\n name=\"footerHeight\"\n [fsFormMin]=\"0\"\n [fsFormMax]=\"headerFooterMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <fs-ai-report-timezone-select [(timezone)]=\"timezone\"></fs-ai-report-timezone-select>\n <!--\n How numbers and dates are written (formatting only: no text is\n translated) and which currency money is labeled in. Hidden on a\n server too old to resolve a report's locale.\n -->\n @if (locales()) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Locale\n </mat-label>\n <mat-select\n [ngModel]=\"locale()\"\n (ngModelChange)=\"locale.set($event)\"\n name=\"locale\">\n @for (option of localeOptions(); track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n <mat-hint>\n {{ formatExample() }}\n </mat-hint>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Currency\n </mat-label>\n <mat-select\n [ngModel]=\"currency()\"\n (ngModelChange)=\"currency.set($event)\"\n name=\"currency\">\n @for (option of currencyOptions(); track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n <mat-hint>\n Names the currency amounts are in; it does not convert them.\n </mat-hint>\n </mat-form-field>\n }\n </div>\n </mat-tab>\n <mat-tab\n label=\"Styles\"\n name=\"styles\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Heading Size\n </mat-label>\n <input\n matInput\n type=\"number\"\n step=\"1\"\n min=\"6\"\n max=\"96\"\n [(ngModel)]=\"headingSize\"\n name=\"headingSize\"\n [fsFormMin]=\"6\"\n [fsFormMax]=\"96\">\n <span matTextSuffix>\n pt\n </span>\n <mat-hint>\n Applies to component titles. Points map 1:1 to PDF and PowerPoint.\n </mat-hint>\n </mat-form-field>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Filters\"\n name=\"filters\">\n <div class=\"fs-column tab-body\">\n @if (filterRows().length) {\n <!-- One section per report bar filter: its heading, its label\n and name, then its default, one field per row. -->\n @for (row of filterRows(); track row.group.id) {\n <h3>\n {{ row.heading }}\n </h3>\n <!-- The label and the name are independent: a new label\n never changes the name, and the name is edited on its\n own. The server checks both, and its refusal shows on\n the field (refusalValidator). -->\n @if (row.showName) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Label\n </mat-label>\n <input\n matInput\n [id]=\"labelInputId(row.group.id)\"\n [ngModel]=\"row.label\"\n (ngModelChange)=\"patchRow(row, { label: $event })\"\n [name]=\"'label' + row.group.id\"\n [fsFormRequired]=\"true\"\n [fsFormMaxLength]=\"labelMaxLength\"\n [validate]=\"refusalValidator\"\n [validateData]=\"row.labelRefusal\">\n <mat-hint>\n What the filter shows. Changing it never changes the name.\n </mat-hint>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [id]=\"nameInputId(row.group.id)\"\n [ngModel]=\"row.name\"\n (ngModelChange)=\"patchRow(row, { name: $event })\"\n [name]=\"'name' + row.group.id\"\n [fsFormRequired]=\"true\"\n [fsFormPattern]=\"namePattern\"\n [fsFormPatternMessage]=\"namePatternMessage\"\n [fsFormMaxLength]=\"nameMaxLength\"\n [validate]=\"refusalValidator\"\n [validateData]=\"row.nameRefusal\">\n <mat-hint>\n How the AI refers to this filter: a letter, then letters and digits.\n </mat-hint>\n </mat-form-field>\n }\n @switch (row.group.type) {\n @case ('dateRange') {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default period\n </mat-label>\n <mat-select\n [ngModel]=\"row.period\"\n (ngModelChange)=\"patchRow(row, { period: $event })\"\n [name]=\"'period' + row.group.id\">\n @for (option of row.periodOptions; track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.name }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n @if (row.period === fixedDatesPeriod) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default from\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.start\"\n [name]=\"'start' + row.group.id\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default to\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.end\"\n [name]=\"'end' + row.group.id\">\n </mat-form-field>\n }\n }\n @case ('select') {\n <fs-label-field class=\"full-width\">\n <fs-autocomplete-chips\n class=\"full-width\"\n label=\"Default values\"\n [fetch]=\"row.fetch\"\n [(ngModel)]=\"row.values\"\n [name]=\"'values' + row.group.id\"\n [multiple]=\"true\"\n [fetchOnFocus]=\"true\">\n <ng-template\n fsAutocompleteChipsTemplate\n let-object=\"object\">\n {{ object.name }}\n </ng-template>\n </fs-autocomplete-chips>\n </fs-label-field>\n @if (row.showExclude) {\n <fs-label-field>\n <mat-slide-toggle\n [ngModel]=\"row.exclude\"\n (ngModelChange)=\"patchRow(row, { exclude: $event })\"\n [name]=\"'exclude' + row.group.id\">\n Exclude these values\n </mat-slide-toggle>\n </fs-label-field>\n }\n }\n @case ('numberRange') {\n <!-- fsMaskNumber hands back text; the check and the save\n read it through parseDefaultBound, so 0 is kept. -->\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default minimum\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [signed]=\"true\"\n [scale]=\"boundScale\"\n [ngModel]=\"row.min\"\n (ngModelChange)=\"patchRow(row, { min: $event })\"\n [name]=\"'min' + row.group.id\"\n [validate]=\"minBoundValidator\"\n [validateData]=\"row.max\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default maximum\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [signed]=\"true\"\n [scale]=\"boundScale\"\n [ngModel]=\"row.max\"\n (ngModelChange)=\"patchRow(row, { max: $event })\"\n [name]=\"'max' + row.group.id\"\n [validate]=\"maxBoundValidator\"\n [validateData]=\"row.min\">\n </mat-form-field>\n }\n @default {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default text\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"row.value\"\n [name]=\"'value' + row.group.id\">\n </mat-form-field>\n }\n }\n }\n } @else {\n <fs-message-info>\n This report has no report bar filters yet. Add a filter to a\n component (its settings \u2192 Filters) and show it in the report bar,\n then set its default here.\n </fs-message-info>\n }\n </div>\n </mat-tab>\n </mat-tab-group>\n </ng-container>\n </mat-dialog-content>\n <mat-dialog-actions>\n <fs-form-dialog-actions>\n <button\n type=\"button\"\n mat-button\n (click)=\"exportPackage()\">\n Export\n </button>\n <button\n type=\"button\"\n mat-button\n color=\"warn\"\n (click)=\"delete()\">\n Delete\n </button>\n </fs-form-dialog-actions>\n </mat-dialog-actions>\n </fs-dialog>\n</form>", styles: ["mat-form-field{width:100%}.tab-body{padding-top:16px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i2.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "dirtySubmitButton", "submit", "successDelay", "errorDelay", "deactivationGuard"], outputs: ["fsForm", "invalid", "valid", "submitted", "reseted", "cleared"], exportAs: ["fsForm"] }, { kind: "directive", type: i2.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }, { kind: "directive", type: i2.FsFormMinDirective, selector: "[fsFormMin]", inputs: ["fsFormMin", "fsFormMinMessage"] }, { kind: "directive", type: i2.FsFormMaxDirective, selector: "[fsFormMax]", inputs: ["fsFormMax", "fsFormMaxMessage"] }, { kind: "directive", type: i2.FsFormMaxLengthDirective, selector: "[fsFormMaxLength]", inputs: ["fsFormMaxLength", "fsFormMaxLengthMessage"] }, { kind: "directive", type: i2.FsFormPatternDirective, selector: "[fsFormPattern]", inputs: ["fsFormPattern", "fsFormPatternMessage"] }, { kind: "directive", type: i2.FsFormValidateDirective, selector: "[validate]", inputs: ["validate", "validateData", "validateOnSubmit"] }, { kind: "component", type: i2.FsFormDialogActionsComponent, selector: "fs-form-dialog-actions", inputs: ["save", "create", "close", "done", "closeData", "name"] }, { kind: "directive", type: i2.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "directive", type: i2.FsButtonDirective, selector: "[mat-raised-button],[mat-button],[mat-flat-button],[mat-stroked-button]", inputs: ["name", "dirtySubmit"] }, { kind: "ngmodule", type: FsLabelModule }, { kind: "component", type: i3.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["appearance", "showOutline", "disabled", "focused", "hoverable", "padless"] }, { kind: "ngmodule", type: FsMaskModule }, { kind: "directive", type: i4.FsMaskNumberDirective, selector: "[fsMaskNumber]" }, { kind: "ngmodule", type: FsDialogModule }, { kind: "component", type: i5.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout"] }, { kind: "ngmodule", type: FsMessageModule }, { kind: "component", type: i6.FsMessageInfoComponent, selector: "fs-message-info" }, { kind: "ngmodule", type: FsTabsModule }, { kind: "directive", type: i7.FsTabsHeaderTabGroupDirective, selector: "mat-tab-group, matTabGroup, [matTabGroup]", inputs: ["orientation", "selected", "selectedData"], outputs: ["selectedChange", "selectedDataChange"], exportAs: ["fsTabsHeaderTabGroup"] }, { kind: "directive", type: i7.FsTabsTabDirective, selector: "mat-tab,matTab", inputs: ["name", "data"], exportAs: ["fsTabsTab"] }, { kind: "ngmodule", type: FsSkeletonModule }, { kind: "directive", type: i8.FsSkeletonFormDirective, selector: "[fsSkeletonForm]", inputs: ["fsSkeletonForm", "fsSkeletonFormLines"] }, { kind: "ngmodule", type: FsDatePickerModule }, { kind: "component", type: i9.FsDatePickerComponent, selector: "[fsDatePicker]", inputs: ["minYear", "maxYear", "minDate", "maxDate", "startOfDay", "view", "format", "minutes", "width"], outputs: ["change"] }, { kind: "ngmodule", type: FsAutocompleteChipsModule }, { kind: "component", type: i10.FsAutocompleteChipsComponent, selector: "fs-autocomplete-chips", inputs: ["fetch", "appearance", "floatLabel", "readonly", "size", "label", "placeholder", "chipImage", "chipBackground", "chipColor", "chipIcon", "chipIconColor", "chipClass", "chipPadding", "shape", "hint", "allowText", "allowObject", "delay", "minPanelWidth", "maxPanelHeight", "validateText", "removable", "allowClear", "color", "background", "orderable", "padless", "initOnClick", "fetchOnFocus", "multiple", "multipleAdd", "confirm", "disabled", "groupBy", "panelWidth", "panelClass", "compareWith"], outputs: ["selected", "removed", "reordered", "clear", "panelOpened", "panelClosed"] }, { kind: "directive", type: i10.FsAutocompleteObjectDirective, selector: "[fsAutocompleteObject],[fsAutocompleteChipsTemplate]" }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i11.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i11.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: 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: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: TimezoneSelectComponent, selector: "fs-ai-report-timezone-select", inputs: ["placeholder", "required", "disabled", "timezone"], outputs: ["timezoneChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
492
501
  }
493
502
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportSettingsComponent, decorators: [{
494
503
  type: Component,
@@ -517,15 +526,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
517
526
  MatOption,
518
527
  MatSlideToggle,
519
528
  TimezoneSelectComponent,
520
- ], template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <h1 mat-dialog-title>\n Report Settings\n </h1>\n <mat-dialog-content>\n <!-- One skeleton over the whole body until the locale list is in. -->\n <ng-container *fsSkeletonForm=\"ready() || null\">\n <!-- animationDone: a refused Label or Name is focused once the\n Filters tab is on screen. -->\n <mat-tab-group\n [(selected)]=\"selectedTab\"\n (animationDone)=\"focusRefusal()\">\n <mat-tab\n label=\"Settings\"\n name=\"settings\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"name\"\n name=\"name\"\n [fsFormRequired]=\"true\">\n </mat-form-field>\n <!--\n The page, typed in inches. Orientation is not asked for because it\n is not an independent choice - a page wider than it is tall IS\n landscape - so the two numbers say everything there is to say.\n -->\n <div class=\"fs-row.gap-sm.align-start\">\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Width\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"1\"\n [(ngModel)]=\"pageWidth\"\n name=\"pageWidth\"\n [fsFormRequired]=\"true\"\n [fsFormMin]=\"pageDimensionMin\"\n [fsFormMax]=\"pageDimensionMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"1\"\n [(ngModel)]=\"pageHeight\"\n name=\"pageHeight\"\n [fsFormRequired]=\"true\"\n [fsFormMin]=\"pageDimensionMin\"\n [fsFormMax]=\"pageDimensionMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n </div>\n <!--\n How deep the header and footer bands are. Their content is edited\n on the canvas (Edit layout \u2192 Header & footer); these reserve the\n space for it, and 0 means no band.\n -->\n <mat-form-field class=\"full-width\">\n <mat-label>\n Header height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"2\"\n [(ngModel)]=\"headerHeight\"\n name=\"headerHeight\"\n [fsFormMin]=\"0\"\n [fsFormMax]=\"headerFooterMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Footer height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"2\"\n [(ngModel)]=\"footerHeight\"\n name=\"footerHeight\"\n [fsFormMin]=\"0\"\n [fsFormMax]=\"headerFooterMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <fs-ai-report-timezone-select [(timezone)]=\"timezone\"></fs-ai-report-timezone-select>\n <!--\n How numbers and dates are written (formatting only: no text is\n translated) and which currency money is labeled in. Hidden on a\n server too old to resolve a report's locale.\n -->\n @if (locales()) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Locale\n </mat-label>\n <mat-select\n [ngModel]=\"locale()\"\n (ngModelChange)=\"locale.set($event)\"\n name=\"locale\">\n @for (option of localeOptions(); track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n <mat-hint>\n {{ formatExample() }}\n </mat-hint>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Currency\n </mat-label>\n <mat-select\n [ngModel]=\"currency()\"\n (ngModelChange)=\"currency.set($event)\"\n name=\"currency\">\n @for (option of currencyOptions(); track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n <mat-hint>\n Names the currency amounts are in; it does not convert them.\n </mat-hint>\n </mat-form-field>\n }\n </div>\n </mat-tab>\n <mat-tab\n label=\"Styles\"\n name=\"styles\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Heading Size\n </mat-label>\n <input\n matInput\n type=\"number\"\n step=\"1\"\n min=\"6\"\n max=\"96\"\n [(ngModel)]=\"headingSize\"\n name=\"headingSize\"\n [fsFormMin]=\"6\"\n [fsFormMax]=\"96\">\n <span matTextSuffix>\n pt\n </span>\n <mat-hint>\n Applies to component titles. Points map 1:1 to PDF and PowerPoint.\n </mat-hint>\n </mat-form-field>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Filters\"\n name=\"filters\">\n <div class=\"fs-column tab-body\">\n @if (filterRows().length) {\n <!-- One section per report bar filter: its heading, its label\n and name, then its default, one field per row. -->\n @for (row of filterRows(); track row.group.id) {\n <h3>\n {{ row.heading }}\n </h3>\n <!-- The label and the name are independent: a new label\n never changes the name, and the name is edited on its\n own. The server checks both, and its refusal shows on\n the field (refusalValidator). -->\n @if (row.showName) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Label\n </mat-label>\n <input\n matInput\n [id]=\"labelInputId(row.group.id)\"\n [ngModel]=\"row.label\"\n (ngModelChange)=\"patchRow(row, { label: $event })\"\n [name]=\"'label' + row.group.id\"\n [fsFormRequired]=\"true\"\n [fsFormMaxLength]=\"labelMaxLength\"\n [validate]=\"refusalValidator\"\n [validateData]=\"row.labelRefusal\">\n <mat-hint>\n What the filter shows. Changing it never changes the name.\n </mat-hint>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [id]=\"nameInputId(row.group.id)\"\n [ngModel]=\"row.name\"\n (ngModelChange)=\"patchRow(row, { name: $event })\"\n [name]=\"'name' + row.group.id\"\n [fsFormRequired]=\"true\"\n [fsFormPattern]=\"namePattern\"\n [fsFormPatternMessage]=\"namePatternMessage\"\n [fsFormMaxLength]=\"nameMaxLength\"\n [validate]=\"refusalValidator\"\n [validateData]=\"row.nameRefusal\">\n <mat-hint>\n How the AI refers to this filter: a letter, then letters and digits.\n </mat-hint>\n </mat-form-field>\n }\n @switch (row.group.type) {\n @case ('dateRange') {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default period\n </mat-label>\n <mat-select\n [ngModel]=\"row.period\"\n (ngModelChange)=\"patchRow(row, { period: $event })\"\n [name]=\"'period' + row.group.id\">\n @for (option of row.periodOptions; track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.name }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n @if (row.period === fixedDatesPeriod) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default from\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.start\"\n [name]=\"'start' + row.group.id\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default to\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.end\"\n [name]=\"'end' + row.group.id\">\n </mat-form-field>\n }\n }\n @case ('select') {\n <fs-label-field class=\"full-width\">\n <fs-autocomplete-chips\n class=\"full-width\"\n label=\"Default values\"\n [fetch]=\"row.fetch\"\n [(ngModel)]=\"row.values\"\n [name]=\"'values' + row.group.id\"\n [multiple]=\"true\"\n [fetchOnFocus]=\"true\">\n <ng-template\n fsAutocompleteChipsTemplate\n let-object=\"object\">\n {{ object.name }}\n </ng-template>\n </fs-autocomplete-chips>\n </fs-label-field>\n @if (row.showExclude) {\n <fs-label-field>\n <mat-slide-toggle\n [ngModel]=\"row.exclude\"\n (ngModelChange)=\"patchRow(row, { exclude: $event })\"\n [name]=\"'exclude' + row.group.id\">\n Exclude these values\n </mat-slide-toggle>\n </fs-label-field>\n }\n }\n @case ('numberRange') {\n <!-- fsMaskNumber hands back text; the check and the save\n read it through parseDefaultBound, so 0 is kept. -->\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default minimum\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [signed]=\"true\"\n [scale]=\"boundScale\"\n [ngModel]=\"row.min\"\n (ngModelChange)=\"patchRow(row, { min: $event })\"\n [name]=\"'min' + row.group.id\"\n [validate]=\"minBoundValidator\"\n [validateData]=\"row.max\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default maximum\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [signed]=\"true\"\n [scale]=\"boundScale\"\n [ngModel]=\"row.max\"\n (ngModelChange)=\"patchRow(row, { max: $event })\"\n [name]=\"'max' + row.group.id\"\n [validate]=\"maxBoundValidator\"\n [validateData]=\"row.min\">\n </mat-form-field>\n }\n @default {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default text\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"row.value\"\n [name]=\"'value' + row.group.id\">\n </mat-form-field>\n }\n }\n }\n } @else {\n <fs-message-info>\n This report has no report bar filters yet. Add a filter to a\n component (its settings \u2192 Filters) and show it in the report bar,\n then set its default here.\n </fs-message-info>\n }\n </div>\n </mat-tab>\n </mat-tab-group>\n </ng-container>\n </mat-dialog-content>\n <mat-dialog-actions>\n <fs-form-dialog-actions>\n <button\n type=\"button\"\n mat-button\n color=\"warn\"\n (click)=\"delete()\">\n Delete\n </button>\n </fs-form-dialog-actions>\n </mat-dialog-actions>\n </fs-dialog>\n</form>", styles: ["mat-form-field{width:100%}.tab-body{padding-top:16px}\n"] }]
529
+ ], template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <h1 mat-dialog-title>\n Report Settings\n </h1>\n <mat-dialog-content>\n <!-- One skeleton over the whole body until the locale list is in. -->\n <ng-container *fsSkeletonForm=\"ready() || null\">\n <!-- animationDone: a refused Label or Name is focused once the\n Filters tab is on screen. -->\n <mat-tab-group\n [(selected)]=\"selectedTab\"\n (animationDone)=\"focusRefusal()\">\n <mat-tab\n label=\"Settings\"\n name=\"settings\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"name\"\n name=\"name\"\n [fsFormRequired]=\"true\">\n </mat-form-field>\n <!--\n The page, typed in inches. Orientation is not asked for because it\n is not an independent choice - a page wider than it is tall IS\n landscape - so the two numbers say everything there is to say.\n -->\n <div class=\"fs-row.gap-sm.align-start\">\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Width\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"1\"\n [(ngModel)]=\"pageWidth\"\n name=\"pageWidth\"\n [fsFormRequired]=\"true\"\n [fsFormMin]=\"pageDimensionMin\"\n [fsFormMax]=\"pageDimensionMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"1\"\n [(ngModel)]=\"pageHeight\"\n name=\"pageHeight\"\n [fsFormRequired]=\"true\"\n [fsFormMin]=\"pageDimensionMin\"\n [fsFormMax]=\"pageDimensionMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n </div>\n <!--\n How deep the header and footer bands are. Their content is edited\n on the canvas (Edit layout \u2192 Header & footer); these reserve the\n space for it, and 0 means no band.\n -->\n <mat-form-field class=\"full-width\">\n <mat-label>\n Header height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"2\"\n [(ngModel)]=\"headerHeight\"\n name=\"headerHeight\"\n [fsFormMin]=\"0\"\n [fsFormMax]=\"headerFooterMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Footer height\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"2\"\n [(ngModel)]=\"footerHeight\"\n name=\"footerHeight\"\n [fsFormMin]=\"0\"\n [fsFormMax]=\"headerFooterMax\">\n <div matTextSuffix>\n inches\n </div>\n </mat-form-field>\n <fs-ai-report-timezone-select [(timezone)]=\"timezone\"></fs-ai-report-timezone-select>\n <!--\n How numbers and dates are written (formatting only: no text is\n translated) and which currency money is labeled in. Hidden on a\n server too old to resolve a report's locale.\n -->\n @if (locales()) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Locale\n </mat-label>\n <mat-select\n [ngModel]=\"locale()\"\n (ngModelChange)=\"locale.set($event)\"\n name=\"locale\">\n @for (option of localeOptions(); track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n <mat-hint>\n {{ formatExample() }}\n </mat-hint>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Currency\n </mat-label>\n <mat-select\n [ngModel]=\"currency()\"\n (ngModelChange)=\"currency.set($event)\"\n name=\"currency\">\n @for (option of currencyOptions(); track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n <mat-hint>\n Names the currency amounts are in; it does not convert them.\n </mat-hint>\n </mat-form-field>\n }\n </div>\n </mat-tab>\n <mat-tab\n label=\"Styles\"\n name=\"styles\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Heading Size\n </mat-label>\n <input\n matInput\n type=\"number\"\n step=\"1\"\n min=\"6\"\n max=\"96\"\n [(ngModel)]=\"headingSize\"\n name=\"headingSize\"\n [fsFormMin]=\"6\"\n [fsFormMax]=\"96\">\n <span matTextSuffix>\n pt\n </span>\n <mat-hint>\n Applies to component titles. Points map 1:1 to PDF and PowerPoint.\n </mat-hint>\n </mat-form-field>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Filters\"\n name=\"filters\">\n <div class=\"fs-column tab-body\">\n @if (filterRows().length) {\n <!-- One section per report bar filter: its heading, its label\n and name, then its default, one field per row. -->\n @for (row of filterRows(); track row.group.id) {\n <h3>\n {{ row.heading }}\n </h3>\n <!-- The label and the name are independent: a new label\n never changes the name, and the name is edited on its\n own. The server checks both, and its refusal shows on\n the field (refusalValidator). -->\n @if (row.showName) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Label\n </mat-label>\n <input\n matInput\n [id]=\"labelInputId(row.group.id)\"\n [ngModel]=\"row.label\"\n (ngModelChange)=\"patchRow(row, { label: $event })\"\n [name]=\"'label' + row.group.id\"\n [fsFormRequired]=\"true\"\n [fsFormMaxLength]=\"labelMaxLength\"\n [validate]=\"refusalValidator\"\n [validateData]=\"row.labelRefusal\">\n <mat-hint>\n What the filter shows. Changing it never changes the name.\n </mat-hint>\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [id]=\"nameInputId(row.group.id)\"\n [ngModel]=\"row.name\"\n (ngModelChange)=\"patchRow(row, { name: $event })\"\n [name]=\"'name' + row.group.id\"\n [fsFormRequired]=\"true\"\n [fsFormPattern]=\"namePattern\"\n [fsFormPatternMessage]=\"namePatternMessage\"\n [fsFormMaxLength]=\"nameMaxLength\"\n [validate]=\"refusalValidator\"\n [validateData]=\"row.nameRefusal\">\n <mat-hint>\n How the AI refers to this filter: a letter, then letters and digits.\n </mat-hint>\n </mat-form-field>\n }\n @switch (row.group.type) {\n @case ('dateRange') {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default period\n </mat-label>\n <mat-select\n [ngModel]=\"row.period\"\n (ngModelChange)=\"patchRow(row, { period: $event })\"\n [name]=\"'period' + row.group.id\">\n @for (option of row.periodOptions; track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.name }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n @if (row.period === fixedDatesPeriod) {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default from\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.start\"\n [name]=\"'start' + row.group.id\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default to\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.end\"\n [name]=\"'end' + row.group.id\">\n </mat-form-field>\n }\n }\n @case ('select') {\n <fs-label-field class=\"full-width\">\n <fs-autocomplete-chips\n class=\"full-width\"\n label=\"Default values\"\n [fetch]=\"row.fetch\"\n [(ngModel)]=\"row.values\"\n [name]=\"'values' + row.group.id\"\n [multiple]=\"true\"\n [fetchOnFocus]=\"true\">\n <ng-template\n fsAutocompleteChipsTemplate\n let-object=\"object\">\n {{ object.name }}\n </ng-template>\n </fs-autocomplete-chips>\n </fs-label-field>\n @if (row.showExclude) {\n <fs-label-field>\n <mat-slide-toggle\n [ngModel]=\"row.exclude\"\n (ngModelChange)=\"patchRow(row, { exclude: $event })\"\n [name]=\"'exclude' + row.group.id\">\n Exclude these values\n </mat-slide-toggle>\n </fs-label-field>\n }\n }\n @case ('numberRange') {\n <!-- fsMaskNumber hands back text; the check and the save\n read it through parseDefaultBound, so 0 is kept. -->\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default minimum\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [signed]=\"true\"\n [scale]=\"boundScale\"\n [ngModel]=\"row.min\"\n (ngModelChange)=\"patchRow(row, { min: $event })\"\n [name]=\"'min' + row.group.id\"\n [validate]=\"minBoundValidator\"\n [validateData]=\"row.max\">\n </mat-form-field>\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default maximum\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [signed]=\"true\"\n [scale]=\"boundScale\"\n [ngModel]=\"row.max\"\n (ngModelChange)=\"patchRow(row, { max: $event })\"\n [name]=\"'max' + row.group.id\"\n [validate]=\"maxBoundValidator\"\n [validateData]=\"row.min\">\n </mat-form-field>\n }\n @default {\n <mat-form-field class=\"full-width\">\n <mat-label>\n Default text\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"row.value\"\n [name]=\"'value' + row.group.id\">\n </mat-form-field>\n }\n }\n }\n } @else {\n <fs-message-info>\n This report has no report bar filters yet. Add a filter to a\n component (its settings \u2192 Filters) and show it in the report bar,\n then set its default here.\n </fs-message-info>\n }\n </div>\n </mat-tab>\n </mat-tab-group>\n </ng-container>\n </mat-dialog-content>\n <mat-dialog-actions>\n <fs-form-dialog-actions>\n <button\n type=\"button\"\n mat-button\n (click)=\"exportPackage()\">\n Export\n </button>\n <button\n type=\"button\"\n mat-button\n color=\"warn\"\n (click)=\"delete()\">\n Delete\n </button>\n </fs-form-dialog-actions>\n </mat-dialog-actions>\n </fs-dialog>\n</form>", styles: ["mat-form-field{width:100%}.tab-body{padding-top:16px}\n"] }]
521
530
  }] });
522
- // What a refused request says: the server's message, else the error's own,
523
- // else a plain fallback.
524
- function refusalMessage(error) {
525
- const failure = error;
526
- const message = failure?.error?.message ?? failure?.message;
527
- return typeof message === 'string' && message ? message : 'The filter could not be saved.';
528
- }
529
531
  // The group as the server now stores it, once an update carrying `changes`
530
532
  // is taken.
531
533
  function storedGroup(group, changes) {
@@ -546,4 +548,4 @@ function labelInputId(groupId) {
546
548
  function nameInputId(groupId) {
547
549
  return `filterName${groupId}`;
548
550
  }
549
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9kaWFsb2dzL3JlcG9ydC1zZXR0aW5ncy9yZXBvcnQtc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvcmVwb3J0LXNldHRpbmdzL3JlcG9ydC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFDTCx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBVSxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQzVHLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBbUIsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdILE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0s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b24nO1xuaW1wb3J0IHsgSHR0cENvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBJbmplY3RvciwgT25Jbml0LCBhZnRlck5leHRSZW5kZXIsIGNvbXB1dGVkLCBpbmplY3QsIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBNYXRCdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dBY3Rpb25zLCBNYXREaWFsb2dDb250ZW50LCBNYXREaWFsb2dSZWYsIE1hdERpYWxvZ1RpdGxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZCwgTWF0TGFiZWwsIE1hdEhpbnQsIE1hdFN1ZmZpeCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SW5wdXQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRPcHRpb24sIE1hdFNlbGVjdCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBNYXRTbGlkZVRvZ2dsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NsaWRlLXRvZ2dsZSc7XG5pbXBvcnQgeyBNYXRUYWJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XG5cbmltcG9ydCB7IERpc3BsYXlBcGlFcnJvciB9IGZyb20gJ0BmaXJlc3RpdGNoL2FwaSc7XG5pbXBvcnQgeyBGc0F1dG9jb21wbGV0ZUNoaXBzTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYXV0b2NvbXBsZXRlLWNoaXBzJztcbmltcG9ydCB7IEZzRGF0ZVBpY2tlck1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgRnNEaWFsb2dNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9kaWFsb2cnO1xuaW1wb3J0IHsgRnNGb3JtTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZm9ybSc7XG5pbXBvcnQgeyBGc0xhYmVsTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGFiZWwnO1xuaW1wb3J0IHsgRnNNYXNrTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWFzayc7XG5pbXBvcnQgeyBGc01lc3NhZ2UsIEZzTWVzc2FnZU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuaW1wb3J0IHsgRnNTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3NrZWxldG9uJztcbmltcG9ydCB7IEZzVGFic01vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3RhYnMnO1xuXG5pbXBvcnQgeyBUaW1lem9uZVNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdGltZXpvbmUtc2VsZWN0L3RpbWV6b25lLXNlbGVjdC5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiwgZnJvbSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGNvbmNhdE1hcCwgZmluYWxpemUsIHN3aXRjaE1hcCwgdGFwLCB0b0FycmF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyBSZXBvcnRWYWx1ZUZvcm1hdCB9IGZyb20gJy4uLy4uL2VudW1zL3JlcG9ydC12YWx1ZS1mb3JtYXQuZW51bSc7XG5pbXBvcnQge1xuICBEQVlfU0hPUlQsXG4gIFJFUE9SVF9GQUxMQkFDS19DVVJSRU5DWSxcbiAgY3VycmVuY3lOYW1lLFxuICBmb3JtYXRMb2NhbERhdGUsXG4gIGZvcm1hdE51bWJlcixcbiAgbG9jYWxlTmFtZSxcbiAgcmVzb2x2ZVJlcG9ydEN1cnJlbmN5LFxuICByZXNvbHZlUmVwb3J0TG9jYWxlLFxufSBmcm9tICcuLi8uLi9mb3JtYXQnO1xuaW1wb3J0IHtcbiAgRmlsdGVyR3JvdXBEZWZhdWx0LFxuICBSZXBvcnQsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxuICBSZXBvcnRMb2NhbGVzLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtZmlsdGVyLWdyb3VwLWNoYW5nZXMuaW50ZXJmYWNlJztcbmltcG9ydCB7IERFRkFVTFRfSEVBRElOR19TSVpFLCBIRUFERVJfRk9PVEVSX01BWCwgUEFHRV9ESU1FTlNJT05fTUFYLCBQQUdFX0RJTUVOU0lPTl9NSU4gfSBmcm9tICcuLi8uLi9sYXlvdXQnO1xuaW1wb3J0IHtcbiAgZGF0ZUZyb21Cb3VuZCwgZGF0ZVRvQm91bmQsIGxvYWRHcm91cE9wdGlvbnMsIG1hdGNoT3B0aW9ucywgcmVsYXRpdmVMYWJlbCwgcmVzb2x2ZU9wdGlvblZhbHVlcyxcbn0gZnJvbSAnLi4vLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQge1xuICBERUZBVUxUX0JPVU5EX1NDQUxFLFxuICBGSUxURVJfTEFCRUxfTUFYX0xFTkdUSCxcbiAgRklMVEVSX05BTUVfTUFYX0xFTkdUSCxcbiAgRklMVEVSX05BTUVfUEFUVEVSTixcbiAgRklMVEVSX05BTUVfUEFUVEVSTl9NRVNTQUdFLFxuICBGSVhFRF9EQVRFU19QRVJJT0QsXG4gIGJvdW5kc0Vycm9yLFxuICBkYXRlUmFuZ2VEZWZhdWx0LFxuICBkZWZhdWx0Q2hhbmdlZCxcbiAgZGVmYXVsdFBlcmlvZCxcbiAgZGVmYXVsdFBlcmlvZE9wdGlvbnMsXG4gIGRlZmF1bHRSb3dHcm91cHMsXG4gIGRlZmF1bHRSb3dMYWJlbCxcbiAgbnVtYmVyUmFuZ2VEZWZhdWx0LFxuICBwYXJzZURlZmF1bHRCb3VuZCxcbiAgc2VsZWN0RGVmYXVsdCxcbiAgc2hvd0V4Y2x1ZGVUb2dnbGUsXG59IGZyb20gJy4uLy4uL2ZpbHRlci1zZXR0aW5ncy1ydWxlcyc7XG5pbXBvcnQgeyBGaWx0ZXJTZXR0aW5nc09wdGlvbiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZmlsdGVyLXNldHRpbmdzLW9wdGlvbi5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyByZXBvcnRMb2NhbGVQYXRjaCB9IGZyb20gJy4vcmVwb3J0LWxvY2FsZS1wYXRjaCc7XG5cblxuLy8gV2hhdCB0aGUgZGlhbG9nIGhhbmRzIGJhY2sgd2hlbiBpdCBjbG9zZXMsIHNvIHRoZSBwYWdlIGtub3dzIHdoYXQgaGFwcGVuZWRcbi8vIHdpdGhvdXQgc25pZmZpbmcgbWFnaWMgc3RyaW5ncy4gQSBkaXNtaXNzZWQgZGlhbG9nIGNsb3NlcyB3aXRoIGB1bmRlZmluZWRgLlxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRTZXR0aW5nc1Jlc3VsdCB7XG4gIGFjdGlvbjogJ3NhdmVkJyB8ICdkZWxldGVkJztcbn1cblxuXG4vLyBBIE5hbWUgb3IgTGFiZWwgdGhlIHNlcnZlciByZWZ1c2VkIGZvciBhIGZpbHRlciBncm91cCwgd2l0aCB0aGUgbWVzc2FnZSBpdFxuLy8gZ2F2ZS5cbmludGVyZmFjZSBGaWx0ZXJGaWVsZFJlZnVzYWwge1xuICB2YWx1ZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8vIE9uZSByZXBvcnQgYmFyIGZpbHRlciBpbiB0aGUgRmlsdGVycyB0YWI6IGl0cyBncm91cCwgaXRzIGxhYmVsIGFuZCBuYW1lLFxuLy8gYW5kIGFuIGVkaXRhYmxlIGRyYWZ0IGRlZmF1bHQuIFRoZSBkcmFmdCBmaWVsZHMgdXNlZCBkZXBlbmQgb24gdGhlIHR5cGVcbi8vIChkYXRlUmFuZ2Ug4oaSIGEgRGVmYXVsdCBwZXJpb2QsIHdoaWNoIGlzIGEgcmVsYXRpdmUgcmFuZ2Ugb3IgRml4ZWQgZGF0ZXNcbi8vIHdpdGggc3RhcnQvZW5kIERhdGVzOyBzZWxlY3Qg4oaSIHZhbHVlcywga2VwdCBvciBsZWZ0IG91dDsga2V5d29yZCDihpIgdGV4dDtcbi8vIG51bWJlclJhbmdlIOKGkiBtaW4gYW5kIG1heCkuIGBmZXRjaGAgbG9hZHMgdGhlIHNlbGVjdCBvcHRpb25zIHRoZSBzYW1lIHdheVxuLy8gdGhlIHJlcG9ydCBiYXIgZG9lcy5cbmludGVyZmFjZSBGaWx0ZXJEZWZhdWx0Um93IHtcbiAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwO1xuICAvLyBUaGUgc2VjdGlvbiBoZWFkaW5nOiB0aGUgbGFiZWwsIHdpdGggdGhlIHBhZ2UgZm9yIGEgcGFnZSBmaWx0ZXIuXG4gIGhlYWRpbmc6IHN0cmluZztcbiAgLy8gVGhlIGdyb3VwJ3MgbGFiZWwgYW5kIG5hbWUgYXMgdHlwZWQsIGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIuIEVhY2ggaXNcbiAgLy8gc2F2ZWQgb25seSB3aGVuIGl0IGRpZmZlcnMgZnJvbSB0aGUgc3RvcmVkIG9uZTsgdGhlIG5hbWUgaXMgbmV2ZXJcbiAgLy8gZGVyaXZlZCBmcm9tIHRoZSBsYWJlbCBoZXJlLlxuICBsYWJlbDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8vIFRoZSBzZXJ2ZXIgc2VudCBhIG5hbWUsIHNvIGl0IGFsc28gdGFrZXMgYSBsYWJlbCBhbmQgYSBuYW1lIG9uIHRoZSBncm91cFxuICAvLyB1cGRhdGUgKGFuIG9sZGVyIHNlcnZlciBzZW5kcyBub25lLCBhbmQgdGhlIHR3byBmaWVsZHMgYXJlIGhpZGRlbikuXG4gIHNob3dOYW1lOiBib29sZWFuO1xuICAvLyBUaGUgbGFzdCBsYWJlbCBhbmQgbmFtZSB0aGUgc2VydmVyIHJlZnVzZWQsIGVhY2ggc2hvd24gb24gaXRzIGZpZWxkXG4gIC8vIHdoaWxlIHRoZSBmaWVsZCBzdGlsbCBob2xkcyBpdC5cbiAgbGFiZWxSZWZ1c2FsOiBGaWx0ZXJGaWVsZFJlZnVzYWwgfCBudWxsO1xuICBuYW1lUmVmdXNhbDogRmlsdGVyRmllbGRSZWZ1c2FsIHwgbnVsbDtcbiAgLy8gQSByZWxhdGl2ZSByYW5nZSBuYW1lLCBvciBGSVhFRF9EQVRFU19QRVJJT0QgZm9yIHN0YXJ0IGFuZCBlbmQuXG4gIHBlcmlvZDogc3RyaW5nO1xuICBwZXJpb2RPcHRpb25zOiBGaWx0ZXJTZXR0aW5nc09wdGlvbltdO1xuICBzdGFydDogRGF0ZSB8IG51bGw7XG4gIGVuZDogRGF0ZSB8IG51bGw7XG4gIHZhbHVlczogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXTtcbiAgLy8gVGhlIHZhbHVlcyBhcmUgbGVmdCBvdXQgcmF0aGVyIHRoYW4ga2VwdC5cbiAgZXhjbHVkZTogYm9vbGVhbjtcbiAgc2hvd0V4Y2x1ZGU6IGJvb2xlYW47XG4gIHZhbHVlOiBzdHJpbmc7XG4gIC8vIFRoZSByYW5nZSBlbmRzIGFzIHR5cGVkOiBmc01hc2tOdW1iZXIgaGFuZHMgYmFjayB0ZXh0LiBSZWFkIHRocm91Z2hcbiAgLy8gcGFyc2VEZWZhdWx0Qm91bmQuXG4gIG1pbjogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgbWF4OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBmZXRjaDogKGtleXdvcmQ/OiBzdHJpbmcpID0+IE9ic2VydmFibGU8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXT47XG59XG5cbi8vIE9uZSBmaWx0ZXIncyBncm91cCB1cGRhdGUgaW4gYSBzYXZlOiBvbmx5IHRoZSBrZXlzIHRoZSBvcGVyYXRvciBjaGFuZ2VkLlxuaW50ZXJmYWNlIEZpbHRlckdyb3VwU2F2ZSB7XG4gIHJvdzogRmlsdGVyRGVmYXVsdFJvdztcbiAgY2hhbmdlczogUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzO1xufVxuXG4vLyBPbmUgZW50cnkgb2YgdGhlIExvY2FsZSBvciBDdXJyZW5jeSBzZWxlY3QuICcnIGlzIHRoZSBleHBsaWNpdCBEZWZhdWx0LlxuaW50ZXJmYWNlIExvY2FsZVNlbGVjdE9wdGlvbiB7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG59XG5cbi8vIFRoZSBkYXkgdGhlIExvY2FsZSBoaW50IHdyaXRlcywgYSBmaXhlZCBjYWxlbmRhciBkYXkgc28gdGhlIGV4YW1wbGUgbmV2ZXJcbi8vIGNoYW5nZXMgdW5kZXIgdGhlIG9wZXJhdG9yLlxuY29uc3QgRVhBTVBMRV9EQVkgPSBuZXcgRGF0ZSgyMDI2LCAwLCA1KTtcbmNvbnN0IEVYQU1QTEVfQU1PVU5UID0gMTIzNC41O1xuXG4vLyAnQ2FuYWRpYW4gRnJlbmNoIChmci1DQSknLCAnQ2FuYWRpYW4gRG9sbGFyIChDQUQpJzogRW5nbGlzaCBuYW1lcyB3aGF0ZXZlclxuLy8gdGhlIHJlcG9ydCdzIGxvY2FsZSwgd2l0aCB0aGUgY29kZSB0aGF0IGlzIHN0b3JlZC5cbmZ1bmN0aW9uIGxvY2FsZUxhYmVsKHRhZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2xvY2FsZU5hbWUodGFnKX0gKCR7dGFnfSlgO1xufVxuXG5mdW5jdGlvbiBjdXJyZW5jeUxhYmVsKGNvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtjdXJyZW5jeU5hbWUoY29kZSl9ICgke2NvZGV9KWA7XG59XG5cblxuLy8gUmVwb3J0IHNldHRpbmdzLCBpbiB0aHJlZSB0YWJzOlxuLy8gICBTZXR0aW5ncyDigJQgbmFtZSArIHBhZ2Ugc2V0dXAgKHNpemUgaW4gaW5jaGVzLCBoZWFkZXIvZm9vdGVyIGJhbmQgZGVwdGhzKS5cbi8vICAgU3R5bGVzICAg4oCUIHRoZSByZXBvcnQncyB0eXBvZ3JhcGhpYyBzdHlsZXMgKHNpemVzIGluIFBPSU5UUywgMToxIHdpdGhcbi8vICAgUERGL1Bvd2VyUG9pbnQpOyB0aGUgSGVhZGluZyBzaXplIHRvIHN0YXJ0LlxuLy8gICBGaWx0ZXJzICDigJQgdGhlIHJlcG9ydCBiYXIgZmlsdGVycyAoZXZlcnkgcGFnZSBvciBvbmUgcGFnZSkgYW5kIHRoZWlyXG4vLyAgIERFRkFVTFQgdmFsdWVzLiBBIGRlZmF1bHQgc2VlZHMgdGhlIHJlcG9ydCBiYXIgb24gZXZlcnkgb3BlbiAoZm9yIGV2ZXJ5XG4vLyAgIHZpZXdlcikgYnV0IHN0YXlzIHVzZXItY2hhbmdlYWJsZSDigJQgaXQgcHJlLWZpbGxzIHRoZSBjb250cm9sLCBpdCBkb2Vzbid0XG4vLyAgIGxvY2sgaXQuIFRoaXMgaXMgdGhlIGZpeCBmb3IgaGVhdnkgcmVwb3J0cyBvcGVuaW5nIGJsYW5rIGFuZCB0aW1pbmcgb3V0OiBhXG4vLyAgIGRlZmF1bHQgbW9udGggKyBvcmdhbml6YXRpb24gc2NvcGVzIHRoZSBsYW5kaW5nIHBhZ2UgZnJvbSB0aGUgZmlyc3QgbG9hZC5cbi8vICAgVGhlIHJ1bGVzIG9mIHRoZSByb3dzIGxpdmUgaW4gZmlsdGVyLXNldHRpbmdzLXJ1bGVzLnRzLlxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9yZXBvcnQtc2V0dGluZ3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZXBvcnQtc2V0dGluZ3MuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBGc0Zvcm1Nb2R1bGUsXG4gICAgRnNMYWJlbE1vZHVsZSxcbiAgICBGc01hc2tNb2R1bGUsXG4gICAgRnNEaWFsb2dNb2R1bGUsXG4gICAgRnNNZXNzYWdlTW9kdWxlLFxuICAgIEZzVGFic01vZHVsZSxcbiAgICBGc1NrZWxldG9uTW9kdWxlLFxuICAgIEZzRGF0ZVBpY2tlck1vZHVsZSxcbiAgICBGc0F1dG9jb21wbGV0ZUNoaXBzTW9kdWxlLFxuICAgIE1hdFRhYnNNb2R1bGUsXG4gICAgTWF0QnV0dG9uLFxuICAgIE1hdERpYWxvZ1RpdGxlLFxuICAgIE1hdERpYWxvZ0NvbnRlbnQsXG4gICAgTWF0RGlhbG9nQWN0aW9ucyxcbiAgICBNYXRGb3JtRmllbGQsXG4gICAgTWF0TGFiZWwsXG4gICAgTWF0SGludCxcbiAgICBNYXRTdWZmaXgsXG4gICAgTWF0SW5wdXQsXG4gICAgTWF0U2VsZWN0LFxuICAgIE1hdE9wdGlvbixcbiAgICBNYXRTbGlkZVRvZ2dsZSxcbiAgICBUaW1lem9uZVNlbGVjdENvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgUmVwb3J0U2V0dGluZ3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIC8vIEEgc2lnbmFsLCBzbyBhIHJlZnVzZWQgTGFiZWwgb3IgTmFtZSBjYW4gYnJpbmcgdGhlIEZpbHRlcnMgdGFiIGZvcndhcmQuXG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3RlZFRhYiA9IHNpZ25hbCgnc2V0dGluZ3MnKTtcbiAgLy8gVHJ1ZSBvbmNlIGFueSBzYXZlIHJlcXVlc3QgaGFzIGJlZW4gc3RvcmVkLCBldmVuIHdoZW4gdGhlIHNhdmUgYXMgYVxuICAvLyB3aG9sZSB0aGVuIGZhaWxlZDogdGhlIHBhZ2UgcmVsb2FkcyBhZnRlciBhIGRpc21pc3NlZCBkaWFsb2cgdG9vLlxuICBwdWJsaWMgcmVhZG9ubHkgd3JvdGUgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHB1YmxpYyBuYW1lID0gJyc7XG4gIC8vIFRoZSBwYWdlIGluIGluY2hlcy4gTm8gaW5pdGlhbGl6ZXI6IGV2ZXJ5IHJlcG9ydCBjYXJyaWVzIGEgc2l6ZSwgYW5kXG4gIC8vIG5nT25Jbml0IHNlZWRzIGJvdGggYmVmb3JlIHRoZSB0YWIgcmVuZGVycywgc28gYSBwbGFjZWhvbGRlciBoZXJlIGNvdWxkIG9ubHlcbiAgLy8gZXZlciBiZSBhIHdyb25nIG51bWJlciBicmllZmx5IHNob3dpbmcgYXMgdGhlIG9wZXJhdG9yJ3Mgb3duLlxuICAvL1xuICAvLyBUeXBlZCBgbnVtYmVyIHwgc3RyaW5nYCBiZWNhdXNlIGZzTWFza051bWJlciBpcyB0aGUgY29udHJvbDogaXQgaXMgc2VlZGVkXG4gIC8vIHdpdGggdGhlIHJlcG9ydCdzIG51bWJlciBidXQgaGFuZHMgYmFjayB0aGUgdW5tYXNrZWQgU1RSSU5HIHRoZSBvcGVyYXRvclxuICAvLyB0eXBlZC4gU2F2ZSBjYXN0cyBpdCBvbmNlLCBvbiB0aGUgd2F5IG91dCDigJQgc2VlIGBfcGFnZURpbWVuc2lvbigpYC5cbiAgcHVibGljIHBhZ2VXaWR0aDogbnVtYmVyIHwgc3RyaW5nO1xuICBwdWJsaWMgcGFnZUhlaWdodDogbnVtYmVyIHwgc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZURpbWVuc2lvbk1pbiA9IFBBR0VfRElNRU5TSU9OX01JTjtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VEaW1lbnNpb25NYXggPSBQQUdFX0RJTUVOU0lPTl9NQVg7XG4gIC8vIFRoZSBoZWFkZXIgYW5kIGZvb3RlciBiYW5kIGRlcHRocywgaW5jaGVzIOKAlCB0eXBlZCBsaWtlIHRoZSBwYWdlIHNpemVcbiAgLy8gYmVjYXVzZSBmc01hc2tOdW1iZXIgaGFuZHMgYmFjayBhIHN0cmluZy5cbiAgcHVibGljIGhlYWRlckhlaWdodDogbnVtYmVyIHwgc3RyaW5nID0gMDtcbiAgcHVibGljIGZvb3RlckhlaWdodDogbnVtYmVyIHwgc3RyaW5nID0gMDtcbiAgcHVibGljIHJlYWRvbmx5IGhlYWRlckZvb3Rlck1heCA9IEhFQURFUl9GT09URVJfTUFYO1xuICAvLyBTZWVkZWQgd2l0aCB0aGUgem9uZSB0aGUgcmVwb3J0IGFjdHVhbGx5IHVzZXM6IGl0cyBvd24gc3RvcmVkIHpvbmUsIGVsc2VcbiAgLy8gdGhlIGFwcGxpY2F0aW9uIGRlZmF1bHQgdGhlIHNlcnZlciByZXNvbHZlZCAoZWZmZWN0aXZlVGltZXpvbmUpLiBTYXZlIHNlbmRzXG4gIC8vIGl0IG9ubHkgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhhdCBlZmZlY3RpdmUgem9uZSwgc28gb3BlbmluZyBhbmQgc2F2aW5nIGFcbiAgLy8gcmVwb3J0IHRoYXQgZm9sbG93cyB0aGUgZGVmYXVsdCBuZXZlciBwaW5zIGl0IHRvIGEgem9uZS5cbiAgcHVibGljIHRpbWV6b25lID0gJyc7XG4gIHB1YmxpYyBoZWFkaW5nU2l6ZSA9IERFRkFVTFRfSEVBRElOR19TSVpFO1xuXG4gIC8vIFRoZSBsb2NhbGVzIGFuZCBjdXJyZW5jaWVzIHRoZSBzZXJ2ZXIgb2ZmZXJzLiBudWxsIHVudGlsIGxvYWRlZCwgYW5kXG4gIC8vIG5ldmVyIGxvYWRlZCBmcm9tIGEgc2VydmVyIHRvbyBvbGQgdG8gc2VuZCBlZmZlY3RpdmVMb2NhbGU6IHRoZXJlIHRoZVxuICAvLyBzZWxlY3RzIHN0YXkgaGlkZGVuIGFuZCB0aGUgcmVwb3J0IHJlYWRzIGVuLVVTL1VTRC5cbiAgcHVibGljIHJlYWRvbmx5IGxvY2FsZXMgPSBzaWduYWw8UmVwb3J0TG9jYWxlcyB8IG51bGw+KG51bGwpO1xuICAvLyBUaGUgcmVwb3J0J3Mgb3duIGxvY2FsZSBhbmQgY3VycmVuY3ksICcnIHdoZW4gaXQgZm9sbG93cyB0aGUgZGVmYXVsdC4gU2F2ZVxuICAvLyBzZW5kcyBlYWNoIG9ubHkgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIHN0b3JlZCB2YWx1ZS5cbiAgcHVibGljIHJlYWRvbmx5IGxvY2FsZSA9IHNpZ25hbCgnJyk7XG4gIHB1YmxpYyByZWFkb25seSBjdXJyZW5jeSA9IHNpZ25hbCgnJyk7XG4gIC8vIFRoZSB3aG9sZSBmb3JtIHdhaXRzIGJlaGluZCBvbmUgc2tlbGV0b24gdW50aWwgdGhlIGZpbHRlciByb3dzIGFyZSBidWlsdFxuICAvLyBhbmQgdGhlIGxvY2FsZSByZXF1ZXN0IGhhcyBzZXR0bGVkLCBzbyB0aGUgU2V0dGluZ3MgdGFiIG5ldmVyIHNob3dzXG4gIC8vIHdpdGhvdXQgaXRzIExvY2FsZSBhbmQgQ3VycmVuY3kgc2VsZWN0cy4gQSBmYWlsZWQgbG9jYWxlIHJlcXVlc3Qgc2V0dGxlc1xuICAvLyB0b286IHRoZSB0d28gc2VsZWN0cyBzdGF5IGhpZGRlbiAobG9jYWxlcygpIGlzIHN0aWxsIG51bGwpIGFuZCBldmVyeSBvdGhlclxuICAvLyBzZXR0aW5nIHN0YXlzIGVkaXRhYmxlLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVhZHkgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9maWx0ZXJzUmVhZHkoKSAmJiAoIXRoaXMuX3NlcnZlckhhc0xvY2FsZSB8fCB0aGlzLl9sb2NhbGVzU2V0dGxlZCgpKSk7XG5cbiAgLy8gQW4gZXhwbGljaXQgRGVmYXVsdCAoJycpIG5hbWluZyB0aGUgbG9jYWxlIGl0IHN0YW5kcyBmb3IsIHRoZW4gZWFjaCBvZmZlcmVkXG4gIC8vIGxvY2FsZS4gQSBzdG9yZWQgbG9jYWxlIHRoZSBzZXJ2ZXIgbm8gbG9uZ2VyIG9mZmVycyBpcyBsaXN0ZWQgZmlyc3QsIHNvXG4gIC8vIHRoZSBzZWxlY3Qgc3RpbGwgc2hvd3Mgd2hhdCB0aGUgcmVwb3J0IGhvbGRzLlxuICBwdWJsaWMgcmVhZG9ubHkgbG9jYWxlT3B0aW9ucyA9IGNvbXB1dGVkPExvY2FsZVNlbGVjdE9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlcyA9IHRoaXMubG9jYWxlcygpO1xuICAgIGlmICghbG9jYWxlcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IG9mZmVyZWQgPSBsb2NhbGVzLm9wdGlvbnMubWFwKChvcHRpb24pID0+IG9wdGlvbi5sb2NhbGUpO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLnRoaXMuX3N0b3JlZE9wdGlvbih0aGlzLl9kYXRhLnJlcG9ydC5sb2NhbGUsIG9mZmVyZWQsIGxvY2FsZUxhYmVsKSxcbiAgICAgIHsgdmFsdWU6ICcnLCBsYWJlbDogYERlZmF1bHQg4oCUICR7bG9jYWxlTmFtZShsb2NhbGVzLmRlZmF1bHRMb2NhbGUpfWAgfSxcbiAgICAgIC4uLm9mZmVyZWQubWFwKCh0YWcpID0+ICh7IHZhbHVlOiB0YWcsIGxhYmVsOiBsb2NhbGVMYWJlbCh0YWcpIH0pKSxcbiAgICBdO1xuICB9KTtcblxuICAvLyBBbiBleHBsaWNpdCBEZWZhdWx0ICgnJykgbmFtaW5nIHRoZSBjdXJyZW5jeSB0aGUgc2VsZWN0ZWQgbG9jYWxlIHVzZXMgd2hlblxuICAvLyB0aGUgcmVwb3J0IG5hbWVzIG5vbmUsIHRoZW4gZXZlcnkgY3VycmVuY3kuIEEgc3RvcmVkIGNvZGUgdGhlIHNlcnZlciBub1xuICAvLyBsb25nZXIgb2ZmZXJzIGlzIGxpc3RlZCBmaXJzdC5cbiAgcHVibGljIHJlYWRvbmx5IGN1cnJlbmN5T3B0aW9ucyA9IGNvbXB1dGVkPExvY2FsZVNlbGVjdE9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlcyA9IHRoaXMubG9jYWxlcygpO1xuICAgIGlmICghbG9jYWxlcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiBbXG4gICAgICAuLi50aGlzLl9zdG9yZWRPcHRpb24odGhpcy5fZGF0YS5yZXBvcnQuY3VycmVuY3ksIGxvY2FsZXMuY3VycmVuY2llcywgY3VycmVuY3lMYWJlbCksXG4gICAgICB7IHZhbHVlOiAnJywgbGFiZWw6IGBEZWZhdWx0IOKAlCAke2N1cnJlbmN5TGFiZWwodGhpcy5fZGVmYXVsdEN1cnJlbmN5KCkpfWAgfSxcbiAgICAgIC4uLmxvY2FsZXMuY3VycmVuY2llcy5tYXAoKGNvZGUpID0+ICh7IHZhbHVlOiBjb2RlLCBsYWJlbDogY3VycmVuY3lMYWJlbChjb2RlKSB9KSksXG4gICAgXTtcbiAgfSk7XG5cbiAgLy8gSG93IHRoZSByZXBvcnQgd2lsbCB3cml0ZSBhbiBhbW91bnQgYW5kIGEgZGF5IG9uY2Ugc2F2ZWQ6IHRoZSBzZWxlY3RlZFxuICAvLyBsb2NhbGUgYW5kIGN1cnJlbmN5LCBvciB0aGUgZGVmYXVsdHMgdGhleSBmYWxsIGJhY2sgdG8sIGUuZy5cbiAgLy8gJzEgMjM0LDUwICQgwrcgNSBqYW52LiAyMDI2JyBpbiBmci1DQS5cbiAgcHVibGljIHJlYWRvbmx5IGZvcm1hdEV4YW1wbGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlID0gcmVzb2x2ZVJlcG9ydExvY2FsZSh0aGlzLl9hcHBsaWVkTG9jYWxlKCkpO1xuICAgIGNvbnN0IGN1cnJlbmN5ID0gcmVzb2x2ZVJlcG9ydEN1cnJlbmN5KHRoaXMuX2FwcGxpZWRDdXJyZW5jeSgpKTtcblxuICAgIHJldHVybiBbXG4gICAgICBmb3JtYXROdW1iZXIoXG4gICAgICAgIEVYQU1QTEVfQU1PVU5ULFxuICAgICAgICB7IGZvcm1hdDogUmVwb3J0VmFsdWVGb3JtYXQuQ3VycmVuY3ksIHByZWNpc2lvbjogMiB9LFxuICAgICAgICB7IGxvY2FsZSwgY3VycmVuY3ksIHJhdGlvUGVyY2VudDogdHJ1ZSB9LFxuICAgICAgKSxcbiAgICAgIGZvcm1hdExvY2FsRGF0ZShFWEFNUExFX0RBWSwgbG9jYWxlLCBEQVlfU0hPUlQpLFxuICAgIF0uam9pbignIMK3ICcpO1xuICB9KTtcblxuICAvLyBUaGUgcmVwb3J0IGJhciBmaWx0ZXJzIGFuZCB0aGVpciBlZGl0YWJsZSBkZWZhdWx0IHZhbHVlcyAoRmlsdGVycyB0YWIpLlxuICBwdWJsaWMgcmVhZG9ubHkgZmlsdGVyUm93cyA9IHNpZ25hbDxGaWx0ZXJEZWZhdWx0Um93W10+KFtdKTtcbiAgcHVibGljIHJlYWRvbmx5IGZpeGVkRGF0ZXNQZXJpb2QgPSBGSVhFRF9EQVRFU19QRVJJT0Q7XG4gIHB1YmxpYyByZWFkb25seSBib3VuZFNjYWxlID0gREVGQVVMVF9CT1VORF9TQ0FMRTtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVQYXR0ZXJuID0gRklMVEVSX05BTUVfUEFUVEVSTjtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVQYXR0ZXJuTWVzc2FnZSA9IEZJTFRFUl9OQU1FX1BBVFRFUk5fTUVTU0FHRTtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVNYXhMZW5ndGggPSBGSUxURVJfTkFNRV9NQVhfTEVOR1RIO1xuICBwdWJsaWMgcmVhZG9ubHkgbGFiZWxNYXhMZW5ndGggPSBGSUxURVJfTEFCRUxfTUFYX0xFTkdUSDtcbiAgcHVibGljIHJlYWRvbmx5IGxhYmVsSW5wdXRJZCA9IGxhYmVsSW5wdXRJZDtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVJbnB1dElkID0gbmFtZUlucHV0SWQ7XG5cbiAgLy8gVGhlIERlZmF1bHQgbWluaW11bSBhbmQgRGVmYXVsdCBtYXhpbXVtIGNoZWNrcywgdGhyb3VnaCBmc0Zvcm0uIEVhY2ggZmllbGRcbiAgLy8gZ2V0cyB0aGUgb3RoZXIgZW5kIGFzIGl0cyB2YWxpZGF0ZURhdGEsIHNvIHR5cGluZyBpbiBvbmUgY2hlY2tzIHRoZSBwYWlyXG4gIC8vIGFnYWluOyBib3VuZHNFcnJvciB3b3JkcyB0aGUgcmVmdXNhbCBhcyB0aGUgc2VydmVyIGRvZXMuXG4gIHB1YmxpYyByZWFkb25seSBtaW5Cb3VuZFZhbGlkYXRvciA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIG1heDogdW5rbm93bik6IHZvaWQgPT4ge1xuICAgIHRoaXMuX3Rocm93Qm91bmRzRXJyb3IoY29udHJvbC52YWx1ZSwgbWF4KTtcbiAgfTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbWF4Qm91bmRWYWxpZGF0b3IgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBtaW46IHVua25vd24pOiB2b2lkID0+IHtcbiAgICB0aGlzLl90aHJvd0JvdW5kc0Vycm9yKG1pbiwgY29udHJvbC52YWx1ZSk7XG4gIH07XG5cbiAgLy8gVGhlIHNlcnZlcidzIHJlZnVzYWwgb2YgYSBMYWJlbCBvciBOYW1lLCB0aHJvdWdoIGZzRm9ybS4gVGhlIHNoYXBlIGFuZFxuICAvLyBsZW5ndGggYXJlIGNoZWNrZWQgb24gdGhlIGZpZWxkIChmc0Zvcm1QYXR0ZXJuLCBmc0Zvcm1NYXhMZW5ndGgpLCBidXQgb25seVxuICAvLyB0aGUgc2VydmVyIGtub3dzIHRoZSByZXBvcnQncyBvdGhlciBuYW1lcywgc28gdGhlIGZpZWxkIHNob3dzIHRoZVxuICAvLyBzZXJ2ZXIncyBvd24gd29yZHMgd2hpbGUgaXQgc3RpbGwgaG9sZHMgdGhlIHJlZnVzZWQgdmFsdWUuIEEgbmV3IHJlZnVzYWxcbiAgLy8gYXJyaXZlcyBhcyB0aGUgZmllbGQncyB2YWxpZGF0ZURhdGEsIHdoaWNoIGNoZWNrcyB0aGUgZmllbGQgYWdhaW4uXG4gIHB1YmxpYyByZWFkb25seSByZWZ1c2FsVmFsaWRhdG9yID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgcmVmdXNhbDogRmlsdGVyRmllbGRSZWZ1c2FsIHwgbnVsbCk6IHZvaWQgPT4ge1xuICAgIGlmIChyZWZ1c2FsICYmIFN0cmluZyhjb250cm9sLnZhbHVlID8/ICcnKS50cmltKCkgPT09IHJlZnVzYWwudmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihyZWZ1c2FsLm1lc3NhZ2UpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kYXRhOiB7IHJlcG9ydDogUmVwb3J0IH0gPSBpbmplY3QoTUFUX0RJQUxPR19EQVRBKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGlhbG9nUmVmID0gaW5qZWN0PE1hdERpYWxvZ1JlZjxSZXBvcnRTZXR0aW5nc0NvbXBvbmVudCwgUmVwb3J0U2V0dGluZ3NSZXN1bHQ+PihNYXREaWFsb2dSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Byb21wdCA9IGluamVjdChGc1Byb21wdCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuICAvLyBUaGUgaWQgb2YgdGhlIExhYmVsIG9yIE5hbWUgaW5wdXQgdGhlIHNlcnZlciBsYXN0IHJlZnVzZWQsIGZvY3VzZWQgb25jZVxuICAvLyBpdCBpcyBvbiBzY3JlZW4gKHNlZSBmb2N1c1JlZnVzYWwpLlxuICBwcml2YXRlIF9yZWZ1c2VkSW5wdXRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8vIE9ubHkgYSBzZXJ2ZXIgdGhhdCByZXNvbHZlcyBhIHJlcG9ydCdzIGxvY2FsZSBvZmZlcnMgdGhlIGxvY2FsZSBsaXN0LlxuICBwcml2YXRlIHJlYWRvbmx5IF9zZXJ2ZXJIYXNMb2NhbGUgPSB0aGlzLl9kYXRhLnJlcG9ydC5lZmZlY3RpdmVMb2NhbGUgIT09IHVuZGVmaW5lZDtcbiAgLy8gVHJ1ZSBvbmNlIHRoZSBsb2NhbGUgcmVxdWVzdCBoYXMgYW5zd2VyZWQsIHdpdGggdGhlIGxpc3Qgb3IgYW4gZXJyb3IuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2xvY2FsZXNTZXR0bGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgLy8gVHJ1ZSBvbmNlIHRoZSBmaWx0ZXIgcm93cyBhcmUgcHVibGlzaGVkIChzZWUgX2J1aWxkRmlsdGVyUm93cykuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZpbHRlcnNSZWFkeSA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gVGhlIGxvY2FsZSB0aGUgcmVwb3J0IHdvdWxkIGJlIHdyaXR0ZW4gaW46IHRoZSBzZWxlY3RlZCBvbmUgd2hlbiB0aGVcbiAgLy8gc2VydmVyIG9mZmVycyBpdCwgZWxzZSB0aGUgZGVmYXVsdCAoYSBzdG9yZWQgbG9jYWxlIGl0IG5vIGxvbmdlciBvZmZlcnNcbiAgLy8gZmFsbHMgYmFjayB0byB0aGUgZGVmYXVsdCwgYXMgaXQgZG9lcyBvbiB0aGUgc2VydmVyKS5cbiAgcHJpdmF0ZSByZWFkb25seSBfYXBwbGllZExvY2FsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBsb2NhbGVzID0gdGhpcy5sb2NhbGVzKCk7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5sb2NhbGUoKTtcblxuICAgIHJldHVybiBsb2NhbGVzPy5vcHRpb25zLnNvbWUoKG9wdGlvbikgPT4gb3B0aW9uLmxvY2FsZSA9PT0gbG9jYWxlKVxuICAgICAgPyBsb2NhbGVcbiAgICAgIDogbG9jYWxlcz8uZGVmYXVsdExvY2FsZSA/PyAnJztcbiAgfSk7XG5cbiAgLy8gVGhlIGN1cnJlbmN5IGEgcmVwb3J0IGluIHRoZSBhcHBsaWVkIGxvY2FsZSB1c2VzIHdoZW4gaXQgbmFtZXMgbm9uZS5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdEN1cnJlbmN5ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMuX2FwcGxpZWRMb2NhbGUoKTtcblxuICAgIHJldHVybiB0aGlzLmxvY2FsZXMoKT8ub3B0aW9ucy5maW5kKChvcHRpb24pID0+IG9wdGlvbi5sb2NhbGUgPT09IGxvY2FsZSk/LmRlZmF1bHRDdXJyZW5jeVxuICAgICAgPz8gUkVQT1JUX0ZBTExCQUNLX0NVUlJFTkNZO1xuICB9KTtcblxuICAvLyBUaGUgY3VycmVuY3kgdGhlIHJlcG9ydCB3b3VsZCBsYWJlbCBtb25leSBpbjogdGhlIHNlbGVjdGVkIG9uZSB3aGVuIHRoZVxuICAvLyBzZXJ2ZXIgb2ZmZXJzIGl0LCBlbHNlIHRoZSBkZWZhdWx0LlxuICBwcml2YXRlIHJlYWRvbmx5IF9hcHBsaWVkQ3VycmVuY3kgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY3VycmVuY3kgPSB0aGlzLmN1cnJlbmN5KCk7XG5cbiAgICByZXR1cm4gdGhpcy5sb2NhbGVzKCk/LmN1cnJlbmNpZXMuaW5jbHVkZXMoY3VycmVuY3kpXG4gICAgICA/IGN1cnJlbmN5XG4gICAgICA6IHRoaXMuX2RlZmF1bHRDdXJyZW5jeSgpO1xuICB9KTtcblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5fZGF0YS5yZXBvcnQ7XG4gICAgdGhpcy5uYW1lID0gcmVwb3J0Lm5hbWU7XG4gICAgdGhpcy5wYWdlV2lkdGggPSByZXBvcnQucGFnZVdpZHRoO1xuICAgIHRoaXMucGFnZUhlaWdodCA9IHJlcG9ydC5wYWdlSGVpZ2h0O1xuICAgIHRoaXMuaGVhZGVySGVpZ2h0ID0gcmVwb3J0LmNvbmZpZz8uaGVhZGVyRm9vdGVyPy5oZWFkZXJIZWlnaHQgPz8gMDtcbiAgICB0aGlzLmZvb3RlckhlaWdodCA9IHJlcG9ydC5jb25maWc/LmhlYWRlckZvb3Rlcj8uZm9vdGVySGVpZ2h0ID8/IDA7XG4gICAgdGhpcy50aW1lem9uZSA9IHJlcG9ydC50aW1lem9uZSA/PyByZXBvcnQuZWZmZWN0aXZlVGltZXpvbmUgPz8gJyc7XG4gICAgdGhpcy5oZWFkaW5nU2l6ZSA9IHJlcG9ydC5jb25maWc/LnN0eWxlcz8uaGVhZGluZz8uc2l6ZSA/PyBERUZBVUxUX0hFQURJTkdfU0laRTtcbiAgICB0aGlzLmxvY2FsZS5zZXQocmVwb3J0LmxvY2FsZSA/PyAnJyk7XG4gICAgdGhpcy5jdXJyZW5jeS5zZXQocmVwb3J0LmN1cnJlbmN5ID8/ICcnKTtcblxuICAgIHRoaXMuX2J1aWxkRmlsdGVyUm93cyhyZXBvcnQpO1xuXG4gICAgaWYgKHRoaXMuX3NlcnZlckhhc0xvY2FsZSkge1xuICAgICAgdGhpcy5fcmVwb3J0RGF0YS5sb2NhbGVzKClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKChsb2NhbGVzKSA9PiB0aGlzLmxvY2FsZXMuc2V0KGxvY2FsZXMpKSxcbiAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSxcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLl9sb2NhbGVzU2V0dGxlZC5zZXQodHJ1ZSkpLFxuICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQSBjaGFuZ2UgdG8gYSByb3cncyBMYWJlbCwgTmFtZSwgRGVmYXVsdCBwZXJpb2QsIGV4Y2x1ZGUgdG9nZ2xlIG9yIHJhbmdlIGVuZHMuIEEgbmV3XG4gIC8vIHJvdyBvYmplY3QgcmF0aGVyIHRoYW4gYSBtdXRhdGlvbiwgc28gdGhlIHNpZ25hbCBzZWVzIHRoZSBjaGFuZ2U7IHRoZVxuICAvLyBAZm9yIHRyYWNrcyBncm91cC5pZCwgc28gdGhlIHJvdydzIGNvbnRyb2xzIHN1cnZpdmUgdGhlIHN3YXAuXG4gIHB1YmxpYyBwYXRjaFJvdyhyb3c6IEZpbHRlckRlZmF1bHRSb3csIHBhdGNoOiBQYXJ0aWFsPEZpbHRlckRlZmF1bHRSb3c+KTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJSb3dzLnVwZGF0ZSgocm93cykgPT4gcm93c1xuICAgICAgLm1hcCgoaXRlbSkgPT4gKGl0ZW0uZ3JvdXAuaWQgPT09IHJvdy5ncm91cC5pZCA/IHsgLi4uaXRlbSwgLi4ucGF0Y2ggfSA6IGl0ZW0pKSk7XG4gIH1cblxuICAvLyBGb2N1c2VzIHRoZSBMYWJlbCBvciBOYW1lIGlucHV0IHRoZSBzZXJ2ZXIgcmVmdXNlZCwgb25jZSBpdCBpcyBvblxuICAvLyBzY3JlZW46IHN0cmFpZ2h0IGFmdGVyIHRoZSByZWZ1c2FsIHdoZW4gdGhlIEZpbHRlcnMgdGFiIGlzIHNob3dpbmcsIGVsc2VcbiAgLy8gd2hlbiB0aGUgdGFiIGdyb3VwIGhhcyBicm91Z2h0IGl0IGZvcndhcmQuXG4gIHB1YmxpYyBmb2N1c1JlZnVzYWwoKTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLl9yZWZ1c2VkSW5wdXRJZCA/IHRoaXMuX2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuX3JlZnVzZWRJbnB1dElkKSA6IG51bGw7XG5cbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICB0aGlzLl9yZWZ1c2VkSW5wdXRJZCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gQ29uZmlybSBhbmQgZGVsZXRlIGhlcmUsIHdoaWxlIHRoZSBkaWFsb2cgaXMgc3RpbGwgb3BlbiwgdGhlbiBjbG9zZSB3aXRoXG4gIC8vIGEgYGRlbGV0ZWRgIHJlc3VsdC4gVGhlIHBhZ2UgcmVhY3RzIHRvIHRoZSByZXN1bHQ7IGl0IG5vIGxvbmdlciBvd25zIHRoZVxuICAvLyBwcm9tcHQgb3IgdGhlIEFQSSBjYWxsLlxuICBwdWJsaWMgZGVsZXRlKCk6IHZvaWQge1xuICAgIHRoaXMuX3Byb21wdC5jb25maXJtKHtcbiAgICAgIHRpdGxlOiAnRGVsZXRlIFJlcG9ydCcsXG4gICAgICB0ZW1wbGF0ZTogYERlbGV0ZSBcIiR7dGhpcy5fZGF0YS5yZXBvcnQubmFtZX1cIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmAsXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5fcmVwb3J0RGF0YS5kZWxldGUodGhpcy5fZGF0YS5yZXBvcnQuaWQpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnUmVwb3J0IGRlbGV0ZWQnKTtcbiAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKHsgYWN0aW9uOiAnZGVsZXRlZCcgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlID0gKCkgPT4ge1xuICAgIGNvbnN0IHJlcG9ydElkID0gdGhpcy5fZGF0YS5yZXBvcnQuaWQ7XG5cbiAgICAvLyBPbmUgU2F2ZSBjb3ZlcnMgYWxsIHRocmVlIHRhYnMuIFRoZSByZXBvcnQgcmVsb2FkcyBvbiB0aGUgYHNhdmVkYFxuICAgIC8vIHJlc3VsdCwgcmUtc2VlZGluZyB0aGUgYmFyIGZyb20gdGhlIG5ldyBkZWZhdWx0cy5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHBhZ2VXaWR0aDogdGhpcy5fcGFnZURpbWVuc2lvbih0aGlzLnBhZ2VXaWR0aCksXG4gICAgICBwYWdlSGVpZ2h0OiB0aGlzLl9wYWdlRGltZW5zaW9uKHRoaXMucGFnZUhlaWdodCksXG4gICAgICAuLi50aGlzLl90aW1lem9uZVNldHRpbmcoKSxcbiAgICAgIC4uLnJlcG9ydExvY2FsZVBhdGNoKHRoaXMuX2RhdGEucmVwb3J0LCB0aGlzLmxvY2FsZSgpLCB0aGlzLmN1cnJlbmN5KCkpLFxuICAgICAgc3R5bGVzOiB7IGhlYWRpbmc6IHsgc2l6ZTogdGhpcy5oZWFkaW5nU2l6ZSB9IH0sXG4gICAgICBoZWFkZXJGb290ZXI6IHtcbiAgICAgICAgaGVhZGVySGVpZ2h0OiB0aGlzLl9wYWdlRGltZW5zaW9uKHRoaXMuaGVhZGVySGVpZ2h0KSB8fCAwLFxuICAgICAgICBmb290ZXJIZWlnaHQ6IHRoaXMuX3BhZ2VEaW1lbnNpb24odGhpcy5mb290ZXJIZWlnaHQpIHx8IDAsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBPbmUgZ3JvdXAgdXBkYXRlIHBlciBjaGFuZ2VkIGZpbHRlciwgY2Fycnlpbmcgb25seSB3aGF0IGNoYW5nZWQ6IGl0c1xuICAgIC8vIGxhYmVsLCBuYW1lIGFuZCBkZWZhdWx0IGFsbCBsaXZlIGluIHRoZSBncm91cCdzIGNvbmZpZywgc28gdHdvIHJlcXVlc3RzXG4gICAgLy8gZm9yIG9uZSBncm91cCB3b3VsZCBlYWNoIHdyaXRlIHRoZSBjb25maWcgb3ZlciB0aGUgb3RoZXIuXG4gICAgY29uc3Qgc2F2ZXMgPSB0aGlzLmZpbHRlclJvd3MoKVxuICAgICAgLm1hcCgocm93KSA9PiAoeyByb3csIGNoYW5nZXM6IHRoaXMuX2dyb3VwQ2hhbmdlcyhyb3cpIH0pKVxuICAgICAgLmZpbHRlcigoc2F2ZSkgPT4gT2JqZWN0LmtleXMoc2F2ZS5jaGFuZ2VzKS5sZW5ndGggPiAwKTtcblxuICAgIC8vIEEgbGFiZWwgb3IgbmFtZSBjYW4gYmUgcmVmdXNlZCwgc28gdGhvc2UgdXBkYXRlcyBnbyBmaXJzdCwgb25lIGFmdGVyXG4gICAgLy8gYW5vdGhlciwgYW5kIGEgcmVmdXNhbCBzdG9wcyB0aGUgc2F2ZSBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyB3cml0dGVuOlxuICAgIC8vIHRoZSByZXBvcnQgc2V0dGluZ3MgYW5kIHRoZSBvdGhlciBkZWZhdWx0cyB3YWl0IHVudGlsIGV2ZXJ5IG5hbWUgaXNcbiAgICAvLyB0YWtlbi4gSW4gc2VxdWVuY2UsIHR3byByZW5hbWVzIGluIG9uZSBzYXZlIGFyZSBjaGVja2VkIGFnYWluc3QgZWFjaFxuICAgIC8vIG90aGVyLCBhbmQgYSByZW5hbWUgb250byBhIG5hbWUgYW5vdGhlciBmaWx0ZXIgaXMgZ2l2aW5nIHVwIGdvZXMgYWZ0ZXJcbiAgICAvLyBpdC4gVGhlIHNlcnZlciBhcHBsaWVzIG5hbWUgYmVmb3JlIGRlZmF1bHQsIHNvIGEgcmVmdXNlZCBuYW1lIGxlYXZlc1xuICAgIC8vIHRoYXQgZmlsdGVyJ3MgZGVmYXVsdCB1bndyaXR0ZW4gdG9vLlxuICAgIGNvbnN0IG5hbWVkID0gdGhpcy5fcmVuYW1lT3JkZXIoc2F2ZXMuZmlsdGVyKChzYXZlKSA9PiB0aGlzLl9uYW1lc09yTGFiZWxzKHNhdmUuY2hhbmdlcykpKTtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHNhdmVzLmZpbHRlcigoc2F2ZSkgPT4gIXRoaXMuX25hbWVzT3JMYWJlbHMoc2F2ZS5jaGFuZ2VzKSk7XG5cbiAgICByZXR1cm4gZnJvbShuYW1lZClcbiAgICAgIC5waXBlKFxuICAgICAgICBjb25jYXRNYXAoKHNhdmUpID0+IHRoaXMuX3NhdmVOYW1lZChyZXBvcnRJZCwgc2F2ZSkpLFxuICAgICAgICB0b0FycmF5KCksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiBmb3JrSm9pbihbXG4gICAgICAgICAgdGhpcy5fcmVwb3J0RGF0YS51cGRhdGUocmVwb3J0SWQsIHNldHRpbmdzKSxcbiAgICAgICAgICAuLi5kZWZhdWx0cy5tYXAoKHNhdmUpID0+IHRoaXMuX3JlcG9ydERhdGEudXBkYXRlRmlsdGVyR3JvdXAocmVwb3J0SWQsIHNhdmUucm93Lmdyb3VwLmlkLCBzYXZlLmNoYW5nZXMpKSxcbiAgICAgICAgXS5tYXAoKHJlcXVlc3QkKSA9PiByZXF1ZXN0JC5waXBlKHRhcCgoKSA9PiB0aGlzLndyb3RlLnNldCh0cnVlKSkpKSkpLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnUmVwb3J0IHNldHRpbmdzIHNhdmVkJyk7XG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKHsgYWN0aW9uOiAnc2F2ZWQnIH0pO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH07XG5cbiAgLy8gVGhlIHBhZ2UgZGltZW5zaW9uIGFzIGEgcmVhbCBudW1iZXIgZm9yIHRoZSB3aXJlLiBmc01hc2tOdW1iZXIgaGFuZHMgYmFja1xuICAvLyB0aGUgdW5tYXNrZWQgc3RyaW5nIGl0IGJ1aWx0IHdpdGggYSBmaXhlZCAnLicgcmFkaXggKHdoaWNoIGlzIHRoZSB3aG9sZVxuICAvLyBwb2ludCBvZiB0aGUgbWFzayAtIGEgbmF0aXZlIG51bWJlciBpbnB1dCBwYWludHMgdGhlIHZpZXdlcidzIGxvY2FsZVxuICAvLyBzZXBhcmF0b3IgaW5zdGVhZCksIHNvIHRoZSBjYXN0IGhlcmUgaXMgYSBzdHJhaWdodCBwYXJzZSBhbmQgbmV2ZXIgc2VlcyBhXG4gIC8vIGNvbW1hLiBUaGUgYmFja2VuZCByZWplY3RzIGFueXRoaW5nIG5vbi1udW1lcmljIHJhdGhlciB0aGFuIGNvZXJjaW5nLCBzbyBhXG4gIC8vIE5hTiBmYWlscyBsb3VkbHkgaW5zdGVhZCBvZiBzaWxlbnRseSBzdG9yaW5nIGEgd3JvbmcgcGFnZSBzaXplLlxuICBwcml2YXRlIF9wYWdlRGltZW5zaW9uKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgfVxuXG4gIC8vIFRoZSB6b25lIGZvciB0aGUgc2V0dGluZ3MgUFVULCBzZW50IG9ubHkgd2hlbiBpdCBtb3ZlcyB0aGUgcmVwb3J0IG9mZiB0aGVcbiAgLy8gem9uZSBpdCBhbHJlYWR5IHVzZXMsIHNvIGFuIHVudG91Y2hlZCBkaWFsb2cgbmV2ZXIgcGlucyBhIHJlcG9ydCB0aGF0XG4gIC8vIGZvbGxvd3MgdGhlIGFwcGxpY2F0aW9uIGRlZmF1bHQuIEEgc2VydmVyIHRvbyBvbGQgdG8gc2VuZFxuICAvLyBlZmZlY3RpdmVUaW1lem9uZSBnZXRzIHRoZSB6b25lIGV2ZXJ5IHRpbWUsIGFzIGl0IGFsd2F5cyBkaWQuXG4gIHByaXZhdGUgX3RpbWV6b25lU2V0dGluZygpOiB7IHRpbWV6b25lPzogc3RyaW5nIH0ge1xuICAgIGNvbnN0IGVmZmVjdGl2ZVRpbWV6b25lID0gdGhpcy5fZGF0YS5yZXBvcnQuZWZmZWN0aXZlVGltZXpvbmU7XG5cbiAgICByZXR1cm4gZWZmZWN0aXZlVGltZXpvbmUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnRpbWV6b25lICE9PSBlZmZlY3RpdmVUaW1lem9uZVxuICAgICAgPyB7IHRpbWV6b25lOiB0aGlzLnRpbWV6b25lIH1cbiAgICAgIDoge307XG4gIH1cblxuICAvLyBUaGUgc3RvcmVkIHZhbHVlIGFzIGl0cyBvd24gb3B0aW9uIHdoZW4gdGhlIHNlcnZlciBubyBsb25nZXIgb2ZmZXJzIGl0LCBzb1xuICAvLyB0aGUgc2VsZWN0IG5hbWVzIGl0IGluc3RlYWQgb2Ygc2hvd2luZyBibGFuay4gTGVmdCBhcyBpdCBpcywgaXQgaXMgbmV2ZXJcbiAgLy8gc2VudCAoc2VlIHJlcG9ydExvY2FsZVBhdGNoKSwgYW5kIHRoZSByZXBvcnQgcmVhZHMgdGhlIGRlZmF1bHQgbWVhbndoaWxlLlxuICBwcml2YXRlIF9zdG9yZWRPcHRpb24oXG4gICAgc3RvcmVkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgIG9mZmVyZWQ6IHN0cmluZ1tdLFxuICAgIGxhYmVsOiAodmFsdWU6IHN0cmluZykgPT4gc3RyaW5nLFxuICApOiBMb2NhbGVTZWxlY3RPcHRpb25bXSB7XG4gICAgcmV0dXJuIHN0b3JlZCAmJiAhb2ZmZXJlZC5pbmNsdWRlcyhzdG9yZWQpID8gW3sgdmFsdWU6IHN0b3JlZCwgbGFiZWw6IGxhYmVsKHN0b3JlZCkgfV0gOiBbXTtcbiAgfVxuXG4gIC8vIFdoYXQgYSBzYXZlIGNoYW5nZXMgb24gYSByb3cncyBncm91cDogdGhlIGxhYmVsLCBuYW1lIGFuZCBkZWZhdWx0LCBlYWNoXG4gIC8vIG9ubHkgd2hlbiB0aGUgb3BlcmF0b3IgY2hhbmdlZCBpdC4gTGFiZWwgYW5kIG5hbWUgYXJlIHNlbnQgb25seSB0byBhXG4gIC8vIHNlcnZlciB0aGF0IHNlbnQgYSBuYW1lLCBhbmQgbmV2ZXIgb25lIGZyb20gdGhlIG90aGVyLlxuICBwcml2YXRlIF9ncm91cENoYW5nZXMocm93OiBGaWx0ZXJEZWZhdWx0Um93KTogUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzIHtcbiAgICBjb25zdCBjaGFuZ2VzOiBSZXBvcnRGaWx0ZXJHcm91cENoYW5nZXMgPSB7fTtcblxuICAgIGlmIChyb3cuc2hvd05hbWUpIHtcbiAgICAgIGNvbnN0IGxhYmVsID0gcm93LmxhYmVsLnRyaW0oKTtcbiAgICAgIGlmIChsYWJlbCAhPT0gKHJvdy5ncm91cC5sYWJlbCA/PyAnJykpIHtcbiAgICAgICAgY2hhbmdlcy5sYWJlbCA9IGxhYmVsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuYW1lID0gcm93Lm5hbWUudHJpbSgpO1xuICAgICAgaWYgKG5hbWUgIT09IHJvdy5ncm91cC5uYW1lKSB7XG4gICAgICAgIGNoYW5nZXMubmFtZSA9IG5hbWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgcm93RGVmYXVsdCA9IHRoaXMuX3Jvd0RlZmF1bHQocm93KTtcbiAgICBpZiAoZGVmYXVsdENoYW5nZWQocm93Lmdyb3VwLmNvbmZpZz8uZGVmYXVsdCwgcm93RGVmYXVsdCkpIHtcbiAgICAgIGNoYW5nZXMuZGVmYXVsdCA9IHJvd0RlZmF1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoYW5nZXM7XG4gIH1cblxuICBwcml2YXRlIF9uYW1lc09yTGFiZWxzKGNoYW5nZXM6IFJlcG9ydEZpbHRlckdyb3VwQ2hhbmdlcyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjaGFuZ2VzLm5hbWUgIT09IHVuZGVmaW5lZCB8fCBjaGFuZ2VzLmxhYmVsICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBUaGUgdXBkYXRlcyBpbiB0aGUgb3JkZXIgdGhleSBhcmUgc2VudDogYSByZW5hbWUgb250byBhIG5hbWUgYW5vdGhlclxuICAvLyBmaWx0ZXIgaG9sZHMgZ29lcyBhZnRlciB0aGUgb3RoZXJzLCBzbyBhIGZpbHRlciBnaXZpbmcgdGhhdCBuYW1lIHVwIGluXG4gIC8vIHRoZSBzYW1lIHNhdmUgaGFzIGRvbmUgc28gZmlyc3QuXG4gIHByaXZhdGUgX3JlbmFtZU9yZGVyKHNhdmVzOiBGaWx0ZXJHcm91cFNhdmVbXSk6IEZpbHRlckdyb3VwU2F2ZVtdIHtcbiAgICBjb25zdCBoZWxkID0gKHNhdmU6IEZpbHRlckdyb3VwU2F2ZSk6IGJvb2xlYW4gPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHNhdmUuY2hhbmdlcy5uYW1lPy50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICByZXR1cm4gbmFtZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZmlsdGVyUm93cygpXG4gICAgICAgIC5zb21lKChyb3cpID0+IHJvdy5ncm91cC5pZCAhPT0gc2F2ZS5yb3cuZ3JvdXAuaWQgJiYgcm93Lmdyb3VwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IG5hbWUpO1xuICAgIH07XG5cbiAgICByZXR1cm4gWy4uLnNhdmVzXS5zb3J0KChhLCBiKSA9PiBOdW1iZXIoaGVsZChhKSkgLSBOdW1iZXIoaGVsZChiKSkpO1xuICB9XG5cbiAgLy8gU2F2ZXMgYSBmaWx0ZXIncyB1cGRhdGUgdGhhdCBjYXJyaWVzIGEgbGFiZWwgb3IgbmFtZS4gQSByZWZ1c2FsIGlzIHRoZVxuICAvLyBzZXJ2ZXIncyB0byB3b3JkICgnTmFtZSBcInJlZ2lvblwiIGlzIGFscmVhZHkgdXNlZCBieSB0aGUgZmlsdGVyXG4gIC8vIFwiQXJlYVwiLicpLCBzbyBpdCBzaG93cyBvbiB0aGUgZmllbGQgcmF0aGVyIHRoYW4gaW4gYSBkaWFsb2csIGFuZCB0aGUgc2F2ZVxuICAvLyBmYWlscy4gV2hhdCB3YXMgc2F2ZWQgYmVjb21lcyB0aGUgcm93J3Mgc3RvcmVkIGdyb3VwLCBzbyBhIGxhdGVyIHNhdmVcbiAgLy8gZG9lcyBub3Qgc2VuZCBpdCBhZ2Fpbi5cbiAgcHJpdmF0ZSBfc2F2ZU5hbWVkKHJlcG9ydElkOiBudW1iZXIsIHNhdmU6IEZpbHRlckdyb3VwU2F2ZSk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIGNvbnN0IHsgcm93LCBjaGFuZ2VzIH0gPSBzYXZlO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEudXBkYXRlRmlsdGVyR3JvdXAoXG4gICAgICByZXBvcnRJZCxcbiAgICAgIHJvdy5ncm91cC5pZCxcbiAgICAgIGNoYW5nZXMsXG4gICAgICB7IGNvbnRleHQ6IG5ldyBIdHRwQ29udGV4dCgpLnNldChEaXNwbGF5QXBpRXJyb3IsIGZhbHNlKSB9LFxuICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMud3JvdGUuc2V0KHRydWUpO1xuICAgICAgICAgIHRoaXMucGF0Y2hSb3cocm93LCB7IGdyb3VwOiBzdG9yZWRHcm91cChyb3cuZ3JvdXAsIGNoYW5nZXMpIH0pO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICB0aGlzLl9zaG93UmVmdXNhbChyb3csIGNoYW5nZXMsIHJlZnVzYWxNZXNzYWdlKGVycm9yKSk7XG5cbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFNob3dzIGEgcmVmdXNhbCBvbiB0aGUgZmllbGQgaXQgaXMgYWJvdXQgKHRoZSBuYW1lLCB3aGljaCB0aGUgc2VydmVyXG4gIC8vIGNoZWNrcyBmaXJzdCwgZWxzZSB0aGUgbGFiZWwpLCBicmluZ3MgdGhlIEZpbHRlcnMgdGFiIGZvcndhcmQgYW5kXG4gIC8vIGZvY3VzZXMgdGhlIGZpZWxkLCBzbyBhIHNhdmUgbWFkZSBmcm9tIGFub3RoZXIgdGFiIHNheXMgd2h5IGl0IGZhaWxlZC5cbiAgcHJpdmF0ZSBfc2hvd1JlZnVzYWwocm93OiBGaWx0ZXJEZWZhdWx0Um93LCBjaGFuZ2VzOiBSZXBvcnRGaWx0ZXJHcm91cENoYW5nZXMsIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5wYXRjaFJvdyhyb3csIHsgbmFtZVJlZnVzYWw6IHsgdmFsdWU6IGNoYW5nZXMubmFtZSwgbWVzc2FnZSB9IH0pO1xuICAgICAgdGhpcy5fcmVmdXNlZElucHV0SWQgPSBuYW1lSW5wdXRJZChyb3cuZ3JvdXAuaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhdGNoUm93KHJvdywgeyBsYWJlbFJlZnVzYWw6IHsgdmFsdWU6IGNoYW5nZXMubGFiZWwgPz8gJycsIG1lc3NhZ2UgfSB9KTtcbiAgICAgIHRoaXMuX3JlZnVzZWRJbnB1dElkID0gbGFiZWxJbnB1dElkKHJvdy5ncm91cC5pZCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZFRhYi5zZXQoJ2ZpbHRlcnMnKTtcbiAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4gdGhpcy5mb2N1c1JlZnVzYWwoKSwgeyBpbmplY3RvcjogdGhpcy5faW5qZWN0b3IgfSk7XG4gIH1cblxuICBwcml2YXRlIF90aHJvd0JvdW5kc0Vycm9yKG1pbjogdW5rbm93biwgbWF4OiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgZXJyb3IgPSBib3VuZHNFcnJvcihwYXJzZURlZmF1bHRCb3VuZChtaW4pLCBwYXJzZURlZmF1bHRCb3VuZChtYXgpKTtcblxuICAgIGlmIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvLyBCdWlsZCBvbmUgZWRpdGFibGUgcm93IHBlciByZXBvcnQgYmFyIGZpbHRlciBncm91cCAoZXZlcnkgcGFnZSBvciBvbmVcbiAgLy8gcGFnZSksIGluIGJhciBvcmRlciwgc2VlZGluZyBlYWNoIGRyYWZ0IGZyb20gdGhlIGdyb3VwJ3Mgc3RvcmVkIGRlZmF1bHQuXG4gIHByaXZhdGUgX2J1aWxkRmlsdGVyUm93cyhyZXBvcnQ6IFJlcG9ydCk6IHZvaWQge1xuICAgIGNvbnN0IGJ1aWx0ID0gZGVmYXVsdFJvd0dyb3VwcyhyZXBvcnQuZmlsdGVyR3JvdXBzKVxuICAgICAgLm1hcCgoZ3JvdXApID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXBEZWZhdWx0ID0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0O1xuICAgICAgICAvLyBPbmUgc2hhcmVkLCByZXBsYXllZCBvcHRpb24gc3RyZWFtIHBlciBncm91cDogdGhlIGNoaXBzIGZldGNoIGFuZCB0aGVcbiAgICAgICAgLy8gc3RvcmVkIGRlZmF1bHQncyBsYWJlbHMgcmVhZCB0aGUgc2FtZSBsaXN0LCBzbyBpdCBpcyBmZXRjaGVkIG9uY2UuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMkID0gbG9hZEdyb3VwT3B0aW9ucyhncm91cCwgdGhpcy5fcmVwb3J0RGF0YSwgcmVwb3J0LmlkKTtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5fZmlsdGVyUm93KHJlcG9ydCwgZ3JvdXAsIG9wdGlvbnMkKTtcblxuICAgICAgICByZXR1cm4geyByb3csIG9wdGlvbnMkLCB2YWx1ZXM6IGdyb3VwRGVmYXVsdD8udmFsdWVzID8/IGdyb3VwRGVmYXVsdD8uZXhjbHVkZVZhbHVlcyA/PyBbXSB9O1xuICAgICAgfSk7XG5cbiAgICBjb25zdCByb3dzID0gYnVpbHQubWFwKChlbnRyeSkgPT4gZW50cnkucm93KTtcbiAgICBjb25zdCBzZWVkZWQgPSBidWlsdC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS52YWx1ZXMubGVuZ3RoKTtcblxuICAgIC8vIE5vdGhpbmcgdG8gbmFtZSDigJQgcHVibGlzaCBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiB3YWl0aW5nIG9uIGEgcmVxdWVzdFxuICAgIC8vIG5vIHJvdyBuZWVkcy5cbiAgICBpZiAoIXNlZWRlZC5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX3B1Ymxpc2hGaWx0ZXJSb3dzKHJvd3MpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQSBzdG9yZWQgc2VsZWN0IGRlZmF1bHQgaG9sZHMgaWRzLCBzbyBpdHMgY2hpcHMgY2FuIG9ubHkgYmUgbmFtZWQgb25jZSB0aGVcbiAgICAvLyBvcHRpb24gbGlzdCBpcyBpbi4gUmVzb2x2ZSBldmVyeSBzZWVkZWQgcm93IGZpcnN0IGFuZCBwdWJsaXNoIHRoZSByb3dzIGluXG4gICAgLy8gb25lIGdvLCBzbyB0aGUgdGFiIG5ldmVyIHJlbmRlcnMgYSBjaGlwIHNob3dpbmcgYSByYXcgaWQuIFdoZW4gYW4gb3B0aW9uXG4gICAgLy8gbGlzdCBmYWlscyB0byBsb2FkLCB0aGUgcm93cyBwdWJsaXNoIHVucmVzb2x2ZWQ6IGVhY2ggY2hpcCBuYW1lcyBpdHMgaWQsXG4gICAgLy8gYW5kIGFuIHVudG91Y2hlZCByb3cgc3RpbGwgc2F2ZXMgdGhlIHN0b3JlZCBkZWZhdWx0IHVuY2hhbmdlZC5cbiAgICBmb3JrSm9pbihzZWVkZWQubWFwKChlbnRyeSkgPT4gcmVzb2x2ZU9wdGlvblZhbHVlcyhlbnRyeS5vcHRpb25zJCwgZW50cnkudmFsdWVzKSkpXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihzZWVkZWQubWFwKChlbnRyeSkgPT4gZW50cnkudmFsdWVzLm1hcCgodmFsdWUpID0+ICh7IG5hbWU6IFN0cmluZyh2YWx1ZSksIHZhbHVlIH0pKSkpKSxcbiAgICAgICAgdGFwKChyZXNvbHZlZCkgPT4ge1xuICAgICAgICAgIHJlc29sdmVkLmZvckVhY2goKHZhbHVlcywgaW5kZXgpID0+IHNlZWRlZFtpbmRleF0ucm93LnZhbHVlcyA9IHZhbHVlcyk7XG4gICAgICAgICAgdGhpcy5fcHVibGlzaEZpbHRlclJvd3Mocm93cyk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvLyBPbmUgcm93J3MgZHJhZnQsIHNlZWRlZCBmcm9tIGl0cyBncm91cCdzIHN0b3JlZCBkZWZhdWx0LiBBIHN0b3JlZCBzZWxlY3RcbiAgLy8gZGVmYXVsdCdzIHZhbHVlcyBhcmUgbmFtZWQgbGF0ZXIsIG9uY2UgdGhlIG9wdGlvbiBsaXN0IGNhcnJ5aW5nIHRoZWlyXG4gIC8vIGxhYmVscyBpcyBpbiAoc2VlIF9idWlsZEZpbHRlclJvd3MpLlxuICBwcml2YXRlIF9maWx0ZXJSb3coXG4gICAgcmVwb3J0OiBSZXBvcnQsXG4gICAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICAgIG9wdGlvbnMkOiBPYnNlcnZhYmxlPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9W10+LFxuICApOiBGaWx0ZXJEZWZhdWx0Um93IHtcbiAgICBjb25zdCBncm91cERlZmF1bHQgPSBncm91cC5jb25maWc/LmRlZmF1bHQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ3JvdXAsXG4gICAgICBoZWFkaW5nOiBkZWZhdWx0Um93TGFiZWwoZ3JvdXAsIHJlcG9ydC5wYWdlcyksXG4gICAgICBsYWJlbDogZ3JvdXAubGFiZWwgPz8gJycsXG4gICAgICBuYW1lOiBncm91cC5uYW1lID8/ICcnLFxuICAgICAgc2hvd05hbWU6IHR5cGVvZiBncm91cC5uYW1lID09PSAnc3RyaW5nJyxcbiAgICAgIGxhYmVsUmVmdXNhbDogbnVsbCxcbiAgICAgIG5hbWVSZWZ1c2FsOiBudWxsLFxuICAgICAgcGVyaW9kOiBkZWZhdWx0UGVyaW9kKGdyb3VwRGVmYXVsdCksXG4gICAgICBwZXJpb2RPcHRpb25zOiBkZWZhdWx0UGVyaW9kT3B0aW9ucyhyZWxhdGl2ZUxhYmVsLCBncm91cERlZmF1bHQ/LnJlbGF0aXZlID8/IG51bGwpLFxuICAgICAgc3RhcnQ6IGRhdGVGcm9tQm91bmQoZ3JvdXBEZWZhdWx0Py5zdGFydCksXG4gICAgICBlbmQ6IGRhdGVGcm9tQm91bmQoZ3JvdXBEZWZhdWx0Py5lbmQpLFxuICAgICAgdmFsdWVzOiBbXSxcbiAgICAgIGV4Y2x1ZGU6ICEhZ3JvdXBEZWZhdWx0Py5leGNsdWRlVmFsdWVzPy5sZW5ndGgsXG4gICAgICAvLyBBbiBvbGRlciBzZXJ2ZXIgbGlzdHMgbm8gZmVhdHVyZXMsIGFuZCBsZWF2ZXMgbm8gdmFsdWVzIG91dC5cbiAgICAgIHNob3dFeGNsdWRlOiBzaG93RXhjbHVkZVRvZ2dsZShncm91cCwgcmVwb3J0LnZpZXdlckZlYXR1cmVzKSxcbiAgICAgIHZhbHVlOiBncm91cERlZmF1bHQ/LnZhbHVlID8/ICcnLFxuICAgICAgbWluOiBncm91cERlZmF1bHQ/Lm1pbiA/PyBudWxsLFxuICAgICAgbWF4OiBncm91cERlZmF1bHQ/Lm1heCA/PyBudWxsLFxuICAgICAgLy8gZnMtYXV0b2NvbXBsZXRlLWNoaXBzIGZldGNoOiB0aGUgZ3JvdXAncyBkaXN0aW5jdCBvcHRpb25zLCBuYW1lLWZpbHRlcmVkLlxuICAgICAgLy8gU2FtZSBsb2FkZXIgdGhlIHJlcG9ydCBiYXIgdXNlcywgc28gdGhlIHR3byBuZXZlciBkcmlmdC5cbiAgICAgIGZldGNoOiAoa2V5d29yZD86IHN0cmluZykgPT4gbWF0Y2hPcHRpb25zKG9wdGlvbnMkLCBrZXl3b3JkKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfcHVibGlzaEZpbHRlclJvd3Mocm93czogRmlsdGVyRGVmYXVsdFJvd1tdKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJSb3dzLnNldChyb3dzKTtcbiAgICB0aGlzLl9maWx0ZXJzUmVhZHkuc2V0KHRydWUpO1xuICB9XG5cbiAgLy8gVGhlIGRyYWZ0IGRlZmF1bHQgbm9ybWFsaXplZCB0byB0aGUgd2lyZSBzaGFwZSBmb3IgdGhpcyByb3cncyB0eXBlLCBvciBudWxsXG4gIC8vIHdoZW4gZW1wdHkgKHdoaWNoIGNsZWFycyB0aGUgc3RvcmVkIGRlZmF1bHQpLlxuICBwcml2YXRlIF9yb3dEZWZhdWx0KHJvdzogRmlsdGVyRGVmYXVsdFJvdyk6IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwge1xuICAgIHN3aXRjaCAocm93Lmdyb3VwLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2RhdGVSYW5nZSc6XG4gICAgICAgIHJldHVybiBkYXRlUmFuZ2VEZWZhdWx0KHJvdy5wZXJpb2QsIGRhdGVUb0JvdW5kKHJvdy5zdGFydCksIGRhdGVUb0JvdW5kKHJvdy5lbmQpKTtcblxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgLy8gQSBoaWRkZW4gdG9nZ2xlIGxlYXZlcyBub3RoaW5nIG91dC5cbiAgICAgICAgcmV0dXJuIHNlbGVjdERlZmF1bHQocm93LnZhbHVlcy5tYXAoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlKSwgcm93LnNob3dFeGNsdWRlICYmIHJvdy5leGNsdWRlKTtcblxuICAgICAgY2FzZSAnbnVtYmVyUmFuZ2UnOlxuICAgICAgICByZXR1cm4gbnVtYmVyUmFuZ2VEZWZhdWx0KHJvdy5taW4sIHJvdy5tYXgpO1xuXG4gICAgICBjYXNlICdrZXl3b3JkJzpcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByb3cudmFsdWUudHJpbSgpO1xuXG4gICAgICAgIHJldHVybiB2YWx1ZSA/IHsgdmFsdWUgfSA6IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn1cblxuXG4vLyBXaGF0IGEgcmVmdXNlZCByZXF1ZXN0IHNheXM6IHRoZSBzZXJ2ZXIncyBtZXNzYWdlLCBlbHNlIHRoZSBlcnJvcidzIG93bixcbi8vIGVsc2UgYSBwbGFpbiBmYWxsYmFjay5cbmZ1bmN0aW9uIHJlZnVzYWxNZXNzYWdlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgY29uc3QgZmFpbHVyZSA9IGVycm9yIGFzIHsgZXJyb3I/OiB7IG1lc3NhZ2U/OiB1bmtub3duIH07IG1lc3NhZ2U/OiB1bmtub3duIH0gfCBudWxsO1xuICBjb25zdCBtZXNzYWdlID0gZmFpbHVyZT8uZXJyb3I/Lm1lc3NhZ2UgPz8gZmFpbHVyZT8ubWVzc2FnZTtcblxuICByZXR1cm4gdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIG1lc3NhZ2UgPyBtZXNzYWdlIDogJ1RoZSBmaWx0ZXIgY291bGQgbm90IGJlIHNhdmVkLic7XG59XG5cbi8vIFRoZSBncm91cCBhcyB0aGUgc2VydmVyIG5vdyBzdG9yZXMgaXQsIG9uY2UgYW4gdXBkYXRlIGNhcnJ5aW5nIGBjaGFuZ2VzYFxuLy8gaXMgdGFrZW4uXG5mdW5jdGlvbiBzdG9yZWRHcm91cChncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsIGNoYW5nZXM6IFJlcG9ydEZpbHRlckdyb3VwQ2hhbmdlcyk6IFJlcG9ydEZpbHRlckdyb3VwIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5ncm91cCxcbiAgICAuLi4oY2hhbmdlcy5uYW1lICE9PSB1bmRlZmluZWQgPyB7IG5hbWU6IGNoYW5nZXMubmFtZSB9IDoge30pLFxuICAgIC4uLihjaGFuZ2VzLmxhYmVsICE9PSB1bmRlZmluZWQgPyB7IGxhYmVsOiBjaGFuZ2VzLmxhYmVsIH0gOiB7fSksXG4gICAgY29uZmlnOiBjaGFuZ2VzLmRlZmF1bHQgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IC4uLmdyb3VwLmNvbmZpZywgZGVmYXVsdDogY2hhbmdlcy5kZWZhdWx0ID8/IHVuZGVmaW5lZCB9XG4gICAgICA6IGdyb3VwLmNvbmZpZyxcbiAgfTtcbn1cblxuLy8gVGhlIGlkcyBvZiBhIGZpbHRlcidzIExhYmVsIGFuZCBOYW1lIGlucHV0cywgc28gYSByZWZ1c2VkIG9uZSBjYW4gYmVcbi8vIGZvY3VzZWQuXG5mdW5jdGlvbiBsYWJlbElucHV0SWQoZ3JvdXBJZDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBmaWx0ZXJMYWJlbCR7Z3JvdXBJZH1gO1xufVxuXG5mdW5jdGlvbiBuYW1lSW5wdXRJZChncm91cElkOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYGZpbHRlck5hbWUke2dyb3VwSWR9YDtcbn1cbiIsIjxmb3JtXG4gICAgZnNGb3JtXG4gICAgW3N1Ym1pdF09XCJzYXZlXCI+XG4gIDxmcy1kaWFsb2c+XG4gICAgPGgxIG1hdC1kaWFsb2ctdGl0bGU+XG4gICAgICBSZXBvcnQgU2V0dGluZ3NcbiAgICA8L2gxPlxuICAgIDxtYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgICA8IS0tIE9uZSBza2VsZXRvbiBvdmVyIHRoZSB3aG9sZSBib2R5IHVudGlsIHRoZSBsb2NhbGUgbGlzdCBpcyBpbi4gLS0+XG4gICAgICA8bmctY29udGFpbmVyICpmc1NrZWxldG9uRm9ybT1cInJlYWR5KCkgfHwgbnVsbFwiPlxuICAgICAgICA8IS0tIGFuaW1hdGlvbkRvbmU6IGEgcmVmdXNlZCBMYWJlbCBvciBOYW1lIGlzIGZvY3VzZWQgb25jZSB0aGVcbiAgICAgICAgICAgICBGaWx0ZXJzIHRhYiBpcyBvbiBzY3JlZW4uIC0tPlxuICAgICAgICA8bWF0LXRhYi1ncm91cFxuICAgICAgICAgICAgWyhzZWxlY3RlZCldPVwic2VsZWN0ZWRUYWJcIlxuICAgICAgICAgICAgKGFuaW1hdGlvbkRvbmUpPVwiZm9jdXNSZWZ1c2FsKClcIj5cbiAgICAgICAgICA8bWF0LXRhYlxuICAgICAgICAgICAgICBsYWJlbD1cIlNldHRpbmdzXCJcbiAgICAgICAgICAgICAgbmFtZT1cInNldHRpbmdzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtY29sdW1uIHRhYi1ib2R5XCI+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgTmFtZVxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICBuYW1lPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICBbZnNGb3JtUmVxdWlyZWRdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8IS0tXG4gICAgICAgICAgICAgICAgVGhlIHBhZ2UsIHR5cGVkIGluIGluY2hlcy4gT3JpZW50YXRpb24gaXMgbm90IGFza2VkIGZvciBiZWNhdXNlIGl0XG4gICAgICAgICAgICAgICAgaXMgbm90IGFuIGluZGVwZW5kZW50IGNob2ljZSAtIGEgcGFnZSB3aWRlciB0aGFuIGl0IGlzIHRhbGwgSVNcbiAgICAgICAgICAgICAgICBsYW5kc2NhcGUgLSBzbyB0aGUgdHdvIG51bWJlcnMgc2F5IGV2ZXJ5dGhpbmcgdGhlcmUgaXMgdG8gc2F5LlxuICAgICAgICAgICAgICAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLXJvdy5nYXAtc20uYWxpZ24tc3RhcnRcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmcy1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICBXaWR0aFxuICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIGZzTWFza051bWJlclxuICAgICAgICAgICAgICAgICAgICAgIFtzY2FsZV09XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBhZ2VXaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInBhZ2VXaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybVJlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmc0Zvcm1NaW5dPVwicGFnZURpbWVuc2lvbk1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1heF09XCJwYWdlRGltZW5zaW9uTWF4XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IG1hdFRleHRTdWZmaXg+XG4gICAgICAgICAgICAgICAgICAgIGluY2hlc1xuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmcy1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICBIZWlnaHRcbiAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBmc01hc2tOdW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICBbc2NhbGVdPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwYWdlSGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwicGFnZUhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybVJlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmc0Zvcm1NaW5dPVwicGFnZURpbWVuc2lvbk1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1heF09XCJwYWdlRGltZW5zaW9uTWF4XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IG1hdFRleHRTdWZmaXg+XG4gICAgICAgICAgICAgICAgICAgIGluY2hlc1xuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwhLS1cbiAgICAgICAgICAgICAgICBIb3cgZGVlcCB0aGUgaGVhZGVyIGFuZCBmb290ZXIgYmFuZHMgYXJlLiBUaGVpciBjb250ZW50IGlzIGVkaXRlZFxuICAgICAgICAgICAgICAgIG9uIHRoZSBjYW52YXMgKEVkaXQgbGF5b3V0IOKGkiBIZWFkZXIgJiBmb290ZXIpOyB0aGVzZSByZXNlcnZlIHRoZVxuICAgICAgICAgICAgICAgIHNwYWNlIGZvciBpdCwgYW5kIDAgbWVhbnMgbm8gYmFuZC5cbiAgICAgICAgICAgICAgLS0+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgSGVhZGVyIGhlaWdodFxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICBmc01hc2tOdW1iZXJcbiAgICAgICAgICAgICAgICAgICAgW3NjYWxlXT1cIjJcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImhlYWRlckhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJoZWFkZXJIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgICBbZnNGb3JtTWluXT1cIjBcIlxuICAgICAgICAgICAgICAgICAgICBbZnNGb3JtTWF4XT1cImhlYWRlckZvb3Rlck1heFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgbWF0VGV4dFN1ZmZpeD5cbiAgICAgICAgICAgICAgICAgIGluY2hlc1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIEZvb3RlciBoZWlnaHRcbiAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgZnNNYXNrTnVtYmVyXG4gICAgICAgICAgICAgICAgICAgIFtzY2FsZV09XCIyXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb290ZXJIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZm9vdGVySGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1pbl09XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1heF09XCJoZWFkZXJGb290ZXJNYXhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IG1hdFRleHRTdWZmaXg+XG4gICAgICAgICAgICAgICAgICBpbmNoZXNcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPGZzLWFpLXJlcG9ydC10aW1lem9uZS1zZWxlY3QgWyh0aW1lem9uZSldPVwidGltZXpvbmVcIj48L2ZzLWFpLXJlcG9ydC10aW1lem9uZS1zZWxlY3Q+XG4gICAgICAgICAgICAgIDwhLS1cbiAgICAgICAgICAgICAgICBIb3cgbnVtYmVycyBhbmQgZGF0ZXMgYXJlIHdyaXR0ZW4gKGZvcm1hdHRpbmcgb25seTogbm8gdGV4dCBpc1xuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWQpIGFuZCB3aGljaCBjdXJyZW5jeSBtb25leSBpcyBsYWJlbGVkIGluLiBIaWRkZW4gb24gYVxuICAgICAgICAgICAgICAgIHNlcnZlciB0b28gb2xkIHRvIHJlc29sdmUgYSByZXBvcnQncyBsb2NhbGUuXG4gICAgICAgICAgICAgIC0tPlxuICAgICAgICAgICAgICBAaWYgKGxvY2FsZXMoKSkge1xuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIExvY2FsZVxuICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImxvY2FsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJsb2NhbGUuc2V0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJsb2NhbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIGxvY2FsZU9wdGlvbnMoKTsgdHJhY2sgb3B0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgb3B0aW9uLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgICAgIHt7IGZvcm1hdEV4YW1wbGUoKSB9fVxuICAgICAgICAgICAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5XG4gICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY3VycmVuY3koKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY3VycmVuY3kuc2V0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJjdXJyZW5jeVwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChvcHRpb24gb2YgY3VycmVuY3lPcHRpb25zKCk7IHRyYWNrIG9wdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbi5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPG1hdC1oaW50PlxuICAgICAgICAgICAgICAgICAgICBOYW1lcyB0aGUgY3VycmVuY3kgYW1vdW50cyBhcmUgaW47IGl0IGRvZXMgbm90IGNvbnZlcnQgdGhlbS5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICAgIGxhYmVsPVwiU3R5bGVzXCJcbiAgICAgICAgICAgICAgbmFtZT1cInN0eWxlc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLWNvbHVtbiB0YWItYm9keVwiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIEhlYWRpbmcgU2l6ZVxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICAgICAgbWluPVwiNlwiXG4gICAgICAgICAgICAgICAgICBtYXg9XCI5NlwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImhlYWRpbmdTaXplXCJcbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJoZWFkaW5nU2l6ZVwiXG4gICAgICAgICAgICAgICAgICBbZnNGb3JtTWluXT1cIjZcIlxuICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1heF09XCI5NlwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIG1hdFRleHRTdWZmaXg+XG4gICAgICAgICAgICAgICAgICBwdFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgICBBcHBsaWVzIHRvIGNvbXBvbmVudCB0aXRsZXMuIFBvaW50cyBtYXAgMToxIHRvIFBERiBhbmQgUG93ZXJQb2ludC5cbiAgICAgICAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICAgIGxhYmVsPVwiRmlsdGVyc1wiXG4gICAgICAgICAgICAgIG5hbWU9XCJmaWx0ZXJzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtY29sdW1uIHRhYi1ib2R5XCI+XG4gICAgICAgICAgICAgIEBpZiAoZmlsdGVyUm93cygpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIDwhLS0gT25lIHNlY3Rpb24gcGVyIHJlcG9ydCBiYXIgZmlsdGVyOiBpdHMgaGVhZGluZywgaXRzIGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICBhbmQgbmFtZSwgdGhlbiBpdHMgZGVmYXVsdCwgb25lIGZpZWxkIHBlciByb3cuIC0tPlxuICAgICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBmaWx0ZXJSb3dzKCk7IHRyYWNrIHJvdy5ncm91cC5pZCkge1xuICAgICAgICAgICAgICAgICAgPGgzPlxuICAgICAgICAgICAgICAgICAgICB7eyByb3cuaGVhZGluZyB9fVxuICAgICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIGxhYmVsIGFuZCB0aGUgbmFtZSBhcmUgaW5kZXBlbmRlbnQ6IGEgbmV3IGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgIG5ldmVyIGNoYW5nZXMgdGhlIG5hbWUsIGFuZCB0aGUgbmFtZSBpcyBlZGl0ZWQgb24gaXRzXG4gICAgICAgICAgICAgICAgICAgICAgIG93bi4gVGhlIHNlcnZlciBjaGVja3MgYm90aCwgYW5kIGl0cyByZWZ1c2FsIHNob3dzIG9uXG4gICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaWVsZCAocmVmdXNhbFZhbGlkYXRvcikuIC0tPlxuICAgICAgICAgICAgICAgICAgQGlmIChyb3cuc2hvd05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICBMYWJlbFxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwibGFiZWxJbnB1dElkKHJvdy5ncm91cC5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3cubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJwYXRjaFJvdyhyb3csIHsgbGFiZWw6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIidsYWJlbCcgKyByb3cuZ3JvdXAuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZnNGb3JtUmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmc0Zvcm1NYXhMZW5ndGhdPVwibGFiZWxNYXhMZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGVdPVwicmVmdXNhbFZhbGlkYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0ZURhdGFdPVwicm93LmxhYmVsUmVmdXNhbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgICAgICAgICAgICAgIFdoYXQgdGhlIGZpbHRlciBzaG93cy4gQ2hhbmdpbmcgaXQgbmV2ZXIgY2hhbmdlcyB0aGUgbmFtZS5cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIm5hbWVJbnB1dElkKHJvdy5ncm91cC5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3cubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInBhdGNoUm93KHJvdywgeyBuYW1lOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCInbmFtZScgKyByb3cuZ3JvdXAuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZnNGb3JtUmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmc0Zvcm1QYXR0ZXJuXT1cIm5hbWVQYXR0ZXJuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybVBhdHRlcm5NZXNzYWdlXT1cIm5hbWVQYXR0ZXJuTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmc0Zvcm1NYXhMZW5ndGhdPVwibmFtZU1heExlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0ZV09XCJyZWZ1c2FsVmFsaWRhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRlRGF0YV09XCJyb3cubmFtZVJlZnVzYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICBIb3cgdGhlIEFJIHJlZmVycyB0byB0aGlzIGZpbHRlcjogYSBsZXR0ZXIsIHRoZW4gbGV0dGVycyBhbmQgZGlnaXRzLlxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAc3dpdGNoIChyb3cuZ3JvdXAudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBAY2FzZSAoJ2RhdGVSYW5nZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHBlcmlvZFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvdy5wZXJpb2RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInBhdGNoUm93KHJvdywgeyBwZXJpb2Q6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ3BlcmlvZCcgKyByb3cuZ3JvdXAuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIHJvdy5wZXJpb2RPcHRpb25zOyB0cmFjayBvcHRpb24udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcHRpb24ubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChyb3cucGVyaW9kID09PSBmaXhlZERhdGVzUGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBmcm9tXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzRGF0ZVBpY2tlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93LnN0YXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCInc3RhcnQnICsgcm93Lmdyb3VwLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNEYXRlUGlja2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cuZW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCInZW5kJyArIHJvdy5ncm91cC5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGNhc2UgKCdzZWxlY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGZzLWxhYmVsLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGZzLWF1dG9jb21wbGV0ZS1jaGlwc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZnVsbC13aWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJEZWZhdWx0IHZhbHVlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZldGNoXT1cInJvdy5mZXRjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cudmFsdWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCIndmFsdWVzJyArIHJvdy5ncm91cC5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmZXRjaE9uRm9jdXNdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzQXV0b2NvbXBsZXRlQ2hpcHNUZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0LW9iamVjdD1cIm9iamVjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9iamVjdC5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2ZzLWF1dG9jb21wbGV0ZS1jaGlwcz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAocm93LnNob3dFeGNsdWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3cuZXhjbHVkZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJwYXRjaFJvdyhyb3csIHsgZXhjbHVkZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIidleGNsdWRlJyArIHJvdy5ncm91cC5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2x1ZGUgdGhlc2UgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlICgnbnVtYmVyUmFuZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBmc01hc2tOdW1iZXIgaGFuZHMgYmFjayB0ZXh0OyB0aGUgY2hlY2sgYW5kIHRoZSBzYXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkIGl0IHRocm91Z2ggcGFyc2VEZWZhdWx0Qm91bmQsIHNvIDAgaXMga2VwdC4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBtaW5pbXVtXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNNYXNrTnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpZ25lZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2NhbGVdPVwiYm91bmRTY2FsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93Lm1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwicGF0Y2hSb3cocm93LCB7IG1pbjogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCInbWluJyArIHJvdy5ncm91cC5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRlXT1cIm1pbkJvdW5kVmFsaWRhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGVEYXRhXT1cInJvdy5tYXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgbWF4aW11bVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzTWFza051bWJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaWduZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NjYWxlXT1cImJvdW5kU2NhbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvdy5tYXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInBhdGNoUm93KHJvdywgeyBtYXg6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ21heCcgKyByb3cuZ3JvdXAuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0ZV09XCJtYXhCb3VuZFZhbGlkYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRlRGF0YV09XCJyb3cubWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCB0ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIid2YWx1ZScgKyByb3cuZ3JvdXAuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8ZnMtbWVzc2FnZS1pbmZvPlxuICAgICAgICAgICAgICAgICAgVGhpcyByZXBvcnQgaGFzIG5vIHJlcG9ydCBiYXIgZmlsdGVycyB5ZXQuIEFkZCBhIGZpbHRlciB0byBhXG4gICAgICAgICAgICAgICAgICBjb21wb25lbnQgKGl0cyBzZXR0aW5ncyDihpIgRmlsdGVycykgYW5kIHNob3cgaXQgaW4gdGhlIHJlcG9ydCBiYXIsXG4gICAgICAgICAgICAgICAgICB0aGVuIHNldCBpdHMgZGVmYXVsdCBoZXJlLlxuICAgICAgICAgICAgICAgIDwvZnMtbWVzc2FnZS1pbmZvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICAgIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgICA8ZnMtZm9ybS1kaWFsb2ctYWN0aW9ucz5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICBjb2xvcj1cIndhcm5cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZSgpXCI+XG4gICAgICAgICAgRGVsZXRlXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9mcy1mb3JtLWRpYWxvZy1hY3Rpb25zPlxuICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICA8L2ZzLWRpYWxvZz5cbjwvZm9ybT4iXX0=
551
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9kaWFsb2dzL3JlcG9ydC1zZXR0aW5ncy9yZXBvcnQtc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvcmVwb3J0LXNldHRpbmdzL3JlcG9ydC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFDTCx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBVSxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQzVHLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBbUIsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdILE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0s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LENBQUM7QUFDaEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEh0dHBDb250ZXh0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRGVzdHJveVJlZiwgSW5qZWN0b3IsIE9uSW5pdCwgYWZ0ZXJOZXh0UmVuZGVyLCBjb21wdXRlZCwgaW5qZWN0LCBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgTWF0QnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nQWN0aW9ucywgTWF0RGlhbG9nQ29udGVudCwgTWF0RGlhbG9nUmVmLCBNYXREaWFsb2dUaXRsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGQsIE1hdExhYmVsLCBNYXRIaW50LCBNYXRTdWZmaXggfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0T3B0aW9uLCBNYXRTZWxlY3QgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTWF0U2xpZGVUb2dnbGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGUnO1xuaW1wb3J0IHsgTWF0VGFic01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYnMnO1xuXG5pbXBvcnQgeyBEaXNwbGF5QXBpRXJyb3IgfSBmcm9tICdAZmlyZXN0aXRjaC9hcGknO1xuaW1wb3J0IHsgRnNBdXRvY29tcGxldGVDaGlwc01vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2F1dG9jb21wbGV0ZS1jaGlwcyc7XG5pbXBvcnQgeyBGc0RhdGVQaWNrZXJNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9kYXRlcGlja2VyJztcbmltcG9ydCB7IEZzRGlhbG9nTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZGlhbG9nJztcbmltcG9ydCB7IEZzRm9ybU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2Zvcm0nO1xuaW1wb3J0IHsgRnNMYWJlbE1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2xhYmVsJztcbmltcG9ydCB7IEZzTWFza01vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21hc2snO1xuaW1wb3J0IHsgRnNNZXNzYWdlLCBGc01lc3NhZ2VNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9tZXNzYWdlJztcbmltcG9ydCB7IEZzUHJvY2VzcyB9IGZyb20gJ0BmaXJlc3RpdGNoL3Byb2Nlc3MnO1xuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuaW1wb3J0IHsgRnNTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3NrZWxldG9uJztcbmltcG9ydCB7IEZzVGFic01vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3RhYnMnO1xuXG5pbXBvcnQgeyBUaW1lem9uZVNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdGltZXpvbmUtc2VsZWN0L3RpbWV6b25lLXNlbGVjdC5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiwgZnJvbSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGNvbmNhdE1hcCwgZmluYWxpemUsIHN3aXRjaE1hcCwgdGFwLCB0b0FycmF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBhcGlFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi9hcGktZXJyb3ItbWVzc2FnZSc7XG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyBSZXBvcnRWYWx1ZUZvcm1hdCB9IGZyb20gJy4uLy4uL2VudW1zL3JlcG9ydC12YWx1ZS1mb3JtYXQuZW51bSc7XG5pbXBvcnQge1xuICBEQVlfU0hPUlQsXG4gIFJFUE9SVF9GQUxMQkFDS19DVVJSRU5DWSxcbiAgY3VycmVuY3lOYW1lLFxuICBmb3JtYXRMb2NhbERhdGUsXG4gIGZvcm1hdE51bWJlcixcbiAgbG9jYWxlTmFtZSxcbiAgcmVzb2x2ZVJlcG9ydEN1cnJlbmN5LFxuICByZXNvbHZlUmVwb3J0TG9jYWxlLFxufSBmcm9tICcuLi8uLi9mb3JtYXQnO1xuaW1wb3J0IHtcbiAgRmlsdGVyR3JvdXBEZWZhdWx0LFxuICBSZXBvcnQsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxuICBSZXBvcnRMb2NhbGVzLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtZmlsdGVyLWdyb3VwLWNoYW5nZXMuaW50ZXJmYWNlJztcbmltcG9ydCB7IERFRkFVTFRfSEVBRElOR19TSVpFLCBIRUFERVJfRk9PVEVSX01BWCwgUEFHRV9ESU1FTlNJT05fTUFYLCBQQUdFX0RJTUVOU0lPTl9NSU4gfSBmcm9tICcuLi8uLi9sYXlvdXQnO1xuaW1wb3J0IHtcbiAgZGF0ZUZyb21Cb3VuZCwgZGF0ZVRvQm91bmQsIGxvYWRHcm91cE9wdGlvbnMsIG1hdGNoT3B0aW9ucywgcmVsYXRpdmVMYWJlbCwgcmVzb2x2ZU9wdGlvblZhbHVlcyxcbn0gZnJvbSAnLi4vLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQge1xuICBERUZBVUxUX0JPVU5EX1NDQUxFLFxuICBGSUxURVJfTEFCRUxfTUFYX0xFTkdUSCxcbiAgRklMVEVSX05BTUVfTUFYX0xFTkdUSCxcbiAgRklMVEVSX05BTUVfUEFUVEVSTixcbiAgRklMVEVSX05BTUVfUEFUVEVSTl9NRVNTQUdFLFxuICBGSVhFRF9EQVRFU19QRVJJT0QsXG4gIGJvdW5kc0Vycm9yLFxuICBkYXRlUmFuZ2VEZWZhdWx0LFxuICBkZWZhdWx0Q2hhbmdlZCxcbiAgZGVmYXVsdFBlcmlvZCxcbiAgZGVmYXVsdFBlcmlvZE9wdGlvbnMsXG4gIGRlZmF1bHRSb3dHcm91cHMsXG4gIGRlZmF1bHRSb3dMYWJlbCxcbiAgbnVtYmVyUmFuZ2VEZWZhdWx0LFxuICBwYXJzZURlZmF1bHRCb3VuZCxcbiAgc2VsZWN0RGVmYXVsdCxcbiAgc2hvd0V4Y2x1ZGVUb2dnbGUsXG59IGZyb20gJy4uLy4uL2ZpbHRlci1zZXR0aW5ncy1ydWxlcyc7XG5pbXBvcnQgeyBGaWx0ZXJTZXR0aW5nc09wdGlvbiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZmlsdGVyLXNldHRpbmdzLW9wdGlvbi5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyByZXBvcnRMb2NhbGVQYXRjaCB9IGZyb20gJy4vcmVwb3J0LWxvY2FsZS1wYXRjaCc7XG5cblxuLy8gV2hhdCB0aGUgZGlhbG9nIGhhbmRzIGJhY2sgd2hlbiBpdCBjbG9zZXMsIHNvIHRoZSBwYWdlIGtub3dzIHdoYXQgaGFwcGVuZWRcbi8vIHdpdGhvdXQgc25pZmZpbmcgbWFnaWMgc3RyaW5ncy4gQSBkaXNtaXNzZWQgZGlhbG9nIGNsb3NlcyB3aXRoIGB1bmRlZmluZWRgLlxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRTZXR0aW5nc1Jlc3VsdCB7XG4gIGFjdGlvbjogJ3NhdmVkJyB8ICdkZWxldGVkJztcbn1cblxuXG4vLyBBIE5hbWUgb3IgTGFiZWwgdGhlIHNlcnZlciByZWZ1c2VkIGZvciBhIGZpbHRlciBncm91cCwgd2l0aCB0aGUgbWVzc2FnZSBpdFxuLy8gZ2F2ZS5cbmludGVyZmFjZSBGaWx0ZXJGaWVsZFJlZnVzYWwge1xuICB2YWx1ZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8vIE9uZSByZXBvcnQgYmFyIGZpbHRlciBpbiB0aGUgRmlsdGVycyB0YWI6IGl0cyBncm91cCwgaXRzIGxhYmVsIGFuZCBuYW1lLFxuLy8gYW5kIGFuIGVkaXRhYmxlIGRyYWZ0IGRlZmF1bHQuIFRoZSBkcmFmdCBmaWVsZHMgdXNlZCBkZXBlbmQgb24gdGhlIHR5cGVcbi8vIChkYXRlUmFuZ2Ug4oaSIGEgRGVmYXVsdCBwZXJpb2QsIHdoaWNoIGlzIGEgcmVsYXRpdmUgcmFuZ2Ugb3IgRml4ZWQgZGF0ZXNcbi8vIHdpdGggc3RhcnQvZW5kIERhdGVzOyBzZWxlY3Qg4oaSIHZhbHVlcywga2VwdCBvciBsZWZ0IG91dDsga2V5d29yZCDihpIgdGV4dDtcbi8vIG51bWJlclJhbmdlIOKGkiBtaW4gYW5kIG1heCkuIGBmZXRjaGAgbG9hZHMgdGhlIHNlbGVjdCBvcHRpb25zIHRoZSBzYW1lIHdheVxuLy8gdGhlIHJlcG9ydCBiYXIgZG9lcy5cbmludGVyZmFjZSBGaWx0ZXJEZWZhdWx0Um93IHtcbiAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwO1xuICAvLyBUaGUgc2VjdGlvbiBoZWFkaW5nOiB0aGUgbGFiZWwsIHdpdGggdGhlIHBhZ2UgZm9yIGEgcGFnZSBmaWx0ZXIuXG4gIGhlYWRpbmc6IHN0cmluZztcbiAgLy8gVGhlIGdyb3VwJ3MgbGFiZWwgYW5kIG5hbWUgYXMgdHlwZWQsIGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIuIEVhY2ggaXNcbiAgLy8gc2F2ZWQgb25seSB3aGVuIGl0IGRpZmZlcnMgZnJvbSB0aGUgc3RvcmVkIG9uZTsgdGhlIG5hbWUgaXMgbmV2ZXJcbiAgLy8gZGVyaXZlZCBmcm9tIHRoZSBsYWJlbCBoZXJlLlxuICBsYWJlbDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8vIFRoZSBzZXJ2ZXIgc2VudCBhIG5hbWUsIHNvIGl0IGFsc28gdGFrZXMgYSBsYWJlbCBhbmQgYSBuYW1lIG9uIHRoZSBncm91cFxuICAvLyB1cGRhdGUgKGFuIG9sZGVyIHNlcnZlciBzZW5kcyBub25lLCBhbmQgdGhlIHR3byBmaWVsZHMgYXJlIGhpZGRlbikuXG4gIHNob3dOYW1lOiBib29sZWFuO1xuICAvLyBUaGUgbGFzdCBsYWJlbCBhbmQgbmFtZSB0aGUgc2VydmVyIHJlZnVzZWQsIGVhY2ggc2hvd24gb24gaXRzIGZpZWxkXG4gIC8vIHdoaWxlIHRoZSBmaWVsZCBzdGlsbCBob2xkcyBpdC5cbiAgbGFiZWxSZWZ1c2FsOiBGaWx0ZXJGaWVsZFJlZnVzYWwgfCBudWxsO1xuICBuYW1lUmVmdXNhbDogRmlsdGVyRmllbGRSZWZ1c2FsIHwgbnVsbDtcbiAgLy8gQSByZWxhdGl2ZSByYW5nZSBuYW1lLCBvciBGSVhFRF9EQVRFU19QRVJJT0QgZm9yIHN0YXJ0IGFuZCBlbmQuXG4gIHBlcmlvZDogc3RyaW5nO1xuICBwZXJpb2RPcHRpb25zOiBGaWx0ZXJTZXR0aW5nc09wdGlvbltdO1xuICBzdGFydDogRGF0ZSB8IG51bGw7XG4gIGVuZDogRGF0ZSB8IG51bGw7XG4gIHZhbHVlczogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXTtcbiAgLy8gVGhlIHZhbHVlcyBhcmUgbGVmdCBvdXQgcmF0aGVyIHRoYW4ga2VwdC5cbiAgZXhjbHVkZTogYm9vbGVhbjtcbiAgc2hvd0V4Y2x1ZGU6IGJvb2xlYW47XG4gIHZhbHVlOiBzdHJpbmc7XG4gIC8vIFRoZSByYW5nZSBlbmRzIGFzIHR5cGVkOiBmc01hc2tOdW1iZXIgaGFuZHMgYmFjayB0ZXh0LiBSZWFkIHRocm91Z2hcbiAgLy8gcGFyc2VEZWZhdWx0Qm91bmQuXG4gIG1pbjogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgbWF4OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBmZXRjaDogKGtleXdvcmQ/OiBzdHJpbmcpID0+IE9ic2VydmFibGU8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXT47XG59XG5cbi8vIE9uZSBmaWx0ZXIncyBncm91cCB1cGRhdGUgaW4gYSBzYXZlOiBvbmx5IHRoZSBrZXlzIHRoZSBvcGVyYXRvciBjaGFuZ2VkLlxuaW50ZXJmYWNlIEZpbHRlckdyb3VwU2F2ZSB7XG4gIHJvdzogRmlsdGVyRGVmYXVsdFJvdztcbiAgY2hhbmdlczogUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzO1xufVxuXG4vLyBPbmUgZW50cnkgb2YgdGhlIExvY2FsZSBvciBDdXJyZW5jeSBzZWxlY3QuICcnIGlzIHRoZSBleHBsaWNpdCBEZWZhdWx0LlxuaW50ZXJmYWNlIExvY2FsZVNlbGVjdE9wdGlvbiB7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG59XG5cbi8vIFRoZSBkYXkgdGhlIExvY2FsZSBoaW50IHdyaXRlcywgYSBmaXhlZCBjYWxlbmRhciBkYXkgc28gdGhlIGV4YW1wbGUgbmV2ZXJcbi8vIGNoYW5nZXMgdW5kZXIgdGhlIG9wZXJhdG9yLlxuY29uc3QgRVhBTVBMRV9EQVkgPSBuZXcgRGF0ZSgyMDI2LCAwLCA1KTtcbmNvbnN0IEVYQU1QTEVfQU1PVU5UID0gMTIzNC41O1xuXG4vLyAnQ2FuYWRpYW4gRnJlbmNoIChmci1DQSknLCAnQ2FuYWRpYW4gRG9sbGFyIChDQUQpJzogRW5nbGlzaCBuYW1lcyB3aGF0ZXZlclxuLy8gdGhlIHJlcG9ydCdzIGxvY2FsZSwgd2l0aCB0aGUgY29kZSB0aGF0IGlzIHN0b3JlZC5cbmZ1bmN0aW9uIGxvY2FsZUxhYmVsKHRhZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2xvY2FsZU5hbWUodGFnKX0gKCR7dGFnfSlgO1xufVxuXG5mdW5jdGlvbiBjdXJyZW5jeUxhYmVsKGNvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtjdXJyZW5jeU5hbWUoY29kZSl9ICgke2NvZGV9KWA7XG59XG5cblxuLy8gUmVwb3J0IHNldHRpbmdzLCBpbiB0aHJlZSB0YWJzOlxuLy8gICBTZXR0aW5ncyDigJQgbmFtZSArIHBhZ2Ugc2V0dXAgKHNpemUgaW4gaW5jaGVzLCBoZWFkZXIvZm9vdGVyIGJhbmQgZGVwdGhzKS5cbi8vICAgU3R5bGVzICAg4oCUIHRoZSByZXBvcnQncyB0eXBvZ3JhcGhpYyBzdHlsZXMgKHNpemVzIGluIFBPSU5UUywgMToxIHdpdGhcbi8vICAgUERGL1Bvd2VyUG9pbnQpOyB0aGUgSGVhZGluZyBzaXplIHRvIHN0YXJ0LlxuLy8gICBGaWx0ZXJzICDigJQgdGhlIHJlcG9ydCBiYXIgZmlsdGVycyAoZXZlcnkgcGFnZSBvciBvbmUgcGFnZSkgYW5kIHRoZWlyXG4vLyAgIERFRkFVTFQgdmFsdWVzLiBBIGRlZmF1bHQgc2VlZHMgdGhlIHJlcG9ydCBiYXIgb24gZXZlcnkgb3BlbiAoZm9yIGV2ZXJ5XG4vLyAgIHZpZXdlcikgYnV0IHN0YXlzIHVzZXItY2hhbmdlYWJsZSDigJQgaXQgcHJlLWZpbGxzIHRoZSBjb250cm9sLCBpdCBkb2Vzbid0XG4vLyAgIGxvY2sgaXQuIFRoaXMgaXMgdGhlIGZpeCBmb3IgaGVhdnkgcmVwb3J0cyBvcGVuaW5nIGJsYW5rIGFuZCB0aW1pbmcgb3V0OiBhXG4vLyAgIGRlZmF1bHQgbW9udGggKyBvcmdhbml6YXRpb24gc2NvcGVzIHRoZSBsYW5kaW5nIHBhZ2UgZnJvbSB0aGUgZmlyc3QgbG9hZC5cbi8vICAgVGhlIHJ1bGVzIG9mIHRoZSByb3dzIGxpdmUgaW4gZmlsdGVyLXNldHRpbmdzLXJ1bGVzLnRzLlxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9yZXBvcnQtc2V0dGluZ3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZXBvcnQtc2V0dGluZ3MuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBGc0Zvcm1Nb2R1bGUsXG4gICAgRnNMYWJlbE1vZHVsZSxcbiAgICBGc01hc2tNb2R1bGUsXG4gICAgRnNEaWFsb2dNb2R1bGUsXG4gICAgRnNNZXNzYWdlTW9kdWxlLFxuICAgIEZzVGFic01vZHVsZSxcbiAgICBGc1NrZWxldG9uTW9kdWxlLFxuICAgIEZzRGF0ZVBpY2tlck1vZHVsZSxcbiAgICBGc0F1dG9jb21wbGV0ZUNoaXBzTW9kdWxlLFxuICAgIE1hdFRhYnNNb2R1bGUsXG4gICAgTWF0QnV0dG9uLFxuICAgIE1hdERpYWxvZ1RpdGxlLFxuICAgIE1hdERpYWxvZ0NvbnRlbnQsXG4gICAgTWF0RGlhbG9nQWN0aW9ucyxcbiAgICBNYXRGb3JtRmllbGQsXG4gICAgTWF0TGFiZWwsXG4gICAgTWF0SGludCxcbiAgICBNYXRTdWZmaXgsXG4gICAgTWF0SW5wdXQsXG4gICAgTWF0U2VsZWN0LFxuICAgIE1hdE9wdGlvbixcbiAgICBNYXRTbGlkZVRvZ2dsZSxcbiAgICBUaW1lem9uZVNlbGVjdENvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgUmVwb3J0U2V0dGluZ3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIC8vIEEgc2lnbmFsLCBzbyBhIHJlZnVzZWQgTGFiZWwgb3IgTmFtZSBjYW4gYnJpbmcgdGhlIEZpbHRlcnMgdGFiIGZvcndhcmQuXG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3RlZFRhYiA9IHNpZ25hbCgnc2V0dGluZ3MnKTtcbiAgLy8gVHJ1ZSBvbmNlIGFueSBzYXZlIHJlcXVlc3QgaGFzIGJlZW4gc3RvcmVkLCBldmVuIHdoZW4gdGhlIHNhdmUgYXMgYVxuICAvLyB3aG9sZSB0aGVuIGZhaWxlZDogdGhlIHBhZ2UgcmVsb2FkcyBhZnRlciBhIGRpc21pc3NlZCBkaWFsb2cgdG9vLlxuICBwdWJsaWMgcmVhZG9ubHkgd3JvdGUgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHB1YmxpYyBuYW1lID0gJyc7XG4gIC8vIFRoZSBwYWdlIGluIGluY2hlcy4gTm8gaW5pdGlhbGl6ZXI6IGV2ZXJ5IHJlcG9ydCBjYXJyaWVzIGEgc2l6ZSwgYW5kXG4gIC8vIG5nT25Jbml0IHNlZWRzIGJvdGggYmVmb3JlIHRoZSB0YWIgcmVuZGVycywgc28gYSBwbGFjZWhvbGRlciBoZXJlIGNvdWxkIG9ubHlcbiAgLy8gZXZlciBiZSBhIHdyb25nIG51bWJlciBicmllZmx5IHNob3dpbmcgYXMgdGhlIG9wZXJhdG9yJ3Mgb3duLlxuICAvL1xuICAvLyBUeXBlZCBgbnVtYmVyIHwgc3RyaW5nYCBiZWNhdXNlIGZzTWFza051bWJlciBpcyB0aGUgY29udHJvbDogaXQgaXMgc2VlZGVkXG4gIC8vIHdpdGggdGhlIHJlcG9ydCdzIG51bWJlciBidXQgaGFuZHMgYmFjayB0aGUgdW5tYXNrZWQgU1RSSU5HIHRoZSBvcGVyYXRvclxuICAvLyB0eXBlZC4gU2F2ZSBjYXN0cyBpdCBvbmNlLCBvbiB0aGUgd2F5IG91dCDigJQgc2VlIGBfcGFnZURpbWVuc2lvbigpYC5cbiAgcHVibGljIHBhZ2VXaWR0aDogbnVtYmVyIHwgc3RyaW5nO1xuICBwdWJsaWMgcGFnZUhlaWdodDogbnVtYmVyIHwgc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZURpbWVuc2lvbk1pbiA9IFBBR0VfRElNRU5TSU9OX01JTjtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VEaW1lbnNpb25NYXggPSBQQUdFX0RJTUVOU0lPTl9NQVg7XG4gIC8vIFRoZSBoZWFkZXIgYW5kIGZvb3RlciBiYW5kIGRlcHRocywgaW5jaGVzIOKAlCB0eXBlZCBsaWtlIHRoZSBwYWdlIHNpemVcbiAgLy8gYmVjYXVzZSBmc01hc2tOdW1iZXIgaGFuZHMgYmFjayBhIHN0cmluZy5cbiAgcHVibGljIGhlYWRlckhlaWdodDogbnVtYmVyIHwgc3RyaW5nID0gMDtcbiAgcHVibGljIGZvb3RlckhlaWdodDogbnVtYmVyIHwgc3RyaW5nID0gMDtcbiAgcHVibGljIHJlYWRvbmx5IGhlYWRlckZvb3Rlck1heCA9IEhFQURFUl9GT09URVJfTUFYO1xuICAvLyBTZWVkZWQgd2l0aCB0aGUgem9uZSB0aGUgcmVwb3J0IGFjdHVhbGx5IHVzZXM6IGl0cyBvd24gc3RvcmVkIHpvbmUsIGVsc2VcbiAgLy8gdGhlIGFwcGxpY2F0aW9uIGRlZmF1bHQgdGhlIHNlcnZlciByZXNvbHZlZCAoZWZmZWN0aXZlVGltZXpvbmUpLiBTYXZlIHNlbmRzXG4gIC8vIGl0IG9ubHkgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhhdCBlZmZlY3RpdmUgem9uZSwgc28gb3BlbmluZyBhbmQgc2F2aW5nIGFcbiAgLy8gcmVwb3J0IHRoYXQgZm9sbG93cyB0aGUgZGVmYXVsdCBuZXZlciBwaW5zIGl0IHRvIGEgem9uZS5cbiAgcHVibGljIHRpbWV6b25lID0gJyc7XG4gIHB1YmxpYyBoZWFkaW5nU2l6ZSA9IERFRkFVTFRfSEVBRElOR19TSVpFO1xuXG4gIC8vIFRoZSBsb2NhbGVzIGFuZCBjdXJyZW5jaWVzIHRoZSBzZXJ2ZXIgb2ZmZXJzLiBudWxsIHVudGlsIGxvYWRlZCwgYW5kXG4gIC8vIG5ldmVyIGxvYWRlZCBmcm9tIGEgc2VydmVyIHRvbyBvbGQgdG8gc2VuZCBlZmZlY3RpdmVMb2NhbGU6IHRoZXJlIHRoZVxuICAvLyBzZWxlY3RzIHN0YXkgaGlkZGVuIGFuZCB0aGUgcmVwb3J0IHJlYWRzIGVuLVVTL1VTRC5cbiAgcHVibGljIHJlYWRvbmx5IGxvY2FsZXMgPSBzaWduYWw8UmVwb3J0TG9jYWxlcyB8IG51bGw+KG51bGwpO1xuICAvLyBUaGUgcmVwb3J0J3Mgb3duIGxvY2FsZSBhbmQgY3VycmVuY3ksICcnIHdoZW4gaXQgZm9sbG93cyB0aGUgZGVmYXVsdC4gU2F2ZVxuICAvLyBzZW5kcyBlYWNoIG9ubHkgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIHN0b3JlZCB2YWx1ZS5cbiAgcHVibGljIHJlYWRvbmx5IGxvY2FsZSA9IHNpZ25hbCgnJyk7XG4gIHB1YmxpYyByZWFkb25seSBjdXJyZW5jeSA9IHNpZ25hbCgnJyk7XG4gIC8vIFRoZSB3aG9sZSBmb3JtIHdhaXRzIGJlaGluZCBvbmUgc2tlbGV0b24gdW50aWwgdGhlIGZpbHRlciByb3dzIGFyZSBidWlsdFxuICAvLyBhbmQgdGhlIGxvY2FsZSByZXF1ZXN0IGhhcyBzZXR0bGVkLCBzbyB0aGUgU2V0dGluZ3MgdGFiIG5ldmVyIHNob3dzXG4gIC8vIHdpdGhvdXQgaXRzIExvY2FsZSBhbmQgQ3VycmVuY3kgc2VsZWN0cy4gQSBmYWlsZWQgbG9jYWxlIHJlcXVlc3Qgc2V0dGxlc1xuICAvLyB0b286IHRoZSB0d28gc2VsZWN0cyBzdGF5IGhpZGRlbiAobG9jYWxlcygpIGlzIHN0aWxsIG51bGwpIGFuZCBldmVyeSBvdGhlclxuICAvLyBzZXR0aW5nIHN0YXlzIGVkaXRhYmxlLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVhZHkgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9maWx0ZXJzUmVhZHkoKSAmJiAoIXRoaXMuX3NlcnZlckhhc0xvY2FsZSB8fCB0aGlzLl9sb2NhbGVzU2V0dGxlZCgpKSk7XG5cbiAgLy8gQW4gZXhwbGljaXQgRGVmYXVsdCAoJycpIG5hbWluZyB0aGUgbG9jYWxlIGl0IHN0YW5kcyBmb3IsIHRoZW4gZWFjaCBvZmZlcmVkXG4gIC8vIGxvY2FsZS4gQSBzdG9yZWQgbG9jYWxlIHRoZSBzZXJ2ZXIgbm8gbG9uZ2VyIG9mZmVycyBpcyBsaXN0ZWQgZmlyc3QsIHNvXG4gIC8vIHRoZSBzZWxlY3Qgc3RpbGwgc2hvd3Mgd2hhdCB0aGUgcmVwb3J0IGhvbGRzLlxuICBwdWJsaWMgcmVhZG9ubHkgbG9jYWxlT3B0aW9ucyA9IGNvbXB1dGVkPExvY2FsZVNlbGVjdE9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlcyA9IHRoaXMubG9jYWxlcygpO1xuICAgIGlmICghbG9jYWxlcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IG9mZmVyZWQgPSBsb2NhbGVzLm9wdGlvbnMubWFwKChvcHRpb24pID0+IG9wdGlvbi5sb2NhbGUpO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLnRoaXMuX3N0b3JlZE9wdGlvbih0aGlzLl9kYXRhLnJlcG9ydC5sb2NhbGUsIG9mZmVyZWQsIGxvY2FsZUxhYmVsKSxcbiAgICAgIHsgdmFsdWU6ICcnLCBsYWJlbDogYERlZmF1bHQg4oCUICR7bG9jYWxlTmFtZShsb2NhbGVzLmRlZmF1bHRMb2NhbGUpfWAgfSxcbiAgICAgIC4uLm9mZmVyZWQubWFwKCh0YWcpID0+ICh7IHZhbHVlOiB0YWcsIGxhYmVsOiBsb2NhbGVMYWJlbCh0YWcpIH0pKSxcbiAgICBdO1xuICB9KTtcblxuICAvLyBBbiBleHBsaWNpdCBEZWZhdWx0ICgnJykgbmFtaW5nIHRoZSBjdXJyZW5jeSB0aGUgc2VsZWN0ZWQgbG9jYWxlIHVzZXMgd2hlblxuICAvLyB0aGUgcmVwb3J0IG5hbWVzIG5vbmUsIHRoZW4gZXZlcnkgY3VycmVuY3kuIEEgc3RvcmVkIGNvZGUgdGhlIHNlcnZlciBub1xuICAvLyBsb25nZXIgb2ZmZXJzIGlzIGxpc3RlZCBmaXJzdC5cbiAgcHVibGljIHJlYWRvbmx5IGN1cnJlbmN5T3B0aW9ucyA9IGNvbXB1dGVkPExvY2FsZVNlbGVjdE9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlcyA9IHRoaXMubG9jYWxlcygpO1xuICAgIGlmICghbG9jYWxlcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiBbXG4gICAgICAuLi50aGlzLl9zdG9yZWRPcHRpb24odGhpcy5fZGF0YS5yZXBvcnQuY3VycmVuY3ksIGxvY2FsZXMuY3VycmVuY2llcywgY3VycmVuY3lMYWJlbCksXG4gICAgICB7IHZhbHVlOiAnJywgbGFiZWw6IGBEZWZhdWx0IOKAlCAke2N1cnJlbmN5TGFiZWwodGhpcy5fZGVmYXVsdEN1cnJlbmN5KCkpfWAgfSxcbiAgICAgIC4uLmxvY2FsZXMuY3VycmVuY2llcy5tYXAoKGNvZGUpID0+ICh7IHZhbHVlOiBjb2RlLCBsYWJlbDogY3VycmVuY3lMYWJlbChjb2RlKSB9KSksXG4gICAgXTtcbiAgfSk7XG5cbiAgLy8gSG93IHRoZSByZXBvcnQgd2lsbCB3cml0ZSBhbiBhbW91bnQgYW5kIGEgZGF5IG9uY2Ugc2F2ZWQ6IHRoZSBzZWxlY3RlZFxuICAvLyBsb2NhbGUgYW5kIGN1cnJlbmN5LCBvciB0aGUgZGVmYXVsdHMgdGhleSBmYWxsIGJhY2sgdG8sIGUuZy5cbiAgLy8gJzEgMjM0LDUwICQgwrcgNSBqYW52LiAyMDI2JyBpbiBmci1DQS5cbiAgcHVibGljIHJlYWRvbmx5IGZvcm1hdEV4YW1wbGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlID0gcmVzb2x2ZVJlcG9ydExvY2FsZSh0aGlzLl9hcHBsaWVkTG9jYWxlKCkpO1xuICAgIGNvbnN0IGN1cnJlbmN5ID0gcmVzb2x2ZVJlcG9ydEN1cnJlbmN5KHRoaXMuX2FwcGxpZWRDdXJyZW5jeSgpKTtcblxuICAgIHJldHVybiBbXG4gICAgICBmb3JtYXROdW1iZXIoXG4gICAgICAgIEVYQU1QTEVfQU1PVU5ULFxuICAgICAgICB7IGZvcm1hdDogUmVwb3J0VmFsdWVGb3JtYXQuQ3VycmVuY3ksIHByZWNpc2lvbjogMiB9LFxuICAgICAgICB7IGxvY2FsZSwgY3VycmVuY3ksIHJhdGlvUGVyY2VudDogdHJ1ZSB9LFxuICAgICAgKSxcbiAgICAgIGZvcm1hdExvY2FsRGF0ZShFWEFNUExFX0RBWSwgbG9jYWxlLCBEQVlfU0hPUlQpLFxuICAgIF0uam9pbignIMK3ICcpO1xuICB9KTtcblxuICAvLyBUaGUgcmVwb3J0IGJhciBmaWx0ZXJzIGFuZCB0aGVpciBlZGl0YWJsZSBkZWZhdWx0IHZhbHVlcyAoRmlsdGVycyB0YWIpLlxuICBwdWJsaWMgcmVhZG9ubHkgZmlsdGVyUm93cyA9IHNpZ25hbDxGaWx0ZXJEZWZhdWx0Um93W10+KFtdKTtcbiAgcHVibGljIHJlYWRvbmx5IGZpeGVkRGF0ZXNQZXJpb2QgPSBGSVhFRF9EQVRFU19QRVJJT0Q7XG4gIHB1YmxpYyByZWFkb25seSBib3VuZFNjYWxlID0gREVGQVVMVF9CT1VORF9TQ0FMRTtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVQYXR0ZXJuID0gRklMVEVSX05BTUVfUEFUVEVSTjtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVQYXR0ZXJuTWVzc2FnZSA9IEZJTFRFUl9OQU1FX1BBVFRFUk5fTUVTU0FHRTtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVNYXhMZW5ndGggPSBGSUxURVJfTkFNRV9NQVhfTEVOR1RIO1xuICBwdWJsaWMgcmVhZG9ubHkgbGFiZWxNYXhMZW5ndGggPSBGSUxURVJfTEFCRUxfTUFYX0xFTkdUSDtcbiAgcHVibGljIHJlYWRvbmx5IGxhYmVsSW5wdXRJZCA9IGxhYmVsSW5wdXRJZDtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVJbnB1dElkID0gbmFtZUlucHV0SWQ7XG5cbiAgLy8gVGhlIERlZmF1bHQgbWluaW11bSBhbmQgRGVmYXVsdCBtYXhpbXVtIGNoZWNrcywgdGhyb3VnaCBmc0Zvcm0uIEVhY2ggZmllbGRcbiAgLy8gZ2V0cyB0aGUgb3RoZXIgZW5kIGFzIGl0cyB2YWxpZGF0ZURhdGEsIHNvIHR5cGluZyBpbiBvbmUgY2hlY2tzIHRoZSBwYWlyXG4gIC8vIGFnYWluOyBib3VuZHNFcnJvciB3b3JkcyB0aGUgcmVmdXNhbCBhcyB0aGUgc2VydmVyIGRvZXMuXG4gIHB1YmxpYyByZWFkb25seSBtaW5Cb3VuZFZhbGlkYXRvciA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIG1heDogdW5rbm93bik6IHZvaWQgPT4ge1xuICAgIHRoaXMuX3Rocm93Qm91bmRzRXJyb3IoY29udHJvbC52YWx1ZSwgbWF4KTtcbiAgfTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbWF4Qm91bmRWYWxpZGF0b3IgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBtaW46IHVua25vd24pOiB2b2lkID0+IHtcbiAgICB0aGlzLl90aHJvd0JvdW5kc0Vycm9yKG1pbiwgY29udHJvbC52YWx1ZSk7XG4gIH07XG5cbiAgLy8gVGhlIHNlcnZlcidzIHJlZnVzYWwgb2YgYSBMYWJlbCBvciBOYW1lLCB0aHJvdWdoIGZzRm9ybS4gVGhlIHNoYXBlIGFuZFxuICAvLyBsZW5ndGggYXJlIGNoZWNrZWQgb24gdGhlIGZpZWxkIChmc0Zvcm1QYXR0ZXJuLCBmc0Zvcm1NYXhMZW5ndGgpLCBidXQgb25seVxuICAvLyB0aGUgc2VydmVyIGtub3dzIHRoZSByZXBvcnQncyBvdGhlciBuYW1lcywgc28gdGhlIGZpZWxkIHNob3dzIHRoZVxuICAvLyBzZXJ2ZXIncyBvd24gd29yZHMgd2hpbGUgaXQgc3RpbGwgaG9sZHMgdGhlIHJlZnVzZWQgdmFsdWUuIEEgbmV3IHJlZnVzYWxcbiAgLy8gYXJyaXZlcyBhcyB0aGUgZmllbGQncyB2YWxpZGF0ZURhdGEsIHdoaWNoIGNoZWNrcyB0aGUgZmllbGQgYWdhaW4uXG4gIHB1YmxpYyByZWFkb25seSByZWZ1c2FsVmFsaWRhdG9yID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgcmVmdXNhbDogRmlsdGVyRmllbGRSZWZ1c2FsIHwgbnVsbCk6IHZvaWQgPT4ge1xuICAgIGlmIChyZWZ1c2FsICYmIFN0cmluZyhjb250cm9sLnZhbHVlID8/ICcnKS50cmltKCkgPT09IHJlZnVzYWwudmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihyZWZ1c2FsLm1lc3NhZ2UpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kYXRhOiB7IHJlcG9ydDogUmVwb3J0IH0gPSBpbmplY3QoTUFUX0RJQUxPR19EQVRBKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGlhbG9nUmVmID0gaW5qZWN0PE1hdERpYWxvZ1JlZjxSZXBvcnRTZXR0aW5nc0NvbXBvbmVudCwgUmVwb3J0U2V0dGluZ3NSZXN1bHQ+PihNYXREaWFsb2dSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Byb21wdCA9IGluamVjdChGc1Byb21wdCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Byb2Nlc3MgPSBpbmplY3QoRnNQcm9jZXNzKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XG4gIC8vIFRoZSBpZCBvZiB0aGUgTGFiZWwgb3IgTmFtZSBpbnB1dCB0aGUgc2VydmVyIGxhc3QgcmVmdXNlZCwgZm9jdXNlZCBvbmNlXG4gIC8vIGl0IGlzIG9uIHNjcmVlbiAoc2VlIGZvY3VzUmVmdXNhbCkuXG4gIHByaXZhdGUgX3JlZnVzZWRJbnB1dElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLy8gT25seSBhIHNlcnZlciB0aGF0IHJlc29sdmVzIGEgcmVwb3J0J3MgbG9jYWxlIG9mZmVycyB0aGUgbG9jYWxlIGxpc3QuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlcnZlckhhc0xvY2FsZSA9IHRoaXMuX2RhdGEucmVwb3J0LmVmZmVjdGl2ZUxvY2FsZSAhPT0gdW5kZWZpbmVkO1xuICAvLyBUcnVlIG9uY2UgdGhlIGxvY2FsZSByZXF1ZXN0IGhhcyBhbnN3ZXJlZCwgd2l0aCB0aGUgbGlzdCBvciBhbiBlcnJvci5cbiAgcHJpdmF0ZSByZWFkb25seSBfbG9jYWxlc1NldHRsZWQgPSBzaWduYWwoZmFsc2UpO1xuICAvLyBUcnVlIG9uY2UgdGhlIGZpbHRlciByb3dzIGFyZSBwdWJsaXNoZWQgKHNlZSBfYnVpbGRGaWx0ZXJSb3dzKS5cbiAgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVyc1JlYWR5ID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBUaGUgbG9jYWxlIHRoZSByZXBvcnQgd291bGQgYmUgd3JpdHRlbiBpbjogdGhlIHNlbGVjdGVkIG9uZSB3aGVuIHRoZVxuICAvLyBzZXJ2ZXIgb2ZmZXJzIGl0LCBlbHNlIHRoZSBkZWZhdWx0IChhIHN0b3JlZCBsb2NhbGUgaXQgbm8gbG9uZ2VyIG9mZmVyc1xuICAvLyBmYWxscyBiYWNrIHRvIHRoZSBkZWZhdWx0LCBhcyBpdCBkb2VzIG9uIHRoZSBzZXJ2ZXIpLlxuICBwcml2YXRlIHJlYWRvbmx5IF9hcHBsaWVkTG9jYWxlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGxvY2FsZXMgPSB0aGlzLmxvY2FsZXMoKTtcbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLmxvY2FsZSgpO1xuXG4gICAgcmV0dXJuIGxvY2FsZXM/Lm9wdGlvbnMuc29tZSgob3B0aW9uKSA9PiBvcHRpb24ubG9jYWxlID09PSBsb2NhbGUpXG4gICAgICA/IGxvY2FsZVxuICAgICAgOiBsb2NhbGVzPy5kZWZhdWx0TG9jYWxlID8/ICcnO1xuICB9KTtcblxuICAvLyBUaGUgY3VycmVuY3kgYSByZXBvcnQgaW4gdGhlIGFwcGxpZWQgbG9jYWxlIHVzZXMgd2hlbiBpdCBuYW1lcyBub25lLlxuICBwcml2YXRlIHJlYWRvbmx5IF9kZWZhdWx0Q3VycmVuY3kgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5fYXBwbGllZExvY2FsZSgpO1xuXG4gICAgcmV0dXJuIHRoaXMubG9jYWxlcygpPy5vcHRpb25zLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLmxvY2FsZSA9PT0gbG9jYWxlKT8uZGVmYXVsdEN1cnJlbmN5XG4gICAgICA/PyBSRVBPUlRfRkFMTEJBQ0tfQ1VSUkVOQ1k7XG4gIH0pO1xuXG4gIC8vIFRoZSBjdXJyZW5jeSB0aGUgcmVwb3J0IHdvdWxkIGxhYmVsIG1vbmV5IGluOiB0aGUgc2VsZWN0ZWQgb25lIHdoZW4gdGhlXG4gIC8vIHNlcnZlciBvZmZlcnMgaXQsIGVsc2UgdGhlIGRlZmF1bHQuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FwcGxpZWRDdXJyZW5jeSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjdXJyZW5jeSA9IHRoaXMuY3VycmVuY3koKTtcblxuICAgIHJldHVybiB0aGlzLmxvY2FsZXMoKT8uY3VycmVuY2llcy5pbmNsdWRlcyhjdXJyZW5jeSlcbiAgICAgID8gY3VycmVuY3lcbiAgICAgIDogdGhpcy5fZGVmYXVsdEN1cnJlbmN5KCk7XG4gIH0pO1xuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLl9kYXRhLnJlcG9ydDtcbiAgICB0aGlzLm5hbWUgPSByZXBvcnQubmFtZTtcbiAgICB0aGlzLnBhZ2VXaWR0aCA9IHJlcG9ydC5wYWdlV2lkdGg7XG4gICAgdGhpcy5wYWdlSGVpZ2h0ID0gcmVwb3J0LnBhZ2VIZWlnaHQ7XG4gICAgdGhpcy5oZWFkZXJIZWlnaHQgPSByZXBvcnQuY29uZmlnPy5oZWFkZXJGb290ZXI/LmhlYWRlckhlaWdodCA/PyAwO1xuICAgIHRoaXMuZm9vdGVySGVpZ2h0ID0gcmVwb3J0LmNvbmZpZz8uaGVhZGVyRm9vdGVyPy5mb290ZXJIZWlnaHQgPz8gMDtcbiAgICB0aGlzLnRpbWV6b25lID0gcmVwb3J0LnRpbWV6b25lID8/IHJlcG9ydC5lZmZlY3RpdmVUaW1lem9uZSA/PyAnJztcbiAgICB0aGlzLmhlYWRpbmdTaXplID0gcmVwb3J0LmNvbmZpZz8uc3R5bGVzPy5oZWFkaW5nPy5zaXplID8/IERFRkFVTFRfSEVBRElOR19TSVpFO1xuICAgIHRoaXMubG9jYWxlLnNldChyZXBvcnQubG9jYWxlID8/ICcnKTtcbiAgICB0aGlzLmN1cnJlbmN5LnNldChyZXBvcnQuY3VycmVuY3kgPz8gJycpO1xuXG4gICAgdGhpcy5fYnVpbGRGaWx0ZXJSb3dzKHJlcG9ydCk7XG5cbiAgICBpZiAodGhpcy5fc2VydmVySGFzTG9jYWxlKSB7XG4gICAgICB0aGlzLl9yZXBvcnREYXRhLmxvY2FsZXMoKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKGxvY2FsZXMpID0+IHRoaXMubG9jYWxlcy5zZXQobG9jYWxlcykpLFxuICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpLFxuICAgICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMuX2xvY2FsZXNTZXR0bGVkLnNldCh0cnVlKSksXG4gICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICAvLyBBIGNoYW5nZSB0byBhIHJvdydzIExhYmVsLCBOYW1lLCBEZWZhdWx0IHBlcmlvZCwgZXhjbHVkZSB0b2dnbGUgb3IgcmFuZ2UgZW5kcy4gQSBuZXdcbiAgLy8gcm93IG9iamVjdCByYXRoZXIgdGhhbiBhIG11dGF0aW9uLCBzbyB0aGUgc2lnbmFsIHNlZXMgdGhlIGNoYW5nZTsgdGhlXG4gIC8vIEBmb3IgdHJhY2tzIGdyb3VwLmlkLCBzbyB0aGUgcm93J3MgY29udHJvbHMgc3Vydml2ZSB0aGUgc3dhcC5cbiAgcHVibGljIHBhdGNoUm93KHJvdzogRmlsdGVyRGVmYXVsdFJvdywgcGF0Y2g6IFBhcnRpYWw8RmlsdGVyRGVmYXVsdFJvdz4pOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlclJvd3MudXBkYXRlKChyb3dzKSA9PiByb3dzXG4gICAgICAubWFwKChpdGVtKSA9PiAoaXRlbS5ncm91cC5pZCA9PT0gcm93Lmdyb3VwLmlkID8geyAuLi5pdGVtLCAuLi5wYXRjaCB9IDogaXRlbSkpKTtcbiAgfVxuXG4gIC8vIEZvY3VzZXMgdGhlIExhYmVsIG9yIE5hbWUgaW5wdXQgdGhlIHNlcnZlciByZWZ1c2VkLCBvbmNlIGl0IGlzIG9uXG4gIC8vIHNjcmVlbjogc3RyYWlnaHQgYWZ0ZXIgdGhlIHJlZnVzYWwgd2hlbiB0aGUgRmlsdGVycyB0YWIgaXMgc2hvd2luZywgZWxzZVxuICAvLyB3aGVuIHRoZSB0YWIgZ3JvdXAgaGFzIGJyb3VnaHQgaXQgZm9yd2FyZC5cbiAgcHVibGljIGZvY3VzUmVmdXNhbCgpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuX3JlZnVzZWRJbnB1dElkID8gdGhpcy5fZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5fcmVmdXNlZElucHV0SWQpIDogbnVsbDtcblxuICAgIGlmIChpbnB1dCkge1xuICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgIHRoaXMuX3JlZnVzZWRJbnB1dElkID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgcmVwb3J0IGFzIGEgcGFja2FnZSAoLnJlcG9ydC56aXApIHRoYXQgYW5vdGhlciBzZXJ2ZXIgaW1wb3J0cyBhcyBhXG4gIC8vIG5ldyByZXBvcnQuIFRoZSBmaWxlIGlzIHdyaXR0ZW4gc2VydmVyLXNpZGUgYW5kIGRvd25sb2FkcyB0aHJvdWdoIHRoZVxuICAvLyBGc1Byb2Nlc3MgZG9jaywgc28gdGhlIGRpYWxvZyBzdGF5cyBvcGVuLlxuICBwdWJsaWMgZXhwb3J0UGFja2FnZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9wcm9jZXNzLmRvd25sb2FkKFxuICAgICAgJ0V4cG9ydGluZyByZXBvcnQgcGFja2FnZScsXG4gICAgICB0aGlzLl9yZXBvcnREYXRhLmV4cG9ydFBhY2thZ2UodGhpcy5fZGF0YS5yZXBvcnQuaWQpLFxuICAgICk7XG4gIH1cblxuICAvLyBDb25maXJtIGFuZCBkZWxldGUgaGVyZSwgd2hpbGUgdGhlIGRpYWxvZyBpcyBzdGlsbCBvcGVuLCB0aGVuIGNsb3NlIHdpdGhcbiAgLy8gYSBgZGVsZXRlZGAgcmVzdWx0LiBUaGUgcGFnZSByZWFjdHMgdG8gdGhlIHJlc3VsdDsgaXQgbm8gbG9uZ2VyIG93bnMgdGhlXG4gIC8vIHByb21wdCBvciB0aGUgQVBJIGNhbGwuXG4gIHB1YmxpYyBkZWxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5fcHJvbXB0LmNvbmZpcm0oe1xuICAgICAgdGl0bGU6ICdEZWxldGUgUmVwb3J0JyxcbiAgICAgIHRlbXBsYXRlOiBgRGVsZXRlIFwiJHt0aGlzLl9kYXRhLnJlcG9ydC5uYW1lfVwiPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLl9yZXBvcnREYXRhLmRlbGV0ZSh0aGlzLl9kYXRhLnJlcG9ydC5pZCkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdSZXBvcnQgZGVsZXRlZCcpO1xuICAgICAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2UoeyBhY3Rpb246ICdkZWxldGVkJyB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNhdmUgPSAoKSA9PiB7XG4gICAgY29uc3QgcmVwb3J0SWQgPSB0aGlzLl9kYXRhLnJlcG9ydC5pZDtcblxuICAgIC8vIE9uZSBTYXZlIGNvdmVycyBhbGwgdGhyZWUgdGFicy4gVGhlIHJlcG9ydCByZWxvYWRzIG9uIHRoZSBgc2F2ZWRgXG4gICAgLy8gcmVzdWx0LCByZS1zZWVkaW5nIHRoZSBiYXIgZnJvbSB0aGUgbmV3IGRlZmF1bHRzLlxuICAgIGNvbnN0IHNldHRpbmdzID0ge1xuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgcGFnZVdpZHRoOiB0aGlzLl9wYWdlRGltZW5zaW9uKHRoaXMucGFnZVdpZHRoKSxcbiAgICAgIHBhZ2VIZWlnaHQ6IHRoaXMuX3BhZ2VEaW1lbnNpb24odGhpcy5wYWdlSGVpZ2h0KSxcbiAgICAgIC4uLnRoaXMuX3RpbWV6b25lU2V0dGluZygpLFxuICAgICAgLi4ucmVwb3J0TG9jYWxlUGF0Y2godGhpcy5fZGF0YS5yZXBvcnQsIHRoaXMubG9jYWxlKCksIHRoaXMuY3VycmVuY3koKSksXG4gICAgICBzdHlsZXM6IHsgaGVhZGluZzogeyBzaXplOiB0aGlzLmhlYWRpbmdTaXplIH0gfSxcbiAgICAgIGhlYWRlckZvb3Rlcjoge1xuICAgICAgICBoZWFkZXJIZWlnaHQ6IHRoaXMuX3BhZ2VEaW1lbnNpb24odGhpcy5oZWFkZXJIZWlnaHQpIHx8IDAsXG4gICAgICAgIGZvb3RlckhlaWdodDogdGhpcy5fcGFnZURpbWVuc2lvbih0aGlzLmZvb3RlckhlaWdodCkgfHwgMCxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIE9uZSBncm91cCB1cGRhdGUgcGVyIGNoYW5nZWQgZmlsdGVyLCBjYXJyeWluZyBvbmx5IHdoYXQgY2hhbmdlZDogaXRzXG4gICAgLy8gbGFiZWwsIG5hbWUgYW5kIGRlZmF1bHQgYWxsIGxpdmUgaW4gdGhlIGdyb3VwJ3MgY29uZmlnLCBzbyB0d28gcmVxdWVzdHNcbiAgICAvLyBmb3Igb25lIGdyb3VwIHdvdWxkIGVhY2ggd3JpdGUgdGhlIGNvbmZpZyBvdmVyIHRoZSBvdGhlci5cbiAgICBjb25zdCBzYXZlcyA9IHRoaXMuZmlsdGVyUm93cygpXG4gICAgICAubWFwKChyb3cpID0+ICh7IHJvdywgY2hhbmdlczogdGhpcy5fZ3JvdXBDaGFuZ2VzKHJvdykgfSkpXG4gICAgICAuZmlsdGVyKChzYXZlKSA9PiBPYmplY3Qua2V5cyhzYXZlLmNoYW5nZXMpLmxlbmd0aCA+IDApO1xuXG4gICAgLy8gQSBsYWJlbCBvciBuYW1lIGNhbiBiZSByZWZ1c2VkLCBzbyB0aG9zZSB1cGRhdGVzIGdvIGZpcnN0LCBvbmUgYWZ0ZXJcbiAgICAvLyBhbm90aGVyLCBhbmQgYSByZWZ1c2FsIHN0b3BzIHRoZSBzYXZlIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIHdyaXR0ZW46XG4gICAgLy8gdGhlIHJlcG9ydCBzZXR0aW5ncyBhbmQgdGhlIG90aGVyIGRlZmF1bHRzIHdhaXQgdW50aWwgZXZlcnkgbmFtZSBpc1xuICAgIC8vIHRha2VuLiBJbiBzZXF1ZW5jZSwgdHdvIHJlbmFtZXMgaW4gb25lIHNhdmUgYXJlIGNoZWNrZWQgYWdhaW5zdCBlYWNoXG4gICAgLy8gb3RoZXIsIGFuZCBhIHJlbmFtZSBvbnRvIGEgbmFtZSBhbm90aGVyIGZpbHRlciBpcyBnaXZpbmcgdXAgZ29lcyBhZnRlclxuICAgIC8vIGl0LiBUaGUgc2VydmVyIGFwcGxpZXMgbmFtZSBiZWZvcmUgZGVmYXVsdCwgc28gYSByZWZ1c2VkIG5hbWUgbGVhdmVzXG4gICAgLy8gdGhhdCBmaWx0ZXIncyBkZWZhdWx0IHVud3JpdHRlbiB0b28uXG4gICAgY29uc3QgbmFtZWQgPSB0aGlzLl9yZW5hbWVPcmRlcihzYXZlcy5maWx0ZXIoKHNhdmUpID0+IHRoaXMuX25hbWVzT3JMYWJlbHMoc2F2ZS5jaGFuZ2VzKSkpO1xuICAgIGNvbnN0IGRlZmF1bHRzID0gc2F2ZXMuZmlsdGVyKChzYXZlKSA9PiAhdGhpcy5fbmFtZXNPckxhYmVscyhzYXZlLmNoYW5nZXMpKTtcblxuICAgIHJldHVybiBmcm9tKG5hbWVkKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGNvbmNhdE1hcCgoc2F2ZSkgPT4gdGhpcy5fc2F2ZU5hbWVkKHJlcG9ydElkLCBzYXZlKSksXG4gICAgICAgIHRvQXJyYXkoKSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IGZvcmtKb2luKFtcbiAgICAgICAgICB0aGlzLl9yZXBvcnREYXRhLnVwZGF0ZShyZXBvcnRJZCwgc2V0dGluZ3MpLFxuICAgICAgICAgIC4uLmRlZmF1bHRzLm1hcCgoc2F2ZSkgPT4gdGhpcy5fcmVwb3J0RGF0YS51cGRhdGVGaWx0ZXJHcm91cChyZXBvcnRJZCwgc2F2ZS5yb3cuZ3JvdXAuaWQsIHNhdmUuY2hhbmdlcykpLFxuICAgICAgICBdLm1hcCgocmVxdWVzdCQpID0+IHJlcXVlc3QkLnBpcGUodGFwKCgpID0+IHRoaXMud3JvdGUuc2V0KHRydWUpKSkpKSksXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdSZXBvcnQgc2V0dGluZ3Mgc2F2ZWQnKTtcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2UoeyBhY3Rpb246ICdzYXZlZCcgfSk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfTtcblxuICAvLyBUaGUgcGFnZSBkaW1lbnNpb24gYXMgYSByZWFsIG51bWJlciBmb3IgdGhlIHdpcmUuIGZzTWFza051bWJlciBoYW5kcyBiYWNrXG4gIC8vIHRoZSB1bm1hc2tlZCBzdHJpbmcgaXQgYnVpbHQgd2l0aCBhIGZpeGVkICcuJyByYWRpeCAod2hpY2ggaXMgdGhlIHdob2xlXG4gIC8vIHBvaW50IG9mIHRoZSBtYXNrIC0gYSBuYXRpdmUgbnVtYmVyIGlucHV0IHBhaW50cyB0aGUgdmlld2VyJ3MgbG9jYWxlXG4gIC8vIHNlcGFyYXRvciBpbnN0ZWFkKSwgc28gdGhlIGNhc3QgaGVyZSBpcyBhIHN0cmFpZ2h0IHBhcnNlIGFuZCBuZXZlciBzZWVzIGFcbiAgLy8gY29tbWEuIFRoZSBiYWNrZW5kIHJlamVjdHMgYW55dGhpbmcgbm9uLW51bWVyaWMgcmF0aGVyIHRoYW4gY29lcmNpbmcsIHNvIGFcbiAgLy8gTmFOIGZhaWxzIGxvdWRseSBpbnN0ZWFkIG9mIHNpbGVudGx5IHN0b3JpbmcgYSB3cm9uZyBwYWdlIHNpemUuXG4gIHByaXZhdGUgX3BhZ2VEaW1lbnNpb24odmFsdWU6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IHBhcnNlRmxvYXQodmFsdWUpO1xuICB9XG5cbiAgLy8gVGhlIHpvbmUgZm9yIHRoZSBzZXR0aW5ncyBQVVQsIHNlbnQgb25seSB3aGVuIGl0IG1vdmVzIHRoZSByZXBvcnQgb2ZmIHRoZVxuICAvLyB6b25lIGl0IGFscmVhZHkgdXNlcywgc28gYW4gdW50b3VjaGVkIGRpYWxvZyBuZXZlciBwaW5zIGEgcmVwb3J0IHRoYXRcbiAgLy8gZm9sbG93cyB0aGUgYXBwbGljYXRpb24gZGVmYXVsdC4gQSBzZXJ2ZXIgdG9vIG9sZCB0byBzZW5kXG4gIC8vIGVmZmVjdGl2ZVRpbWV6b25lIGdldHMgdGhlIHpvbmUgZXZlcnkgdGltZSwgYXMgaXQgYWx3YXlzIGRpZC5cbiAgcHJpdmF0ZSBfdGltZXpvbmVTZXR0aW5nKCk6IHsgdGltZXpvbmU/OiBzdHJpbmcgfSB7XG4gICAgY29uc3QgZWZmZWN0aXZlVGltZXpvbmUgPSB0aGlzLl9kYXRhLnJlcG9ydC5lZmZlY3RpdmVUaW1lem9uZTtcblxuICAgIHJldHVybiBlZmZlY3RpdmVUaW1lem9uZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudGltZXpvbmUgIT09IGVmZmVjdGl2ZVRpbWV6b25lXG4gICAgICA/IHsgdGltZXpvbmU6IHRoaXMudGltZXpvbmUgfVxuICAgICAgOiB7fTtcbiAgfVxuXG4gIC8vIFRoZSBzdG9yZWQgdmFsdWUgYXMgaXRzIG93biBvcHRpb24gd2hlbiB0aGUgc2VydmVyIG5vIGxvbmdlciBvZmZlcnMgaXQsIHNvXG4gIC8vIHRoZSBzZWxlY3QgbmFtZXMgaXQgaW5zdGVhZCBvZiBzaG93aW5nIGJsYW5rLiBMZWZ0IGFzIGl0IGlzLCBpdCBpcyBuZXZlclxuICAvLyBzZW50IChzZWUgcmVwb3J0TG9jYWxlUGF0Y2gpLCBhbmQgdGhlIHJlcG9ydCByZWFkcyB0aGUgZGVmYXVsdCBtZWFud2hpbGUuXG4gIHByaXZhdGUgX3N0b3JlZE9wdGlvbihcbiAgICBzdG9yZWQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgb2ZmZXJlZDogc3RyaW5nW10sXG4gICAgbGFiZWw6ICh2YWx1ZTogc3RyaW5nKSA9PiBzdHJpbmcsXG4gICk6IExvY2FsZVNlbGVjdE9wdGlvbltdIHtcbiAgICByZXR1cm4gc3RvcmVkICYmICFvZmZlcmVkLmluY2x1ZGVzKHN0b3JlZCkgPyBbeyB2YWx1ZTogc3RvcmVkLCBsYWJlbDogbGFiZWwoc3RvcmVkKSB9XSA6IFtdO1xuICB9XG5cbiAgLy8gV2hhdCBhIHNhdmUgY2hhbmdlcyBvbiBhIHJvdydzIGdyb3VwOiB0aGUgbGFiZWwsIG5hbWUgYW5kIGRlZmF1bHQsIGVhY2hcbiAgLy8gb25seSB3aGVuIHRoZSBvcGVyYXRvciBjaGFuZ2VkIGl0LiBMYWJlbCBhbmQgbmFtZSBhcmUgc2VudCBvbmx5IHRvIGFcbiAgLy8gc2VydmVyIHRoYXQgc2VudCBhIG5hbWUsIGFuZCBuZXZlciBvbmUgZnJvbSB0aGUgb3RoZXIuXG4gIHByaXZhdGUgX2dyb3VwQ2hhbmdlcyhyb3c6IEZpbHRlckRlZmF1bHRSb3cpOiBSZXBvcnRGaWx0ZXJHcm91cENoYW5nZXMge1xuICAgIGNvbnN0IGNoYW5nZXM6IFJlcG9ydEZpbHRlckdyb3VwQ2hhbmdlcyA9IHt9O1xuXG4gICAgaWYgKHJvdy5zaG93TmFtZSkge1xuICAgICAgY29uc3QgbGFiZWwgPSByb3cubGFiZWwudHJpbSgpO1xuICAgICAgaWYgKGxhYmVsICE9PSAocm93Lmdyb3VwLmxhYmVsID8/ICcnKSkge1xuICAgICAgICBjaGFuZ2VzLmxhYmVsID0gbGFiZWw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5hbWUgPSByb3cubmFtZS50cmltKCk7XG4gICAgICBpZiAobmFtZSAhPT0gcm93Lmdyb3VwLm5hbWUpIHtcbiAgICAgICAgY2hhbmdlcy5uYW1lID0gbmFtZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByb3dEZWZhdWx0ID0gdGhpcy5fcm93RGVmYXVsdChyb3cpO1xuICAgIGlmIChkZWZhdWx0Q2hhbmdlZChyb3cuZ3JvdXAuY29uZmlnPy5kZWZhdWx0LCByb3dEZWZhdWx0KSkge1xuICAgICAgY2hhbmdlcy5kZWZhdWx0ID0gcm93RGVmYXVsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxuXG4gIHByaXZhdGUgX25hbWVzT3JMYWJlbHMoY2hhbmdlczogUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNoYW5nZXMubmFtZSAhPT0gdW5kZWZpbmVkIHx8IGNoYW5nZXMubGFiZWwgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIFRoZSB1cGRhdGVzIGluIHRoZSBvcmRlciB0aGV5IGFyZSBzZW50OiBhIHJlbmFtZSBvbnRvIGEgbmFtZSBhbm90aGVyXG4gIC8vIGZpbHRlciBob2xkcyBnb2VzIGFmdGVyIHRoZSBvdGhlcnMsIHNvIGEgZmlsdGVyIGdpdmluZyB0aGF0IG5hbWUgdXAgaW5cbiAgLy8gdGhlIHNhbWUgc2F2ZSBoYXMgZG9uZSBzbyBmaXJzdC5cbiAgcHJpdmF0ZSBfcmVuYW1lT3JkZXIoc2F2ZXM6IEZpbHRlckdyb3VwU2F2ZVtdKTogRmlsdGVyR3JvdXBTYXZlW10ge1xuICAgIGNvbnN0IGhlbGQgPSAoc2F2ZTogRmlsdGVyR3JvdXBTYXZlKTogYm9vbGVhbiA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2F2ZS5jaGFuZ2VzLm5hbWU/LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIHJldHVybiBuYW1lICE9PSB1bmRlZmluZWQgJiYgdGhpcy5maWx0ZXJSb3dzKClcbiAgICAgICAgLnNvbWUoKHJvdykgPT4gcm93Lmdyb3VwLmlkICE9PSBzYXZlLnJvdy5ncm91cC5pZCAmJiByb3cuZ3JvdXAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gbmFtZSk7XG4gICAgfTtcblxuICAgIHJldHVybiBbLi4uc2F2ZXNdLnNvcnQoKGEsIGIpID0+IE51bWJlcihoZWxkKGEpKSAtIE51bWJlcihoZWxkKGIpKSk7XG4gIH1cblxuICAvLyBTYXZlcyBhIGZpbHRlcidzIHVwZGF0ZSB0aGF0IGNhcnJpZXMgYSBsYWJlbCBvciBuYW1lLiBBIHJlZnVzYWwgaXMgdGhlXG4gIC8vIHNlcnZlcidzIHRvIHdvcmQgKCdOYW1lIFwicmVnaW9uXCIgaXMgYWxyZWFkeSB1c2VkIGJ5IHRoZSBmaWx0ZXJcbiAgLy8gXCJBcmVhXCIuJyksIHNvIGl0IHNob3dzIG9uIHRoZSBmaWVsZCByYXRoZXIgdGhhbiBpbiBhIGRpYWxvZywgYW5kIHRoZSBzYXZlXG4gIC8vIGZhaWxzLiBXaGF0IHdhcyBzYXZlZCBiZWNvbWVzIHRoZSByb3cncyBzdG9yZWQgZ3JvdXAsIHNvIGEgbGF0ZXIgc2F2ZVxuICAvLyBkb2VzIG5vdCBzZW5kIGl0IGFnYWluLlxuICBwcml2YXRlIF9zYXZlTmFtZWQocmVwb3J0SWQ6IG51bWJlciwgc2F2ZTogRmlsdGVyR3JvdXBTYXZlKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgY29uc3QgeyByb3csIGNoYW5nZXMgfSA9IHNhdmU7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS51cGRhdGVGaWx0ZXJHcm91cChcbiAgICAgIHJlcG9ydElkLFxuICAgICAgcm93Lmdyb3VwLmlkLFxuICAgICAgY2hhbmdlcyxcbiAgICAgIHsgY29udGV4dDogbmV3IEh0dHBDb250ZXh0KCkuc2V0KERpc3BsYXlBcGlFcnJvciwgZmFsc2UpIH0sXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy53cm90ZS5zZXQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5wYXRjaFJvdyhyb3csIHsgZ3JvdXA6IHN0b3JlZEdyb3VwKHJvdy5ncm91cCwgY2hhbmdlcykgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgIHRoaXMuX3Nob3dSZWZ1c2FsKHJvdywgY2hhbmdlcywgYXBpRXJyb3JNZXNzYWdlKGVycm9yLCAnVGhlIGZpbHRlciBjb3VsZCBub3QgYmUgc2F2ZWQuJykpO1xuXG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBTaG93cyBhIHJlZnVzYWwgb24gdGhlIGZpZWxkIGl0IGlzIGFib3V0ICh0aGUgbmFtZSwgd2hpY2ggdGhlIHNlcnZlclxuICAvLyBjaGVja3MgZmlyc3QsIGVsc2UgdGhlIGxhYmVsKSwgYnJpbmdzIHRoZSBGaWx0ZXJzIHRhYiBmb3J3YXJkIGFuZFxuICAvLyBmb2N1c2VzIHRoZSBmaWVsZCwgc28gYSBzYXZlIG1hZGUgZnJvbSBhbm90aGVyIHRhYiBzYXlzIHdoeSBpdCBmYWlsZWQuXG4gIHByaXZhdGUgX3Nob3dSZWZ1c2FsKHJvdzogRmlsdGVyRGVmYXVsdFJvdywgY2hhbmdlczogUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucGF0Y2hSb3cocm93LCB7IG5hbWVSZWZ1c2FsOiB7IHZhbHVlOiBjaGFuZ2VzLm5hbWUsIG1lc3NhZ2UgfSB9KTtcbiAgICAgIHRoaXMuX3JlZnVzZWRJbnB1dElkID0gbmFtZUlucHV0SWQocm93Lmdyb3VwLmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXRjaFJvdyhyb3csIHsgbGFiZWxSZWZ1c2FsOiB7IHZhbHVlOiBjaGFuZ2VzLmxhYmVsID8/ICcnLCBtZXNzYWdlIH0gfSk7XG4gICAgICB0aGlzLl9yZWZ1c2VkSW5wdXRJZCA9IGxhYmVsSW5wdXRJZChyb3cuZ3JvdXAuaWQpO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRUYWIuc2V0KCdmaWx0ZXJzJyk7XG4gICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHRoaXMuZm9jdXNSZWZ1c2FsKCksIHsgaW5qZWN0b3I6IHRoaXMuX2luamVjdG9yIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfdGhyb3dCb3VuZHNFcnJvcihtaW46IHVua25vd24sIG1heDogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGVycm9yID0gYm91bmRzRXJyb3IocGFyc2VEZWZhdWx0Qm91bmQobWluKSwgcGFyc2VEZWZhdWx0Qm91bmQobWF4KSk7XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLy8gQnVpbGQgb25lIGVkaXRhYmxlIHJvdyBwZXIgcmVwb3J0IGJhciBmaWx0ZXIgZ3JvdXAgKGV2ZXJ5IHBhZ2Ugb3Igb25lXG4gIC8vIHBhZ2UpLCBpbiBiYXIgb3JkZXIsIHNlZWRpbmcgZWFjaCBkcmFmdCBmcm9tIHRoZSBncm91cCdzIHN0b3JlZCBkZWZhdWx0LlxuICBwcml2YXRlIF9idWlsZEZpbHRlclJvd3MocmVwb3J0OiBSZXBvcnQpOiB2b2lkIHtcbiAgICBjb25zdCBidWlsdCA9IGRlZmF1bHRSb3dHcm91cHMocmVwb3J0LmZpbHRlckdyb3VwcylcbiAgICAgIC5tYXAoKGdyb3VwKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwRGVmYXVsdCA9IGdyb3VwLmNvbmZpZz8uZGVmYXVsdDtcbiAgICAgICAgLy8gT25lIHNoYXJlZCwgcmVwbGF5ZWQgb3B0aW9uIHN0cmVhbSBwZXIgZ3JvdXA6IHRoZSBjaGlwcyBmZXRjaCBhbmQgdGhlXG4gICAgICAgIC8vIHN0b3JlZCBkZWZhdWx0J3MgbGFiZWxzIHJlYWQgdGhlIHNhbWUgbGlzdCwgc28gaXQgaXMgZmV0Y2hlZCBvbmNlLlxuICAgICAgICBjb25zdCBvcHRpb25zJCA9IGxvYWRHcm91cE9wdGlvbnMoZ3JvdXAsIHRoaXMuX3JlcG9ydERhdGEsIHJlcG9ydC5pZCk7XG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuX2ZpbHRlclJvdyhyZXBvcnQsIGdyb3VwLCBvcHRpb25zJCk7XG5cbiAgICAgICAgcmV0dXJuIHsgcm93LCBvcHRpb25zJCwgdmFsdWVzOiBncm91cERlZmF1bHQ/LnZhbHVlcyA/PyBncm91cERlZmF1bHQ/LmV4Y2x1ZGVWYWx1ZXMgPz8gW10gfTtcbiAgICAgIH0pO1xuXG4gICAgY29uc3Qgcm93cyA9IGJ1aWx0Lm1hcCgoZW50cnkpID0+IGVudHJ5LnJvdyk7XG4gICAgY29uc3Qgc2VlZGVkID0gYnVpbHQuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkudmFsdWVzLmxlbmd0aCk7XG5cbiAgICAvLyBOb3RoaW5nIHRvIG5hbWUg4oCUIHB1Ymxpc2ggaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gd2FpdGluZyBvbiBhIHJlcXVlc3RcbiAgICAvLyBubyByb3cgbmVlZHMuXG4gICAgaWYgKCFzZWVkZWQubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9wdWJsaXNoRmlsdGVyUm93cyhyb3dzKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEEgc3RvcmVkIHNlbGVjdCBkZWZhdWx0IGhvbGRzIGlkcywgc28gaXRzIGNoaXBzIGNhbiBvbmx5IGJlIG5hbWVkIG9uY2UgdGhlXG4gICAgLy8gb3B0aW9uIGxpc3QgaXMgaW4uIFJlc29sdmUgZXZlcnkgc2VlZGVkIHJvdyBmaXJzdCBhbmQgcHVibGlzaCB0aGUgcm93cyBpblxuICAgIC8vIG9uZSBnbywgc28gdGhlIHRhYiBuZXZlciByZW5kZXJzIGEgY2hpcCBzaG93aW5nIGEgcmF3IGlkLiBXaGVuIGFuIG9wdGlvblxuICAgIC8vIGxpc3QgZmFpbHMgdG8gbG9hZCwgdGhlIHJvd3MgcHVibGlzaCB1bnJlc29sdmVkOiBlYWNoIGNoaXAgbmFtZXMgaXRzIGlkLFxuICAgIC8vIGFuZCBhbiB1bnRvdWNoZWQgcm93IHN0aWxsIHNhdmVzIHRoZSBzdG9yZWQgZGVmYXVsdCB1bmNoYW5nZWQuXG4gICAgZm9ya0pvaW4oc2VlZGVkLm1hcCgoZW50cnkpID0+IHJlc29sdmVPcHRpb25WYWx1ZXMoZW50cnkub3B0aW9ucyQsIGVudHJ5LnZhbHVlcykpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2Yoc2VlZGVkLm1hcCgoZW50cnkpID0+IGVudHJ5LnZhbHVlcy5tYXAoKHZhbHVlKSA9PiAoeyBuYW1lOiBTdHJpbmcodmFsdWUpLCB2YWx1ZSB9KSkpKSksXG4gICAgICAgIHRhcCgocmVzb2x2ZWQpID0+IHtcbiAgICAgICAgICByZXNvbHZlZC5mb3JFYWNoKCh2YWx1ZXMsIGluZGV4KSA9PiBzZWVkZWRbaW5kZXhdLnJvdy52YWx1ZXMgPSB2YWx1ZXMpO1xuICAgICAgICAgIHRoaXMuX3B1Ymxpc2hGaWx0ZXJSb3dzKHJvd3MpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLy8gT25lIHJvdydzIGRyYWZ0LCBzZWVkZWQgZnJvbSBpdHMgZ3JvdXAncyBzdG9yZWQgZGVmYXVsdC4gQSBzdG9yZWQgc2VsZWN0XG4gIC8vIGRlZmF1bHQncyB2YWx1ZXMgYXJlIG5hbWVkIGxhdGVyLCBvbmNlIHRoZSBvcHRpb24gbGlzdCBjYXJyeWluZyB0aGVpclxuICAvLyBsYWJlbHMgaXMgaW4gKHNlZSBfYnVpbGRGaWx0ZXJSb3dzKS5cbiAgcHJpdmF0ZSBfZmlsdGVyUm93KFxuICAgIHJlcG9ydDogUmVwb3J0LFxuICAgIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgICBvcHRpb25zJDogT2JzZXJ2YWJsZTx7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfVtdPixcbiAgKTogRmlsdGVyRGVmYXVsdFJvdyB7XG4gICAgY29uc3QgZ3JvdXBEZWZhdWx0ID0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGdyb3VwLFxuICAgICAgaGVhZGluZzogZGVmYXVsdFJvd0xhYmVsKGdyb3VwLCByZXBvcnQucGFnZXMpLFxuICAgICAgbGFiZWw6IGdyb3VwLmxhYmVsID8/ICcnLFxuICAgICAgbmFtZTogZ3JvdXAubmFtZSA/PyAnJyxcbiAgICAgIHNob3dOYW1lOiB0eXBlb2YgZ3JvdXAubmFtZSA9PT0gJ3N0cmluZycsXG4gICAgICBsYWJlbFJlZnVzYWw6IG51bGwsXG4gICAgICBuYW1lUmVmdXNhbDogbnVsbCxcbiAgICAgIHBlcmlvZDogZGVmYXVsdFBlcmlvZChncm91cERlZmF1bHQpLFxuICAgICAgcGVyaW9kT3B0aW9uczogZGVmYXVsdFBlcmlvZE9wdGlvbnMocmVsYXRpdmVMYWJlbCwgZ3JvdXBEZWZhdWx0Py5yZWxhdGl2ZSA/PyBudWxsKSxcbiAgICAgIHN0YXJ0OiBkYXRlRnJvbUJvdW5kKGdyb3VwRGVmYXVsdD8uc3RhcnQpLFxuICAgICAgZW5kOiBkYXRlRnJvbUJvdW5kKGdyb3VwRGVmYXVsdD8uZW5kKSxcbiAgICAgIHZhbHVlczogW10sXG4gICAgICBleGNsdWRlOiAhIWdyb3VwRGVmYXVsdD8uZXhjbHVkZVZhbHVlcz8ubGVuZ3RoLFxuICAgICAgLy8gQW4gb2xkZXIgc2VydmVyIGxpc3RzIG5vIGZlYXR1cmVzLCBhbmQgbGVhdmVzIG5vIHZhbHVlcyBvdXQuXG4gICAgICBzaG93RXhjbHVkZTogc2hvd0V4Y2x1ZGVUb2dnbGUoZ3JvdXAsIHJlcG9ydC52aWV3ZXJGZWF0dXJlcyksXG4gICAgICB2YWx1ZTogZ3JvdXBEZWZhdWx0Py52YWx1ZSA/PyAnJyxcbiAgICAgIG1pbjogZ3JvdXBEZWZhdWx0Py5taW4gPz8gbnVsbCxcbiAgICAgIG1heDogZ3JvdXBEZWZhdWx0Py5tYXggPz8gbnVsbCxcbiAgICAgIC8vIGZzLWF1dG9jb21wbGV0ZS1jaGlwcyBmZXRjaDogdGhlIGdyb3VwJ3MgZGlzdGluY3Qgb3B0aW9ucywgbmFtZS1maWx0ZXJlZC5cbiAgICAgIC8vIFNhbWUgbG9hZGVyIHRoZSByZXBvcnQgYmFyIHVzZXMsIHNvIHRoZSB0d28gbmV2ZXIgZHJpZnQuXG4gICAgICBmZXRjaDogKGtleXdvcmQ/OiBzdHJpbmcpID0+IG1hdGNoT3B0aW9ucyhvcHRpb25zJCwga2V5d29yZCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3B1Ymxpc2hGaWx0ZXJSb3dzKHJvd3M6IEZpbHRlckRlZmF1bHRSb3dbXSk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyUm93cy5zZXQocm93cyk7XG4gICAgdGhpcy5fZmlsdGVyc1JlYWR5LnNldCh0cnVlKTtcbiAgfVxuXG4gIC8vIFRoZSBkcmFmdCBkZWZhdWx0IG5vcm1hbGl6ZWQgdG8gdGhlIHdpcmUgc2hhcGUgZm9yIHRoaXMgcm93J3MgdHlwZSwgb3IgbnVsbFxuICAvLyB3aGVuIGVtcHR5ICh3aGljaCBjbGVhcnMgdGhlIHN0b3JlZCBkZWZhdWx0KS5cbiAgcHJpdmF0ZSBfcm93RGVmYXVsdChyb3c6IEZpbHRlckRlZmF1bHRSb3cpOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsIHtcbiAgICBzd2l0Y2ggKHJvdy5ncm91cC50eXBlKSB7XG4gICAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgICByZXR1cm4gZGF0ZVJhbmdlRGVmYXVsdChyb3cucGVyaW9kLCBkYXRlVG9Cb3VuZChyb3cuc3RhcnQpLCBkYXRlVG9Cb3VuZChyb3cuZW5kKSk7XG5cbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIC8vIEEgaGlkZGVuIHRvZ2dsZSBsZWF2ZXMgbm90aGluZyBvdXQuXG4gICAgICAgIHJldHVybiBzZWxlY3REZWZhdWx0KHJvdy52YWx1ZXMubWFwKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSksIHJvdy5zaG93RXhjbHVkZSAmJiByb3cuZXhjbHVkZSk7XG5cbiAgICAgIGNhc2UgJ251bWJlclJhbmdlJzpcbiAgICAgICAgcmV0dXJuIG51bWJlclJhbmdlRGVmYXVsdChyb3cubWluLCByb3cubWF4KTtcblxuICAgICAgY2FzZSAna2V5d29yZCc6XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93LnZhbHVlLnRyaW0oKTtcblxuICAgICAgICByZXR1cm4gdmFsdWUgPyB7IHZhbHVlIH0gOiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG59XG5cblxuLy8gVGhlIGdyb3VwIGFzIHRoZSBzZXJ2ZXIgbm93IHN0b3JlcyBpdCwgb25jZSBhbiB1cGRhdGUgY2FycnlpbmcgYGNoYW5nZXNgXG4vLyBpcyB0YWtlbi5cbmZ1bmN0aW9uIHN0b3JlZEdyb3VwKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCwgY2hhbmdlczogUmVwb3J0RmlsdGVyR3JvdXBDaGFuZ2VzKTogUmVwb3J0RmlsdGVyR3JvdXAge1xuICByZXR1cm4ge1xuICAgIC4uLmdyb3VwLFxuICAgIC4uLihjaGFuZ2VzLm5hbWUgIT09IHVuZGVmaW5lZCA/IHsgbmFtZTogY2hhbmdlcy5uYW1lIH0gOiB7fSksXG4gICAgLi4uKGNoYW5nZXMubGFiZWwgIT09IHVuZGVmaW5lZCA/IHsgbGFiZWw6IGNoYW5nZXMubGFiZWwgfSA6IHt9KSxcbiAgICBjb25maWc6IGNoYW5nZXMuZGVmYXVsdCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgLi4uZ3JvdXAuY29uZmlnLCBkZWZhdWx0OiBjaGFuZ2VzLmRlZmF1bHQgPz8gdW5kZWZpbmVkIH1cbiAgICAgIDogZ3JvdXAuY29uZmlnLFxuICB9O1xufVxuXG4vLyBUaGUgaWRzIG9mIGEgZmlsdGVyJ3MgTGFiZWwgYW5kIE5hbWUgaW5wdXRzLCBzbyBhIHJlZnVzZWQgb25lIGNhbiBiZVxuLy8gZm9jdXNlZC5cbmZ1bmN0aW9uIGxhYmVsSW5wdXRJZChncm91cElkOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYGZpbHRlckxhYmVsJHtncm91cElkfWA7XG59XG5cbmZ1bmN0aW9uIG5hbWVJbnB1dElkKGdyb3VwSWQ6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgZmlsdGVyTmFtZSR7Z3JvdXBJZH1gO1xufVxuIiwiPGZvcm1cbiAgICBmc0Zvcm1cbiAgICBbc3VibWl0XT1cInNhdmVcIj5cbiAgPGZzLWRpYWxvZz5cbiAgICA8aDEgbWF0LWRpYWxvZy10aXRsZT5cbiAgICAgIFJlcG9ydCBTZXR0aW5nc1xuICAgIDwvaDE+XG4gICAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICAgIDwhLS0gT25lIHNrZWxldG9uIG92ZXIgdGhlIHdob2xlIGJvZHkgdW50aWwgdGhlIGxvY2FsZSBsaXN0IGlzIGluLiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKmZzU2tlbGV0b25Gb3JtPVwicmVhZHkoKSB8fCBudWxsXCI+XG4gICAgICAgIDwhLS0gYW5pbWF0aW9uRG9uZTogYSByZWZ1c2VkIExhYmVsIG9yIE5hbWUgaXMgZm9jdXNlZCBvbmNlIHRoZVxuICAgICAgICAgICAgIEZpbHRlcnMgdGFiIGlzIG9uIHNjcmVlbi4gLS0+XG4gICAgICAgIDxtYXQtdGFiLWdyb3VwXG4gICAgICAgICAgICBbKHNlbGVjdGVkKV09XCJzZWxlY3RlZFRhYlwiXG4gICAgICAgICAgICAoYW5pbWF0aW9uRG9uZSk9XCJmb2N1c1JlZnVzYWwoKVwiPlxuICAgICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICAgIGxhYmVsPVwiU2V0dGluZ3NcIlxuICAgICAgICAgICAgICBuYW1lPVwic2V0dGluZ3NcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy1jb2x1bW4gdGFiLWJvZHlcIj5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICBOYW1lXG4gICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgIFtmc0Zvcm1SZXF1aXJlZF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDwhLS1cbiAgICAgICAgICAgICAgICBUaGUgcGFnZSwgdHlwZWQgaW4gaW5jaGVzLiBPcmllbnRhdGlvbiBpcyBub3QgYXNrZWQgZm9yIGJlY2F1c2UgaXRcbiAgICAgICAgICAgICAgICBpcyBub3QgYW4gaW5kZXBlbmRlbnQgY2hvaWNlIC0gYSBwYWdlIHdpZGVyIHRoYW4gaXQgaXMgdGFsbCBJU1xuICAgICAgICAgICAgICAgIGxhbmRzY2FwZSAtIHNvIHRoZSB0d28gbnVtYmVycyBzYXkgZXZlcnl0aGluZyB0aGVyZSBpcyB0byBzYXkuXG4gICAgICAgICAgICAgIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcm93LmdhcC1zbS5hbGlnbi1zdGFydFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZzLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIFdpZHRoXG4gICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgZnNNYXNrTnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgW3NjYWxlXT1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicGFnZVdpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwicGFnZVdpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZnNGb3JtUmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1pbl09XCJwYWdlRGltZW5zaW9uTWluXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZnNGb3JtTWF4XT1cInBhZ2VEaW1lbnNpb25NYXhcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgbWF0VGV4dFN1ZmZpeD5cbiAgICAgICAgICAgICAgICAgICAgaW5jaGVzXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZzLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIEhlaWdodFxuICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIGZzTWFza051bWJlclxuICAgICAgICAgICAgICAgICAgICAgIFtzY2FsZV09XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBhZ2VIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJwYWdlSGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbZnNGb3JtUmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1pbl09XCJwYWdlRGltZW5zaW9uTWluXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZnNGb3JtTWF4XT1cInBhZ2VEaW1lbnNpb25NYXhcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgbWF0VGV4dFN1ZmZpeD5cbiAgICAgICAgICAgICAgICAgICAgaW5jaGVzXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPCEtLVxuICAgICAgICAgICAgICAgIEhvdyBkZWVwIHRoZSBoZWFkZXIgYW5kIGZvb3RlciBiYW5kcyBhcmUuIFRoZWlyIGNvbnRlbnQgaXMgZWRpdGVkXG4gICAgICAgICAgICAgICAgb24gdGhlIGNhbnZhcyAoRWRpdCBsYXlvdXQg4oaSIEhlYWRlciAmIGZvb3Rlcik7IHRoZXNlIHJlc2VydmUgdGhlXG4gICAgICAgICAgICAgICAgc3BhY2UgZm9yIGl0LCBhbmQgMCBtZWFucyBubyBiYW5kLlxuICAgICAgICAgICAgICAtLT5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICBIZWFkZXIgaGVpZ2h0XG4gICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgIGZzTWFza051bWJlclxuICAgICAgICAgICAgICAgICAgICBbc2NhbGVdPVwiMlwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaGVhZGVySGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cImhlYWRlckhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgIFtmc0Zvcm1NaW5dPVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIFtmc0Zvcm1NYXhdPVwiaGVhZGVyRm9vdGVyTWF4XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBtYXRUZXh0U3VmZml4PlxuICAgICAgICAgICAgICAgICAgaW5jaGVzXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgRm9vdGVyIGhlaWdodFxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICBmc01hc2tOdW1iZXJcbiAgICAgICAgICAgICAgICAgICAgW3NjYWxlXT1cIjJcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvb3RlckhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJmb290ZXJIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgICBbZnNGb3JtTWluXT1cIjBcIlxuICAgICAgICAgICAgICAgICAgICBbZnNGb3JtTWF4XT1cImhlYWRlckZvb3Rlck1heFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgbWF0VGV4dFN1ZmZpeD5cbiAgICAgICAgICAgICAgICAgIGluY2hlc1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8ZnMtYWktcmVwb3J0LXRpbWV6b25lLXNlbGVjdCBbKHRpbWV6b25lKV09XCJ0aW1lem9uZVwiPjwvZnMtYWktcmVwb3J0LXRpbWV6b25lLXNlbGVjdD5cbiAgICAgICAgICAgICAgPCEtLVxuICAgICAgICAgICAgICAgIEhvdyBudW1iZXJzIGFuZCBkYXRlcyBhcmUgd3JpdHRlbiAoZm9ybWF0dGluZyBvbmx5OiBubyB0ZXh0IGlzXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlZCkgYW5kIHdoaWNoIGN1cnJlbmN5IG1vbmV5IGlzIGxhYmVsZWQgaW4uIEhpZGRlbiBvbiBhXG4gICAgICAgICAgICAgICAgc2VydmVyIHRvbyBvbGQgdG8gcmVzb2x2ZSBhIHJlcG9ydCdzIGxvY2FsZS5cbiAgICAgICAgICAgICAgLS0+XG4gICAgICAgICAgICAgIEBpZiAobG9jYWxlcygpKSB7XG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgTG9jYWxlXG4gICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibG9jYWxlKClcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImxvY2FsZS5zZXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImxvY2FsZVwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChvcHRpb24gb2YgbG9jYWxlT3B0aW9ucygpOyB0cmFjayBvcHRpb24udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBvcHRpb24ubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgICAgICAgICAge3sgZm9ybWF0RXhhbXBsZSgpIH19XG4gICAgICAgICAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgQ3VycmVuY3lcbiAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjdXJyZW5jeSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjdXJyZW5jeS5zZXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImN1cnJlbmN5XCI+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBjdXJyZW5jeU9wdGlvbnMoKTsgdHJhY2sgb3B0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgb3B0aW9uLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgICAgIE5hbWVzIHRoZSBjdXJyZW5jeSBhbW91bnRzIGFyZSBpbjsgaXQgZG9lcyBub3QgY29udmVydCB0aGVtLlxuICAgICAgICAgICAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgICAgPG1hdC10YWJcbiAgICAgICAgICAgICAgbGFiZWw9XCJTdHlsZXNcIlxuICAgICAgICAgICAgICBuYW1lPVwic3R5bGVzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtY29sdW1uIHRhYi1ib2R5XCI+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgSGVhZGluZyBTaXplXG4gICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgICBtaW49XCI2XCJcbiAgICAgICAgICAgICAgICAgIG1heD1cIjk2XCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaGVhZGluZ1NpemVcIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cImhlYWRpbmdTaXplXCJcbiAgICAgICAgICAgICAgICAgIFtmc0Zvcm1NaW5dPVwiNlwiXG4gICAgICAgICAgICAgICAgICBbZnNGb3JtTWF4XT1cIjk2XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gbWF0VGV4dFN1ZmZpeD5cbiAgICAgICAgICAgICAgICAgIHB0XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgICAgICAgIEFwcGxpZXMgdG8gY29tcG9uZW50IHRpdGxlcy4gUG9pbnRzIG1hcCAxOjEgdG8gUERGIGFuZCBQb3dlclBvaW50LlxuICAgICAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgICAgPG1hdC10YWJcbiAgICAgICAgICAgICAgbGFiZWw9XCJGaWx0ZXJzXCJcbiAgICAgICAgICAgICAgbmFtZT1cImZpbHRlcnNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy1jb2x1bW4gdGFiLWJvZHlcIj5cbiAgICAgICAgICAgICAgQGlmIChmaWx0ZXJSb3dzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBPbmUgc2VjdGlvbiBwZXIgcmVwb3J0IGJhciBmaWx0ZXI6IGl0cyBoZWFkaW5nLCBpdHMgbGFiZWxcbiAgICAgICAgICAgICAgICAgICAgIGFuZCBuYW1lLCB0aGVuIGl0cyBkZWZhdWx0LCBvbmUgZmllbGQgcGVyIHJvdy4gLS0+XG4gICAgICAgICAgICAgICAgQGZvciAocm93IG9mIGZpbHRlclJvd3MoKTsgdHJhY2sgcm93Lmdyb3VwLmlkKSB7XG4gICAgICAgICAgICAgICAgICA8aDM+XG4gICAgICAgICAgICAgICAgICAgIHt7IHJvdy5oZWFkaW5nIH19XG4gICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgPCEtLSBUaGUgbGFiZWwgYW5kIHRoZSBuYW1lIGFyZSBpbmRlcGVuZGVudDogYSBuZXcgbGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgbmV2ZXIgY2hhbmdlcyB0aGUgbmFtZSwgYW5kIHRoZSBuYW1lIGlzIGVkaXRlZCBvbiBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgb3duLiBUaGUgc2VydmVyIGNoZWNrcyBib3RoLCBhbmQgaXRzIHJlZnVzYWwgc2hvd3Mgb25cbiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpZWxkIChyZWZ1c2FsVmFsaWRhdG9yKS4gLS0+XG4gICAgICAgICAgICAgICAgICBAaWYgKHJvdy5zaG93TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJsYWJlbElucHV0SWQocm93Lmdyb3VwLmlkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvdy5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInBhdGNoUm93KHJvdywgeyBsYWJlbDogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ2xhYmVsJyArIHJvdy5ncm91cC5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmc0Zvcm1SZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1heExlbmd0aF09XCJsYWJlbE1heExlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0ZV09XCJyZWZ1c2FsVmFsaWRhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRlRGF0YV09XCJyb3cubGFiZWxSZWZ1c2FsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1oaW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgV2hhdCB0aGUgZmlsdGVyIHNob3dzLiBDaGFuZ2luZyBpdCBuZXZlciBjaGFuZ2VzIHRoZSBuYW1lLlxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwibmFtZUlucHV0SWQocm93Lmdyb3VwLmlkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvdy5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwicGF0Y2hSb3cocm93LCB7IG5hbWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIiduYW1lJyArIHJvdy5ncm91cC5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmc0Zvcm1SZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybVBhdHRlcm5dPVwibmFtZVBhdHRlcm5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZnNGb3JtUGF0dGVybk1lc3NhZ2VdPVwibmFtZVBhdHRlcm5NZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1heExlbmd0aF09XCJuYW1lTWF4TGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRlXT1cInJlZnVzYWxWYWxpZGF0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGVEYXRhXT1cInJvdy5uYW1lUmVmdXNhbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgICAgICAgICAgICAgIEhvdyB0aGUgQUkgcmVmZXJzIHRvIHRoaXMgZmlsdGVyOiBhIGxldHRlciwgdGhlbiBsZXR0ZXJzIGFuZCBkaWdpdHMuXG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBzd2l0Y2ggKHJvdy5ncm91cC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlICgnZGF0ZVJhbmdlJykge1xuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgcGVyaW9kXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93LnBlcmlvZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwicGF0Y2hSb3cocm93LCB7IHBlcmlvZDogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCIncGVyaW9kJyArIHJvdy5ncm91cC5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChvcHRpb24gb2Ygcm93LnBlcmlvZE9wdGlvbnM7IHRyYWNrIG9wdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbi5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHJvdy5wZXJpb2QgPT09IGZpeGVkRGF0ZXNQZXJpb2QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGZyb21cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNEYXRlUGlja2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cuc3RhcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIidzdGFydCcgKyByb3cuZ3JvdXAuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc0RhdGVQaWNrZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy5lbmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIidlbmQnICsgcm93Lmdyb3VwLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAY2FzZSAoJ3NlbGVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZnMtbGFiZWwtZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZnMtYXV0b2NvbXBsZXRlLWNoaXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmdWxsLXdpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkRlZmF1bHQgdmFsdWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmV0Y2hdPVwicm93LmZldGNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy52YWx1ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIid2YWx1ZXMnICsgcm93Lmdyb3VwLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZldGNoT25Gb2N1c109XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNBdXRvY29tcGxldGVDaGlwc1RlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQtb2JqZWN0PVwib2JqZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgb2JqZWN0Lm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZnMtYXV0b2NvbXBsZXRlLWNoaXBzPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChyb3cuc2hvd0V4Y2x1ZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvdy5leGNsdWRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInBhdGNoUm93KHJvdywgeyBleGNsdWRlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ2V4Y2x1ZGUnICsgcm93Lmdyb3VwLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjbHVkZSB0aGVzZSB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGNhc2UgKCdudW1iZXJSYW5nZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIGZzTWFza051bWJlciBoYW5kcyBiYWNrIHRleHQ7IHRoZSBjaGVjayBhbmQgdGhlIHNhdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgaXQgdGhyb3VnaCBwYXJzZURlZmF1bHRCb3VuZCwgc28gMCBpcyBrZXB0LiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IG1pbmltdW1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc01hc2tOdW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2lnbmVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzY2FsZV09XCJib3VuZFNjYWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3cubWluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJwYXRjaFJvdyhyb3csIHsgbWluOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIidtaW4nICsgcm93Lmdyb3VwLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGVdPVwibWluQm91bmRWYWxpZGF0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0ZURhdGFdPVwicm93Lm1heFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBtYXhpbXVtXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNNYXNrTnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpZ25lZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2NhbGVdPVwiYm91bmRTY2FsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93Lm1heFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwicGF0Y2hSb3cocm93LCB7IG1heDogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCInbWF4JyArIHJvdy5ncm91cC5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRlXT1cIm1heEJvdW5kVmFsaWRhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGVEYXRhXT1cInJvdy5taW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBkZWZhdWx0IHtcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ3ZhbHVlJyArIHJvdy5ncm91cC5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDxmcy1tZXNzYWdlLWluZm8+XG4gICAgICAgICAgICAgICAgICBUaGlzIHJlcG9ydCBoYXMgbm8gcmVwb3J0IGJhciBmaWx0ZXJzIHlldC4gQWRkIGEgZmlsdGVyIHRvIGFcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCAoaXRzIHNldHRpbmdzIOKGkiBGaWx0ZXJzKSBhbmQgc2hvdyBpdCBpbiB0aGUgcmVwb3J0IGJhcixcbiAgICAgICAgICAgICAgICAgIHRoZW4gc2V0IGl0cyBkZWZhdWx0IGhlcmUuXG4gICAgICAgICAgICAgICAgPC9mcy1tZXNzYWdlLWluZm8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgPC9tYXQtdGFiLWdyb3VwPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICAgIDxmcy1mb3JtLWRpYWxvZy1hY3Rpb25zPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRQYWNrYWdlKClcIj5cbiAgICAgICAgICBFeHBvcnRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgY29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICAgIChjbGljayk9XCJkZWxldGUoKVwiPlxuICAgICAgICAgIERlbGV0ZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZnMtZm9ybS1kaWFsb2ctYWN0aW9ucz5cbiAgICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cbiAgPC9mcy1kaWFsb2c+XG48L2Zvcm0+Il19