verben-ng-ui 1.3.4 → 1.3.5
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.
- package/esm2022/src/lib/components/data-columns/data-columns.component.mjs +45 -9
- package/esm2022/src/lib/components/data-filter/data-filter.component.mjs +174 -25
- package/esm2022/src/lib/components/data-filter/data-filter.module.mjs +7 -3
- package/esm2022/src/lib/components/data-filter/data-filter.types.mjs +9 -1
- package/esm2022/src/lib/components/data-table/data-table.types.mjs +18 -2
- package/esm2022/src/lib/components/data-view/data-view.component.mjs +3 -3
- package/fesm2022/verben-ng-ui-src-lib-components-data-columns.mjs +43 -7
- package/fesm2022/verben-ng-ui-src-lib-components-data-columns.mjs.map +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-filter.mjs +186 -25
- package/fesm2022/verben-ng-ui-src-lib-components-data-filter.mjs.map +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-table.mjs +18 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-table.mjs.map +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-view.mjs +2 -2
- package/fesm2022/verben-ng-ui-src-lib-components-data-view.mjs.map +1 -1
- package/package.json +52 -52
- package/src/lib/components/data-columns/data-columns.component.d.ts +12 -3
- package/src/lib/components/data-filter/data-filter.component.d.ts +59 -7
- package/src/lib/components/data-filter/data-filter.module.d.ts +2 -1
- package/src/lib/components/data-filter/data-filter.types.d.ts +4 -2
- package/src/lib/components/data-table/data-table.types.d.ts +31 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
-
import {
|
|
1
|
+
import { Component, Input, Output, EventEmitter, } from '@angular/core';
|
|
2
|
+
import { ColumnValueType, } from 'verben-ng-ui/src/lib/components/data-table';
|
|
3
|
+
import { STRING_OPERATORS, NUMBER_OPERATORS, DATE_OPERATORS, BOOL_OPERATORS, ENUM_OPERATORS, } from './data-filter.types';
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
5
|
import * as i1 from "@angular/common";
|
|
5
6
|
import * as i2 from "@angular/forms";
|
|
@@ -7,9 +8,16 @@ import * as i3 from "verben-ng-ui/src/lib/components/svg";
|
|
|
7
8
|
import * as i4 from "verben-ng-ui/src/lib/components/card";
|
|
8
9
|
import * as i5 from "verben-ng-ui/src/lib/components/drop-down";
|
|
9
10
|
import * as i6 from "verben-ng-ui/src/lib/verbena-input";
|
|
11
|
+
import * as i7 from "verben-ng-ui/src/lib/components/date-picker";
|
|
10
12
|
export class DataFilterComponent {
|
|
11
13
|
columns;
|
|
12
14
|
data;
|
|
15
|
+
/**
|
|
16
|
+
* Optional restored filters: the panel opens pre-populated with these as
|
|
17
|
+
* selected filter chips. Applied once (the first time a non-empty value
|
|
18
|
+
* arrives) so it never clobbers the user's in-progress edits afterwards.
|
|
19
|
+
*/
|
|
20
|
+
initialFilters;
|
|
13
21
|
filterApplied = new EventEmitter();
|
|
14
22
|
resetFilter = new EventEmitter();
|
|
15
23
|
filterableColumns = [];
|
|
@@ -19,8 +27,48 @@ export class DataFilterComponent {
|
|
|
19
27
|
showAllFilters = false;
|
|
20
28
|
maxVisibleItems = 3;
|
|
21
29
|
currentColumnType = null;
|
|
30
|
+
/**
|
|
31
|
+
* Options for the value dropdown when the selected column is bool or enum.
|
|
32
|
+
* Always normalised to `{ label, value }` so the template binds one shape.
|
|
33
|
+
*/
|
|
34
|
+
valueOptions = [];
|
|
35
|
+
/**
|
|
36
|
+
* Held as strings rather than booleans: `verben-drop-down` gates its selected
|
|
37
|
+
* label on a truthiness check, so an option valued `false` would render as
|
|
38
|
+
* though nothing were picked. Coerced back to a boolean in `addFilter`.
|
|
39
|
+
*/
|
|
40
|
+
boolOptions = [
|
|
41
|
+
{ label: 'Yes', value: 'true' },
|
|
42
|
+
{ label: 'No', value: 'false' },
|
|
43
|
+
];
|
|
44
|
+
// Set once the user edits the panel, so restored/host filters no longer
|
|
45
|
+
// overwrite their in-progress work.
|
|
46
|
+
userTouched = false;
|
|
22
47
|
ngOnInit() {
|
|
23
48
|
this.initializeFilterableColumns();
|
|
49
|
+
this.hydrateSavedFilters();
|
|
50
|
+
}
|
|
51
|
+
ngOnChanges(changes) {
|
|
52
|
+
// Pick up filters restored asynchronously by the host after first render.
|
|
53
|
+
if (changes['initialFilters']) {
|
|
54
|
+
this.hydrateSavedFilters();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Seed the saved-filter chips from the restored filters. Skipped once the user
|
|
59
|
+
* has touched the panel so it never overwrites their in-progress edits.
|
|
60
|
+
*/
|
|
61
|
+
hydrateSavedFilters() {
|
|
62
|
+
if (this.userTouched)
|
|
63
|
+
return;
|
|
64
|
+
this.savedFilters = (this.initialFilters ?? []).map((filter) => ({
|
|
65
|
+
...filter,
|
|
66
|
+
selected: true,
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
/** Marks the panel as user-edited (called from template interactions). */
|
|
70
|
+
markTouched() {
|
|
71
|
+
this.userTouched = true;
|
|
24
72
|
}
|
|
25
73
|
initializeFilterableColumns() {
|
|
26
74
|
this.filterableColumns = this.columns.filter((col) => col.accessorKey);
|
|
@@ -34,7 +82,13 @@ export class DataFilterComponent {
|
|
|
34
82
|
this.currentFilter.operator = undefined;
|
|
35
83
|
this.currentFilter.value = undefined;
|
|
36
84
|
// Determine column type and set available operators
|
|
37
|
-
this.currentColumnType = this.
|
|
85
|
+
this.currentColumnType = this.resolveColumnType(column);
|
|
86
|
+
this.valueOptions =
|
|
87
|
+
this.currentColumnType === 'bool'
|
|
88
|
+
? this.boolOptions
|
|
89
|
+
: this.currentColumnType === 'enum'
|
|
90
|
+
? this.normalizeValueOptions(column.valueOptions)
|
|
91
|
+
: [];
|
|
38
92
|
switch (this.currentColumnType) {
|
|
39
93
|
case 'string':
|
|
40
94
|
this.availableOperators = STRING_OPERATORS;
|
|
@@ -45,23 +99,34 @@ export class DataFilterComponent {
|
|
|
45
99
|
case 'date':
|
|
46
100
|
this.availableOperators = DATE_OPERATORS;
|
|
47
101
|
break;
|
|
102
|
+
case 'bool':
|
|
103
|
+
this.availableOperators = BOOL_OPERATORS;
|
|
104
|
+
break;
|
|
105
|
+
case 'enum':
|
|
106
|
+
this.availableOperators = ENUM_OPERATORS;
|
|
107
|
+
break;
|
|
48
108
|
default:
|
|
49
109
|
this.availableOperators = [];
|
|
50
110
|
}
|
|
51
111
|
}
|
|
52
112
|
addFilter() {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
113
|
+
const value = this.currentFilter.value;
|
|
114
|
+
// Checked explicitly rather than for falsiness: `false` is a valid bool
|
|
115
|
+
// filter and `0` a valid number one.
|
|
116
|
+
const hasValue = value !== undefined && value !== null && value !== '';
|
|
117
|
+
if (!this.currentFilter.columnId || !this.currentFilter.operator || !hasValue) {
|
|
56
118
|
return;
|
|
57
119
|
}
|
|
58
120
|
const newFilter = {
|
|
59
121
|
columnId: this.currentFilter.columnId,
|
|
60
122
|
operator: this.currentFilter.operator,
|
|
61
|
-
|
|
123
|
+
// Bool values round-trip through the dropdown as strings; hosts receive
|
|
124
|
+
// a real boolean.
|
|
125
|
+
value: this.currentColumnType === 'bool' ? value === 'true' : value,
|
|
62
126
|
selected: true,
|
|
63
127
|
};
|
|
64
128
|
this.savedFilters.unshift(newFilter);
|
|
129
|
+
this.userTouched = true;
|
|
65
130
|
this.resetCurrentFilter();
|
|
66
131
|
}
|
|
67
132
|
getFilterDescription(filter) {
|
|
@@ -70,46 +135,128 @@ export class DataFilterComponent {
|
|
|
70
135
|
return '';
|
|
71
136
|
const columnName = typeof column.header === 'function' ? column.header({}) : column.header;
|
|
72
137
|
const operator = this.getOperatorLabel(filter.operator);
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
138
|
+
return `${columnName} ${operator} ${this.getValueLabel(column, filter.value)}`;
|
|
139
|
+
}
|
|
140
|
+
/** Renders a stored filter value the way it was chosen, not as raw data. */
|
|
141
|
+
getValueLabel(column, value) {
|
|
142
|
+
if (value instanceof Date)
|
|
143
|
+
return value.toLocaleDateString();
|
|
144
|
+
if (typeof value === 'boolean')
|
|
145
|
+
return value ? 'Yes' : 'No';
|
|
146
|
+
const option = this.normalizeValueOptions(column.valueOptions).find((candidate) => candidate.value === value);
|
|
147
|
+
return option ? option.label : `${value}`;
|
|
78
148
|
}
|
|
79
149
|
getOperatorLabel(operatorValue) {
|
|
80
150
|
const operator = [
|
|
81
151
|
...STRING_OPERATORS,
|
|
82
152
|
...NUMBER_OPERATORS,
|
|
83
153
|
...DATE_OPERATORS,
|
|
154
|
+
...BOOL_OPERATORS,
|
|
155
|
+
...ENUM_OPERATORS,
|
|
84
156
|
].find((op) => op.value === operatorValue);
|
|
85
157
|
return operator ? operator.label.toLowerCase() : operatorValue;
|
|
86
158
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
159
|
+
/**
|
|
160
|
+
* Prefers the type declared on the column, falling back to inspecting the data
|
|
161
|
+
* only when the host has not declared one.
|
|
162
|
+
*/
|
|
163
|
+
resolveColumnType(column) {
|
|
164
|
+
if (column.valueType) {
|
|
165
|
+
// An Enum with no declared members has nothing to populate a dropdown
|
|
166
|
+
// with, so it degrades to a free-text filter rather than an empty select.
|
|
167
|
+
if (column.valueType === ColumnValueType.Enum &&
|
|
168
|
+
!this.normalizeValueOptions(column.valueOptions).length) {
|
|
169
|
+
return 'string';
|
|
170
|
+
}
|
|
171
|
+
return this.mapValueType(column.valueType);
|
|
172
|
+
}
|
|
173
|
+
return this.inferColumnType(column);
|
|
174
|
+
}
|
|
175
|
+
mapValueType(valueType) {
|
|
176
|
+
switch (valueType) {
|
|
177
|
+
case ColumnValueType.Date:
|
|
178
|
+
return 'date';
|
|
179
|
+
case ColumnValueType.Number:
|
|
180
|
+
case ColumnValueType.Integer:
|
|
181
|
+
case ColumnValueType.Decimal:
|
|
182
|
+
case ColumnValueType.Currency:
|
|
183
|
+
return 'number';
|
|
184
|
+
case ColumnValueType.Bool:
|
|
185
|
+
return 'bool';
|
|
186
|
+
case ColumnValueType.Enum:
|
|
187
|
+
return 'enum';
|
|
188
|
+
default:
|
|
189
|
+
return 'string';
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Best-effort type detection for columns that declare no `valueType`. Falls
|
|
194
|
+
* back to 'string' rather than null so the value field always renders.
|
|
195
|
+
*/
|
|
196
|
+
inferColumnType(column) {
|
|
197
|
+
const sampleValue = this.firstNonEmptyValue(column);
|
|
97
198
|
if (sampleValue instanceof Date)
|
|
98
199
|
return 'date';
|
|
99
200
|
if (typeof sampleValue === 'number')
|
|
100
201
|
return 'number';
|
|
202
|
+
if (typeof sampleValue === 'boolean')
|
|
203
|
+
return 'bool';
|
|
204
|
+
if (typeof sampleValue === 'string' && this.isDateString(sampleValue)) {
|
|
205
|
+
return 'date';
|
|
206
|
+
}
|
|
101
207
|
return 'string';
|
|
102
208
|
}
|
|
209
|
+
/**
|
|
210
|
+
* Scans rows for the first usable sample — sampling only the first row misses
|
|
211
|
+
* the type whenever that row happens to hold a null or undefined value.
|
|
212
|
+
*/
|
|
213
|
+
firstNonEmptyValue(column) {
|
|
214
|
+
for (const row of this.data ?? []) {
|
|
215
|
+
const value = this.readValue(column, row);
|
|
216
|
+
if (value !== null && value !== undefined && value !== '')
|
|
217
|
+
return value;
|
|
218
|
+
}
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
readValue(column, row) {
|
|
222
|
+
if (column.accessorKey)
|
|
223
|
+
return row[column.accessorKey];
|
|
224
|
+
if (column.accessorFn)
|
|
225
|
+
return column.accessorFn(row);
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Dates usually arrive from an API as ISO strings, which would otherwise be
|
|
230
|
+
* typed as plain text. Anchored to ISO-ish input so ordinary strings that
|
|
231
|
+
* `Date` happens to parse (e.g. "March") are not misread as dates.
|
|
232
|
+
*/
|
|
233
|
+
isDateString(value) {
|
|
234
|
+
if (!/^\d{4}-\d{2}-\d{2}([T\s]|$)/.test(value))
|
|
235
|
+
return false;
|
|
236
|
+
return !Number.isNaN(new Date(value).getTime());
|
|
237
|
+
}
|
|
238
|
+
/** Accepts either supported `valueOptions` shape and returns one of them. */
|
|
239
|
+
normalizeValueOptions(options) {
|
|
240
|
+
if (!options?.length)
|
|
241
|
+
return [];
|
|
242
|
+
return options.map((option) => typeof option === 'string'
|
|
243
|
+
? { label: option, value: option }
|
|
244
|
+
: option);
|
|
245
|
+
}
|
|
103
246
|
resetCurrentFilter() {
|
|
104
247
|
this.currentFilter = {};
|
|
105
248
|
this.availableOperators = [];
|
|
249
|
+
this.currentColumnType = null;
|
|
250
|
+
this.valueOptions = [];
|
|
106
251
|
}
|
|
107
252
|
resetAll() {
|
|
253
|
+
this.userTouched = true;
|
|
108
254
|
this.savedFilters = [];
|
|
109
255
|
this.resetCurrentFilter();
|
|
110
256
|
this.resetFilter.emit();
|
|
111
257
|
}
|
|
112
258
|
applyFilters() {
|
|
259
|
+
this.userTouched = true;
|
|
113
260
|
const activeFilters = this.savedFilters
|
|
114
261
|
.filter((filter) => filter.selected)
|
|
115
262
|
.map(({ columnId, operator, value }) => ({
|
|
@@ -136,18 +283,20 @@ export class DataFilterComponent {
|
|
|
136
283
|
return this.savedFilters.filter((filter) => filter.selected).length;
|
|
137
284
|
}
|
|
138
285
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
139
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.10", type: DataFilterComponent, selector: "lib-data-filter", inputs: { columns: "columns", data: "data" }, outputs: { filterApplied: "filterApplied", resetFilter: "resetFilter" }, 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\" />\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 -->\n <verbena-input\n *ngSwitchCase=\"'
|
|
286
|
+
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 Picker -->\n <app-date-picker\n *ngSwitchCase=\"'date'\"\n placeholder=\"Select date\"\n border=\"1px solid var(--vbn-color-border)\"\n [(ngModel)]=\"currentFilter.value\"\n ></app-date-picker>\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"] }, { kind: "component", type: i7.DatePickerComponent, selector: "app-date-picker", inputs: ["placeholder", "format", "minDate", "maxDate", "disabled", "bgColor", "border", "useDropdowns", "yearPlaceholder", "monthPlaceholder", "date", "showTime", "overlayWidth", "datePickerWidth", "useDefaultDate"], outputs: ["dateChange"] }] });
|
|
140
287
|
}
|
|
141
288
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataFilterComponent, decorators: [{
|
|
142
289
|
type: Component,
|
|
143
|
-
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\" />\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 -->\n <verbena-input\n *ngSwitchCase=\"'
|
|
290
|
+
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 Picker -->\n <app-date-picker\n *ngSwitchCase=\"'date'\"\n placeholder=\"Select date\"\n border=\"1px solid var(--vbn-color-border)\"\n [(ngModel)]=\"currentFilter.value\"\n ></app-date-picker>\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"] }]
|
|
144
291
|
}], propDecorators: { columns: [{
|
|
145
292
|
type: Input
|
|
146
293
|
}], data: [{
|
|
147
294
|
type: Input
|
|
295
|
+
}], initialFilters: [{
|
|
296
|
+
type: Input
|
|
148
297
|
}], filterApplied: [{
|
|
149
298
|
type: Output
|
|
150
299
|
}], resetFilter: [{
|
|
151
300
|
type: Output
|
|
152
301
|
}] } });
|
|
153
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWZpbHRlci9kYXRhLWZpbHRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtZmlsdGVyL2RhdGEtZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFL0UsT0FBTyxFQUlMLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsY0FBYyxHQUNmLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7O0FBTzdCLE1BQU0sT0FBTyxtQkFBbUI7SUFDckIsT0FBTyxDQUF5QjtJQUNoQyxJQUFJLENBQU87SUFDVixhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7SUFDdEQsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDM0MsaUJBQWlCLEdBQTBCLEVBQUUsQ0FBQztJQUM5QyxrQkFBa0IsR0FBcUIsRUFBRSxDQUFDO0lBQzFDLFlBQVksR0FBZ0QsRUFBRSxDQUFDO0lBQy9ELGFBQWEsR0FBNkIsRUFBRSxDQUFDO0lBQzdDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsZUFBZSxHQUFHLENBQUMsQ0FBQztJQUNwQixpQkFBaUIsR0FBd0MsSUFBSSxDQUFDO0lBRTlELFFBQVE7UUFDTixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRU8sMkJBQTJCO1FBQ2pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdB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QU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDdEUsQ0FBQzt3R0ExSlUsbUJBQW1COzRGQUFuQixtQkFBbUIsOEtDaEJoQywrN0lBZ0pBOzs0RkRoSWEsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGlCQUFpQjs4QkFLbEIsT0FBTztzQkFBZixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDSSxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb2x1bW5EZWZpbml0aW9uIH0gZnJvbSAndmVyYmVuLW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLXRhYmxlJztcbmltcG9ydCB7XG4gIEZpbHRlck9wZXJhdG9yLFxuICBGaWx0ZXJDb25kaXRpb24sXG4gIEZpbHRlckdyb3VwLFxuICBTVFJJTkdfT1BFUkFUT1JTLFxuICBOVU1CRVJfT1BFUkFUT1JTLFxuICBEQVRFX09QRVJBVE9SUyxcbn0gZnJvbSAnLi9kYXRhLWZpbHRlci50eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1kYXRhLWZpbHRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhLWZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kYXRhLWZpbHRlci5jb21wb25lbnQuY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgRGF0YUZpbHRlckNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGNvbHVtbnMhOiBDb2x1bW5EZWZpbml0aW9uPFQ+W107XG4gIEBJbnB1dCgpIGRhdGEhOiBUW107XG4gIEBPdXRwdXQoKSBmaWx0ZXJBcHBsaWVkID0gbmV3IEV2ZW50RW1pdHRlcjxGaWx0ZXJDb25kaXRpb25bXT4oKTtcbiAgQE91dHB1dCgpIHJlc2V0RmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBmaWx0ZXJhYmxlQ29sdW1uczogQ29sdW1uRGVmaW5pdGlvbjxUPltdID0gW107XG4gIGF2YWlsYWJsZU9wZXJhdG9yczogRmlsdGVyT3BlcmF0b3JbXSA9IFtdO1xuICBzYXZlZEZpbHRlcnM6IChGaWx0ZXJDb25kaXRpb24gJiB7IHNlbGVjdGVkOiBib29sZWFuIH0pW10gPSBbXTtcbiAgY3VycmVudEZpbHRlcjogUGFydGlhbDxGaWx0ZXJDb25kaXRpb24+ID0ge307XG4gIHNob3dBbGxGaWx0ZXJzID0gZmFsc2U7XG4gIG1heFZpc2libGVJdGVtcyA9IDM7XG4gIGN1cnJlbnRDb2x1bW5UeXBlOiAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2RhdGUnIHwgbnVsbCA9IG51bGw7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplRmlsdGVyYWJsZUNvbHVtbnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUZpbHRlcmFibGVDb2x1bW5zKCkge1xuICAgIHRoaXMuZmlsdGVyYWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKChjb2wpID0+IGNvbC5hY2Nlc3NvcktleSk7XG4gIH1cblxuICBvbkNvbHVtblNlbGVjdChjb2x1bW5JZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5maWx0ZXJhYmxlQ29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5pZCA9PT0gY29sdW1uSWQpO1xuICAgIGlmICghY29sdW1uKSByZXR1cm47XG5cbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXIuY29sdW1uSWQgPSBjb2x1bW5JZDtcblxuICAgIC8vIFJlc2V0IG90aGVyIHZhbHVlc1xuICAgIHRoaXMuY3VycmVudEZpbHRlci5vcGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXIudmFsdWUgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBEZXRlcm1pbmUgY29sdW1uIHR5cGUgYW5kIHNldCBhdmFpbGFibGUgb3BlcmF0b3JzXG4gICAgdGhpcy5jdXJyZW50Q29sdW1uVHlwZSA9IHRoaXMuZGV0ZXJtaW5lQ29sdW1uVHlwZShjb2x1bW4pO1xuXG4gICAgc3dpdGNoICh0aGlzLmN1cnJlbnRDb2x1bW5UeXBlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICB0aGlzLmF2YWlsYWJsZU9wZXJhdG9ycyA9IFNUUklOR19PUEVSQVRPUlM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgdGhpcy5hdmFpbGFibGVPcGVyYXRvcnMgPSBOVU1CRVJfT1BFUkFUT1JTO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICB0aGlzLmF2YWlsYWJsZU9wZXJhdG9ycyA9IERBVEVfT1BFUkFUT1JTO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlT3BlcmF0b3JzID0gW107XG4gICAgfVxuICB9XG5cbiAgYWRkRmlsdGVyKCkge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmN1cnJlbnRGaWx0ZXIuY29sdW1uSWQgfHxcbiAgICAgICF0aGlzLmN1cnJlbnRGaWx0ZXIub3BlcmF0b3IgfHxcbiAgICAgICF0aGlzLmN1cnJlbnRGaWx0ZXIudmFsdWVcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdGaWx0ZXI6IEZpbHRlckNvbmRpdGlvbiAmIHsgc2VsZWN0ZWQ6IGJvb2xlYW4gfSA9IHtcbiAgICAgIGNvbHVtbklkOiB0aGlzLmN1cnJlbnRGaWx0ZXIuY29sdW1uSWQhLFxuICAgICAgb3BlcmF0b3I6IHRoaXMuY3VycmVudEZpbHRlci5vcGVyYXRvcixcbiAgICAgIHZhbHVlOiB0aGlzLmN1cnJlbnRGaWx0ZXIudmFsdWUsXG4gICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICB9O1xuXG4gICAgdGhpcy5zYXZlZEZpbHRlcnMudW5zaGlmdChuZXdGaWx0ZXIpO1xuICAgIHRoaXMucmVzZXRDdXJyZW50RmlsdGVyKCk7XG4gIH1cblxuICBnZXRGaWx0ZXJEZXNjcmlwdGlvbihmaWx0ZXI6IEZpbHRlckNvbmRpdGlvbik6IHN0cmluZyB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5maWx0ZXJhYmxlQ29sdW1ucy5maW5kKFxuICAgICAgKGNvbCkgPT4gY29sLmlkID09PSBmaWx0ZXIuY29sdW1uSWRcbiAgICApO1xuICAgIGlmICghY29sdW1uKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCBjb2x1bW5OYW1lID1cbiAgICAgIHR5cGVvZiBjb2x1bW4uaGVhZGVyID09PSAnZnVuY3Rpb24nID8gY29sdW1uLmhlYWRlcih7fSkgOiBjb2x1bW4uaGVhZGVyO1xuXG4gICAgY29uc3Qgb3BlcmF0b3IgPSB0aGlzLmdldE9wZXJhdG9yTGFiZWwoZmlsdGVyLm9wZXJhdG9yKTtcblxuICAgIGxldCB2YWx1ZSA9IGZpbHRlci52YWx1ZTtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICB2YWx1ZSA9ICh2YWx1ZSBhcyBEYXRlKS50b0xvY2FsZURhdGVTdHJpbmcoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7Y29sdW1uTmFtZX0gJHtvcGVyYXRvcn0gJHt2YWx1ZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPcGVyYXRvckxhYmVsKG9wZXJhdG9yVmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgb3BlcmF0b3IgPSBbXG4gICAgICAuLi5TVFJJTkdfT1BFUkFUT1JTLFxuICAgICAgLi4uTlVNQkVSX09QRVJBVE9SUyxcbiAgICAgIC4uLkRBVEVfT1BFUkFUT1JTLFxuICAgIF0uZmluZCgob3ApID0+IG9wLnZhbHVlID09PSBvcGVyYXRvclZhbHVlKTtcbiAgICByZXR1cm4gb3BlcmF0b3IgPyBvcGVyYXRvci5sYWJlbC50b0xvd2VyQ2FzZSgpIDogb3BlcmF0b3JWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZXJtaW5lQ29sdW1uVHlwZShcbiAgICBjb2x1bW46IENvbHVtbkRlZmluaXRpb248VD5cbiAgKTogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdkYXRlJyB8IG51bGwge1xuICAgIGlmICghdGhpcy5kYXRhLmxlbmd0aCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBzYW1wbGVWYWx1ZSA9IGNvbHVtbi5hY2Nlc3NvcktleVxuICAgICAgPyB0aGlzLmRhdGFbMF1bY29sdW1uLmFjY2Vzc29yS2V5XVxuICAgICAgOiBjb2x1bW4uYWNjZXNzb3JGblxuICAgICAgPyBjb2x1bW4uYWNjZXNzb3JGbih0aGlzLmRhdGFbMF0pXG4gICAgICA6IG51bGw7XG5cbiAgICBpZiAoc2FtcGxlVmFsdWUgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgaWYgKHNhbXBsZVZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuICdkYXRlJztcbiAgICBpZiAodHlwZW9mIHNhbXBsZVZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuICdudW1iZXInO1xuICAgIHJldHVybiAnc3RyaW5nJztcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRDdXJyZW50RmlsdGVyKCkge1xuICAgIHRoaXMuY3VycmVudEZpbHRlciA9IHt9O1xuICAgIHRoaXMuYXZhaWxhYmxlT3BlcmF0b3JzID0gW107XG4gIH1cblxuICByZXNldEFsbCgpIHtcbiAgICB0aGlzLnNhdmVkRmlsdGVycyA9IFtdO1xuICAgIHRoaXMucmVzZXRDdXJyZW50RmlsdGVyKCk7XG4gICAgdGhpcy5yZXNldEZpbHRlci5lbWl0KCk7XG4gIH1cblxuICBhcHBseUZpbHRlcnMoKSB7XG4gICAgY29uc3QgYWN0aXZlRmlsdGVycyA9IHRoaXMuc2F2ZWRGaWx0ZXJzXG4gICAgICAuZmlsdGVyKChmaWx0ZXIpID0+IGZpbHRlci5zZWxlY3RlZClcbiAgICAgIC5tYXAoKHsgY29sdW1uSWQsIG9wZXJhdG9yLCB2YWx1ZSB9KSA9PiAoe1xuICAgICAgICBjb2x1bW5JZCxcbiAgICAgICAgb3BlcmF0b3IsXG4gICAgICAgIHZhbHVlLFxuICAgICAgfSkpO1xuICAgIHRoaXMuZmlsdGVyQXBwbGllZC5lbWl0KGFjdGl2ZUZpbHRlcnMpO1xuICB9XG5cbiAgZ2V0Q29sdW1uTGFiZWwoY29sdW1uSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5maWx0ZXJhYmxlQ29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5pZCA9PT0gY29sdW1uSWQpO1xuICAgIHJldHVybiBjb2x1bW5cbiAgICAgID8gdHlwZW9mIGNvbHVtbi5oZWFkZXIgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyBjb2x1bW4uaGVhZGVyKHt9KVxuICAgICAgICA6IGNvbHVtbi5oZWFkZXJcbiAgICAgIDogY29sdW1uSWQ7XG4gIH1cblxuICBnZXQgdmlzaWJsZUZpbHRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0FsbEZpbHRlcnNcbiAgICAgID8gdGhpcy5zYXZlZEZpbHRlcnNcbiAgICAgIDogdGhpcy5zYXZlZEZpbHRlcnMuc2xpY2UoMCwgdGhpcy5tYXhWaXNpYmxlSXRlbXMpO1xuICB9XG5cbiAgZ2V0IGFjdGl2ZUZpbHRlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2F2ZWRGaWx0ZXJzLmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIuc2VsZWN0ZWQpLmxlbmd0aDtcbiAgfVxufVxuIiwiPHZlcmJlbi1jYXJkXG4gIHdpZHRoPVwiMjRyZW1cIlxuICBib3JkZXJSYWRpdXM9XCIxcmVtXCJcbiAgW2JvcmRlcl09XCInMXB4IHNvbGlkIHZhcigtLXZibi1jb2xvci1wcmltYXJ5KSdcIlxuICBiZ0NvbG9yPVwidmFyKC0tdmJuLWNvbG9yLXN1cmZhY2UpXCJcbj5cbiAgPGRpdiBjYXJkLWhlYWRlciBjbGFzcz1cImNhcmQtaGVhZGVyXCI+XG4gICAgPGg0IGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+XG4gICAgICBGaWx0ZXIgPHN1cD4oe3sgYWN0aXZlRmlsdGVyQ291bnQgfX0pPC9zdXA+XG4gICAgPC9oND5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cInJlc2V0LWJ1dHRvblwiXG4gICAgICBbc3R5bGUuY29sb3JdPVwiJ3ZhcigtLXZibi1jb2xvci1ib3JkZXItZm9jdXMpJ1wiXG4gICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCIndHJhbnNwYXJlbnQnXCJcbiAgICAgIFtzdHlsZS5ib3JkZXJdPVwiJ25vbmUnXCJcbiAgICAgIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCJcbiAgICAgIFtzdHlsZS5mb250LXNpemVdPVwiJzEycHgnXCJcbiAgICAgIChjbGljayk9XCJyZXNldEFsbCgpXCJcbiAgICA+XG4gICAgICBSZXNldFxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNhcmQtYm9keSBjbGFzcz1cImNhcmQtYm9keVwiPlxuICAgIDwhLS0gU2F2ZWQgRmlsdGVycyBTZWN0aW9uIC0tPlxuICAgIDxzZWN0aW9uIGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMyBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj5GaWx0ZXJzPC9oMz5cbiAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICBpY29uPVwiaW5mb1wiXG4gICAgICAgICAgW3dpZHRoXT1cIjE1XCJcbiAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICBmaWxsPVwidmFyKC0tdmJuLWNvbG9yLXRleHQtbXV0ZWQpXCJcbiAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgdmlzaWJsZUZpbHRlcnNcIiBjbGFzcz1cIml0ZW1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tbGFiZWxcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJmaWx0ZXIuc2VsZWN0ZWRcIiAvPlxuICAgICAgICAgIDxsYWJlbD57eyBnZXRGaWx0ZXJEZXNjcmlwdGlvbihmaWx0ZXIpIH19PC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cInNhdmVkRmlsdGVycy5sZW5ndGggPiBtYXhWaXNpYmxlSXRlbXNcIlxuICAgICAgICBjbGFzcz1cInNob3ctbW9yZVwiXG4gICAgICAgIChjbGljayk9XCJzaG93QWxsRmlsdGVycyA9ICFzaG93QWxsRmlsdGVyc1wiXG4gICAgICA+XG4gICAgICAgIHt7IHNob3dBbGxGaWx0ZXJzID8gXCJTaG93IExlc3NcIiA6IFwiU2hvdyBNb3JlXCIgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvc2VjdGlvbj5cblxuICAgIDxociBjbGFzcz1cImRpdmlkZXJcIiAvPlxuXG4gICAgPCEtLSBOZXcgRmlsdGVyIE9wZXJhdGlvbiAtLT5cbiAgICA8c2VjdGlvbiBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICA8aDMgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+T3BlcmF0aW9uPC9oMz5cbiAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICBpY29uPVwiaW5mb1wiXG4gICAgICAgICAgW3dpZHRoXT1cIjE1XCJcbiAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICBmaWxsPVwidmFyKC0tdmJuLWNvbG9yLXRleHQtbXV0ZWQpXCJcbiAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwib3BlcmF0aW9uLWdyaWRcIj5cbiAgICAgICAgPCEtLSBDb2x1bW4gU2VsZWN0aW9uIC0tPlxuICAgICAgICA8dmVyYmVuLWRyb3AtZG93blxuICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgaGVpZ2h0PVwiMS4wMjVyZW1cIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGNvbHVtblwiXG4gICAgICAgICAgW29wdGlvbnNdPVwiZmlsdGVyYWJsZUNvbHVtbnNcIlxuICAgICAgICAgIG9wdGlvbkxhYmVsPVwiaGVhZGVyXCJcbiAgICAgICAgICBvcHRpb25WYWx1ZT1cImlkXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImN1cnJlbnRGaWx0ZXIuY29sdW1uSWRcIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ29sdW1uU2VsZWN0KCRldmVudClcIlxuICAgICAgICA+PC92ZXJiZW4tZHJvcC1kb3duPlxuXG4gICAgICAgIDwhLS0gT3BlcmF0b3IgU2VsZWN0aW9uIC0tPlxuICAgICAgICA8dmVyYmVuLWRyb3AtZG93blxuICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgaGVpZ2h0PVwiMS4wMjVyZW1cIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IG9wZXJhdG9yXCJcbiAgICAgICAgICBbb3B0aW9uc109XCJhdmFpbGFibGVPcGVyYXRvcnNcIlxuICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwiY3VycmVudEZpbHRlci5vcGVyYXRvclwiXG4gICAgICAgID48L3ZlcmJlbi1kcm9wLWRvd24+XG5cbiAgICAgICAgPCEtLSBWYWx1ZSBJbnB1dCBiYXNlZCBvbiB0eXBlIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjdXJyZW50Q29sdW1uVHlwZVwiPlxuICAgICAgICAgIDwhLS0gRGF0ZSBJbnB1dCAtLT5cbiAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiXG4gICAgICAgICAgICB0eXBlPVwiZGF0ZVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBkYXRlXCJcbiAgICAgICAgICAgIGJvcmRlcj1cIjFweCBzb2xpZCB2YXIoLS12Ym4tY29sb3ItYm9yZGVyKVwiXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM9XCI1cHhcIlxuICAgICAgICAgICAgdGV4dENvbG9yPVwidmFyKC0tdmJuLWNvbG9yLXRleHQpXCJcbiAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIxLjAyNXJlbVwiXG4gICAgICAgICAgICBwZD1cIjJweCA2cHhcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICA+PC92ZXJiZW5hLWlucHV0PlxuXG4gICAgICAgICAgPCEtLSBOdW1iZXIgSW5wdXQgLS0+XG4gICAgICAgICAgPHZlcmJlbmEtaW5wdXRcbiAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInbnVtYmVyJ1wiXG4gICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgbnVtYmVyXCJcbiAgICAgICAgICAgIGJvcmRlcj1cIjFweCBzb2xpZCB2YXIoLS12Ym4tY29sb3ItYm9yZGVyKVwiXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM9XCI1cHhcIlxuICAgICAgICAgICAgdGV4dENvbG9yPVwidmFyKC0tdmJuLWNvbG9yLXRleHQpXCJcbiAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIxLjAyNXJlbVwiXG4gICAgICAgICAgICBwZD1cIjJweCA2cHhcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICA+PC92ZXJiZW5hLWlucHV0PlxuXG4gICAgICAgICAgPCEtLSBUZXh0IElucHV0IChkZWZhdWx0KSAtLT5cbiAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidzdHJpbmcnXCJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgdGV4dFwiXG4gICAgICAgICAgICBib3JkZXI9XCIxcHggc29saWQgdmFyKC0tdmJuLWNvbG9yLWJvcmRlcilcIlxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzPVwiNXB4XCJcbiAgICAgICAgICAgIHRleHRDb2xvcj1cInZhcigtLXZibi1jb2xvci10ZXh0KVwiXG4gICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgaGVpZ2h0PVwiMS4wMjVyZW1cIlxuICAgICAgICAgICAgcGQ9XCIycHggNnB4XCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY3VycmVudEZpbHRlci52YWx1ZVwiXG4gICAgICAgICAgPjwvdmVyYmVuYS1pbnB1dD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImFkZC1idXR0b24gbWwtYXV0b1wiIChjbGljayk9XCJhZGRGaWx0ZXIoKVwiPisgQWRkPC9idXR0b24+XG4gICAgPC9zZWN0aW9uPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNhcmQtZm9vdGVyIGNsYXNzPVwiY2FyZC1mb290ZXJcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiZXhwb3J0LWJ1dHRvblwiIChjbGljayk9XCJhcHBseUZpbHRlcnMoKVwiPkZpbHRlcjwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvdmVyYmVuLWNhcmQ+XG4iXX0=
|
|
302
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWZpbHRlci9kYXRhLWZpbHRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtZmlsdGVyL2RhdGEtZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEdBSWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLGVBQWUsR0FDaEIsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRCxPQUFPLEVBS0wsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsY0FBYyxFQUNkLGNBQWMsR0FDZixNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7QUFPN0IsTUFBTSxPQUFPLG1CQUFtQjtJQUNyQixPQUFPLENBQXlCO0lBQ2hDLElBQUksQ0FBTztJQUNwQjs7OztPQUlHO0lBQ00sY0FBYyxDQUFxQjtJQUNsQyxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7SUFDdEQsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDM0MsaUJBQWlCLEdBQTBCLEVBQUUsQ0FBQztJQUM5QyxrQkFBa0IsR0FBcUIsRUFBRSxDQUFDO0lBQzFDLFlBQVksR0FBZ0QsRUFBRSxDQUFDO0lBQy9ELGFBQWEsR0FBNkIsRUFBRSxDQUFDO0lBQzdDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsZUFBZSxHQUFHLENBQUMsQ0FBQztJQUNwQixpQkFBaUIsR0FBOEIsSUFBSSxDQUFDO0lBQ3BEOzs7T0FHRztJQUNILFlBQVksR0FBd0IsRUFBRSxD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RG5JYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0UsaUJBQWlCOzhCQUtsQixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQU1HLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENvbHVtbkRlZmluaXRpb24sXG4gIENvbHVtblZhbHVlT3B0aW9uLFxuICBDb2x1bW5WYWx1ZVR5cGUsXG59IGZyb20gJ3ZlcmJlbi1uZy11aS9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS10YWJsZSc7XG5pbXBvcnQge1xuICBGaWx0ZXJPcGVyYXRvcixcbiAgRmlsdGVyT3BlcmF0b3JUeXBlLFxuICBGaWx0ZXJDb25kaXRpb24sXG4gIEZpbHRlckdyb3VwLFxuICBTVFJJTkdfT1BFUkFUT1JTLFxuICBOVU1CRVJfT1BFUkFUT1JTLFxuICBEQVRFX09QRVJBVE9SUyxcbiAgQk9PTF9PUEVSQVRPUlMsXG4gIEVOVU1fT1BFUkFUT1JTLFxufSBmcm9tICcuL2RhdGEtZmlsdGVyLnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWRhdGEtZmlsdGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2RhdGEtZmlsdGVyLmNvbXBvbmVudC5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRhRmlsdGVyQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjb2x1bW5zITogQ29sdW1uRGVmaW5pdGlvbjxUPltdO1xuICBASW5wdXQoKSBkYXRhITogVFtdO1xuICAvKipcbiAgICogT3B0aW9uYWwgcmVzdG9yZWQgZmlsdGVyczogdGhlIHBhbmVsIG9wZW5zIHByZS1wb3B1bGF0ZWQgd2l0aCB0aGVzZSBhc1xuICAgKiBzZWxlY3RlZCBmaWx0ZXIgY2hpcHMuIEFwcGxpZWQgb25jZSAodGhlIGZpcnN0IHRpbWUgYSBub24tZW1wdHkgdmFsdWVcbiAgICogYXJyaXZlcykgc28gaXQgbmV2ZXIgY2xvYmJlcnMgdGhlIHVzZXIncyBpbi1wcm9ncmVzcyBlZGl0cyBhZnRlcndhcmRzLlxuICAgKi9cbiAgQElucHV0KCkgaW5pdGlhbEZpbHRlcnM/OiBGaWx0ZXJDb25kaXRpb25bXTtcbiAgQE91dHB1dCgpIGZpbHRlckFwcGxpZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbHRlckNvbmRpdGlvbltdPigpO1xuICBAT3V0cHV0KCkgcmVzZXRGaWx0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIGZpbHRlcmFibGVDb2x1bW5zOiBDb2x1bW5EZWZpbml0aW9uPFQ+W10gPSBbXTtcbiAgYXZhaWxhYmxlT3BlcmF0b3JzOiBGaWx0ZXJPcGVyYXRvcltdID0gW107XG4gIHNhdmVkRmlsdGVyczogKEZpbHRlckNvbmRpdGlvbiAmIHsgc2VsZWN0ZWQ6IGJvb2xlYW4gfSlbXSA9IFtdO1xuICBjdXJyZW50RmlsdGVyOiBQYXJ0aWFsPEZpbHRlckNvbmRpdGlvbj4gPSB7fTtcbiAgc2hvd0FsbEZpbHRlcnMgPSBmYWxzZTtcbiAgbWF4VmlzaWJsZUl0ZW1zID0gMztcbiAgY3VycmVudENvbHVtblR5cGU6IEZpbHRlck9wZXJhdG9yVHlwZSB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogT3B0aW9ucyBmb3IgdGhlIHZhbHVlIGRyb3Bkb3duIHdoZW4gdGhlIHNlbGVjdGVkIGNvbHVtbiBpcyBib29sIG9yIGVudW0uXG4gICAqIEFsd2F5cyBub3JtYWxpc2VkIHRvIGB7IGxhYmVsLCB2YWx1ZSB9YCBzbyB0aGUgdGVtcGxhdGUgYmluZHMgb25lIHNoYXBlLlxuICAgKi9cbiAgdmFsdWVPcHRpb25zOiBDb2x1bW5WYWx1ZU9wdGlvbltdID0gW107XG4gIC8qKlxuICAgKiBIZWxkIGFzIHN0cmluZ3MgcmF0aGVyIHRoYW4gYm9vbGVhbnM6IGB2ZXJiZW4tZHJvcC1kb3duYCBnYXRlcyBpdHMgc2VsZWN0ZWRcbiAgICogbGFiZWwgb24gYSB0cnV0aGluZXNzIGNoZWNrLCBzbyBhbiBvcHRpb24gdmFsdWVkIGBmYWxzZWAgd291bGQgcmVuZGVyIGFzXG4gICAqIHRob3VnaCBub3RoaW5nIHdlcmUgcGlja2VkLiBDb2VyY2VkIGJhY2sgdG8gYSBib29sZWFuIGluIGBhZGRGaWx0ZXJgLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBib29sT3B0aW9uczogQ29sdW1uVmFsdWVPcHRpb25bXSA9IFtcbiAgICB7IGxhYmVsOiAnWWVzJywgdmFsdWU6ICd0cnVlJyB9LFxuICAgIHsgbGFiZWw6ICdObycsIHZhbHVlOiAnZmFsc2UnIH0sXG4gIF07XG4gIC8vIFNldCBvbmNlIHRoZSB1c2VyIGVkaXRzIHRoZSBwYW5lbCwgc28gcmVzdG9yZWQvaG9zdCBmaWx0ZXJzIG5vIGxvbmdlclxuICAvLyBvdmVyd3JpdGUgdGhlaXIgaW4tcHJvZ3Jlc3Mgd29yay5cbiAgcHJpdmF0ZSB1c2VyVG91Y2hlZCA9IGZhbHNlO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUZpbHRlcmFibGVDb2x1bW5zKCk7XG4gICAgdGhpcy5oeWRyYXRlU2F2ZWRGaWx0ZXJzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgLy8gUGljayB1cCBmaWx0ZXJzIHJlc3RvcmVkIGFzeW5jaHJvbm91c2x5IGJ5IHRoZSBob3N0IGFmdGVyIGZpcnN0IHJlbmRlci5cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbEZpbHRlcnMnXSkge1xuICAgICAgdGhpcy5oeWRyYXRlU2F2ZWRGaWx0ZXJzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlZWQgdGhlIHNhdmVkLWZpbHRlciBjaGlwcyBmcm9tIHRoZSByZXN0b3JlZCBmaWx0ZXJzLiBTa2lwcGVkIG9uY2UgdGhlIHVzZXJcbiAgICogaGFzIHRvdWNoZWQgdGhlIHBhbmVsIHNvIGl0IG5ldmVyIG92ZXJ3cml0ZXMgdGhlaXIgaW4tcHJvZ3Jlc3MgZWRpdHMuXG4gICAqL1xuICBwcml2YXRlIGh5ZHJhdGVTYXZlZEZpbHRlcnMoKSB7XG4gICAgaWYgKHRoaXMudXNlclRvdWNoZWQpIHJldHVybjtcbiAgICB0aGlzLnNhdmVkRmlsdGVycyA9ICh0aGlzLmluaXRpYWxGaWx0ZXJzID8/IFtdKS5tYXAoKGZpbHRlcikgPT4gKHtcbiAgICAgIC4uLmZpbHRlcixcbiAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKiBNYXJrcyB0aGUgcGFuZWwgYXMgdXNlci1lZGl0ZWQgKGNhbGxlZCBmcm9tIHRlbXBsYXRlIGludGVyYWN0aW9ucykuICovXG4gIG1hcmtUb3VjaGVkKCkge1xuICAgIHRoaXMudXNlclRvdWNoZWQgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplRmlsdGVyYWJsZUNvbHVtbnMoKSB7XG4gICAgdGhpcy5maWx0ZXJhYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gY29sLmFjY2Vzc29yS2V5KTtcbiAgfVxuXG4gIG9uQ29sdW1uU2VsZWN0KGNvbHVtbklkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmZpbHRlcmFibGVDb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLmlkID09PSBjb2x1bW5JZCk7XG4gICAgaWYgKCFjb2x1bW4pIHJldHVybjtcblxuICAgIHRoaXMuY3VycmVudEZpbHRlci5jb2x1bW5JZCA9IGNvbHVtbklkO1xuXG4gICAgLy8gUmVzZXQgb3RoZXIgdmFsdWVzXG4gICAgdGhpcy5jdXJyZW50RmlsdGVyLm9wZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudEZpbHRlci52YWx1ZSA9IHVuZGVmaW5lZDtcblxuICAgIC8vIERldGVybWluZSBjb2x1bW4gdHlwZSBhbmQgc2V0IGF2YWlsYWJsZSBvcGVyYXRvcnNcbiAgICB0aGlzLmN1cnJlbnRDb2x1bW5UeXBlID0gdGhpcy5yZXNvbHZlQ29sdW1uVHlwZShjb2x1bW4pO1xuICAgIHRoaXMudmFsdWVPcHRpb25zID1cbiAgICAgIHRoaXMuY3VycmVudENvbHVtblR5cGUgPT09ICdib29sJ1xuICAgICAgICA/IHRoaXMuYm9vbE9wdGlvbnNcbiAgICAgICAgOiB0aGlzLmN1cnJlbnRDb2x1bW5UeXBlID09PSAnZW51bSdcbiAgICAgICAgPyB0aGlzLm5vcm1hbGl6ZVZhbHVlT3B0aW9ucyhjb2x1bW4udmFsdWVPcHRpb25zKVxuICAgICAgICA6IFtdO1xuXG4gICAgc3dpdGNoICh0aGlzLmN1cnJlbnRDb2x1bW5UeXBlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICB0aGlzLmF2YWlsYWJsZU9wZXJhdG9ycyA9IFNUUklOR19PUEVSQVRPUlM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgdGhpcy5hdmFpbGFibGVPcGVyYXRvcnMgPSBOVU1CRVJfT1BFUkFUT1JTO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICB0aGlzLmF2YWlsYWJsZU9wZXJhdG9ycyA9IERBVEVfT1BFUkFUT1JTO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Jvb2wnOlxuICAgICAgICB0aGlzLmF2YWlsYWJsZU9wZXJhdG9ycyA9IEJPT0xfT1BFUkFUT1JTO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VudW0nOlxuICAgICAgICB0aGlzLmF2YWlsYWJsZU9wZXJhdG9ycyA9IEVOVU1fT1BFUkFUT1JTO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlT3BlcmF0b3JzID0gW107XG4gICAgfVxuICB9XG5cbiAgYWRkRmlsdGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jdXJyZW50RmlsdGVyLnZhbHVlO1xuICAgIC8vIENoZWNrZWQgZXhwbGljaXRseSByYXRoZXIgdGhhbiBmb3IgZmFsc2luZXNzOiBgZmFsc2VgIGlzIGEgdmFsaWQgYm9vbFxuICAgIC8vIGZpbHRlciBhbmQgYDBgIGEgdmFsaWQgbnVtYmVyIG9uZS5cbiAgICBjb25zdCBoYXNWYWx1ZSA9IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09ICcnO1xuXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRGaWx0ZXIuY29sdW1uSWQgfHwgIXRoaXMuY3VycmVudEZpbHRlci5vcGVyYXRvciB8fCAhaGFzVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdGaWx0ZXI6IEZpbHRlckNvbmRpdGlvbiAmIHsgc2VsZWN0ZWQ6IGJvb2xlYW4gfSA9IHtcbiAgICAgIGNvbHVtbklkOiB0aGlzLmN1cnJlbnRGaWx0ZXIuY29sdW1uSWQhLFxuICAgICAgb3BlcmF0b3I6IHRoaXMuY3VycmVudEZpbHRlci5vcGVyYXRvcixcbiAgICAgIC8vIEJvb2wgdmFsdWVzIHJvdW5kLXRyaXAgdGhyb3VnaCB0aGUgZHJvcGRvd24gYXMgc3RyaW5nczsgaG9zdHMgcmVjZWl2ZVxuICAgICAgLy8gYSByZWFsIGJvb2xlYW4uXG4gICAgICB2YWx1ZTogdGhpcy5jdXJyZW50Q29sdW1uVHlwZSA9PT0gJ2Jvb2wnID8gdmFsdWUgPT09ICd0cnVlJyA6IHZhbHVlISxcbiAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgIH07XG5cbiAgICB0aGlzLnNhdmVkRmlsdGVycy51bnNoaWZ0KG5ld0ZpbHRlcik7XG4gICAgdGhpcy51c2VyVG91Y2hlZCA9IHRydWU7XG4gICAgdGhpcy5yZXNldEN1cnJlbnRGaWx0ZXIoKTtcbiAgfVxuXG4gIGdldEZpbHRlckRlc2NyaXB0aW9uKGZpbHRlcjogRmlsdGVyQ29uZGl0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmZpbHRlcmFibGVDb2x1bW5zLmZpbmQoXG4gICAgICAoY29sKSA9PiBjb2wuaWQgPT09IGZpbHRlci5jb2x1bW5JZFxuICAgICk7XG4gICAgaWYgKCFjb2x1bW4pIHJldHVybiAnJztcblxuICAgIGNvbnN0IGNvbHVtbk5hbWUgPVxuICAgICAgdHlwZW9mIGNvbHVtbi5oZWFkZXIgPT09ICdmdW5jdGlvbicgPyBjb2x1bW4uaGVhZGVyKHt9KSA6IGNvbHVtbi5oZWFkZXI7XG5cbiAgICBjb25zdCBvcGVyYXRvciA9IHRoaXMuZ2V0T3BlcmF0b3JMYWJlbChmaWx0ZXIub3BlcmF0b3IpO1xuXG4gICAgcmV0dXJuIGAke2NvbHVtbk5hbWV9ICR7b3BlcmF0b3J9ICR7dGhpcy5nZXRWYWx1ZUxhYmVsKGNvbHVtbiwgZmlsdGVyLnZhbHVlKX1gO1xuICB9XG5cbiAgLyoqIFJlbmRlcnMgYSBzdG9yZWQgZmlsdGVyIHZhbHVlIHRoZSB3YXkgaXQgd2FzIGNob3Nlbiwgbm90IGFzIHJhdyBkYXRhLiAqL1xuICBwcml2YXRlIGdldFZhbHVlTGFiZWwoXG4gICAgY29sdW1uOiBDb2x1bW5EZWZpbml0aW9uPFQ+LFxuICAgIHZhbHVlOiBGaWx0ZXJDb25kaXRpb25bJ3ZhbHVlJ11cbiAgKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gdmFsdWUudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdmFsdWUgPyAnWWVzJyA6ICdObyc7XG5cbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLm5vcm1hbGl6ZVZhbHVlT3B0aW9ucyhjb2x1bW4udmFsdWVPcHRpb25zKS5maW5kKFxuICAgICAgKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnZhbHVlID09PSB2YWx1ZVxuICAgICk7XG4gICAgcmV0dXJuIG9wdGlvbiA/IG9wdGlvbi5sYWJlbCA6IGAke3ZhbHVlfWA7XG4gIH1cblxuICBwcml2YXRlIGdldE9wZXJhdG9yTGFiZWwob3BlcmF0b3JWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBvcGVyYXRvciA9IFtcbiAgICAgIC4uLlNUUklOR19PUEVSQVRPUlMsXG4gICAgICAuLi5OVU1CRVJfT1BFUkFUT1JTLFxuICAgICAgLi4uREFURV9PUEVSQVRPUlMsXG4gICAgICAuLi5CT09MX09QRVJBVE9SUyxcbiAgICAgIC4uLkVOVU1fT1BFUkFUT1JTLFxuICAgIF0uZmluZCgob3ApID0+IG9wLnZhbHVlID09PSBvcGVyYXRvclZhbHVlKTtcbiAgICByZXR1cm4gb3BlcmF0b3IgPyBvcGVyYXRvci5sYWJlbC50b0xvd2VyQ2FzZSgpIDogb3BlcmF0b3JWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVmZXJzIHRoZSB0eXBlIGRlY2xhcmVkIG9uIHRoZSBjb2x1bW4sIGZhbGxpbmcgYmFjayB0byBpbnNwZWN0aW5nIHRoZSBkYXRhXG4gICAqIG9ubHkgd2hlbiB0aGUgaG9zdCBoYXMgbm90IGRlY2xhcmVkIG9uZS5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUNvbHVtblR5cGUoY29sdW1uOiBDb2x1bW5EZWZpbml0aW9uPFQ+KTogRmlsdGVyT3BlcmF0b3JUeXBlIHtcbiAgICBpZiAoY29sdW1uLnZhbHVlVHlwZSkge1xuICAgICAgLy8gQW4gRW51bSB3aXRoIG5vIGRlY2xhcmVkIG1lbWJlcnMgaGFzIG5vdGhpbmcgdG8gcG9wdWxhdGUgYSBkcm9wZG93blxuICAgICAgLy8gd2l0aCwgc28gaXQgZGVncmFkZXMgdG8gYSBmcmVlLXRleHQgZmlsdGVyIHJhdGhlciB0aGFuIGFuIGVtcHR5IHNlbGVjdC5cbiAgICAgIGlmIChcbiAgICAgICAgY29sdW1uLnZhbHVlVHlwZSA9PT0gQ29sdW1uVmFsdWVUeXBlLkVudW0gJiZcbiAgICAgICAgIXRoaXMubm9ybWFsaXplVmFsdWVPcHRpb25zKGNvbHVtbi52YWx1ZU9wdGlvbnMpLmxlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiAnc3RyaW5nJztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm1hcFZhbHVlVHlwZShjb2x1bW4udmFsdWVUeXBlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pbmZlckNvbHVtblR5cGUoY29sdW1uKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwVmFsdWVUeXBlKHZhbHVlVHlwZTogQ29sdW1uVmFsdWVUeXBlKTogRmlsdGVyT3BlcmF0b3JUeXBlIHtcbiAgICBzd2l0Y2ggKHZhbHVlVHlwZSkge1xuICAgICAgY2FzZSBDb2x1bW5WYWx1ZVR5cGUuRGF0ZTpcbiAgICAgICAgcmV0dXJuICdkYXRlJztcbiAgICAgIGNhc2UgQ29sdW1uVmFsdWVUeXBlLk51bWJlcjpcbiAgICAgIGNhc2UgQ29sdW1uVmFsdWVUeXBlLkludGVnZXI6XG4gICAgICBjYXNlIENvbHVtblZhbHVlVHlwZS5EZWNpbWFsOlxuICAgICAgY2FzZSBDb2x1bW5WYWx1ZVR5cGUuQ3VycmVuY3k6XG4gICAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICAgIGNhc2UgQ29sdW1uVmFsdWVUeXBlLkJvb2w6XG4gICAgICAgIHJldHVybiAnYm9vbCc7XG4gICAgICBjYXNlIENvbHVtblZhbHVlVHlwZS5FbnVtOlxuICAgICAgICByZXR1cm4gJ2VudW0nO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCZXN0LWVmZm9ydCB0eXBlIGRldGVjdGlvbiBmb3IgY29sdW1ucyB0aGF0IGRlY2xhcmUgbm8gYHZhbHVlVHlwZWAuIEZhbGxzXG4gICAqIGJhY2sgdG8gJ3N0cmluZycgcmF0aGVyIHRoYW4gbnVsbCBzbyB0aGUgdmFsdWUgZmllbGQgYWx3YXlzIHJlbmRlcnMuXG4gICAqL1xuICBwcml2YXRlIGluZmVyQ29sdW1uVHlwZShjb2x1bW46IENvbHVtbkRlZmluaXRpb248VD4pOiBGaWx0ZXJPcGVyYXRvclR5cGUge1xuICAgIGNvbnN0IHNhbXBsZVZhbHVlID0gdGhpcy5maXJzdE5vbkVtcHR5VmFsdWUoY29sdW1uKTtcblxuICAgIGlmIChzYW1wbGVWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiAnZGF0ZSc7XG4gICAgaWYgKHR5cGVvZiBzYW1wbGVWYWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiAnbnVtYmVyJztcbiAgICBpZiAodHlwZW9mIHNhbXBsZVZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiAnYm9vbCc7XG4gICAgaWYgKHR5cGVvZiBzYW1wbGVWYWx1ZSA9PT0gJ3N0cmluZycgJiYgdGhpcy5pc0RhdGVTdHJpbmcoc2FtcGxlVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ2RhdGUnO1xuICAgIH1cbiAgICByZXR1cm4gJ3N0cmluZyc7XG4gIH1cblxuICAvKipcbiAgICogU2NhbnMgcm93cyBmb3IgdGhlIGZpcnN0IHVzYWJsZSBzYW1wbGUg4oCUIHNhbXBsaW5nIG9ubHkgdGhlIGZpcnN0IHJvdyBtaXNzZXNcbiAgICogdGhlIHR5cGUgd2hlbmV2ZXIgdGhhdCByb3cgaGFwcGVucyB0byBob2xkIGEgbnVsbCBvciB1bmRlZmluZWQgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIGZpcnN0Tm9uRW1wdHlWYWx1ZShjb2x1bW46IENvbHVtbkRlZmluaXRpb248VD4pOiB1bmtub3duIHtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLmRhdGEgPz8gW10pIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWFkVmFsdWUoY29sdW1uLCByb3cpO1xuICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnKSByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkVmFsdWUoY29sdW1uOiBDb2x1bW5EZWZpbml0aW9uPFQ+LCByb3c6IFQpOiB1bmtub3duIHtcbiAgICBpZiAoY29sdW1uLmFjY2Vzc29yS2V5KSByZXR1cm4gcm93W2NvbHVtbi5hY2Nlc3NvcktleV07XG4gICAgaWYgKGNvbHVtbi5hY2Nlc3NvckZuKSByZXR1cm4gY29sdW1uLmFjY2Vzc29yRm4ocm93KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRlcyB1c3VhbGx5IGFycml2ZSBmcm9tIGFuIEFQSSBhcyBJU08gc3RyaW5ncywgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGJlXG4gICAqIHR5cGVkIGFzIHBsYWluIHRleHQuIEFuY2hvcmVkIHRvIElTTy1pc2ggaW5wdXQgc28gb3JkaW5hcnkgc3RyaW5ncyB0aGF0XG4gICAqIGBEYXRlYCBoYXBwZW5zIHRvIHBhcnNlIChlLmcuIFwiTWFyY2hcIikgYXJlIG5vdCBtaXNyZWFkIGFzIGRhdGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0RhdGVTdHJpbmcodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghL15cXGR7NH0tXFxkezJ9LVxcZHsyfShbVFxcc118JCkvLnRlc3QodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICFOdW1iZXIuaXNOYU4obmV3IERhdGUodmFsdWUpLmdldFRpbWUoKSk7XG4gIH1cblxuICAvKiogQWNjZXB0cyBlaXRoZXIgc3VwcG9ydGVkIGB2YWx1ZU9wdGlvbnNgIHNoYXBlIGFuZCByZXR1cm5zIG9uZSBvZiB0aGVtLiAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZVZhbHVlT3B0aW9ucyhcbiAgICBvcHRpb25zOiBzdHJpbmdbXSB8IENvbHVtblZhbHVlT3B0aW9uW10gfCB1bmRlZmluZWRcbiAgKTogQ29sdW1uVmFsdWVPcHRpb25bXSB7XG4gICAgaWYgKCFvcHRpb25zPy5sZW5ndGgpIHJldHVybiBbXTtcbiAgICByZXR1cm4gKG9wdGlvbnMgYXMgdW5rbm93bltdKS5tYXAoKG9wdGlvbikgPT5cbiAgICAgIHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnXG4gICAgICAgID8geyBsYWJlbDogb3B0aW9uLCB2YWx1ZTogb3B0aW9uIH1cbiAgICAgICAgOiAob3B0aW9uIGFzIENvbHVtblZhbHVlT3B0aW9uKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0Q3VycmVudEZpbHRlcigpIHtcbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXIgPSB7fTtcbiAgICB0aGlzLmF2YWlsYWJsZU9wZXJhdG9ycyA9IFtdO1xuICAgIHRoaXMuY3VycmVudENvbHVtblR5cGUgPSBudWxsO1xuICAgIHRoaXMudmFsdWVPcHRpb25zID0gW107XG4gIH1cblxuICByZXNldEFsbCgpIHtcbiAgICB0aGlzLnVzZXJUb3VjaGVkID0gdHJ1ZTtcbiAgICB0aGlzLnNhdmVkRmlsdGVycyA9IFtdO1xuICAgIHRoaXMucmVzZXRDdXJyZW50RmlsdGVyKCk7XG4gICAgdGhpcy5yZXNldEZpbHRlci5lbWl0KCk7XG4gIH1cblxuICBhcHBseUZpbHRlcnMoKSB7XG4gICAgdGhpcy51c2VyVG91Y2hlZCA9IHRydWU7XG4gICAgY29uc3QgYWN0aXZlRmlsdGVycyA9IHRoaXMuc2F2ZWRGaWx0ZXJzXG4gICAgICAuZmlsdGVyKChmaWx0ZXIpID0+IGZpbHRlci5zZWxlY3RlZClcbiAgICAgIC5tYXAoKHsgY29sdW1uSWQsIG9wZXJhdG9yLCB2YWx1ZSB9KSA9PiAoe1xuICAgICAgICBjb2x1bW5JZCxcbiAgICAgICAgb3BlcmF0b3IsXG4gICAgICAgIHZhbHVlLFxuICAgICAgfSkpO1xuICAgIHRoaXMuZmlsdGVyQXBwbGllZC5lbWl0KGFjdGl2ZUZpbHRlcnMpO1xuICB9XG5cbiAgZ2V0Q29sdW1uTGFiZWwoY29sdW1uSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5maWx0ZXJhYmxlQ29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5pZCA9PT0gY29sdW1uSWQpO1xuICAgIHJldHVybiBjb2x1bW5cbiAgICAgID8gdHlwZW9mIGNvbHVtbi5oZWFkZXIgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyBjb2x1bW4uaGVhZGVyKHt9KVxuICAgICAgICA6IGNvbHVtbi5oZWFkZXJcbiAgICAgIDogY29sdW1uSWQ7XG4gIH1cblxuICBnZXQgdmlzaWJsZUZpbHRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0FsbEZpbHRlcnNcbiAgICAgID8gdGhpcy5zYXZlZEZpbHRlcnNcbiAgICAgIDogdGhpcy5zYXZlZEZpbHRlcnMuc2xpY2UoMCwgdGhpcy5tYXhWaXNpYmxlSXRlbXMpO1xuICB9XG5cbiAgZ2V0IGFjdGl2ZUZpbHRlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2F2ZWRGaWx0ZXJzLmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIuc2VsZWN0ZWQpLmxlbmd0aDtcbiAgfVxufVxuIiwiPHZlcmJlbi1jYXJkXG4gIHdpZHRoPVwiMjRyZW1cIlxuICBib3JkZXJSYWRpdXM9XCIxcmVtXCJcbiAgW2JvcmRlcl09XCInMXB4IHNvbGlkIHZhcigtLXZibi1jb2xvci1wcmltYXJ5KSdcIlxuICBiZ0NvbG9yPVwidmFyKC0tdmJuLWNvbG9yLXN1cmZhY2UpXCJcbj5cbiAgPGRpdiBjYXJkLWhlYWRlciBjbGFzcz1cImNhcmQtaGVhZGVyXCI+XG4gICAgPGg0IGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+XG4gICAgICBGaWx0ZXIgPHN1cD4oe3sgYWN0aXZlRmlsdGVyQ291bnQgfX0pPC9zdXA+XG4gICAgPC9oND5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cInJlc2V0LWJ1dHRvblwiXG4gICAgICBbc3R5bGUuY29sb3JdPVwiJ3ZhcigtLXZibi1jb2xvci1ib3JkZXItZm9jdXMpJ1wiXG4gICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCIndHJhbnNwYXJlbnQnXCJcbiAgICAgIFtzdHlsZS5ib3JkZXJdPVwiJ25vbmUnXCJcbiAgICAgIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCJcbiAgICAgIFtzdHlsZS5mb250LXNpemVdPVwiJzEycHgnXCJcbiAgICAgIChjbGljayk9XCJyZXNldEFsbCgpXCJcbiAgICA+XG4gICAgICBSZXNldFxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNhcmQtYm9keSBjbGFzcz1cImNhcmQtYm9keVwiPlxuICAgIDwhLS0gU2F2ZWQgRmlsdGVycyBTZWN0aW9uIC0tPlxuICAgIDxzZWN0aW9uIGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxoMyBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj5GaWx0ZXJzPC9oMz5cbiAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICBpY29uPVwiaW5mb1wiXG4gICAgICAgICAgW3dpZHRoXT1cIjE1XCJcbiAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICBmaWxsPVwidmFyKC0tdmJuLWNvbG9yLXRleHQtbXV0ZWQpXCJcbiAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgdmlzaWJsZUZpbHRlcnNcIiBjbGFzcz1cIml0ZW1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tbGFiZWxcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJmaWx0ZXIuc2VsZWN0ZWRcIiAobmdNb2RlbENoYW5nZSk9XCJtYXJrVG91Y2hlZCgpXCIgLz5cbiAgICAgICAgICA8bGFiZWw+e3sgZ2V0RmlsdGVyRGVzY3JpcHRpb24oZmlsdGVyKSB9fTwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJzYXZlZEZpbHRlcnMubGVuZ3RoID4gbWF4VmlzaWJsZUl0ZW1zXCJcbiAgICAgICAgY2xhc3M9XCJzaG93LW1vcmVcIlxuICAgICAgICAoY2xpY2spPVwic2hvd0FsbEZpbHRlcnMgPSAhc2hvd0FsbEZpbHRlcnNcIlxuICAgICAgPlxuICAgICAgICB7eyBzaG93QWxsRmlsdGVycyA/IFwiU2hvdyBMZXNzXCIgOiBcIlNob3cgTW9yZVwiIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L3NlY3Rpb24+XG5cbiAgICA8aHIgY2xhc3M9XCJkaXZpZGVyXCIgLz5cblxuICAgIDwhLS0gTmV3IEZpbHRlciBPcGVyYXRpb24gLS0+XG4gICAgPHNlY3Rpb24gY2xhc3M9XCJzZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGgzIGNsYXNzPVwic2VjdGlvbi10aXRsZVwiPk9wZXJhdGlvbjwvaDM+XG4gICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgaWNvbj1cImluZm9cIlxuICAgICAgICAgIFt3aWR0aF09XCIxNVwiXG4gICAgICAgICAgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgZmlsbD1cInZhcigtLXZibi1jb2xvci10ZXh0LW11dGVkKVwiXG4gICAgICAgID48L3ZlcmJlbi1zdmc+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm9wZXJhdGlvbi1ncmlkXCI+XG4gICAgICAgIDwhLS0gQ29sdW1uIFNlbGVjdGlvbiAtLT5cbiAgICAgICAgPHZlcmJlbi1kcm9wLWRvd25cbiAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgIGhlaWdodD1cIjEuMDI1cmVtXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBjb2x1bW5cIlxuICAgICAgICAgIFtvcHRpb25zXT1cImZpbHRlcmFibGVDb2x1bW5zXCJcbiAgICAgICAgICBvcHRpb25MYWJlbD1cImhlYWRlclwiXG4gICAgICAgICAgb3B0aW9uVmFsdWU9XCJpZFwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RmlsdGVyLmNvbHVtbklkXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNvbHVtblNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgPjwvdmVyYmVuLWRyb3AtZG93bj5cblxuICAgICAgICA8IS0tIE9wZXJhdG9yIFNlbGVjdGlvbiAtLT5cbiAgICAgICAgPHZlcmJlbi1kcm9wLWRvd25cbiAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgIGhlaWdodD1cIjEuMDI1cmVtXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBvcGVyYXRvclwiXG4gICAgICAgICAgW29wdGlvbnNdPVwiYXZhaWxhYmxlT3BlcmF0b3JzXCJcbiAgICAgICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImN1cnJlbnRGaWx0ZXIub3BlcmF0b3JcIlxuICAgICAgICA+PC92ZXJiZW4tZHJvcC1kb3duPlxuXG4gICAgICAgIDwhLS0gVmFsdWUgSW5wdXQgYmFzZWQgb24gdHlwZSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY3VycmVudENvbHVtblR5cGVcIj5cbiAgICAgICAgICA8IS0tIERhdGUgUGlja2VyIC0tPlxuICAgICAgICAgIDxhcHAtZGF0ZS1waWNrZXJcbiAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgZGF0ZVwiXG4gICAgICAgICAgICBib3JkZXI9XCIxcHggc29saWQgdmFyKC0tdmJuLWNvbG9yLWJvcmRlcilcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICA+PC9hcHAtZGF0ZS1waWNrZXI+XG5cbiAgICAgICAgICA8IS0tIE51bWJlciBJbnB1dCAtLT5cbiAgICAgICAgICA8dmVyYmVuYS1pbnB1dFxuICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCJcbiAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgcGxhY2VIb2xkZXI9XCJFbnRlciBudW1iZXJcIlxuICAgICAgICAgICAgYm9yZGVyPVwiMXB4IHNvbGlkIHZhcigtLXZibi1jb2xvci1ib3JkZXIpXCJcbiAgICAgICAgICAgIGJvcmRlclJhZGl1cz1cIjVweFwiXG4gICAgICAgICAgICB0ZXh0Q29sb3I9XCJ2YXIoLS12Ym4tY29sb3ItdGV4dClcIlxuICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgIGhlaWdodD1cIjEuMDI1cmVtXCJcbiAgICAgICAgICAgIHBkPVwiMnB4IDZweFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImN1cnJlbnRGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgID48L3ZlcmJlbmEtaW5wdXQ+XG5cbiAgICAgICAgICA8IS0tIFllcyAvIE5vIFNlbGVjdGlvbiAtLT5cbiAgICAgICAgICA8dmVyYmVuLWRyb3AtZG93blxuICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidib29sJ1wiXG4gICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgaGVpZ2h0PVwiMS4wMjVyZW1cIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgdmFsdWVcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwidmFsdWVPcHRpb25zXCJcbiAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImN1cnJlbnRGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgID48L3ZlcmJlbi1kcm9wLWRvd24+XG5cbiAgICAgICAgICA8IS0tIEVudW0gTWVtYmVyIFNlbGVjdGlvbiAtLT5cbiAgICAgICAgICA8dmVyYmVuLWRyb3AtZG93blxuICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidlbnVtJ1wiXG4gICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgaGVpZ2h0PVwiMS4wMjVyZW1cIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgdmFsdWVcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwidmFsdWVPcHRpb25zXCJcbiAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImN1cnJlbnRGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgID48L3ZlcmJlbi1kcm9wLWRvd24+XG5cbiAgICAgICAgICA8IS0tIFRleHQgSW5wdXQgKGRlZmF1bHQpIC0tPlxuICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAqbmdTd2l0Y2hEZWZhdWx0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBwbGFjZUhvbGRlcj1cIkVudGVyIHRleHRcIlxuICAgICAgICAgICAgYm9yZGVyPVwiMXB4IHNvbGlkIHZhcigtLXZibi1jb2xvci1ib3JkZXIpXCJcbiAgICAgICAgICAgIGJvcmRlclJhZGl1cz1cIjVweFwiXG4gICAgICAgICAgICB0ZXh0Q29sb3I9XCJ2YXIoLS12Ym4tY29sb3ItdGV4dClcIlxuICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgIGhlaWdodD1cIjEuMDI1cmVtXCJcbiAgICAgICAgICAgIHBkPVwiMnB4IDZweFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImN1cnJlbnRGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgID48L3ZlcmJlbmEtaW5wdXQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJhZGQtYnV0dG9uIG1sLWF1dG9cIiAoY2xpY2spPVwiYWRkRmlsdGVyKClcIj4rIEFkZDwvYnV0dG9uPlxuICAgIDwvc2VjdGlvbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjYXJkLWZvb3RlciBjbGFzcz1cImNhcmQtZm9vdGVyXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImV4cG9ydC1idXR0b25cIiAoY2xpY2spPVwiYXBwbHlGaWx0ZXJzKClcIj5GaWx0ZXI8L2J1dHRvbj5cbiAgPC9kaXY+XG48L3ZlcmJlbi1jYXJkPlxuIl19
|
|
@@ -6,6 +6,7 @@ import { CardModule } from 'verben-ng-ui/src/lib/components/card';
|
|
|
6
6
|
import { DropDownModule } from 'verben-ng-ui/src/lib/components/drop-down';
|
|
7
7
|
import { TooltipModule } from 'verben-ng-ui/src/lib/components/tooltip';
|
|
8
8
|
import { VerbenaInputModule } from 'verben-ng-ui/src/lib/verbena-input';
|
|
9
|
+
import { DatePickerModule } from 'verben-ng-ui/src/lib/components/date-picker';
|
|
9
10
|
import { DataFilterComponent } from './data-filter.component';
|
|
10
11
|
import * as i0 from "@angular/core";
|
|
11
12
|
export class DataFilterModule {
|
|
@@ -17,7 +18,8 @@ export class DataFilterModule {
|
|
|
17
18
|
CardModule,
|
|
18
19
|
DropDownModule,
|
|
19
20
|
TooltipModule,
|
|
20
|
-
VerbenaInputModule
|
|
21
|
+
VerbenaInputModule,
|
|
22
|
+
DatePickerModule], exports: [DataFilterComponent] });
|
|
21
23
|
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataFilterModule, imports: [CommonModule,
|
|
22
24
|
FormsModule,
|
|
23
25
|
ReactiveFormsModule,
|
|
@@ -25,7 +27,8 @@ export class DataFilterModule {
|
|
|
25
27
|
CardModule,
|
|
26
28
|
DropDownModule,
|
|
27
29
|
TooltipModule,
|
|
28
|
-
VerbenaInputModule
|
|
30
|
+
VerbenaInputModule,
|
|
31
|
+
DatePickerModule] });
|
|
29
32
|
}
|
|
30
33
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataFilterModule, decorators: [{
|
|
31
34
|
type: NgModule,
|
|
@@ -40,8 +43,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImpo
|
|
|
40
43
|
DropDownModule,
|
|
41
44
|
TooltipModule,
|
|
42
45
|
VerbenaInputModule,
|
|
46
|
+
DatePickerModule,
|
|
43
47
|
],
|
|
44
48
|
exports: [DataFilterComponent],
|
|
45
49
|
}]
|
|
46
50
|
}] });
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1maWx0ZXIubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWZpbHRlci9kYXRhLWZpbHRlci5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFpQjlELE1BQU0sT0FBTyxnQkFBZ0I7d0dBQWhCLGdCQUFnQjt5R0FBaEIsZ0JBQWdCLGlCQWRaLG1CQUFtQixhQUVoQyxZQUFZO1lBQ1osV0FBVztZQUNYLG1CQUFtQjtZQUNuQixTQUFTO1lBQ1QsVUFBVTtZQUNWLGNBQWM7WUFDZCxhQUFhO1lBQ2Isa0JBQWtCO1lBQ2xCLGdCQUFnQixhQUVSLG1CQUFtQjt5R0FFbEIsZ0JBQWdCLFlBWnpCLFlBQVk7WUFDWixXQUFXO1lBQ1gsbUJBQW1CO1lBQ25CLFNBQVM7WUFDVCxVQUFVO1lBQ1YsY0FBYztZQUNkLGFBQWE7WUFDYixrQkFBa0I7WUFDbEIsZ0JBQWdCOzs0RkFJUCxnQkFBZ0I7a0JBZjVCLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLENBQUMsbUJBQW1CLENBQUM7b0JBQ25DLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixTQUFTO3dCQUNULFVBQVU7d0JBQ1YsY0FBYzt3QkFDZCxhQUFhO3dCQUNiLGtCQUFrQjt3QkFDbEIsZ0JBQWdCO3FCQUNqQjtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztpQkFDL0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3ZnTW9kdWxlIH0gZnJvbSAndmVyYmVuLW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9zdmcnO1xuaW1wb3J0IHsgQ2FyZE1vZHVsZSB9IGZyb20gJ3ZlcmJlbi1uZy11aS9zcmMvbGliL2NvbXBvbmVudHMvY2FyZCc7XG5pbXBvcnQgeyBEcm9wRG93bk1vZHVsZSB9IGZyb20gJ3ZlcmJlbi1uZy11aS9zcmMvbGliL2NvbXBvbmVudHMvZHJvcC1kb3duJztcbmltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICd2ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL3Rvb2x0aXAnO1xuaW1wb3J0IHsgVmVyYmVuYUlucHV0TW9kdWxlIH0gZnJvbSAndmVyYmVuLW5nLXVpL3NyYy9saWIvdmVyYmVuYS1pbnB1dCc7XG5pbXBvcnQgeyBEYXRlUGlja2VyTW9kdWxlIH0gZnJvbSAndmVyYmVuLW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9kYXRlLXBpY2tlcic7XG5pbXBvcnQgeyBEYXRhRmlsdGVyQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhLWZpbHRlci5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtEYXRhRmlsdGVyQ29tcG9uZW50XSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFN2Z01vZHVsZSxcbiAgICBDYXJkTW9kdWxlLFxuICAgIERyb3BEb3duTW9kdWxlLFxuICAgIFRvb2x0aXBNb2R1bGUsXG4gICAgVmVyYmVuYUlucHV0TW9kdWxlLFxuICAgIERhdGVQaWNrZXJNb2R1bGUsXG4gIF0sXG4gIGV4cG9ydHM6IFtEYXRhRmlsdGVyQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgRGF0YUZpbHRlck1vZHVsZSB7fVxuIl19
|
|
@@ -14,4 +14,12 @@ export const DATE_OPERATORS = [
|
|
|
14
14
|
{ label: 'Before', value: 'before', type: 'date' },
|
|
15
15
|
{ label: 'After', value: 'after', type: 'date' },
|
|
16
16
|
];
|
|
17
|
-
|
|
17
|
+
export const BOOL_OPERATORS = [
|
|
18
|
+
{ label: 'Is', value: 'is', type: 'bool' },
|
|
19
|
+
{ label: 'Is Not', value: 'isNot', type: 'bool' },
|
|
20
|
+
];
|
|
21
|
+
export const ENUM_OPERATORS = [
|
|
22
|
+
{ label: 'Is', value: 'is', type: 'enum' },
|
|
23
|
+
{ label: 'Is Not', value: 'isNot', type: 'enum' },
|
|
24
|
+
];
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1maWx0ZXIudHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtZmlsdGVyL2RhdGEtZmlsdGVyLnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWFBLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFxQjtJQUNoRCxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0lBQzdELEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7SUFDekQsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtJQUN4RCxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0NBQ3JELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBcUI7SUFDaEQsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtJQUNsRCxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0lBQy9ELEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7Q0FDMUQsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBcUI7SUFDOUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtJQUMxQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO0lBQ2xELEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7Q0FDakQsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBcUI7SUFDOUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtJQUMxQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO0NBQ2xELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQXFCO0lBQzlDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7SUFDMUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtDQUNsRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgRmlsdGVyT3BlcmF0b3JUeXBlID1cbiAgfCAnc3RyaW5nJ1xuICB8ICdudW1iZXInXG4gIHwgJ2RhdGUnXG4gIHwgJ2Jvb2wnXG4gIHwgJ2VudW0nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlck9wZXJhdG9yIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgdHlwZTogRmlsdGVyT3BlcmF0b3JUeXBlO1xufVxuXG5leHBvcnQgY29uc3QgU1RSSU5HX09QRVJBVE9SUzogRmlsdGVyT3BlcmF0b3JbXSA9IFtcbiAgeyBsYWJlbDogJ1N0YXJ0cyBXaXRoJywgdmFsdWU6ICdzdGFydHNXaXRoJywgdHlwZTogJ3N0cmluZycgfSxcbiAgeyBsYWJlbDogJ0VuZHMgV2l0aCcsIHZhbHVlOiAnZW5kc1dpdGgnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICB7IGxhYmVsOiAnQ29udGFpbnMnLCB2YWx1ZTogJ2NvbnRhaW5zJywgdHlwZTogJ3N0cmluZycgfSxcbiAgeyBsYWJlbDogJ0VxdWFscycsIHZhbHVlOiAnZXF1YWxzJywgdHlwZTogJ3N0cmluZycgfSxcbl07XG5cbmV4cG9ydCBjb25zdCBOVU1CRVJfT1BFUkFUT1JTOiBGaWx0ZXJPcGVyYXRvcltdID0gW1xuICB7IGxhYmVsOiAnRXF1YWwnLCB2YWx1ZTogJ2VxdWFsJywgdHlwZTogJ251bWJlcicgfSxcbiAgeyBsYWJlbDogJ0dyZWF0ZXIgVGhhbicsIHZhbHVlOiAnZ3JlYXRlclRoYW4nLCB0eXBlOiAnbnVtYmVyJyB9LFxuICB7IGxhYmVsOiAnTGVzcyBUaGFuJywgdmFsdWU6ICdsZXNzVGhhbicsIHR5cGU6ICdudW1iZXInIH0sXG5dO1xuXG5leHBvcnQgY29uc3QgREFURV9PUEVSQVRPUlM6IEZpbHRlck9wZXJhdG9yW10gPSBbXG4gIHsgbGFiZWw6ICdPbicsIHZhbHVlOiAnb24nLCB0eXBlOiAnZGF0ZScgfSxcbiAgeyBsYWJlbDogJ0JlZm9yZScsIHZhbHVlOiAnYmVmb3JlJywgdHlwZTogJ2RhdGUnIH0sXG4gIHsgbGFiZWw6ICdBZnRlcicsIHZhbHVlOiAnYWZ0ZXInLCB0eXBlOiAnZGF0ZScgfSxcbl07XG5cbmV4cG9ydCBjb25zdCBCT09MX09QRVJBVE9SUzogRmlsdGVyT3BlcmF0b3JbXSA9IFtcbiAgeyBsYWJlbDogJ0lzJywgdmFsdWU6ICdpcycsIHR5cGU6ICdib29sJyB9LFxuICB7IGxhYmVsOiAnSXMgTm90JywgdmFsdWU6ICdpc05vdCcsIHR5cGU6ICdib29sJyB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IEVOVU1fT1BFUkFUT1JTOiBGaWx0ZXJPcGVyYXRvcltdID0gW1xuICB7IGxhYmVsOiAnSXMnLCB2YWx1ZTogJ2lzJywgdHlwZTogJ2VudW0nIH0sXG4gIHsgbGFiZWw6ICdJcyBOb3QnLCB2YWx1ZTogJ2lzTm90JywgdHlwZTogJ2VudW0nIH0sXG5dO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckNvbmRpdGlvbiB7XG4gIGNvbHVtbklkOiBzdHJpbmc7XG4gIG9wZXJhdG9yOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJHcm91cCB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgY29uZGl0aW9uczogRmlsdGVyQ29uZGl0aW9uW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyU3RhdGUge1xuICBncm91cHM6IEZpbHRlckdyb3VwW107XG4gIGFjdGl2ZUZpbHRlcnM6IEZpbHRlckNvbmRpdGlvbltdO1xufVxuIl19
|