verben-ng-ui 1.3.7 → 1.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -43,6 +43,12 @@ export class DataFilterComponent {
43
43
  // Set once the user edits the panel, so restored/host filters no longer
44
44
  // overwrite their in-progress work.
45
45
  userTouched = false;
46
+ /**
47
+ * The saved filter currently loaded into the operation row, if any. Held by
48
+ * reference rather than by index so deleting or reordering another filter
49
+ * cannot retarget the write-back.
50
+ */
51
+ editingFilter = null;
46
52
  ngOnInit() {
47
53
  this.initializeFilterableColumns();
48
54
  this.hydrateSavedFilters();
@@ -80,7 +86,14 @@ export class DataFilterComponent {
80
86
  // Reset other values
81
87
  this.currentFilter.operator = undefined;
82
88
  this.currentFilter.value = undefined;
83
- // Determine column type and set available operators
89
+ this.applyColumnContext(column);
90
+ }
91
+ /**
92
+ * Derives the value control, operators and options for a column without
93
+ * touching the operator or value already in the operation row — `editFilter`
94
+ * depends on those surviving, where `onColumnSelect` clears them first.
95
+ */
96
+ applyColumnContext(column) {
84
97
  this.currentColumnType = this.resolveColumnType(column);
85
98
  this.valueOptions =
86
99
  this.currentColumnType === 'bool'
@@ -116,18 +129,98 @@ export class DataFilterComponent {
116
129
  if (!this.currentFilter.columnId || !this.currentFilter.operator || !hasValue) {
117
130
  return;
118
131
  }
119
- const newFilter = {
132
+ const condition = {
120
133
  columnId: this.currentFilter.columnId,
121
134
  operator: this.currentFilter.operator,
122
135
  // Bool values round-trip through the dropdown as strings; hosts receive
123
136
  // a real boolean.
124
137
  value: this.currentColumnType === 'bool' ? value === 'true' : value,
125
- selected: true,
126
138
  };
127
- this.savedFilters.unshift(newFilter);
139
+ // Written back over the filter being edited, and over the existing chip of a
140
+ // required column, so neither case leaves a stale duplicate behind. Updated
141
+ // in place rather than removed and re-added so the chip keeps its position.
142
+ const target = this.editingFilter ??
143
+ (this.isRequiredColumn(condition.columnId)
144
+ ? this.savedFilters.find((f) => f.columnId === condition.columnId)
145
+ : undefined);
146
+ if (target) {
147
+ Object.assign(target, condition);
148
+ target.selected = true;
149
+ }
150
+ else {
151
+ this.savedFilters.unshift({ ...condition, selected: true });
152
+ }
153
+ this.editingFilter = null;
128
154
  this.userTouched = true;
129
155
  this.resetCurrentFilter();
130
156
  }
157
+ /** Loads a saved filter back into the operation row for correction. */
158
+ editFilter(filter) {
159
+ const column = this.filterableColumns.find((col) => col.id === filter.columnId);
160
+ if (!column)
161
+ return;
162
+ this.applyColumnContext(column);
163
+ this.currentFilter = {
164
+ columnId: filter.columnId,
165
+ operator: filter.operator,
166
+ value: this.toEditableValue(filter.value),
167
+ };
168
+ this.editingFilter = filter;
169
+ this.userTouched = true;
170
+ }
171
+ /**
172
+ * Converts a stored value back into what the value control expects: bools are
173
+ * held as real booleans but the dropdown's options are the strings
174
+ * 'true'/'false' (see `boolOptions`), and the native date input needs
175
+ * 'YYYY-MM-DD' rather than a `Date` a host may have restored.
176
+ */
177
+ toEditableValue(value) {
178
+ if (this.currentColumnType === 'bool')
179
+ return `${value}`;
180
+ if (value instanceof Date) {
181
+ // Built from the local parts: `toISOString` shifts to UTC and would move
182
+ // the date a day back west of Greenwich.
183
+ const month = `${value.getMonth() + 1}`.padStart(2, '0');
184
+ const day = `${value.getDate()}`.padStart(2, '0');
185
+ return `${value.getFullYear()}-${month}-${day}`;
186
+ }
187
+ return value;
188
+ }
189
+ /** Removes a saved filter. Required filters cannot be removed. */
190
+ deleteFilter(filter) {
191
+ if (this.isRequired(filter))
192
+ return;
193
+ const index = this.savedFilters.indexOf(filter);
194
+ if (index === -1)
195
+ return;
196
+ this.savedFilters.splice(index, 1);
197
+ if (this.editingFilter === filter)
198
+ this.clearCurrentFilter();
199
+ this.userTouched = true;
200
+ }
201
+ /** Empties the operation row, abandoning any edit in progress. */
202
+ clearCurrentFilter() {
203
+ this.editingFilter = null;
204
+ this.resetCurrentFilter();
205
+ }
206
+ /** True when the filter's column is declared `isRequiredFilter`. */
207
+ isRequired(filter) {
208
+ return this.isRequiredColumn(filter.columnId);
209
+ }
210
+ isRequiredColumn(columnId) {
211
+ const column = this.filterableColumns.find((col) => col.id === columnId);
212
+ return !!column?.isRequiredFilter;
213
+ }
214
+ isEditing(filter) {
215
+ return this.editingFilter === filter;
216
+ }
217
+ /**
218
+ * Locks the property dropdown while a required filter is being edited —
219
+ * switching it to another column would drop the required filter entirely.
220
+ */
221
+ get isEditingRequired() {
222
+ return !!this.editingFilter && this.isRequired(this.editingFilter);
223
+ }
131
224
  getFilterDescription(filter) {
132
225
  const column = this.filterableColumns.find((col) => col.id === filter.columnId);
133
226
  if (!column)
@@ -257,14 +350,23 @@ export class DataFilterComponent {
257
350
  }
258
351
  resetAll() {
259
352
  this.userTouched = true;
260
- this.savedFilters = [];
261
- this.resetCurrentFilter();
353
+ this.savedFilters = this.savedFilters.filter((filter) => this.isRequired(filter));
354
+ this.clearCurrentFilter();
355
+ // Required filters survive a reset, so the host is told what is left rather
356
+ // than that everything is gone — a bare `resetFilter` would leave the panel
357
+ // showing chips the host is no longer filtering by.
358
+ if (this.savedFilters.length) {
359
+ this.applyFilters();
360
+ return;
361
+ }
262
362
  this.resetFilter.emit();
263
363
  }
264
364
  applyFilters() {
265
365
  this.userTouched = true;
266
366
  const activeFilters = this.savedFilters
267
- .filter((filter) => filter.selected)
367
+ // Required filters are emitted whether or not they are ticked: their
368
+ // checkbox is disabled, but the host must never be left without them.
369
+ .filter((filter) => filter.selected || this.isRequired(filter))
268
370
  .map(({ columnId, operator, value }) => ({
269
371
  columnId,
270
372
  operator,
@@ -280,20 +382,30 @@ export class DataFilterComponent {
280
382
  : column.header
281
383
  : columnId;
282
384
  }
385
+ /**
386
+ * Required filters pinned to the top so the collapsed list can never hide one
387
+ * behind "Show More".
388
+ */
389
+ get orderedFilters() {
390
+ return [
391
+ ...this.savedFilters.filter((filter) => this.isRequired(filter)),
392
+ ...this.savedFilters.filter((filter) => !this.isRequired(filter)),
393
+ ];
394
+ }
283
395
  get visibleFilters() {
284
396
  return this.showAllFilters
285
- ? this.savedFilters
286
- : this.savedFilters.slice(0, this.maxVisibleItems);
397
+ ? this.orderedFilters
398
+ : this.orderedFilters.slice(0, this.maxVisibleItems);
287
399
  }
288
400
  get activeFilterCount() {
289
- return this.savedFilters.filter((filter) => filter.selected).length;
401
+ return this.savedFilters.filter((filter) => filter.selected || this.isRequired(filter)).length;
290
402
  }
291
403
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
292
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.10", type: DataFilterComponent, selector: "lib-data-filter", inputs: { columns: "columns", data: "data", initialFilters: "initialFilters" }, outputs: { filterApplied: "filterApplied", resetFilter: "resetFilter" }, usesOnChanges: true, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">\n Filter <sup>({{ activeFilterCount }})</sup>\n </h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n\n <div card-body class=\"card-body\">\n <!-- Saved Filters Section -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Filters</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n\n <div *ngFor=\"let filter of visibleFilters\" class=\"item\">\n <div class=\"item-label\">\n <input type=\"checkbox\" [(ngModel)]=\"filter.selected\" (ngModelChange)=\"markTouched()\" />\n <label>{{ getFilterDescription(filter) }}</label>\n </div>\n </div>\n\n <div\n *ngIf=\"savedFilters.length > maxVisibleItems\"\n class=\"show-more\"\n (click)=\"showAllFilters = !showAllFilters\"\n >\n {{ showAllFilters ? \"Show Less\" : \"Show More\" }}\n </div>\n </section>\n\n <hr class=\"divider\" />\n\n <!-- New Filter Operation -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n\n <div class=\"operation-grid\">\n <!-- Column Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select column\"\n [options]=\"filterableColumns\"\n optionLabel=\"header\"\n optionValue=\"id\"\n [(ngModel)]=\"currentFilter.columnId\"\n (ngModelChange)=\"onColumnSelect($event)\"\n ></verben-drop-down>\n\n <!-- Operator Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"availableOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.operator\"\n ></verben-drop-down>\n\n <!-- Value Input based on type -->\n <ng-container [ngSwitch]=\"currentColumnType\">\n <!-- Date Input \u2014 native rather than the library date picker, whose\n overlay renders off screen from this narrow panel. -->\n <verbena-input\n *ngSwitchCase=\"'date'\"\n type=\"date\"\n placeHolder=\"Select date\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Number Input -->\n <verbena-input\n *ngSwitchCase=\"'number'\"\n type=\"number\"\n placeHolder=\"Enter number\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Yes / No Selection -->\n <verben-drop-down\n *ngSwitchCase=\"'bool'\"\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select value\"\n [options]=\"valueOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.value\"\n ></verben-drop-down>\n\n <!-- Enum Member Selection -->\n <verben-drop-down\n *ngSwitchCase=\"'enum'\"\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select value\"\n [options]=\"valueOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.value\"\n ></verben-drop-down>\n\n <!-- Text Input (default) -->\n <verbena-input\n *ngSwitchDefault\n type=\"text\"\n placeHolder=\"Enter text\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n </ng-container>\n </div>\n\n <button class=\"add-button ml-auto\" (click)=\"addFilter()\">+ Add</button>\n </section>\n </div>\n\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"applyFilters()\">Filter</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:var(--vbn-color-border-focus);font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary);font-size:.75rem;font-weight:600;cursor:pointer}sup{color:var(--vbn-color-border-focus)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i4.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i5.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "overlayWidth", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "refPageSize", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i6.VerbenaInputComponent, selector: "verbena-input", inputs: ["disabled", "label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }] });
404
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.10", type: DataFilterComponent, selector: "lib-data-filter", inputs: { columns: "columns", data: "data", initialFilters: "initialFilters" }, outputs: { filterApplied: "filterApplied", resetFilter: "resetFilter" }, usesOnChanges: true, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">\n Filter <sup>({{ activeFilterCount }})</sup>\n </h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n\n <div card-body class=\"card-body\">\n <!-- Saved Filters Section -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Filters</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n\n <div\n *ngFor=\"let filter of visibleFilters\"\n class=\"item\"\n [class.item-editing]=\"isEditing(filter)\"\n >\n <div class=\"item-label\">\n <!-- A required filter is always active, so its checkbox is ticked and\n locked rather than hidden \u2014 the state stays readable. -->\n <input\n type=\"checkbox\"\n [(ngModel)]=\"filter.selected\"\n [disabled]=\"isRequired(filter)\"\n (ngModelChange)=\"markTouched()\"\n />\n <label>{{ getFilterDescription(filter) }}</label>\n </div>\n\n <div class=\"item-actions\">\n <button\n type=\"button\"\n class=\"icon-button\"\n aria-label=\"Edit filter\"\n (click)=\"editFilter(filter)\"\n >\n <!-- Only `stroke` is passed: `verben-svg` resolves a single colour as\n `fill || stroke` and applies it to both, so also passing `fill`\n would paint the icon in whatever `fill` holds. -->\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n ></verben-svg>\n </button>\n <button\n type=\"button\"\n class=\"icon-button\"\n aria-label=\"Delete filter\"\n [disabled]=\"isRequired(filter)\"\n (click)=\"deleteFilter(filter)\"\n >\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n ></verben-svg>\n </button>\n </div>\n </div>\n\n <div\n *ngIf=\"savedFilters.length > maxVisibleItems\"\n class=\"show-more\"\n (click)=\"showAllFilters = !showAllFilters\"\n >\n {{ showAllFilters ? \"Show Less\" : \"Show More\" }}\n </div>\n </section>\n\n <hr class=\"divider\" />\n\n <!-- New Filter Operation -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n\n <div class=\"operation-grid\">\n <!-- Column Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select column\"\n [options]=\"filterableColumns\"\n optionLabel=\"header\"\n optionValue=\"id\"\n [disabled]=\"isEditingRequired\"\n [(ngModel)]=\"currentFilter.columnId\"\n (ngModelChange)=\"onColumnSelect($event)\"\n ></verben-drop-down>\n\n <!-- Operator Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"availableOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.operator\"\n ></verben-drop-down>\n\n <!-- Value Input based on type -->\n <ng-container [ngSwitch]=\"currentColumnType\">\n <!-- Date Input \u2014 native rather than the library date picker, whose\n overlay renders off screen from this narrow panel. -->\n <verbena-input\n *ngSwitchCase=\"'date'\"\n type=\"date\"\n placeHolder=\"Select date\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Number Input -->\n <verbena-input\n *ngSwitchCase=\"'number'\"\n type=\"number\"\n placeHolder=\"Enter number\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Yes / No Selection -->\n <verben-drop-down\n *ngSwitchCase=\"'bool'\"\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select value\"\n [options]=\"valueOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.value\"\n ></verben-drop-down>\n\n <!-- Enum Member Selection -->\n <verben-drop-down\n *ngSwitchCase=\"'enum'\"\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select value\"\n [options]=\"valueOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.value\"\n ></verben-drop-down>\n\n <!-- Text Input (default) -->\n <verbena-input\n *ngSwitchDefault\n type=\"text\"\n placeHolder=\"Enter text\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n </ng-container>\n </div>\n\n <div class=\"operation-actions\">\n <button class=\"clear-button\" (click)=\"clearCurrentFilter()\">\n Clear\n </button>\n <button class=\"add-button\" (click)=\"addFilter()\">+ Add</button>\n </div>\n </section>\n </div>\n\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"applyFilters()\">Filter</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center;gap:.5rem}.item-editing{background-color:var(--vbn-color-surface-alt);border-radius:4px}.item-label{display:flex;align-items:center;gap:.5rem;flex:1;min-width:0}.item-label label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.icon-button{display:inline-flex;align-items:center;padding:0;border:none;background-color:transparent;cursor:pointer}.icon-button[disabled]{cursor:not-allowed;opacity:.4}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.operation-actions{display:flex;justify-content:flex-end;gap:.75rem}.add-button,.clear-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;font-size:.75rem;font-weight:500;cursor:pointer}.add-button{color:var(--vbn-color-border-focus)}.clear-button{color:var(--vbn-color-text-muted)}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary);font-size:.75rem;font-weight:600;cursor:pointer}sup{color:var(--vbn-color-border-focus)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i4.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i5.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "overlayWidth", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "refPageSize", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i6.VerbenaInputComponent, selector: "verbena-input", inputs: ["disabled", "label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }] });
293
405
  }
294
406
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataFilterComponent, decorators: [{
295
407
  type: Component,
296
- args: [{ selector: 'lib-data-filter', template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">\n Filter <sup>({{ activeFilterCount }})</sup>\n </h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n\n <div card-body class=\"card-body\">\n <!-- Saved Filters Section -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Filters</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n\n <div *ngFor=\"let filter of visibleFilters\" class=\"item\">\n <div class=\"item-label\">\n <input type=\"checkbox\" [(ngModel)]=\"filter.selected\" (ngModelChange)=\"markTouched()\" />\n <label>{{ getFilterDescription(filter) }}</label>\n </div>\n </div>\n\n <div\n *ngIf=\"savedFilters.length > maxVisibleItems\"\n class=\"show-more\"\n (click)=\"showAllFilters = !showAllFilters\"\n >\n {{ showAllFilters ? \"Show Less\" : \"Show More\" }}\n </div>\n </section>\n\n <hr class=\"divider\" />\n\n <!-- New Filter Operation -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n\n <div class=\"operation-grid\">\n <!-- Column Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select column\"\n [options]=\"filterableColumns\"\n optionLabel=\"header\"\n optionValue=\"id\"\n [(ngModel)]=\"currentFilter.columnId\"\n (ngModelChange)=\"onColumnSelect($event)\"\n ></verben-drop-down>\n\n <!-- Operator Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"availableOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.operator\"\n ></verben-drop-down>\n\n <!-- Value Input based on type -->\n <ng-container [ngSwitch]=\"currentColumnType\">\n <!-- Date Input \u2014 native rather than the library date picker, whose\n overlay renders off screen from this narrow panel. -->\n <verbena-input\n *ngSwitchCase=\"'date'\"\n type=\"date\"\n placeHolder=\"Select date\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Number Input -->\n <verbena-input\n *ngSwitchCase=\"'number'\"\n type=\"number\"\n placeHolder=\"Enter number\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Yes / No Selection -->\n <verben-drop-down\n *ngSwitchCase=\"'bool'\"\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select value\"\n [options]=\"valueOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.value\"\n ></verben-drop-down>\n\n <!-- Enum Member Selection -->\n <verben-drop-down\n *ngSwitchCase=\"'enum'\"\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select value\"\n [options]=\"valueOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.value\"\n ></verben-drop-down>\n\n <!-- Text Input (default) -->\n <verbena-input\n *ngSwitchDefault\n type=\"text\"\n placeHolder=\"Enter text\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n </ng-container>\n </div>\n\n <button class=\"add-button ml-auto\" (click)=\"addFilter()\">+ Add</button>\n </section>\n </div>\n\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"applyFilters()\">Filter</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:var(--vbn-color-border-focus);font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary);font-size:.75rem;font-weight:600;cursor:pointer}sup{color:var(--vbn-color-border-focus)}\n"] }]
408
+ args: [{ selector: 'lib-data-filter', template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">\n Filter <sup>({{ activeFilterCount }})</sup>\n </h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n\n <div card-body class=\"card-body\">\n <!-- Saved Filters Section -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Filters</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n\n <div\n *ngFor=\"let filter of visibleFilters\"\n class=\"item\"\n [class.item-editing]=\"isEditing(filter)\"\n >\n <div class=\"item-label\">\n <!-- A required filter is always active, so its checkbox is ticked and\n locked rather than hidden \u2014 the state stays readable. -->\n <input\n type=\"checkbox\"\n [(ngModel)]=\"filter.selected\"\n [disabled]=\"isRequired(filter)\"\n (ngModelChange)=\"markTouched()\"\n />\n <label>{{ getFilterDescription(filter) }}</label>\n </div>\n\n <div class=\"item-actions\">\n <button\n type=\"button\"\n class=\"icon-button\"\n aria-label=\"Edit filter\"\n (click)=\"editFilter(filter)\"\n >\n <!-- Only `stroke` is passed: `verben-svg` resolves a single colour as\n `fill || stroke` and applies it to both, so also passing `fill`\n would paint the icon in whatever `fill` holds. -->\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n ></verben-svg>\n </button>\n <button\n type=\"button\"\n class=\"icon-button\"\n aria-label=\"Delete filter\"\n [disabled]=\"isRequired(filter)\"\n (click)=\"deleteFilter(filter)\"\n >\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n ></verben-svg>\n </button>\n </div>\n </div>\n\n <div\n *ngIf=\"savedFilters.length > maxVisibleItems\"\n class=\"show-more\"\n (click)=\"showAllFilters = !showAllFilters\"\n >\n {{ showAllFilters ? \"Show Less\" : \"Show More\" }}\n </div>\n </section>\n\n <hr class=\"divider\" />\n\n <!-- New Filter Operation -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n\n <div class=\"operation-grid\">\n <!-- Column Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select column\"\n [options]=\"filterableColumns\"\n optionLabel=\"header\"\n optionValue=\"id\"\n [disabled]=\"isEditingRequired\"\n [(ngModel)]=\"currentFilter.columnId\"\n (ngModelChange)=\"onColumnSelect($event)\"\n ></verben-drop-down>\n\n <!-- Operator Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"availableOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.operator\"\n ></verben-drop-down>\n\n <!-- Value Input based on type -->\n <ng-container [ngSwitch]=\"currentColumnType\">\n <!-- Date Input \u2014 native rather than the library date picker, whose\n overlay renders off screen from this narrow panel. -->\n <verbena-input\n *ngSwitchCase=\"'date'\"\n type=\"date\"\n placeHolder=\"Select date\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Number Input -->\n <verbena-input\n *ngSwitchCase=\"'number'\"\n type=\"number\"\n placeHolder=\"Enter number\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Yes / No Selection -->\n <verben-drop-down\n *ngSwitchCase=\"'bool'\"\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select value\"\n [options]=\"valueOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.value\"\n ></verben-drop-down>\n\n <!-- Enum Member Selection -->\n <verben-drop-down\n *ngSwitchCase=\"'enum'\"\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select value\"\n [options]=\"valueOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.value\"\n ></verben-drop-down>\n\n <!-- Text Input (default) -->\n <verbena-input\n *ngSwitchDefault\n type=\"text\"\n placeHolder=\"Enter text\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n </ng-container>\n </div>\n\n <div class=\"operation-actions\">\n <button class=\"clear-button\" (click)=\"clearCurrentFilter()\">\n Clear\n </button>\n <button class=\"add-button\" (click)=\"addFilter()\">+ Add</button>\n </div>\n </section>\n </div>\n\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"applyFilters()\">Filter</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center;gap:.5rem}.item-editing{background-color:var(--vbn-color-surface-alt);border-radius:4px}.item-label{display:flex;align-items:center;gap:.5rem;flex:1;min-width:0}.item-label label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.icon-button{display:inline-flex;align-items:center;padding:0;border:none;background-color:transparent;cursor:pointer}.icon-button[disabled]{cursor:not-allowed;opacity:.4}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.operation-actions{display:flex;justify-content:flex-end;gap:.75rem}.add-button,.clear-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;font-size:.75rem;font-weight:500;cursor:pointer}.add-button{color:var(--vbn-color-border-focus)}.clear-button{color:var(--vbn-color-text-muted)}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary);font-size:.75rem;font-weight:600;cursor:pointer}sup{color:var(--vbn-color-border-focus)}\n"] }]
297
409
  }], propDecorators: { columns: [{
298
410
  type: Input
299
411
  }], data: [{
@@ -305,4 +417,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImpo
305
417
  }], resetFilter: [{
306
418
  type: Output
307
419
  }] } });
308
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWZpbHRlci9kYXRhLWZpbHRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtZmlsdGVyL2RhdGEtZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEdBSWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLGVBQWUsR0FDaEIsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRCxPQUFPLEVBS0wsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsY0FBYyxFQUNkLGNBQWMsR0FDZixNQUFNLHFCQUFxQixDQUFDOzs7Ozs7OztBQU83QixNQUFNLE9BQU8sbUJBQW1CO0lBQ3JCLE9BQU8sQ0FBeUI7SUFDaEMsSUFBSSxDQUFPO0lBQ3BCOzs7O09BSUc7SUFDTSxjQUFjLENBQXFCO0lBQ2xDLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztJQUN0RCxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUMzQyxpQkFBaUIsR0FBMEIsRUFBRSxDQUFDO0lBQzlDLGtCQUFrQixHQUFxQixFQUFFLENBQUM7SUFDMUMsWUFBWSxHQUFnRCxFQUFFLENBQUM7SUFDL0QsYUFBYSxHQUE2QixFQUFFLENBQUM7SUFDN0MsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUN2QixlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLGlCQUFpQixHQUE4QixJQUFJLENBQUM7SUFDcEQ7OztPQUdHO0lBQ0gsWUFBWSxHQUF3QixFQUFFLENB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QVEsQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsY0FBYztZQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVk7WUFDbkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDdEUsQ0FBQzt3R0E3VFUsbUJBQW1COzRGQUFuQixtQkFBbUIscU9DL0JoQywwM0tBeUtBOzs0RkQxSWEsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGlCQUFpQjs4QkFLbEIsT0FBTztzQkFBZixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFNRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDb2x1bW5EZWZpbml0aW9uLFxuICBDb2x1bW5WYWx1ZU9wdGlvbixcbiAgQ29sdW1uVmFsdWVUeXBlLFxufSBmcm9tICd2ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUnO1xuaW1wb3J0IHtcbiAgRmlsdGVyT3BlcmF0b3IsXG4gIEZpbHRlck9wZXJhdG9yVHlwZSxcbiAgRmlsdGVyQ29uZGl0aW9uLFxuICBGaWx0ZXJHcm91cCxcbiAgU1RSSU5HX09QRVJBVE9SUyxcbiAgTlVNQkVSX09QRVJBVE9SUyxcbiAgREFURV9PUEVSQVRPUlMsXG4gIEJPT0xfT1BFUkFUT1JTLFxuICBFTlVNX09QRVJBVE9SUyxcbn0gZnJvbSAnLi9kYXRhLWZpbHRlci50eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1kYXRhLWZpbHRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhLWZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kYXRhLWZpbHRlci5jb21wb25lbnQuY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgRGF0YUZpbHRlckNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgY29sdW1ucyE6IENvbHVtbkRlZmluaXRpb248VD5bXTtcbiAgQElucHV0KCkgZGF0YSE6IFRbXTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIHJlc3RvcmVkIGZpbHRlcnM6IHRoZSBwYW5lbCBvcGVucyBwcmUtcG9wdWxhdGVkIHdpdGggdGhlc2UgYXNcbiAgICogc2VsZWN0ZWQgZmlsdGVyIGNoaXBzLiBBcHBsaWVkIG9uY2UgKHRoZSBmaXJzdCB0aW1lIGEgbm9uLWVtcHR5IHZhbHVlXG4gICAqIGFycml2ZXMpIHNvIGl0IG5ldmVyIGNsb2JiZXJzIHRoZSB1c2VyJ3MgaW4tcHJvZ3Jlc3MgZWRpdHMgYWZ0ZXJ3YXJkcy5cbiAgICovXG4gIEBJbnB1dCgpIGluaXRpYWxGaWx0ZXJzPzogRmlsdGVyQ29uZGl0aW9uW107XG4gIEBPdXRwdXQoKSBmaWx0ZXJBcHBsaWVkID0gbmV3IEV2ZW50RW1pdHRlcjxGaWx0ZXJDb25kaXRpb25bXT4oKTtcbiAgQE91dHB1dCgpIHJlc2V0RmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBmaWx0ZXJhYmxlQ29sdW1uczogQ29sdW1uRGVmaW5pdGlvbjxUPltdID0gW107XG4gIGF2YWlsYWJsZU9wZXJhdG9yczogRmlsdGVyT3BlcmF0b3JbXSA9IFtdO1xuICBzYXZlZEZpbHRlcnM6IChGaWx0ZXJDb25kaXRpb24gJiB7IHNlbGVjdGVkOiBib29sZWFuIH0pW10gPSBbXTtcbiAgY3VycmVudEZpbHRlcjogUGFydGlhbDxGaWx0ZXJDb25kaXRpb24+ID0ge307XG4gIHNob3dBbGxGaWx0ZXJzID0gZmFsc2U7XG4gIG1heFZpc2libGVJdGVtcyA9IDM7XG4gIGN1cnJlbnRDb2x1bW5UeXBlOiBGaWx0ZXJPcGVyYXRvclR5cGUgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIHRoZSB2YWx1ZSBkcm9wZG93biB3aGVuIHRoZSBzZWxlY3RlZCBjb2x1bW4gaXMgYm9vbCBvciBlbnVtLlxuICAgKiBBbHdheXMgbm9ybWFsaXNlZCB0byBgeyBsYWJlbCwgdmFsdWUgfWAgc28gdGhlIHRlbXBsYXRlIGJpbmRzIG9uZSBzaGFwZS5cbiAgICovXG4gIHZhbHVlT3B0aW9uczogQ29sdW1uVmFsdWVPcHRpb25bXSA9IFtdO1xuICAvKipcbiAgICogSGVsZCBhcyBzdHJpbmdzIHJhdGhlciB0aGFuIGJvb2xlYW5zOiBgdmVyYmVuLWRyb3AtZG93bmAgZ2F0ZXMgaXRzIHNlbGVjdGVkXG4gICAqIGxhYmVsIG9uIGEgdHJ1dGhpbmVzcyBjaGVjaywgc28gYW4gb3B0aW9uIHZhbHVlZCBgZmFsc2VgIHdvdWxkIHJlbmRlciBhc1xuICAgKiB0aG91Z2ggbm90aGluZyB3ZXJlIHBpY2tlZC4gQ29lcmNlZCBiYWNrIHRvIGEgYm9vbGVhbiBpbiBgYWRkRmlsdGVyYC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYm9vbE9wdGlvbnM6IENvbHVtblZhbHVlT3B0aW9uW10gPSBbXG4gICAgeyBsYWJlbDogJ1llcycsIHZhbHVlOiAndHJ1ZScgfSxcbiAgICB7IGxhYmVsOiAnTm8nLCB2YWx1ZTogJ2ZhbHNlJyB9LFxuICBdO1xuICAvLyBTZXQgb25jZSB0aGUgdXNlciBlZGl0cyB0aGUgcGFuZWwsIHNvIHJlc3RvcmVkL2hvc3QgZmlsdGVycyBubyBsb25nZXJcbiAgLy8gb3ZlcndyaXRlIHRoZWlyIGluLXByb2dyZXNzIHdvcmsuXG4gIHByaXZhdGUgdXNlclRvdWNoZWQgPSBmYWxzZTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmluaXRpYWxpemVGaWx0ZXJhYmxlQ29sdW1ucygpO1xuICAgIHRoaXMuaHlkcmF0ZVNhdmVkRmlsdGVycygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIC8vIFBpY2sgdXAgZmlsdGVycyByZXN0b3JlZCBhc3luY2hyb25vdXNseSBieSB0aGUgaG9zdCBhZnRlciBmaXJzdCByZW5kZXIuXG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxGaWx0ZXJzJ10pIHtcbiAgICAgIHRoaXMuaHlkcmF0ZVNhdmVkRmlsdGVycygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVkIHRoZSBzYXZlZC1maWx0ZXIgY2hpcHMgZnJvbSB0aGUgcmVzdG9yZWQgZmlsdGVycy4gU2tpcHBlZCBvbmNlIHRoZSB1c2VyXG4gICAqIGhhcyB0b3VjaGVkIHRoZSBwYW5lbCBzbyBpdCBuZXZlciBvdmVyd3JpdGVzIHRoZWlyIGluLXByb2dyZXNzIGVkaXRzLlxuICAgKi9cbiAgcHJpdmF0ZSBoeWRyYXRlU2F2ZWRGaWx0ZXJzKCkge1xuICAgIGlmICh0aGlzLnVzZXJUb3VjaGVkKSByZXR1cm47XG4gICAgdGhpcy5zYXZlZEZpbHRlcnMgPSAodGhpcy5pbml0aWFsRmlsdGVycyA/PyBbXSkubWFwKChmaWx0ZXIpID0+ICh7XG4gICAgICAuLi5maWx0ZXIsXG4gICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICB9KSk7XG4gIH1cblxuICAvKiogTWFya3MgdGhlIHBhbmVsIGFzIHVzZXItZWRpdGVkIChjYWxsZWQgZnJvbSB0ZW1wbGF0ZSBpbnRlcmFjdGlvbnMpLiAqL1xuICBtYXJrVG91Y2hlZCgpIHtcbiAgICB0aGlzLnVzZXJUb3VjaGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUZpbHRlcmFibGVDb2x1bW5zKCkge1xuICAgIHRoaXMuZmlsdGVyYWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKChjb2wpID0+IGNvbC5hY2Nlc3NvcktleSk7XG4gIH1cblxuICBvbkNvbHVtblNlbGVjdChjb2x1bW5JZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5maWx0ZXJhYmxlQ29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5pZCA9PT0gY29sdW1uSWQpO1xuICAgIGlmICghY29sdW1uKSByZXR1cm47XG5cbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXIuY29sdW1uSWQgPSBjb2x1bW5JZDtcblxuICAgIC8vIFJlc2V0IG90aGVyIHZhbHVlc1xuICAgIHRoaXMuY3VycmVudEZpbHRlci5vcGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXIudmFsdWUgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBEZXRlcm1pbmUgY29sdW1uIHR5cGUgYW5kIHNldCBhdmFpbGFibGUgb3BlcmF0b3JzXG4gICAgdGhpcy5jdXJyZW50Q29sdW1uVHlwZSA9IHRoaXMucmVzb2x2ZUNvbHVtblR5cGUoY29sdW1uKTtcbiAgICB0aGlzLnZhbHVlT3B0aW9ucyA9XG4gICAgICB0aGlzLmN1cnJlbnRDb2x1bW5UeXBlID09PSAnYm9vbCdcbiAgICAgICAgPyB0aGlzLmJvb2xPcHRpb25zXG4gICAgICAgIDogdGhpcy5jdXJyZW50Q29sdW1uVHlwZSA9PT0gJ2VudW0nXG4gICAgICAgID8gdGhpcy5ub3JtYWxpemVWYWx1ZU9wdGlvbnMoY29sdW1uLnZhbHVlT3B0aW9ucylcbiAgICAgICAgOiBbXTtcblxuICAgIHN3aXRjaCAodGhpcy5jdXJyZW50Q29sdW1uVHlwZSkge1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgdGhpcy5hdmFpbGFibGVPcGVyYXRvcnMgPSBTVFJJTkdfT1BFUkFUT1JTO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlT3BlcmF0b3JzID0gTlVNQkVSX09QRVJBVE9SUztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgdGhpcy5hdmFpbGFibGVPcGVyYXRvcnMgPSBEQVRFX09QRVJBVE9SUztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib29sJzpcbiAgICAgICAgdGhpcy5hdmFpbGFibGVPcGVyYXRvcnMgPSBCT09MX09QRVJBVE9SUztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlbnVtJzpcbiAgICAgICAgdGhpcy5hdmFpbGFibGVPcGVyYXRvcnMgPSBFTlVNX09QRVJBVE9SUztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmF2YWlsYWJsZU9wZXJhdG9ycyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIGFkZEZpbHRlcigpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY3VycmVudEZpbHRlci52YWx1ZTtcbiAgICAvLyBDaGVja2VkIGV4cGxpY2l0bHkgcmF0aGVyIHRoYW4gZm9yIGZhbHNpbmVzczogYGZhbHNlYCBpcyBhIHZhbGlkIGJvb2xcbiAgICAvLyBmaWx0ZXIgYW5kIGAwYCBhIHZhbGlkIG51bWJlciBvbmUuXG4gICAgY29uc3QgaGFzVmFsdWUgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSAnJztcblxuICAgIGlmICghdGhpcy5jdXJyZW50RmlsdGVyLmNvbHVtbklkIHx8ICF0aGlzLmN1cnJlbnRGaWx0ZXIub3BlcmF0b3IgfHwgIWhhc1ZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3RmlsdGVyOiBGaWx0ZXJDb25kaXRpb24gJiB7IHNlbGVjdGVkOiBib29sZWFuIH0gPSB7XG4gICAgICBjb2x1bW5JZDogdGhpcy5jdXJyZW50RmlsdGVyLmNvbHVtbklkISxcbiAgICAgIG9wZXJhdG9yOiB0aGlzLmN1cnJlbnRGaWx0ZXIub3BlcmF0b3IsXG4gICAgICAvLyBCb29sIHZhbHVlcyByb3VuZC10cmlwIHRocm91Z2ggdGhlIGRyb3Bkb3duIGFzIHN0cmluZ3M7IGhvc3RzIHJlY2VpdmVcbiAgICAgIC8vIGEgcmVhbCBib29sZWFuLlxuICAgICAgdmFsdWU6IHRoaXMuY3VycmVudENvbHVtblR5cGUgPT09ICdib29sJyA/IHZhbHVlID09PSAndHJ1ZScgOiB2YWx1ZSEsXG4gICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICB9O1xuXG4gICAgdGhpcy5zYXZlZEZpbHRlcnMudW5zaGlmdChuZXdGaWx0ZXIpO1xuICAgIHRoaXMudXNlclRvdWNoZWQgPSB0cnVlO1xuICAgIHRoaXMucmVzZXRDdXJyZW50RmlsdGVyKCk7XG4gIH1cblxuICBnZXRGaWx0ZXJEZXNjcmlwdGlvbihmaWx0ZXI6IEZpbHRlckNvbmRpdGlvbik6IHN0cmluZyB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5maWx0ZXJhYmxlQ29sdW1ucy5maW5kKFxuICAgICAgKGNvbCkgPT4gY29sLmlkID09PSBmaWx0ZXIuY29sdW1uSWRcbiAgICApO1xuICAgIGlmICghY29sdW1uKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCBjb2x1bW5OYW1lID1cbiAgICAgIHR5cGVvZiBjb2x1bW4uaGVhZGVyID09PSAnZnVuY3Rpb24nID8gY29sdW1uLmhlYWRlcih7fSkgOiBjb2x1bW4uaGVhZGVyO1xuXG4gICAgY29uc3Qgb3BlcmF0b3IgPSB0aGlzLmdldE9wZXJhdG9yTGFiZWwoZmlsdGVyLm9wZXJhdG9yKTtcblxuICAgIHJldHVybiBgJHtjb2x1bW5OYW1lfSAke29wZXJhdG9yfSAke3RoaXMuZ2V0VmFsdWVMYWJlbChjb2x1bW4sIGZpbHRlci52YWx1ZSl9YDtcbiAgfVxuXG4gIC8qKiBSZW5kZXJzIGEgc3RvcmVkIGZpbHRlciB2YWx1ZSB0aGUgd2F5IGl0IHdhcyBjaG9zZW4sIG5vdCBhcyByYXcgZGF0YS4gKi9cbiAgcHJpdmF0ZSBnZXRWYWx1ZUxhYmVsKFxuICAgIGNvbHVtbjogQ29sdW1uRGVmaW5pdGlvbjxUPixcbiAgICB2YWx1ZTogRmlsdGVyQ29uZGl0aW9uWyd2YWx1ZSddXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHZhbHVlLnRvTG9jYWxlRGF0ZVN0cmluZygpO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIHZhbHVlID8gJ1llcycgOiAnTm8nO1xuXG4gICAgLy8gVGhlIG5hdGl2ZSBkYXRlIGlucHV0IHlpZWxkcyBhICdZWVlZLU1NLUREJyBzdHJpbmc7IHJlc3RvcmVkIGZpbHRlcnMgbWF5XG4gICAgLy8gY2Fycnkgb25lIHRvby4gUGFyc2VkIGFzIGxvY2FsIHRpbWUg4oCUIGBuZXcgRGF0ZSgnMjAyNi0wNy0yOCcpYCBpcyB0cmVhdGVkXG4gICAgLy8gYXMgVVRDIGFuZCB3b3VsZCBkaXNwbGF5IGFzIHRoZSBwcmV2aW91cyBkYXkgd2VzdCBvZiBHcmVlbndpY2guXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdGhpcy5pc0RhdGVTdHJpbmcodmFsdWUpKSB7XG4gICAgICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSB2YWx1ZS5zbGljZSgwLCAxMCkuc3BsaXQoJy0nKS5tYXAoTnVtYmVyKTtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSkudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uID0gdGhpcy5ub3JtYWxpemVWYWx1ZU9wdGlvbnMoY29sdW1uLnZhbHVlT3B0aW9ucykuZmluZChcbiAgICAgIChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS52YWx1ZSA9PT0gdmFsdWVcbiAgICApO1xuICAgIHJldHVybiBvcHRpb24gPyBvcHRpb24ubGFiZWwgOiBgJHt2YWx1ZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPcGVyYXRvckxhYmVsKG9wZXJhdG9yVmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgb3BlcmF0b3IgPSBbXG4gICAgICAuLi5TVFJJTkdfT1BFUkFUT1JTLFxuICAgICAgLi4uTlVNQkVSX09QRVJBVE9SUyxcbiAgICAgIC4uLkRBVEVfT1BFUkFUT1JTLFxuICAgICAgLi4uQk9PTF9PUEVSQVRPUlMsXG4gICAgICAuLi5FTlVNX09QRVJBVE9SUyxcbiAgICBdLmZpbmQoKG9wKSA9PiBvcC52YWx1ZSA9PT0gb3BlcmF0b3JWYWx1ZSk7XG4gICAgcmV0dXJuIG9wZXJhdG9yID8gb3BlcmF0b3IubGFiZWwudG9Mb3dlckNhc2UoKSA6IG9wZXJhdG9yVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUHJlZmVycyB0aGUgdHlwZSBkZWNsYXJlZCBvbiB0aGUgY29sdW1uLCBmYWxsaW5nIGJhY2sgdG8gaW5zcGVjdGluZyB0aGUgZGF0YVxuICAgKiBvbmx5IHdoZW4gdGhlIGhvc3QgaGFzIG5vdCBkZWNsYXJlZCBvbmUuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVDb2x1bW5UeXBlKGNvbHVtbjogQ29sdW1uRGVmaW5pdGlvbjxUPik6IEZpbHRlck9wZXJhdG9yVHlwZSB7XG4gICAgaWYgKGNvbHVtbi52YWx1ZVR5cGUpIHtcbiAgICAgIC8vIEFuIEVudW0gd2l0aCBubyBkZWNsYXJlZCBtZW1iZXJzIGhhcyBub3RoaW5nIHRvIHBvcHVsYXRlIGEgZHJvcGRvd25cbiAgICAgIC8vIHdpdGgsIHNvIGl0IGRlZ3JhZGVzIHRvIGEgZnJlZS10ZXh0IGZpbHRlciByYXRoZXIgdGhhbiBhbiBlbXB0eSBzZWxlY3QuXG4gICAgICBpZiAoXG4gICAgICAgIGNvbHVtbi52YWx1ZVR5cGUgPT09IENvbHVtblZhbHVlVHlwZS5FbnVtICYmXG4gICAgICAgICF0aGlzLm5vcm1hbGl6ZVZhbHVlT3B0aW9ucyhjb2x1bW4udmFsdWVPcHRpb25zKS5sZW5ndGhcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5tYXBWYWx1ZVR5cGUoY29sdW1uLnZhbHVlVHlwZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaW5mZXJDb2x1bW5UeXBlKGNvbHVtbik7XG4gIH1cblxuICBwcml2YXRlIG1hcFZhbHVlVHlwZSh2YWx1ZVR5cGU6IENvbHVtblZhbHVlVHlwZSk6IEZpbHRlck9wZXJhdG9yVHlwZSB7XG4gICAgc3dpdGNoICh2YWx1ZVR5cGUpIHtcbiAgICAgIGNhc2UgQ29sdW1uVmFsdWVUeXBlLkRhdGU6XG4gICAgICAgIHJldHVybiAnZGF0ZSc7XG4gICAgICBjYXNlIENvbHVtblZhbHVlVHlwZS5OdW1iZXI6XG4gICAgICBjYXNlIENvbHVtblZhbHVlVHlwZS5JbnRlZ2VyOlxuICAgICAgY2FzZSBDb2x1bW5WYWx1ZVR5cGUuRGVjaW1hbDpcbiAgICAgIGNhc2UgQ29sdW1uVmFsdWVUeXBlLkN1cnJlbmN5OlxuICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgICBjYXNlIENvbHVtblZhbHVlVHlwZS5Cb29sOlxuICAgICAgICByZXR1cm4gJ2Jvb2wnO1xuICAgICAgY2FzZSBDb2x1bW5WYWx1ZVR5cGUuRW51bTpcbiAgICAgICAgcmV0dXJuICdlbnVtJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnc3RyaW5nJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQmVzdC1lZmZvcnQgdHlwZSBkZXRlY3Rpb24gZm9yIGNvbHVtbnMgdGhhdCBkZWNsYXJlIG5vIGB2YWx1ZVR5cGVgLiBGYWxsc1xuICAgKiBiYWNrIHRvICdzdHJpbmcnIHJhdGhlciB0aGFuIG51bGwgc28gdGhlIHZhbHVlIGZpZWxkIGFsd2F5cyByZW5kZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBpbmZlckNvbHVtblR5cGUoY29sdW1uOiBDb2x1bW5EZWZpbml0aW9uPFQ+KTogRmlsdGVyT3BlcmF0b3JUeXBlIHtcbiAgICBjb25zdCBzYW1wbGVWYWx1ZSA9IHRoaXMuZmlyc3ROb25FbXB0eVZhbHVlKGNvbHVtbik7XG5cbiAgICBpZiAoc2FtcGxlVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gJ2RhdGUnO1xuICAgIGlmICh0eXBlb2Ygc2FtcGxlVmFsdWUgPT09ICdudW1iZXInKSByZXR1cm4gJ251bWJlcic7XG4gICAgaWYgKHR5cGVvZiBzYW1wbGVWYWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gJ2Jvb2wnO1xuICAgIGlmICh0eXBlb2Ygc2FtcGxlVmFsdWUgPT09ICdzdHJpbmcnICYmIHRoaXMuaXNEYXRlU3RyaW5nKHNhbXBsZVZhbHVlKSkge1xuICAgICAgcmV0dXJuICdkYXRlJztcbiAgICB9XG4gICAgcmV0dXJuICdzdHJpbmcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYW5zIHJvd3MgZm9yIHRoZSBmaXJzdCB1c2FibGUgc2FtcGxlIOKAlCBzYW1wbGluZyBvbmx5IHRoZSBmaXJzdCByb3cgbWlzc2VzXG4gICAqIHRoZSB0eXBlIHdoZW5ldmVyIHRoYXQgcm93IGhhcHBlbnMgdG8gaG9sZCBhIG51bGwgb3IgdW5kZWZpbmVkIHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSBmaXJzdE5vbkVtcHR5VmFsdWUoY29sdW1uOiBDb2x1bW5EZWZpbml0aW9uPFQ+KTogdW5rbm93biB7XG4gICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5kYXRhID8/IFtdKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVhZFZhbHVlKGNvbHVtbiwgcm93KTtcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSAnJykgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZFZhbHVlKGNvbHVtbjogQ29sdW1uRGVmaW5pdGlvbjxUPiwgcm93OiBUKTogdW5rbm93biB7XG4gICAgaWYgKGNvbHVtbi5hY2Nlc3NvcktleSkgcmV0dXJuIHJvd1tjb2x1bW4uYWNjZXNzb3JLZXldO1xuICAgIGlmIChjb2x1bW4uYWNjZXNzb3JGbikgcmV0dXJuIGNvbHVtbi5hY2Nlc3NvckZuKHJvdyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGF0ZXMgdXN1YWxseSBhcnJpdmUgZnJvbSBhbiBBUEkgYXMgSVNPIHN0cmluZ3MsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBiZVxuICAgKiB0eXBlZCBhcyBwbGFpbiB0ZXh0LiBBbmNob3JlZCB0byBJU08taXNoIGlucHV0IHNvIG9yZGluYXJ5IHN0cmluZ3MgdGhhdFxuICAgKiBgRGF0ZWAgaGFwcGVucyB0byBwYXJzZSAoZS5nLiBcIk1hcmNoXCIpIGFyZSBub3QgbWlzcmVhZCBhcyBkYXRlcy5cbiAgICovXG4gIHByaXZhdGUgaXNEYXRlU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIS9eXFxkezR9LVxcZHsyfS1cXGR7Mn0oW1RcXHNdfCQpLy50ZXN0KHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhTnVtYmVyLmlzTmFOKG5ldyBEYXRlKHZhbHVlKS5nZXRUaW1lKCkpO1xuICB9XG5cbiAgLyoqIEFjY2VwdHMgZWl0aGVyIHN1cHBvcnRlZCBgdmFsdWVPcHRpb25zYCBzaGFwZSBhbmQgcmV0dXJucyBvbmUgb2YgdGhlbS4gKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVWYWx1ZU9wdGlvbnMoXG4gICAgb3B0aW9uczogc3RyaW5nW10gfCBDb2x1bW5WYWx1ZU9wdGlvbltdIHwgdW5kZWZpbmVkXG4gICk6IENvbHVtblZhbHVlT3B0aW9uW10ge1xuICAgIGlmICghb3B0aW9ucz8ubGVuZ3RoKSByZXR1cm4gW107XG4gICAgcmV0dXJuIChvcHRpb25zIGFzIHVua25vd25bXSkubWFwKChvcHRpb24pID0+XG4gICAgICB0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJ1xuICAgICAgICA/IHsgbGFiZWw6IG9wdGlvbiwgdmFsdWU6IG9wdGlvbiB9XG4gICAgICAgIDogKG9wdGlvbiBhcyBDb2x1bW5WYWx1ZU9wdGlvbilcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldEN1cnJlbnRGaWx0ZXIoKSB7XG4gICAgdGhpcy5jdXJyZW50RmlsdGVyID0ge307XG4gICAgdGhpcy5hdmFpbGFibGVPcGVyYXRvcnMgPSBbXTtcbiAgICB0aGlzLmN1cnJlbnRDb2x1bW5UeXBlID0gbnVsbDtcbiAgICB0aGlzLnZhbHVlT3B0aW9ucyA9IFtdO1xuICB9XG5cbiAgcmVzZXRBbGwoKSB7XG4gICAgdGhpcy51c2VyVG91Y2hlZCA9IHRydWU7XG4gICAgdGhpcy5zYXZlZEZpbHRlcnMgPSBbXTtcbiAgICB0aGlzLnJlc2V0Q3VycmVudEZpbHRlcigpO1xuICAgIHRoaXMucmVzZXRGaWx0ZXIuZW1pdCgpO1xuICB9XG5cbiAgYXBwbHlGaWx0ZXJzKCkge1xuICAgIHRoaXMudXNlclRvdWNoZWQgPSB0cnVlO1xuICAgIGNvbnN0IGFjdGl2ZUZpbHRlcnMgPSB0aGlzLnNhdmVkRmlsdGVyc1xuICAgICAgLmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIuc2VsZWN0ZWQpXG4gICAgICAubWFwKCh7IGNvbHVtbklkLCBvcGVyYXRvciwgdmFsdWUgfSkgPT4gKHtcbiAgICAgICAgY29sdW1uSWQsXG4gICAgICAgIG9wZXJhdG9yLFxuICAgICAgICB2YWx1ZSxcbiAgICAgIH0pKTtcbiAgICB0aGlzLmZpbHRlckFwcGxpZWQuZW1pdChhY3RpdmVGaWx0ZXJzKTtcbiAgfVxuXG4gIGdldENvbHVtbkxhYmVsKGNvbHVtbklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZmlsdGVyYWJsZUNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuaWQgPT09IGNvbHVtbklkKTtcbiAgICByZXR1cm4gY29sdW1uXG4gICAgICA/IHR5cGVvZiBjb2x1bW4uaGVhZGVyID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gY29sdW1uLmhlYWRlcih7fSlcbiAgICAgICAgOiBjb2x1bW4uaGVhZGVyXG4gICAgICA6IGNvbHVtbklkO1xuICB9XG5cbiAgZ2V0IHZpc2libGVGaWx0ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnNob3dBbGxGaWx0ZXJzXG4gICAgICA/IHRoaXMuc2F2ZWRGaWx0ZXJzXG4gICAgICA6IHRoaXMuc2F2ZWRGaWx0ZXJzLnNsaWNlKDAsIHRoaXMubWF4VmlzaWJsZUl0ZW1zKTtcbiAgfVxuXG4gIGdldCBhY3RpdmVGaWx0ZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNhdmVkRmlsdGVycy5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLnNlbGVjdGVkKS5sZW5ndGg7XG4gIH1cbn1cbiIsIjx2ZXJiZW4tY2FyZFxuICB3aWR0aD1cIjI0cmVtXCJcbiAgYm9yZGVyUmFkaXVzPVwiMXJlbVwiXG4gIFtib3JkZXJdPVwiJzFweCBzb2xpZCB2YXIoLS12Ym4tY29sb3ItcHJpbWFyeSknXCJcbiAgYmdDb2xvcj1cInZhcigtLXZibi1jb2xvci1zdXJmYWNlKVwiXG4+XG4gIDxkaXYgY2FyZC1oZWFkZXIgY2xhc3M9XCJjYXJkLWhlYWRlclwiPlxuICAgIDxoNCBjbGFzcz1cImhlYWRlci10aXRsZVwiPlxuICAgICAgRmlsdGVyIDxzdXA+KHt7IGFjdGl2ZUZpbHRlckNvdW50IH19KTwvc3VwPlxuICAgIDwvaDQ+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJyZXNldC1idXR0b25cIlxuICAgICAgW3N0eWxlLmNvbG9yXT1cIid2YXIoLS12Ym4tY29sb3ItYm9yZGVyLWZvY3VzKSdcIlxuICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiJ3RyYW5zcGFyZW50J1wiXG4gICAgICBbc3R5bGUuYm9yZGVyXT1cIidub25lJ1wiXG4gICAgICBbc3R5bGUuY3Vyc29yXT1cIidwb2ludGVyJ1wiXG4gICAgICBbc3R5bGUuZm9udC1zaXplXT1cIicxMnB4J1wiXG4gICAgICAoY2xpY2spPVwicmVzZXRBbGwoKVwiXG4gICAgPlxuICAgICAgUmVzZXRcbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjYXJkLWJvZHkgY2xhc3M9XCJjYXJkLWJvZHlcIj5cbiAgICA8IS0tIFNhdmVkIEZpbHRlcnMgU2VjdGlvbiAtLT5cbiAgICA8c2VjdGlvbiBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICA8aDMgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+RmlsdGVyczwvaDM+XG4gICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgaWNvbj1cImluZm9cIlxuICAgICAgICAgIFt3aWR0aF09XCIxNVwiXG4gICAgICAgICAgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgZmlsbD1cInZhcigtLXZibi1jb2xvci10ZXh0LW11dGVkKVwiXG4gICAgICAgID48L3ZlcmJlbi1zdmc+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmlsdGVyIG9mIHZpc2libGVGaWx0ZXJzXCIgY2xhc3M9XCJpdGVtXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLWxhYmVsXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwiZmlsdGVyLnNlbGVjdGVkXCIgKG5nTW9kZWxDaGFuZ2UpPVwibWFya1RvdWNoZWQoKVwiIC8+XG4gICAgICAgICAgPGxhYmVsPnt7IGdldEZpbHRlckRlc2NyaXB0aW9uKGZpbHRlcikgfX08L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwic2F2ZWRGaWx0ZXJzLmxlbmd0aCA+IG1heFZpc2libGVJdGVtc1wiXG4gICAgICAgIGNsYXNzPVwic2hvdy1tb3JlXCJcbiAgICAgICAgKGNsaWNrKT1cInNob3dBbGxGaWx0ZXJzID0gIXNob3dBbGxGaWx0ZXJzXCJcbiAgICAgID5cbiAgICAgICAge3sgc2hvd0FsbEZpbHRlcnMgPyBcIlNob3cgTGVzc1wiIDogXCJTaG93IE1vcmVcIiB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9zZWN0aW9uPlxuXG4gICAgPGhyIGNsYXNzPVwiZGl2aWRlclwiIC8+XG5cbiAgICA8IS0tIE5ldyBGaWx0ZXIgT3BlcmF0aW9uIC0tPlxuICAgIDxzZWN0aW9uIGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMyBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj5PcGVyYXRpb248L2gzPlxuICAgICAgICA8dmVyYmVuLXN2Z1xuICAgICAgICAgIGljb249XCJpbmZvXCJcbiAgICAgICAgICBbd2lkdGhdPVwiMTVcIlxuICAgICAgICAgIFtoZWlnaHRdPVwiMTVcIlxuICAgICAgICAgIGZpbGw9XCJ2YXIoLS12Ym4tY29sb3ItdGV4dC1tdXRlZClcIlxuICAgICAgICA+PC92ZXJiZW4tc3ZnPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJvcGVyYXRpb24tZ3JpZFwiPlxuICAgICAgICA8IS0tIENvbHVtbiBTZWxlY3Rpb24gLS0+XG4gICAgICAgIDx2ZXJiZW4tZHJvcC1kb3duXG4gICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICBoZWlnaHQ9XCIxLjAyNXJlbVwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgY29sdW1uXCJcbiAgICAgICAgICBbb3B0aW9uc109XCJmaWx0ZXJhYmxlQ29sdW1uc1wiXG4gICAgICAgICAgb3B0aW9uTGFiZWw9XCJoZWFkZXJcIlxuICAgICAgICAgIG9wdGlvblZhbHVlPVwiaWRcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwiY3VycmVudEZpbHRlci5jb2x1bW5JZFwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Db2x1bW5TZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgID48L3ZlcmJlbi1kcm9wLWRvd24+XG5cbiAgICAgICAgPCEtLSBPcGVyYXRvciBTZWxlY3Rpb24gLS0+XG4gICAgICAgIDx2ZXJiZW4tZHJvcC1kb3duXG4gICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICBoZWlnaHQ9XCIxLjAyNXJlbVwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3Qgb3BlcmF0b3JcIlxuICAgICAgICAgIFtvcHRpb25zXT1cImF2YWlsYWJsZU9wZXJhdG9yc1wiXG4gICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RmlsdGVyLm9wZXJhdG9yXCJcbiAgICAgICAgPjwvdmVyYmVuLWRyb3AtZG93bj5cblxuICAgICAgICA8IS0tIFZhbHVlIElucHV0IGJhc2VkIG9uIHR5cGUgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImN1cnJlbnRDb2x1bW5UeXBlXCI+XG4gICAgICAgICAgPCEtLSBEYXRlIElucHV0IOKAlCBuYXRpdmUgcmF0aGVyIHRoYW4gdGhlIGxpYnJhcnkgZGF0ZSBwaWNrZXIsIHdob3NlXG4gICAgICAgICAgICAgICBvdmVybGF5IHJlbmRlcnMgb2ZmIHNjcmVlbiBmcm9tIHRoaXMgbmFycm93IHBhbmVsLiAtLT5cbiAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiXG4gICAgICAgICAgICB0eXBlPVwiZGF0ZVwiXG4gICAgICAgICAgICBwbGFjZUhvbGRlcj1cIlNlbGVjdCBkYXRlXCJcbiAgICAgICAgICAgIGJvcmRlcj1cIjFweCBzb2xpZCB2YXIoLS12Ym4tY29sb3ItYm9yZGVyKVwiXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM9XCI1cHhcIlxuICAgICAgICAgICAgdGV4dENvbG9yPVwidmFyKC0tdmJuLWNvbG9yLXRleHQpXCJcbiAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIxLjAyNXJlbVwiXG4gICAgICAgICAgICBwZD1cIjJweCA2cHhcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICA+PC92ZXJiZW5hLWlucHV0PlxuXG4gICAgICAgICAgPCEtLSBOdW1iZXIgSW5wdXQgLS0+XG4gICAgICAgICAgPHZlcmJlbmEtaW5wdXRcbiAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInbnVtYmVyJ1wiXG4gICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgIHBsYWNlSG9sZGVyPVwiRW50ZXIgbnVtYmVyXCJcbiAgICAgICAgICAgIGJvcmRlcj1cIjFweCBzb2xpZCB2YXIoLS12Ym4tY29sb3ItYm9yZGVyKVwiXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM9XCI1cHhcIlxuICAgICAgICAgICAgdGV4dENvbG9yPVwidmFyKC0tdmJuLWNvbG9yLXRleHQpXCJcbiAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIxLjAyNXJlbVwiXG4gICAgICAgICAgICBwZD1cIjJweCA2cHhcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICA+PC92ZXJiZW5hLWlucHV0PlxuXG4gICAgICAgICAgPCEtLSBZZXMgLyBObyBTZWxlY3Rpb24gLS0+XG4gICAgICAgICAgPHZlcmJlbi1kcm9wLWRvd25cbiAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInYm9vbCdcIlxuICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgIGhlaWdodD1cIjEuMDI1cmVtXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IHZhbHVlXCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cInZhbHVlT3B0aW9uc1wiXG4gICAgICAgICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICA+PC92ZXJiZW4tZHJvcC1kb3duPlxuXG4gICAgICAgICAgPCEtLSBFbnVtIE1lbWJlciBTZWxlY3Rpb24gLS0+XG4gICAgICAgICAgPHZlcmJlbi1kcm9wLWRvd25cbiAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInZW51bSdcIlxuICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgIGhlaWdodD1cIjEuMDI1cmVtXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IHZhbHVlXCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cInZhbHVlT3B0aW9uc1wiXG4gICAgICAgICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICA+PC92ZXJiZW4tZHJvcC1kb3duPlxuXG4gICAgICAgICAgPCEtLSBUZXh0IElucHV0IChkZWZhdWx0KSAtLT5cbiAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgKm5nU3dpdGNoRGVmYXVsdFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgcGxhY2VIb2xkZXI9XCJFbnRlciB0ZXh0XCJcbiAgICAgICAgICAgIGJvcmRlcj1cIjFweCBzb2xpZCB2YXIoLS12Ym4tY29sb3ItYm9yZGVyKVwiXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM9XCI1cHhcIlxuICAgICAgICAgICAgdGV4dENvbG9yPVwidmFyKC0tdmJuLWNvbG9yLXRleHQpXCJcbiAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIxLjAyNXJlbVwiXG4gICAgICAgICAgICBwZD1cIjJweCA2cHhcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICA+PC92ZXJiZW5hLWlucHV0PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYWRkLWJ1dHRvbiBtbC1hdXRvXCIgKGNsaWNrKT1cImFkZEZpbHRlcigpXCI+KyBBZGQ8L2J1dHRvbj5cbiAgICA8L3NlY3Rpb24+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2FyZC1mb290ZXIgY2xhc3M9XCJjYXJkLWZvb3RlclwiPlxuICAgIDxidXR0b24gY2xhc3M9XCJleHBvcnQtYnV0dG9uXCIgKGNsaWNrKT1cImFwcGx5RmlsdGVycygpXCI+RmlsdGVyPC9idXR0b24+XG4gIDwvZGl2PlxuPC92ZXJiZW4tY2FyZD5cbiJdfQ==
420
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWZpbHRlci9kYXRhLWZpbHRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtZmlsdGVyL2RhdGEtZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEdBSWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLGVBQWUsR0FDaEIsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRCxPQUFPLEVBS0wsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsY0FBYyxFQUNkLGNBQWMsR0FDZixNQUFNLHFCQUFxQixDQUFDOzs7Ozs7OztBQVU3QixNQUFNLE9BQU8sbUJBQW1CO0lBQ3JCLE9BQU8sQ0FBeUI7SUFDaEMsSUFBSSxDQUFPO0lBQ3BCOzs7O09BSUc7SUFDTSxjQUFjLENBQXFCO0lBQ2xDLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztJQUN0RCxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUMzQyxpQkFBaUIsR0FBMEIsRUFBRSxDQUFDO0lBQzlDLGtCQUFrQixHQUFxQixFQUFFLENBQUM7SUFDMUMsWUFBWSxHQUFrQixFQUFFLENBQUM7SUFDakMsYUFBYSxHQUE2QixFQUFFLENBQUM7SUFDN0MsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUN2QixlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLGlCQUFpQixHQUE4QixJQUFJLENBQUM7SUFDcEQ7OztPQUdHO0lBQ0gsWUFBWSxHQUF3QixFQUFFLENB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e1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ29sdW1uRGVmaW5pdGlvbixcbiAgQ29sdW1uVmFsdWVPcHRpb24sXG4gIENvbHVtblZhbHVlVHlwZSxcbn0gZnJvbSAndmVyYmVuLW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLXRhYmxlJztcbmltcG9ydCB7XG4gIEZpbHRlck9wZXJhdG9yLFxuICBGaWx0ZXJPcGVyYXRvclR5cGUsXG4gIEZpbHRlckNvbmRpdGlvbixcbiAgRmlsdGVyR3JvdXAsXG4gIFNUUklOR19PUEVSQVRPUlMsXG4gIE5VTUJFUl9PUEVSQVRPUlMsXG4gIERBVEVfT1BFUkFUT1JTLFxuICBCT09MX09QRVJBVE9SUyxcbiAgRU5VTV9PUEVSQVRPUlMsXG59IGZyb20gJy4vZGF0YS1maWx0ZXIudHlwZXMnO1xuXG4vKiogQSBmaWx0ZXIgY2hpcCBpbiB0aGUgcGFuZWwncyBsaXN0OiBhIGNvbmRpdGlvbiBwbHVzIGl0cyBhY3RpdmUgc3RhdGUuICovXG50eXBlIFNhdmVkRmlsdGVyID0gRmlsdGVyQ29uZGl0aW9uICYgeyBzZWxlY3RlZDogYm9vbGVhbiB9O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGF0YS1maWx0ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS1maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZGF0YS1maWx0ZXIuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIERhdGFGaWx0ZXJDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGNvbHVtbnMhOiBDb2x1bW5EZWZpbml0aW9uPFQ+W107XG4gIEBJbnB1dCgpIGRhdGEhOiBUW107XG4gIC8qKlxuICAgKiBPcHRpb25hbCByZXN0b3JlZCBmaWx0ZXJzOiB0aGUgcGFuZWwgb3BlbnMgcHJlLXBvcHVsYXRlZCB3aXRoIHRoZXNlIGFzXG4gICAqIHNlbGVjdGVkIGZpbHRlciBjaGlwcy4gQXBwbGllZCBvbmNlICh0aGUgZmlyc3QgdGltZSBhIG5vbi1lbXB0eSB2YWx1ZVxuICAgKiBhcnJpdmVzKSBzbyBpdCBuZXZlciBjbG9iYmVycyB0aGUgdXNlcidzIGluLXByb2dyZXNzIGVkaXRzIGFmdGVyd2FyZHMuXG4gICAqL1xuICBASW5wdXQoKSBpbml0aWFsRmlsdGVycz86IEZpbHRlckNvbmRpdGlvbltdO1xuICBAT3V0cHV0KCkgZmlsdGVyQXBwbGllZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsdGVyQ29uZGl0aW9uW10+KCk7XG4gIEBPdXRwdXQoKSByZXNldEZpbHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgZmlsdGVyYWJsZUNvbHVtbnM6IENvbHVtbkRlZmluaXRpb248VD5bXSA9IFtdO1xuICBhdmFpbGFibGVPcGVyYXRvcnM6IEZpbHRlck9wZXJhdG9yW10gPSBbXTtcbiAgc2F2ZWRGaWx0ZXJzOiBTYXZlZEZpbHRlcltdID0gW107XG4gIGN1cnJlbnRGaWx0ZXI6IFBhcnRpYWw8RmlsdGVyQ29uZGl0aW9uPiA9IHt9O1xuICBzaG93QWxsRmlsdGVycyA9IGZhbHNlO1xuICBtYXhWaXNpYmxlSXRlbXMgPSAzO1xuICBjdXJyZW50Q29sdW1uVHlwZTogRmlsdGVyT3BlcmF0b3JUeXBlIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciB0aGUgdmFsdWUgZHJvcGRvd24gd2hlbiB0aGUgc2VsZWN0ZWQgY29sdW1uIGlzIGJvb2wgb3IgZW51bS5cbiAgICogQWx3YXlzIG5vcm1hbGlzZWQgdG8gYHsgbGFiZWwsIHZhbHVlIH1gIHNvIHRoZSB0ZW1wbGF0ZSBiaW5kcyBvbmUgc2hhcGUuXG4gICAqL1xuICB2YWx1ZU9wdGlvbnM6IENvbHVtblZhbHVlT3B0aW9uW10gPSBbXTtcbiAgLyoqXG4gICAqIEhlbGQgYXMgc3RyaW5ncyByYXRoZXIgdGhhbiBib29sZWFuczogYHZlcmJlbi1kcm9wLWRvd25gIGdhdGVzIGl0cyBzZWxlY3RlZFxuICAgKiBsYWJlbCBvbiBhIHRydXRoaW5lc3MgY2hlY2ssIHNvIGFuIG9wdGlvbiB2YWx1ZWQgYGZhbHNlYCB3b3VsZCByZW5kZXIgYXNcbiAgICogdGhvdWdoIG5vdGhpbmcgd2VyZSBwaWNrZWQuIENvZXJjZWQgYmFjayB0byBhIGJvb2xlYW4gaW4gYGFkZEZpbHRlcmAuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGJvb2xPcHRpb25zOiBDb2x1bW5WYWx1ZU9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICdZZXMnLCB2YWx1ZTogJ3RydWUnIH0sXG4gICAgeyBsYWJlbDogJ05vJywgdmFsdWU6ICdmYWxzZScgfSxcbiAgXTtcbiAgLy8gU2V0IG9uY2UgdGhlIHVzZXIgZWRpdHMgdGhlIHBhbmVsLCBzbyByZXN0b3JlZC9ob3N0IGZpbHRlcnMgbm8gbG9uZ2VyXG4gIC8vIG92ZXJ3cml0ZSB0aGVpciBpbi1wcm9ncmVzcyB3b3JrLlxuICBwcml2YXRlIHVzZXJUb3VjaGVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBUaGUgc2F2ZWQgZmlsdGVyIGN1cnJlbnRseSBsb2FkZWQgaW50byB0aGUgb3BlcmF0aW9uIHJvdywgaWYgYW55LiBIZWxkIGJ5XG4gICAqIHJlZmVyZW5jZSByYXRoZXIgdGhhbiBieSBpbmRleCBzbyBkZWxldGluZyBvciByZW9yZGVyaW5nIGFub3RoZXIgZmlsdGVyXG4gICAqIGNhbm5vdCByZXRhcmdldCB0aGUgd3JpdGUtYmFjay5cbiAgICovXG4gIHByaXZhdGUgZWRpdGluZ0ZpbHRlcjogU2F2ZWRGaWx0ZXIgfCBudWxsID0gbnVsbDtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmluaXRpYWxpemVGaWx0ZXJhYmxlQ29sdW1ucygpO1xuICAgIHRoaXMuaHlkcmF0ZVNhdmVkRmlsdGVycygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIC8vIFBpY2sgdXAgZmlsdGVycyByZXN0b3JlZCBhc3luY2hyb25vdXNseSBieSB0aGUgaG9zdCBhZnRlciBmaXJzdCByZW5kZXIuXG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxGaWx0ZXJzJ10pIHtcbiAgICAgIHRoaXMuaHlkcmF0ZVNhdmVkRmlsdGVycygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVkIHRoZSBzYXZlZC1maWx0ZXIgY2hpcHMgZnJvbSB0aGUgcmVzdG9yZWQgZmlsdGVycy4gU2tpcHBlZCBvbmNlIHRoZSB1c2VyXG4gICAqIGhhcyB0b3VjaGVkIHRoZSBwYW5lbCBzbyBpdCBuZXZlciBvdmVyd3JpdGVzIHRoZWlyIGluLXByb2dyZXNzIGVkaXRzLlxuICAgKi9cbiAgcHJpdmF0ZSBoeWRyYXRlU2F2ZWRGaWx0ZXJzKCkge1xuICAgIGlmICh0aGlzLnVzZXJUb3VjaGVkKSByZXR1cm47XG4gICAgdGhpcy5zYXZlZEZpbHRlcnMgPSAodGhpcy5pbml0aWFsRmlsdGVycyA/PyBbXSkubWFwKChmaWx0ZXIpID0+ICh7XG4gICAgICAuLi5maWx0ZXIsXG4gICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICB9KSk7XG4gIH1cblxuICAvKiogTWFya3MgdGhlIHBhbmVsIGFzIHVzZXItZWRpdGVkIChjYWxsZWQgZnJvbSB0ZW1wbGF0ZSBpbnRlcmFjdGlvbnMpLiAqL1xuICBtYXJrVG91Y2hlZCgpIHtcbiAgICB0aGlzLnVzZXJUb3VjaGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUZpbHRlcmFibGVDb2x1bW5zKCkge1xuICAgIHRoaXMuZmlsdGVyYWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKChjb2wpID0+IGNvbC5hY2Nlc3NvcktleSk7XG4gIH1cblxuICBvbkNvbHVtblNlbGVjdChjb2x1bW5JZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5maWx0ZXJhYmxlQ29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5pZCA9PT0gY29sdW1uSWQpO1xuICAgIGlmICghY29sdW1uKSByZXR1cm47XG5cbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXIuY29sdW1uSWQgPSBjb2x1bW5JZDtcblxuICAgIC8vIFJlc2V0IG90aGVyIHZhbHVlc1xuICAgIHRoaXMuY3VycmVudEZpbHRlci5vcGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXIudmFsdWUgPSB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLmFwcGx5Q29sdW1uQ29udGV4dChjb2x1bW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcml2ZXMgdGhlIHZhbHVlIGNvbnRyb2wsIG9wZXJhdG9ycyBhbmQgb3B0aW9ucyBmb3IgYSBjb2x1bW4gd2l0aG91dFxuICAgKiB0b3VjaGluZyB0aGUgb3BlcmF0b3Igb3IgdmFsdWUgYWxyZWFkeSBpbiB0aGUgb3BlcmF0aW9uIHJvdyDigJQgYGVkaXRGaWx0ZXJgXG4gICAqIGRlcGVuZHMgb24gdGhvc2Ugc3Vydml2aW5nLCB3aGVyZSBgb25Db2x1bW5TZWxlY3RgIGNsZWFycyB0aGVtIGZpcnN0LlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseUNvbHVtbkNvbnRleHQoY29sdW1uOiBDb2x1bW5EZWZpbml0aW9uPFQ+KSB7XG4gICAgdGhpcy5jdXJyZW50Q29sdW1uVHlwZSA9IHRoaXMucmVzb2x2ZUNvbHVtblR5cGUoY29sdW1uKTtcbiAgICB0aGlzLnZhbHVlT3B0aW9ucyA9XG4gICAgICB0aGlzLmN1cnJlbnRDb2x1bW5UeXBlID09PSAnYm9vbCdcbiAgICAgICAgPyB0aGlzLmJvb2xPcHRpb25zXG4gICAgICAgIDogdGhpcy5jdXJyZW50Q29sdW1uVHlwZSA9PT0gJ2VudW0nXG4gICAgICAgID8gdGhpcy5ub3JtYWxpemVWYWx1ZU9wdGlvbnMoY29sdW1uLnZhbHVlT3B0aW9ucylcbiAgICAgICAgOiBbXTtcblxuICAgIHN3aXRjaCAodGhpcy5jdXJyZW50Q29sdW1uVHlwZSkge1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgdGhpcy5hdmFpbGFibGVPcGVyYXRvcnMgPSBTVFJJTkdfT1BFUkFUT1JTO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlT3BlcmF0b3JzID0gTlVNQkVSX09QRVJBVE9SUztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgdGhpcy5hdmFpbGFibGVPcGVyYXRvcnMgPSBEQVRFX09QRVJBVE9SUztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib29sJzpcbiAgICAgICAgdGhpcy5hdmFpbGFibGVPcGVyYXRvcnMgPSBCT09MX09QRVJBVE9SUztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlbnVtJzpcbiAgICAgICAgdGhpcy5hdmFpbGFibGVPcGVyYXRvcnMgPSBFTlVNX09QRVJBVE9SUztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmF2YWlsYWJsZU9wZXJhdG9ycyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIGFkZEZpbHRlcigpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY3VycmVudEZpbHRlci52YWx1ZTtcbiAgICAvLyBDaGVja2VkIGV4cGxpY2l0bHkgcmF0aGVyIHRoYW4gZm9yIGZhbHNpbmVzczogYGZhbHNlYCBpcyBhIHZhbGlkIGJvb2xcbiAgICAvLyBmaWx0ZXIgYW5kIGAwYCBhIHZhbGlkIG51bWJlciBvbmUuXG4gICAgY29uc3QgaGFzVmFsdWUgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSAnJztcblxuICAgIGlmICghdGhpcy5jdXJyZW50RmlsdGVyLmNvbHVtbklkIHx8ICF0aGlzLmN1cnJlbnRGaWx0ZXIub3BlcmF0b3IgfHwgIWhhc1ZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29uZGl0aW9uOiBGaWx0ZXJDb25kaXRpb24gPSB7XG4gICAgICBjb2x1bW5JZDogdGhpcy5jdXJyZW50RmlsdGVyLmNvbHVtbklkISxcbiAgICAgIG9wZXJhdG9yOiB0aGlzLmN1cnJlbnRGaWx0ZXIub3BlcmF0b3IsXG4gICAgICAvLyBCb29sIHZhbHVlcyByb3VuZC10cmlwIHRocm91Z2ggdGhlIGRyb3Bkb3duIGFzIHN0cmluZ3M7IGhvc3RzIHJlY2VpdmVcbiAgICAgIC8vIGEgcmVhbCBib29sZWFuLlxuICAgICAgdmFsdWU6IHRoaXMuY3VycmVudENvbHVtblR5cGUgPT09ICdib29sJyA/IHZhbHVlID09PSAndHJ1ZScgOiB2YWx1ZSEsXG4gICAgfTtcblxuICAgIC8vIFdyaXR0ZW4gYmFjayBvdmVyIHRoZSBmaWx0ZXIgYmVpbmcgZWRpdGVkLCBhbmQgb3ZlciB0aGUgZXhpc3RpbmcgY2hpcCBvZiBhXG4gICAgLy8gcmVxdWlyZWQgY29sdW1uLCBzbyBuZWl0aGVyIGNhc2UgbGVhdmVzIGEgc3RhbGUgZHVwbGljYXRlIGJlaGluZC4gVXBkYXRlZFxuICAgIC8vIGluIHBsYWNlIHJhdGhlciB0aGFuIHJlbW92ZWQgYW5kIHJlLWFkZGVkIHNvIHRoZSBjaGlwIGtlZXBzIGl0cyBwb3NpdGlvbi5cbiAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgdGhpcy5lZGl0aW5nRmlsdGVyID8/XG4gICAgICAodGhpcy5pc1JlcXVpcmVkQ29sdW1uKGNvbmRpdGlvbi5jb2x1bW5JZClcbiAgICAgICAgPyB0aGlzLnNhdmVkRmlsdGVycy5maW5kKChmKSA9PiBmLmNvbHVtbklkID09PSBjb25kaXRpb24uY29sdW1uSWQpXG4gICAgICAgIDogdW5kZWZpbmVkKTtcblxuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBjb25kaXRpb24pO1xuICAgICAgdGFyZ2V0LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zYXZlZEZpbHRlcnMudW5zaGlmdCh7IC4uLmNvbmRpdGlvbiwgc2VsZWN0ZWQ6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5lZGl0aW5nRmlsdGVyID0gbnVsbDtcbiAgICB0aGlzLnVzZXJUb3VjaGVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlc2V0Q3VycmVudEZpbHRlcigpO1xuICB9XG5cbiAgLyoqIExvYWRzIGEgc2F2ZWQgZmlsdGVyIGJhY2sgaW50byB0aGUgb3BlcmF0aW9uIHJvdyBmb3IgY29ycmVjdGlvbi4gKi9cbiAgZWRpdEZpbHRlcihmaWx0ZXI6IFNhdmVkRmlsdGVyKSB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5maWx0ZXJhYmxlQ29sdW1ucy5maW5kKFxuICAgICAgKGNvbCkgPT4gY29sLmlkID09PSBmaWx0ZXIuY29sdW1uSWRcbiAgICApO1xuICAgIGlmICghY29sdW1uKSByZXR1cm47XG5cbiAgICB0aGlzLmFwcGx5Q29sdW1uQ29udGV4dChjb2x1bW4pO1xuICAgIHRoaXMuY3VycmVudEZpbHRlciA9IHtcbiAgICAgIGNvbHVtbklkOiBmaWx0ZXIuY29sdW1uSWQsXG4gICAgICBvcGVyYXRvcjogZmlsdGVyLm9wZXJhdG9yLFxuICAgICAgdmFsdWU6IHRoaXMudG9FZGl0YWJsZVZhbHVlKGZpbHRlci52YWx1ZSksXG4gICAgfTtcbiAgICB0aGlzLmVkaXRpbmdGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgdGhpcy51c2VyVG91Y2hlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBzdG9yZWQgdmFsdWUgYmFjayBpbnRvIHdoYXQgdGhlIHZhbHVlIGNvbnRyb2wgZXhwZWN0czogYm9vbHMgYXJlXG4gICAqIGhlbGQgYXMgcmVhbCBib29sZWFucyBidXQgdGhlIGRyb3Bkb3duJ3Mgb3B0aW9ucyBhcmUgdGhlIHN0cmluZ3NcbiAgICogJ3RydWUnLydmYWxzZScgKHNlZSBgYm9vbE9wdGlvbnNgKSwgYW5kIHRoZSBuYXRpdmUgZGF0ZSBpbnB1dCBuZWVkc1xuICAgKiAnWVlZWS1NTS1ERCcgcmF0aGVyIHRoYW4gYSBgRGF0ZWAgYSBob3N0IG1heSBoYXZlIHJlc3RvcmVkLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0VkaXRhYmxlVmFsdWUodmFsdWU6IEZpbHRlckNvbmRpdGlvblsndmFsdWUnXSkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRDb2x1bW5UeXBlID09PSAnYm9vbCcpIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIC8vIEJ1aWx0IGZyb20gdGhlIGxvY2FsIHBhcnRzOiBgdG9JU09TdHJpbmdgIHNoaWZ0cyB0byBVVEMgYW5kIHdvdWxkIG1vdmVcbiAgICAgIC8vIHRoZSBkYXRlIGEgZGF5IGJhY2sgd2VzdCBvZiBHcmVlbndpY2guXG4gICAgICBjb25zdCBtb250aCA9IGAke3ZhbHVlLmdldE1vbnRoKCkgKyAxfWAucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIGNvbnN0IGRheSA9IGAke3ZhbHVlLmdldERhdGUoKX1gLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICByZXR1cm4gYCR7dmFsdWUuZ2V0RnVsbFllYXIoKX0tJHttb250aH0tJHtkYXl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqIFJlbW92ZXMgYSBzYXZlZCBmaWx0ZXIuIFJlcXVpcmVkIGZpbHRlcnMgY2Fubm90IGJlIHJlbW92ZWQuICovXG4gIGRlbGV0ZUZpbHRlcihmaWx0ZXI6IFNhdmVkRmlsdGVyKSB7XG4gICAgaWYgKHRoaXMuaXNSZXF1aXJlZChmaWx0ZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMuc2F2ZWRGaWx0ZXJzLmluZGV4T2YoZmlsdGVyKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm47XG5cbiAgICB0aGlzLnNhdmVkRmlsdGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGlmICh0aGlzLmVkaXRpbmdGaWx0ZXIgPT09IGZpbHRlcikgdGhpcy5jbGVhckN1cnJlbnRGaWx0ZXIoKTtcbiAgICB0aGlzLnVzZXJUb3VjaGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBFbXB0aWVzIHRoZSBvcGVyYXRpb24gcm93LCBhYmFuZG9uaW5nIGFueSBlZGl0IGluIHByb2dyZXNzLiAqL1xuICBjbGVhckN1cnJlbnRGaWx0ZXIoKSB7XG4gICAgdGhpcy5lZGl0aW5nRmlsdGVyID0gbnVsbDtcbiAgICB0aGlzLnJlc2V0Q3VycmVudEZpbHRlcigpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiB0aGUgZmlsdGVyJ3MgY29sdW1uIGlzIGRlY2xhcmVkIGBpc1JlcXVpcmVkRmlsdGVyYC4gKi9cbiAgaXNSZXF1aXJlZChmaWx0ZXI6IEZpbHRlckNvbmRpdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUmVxdWlyZWRDb2x1bW4oZmlsdGVyLmNvbHVtbklkKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNSZXF1aXJlZENvbHVtbihjb2x1bW5JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5maWx0ZXJhYmxlQ29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5pZCA9PT0gY29sdW1uSWQpO1xuICAgIHJldHVybiAhIWNvbHVtbj8uaXNSZXF1aXJlZEZpbHRlcjtcbiAgfVxuXG4gIGlzRWRpdGluZyhmaWx0ZXI6IFNhdmVkRmlsdGVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGluZ0ZpbHRlciA9PT0gZmlsdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIExvY2tzIHRoZSBwcm9wZXJ0eSBkcm9wZG93biB3aGlsZSBhIHJlcXVpcmVkIGZpbHRlciBpcyBiZWluZyBlZGl0ZWQg4oCUXG4gICAqIHN3aXRjaGluZyBpdCB0byBhbm90aGVyIGNvbHVtbiB3b3VsZCBkcm9wIHRoZSByZXF1aXJlZCBmaWx0ZXIgZW50aXJlbHkuXG4gICAqL1xuICBnZXQgaXNFZGl0aW5nUmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5lZGl0aW5nRmlsdGVyICYmIHRoaXMuaXNSZXF1aXJlZCh0aGlzLmVkaXRpbmdGaWx0ZXIpO1xuICB9XG5cbiAgZ2V0RmlsdGVyRGVzY3JpcHRpb24oZmlsdGVyOiBGaWx0ZXJDb25kaXRpb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZmlsdGVyYWJsZUNvbHVtbnMuZmluZChcbiAgICAgIChjb2wpID0+IGNvbC5pZCA9PT0gZmlsdGVyLmNvbHVtbklkXG4gICAgKTtcbiAgICBpZiAoIWNvbHVtbikgcmV0dXJuICcnO1xuXG4gICAgY29uc3QgY29sdW1uTmFtZSA9XG4gICAgICB0eXBlb2YgY29sdW1uLmhlYWRlciA9PT0gJ2Z1bmN0aW9uJyA/IGNvbHVtbi5oZWFkZXIoe30pIDogY29sdW1uLmhlYWRlcjtcblxuICAgIGNvbnN0IG9wZXJhdG9yID0gdGhpcy5nZXRPcGVyYXRvckxhYmVsKGZpbHRlci5vcGVyYXRvcik7XG5cbiAgICByZXR1cm4gYCR7Y29sdW1uTmFtZX0gJHtvcGVyYXRvcn0gJHt0aGlzLmdldFZhbHVlTGFiZWwoY29sdW1uLCBmaWx0ZXIudmFsdWUpfWA7XG4gIH1cblxuICAvKiogUmVuZGVycyBhIHN0b3JlZCBmaWx0ZXIgdmFsdWUgdGhlIHdheSBpdCB3YXMgY2hvc2VuLCBub3QgYXMgcmF3IGRhdGEuICovXG4gIHByaXZhdGUgZ2V0VmFsdWVMYWJlbChcbiAgICBjb2x1bW46IENvbHVtbkRlZmluaXRpb248VD4sXG4gICAgdmFsdWU6IEZpbHRlckNvbmRpdGlvblsndmFsdWUnXVxuICApOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiB2YWx1ZS50b0xvY2FsZURhdGVTdHJpbmcoKTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB2YWx1ZSA/ICdZZXMnIDogJ05vJztcblxuICAgIC8vIFRoZSBuYXRpdmUgZGF0ZSBpbnB1dCB5aWVsZHMgYSAnWVlZWS1NTS1ERCcgc3RyaW5nOyByZXN0b3JlZCBmaWx0ZXJzIG1heVxuICAgIC8vIGNhcnJ5IG9uZSB0b28uIFBhcnNlZCBhcyBsb2NhbCB0aW1lIOKAlCBgbmV3IERhdGUoJzIwMjYtMDctMjgnKWAgaXMgdHJlYXRlZFxuICAgIC8vIGFzIFVUQyBhbmQgd291bGQgZGlzcGxheSBhcyB0aGUgcHJldmlvdXMgZGF5IHdlc3Qgb2YgR3JlZW53aWNoLlxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHRoaXMuaXNEYXRlU3RyaW5nKHZhbHVlKSkge1xuICAgICAgY29uc3QgW3llYXIsIG1vbnRoLCBkYXldID0gdmFsdWUuc2xpY2UoMCwgMTApLnNwbGl0KCctJykubWFwKE51bWJlcik7XG4gICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXkpLnRvTG9jYWxlRGF0ZVN0cmluZygpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMubm9ybWFsaXplVmFsdWVPcHRpb25zKGNvbHVtbi52YWx1ZU9wdGlvbnMpLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUudmFsdWUgPT09IHZhbHVlXG4gICAgKTtcbiAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uLmxhYmVsIDogYCR7dmFsdWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3BlcmF0b3JMYWJlbChvcGVyYXRvclZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG9wZXJhdG9yID0gW1xuICAgICAgLi4uU1RSSU5HX09QRVJBVE9SUyxcbiAgICAgIC4uLk5VTUJFUl9PUEVSQVRPUlMsXG4gICAgICAuLi5EQVRFX09QRVJBVE9SUyxcbiAgICAgIC4uLkJPT0xfT1BFUkFUT1JTLFxuICAgICAgLi4uRU5VTV9PUEVSQVRPUlMsXG4gICAgXS5maW5kKChvcCkgPT4gb3AudmFsdWUgPT09IG9wZXJhdG9yVmFsdWUpO1xuICAgIHJldHVybiBvcGVyYXRvciA/IG9wZXJhdG9yLmxhYmVsLnRvTG93ZXJDYXNlKCkgOiBvcGVyYXRvclZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZWZlcnMgdGhlIHR5cGUgZGVjbGFyZWQgb24gdGhlIGNvbHVtbiwgZmFsbGluZyBiYWNrIHRvIGluc3BlY3RpbmcgdGhlIGRhdGFcbiAgICogb25seSB3aGVuIHRoZSBob3N0IGhhcyBub3QgZGVjbGFyZWQgb25lLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlQ29sdW1uVHlwZShjb2x1bW46IENvbHVtbkRlZmluaXRpb248VD4pOiBGaWx0ZXJPcGVyYXRvclR5cGUge1xuICAgIGlmIChjb2x1bW4udmFsdWVUeXBlKSB7XG4gICAgICAvLyBBbiBFbnVtIHdpdGggbm8gZGVjbGFyZWQgbWVtYmVycyBoYXMgbm90aGluZyB0byBwb3B1bGF0ZSBhIGRyb3Bkb3duXG4gICAgICAvLyB3aXRoLCBzbyBpdCBkZWdyYWRlcyB0byBhIGZyZWUtdGV4dCBmaWx0ZXIgcmF0aGVyIHRoYW4gYW4gZW1wdHkgc2VsZWN0LlxuICAgICAgaWYgKFxuICAgICAgICBjb2x1bW4udmFsdWVUeXBlID09PSBDb2x1bW5WYWx1ZVR5cGUuRW51bSAmJlxuICAgICAgICAhdGhpcy5ub3JtYWxpemVWYWx1ZU9wdGlvbnMoY29sdW1uLnZhbHVlT3B0aW9ucykubGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMubWFwVmFsdWVUeXBlKGNvbHVtbi52YWx1ZVR5cGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmluZmVyQ29sdW1uVHlwZShjb2x1bW4pO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBWYWx1ZVR5cGUodmFsdWVUeXBlOiBDb2x1bW5WYWx1ZVR5cGUpOiBGaWx0ZXJPcGVyYXRvclR5cGUge1xuICAgIHN3aXRjaCAodmFsdWVUeXBlKSB7XG4gICAgICBjYXNlIENvbHVtblZhbHVlVHlwZS5EYXRlOlxuICAgICAgICByZXR1cm4gJ2RhdGUnO1xuICAgICAgY2FzZSBDb2x1bW5WYWx1ZVR5cGUuTnVtYmVyOlxuICAgICAgY2FzZSBDb2x1bW5WYWx1ZVR5cGUuSW50ZWdlcjpcbiAgICAgIGNhc2UgQ29sdW1uVmFsdWVUeXBlLkRlY2ltYWw6XG4gICAgICBjYXNlIENvbHVtblZhbHVlVHlwZS5DdXJyZW5jeTpcbiAgICAgICAgcmV0dXJuICdudW1iZXInO1xuICAgICAgY2FzZSBDb2x1bW5WYWx1ZVR5cGUuQm9vbDpcbiAgICAgICAgcmV0dXJuICdib29sJztcbiAgICAgIGNhc2UgQ29sdW1uVmFsdWVUeXBlLkVudW06XG4gICAgICAgIHJldHVybiAnZW51bSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJlc3QtZWZmb3J0IHR5cGUgZGV0ZWN0aW9uIGZvciBjb2x1bW5zIHRoYXQgZGVjbGFyZSBubyBgdmFsdWVUeXBlYC4gRmFsbHNcbiAgICogYmFjayB0byAnc3RyaW5nJyByYXRoZXIgdGhhbiBudWxsIHNvIHRoZSB2YWx1ZSBmaWVsZCBhbHdheXMgcmVuZGVycy5cbiAgICovXG4gIHByaXZhdGUgaW5mZXJDb2x1bW5UeXBlKGNvbHVtbjogQ29sdW1uRGVmaW5pdGlvbjxUPik6IEZpbHRlck9wZXJhdG9yVHlwZSB7XG4gICAgY29uc3Qgc2FtcGxlVmFsdWUgPSB0aGlzLmZpcnN0Tm9uRW1wdHlWYWx1ZShjb2x1bW4pO1xuXG4gICAgaWYgKHNhbXBsZVZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuICdkYXRlJztcbiAgICBpZiAodHlwZW9mIHNhbXBsZVZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuICdudW1iZXInO1xuICAgIGlmICh0eXBlb2Ygc2FtcGxlVmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuICdib29sJztcbiAgICBpZiAodHlwZW9mIHNhbXBsZVZhbHVlID09PSAnc3RyaW5nJyAmJiB0aGlzLmlzRGF0ZVN0cmluZyhzYW1wbGVWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnZGF0ZSc7XG4gICAgfVxuICAgIHJldHVybiAnc3RyaW5nJztcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FucyByb3dzIGZvciB0aGUgZmlyc3QgdXNhYmxlIHNhbXBsZSDigJQgc2FtcGxpbmcgb25seSB0aGUgZmlyc3Qgcm93IG1pc3Nlc1xuICAgKiB0aGUgdHlwZSB3aGVuZXZlciB0aGF0IHJvdyBoYXBwZW5zIHRvIGhvbGQgYSBudWxsIG9yIHVuZGVmaW5lZCB2YWx1ZS5cbiAgICovXG4gIHByaXZhdGUgZmlyc3ROb25FbXB0eVZhbHVlKGNvbHVtbjogQ29sdW1uRGVmaW5pdGlvbjxUPik6IHVua25vd24ge1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMuZGF0YSA/PyBbXSkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlYWRWYWx1ZShjb2x1bW4sIHJvdyk7XG4gICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gJycpIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHJlYWRWYWx1ZShjb2x1bW46IENvbHVtbkRlZmluaXRpb248VD4sIHJvdzogVCk6IHVua25vd24ge1xuICAgIGlmIChjb2x1bW4uYWNjZXNzb3JLZXkpIHJldHVybiByb3dbY29sdW1uLmFjY2Vzc29yS2V5XTtcbiAgICBpZiAoY29sdW1uLmFjY2Vzc29yRm4pIHJldHVybiBjb2x1bW4uYWNjZXNzb3JGbihyb3cpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERhdGVzIHVzdWFsbHkgYXJyaXZlIGZyb20gYW4gQVBJIGFzIElTTyBzdHJpbmdzLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgYmVcbiAgICogdHlwZWQgYXMgcGxhaW4gdGV4dC4gQW5jaG9yZWQgdG8gSVNPLWlzaCBpbnB1dCBzbyBvcmRpbmFyeSBzdHJpbmdzIHRoYXRcbiAgICogYERhdGVgIGhhcHBlbnMgdG8gcGFyc2UgKGUuZy4gXCJNYXJjaFwiKSBhcmUgbm90IG1pc3JlYWQgYXMgZGF0ZXMuXG4gICAqL1xuICBwcml2YXRlIGlzRGF0ZVN0cmluZyh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCEvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9KFtUXFxzXXwkKS8udGVzdCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIU51bWJlci5pc05hTihuZXcgRGF0ZSh2YWx1ZSkuZ2V0VGltZSgpKTtcbiAgfVxuXG4gIC8qKiBBY2NlcHRzIGVpdGhlciBzdXBwb3J0ZWQgYHZhbHVlT3B0aW9uc2Agc2hhcGUgYW5kIHJldHVybnMgb25lIG9mIHRoZW0uICovXG4gIHByaXZhdGUgbm9ybWFsaXplVmFsdWVPcHRpb25zKFxuICAgIG9wdGlvbnM6IHN0cmluZ1tdIHwgQ29sdW1uVmFsdWVPcHRpb25bXSB8IHVuZGVmaW5lZFxuICApOiBDb2x1bW5WYWx1ZU9wdGlvbltdIHtcbiAgICBpZiAoIW9wdGlvbnM/Lmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiAob3B0aW9ucyBhcyB1bmtub3duW10pLm1hcCgob3B0aW9uKSA9PlxuICAgICAgdHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZydcbiAgICAgICAgPyB7IGxhYmVsOiBvcHRpb24sIHZhbHVlOiBvcHRpb24gfVxuICAgICAgICA6IChvcHRpb24gYXMgQ29sdW1uVmFsdWVPcHRpb24pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRDdXJyZW50RmlsdGVyKCkge1xuICAgIHRoaXMuY3VycmVudEZpbHRlciA9IHt9O1xuICAgIHRoaXMuYXZhaWxhYmxlT3BlcmF0b3JzID0gW107XG4gICAgdGhpcy5jdXJyZW50Q29sdW1uVHlwZSA9IG51bGw7XG4gICAgdGhpcy52YWx1ZU9wdGlvbnMgPSBbXTtcbiAgfVxuXG4gIHJlc2V0QWxsKCkge1xuICAgIHRoaXMudXNlclRvdWNoZWQgPSB0cnVlO1xuICAgIHRoaXMuc2F2ZWRGaWx0ZXJzID0gdGhpcy5zYXZlZEZpbHRlcnMuZmlsdGVyKChmaWx0ZXIpID0+XG4gICAgICB0aGlzLmlzUmVxdWlyZWQoZmlsdGVyKVxuICAgICk7XG4gICAgdGhpcy5jbGVhckN1cnJlbnRGaWx0ZXIoKTtcblxuICAgIC8vIFJlcXVpcmVkIGZpbHRlcnMgc3Vydml2ZSBhIHJlc2V0LCBzbyB0aGUgaG9zdCBpcyB0b2xkIHdoYXQgaXMgbGVmdCByYXRoZXJcbiAgICAvLyB0aGFuIHRoYXQgZXZlcnl0aGluZyBpcyBnb25lIOKAlCBhIGJhcmUgYHJlc2V0RmlsdGVyYCB3b3VsZCBsZWF2ZSB0aGUgcGFuZWxcbiAgICAvLyBzaG93aW5nIGNoaXBzIHRoZSBob3N0IGlzIG5vIGxvbmdlciBmaWx0ZXJpbmcgYnkuXG4gICAgaWYgKHRoaXMuc2F2ZWRGaWx0ZXJzLmxlbmd0aCkge1xuICAgICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXNldEZpbHRlci5lbWl0KCk7XG4gIH1cblxuICBhcHBseUZpbHRlcnMoKSB7XG4gICAgdGhpcy51c2VyVG91Y2hlZCA9IHRydWU7XG4gICAgY29uc3QgYWN0aXZlRmlsdGVycyA9IHRoaXMuc2F2ZWRGaWx0ZXJzXG4gICAgICAvLyBSZXF1aXJlZCBmaWx0ZXJzIGFyZSBlbWl0dGVkIHdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIHRpY2tlZDogdGhlaXJcbiAgICAgIC8vIGNoZWNrYm94IGlzIGRpc2FibGVkLCBidXQgdGhlIGhvc3QgbXVzdCBuZXZlciBiZSBsZWZ0IHdpdGhvdXQgdGhlbS5cbiAgICAgIC5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLnNlbGVjdGVkIHx8IHRoaXMuaXNSZXF1aXJlZChmaWx0ZXIpKVxuICAgICAgLm1hcCgoeyBjb2x1bW5JZCwgb3BlcmF0b3IsIHZhbHVlIH0pID0+ICh7XG4gICAgICAgIGNvbHVtbklkLFxuICAgICAgICBvcGVyYXRvcixcbiAgICAgICAgdmFsdWUsXG4gICAgICB9KSk7XG4gICAgdGhpcy5maWx0ZXJBcHBsaWVkLmVtaXQoYWN0aXZlRmlsdGVycyk7XG4gIH1cblxuICBnZXRDb2x1bW5MYWJlbChjb2x1bW5JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmZpbHRlcmFibGVDb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLmlkID09PSBjb2x1bW5JZCk7XG4gICAgcmV0dXJuIGNvbHVtblxuICAgICAgPyB0eXBlb2YgY29sdW1uLmhlYWRlciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IGNvbHVtbi5oZWFkZXIoe30pXG4gICAgICAgIDogY29sdW1uLmhlYWRlclxuICAgICAgOiBjb2x1bW5JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1aXJlZCBmaWx0ZXJzIHBpbm5lZCB0byB0aGUgdG9wIHNvIHRoZSBjb2xsYXBzZWQgbGlzdCBjYW4gbmV2ZXIgaGlkZSBvbmVcbiAgICogYmVoaW5kIFwiU2hvdyBNb3JlXCIuXG4gICAqL1xuICBnZXQgb3JkZXJlZEZpbHRlcnMoKTogU2F2ZWRGaWx0ZXJbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLnRoaXMuc2F2ZWRGaWx0ZXJzLmZpbHRlcigoZmlsdGVyKSA9PiB0aGlzLmlzUmVxdWlyZWQoZmlsdGVyKSksXG4gICAgICAuLi50aGlzLnNhdmVkRmlsdGVycy5maWx0ZXIoKGZpbHRlcikgPT4gIXRoaXMuaXNSZXF1aXJlZChmaWx0ZXIpKSxcbiAgICBdO1xuICB9XG5cbiAgZ2V0IHZpc2libGVGaWx0ZXJzKCk6IFNhdmVkRmlsdGVyW10ge1xuICAgIHJldHVybiB0aGlzLnNob3dBbGxGaWx0ZXJzXG4gICAgICA/IHRoaXMub3JkZXJlZEZpbHRlcnNcbiAgICAgIDogdGhpcy5vcmRlcmVkRmlsdGVycy5zbGljZSgwLCB0aGlzLm1heFZpc2libGVJdGVtcyk7XG4gIH1cblxuICBnZXQgYWN0aXZlRmlsdGVyQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zYXZlZEZpbHRlcnMuZmlsdGVyKFxuICAgICAgKGZpbHRlcikgPT4gZmlsdGVyLnNlbGVjdGVkIHx8IHRoaXMuaXNSZXF1aXJlZChmaWx0ZXIpXG4gICAgKS5sZW5ndGg7XG4gIH1cbn1cbiIsIjx2ZXJiZW4tY2FyZFxuICB3aWR0aD1cIjI0cmVtXCJcbiAgYm9yZGVyUmFkaXVzPVwiMXJlbVwiXG4gIFtib3JkZXJdPVwiJzFweCBzb2xpZCB2YXIoLS12Ym4tY29sb3ItcHJpbWFyeSknXCJcbiAgYmdDb2xvcj1cInZhcigtLXZibi1jb2xvci1zdXJmYWNlKVwiXG4+XG4gIDxkaXYgY2FyZC1oZWFkZXIgY2xhc3M9XCJjYXJkLWhlYWRlclwiPlxuICAgIDxoNCBjbGFzcz1cImhlYWRlci10aXRsZVwiPlxuICAgICAgRmlsdGVyIDxzdXA+KHt7IGFjdGl2ZUZpbHRlckNvdW50IH19KTwvc3VwPlxuICAgIDwvaDQ+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJyZXNldC1idXR0b25cIlxuICAgICAgW3N0eWxlLmNvbG9yXT1cIid2YXIoLS12Ym4tY29sb3ItYm9yZGVyLWZvY3VzKSdcIlxuICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiJ3RyYW5zcGFyZW50J1wiXG4gICAgICBbc3R5bGUuYm9yZGVyXT1cIidub25lJ1wiXG4gICAgICBbc3R5bGUuY3Vyc29yXT1cIidwb2ludGVyJ1wiXG4gICAgICBbc3R5bGUuZm9udC1zaXplXT1cIicxMnB4J1wiXG4gICAgICAoY2xpY2spPVwicmVzZXRBbGwoKVwiXG4gICAgPlxuICAgICAgUmVzZXRcbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjYXJkLWJvZHkgY2xhc3M9XCJjYXJkLWJvZHlcIj5cbiAgICA8IS0tIFNhdmVkIEZpbHRlcnMgU2VjdGlvbiAtLT5cbiAgICA8c2VjdGlvbiBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICA8aDMgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+RmlsdGVyczwvaDM+XG4gICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgaWNvbj1cImluZm9cIlxuICAgICAgICAgIFt3aWR0aF09XCIxNVwiXG4gICAgICAgICAgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgZmlsbD1cInZhcigtLXZibi1jb2xvci10ZXh0LW11dGVkKVwiXG4gICAgICAgID48L3ZlcmJlbi1zdmc+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICAqbmdGb3I9XCJsZXQgZmlsdGVyIG9mIHZpc2libGVGaWx0ZXJzXCJcbiAgICAgICAgY2xhc3M9XCJpdGVtXCJcbiAgICAgICAgW2NsYXNzLml0ZW0tZWRpdGluZ109XCJpc0VkaXRpbmcoZmlsdGVyKVwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLWxhYmVsXCI+XG4gICAgICAgICAgPCEtLSBBIHJlcXVpcmVkIGZpbHRlciBpcyBhbHdheXMgYWN0aXZlLCBzbyBpdHMgY2hlY2tib3ggaXMgdGlja2VkIGFuZFxuICAgICAgICAgICAgICAgbG9ja2VkIHJhdGhlciB0aGFuIGhpZGRlbiDigJQgdGhlIHN0YXRlIHN0YXlzIHJlYWRhYmxlLiAtLT5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlci5zZWxlY3RlZFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZXF1aXJlZChmaWx0ZXIpXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm1hcmtUb3VjaGVkKClcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGxhYmVsPnt7IGdldEZpbHRlckRlc2NyaXB0aW9uKGZpbHRlcikgfX08L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1hY3Rpb25zXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImljb24tYnV0dG9uXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJFZGl0IGZpbHRlclwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZWRpdEZpbHRlcihmaWx0ZXIpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8IS0tIE9ubHkgYHN0cm9rZWAgaXMgcGFzc2VkOiBgdmVyYmVuLXN2Z2AgcmVzb2x2ZXMgYSBzaW5nbGUgY29sb3VyIGFzXG4gICAgICAgICAgICAgICAgIGBmaWxsIHx8IHN0cm9rZWAgYW5kIGFwcGxpZXMgaXQgdG8gYm90aCwgc28gYWxzbyBwYXNzaW5nIGBmaWxsYFxuICAgICAgICAgICAgICAgICB3b3VsZCBwYWludCB0aGUgaWNvbiBpbiB3aGF0ZXZlciBgZmlsbGAgaG9sZHMuIC0tPlxuICAgICAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICAgICAgaWNvbj1cImVkaXRcIlxuICAgICAgICAgICAgICBbd2lkdGhdPVwiMTVcIlxuICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwidmFyKC0tdmJuLWNvbG9yLWJvcmRlci1mb2N1cylcIlxuICAgICAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1idXR0b25cIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkRlbGV0ZSBmaWx0ZXJcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVxdWlyZWQoZmlsdGVyKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlRmlsdGVyKGZpbHRlcilcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgICAgIGljb249XCJkZWxldGVcIlxuICAgICAgICAgICAgICBbd2lkdGhdPVwiMTVcIlxuICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwidmFyKC0tdmJuLWNvbG9yLWVycm9yKVwiXG4gICAgICAgICAgICA+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwic2F2ZWRGaWx0ZXJzLmxlbmd0aCA+IG1heFZpc2libGVJdGVtc1wiXG4gICAgICAgIGNsYXNzPVwic2hvdy1tb3JlXCJcbiAgICAgICAgKGNsaWNrKT1cInNob3dBbGxGaWx0ZXJzID0gIXNob3dBbGxGaWx0ZXJzXCJcbiAgICAgID5cbiAgICAgICAge3sgc2hvd0FsbEZpbHRlcnMgPyBcIlNob3cgTGVzc1wiIDogXCJTaG93IE1vcmVcIiB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9zZWN0aW9uPlxuXG4gICAgPGhyIGNsYXNzPVwiZGl2aWRlclwiIC8+XG5cbiAgICA8IS0tIE5ldyBGaWx0ZXIgT3BlcmF0aW9uIC0tPlxuICAgIDxzZWN0aW9uIGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMyBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj5PcGVyYXRpb248L2gzPlxuICAgICAgICA8dmVyYmVuLXN2Z1xuICAgICAgICAgIGljb249XCJpbmZvXCJcbiAgICAgICAgICBbd2lkdGhdPVwiMTVcIlxuICAgICAgICAgIFtoZWlnaHRdPVwiMTVcIlxuICAgICAgICAgIGZpbGw9XCJ2YXIoLS12Ym4tY29sb3ItdGV4dC1tdXRlZClcIlxuICAgICAgICA+PC92ZXJiZW4tc3ZnPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJvcGVyYXRpb24tZ3JpZFwiPlxuICAgICAgICA8IS0tIENvbHVtbiBTZWxlY3Rpb24gLS0+XG4gICAgICAgIDx2ZXJiZW4tZHJvcC1kb3duXG4gICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICBoZWlnaHQ9XCIxLjAyNXJlbVwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgY29sdW1uXCJcbiAgICAgICAgICBbb3B0aW9uc109XCJmaWx0ZXJhYmxlQ29sdW1uc1wiXG4gICAgICAgICAgb3B0aW9uTGFiZWw9XCJoZWFkZXJcIlxuICAgICAgICAgIG9wdGlvblZhbHVlPVwiaWRcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0VkaXRpbmdSZXF1aXJlZFwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RmlsdGVyLmNvbHVtbklkXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNvbHVtblNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgPjwvdmVyYmVuLWRyb3AtZG93bj5cblxuICAgICAgICA8IS0tIE9wZXJhdG9yIFNlbGVjdGlvbiAtLT5cbiAgICAgICAgPHZlcmJlbi1kcm9wLWRvd25cbiAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgIGhlaWdodD1cIjEuMDI1cmVtXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBvcGVyYXRvclwiXG4gICAgICAgICAgW29wdGlvbnNdPVwiYXZhaWxhYmxlT3BlcmF0b3JzXCJcbiAgICAgICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImN1cnJlbnRGaWx0ZXIub3BlcmF0b3JcIlxuICAgICAgICA+PC92ZXJiZW4tZHJvcC1kb3duPlxuXG4gICAgICAgIDwhLS0gVmFsdWUgSW5wdXQgYmFzZWQgb24gdHlwZSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY3VycmVudENvbHVtblR5cGVcIj5cbiAgICAgICAgICA8IS0tIERhdGUgSW5wdXQg4oCUIG5hdGl2ZSByYXRoZXIgdGhhbiB0aGUgbGlicmFyeSBkYXRlIHBpY2tlciwgd2hvc2VcbiAgICAgICAgICAgICAgIG92ZXJsYXkgcmVuZGVycyBvZmYgc2NyZWVuIGZyb20gdGhpcyBuYXJyb3cgcGFuZWwuIC0tPlxuICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCJcbiAgICAgICAgICAgIHR5cGU9XCJkYXRlXCJcbiAgICAgICAgICAgIHBsYWNlSG9sZGVyPVwiU2VsZWN0IGRhdGVcIlxuICAgICAgICAgICAgYm9yZGVyPVwiMXB4IHNvbGlkIHZhcigtLXZibi1jb2xvci1ib3JkZXIpXCJcbiAgICAgICAgICAgIGJvcmRlclJhZGl1cz1cIjVweFwiXG4gICAgICAgICAgICB0ZXh0Q29sb3I9XCJ2YXIoLS12Ym4tY29sb3ItdGV4dClcIlxuICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgIGhlaWdodD1cIjEuMDI1cmVtXCJcbiAgICAgICAgICAgIHBkPVwiMnB4IDZweFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImN1cnJlbnRGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgID48L3ZlcmJlbmEtaW5wdXQ+XG5cbiAgICAgICAgICA8IS0tIE51bWJlciBJbnB1dCAtLT5cbiAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCJcbiAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgcGxhY2VIb2xkZXI9XCJFbnRlciBudW1iZXJcIlxuICAgICAgICAgICAgYm9yZGVyPVwiMXB4IHNvbGlkIHZhcigtLXZibi1jb2xvci1ib3JkZXIpXCJcbiAgICAgICAgICAgIGJvcmRlclJhZGl1cz1cIjVweFwiXG4gICAgICAgICAgICB0ZXh0Q29sb3I9XCJ2YXIoLS12Ym4tY29sb3ItdGV4dClcIlxuICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgIGhlaWdodD1cIjEuMDI1cmVtXCJcbiAgICAgICAgICAgIHBkPVwiMnB4IDZweFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImN1cnJlbnRGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgID48L3ZlcmJlbmEtaW5wdXQ+XG5cbiAgICAgICAgICA8IS0tIFllcyAvIE5vIFNlbGVjdGlvbiAtLT5cbiAgICAgICAgICA8dmVyYmVuLWRyb3AtZG93blxuICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidib29sJ1wiXG4gICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgaGVpZ2h0PVwiMS4wMjVyZW1cIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgdmFsdWVcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwidmFsdWVPcHRpb25zXCJcbiAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImN1cnJlbnRGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgID48L3ZlcmJlbi1kcm9wLWRvd24+XG5cbiAgICAgICAgICA8IS0tIEVudW0gTWVtYmVyIFNlbGVjdGlvbiAtLT5cbiAgICAgICAgICA8dmVyYmVuLWRyb3AtZG93blxuICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidlbnVtJ1wiXG4gICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgaGVpZ2h0PVwiMS4wMjVyZW1cIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgdmFsdWVcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwidmFsdWVPcHRpb25zXCJcbiAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImN1cnJlbnRGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgID48L3ZlcmJlbi1kcm9wLWRvd24+XG5cbiAgICAgICAgICA8IS0tIFRleHQgSW5wdXQgKGRlZmF1bHQpIC0tPlxuICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAqbmdTd2l0Y2hEZWZhdWx0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBwbGFjZUhvbGRlcj1cIkVudGVyIHRleHRcIlxuICAgICAgICAgICAgYm9yZGVyPVwiMXB4IHNvbGlkIHZhcigtLXZibi1jb2xvci1ib3JkZXIpXCJcbiAgICAgICAgICAgIGJvcmRlclJhZGl1cz1cIjVweFwiXG4gICAgICAgICAgICB0ZXh0Q29sb3I9XCJ2YXIoLS12Ym4tY29sb3ItdGV4dClcIlxuICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgIGhlaWdodD1cIjEuMDI1cmVtXCJcbiAgICAgICAgICAgIHBkPVwiMnB4IDZweFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImN1cnJlbnRGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgID48L3ZlcmJlbmEtaW5wdXQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJvcGVyYXRpb24tYWN0aW9uc1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2xlYXItYnV0dG9uXCIgKGNsaWNrKT1cImNsZWFyQ3VycmVudEZpbHRlcigpXCI+XG4gICAgICAgICAgQ2xlYXJcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhZGQtYnV0dG9uXCIgKGNsaWNrKT1cImFkZEZpbHRlcigpXCI+KyBBZGQ8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvc2VjdGlvbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjYXJkLWZvb3RlciBjbGFzcz1cImNhcmQtZm9vdGVyXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImV4cG9ydC1idXR0b25cIiAoY2xpY2spPVwiYXBwbHlGaWx0ZXJzKClcIj5GaWx0ZXI8L2J1dHRvbj5cbiAgPC9kaXY+XG48L3ZlcmJlbi1jYXJkPlxuIl19
@@ -51,4 +51,4 @@ export var ColumnValueType;
51
51
  // | { [K in keyof T]: ColumnDefinitionWithKey<T, K> }[keyof T]
52
52
  // | ColumnDefinitionWithFn<T>
53
53
  // | ColumnDefinitionWithNeither<T>;
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi1uZy11aS9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW9DQTs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBTixJQUFZLGVBU1g7QUFURCxXQUFZLGVBQWU7SUFDekIsb0NBQWlCLENBQUE7SUFDakIsb0NBQWlCLENBQUE7SUFDakIsc0NBQW1CLENBQUE7SUFDbkIsc0NBQW1CLENBQUE7SUFDbkIsd0NBQXFCLENBQUE7SUFDckIsZ0NBQWEsQ0FBQTtJQUNiLGdDQUFhLENBQUE7SUFDYixnQ0FBYSxDQUFBO0FBQ2YsQ0FBQyxFQVRXLGVBQWUsS0FBZixlQUFlLFFBUzFCO0FBNEVELHVDQUF1QztBQUV2QywwQ0FBMEM7QUFDMUMsZ0JBQWdCO0FBQ2hCLDhDQUE4QztBQUM5QyxxQ0FBcUM7QUFDckMseUNBQXlDO0FBQ3pDLHVDQUF1QztBQUN2Qyx1Q0FBdUM7QUFDdkMsaUNBQWlDO0FBQ2pDLDhCQUE4QjtBQUM5Qix3QkFBd0I7QUFDeEIsS0FBSztBQUVMLDRFQUE0RTtBQUM1RSx1Q0FBdUM7QUFDdkMsT0FBTztBQUNQLHNCQUFzQjtBQUN0QixrQ0FBa0M7QUFDbEMsb0JBQW9CO0FBQ3BCLHdCQUF3QjtBQUN4Qiw0Q0FBNEM7QUFDNUMsS0FBSztBQUVMLCtFQUErRTtBQUMvRSx5QkFBeUI7QUFDekIsK0JBQStCO0FBQy9CLHlDQUF5QztBQUN6QyxLQUFLO0FBRUwsMkVBQTJFO0FBQzNFLHlCQUF5QjtBQUN6Qix3QkFBd0I7QUFDeEIseUJBQXlCO0FBQ3pCLEtBQUs7QUFFTCx3RUFBd0U7QUFDeEUsb0NBQW9DO0FBQ3BDLGlFQUFpRTtBQUNqRSxnQ0FBZ0M7QUFDaEMsc0NBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQWJzdHJhY3RDb250cm9sT3B0aW9ucyxcbiAgQXN5bmNWYWxpZGF0b3JGbixcbiAgRm9ybUNvbnRyb2wsXG4gIFZhbGlkYXRvckZuLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbi8qKiBCdWlsdC1pbiBhZ2dyZWdhdGlvbnMgdGhhdCBjYW4gYmUgY29tcHV0ZWQgb3ZlciBhIGNvbHVtbidzIHZhbHVlcy4gKi9cbmV4cG9ydCB0eXBlIEZvb3RlckFnZ3JlZ2F0aW9uID0gJ3N1bScgfCAnYXZnJyB8ICdtaW4nIHwgJ21heCcgfCAnY291bnQnO1xuXG4vKipcbiAqIFJpY2hlciBkZWNsYXJhdGl2ZSBmb290ZXIgY29uZmlndXJhdGlvbiBmb3IgYSBjb2x1bW4uIE92ZXJyaWRlcyB0aGUgc2ltcGxlXG4gKiBgZm9vdGVyRm5gIHdoZW4gc2V0LiBEcml2ZXMgYm90aCB0aGUgdGFibGUncyBgPHRmb290PmAgYW5kIGV4cG9ydHMuXG4gKlxuICogVmFsdWUgcHJlY2VkZW5jZSAoaGlnaGVzdCDihpIgbG93ZXN0KTogYHZhbHVlRm5gIOKGkiBgYWdncmVnYXRpb25gIOKGkiBsYWJlbC1vbmx5LlxuICogRm9yIGZ1bGwgY29udHJvbCBvdmVyIHRoZSByZW5kZXJlZCBtYXJrdXAgdXNlIGBDb2x1bW5EZWZpbml0aW9uLmZvb3RlclRlbXBsYXRlYCxcbiAqIHdoaWNoIHRha2VzIHByZWNlZGVuY2UgaW4gdGhlIHRhYmxlIChidXQgaXMgaWdub3JlZCBieSBleHBvcnRzKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5Gb290ZXJDb25maWc8VD4ge1xuICAvKiogQnVpbHQtaW4gYWdncmVnYXRpb24gY29tcHV0ZWQgb3ZlciB0aGUgY29sdW1uJ3MgdmFsdWVzIGFjcm9zcyBhbGwgcm93cy4gKi9cbiAgYWdncmVnYXRpb24/OiBGb290ZXJBZ2dyZWdhdGlvbjtcbiAgLyoqXG4gICAqIEN1c3RvbSByZWR1Y2VyIHJlY2VpdmluZyBldmVyeSAobm9uLWdyb3VwKSByb3cgYW5kIHRoZSBjb2x1bW4uXG4gICAqIFRha2VzIHByZWNlZGVuY2Ugb3ZlciBgYWdncmVnYXRpb25gLlxuICAgKi9cbiAgdmFsdWVGbj86IChyb3dzOiBUW10sIGNvbHVtbjogQ29sdW1uRGVmaW5pdGlvbjxUPikgPT4gYW55O1xuICAvKiogU3RhdGljIGxhYmVsIHJlbmRlcmVkIGFsb25nc2lkZSAvIGluc3RlYWQgb2YgdGhlIGNvbXB1dGVkIHZhbHVlIChlLmcuIFwiVG90YWxcIikuICovXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKiogRm9ybWF0cyB0aGUgY29tcHV0ZWQgdmFsdWUgZm9yIGRpc3BsYXkgYW5kIHN0cmluZy1iYXNlZCBleHBvcnRzLiAqL1xuICBmb3JtYXR0ZXI/OiAodmFsdWU6IGFueSkgPT4gc3RyaW5nO1xuICAvKiogU2V0IHRvIGBmYWxzZWAgdG8ga2VlcCB0aGlzIGNvbHVtbidzIGZvb3RlciBvdXQgb2YgZXhwb3J0cy4gRGVmYXVsdHMgdG8gYHRydWVgLiAqL1xuICBpbmNsdWRlSW5FeHBvcnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIERlY2xhcmVkIHR5cGUgb2YgYSBjb2x1bW4ncyB1bmRlcmx5aW5nIHZhbHVlLiBEZWxpYmVyYXRlbHkgZ2VuZXJhbCByYXRoZXIgdGhhblxuICogZmlsdGVyLXNwZWNpZmljOiBvcGVyYXRpb24gY29tcG9uZW50cyB0aGF0IGNvbnN1bWUgYENvbHVtbkRlZmluaXRpb25gIGFsbCBuZWVkXG4gKiB0byBrbm93IGEgY29sdW1uJ3MgdHlwZSAodGhlIGZpbHRlciBwYW5lbCBwaWNrcyB0aGUgdmFsdWUgY29udHJvbCBmcm9tIGl0LCBhbmRcbiAqIGltcG9ydCB2YWxpZGF0aW9uLCBzb3J0aW5nIGFuZCBleHBvcnRzIGhhdmUgdGhlIHNhbWUgbmVlZCkuXG4gKi9cbmV4cG9ydCBlbnVtIENvbHVtblZhbHVlVHlwZSB7XG4gIFN0cmluZyA9ICdTdHJpbmcnLFxuICBOdW1iZXIgPSAnTnVtYmVyJyxcbiAgSW50ZWdlciA9ICdJbnRlZ2VyJyxcbiAgRGVjaW1hbCA9ICdEZWNpbWFsJyxcbiAgQ3VycmVuY3kgPSAnQ3VycmVuY3knLFxuICBEYXRlID0gJ0RhdGUnLFxuICBCb29sID0gJ0Jvb2wnLFxuICBFbnVtID0gJ0VudW0nLFxufVxuXG4vKiogQW4gYWxsb3dlZCB2YWx1ZSBmb3IgYSBjb2x1bW4gd2hvc2UgYHZhbHVlVHlwZWAgaXMgYEVudW1gLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5WYWx1ZU9wdGlvbiB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uRGVmaW5pdGlvbjxUPiB7XG4gIGlkOiBzdHJpbmc7XG4gIGhlYWRlcjogc3RyaW5nIHwgKChjb250ZXh0OiBhbnkpID0+IGFueSk7XG4gIGFjY2Vzc29yS2V5Pzoga2V5b2YgVDtcbiAgYWNjZXNzb3JGbj86IChyb3c6IFQpID0+IGFueTtcbiAgY2VsbFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgY2VsbEVkaXRUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIGhlYWRlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgZm9vdGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAvKipcbiAgICogU2ltcGxlIGZvb3RlciByZWR1Y2VyIOKAlCBhbmFsb2dvdXMgdG8gYGFjY2Vzc29yRm5gLiBSZWNlaXZlcyB0aGUgY29sdW1uJ3NcbiAgICogZXh0cmFjdGVkIHZhbHVlcyAoYW5kIHRoZSBub24tZ3JvdXAgcm93cykgYW5kIHJldHVybnMgdGhlIGZvb3RlciB2YWx1ZSB1c2VkXG4gICAqIGJ5IHRoZSB0YWJsZSBmb290ZXIgYW5kIGV4cG9ydHMuIE92ZXJyaWRkZW4gYnkgYGZvb3RlcmAgd2hlbiB0aGF0IGlzIHNldC5cbiAgICovXG4gIGZvb3RlckZuPzogKHZhbHVlczogYW55W10sIHJvd3M6IFRbXSkgPT4gYW55O1xuICAvKiogUmljaGVyIGRlY2xhcmF0aXZlIGZvb3Rlcjsgb3ZlcnJpZGVzIGBmb290ZXJGbmAgd2hlbiBzZXQuICovXG4gIGZvb3Rlcj86IENvbHVtbkZvb3RlckNvbmZpZzxUPjtcbiAgc29ydEFjdGlvbj86ICdBU0MnIHwgJ0RFU0MnO1xuICBmb3JtQ29udHJvbE5hbWU/OiBzdHJpbmc7XG4gIGdyb3VwTmFtZT86IHN0cmluZztcbiAgdmFsaWRhdG9yRm4/OiAodmFsdWU6IFRba2V5b2YgVF0pID0+IGJvb2xlYW47XG4gIGltcG9ydEtleT86IGtleW9mIFQ7XG4gIGNhbkltcG9ydD86IGJvb2xlYW47XG4gIGNhbkV4cG9ydD86IGJvb2xlYW47XG4gIGltcG9ydEJ5Pzoga2V5b2YgVCB8ICgoaW1wb3J0ZWRSb3c6IGFueSkgPT4gVFtrZXlvZiBUXSk7XG4gIGV4cG9ydEJ5Pzoga2V5b2YgVCB8ICgocm93OiBUKSA9PiBhbnkpO1xuICBpc0hpZGRlbj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUeXBlIG9mIHRoaXMgY29sdW1uJ3MgdmFsdWUuIE9wdGlvbmFsIOKAlCBjb25zdW1lcnMgdGhhdCBuZWVkIGEgdHlwZSBmYWxsIGJhY2tcbiAgICogdG8gaW5mZXJyaW5nIG9uZSBmcm9tIHRoZSBkYXRhIHdoZW4gaXQgaXMgb21pdHRlZC5cbiAgICovXG4gIHZhbHVlVHlwZT86IENvbHVtblZhbHVlVHlwZTtcbiAgLyoqXG4gICAqIEFsbG93ZWQgdmFsdWVzIHdoZW4gYHZhbHVlVHlwZWAgaXMgYEVudW1gLiBFaXRoZXIgYSBwbGFpbiBsaXN0IG9mIG1lbWJlcnMgb3JcbiAgICogYHsgbGFiZWwsIHZhbHVlIH1gIHBhaXJzIHdoZW4gdGhlIGRpc3BsYXkgdGV4dCBkaWZmZXJzIGZyb20gdGhlIHN0b3JlZCB2YWx1ZS5cbiAgICovXG4gIHZhbHVlT3B0aW9ucz86IHN0cmluZ1tdIHwgQ29sdW1uVmFsdWVPcHRpb25bXTtcbn1cblxuLy8gRGVmaW5lIGEgdHlwZSB0aGF0IGV4dGVuZHMgVCB3aXRoIGEgX2tleSBwcm9wZXJ0eVxuZXhwb3J0IHR5cGUgRGF0YVdpdGhLZXk8VD4gPSB7XG4gIF9rZXk6IHN0cmluZyB8IG51bWJlcjtcbiAgX2tleV9wcm9wOiBrZXlvZiBUIHwgJ19pbmRleCc7XG4gIG9yaWdpbmFsRGF0YTogVDtcbn07XG5cbmV4cG9ydCB0eXBlIEdyb3VwZWREYXRhUm93PFQ+ID0gRGF0YVdpdGhLZXk8VD4gJiB7XG4gIGlzR3JvdXBSb3c/OiBib29sZWFuO1xuICBncm91cFZhbHVlPzogYW55O1xuICBncm91cFRpdGxlPzogYW55O1xufTtcblxuZXhwb3J0IHR5cGUgRm9ybUNvbnRyb2xPZjxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0/OiBGb3JtQ29udHJvbDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUdyb3VwQ29uZmlnPFxuICBUQ29udHJvbCBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogQWJzdHJhY3RDb250cm9sIH1cbj4ge1xuICBjb250cm9sczogVENvbnRyb2w7XG4gIHZhbGlkYXRvck9yT3B0cz86IFZhbGlkYXRvckZuIHwgVmFsaWRhdG9yRm5bXSB8IEFic3RyYWN0Q29udHJvbE9wdGlvbnMgfCBudWxsO1xuICBhc3luY1ZhbGlkYXRvcj86IEFzeW5jVmFsaWRhdG9yRm4gfCBBc3luY1ZhbGlkYXRvckZuW10gfCBudWxsO1xufVxuXG5leHBvcnQgdHlwZSBFZGl0ZWREYXRhPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXT86IFRbS10gZXh0ZW5kcyBvYmplY3QgPyBQYXJ0aWFsPFRbS10+IDogVFtLXTtcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBleHBvcnQgdHlwZSBDb2x1bW5EZWZpbml0aW9uQmFzZTxUPiA9IHtcbi8vICAgaWQ6IHN0cmluZztcbi8vICAgaGVhZGVyOiBzdHJpbmcgfCAoKGNvbnRleHQ6IGFueSkgPT4gYW55KTtcbi8vICAgY2VsbFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55Pjtcbi8vICAgY2VsbEVkaXRUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4vLyAgIGhlYWRlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55Pjtcbi8vICAgZm9vdGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuLy8gICBzb3J0QWN0aW9uPzogJ0FTQycgfCAnREVTQyc7XG4vLyAgIGZvcm1Db250cm9sTmFtZT86IHN0cmluZztcbi8vICAgZ3JvdXBOYW1lPzogc3RyaW5nO1xuLy8gfTtcblxuLy8gLy8gSGVscGVyIHR5cGUgdG8gY3JlYXRlIGEgY29sdW1uIGRlZmluaXRpb24gd2l0aCBhIHNwZWNpZmljIGFjY2Vzc29yIGtleVxuLy8gZXhwb3J0IHR5cGUgQ29sdW1uRGVmaW5pdGlvbldpdGhLZXk8XG4vLyAgIFQsXG4vLyAgIEsgZXh0ZW5kcyBrZXlvZiBUXG4vLyA+ID0gQ29sdW1uRGVmaW5pdGlvbkJhc2U8VD4gJiB7XG4vLyAgIGFjY2Vzc29yS2V5OiBLO1xuLy8gICBhY2Nlc3NvckZuPzogbmV2ZXI7XG4vLyAgIHZhbGlkYXRvckZuPzogKHZhbHVlOiBUW0tdKSA9PiBib29sZWFuO1xuLy8gfTtcblxuLy8gZXhwb3J0IHR5cGUgQ29sdW1uRGVmaW5pdGlvbldpdGhGbjxULCBSID0gYW55PiA9IENvbHVtbkRlZmluaXRpb25CYXNlPFQ+ICYge1xuLy8gICBhY2Nlc3NvcktleT86IG5ldmVyO1xuLy8gICBhY2Nlc3NvckZuOiAocm93OiBUKSA9PiBSO1xuLy8gICB2YWxpZGF0b3JGbj86ICh2YWx1ZTogUikgPT4gYm9vbGVhbjtcbi8vIH07XG5cbi8vIGV4cG9ydCB0eXBlIENvbHVtbkRlZmluaXRpb25XaXRoTmVpdGhlcjxUPiA9IENvbHVtbkRlZmluaXRpb25CYXNlPFQ+ICYge1xuLy8gICBhY2Nlc3NvcktleT86IG5ldmVyO1xuLy8gICBhY2Nlc3NvckZuPzogbmV2ZXI7XG4vLyAgIHZhbGlkYXRvckZuPzogbmV2ZXI7XG4vLyB9O1xuXG4vLyAvLyBVbmlvbiB0eXBlIHRoYXQgcmVwcmVzZW50cyBhbGwgcG9zc2libGUgY29sdW1uIGRlZmluaXRpb24gdmFyaWFudHNcbi8vIGV4cG9ydCB0eXBlIENvbHVtbkRlZmluaXRpb248VD4gPVxuLy8gICB8IHsgW0sgaW4ga2V5b2YgVF06IENvbHVtbkRlZmluaXRpb25XaXRoS2V5PFQsIEs+IH1ba2V5b2YgVF1cbi8vICAgfCBDb2x1bW5EZWZpbml0aW9uV2l0aEZuPFQ+XG4vLyAgIHwgQ29sdW1uRGVmaW5pdGlvbldpdGhOZWl0aGVyPFQ+O1xuIl19
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi1uZy11aS9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW9DQTs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBTixJQUFZLGVBU1g7QUFURCxXQUFZLGVBQWU7SUFDekIsb0NBQWlCLENBQUE7SUFDakIsb0NBQWlCLENBQUE7SUFDakIsc0NBQW1CLENBQUE7SUFDbkIsc0NBQW1CLENBQUE7SUFDbkIsd0NBQXFCLENBQUE7SUFDckIsZ0NBQWEsQ0FBQTtJQUNiLGdDQUFhLENBQUE7SUFDYixnQ0FBYSxDQUFBO0FBQ2YsQ0FBQyxFQVRXLGVBQWUsS0FBZixlQUFlLFFBUzFCO0FBbUZELHVDQUF1QztBQUV2QywwQ0FBMEM7QUFDMUMsZ0JBQWdCO0FBQ2hCLDhDQUE4QztBQUM5QyxxQ0FBcUM7QUFDckMseUNBQXlDO0FBQ3pDLHVDQUF1QztBQUN2Qyx1Q0FBdUM7QUFDdkMsaUNBQWlDO0FBQ2pDLDhCQUE4QjtBQUM5Qix3QkFBd0I7QUFDeEIsS0FBSztBQUVMLDRFQUE0RTtBQUM1RSx1Q0FBdUM7QUFDdkMsT0FBTztBQUNQLHNCQUFzQjtBQUN0QixrQ0FBa0M7QUFDbEMsb0JBQW9CO0FBQ3BCLHdCQUF3QjtBQUN4Qiw0Q0FBNEM7QUFDNUMsS0FBSztBQUVMLCtFQUErRTtBQUMvRSx5QkFBeUI7QUFDekIsK0JBQStCO0FBQy9CLHlDQUF5QztBQUN6QyxLQUFLO0FBRUwsMkVBQTJFO0FBQzNFLHlCQUF5QjtBQUN6Qix3QkFBd0I7QUFDeEIseUJBQXlCO0FBQ3pCLEtBQUs7QUFFTCx3RUFBd0U7QUFDeEUsb0NBQW9DO0FBQ3BDLGlFQUFpRTtBQUNqRSxnQ0FBZ0M7QUFDaEMsc0NBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQWJzdHJhY3RDb250cm9sT3B0aW9ucyxcbiAgQXN5bmNWYWxpZGF0b3JGbixcbiAgRm9ybUNvbnRyb2wsXG4gIFZhbGlkYXRvckZuLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbi8qKiBCdWlsdC1pbiBhZ2dyZWdhdGlvbnMgdGhhdCBjYW4gYmUgY29tcHV0ZWQgb3ZlciBhIGNvbHVtbidzIHZhbHVlcy4gKi9cbmV4cG9ydCB0eXBlIEZvb3RlckFnZ3JlZ2F0aW9uID0gJ3N1bScgfCAnYXZnJyB8ICdtaW4nIHwgJ21heCcgfCAnY291bnQnO1xuXG4vKipcbiAqIFJpY2hlciBkZWNsYXJhdGl2ZSBmb290ZXIgY29uZmlndXJhdGlvbiBmb3IgYSBjb2x1bW4uIE92ZXJyaWRlcyB0aGUgc2ltcGxlXG4gKiBgZm9vdGVyRm5gIHdoZW4gc2V0LiBEcml2ZXMgYm90aCB0aGUgdGFibGUncyBgPHRmb290PmAgYW5kIGV4cG9ydHMuXG4gKlxuICogVmFsdWUgcHJlY2VkZW5jZSAoaGlnaGVzdCDihpIgbG93ZXN0KTogYHZhbHVlRm5gIOKGkiBgYWdncmVnYXRpb25gIOKGkiBsYWJlbC1vbmx5LlxuICogRm9yIGZ1bGwgY29udHJvbCBvdmVyIHRoZSByZW5kZXJlZCBtYXJrdXAgdXNlIGBDb2x1bW5EZWZpbml0aW9uLmZvb3RlclRlbXBsYXRlYCxcbiAqIHdoaWNoIHRha2VzIHByZWNlZGVuY2UgaW4gdGhlIHRhYmxlIChidXQgaXMgaWdub3JlZCBieSBleHBvcnRzKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5Gb290ZXJDb25maWc8VD4ge1xuICAvKiogQnVpbHQtaW4gYWdncmVnYXRpb24gY29tcHV0ZWQgb3ZlciB0aGUgY29sdW1uJ3MgdmFsdWVzIGFjcm9zcyBhbGwgcm93cy4gKi9cbiAgYWdncmVnYXRpb24/OiBGb290ZXJBZ2dyZWdhdGlvbjtcbiAgLyoqXG4gICAqIEN1c3RvbSByZWR1Y2VyIHJlY2VpdmluZyBldmVyeSAobm9uLWdyb3VwKSByb3cgYW5kIHRoZSBjb2x1bW4uXG4gICAqIFRha2VzIHByZWNlZGVuY2Ugb3ZlciBgYWdncmVnYXRpb25gLlxuICAgKi9cbiAgdmFsdWVGbj86IChyb3dzOiBUW10sIGNvbHVtbjogQ29sdW1uRGVmaW5pdGlvbjxUPikgPT4gYW55O1xuICAvKiogU3RhdGljIGxhYmVsIHJlbmRlcmVkIGFsb25nc2lkZSAvIGluc3RlYWQgb2YgdGhlIGNvbXB1dGVkIHZhbHVlIChlLmcuIFwiVG90YWxcIikuICovXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKiogRm9ybWF0cyB0aGUgY29tcHV0ZWQgdmFsdWUgZm9yIGRpc3BsYXkgYW5kIHN0cmluZy1iYXNlZCBleHBvcnRzLiAqL1xuICBmb3JtYXR0ZXI/OiAodmFsdWU6IGFueSkgPT4gc3RyaW5nO1xuICAvKiogU2V0IHRvIGBmYWxzZWAgdG8ga2VlcCB0aGlzIGNvbHVtbidzIGZvb3RlciBvdXQgb2YgZXhwb3J0cy4gRGVmYXVsdHMgdG8gYHRydWVgLiAqL1xuICBpbmNsdWRlSW5FeHBvcnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIERlY2xhcmVkIHR5cGUgb2YgYSBjb2x1bW4ncyB1bmRlcmx5aW5nIHZhbHVlLiBEZWxpYmVyYXRlbHkgZ2VuZXJhbCByYXRoZXIgdGhhblxuICogZmlsdGVyLXNwZWNpZmljOiBvcGVyYXRpb24gY29tcG9uZW50cyB0aGF0IGNvbnN1bWUgYENvbHVtbkRlZmluaXRpb25gIGFsbCBuZWVkXG4gKiB0byBrbm93IGEgY29sdW1uJ3MgdHlwZSAodGhlIGZpbHRlciBwYW5lbCBwaWNrcyB0aGUgdmFsdWUgY29udHJvbCBmcm9tIGl0LCBhbmRcbiAqIGltcG9ydCB2YWxpZGF0aW9uLCBzb3J0aW5nIGFuZCBleHBvcnRzIGhhdmUgdGhlIHNhbWUgbmVlZCkuXG4gKi9cbmV4cG9ydCBlbnVtIENvbHVtblZhbHVlVHlwZSB7XG4gIFN0cmluZyA9ICdTdHJpbmcnLFxuICBOdW1iZXIgPSAnTnVtYmVyJyxcbiAgSW50ZWdlciA9ICdJbnRlZ2VyJyxcbiAgRGVjaW1hbCA9ICdEZWNpbWFsJyxcbiAgQ3VycmVuY3kgPSAnQ3VycmVuY3knLFxuICBEYXRlID0gJ0RhdGUnLFxuICBCb29sID0gJ0Jvb2wnLFxuICBFbnVtID0gJ0VudW0nLFxufVxuXG4vKiogQW4gYWxsb3dlZCB2YWx1ZSBmb3IgYSBjb2x1bW4gd2hvc2UgYHZhbHVlVHlwZWAgaXMgYEVudW1gLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5WYWx1ZU9wdGlvbiB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uRGVmaW5pdGlvbjxUPiB7XG4gIGlkOiBzdHJpbmc7XG4gIGhlYWRlcjogc3RyaW5nIHwgKChjb250ZXh0OiBhbnkpID0+IGFueSk7XG4gIGFjY2Vzc29yS2V5Pzoga2V5b2YgVDtcbiAgYWNjZXNzb3JGbj86IChyb3c6IFQpID0+IGFueTtcbiAgY2VsbFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgY2VsbEVkaXRUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIGhlYWRlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgZm9vdGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAvKipcbiAgICogU2ltcGxlIGZvb3RlciByZWR1Y2VyIOKAlCBhbmFsb2dvdXMgdG8gYGFjY2Vzc29yRm5gLiBSZWNlaXZlcyB0aGUgY29sdW1uJ3NcbiAgICogZXh0cmFjdGVkIHZhbHVlcyAoYW5kIHRoZSBub24tZ3JvdXAgcm93cykgYW5kIHJldHVybnMgdGhlIGZvb3RlciB2YWx1ZSB1c2VkXG4gICAqIGJ5IHRoZSB0YWJsZSBmb290ZXIgYW5kIGV4cG9ydHMuIE92ZXJyaWRkZW4gYnkgYGZvb3RlcmAgd2hlbiB0aGF0IGlzIHNldC5cbiAgICovXG4gIGZvb3RlckZuPzogKHZhbHVlczogYW55W10sIHJvd3M6IFRbXSkgPT4gYW55O1xuICAvKiogUmljaGVyIGRlY2xhcmF0aXZlIGZvb3Rlcjsgb3ZlcnJpZGVzIGBmb290ZXJGbmAgd2hlbiBzZXQuICovXG4gIGZvb3Rlcj86IENvbHVtbkZvb3RlckNvbmZpZzxUPjtcbiAgc29ydEFjdGlvbj86ICdBU0MnIHwgJ0RFU0MnO1xuICBmb3JtQ29udHJvbE5hbWU/OiBzdHJpbmc7XG4gIGdyb3VwTmFtZT86IHN0cmluZztcbiAgdmFsaWRhdG9yRm4/OiAodmFsdWU6IFRba2V5b2YgVF0pID0+IGJvb2xlYW47XG4gIGltcG9ydEtleT86IGtleW9mIFQ7XG4gIGNhbkltcG9ydD86IGJvb2xlYW47XG4gIGNhbkV4cG9ydD86IGJvb2xlYW47XG4gIGltcG9ydEJ5Pzoga2V5b2YgVCB8ICgoaW1wb3J0ZWRSb3c6IGFueSkgPT4gVFtrZXlvZiBUXSk7XG4gIGV4cG9ydEJ5Pzoga2V5b2YgVCB8ICgocm93OiBUKSA9PiBhbnkpO1xuICBpc0hpZGRlbj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUeXBlIG9mIHRoaXMgY29sdW1uJ3MgdmFsdWUuIE9wdGlvbmFsIOKAlCBjb25zdW1lcnMgdGhhdCBuZWVkIGEgdHlwZSBmYWxsIGJhY2tcbiAgICogdG8gaW5mZXJyaW5nIG9uZSBmcm9tIHRoZSBkYXRhIHdoZW4gaXQgaXMgb21pdHRlZC5cbiAgICovXG4gIHZhbHVlVHlwZT86IENvbHVtblZhbHVlVHlwZTtcbiAgLyoqXG4gICAqIEFsbG93ZWQgdmFsdWVzIHdoZW4gYHZhbHVlVHlwZWAgaXMgYEVudW1gLiBFaXRoZXIgYSBwbGFpbiBsaXN0IG9mIG1lbWJlcnMgb3JcbiAgICogYHsgbGFiZWwsIHZhbHVlIH1gIHBhaXJzIHdoZW4gdGhlIGRpc3BsYXkgdGV4dCBkaWZmZXJzIGZyb20gdGhlIHN0b3JlZCB2YWx1ZS5cbiAgICovXG4gIHZhbHVlT3B0aW9ucz86IHN0cmluZ1tdIHwgQ29sdW1uVmFsdWVPcHRpb25bXTtcbiAgLyoqXG4gICAqIE1hcmtzIHRoaXMgY29sdW1uJ3MgZmlsdGVyIGFzIHJlcXVpcmVkOiB0aGUgZmlsdGVyIHBhbmVsIGtlZXBzIGl0cyBjaGlwXG4gICAqIHBlcm1hbmVudGx5IGFjdGl2ZSBhbmQgcmVmdXNlcyB0byBkZWxldGUgaXQsIHNvIGEgcGFnZSB3aG9zZSBkYXRhIGNhbm5vdCBiZVxuICAgKiBmZXRjaGVkIHdpdGhvdXQgdGhlIGZpbHRlciBjYW4gbmV2ZXIgYmUgbGVmdCB3aXRob3V0IG9uZS4gVGhlIGNoaXAgc3RheXNcbiAgICogZWRpdGFibGUg4oCUIG9ubHkgaXRzIHJlbW92YWwgaXMgYmxvY2tlZC5cbiAgICovXG4gIGlzUmVxdWlyZWRGaWx0ZXI/OiBib29sZWFuO1xufVxuXG4vLyBEZWZpbmUgYSB0eXBlIHRoYXQgZXh0ZW5kcyBUIHdpdGggYSBfa2V5IHByb3BlcnR5XG5leHBvcnQgdHlwZSBEYXRhV2l0aEtleTxUPiA9IHtcbiAgX2tleTogc3RyaW5nIHwgbnVtYmVyO1xuICBfa2V5X3Byb3A6IGtleW9mIFQgfCAnX2luZGV4JztcbiAgb3JpZ2luYWxEYXRhOiBUO1xufTtcblxuZXhwb3J0IHR5cGUgR3JvdXBlZERhdGFSb3c8VD4gPSBEYXRhV2l0aEtleTxUPiAmIHtcbiAgaXNHcm91cFJvdz86IGJvb2xlYW47XG4gIGdyb3VwVmFsdWU/OiBhbnk7XG4gIGdyb3VwVGl0bGU/OiBhbnk7XG59O1xuXG5leHBvcnQgdHlwZSBGb3JtQ29udHJvbE9mPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXT86IEZvcm1Db250cm9sO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtR3JvdXBDb25maWc8XG4gIFRDb250cm9sIGV4dGVuZHMgeyBba2V5OiBzdHJpbmddOiBBYnN0cmFjdENvbnRyb2wgfVxuPiB7XG4gIGNvbnRyb2xzOiBUQ29udHJvbDtcbiAgdmFsaWRhdG9yT3JPcHRzPzogVmFsaWRhdG9yRm4gfCBWYWxpZGF0b3JGbltdIHwgQWJzdHJhY3RDb250cm9sT3B0aW9ucyB8IG51bGw7XG4gIGFzeW5jVmFsaWRhdG9yPzogQXN5bmNWYWxpZGF0b3JGbiB8IEFzeW5jVmFsaWRhdG9yRm5bXSB8IG51bGw7XG59XG5cbmV4cG9ydCB0eXBlIEVkaXRlZERhdGE8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdPzogVFtLXSBleHRlbmRzIG9iamVjdCA/IFBhcnRpYWw8VFtLXT4gOiBUW0tdO1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIGV4cG9ydCB0eXBlIENvbHVtbkRlZmluaXRpb25CYXNlPFQ+ID0ge1xuLy8gICBpZDogc3RyaW5nO1xuLy8gICBoZWFkZXI6IHN0cmluZyB8ICgoY29udGV4dDogYW55KSA9PiBhbnkpO1xuLy8gICBjZWxsVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuLy8gICBjZWxsRWRpdFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55Pjtcbi8vICAgaGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuLy8gICBmb290ZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4vLyAgIHNvcnRBY3Rpb24/OiAnQVNDJyB8ICdERVNDJztcbi8vICAgZm9ybUNvbnRyb2xOYW1lPzogc3RyaW5nO1xuLy8gICBncm91cE5hbWU/OiBzdHJpbmc7XG4vLyB9O1xuXG4vLyAvLyBIZWxwZXIgdHlwZSB0byBjcmVhdGUgYSBjb2x1bW4gZGVmaW5pdGlvbiB3aXRoIGEgc3BlY2lmaWMgYWNjZXNzb3Iga2V5XG4vLyBleHBvcnQgdHlwZSBDb2x1bW5EZWZpbml0aW9uV2l0aEtleTxcbi8vICAgVCxcbi8vICAgSyBleHRlbmRzIGtleW9mIFRcbi8vID4gPSBDb2x1bW5EZWZpbml0aW9uQmFzZTxUPiAmIHtcbi8vICAgYWNjZXNzb3JLZXk6IEs7XG4vLyAgIGFjY2Vzc29yRm4/OiBuZXZlcjtcbi8vICAgdmFsaWRhdG9yRm4/OiAodmFsdWU6IFRbS10pID0+IGJvb2xlYW47XG4vLyB9O1xuXG4vLyBleHBvcnQgdHlwZSBDb2x1bW5EZWZpbml0aW9uV2l0aEZuPFQsIFIgPSBhbnk+ID0gQ29sdW1uRGVmaW5pdGlvbkJhc2U8VD4gJiB7XG4vLyAgIGFjY2Vzc29yS2V5PzogbmV2ZXI7XG4vLyAgIGFjY2Vzc29yRm46IChyb3c6IFQpID0+IFI7XG4vLyAgIHZhbGlkYXRvckZuPzogKHZhbHVlOiBSKSA9PiBib29sZWFuO1xuLy8gfTtcblxuLy8gZXhwb3J0IHR5cGUgQ29sdW1uRGVmaW5pdGlvbldpdGhOZWl0aGVyPFQ+ID0gQ29sdW1uRGVmaW5pdGlvbkJhc2U8VD4gJiB7XG4vLyAgIGFjY2Vzc29yS2V5PzogbmV2ZXI7XG4vLyAgIGFjY2Vzc29yRm4/OiBuZXZlcjtcbi8vICAgdmFsaWRhdG9yRm4/OiBuZXZlcjtcbi8vIH07XG5cbi8vIC8vIFVuaW9uIHR5cGUgdGhhdCByZXByZXNlbnRzIGFsbCBwb3NzaWJsZSBjb2x1bW4gZGVmaW5pdGlvbiB2YXJpYW50c1xuLy8gZXhwb3J0IHR5cGUgQ29sdW1uRGVmaW5pdGlvbjxUPiA9XG4vLyAgIHwgeyBbSyBpbiBrZXlvZiBUXTogQ29sdW1uRGVmaW5pdGlvbldpdGhLZXk8VCwgSz4gfVtrZXlvZiBUXVxuLy8gICB8IENvbHVtbkRlZmluaXRpb25XaXRoRm48VD5cbi8vICAgfCBDb2x1bW5EZWZpbml0aW9uV2l0aE5laXRoZXI8VD47XG4iXX0=