@firestitch/report 18.0.31 → 18.2.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 (20) hide show
  1. package/app/reports/components/component-list/component-list.component.d.ts +6 -2
  2. package/app/reports/components/report-canvas/report-canvas.component.d.ts +10 -1
  3. package/app/reports/data/report.data.d.ts +9 -1
  4. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +9 -1
  5. package/app/reports/interfaces/report.interface.d.ts +15 -0
  6. package/app/reports/views/report/fs-ai-report.component.d.ts +10 -1
  7. package/esm2022/app/reports/components/component-list/component-list.component.mjs +69 -14
  8. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +122 -5
  9. package/esm2022/app/reports/data/report.data.mjs +51 -1
  10. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +66 -6
  11. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  12. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +89 -5
  13. package/esm2022/app/reports/views/report/report.component.mjs +11 -2
  14. package/fesm2022/{firestitch-report-echarts-CygLeElT.mjs → firestitch-report-echarts-Id_HJuQO.mjs} +2 -2
  15. package/fesm2022/{firestitch-report-echarts-CygLeElT.mjs.map → firestitch-report-echarts-Id_HJuQO.mjs.map} +1 -1
  16. package/fesm2022/{firestitch-report-firestitch-report-BOErj039.mjs → firestitch-report-firestitch-report-CfSwIwzw.mjs} +425 -60
  17. package/fesm2022/firestitch-report-firestitch-report-CfSwIwzw.mjs.map +1 -0
  18. package/fesm2022/firestitch-report.mjs +1 -1
  19. package/package.json +2 -2
  20. package/fesm2022/firestitch-report-firestitch-report-BOErj039.mjs.map +0 -1
@@ -1,7 +1,9 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, inject } from '@angular/core';
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, EventEmitter, inject } from '@angular/core';
2
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
2
3
  import { FormsModule } from '@angular/forms';
3
- import { MAT_DIALOG_DATA, MatDialogActions, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';
4
+ import { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';
4
5
  import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field';
6
+ import { MatButton } from '@angular/material/button';
5
7
  import { MatInput } from '@angular/material/input';
6
8
  import { MatSlideToggle } from '@angular/material/slide-toggle';
7
9
  import { MatTabsModule } from '@angular/material/tabs';
@@ -11,8 +13,9 @@ import { FsFormModule } from '@firestitch/form';
11
13
  import { FsLabelModule } from '@firestitch/label';
12
14
  import { FsMaskModule } from '@firestitch/mask';
13
15
  import { FsMessage } from '@firestitch/message';
16
+ import { FsPrompt } from '@firestitch/prompt';
14
17
  import { FsTabsModule } from '@firestitch/tabs';
15
- import { tap } from 'rxjs/operators';
18
+ import { switchMap, tap } from 'rxjs/operators';
16
19
  import { ReportData } from '../../data/report.data';
17
20
  import { DEFAULT_COMPONENT_PADDING } from '../../layout';
18
21
  import * as i0 from "@angular/core";
@@ -49,6 +52,15 @@ export class ComponentSettingsComponent {
49
52
  paddingBottom = DEFAULT_COMPONENT_PADDING;
50
53
  paddingLeft = DEFAULT_COMPONENT_PADDING;
51
54
  configJson = '';
55
+ // ---- SQL tab state ----
56
+ // The statement, once fetched. Null while it is in flight, and null when the
57
+ // component's document could not be compiled (sqlError then says why).
58
+ sql = null;
59
+ // True when the statement is a DERIVED baseline: no filters, UTC, the
60
+ // authored grain. The tab says so, because the numbers on screen come from
61
+ // this statement plus the viewer's own choices and the two can differ.
62
+ sqlBaseline = false;
63
+ sqlError = null;
52
64
  // ---- filter management state ----
53
65
  // One row per filterable column. The two booleans drive the toggles; we flip
54
66
  // them optimistically on click (so the UI never blinks while the request is
@@ -68,6 +80,8 @@ export class ComponentSettingsComponent {
68
80
  _dialogRef = inject(MatDialogRef);
69
81
  _reportData = inject(ReportData);
70
82
  _message = inject(FsMessage);
83
+ _prompt = inject(FsPrompt);
84
+ _destroyRef = inject(DestroyRef);
71
85
  _cdRef = inject(ChangeDetectorRef);
72
86
  ngOnInit() {
73
87
  this.report = this._data.report;
@@ -81,11 +95,29 @@ export class ComponentSettingsComponent {
81
95
  this.configJson = JSON.stringify(this.component.config ?? {}, null, 2);
82
96
  this._seedFilters(this.report, this.component.id);
83
97
  this._loadColumns();
98
+ this._loadSql();
84
99
  }
85
100
  // Human-friendly name for the inferred interface shown beside each column.
86
101
  typeLabel(type) {
87
102
  return this._typeLabels[type] ?? type;
88
103
  }
104
+ // Confirm and delete here, while the dialog is still open, then close with a
105
+ // `deleted` result for the page to act on — the same shape the report
106
+ // settings dialog uses for deleting a report.
107
+ //
108
+ // The confirm says it cannot be undone because, from the UI, it cannot: the
109
+ // row is soft-deleted server-side but nothing here restores a component.
110
+ delete() {
111
+ this._prompt.confirm({
112
+ title: 'Delete Component',
113
+ template: `Are you sure you would like to delete "${this.component.title || 'this component'}"? This cannot be undone.`,
114
+ })
115
+ .pipe(switchMap(() => this._reportData.deleteComponent(this.report.id, this.component.id)), takeUntilDestroyed(this._destroyRef))
116
+ .subscribe(() => {
117
+ this._message.success('Component deleted');
118
+ this._dialogRef.close({ deleted: true });
119
+ });
120
+ }
89
121
  save = () => {
90
122
  const settings = {
91
123
  title: this.title,
@@ -185,6 +217,32 @@ export class ComponentSettingsComponent {
185
217
  this._filters = component?.filters ?? [];
186
218
  this._rebuildRows();
187
219
  }
220
+ // The statement the SQL tab shows. Fetched rather than read off the
221
+ // component: a derived component stores a document, not SQL, so its
222
+ // statement only exists once the backend compiles it.
223
+ //
224
+ // Loaded in ngOnInit beside the columns, NOT on tab activation. The tabs are
225
+ // not lazy (no matTabContent), and switching the tab-group's `[(selected)]`
226
+ // banana-box to a one-way binding plus (selectedChange) to get a hook would
227
+ // break it: FsTabsHeaderTabGroupDirective self-assigns `this.selected` before
228
+ // it emits, so the event is filtered out and the load would never fire. One
229
+ // small request when a dialog opens is not worth that risk.
230
+ _loadSql() {
231
+ this._reportData.componentSql(this.report.id, this.component.id)
232
+ .subscribe({
233
+ next: (preview) => {
234
+ this.sql = preview?.sql ?? null;
235
+ this.sqlBaseline = !!preview?.baseline;
236
+ this.sqlError = preview?.error ?? null;
237
+ this._cdRef.markForCheck();
238
+ },
239
+ error: (error) => {
240
+ this.sql = null;
241
+ this.sqlError = error?.error?.message ?? 'Could not read the component SQL';
242
+ this._cdRef.markForCheck();
243
+ },
244
+ });
245
+ }
188
246
  _loadColumns() {
189
247
  this._reportData.componentColumns(this.report.id, this.component.id)
190
248
  .subscribe({
@@ -207,7 +265,7 @@ export class ComponentSettingsComponent {
207
265
  .replace(/\b\w/g, (character) => character.toUpperCase());
208
266
  }
209
267
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentSettingsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
210
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentSettingsComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <h1 mat-dialog-title>\n {{ component.title || 'Component' }}\n </h1>\n <mat-dialog-content>\n <mat-tab-group [(selected)]=\"selectedTab\">\n <mat-tab\n label=\"Settings\"\n name=\"settings\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Title\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"title\"\n name=\"title\">\n </mat-form-field>\n <div class=\"subheading-2\">\n Padding\n </div>\n <div class=\"geometry-row\">\n <mat-form-field>\n <mat-label>\n Top\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"3\"\n [(ngModel)]=\"paddingTop\"\n name=\"paddingTop\"\n [fsFormMin]=\"0\">\n <div matTextSuffix>\n in\n </div>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Right\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"3\"\n [(ngModel)]=\"paddingRight\"\n name=\"paddingRight\"\n [fsFormMin]=\"0\">\n <div matTextSuffix>\n in\n </div>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Bottom\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"3\"\n [(ngModel)]=\"paddingBottom\"\n name=\"paddingBottom\"\n [fsFormMin]=\"0\">\n <div matTextSuffix>\n in\n </div>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Left\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"3\"\n [(ngModel)]=\"paddingLeft\"\n name=\"paddingLeft\"\n [fsFormMin]=\"0\">\n <div matTextSuffix>\n in\n </div>\n </mat-form-field>\n </div>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Filters\"\n name=\"filters\">\n <div class=\"tab-body\">\n @if (columnsError) {\n <div class=\"filters-empty error\">\n {{ columnsError }}\n </div>\n } @else if (rows.length) {\n <!-- Every filterable column. Toggle where its control shows: in\n the report bar, on this component, both, or neither. The\n interface (date range vs value picker) follows the data. -->\n <table class=\"filter-table\">\n <thead>\n <tr>\n <th class=\"filter-col-name\">\n Filter\n </th>\n <th class=\"filter-col-type\">\n Type\n </th>\n <th class=\"filter-col-toggle\">\n Report bar\n </th>\n <th class=\"filter-col-toggle\">\n This component\n </th>\n </tr>\n </thead>\n <tbody>\n @for (row of rows; track row.column) {\n <tr>\n <td class=\"filter-col-name\">\n {{ row.label }}\n </td>\n <td class=\"filter-col-type\">\n {{ typeLabel(row.type) }}\n </td>\n <td class=\"filter-col-toggle\">\n <mat-slide-toggle\n [ngModel]=\"row.report\"\n (ngModelChange)=\"setExposure(row, 'report', $event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n matTooltip=\"Show in the report bar\">\n </mat-slide-toggle>\n </td>\n <td class=\"filter-col-toggle\">\n <mat-slide-toggle\n [ngModel]=\"row.component\"\n (ngModelChange)=\"setExposure(row, 'component', $event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n matTooltip=\"Show on this component\">\n </mat-slide-toggle>\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @else {\n <div class=\"filters-empty\">\n This component has no filterable columns yet \u2014 give it some SQL first.\n </div>\n }\n </div>\n </mat-tab>\n <mat-tab\n label=\"SQL\"\n name=\"sql\">\n <div class=\"tab-body\">\n <pre class=\"code-block\">\n {{ component.sql }}\n </pre>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Config\"\n name=\"config\">\n <div class=\"tab-body\">\n <pre class=\"code-block\">\n {{ configJson }}\n </pre>\n </div>\n </mat-tab>\n </mat-tab-group>\n </mat-dialog-content>\n <mat-dialog-actions>\n <fs-form-dialog-actions\n [save]=\"selectedTab === 'settings'\"\n [done]=\"selectedTab !== 'settings'\">\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}.geometry-row{display:flex;gap:8px}.geometry-row mat-form-field{flex:1}.filter-table{border-spacing:0;width:100%;border-collapse:collapse}.filter-table thead th{color:#8f8f8f;font-weight:400;font-size:85%;text-align:left;padding:8px 16px}.filter-table tbody tr{clip-path:xywh(0 3px 100% calc(100% - 6px) round 10px)}.filter-table tbody td{border:none;background-color:#fafafa;padding:8px 16px;vertical-align:middle;text-align:left}.filter-table .filter-col-name{font-weight:600;color:#1f2933}.filter-table .filter-col-type{color:#7b8794;width:120px}.filter-table .filter-col-toggle,.filter-table th.filter-col-toggle{width:130px;text-align:center}.filters-empty{font-size:13px;color:#7b8794;padding:8px 0 4px}.filters-empty.error{color:#e15759}.code-block{margin:0;padding:10px 12px;background:#1f2933;color:#e4e7eb;border-radius:6px;font-family:JetBrains Mono,Consolas,monospace;font-size:12px;line-height:1.5;white-space:pre-wrap;word-break:break-word;max-height:240px;overflow:auto}\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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { 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.FsFormMinDirective, selector: "[fsFormMin]", inputs: ["fsFormMin", "fsFormMinMessage"] }, { 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: "ngmodule", type: FsMaskModule }, { kind: "directive", type: i3.FsMaskNumberDirective, selector: "[fsMaskNumber]" }, { kind: "ngmodule", type: FsDialogModule }, { kind: "component", type: i4.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout"] }, { kind: "ngmodule", type: FsLabelModule }, { kind: "ngmodule", type: FsTabsModule }, { kind: "directive", type: i5.FsTabsHeaderTabGroupDirective, selector: "mat-tab-group, matTabGroup, [matTabGroup]", inputs: ["orientation", "selected", "selectedData"], outputs: ["selectedChange", "selectedDataChange"], exportAs: ["fsTabsHeaderTabGroup"] }, { kind: "directive", type: i5.FsTabsTabDirective, selector: "mat-tab,matTab", inputs: ["name", "data"], exportAs: ["fsTabsTab"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i6.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i6.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: "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: 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: 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: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
268
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentSettingsComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <h1 mat-dialog-title>\n {{ component.title || 'Component' }}\n </h1>\n <mat-dialog-content>\n <mat-tab-group [(selected)]=\"selectedTab\">\n <mat-tab\n label=\"Settings\"\n name=\"settings\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Title\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"title\"\n name=\"title\">\n </mat-form-field>\n <div class=\"subheading-2\">\n Padding\n </div>\n <div class=\"geometry-row\">\n <mat-form-field>\n <mat-label>\n Top\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"3\"\n [(ngModel)]=\"paddingTop\"\n name=\"paddingTop\"\n [fsFormMin]=\"0\">\n <div matTextSuffix>\n in\n </div>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Right\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"3\"\n [(ngModel)]=\"paddingRight\"\n name=\"paddingRight\"\n [fsFormMin]=\"0\">\n <div matTextSuffix>\n in\n </div>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Bottom\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"3\"\n [(ngModel)]=\"paddingBottom\"\n name=\"paddingBottom\"\n [fsFormMin]=\"0\">\n <div matTextSuffix>\n in\n </div>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Left\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"3\"\n [(ngModel)]=\"paddingLeft\"\n name=\"paddingLeft\"\n [fsFormMin]=\"0\">\n <div matTextSuffix>\n in\n </div>\n </mat-form-field>\n </div>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Filters\"\n name=\"filters\">\n <div class=\"tab-body\">\n @if (columnsError) {\n <div class=\"filters-empty error\">\n {{ columnsError }}\n </div>\n } @else if (rows.length) {\n <!-- Every filterable column. Toggle where its control shows: in\n the report bar, on this component, both, or neither. The\n interface (date range vs value picker) follows the data. -->\n <table class=\"filter-table\">\n <thead>\n <tr>\n <th class=\"filter-col-name\">\n Filter\n </th>\n <th class=\"filter-col-type\">\n Type\n </th>\n <th class=\"filter-col-toggle\">\n Report bar\n </th>\n <th class=\"filter-col-toggle\">\n This component\n </th>\n </tr>\n </thead>\n <tbody>\n @for (row of rows; track row.column) {\n <tr>\n <td class=\"filter-col-name\">\n {{ row.label }}\n </td>\n <td class=\"filter-col-type\">\n {{ typeLabel(row.type) }}\n </td>\n <td class=\"filter-col-toggle\">\n <mat-slide-toggle\n [ngModel]=\"row.report\"\n (ngModelChange)=\"setExposure(row, 'report', $event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n matTooltip=\"Show in the report bar\">\n </mat-slide-toggle>\n </td>\n <td class=\"filter-col-toggle\">\n <mat-slide-toggle\n [ngModel]=\"row.component\"\n (ngModelChange)=\"setExposure(row, 'component', $event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n matTooltip=\"Show on this component\">\n </mat-slide-toggle>\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @else {\n <div class=\"filters-empty\">\n This component has no filterable columns yet \u2014 give it some SQL first.\n </div>\n }\n </div>\n </mat-tab>\n <mat-tab\n label=\"SQL\"\n name=\"sql\">\n <div class=\"tab-body\">\n @if (sqlError) {\n <div class=\"filters-empty error\">\n {{ sqlError }}\n </div>\n } @else if (sql) {\n @if (sqlBaseline) {\n <!-- A derived component's statement is compiled from its\n document with no viewer state, so it is not byte-for-byte\n what produced the numbers on screen. Said here rather than\n left for the reader to discover. -->\n <div class=\"filters-empty\">\n Compiled from this component's query \u2014 no filters applied, times in UTC.\n </div>\n }\n <pre class=\"code-block\">{{ sql }}</pre>\n } @else {\n <div class=\"filters-empty\">\n This component has no SQL yet.\n </div>\n }\n </div>\n </mat-tab>\n <mat-tab\n label=\"Config\"\n name=\"config\">\n <div class=\"tab-body\">\n <pre class=\"code-block\">\n {{ configJson }}\n </pre>\n </div>\n </mat-tab>\n </mat-tab-group>\n </mat-dialog-content>\n <mat-dialog-actions>\n <!-- Save | Delete | Cancel, the standard order. fs-form-dialog-actions\n renders its own Save/Done BEFORE the projected content, which would\n put Delete after Cancel, so `[save]=\"false\"` foots the row here and\n all three buttons are projected in order. Save submits the Settings\n tab; the other tabs persist as you touch them, so they get Done. -->\n <fs-form-dialog-actions [save]=\"false\">\n @if (selectedTab === 'settings') {\n <button\n mat-button\n type=\"submit\"\n color=\"primary\">\n Save\n </button>\n } @else {\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [mat-dialog-close]=\"null\">\n Done\n </button>\n }\n <button\n mat-button\n type=\"button\"\n color=\"warn\"\n (click)=\"delete()\">\n Delete\n </button>\n <button\n mat-button\n type=\"button\"\n class=\"cancel-button\"\n [mat-dialog-close]=\"null\">\n Cancel\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}.geometry-row{display:flex;gap:8px}.geometry-row mat-form-field{flex:1}.filter-table{border-spacing:0;width:100%;border-collapse:collapse}.filter-table thead th{color:#8f8f8f;font-weight:400;font-size:85%;text-align:left;padding:8px 16px}.filter-table tbody tr{clip-path:xywh(0 3px 100% calc(100% - 6px) round 10px)}.filter-table tbody td{border:none;background-color:#fafafa;padding:8px 16px;vertical-align:middle;text-align:left}.filter-table .filter-col-name{font-weight:600;color:#1f2933}.filter-table .filter-col-type{color:#7b8794;width:120px}.filter-table .filter-col-toggle,.filter-table th.filter-col-toggle{width:130px;text-align:center}.filters-empty{font-size:13px;color:#7b8794;padding:8px 0 4px}.filters-empty.error{color:#e15759}.code-block{margin:0;padding:10px 12px;background:#1f2933;color:#e4e7eb;border-radius:6px;font-family:JetBrains Mono,Consolas,monospace;font-size:12px;line-height:1.5;white-space:pre-wrap;word-break:break-word;max-height:240px;overflow:auto}\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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { 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.FsFormMinDirective, selector: "[fsFormMin]", inputs: ["fsFormMin", "fsFormMinMessage"] }, { 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: FsMaskModule }, { kind: "directive", type: i3.FsMaskNumberDirective, selector: "[fsMaskNumber]" }, { kind: "ngmodule", type: FsDialogModule }, { kind: "component", type: i4.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout"] }, { kind: "ngmodule", type: FsLabelModule }, { kind: "ngmodule", type: FsTabsModule }, { kind: "directive", type: i5.FsTabsHeaderTabGroupDirective, selector: "mat-tab-group, matTabGroup, [matTabGroup]", inputs: ["orientation", "selected", "selectedData"], outputs: ["selectedChange", "selectedDataChange"], exportAs: ["fsTabsHeaderTabGroup"] }, { kind: "directive", type: i5.FsTabsTabDirective, selector: "mat-tab,matTab", inputs: ["name", "data"], exportAs: ["fsTabsTab"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i6.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i6.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: "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: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { 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: MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { 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: 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: 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: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
211
269
  }
212
270
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentSettingsComponent, decorators: [{
213
271
  type: Component,
@@ -222,12 +280,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
222
280
  MatDialogTitle,
223
281
  MatDialogContent,
224
282
  MatDialogActions,
283
+ MatDialogClose,
225
284
  MatFormField,
226
285
  MatLabel,
227
286
  MatSuffix,
287
+ MatButton,
228
288
  MatInput,
229
289
  MatSlideToggle,
230
290
  MatTooltip,
231
- ], template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <h1 mat-dialog-title>\n {{ component.title || 'Component' }}\n </h1>\n <mat-dialog-content>\n <mat-tab-group [(selected)]=\"selectedTab\">\n <mat-tab\n label=\"Settings\"\n name=\"settings\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Title\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"title\"\n name=\"title\">\n </mat-form-field>\n <div class=\"subheading-2\">\n Padding\n </div>\n <div class=\"geometry-row\">\n <mat-form-field>\n <mat-label>\n Top\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"3\"\n [(ngModel)]=\"paddingTop\"\n name=\"paddingTop\"\n [fsFormMin]=\"0\">\n <div matTextSuffix>\n in\n </div>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Right\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"3\"\n [(ngModel)]=\"paddingRight\"\n name=\"paddingRight\"\n [fsFormMin]=\"0\">\n <div matTextSuffix>\n in\n </div>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Bottom\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"3\"\n [(ngModel)]=\"paddingBottom\"\n name=\"paddingBottom\"\n [fsFormMin]=\"0\">\n <div matTextSuffix>\n in\n </div>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Left\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"3\"\n [(ngModel)]=\"paddingLeft\"\n name=\"paddingLeft\"\n [fsFormMin]=\"0\">\n <div matTextSuffix>\n in\n </div>\n </mat-form-field>\n </div>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Filters\"\n name=\"filters\">\n <div class=\"tab-body\">\n @if (columnsError) {\n <div class=\"filters-empty error\">\n {{ columnsError }}\n </div>\n } @else if (rows.length) {\n <!-- Every filterable column. Toggle where its control shows: in\n the report bar, on this component, both, or neither. The\n interface (date range vs value picker) follows the data. -->\n <table class=\"filter-table\">\n <thead>\n <tr>\n <th class=\"filter-col-name\">\n Filter\n </th>\n <th class=\"filter-col-type\">\n Type\n </th>\n <th class=\"filter-col-toggle\">\n Report bar\n </th>\n <th class=\"filter-col-toggle\">\n This component\n </th>\n </tr>\n </thead>\n <tbody>\n @for (row of rows; track row.column) {\n <tr>\n <td class=\"filter-col-name\">\n {{ row.label }}\n </td>\n <td class=\"filter-col-type\">\n {{ typeLabel(row.type) }}\n </td>\n <td class=\"filter-col-toggle\">\n <mat-slide-toggle\n [ngModel]=\"row.report\"\n (ngModelChange)=\"setExposure(row, 'report', $event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n matTooltip=\"Show in the report bar\">\n </mat-slide-toggle>\n </td>\n <td class=\"filter-col-toggle\">\n <mat-slide-toggle\n [ngModel]=\"row.component\"\n (ngModelChange)=\"setExposure(row, 'component', $event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n matTooltip=\"Show on this component\">\n </mat-slide-toggle>\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @else {\n <div class=\"filters-empty\">\n This component has no filterable columns yet \u2014 give it some SQL first.\n </div>\n }\n </div>\n </mat-tab>\n <mat-tab\n label=\"SQL\"\n name=\"sql\">\n <div class=\"tab-body\">\n <pre class=\"code-block\">\n {{ component.sql }}\n </pre>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Config\"\n name=\"config\">\n <div class=\"tab-body\">\n <pre class=\"code-block\">\n {{ configJson }}\n </pre>\n </div>\n </mat-tab>\n </mat-tab-group>\n </mat-dialog-content>\n <mat-dialog-actions>\n <fs-form-dialog-actions\n [save]=\"selectedTab === 'settings'\"\n [done]=\"selectedTab !== 'settings'\">\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}.geometry-row{display:flex;gap:8px}.geometry-row mat-form-field{flex:1}.filter-table{border-spacing:0;width:100%;border-collapse:collapse}.filter-table thead th{color:#8f8f8f;font-weight:400;font-size:85%;text-align:left;padding:8px 16px}.filter-table tbody tr{clip-path:xywh(0 3px 100% calc(100% - 6px) round 10px)}.filter-table tbody td{border:none;background-color:#fafafa;padding:8px 16px;vertical-align:middle;text-align:left}.filter-table .filter-col-name{font-weight:600;color:#1f2933}.filter-table .filter-col-type{color:#7b8794;width:120px}.filter-table .filter-col-toggle,.filter-table th.filter-col-toggle{width:130px;text-align:center}.filters-empty{font-size:13px;color:#7b8794;padding:8px 0 4px}.filters-empty.error{color:#e15759}.code-block{margin:0;padding:10px 12px;background:#1f2933;color:#e4e7eb;border-radius:6px;font-family:JetBrains Mono,Consolas,monospace;font-size:12px;line-height:1.5;white-space:pre-wrap;word-break:break-word;max-height:240px;overflow:auto}\n"] }]
291
+ ], template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <h1 mat-dialog-title>\n {{ component.title || 'Component' }}\n </h1>\n <mat-dialog-content>\n <mat-tab-group [(selected)]=\"selectedTab\">\n <mat-tab\n label=\"Settings\"\n name=\"settings\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Title\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"title\"\n name=\"title\">\n </mat-form-field>\n <div class=\"subheading-2\">\n Padding\n </div>\n <div class=\"geometry-row\">\n <mat-form-field>\n <mat-label>\n Top\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"3\"\n [(ngModel)]=\"paddingTop\"\n name=\"paddingTop\"\n [fsFormMin]=\"0\">\n <div matTextSuffix>\n in\n </div>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Right\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"3\"\n [(ngModel)]=\"paddingRight\"\n name=\"paddingRight\"\n [fsFormMin]=\"0\">\n <div matTextSuffix>\n in\n </div>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Bottom\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"3\"\n [(ngModel)]=\"paddingBottom\"\n name=\"paddingBottom\"\n [fsFormMin]=\"0\">\n <div matTextSuffix>\n in\n </div>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Left\n </mat-label>\n <input\n matInput\n fsMaskNumber\n [scale]=\"3\"\n [(ngModel)]=\"paddingLeft\"\n name=\"paddingLeft\"\n [fsFormMin]=\"0\">\n <div matTextSuffix>\n in\n </div>\n </mat-form-field>\n </div>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Filters\"\n name=\"filters\">\n <div class=\"tab-body\">\n @if (columnsError) {\n <div class=\"filters-empty error\">\n {{ columnsError }}\n </div>\n } @else if (rows.length) {\n <!-- Every filterable column. Toggle where its control shows: in\n the report bar, on this component, both, or neither. The\n interface (date range vs value picker) follows the data. -->\n <table class=\"filter-table\">\n <thead>\n <tr>\n <th class=\"filter-col-name\">\n Filter\n </th>\n <th class=\"filter-col-type\">\n Type\n </th>\n <th class=\"filter-col-toggle\">\n Report bar\n </th>\n <th class=\"filter-col-toggle\">\n This component\n </th>\n </tr>\n </thead>\n <tbody>\n @for (row of rows; track row.column) {\n <tr>\n <td class=\"filter-col-name\">\n {{ row.label }}\n </td>\n <td class=\"filter-col-type\">\n {{ typeLabel(row.type) }}\n </td>\n <td class=\"filter-col-toggle\">\n <mat-slide-toggle\n [ngModel]=\"row.report\"\n (ngModelChange)=\"setExposure(row, 'report', $event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n matTooltip=\"Show in the report bar\">\n </mat-slide-toggle>\n </td>\n <td class=\"filter-col-toggle\">\n <mat-slide-toggle\n [ngModel]=\"row.component\"\n (ngModelChange)=\"setExposure(row, 'component', $event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n matTooltip=\"Show on this component\">\n </mat-slide-toggle>\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @else {\n <div class=\"filters-empty\">\n This component has no filterable columns yet \u2014 give it some SQL first.\n </div>\n }\n </div>\n </mat-tab>\n <mat-tab\n label=\"SQL\"\n name=\"sql\">\n <div class=\"tab-body\">\n @if (sqlError) {\n <div class=\"filters-empty error\">\n {{ sqlError }}\n </div>\n } @else if (sql) {\n @if (sqlBaseline) {\n <!-- A derived component's statement is compiled from its\n document with no viewer state, so it is not byte-for-byte\n what produced the numbers on screen. Said here rather than\n left for the reader to discover. -->\n <div class=\"filters-empty\">\n Compiled from this component's query \u2014 no filters applied, times in UTC.\n </div>\n }\n <pre class=\"code-block\">{{ sql }}</pre>\n } @else {\n <div class=\"filters-empty\">\n This component has no SQL yet.\n </div>\n }\n </div>\n </mat-tab>\n <mat-tab\n label=\"Config\"\n name=\"config\">\n <div class=\"tab-body\">\n <pre class=\"code-block\">\n {{ configJson }}\n </pre>\n </div>\n </mat-tab>\n </mat-tab-group>\n </mat-dialog-content>\n <mat-dialog-actions>\n <!-- Save | Delete | Cancel, the standard order. fs-form-dialog-actions\n renders its own Save/Done BEFORE the projected content, which would\n put Delete after Cancel, so `[save]=\"false\"` foots the row here and\n all three buttons are projected in order. Save submits the Settings\n tab; the other tabs persist as you touch them, so they get Done. -->\n <fs-form-dialog-actions [save]=\"false\">\n @if (selectedTab === 'settings') {\n <button\n mat-button\n type=\"submit\"\n color=\"primary\">\n Save\n </button>\n } @else {\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [mat-dialog-close]=\"null\">\n Done\n </button>\n }\n <button\n mat-button\n type=\"button\"\n color=\"warn\"\n (click)=\"delete()\">\n Delete\n </button>\n <button\n mat-button\n type=\"button\"\n class=\"cancel-button\"\n [mat-dialog-close]=\"null\">\n Cancel\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}.geometry-row{display:flex;gap:8px}.geometry-row mat-form-field{flex:1}.filter-table{border-spacing:0;width:100%;border-collapse:collapse}.filter-table thead th{color:#8f8f8f;font-weight:400;font-size:85%;text-align:left;padding:8px 16px}.filter-table tbody tr{clip-path:xywh(0 3px 100% calc(100% - 6px) round 10px)}.filter-table tbody td{border:none;background-color:#fafafa;padding:8px 16px;vertical-align:middle;text-align:left}.filter-table .filter-col-name{font-weight:600;color:#1f2933}.filter-table .filter-col-type{color:#7b8794;width:120px}.filter-table .filter-col-toggle,.filter-table th.filter-col-toggle{width:130px;text-align:center}.filters-empty{font-size:13px;color:#7b8794;padding:8px 0 4px}.filters-empty.error{color:#e15759}.code-block{margin:0;padding:10px 12px;background:#1f2933;color:#e4e7eb;border-radius:6px;font-family:JetBrains Mono,Consolas,monospace;font-size:12px;line-height:1.5;white-space:pre-wrap;word-break:break-word;max-height:240px;overflow:auto}\n"] }]
232
292
  }] });
233
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9kaWFsb2dzL2NvbXBvbmVudC1zZXR0aW5ncy9jb21wb25lbnQtc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvY29tcG9uZW50LXNldHRpbmdzL2NvbXBvbmVudC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdILE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFF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TyxJQUFJLHNDQUFzQyxDQUFDO2dCQUNwRixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzdCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sU0FBUyxDQUFDLE1BQWM7UUFDOUIsT0FBTyxNQUFNO2FBQ1YsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUM7YUFDdkIsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7YUFDcEIsSUFBSSxFQUFFO2FBQ04sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQzt3R0FuTlUsMEJBQTBCOzRGQUExQiwwQkFBMEIsd0VDdEZ2Qyx5aU1BcUxPLHlrQ0RqSEgsV0FBVyx1aUNBQ1gsWUFBWSw2c0NBQ1osWUFBWSxpSEFDWixjQUFjLGdNQUNkLGFBQWEsOEJBQ2IsWUFBWSxtYUFDWixhQUFhLDZvQkFDYixjQUFjLCtIQUNkLGdCQUFnQix5R0FDaEIsZ0JBQWdCLDRIQUNoQixZQUFZLDRMQUNaLFFBQVEsc0RBQ1IsU0FBUyxxSEFDVCxRQUFRLGlVQUNSLGNBQWMsMFVBQ2QsVUFBVTs7NEZBR0QsMEJBQTBCO2tCQXhCdEMsU0FBUztzQ0FHUyx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxXQUFXO3dCQUNYLFlBQVk7d0JBQ1osWUFBWTt3QkFDWixjQUFjO3dCQUNkLGFBQWE7d0JBQ2IsWUFBWTt3QkFDWixhQUFhO3dCQUNiLGNBQWM7d0JBQ2QsZ0JBQWdCO3dCQUNoQixnQkFBZ0I7d0JBQ2hCLFlBQVk7d0JBQ1osUUFBUTt3QkFDUixTQUFTO3dCQUNULFFBQVE7d0JBQ1IsY0FBYzt3QkFDZCxVQUFVO3FCQUNYIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ0FjdGlvbnMsIE1hdERpYWxvZ0NvbnRlbnQsIE1hdERpYWxvZ1JlZiwgTWF0RGlhbG9nVGl0bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkLCBNYXRMYWJlbCwgTWF0U3VmZml4IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdFNsaWRlVG9nZ2xlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlJztcbmltcG9ydCB7IE1hdFRhYnNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgRnNEaWFsb2dNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9kaWFsb2cnO1xuaW1wb3J0IHsgRnNGb3JtTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZm9ybSc7XG5pbXBvcnQgeyBGc0xhYmVsTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGFiZWwnO1xuaW1wb3J0IHsgRnNNYXNrTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWFzayc7XG5pbXBvcnQgeyBGc01lc3NhZ2UgfSBmcm9tICdAZmlyZXN0aXRjaC9tZXNzYWdlJztcbmltcG9ydCB7IEZzVGFic01vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3RhYnMnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7XG4gIENvbXBvbmVudFNldHRpbmdzLFxuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0RmlsdGVyLFxuICBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgUmVwb3J0RmlsdGVyTGV2ZWwsXG4gIFJlcG9ydEZpbHRlclR5cGUsXG4gIFJlcG9ydEZpbHRlcmFibGVDb2x1bW4sXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HIH0gZnJvbSAnLi4vLi4vbGF5b3V0JztcblxuXG4vLyBXaGF0IHRoZSBTZXR0aW5ncyB0YWIgaGFuZHMgYmFjayB3aGVuIGl0IHNhdmVzLiBFdmVyeSBvdGhlciBleGl0IChDYW5jZWwsXG4vLyBEb25lLCBFc2NhcGUsIGJhY2tkcm9wKSBjbG9zZXMgd2l0aCBubyByZXN1bHQg4oCUIGZpbHRlciB3b3JrIGlzIGFubm91bmNlZCBhcyBpdFxuLy8gaGFwcGVucyBpbnN0ZWFkLCB0aHJvdWdoIGBmaWx0ZXJzQ2hhbmdlZGAuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudFNldHRpbmdzUmVzdWx0IHtcbiAgc2V0dGluZ3M6IENvbXBvbmVudFNldHRpbmdzO1xufVxuXG5cbi8vIE9uZSByb3cgb2YgdGhlIEZpbHRlcnMgdGFiIGxpc3Rpbmc6IGEgZmlsdGVyYWJsZSBjb2x1bW4sIHRoZSBpbnRlcmZhY2Vcbi8vIGluZmVycmVkIGZyb20gaXRzIGRhdGEsIGFuZCB3aGVyZSBpdHMgZmlsdGVyIGlzIGV4cG9zZWQgKHRoZSB0d28gdG9nZ2xlcykuXG5pbnRlcmZhY2UgRmlsdGVyUm93IHtcbiAgY29sdW1uOiBzdHJpbmc7XG4gIHR5cGU6IFJlcG9ydEZpbHRlclR5cGU7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHJlcG9ydDogYm9vbGVhbjtcbiAgY29tcG9uZW50OiBib29sZWFuO1xufVxuXG5cbi8vIENvbXBvbmVudCBzZXR0aW5ncywgaW4gdGFiczpcbi8vICAgU2V0dGluZ3Mg4oCUIHRpdGxlIGFuZCBjb250ZW50IHBhZGRpbmcuIFBvc2l0aW9uL3NpemUgYXJlIHR1bmVkIGJ5IGRyYWdnaW5nXG4vLyAgIG9uIHRoZSBjYW52YXM7IGhlaWdodCBiZWhhdmlvdXIgZm9sbG93cyBmcm9tIHRoZSBjb21wb25lbnQgdHlwZS5cbi8vICAgRmlsdGVycyAg4oCUIE9ORSBsaXN0aW5nIG9mIGV2ZXJ5IGZpbHRlcmFibGUgY29sdW1uIG9uIHRoaXMgY29tcG9uZW50LiBFYWNoXG4vLyAgIHJvdyBjYXJyaWVzIHR3byB0b2dnbGVzOiBzaG93IGluIHRoZSByZXBvcnQgYmFyIGFuZC9vciBzaG93IG9uIHRoaXNcbi8vICAgY29tcG9uZW50IChib3RoLCBlaXRoZXIsIG9yIG5laXRoZXIpLiBUaGUgaW50ZXJmYWNlIChkYXRlIHJhbmdlIHZzIHZhbHVlXG4vLyAgIHBpY2tlcikgaXMgaW5mZXJyZWQgZnJvbSB0aGUgZGF0YSwgbmV2ZXIgY2hvc2VuLiBFYWNoIHRvZ2dsZSBwZXJzaXN0c1xuLy8gICBpbW1lZGlhdGVseSBhbmQgcmVmcmVzaGVzIHRoZSBpbi1kaWFsb2cgbGlzdC5cbi8vICAgU1FMIC8gQ29uZmlnIOKAlCByZWFkLW9ubHkgZGlhZ25vc3RpY3MuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbXBvbmVudC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbXBvbmVudC1zZXR0aW5ncy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZvcm1zTW9kdWxlLFxuICAgIEZzRm9ybU1vZHVsZSxcbiAgICBGc01hc2tNb2R1bGUsXG4gICAgRnNEaWFsb2dNb2R1bGUsXG4gICAgRnNMYWJlbE1vZHVsZSxcbiAgICBGc1RhYnNNb2R1bGUsXG4gICAgTWF0VGFic01vZHVsZSxcbiAgICBNYXREaWFsb2dUaXRsZSxcbiAgICBNYXREaWFsb2dDb250ZW50LFxuICAgIE1hdERpYWxvZ0FjdGlvbnMsXG4gICAgTWF0Rm9ybUZpZWxkLFxuICAgIE1hdExhYmVsLFxuICAgIE1hdFN1ZmZpeCxcbiAgICBNYXRJbnB1dCxcbiAgICBNYXRTbGlkZVRvZ2dsZSxcbiAgICBNYXRUb29sdGlwLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRTZXR0aW5nc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgLy8gQSBmaWx0ZXIgd2FzIGFkZGVkLCByZW1vdmVkIG9yIHJlLWxldmVsbGVkLCBzbyB0aGUgcmVwb3J0J3MgZmlsdGVyIGdyb3Vwc1xuICAvLyBjaGFuZ2VkLiBUaG9zZSBtdXRhdGlvbnMgcGVyc2lzdCB0aGUgbW9tZW50IHRoZXkgYXJlIGNsaWNrZWQgYW5kIHRoZSBkaWFsb2dcbiAgLy8gY2FuIHRoZW4gYmUgZGlzbWlzc2VkIGJ5IGEgcm91dGUgdGhhdCBjYXJyaWVzIG5vIHJlc3VsdCAoRXNjYXBlLCBiYWNrZHJvcCksXG4gIC8vIHNvIHRoZSBwYWdlIGlzIHRvbGQgaGVyZSByYXRoZXIgdGhhbiB0aHJvdWdoIHRoZSBjbG9zZSByZXN1bHQuXG4gIHB1YmxpYyByZWFkb25seSBmaWx0ZXJzQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBwdWJsaWMgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQ7XG4gIHB1YmxpYyByZXBvcnQ6IFJlcG9ydDtcblxuICBwdWJsaWMgc2VsZWN0ZWRUYWIgPSAnc2V0dGluZ3MnO1xuXG4gIHB1YmxpYyB0aXRsZSA9ICcnO1xuXG4gIC8vIENvbXBvbmVudCBwYWRkaW5nIGluIGluY2hlcy4gYG51bWJlciB8IHN0cmluZ2AgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyB0aGVcbiAgLy8gcGFnZSBkaW1lbnNpb25zIGluIHJlcG9ydC1zZXR0aW5nczogZnNNYXNrTnVtYmVyIHNlZWRzIGZyb20gdGhlIG51bWJlciBidXRcbiAgLy8gaGFuZHMgYmFjayB0aGUgdW5tYXNrZWQgc3RyaW5nLCBhbmQgc2F2ZSBjYXN0cyBpdCBvbmNlIG9uIHRoZSB3YXkgb3V0LlxuICBwdWJsaWMgcGFkZGluZ1RvcDogbnVtYmVyIHwgc3RyaW5nID0gREVGQVVMVF9DT01QT05FTlRfUEFERElORztcbiAgcHVibGljIHBhZGRpbmdSaWdodDogbnVtYmVyIHwgc3RyaW5nID0gREVGQVVMVF9DT01QT05FTlRfUEFERElORztcbiAgcHVibGljIHBhZGRpbmdCb3R0b206IG51bWJlciB8IHN0cmluZyA9IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkc7XG4gIHB1YmxpYyBwYWRkaW5nTGVmdDogbnVtYmVyIHwgc3RyaW5nID0gREVGQVVMVF9DT01QT05FTlRfUEFERElORztcblxuICBwdWJsaWMgY29uZmlnSnNvbiA9ICcnO1xuXG4gIC8vIC0tLS0gZmlsdGVyIG1hbmFnZW1lbnQgc3RhdGUgLS0tLVxuICAvLyBPbmUgcm93IHBlciBmaWx0ZXJhYmxlIGNvbHVtbi4gVGhlIHR3byBib29sZWFucyBkcml2ZSB0aGUgdG9nZ2xlczsgd2UgZmxpcFxuICAvLyB0aGVtIG9wdGltaXN0aWNhbGx5IG9uIGNsaWNrIChzbyB0aGUgVUkgbmV2ZXIgYmxpbmtzIHdoaWxlIHRoZSByZXF1ZXN0IGlzXG4gIC8vIGluIGZsaWdodCkgYW5kIHJlY29uY2lsZSBmcm9tIHRoZSBzZXJ2ZXIgb24gcmVsb2FkLlxuICBwdWJsaWMgcm93czogRmlsdGVyUm93W10gPSBbXTtcbiAgcHVibGljIGNvbHVtbnNFcnJvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gVGhlIHJhdyBpbnB1dHMgdGhlIHJvd3MgYXJlIGJ1aWx0IGZyb20uXG4gIHByaXZhdGUgX2ZpbHRlcmFibGVDb2x1bW5zOiBSZXBvcnRGaWx0ZXJhYmxlQ29sdW1uW10gPSBbXTtcbiAgcHJpdmF0ZSBfZmlsdGVyczogUmVwb3J0RmlsdGVyW10gPSBbXTtcbiAgcHJpdmF0ZSBfZ3JvdXBzQnlJZCA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRGaWx0ZXJHcm91cD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF90eXBlTGFiZWxzOiBSZWNvcmQ8UmVwb3J0RmlsdGVyVHlwZSwgc3RyaW5nPiA9IHtcbiAgICBzZWxlY3Q6ICdQaWNrIHZhbHVlcycsXG4gICAgZGF0ZVJhbmdlOiAnRGF0ZSByYW5nZScsXG4gICAga2V5d29yZDogJ1NlYXJjaCB0ZXh0JyxcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kYXRhOiB7IHJlcG9ydDogUmVwb3J0OyBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCB9ID0gaW5qZWN0KE1BVF9ESUFMT0dfREFUQSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpYWxvZ1JlZiA9IGluamVjdDxNYXREaWFsb2dSZWY8Q29tcG9uZW50U2V0dGluZ3NDb21wb25lbnQsIENvbXBvbmVudFNldHRpbmdzUmVzdWx0Pj4oTWF0RGlhbG9nUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbWVzc2FnZSA9IGluamVjdChGc01lc3NhZ2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jZFJlZiA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMucmVwb3J0ID0gdGhpcy5fZGF0YS5yZXBvcnQ7XG4gICAgdGhpcy5jb21wb25lbnQgPSB0aGlzLl9kYXRhLmNvbXBvbmVudDtcblxuICAgIHRoaXMudGl0bGUgPSB0aGlzLmNvbXBvbmVudC50aXRsZSA/PyAnJztcblxuICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLmNvbXBvbmVudC5jb25maWc/LnBhZGRpbmc7XG4gICAgdGhpcy5wYWRkaW5nVG9wID0gcGFkZGluZz8udG9wID8/IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkc7XG4gICAgdGhpcy5wYWRkaW5nUmlnaHQgPSBwYWRkaW5nPy5yaWdodCA/PyBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HO1xuICAgIHRoaXMucGFkZGluZ0JvdHRvbSA9IHBhZGRpbmc/LmJvdHRvbSA/PyBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HO1xuICAgIHRoaXMucGFkZGluZ0xlZnQgPSBwYWRkaW5nPy5sZWZ0ID8/IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkc7XG5cbiAgICB0aGlzLmNvbmZpZ0pzb24gPSBKU09OLnN0cmluZ2lmeSh0aGlzLmNvbXBvbmVudC5jb25maWcgPz8ge30sIG51bGwsIDIpO1xuXG4gICAgdGhpcy5fc2VlZEZpbHRlcnModGhpcy5yZXBvcnQsIHRoaXMuY29tcG9uZW50LmlkKTtcbiAgICB0aGlzLl9sb2FkQ29sdW1ucygpO1xuICB9XG5cbiAgLy8gSHVtYW4tZnJpZW5kbHkgbmFtZSBmb3IgdGhlIGluZmVycmVkIGludGVyZmFjZSBzaG93biBiZXNpZGUgZWFjaCBjb2x1bW4uXG4gIHB1YmxpYyB0eXBlTGFiZWwodHlwZTogUmVwb3J0RmlsdGVyVHlwZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGVMYWJlbHNbdHlwZV0gPz8gdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlID0gKCkgPT4ge1xuICAgIGNvbnN0IHNldHRpbmdzOiBDb21wb25lbnRTZXR0aW5ncyA9IHtcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgcGFkZGluZzoge1xuICAgICAgICB0b3A6IHRoaXMuX3BhZGRpbmcodGhpcy5wYWRkaW5nVG9wKSxcbiAgICAgICAgcmlnaHQ6IHRoaXMuX3BhZGRpbmcodGhpcy5wYWRkaW5nUmlnaHQpLFxuICAgICAgICBib3R0b206IHRoaXMuX3BhZGRpbmcodGhpcy5wYWRkaW5nQm90dG9tKSxcbiAgICAgICAgbGVmdDogdGhpcy5fcGFkZGluZyh0aGlzLnBhZGRpbmdMZWZ0KSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhLnVwZGF0ZUNvbXBvbmVudCh0aGlzLnJlcG9ydC5pZCwgdGhpcy5jb21wb25lbnQuaWQsIHsgLi4uc2V0dGluZ3MgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnQ29tcG9uZW50IHNhdmVkJyk7XG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKHsgc2V0dGluZ3MgfSk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfTtcblxuICAvLyBGbGlwIG9uZSBleHBvc3VyZSAocmVwb3J0IGJhciBvciB0aGlzIGNvbXBvbmVudCkgZm9yIGEgcm93LiBXZSB1cGRhdGUgdGhlXG4gIC8vIHJvdydzIGJvb2xlYW4gZmlyc3Qg4oCUIHNvIHRoZSB0b2dnbGUgc3RheXMgcHV0IHdpdGggbm8gYmxpbmsg4oCUIHRoZW4gcGVyc2lzdFxuICAvLyBhbmQgcmVjb25jaWxlIG9uIHJlbG9hZC4gTmVpdGhlciBvbiDihpIgbm8gZmlsdGVyIChyZW1vdmVkKTsgZWl0aGVyIG9uIOKGkiB0aGVcbiAgLy8gZmlsdGVyIGV4aXN0cyBhdCB0aGUgY29tYmluZWQgbGV2ZWwuIFRoZSBpbnRlcmZhY2UgdHlwZSBpcyBpbmZlcnJlZFxuICAvLyBzZXJ2ZXItc2lkZS5cbiAgcHVibGljIHNldEV4cG9zdXJlKHJvdzogRmlsdGVyUm93LCB0YXJnZXQ6ICdyZXBvcnQnIHwgJ2NvbXBvbmVudCcsIG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgcm93W3RhcmdldF0gPSBvbjtcblxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5fZmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5maWx0ZXJDb2x1bW4gPT09IHJvdy5jb2x1bW4pO1xuXG4gICAgaWYgKCFyb3cucmVwb3J0ICYmICFyb3cuY29tcG9uZW50KSB7XG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgdGhpcy5fcnVuKHRoaXMuX3JlcG9ydERhdGEuZGVsZXRlRmlsdGVyKHRoaXMucmVwb3J0LmlkLCBleGlzdGluZy5pZCkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGV2ZWw6IFJlcG9ydEZpbHRlckxldmVsID0gcm93LnJlcG9ydCAmJiByb3cuY29tcG9uZW50XG4gICAgICA/ICdib3RoJ1xuICAgICAgOiAocm93LnJlcG9ydCA/ICdyZXBvcnQnIDogJ2NvbXBvbmVudCcpO1xuXG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICB0aGlzLl9ydW4odGhpcy5fcmVwb3J0RGF0YS51cGRhdGVGaWx0ZXJHcm91cCh0aGlzLnJlcG9ydC5pZCwgZXhpc3RpbmcuZmlsdGVyR3JvdXBJZCwgeyBsZXZlbCB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3J1bih0aGlzLl9yZXBvcnREYXRhLmFkZEZpbHRlcih0aGlzLnJlcG9ydC5pZCwgdGhpcy5jb21wb25lbnQuaWQsIHtcbiAgICAgICAgZmlsdGVyQ29sdW1uOiByb3cuY29sdW1uLFxuICAgICAgICBsYWJlbDogcm93LmxhYmVsLFxuICAgICAgICBsZXZlbCxcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgcGFkZGluZyBhcyBhIHJlYWwgbnVtYmVyIGZvciB0aGUgd2lyZS4gZnNNYXNrTnVtYmVyIGhhbmRzIGJhY2sgdGhlXG4gIC8vIHVubWFza2VkIHN0cmluZyBpdCBidWlsdCB3aXRoIGEgZml4ZWQgJy4nIHJhZGl4LCBzbyB0aGlzIGlzIGEgc3RyYWlnaHRcbiAgLy8gcGFyc2UgLSB0aGUgd2hvbGUgcmVhc29uIGZvciB0aGUgbWFzayBpcyB0aGF0IGEgbmF0aXZlIG51bWJlciBpbnB1dCB3b3VsZFxuICAvLyBwYWludCAoYW5kIHJlYWQgYmFjaykgdGhlIHZpZXdlcidzIG93biBsb2NhbGUgc2VwYXJhdG9yIGluc3RlYWQuXG4gIHByaXZhdGUgX3BhZGRpbmcodmFsdWU6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IHBhcnNlRmxvYXQodmFsdWUpO1xuICB9XG5cbiAgLy8gUnVuIGEgZmlsdGVyIG11dGF0aW9uLCB0aGVuIHJlbG9hZCB0byByZWNvbmNpbGUgdGhlIG9wdGltaXN0aWMgc3RhdGUuXG4gIHByaXZhdGUgX3J1bihyZXF1ZXN0OiBPYnNlcnZhYmxlPHVua25vd24+KTogdm9pZCB7XG4gICAgcmVxdWVzdC5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4gdGhpcy5fYWZ0ZXJNdXRhdGlvbigpLFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4gdGhpcy5fbXV0YXRpb25FcnJvcihlcnJvciksXG4gICAgfSk7XG4gIH1cblxuICAvLyBCdWlsZCB0aGUgcm93IHZpZXctbW9kZWwgZnJvbSB0aGUgbG9hZGVkIGNvbHVtbnMgKyBmaWx0ZXJzL2dyb3Vwcy4gRWFjaFxuICAvLyByb3cncyB0b2dnbGVzIHJlZmxlY3Qgd2hlcmUgaXRzIGZpbHRlciBncm91cCBpcyBjdXJyZW50bHkgZXhwb3NlZC5cbiAgcHJpdmF0ZSBfcmVidWlsZFJvd3MoKTogdm9pZCB7XG4gICAgdGhpcy5yb3dzID0gdGhpcy5fZmlsdGVyYWJsZUNvbHVtbnMubWFwKChjb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuX2ZpbHRlcnMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuZmlsdGVyQ29sdW1uID09PSBjb2x1bW4uY29sdW1uKTtcbiAgICAgIGNvbnN0IGxldmVsID0gZmlsdGVyID8gdGhpcy5fZ3JvdXBzQnlJZC5nZXQoZmlsdGVyLmZpbHRlckdyb3VwSWQpPy5sZXZlbCA6IHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uOiBjb2x1bW4uY29sdW1uLFxuICAgICAgICB0eXBlOiBjb2x1bW4udHlwZSxcbiAgICAgICAgbGFiZWw6IGZpbHRlcj8ubGFiZWxcbiAgICAgICAgICB8fCB0aGlzLl9ncm91cHNCeUlkLmdldChmaWx0ZXI/LmZpbHRlckdyb3VwSWQgPz8gLTEpPy5sYWJlbFxuICAgICAgICAgIHx8IHRoaXMuX2h1bWFuaXplKGNvbHVtbi5jb2x1bW4pLFxuICAgICAgICByZXBvcnQ6IGxldmVsID09PSAncmVwb3J0JyB8fCBsZXZlbCA9PT0gJ2JvdGgnLFxuICAgICAgICBjb21wb25lbnQ6IGxldmVsID09PSAnY29tcG9uZW50JyB8fCBsZXZlbCA9PT0gJ2JvdGgnLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEFmdGVyIGFueSBmaWx0ZXIgbXV0YXRpb246IHJlLWZldGNoIHRoZSByZXBvcnQgc28gdGhlIGRpYWxvZydzIGZpbHRlciBsaXN0XG4gIC8vIChhbmQgdGhlIHBhcmVudCBjYW52YXMsIG9uIGNsb3NlKSByZWZsZWN0IHRoZSBuZXcgZ3JvdXBzL2xldmVscy5cbiAgcHJpdmF0ZSBfYWZ0ZXJNdXRhdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlcnNDaGFuZ2VkLmVtaXQoKTtcblxuICAgIHRoaXMuX3JlcG9ydERhdGEuZ2V0KHRoaXMucmVwb3J0LmlkKVxuICAgICAgLnN1YnNjcmliZSgocmVwb3J0OiBSZXBvcnQpID0+IHtcbiAgICAgICAgdGhpcy5yZXBvcnQgPSByZXBvcnQ7XG4gICAgICAgIHRoaXMuX3NlZWRGaWx0ZXJzKHJlcG9ydCwgdGhpcy5jb21wb25lbnQuaWQpO1xuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbXV0YXRpb25FcnJvcihlcnJvcjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fbWVzc2FnZS5lcnJvcihlcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgPz8gZXJyb3I/Lm1lc3NhZ2UgPz8gJ0ZpbHRlciBvcGVyYXRpb24gZmFpbGVkJyk7XG4gICAgLy8gUmUtc2VlZCBmcm9tIHRoZSBzZXJ2ZXIgc28gdGhlIG9wdGltaXN0aWMgdG9nZ2xlIHNuYXBzIGJhY2sgdG8gdHJ1dGguXG4gICAgdGhpcy5fYWZ0ZXJNdXRhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VlZEZpbHRlcnMocmVwb3J0OiBSZXBvcnQsIGNvbXBvbmVudElkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ncm91cHNCeUlkID0gbmV3IE1hcCgocmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSkubWFwKChncm91cCkgPT4gW2dyb3VwLmlkLCBncm91cF0pKTtcblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IHJlcG9ydC5wYWdlc1xuICAgICAgLmZsYXRNYXAoKHBhZ2UpID0+IHBhZ2UuY29tcG9uZW50cylcbiAgICAgIC5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PT0gY29tcG9uZW50SWQpO1xuXG4gICAgdGhpcy5fZmlsdGVycyA9IGNvbXBvbmVudD8uZmlsdGVycyA/PyBbXTtcbiAgICB0aGlzLl9yZWJ1aWxkUm93cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9hZENvbHVtbnMoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVwb3J0RGF0YS5jb21wb25lbnRDb2x1bW5zKHRoaXMucmVwb3J0LmlkLCB0aGlzLmNvbXBvbmVudC5pZClcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoY29sdW1uczogUmVwb3J0RmlsdGVyYWJsZUNvbHVtbltdKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZmlsdGVyYWJsZUNvbHVtbnMgPSBjb2x1bW5zID8/IFtdO1xuICAgICAgICAgIHRoaXMuX3JlYnVpbGRSb3dzKCk7XG4gICAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbHVtbnNFcnJvciA9IGVycm9yPy5lcnJvcj8ubWVzc2FnZSA/PyAnQ291bGQgbm90IHJlYWQgdGhlIGNvbXBvbmVudCBjb2x1bW5zJztcbiAgICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaHVtYW5pemUoY29sdW1uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjb2x1bW5cbiAgICAgIC5yZXBsYWNlKC9bX1xcLV0rL2csICcgJylcbiAgICAgIC5yZXBsYWNlKC9cXHMrL2csICcgJylcbiAgICAgIC50cmltKClcbiAgICAgIC5yZXBsYWNlKC9cXGJcXHcvZywgKGNoYXJhY3RlcikgPT4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCkpO1xuICB9XG59XG4iLCI8Zm9ybVxuICAgIGZzRm9ybVxuICAgIFtzdWJtaXRdPVwic2F2ZVwiPlxuICA8ZnMtZGlhbG9nPlxuICAgIDxoMSBtYXQtZGlhbG9nLXRpdGxlPlxuICAgICAge3sgY29tcG9uZW50LnRpdGxlIHx8ICdDb21wb25lbnQnIH19XG4gICAgPC9oMT5cbiAgICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgPG1hdC10YWItZ3JvdXAgWyhzZWxlY3RlZCldPVwic2VsZWN0ZWRUYWJcIj5cbiAgICAgICAgPG1hdC10YWJcbiAgICAgICAgICAgIGxhYmVsPVwiU2V0dGluZ3NcIlxuICAgICAgICAgICAgbmFtZT1cInNldHRpbmdzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZzLWNvbHVtbiB0YWItYm9keVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIFRpdGxlXG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGl0bGVcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWJoZWFkaW5nLTJcIj5cbiAgICAgICAgICAgICAgUGFkZGluZ1xuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2VvbWV0cnktcm93XCI+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgVG9wXG4gICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgZnNNYXNrTnVtYmVyXG4gICAgICAgICAgICAgICAgICBbc2NhbGVdPVwiM1wiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBhZGRpbmdUb3BcIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cInBhZGRpbmdUb3BcIlxuICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1pbl09XCIwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBtYXRUZXh0U3VmZml4PlxuICAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICBSaWdodFxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIGZzTWFza051bWJlclxuICAgICAgICAgICAgICAgICAgW3NjYWxlXT1cIjNcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwYWRkaW5nUmlnaHRcIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cInBhZGRpbmdSaWdodFwiXG4gICAgICAgICAgICAgICAgICBbZnNGb3JtTWluXT1cIjBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IG1hdFRleHRTdWZmaXg+XG4gICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIEJvdHRvbVxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIGZzTWFza051bWJlclxuICAgICAgICAgICAgICAgICAgW3NjYWxlXT1cIjNcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwYWRkaW5nQm90dG9tXCJcbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJwYWRkaW5nQm90dG9tXCJcbiAgICAgICAgICAgICAgICAgIFtmc0Zvcm1NaW5dPVwiMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgbWF0VGV4dFN1ZmZpeD5cbiAgICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgTGVmdFxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIGZzTWFza051bWJlclxuICAgICAgICAgICAgICAgICAgW3NjYWxlXT1cIjNcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwYWRkaW5nTGVmdFwiXG4gICAgICAgICAgICAgICAgICBuYW1lPVwicGFkZGluZ0xlZnRcIlxuICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1pbl09XCIwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBtYXRUZXh0U3VmZml4PlxuICAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICBsYWJlbD1cIkZpbHRlcnNcIlxuICAgICAgICAgICAgbmFtZT1cImZpbHRlcnNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJvZHlcIj5cbiAgICAgICAgICAgIEBpZiAoY29sdW1uc0Vycm9yKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXJzLWVtcHR5IGVycm9yXCI+XG4gICAgICAgICAgICAgICAge3sgY29sdW1uc0Vycm9yIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfSBAZWxzZSBpZiAocm93cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgPCEtLSBFdmVyeSBmaWx0ZXJhYmxlIGNvbHVtbi4gVG9nZ2xlIHdoZXJlIGl0cyBjb250cm9sIHNob3dzOiBpblxuICAgICAgICAgICAgICAgICAgIHRoZSByZXBvcnQgYmFyLCBvbiB0aGlzIGNvbXBvbmVudCwgYm90aCwgb3IgbmVpdGhlci4gVGhlXG4gICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIChkYXRlIHJhbmdlIHZzIHZhbHVlIHBpY2tlcikgZm9sbG93cyB0aGUgZGF0YS4gLS0+XG4gICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImZpbHRlci10YWJsZVwiPlxuICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiZmlsdGVyLWNvbC1uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImZpbHRlci1jb2wtdHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIFR5cGVcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiZmlsdGVyLWNvbC10b2dnbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICBSZXBvcnQgYmFyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImZpbHRlci1jb2wtdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgVGhpcyBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICBAZm9yIChyb3cgb2Ygcm93czsgdHJhY2sgcm93LmNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiZmlsdGVyLWNvbC1uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyByb3cubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZpbHRlci1jb2wtdHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdHlwZUxhYmVsKHJvdy50eXBlKSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiZmlsdGVyLWNvbC10b2dnbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvdy5yZXBvcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZXRFeHBvc3VyZShyb3csICdyZXBvcnQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlNob3cgaW4gdGhlIHJlcG9ydCBiYXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZpbHRlci1jb2wtdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3cuY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2V0RXhwb3N1cmUocm93LCAnY29tcG9uZW50JywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJTaG93IG9uIHRoaXMgY29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXJzLWVtcHR5XCI+XG4gICAgICAgICAgICAgICAgVGhpcyBjb21wb25lbnQgaGFzIG5vIGZpbHRlcmFibGUgY29sdW1ucyB5ZXQg4oCUIGdpdmUgaXQgc29tZSBTUUwgZmlyc3QuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICBsYWJlbD1cIlNRTFwiXG4gICAgICAgICAgICBuYW1lPVwic3FsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1ib2R5XCI+XG4gICAgICAgICAgICA8cHJlIGNsYXNzPVwiY29kZS1ibG9ja1wiPlxuICAgICAgICAgICAgICB7eyBjb21wb25lbnQuc3FsIH19XG4gICAgICAgICAgICA8L3ByZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICA8bWF0LXRhYlxuICAgICAgICAgICAgbGFiZWw9XCJDb25maWdcIlxuICAgICAgICAgICAgbmFtZT1cImNvbmZpZ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYm9keVwiPlxuICAgICAgICAgICAgPHByZSBjbGFzcz1cImNvZGUtYmxvY2tcIj5cbiAgICAgICAgICAgICAge3sgY29uZmlnSnNvbiB9fVxuICAgICAgICAgICAgPC9wcmU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LXRhYj5cbiAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICA8L21hdC1kaWFsb2ctY29udGVudD5cbiAgICA8bWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgICAgPGZzLWZvcm0tZGlhbG9nLWFjdGlvbnNcbiAgICAgICAgW3NhdmVdPVwic2VsZWN0ZWRUYWIgPT09ICdzZXR0aW5ncydcIlxuICAgICAgICBbZG9uZV09XCJzZWxlY3RlZFRhYiAhPT0gJ3NldHRpbmdzJ1wiPlxuICAgICAgPC9mcy1mb3JtLWRpYWxvZy1hY3Rpb25zPlxuICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICA8L2ZzLWRpYWxvZz5cbjwvZm9ybT4iXX0=
293
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9kaWFsb2dzL2NvbXBvbmVudC1zZXR0aW5ncy9jb21wb25lbnQtc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvY29tcG9uZW50LXNldHRpbmdzL2NvbXBvbmVudC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hJLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0ksT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFD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QzdCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sU0FBUyxDQUFDLE1BQWM7UUFDOUIsT0FBTyxNQUFNO2FBQ1YsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUM7YUFDdkIsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7YUFDcEIsSUFBSSxFQUFFO2FBQ04sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQzt3R0FoUlUsMEJBQTBCOzRGQUExQiwwQkFBMEIsd0VDL0Z2Qyw4NFBBdU9PLHlrQ0Q1SkgsV0FBVyx1aUNBQ1gsWUFBWSxzM0NBQ1osWUFBWSxpSEFDWixjQUFjLGdNQUNkLGFBQWEsOEJBQ2IsWUFBWSxtYUFDWixhQUFhLDZvQkFDYixjQUFjLCtIQUNkLGdCQUFnQix5R0FDaEIsZ0JBQWdCLDRIQUNoQixjQUFjLHFMQUNkLFlBQVksNExBQ1osUUFBUSxzREFDUixTQUFTLHFIQUNULFNBQVMsaUxBQ1QsUUFBUSxpVUFDUixjQUFjLDBVQUNkLFVBQVU7OzRGQUdELDBCQUEwQjtrQkExQnRDLFNBQVM7c0NBR1MsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxZQUFZO3dCQUNaLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxhQUFhO3dCQUNiLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixjQUFjO3dCQUNkLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLFlBQVk7d0JBQ1osUUFBUTt3QkFDUixTQUFTO3dCQUNULFNBQVM7d0JBQ1QsUUFBUTt3QkFDUixjQUFjO3dCQUNkLFVBQVU7cUJBQ1giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRGVzdHJveVJlZiwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nQWN0aW9ucywgTWF0RGlhbG9nQ2xvc2UsIE1hdERpYWxvZ0NvbnRlbnQsIE1hdERpYWxvZ1JlZiwgTWF0RGlhbG9nVGl0bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkLCBNYXRMYWJlbCwgTWF0U3VmZml4IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRCdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0SW5wdXQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRTbGlkZVRvZ2dsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NsaWRlLXRvZ2dsZSc7XG5pbXBvcnQgeyBNYXRUYWJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XG5pbXBvcnQgeyBNYXRUb29sdGlwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5cbmltcG9ydCB7IEZzRGlhbG9nTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZGlhbG9nJztcbmltcG9ydCB7IEZzRm9ybU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2Zvcm0nO1xuaW1wb3J0IHsgRnNMYWJlbE1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2xhYmVsJztcbmltcG9ydCB7IEZzTWFza01vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21hc2snO1xuaW1wb3J0IHsgRnNNZXNzYWdlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVzc2FnZSc7XG5pbXBvcnQgeyBGc1Byb21wdCB9IGZyb20gJ0BmaXJlc3RpdGNoL3Byb21wdCc7XG5pbXBvcnQgeyBGc1RhYnNNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC90YWJzJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7XG4gIENvbXBvbmVudFNldHRpbmdzLFxuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0Q29tcG9uZW50U3FsLFxuICBSZXBvcnRGaWx0ZXIsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxuICBSZXBvcnRGaWx0ZXJMZXZlbCxcbiAgUmVwb3J0RmlsdGVyVHlwZSxcbiAgUmVwb3J0RmlsdGVyYWJsZUNvbHVtbixcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkcgfSBmcm9tICcuLi8uLi9sYXlvdXQnO1xuXG5cbi8vIFdoYXQgdGhlIGRpYWxvZyBoYW5kcyBiYWNrLiBUaGUgU2V0dGluZ3MgdGFiJ3MgU2F2ZSBjYXJyaWVzIHRoZSBuZXdcbi8vIGBzZXR0aW5nc2A7IERlbGV0ZSBjYXJyaWVzIGBkZWxldGVkYCBhbmQgbm8gc2V0dGluZ3MsIGJlY2F1c2UgdGhlIGNvbXBvbmVudFxuLy8gaXQgd2FzIG9wZW5lZCBmb3Igbm8gbG9uZ2VyIGV4aXN0cy4gRXZlcnkgb3RoZXIgZXhpdCAoQ2FuY2VsLCBEb25lLCBFc2NhcGUsXG4vLyBiYWNrZHJvcCkgY2xvc2VzIHdpdGggbm8gcmVzdWx0IOKAlCBmaWx0ZXIgd29yayBpcyBhbm5vdW5jZWQgYXMgaXQgaGFwcGVuc1xuLy8gaW5zdGVhZCwgdGhyb3VnaCBgZmlsdGVyc0NoYW5nZWRgLlxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRTZXR0aW5nc1Jlc3VsdCB7XG4gIHNldHRpbmdzPzogQ29tcG9uZW50U2V0dGluZ3M7XG4gIGRlbGV0ZWQ/OiBib29sZWFuO1xufVxuXG5cbi8vIE9uZSByb3cgb2YgdGhlIEZpbHRlcnMgdGFiIGxpc3Rpbmc6IGEgZmlsdGVyYWJsZSBjb2x1bW4sIHRoZSBpbnRlcmZhY2Vcbi8vIGluZmVycmVkIGZyb20gaXRzIGRhdGEsIGFuZCB3aGVyZSBpdHMgZmlsdGVyIGlzIGV4cG9zZWQgKHRoZSB0d28gdG9nZ2xlcykuXG5pbnRlcmZhY2UgRmlsdGVyUm93IHtcbiAgY29sdW1uOiBzdHJpbmc7XG4gIHR5cGU6IFJlcG9ydEZpbHRlclR5cGU7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHJlcG9ydDogYm9vbGVhbjtcbiAgY29tcG9uZW50OiBib29sZWFuO1xufVxuXG5cbi8vIENvbXBvbmVudCBzZXR0aW5ncywgaW4gdGFiczpcbi8vICAgU2V0dGluZ3Mg4oCUIHRpdGxlIGFuZCBjb250ZW50IHBhZGRpbmcuIFBvc2l0aW9uL3NpemUgYXJlIHR1bmVkIGJ5IGRyYWdnaW5nXG4vLyAgIG9uIHRoZSBjYW52YXM7IGhlaWdodCBiZWhhdmlvdXIgZm9sbG93cyBmcm9tIHRoZSBjb21wb25lbnQgdHlwZS5cbi8vICAgRmlsdGVycyAg4oCUIE9ORSBsaXN0aW5nIG9mIGV2ZXJ5IGZpbHRlcmFibGUgY29sdW1uIG9uIHRoaXMgY29tcG9uZW50LiBFYWNoXG4vLyAgIHJvdyBjYXJyaWVzIHR3byB0b2dnbGVzOiBzaG93IGluIHRoZSByZXBvcnQgYmFyIGFuZC9vciBzaG93IG9uIHRoaXNcbi8vICAgY29tcG9uZW50IChib3RoLCBlaXRoZXIsIG9yIG5laXRoZXIpLiBUaGUgaW50ZXJmYWNlIChkYXRlIHJhbmdlIHZzIHZhbHVlXG4vLyAgIHBpY2tlcikgaXMgaW5mZXJyZWQgZnJvbSB0aGUgZGF0YSwgbmV2ZXIgY2hvc2VuLiBFYWNoIHRvZ2dsZSBwZXJzaXN0c1xuLy8gICBpbW1lZGlhdGVseSBhbmQgcmVmcmVzaGVzIHRoZSBpbi1kaWFsb2cgbGlzdC5cbi8vICAgU1FMIC8gQ29uZmlnIOKAlCByZWFkLW9ubHkgZGlhZ25vc3RpY3MuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbXBvbmVudC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbXBvbmVudC1zZXR0aW5ncy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZvcm1zTW9kdWxlLFxuICAgIEZzRm9ybU1vZHVsZSxcbiAgICBGc01hc2tNb2R1bGUsXG4gICAgRnNEaWFsb2dNb2R1bGUsXG4gICAgRnNMYWJlbE1vZHVsZSxcbiAgICBGc1RhYnNNb2R1bGUsXG4gICAgTWF0VGFic01vZHVsZSxcbiAgICBNYXREaWFsb2dUaXRsZSxcbiAgICBNYXREaWFsb2dDb250ZW50LFxuICAgIE1hdERpYWxvZ0FjdGlvbnMsXG4gICAgTWF0RGlhbG9nQ2xvc2UsXG4gICAgTWF0Rm9ybUZpZWxkLFxuICAgIE1hdExhYmVsLFxuICAgIE1hdFN1ZmZpeCxcbiAgICBNYXRCdXR0b24sXG4gICAgTWF0SW5wdXQsXG4gICAgTWF0U2xpZGVUb2dnbGUsXG4gICAgTWF0VG9vbHRpcCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50U2V0dGluZ3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIC8vIEEgZmlsdGVyIHdhcyBhZGRlZCwgcmVtb3ZlZCBvciByZS1sZXZlbGxlZCwgc28gdGhlIHJlcG9ydCdzIGZpbHRlciBncm91cHNcbiAgLy8gY2hhbmdlZC4gVGhvc2UgbXV0YXRpb25zIHBlcnNpc3QgdGhlIG1vbWVudCB0aGV5IGFyZSBjbGlja2VkIGFuZCB0aGUgZGlhbG9nXG4gIC8vIGNhbiB0aGVuIGJlIGRpc21pc3NlZCBieSBhIHJvdXRlIHRoYXQgY2FycmllcyBubyByZXN1bHQgKEVzY2FwZSwgYmFja2Ryb3ApLFxuICAvLyBzbyB0aGUgcGFnZSBpcyB0b2xkIGhlcmUgcmF0aGVyIHRoYW4gdGhyb3VnaCB0aGUgY2xvc2UgcmVzdWx0LlxuICBwdWJsaWMgcmVhZG9ubHkgZmlsdGVyc0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcHVibGljIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50O1xuICBwdWJsaWMgcmVwb3J0OiBSZXBvcnQ7XG5cbiAgcHVibGljIHNlbGVjdGVkVGFiID0gJ3NldHRpbmdzJztcblxuICBwdWJsaWMgdGl0bGUgPSAnJztcblxuICAvLyBDb21wb25lbnQgcGFkZGluZyBpbiBpbmNoZXMuIGBudW1iZXIgfCBzdHJpbmdgIGZvciB0aGUgc2FtZSByZWFzb24gYXMgdGhlXG4gIC8vIHBhZ2UgZGltZW5zaW9ucyBpbiByZXBvcnQtc2V0dGluZ3M6IGZzTWFza051bWJlciBzZWVkcyBmcm9tIHRoZSBudW1iZXIgYnV0XG4gIC8vIGhhbmRzIGJhY2sgdGhlIHVubWFza2VkIHN0cmluZywgYW5kIHNhdmUgY2FzdHMgaXQgb25jZSBvbiB0aGUgd2F5IG91dC5cbiAgcHVibGljIHBhZGRpbmdUb3A6IG51bWJlciB8IHN0cmluZyA9IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkc7XG4gIHB1YmxpYyBwYWRkaW5nUmlnaHQ6IG51bWJlciB8IHN0cmluZyA9IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkc7XG4gIHB1YmxpYyBwYWRkaW5nQm90dG9tOiBudW1iZXIgfCBzdHJpbmcgPSBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HO1xuICBwdWJsaWMgcGFkZGluZ0xlZnQ6IG51bWJlciB8IHN0cmluZyA9IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkc7XG5cbiAgcHVibGljIGNvbmZpZ0pzb24gPSAnJztcblxuICAvLyAtLS0tIFNRTCB0YWIgc3RhdGUgLS0tLVxuICAvLyBUaGUgc3RhdGVtZW50LCBvbmNlIGZldGNoZWQuIE51bGwgd2hpbGUgaXQgaXMgaW4gZmxpZ2h0LCBhbmQgbnVsbCB3aGVuIHRoZVxuICAvLyBjb21wb25lbnQncyBkb2N1bWVudCBjb3VsZCBub3QgYmUgY29tcGlsZWQgKHNxbEVycm9yIHRoZW4gc2F5cyB3aHkpLlxuICBwdWJsaWMgc3FsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLy8gVHJ1ZSB3aGVuIHRoZSBzdGF0ZW1lbnQgaXMgYSBERVJJVkVEIGJhc2VsaW5lOiBubyBmaWx0ZXJzLCBVVEMsIHRoZVxuICAvLyBhdXRob3JlZCBncmFpbi4gVGhlIHRhYiBzYXlzIHNvLCBiZWNhdXNlIHRoZSBudW1iZXJzIG9uIHNjcmVlbiBjb21lIGZyb21cbiAgLy8gdGhpcyBzdGF0ZW1lbnQgcGx1cyB0aGUgdmlld2VyJ3Mgb3duIGNob2ljZXMgYW5kIHRoZSB0d28gY2FuIGRpZmZlci5cbiAgcHVibGljIHNxbEJhc2VsaW5lID0gZmFsc2U7XG4gIHB1YmxpYyBzcWxFcnJvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gLS0tLSBmaWx0ZXIgbWFuYWdlbWVudCBzdGF0ZSAtLS0tXG4gIC8vIE9uZSByb3cgcGVyIGZpbHRlcmFibGUgY29sdW1uLiBUaGUgdHdvIGJvb2xlYW5zIGRyaXZlIHRoZSB0b2dnbGVzOyB3ZSBmbGlwXG4gIC8vIHRoZW0gb3B0aW1pc3RpY2FsbHkgb24gY2xpY2sgKHNvIHRoZSBVSSBuZXZlciBibGlua3Mgd2hpbGUgdGhlIHJlcXVlc3QgaXNcbiAgLy8gaW4gZmxpZ2h0KSBhbmQgcmVjb25jaWxlIGZyb20gdGhlIHNlcnZlciBvbiByZWxvYWQuXG4gIHB1YmxpYyByb3dzOiBGaWx0ZXJSb3dbXSA9IFtdO1xuICBwdWJsaWMgY29sdW1uc0Vycm9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvLyBUaGUgcmF3IGlucHV0cyB0aGUgcm93cyBhcmUgYnVpbHQgZnJvbS5cbiAgcHJpdmF0ZSBfZmlsdGVyYWJsZUNvbHVtbnM6IFJlcG9ydEZpbHRlcmFibGVDb2x1bW5bXSA9IFtdO1xuICBwcml2YXRlIF9maWx0ZXJzOiBSZXBvcnRGaWx0ZXJbXSA9IFtdO1xuICBwcml2YXRlIF9ncm91cHNCeUlkID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydEZpbHRlckdyb3VwPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3R5cGVMYWJlbHM6IFJlY29yZDxSZXBvcnRGaWx0ZXJUeXBlLCBzdHJpbmc+ID0ge1xuICAgIHNlbGVjdDogJ1BpY2sgdmFsdWVzJyxcbiAgICBkYXRlUmFuZ2U6ICdEYXRlIHJhbmdlJyxcbiAgICBrZXl3b3JkOiAnU2VhcmNoIHRleHQnLFxuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RhdGE6IHsgcmVwb3J0OiBSZXBvcnQ7IGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50IH0gPSBpbmplY3QoTUFUX0RJQUxPR19EQVRBKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGlhbG9nUmVmID0gaW5qZWN0PE1hdERpYWxvZ1JlZjxDb21wb25lbnRTZXR0aW5nc0NvbXBvbmVudCwgQ29tcG9uZW50U2V0dGluZ3NSZXN1bHQ+PihNYXREaWFsb2dSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Byb21wdCA9IGluamVjdChGc1Byb21wdCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NkUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZXBvcnQgPSB0aGlzLl9kYXRhLnJlcG9ydDtcbiAgICB0aGlzLmNvbXBvbmVudCA9IHRoaXMuX2RhdGEuY29tcG9uZW50O1xuXG4gICAgdGhpcy50aXRsZSA9IHRoaXMuY29tcG9uZW50LnRpdGxlID8/ICcnO1xuXG4gICAgY29uc3QgcGFkZGluZyA9IHRoaXMuY29tcG9uZW50LmNvbmZpZz8ucGFkZGluZztcbiAgICB0aGlzLnBhZGRpbmdUb3AgPSBwYWRkaW5nPy50b3AgPz8gREVGQVVMVF9DT01QT05FTlRfUEFERElORztcbiAgICB0aGlzLnBhZGRpbmdSaWdodCA9IHBhZGRpbmc/LnJpZ2h0ID8/IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkc7XG4gICAgdGhpcy5wYWRkaW5nQm90dG9tID0gcGFkZGluZz8uYm90dG9tID8/IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkc7XG4gICAgdGhpcy5wYWRkaW5nTGVmdCA9IHBhZGRpbmc/LmxlZnQgPz8gREVGQVVMVF9DT01QT05FTlRfUEFERElORztcblxuICAgIHRoaXMuY29uZmlnSnNvbiA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY29tcG9uZW50LmNvbmZpZyA/PyB7fSwgbnVsbCwgMik7XG5cbiAgICB0aGlzLl9zZWVkRmlsdGVycyh0aGlzLnJlcG9ydCwgdGhpcy5jb21wb25lbnQuaWQpO1xuICAgIHRoaXMuX2xvYWRDb2x1bW5zKCk7XG4gICAgdGhpcy5fbG9hZFNxbCgpO1xuICB9XG5cbiAgLy8gSHVtYW4tZnJpZW5kbHkgbmFtZSBmb3IgdGhlIGluZmVycmVkIGludGVyZmFjZSBzaG93biBiZXNpZGUgZWFjaCBjb2x1bW4uXG4gIHB1YmxpYyB0eXBlTGFiZWwodHlwZTogUmVwb3J0RmlsdGVyVHlwZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGVMYWJlbHNbdHlwZV0gPz8gdHlwZTtcbiAgfVxuXG4gIC8vIENvbmZpcm0gYW5kIGRlbGV0ZSBoZXJlLCB3aGlsZSB0aGUgZGlhbG9nIGlzIHN0aWxsIG9wZW4sIHRoZW4gY2xvc2Ugd2l0aCBhXG4gIC8vIGBkZWxldGVkYCByZXN1bHQgZm9yIHRoZSBwYWdlIHRvIGFjdCBvbiDigJQgdGhlIHNhbWUgc2hhcGUgdGhlIHJlcG9ydFxuICAvLyBzZXR0aW5ncyBkaWFsb2cgdXNlcyBmb3IgZGVsZXRpbmcgYSByZXBvcnQuXG4gIC8vXG4gIC8vIFRoZSBjb25maXJtIHNheXMgaXQgY2Fubm90IGJlIHVuZG9uZSBiZWNhdXNlLCBmcm9tIHRoZSBVSSwgaXQgY2Fubm90OiB0aGVcbiAgLy8gcm93IGlzIHNvZnQtZGVsZXRlZCBzZXJ2ZXItc2lkZSBidXQgbm90aGluZyBoZXJlIHJlc3RvcmVzIGEgY29tcG9uZW50LlxuICBwdWJsaWMgZGVsZXRlKCk6IHZvaWQge1xuICAgIHRoaXMuX3Byb21wdC5jb25maXJtKHtcbiAgICAgIHRpdGxlOiAnRGVsZXRlIENvbXBvbmVudCcsXG4gICAgICB0ZW1wbGF0ZTogYEFyZSB5b3Ugc3VyZSB5b3Ugd291bGQgbGlrZSB0byBkZWxldGUgXCIke3RoaXMuY29tcG9uZW50LnRpdGxlIHx8ICd0aGlzIGNvbXBvbmVudCd9XCI/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gLFxuICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuX3JlcG9ydERhdGEuZGVsZXRlQ29tcG9uZW50KHRoaXMucmVwb3J0LmlkLCB0aGlzLmNvbXBvbmVudC5pZCkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdDb21wb25lbnQgZGVsZXRlZCcpO1xuICAgICAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2UoeyBkZWxldGVkOiB0cnVlIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZSA9ICgpID0+IHtcbiAgICBjb25zdCBzZXR0aW5nczogQ29tcG9uZW50U2V0dGluZ3MgPSB7XG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIHBhZGRpbmc6IHtcbiAgICAgICAgdG9wOiB0aGlzLl9wYWRkaW5nKHRoaXMucGFkZGluZ1RvcCksXG4gICAgICAgIHJpZ2h0OiB0aGlzLl9wYWRkaW5nKHRoaXMucGFkZGluZ1JpZ2h0KSxcbiAgICAgICAgYm90dG9tOiB0aGlzLl9wYWRkaW5nKHRoaXMucGFkZGluZ0JvdHRvbSksXG4gICAgICAgIGxlZnQ6IHRoaXMuX3BhZGRpbmcodGhpcy5wYWRkaW5nTGVmdCksXG4gICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS51cGRhdGVDb21wb25lbnQodGhpcy5yZXBvcnQuaWQsIHRoaXMuY29tcG9uZW50LmlkLCB7IC4uLnNldHRpbmdzIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ0NvbXBvbmVudCBzYXZlZCcpO1xuICAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZi5jbG9zZSh7IHNldHRpbmdzIH0pO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH07XG5cbiAgLy8gRmxpcCBvbmUgZXhwb3N1cmUgKHJlcG9ydCBiYXIgb3IgdGhpcyBjb21wb25lbnQpIGZvciBhIHJvdy4gV2UgdXBkYXRlIHRoZVxuICAvLyByb3cncyBib29sZWFuIGZpcnN0IOKAlCBzbyB0aGUgdG9nZ2xlIHN0YXlzIHB1dCB3aXRoIG5vIGJsaW5rIOKAlCB0aGVuIHBlcnNpc3RcbiAgLy8gYW5kIHJlY29uY2lsZSBvbiByZWxvYWQuIE5laXRoZXIgb24g4oaSIG5vIGZpbHRlciAocmVtb3ZlZCk7IGVpdGhlciBvbiDihpIgdGhlXG4gIC8vIGZpbHRlciBleGlzdHMgYXQgdGhlIGNvbWJpbmVkIGxldmVsLiBUaGUgaW50ZXJmYWNlIHR5cGUgaXMgaW5mZXJyZWRcbiAgLy8gc2VydmVyLXNpZGUuXG4gIHB1YmxpYyBzZXRFeHBvc3VyZShyb3c6IEZpbHRlclJvdywgdGFyZ2V0OiAncmVwb3J0JyB8ICdjb21wb25lbnQnLCBvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHJvd1t0YXJnZXRdID0gb247XG5cbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX2ZpbHRlcnMuZmluZCgoZmlsdGVyKSA9PiBmaWx0ZXIuZmlsdGVyQ29sdW1uID09PSByb3cuY29sdW1uKTtcblxuICAgIGlmICghcm93LnJlcG9ydCAmJiAhcm93LmNvbXBvbmVudCkge1xuICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgIHRoaXMuX3J1bih0aGlzLl9yZXBvcnREYXRhLmRlbGV0ZUZpbHRlcih0aGlzLnJlcG9ydC5pZCwgZXhpc3RpbmcuaWQpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxldmVsOiBSZXBvcnRGaWx0ZXJMZXZlbCA9IHJvdy5yZXBvcnQgJiYgcm93LmNvbXBvbmVudFxuICAgICAgPyAnYm90aCdcbiAgICAgIDogKHJvdy5yZXBvcnQgPyAncmVwb3J0JyA6ICdjb21wb25lbnQnKTtcblxuICAgIGlmIChleGlzdGluZykge1xuICAgICAgdGhpcy5fcnVuKHRoaXMuX3JlcG9ydERhdGEudXBkYXRlRmlsdGVyR3JvdXAodGhpcy5yZXBvcnQuaWQsIGV4aXN0aW5nLmZpbHRlckdyb3VwSWQsIHsgbGV2ZWwgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9ydW4odGhpcy5fcmVwb3J0RGF0YS5hZGRGaWx0ZXIodGhpcy5yZXBvcnQuaWQsIHRoaXMuY29tcG9uZW50LmlkLCB7XG4gICAgICAgIGZpbHRlckNvbHVtbjogcm93LmNvbHVtbixcbiAgICAgICAgbGFiZWw6IHJvdy5sYWJlbCxcbiAgICAgICAgbGV2ZWwsXG4gICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIHBhZGRpbmcgYXMgYSByZWFsIG51bWJlciBmb3IgdGhlIHdpcmUuIGZzTWFza051bWJlciBoYW5kcyBiYWNrIHRoZVxuICAvLyB1bm1hc2tlZCBzdHJpbmcgaXQgYnVpbHQgd2l0aCBhIGZpeGVkICcuJyByYWRpeCwgc28gdGhpcyBpcyBhIHN0cmFpZ2h0XG4gIC8vIHBhcnNlIC0gdGhlIHdob2xlIHJlYXNvbiBmb3IgdGhlIG1hc2sgaXMgdGhhdCBhIG5hdGl2ZSBudW1iZXIgaW5wdXQgd291bGRcbiAgLy8gcGFpbnQgKGFuZCByZWFkIGJhY2spIHRoZSB2aWV3ZXIncyBvd24gbG9jYWxlIHNlcGFyYXRvciBpbnN0ZWFkLlxuICBwcml2YXRlIF9wYWRkaW5nKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgfVxuXG4gIC8vIFJ1biBhIGZpbHRlciBtdXRhdGlvbiwgdGhlbiByZWxvYWQgdG8gcmVjb25jaWxlIHRoZSBvcHRpbWlzdGljIHN0YXRlLlxuICBwcml2YXRlIF9ydW4ocmVxdWVzdDogT2JzZXJ2YWJsZTx1bmtub3duPik6IHZvaWQge1xuICAgIHJlcXVlc3Quc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHRoaXMuX2FmdGVyTXV0YXRpb24oKSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHRoaXMuX211dGF0aW9uRXJyb3IoZXJyb3IpLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gQnVpbGQgdGhlIHJvdyB2aWV3LW1vZGVsIGZyb20gdGhlIGxvYWRlZCBjb2x1bW5zICsgZmlsdGVycy9ncm91cHMuIEVhY2hcbiAgLy8gcm93J3MgdG9nZ2xlcyByZWZsZWN0IHdoZXJlIGl0cyBmaWx0ZXIgZ3JvdXAgaXMgY3VycmVudGx5IGV4cG9zZWQuXG4gIHByaXZhdGUgX3JlYnVpbGRSb3dzKCk6IHZvaWQge1xuICAgIHRoaXMucm93cyA9IHRoaXMuX2ZpbHRlcmFibGVDb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLl9maWx0ZXJzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmZpbHRlckNvbHVtbiA9PT0gY29sdW1uLmNvbHVtbik7XG4gICAgICBjb25zdCBsZXZlbCA9IGZpbHRlciA/IHRoaXMuX2dyb3Vwc0J5SWQuZ2V0KGZpbHRlci5maWx0ZXJHcm91cElkKT8ubGV2ZWwgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbHVtbjogY29sdW1uLmNvbHVtbixcbiAgICAgICAgdHlwZTogY29sdW1uLnR5cGUsXG4gICAgICAgIGxhYmVsOiBmaWx0ZXI/LmxhYmVsXG4gICAgICAgICAgfHwgdGhpcy5fZ3JvdXBzQnlJZC5nZXQoZmlsdGVyPy5maWx0ZXJHcm91cElkID8/IC0xKT8ubGFiZWxcbiAgICAgICAgICB8fCB0aGlzLl9odW1hbml6ZShjb2x1bW4uY29sdW1uKSxcbiAgICAgICAgcmVwb3J0OiBsZXZlbCA9PT0gJ3JlcG9ydCcgfHwgbGV2ZWwgPT09ICdib3RoJyxcbiAgICAgICAgY29tcG9uZW50OiBsZXZlbCA9PT0gJ2NvbXBvbmVudCcgfHwgbGV2ZWwgPT09ICdib3RoJyxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyBBZnRlciBhbnkgZmlsdGVyIG11dGF0aW9uOiByZS1mZXRjaCB0aGUgcmVwb3J0IHNvIHRoZSBkaWFsb2cncyBmaWx0ZXIgbGlzdFxuICAvLyAoYW5kIHRoZSBwYXJlbnQgY2FudmFzLCBvbiBjbG9zZSkgcmVmbGVjdCB0aGUgbmV3IGdyb3Vwcy9sZXZlbHMuXG4gIHByaXZhdGUgX2FmdGVyTXV0YXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJzQ2hhbmdlZC5lbWl0KCk7XG5cbiAgICB0aGlzLl9yZXBvcnREYXRhLmdldCh0aGlzLnJlcG9ydC5pZClcbiAgICAgIC5zdWJzY3JpYmUoKHJlcG9ydDogUmVwb3J0KSA9PiB7XG4gICAgICAgIHRoaXMucmVwb3J0ID0gcmVwb3J0O1xuICAgICAgICB0aGlzLl9zZWVkRmlsdGVycyhyZXBvcnQsIHRoaXMuY29tcG9uZW50LmlkKTtcbiAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX211dGF0aW9uRXJyb3IoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX21lc3NhZ2UuZXJyb3IoZXJyb3I/LmVycm9yPy5tZXNzYWdlID8/IGVycm9yPy5tZXNzYWdlID8/ICdGaWx0ZXIgb3BlcmF0aW9uIGZhaWxlZCcpO1xuICAgIC8vIFJlLXNlZWQgZnJvbSB0aGUgc2VydmVyIHNvIHRoZSBvcHRpbWlzdGljIHRvZ2dsZSBzbmFwcyBiYWNrIHRvIHRydXRoLlxuICAgIHRoaXMuX2FmdGVyTXV0YXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlZWRGaWx0ZXJzKHJlcG9ydDogUmVwb3J0LCBjb21wb25lbnRJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fZ3JvdXBzQnlJZCA9IG5ldyBNYXAoKHJlcG9ydC5maWx0ZXJHcm91cHMgPz8gW10pLm1hcCgoZ3JvdXApID0+IFtncm91cC5pZCwgZ3JvdXBdKSk7XG5cbiAgICBjb25zdCBjb21wb25lbnQgPSByZXBvcnQucGFnZXNcbiAgICAgIC5mbGF0TWFwKChwYWdlKSA9PiBwYWdlLmNvbXBvbmVudHMpXG4gICAgICAuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT09IGNvbXBvbmVudElkKTtcblxuICAgIHRoaXMuX2ZpbHRlcnMgPSBjb21wb25lbnQ/LmZpbHRlcnMgPz8gW107XG4gICAgdGhpcy5fcmVidWlsZFJvd3MoKTtcbiAgfVxuXG4gIC8vIFRoZSBzdGF0ZW1lbnQgdGhlIFNRTCB0YWIgc2hvd3MuIEZldGNoZWQgcmF0aGVyIHRoYW4gcmVhZCBvZmYgdGhlXG4gIC8vIGNvbXBvbmVudDogYSBkZXJpdmVkIGNvbXBvbmVudCBzdG9yZXMgYSBkb2N1bWVudCwgbm90IFNRTCwgc28gaXRzXG4gIC8vIHN0YXRlbWVudCBvbmx5IGV4aXN0cyBvbmNlIHRoZSBiYWNrZW5kIGNvbXBpbGVzIGl0LlxuICAvL1xuICAvLyBMb2FkZWQgaW4gbmdPbkluaXQgYmVzaWRlIHRoZSBjb2x1bW5zLCBOT1Qgb24gdGFiIGFjdGl2YXRpb24uIFRoZSB0YWJzIGFyZVxuICAvLyBub3QgbGF6eSAobm8gbWF0VGFiQ29udGVudCksIGFuZCBzd2l0Y2hpbmcgdGhlIHRhYi1ncm91cCdzIGBbKHNlbGVjdGVkKV1gXG4gIC8vIGJhbmFuYS1ib3ggdG8gYSBvbmUtd2F5IGJpbmRpbmcgcGx1cyAoc2VsZWN0ZWRDaGFuZ2UpIHRvIGdldCBhIGhvb2sgd291bGRcbiAgLy8gYnJlYWsgaXQ6IEZzVGFic0hlYWRlclRhYkdyb3VwRGlyZWN0aXZlIHNlbGYtYXNzaWducyBgdGhpcy5zZWxlY3RlZGAgYmVmb3JlXG4gIC8vIGl0IGVtaXRzLCBzbyB0aGUgZXZlbnQgaXMgZmlsdGVyZWQgb3V0IGFuZCB0aGUgbG9hZCB3b3VsZCBuZXZlciBmaXJlLiBPbmVcbiAgLy8gc21hbGwgcmVxdWVzdCB3aGVuIGEgZGlhbG9nIG9wZW5zIGlzIG5vdCB3b3J0aCB0aGF0IHJpc2suXG4gIHByaXZhdGUgX2xvYWRTcWwoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVwb3J0RGF0YS5jb21wb25lbnRTcWwodGhpcy5yZXBvcnQuaWQsIHRoaXMuY29tcG9uZW50LmlkKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChwcmV2aWV3OiBSZXBvcnRDb21wb25lbnRTcWwpID0+IHtcbiAgICAgICAgICB0aGlzLnNxbCA9IHByZXZpZXc/LnNxbCA/PyBudWxsO1xuICAgICAgICAgIHRoaXMuc3FsQmFzZWxpbmUgPSAhIXByZXZpZXc/LmJhc2VsaW5lO1xuICAgICAgICAgIHRoaXMuc3FsRXJyb3IgPSBwcmV2aWV3Py5lcnJvciA/PyBudWxsO1xuICAgICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5zcWwgPSBudWxsO1xuICAgICAgICAgIHRoaXMuc3FsRXJyb3IgPSBlcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgPz8gJ0NvdWxkIG5vdCByZWFkIHRoZSBjb21wb25lbnQgU1FMJztcbiAgICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9hZENvbHVtbnMoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVwb3J0RGF0YS5jb21wb25lbnRDb2x1bW5zKHRoaXMucmVwb3J0LmlkLCB0aGlzLmNvbXBvbmVudC5pZClcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoY29sdW1uczogUmVwb3J0RmlsdGVyYWJsZUNvbHVtbltdKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZmlsdGVyYWJsZUNvbHVtbnMgPSBjb2x1bW5zID8/IFtdO1xuICAgICAgICAgIHRoaXMuX3JlYnVpbGRSb3dzKCk7XG4gICAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbHVtbnNFcnJvciA9IGVycm9yPy5lcnJvcj8ubWVzc2FnZSA/PyAnQ291bGQgbm90IHJlYWQgdGhlIGNvbXBvbmVudCBjb2x1bW5zJztcbiAgICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaHVtYW5pemUoY29sdW1uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjb2x1bW5cbiAgICAgIC5yZXBsYWNlKC9bX1xcLV0rL2csICcgJylcbiAgICAgIC5yZXBsYWNlKC9cXHMrL2csICcgJylcbiAgICAgIC50cmltKClcbiAgICAgIC5yZXBsYWNlKC9cXGJcXHcvZywgKGNoYXJhY3RlcikgPT4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCkpO1xuICB9XG59XG4iLCI8Zm9ybVxuICAgIGZzRm9ybVxuICAgIFtzdWJtaXRdPVwic2F2ZVwiPlxuICA8ZnMtZGlhbG9nPlxuICAgIDxoMSBtYXQtZGlhbG9nLXRpdGxlPlxuICAgICAge3sgY29tcG9uZW50LnRpdGxlIHx8ICdDb21wb25lbnQnIH19XG4gICAgPC9oMT5cbiAgICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgPG1hdC10YWItZ3JvdXAgWyhzZWxlY3RlZCldPVwic2VsZWN0ZWRUYWJcIj5cbiAgICAgICAgPG1hdC10YWJcbiAgICAgICAgICAgIGxhYmVsPVwiU2V0dGluZ3NcIlxuICAgICAgICAgICAgbmFtZT1cInNldHRpbmdzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZzLWNvbHVtbiB0YWItYm9keVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIFRpdGxlXG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGl0bGVcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWJoZWFkaW5nLTJcIj5cbiAgICAgICAgICAgICAgUGFkZGluZ1xuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2VvbWV0cnktcm93XCI+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgVG9wXG4gICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgZnNNYXNrTnVtYmVyXG4gICAgICAgICAgICAgICAgICBbc2NhbGVdPVwiM1wiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBhZGRpbmdUb3BcIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cInBhZGRpbmdUb3BcIlxuICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1pbl09XCIwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBtYXRUZXh0U3VmZml4PlxuICAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICBSaWdodFxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIGZzTWFza051bWJlclxuICAgICAgICAgICAgICAgICAgW3NjYWxlXT1cIjNcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwYWRkaW5nUmlnaHRcIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cInBhZGRpbmdSaWdodFwiXG4gICAgICAgICAgICAgICAgICBbZnNGb3JtTWluXT1cIjBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IG1hdFRleHRTdWZmaXg+XG4gICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIEJvdHRvbVxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIGZzTWFza051bWJlclxuICAgICAgICAgICAgICAgICAgW3NjYWxlXT1cIjNcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwYWRkaW5nQm90dG9tXCJcbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJwYWRkaW5nQm90dG9tXCJcbiAgICAgICAgICAgICAgICAgIFtmc0Zvcm1NaW5dPVwiMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgbWF0VGV4dFN1ZmZpeD5cbiAgICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgTGVmdFxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIGZzTWFza051bWJlclxuICAgICAgICAgICAgICAgICAgW3NjYWxlXT1cIjNcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwYWRkaW5nTGVmdFwiXG4gICAgICAgICAgICAgICAgICBuYW1lPVwicGFkZGluZ0xlZnRcIlxuICAgICAgICAgICAgICAgICAgW2ZzRm9ybU1pbl09XCIwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBtYXRUZXh0U3VmZml4PlxuICAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICBsYWJlbD1cIkZpbHRlcnNcIlxuICAgICAgICAgICAgbmFtZT1cImZpbHRlcnNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJvZHlcIj5cbiAgICAgICAgICAgIEBpZiAoY29sdW1uc0Vycm9yKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXJzLWVtcHR5IGVycm9yXCI+XG4gICAgICAgICAgICAgICAge3sgY29sdW1uc0Vycm9yIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfSBAZWxzZSBpZiAocm93cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgPCEtLSBFdmVyeSBmaWx0ZXJhYmxlIGNvbHVtbi4gVG9nZ2xlIHdoZXJlIGl0cyBjb250cm9sIHNob3dzOiBpblxuICAgICAgICAgICAgICAgICAgIHRoZSByZXBvcnQgYmFyLCBvbiB0aGlzIGNvbXBvbmVudCwgYm90aCwgb3IgbmVpdGhlci4gVGhlXG4gICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIChkYXRlIHJhbmdlIHZzIHZhbHVlIHBpY2tlcikgZm9sbG93cyB0aGUgZGF0YS4gLS0+XG4gICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImZpbHRlci10YWJsZVwiPlxuICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiZmlsdGVyLWNvbC1uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImZpbHRlci1jb2wtdHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIFR5cGVcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiZmlsdGVyLWNvbC10b2dnbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICBSZXBvcnQgYmFyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImZpbHRlci1jb2wtdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgVGhpcyBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICBAZm9yIChyb3cgb2Ygcm93czsgdHJhY2sgcm93LmNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiZmlsdGVyLWNvbC1uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyByb3cubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZpbHRlci1jb2wtdHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdHlwZUxhYmVsKHJvdy50eXBlKSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiZmlsdGVyLWNvbC10b2dnbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvdy5yZXBvcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZXRFeHBvc3VyZShyb3csICdyZXBvcnQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlNob3cgaW4gdGhlIHJlcG9ydCBiYXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZpbHRlci1jb2wtdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3cuY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2V0RXhwb3N1cmUocm93LCAnY29tcG9uZW50JywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJTaG93IG9uIHRoaXMgY29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXJzLWVtcHR5XCI+XG4gICAgICAgICAgICAgICAgVGhpcyBjb21wb25lbnQgaGFzIG5vIGZpbHRlcmFibGUgY29sdW1ucyB5ZXQg4oCUIGdpdmUgaXQgc29tZSBTUUwgZmlyc3QuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICBsYWJlbD1cIlNRTFwiXG4gICAgICAgICAgICBuYW1lPVwic3FsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1ib2R5XCI+XG4gICAgICAgICAgICBAaWYgKHNxbEVycm9yKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXJzLWVtcHR5IGVycm9yXCI+XG4gICAgICAgICAgICAgICAge3sgc3FsRXJyb3IgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9IEBlbHNlIGlmIChzcWwpIHtcbiAgICAgICAgICAgICAgQGlmIChzcWxCYXNlbGluZSkge1xuICAgICAgICAgICAgICAgIDwhLS0gQSBkZXJpdmVkIGNvbXBvbmVudCdzIHN0YXRlbWVudCBpcyBjb21waWxlZCBmcm9tIGl0c1xuICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQgd2l0aCBubyB2aWV3ZXIgc3RhdGUsIHNvIGl0IGlzIG5vdCBieXRlLWZvci1ieXRlXG4gICAgICAgICAgICAgICAgICAgICB3aGF0IHByb2R1Y2VkIHRoZSBudW1iZXJzIG9uIHNjcmVlbi4gU2FpZCBoZXJlIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICBsZWZ0IGZvciB0aGUgcmVhZGVyIHRvIGRpc2NvdmVyLiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVycy1lbXB0eVwiPlxuICAgICAgICAgICAgICAgICAgQ29tcGlsZWQgZnJvbSB0aGlzIGNvbXBvbmVudCdzIHF1ZXJ5IOKAlCBubyBmaWx0ZXJzIGFwcGxpZWQsIHRpbWVzIGluIFVUQy5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8cHJlIGNsYXNzPVwiY29kZS1ibG9ja1wiPnt7IHNxbCB9fTwvcHJlPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXJzLWVtcHR5XCI+XG4gICAgICAgICAgICAgICAgVGhpcyBjb21wb25lbnQgaGFzIG5vIFNRTCB5ZXQuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICBsYWJlbD1cIkNvbmZpZ1wiXG4gICAgICAgICAgICBuYW1lPVwiY29uZmlnXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1ib2R5XCI+XG4gICAgICAgICAgICA8cHJlIGNsYXNzPVwiY29kZS1ibG9ja1wiPlxuICAgICAgICAgICAgICB7eyBjb25maWdKc29uIH19XG4gICAgICAgICAgICA8L3ByZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgPC9tYXQtdGFiLWdyb3VwPlxuICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICAgIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgICA8IS0tIFNhdmUgfCBEZWxldGUgfCBDYW5jZWwsIHRoZSBzdGFuZGFyZCBvcmRlci4gZnMtZm9ybS1kaWFsb2ctYWN0aW9uc1xuICAgICAgICAgICByZW5kZXJzIGl0cyBvd24gU2F2ZS9Eb25lIEJFRk9SRSB0aGUgcHJvamVjdGVkIGNvbnRlbnQsIHdoaWNoIHdvdWxkXG4gICAgICAgICAgIHB1dCBEZWxldGUgYWZ0ZXIgQ2FuY2VsLCBzbyBgW3NhdmVdPVwiZmFsc2VcImAgZm9vdHMgdGhlIHJvdyBoZXJlIGFuZFxuICAgICAgICAgICBhbGwgdGhyZWUgYnV0dG9ucyBhcmUgcHJvamVjdGVkIGluIG9yZGVyLiBTYXZlIHN1Ym1pdHMgdGhlIFNldHRpbmdzXG4gICAgICAgICAgIHRhYjsgdGhlIG90aGVyIHRhYnMgcGVyc2lzdCBhcyB5b3UgdG91Y2ggdGhlbSwgc28gdGhleSBnZXQgRG9uZS4gLS0+XG4gICAgICA8ZnMtZm9ybS1kaWFsb2ctYWN0aW9ucyBbc2F2ZV09XCJmYWxzZVwiPlxuICAgICAgICBAaWYgKHNlbGVjdGVkVGFiID09PSAnc2V0dGluZ3MnKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgIFNhdmVcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICBbbWF0LWRpYWxvZy1jbG9zZV09XCJudWxsXCI+XG4gICAgICAgICAgICBEb25lXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjb2xvcj1cIndhcm5cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZSgpXCI+XG4gICAgICAgICAgRGVsZXRlXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiXG4gICAgICAgICAgICBbbWF0LWRpYWxvZy1jbG9zZV09XCJudWxsXCI+XG4gICAgICAgICAgQ2FuY2VsXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9mcy1mb3JtLWRpYWxvZy1hY3Rpb25zPlxuICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICA8L2ZzLWRpYWxvZz5cbjwvZm9ybT4iXX0=
@@ -31,4 +31,4 @@ export const ReportStates = [
31
31
  { name: 'Active', value: ReportState.Active },
32
32
  { name: 'Deleted', value: ReportState.Deleted },
33
33
  ];
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNkVBQTZFO0FBQzdFLG1FQUFtRTtBQUNuRSwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLG1DQUFtQztBQW1IbkMsNEVBQTRFO0FBQzVFLDJFQUEyRTtBQUMzRSx1REFBdUQ7QUFDdkQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWdEO0lBQzlFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO0lBQzdCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO0lBQy9CLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0lBQ2pDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO0lBQ3JDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO0NBQ3BDLENBQUM7QUFxTUYsTUFBTSxDQUFOLElBQVksY0FHWDtBQUhELFdBQVksY0FBYztJQUN4QixtQ0FBaUIsQ0FBQTtJQUNqQixtQ0FBaUIsQ0FBQTtBQUNuQixDQUFDLEVBSFcsY0FBYyxLQUFkLGNBQWMsUUFHekI7QUFnQkQsZ0ZBQWdGO0FBQ2hGLDJFQUEyRTtBQUMzRSxnRkFBZ0Y7QUFDaEYsMENBQTBDO0FBQzFDLE1BQU0sQ0FBTixJQUFZLFdBR1g7QUFIRCxXQUFZLFdBQVc7SUFDckIsZ0NBQWlCLENBQUE7SUFDakIsa0NBQW1CLENBQUE7QUFDckIsQ0FBQyxFQUhXLFdBQVcsS0FBWCxXQUFXLFFBR3RCO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHO0lBQzFCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRTtJQUM3QyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxPQUFPLEVBQUU7Q0FDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoZSBhc3NlbWJsZWQgcmVwb3J0IHN0cnVjdHVyZSByZXR1cm5lZCBieSBHRVQgL2FwaS9yZXBvcnRzLzppZCDigJQgY29tcG9zZWRcclxuLy8gc2VydmVyLXNpZGUgZnJvbSB0aGUgbm9ybWFsaXplZCB0YWJsZXMgKHJlcG9ydHMg4oaSIHJlcG9ydF9wYWdlcyDihpJcclxuLy8gcmVwb3J0X2NvbXBvbmVudHMgKyByZXBvcnRfZmlsdGVycywgcGx1cyByZXBvcnRfZmlsdGVyX2dyb3VwcykuIEFsbCBrZXlzIGFyZVxyXG4vLyBjYW1lbENhc2U7IGNvbXBvbmVudCBgY29uZmlnYCBpcyB0aGUgc3RhbmRhcmQgZm9ybWF0IHRoZSByZW5kZXJlciBtYXBzIHRvXHJcbi8vIEVDaGFydHMgb3B0aW9ucyAvIEZzTGlzdCBjb25maWcuXHJcblxyXG4vLyBMYXlvdXQgbW9kZXM6IEZyZWVmb3JtID0gYWJzb2x1dGVseSBwb3NpdGlvbmVkIGNvbXBvbmVudHMgKGRyYWcgYW55d2hlcmUpO1xyXG4vLyBGbG93ID0gY29tcG9uZW50cyBmbG93IGxpa2Ugcm93cywgZWFjaCB0YWtpbmcgZmxvd1dpZHRoICUgb2YgdGhlIHBhZ2Ugd2lkdGguXHJcbmV4cG9ydCB0eXBlIFJlcG9ydExheW91dCA9ICdmcmVlZm9ybScgfCAnZmxvdyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydCB7XHJcbiAgaWQ6IG51bWJlcjtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgbGF5b3V0OiBSZXBvcnRMYXlvdXQ7XHJcbiAgLy8gSUFOQSB0aW1lem9uZSAoZS5nLiBBbWVyaWNhL05ld19Zb3JrKSBhbmNob3JpbmcgZGF0ZSBmaWx0ZXJpbmcgKyBjaGFydCBkYXRlXHJcbiAgLy8gYnVja2V0aW5nLiBudWxsIGZhbGxzIGJhY2sgdG8gdGhlIGFjY291bnQgem9uZSB0aGVuIFVUQyAocmVzb2x2ZWQgc2VydmVyLXNpZGUpLlxyXG4gIHRpbWV6b25lOiBzdHJpbmcgfCBudWxsO1xyXG4gIC8vIFJlcG9ydC1sZXZlbCBjb25maWc6IHR5cG9ncmFwaGljIHN0eWxlcywgZXRjLiAoY2FtZWxDYXNlIEpTT04gY29sdW1uKS5cclxuICBjb25maWc6IFJlcG9ydENvbmZpZztcclxuICAvLyBUaGUgcGFnZSBpbiBJTkNIRVMgKHRoZSByZXBvcnQncyBuYXRpdmUgdW5pdCDigJQgUERGcyBhbmQgUG93ZXJQb2ludCBhcmVcclxuICAvLyBpbmNoLWJhc2VkLCBzbyBleHBvcnRzIGFyZSBkaW1lbnNpb25hbGx5IGV4YWN0KS4gT3JpZW50YXRpb24gaXMgbm90IGEgZmllbGRcclxuICAvLyBvZiBpdHMgb3duOiBhIHBhZ2Ugd2lkZXIgdGhhbiBpdCBpcyB0YWxsIElTIGxhbmRzY2FwZS5cclxuICBwYWdlV2lkdGg6IG51bWJlcjtcclxuICBwYWdlSGVpZ2h0OiBudW1iZXI7XHJcbiAgcGFnZXM6IFJlcG9ydFBhZ2VbXTtcclxuICBmaWx0ZXJHcm91cHM6IFJlcG9ydEZpbHRlckdyb3VwW107XHJcbn1cclxuXHJcbi8vIFJlcG9ydC1sZXZlbCBzdHlsaW5nLiBTaXplcyBhcmUgaW4gUE9JTlRTICgxLzcyXCIpIOKAlCB0aGUgcmVwb3J0J3MgdHlwb2dyYXBoeVxyXG4vLyBtYXBzIDE6MSB0byBQREYgKDcycHQvaW4pIGFuZCBQb3dlclBvaW50IChwb2ludCBmb250IHNpemVzKSwgc28gYSBwb2ludFxyXG4vLyB2YWx1ZSBpcyBkaW1lbnNpb25hbGx5IGV4YWN0IG9uIHNjcmVlbiBhbmQgaW4gZXZlcnkgZXhwb3J0LlxyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydENvbmZpZyB7XHJcbiAgc3R5bGVzPzogUmVwb3J0U3R5bGVzO1xyXG4gIC8vIFRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sLiBPcHRpb25hbCBvbiB0aGUgdHlwZSBiZWNhdXNlIGEgUmVwb3J0Q29uZmlnXHJcbiAgLy8gbGl0ZXJhbCBuZWVkIG5vdCBjYXJyeSBpdDsgdGhlIEFQSSBhbHdheXMgc2VuZHMgaXQsIHJlc29sdmVkLlxyXG4gIGdyb3VwQnk/OiBSZXBvcnRHcm91cEJ5O1xyXG59XHJcblxyXG4vLyBUaGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbCDigJQgdGhlIG9uZSBzd2l0Y2ggdGhhdCByZS1idWNrZXRzIGV2ZXJ5XHJcbi8vIHRpbWUtc2VyaWVzIGNoYXJ0IG9uIHRoZSByZXBvcnQgYmV0d2VlbiBkYXksIHdlZWssIG1vbnRoLCBxdWFydGVyIGFuZCB5ZWFyLlxyXG4vL1xyXG4vLyBJdCBpcyBOT1QgYSBmaWx0ZXI6IGEgZmlsdGVyIG5hcnJvd3Mgd2hpY2ggcm93cyBhcmUgY291bnRlZCwgdGhpcyBjaGFuZ2VzIGhvd1xyXG4vLyB0aGUgc3Vydml2aW5nIHJvd3MgYXJlIGJ1Y2tldGVkLiBJdCBzaGFyZXMgdGhlIHJlcG9ydCdzIGZpbHRlciBiYXIgYmVjYXVzZVxyXG4vLyB0aGF0IGlzIHRoZSBvbmUgcm93IG9mIGNvbnRyb2xzIGEgdmlld2VyIHJlYWRzIGEgcmVwb3J0IHRocm91Z2gg4oCUIHRoZVxyXG4vLyBzZXBhcmF0aW9uIHRoYXQgbWF0dGVycyBpcyBpbiB0aGUgbW9kZWwsIG5vdCBpbiB3aGVyZSB0aGUgY29udHJvbCBpcyBwYWludGVkLlxyXG4vL1xyXG4vLyBBbHdheXMgYXJyaXZlcyBSRVNPTFZFRCAodGhlIGJhY2tlbmQgZmlsbHMgYW4gYWJzZW50IG9yIHBhcnRpYWwgc3RvcmVkIGJsb2NrXHJcbi8vIGluIGZyb20gaXRzIG93biBkZWZhdWx0cyksIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gZGVmYXVsdCBoZXJlIOKAlCByZW5kZXIgd2hhdFxyXG4vLyB5b3UgYXJlIGdpdmVuLlxyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydEdyb3VwQnkge1xyXG4gIGVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBncmFudWxhcml0aWVzOiBDaGFydEdyYW51bGFyaXR5W107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0U3R5bGVzIHtcclxuICBoZWFkaW5nPzogeyBzaXplPzogbnVtYmVyIH07XHJcbn1cclxuXHJcbi8vIENvbnRlbnQgcGFkZGluZyBhcm91bmQgYSBjb21wb25lbnQncyBib2R5LCBpbiBJTkNIRVMgKHRoZSBnZW9tZXRyeSB1bml0KS5cclxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRQYWRkaW5nIHtcclxuICB0b3A/OiBudW1iZXI7XHJcbiAgcmlnaHQ/OiBudW1iZXI7XHJcbiAgYm90dG9tPzogbnVtYmVyO1xyXG4gIGxlZnQ/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0UGFnZSB7XHJcbiAgaWQ6IG51bWJlcjtcclxuICBuYW1lOiBzdHJpbmcgfCBudWxsO1xyXG4gIG9yZGVyOiBudW1iZXI7XHJcbiAgY29tcG9uZW50czogUmVwb3J0Q29tcG9uZW50W107XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFJlcG9ydENvbXBvbmVudFR5cGUgPSAnY2hhcnQnIHwgJ2xpc3QnIHwgJ2twaSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydENvbXBvbmVudCB7XHJcbiAgaWQ6IG51bWJlcjtcclxuICB0eXBlOiBSZXBvcnRDb21wb25lbnRUeXBlO1xyXG4gIHRpdGxlOiBzdHJpbmcgfCBudWxsO1xyXG4gIC8vIEdlb21ldHJ5IGluIElOQ0hFUy4gRnJlZWZvcm06IGFic29sdXRlIHBvc2l0aW9uIG9uIHRoZSBwYWdlIGNhbnZhcy5cclxuICAvLyBGbG93OiBvbmx5IGZsb3dXaWR0aC9vcmRlciBhcHBseTsgeC95IGFyZSByZW1lbWJlcmVkIGZvciBhIHN3aXRjaCBiYWNrIHRvXHJcbiAgLy8gZnJlZWZvcm0uXHJcbiAgeDogbnVtYmVyO1xyXG4gIHk6IG51bWJlcjtcclxuICB3OiBudW1iZXI7XHJcbiAgaDogbnVtYmVyO1xyXG4gIC8vIEhlaWdodCBtb2RlLCBERVJJVkVEIGZyb20gdHlwZSBzZXJ2ZXItc2lkZSAobm90IHN0b3JlZCwgcmVhZC1vbmx5KTogbGlzdHNcclxuICAvLyBhbmQgS1BJIHRpbGVzIGFyZSBhdXRvICh0aGUgYm94IHNpemVzIHRvIGl0cyBjb250ZW50LCBgaGAgaWdub3JlZCk7IGNoYXJ0c1xyXG4gIC8vIGFyZSBhbHdheXMgZml4ZWQgKHVzZSBgaGApIHNvIHRoZXkgZml0IHRoZSBib3ggYW5kIG5ldmVyIG92ZXJmbG93LlxyXG4gIGF1dG9IZWlnaHQ6IGJvb2xlYW47XHJcbiAgLy8gRmxvdyBsYXlvdXQ6ICUgb2YgdGhlIHBhZ2UgY29udGVudCB3aWR0aCB0aGlzIGNvbXBvbmVudCB0YWtlcy5cclxuICBmbG93V2lkdGg6IG51bWJlcjtcclxuICAvLyBGbG93IGxheW91dCBvcmRlcmluZy5cclxuICBvcmRlcjogbnVtYmVyO1xyXG4gIHNxbDogc3RyaW5nIHwgbnVsbDtcclxuICBjb25maWc6IENoYXJ0Q29uZmlnICYgTGlzdENvbmZpZyAmIEtwaUNvbmZpZyAmIENvbXBvbmVudExheW91dENvbmZpZyAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG4gIGZpbHRlcnM6IFJlcG9ydEZpbHRlcltdO1xyXG59XHJcblxyXG4vLyBDcm9zcy10eXBlIGxheW91dC9zdHlsZSBrZXlzIGNhcnJpZWQgaW4gYSBjb21wb25lbnQncyBjb25maWcgKGFsb25nc2lkZSB0aGVcclxuLy8gdHlwZS1zcGVjaWZpYyBjaGFydC9saXN0L2twaSBrZXlzKS5cclxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRMYXlvdXRDb25maWcge1xyXG4gIHBhZGRpbmc/OiBDb21wb25lbnRQYWRkaW5nO1xyXG59XHJcblxyXG4vLyBUaGUgcHJlc2VudGF0aW9uIHNldHRpbmdzIGEgY29tcG9uZW50J3Mgc2V0dGluZ3MgZGlhbG9nIGVkaXRzLiBOZWl0aGVyIGZpZWxkXHJcbi8vIGlzIHBhcnQgb2Ygd2hhdCB0aGUgY29tcG9uZW50IHF1ZXJpZXMsIHNvIGEgY2hhbmdlIHRvIHRoZW0gcmVwYWludHMgd2l0aG91dFxyXG4vLyByZS1ydW5uaW5nIGFueXRoaW5nLlxyXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudFNldHRpbmdzIHtcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIHBhZGRpbmc6IENvbXBvbmVudFBhZGRpbmc7XHJcbn1cclxuXHJcbi8vIFdoZXJlIGEgY2hhcnQncyBsZWdlbmQgc2l0cyByZWxhdGl2ZSB0byB0aGUgcGxvdCwgb3IgJ2hpZGRlbicgdG8gZHJvcCBpdC5cclxuZXhwb3J0IHR5cGUgTGVnZW5kUG9zaXRpb24gPSAndG9wJyB8ICdib3R0b20nIHwgJ2xlZnQnIHwgJ3JpZ2h0JyB8ICdoaWRkZW4nO1xyXG5cclxuZXhwb3J0IHR5cGUgQ2hhcnRHcmFudWxhcml0eSA9ICdkYXknIHwgJ3dlZWsnIHwgJ21vbnRoJyB8ICdxdWFydGVyJyB8ICd5ZWFyJztcclxuXHJcbi8vIEhvdyBlYWNoIGdyYW51bGFyaXR5IHJlYWRzIGluIHRoZSBncm91cC1ieSBjb250cm9sIGFuZCBvbiBhbiBleHBvcnQgY292ZXJcclxuLy8gc2hlZXQuIFdISUNIIG9mIHRoZW0gYSBnaXZlbiByZXBvcnQgb2ZmZXJzIGNvbWVzIGZyb20gaXRzIFJlcG9ydEdyb3VwQnk7XHJcbi8vIHRoaXMgaXMgb25seSB0aGUgbmFtaW5nLiAneWVhcicgcmVhZHMgYXMgXCJBbm51YWxseVwiLlxyXG5leHBvcnQgY29uc3QgR1JBTlVMQVJJVFlfT1BUSU9OUzogeyB2YWx1ZTogQ2hhcnRHcmFudWxhcml0eTsgbmFtZTogc3RyaW5nIH1bXSA9IFtcclxuICB7IHZhbHVlOiAnZGF5JywgbmFtZTogJ0RheScgfSxcclxuICB7IHZhbHVlOiAnd2VlaycsIG5hbWU6ICdXZWVrJyB9LFxyXG4gIHsgdmFsdWU6ICdtb250aCcsIG5hbWU6ICdNb250aCcgfSxcclxuICB7IHZhbHVlOiAncXVhcnRlcicsIG5hbWU6ICdRdWFydGVyJyB9LFxyXG4gIHsgdmFsdWU6ICd5ZWFyJywgbmFtZTogJ0FubnVhbGx5JyB9LFxyXG5dO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDaGFydENvbmZpZyB7XHJcbiAgY2hhcnRUeXBlPzogJ2JhcicgfCAnbGluZScgfCAnYXJlYScgfCAncGllJyB8ICdkb251dCc7XHJcbiAgLy8gRm9yIGtpbmQgJ3RpbWUnLCB0aGUgc2VydmVyIGJ1Y2tldHMgdGhlIHJhdyBkYXRldGltZSBjb2x1bW4gdG8gYGdyYW51bGFyaXR5YFxyXG4gIC8vIGluIHRoZSByZXBvcnQncyB0aW1lem9uZSAodGhlIFNRTCBleHBvc2VzIHRoZSByYXcgY29sdW1uLCB1bmJ1Y2tldGVkKS5cclxuICB4QXhpcz86IHsgY29sdW1uOiBzdHJpbmc7IGtpbmQ/OiAnY2F0ZWdvcnknIHwgJ3RpbWUnOyBncmFudWxhcml0eT86IENoYXJ0R3JhbnVsYXJpdHk7IGxhYmVsPzogc3RyaW5nIH07XHJcbiAgbWVhc3VyZXM/OiBDaGFydE1lYXN1cmVbXTtcclxuICBzcGxpdEJ5PzogeyBjb2x1bW46IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfTtcclxuICAvLyBTaW5nbGUtZGltZW5zaW9uIGJhciBjaGFydHMgb25seTogY29sb3IgZWFjaCBiYXIgYnkgaXRzIG93biBjYXRlZ29yeSBhbmRcclxuICAvLyBzaG93IGEgbGVnZW5kLCBXSVRIT1VUIHNwbGl0dGluZyBpbnRvIG11bHRpcGxlIHNlcmllcyAod2hpY2ggc2xpdmVycyB0aGVcclxuICAvLyBiYXJzKS4gdjEgZXhwZWN0cyBjb2xvckJ5LmNvbHVtbiA9PT0geEF4aXMuY29sdW1uLiBJZ25vcmVkIHdoZW4gc3BsaXRCeSBpc1xyXG4gIC8vIHNldCBvciB0aGUgY2hhcnQgaXNuJ3QgYSBiYXIgY2hhcnQuXHJcbiAgY29sb3JCeT86IHsgY29sdW1uOiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nIH07XHJcbiAgb3JpZW50YXRpb24/OiAndmVydGljYWwnIHwgJ2hvcml6b250YWwnO1xyXG4gIHN0YWNrZWQ/OiBib29sZWFuO1xyXG4gIGxlZ2VuZD86IExlZ2VuZFBvc2l0aW9uO1xyXG4gIHNvcnQ/OiBSZXBvcnRTb3J0O1xyXG4gIGxpbWl0PzogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENoYXJ0TWVhc3VyZSB7XHJcbiAgY29sdW1uOiBzdHJpbmc7XHJcbiAgYWdncmVnYXRpb24/OiAnc3VtJyB8ICdjb3VudCcgfCAnYXZnJyB8ICdtaW4nIHwgJ21heCc7XHJcbiAgbGFiZWw/OiBzdHJpbmc7XHJcbiAgLy8gQXBwbGllZCB0byBhIEtQSSdzIHNpbmdsZSB2YWx1ZSBvbmx5IOKAlCBpdCBpcyBhZ2dyZWdhdGVkIHNlcnZlci1zaWRlIGFmdGVyXHJcbiAgLy8gdGhlIFNRTCBydW5zLCBzbyB0aGUgU1FMIGNhbm5vdCBmb3JtYXQgaXQuIENoYXJ0IG1lYXN1cmVzIHN0YXkgbnVtZXJpYy5cclxuICBmb3JtYXQ/OiAnbnVtYmVyJyB8ICdwZXJjZW50JyB8ICdjdXJyZW5jeSc7XHJcbiAgLy8gSG93IG1hbnkgZGVjaW1hbCBwbGFjZXMgdGhlIHZhbHVlIGlzIHNob3duIHRvLiBGaXhlZCByYXRoZXIgdGhhbiBtYXhpbXVtOlxyXG4gIC8vIGEgY29sdW1uIG9mIHJhdGVzIGlzIHVucmVhZGFibGUgd2hlbiBlYWNoIG9uZSBzaG93cyBhIGRpZmZlcmVudCBudW1iZXIgb2ZcclxuICAvLyBkZWNpbWFscy4gT21pdHRlZCBsZWF2ZXMgdGhlIGxvY2FsZSdzIG93biBkZWZhdWx0LCB3aGljaCBpcyB3aGF0IGV2ZXJ5XHJcbiAgLy8gcmVwb3J0IGF1dGhvcmVkIGJlZm9yZSB0aGlzIGRpZC5cclxuICAvL1xyXG4gIC8vIEl0IGNhbm5vdCBiZSBhcHBsaWVkIGluIHRoZSBTUUw6IHRoZSB2YWx1ZSBpcyBhZ2dyZWdhdGVkIGFmdGVyIHRoZSByZXBvcnQnc1xyXG4gIC8vIGZpbHRlcnMgcnVuLCBzbyBwcmUtcm91bmRpbmcgd291bGQgYnJlYWsgbGl2ZSByZS1maWx0ZXJpbmcgYnkgZGF0ZSByYW5nZSBvclxyXG4gIC8vIHBhcnRuZXIuXHJcbiAgcHJlY2lzaW9uPzogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExpc3RDb25maWcge1xyXG4gIC8vIEEgbGlzdCBjZWxsIHJlbmRlcnMgdGhlIHZhbHVlIHZlcmJhdGltOiBwZXJjZW50IHNpZ25zLCBjdXJyZW5jeSBzeW1ib2xzLFxyXG4gIC8vIHRob3VzYW5kcyBzZXBhcmF0b3JzIGFuZCBkZWNpbWFsIHBsYWNlcyBhcmUgcHJvZHVjZWQgYnkgdGhlIGNvbXBvbmVudCdzXHJcbiAgLy8gU1FMICh0aGUgYmFja2VuZCByZWplY3RzIGFueSBvdGhlciBgZm9ybWF0YCBoZXJlKS4gYGRhdGVgIGlzIHRoZSBleGNlcHRpb25cclxuICAvLyDigJQgYSBkYXRlIGNvbHVtbiBzdGF5cyBhIFJBVyB0aW1lc3RhbXAgc28gdGhlIHJlcG9ydCB0aW1lem9uZSBhbmQgaXRzXHJcbiAgLy8gZGF0ZVJhbmdlIGZpbHRlcnMga2VlcCB3b3JraW5nLCBhbmQgdGhlIHZpZXdlciBsb2NhbGlzZXMgaXQgYXQgcmVuZGVyLlxyXG4gIC8vIEEgU1FMLWZvcm1hdHRlZCBjb2x1bW4gaXMgdGV4dCwgc28gaXQgbmFtZXMgYHNvcnRDb2x1bW5gOiB0aGUgcmF3IG51bWVyaWNcclxuICAvLyBhbGlhcyB0aGUgcXVlcnkgYWxzbyBvdXRwdXRzLCB3aGljaCB0aGUgc2VydmVyIG9yZGVycyBieSBpbnN0ZWFkLlxyXG4gIGNvbHVtbnM/OiB7IGNvbHVtbjogc3RyaW5nOyBsYWJlbD86IHN0cmluZzsgZm9ybWF0PzogJ2RhdGUnOyBzb3J0Q29sdW1uPzogc3RyaW5nIH1bXTtcclxuICBzb3J0PzogUmVwb3J0U29ydDtcclxuICBwYWdlU2l6ZT86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBLcGlDb25maWcge1xyXG4gIG1lYXN1cmU/OiBDaGFydE1lYXN1cmU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0U29ydCB7XHJcbiAgY29sdW1uOiBzdHJpbmc7XHJcbiAgZGlyZWN0aW9uPzogJ2FzYycgfCAnZGVzYyc7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFJlcG9ydEZpbHRlclR5cGUgPSAnZGF0ZVJhbmdlJyB8ICdzZWxlY3QnIHwgJ2tleXdvcmQnO1xyXG5cclxuLy8gV2hlcmUgYSBmaWx0ZXIgZ3JvdXAncyBjb250cm9sIGlzIGV4cG9zZWQuIEEgZ3JvdXAgY2FuIGJlIHNob3duIG9uIGl0c1xyXG4vLyBjb21wb25lbnRzLCBpbiB0aGUgcmVwb3J0IGJhciwgb3IgQk9USCBhdCBvbmNlICh0aGUgdHdvIGFyZSBpbmRlcGVuZGVudFxyXG4vLyB0b2dnbGVzIGluIHRoZSBVSSk7IGEgY29sdW1uIHdpdGggbmVpdGhlciBleHBvc2VkIHNpbXBseSBoYXMgbm8gZmlsdGVyLlxyXG5leHBvcnQgdHlwZSBSZXBvcnRGaWx0ZXJMZXZlbCA9ICdjb21wb25lbnQnIHwgJ3JlcG9ydCcgfCAnYm90aCc7XHJcblxyXG4vLyBPbmUgZmlsdGVyYWJsZSBvdXRwdXQgY29sdW1uIG9mIGEgY29tcG9uZW50J3MgU1FMLCB3aXRoIHRoZSBmaWx0ZXIgaW50ZXJmYWNlXHJcbi8vIElORkVSUkVEIGZyb20gaXRzIGRhdGEgKHRoZSBodW1hbiBuZXZlciBwaWNrcyB0aGUgaW50ZXJmYWNlIOKAlCBpdCBmb2xsb3dzIHRoZVxyXG4vLyBjb2x1bW4ncyB0eXBlKS4gRHJpdmVzIHRoZSBGaWx0ZXJzIHRhYiBsaXN0aW5nLlxyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydEZpbHRlcmFibGVDb2x1bW4ge1xyXG4gIGNvbHVtbjogc3RyaW5nO1xyXG4gIHR5cGU6IFJlcG9ydEZpbHRlclR5cGU7XHJcbn1cclxuXHJcbi8vIEdyb3VuZCB0cnV0aDogb25lIGZpbHRlcmFibGUgb3V0cHV0IGNvbHVtbiBPTiBvbmUgY29tcG9uZW50J3MgU1FMLiBBbHdheXMgYVxyXG4vLyBtZW1iZXIgb2YgYSBmaWx0ZXIgZ3JvdXAg4oCUIHRoZSB1bml0IHRoYXQgbGlua3MgZXF1aXZhbGVudCBmaWx0ZXJzIGFjcm9zc1xyXG4vLyBjb21wb25lbnRzIGFuZCBkZWNpZGVzIHdoZXJlIHRoZSBjb250cm9sIHJlbmRlcnMgKGNvbXBvbmVudCB2cyByZXBvcnQgYmFyKS5cclxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRGaWx0ZXIge1xyXG4gIGlkOiBudW1iZXI7XHJcbiAgY29tcG9uZW50SWQ6IG51bWJlcjtcclxuICBmaWx0ZXJHcm91cElkOiBudW1iZXI7XHJcbiAgZmlsdGVyQ29sdW1uOiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZyB8IG51bGw7XHJcbiAgZW5hYmxlZDogYm9vbGVhbjtcclxuICBoYXNPcHRpb25zOiBib29sZWFuO1xyXG4gIGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbn1cclxuXHJcbi8vIE9uZSBjaG9pY2UgaW4gYSBzZWxlY3QgZmlsdGVyJ3Mgb3B0aW9uIGxpc3QuIFRoZSB2YWx1ZSBpcyB3aGF0IHRoZSBmaWx0ZXJcclxuLy8gbWF0Y2hlcyBvbiBhbmQgZ2V0cyBzdG9yZWQgaW4gYSBzYXZlZCBkZWZhdWx0IOKAlCBmb3IgYW4gZW50aXR5IHRoYXQgaXMgaXRzXHJcbi8vIHN0YWJsZSBpZCwgbmV2ZXIgaXRzIG5hbWUsIHNvIHJlbmFtaW5nIHRoZSBlbnRpdHkgbW92ZXMgdGhlIGxhYmVsIHdpdGhvdXRcclxuLy8gYnJlYWtpbmcgdGhlIGRlZmF1bHQuIFRoZSBsYWJlbCBpcyBvbmx5IGV2ZXIgd2hhdCB0aGUgdmlld2VyIHJlYWRzLlxyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydEZpbHRlck9wdGlvbiB7XHJcbiAgdmFsdWU6IHVua25vd247XHJcbiAgbGFiZWw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRGaWx0ZXJHcm91cCB7XHJcbiAgaWQ6IG51bWJlcjtcclxuICBsYWJlbDogc3RyaW5nIHwgbnVsbDtcclxuICB0eXBlOiBSZXBvcnRGaWx0ZXJUeXBlO1xyXG4gIGxldmVsOiBSZXBvcnRGaWx0ZXJMZXZlbDtcclxuICBvcmRlcjogbnVtYmVyO1xyXG4gIGNvbmZpZzogeyBkZWZhdWx0PzogRmlsdGVyR3JvdXBEZWZhdWx0IH0gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuICBmaWx0ZXJzOiBSZXBvcnRGaWx0ZXJbXTtcclxufVxyXG5cclxuLy8gQSBmaWx0ZXIgZ3JvdXAncyBhdXRob3JlZCBkZWZhdWx0IOKAlCB0aGUgdmFsdWUgdGhhdCBzZWVkcyB0aGUgcmVwb3J0IGJhciBvblxyXG4vLyBldmVyeSBvcGVuLiBTaGFwZSBmb2xsb3dzIHRoZSBncm91cCdzIHR5cGU6IGRhdGVSYW5nZSB1c2VzIHN0YXJ0L2VuZCAoYSBmaXhlZFxyXG4vLyBjYWxlbmRhci1kYXkgcmFuZ2UpIG9yIGEgcmVsYXRpdmUgcHJlc2V0OyBzZWxlY3QgdXNlcyB2YWx1ZXM7IGtleXdvcmQgdXNlc1xyXG4vLyB2YWx1ZS5cclxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJHcm91cERlZmF1bHQge1xyXG4gIC8vIGRhdGVSYW5nZSByZWxhdGl2ZSBwcmVzZXQsIHJlc29sdmVkIGFnYWluc3QgXCJub3dcIiBvbiBldmVyeSBvcGVuLiBPbmUgb2Y6XHJcbiAgLy8gdGhpc1dlZWssIGxhc3RXZWVrLCBsYXN0N0RheXMsIGxhc3QzMERheXMsIGxhc3QzTW9udGhzLCBsYXN0Nk1vbnRocyxcclxuICAvLyBsYXN0MTJNb250aHMsIHRoaXNNb250aCwgdGhpc1F1YXJ0ZXIsIHRoaXNZZWFyL3llYXJUb0RhdGUuIFRoZSB3ZWVrIG9uZXNcclxuICAvLyBhcmUgd2hvbGUgY2FsZW5kYXIgZGF5cywgU3VuZGF5IHRvIFNhdHVyZGF5LCBpbiB0aGUgcmVwb3J0J3MgdGltZXpvbmUuXHJcbiAgcmVsYXRpdmU/OiBzdHJpbmc7XHJcbiAgc3RhcnQ/OiBzdHJpbmc7IC8vIGRhdGVSYW5nZSBmaXhlZCBzdGFydCAoeXl5eS1NTS1kZClcclxuICBlbmQ/OiBzdHJpbmc7IC8vIGRhdGVSYW5nZSBmaXhlZCBlbmQgKHl5eXktTU0tZGQpXHJcbiAgdmFsdWVzPzogdW5rbm93bltdOyAvLyBzZWxlY3QgZGVmYXVsdCBwaWNrZWQgdmFsdWVzXHJcbiAgdmFsdWU/OiBzdHJpbmc7IC8vIGtleXdvcmQgZGVmYXVsdCB0ZXh0XHJcbn1cclxuXHJcbi8vIFRoZSBzZXNzaW9uIHZhbHVlIG9mIGEgZmlsdGVyIGdyb3VwIChuZXZlciBwZXJzaXN0ZWQpOiBzaGFwZSBkZXBlbmRzIG9uIHRoZVxyXG4vLyBncm91cCdzIHR5cGUuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyR3JvdXBWYWx1ZSB7XHJcbiAgc3RhcnQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbDsgLy8gZGF0ZVJhbmdlXHJcbiAgZW5kPzogRGF0ZSB8IHN0cmluZyB8IG51bGw7IC8vIGRhdGVSYW5nZVxyXG4gIHZhbHVlcz86IHVua25vd25bXTsgLy8gc2VsZWN0XHJcbiAgdmFsdWU/OiBzdHJpbmc7IC8vIGtleXdvcmRcclxufVxyXG5cclxuLy8gT25lIHJlc29sdmVkIGZpbHRlciBzZW50IHdpdGggYSBjb21wb25lbnQncyBkYXRhIHJlcXVlc3QuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRGaWx0ZXJWYWx1ZSB7XHJcbiAgZmlsdGVySWQ6IG51bWJlcjtcclxuICBzdGFydD86IHN0cmluZztcclxuICBlbmQ/OiBzdHJpbmc7XHJcbiAgdmFsdWVzPzogdW5rbm93bltdO1xyXG4gIHZhbHVlPzogc3RyaW5nO1xyXG59XHJcblxyXG4vLyBQZXItY29tcG9uZW50IGludGVyYWN0aW9uIHN0YXRlIHNlbnQgd2l0aCB0aGUgZGF0YSByZXF1ZXN0OiBsaXN0cyBzZW5kXHJcbi8vIHNvcnQvcGFnaW5nOyB0aW1lLXNlcmllcyBjaGFydHMgc2VuZCB0aGUgZ3JhaW4gcGlja2VkIG9uIHRoZSByZXBvcnQncyBncm91cC1ieVxyXG4vLyBjb250cm9sLCB3aGljaCBvdmVycmlkZXMgdGhlIGF1dGhvcmVkIGdyYW51bGFyaXR5IGZvciB0aGF0IHJlcXVlc3Qgb25seS4gVGhlXHJcbi8vIHdpcmUga2V5IHN0YXlzIGBmcmVxdWVuY3lgIOKAlCBpdCBpcyB0aGUgYnVja2V0aW5nIGZyZXF1ZW5jeSB0aGUgc2VydmVyIGFwcGxpZXMuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50RGF0YVN0YXRlIHtcclxuICBzb3J0PzogUmVwb3J0U29ydDtcclxuICBwYWdlPzogbnVtYmVyO1xyXG4gIHBhZ2VTaXplPzogbnVtYmVyO1xyXG4gIGZyZXF1ZW5jeT86IENoYXJ0R3JhbnVsYXJpdHk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50RGF0YSB7XHJcbiAgY29sdW1uczogc3RyaW5nW107XHJcbiAgcm93czogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcclxuICBwYWdpbmc/OiB7IHRvdGFsOiBudW1iZXI7IHBhZ2U6IG51bWJlcjsgcGFnZVNpemU6IG51bWJlciB9O1xyXG4gIHRydW5jYXRlZDogYm9vbGVhbjtcclxuICAvLyBUaGUgZWZmZWN0aXZlIHRpbWUgYnVja2V0IHRoZSByb3dzIHdlcmUgZ3JvdXBlZCBpbnRvIChhZnRlciBhbnkgZ3JvdXAtYnlcclxuICAvLyBvdmVycmlkZSksIG9yIG51bGwgZm9yIGEgbm9uLXRpbWUgYXhpcy4gRHJpdmVzIHRoZSBjb21wYWN0IHgtYXhpcyBsYWJlbHMuXHJcbiAgZ3JhbnVsYXJpdHk/OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRMaXN0SXRlbSB7XHJcbiAgaWQ6IG51bWJlcjtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgbW9kaWZ5RGF0ZTogc3RyaW5nO1xyXG4gIHN0YXRlPzogUmVwb3J0U3RhdGU7XHJcbiAgLy8gVGhlIGZvbGRlciB0aGUgcmVwb3J0IGlzIGZpbGVkIHVuZGVyLiBudWxsIGlzIGEgcmVhbCwgY29tbW9uIHZhbHVlIOKAlCB0aGVcclxuICAvLyByZXBvcnQgc2l0cyBhdCB0aGUgcm9vdCBvZiB0aGUgbGlzdGluZyB0cmVlIGFsb25nc2lkZSB0aGUgZm9sZGVycy5cclxuICAvL1xyXG4gIC8vIE9wdGlvbmFsIGxpa2UgYHN0YXRlYCBiZXNpZGUgaXQ6IHRoZSBiYWNrZW5kIGFsd2F5cyBzZW5kcyBpdCwgYnV0IG1ha2luZyBpdFxyXG4gIC8vIHJlcXVpcmVkIGlzIGEgYnJlYWtpbmcgdHlwZSBjaGFuZ2UgZm9yIGV2ZXJ5IGNvbnN1bWVyIGhvbGRpbmcgYVxyXG4gIC8vIFJlcG9ydExpc3RJdGVtIGxpdGVyYWwgKGZpeHR1cmVzLCBtb2NrcykgYW5kIGJ1eXMgbm90aGluZyDigJQgdGhlIGxpc3RpbmdcclxuICAvLyByZWFkcyBpdCBhcyBgPz8gbnVsbGAgZWl0aGVyIHdheS5cclxuICByZXBvcnRGb2xkZXJJZD86IG51bWJlciB8IG51bGw7XHJcbn1cclxuXHJcbi8vIE9uZSBmb2xkZXIgaW4gdGhlIGxpc3RpbmcgdHJlZSDigJQgYW4gYXVkaWVuY2UgYnVja2V0IChcIk1hbmFnZW1lbnRcIixcclxuLy8gXCJPcGVyYXRpb25zXCIpIHJlcG9ydHMgYXJlIGZpbGVkIGludG8uIEZvbGRlcnMgbmVzdCB2aWEgcGFyZW50UmVwb3J0Rm9sZGVySWQ7XHJcbi8vIHJlcG9ydHMgbmV2ZXIgZG8sIHNvIHRoZSB0cmVlJ3Mgb25seSBicmFuY2ggbm9kZXMgYXJlIGZvbGRlcnMuXHJcbi8vXHJcbi8vIE5vIHN0YXRlOiBhIGZvbGRlciBpcyBvbmx5IGRlbGV0YWJsZSBvbmNlIGl0IGlzIGVtcHR5LCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvXHJcbi8vIHNvZnQtZGVsZXRlIGFuZCBcIlNob3cgRGVsZXRlZFwiIGlzIGEgcmVwb3J0cy1vbmx5IGNvbmNlcHQuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0Rm9sZGVyIHtcclxuICBpZDogbnVtYmVyO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBwYXJlbnRSZXBvcnRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbDtcclxufVxyXG5cclxuLy8gR0VUIC9hcGkvcmVwb3J0cyByZXR1cm5zIGJvdGggaGFsdmVzIGZsYXQ7IHRoZSBsaXN0aW5nIG5lc3RzIHRoZW0gaXRzZWxmLlxyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydFRyZWUge1xyXG4gIHJlcG9ydHM6IFJlcG9ydExpc3RJdGVtW107XHJcbiAgZm9sZGVyczogUmVwb3J0Rm9sZGVyW107XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFJlcG9ydE5vZGVUeXBlIHtcclxuICBGb2xkZXIgPSAnZm9sZGVyJyxcclxuICBSZXBvcnQgPSAncmVwb3J0JyxcclxufVxyXG5cclxuLy8gT25lIG5vZGUgYXMgZnMtdHJlZSBzZWVzIGl0LiBGb2xkZXJzIGFuZCByZXBvcnRzIHNoYXJlIG9uZSBpZCBzcGFjZSBpbiB0aGVcclxuLy8gdmlldywgc28gdGhlIGlkcyBhcmUgcHJlZml4ZWQgKCdmOjEyJyAvICdyOjM0Jykg4oCUIGBpZGAgaXMgdGhlIG9yaWdpbmFsLFxyXG4vLyBwZXItdGFibGUgaWQgdGhhdCB0aGUgQVBJIGVuZHBvaW50cyB0YWtlLlxyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydE5vZGUge1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIGlkOiBudW1iZXI7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIHR5cGU6IFJlcG9ydE5vZGVUeXBlO1xyXG4gIC8vIE9ubHkgZXZlciBwb3B1bGF0ZWQgb24gYSBmb2xkZXI7IGEgcmVwb3J0IGlzIGFsd2F5cyBhIGxlYWYuXHJcbiAgY2hpbGRyZW46IFJlcG9ydE5vZGVbXTtcclxuICAvLyBQcmVzZW50IG9uIHJlcG9ydCBub2RlcyBvbmx5LlxyXG4gIHJlcG9ydD86IFJlcG9ydExpc3RJdGVtO1xyXG59XHJcblxyXG4vLyBSZXBvcnRzIGFyZSBzb2Z0LWRlbGV0YWJsZTogYSBkZWxldGVkIHJlcG9ydCBsZWF2ZXMgdGhlIGxpc3RpbmcgYnV0IGtlZXBzIGl0c1xyXG4vLyBwYWdlcyBhbmQgY29tcG9uZW50cywgYW5kIHRoZSBsaXN0aW5nJ3MgXCJTaG93IERlbGV0ZWRcIiBtb2RlIHJlc3RvcmVzIGl0LlxyXG4vLyBGb2xkZXJzIGhhdmUgbm8gZXF1aXZhbGVudCDigJQgdGhleSBhcmUgb25seSBkZWxldGFibGUgb25jZSBlbXB0eSwgc28gdGhleSBoYXJkXHJcbi8vIGRlbGV0ZSBhbmQgdGhlcmUgaXMgbm90aGluZyB0byByZXN0b3JlLlxyXG5leHBvcnQgZW51bSBSZXBvcnRTdGF0ZSB7XHJcbiAgQWN0aXZlID0gJ2FjdGl2ZScsXHJcbiAgRGVsZXRlZCA9ICdkZWxldGVkJyxcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFJlcG9ydFN0YXRlcyA9IFtcclxuICB7IG5hbWU6ICdBY3RpdmUnLCB2YWx1ZTogUmVwb3J0U3RhdGUuQWN0aXZlIH0sXHJcbiAgeyBuYW1lOiAnRGVsZXRlZCcsIHZhbHVlOiBSZXBvcnRTdGF0ZS5EZWxldGVkIH0sXHJcbl07XHJcblxyXG4vLyBUaGUgY2hhdCB0dXJuIGZsYWdzIHRoaXMgY29udGV4dCdzIGJhY2tlbmQgYWRkcyAoUmVwb3J0c1xcQWlWaWV3KS5cclxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRDaGF0UmVzcG9uc2Uge1xyXG4gIHJlcG9ydENoYW5nZWQ/OiBib29sZWFuO1xyXG4gIHJlcG9ydFJlbmFtZWQ/OiBib29sZWFuO1xyXG59XHJcblxyXG4vLyBPbmUgdmVyc2lvbiBvZiB0aGUgZ2xvYmFsIEFJIGtub3dsZWRnZSBkb2N1bWVudCDigJQgdGhlIG9wZXJhdG9yLWF1dGhvcmVkXHJcbi8vIG1hcmtkb3duIGFwcGVuZGVkIHRvIHRoZSByZXBvcnQgYWdlbnQncyBzeXN0ZW0gaW5zdHJ1Y3Rpb25zIG9uIGV2ZXJ5IHR1cm4uXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0SW5zdHJ1Y3Rpb24ge1xyXG4gIGlkOiBudW1iZXI7XHJcbiAgY29udGVudDogc3RyaW5nO1xyXG4gIGN1cnJlbnQ6IGJvb2xlYW47XHJcbiAgY3JlYXRlRGF0ZTogRGF0ZTtcclxuICBtb2RpZnlEYXRlOiBEYXRlO1xyXG4gIGFjY291bnRJZDogbnVtYmVyIHwgbnVsbDtcclxuICBhY2NvdW50TmFtZTogc3RyaW5nIHwgbnVsbDtcclxufVxyXG5cclxuLy8gR0VUL1BVVCBpbnN0cnVjdGlvbnMgcGF5bG9hZDogdGhlIGN1cnJlbnQgdmVyc2lvbiAobnVsbCB1bnRpbCBvbmUgaXNcclxuLy8gYXV0aG9yZWQpIHBsdXMgdGhlIGZ1bGwgaGlzdG9yeSwgbmV3ZXN0IGZpcnN0LlxyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydEluc3RydWN0aW9ucyB7XHJcbiAgaW5zdHJ1Y3Rpb25zOiBSZXBvcnRJbnN0cnVjdGlvbiB8IG51bGw7XHJcbiAgdmVyc2lvbnM6IFJlcG9ydEluc3RydWN0aW9uW107XHJcbn1cclxuXHJcbi8vIFRoZSBsYXRlc3Qgc2VtYW50aWMtZGF0YWJhc2UgYnVpbGQgKGFuIGZmX3Byb2Nlc3NlcyByb3cpIOKAlCBlbm91Z2ggZm9yIHRoZVxyXG4vLyBzZXR0aW5ncyBkaWFsb2cgdG8gc2F5IHdoYXQgc3RhdGUgdGhlIGJ1aWxkIGlzIGluIGFuZCB3aGVuIGl0IGxhc3QgcmFuLlxyXG5leHBvcnQgaW50ZXJmYWNlIFNlbWFudGljQnVpbGQge1xyXG4gIGlkOiBudW1iZXI7XHJcbiAgc3RhdGU6IHN0cmluZztcclxuICBwZXJjZW50OiBudW1iZXIgfCBzdHJpbmc7XHJcbiAgbWVzc2FnZTogc3RyaW5nO1xyXG4gIGR1cmF0aW9uOiBudW1iZXI7XHJcbiAgY3JlYXRlRGF0ZTogRGF0ZTtcclxuICBzdGFydERhdGU6IERhdGU7XHJcbiAgZW5kRGF0ZTogRGF0ZTtcclxufVxyXG5cclxuLy8gQSBidWlsZCBzdGFnZSdzIHN0YXRlIG9uIHRoZSBlbnRpdHkgc2NvcmVib2FyZDogJ2RvbmUnID0gYnVpbHQsICdtaXNzaW5nJyA9XHJcbi8vIHN0aWxsIG5lZWRzIGJ1aWxkaW5nIChhIG1pc3Npbmcgc3RhZ2UgaXMgdW5idWlsdCBjb250ZW50LCBuZXZlciBhbiBlcnJvcikuXHJcbmV4cG9ydCB0eXBlIFNlbWFudGljQnVpbGRTdGFnZSA9ICdkb25lJyB8ICdtaXNzaW5nJztcclxuXHJcbi8vIE9uZSBlbnVtIGNvbHVtbiBvZiBhbiBlbnRpdHksIHdpdGggdGhlIGFsbG93ZWQgdmFsdWVzIHRoZSBidWlsZCBpbmxpbmVkLlxyXG5leHBvcnQgaW50ZXJmYWNlIFNlbWFudGljQnVpbGRFbnVtIHtcclxuICBjb2x1bW46IHN0cmluZztcclxuICB2YWx1ZXM6IHN0cmluZ1tdO1xyXG59XHJcblxyXG4vLyBPbmUgZW50aXR5IHJvdyBvZiB0aGUgc2NvcmVib2FyZCAoYW4gZW50aXR5ID0gYSB0YWJsZSArIGEgbW9kZWwgKyBhXHJcbi8vIGhhbmRsZXIpOiBpdHMgdGFibGUvc2hhcGUgY291bnRzLCBpbmxpbmVkIGVudW0gdmFsdWVzLCBjb21wdXRlZCBmaWVsZHMsIGhvd1xyXG4vLyBtYW55IGNvZGUgZnVuY3Rpb25zIHdlcmUgY2FjaGVkIChzcGxpdCBtb2RlbCB2cyBoYW5kbGVyKSwgYW5kIHRoZSBwZXItc3RhZ2VcclxuLy8gYnVpbHQvbWlzc2luZyBzdGF0ZS5cclxuLy9cclxuLy8gYG1vZGVsYC9gaGFuZGxlcmAgYXJlIHRoZSBjbGFzc2VzIHRoZSBmdW5jdGlvbnMgd2VyZSByZWFkIGZyb20g4oCUIHdoYXQgYVxyXG4vLyByZWFkZXIgcmVjb2duaXplcyB0aGUgcm93IGJ5LCB3aGVyZSBga2V5YCBpcyB3aGF0IHRoZSByZXBvcnQgQUkgYWRkcmVzc2VzIGl0XHJcbi8vIGJ5IGluIGRlc2NyaWJlX2VudGl0eSAvIGNvbXBpbGVfcXVlcnkuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VtYW50aWNCdWlsZEVudGl0eSB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgdGFibGU6IHN0cmluZztcclxuICBtb2RlbDogc3RyaW5nIHwgbnVsbDtcclxuICBoYW5kbGVyOiBzdHJpbmcgfCBudWxsO1xyXG4gIGNvbHVtbnM6IG51bWJlcjtcclxuICByZWxhdGlvbnNoaXBzOiBudW1iZXI7XHJcbiAgZW51bXM6IFNlbWFudGljQnVpbGRFbnVtW107XHJcbiAgY29tcHV0ZWRGaWVsZHM6IHN0cmluZ1tdO1xyXG4gIGZ1bmN0aW9uQ291bnQ6IG51bWJlcjtcclxuICBtb2RlbEZ1bmN0aW9uQ291bnQ6IG51bWJlcjtcclxuICBoYW5kbGVyRnVuY3Rpb25Db3VudDogbnVtYmVyO1xyXG4gIHN0YWdlczogUmVjb3JkPHN0cmluZywgU2VtYW50aWNCdWlsZFN0YWdlPjtcclxufVxyXG5cclxuLy8gT25lIHN0YW5kYWxvbmUgY29kZSBjbGFzcyB0aGUgYnVpbGQgcmVhZDogZG9tYWluIGxvZ2ljIHdpdGggbm8gdGFibGUgb2YgaXRzXHJcbi8vIG93biAoYSBzdW1tYXJ5IG1vZGVsLCBhIGNhbGN1bGF0aW9uIHNlcnZpY2UpLiBUaGUgcmVwb3J0IEFJIHJlYWRzIGl0cyBjb2RlXHJcbi8vIGV4YWN0bHkgbGlrZSBhbiBlbnRpdHkncywgYnV0IGl0IGNhbiBuZXZlciBiZSBxdWVyaWVkIOKAlCB0aGVyZSBpcyBub3RoaW5nIHRvXHJcbi8vIHNlbGVjdCBmcm9tIOKAlCBzbyBpdCBjYXJyaWVzIG5vIHRhYmxlLCBjb2x1bW5zIG9yIHJlbGF0aW9uc2hpcHMuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VtYW50aWNCdWlsZENsYXNzIHtcclxuICBrZXk6IHN0cmluZztcclxuICBtb2RlbDogc3RyaW5nIHwgbnVsbDtcclxuICBmdW5jdGlvbkNvdW50OiBudW1iZXI7XHJcbn1cclxuXHJcbi8vIFdoYXQgdGhlIGJ1aWxkIGRlY2lkZWQgYSBwaHlzaWNhbCB0YWJsZSBpcy4gRW50aXR5IGFuZCBqdW5jdGlvbiBhcmUgYm90aFxyXG4vLyByZWFjaGFibGUgYnkgdGhlIHJlcG9ydCBBSSDigJQgYW4gZW50aXR5IGRpcmVjdGx5LCBhIGp1bmN0aW9uIHRocm91Z2ggdGhlXHJcbi8vIG1hbnktdG8tbWFueSBpdCBicmlkZ2VzLiBFeGNsdWRlZCBpcyBub3QgcmVhY2hhYmxlIGF0IGFsbC5cclxuZXhwb3J0IHR5cGUgU2VtYW50aWNUYWJsZUNsYXNzaWZpY2F0aW9uID0gJ2VudGl0eScgfCAnanVuY3Rpb24nIHwgJ2V4Y2x1ZGVkJztcclxuXHJcbi8vIE9uZSBwaHlzaWNhbCB0YWJsZSBhcyB0aGUgYnVpbGQgY2xhc3NpZmllZCBpdC4gYHJlYXNvbmAgYW5zd2VycyBhIHNpbmdsZVxyXG4vLyBxdWVzdGlvbiDigJQgd2h5IGNhbid0IHRoZSByZXBvcnQgQUkgc2VlIHRoaXMgdGFibGU/IOKAlCBhbmQgaXMgbnVsbCB3aGVuIGl0IGNhbi5cclxuLy8gQSBqdW5jdGlvbiB3aXRoIGEgcmVhc29uIGJyaWRnZWQgbm90aGluZywgc28gaXQgaXMganVzdCBhcyBpbnZpc2libGUgYXMgYW5cclxuLy8gZXhjbHVkZWQgdGFibGUuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VtYW50aWNCdWlsZFRhYmxlIHtcclxuICB0YWJsZTogc3RyaW5nO1xyXG4gIGNsYXNzaWZpY2F0aW9uOiBTZW1hbnRpY1RhYmxlQ2xhc3NpZmljYXRpb247XHJcbiAgbW9kZWw6IHN0cmluZyB8IG51bGw7XHJcbiAgcmVhc29uOiBzdHJpbmcgfCBudWxsO1xyXG59XHJcblxyXG4vLyBUaGUgYnVpbGQgc2NvcmVib2FyZCBzaGlwcGVkIGFsb25nc2lkZSB0aGUgYnVpbGQgc3RhdHVzOiB0aGUgc3VtbWFyeSBjb3VudHMsXHJcbi8vIHRoZSBmdWxsIGJyZWFrZG93biB0aGUgc2V0dGluZ3MgZGlhbG9nIGRyaWxscyBpbnRvIOKAlCBCT1RIIGtpbmRzIG9mIHVuaXQgdGhlXHJcbi8vIGJ1aWxkIGNhY2hlcywgdGFibGUtYmFja2VkIGVudGl0aWVzIGFuZCBzdGFuZGFsb25lIGNvZGUgY2xhc3NlcyDigJQgYW5kIHRoZVxyXG4vLyBjYXRhbG9nIG9mIGV2ZXJ5IHRhYmxlIHRoZSBidWlsZCBzYXcsIHNvIHRoZSB0YWIgY2FuIHNob3cgd2hhdCB0aGUgcmVwb3J0IEFJXHJcbi8vIGNhbid0IHNlZSwgbm90IGp1c3Qgd2hhdCBpdCBjYW4uXHJcbi8vXHJcbi8vIGBmdW5jdGlvbkNvdW50YCBzcGFucyBlbnRpdGllcyBhbmQgY2xhc3NlcyBhbGlrZTogaXQgaXMgdGhlIHNhbWUgdG90YWwgdGhlXHJcbi8vIGJ1aWxkIGl0c2VsZiByZXBvcnRzIHdoZW4gaXQgZmluaXNoZXMuXHJcbi8vXHJcbi8vIGB0YWJsZXNgIGlzIGVtcHR5IGZvciBhbiBhcnRpZmFjdCBidWlsdCBiZWZvcmUgdGhlIGNhdGFsb2cgZXhpc3RlZC4gUmVhZCB0aGF0XHJcbi8vIGFzIFwibm8gY2F0YWxvZ1wiLCBuZXZlciBhcyBcIm5vdGhpbmcgd2FzIGV4Y2x1ZGVkXCIuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VtYW50aWNCdWlsZERldGFpbCB7XHJcbiAgLy8gV2hldGhlciB0aGUgYXJ0aWZhY3Qgd2FzIHByb2R1Y2VkIGJ5IGEgYnVpbGQgdGhhdCByYW4gdG8gdGhlIGVuZC4gUmVhZCBpdFxyXG4gIC8vIGJlc2lkZSBgZ2VuZXJhdGVkQXRgLCBuZXZlciBpbnN0ZWFkIG9mIGl0OiB0aGUgc3RydWN0dXJhbCBhcnRpZmFjdCBpc1xyXG4gIC8vIHB1Ymxpc2hlZCBCRUZPUkUgdGhlIEFJIGZ1bmN0aW9uIHBhc3MsIHNvIGEgYnVpbGQgd2hvc2UgQUkgcGFzcyBmYWlsZWQgc3RpbGxcclxuICAvLyBjYXJyaWVzIGEgZGF0ZSBhbmQgYSBmdWxsIHNldCBvZiBjb3VudHMuIFRoZSBkYXRlIHNheXMgc29tZXRoaW5nIHdhc1xyXG4gIC8vIHdyaXR0ZW47IG9ubHkgdGhpcyBzYXlzIHRoZSBidWlsZCBmaW5pc2hlZCB3cml0aW5nIGl0LlxyXG4gIGNvbXBsZXRlOiBib29sZWFuO1xyXG4gIGdlbmVyYXRlZEF0OiBEYXRlIHwgbnVsbDtcclxuICBlbnRpdHlDb3VudDogbnVtYmVyO1xyXG4gIGNsYXNzQ291bnQ6IG51bWJlcjtcclxuICBmdW5jdGlvbkNvdW50OiBudW1iZXI7XHJcbiAgZW50aXRpZXM6IFNlbWFudGljQnVpbGRFbnRpdHlbXTtcclxuICBjbGFzc2VzOiBTZW1hbnRpY0J1aWxkQ2xhc3NbXTtcclxuICB0YWJsZUNvdW50OiBudW1iZXI7XHJcbiAganVuY3Rpb25Db3VudDogbnVtYmVyO1xyXG4gIHVubGlua2VkSnVuY3Rpb25Db3VudDogbnVtYmVyO1xyXG4gIGV4Y2x1ZGVkQ291bnQ6IG51bWJlcjtcclxuICB0YWJsZXM6IFNlbWFudGljQnVpbGRUYWJsZVtdO1xyXG59XHJcblxyXG4vLyBXaGljaCBjbGFzcyBhIGNhY2hlZCBmdW5jdGlvbiB3YXMgcmVhZCBmcm9tLiBBbiBlbnRpdHkncyBjYWNoZSBzcGxpdHMgaW50b1xyXG4vLyAnbW9kZWwnIGFuZCAnaGFuZGxlcic7IGEgc3RhbmRhbG9uZSBjb2RlIGNsYXNzIGhhcyBvbmUgZ3JvdXAsICdjbGFzcycuXHJcbmV4cG9ydCB0eXBlIFNlbWFudGljRnVuY3Rpb25Tb3VyY2UgPSAnbW9kZWwnIHwgJ2hhbmRsZXInIHwgJ2NsYXNzJztcclxuXHJcbi8vIE9uZSBBSS1jbGFzc2lmaWVkIGNvZGUgZnVuY3Rpb24gZnJvbSBhIG1vZGVsLCBoYW5kbGVyIG9yIHN0YW5kYWxvbmUgY2xhc3M6XHJcbi8vIHdoYXQga2luZCBvZiBsb2dpYyBpdCBpcywgd2hhdCBpdCBkb2VzLCBhbmQgd2hhdCBpdCBwcm9kdWNlcyDigJQgdGhlIGJ1aWxkJ3NcclxuLy8gY2FjaGVkIFwid2hhdCB0aGUgY29kZSBkb2VzXCIga25vd2xlZGdlIHNob3duIGluIHRoZSBmdW5jdGlvbnMgZGlhbG9nLlxyXG5leHBvcnQgaW50ZXJmYWNlIFNlbWFudGljRW50aXR5RnVuY3Rpb24ge1xyXG4gIGNsYXNzOiBzdHJpbmc7XHJcbiAgbWV0aG9kOiBzdHJpbmc7XHJcbiAgc2lnbmF0dXJlOiBzdHJpbmc7XHJcbiAga2luZDogc3RyaW5nO1xyXG4gIHN1bW1hcnk6IHN0cmluZztcclxuICBwcm9kdWNlczogc3RyaW5nO1xyXG4gIHNvdXJjZTogU2VtYW50aWNGdW5jdGlvblNvdXJjZTtcclxufVxyXG5cclxuLy8gT25lIGVudGl0eSdzIGNhY2hlZCBjb2RlLWZ1bmN0aW9uIGtub3dsZWRnZSwgZmV0Y2hlZCB3aGVuIGEgZnVuY3Rpb25zIGRpYWxvZ1xyXG4vLyBvcGVucyAodGhlIGZ1bGwgc2V0IGFjcm9zcyBhbGwgZW50aXRpZXMgaXMgdG9vIGJpZyB0byBzaGlwIHdpdGggdGhlXHJcbi8vIHNjb3JlYm9hcmQpLiBPbmUgcGF5bG9hZCBzZXJ2ZXMgYm90aCBkaWFsb2dzIOKAlCBjb25zdW1lcnMgZmlsdGVyIGJ5IHNvdXJjZS5cclxuZXhwb3J0IGludGVyZmFjZSBTZW1hbnRpY0VudGl0eUZ1bmN0aW9ucyB7XHJcbiAgZW50aXR5OiBzdHJpbmc7XHJcbiAgZ2VuZXJhdGVkQXQ6IERhdGUgfCBudWxsO1xyXG4gIG1vZGVsQ2xhc3M6IHN0cmluZyB8IG51bGw7XHJcbiAgaGFuZGxlckNsYXNzOiBzdHJpbmcgfCBudWxsO1xyXG4gIGZ1bmN0aW9uczogU2VtYW50aWNFbnRpdHlGdW5jdGlvbltdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNlbWFudGljQnVpbGRTdGF0dXMge1xyXG4gIGJ1aWxkOiBTZW1hbnRpY0J1aWxkIHwgbnVsbDtcclxuICBkZXRhaWw6IFNlbWFudGljQnVpbGREZXRhaWw7XHJcbn1cclxuXHJcbi8vIFRoZSByZXBvcnQgbW9kdWxlJ3MgR2VuZXJhbCBzZXR0aW5ncyAoYSBzbWFsbCBnbG9iYWwga2V5L3ZhbHVlIHN0b3JlLCB0aGVcclxuLy8gcmVwb3J0aW5nIGNvdW50ZXJwYXJ0IG9mIHRoZSBhcHAtd2lkZSBzZXR0aW5ncykuIEVhY2ggdmFsdWUgc2hpcHMgd2l0aCB0aGVcclxuLy8gc2FmZSBiYW5kIGl0cyBlZGl0b3IgZmllbGQgaXMgYm91bmRlZCB0by5cclxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRTZXR0aW5ncyB7XHJcbiAgLy8gSG93IG1hbnkgc3VtbWFyeSBjYWxscyB0aGUgc2VtYW50aWMgYnVpbGQgcnVucyBhdCBvbmNlLlxyXG4gIHNlbWFudGljQnVpbGRDb25jdXJyZW5jeTogbnVtYmVyO1xyXG4gIHNlbWFudGljQnVpbGRDb25jdXJyZW5jeU1pbjogbnVtYmVyO1xyXG4gIHNlbWFudGljQnVpbGRDb25jdXJyZW5jeU1heDogbnVtYmVyO1xyXG59XHJcbiJdfQ==
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNkVBQTZFO0FBQzdFLG1FQUFtRTtBQUNuRSwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLG1DQUFtQztBQTBJbkMsNEVBQTRFO0FBQzVFLDJFQUEyRTtBQUMzRSx1REFBdUQ7QUFDdkQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWdEO0lBQzlFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO0lBQzdCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO0lBQy9CLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0lBQ2pDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO0lBQ3JDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO0NBQ3BDLENBQUM7QUEyTUYsTUFBTSxDQUFOLElBQVksY0FHWDtBQUhELFdBQVksY0FBYztJQUN4QixtQ0FBaUIsQ0FBQTtJQUNqQixtQ0FBaUIsQ0FBQTtBQUNuQixDQUFDLEVBSFcsY0FBYyxLQUFkLGNBQWMsUUFHekI7QUFnQkQsZ0ZBQWdGO0FBQ2hGLDJFQUEyRTtBQUMzRSxnRkFBZ0Y7QUFDaEYsMENBQTBDO0FBQzFDLE1BQU0sQ0FBTixJQUFZLFdBR1g7QUFIRCxXQUFZLFdBQVc7SUFDckIsZ0NBQWlCLENBQUE7SUFDakIsa0NBQW1CLENBQUE7QUFDckIsQ0FBQyxFQUhXLFdBQVcsS0FBWCxXQUFXLFFBR3RCO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHO0lBQzFCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRTtJQUM3QyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxPQUFPLEVBQUU7Q0FDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoZSBhc3NlbWJsZWQgcmVwb3J0IHN0cnVjdHVyZSByZXR1cm5lZCBieSBHRVQgL2FwaS9yZXBvcnRzLzppZCDigJQgY29tcG9zZWRcclxuLy8gc2VydmVyLXNpZGUgZnJvbSB0aGUgbm9ybWFsaXplZCB0YWJsZXMgKHJlcG9ydHMg4oaSIHJlcG9ydF9wYWdlcyDihpJcclxuLy8gcmVwb3J0X2NvbXBvbmVudHMgKyByZXBvcnRfZmlsdGVycywgcGx1cyByZXBvcnRfZmlsdGVyX2dyb3VwcykuIEFsbCBrZXlzIGFyZVxyXG4vLyBjYW1lbENhc2U7IGNvbXBvbmVudCBgY29uZmlnYCBpcyB0aGUgc3RhbmRhcmQgZm9ybWF0IHRoZSByZW5kZXJlciBtYXBzIHRvXHJcbi8vIEVDaGFydHMgb3B0aW9ucyAvIEZzTGlzdCBjb25maWcuXHJcblxyXG4vLyBMYXlvdXQgbW9kZXM6IEZyZWVmb3JtID0gYWJzb2x1dGVseSBwb3NpdGlvbmVkIGNvbXBvbmVudHMgKGRyYWcgYW55d2hlcmUpO1xyXG4vLyBGbG93ID0gY29tcG9uZW50cyBmbG93IGxpa2Ugcm93cywgZWFjaCB0YWtpbmcgZmxvd1dpZHRoICUgb2YgdGhlIHBhZ2Ugd2lkdGguXHJcbmV4cG9ydCB0eXBlIFJlcG9ydExheW91dCA9ICdmcmVlZm9ybScgfCAnZmxvdyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydCB7XHJcbiAgaWQ6IG51bWJlcjtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgbGF5b3V0OiBSZXBvcnRMYXlvdXQ7XHJcbiAgLy8gSUFOQSB0aW1lem9uZSAoZS5nLiBBbWVyaWNhL05ld19Zb3JrKSBhbmNob3JpbmcgZGF0ZSBmaWx0ZXJpbmcgKyBjaGFydCBkYXRlXHJcbiAgLy8gYnVja2V0aW5nLiBudWxsIGZhbGxzIGJhY2sgdG8gdGhlIGFjY291bnQgem9uZSB0aGVuIFVUQyAocmVzb2x2ZWQgc2VydmVyLXNpZGUpLlxyXG4gIHRpbWV6b25lOiBzdHJpbmcgfCBudWxsO1xyXG4gIC8vIFJlcG9ydC1sZXZlbCBjb25maWc6IHR5cG9ncmFwaGljIHN0eWxlcywgZXRjLiAoY2FtZWxDYXNlIEpTT04gY29sdW1uKS5cclxuICBjb25maWc6IFJlcG9ydENvbmZpZztcclxuICAvLyBUaGUgcGFnZSBpbiBJTkNIRVMgKHRoZSByZXBvcnQncyBuYXRpdmUgdW5pdCDigJQgUERGcyBhbmQgUG93ZXJQb2ludCBhcmVcclxuICAvLyBpbmNoLWJhc2VkLCBzbyBleHBvcnRzIGFyZSBkaW1lbnNpb25hbGx5IGV4YWN0KS4gT3JpZW50YXRpb24gaXMgbm90IGEgZmllbGRcclxuICAvLyBvZiBpdHMgb3duOiBhIHBhZ2Ugd2lkZXIgdGhhbiBpdCBpcyB0YWxsIElTIGxhbmRzY2FwZS5cclxuICBwYWdlV2lkdGg6IG51bWJlcjtcclxuICBwYWdlSGVpZ2h0OiBudW1iZXI7XHJcbiAgcGFnZXM6IFJlcG9ydFBhZ2VbXTtcclxuICBmaWx0ZXJHcm91cHM6IFJlcG9ydEZpbHRlckdyb3VwW107XHJcbn1cclxuXHJcbi8vIFJlcG9ydC1sZXZlbCBzdHlsaW5nLiBTaXplcyBhcmUgaW4gUE9JTlRTICgxLzcyXCIpIOKAlCB0aGUgcmVwb3J0J3MgdHlwb2dyYXBoeVxyXG4vLyBtYXBzIDE6MSB0byBQREYgKDcycHQvaW4pIGFuZCBQb3dlclBvaW50IChwb2ludCBmb250IHNpemVzKSwgc28gYSBwb2ludFxyXG4vLyB2YWx1ZSBpcyBkaW1lbnNpb25hbGx5IGV4YWN0IG9uIHNjcmVlbiBhbmQgaW4gZXZlcnkgZXhwb3J0LlxyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydENvbmZpZyB7XHJcbiAgc3R5bGVzPzogUmVwb3J0U3R5bGVzO1xyXG4gIC8vIFRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sLiBPcHRpb25hbCBvbiB0aGUgdHlwZSBiZWNhdXNlIGEgUmVwb3J0Q29uZmlnXHJcbiAgLy8gbGl0ZXJhbCBuZWVkIG5vdCBjYXJyeSBpdDsgdGhlIEFQSSBhbHdheXMgc2VuZHMgaXQsIHJlc29sdmVkLlxyXG4gIGdyb3VwQnk/OiBSZXBvcnRHcm91cEJ5O1xyXG59XHJcblxyXG4vLyBUaGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbCDigJQgdGhlIG9uZSBzd2l0Y2ggdGhhdCByZS1idWNrZXRzIGV2ZXJ5XHJcbi8vIHRpbWUtc2VyaWVzIGNoYXJ0IG9uIHRoZSByZXBvcnQgYmV0d2VlbiBkYXksIHdlZWssIG1vbnRoLCBxdWFydGVyIGFuZCB5ZWFyLlxyXG4vL1xyXG4vLyBJdCBpcyBOT1QgYSBmaWx0ZXI6IGEgZmlsdGVyIG5hcnJvd3Mgd2hpY2ggcm93cyBhcmUgY291bnRlZCwgdGhpcyBjaGFuZ2VzIGhvd1xyXG4vLyB0aGUgc3Vydml2aW5nIHJvd3MgYXJlIGJ1Y2tldGVkLiBJdCBzaGFyZXMgdGhlIHJlcG9ydCdzIGZpbHRlciBiYXIgYmVjYXVzZVxyXG4vLyB0aGF0IGlzIHRoZSBvbmUgcm93IG9mIGNvbnRyb2xzIGEgdmlld2VyIHJlYWRzIGEgcmVwb3J0IHRocm91Z2gg4oCUIHRoZVxyXG4vLyBzZXBhcmF0aW9uIHRoYXQgbWF0dGVycyBpcyBpbiB0aGUgbW9kZWwsIG5vdCBpbiB3aGVyZSB0aGUgY29udHJvbCBpcyBwYWludGVkLlxyXG4vL1xyXG4vLyBBbHdheXMgYXJyaXZlcyBSRVNPTFZFRCAodGhlIGJhY2tlbmQgZmlsbHMgYW4gYWJzZW50IG9yIHBhcnRpYWwgc3RvcmVkIGJsb2NrXHJcbi8vIGluIGZyb20gaXRzIG93biBkZWZhdWx0cyksIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gZGVmYXVsdCBoZXJlIOKAlCByZW5kZXIgd2hhdFxyXG4vLyB5b3UgYXJlIGdpdmVuLlxyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydEdyb3VwQnkge1xyXG4gIGVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBncmFudWxhcml0aWVzOiBDaGFydEdyYW51bGFyaXR5W107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0U3R5bGVzIHtcclxuICBoZWFkaW5nPzogeyBzaXplPzogbnVtYmVyIH07XHJcbn1cclxuXHJcbi8vIENvbnRlbnQgcGFkZGluZyBhcm91bmQgYSBjb21wb25lbnQncyBib2R5LCBpbiBJTkNIRVMgKHRoZSBnZW9tZXRyeSB1bml0KS5cclxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRQYWRkaW5nIHtcclxuICB0b3A/OiBudW1iZXI7XHJcbiAgcmlnaHQ/OiBudW1iZXI7XHJcbiAgYm90dG9tPzogbnVtYmVyO1xyXG4gIGxlZnQ/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0UGFnZSB7XHJcbiAgaWQ6IG51bWJlcjtcclxuICBuYW1lOiBzdHJpbmcgfCBudWxsO1xyXG4gIG9yZGVyOiBudW1iZXI7XHJcbiAgY29tcG9uZW50czogUmVwb3J0Q29tcG9uZW50W107XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFJlcG9ydENvbXBvbmVudFR5cGUgPSAnY2hhcnQnIHwgJ2xpc3QnIHwgJ2twaSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydENvbXBvbmVudCB7XHJcbiAgaWQ6IG51bWJlcjtcclxuICB0eXBlOiBSZXBvcnRDb21wb25lbnRUeXBlO1xyXG4gIHRpdGxlOiBzdHJpbmcgfCBudWxsO1xyXG4gIC8vIEdlb21ldHJ5IGluIElOQ0hFUy4gRnJlZWZvcm06IGFic29sdXRlIHBvc2l0aW9uIG9uIHRoZSBwYWdlIGNhbnZhcy5cclxuICAvLyBGbG93OiBvbmx5IGZsb3dXaWR0aC9vcmRlciBhcHBseTsgeC95IGFyZSByZW1lbWJlcmVkIGZvciBhIHN3aXRjaCBiYWNrIHRvXHJcbiAgLy8gZnJlZWZvcm0uXHJcbiAgeDogbnVtYmVyO1xyXG4gIHk6IG51bWJlcjtcclxuICB3OiBudW1iZXI7XHJcbiAgaDogbnVtYmVyO1xyXG4gIC8vIEhlaWdodCBtb2RlLCBERVJJVkVEIGZyb20gdHlwZSBzZXJ2ZXItc2lkZSAobm90IHN0b3JlZCwgcmVhZC1vbmx5KTogbGlzdHNcclxuICAvLyBhbmQgS1BJIHRpbGVzIGFyZSBhdXRvICh0aGUgYm94IHNpemVzIHRvIGl0cyBjb250ZW50LCBgaGAgaWdub3JlZCk7IGNoYXJ0c1xyXG4gIC8vIGFyZSBhbHdheXMgZml4ZWQgKHVzZSBgaGApIHNvIHRoZXkgZml0IHRoZSBib3ggYW5kIG5ldmVyIG92ZXJmbG93LlxyXG4gIGF1dG9IZWlnaHQ6IGJvb2xlYW47XHJcbiAgLy8gRmxvdyBsYXlvdXQ6ICUgb2YgdGhlIHBhZ2UgY29udGVudCB3aWR0aCB0aGlzIGNvbXBvbmVudCB0YWtlcy5cclxuICBmbG93V2lkdGg6IG51bWJlcjtcclxuICAvLyBGbG93IGxheW91dCBvcmRlcmluZy5cclxuICBvcmRlcjogbnVtYmVyO1xyXG4gIC8vIFRoZSBzdG9yZWQgU1FMIG9mIGEgbGVnYWN5IHNxbC1tb2RlIGNvbXBvbmVudC4gTlVMTCBmb3IgYSBkZXJpdmVkIG9uZSxcclxuICAvLyB3aG9zZSBzdGF0ZW1lbnQgZG9lcyBub3QgZXhpc3QgdW50aWwgaXRzIGRvY3VtZW50IGlzIGNvbXBpbGVkIOKAlCB0aGUgU1FMIHRhYlxyXG4gIC8vIGZldGNoZXMgdGhhdCBzZXBhcmF0ZWx5IChzZWUgUmVwb3J0Q29tcG9uZW50U3FsKS5cclxuICBzcWw6IHN0cmluZyB8IG51bGw7XHJcbiAgY29uZmlnOiBDaGFydENvbmZpZyAmIExpc3RDb25maWcgJiBLcGlDb25maWcgJiBDb21wb25lbnRMYXlvdXRDb25maWcgJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuICBmaWx0ZXJzOiBSZXBvcnRGaWx0ZXJbXTtcclxufVxyXG5cclxuLy8gV2hhdCB0aGUgU1FMIHRhYiBmZXRjaGVzOiB0aGUgc3RhdGVtZW50IGEgY29tcG9uZW50IHJ1bnMuXHJcbi8vXHJcbi8vIEZvciBhIGRlcml2ZWQgY29tcG9uZW50IGBiYXNlbGluZWAgaXMgdHJ1ZSBhbmQgYHNxbGAgaXMgd2hhdCBpdHMgZG9jdW1lbnRcclxuLy8gY29tcGlsZXMgdG8gd2l0aCBOTyB2aWV3ZXIgc3RhdGUg4oCUIG5vIGZpbHRlcnMsIFVUQywgdGhlIGF1dGhvcmVkIGdyYWluLiBUaGVcclxuLy8gbnVtYmVycyBvbiBzY3JlZW4gY29tZSBmcm9tIHRoYXQgc3RhdGVtZW50IHBsdXMgd2hhdGV2ZXIgdGhlIHZpZXdlciBwaWNrZWQsXHJcbi8vIHNvIHRoZSB0d28gY2FuIGxlZ2l0aW1hdGVseSBkaWZmZXIgYW5kIHRoZSB0YWIgc2F5cyBzbyByYXRoZXIgdGhhbiBpbXBseWluZ1xyXG4vLyB0aGV5IG1hdGNoLlxyXG4vL1xyXG4vLyBgZXJyb3JgIGlzIG5vdCBhIGZhaWx1cmUgb2YgdGhlIHJlcXVlc3Q6IGEgZG9jdW1lbnQgdGhhdCBubyBsb25nZXIgY29tcGlsZXNcclxuLy8gaXMgcHJlY2lzZWx5IHdoYXQgc29tZW9uZSBvcGVucyB0aGlzIHRhYiB0byBkaXNjb3Zlciwgc28gaXQgYXJyaXZlcyBhcyBhXHJcbi8vIG1lc3NhZ2UgdG8gcmVuZGVyIHdpdGggYGVycm9yVHlwZWAgbmFtaW5nIHdoaWNoIGtpbmQgKCdzdGFsZS1xdWVyeScgb3JcclxuLy8gJ3NlbnNpdGl2ZS1jb2x1bW4nKSwgYW5kIGBzcWxgIG51bGwuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0Q29tcG9uZW50U3FsIHtcclxuICBzcWw6IHN0cmluZyB8IG51bGw7XHJcbiAgb3JpZ2luOiAnc3FsJyB8ICdkYnEnIHwgJ2Rlcml2ZWQnO1xyXG4gIGJhc2VsaW5lOiBib29sZWFuO1xyXG4gIGVycm9yOiBzdHJpbmcgfCBudWxsO1xyXG4gIGVycm9yVHlwZTogc3RyaW5nIHwgbnVsbDtcclxufVxyXG5cclxuLy8gQ3Jvc3MtdHlwZSBsYXlvdXQvc3R5bGUga2V5cyBjYXJyaWVkIGluIGEgY29tcG9uZW50J3MgY29uZmlnIChhbG9uZ3NpZGUgdGhlXHJcbi8vIHR5cGUtc3BlY2lmaWMgY2hhcnQvbGlzdC9rcGkga2V5cykuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50TGF5b3V0Q29uZmlnIHtcclxuICBwYWRkaW5nPzogQ29tcG9uZW50UGFkZGluZztcclxufVxyXG5cclxuLy8gVGhlIHByZXNlbnRhdGlvbiBzZXR0aW5ncyBhIGNvbXBvbmVudCdzIHNldHRpbmdzIGRpYWxvZyBlZGl0cy4gTmVpdGhlciBmaWVsZFxyXG4vLyBpcyBwYXJ0IG9mIHdoYXQgdGhlIGNvbXBvbmVudCBxdWVyaWVzLCBzbyBhIGNoYW5nZSB0byB0aGVtIHJlcGFpbnRzIHdpdGhvdXRcclxuLy8gcmUtcnVubmluZyBhbnl0aGluZy5cclxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRTZXR0aW5ncyB7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBwYWRkaW5nOiBDb21wb25lbnRQYWRkaW5nO1xyXG59XHJcblxyXG4vLyBXaGVyZSBhIGNoYXJ0J3MgbGVnZW5kIHNpdHMgcmVsYXRpdmUgdG8gdGhlIHBsb3QsIG9yICdoaWRkZW4nIHRvIGRyb3AgaXQuXHJcbmV4cG9ydCB0eXBlIExlZ2VuZFBvc2l0aW9uID0gJ3RvcCcgfCAnYm90dG9tJyB8ICdsZWZ0JyB8ICdyaWdodCcgfCAnaGlkZGVuJztcclxuXHJcbmV4cG9ydCB0eXBlIENoYXJ0R3JhbnVsYXJpdHkgPSAnZGF5JyB8ICd3ZWVrJyB8ICdtb250aCcgfCAncXVhcnRlcicgfCAneWVhcic7XHJcblxyXG4vLyBIb3cgZWFjaCBncmFudWxhcml0eSByZWFkcyBpbiB0aGUgZ3JvdXAtYnkgY29udHJvbCBhbmQgb24gYW4gZXhwb3J0IGNvdmVyXHJcbi8vIHNoZWV0LiBXSElDSCBvZiB0aGVtIGEgZ2l2ZW4gcmVwb3J0IG9mZmVycyBjb21lcyBmcm9tIGl0cyBSZXBvcnRHcm91cEJ5O1xyXG4vLyB0aGlzIGlzIG9ubHkgdGhlIG5hbWluZy4gJ3llYXInIHJlYWRzIGFzIFwiQW5udWFsbHlcIi5cclxuZXhwb3J0IGNvbnN0IEdSQU5VTEFSSVRZX09QVElPTlM6IHsgdmFsdWU6IENoYXJ0R3JhbnVsYXJpdHk7IG5hbWU6IHN0cmluZyB9W10gPSBbXHJcbiAgeyB2YWx1ZTogJ2RheScsIG5hbWU6ICdEYXknIH0sXHJcbiAgeyB2YWx1ZTogJ3dlZWsnLCBuYW1lOiAnV2VlaycgfSxcclxuICB7IHZhbHVlOiAnbW9udGgnLCBuYW1lOiAnTW9udGgnIH0sXHJcbiAgeyB2YWx1ZTogJ3F1YXJ0ZXInLCBuYW1lOiAnUXVhcnRlcicgfSxcclxuICB7IHZhbHVlOiAneWVhcicsIG5hbWU6ICdBbm51YWxseScgfSxcclxuXTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2hhcnRDb25maWcge1xyXG4gIGNoYXJ0VHlwZT86ICdiYXInIHwgJ2xpbmUnIHwgJ2FyZWEnIHwgJ3BpZScgfCAnZG9udXQnO1xyXG4gIC8vIEZvciBraW5kICd0aW1lJywgdGhlIHNlcnZlciBidWNrZXRzIHRoZSByYXcgZGF0ZXRpbWUgY29sdW1uIHRvIGBncmFudWxhcml0eWBcclxuICAvLyBpbiB0aGUgcmVwb3J0J3MgdGltZXpvbmUgKHRoZSBTUUwgZXhwb3NlcyB0aGUgcmF3IGNvbHVtbiwgdW5idWNrZXRlZCkuXHJcbiAgeEF4aXM/OiB7IGNvbHVtbjogc3RyaW5nOyBraW5kPzogJ2NhdGVnb3J5JyB8ICd0aW1lJzsgZ3JhbnVsYXJpdHk/OiBDaGFydEdyYW51bGFyaXR5OyBsYWJlbD86IHN0cmluZyB9O1xyXG4gIG1lYXN1cmVzPzogQ2hhcnRNZWFzdXJlW107XHJcbiAgc3BsaXRCeT86IHsgY29sdW1uOiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nIH07XHJcbiAgLy8gU2luZ2xlLWRpbWVuc2lvbiBiYXIgY2hhcnRzIG9ubHk6IGNvbG9yIGVhY2ggYmFyIGJ5IGl0cyBvd24gY2F0ZWdvcnkgYW5kXHJcbiAgLy8gc2hvdyBhIGxlZ2VuZCwgV0lUSE9VVCBzcGxpdHRpbmcgaW50byBtdWx0aXBsZSBzZXJpZXMgKHdoaWNoIHNsaXZlcnMgdGhlXHJcbiAgLy8gYmFycykuIHYxIGV4cGVjdHMgY29sb3JCeS5jb2x1bW4gPT09IHhBeGlzLmNvbHVtbi4gSWdub3JlZCB3aGVuIHNwbGl0QnkgaXNcclxuICAvLyBzZXQgb3IgdGhlIGNoYXJ0IGlzbid0IGEgYmFyIGNoYXJ0LlxyXG4gIGNvbG9yQnk/OiB7IGNvbHVtbjogc3RyaW5nOyBsYWJlbD86IHN0cmluZyB9O1xyXG4gIG9yaWVudGF0aW9uPzogJ3ZlcnRpY2FsJyB8ICdob3Jpem9udGFsJztcclxuICBzdGFja2VkPzogYm9vbGVhbjtcclxuICBsZWdlbmQ/OiBMZWdlbmRQb3NpdGlvbjtcclxuICBzb3J0PzogUmVwb3J0U29ydDtcclxuICBsaW1pdD86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDaGFydE1lYXN1cmUge1xyXG4gIGNvbHVtbjogc3RyaW5nO1xyXG4gIGFnZ3JlZ2F0aW9uPzogJ3N1bScgfCAnY291bnQnIHwgJ2F2ZycgfCAnbWluJyB8ICdtYXgnO1xyXG4gIGxhYmVsPzogc3RyaW5nO1xyXG4gIC8vIEFwcGxpZWQgdG8gYSBLUEkncyBzaW5nbGUgdmFsdWUgb25seSDigJQgaXQgaXMgYWdncmVnYXRlZCBzZXJ2ZXItc2lkZSBhZnRlclxyXG4gIC8vIHRoZSBTUUwgcnVucywgc28gdGhlIFNRTCBjYW5ub3QgZm9ybWF0IGl0LiBDaGFydCBtZWFzdXJlcyBzdGF5IG51bWVyaWMuXHJcbiAgZm9ybWF0PzogJ251bWJlcicgfCAncGVyY2VudCcgfCAnY3VycmVuY3knO1xyXG4gIC8vIEhvdyBtYW55IGRlY2ltYWwgcGxhY2VzIHRoZSB2YWx1ZSBpcyBzaG93biB0by4gRml4ZWQgcmF0aGVyIHRoYW4gbWF4aW11bTpcclxuICAvLyBhIGNvbHVtbiBvZiByYXRlcyBpcyB1bnJlYWRhYmxlIHdoZW4gZWFjaCBvbmUgc2hvd3MgYSBkaWZmZXJlbnQgbnVtYmVyIG9mXHJcbiAgLy8gZGVjaW1hbHMuIE9taXR0ZWQgbGVhdmVzIHRoZSBsb2NhbGUncyBvd24gZGVmYXVsdCwgd2hpY2ggaXMgd2hhdCBldmVyeVxyXG4gIC8vIHJlcG9ydCBhdXRob3JlZCBiZWZvcmUgdGhpcyBkaWQuXHJcbiAgLy9cclxuICAvLyBJdCBjYW5ub3QgYmUgYXBwbGllZCBpbiB0aGUgU1FMOiB0aGUgdmFsdWUgaXMgYWdncmVnYXRlZCBhZnRlciB0aGUgcmVwb3J0J3NcclxuICAvLyBmaWx0ZXJzIHJ1biwgc28gcHJlLXJvdW5kaW5nIHdvdWxkIGJyZWFrIGxpdmUgcmUtZmlsdGVyaW5nIGJ5IGRhdGUgcmFuZ2Ugb3JcclxuICAvLyBwYXJ0bmVyLlxyXG4gIHByZWNpc2lvbj86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMaXN0Q29uZmlnIHtcclxuICAvLyBBIGxpc3QgY2VsbCByZW5kZXJzIHRoZSB2YWx1ZSB2ZXJiYXRpbTogcGVyY2VudCBzaWducywgY3VycmVuY3kgc3ltYm9scyxcclxuICAvLyB0aG91c2FuZHMgc2VwYXJhdG9ycyBhbmQgZGVjaW1hbCBwbGFjZXMgYXJlIHByb2R1Y2VkIGJ5IHRoZSBjb21wb25lbnQnc1xyXG4gIC8vIFNRTCAodGhlIGJhY2tlbmQgcmVqZWN0cyBhbnkgb3RoZXIgYGZvcm1hdGAgaGVyZSkuIGBkYXRlYCBpcyB0aGUgZXhjZXB0aW9uXHJcbiAgLy8g4oCUIGEgZGF0ZSBjb2x1bW4gc3RheXMgYSBSQVcgdGltZXN0YW1wIHNvIHRoZSByZXBvcnQgdGltZXpvbmUgYW5kIGl0c1xyXG4gIC8vIGRhdGVSYW5nZSBmaWx0ZXJzIGtlZXAgd29ya2luZywgYW5kIHRoZSB2aWV3ZXIgbG9jYWxpc2VzIGl0IGF0IHJlbmRlci5cclxuICAvLyBBIFNRTC1mb3JtYXR0ZWQgY29sdW1uIGlzIHRleHQsIHNvIGl0IG5hbWVzIGBzb3J0Q29sdW1uYDogdGhlIHJhdyBudW1lcmljXHJcbiAgLy8gYWxpYXMgdGhlIHF1ZXJ5IGFsc28gb3V0cHV0cywgd2hpY2ggdGhlIHNlcnZlciBvcmRlcnMgYnkgaW5zdGVhZC5cclxuICBjb2x1bW5zPzogeyBjb2x1bW46IHN0cmluZzsgbGFiZWw/OiBzdHJpbmc7IGZvcm1hdD86ICdkYXRlJzsgc29ydENvbHVtbj86IHN0cmluZyB9W107XHJcbiAgLy8gQSBjcm9zcy10YWI6IGByb3dCeWAgc3RheXMgZG93biB0aGUgc2lkZSBhbmQgZXZlcnkgdmFsdWUgb2YgYHBpdm90QnlgXHJcbiAgLy8gYmVjb21lcyBhIGNvbHVtbi4gVGhlIHR3byBhcmUgc2V0IHRvZ2V0aGVyLCBgY29sdW1uc2AgaXMgb21pdHRlZCAodGhlXHJcbiAgLy8gYmFja2VuZCByZWplY3RzIGF1dGhvcmluZyBib3RoKSwgYW5kIHRoZSBjb2x1bW4gc2V0IGFycml2ZXMgd2l0aCB0aGUgcm93c1xyXG4gIC8vIGluIENvbXBvbmVudERhdGEuY29sdW1ucyBiZWNhdXNlIG9ubHkgdGhlIHJlc3VsdCBrbm93cyB0aGUgcGl2b3QgdmFsdWVzLlxyXG4gIHJvd0J5PzogeyBjb2x1bW46IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfTtcclxuICBwaXZvdEJ5PzogeyBjb2x1bW46IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfTtcclxuICBzb3J0PzogUmVwb3J0U29ydDtcclxuICBwYWdlU2l6ZT86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBLcGlDb25maWcge1xyXG4gIG1lYXN1cmU/OiBDaGFydE1lYXN1cmU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0U29ydCB7XHJcbiAgY29sdW1uOiBzdHJpbmc7XHJcbiAgZGlyZWN0aW9uPzogJ2FzYycgfCAnZGVzYyc7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFJlcG9ydEZpbHRlclR5cGUgPSAnZGF0ZVJhbmdlJyB8ICdzZWxlY3QnIHwgJ2tleXdvcmQnO1xyXG5cclxuLy8gV2hlcmUgYSBmaWx0ZXIgZ3JvdXAncyBjb250cm9sIGlzIGV4cG9zZWQuIEEgZ3JvdXAgY2FuIGJlIHNob3duIG9uIGl0c1xyXG4vLyBjb21wb25lbnRzLCBpbiB0aGUgcmVwb3J0IGJhciwgb3IgQk9USCBhdCBvbmNlICh0aGUgdHdvIGFyZSBpbmRlcGVuZGVudFxyXG4vLyB0b2dnbGVzIGluIHRoZSBVSSk7IGEgY29sdW1uIHdpdGggbmVpdGhlciBleHBvc2VkIHNpbXBseSBoYXMgbm8gZmlsdGVyLlxyXG5leHBvcnQgdHlwZSBSZXBvcnRGaWx0ZXJMZXZlbCA9ICdjb21wb25lbnQnIHwgJ3JlcG9ydCcgfCAnYm90aCc7XHJcblxyXG4vLyBPbmUgZmlsdGVyYWJsZSBvdXRwdXQgY29sdW1uIG9mIGEgY29tcG9uZW50J3MgU1FMLCB3aXRoIHRoZSBmaWx0ZXIgaW50ZXJmYWNlXHJcbi8vIElORkVSUkVEIGZyb20gaXRzIGRhdGEgKHRoZSBodW1hbiBuZXZlciBwaWNrcyB0aGUgaW50ZXJmYWNlIOKAlCBpdCBmb2xsb3dzIHRoZVxyXG4vLyBjb2x1bW4ncyB0eXBlKS4gRHJpdmVzIHRoZSBGaWx0ZXJzIHRhYiBsaXN0aW5nLlxyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydEZpbHRlcmFibGVDb2x1bW4ge1xyXG4gIGNvbHVtbjogc3RyaW5nO1xyXG4gIHR5cGU6IFJlcG9ydEZpbHRlclR5cGU7XHJcbn1cclxuXHJcbi8vIEdyb3VuZCB0cnV0aDogb25lIGZpbHRlcmFibGUgb3V0cHV0IGNvbHVtbiBPTiBvbmUgY29tcG9uZW50J3MgU1FMLiBBbHdheXMgYVxyXG4vLyBtZW1iZXIgb2YgYSBmaWx0ZXIgZ3JvdXAg4oCUIHRoZSB1bml0IHRoYXQgbGlua3MgZXF1aXZhbGVudCBmaWx0ZXJzIGFjcm9zc1xyXG4vLyBjb21wb25lbnRzIGFuZCBkZWNpZGVzIHdoZXJlIHRoZSBjb250cm9sIHJlbmRlcnMgKGNvbXBvbmVudCB2cyByZXBvcnQgYmFyKS5cclxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRGaWx0ZXIge1xyXG4gIGlkOiBudW1iZXI7XHJcbiAgY29tcG9uZW50SWQ6IG51bWJlcjtcclxuICBmaWx0ZXJHcm91cElkOiBudW1iZXI7XHJcbiAgZmlsdGVyQ29sdW1uOiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZyB8IG51bGw7XHJcbiAgZW5hYmxlZDogYm9vbGVhbjtcclxuICBoYXNPcHRpb25zOiBib29sZWFuO1xyXG4gIGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbn1cclxuXHJcbi8vIE9uZSBjaG9pY2UgaW4gYSBzZWxlY3QgZmlsdGVyJ3Mgb3B0aW9uIGxpc3QuIFRoZSB2YWx1ZSBpcyB3aGF0IHRoZSBmaWx0ZXJcclxuLy8gbWF0Y2hlcyBvbiBhbmQgZ2V0cyBzdG9yZWQgaW4gYSBzYXZlZCBkZWZhdWx0IOKAlCBmb3IgYW4gZW50aXR5IHRoYXQgaXMgaXRzXHJcbi8vIHN0YWJsZSBpZCwgbmV2ZXIgaXRzIG5hbWUsIHNvIHJlbmFtaW5nIHRoZSBlbnRpdHkgbW92ZXMgdGhlIGxhYmVsIHdpdGhvdXRcclxuLy8gYnJlYWtpbmcgdGhlIGRlZmF1bHQuIFRoZSBsYWJlbCBpcyBvbmx5IGV2ZXIgd2hhdCB0aGUgdmlld2VyIHJlYWRzLlxyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydEZpbHRlck9wdGlvbiB7XHJcbiAgdmFsdWU6IHVua25vd247XHJcbiAgbGFiZWw6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRGaWx0ZXJHcm91cCB7XHJcbiAgaWQ6IG51bWJlcjtcclxuICBsYWJlbDogc3RyaW5nIHwgbnVsbDtcclxuICB0eXBlOiBSZXBvcnRGaWx0ZXJUeXBlO1xyXG4gIGxldmVsOiBSZXBvcnRGaWx0ZXJMZXZlbDtcclxuICBvcmRlcjogbnVtYmVyO1xyXG4gIGNvbmZpZzogeyBkZWZhdWx0PzogRmlsdGVyR3JvdXBEZWZhdWx0IH0gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuICBmaWx0ZXJzOiBSZXBvcnRGaWx0ZXJbXTtcclxufVxyXG5cclxuLy8gQSBmaWx0ZXIgZ3JvdXAncyBhdXRob3JlZCBkZWZhdWx0IOKAlCB0aGUgdmFsdWUgdGhhdCBzZWVkcyB0aGUgcmVwb3J0IGJhciBvblxyXG4vLyBldmVyeSBvcGVuLiBTaGFwZSBmb2xsb3dzIHRoZSBncm91cCdzIHR5cGU6IGRhdGVSYW5nZSB1c2VzIHN0YXJ0L2VuZCAoYSBmaXhlZFxyXG4vLyBjYWxlbmRhci1kYXkgcmFuZ2UpIG9yIGEgcmVsYXRpdmUgcHJlc2V0OyBzZWxlY3QgdXNlcyB2YWx1ZXM7IGtleXdvcmQgdXNlc1xyXG4vLyB2YWx1ZS5cclxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJHcm91cERlZmF1bHQge1xyXG4gIC8vIGRhdGVSYW5nZSByZWxhdGl2ZSBwcmVzZXQsIHJlc29sdmVkIGFnYWluc3QgXCJub3dcIiBvbiBldmVyeSBvcGVuLiBPbmUgb2Y6XHJcbiAgLy8gdGhpc1dlZWssIGxhc3RXZWVrLCBsYXN0N0RheXMsIGxhc3QzMERheXMsIGxhc3QzTW9udGhzLCBsYXN0Nk1vbnRocyxcclxuICAvLyBsYXN0MTJNb250aHMsIHRoaXNNb250aCwgdGhpc1F1YXJ0ZXIsIHRoaXNZZWFyL3llYXJUb0RhdGUuIFRoZSB3ZWVrIG9uZXNcclxuICAvLyBhcmUgd2hvbGUgY2FsZW5kYXIgZGF5cywgU3VuZGF5IHRvIFNhdHVyZGF5LCBpbiB0aGUgcmVwb3J0J3MgdGltZXpvbmUuXHJcbiAgcmVsYXRpdmU/OiBzdHJpbmc7XHJcbiAgc3RhcnQ/OiBzdHJpbmc7IC8vIGRhdGVSYW5nZSBmaXhlZCBzdGFydCAoeXl5eS1NTS1kZClcclxuICBlbmQ/OiBzdHJpbmc7IC8vIGRhdGVSYW5nZSBmaXhlZCBlbmQgKHl5eXktTU0tZGQpXHJcbiAgdmFsdWVzPzogdW5rbm93bltdOyAvLyBzZWxlY3QgZGVmYXVsdCBwaWNrZWQgdmFsdWVzXHJcbiAgdmFsdWU/OiBzdHJpbmc7IC8vIGtleXdvcmQgZGVmYXVsdCB0ZXh0XHJcbn1cclxuXHJcbi8vIFRoZSBzZXNzaW9uIHZhbHVlIG9mIGEgZmlsdGVyIGdyb3VwIChuZXZlciBwZXJzaXN0ZWQpOiBzaGFwZSBkZXBlbmRzIG9uIHRoZVxyXG4vLyBncm91cCdzIHR5cGUuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyR3JvdXBWYWx1ZSB7XHJcbiAgc3RhcnQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbDsgLy8gZGF0ZVJhbmdlXHJcbiAgZW5kPzogRGF0ZSB8IHN0cmluZyB8IG51bGw7IC8vIGRhdGVSYW5nZVxyXG4gIHZhbHVlcz86IHVua25vd25bXTsgLy8gc2VsZWN0XHJcbiAgdmFsdWU/OiBzdHJpbmc7IC8vIGtleXdvcmRcclxufVxyXG5cclxuLy8gT25lIHJlc29sdmVkIGZpbHRlciBzZW50IHdpdGggYSBjb21wb25lbnQncyBkYXRhIHJlcXVlc3QuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRGaWx0ZXJWYWx1ZSB7XHJcbiAgZmlsdGVySWQ6IG51bWJlcjtcclxuICBzdGFydD86IHN0cmluZztcclxuICBlbmQ/OiBzdHJpbmc7XHJcbiAgdmFsdWVzPzogdW5rbm93bltdO1xyXG4gIHZhbHVlPzogc3RyaW5nO1xyXG59XHJcblxyXG4vLyBQZXItY29tcG9uZW50IGludGVyYWN0aW9uIHN0YXRlIHNlbnQgd2l0aCB0aGUgZGF0YSByZXF1ZXN0OiBsaXN0cyBzZW5kXHJcbi8vIHNvcnQvcGFnaW5nOyB0aW1lLXNlcmllcyBjaGFydHMgc2VuZCB0aGUgZ3JhaW4gcGlja2VkIG9uIHRoZSByZXBvcnQncyBncm91cC1ieVxyXG4vLyBjb250cm9sLCB3aGljaCBvdmVycmlkZXMgdGhlIGF1dGhvcmVkIGdyYW51bGFyaXR5IGZvciB0aGF0IHJlcXVlc3Qgb25seS4gVGhlXHJcbi8vIHdpcmUga2V5IHN0YXlzIGBmcmVxdWVuY3lgIOKAlCBpdCBpcyB0aGUgYnVja2V0aW5nIGZyZXF1ZW5jeSB0aGUgc2VydmVyIGFwcGxpZXMuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50RGF0YVN0YXRlIHtcclxuICBzb3J0PzogUmVwb3J0U29ydDtcclxuICBwYWdlPzogbnVtYmVyO1xyXG4gIHBhZ2VTaXplPzogbnVtYmVyO1xyXG4gIGZyZXF1ZW5jeT86IENoYXJ0R3JhbnVsYXJpdHk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50RGF0YSB7XHJcbiAgY29sdW1uczogc3RyaW5nW107XHJcbiAgcm93czogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcclxuICBwYWdpbmc/OiB7IHRvdGFsOiBudW1iZXI7IHBhZ2U6IG51bWJlcjsgcGFnZVNpemU6IG51bWJlciB9O1xyXG4gIHRydW5jYXRlZDogYm9vbGVhbjtcclxuICAvLyBUaGUgZWZmZWN0aXZlIHRpbWUgYnVja2V0IHRoZSByb3dzIHdlcmUgZ3JvdXBlZCBpbnRvIChhZnRlciBhbnkgZ3JvdXAtYnlcclxuICAvLyBvdmVycmlkZSksIG9yIG51bGwgZm9yIGEgbm9uLXRpbWUgYXhpcy4gRHJpdmVzIHRoZSBjb21wYWN0IHgtYXhpcyBsYWJlbHMuXHJcbiAgZ3JhbnVsYXJpdHk/OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRMaXN0SXRlbSB7XHJcbiAgaWQ6IG51bWJlcjtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgbW9kaWZ5RGF0ZTogc3RyaW5nO1xyXG4gIHN0YXRlPzogUmVwb3J0U3RhdGU7XHJcbiAgLy8gVGhlIGZvbGRlciB0aGUgcmVwb3J0IGlzIGZpbGVkIHVuZGVyLiBudWxsIGlzIGEgcmVhbCwgY29tbW9uIHZhbHVlIOKAlCB0aGVcclxuICAvLyByZXBvcnQgc2l0cyBhdCB0aGUgcm9vdCBvZiB0aGUgbGlzdGluZyB0cmVlIGFsb25nc2lkZSB0aGUgZm9sZGVycy5cclxuICAvL1xyXG4gIC8vIE9wdGlvbmFsIGxpa2UgYHN0YXRlYCBiZXNpZGUgaXQ6IHRoZSBiYWNrZW5kIGFsd2F5cyBzZW5kcyBpdCwgYnV0IG1ha2luZyBpdFxyXG4gIC8vIHJlcXVpcmVkIGlzIGEgYnJlYWtpbmcgdHlwZSBjaGFuZ2UgZm9yIGV2ZXJ5IGNvbnN1bWVyIGhvbGRpbmcgYVxyXG4gIC8vIFJlcG9ydExpc3RJdGVtIGxpdGVyYWwgKGZpeHR1cmVzLCBtb2NrcykgYW5kIGJ1eXMgbm90aGluZyDigJQgdGhlIGxpc3RpbmdcclxuICAvLyByZWFkcyBpdCBhcyBgPz8gbnVsbGAgZWl0aGVyIHdheS5cclxuICByZXBvcnRGb2xkZXJJZD86IG51bWJlciB8IG51bGw7XHJcbn1cclxuXHJcbi8vIE9uZSBmb2xkZXIgaW4gdGhlIGxpc3RpbmcgdHJlZSDigJQgYW4gYXVkaWVuY2UgYnVja2V0IChcIk1hbmFnZW1lbnRcIixcclxuLy8gXCJPcGVyYXRpb25zXCIpIHJlcG9ydHMgYXJlIGZpbGVkIGludG8uIEZvbGRlcnMgbmVzdCB2aWEgcGFyZW50UmVwb3J0Rm9sZGVySWQ7XHJcbi8vIHJlcG9ydHMgbmV2ZXIgZG8sIHNvIHRoZSB0cmVlJ3Mgb25seSBicmFuY2ggbm9kZXMgYXJlIGZvbGRlcnMuXHJcbi8vXHJcbi8vIE5vIHN0YXRlOiBhIGZvbGRlciBpcyBvbmx5IGRlbGV0YWJsZSBvbmNlIGl0IGlzIGVtcHR5LCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvXHJcbi8vIHNvZnQtZGVsZXRlIGFuZCBcIlNob3cgRGVsZXRlZFwiIGlzIGEgcmVwb3J0cy1vbmx5IGNvbmNlcHQuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0Rm9sZGVyIHtcclxuICBpZDogbnVtYmVyO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBwYXJlbnRSZXBvcnRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbDtcclxufVxyXG5cclxuLy8gR0VUIC9hcGkvcmVwb3J0cyByZXR1cm5zIGJvdGggaGFsdmVzIGZsYXQ7IHRoZSBsaXN0aW5nIG5lc3RzIHRoZW0gaXRzZWxmLlxyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydFRyZWUge1xyXG4gIHJlcG9ydHM6IFJlcG9ydExpc3RJdGVtW107XHJcbiAgZm9sZGVyczogUmVwb3J0Rm9sZGVyW107XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFJlcG9ydE5vZGVUeXBlIHtcclxuICBGb2xkZXIgPSAnZm9sZGVyJyxcclxuICBSZXBvcnQgPSAncmVwb3J0JyxcclxufVxyXG5cclxuLy8gT25lIG5vZGUgYXMgZnMtdHJlZSBzZWVzIGl0LiBGb2xkZXJzIGFuZCByZXBvcnRzIHNoYXJlIG9uZSBpZCBzcGFjZSBpbiB0aGVcclxuLy8gdmlldywgc28gdGhlIGlkcyBhcmUgcHJlZml4ZWQgKCdmOjEyJyAvICdyOjM0Jykg4oCUIGBpZGAgaXMgdGhlIG9yaWdpbmFsLFxyXG4vLyBwZXItdGFibGUgaWQgdGhhdCB0aGUgQVBJIGVuZHBvaW50cyB0YWtlLlxyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydE5vZGUge1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIGlkOiBudW1iZXI7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIHR5cGU6IFJlcG9ydE5vZGVUeXBlO1xyXG4gIC8vIE9ubHkgZXZlciBwb3B1bGF0ZWQgb24gYSBmb2xkZXI7IGEgcmVwb3J0IGlzIGFsd2F5cyBhIGxlYWYuXHJcbiAgY2hpbGRyZW46IFJlcG9ydE5vZGVbXTtcclxuICAvLyBQcmVzZW50IG9uIHJlcG9ydCBub2RlcyBvbmx5LlxyXG4gIHJlcG9ydD86IFJlcG9ydExpc3RJdGVtO1xyXG59XHJcblxyXG4vLyBSZXBvcnRzIGFyZSBzb2Z0LWRlbGV0YWJsZTogYSBkZWxldGVkIHJlcG9ydCBsZWF2ZXMgdGhlIGxpc3RpbmcgYnV0IGtlZXBzIGl0c1xyXG4vLyBwYWdlcyBhbmQgY29tcG9uZW50cywgYW5kIHRoZSBsaXN0aW5nJ3MgXCJTaG93IERlbGV0ZWRcIiBtb2RlIHJlc3RvcmVzIGl0LlxyXG4vLyBGb2xkZXJzIGhhdmUgbm8gZXF1aXZhbGVudCDigJQgdGhleSBhcmUgb25seSBkZWxldGFibGUgb25jZSBlbXB0eSwgc28gdGhleSBoYXJkXHJcbi8vIGRlbGV0ZSBhbmQgdGhlcmUgaXMgbm90aGluZyB0byByZXN0b3JlLlxyXG5leHBvcnQgZW51bSBSZXBvcnRTdGF0ZSB7XHJcbiAgQWN0aXZlID0gJ2FjdGl2ZScsXHJcbiAgRGVsZXRlZCA9ICdkZWxldGVkJyxcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFJlcG9ydFN0YXRlcyA9IFtcclxuICB7IG5hbWU6ICdBY3RpdmUnLCB2YWx1ZTogUmVwb3J0U3RhdGUuQWN0aXZlIH0sXHJcbiAgeyBuYW1lOiAnRGVsZXRlZCcsIHZhbHVlOiBSZXBvcnRTdGF0ZS5EZWxldGVkIH0sXHJcbl07XHJcblxyXG4vLyBUaGUgY2hhdCB0dXJuIGZsYWdzIHRoaXMgY29udGV4dCdzIGJhY2tlbmQgYWRkcyAoUmVwb3J0c1xcQWlWaWV3KS5cclxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRDaGF0UmVzcG9uc2Uge1xyXG4gIHJlcG9ydENoYW5nZWQ/OiBib29sZWFuO1xyXG4gIHJlcG9ydFJlbmFtZWQ/OiBib29sZWFuO1xyXG59XHJcblxyXG4vLyBPbmUgdmVyc2lvbiBvZiB0aGUgZ2xvYmFsIEFJIGtub3dsZWRnZSBkb2N1bWVudCDigJQgdGhlIG9wZXJhdG9yLWF1dGhvcmVkXHJcbi8vIG1hcmtkb3duIGFwcGVuZGVkIHRvIHRoZSByZXBvcnQgYWdlbnQncyBzeXN0ZW0gaW5zdHJ1Y3Rpb25zIG9uIGV2ZXJ5IHR1cm4uXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0SW5zdHJ1Y3Rpb24ge1xyXG4gIGlkOiBudW1iZXI7XHJcbiAgY29udGVudDogc3RyaW5nO1xyXG4gIGN1cnJlbnQ6IGJvb2xlYW47XHJcbiAgY3JlYXRlRGF0ZTogRGF0ZTtcclxuICBtb2RpZnlEYXRlOiBEYXRlO1xyXG4gIGFjY291bnRJZDogbnVtYmVyIHwgbnVsbDtcclxuICBhY2NvdW50TmFtZTogc3RyaW5nIHwgbnVsbDtcclxufVxyXG5cclxuLy8gR0VUL1BVVCBpbnN0cnVjdGlvbnMgcGF5bG9hZDogdGhlIGN1cnJlbnQgdmVyc2lvbiAobnVsbCB1bnRpbCBvbmUgaXNcclxuLy8gYXV0aG9yZWQpIHBsdXMgdGhlIGZ1bGwgaGlzdG9yeSwgbmV3ZXN0IGZpcnN0LlxyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydEluc3RydWN0aW9ucyB7XHJcbiAgaW5zdHJ1Y3Rpb25zOiBSZXBvcnRJbnN0cnVjdGlvbiB8IG51bGw7XHJcbiAgdmVyc2lvbnM6IFJlcG9ydEluc3RydWN0aW9uW107XHJcbn1cclxuXHJcbi8vIFRoZSBsYXRlc3Qgc2VtYW50aWMtZGF0YWJhc2UgYnVpbGQgKGFuIGZmX3Byb2Nlc3NlcyByb3cpIOKAlCBlbm91Z2ggZm9yIHRoZVxyXG4vLyBzZXR0aW5ncyBkaWFsb2cgdG8gc2F5IHdoYXQgc3RhdGUgdGhlIGJ1aWxkIGlzIGluIGFuZCB3aGVuIGl0IGxhc3QgcmFuLlxyXG5leHBvcnQgaW50ZXJmYWNlIFNlbWFudGljQnVpbGQge1xyXG4gIGlkOiBudW1iZXI7XHJcbiAgc3RhdGU6IHN0cmluZztcclxuICBwZXJjZW50OiBudW1iZXIgfCBzdHJpbmc7XHJcbiAgbWVzc2FnZTogc3RyaW5nO1xyXG4gIGR1cmF0aW9uOiBudW1iZXI7XHJcbiAgY3JlYXRlRGF0ZTogRGF0ZTtcclxuICBzdGFydERhdGU6IERhdGU7XHJcbiAgZW5kRGF0ZTogRGF0ZTtcclxufVxyXG5cclxuLy8gQSBidWlsZCBzdGFnZSdzIHN0YXRlIG9uIHRoZSBlbnRpdHkgc2NvcmVib2FyZDogJ2RvbmUnID0gYnVpbHQsICdtaXNzaW5nJyA9XHJcbi8vIHN0aWxsIG5lZWRzIGJ1aWxkaW5nIChhIG1pc3Npbmcgc3RhZ2UgaXMgdW5idWlsdCBjb250ZW50LCBuZXZlciBhbiBlcnJvcikuXHJcbmV4cG9ydCB0eXBlIFNlbWFudGljQnVpbGRTdGFnZSA9ICdkb25lJyB8ICdtaXNzaW5nJztcclxuXHJcbi8vIE9uZSBlbnVtIGNvbHVtbiBvZiBhbiBlbnRpdHksIHdpdGggdGhlIGFsbG93ZWQgdmFsdWVzIHRoZSBidWlsZCBpbmxpbmVkLlxyXG5leHBvcnQgaW50ZXJmYWNlIFNlbWFudGljQnVpbGRFbnVtIHtcclxuICBjb2x1bW46IHN0cmluZztcclxuICB2YWx1ZXM6IHN0cmluZ1tdO1xyXG59XHJcblxyXG4vLyBPbmUgZW50aXR5IHJvdyBvZiB0aGUgc2NvcmVib2FyZCAoYW4gZW50aXR5ID0gYSB0YWJsZSArIGEgbW9kZWwgKyBhXHJcbi8vIGhhbmRsZXIpOiBpdHMgdGFibGUvc2hhcGUgY291bnRzLCBpbmxpbmVkIGVudW0gdmFsdWVzLCBjb21wdXRlZCBmaWVsZHMsIGhvd1xyXG4vLyBtYW55IGNvZGUgZnVuY3Rpb25zIHdlcmUgY2FjaGVkIChzcGxpdCBtb2RlbCB2cyBoYW5kbGVyKSwgYW5kIHRoZSBwZXItc3RhZ2VcclxuLy8gYnVpbHQvbWlzc2luZyBzdGF0ZS5cclxuLy9cclxuLy8gYG1vZGVsYC9gaGFuZGxlcmAgYXJlIHRoZSBjbGFzc2VzIHRoZSBmdW5jdGlvbnMgd2VyZSByZWFkIGZyb20g4oCUIHdoYXQgYVxyXG4vLyByZWFkZXIgcmVjb2duaXplcyB0aGUgcm93IGJ5LCB3aGVyZSBga2V5YCBpcyB3aGF0IHRoZSByZXBvcnQgQUkgYWRkcmVzc2VzIGl0XHJcbi8vIGJ5IGluIGRlc2NyaWJlX2VudGl0eSAvIGNvbXBpbGVfcXVlcnkuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VtYW50aWNCdWlsZEVudGl0eSB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgdGFibGU6IHN0cmluZztcclxuICBtb2RlbDogc3RyaW5nIHwgbnVsbDtcclxuICBoYW5kbGVyOiBzdHJpbmcgfCBudWxsO1xyXG4gIGNvbHVtbnM6IG51bWJlcjtcclxuICByZWxhdGlvbnNoaXBzOiBudW1iZXI7XHJcbiAgZW51bXM6IFNlbWFudGljQnVpbGRFbnVtW107XHJcbiAgY29tcHV0ZWRGaWVsZHM6IHN0cmluZ1tdO1xyXG4gIGZ1bmN0aW9uQ291bnQ6IG51bWJlcjtcclxuICBtb2RlbEZ1bmN0aW9uQ291bnQ6IG51bWJlcjtcclxuICBoYW5kbGVyRnVuY3Rpb25Db3VudDogbnVtYmVyO1xyXG4gIHN0YWdlczogUmVjb3JkPHN0cmluZywgU2VtYW50aWNCdWlsZFN0YWdlPjtcclxufVxyXG5cclxuLy8gT25lIHN0YW5kYWxvbmUgY29kZSBjbGFzcyB0aGUgYnVpbGQgcmVhZDogZG9tYWluIGxvZ2ljIHdpdGggbm8gdGFibGUgb2YgaXRzXHJcbi8vIG93biAoYSBzdW1tYXJ5IG1vZGVsLCBhIGNhbGN1bGF0aW9uIHNlcnZpY2UpLiBUaGUgcmVwb3J0IEFJIHJlYWRzIGl0cyBjb2RlXHJcbi8vIGV4YWN0bHkgbGlrZSBhbiBlbnRpdHkncywgYnV0IGl0IGNhbiBuZXZlciBiZSBxdWVyaWVkIOKAlCB0aGVyZSBpcyBub3RoaW5nIHRvXHJcbi8vIHNlbGVjdCBmcm9tIOKAlCBzbyBpdCBjYXJyaWVzIG5vIHRhYmxlLCBjb2x1bW5zIG9yIHJlbGF0aW9uc2hpcHMuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VtYW50aWNCdWlsZENsYXNzIHtcclxuICBrZXk6IHN0cmluZztcclxuICBtb2RlbDogc3RyaW5nIHwgbnVsbDtcclxuICBmdW5jdGlvbkNvdW50OiBudW1iZXI7XHJcbn1cclxuXHJcbi8vIFdoYXQgdGhlIGJ1aWxkIGRlY2lkZWQgYSBwaHlzaWNhbCB0YWJsZSBpcy4gRW50aXR5IGFuZCBqdW5jdGlvbiBhcmUgYm90aFxyXG4vLyByZWFjaGFibGUgYnkgdGhlIHJlcG9ydCBBSSDigJQgYW4gZW50aXR5IGRpcmVjdGx5LCBhIGp1bmN0aW9uIHRocm91Z2ggdGhlXHJcbi8vIG1hbnktdG8tbWFueSBpdCBicmlkZ2VzLiBFeGNsdWRlZCBpcyBub3QgcmVhY2hhYmxlIGF0IGFsbC5cclxuZXhwb3J0IHR5cGUgU2VtYW50aWNUYWJsZUNsYXNzaWZpY2F0aW9uID0gJ2VudGl0eScgfCAnanVuY3Rpb24nIHwgJ2V4Y2x1ZGVkJztcclxuXHJcbi8vIE9uZSBwaHlzaWNhbCB0YWJsZSBhcyB0aGUgYnVpbGQgY2xhc3NpZmllZCBpdC4gYHJlYXNvbmAgYW5zd2VycyBhIHNpbmdsZVxyXG4vLyBxdWVzdGlvbiDigJQgd2h5IGNhbid0IHRoZSByZXBvcnQgQUkgc2VlIHRoaXMgdGFibGU/IOKAlCBhbmQgaXMgbnVsbCB3aGVuIGl0IGNhbi5cclxuLy8gQSBqdW5jdGlvbiB3aXRoIGEgcmVhc29uIGJyaWRnZWQgbm90aGluZywgc28gaXQgaXMganVzdCBhcyBpbnZpc2libGUgYXMgYW5cclxuLy8gZXhjbHVkZWQgdGFibGUuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VtYW50aWNCdWlsZFRhYmxlIHtcclxuICB0YWJsZTogc3RyaW5nO1xyXG4gIGNsYXNzaWZpY2F0aW9uOiBTZW1hbnRpY1RhYmxlQ2xhc3NpZmljYXRpb247XHJcbiAgbW9kZWw6IHN0cmluZyB8IG51bGw7XHJcbiAgcmVhc29uOiBzdHJpbmcgfCBudWxsO1xyXG59XHJcblxyXG4vLyBUaGUgYnVpbGQgc2NvcmVib2FyZCBzaGlwcGVkIGFsb25nc2lkZSB0aGUgYnVpbGQgc3RhdHVzOiB0aGUgc3VtbWFyeSBjb3VudHMsXHJcbi8vIHRoZSBmdWxsIGJyZWFrZG93biB0aGUgc2V0dGluZ3MgZGlhbG9nIGRyaWxscyBpbnRvIOKAlCBCT1RIIGtpbmRzIG9mIHVuaXQgdGhlXHJcbi8vIGJ1aWxkIGNhY2hlcywgdGFibGUtYmFja2VkIGVudGl0aWVzIGFuZCBzdGFuZGFsb25lIGNvZGUgY2xhc3NlcyDigJQgYW5kIHRoZVxyXG4vLyBjYXRhbG9nIG9mIGV2ZXJ5IHRhYmxlIHRoZSBidWlsZCBzYXcsIHNvIHRoZSB0YWIgY2FuIHNob3cgd2hhdCB0aGUgcmVwb3J0IEFJXHJcbi8vIGNhbid0IHNlZSwgbm90IGp1c3Qgd2hhdCBpdCBjYW4uXHJcbi8vXHJcbi8vIGBmdW5jdGlvbkNvdW50YCBzcGFucyBlbnRpdGllcyBhbmQgY2xhc3NlcyBhbGlrZTogaXQgaXMgdGhlIHNhbWUgdG90YWwgdGhlXHJcbi8vIGJ1aWxkIGl0c2VsZiByZXBvcnRzIHdoZW4gaXQgZmluaXNoZXMuXHJcbi8vXHJcbi8vIGB0YWJsZXNgIGlzIGVtcHR5IGZvciBhbiBhcnRpZmFjdCBidWlsdCBiZWZvcmUgdGhlIGNhdGFsb2cgZXhpc3RlZC4gUmVhZCB0aGF0XHJcbi8vIGFzIFwibm8gY2F0YWxvZ1wiLCBuZXZlciBhcyBcIm5vdGhpbmcgd2FzIGV4Y2x1ZGVkXCIuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VtYW50aWNCdWlsZERldGFpbCB7XHJcbiAgLy8gV2hldGhlciB0aGUgYXJ0aWZhY3Qgd2FzIHByb2R1Y2VkIGJ5IGEgYnVpbGQgdGhhdCByYW4gdG8gdGhlIGVuZC4gUmVhZCBpdFxyXG4gIC8vIGJlc2lkZSBgZ2VuZXJhdGVkQXRgLCBuZXZlciBpbnN0ZWFkIG9mIGl0OiB0aGUgc3RydWN0dXJhbCBhcnRpZmFjdCBpc1xyXG4gIC8vIHB1Ymxpc2hlZCBCRUZPUkUgdGhlIEFJIGZ1bmN0aW9uIHBhc3MsIHNvIGEgYnVpbGQgd2hvc2UgQUkgcGFzcyBmYWlsZWQgc3RpbGxcclxuICAvLyBjYXJyaWVzIGEgZGF0ZSBhbmQgYSBmdWxsIHNldCBvZiBjb3VudHMuIFRoZSBkYXRlIHNheXMgc29tZXRoaW5nIHdhc1xyXG4gIC8vIHdyaXR0ZW47IG9ubHkgdGhpcyBzYXlzIHRoZSBidWlsZCBmaW5pc2hlZCB3cml0aW5nIGl0LlxyXG4gIGNvbXBsZXRlOiBib29sZWFuO1xyXG4gIGdlbmVyYXRlZEF0OiBEYXRlIHwgbnVsbDtcclxuICBlbnRpdHlDb3VudDogbnVtYmVyO1xyXG4gIGNsYXNzQ291bnQ6IG51bWJlcjtcclxuICBmdW5jdGlvbkNvdW50OiBudW1iZXI7XHJcbiAgZW50aXRpZXM6IFNlbWFudGljQnVpbGRFbnRpdHlbXTtcclxuICBjbGFzc2VzOiBTZW1hbnRpY0J1aWxkQ2xhc3NbXTtcclxuICB0YWJsZUNvdW50OiBudW1iZXI7XHJcbiAganVuY3Rpb25Db3VudDogbnVtYmVyO1xyXG4gIHVubGlua2VkSnVuY3Rpb25Db3VudDogbnVtYmVyO1xyXG4gIGV4Y2x1ZGVkQ291bnQ6IG51bWJlcjtcclxuICB0YWJsZXM6IFNlbWFudGljQnVpbGRUYWJsZVtdO1xyXG59XHJcblxyXG4vLyBXaGljaCBjbGFzcyBhIGNhY2hlZCBmdW5jdGlvbiB3YXMgcmVhZCBmcm9tLiBBbiBlbnRpdHkncyBjYWNoZSBzcGxpdHMgaW50b1xyXG4vLyAnbW9kZWwnIGFuZCAnaGFuZGxlcic7IGEgc3RhbmRhbG9uZSBjb2RlIGNsYXNzIGhhcyBvbmUgZ3JvdXAsICdjbGFzcycuXHJcbmV4cG9ydCB0eXBlIFNlbWFudGljRnVuY3Rpb25Tb3VyY2UgPSAnbW9kZWwnIHwgJ2hhbmRsZXInIHwgJ2NsYXNzJztcclxuXHJcbi8vIE9uZSBBSS1jbGFzc2lmaWVkIGNvZGUgZnVuY3Rpb24gZnJvbSBhIG1vZGVsLCBoYW5kbGVyIG9yIHN0YW5kYWxvbmUgY2xhc3M6XHJcbi8vIHdoYXQga2luZCBvZiBsb2dpYyBpdCBpcywgd2hhdCBpdCBkb2VzLCBhbmQgd2hhdCBpdCBwcm9kdWNlcyDigJQgdGhlIGJ1aWxkJ3NcclxuLy8gY2FjaGVkIFwid2hhdCB0aGUgY29kZSBkb2VzXCIga25vd2xlZGdlIHNob3duIGluIHRoZSBmdW5jdGlvbnMgZGlhbG9nLlxyXG5leHBvcnQgaW50ZXJmYWNlIFNlbWFudGljRW50aXR5RnVuY3Rpb24ge1xyXG4gIGNsYXNzOiBzdHJpbmc7XHJcbiAgbWV0aG9kOiBzdHJpbmc7XHJcbiAgc2lnbmF0dXJlOiBzdHJpbmc7XHJcbiAga2luZDogc3RyaW5nO1xyXG4gIHN1bW1hcnk6IHN0cmluZztcclxuICBwcm9kdWNlczogc3RyaW5nO1xyXG4gIHNvdXJjZTogU2VtYW50aWNGdW5jdGlvblNvdXJjZTtcclxufVxyXG5cclxuLy8gT25lIGVudGl0eSdzIGNhY2hlZCBjb2RlLWZ1bmN0aW9uIGtub3dsZWRnZSwgZmV0Y2hlZCB3aGVuIGEgZnVuY3Rpb25zIGRpYWxvZ1xyXG4vLyBvcGVucyAodGhlIGZ1bGwgc2V0IGFjcm9zcyBhbGwgZW50aXRpZXMgaXMgdG9vIGJpZyB0byBzaGlwIHdpdGggdGhlXHJcbi8vIHNjb3JlYm9hcmQpLiBPbmUgcGF5bG9hZCBzZXJ2ZXMgYm90aCBkaWFsb2dzIOKAlCBjb25zdW1lcnMgZmlsdGVyIGJ5IHNvdXJjZS5cclxuZXhwb3J0IGludGVyZmFjZSBTZW1hbnRpY0VudGl0eUZ1bmN0aW9ucyB7XHJcbiAgZW50aXR5OiBzdHJpbmc7XHJcbiAgZ2VuZXJhdGVkQXQ6IERhdGUgfCBudWxsO1xyXG4gIG1vZGVsQ2xhc3M6IHN0cmluZyB8IG51bGw7XHJcbiAgaGFuZGxlckNsYXNzOiBzdHJpbmcgfCBudWxsO1xyXG4gIGZ1bmN0aW9uczogU2VtYW50aWNFbnRpdHlGdW5jdGlvbltdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNlbWFudGljQnVpbGRTdGF0dXMge1xyXG4gIGJ1aWxkOiBTZW1hbnRpY0J1aWxkIHwgbnVsbDtcclxuICBkZXRhaWw6IFNlbWFudGljQnVpbGREZXRhaWw7XHJcbn1cclxuXHJcbi8vIFRoZSByZXBvcnQgbW9kdWxlJ3MgR2VuZXJhbCBzZXR0aW5ncyAoYSBzbWFsbCBnbG9iYWwga2V5L3ZhbHVlIHN0b3JlLCB0aGVcclxuLy8gcmVwb3J0aW5nIGNvdW50ZXJwYXJ0IG9mIHRoZSBhcHAtd2lkZSBzZXR0aW5ncykuIEVhY2ggdmFsdWUgc2hpcHMgd2l0aCB0aGVcclxuLy8gc2FmZSBiYW5kIGl0cyBlZGl0b3IgZmllbGQgaXMgYm91bmRlZCB0by5cclxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRTZXR0aW5ncyB7XHJcbiAgLy8gSG93IG1hbnkgc3VtbWFyeSBjYWxscyB0aGUgc2VtYW50aWMgYnVpbGQgcnVucyBhdCBvbmNlLlxyXG4gIHNlbWFudGljQnVpbGRDb25jdXJyZW5jeTogbnVtYmVyO1xyXG4gIHNlbWFudGljQnVpbGRDb25jdXJyZW5jeU1pbjogbnVtYmVyO1xyXG4gIHNlbWFudGljQnVpbGRDb25jdXJyZW5jeU1heDogbnVtYmVyO1xyXG59XHJcbiJdfQ==