@valtimo/task-management 12.14.0 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/fesm2022/valtimo-task-management.mjs +144 -343
  2. package/fesm2022/valtimo-task-management.mjs.map +1 -1
  3. package/lib/components/index.d.ts +3 -4
  4. package/lib/components/index.d.ts.map +1 -1
  5. package/lib/components/task-management-column-modal/task-management-column-modal.component.d.ts +14 -14
  6. package/lib/components/task-management-column-modal/task-management-column-modal.component.d.ts.map +1 -1
  7. package/lib/components/task-management-columns/task-management-columns.component.d.ts +10 -12
  8. package/lib/components/task-management-columns/task-management-columns.component.d.ts.map +1 -1
  9. package/lib/components/task-management-detail/task-management-detail.component.d.ts +4 -15
  10. package/lib/components/task-management-detail/task-management-detail.component.d.ts.map +1 -1
  11. package/lib/components/task-management-search-fields/task-management-search-fields.component.d.ts +1 -1
  12. package/lib/components/task-management-search-fields/task-management-search-fields.component.d.ts.map +1 -1
  13. package/lib/components/task-management-search-fields-modal/task-management-search-fields-modal.component.d.ts +9 -11
  14. package/lib/components/task-management-search-fields-modal/task-management-search-fields-modal.component.d.ts.map +1 -1
  15. package/lib/services/task-management-api.service.d.ts +6 -5
  16. package/lib/services/task-management-api.service.d.ts.map +1 -1
  17. package/lib/services/task-management-search-fields.service.d.ts +3 -3
  18. package/lib/services/task-management-search-fields.service.d.ts.map +1 -1
  19. package/package.json +4 -6
  20. package/public_api.d.ts +0 -1
  21. package/public_api.d.ts.map +1 -1
  22. package/esm2022/lib/components/index.mjs +0 -21
  23. package/esm2022/lib/components/task-management/index.mjs +0 -17
  24. package/esm2022/lib/components/task-management/task-management.component.mjs +0 -73
  25. package/esm2022/lib/components/task-management-column-modal/index.mjs +0 -17
  26. package/esm2022/lib/components/task-management-column-modal/task-management-column-modal.component.mjs +0 -373
  27. package/esm2022/lib/components/task-management-columns/index.mjs +0 -17
  28. package/esm2022/lib/components/task-management-columns/task-management-columns.component.mjs +0 -218
  29. package/esm2022/lib/components/task-management-detail/index.mjs +0 -17
  30. package/esm2022/lib/components/task-management-detail/task-management-detail.component.mjs +0 -68
  31. package/esm2022/lib/components/task-management-search-fields/task-management-search-fields.component.mjs +0 -178
  32. package/esm2022/lib/components/task-management-search-fields-modal/task-management-search-fields-modal.component.mjs +0 -359
  33. package/esm2022/lib/models/index.mjs +0 -17
  34. package/esm2022/lib/models/task-management.model.mjs +0 -22
  35. package/esm2022/lib/services/index.mjs +0 -19
  36. package/esm2022/lib/services/task-management-api.service.mjs +0 -48
  37. package/esm2022/lib/services/task-management-search-fields.service.mjs +0 -47
  38. package/esm2022/lib/services/task-management.service.mjs +0 -36
  39. package/esm2022/lib/task-management-routing.module.mjs +0 -50
  40. package/esm2022/lib/task-management.module.mjs +0 -31
  41. package/esm2022/public_api.mjs +0 -23
  42. package/esm2022/valtimo-task-management.mjs +0 -5
  43. package/lib/components/task-management/index.d.ts +0 -2
  44. package/lib/components/task-management/index.d.ts.map +0 -1
  45. package/lib/components/task-management/task-management.component.d.ts +0 -20
  46. package/lib/components/task-management/task-management.component.d.ts.map +0 -1
  47. package/lib/components/task-management-column-modal/index.d.ts +0 -2
  48. package/lib/components/task-management-column-modal/index.d.ts.map +0 -1
  49. package/lib/components/task-management-columns/index.d.ts +0 -2
  50. package/lib/components/task-management-columns/index.d.ts.map +0 -1
  51. package/lib/components/task-management-detail/index.d.ts +0 -2
  52. package/lib/components/task-management-detail/index.d.ts.map +0 -1
  53. package/lib/task-management-routing.module.d.ts +0 -9
  54. package/lib/task-management-routing.module.d.ts.map +0 -1
  55. package/lib/task-management.module.d.ts +0 -9
  56. package/lib/task-management.module.d.ts.map +0 -1
@@ -1,359 +0,0 @@
1
- /*
2
- * Copyright 2015-2024 Ritense BV, the Netherlands.
3
- *
4
- * Licensed under EUPL, Version 1.2 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" basis,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import { CommonModule } from '@angular/common';
17
- import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core';
18
- import { ReactiveFormsModule, Validators, } from '@angular/forms';
19
- import { InformationFilled16, TrashCan16 } from '@carbon/icons';
20
- import { TranslateModule } from '@ngx-translate/core';
21
- import { CARBON_CONSTANTS, CarbonListModule, InputLabelModule, ValuePathSelectorComponent, ValuePathSelectorPrefix, ViewType, } from '@valtimo/components';
22
- import { TaskListSearchDropdownDataProvider, TaskListSearchFieldDataType, TaskListSearchFieldFieldType, TaskListSearchFieldMatchType, } from '@valtimo/task';
23
- import { ButtonModule, DropdownModule, IconModule, InputModule, ModalModule, } from 'carbon-components-angular';
24
- import { BehaviorSubject, combineLatest, distinctUntilChanged, filter, map, startWith, switchMap, } from 'rxjs';
25
- import * as i0 from "@angular/core";
26
- import * as i1 from "@valtimo/document";
27
- import * as i2 from "carbon-components-angular";
28
- import * as i3 from "@angular/forms";
29
- import * as i4 from "@ngx-translate/core";
30
- import * as i5 from "@angular/router";
31
- import * as i6 from "@angular/common";
32
- import * as i7 from "@valtimo/components";
33
- export class TaskManagementSearchFieldsModalComponent {
34
- set prefillData(value) {
35
- this._prefillData = value;
36
- this.setPrefilledForm(value);
37
- }
38
- get prefillData() {
39
- return this._prefillData;
40
- }
41
- get dataType() {
42
- return this.form.get('dataType');
43
- }
44
- get dataTypeValue$() {
45
- return this.dataType.valueChanges.pipe(startWith(this.dataType.value));
46
- }
47
- get matchType() {
48
- return this.form.get('matchType');
49
- }
50
- get matchTypeValue$() {
51
- return this.matchType.valueChanges.pipe(startWith(this.matchType.value));
52
- }
53
- get dropdownDataProvider() {
54
- return this.form.get('dropdownDataProvider');
55
- }
56
- get dropdownDataProviderValue$() {
57
- return this.dropdownDataProvider.valueChanges.pipe(startWith(this.dropdownDataProvider.value));
58
- }
59
- get fieldType() {
60
- return this.form.get('fieldType');
61
- }
62
- get fieldTypeValue$() {
63
- return this.fieldType.valueChanges.pipe(startWith(this.fieldType.value));
64
- }
65
- get keyValue() {
66
- const controlValue = this.form.get('key')?.value;
67
- return !controlValue ? null : controlValue;
68
- }
69
- get dataTypeValue() {
70
- const controlValue = this.form.get('dataType')?.value;
71
- this._dataTypeValue$.next(controlValue?.id);
72
- return !controlValue ? null : controlValue.id;
73
- }
74
- get fieldTypeValue() {
75
- const controlValue = this.form.get('fieldType')?.value;
76
- return !controlValue ? null : controlValue.id;
77
- }
78
- get dropdownDataProviderValue() {
79
- const controlValue = this.form.get('dropdownDataProvider')?.value;
80
- this._dropdownProviderValue$.next(controlValue?.id);
81
- return !controlValue ? null : controlValue.id;
82
- }
83
- get dropdownValuesArray() {
84
- const formArray = this.form.get('dropdownValues');
85
- return !formArray ? null : formArray;
86
- }
87
- constructor(documentService, iconService, fb, translateService, route) {
88
- this.documentService = documentService;
89
- this.iconService = iconService;
90
- this.fb = fb;
91
- this.translateService = translateService;
92
- this.route = route;
93
- this.closeEvent = new EventEmitter();
94
- this.form = this.fb.group({
95
- key: this.fb.control('', Validators.required),
96
- title: this.fb.control('', Validators.required),
97
- path: this.fb.control('', Validators.required),
98
- dataType: this.fb.control(null, Validators.required),
99
- matchType: this.fb.control(null, this.matchTypeValidator),
100
- fieldType: this.fb.control(null, Validators.required),
101
- dropdownDataProvider: this.fb.control(null),
102
- dropdownValues: this.fb.array([]),
103
- });
104
- this.TaskListSearchFieldDataType = TaskListSearchFieldDataType;
105
- this.TaskListSearchFieldFieldType = TaskListSearchFieldFieldType;
106
- this.TaskListSearchDropdownDataProvider = TaskListSearchDropdownDataProvider;
107
- this.DROPDOWN_FIELDS = [
108
- {
109
- key: 'key',
110
- label: 'searchFieldsOverview.key',
111
- viewType: ViewType.TEXT,
112
- },
113
- {
114
- key: 'value',
115
- label: 'searchFieldsOverview.text',
116
- viewType: ViewType.TEXT,
117
- },
118
- ];
119
- this._dataTypeValue$ = new BehaviorSubject(null);
120
- this._dropdownProviderValue$ = new BehaviorSubject(null);
121
- this.dropdownReadonlyItems$ = this._dropdownProviderValue$.pipe(distinctUntilChanged(), filter(val => !!val && val === TaskListSearchDropdownDataProvider.JSON), switchMap((provider) => this.documentService.getDropdownData(provider ?? '', this.documentDefinitionName ?? '', this.keyValue ?? '')), map(dropdownData => dropdownData ? Object.entries(dropdownData).map(([key, value]) => ({ key, value })) : []));
122
- this.dataTypeItems$ = combineLatest([
123
- this.dataTypeValue$,
124
- this.translateService.stream('key'),
125
- ]).pipe(map(([dataTypeValue]) => [
126
- {
127
- content: this.translateService.instant('searchFields.text'),
128
- id: TaskListSearchFieldDataType.TEXT,
129
- },
130
- {
131
- content: this.translateService.instant('searchFields.boolean'),
132
- id: TaskListSearchFieldDataType.BOOLEAN,
133
- },
134
- {
135
- content: this.translateService.instant('searchFields.date'),
136
- id: TaskListSearchFieldDataType.DATE,
137
- },
138
- {
139
- content: this.translateService.instant('searchFields.datetime'),
140
- id: TaskListSearchFieldDataType.DATETIME,
141
- },
142
- {
143
- content: this.translateService.instant('searchFields.number'),
144
- id: TaskListSearchFieldDataType.NUMBER,
145
- },
146
- {
147
- content: this.translateService.instant('searchFields.time'),
148
- id: TaskListSearchFieldDataType.TIME,
149
- },
150
- ].map(item => ({ ...item, selected: item.id === dataTypeValue?.id }))));
151
- this.fieldTypeItems$ = combineLatest([
152
- this._dataTypeValue$.pipe(distinctUntilChanged()),
153
- this.fieldTypeValue$,
154
- this.translateService.stream('key'),
155
- ]).pipe(map(([dataTypeValue, fieldTypeValue]) => [
156
- {
157
- content: this.translateService.instant('searchFieldsOverview.single'),
158
- id: TaskListSearchFieldFieldType.SINGLE,
159
- },
160
- {
161
- content: this.translateService.instant('searchFieldsOverview.range'),
162
- id: TaskListSearchFieldFieldType.RANGE,
163
- },
164
- ...(dataTypeValue === TaskListSearchFieldDataType.TEXT
165
- ? [
166
- {
167
- content: this.translateService.instant('searchFieldsOverview.single-select-dropdown'),
168
- id: TaskListSearchFieldFieldType.SINGLE_SELECT_DROPDOWN,
169
- },
170
- {
171
- content: this.translateService.instant('searchFieldsOverview.multi-select-dropdown'),
172
- id: TaskListSearchFieldFieldType.MULTI_SELECT_DROPDOWN,
173
- },
174
- ]
175
- : []),
176
- ].map(item => ({ ...item, selected: item.id === fieldTypeValue?.id }))));
177
- this.dataProviderItems$ = this.translateService
178
- .stream('key')
179
- .pipe(switchMap(() => this.dropdownDataProviderValue$), map(dataProviderValue => [
180
- {
181
- content: this.translateService.instant('searchFieldsOverview.dropdownDatabaseDataProvider'),
182
- id: TaskListSearchDropdownDataProvider.DATABASE,
183
- },
184
- {
185
- content: this.translateService.instant('searchFieldsOverview.dropdownJsonFileDataProvider'),
186
- id: TaskListSearchDropdownDataProvider.JSON,
187
- },
188
- ].map(item => ({ ...item, selected: item.id === dataProviderValue?.id }))));
189
- this.matchTypeItems$ = this.translateService
190
- .stream('key')
191
- .pipe(switchMap(() => this.matchTypeValue$), map(matchTypeValue => [
192
- {
193
- content: this.translateService.instant('searchFieldsOverview.like'),
194
- id: TaskListSearchFieldMatchType.LIKE,
195
- },
196
- {
197
- content: this.translateService.instant('searchFieldsOverview.exact'),
198
- id: TaskListSearchFieldMatchType.EXACT,
199
- },
200
- ].map(item => ({ ...item, selected: item.id === matchTypeValue?.id }))));
201
- this.documentDefinitionName$ = this.route.params.pipe(map(params => params.name || ''), filter(docDefName => !!docDefName));
202
- this.ValuePathSelectorPrefix = ValuePathSelectorPrefix;
203
- this.iconService.registerAll([TrashCan16, InformationFilled16]);
204
- }
205
- ngOnInit() {
206
- this.form.setValidators([this.dropdownDataProviderValidator, this.dropdownValuesValidator]);
207
- }
208
- addDropdownValue(prefillValue) {
209
- if (!this.dropdownValuesArray)
210
- return;
211
- this.dropdownValuesArray.push(this.fb.group({
212
- key: this.fb.control(prefillValue?.key ?? '', Validators.required),
213
- value: this.fb.control(prefillValue?.value ?? '', Validators.required),
214
- }));
215
- }
216
- removeDropdownValue(index) {
217
- if (!this.dropdownValuesArray)
218
- return;
219
- this.dropdownValuesArray.removeAt(index);
220
- }
221
- onCancel() {
222
- this.closeEvent.emit(null);
223
- this.resetForm();
224
- }
225
- onSave() {
226
- const groupValue = this.form.getRawValue();
227
- this.closeEvent.emit({
228
- ...(groupValue.title && { title: groupValue.title }),
229
- ...(groupValue.key && { key: groupValue.key }),
230
- ...(groupValue.path && { path: groupValue.path }),
231
- ...(groupValue.dataType?.content && { dataType: groupValue.dataType.id }),
232
- ...(groupValue.matchType?.content && { matchType: groupValue.matchType.id }),
233
- ...(groupValue.fieldType?.content && { fieldType: groupValue.fieldType.id }),
234
- ...(groupValue.dropdownDataProvider?.content && {
235
- dropdownDataProvider: groupValue.dropdownDataProvider.id,
236
- }),
237
- ...(groupValue.dropdownValues && {
238
- dropdownValues: groupValue.dropdownValues.reduce((acc, curr) => ({ ...acc, ...(!!curr?.key && { [curr.key]: curr.value }) }), {}),
239
- }),
240
- });
241
- this.resetForm();
242
- }
243
- setPrefilledForm(prefillData) {
244
- if (!prefillData)
245
- return;
246
- this.form.patchValue({
247
- ...prefillData,
248
- dataType: !prefillData.dataType
249
- ? null
250
- : {
251
- content: prefillData.dataType,
252
- id: prefillData.dataType,
253
- selected: true,
254
- },
255
- matchType: !prefillData.matchType
256
- ? null
257
- : {
258
- content: prefillData.matchType,
259
- id: prefillData.matchType,
260
- selected: true,
261
- },
262
- fieldType: !prefillData.fieldType
263
- ? null
264
- : {
265
- content: prefillData.fieldType,
266
- id: prefillData.fieldType,
267
- selected: true,
268
- },
269
- dropdownDataProvider: !prefillData.dropdownDataProvider
270
- ? null
271
- : {
272
- content: prefillData.dropdownDataProvider,
273
- id: prefillData.dropdownDataProvider,
274
- selected: true,
275
- },
276
- dropdownValues: [],
277
- });
278
- if (prefillData.dropdownDataProvider && prefillData.dropdownValues)
279
- this.setPrefilledDropdownValues(prefillData.dropdownValues);
280
- this.form.get('key')?.disable();
281
- }
282
- setPrefilledDropdownValues(dropdownValue) {
283
- if (!this.dropdownValuesArray || !this.dropdownDataProviderValue)
284
- return;
285
- Object.entries(dropdownValue).forEach(([key, value]) => {
286
- this.addDropdownValue({ key, value });
287
- });
288
- }
289
- matchTypeValidator(control) {
290
- const controlValue = control.value;
291
- const dataTypeControlValue = control.parent?.get('dataType')?.value;
292
- if (dataTypeControlValue?.id === TaskListSearchFieldDataType.TEXT &&
293
- (!controlValue || !controlValue.selected))
294
- return { error: 'Match type not selected' };
295
- return null;
296
- }
297
- dropdownDataProviderValidator(group) {
298
- const controlValue = group.get('dropdownDataProvider')?.value;
299
- const fieldTypeControlValue = group.get('fieldType')?.value;
300
- if ([
301
- TaskListSearchFieldFieldType.SINGLE_SELECT_DROPDOWN,
302
- TaskListSearchFieldFieldType.MULTI_SELECT_DROPDOWN,
303
- ].includes(fieldTypeControlValue?.id) &&
304
- !controlValue)
305
- return { error: 'Dropdown source provider is not specified' };
306
- return null;
307
- }
308
- dropdownValuesValidator(group) {
309
- const controlValue = group.get('dropdownValues')?.value;
310
- const fieldTypeControlValue = group.get('fieldType')?.value?.id;
311
- const dropdownProviderValue = group.get('dropdownDataProvider')?.value?.id;
312
- if ([
313
- TaskListSearchFieldFieldType.SINGLE_SELECT_DROPDOWN,
314
- TaskListSearchFieldFieldType.MULTI_SELECT_DROPDOWN,
315
- ].includes(fieldTypeControlValue) &&
316
- (!controlValue || controlValue?.length === 0) &&
317
- dropdownProviderValue === TaskListSearchDropdownDataProvider.DATABASE)
318
- return { error: 'Dropdown source provider is not specified or is empty' };
319
- return null;
320
- }
321
- resetForm() {
322
- setTimeout(() => {
323
- while (!!this.dropdownValuesArray?.length) {
324
- this.dropdownValuesArray.removeAt(0);
325
- }
326
- this.form.reset();
327
- this.form.enable();
328
- }, CARBON_CONSTANTS.modalAnimationMs);
329
- }
330
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskManagementSearchFieldsModalComponent, deps: [{ token: i1.DocumentService }, { token: i2.IconService }, { token: i3.FormBuilder }, { token: i4.TranslateService }, { token: i5.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
331
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: TaskManagementSearchFieldsModalComponent, isStandalone: true, selector: "valtimo-task-management-search-fields-modal", inputs: { open: "open", documentDefinitionName: "documentDefinitionName", prefillData: "prefillData" }, outputs: { closeEvent: "closeEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n<cds-modal [open]=\"open\" showFooter=\"true\">\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"onCancel()\">\n <h3 cdsModalHeaderHeading>\n {{ (!prefillData ? 'searchFieldsOverview.add' : 'searchFieldsOverview.edit') | translate }}\n </h3>\n </cds-modal-header>\n\n <section cdsModalContent>\n <form [formGroup]=\"form\" class=\"valtimo-task-management-search-fields-modal__content\">\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.title' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.title' | translate\"\n >\n </v-input-label>\n\n <input\n data-testid=\"task-management-search-title\"\n cdsText\n type=\"text\"\n formControlName=\"title\"\n />\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.key' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.key' | translate\"\n >\n </v-input-label>\n\n <input data-testid=\"task-management-search-key\" cdsText type=\"text\" formControlName=\"key\" />\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.path' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.path' | translate\"\n >\n </v-input-label>\n\n <valtimo-value-path-selector\n formControlName=\"path\"\n [documentDefinitionName]=\"documentDefinitionName$ | async\"\n [prefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n ></valtimo-value-path-selector>\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.dataType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dataType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown data-testid=\"task-management-search-dataType\" formControlName=\"dataType\">\n <cds-dropdown-list [items]=\"dataTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (dataTypeValue === TaskListSearchFieldDataType.TEXT) {\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.matchType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.matchType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown data-testid=\"task-management-search-matchType\" formControlName=\"matchType\">\n <cds-dropdown-list [items]=\"matchTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n }\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.fieldType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.fieldType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown data-testid=\"task-management-search-fieldType\" formControlName=\"fieldType\">\n <cds-dropdown-list [items]=\"fieldTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (\n dataTypeValue === TaskListSearchFieldDataType.TEXT &&\n (fieldTypeValue === TaskListSearchFieldFieldType.SINGLE_SELECT_DROPDOWN ||\n fieldTypeValue === TaskListSearchFieldFieldType.MULTI_SELECT_DROPDOWN)\n ) {\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.dropdownDataProvider' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownDataProvider' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown\n data-testid=\"task-management-search-dropdownDataProvider\"\n formControlName=\"dropdownDataProvider\"\n >\n <cds-dropdown-list [items]=\"dataProviderItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (dropdownDataProviderValue === TaskListSearchDropdownDataProvider.DATABASE) {\n <div\n class=\"valtimo-task-management-search-fields-modal__list\"\n formArrayName=\"dropdownValues\"\n >\n <v-input-label\n [title]=\"'searchFieldsOverview.dropdownListValues' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownListValues' | translate\"\n [noMargin]=\"true\"\n >\n </v-input-label>\n\n @for (dropdownValue of dropdownValuesArray?.controls; track $index) {\n <form\n [formGroup]=\"dropdownValue\"\n class=\"valtimo-task-management-search-fields-modal__dropdown-values\"\n >\n <cds-text-label>\n {{ 'interface.value' | translate }}\n\n <input\n data-testid=\"task-management-search-dropdownKey\"\n cdsText\n type=\"text\"\n formControlName=\"key\"\n />\n </cds-text-label>\n\n <cds-text-label>\n {{ 'interface.display' | translate }}\n\n <input\n data-testid=\"task-management-search-dropdownValue\"\n cdsText\n type=\"text\"\n formControlName=\"value\"\n />\n </cds-text-label>\n\n <button\n cdsButton=\"danger\"\n data-testid=\"task-management-search-deleteEnum\"\n [disabled]=\"$count === 1\"\n [iconOnly]=\"true\"\n (click)=\"removeDropdownValue($index)\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </form>\n }\n\n <button\n data-testid=\"task-management-search-addDropdownValue\"\n cdsButton=\"primary\"\n (click)=\"addDropdownValue()\"\n >\n {{ 'interface.addRow' | translate }}\n\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n </div>\n } @else if (dropdownDataProviderValue === TaskListSearchDropdownDataProvider.JSON) {\n <valtimo-carbon-list\n [header]=\"false\"\n [hideToolbar]=\"true\"\n [fields]=\"DROPDOWN_FIELDS\"\n [items]=\"dropdownReadonlyItems$ | async\"\n ></valtimo-carbon-list>\n }\n }\n </form>\n </section>\n\n <cds-modal-footer>\n <button data-testid=\"task-management-search-cancel\" cdsButton=\"ghost\" (click)=\"onCancel()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button\n data-testid=\"task-management-search-save\"\n cdsButton=\"primary\"\n [disabled]=\"form.invalid\"\n (click)=\"onSave()\"\n >\n {{ 'interface.save' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n", styles: [".valtimo-task-management-search-fields-modal__content,.valtimo-task-management-search-fields-modal__dropdown-values{display:flex;gap:16px}.valtimo-task-management-search-fields-modal__content{flex-direction:column}.valtimo-task-management-search-fields-modal__dropdown-values{align-items:flex-end;gap:16px}.valtimo-task-management-search-fields-modal__label{display:flex;gap:4px}.valtimo-task-management-search-fields-modal__list{display:flex;flex-direction:column;gap:16px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i2.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "hideLabel", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i2.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "ngmodule", type: InputModule }, { kind: "component", type: i2.TextInputLabelComponent, selector: "cds-text-label, ibm-text-label", inputs: ["labelInputID", "disabled", "skeleton", "labelTemplate", "textInputTemplate", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i2.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "ngmodule", type: ModalModule }, { kind: "component", type: i2.Modal, selector: "cds-modal, ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i2.ModalHeader, selector: "cds-modal-header, ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i2.ModalFooter, selector: "cds-modal-footer, ibm-modal-footer" }, { kind: "directive", type: i2.ModalContent, selector: "[cdsModalContent], [ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i2.ModalHeaderHeading, selector: "[cdsModalHeaderHeading], [ibmModalHeaderHeading]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: IconModule }, { kind: "directive", type: i2.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "ngmodule", type: CarbonListModule }, { kind: "component", type: i7.CarbonListComponent, selector: "valtimo-carbon-list", inputs: ["items", "fields", "tableTranslations", "paginatorConfig", "pagination", "loading", "actions", "actionItems", "header", "hideColumnHeader", "initialSortState", "sortState", "isSearchable", "enableSingleSelection", "lastColumnTemplate", "paginationIdentifier", "showSelectionColumn", "striped", "hideToolbar", "lockedTooltipTranslationKey", "movingRowsEnabled", "dragAndDrop", "dragAndDropDisabled"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged", "moveRow", "itemsReordered"] }, { kind: "ngmodule", type: InputLabelModule }, { kind: "component", type: i7.InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }, { kind: "component", type: ValuePathSelectorComponent, selector: "valtimo-value-path-selector", inputs: ["name", "appendInline", "margin", "marginLg", "marginXl", "disabled", "documentDefinitionName", "version", "prefixes", "label", "tooltip", "required", "showDocumentDefinitionSelector", "notation", "defaultValue", "type", "parentItem"], outputs: ["valueChangeEvent", "collectionSelected"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
332
- }
333
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskManagementSearchFieldsModalComponent, decorators: [{
334
- type: Component,
335
- args: [{ selector: 'valtimo-task-management-search-fields-modal', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
336
- CommonModule,
337
- TranslateModule,
338
- ButtonModule,
339
- DropdownModule,
340
- InputModule,
341
- ModalModule,
342
- ReactiveFormsModule,
343
- IconModule,
344
- CarbonListModule,
345
- InputLabelModule,
346
- ValuePathSelectorComponent,
347
- ], template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n<cds-modal [open]=\"open\" showFooter=\"true\">\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"onCancel()\">\n <h3 cdsModalHeaderHeading>\n {{ (!prefillData ? 'searchFieldsOverview.add' : 'searchFieldsOverview.edit') | translate }}\n </h3>\n </cds-modal-header>\n\n <section cdsModalContent>\n <form [formGroup]=\"form\" class=\"valtimo-task-management-search-fields-modal__content\">\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.title' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.title' | translate\"\n >\n </v-input-label>\n\n <input\n data-testid=\"task-management-search-title\"\n cdsText\n type=\"text\"\n formControlName=\"title\"\n />\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.key' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.key' | translate\"\n >\n </v-input-label>\n\n <input data-testid=\"task-management-search-key\" cdsText type=\"text\" formControlName=\"key\" />\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.path' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.path' | translate\"\n >\n </v-input-label>\n\n <valtimo-value-path-selector\n formControlName=\"path\"\n [documentDefinitionName]=\"documentDefinitionName$ | async\"\n [prefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n ></valtimo-value-path-selector>\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.dataType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dataType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown data-testid=\"task-management-search-dataType\" formControlName=\"dataType\">\n <cds-dropdown-list [items]=\"dataTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (dataTypeValue === TaskListSearchFieldDataType.TEXT) {\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.matchType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.matchType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown data-testid=\"task-management-search-matchType\" formControlName=\"matchType\">\n <cds-dropdown-list [items]=\"matchTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n }\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.fieldType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.fieldType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown data-testid=\"task-management-search-fieldType\" formControlName=\"fieldType\">\n <cds-dropdown-list [items]=\"fieldTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (\n dataTypeValue === TaskListSearchFieldDataType.TEXT &&\n (fieldTypeValue === TaskListSearchFieldFieldType.SINGLE_SELECT_DROPDOWN ||\n fieldTypeValue === TaskListSearchFieldFieldType.MULTI_SELECT_DROPDOWN)\n ) {\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.dropdownDataProvider' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownDataProvider' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown\n data-testid=\"task-management-search-dropdownDataProvider\"\n formControlName=\"dropdownDataProvider\"\n >\n <cds-dropdown-list [items]=\"dataProviderItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (dropdownDataProviderValue === TaskListSearchDropdownDataProvider.DATABASE) {\n <div\n class=\"valtimo-task-management-search-fields-modal__list\"\n formArrayName=\"dropdownValues\"\n >\n <v-input-label\n [title]=\"'searchFieldsOverview.dropdownListValues' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownListValues' | translate\"\n [noMargin]=\"true\"\n >\n </v-input-label>\n\n @for (dropdownValue of dropdownValuesArray?.controls; track $index) {\n <form\n [formGroup]=\"dropdownValue\"\n class=\"valtimo-task-management-search-fields-modal__dropdown-values\"\n >\n <cds-text-label>\n {{ 'interface.value' | translate }}\n\n <input\n data-testid=\"task-management-search-dropdownKey\"\n cdsText\n type=\"text\"\n formControlName=\"key\"\n />\n </cds-text-label>\n\n <cds-text-label>\n {{ 'interface.display' | translate }}\n\n <input\n data-testid=\"task-management-search-dropdownValue\"\n cdsText\n type=\"text\"\n formControlName=\"value\"\n />\n </cds-text-label>\n\n <button\n cdsButton=\"danger\"\n data-testid=\"task-management-search-deleteEnum\"\n [disabled]=\"$count === 1\"\n [iconOnly]=\"true\"\n (click)=\"removeDropdownValue($index)\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </form>\n }\n\n <button\n data-testid=\"task-management-search-addDropdownValue\"\n cdsButton=\"primary\"\n (click)=\"addDropdownValue()\"\n >\n {{ 'interface.addRow' | translate }}\n\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n </div>\n } @else if (dropdownDataProviderValue === TaskListSearchDropdownDataProvider.JSON) {\n <valtimo-carbon-list\n [header]=\"false\"\n [hideToolbar]=\"true\"\n [fields]=\"DROPDOWN_FIELDS\"\n [items]=\"dropdownReadonlyItems$ | async\"\n ></valtimo-carbon-list>\n }\n }\n </form>\n </section>\n\n <cds-modal-footer>\n <button data-testid=\"task-management-search-cancel\" cdsButton=\"ghost\" (click)=\"onCancel()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button\n data-testid=\"task-management-search-save\"\n cdsButton=\"primary\"\n [disabled]=\"form.invalid\"\n (click)=\"onSave()\"\n >\n {{ 'interface.save' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n", styles: [".valtimo-task-management-search-fields-modal__content,.valtimo-task-management-search-fields-modal__dropdown-values{display:flex;gap:16px}.valtimo-task-management-search-fields-modal__content{flex-direction:column}.valtimo-task-management-search-fields-modal__dropdown-values{align-items:flex-end;gap:16px}.valtimo-task-management-search-fields-modal__label{display:flex;gap:4px}.valtimo-task-management-search-fields-modal__list{display:flex;flex-direction:column;gap:16px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
348
- }], ctorParameters: () => [{ type: i1.DocumentService }, { type: i2.IconService }, { type: i3.FormBuilder }, { type: i4.TranslateService }, { type: i5.ActivatedRoute }], propDecorators: { open: [{
349
- type: Input,
350
- args: [{ required: true }]
351
- }], documentDefinitionName: [{
352
- type: Input,
353
- args: [{ required: true }]
354
- }], prefillData: [{
355
- type: Input
356
- }], closeEvent: [{
357
- type: Output
358
- }] } });
359
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrLW1hbmFnZW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL3Rhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsL3Rhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vdGFzay1tYW5hZ2VtZW50L3NyYy9saWIvY29tcG9uZW50cy90YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbC90YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBSUwsbUJBQW1CLEVBRW5CLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFDLGVBQWUsRUFBbUIsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUVoQixnQkFBZ0IsRUFDaEIsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2QixRQUFRLEdBQ1QsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBQ0wsa0NBQWtDLEVBR2xDLDJCQUEyQixFQUMzQiw0QkFB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QWdCLENBQUMsQ0FBQztJQUN4QyxDQUFDOytHQXJaVSx3Q0FBd0M7bUdBQXhDLHdDQUF3QyxzUEM3RnJELGc4UEFpTkEsbXBDRGpJSSxZQUFZLG1GQUNaLGVBQWUsMkZBQ2YsWUFBWSxnTUFDWixjQUFjLGdzQkFDZCxXQUFXLDJhQUNYLFdBQVcsK3NCQUNYLG1CQUFtQixtakNBQ25CLFVBQVUsNE5BQ1YsZ0JBQWdCLGtvQkFDaEIsZ0JBQWdCLHVQQUNoQiwwQkFBMEI7OzRGQUdqQix3Q0FBd0M7a0JBcEJwRCxTQUFTOytCQUNFLDZDQUE2QyxtQkFHdEMsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixlQUFlO3dCQUNmLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxXQUFXO3dCQUNYLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixVQUFVO3dCQUNWLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3dCQUNoQiwwQkFBMEI7cUJBQzNCO29NQUd3QixJQUFJO3NCQUE1QixLQUFLO3VCQUFDLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQztnQkFDRSxzQkFBc0I7c0JBQTlDLEtBQUs7dUJBQUMsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDO2dCQUdILFdBQVc7c0JBQTlCLEtBQUs7Z0JBT0ksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgRm9ybUFycmF5LFxuICBGb3JtQnVpbGRlcixcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtJbmZvcm1hdGlvbkZpbGxlZDE2LCBUcmFzaENhbjE2fSBmcm9tICdAY2FyYm9uL2ljb25zJztcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7XG4gIENBUkJPTl9DT05TVEFOVFMsXG4gIENhcmJvbkxpc3RNb2R1bGUsXG4gIENvbHVtbkNvbmZpZyxcbiAgSW5wdXRMYWJlbE1vZHVsZSxcbiAgVmFsdWVQYXRoU2VsZWN0b3JDb21wb25lbnQsXG4gIFZhbHVlUGF0aFNlbGVjdG9yUHJlZml4LFxuICBWaWV3VHlwZSxcbn0gZnJvbSAnQHZhbHRpbW8vY29tcG9uZW50cyc7XG5pbXBvcnQge0RvY3VtZW50U2VydmljZX0gZnJvbSAnQHZhbHRpbW8vZG9jdW1lbnQnO1xuaW1wb3J0IHtcbiAgVGFza0xpc3RTZWFyY2hEcm9wZG93bkRhdGFQcm92aWRlcixcbiAgVGFza0xpc3RTZWFyY2hEcm9wZG93blZhbHVlLFxuICBUYXNrTGlzdFNlYXJjaEZpZWxkLFxuICBUYXNrTGlzdFNlYXJjaEZpZWxkRGF0YVR5cGUsXG4gIFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUsXG4gIFRhc2tMaXN0U2VhcmNoRmllbGRNYXRjaFR5cGUsXG59IGZyb20gJ0B2YWx0aW1vL3Rhc2snO1xuaW1wb3J0IHtcbiAgQnV0dG9uTW9kdWxlLFxuICBEcm9wZG93bk1vZHVsZSxcbiAgSWNvbk1vZHVsZSxcbiAgSWNvblNlcnZpY2UsXG4gIElucHV0TW9kdWxlLFxuICBMaXN0SXRlbSxcbiAgTW9kYWxNb2R1bGUsXG59IGZyb20gJ2NhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXInO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIE9ic2VydmFibGUsXG4gIHN0YXJ0V2l0aCxcbiAgc3dpdGNoTWFwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbHRpbW8tdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWwuY29tcG9uZW50LnNjc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIERyb3Bkb3duTW9kdWxlLFxuICAgIElucHV0TW9kdWxlLFxuICAgIE1vZGFsTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgSWNvbk1vZHVsZSxcbiAgICBDYXJib25MaXN0TW9kdWxlLFxuICAgIElucHV0TGFiZWxNb2R1bGUsXG4gICAgVmFsdWVQYXRoU2VsZWN0b3JDb21wb25lbnQsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFRhc2tNYW5hZ2VtZW50U2VhcmNoRmllbGRzTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoe3JlcXVpcmVkOiB0cnVlfSkgb3BlbjogYm9vbGVhbjtcbiAgQElucHV0KHtyZXF1aXJlZDogdHJ1ZX0pIGRvY3VtZW50RGVmaW5pdGlvbk5hbWU6IHN0cmluZztcblxuICBwcml2YXRlIF9wcmVmaWxsRGF0YTogVGFza0xpc3RTZWFyY2hGaWVsZCB8IG51bGw7XG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgcHJlZmlsbERhdGEodmFsdWU6IFRhc2tMaXN0U2VhcmNoRmllbGQgfCBudWxsKSB7XG4gICAgdGhpcy5fcHJlZmlsbERhdGEgPSB2YWx1ZTtcbiAgICB0aGlzLnNldFByZWZpbGxlZEZvcm0odmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgcHJlZmlsbERhdGEoKTogVGFza0xpc3RTZWFyY2hGaWVsZCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9wcmVmaWxsRGF0YTtcbiAgfVxuICBAT3V0cHV0KCkgY2xvc2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8UGFydGlhbDxUYXNrTGlzdFNlYXJjaEZpZWxkPiB8IG51bGw+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICBrZXk6IHRoaXMuZmIuY29udHJvbDxzdHJpbmc+KCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICB0aXRsZTogdGhpcy5mYi5jb250cm9sPHN0cmluZz4oJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgIHBhdGg6IHRoaXMuZmIuY29udHJvbDxzdHJpbmc+KCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICBkYXRhVHlwZTogdGhpcy5mYi5jb250cm9sPExpc3RJdGVtIHwgbnVsbD4obnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgbWF0Y2hUeXBlOiB0aGlzLmZiLmNvbnRyb2w8TGlzdEl0ZW0gfCBudWxsPihudWxsLCB0aGlzLm1hdGNoVHlwZVZhbGlkYXRvciksXG4gICAgZmllbGRUeXBlOiB0aGlzLmZiLmNvbnRyb2w8TGlzdEl0ZW0gfCBudWxsPihudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICBkcm9wZG93bkRhdGFQcm92aWRlcjogdGhpcy5mYi5jb250cm9sPExpc3RJdGVtIHwgbnVsbD4obnVsbCksXG4gICAgZHJvcGRvd25WYWx1ZXM6IHRoaXMuZmIuYXJyYXk8e2tleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nfT4oW10pLFxuICB9KTtcblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IEFic3RyYWN0Q29udHJvbDxMaXN0SXRlbSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnZGF0YVR5cGUnKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlVmFsdWUkKCk6IE9ic2VydmFibGU8TGlzdEl0ZW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVR5cGUudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHRoaXMuZGF0YVR5cGUudmFsdWUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWF0Y2hUeXBlKCk6IEFic3RyYWN0Q29udHJvbDxMaXN0SXRlbSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnbWF0Y2hUeXBlJyk7XG4gIH1cbiAgcHVibGljIGdldCBtYXRjaFR5cGVWYWx1ZSQoKTogT2JzZXJ2YWJsZTxMaXN0SXRlbSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaFR5cGUudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHRoaXMubWF0Y2hUeXBlLnZhbHVlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRyb3Bkb3duRGF0YVByb3ZpZGVyKCk6IEFic3RyYWN0Q29udHJvbDxMaXN0SXRlbSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnZHJvcGRvd25EYXRhUHJvdmlkZXInKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGRyb3Bkb3duRGF0YVByb3ZpZGVyVmFsdWUkKCk6IE9ic2VydmFibGU8TGlzdEl0ZW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZHJvcGRvd25EYXRhUHJvdmlkZXIudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHRoaXMuZHJvcGRvd25EYXRhUHJvdmlkZXIudmFsdWUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRUeXBlKCk6IEFic3RyYWN0Q29udHJvbDxMaXN0SXRlbSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnZmllbGRUeXBlJyk7XG4gIH1cbiAgcHVibGljIGdldCBmaWVsZFR5cGVWYWx1ZSQoKTogT2JzZXJ2YWJsZTxMaXN0SXRlbSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5maWVsZFR5cGUudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHRoaXMuZmllbGRUeXBlLnZhbHVlKSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgVGFza0xpc3RTZWFyY2hGaWVsZERhdGFUeXBlID0gVGFza0xpc3RTZWFyY2hGaWVsZERhdGFUeXBlO1xuICBwdWJsaWMgcmVhZG9ubHkgVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZSA9IFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGU7XG4gIHB1YmxpYyByZWFkb25seSBUYXNrTGlzdFNlYXJjaERyb3Bkb3duRGF0YVByb3ZpZGVyID0gVGFza0xpc3RTZWFyY2hEcm9wZG93bkRhdGFQcm92aWRlcjtcblxuICBwdWJsaWMgZ2V0IGtleVZhbHVlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuZm9ybS5nZXQoJ2tleScpPy52YWx1ZTtcblxuICAgIHJldHVybiAhY29udHJvbFZhbHVlID8gbnVsbCA6IGNvbnRyb2xWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGVWYWx1ZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KCdkYXRhVHlwZScpPy52YWx1ZTtcbiAgICB0aGlzLl9kYXRhVHlwZVZhbHVlJC5uZXh0KGNvbnRyb2xWYWx1ZT8uaWQpO1xuXG4gICAgcmV0dXJuICFjb250cm9sVmFsdWUgPyBudWxsIDogY29udHJvbFZhbHVlLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZFR5cGVWYWx1ZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KCdmaWVsZFR5cGUnKT8udmFsdWU7XG5cbiAgICByZXR1cm4gIWNvbnRyb2xWYWx1ZSA/IG51bGwgOiBjb250cm9sVmFsdWUuaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRyb3Bkb3duRGF0YVByb3ZpZGVyVmFsdWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgY29udHJvbFZhbHVlID0gdGhpcy5mb3JtLmdldCgnZHJvcGRvd25EYXRhUHJvdmlkZXInKT8udmFsdWU7XG4gICAgdGhpcy5fZHJvcGRvd25Qcm92aWRlclZhbHVlJC5uZXh0KGNvbnRyb2xWYWx1ZT8uaWQpO1xuXG4gICAgcmV0dXJuICFjb250cm9sVmFsdWUgPyBudWxsIDogY29udHJvbFZhbHVlLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBkcm9wZG93blZhbHVlc0FycmF5KCk6IEZvcm1BcnJheSB8IG51bGwge1xuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duVmFsdWVzJyk7XG5cbiAgICByZXR1cm4gIWZvcm1BcnJheSA/IG51bGwgOiAoZm9ybUFycmF5IGFzIEZvcm1BcnJheSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgRFJPUERPV05fRklFTERTOiBDb2x1bW5Db25maWdbXSA9IFtcbiAgICB7XG4gICAgICBrZXk6ICdrZXknLFxuICAgICAgbGFiZWw6ICdzZWFyY2hGaWVsZHNPdmVydmlldy5rZXknLFxuICAgICAgdmlld1R5cGU6IFZpZXdUeXBlLlRFWFQsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICd2YWx1ZScsXG4gICAgICBsYWJlbDogJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LnRleHQnLFxuICAgICAgdmlld1R5cGU6IFZpZXdUeXBlLlRFWFQsXG4gICAgfSxcbiAgXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kYXRhVHlwZVZhbHVlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgVGFza0xpc3RTZWFyY2hGaWVsZERhdGFUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZFxuICA+KG51bGwpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Ryb3Bkb3duUHJvdmlkZXJWYWx1ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIFRhc2tMaXN0U2VhcmNoRHJvcGRvd25EYXRhUHJvdmlkZXIgfCBudWxsIHwgdW5kZWZpbmVkXG4gID4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBkcm9wZG93blJlYWRvbmx5SXRlbXMkID0gdGhpcy5fZHJvcGRvd25Qcm92aWRlclZhbHVlJC5waXBlKFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgZmlsdGVyKHZhbCA9PiAhIXZhbCAmJiB2YWwgPT09IFRhc2tMaXN0U2VhcmNoRHJvcGRvd25EYXRhUHJvdmlkZXIuSlNPTiksXG4gICAgc3dpdGNoTWFwKChwcm92aWRlcjogVGFza0xpc3RTZWFyY2hEcm9wZG93bkRhdGFQcm92aWRlciB8IG51bGwgfCB1bmRlZmluZWQpID0+XG4gICAgICB0aGlzLmRvY3VtZW50U2VydmljZS5nZXREcm9wZG93bkRhdGEoXG4gICAgICAgIHByb3ZpZGVyID8/ICcnLFxuICAgICAgICB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUgPz8gJycsXG4gICAgICAgIHRoaXMua2V5VmFsdWUgPz8gJydcbiAgICAgIClcbiAgICApLFxuICAgIG1hcChkcm9wZG93bkRhdGEgPT5cbiAgICAgIGRyb3Bkb3duRGF0YSA/IE9iamVjdC5lbnRyaWVzKGRyb3Bkb3duRGF0YSkubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7a2V5LCB2YWx1ZX0pKSA6IFtdXG4gICAgKVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBkYXRhVHlwZUl0ZW1zJDogT2JzZXJ2YWJsZTxMaXN0SXRlbVtdPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuZGF0YVR5cGVWYWx1ZSQsXG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbSgna2V5JyksXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbZGF0YVR5cGVWYWx1ZV0pID0+XG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzLnRleHQnKSxcbiAgICAgICAgICBpZDogVGFza0xpc3RTZWFyY2hGaWVsZERhdGFUeXBlLlRFWFQsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzLmJvb2xlYW4nKSxcbiAgICAgICAgICBpZDogVGFza0xpc3RTZWFyY2hGaWVsZERhdGFUeXBlLkJPT0xFQU4sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzLmRhdGUnKSxcbiAgICAgICAgICBpZDogVGFza0xpc3RTZWFyY2hGaWVsZERhdGFUeXBlLkRBVEUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzLmRhdGV0aW1lJyksXG4gICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5EQVRFVElNRSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdzZWFyY2hGaWVsZHMubnVtYmVyJyksXG4gICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5OVU1CRVIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzLnRpbWUnKSxcbiAgICAgICAgICBpZDogVGFza0xpc3RTZWFyY2hGaWVsZERhdGFUeXBlLlRJTUUsXG4gICAgICAgIH0sXG4gICAgICBdLm1hcChpdGVtID0+ICh7Li4uaXRlbSwgc2VsZWN0ZWQ6IGl0ZW0uaWQgPT09IGRhdGFUeXBlVmFsdWU/LmlkfSkpXG4gICAgKVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBmaWVsZFR5cGVJdGVtcyQ6IE9ic2VydmFibGU8TGlzdEl0ZW1bXT4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLl9kYXRhVHlwZVZhbHVlJC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLFxuICAgIHRoaXMuZmllbGRUeXBlVmFsdWUkLFxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleScpLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2RhdGFUeXBlVmFsdWUsIGZpZWxkVHlwZVZhbHVlXSkgPT5cbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdzZWFyY2hGaWVsZHNPdmVydmlldy5zaW5nbGUnKSxcbiAgICAgICAgICBpZDogVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZS5TSU5HTEUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzT3ZlcnZpZXcucmFuZ2UnKSxcbiAgICAgICAgICBpZDogVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZS5SQU5HRSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4uKGRhdGFUeXBlVmFsdWUgPT09IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5URVhUXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgICAgICAgICdzZWFyY2hGaWVsZHNPdmVydmlldy5zaW5nbGUtc2VsZWN0LWRyb3Bkb3duJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUuU0lOR0xFX1NFTEVDVF9EUk9QRE9XTixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICAgICAgICAgICAgJ3NlYXJjaEZpZWxkc092ZXJ2aWV3Lm11bHRpLXNlbGVjdC1kcm9wZG93bidcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGlkOiBUYXNrTGlzdFNlYXJjaEZpZWxkRmllbGRUeXBlLk1VTFRJX1NFTEVDVF9EUk9QRE9XTixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IFtdKSxcbiAgICAgIF0ubWFwKGl0ZW0gPT4gKHsuLi5pdGVtLCBzZWxlY3RlZDogaXRlbS5pZCA9PT0gZmllbGRUeXBlVmFsdWU/LmlkfSkpXG4gICAgKVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBkYXRhUHJvdmlkZXJJdGVtcyQ6IE9ic2VydmFibGU8TGlzdEl0ZW1bXT4gPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2VcbiAgICAuc3RyZWFtKCdrZXknKVxuICAgIC5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZHJvcGRvd25EYXRhUHJvdmlkZXJWYWx1ZSQpLFxuICAgICAgbWFwKGRhdGFQcm92aWRlclZhbHVlID0+XG4gICAgICAgIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgICAgJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmRyb3Bkb3duRGF0YWJhc2VEYXRhUHJvdmlkZXInXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRHJvcGRvd25EYXRhUHJvdmlkZXIuREFUQUJBU0UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgICAgJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmRyb3Bkb3duSnNvbkZpbGVEYXRhUHJvdmlkZXInXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRHJvcGRvd25EYXRhUHJvdmlkZXIuSlNPTixcbiAgICAgICAgICB9LFxuICAgICAgICBdLm1hcChpdGVtID0+ICh7Li4uaXRlbSwgc2VsZWN0ZWQ6IGl0ZW0uaWQgPT09IGRhdGFQcm92aWRlclZhbHVlPy5pZH0pKVxuICAgICAgKVxuICAgICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IG1hdGNoVHlwZUl0ZW1zJDogT2JzZXJ2YWJsZTxMaXN0SXRlbVtdPiA9IHRoaXMudHJhbnNsYXRlU2VydmljZVxuICAgIC5zdHJlYW0oJ2tleScpXG4gICAgLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5tYXRjaFR5cGVWYWx1ZSQpLFxuICAgICAgbWFwKG1hdGNoVHlwZVZhbHVlID0+XG4gICAgICAgIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzT3ZlcnZpZXcubGlrZScpLFxuICAgICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGRNYXRjaFR5cGUuTElLRSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdzZWFyY2hGaWVsZHNPdmVydmlldy5leGFjdCcpLFxuICAgICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGRNYXRjaFR5cGUuRVhBQ1QsXG4gICAgICAgICAgfSxcbiAgICAgICAgXS5tYXAoaXRlbSA9PiAoey4uLml0ZW0sIHNlbGVjdGVkOiBpdGVtLmlkID09PSBtYXRjaFR5cGVWYWx1ZT8uaWR9KSlcbiAgICAgIClcbiAgICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBkb2N1bWVudERlZmluaXRpb25OYW1lJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5yb3V0ZS5wYXJhbXMucGlwZShcbiAgICBtYXAocGFyYW1zID0+IHBhcmFtcy5uYW1lIHx8ICcnKSxcbiAgICBmaWx0ZXIoZG9jRGVmTmFtZSA9PiAhIWRvY0RlZk5hbWUpXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IFZhbHVlUGF0aFNlbGVjdG9yUHJlZml4ID0gVmFsdWVQYXRoU2VsZWN0b3JQcmVmaXg7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudFNlcnZpY2U6IERvY3VtZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGljb25TZXJ2aWNlOiBJY29uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZTogQWN0aXZhdGVkUm91dGVcbiAgKSB7XG4gICAgdGhpcy5pY29uU2VydmljZS5yZWdpc3RlckFsbChbVHJhc2hDYW4xNiwgSW5mb3JtYXRpb25GaWxsZWQxNl0pO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybS5zZXRWYWxpZGF0b3JzKFt0aGlzLmRyb3Bkb3duRGF0YVByb3ZpZGVyVmFsaWRhdG9yLCB0aGlzLmRyb3Bkb3duVmFsdWVzVmFsaWRhdG9yXSk7XG4gIH1cblxuICBwdWJsaWMgYWRkRHJvcGRvd25WYWx1ZShwcmVmaWxsVmFsdWU/OiB7a2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmd9KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyb3Bkb3duVmFsdWVzQXJyYXkpIHJldHVybjtcblxuICAgIHRoaXMuZHJvcGRvd25WYWx1ZXNBcnJheS5wdXNoKFxuICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIGtleTogdGhpcy5mYi5jb250cm9sKHByZWZpbGxWYWx1ZT8ua2V5ID8/ICcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgICAgdmFsdWU6IHRoaXMuZmIuY29udHJvbChwcmVmaWxsVmFsdWU/LnZhbHVlID8/ICcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVEcm9wZG93blZhbHVlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd25WYWx1ZXNBcnJheSkgcmV0dXJuO1xuXG4gICAgdGhpcy5kcm9wZG93blZhbHVlc0FycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlRXZlbnQuZW1pdChudWxsKTtcbiAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICB9XG5cbiAgcHVibGljIG9uU2F2ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBncm91cFZhbHVlID0gdGhpcy5mb3JtLmdldFJhd1ZhbHVlKCk7XG4gICAgdGhpcy5jbG9zZUV2ZW50LmVtaXQoe1xuICAgICAgLi4uKGdyb3VwVmFsdWUudGl0bGUgJiYge3RpdGxlOiBncm91cFZhbHVlLnRpdGxlfSksXG4gICAgICAuLi4oZ3JvdXBWYWx1ZS5rZXkgJiYge2tleTogZ3JvdXBWYWx1ZS5rZXl9KSxcbiAgICAgIC4uLihncm91cFZhbHVlLnBhdGggJiYge3BhdGg6IGdyb3VwVmFsdWUucGF0aH0pLFxuICAgICAgLi4uKGdyb3VwVmFsdWUuZGF0YVR5cGU/LmNvbnRlbnQgJiYge2RhdGFUeXBlOiBncm91cFZhbHVlLmRhdGFUeXBlLmlkfSksXG4gICAgICAuLi4oZ3JvdXBWYWx1ZS5tYXRjaFR5cGU/LmNvbnRlbnQgJiYge21hdGNoVHlwZTogZ3JvdXBWYWx1ZS5tYXRjaFR5cGUuaWR9KSxcbiAgICAgIC4uLihncm91cFZhbHVlLmZpZWxkVHlwZT8uY29udGVudCAmJiB7ZmllbGRUeXBlOiBncm91cFZhbHVlLmZpZWxkVHlwZS5pZH0pLFxuICAgICAgLi4uKGdyb3VwVmFsdWUuZHJvcGRvd25EYXRhUHJvdmlkZXI/LmNvbnRlbnQgJiYge1xuICAgICAgICBkcm9wZG93bkRhdGFQcm92aWRlcjogZ3JvdXBWYWx1ZS5kcm9wZG93bkRhdGFQcm92aWRlci5pZCxcbiAgICAgIH0pLFxuICAgICAgLi4uKGdyb3VwVmFsdWUuZHJvcGRvd25WYWx1ZXMgJiYge1xuICAgICAgICBkcm9wZG93blZhbHVlczogZ3JvdXBWYWx1ZS5kcm9wZG93blZhbHVlcy5yZWR1Y2UoXG4gICAgICAgICAgKGFjYywgY3VycikgPT4gKHsuLi5hY2MsIC4uLighIWN1cnI/LmtleSAmJiB7W2N1cnIua2V5XTogY3Vyci52YWx1ZX0pfSksXG4gICAgICAgICAge31cbiAgICAgICAgKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UHJlZmlsbGVkRm9ybShwcmVmaWxsRGF0YTogVGFza0xpc3RTZWFyY2hGaWVsZCB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXByZWZpbGxEYXRhKSByZXR1cm47XG5cbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAuLi5wcmVmaWxsRGF0YSxcbiAgICAgIGRhdGFUeXBlOiAhcHJlZmlsbERhdGEuZGF0YVR5cGVcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDoge1xuICAgICAgICAgICAgY29udGVudDogcHJlZmlsbERhdGEuZGF0YVR5cGUsXG4gICAgICAgICAgICBpZDogcHJlZmlsbERhdGEuZGF0YVR5cGUsXG4gICAgICAgICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgbWF0Y2hUeXBlOiAhcHJlZmlsbERhdGEubWF0Y2hUeXBlXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IHByZWZpbGxEYXRhLm1hdGNoVHlwZSxcbiAgICAgICAgICAgIGlkOiBwcmVmaWxsRGF0YS5tYXRjaFR5cGUsXG4gICAgICAgICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgZmllbGRUeXBlOiAhcHJlZmlsbERhdGEuZmllbGRUeXBlXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IHByZWZpbGxEYXRhLmZpZWxkVHlwZSxcbiAgICAgICAgICAgIGlkOiBwcmVmaWxsRGF0YS5maWVsZFR5cGUsXG4gICAgICAgICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgZHJvcGRvd25EYXRhUHJvdmlkZXI6ICFwcmVmaWxsRGF0YS5kcm9wZG93bkRhdGFQcm92aWRlclxuICAgICAgICA/IG51bGxcbiAgICAgICAgOiB7XG4gICAgICAgICAgICBjb250ZW50OiBwcmVmaWxsRGF0YS5kcm9wZG93bkRhdGFQcm92aWRlcixcbiAgICAgICAgICAgIGlkOiBwcmVmaWxsRGF0YS5kcm9wZG93bkRhdGFQcm92aWRlcixcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICBkcm9wZG93blZhbHVlczogW10sXG4gICAgfSk7XG5cbiAgICBpZiAocHJlZmlsbERhdGEuZHJvcGRvd25EYXRhUHJvdmlkZXIgJiYgcHJlZmlsbERhdGEuZHJvcGRvd25WYWx1ZXMpXG4gICAgICB0aGlzLnNldFByZWZpbGxlZERyb3Bkb3duVmFsdWVzKHByZWZpbGxEYXRhLmRyb3Bkb3duVmFsdWVzKTtcbiAgICB0aGlzLmZvcm0uZ2V0KCdrZXknKT8uZGlzYWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQcmVmaWxsZWREcm9wZG93blZhbHVlcyhkcm9wZG93blZhbHVlOiBUYXNrTGlzdFNlYXJjaERyb3Bkb3duVmFsdWUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd25WYWx1ZXNBcnJheSB8fCAhdGhpcy5kcm9wZG93bkRhdGFQcm92aWRlclZhbHVlKSByZXR1cm47XG5cbiAgICBPYmplY3QuZW50cmllcyhkcm9wZG93blZhbHVlKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHRoaXMuYWRkRHJvcGRvd25WYWx1ZSh7a2V5LCB2YWx1ZX0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXRjaFR5cGVWYWxpZGF0b3IoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogbnVsbCB8IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9IHtcbiAgICBjb25zdCBjb250cm9sVmFsdWU6IExpc3RJdGVtIHwgdW5kZWZpbmVkID0gY29udHJvbC52YWx1ZTtcbiAgICBjb25zdCBkYXRhVHlwZUNvbnRyb2xWYWx1ZTogTGlzdEl0ZW0gfCBudWxsIHwgdW5kZWZpbmVkID1cbiAgICAgIGNvbnRyb2wucGFyZW50Py5nZXQoJ2RhdGFUeXBlJyk/LnZhbHVlO1xuXG4gICAgaWYgKFxuICAgICAgZGF0YVR5cGVDb250cm9sVmFsdWU/LmlkID09PSBUYXNrTGlzdFNlYXJjaEZpZWxkRGF0YVR5cGUuVEVYVCAmJlxuICAgICAgKCFjb250cm9sVmFsdWUgfHwgIWNvbnRyb2xWYWx1ZS5zZWxlY3RlZClcbiAgICApXG4gICAgICByZXR1cm4ge2Vycm9yOiAnTWF0Y2ggdHlwZSBub3Qgc2VsZWN0ZWQnfTtcblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBkcm9wZG93bkRhdGFQcm92aWRlclZhbGlkYXRvcihncm91cDogdHlwZW9mIHRoaXMuZm9ybSk6IFZhbGlkYXRpb25FcnJvcnMge1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZTogTGlzdEl0ZW0gfCB1bmRlZmluZWQgPSBncm91cC5nZXQoJ2Ryb3Bkb3duRGF0YVByb3ZpZGVyJyk/LnZhbHVlO1xuICAgIGNvbnN0IGZpZWxkVHlwZUNvbnRyb2xWYWx1ZTogTGlzdEl0ZW0gfCBudWxsIHwgdW5kZWZpbmVkID0gZ3JvdXAuZ2V0KCdmaWVsZFR5cGUnKT8udmFsdWU7XG5cbiAgICBpZiAoXG4gICAgICBbXG4gICAgICAgIFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUuU0lOR0xFX1NFTEVDVF9EUk9QRE9XTixcbiAgICAgICAgVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZS5NVUxUSV9TRUxFQ1RfRFJPUERPV04sXG4gICAgICBdLmluY2x1ZGVzKGZpZWxkVHlwZUNvbnRyb2xWYWx1ZT8uaWQpICYmXG4gICAgICAhY29udHJvbFZhbHVlXG4gICAgKVxuICAgICAgcmV0dXJuIHtlcnJvcjogJ0Ryb3Bkb3duIHNvdXJjZSBwcm92aWRlciBpcyBub3Qgc3BlY2lmaWVkJ307XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZHJvcGRvd25WYWx1ZXNWYWxpZGF0b3IoZ3JvdXA6IHR5cGVvZiB0aGlzLmZvcm0pOiBWYWxpZGF0aW9uRXJyb3JzIHtcbiAgICBjb25zdCBjb250cm9sVmFsdWU6IHtrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZ31bXSB8IHVuZGVmaW5lZCA9XG4gICAgICBncm91cC5nZXQoJ2Ryb3Bkb3duVmFsdWVzJyk/LnZhbHVlO1xuICAgIGNvbnN0IGZpZWxkVHlwZUNvbnRyb2xWYWx1ZSA9IGdyb3VwLmdldCgnZmllbGRUeXBlJyk/LnZhbHVlPy5pZDtcbiAgICBjb25zdCBkcm9wZG93blByb3ZpZGVyVmFsdWUgPSBncm91cC5nZXQoJ2Ryb3Bkb3duRGF0YVByb3ZpZGVyJyk/LnZhbHVlPy5pZDtcblxuICAgIGlmIChcbiAgICAgIFtcbiAgICAgICAgVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZS5TSU5HTEVfU0VMRUNUX0RST1BET1dOLFxuICAgICAgICBUYXNrTGlzdFNlYXJjaEZpZWxkRmllbGRUeXBlLk1VTFRJX1NFTEVDVF9EUk9QRE9XTixcbiAgICAgIF0uaW5jbHVkZXMoZmllbGRUeXBlQ29udHJvbFZhbHVlKSAmJlxuICAgICAgKCFjb250cm9sVmFsdWUgfHwgY29udHJvbFZhbHVlPy5sZW5ndGggPT09IDApICYmXG4gICAgICBkcm9wZG93blByb3ZpZGVyVmFsdWUgPT09IFRhc2tMaXN0U2VhcmNoRHJvcGRvd25EYXRhUHJvdmlkZXIuREFUQUJBU0VcbiAgICApXG4gICAgICByZXR1cm4ge2Vycm9yOiAnRHJvcGRvd24gc291cmNlIHByb3ZpZGVyIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgZW1wdHknfTtcblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldEZvcm0oKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB3aGlsZSAoISF0aGlzLmRyb3Bkb3duVmFsdWVzQXJyYXk/Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRyb3Bkb3duVmFsdWVzQXJyYXkucmVtb3ZlQXQoMCk7XG4gICAgICB9XG4gICAgICB0aGlzLmZvcm0ucmVzZXQoKTtcbiAgICAgIHRoaXMuZm9ybS5lbmFibGUoKTtcbiAgICB9LCBDQVJCT05fQ09OU1RBTlRTLm1vZGFsQW5pbWF0aW9uTXMpO1xuICB9XG59XG4iLCI8IS0tXG4gIH4gQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gIH5cbiAgfiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gIH5cbiAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgLS0+XG48Y2RzLW1vZGFsIFtvcGVuXT1cIm9wZW5cIiBzaG93Rm9vdGVyPVwidHJ1ZVwiPlxuICA8Y2RzLW1vZGFsLWhlYWRlciBbc2hvd0Nsb3NlQnV0dG9uXT1cInRydWVcIiAoY2xvc2VTZWxlY3QpPVwib25DYW5jZWwoKVwiPlxuICAgIDxoMyBjZHNNb2RhbEhlYWRlckhlYWRpbmc+XG4gICAgICB7eyAoIXByZWZpbGxEYXRhID8gJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmFkZCcgOiAnc2VhcmNoRmllbGRzT3ZlcnZpZXcuZWRpdCcpIHwgdHJhbnNsYXRlIH19XG4gICAgPC9oMz5cbiAgPC9jZHMtbW9kYWwtaGVhZGVyPlxuXG4gIDxzZWN0aW9uIGNkc01vZGFsQ29udGVudD5cbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cInZhbHRpbW8tdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWxfX2NvbnRlbnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsX19pbnB1dFwiPlxuICAgICAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgICAgIFt0aXRsZV09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcudGl0bGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy50aXRsZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICA+XG4gICAgICAgIDwvdi1pbnB1dC1sYWJlbD5cblxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cInRhc2stbWFuYWdlbWVudC1zZWFyY2gtdGl0bGVcIlxuICAgICAgICAgIGNkc1RleHRcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIlxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsX19pbnB1dFwiPlxuICAgICAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgICAgIFt0aXRsZV09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcua2V5JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMua2V5JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgPC92LWlucHV0LWxhYmVsPlxuXG4gICAgICAgIDxpbnB1dCBkYXRhLXRlc3RpZD1cInRhc2stbWFuYWdlbWVudC1zZWFyY2gta2V5XCIgY2RzVGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImtleVwiIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInZhbHRpbW8tdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWxfX2lucHV0XCI+XG4gICAgICAgIDx2LWlucHV0LWxhYmVsXG4gICAgICAgICAgW3RpdGxlXT1cIidzZWFyY2hGaWVsZHNPdmVydmlldy5wYXRoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMucGF0aCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICA+XG4gICAgICAgIDwvdi1pbnB1dC1sYWJlbD5cblxuICAgICAgICA8dmFsdGltby12YWx1ZS1wYXRoLXNlbGVjdG9yXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicGF0aFwiXG4gICAgICAgICAgW2RvY3VtZW50RGVmaW5pdGlvbk5hbWVdPVwiZG9jdW1lbnREZWZpbml0aW9uTmFtZSQgfCBhc3luY1wiXG4gICAgICAgICAgW3ByZWZpeGVzXT1cIltWYWx1ZVBhdGhTZWxlY3RvclByZWZpeC5ET0MsIFZhbHVlUGF0aFNlbGVjdG9yUHJlZml4LkNBU0VdXCJcbiAgICAgICAgPjwvdmFsdGltby12YWx1ZS1wYXRoLXNlbGVjdG9yPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsX19pbnB1dFwiPlxuICAgICAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgICAgIFt0aXRsZV09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcuZGF0YVR5cGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy5kYXRhVHlwZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICA+XG4gICAgICAgIDwvdi1pbnB1dC1sYWJlbD5cblxuICAgICAgICA8Y2RzLWRyb3Bkb3duIGRhdGEtdGVzdGlkPVwidGFzay1tYW5hZ2VtZW50LXNlYXJjaC1kYXRhVHlwZVwiIGZvcm1Db250cm9sTmFtZT1cImRhdGFUeXBlXCI+XG4gICAgICAgICAgPGNkcy1kcm9wZG93bi1saXN0IFtpdGVtc109XCJkYXRhVHlwZUl0ZW1zJCB8IGFzeW5jXCI+PC9jZHMtZHJvcGRvd24tbGlzdD5cbiAgICAgICAgPC9jZHMtZHJvcGRvd24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgQGlmIChkYXRhVHlwZVZhbHVlID09PSBUYXNrTGlzdFNlYXJjaEZpZWxkRGF0YVR5cGUuVEVYVCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdGltby10YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbF9faW5wdXRcIj5cbiAgICAgICAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgICAgICAgW3RpdGxlXT1cIidzZWFyY2hGaWVsZHNPdmVydmlldy5tYXRjaFR5cGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFt0b29sdGlwXT1cIidzZWFyY2hGaWVsZHNPdmVydmlld1Rvb2x0aXBzLm1hdGNoVHlwZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3YtaW5wdXQtbGFiZWw+XG5cbiAgICAgICAgICA8Y2RzLWRyb3Bkb3duIGRhdGEtdGVzdGlkPVwidGFzay1tYW5hZ2VtZW50LXNlYXJjaC1tYXRjaFR5cGVcIiBmb3JtQ29udHJvbE5hbWU9XCJtYXRjaFR5cGVcIj5cbiAgICAgICAgICAgIDxjZHMtZHJvcGRvd24tbGlzdCBbaXRlbXNdPVwibWF0Y2hUeXBlSXRlbXMkIHwgYXN5bmNcIj48L2Nkcy1kcm9wZG93bi1saXN0PlxuICAgICAgICAgIDwvY2RzLWRyb3Bkb3duPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPGRpdiBjbGFzcz1cInZhbHRpbW8tdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWxfX2lucHV0XCI+XG4gICAgICAgIDx2LWlucHV0LWxhYmVsXG4gICAgICAgICAgW3RpdGxlXT1cIidzZWFyY2hGaWVsZHNPdmVydmlldy5maWVsZFR5cGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy5maWVsZFR5cGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgPlxuICAgICAgICA8L3YtaW5wdXQtbGFiZWw+XG5cbiAgICAgICAgPGNkcy1kcm9wZG93biBkYXRhLXRlc3RpZD1cInRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRUeXBlXCIgZm9ybUNvbnRyb2xOYW1lPVwiZmllbGRUeXBlXCI+XG4gICAgICAgICAgPGNkcy1kcm9wZG93bi1saXN0IFtpdGVtc109XCJmaWVsZFR5cGVJdGVtcyQgfCBhc3luY1wiPjwvY2RzLWRyb3Bkb3duLWxpc3Q+XG4gICAgICAgIDwvY2RzLWRyb3Bkb3duPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBpZiAoXG4gICAgICAgIGRhdGFUeXBlVmFsdWUgPT09IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5URVhUICYmXG4gICAgICAgIChmaWVsZFR5cGVWYWx1ZSA9PT0gVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZS5TSU5HTEVfU0VMRUNUX0RST1BET1dOIHx8XG4gICAgICAgICAgZmllbGRUeXBlVmFsdWUgPT09IFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUuTVVMVElfU0VMRUNUX0RST1BET1dOKVxuICAgICAgKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsX19pbnB1dFwiPlxuICAgICAgICAgIDx2LWlucHV0LWxhYmVsXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmRyb3Bkb3duRGF0YVByb3ZpZGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy5kcm9wZG93bkRhdGFQcm92aWRlcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3YtaW5wdXQtbGFiZWw+XG5cbiAgICAgICAgICA8Y2RzLWRyb3Bkb3duXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cInRhc2stbWFuYWdlbWVudC1zZWFyY2gtZHJvcGRvd25EYXRhUHJvdmlkZXJcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZHJvcGRvd25EYXRhUHJvdmlkZXJcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxjZHMtZHJvcGRvd24tbGlzdCBbaXRlbXNdPVwiZGF0YVByb3ZpZGVySXRlbXMkIHwgYXN5bmNcIj48L2Nkcy1kcm9wZG93bi1saXN0PlxuICAgICAgICAgIDwvY2RzLWRyb3Bkb3duPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICBAaWYgKGRyb3Bkb3duRGF0YVByb3ZpZGVyVmFsdWUgPT09IFRhc2tMaXN0U2VhcmNoRHJvcGRvd25EYXRhUHJvdmlkZXIuREFUQUJBU0UpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInZhbHRpbW8tdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWxfX2xpc3RcIlxuICAgICAgICAgICAgZm9ybUFycmF5TmFtZT1cImRyb3Bkb3duVmFsdWVzXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmRyb3Bkb3duTGlzdFZhbHVlcycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy5kcm9wZG93bkxpc3RWYWx1ZXMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgW25vTWFyZ2luXT1cInRydWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC92LWlucHV0LWxhYmVsPlxuXG4gICAgICAgICAgICBAZm9yIChkcm9wZG93blZhbHVlIG9mIGRyb3Bkb3duVmFsdWVzQXJyYXk/LmNvbnRyb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPGZvcm1cbiAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImRyb3Bkb3duVmFsdWVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidmFsdGltby10YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbF9fZHJvcGRvd24tdmFsdWVzXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxjZHMtdGV4dC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIHt7ICdpbnRlcmZhY2UudmFsdWUnIHwgdHJhbnNsYXRlIH19XG5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cInRhc2stbWFuYWdlbWVudC1zZWFyY2gtZHJvcGRvd25LZXlcIlxuICAgICAgICAgICAgICAgICAgICBjZHNUZXh0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwia2V5XCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9jZHMtdGV4dC1sYWJlbD5cblxuICAgICAgICAgICAgICAgIDxjZHMtdGV4dC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIHt7ICdpbnRlcmZhY2UuZGlzcGxheScgfCB0cmFuc2xhdGUgfX1cblxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwidGFzay1tYW5hZ2VtZW50LXNlYXJjaC1kcm9wZG93blZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgY2RzVGV4dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9jZHMtdGV4dC1sYWJlbD5cblxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNkc0J1dHRvbj1cImRhbmdlclwiXG4gICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cInRhc2stbWFuYWdlbWVudC1zZWFyY2gtZGVsZXRlRW51bVwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiJGNvdW50ID09PSAxXCJcbiAgICAgICAgICAgICAgICAgIFtpY29uT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVEcm9wZG93blZhbHVlKCRpbmRleClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjZHMtLWJ0bl9faWNvblwiIGNkc0ljb249XCJ0cmFzaC1jYW5cIiBzaXplPVwiMTZcIj48L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwidGFzay1tYW5hZ2VtZW50LXNlYXJjaC1hZGREcm9wZG93blZhbHVlXCJcbiAgICAgICAgICAgICAgY2RzQnV0dG9uPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhZGREcm9wZG93blZhbHVlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnaW50ZXJmYWNlLmFkZFJvdycgfCB0cmFuc2xhdGUgfX1cblxuICAgICAgICAgICAgICA8c3ZnIGNkc0ljb249XCJhZGRcIiBzaXplPVwiMTZcIiBjbGFzcz1cImNkcy0tYnRuX19pY29uXCI+PC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSBpZiAoZHJvcGRvd25EYXRhUHJvdmlkZXJWYWx1ZSA9PT0gVGFza0xpc3RTZWFyY2hEcm9wZG93bkRhdGFQcm92aWRlci5KU09OKSB7XG4gICAgICAgICAgPHZhbHRpbW8tY2FyYm9uLWxpc3RcbiAgICAgICAgICAgIFtoZWFkZXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2hpZGVUb29sYmFyXT1cInRydWVcIlxuICAgICAgICAgICAgW2ZpZWxkc109XCJEUk9QRE9XTl9GSUVMRFNcIlxuICAgICAgICAgICAgW2l0ZW1zXT1cImRyb3Bkb3duUmVhZG9ubHlJdGVtcyQgfCBhc3luY1wiXG4gICAgICAgICAgPjwvdmFsdGltby1jYXJib24tbGlzdD5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZm9ybT5cbiAgPC9zZWN0aW9uPlxuXG4gIDxjZHMtbW9kYWwtZm9vdGVyPlxuICAgIDxidXR0b24gZGF0YS10ZXN0aWQ9XCJ0YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWNhbmNlbFwiIGNkc0J1dHRvbj1cImdob3N0XCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5cbiAgICAgIHt7ICdpbnRlcmZhY2UuY2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGJ1dHRvblxuICAgICAgZGF0YS10ZXN0aWQ9XCJ0YXNrLW1hbmFnZW1lbnQtc2VhcmNoLXNhdmVcIlxuICAgICAgY2RzQnV0dG9uPVwicHJpbWFyeVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkXCJcbiAgICAgIChjbGljayk9XCJvblNhdmUoKVwiXG4gICAgPlxuICAgICAge3sgJ2ludGVyZmFjZS5zYXZlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Nkcy1tb2RhbC1mb290ZXI+XG48L2Nkcy1tb2RhbD5cbiJdfQ==
@@ -1,17 +0,0 @@
1
- /*
2
- * Copyright 2015-2024 Ritense BV, the Netherlands.
3
- *
4
- * Licensed under EUPL, Version 1.2 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" basis,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- export * from './task-management.model';
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL3Rhc2stbWFuYWdlbWVudC9zcmMvbGliL21vZGVscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILGNBQWMseUJBQXlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3Rhc2stbWFuYWdlbWVudC5tb2RlbCc7XG4iXX0=
@@ -1,22 +0,0 @@
1
- /*
2
- * Copyright 2015-2024 Ritense BV, the Netherlands.
3
- *
4
- * Licensed under EUPL, Version 1.2 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" basis,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- var TaskManagementTab;
17
- (function (TaskManagementTab) {
18
- TaskManagementTab["COLUMNS"] = "columns";
19
- TaskManagementTab["SEARCH_FIELDS"] = "searchFields";
20
- })(TaskManagementTab || (TaskManagementTab = {}));
21
- export { TaskManagementTab };
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1tYW5hZ2VtZW50Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrLW1hbmFnZW1lbnQvc3JjL2xpYi9tb2RlbHMvdGFzay1tYW5hZ2VtZW50Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsSUFBSyxpQkFHSjtBQUhELFdBQUssaUJBQWlCO0lBQ3BCLHdDQUFtQixDQUFBO0lBQ25CLG1EQUE4QixDQUFBO0FBQ2hDLENBQUMsRUFISSxpQkFBaUIsS0FBakIsaUJBQWlCLFFBR3JCO0FBRUQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5lbnVtIFRhc2tNYW5hZ2VtZW50VGFiIHtcbiAgQ09MVU1OUyA9ICdjb2x1bW5zJyxcbiAgU0VBUkNIX0ZJRUxEUyA9ICdzZWFyY2hGaWVsZHMnLFxufVxuXG5leHBvcnQge1Rhc2tNYW5hZ2VtZW50VGFifTtcbiJdfQ==
@@ -1,19 +0,0 @@
1
- /*
2
- * Copyright 2015-2024 Ritense BV, the Netherlands.
3
- *
4
- * Licensed under EUPL, Version 1.2 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" basis,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- export * from './task-management.service';
17
- export * from './task-management-api.service';
18
- export * from './task-management-search-fields.service';
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL3Rhc2stbWFuYWdlbWVudC9zcmMvbGliL3NlcnZpY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMseUNBQXlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3Rhc2stbWFuYWdlbWVudC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vdGFzay1tYW5hZ2VtZW50LWFwaS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMuc2VydmljZSc7XG4iXX0=