@sebgroup/green-angular 1.0.0-beta.20 → 1.0.0-beta.22

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.
@@ -116,7 +116,7 @@ NggDatepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
116
116
  useExisting: NggDatepickerComponent,
117
117
  multi: true,
118
118
  },
119
- ], viewQueries: [{ propertyName: "datepickerDialogElRef", first: true, predicate: ["datepickerDialogElRef"], descendants: true }, { propertyName: "dateInputElRef", first: true, predicate: ["dateInputElRef"], descendants: true }, { propertyName: "datepickerElRef", first: true, predicate: ["datepickerElRef"], descendants: true }, { propertyName: "datepickerTriggerElRef", first: true, predicate: ["datepickerTriggerElRef"], descendants: true }], ngImport: i0, template: "<div class=\"form-group\">\n <label *ngIf=\"label\" [for]=\"id\">{{ label }}</label>\n <div\n class=\"group\"\n #datepickerElRef\n [class.is-valid]=\"isValid\"\n [class.is-invalid]=\"isValid === false\"\n >\n <input\n [attr.id]=\"id\"\n [attr.aria-describedby]=\"\n formInfo?.innerText && formInfo.innerText.length > 0\n ? id + '_info'\n : null\n \"\n type=\"text\"\n placeholder=\"yyyy-mm-dd\"\n #dateInputElRef\n [value]=\"data?.formattedSelectedDate || ''\"\n (change)=\"onDateChange(dateInputElRef.value)\"\n />\n <button\n #datepickerTriggerElRef\n (click)=\"dp?.toggle()\"\n type=\"button\"\n class=\"primary\"\n >\n <i class=\"sg-icon sg-icon-calendar\">Select date</i>\n </button>\n </div>\n <span class=\"form-info\" #formInfo [attr.id]=\"id + '_info'\"\n ><ng-content select=\"[data-form-info]\"></ng-content\n ></span>\n</div>\n<!-- TODO: get or set attributes from within datepicker instance (dp) -->\n<div\n #datepickerDialogElRef\n class=\"popover popover-datepicker\"\n [class.active]=\"dp?.state?.isActive\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Choose Date\"\n>\n <button type=\"button\" class=\"close\" (click)=\"dp?.close()\">Close</button>\n <div class=\"sg-date\">\n <header>\n <button type=\"button\" class=\"link\" (click)=\"dp?.sub(1, 'months')\">\n <i class=\"sg-icon sg-icon-previous\">Previous month</i>\n </button>\n <ngg-dropdown\n [options]=\"months\"\n text=\"Select\"\n [value]=\"data?.month\"\n selectValue=\"value\"\n (valueChange)=\"dp?.setMonth($event)\"\n ></ngg-dropdown>\n <ngg-dropdown\n *ngIf=\"years\"\n [options]=\"years\"\n text=\"Select\"\n [value]=\"data?.year\"\n selectValue=\"value\"\n (valueChange)=\"dp?.setYear($event)\"\n ></ngg-dropdown>\n <button type=\"button\" class=\"link\" (click)=\"dp?.add(1, 'months')\">\n <i class=\"sg-icon sg-icon-next\">Next month</i>\n </button>\n </header>\n <main>\n <table role=\"grid\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let header of data?.calendar?.headers\"\n [abbr]=\"header.abbr\"\n [class.sg-week-header]=\"header.type === 'week'\"\n [class.sg-day-header]=\"header.type === 'day'\"\n >\n {{ header.displayText }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"\n let week of data?.calendar?.calendarGrid;\n trackBy: trackWeek;\n let i = index\n \"\n >\n <th\n *ngIf=\"data?.calendar?.weekNumbers as weekNumbers\"\n class=\"sg-week-number\"\n >\n {{ weekNumbers[i] }}\n </th>\n <td\n *ngFor=\"let day of week\"\n [attr.data-date]=\"day.formattedDate\"\n [attr.role]=\"day.selected ? 'gridcell' : null\"\n [attr.aria-selected]=\"\n day.selected && !data?.highlightedDate ? true : null\n \"\n [class.disabled]=\"day.disabled\"\n [class.sg-date-today]=\"day.today\"\n [title]=\"day.today ? 'Today' : ''\"\n [tabIndex]=\"\n day.highlighted ||\n (day.selected && !data?.highlightedDate) ||\n (day.today && !data?.highlightedDate && !data?.selectedDate)\n ? 0\n : -1\n \"\n (click)=\"day.currentMonth && dp?.select(day.date)\"\n >\n {{ day.day }}\n </td>\n </tr>\n </tbody>\n </table>\n </main>\n </div>\n</div>\n", components: [{ type: i1.NggDropdownComponent, selector: "ngg-dropdown", inputs: ["id", "texts", "loop", "display", "selectValue", "useValue", "multiSelect", "label", "options", "valid", "invalid", "value"], outputs: ["valueChange", "touched"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
119
+ ], viewQueries: [{ propertyName: "datepickerDialogElRef", first: true, predicate: ["datepickerDialogElRef"], descendants: true }, { propertyName: "dateInputElRef", first: true, predicate: ["dateInputElRef"], descendants: true }, { propertyName: "datepickerElRef", first: true, predicate: ["datepickerElRef"], descendants: true }, { propertyName: "datepickerTriggerElRef", first: true, predicate: ["datepickerTriggerElRef"], descendants: true }], ngImport: i0, template: "<div class=\"form-group\">\n <label *ngIf=\"label\" [for]=\"id\">{{ label }}</label>\n <div\n class=\"group\"\n #datepickerElRef\n [class.is-valid]=\"isValid\"\n [class.is-invalid]=\"isValid === false\"\n >\n <input\n [attr.id]=\"id\"\n [attr.aria-describedby]=\"\n formInfo?.innerText && formInfo.innerText.length > 0\n ? id + '_info'\n : null\n \"\n type=\"text\"\n placeholder=\"yyyy-mm-dd\"\n #dateInputElRef\n [value]=\"data?.formattedSelectedDate || ''\"\n (change)=\"onDateChange(dateInputElRef.value)\"\n />\n <button\n #datepickerTriggerElRef\n (click)=\"dp?.toggle()\"\n type=\"button\"\n class=\"primary\"\n >\n <i class=\"sg-icon sg-icon-calendar\">Select date</i>\n </button>\n </div>\n <span class=\"form-info\" #formInfo [attr.id]=\"id + '_info'\"\n ><ng-content select=\"[data-form-info]\"></ng-content\n ></span>\n</div>\n<!-- TODO: get or set attributes from within datepicker instance (dp) -->\n<div\n #datepickerDialogElRef\n class=\"popover popover-datepicker\"\n [class.active]=\"dp?.state?.isActive\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Choose Date\"\n>\n <button type=\"button\" class=\"close\" (click)=\"dp?.close()\">Close</button>\n <div class=\"sg-date\">\n <header>\n <button type=\"button\" class=\"link\" (click)=\"dp?.sub(1, 'months')\">\n <i class=\"sg-icon sg-icon-previous\">Previous month</i>\n </button>\n <ngg-dropdown\n [options]=\"months\"\n text=\"Select\"\n [value]=\"data?.month\"\n selectValue=\"value\"\n (valueChange)=\"dp?.setMonth($event)\"\n ></ngg-dropdown>\n <ngg-dropdown\n *ngIf=\"years\"\n [options]=\"years\"\n text=\"Select\"\n [value]=\"data?.year\"\n selectValue=\"value\"\n (valueChange)=\"dp?.setYear($event)\"\n ></ngg-dropdown>\n <button type=\"button\" class=\"link\" (click)=\"dp?.add(1, 'months')\">\n <i class=\"sg-icon sg-icon-next\">Next month</i>\n </button>\n </header>\n <main>\n <table role=\"grid\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let header of data?.calendar?.headers\"\n [abbr]=\"header.abbr\"\n [class.sg-week-header]=\"header.type === 'week'\"\n [class.sg-day-header]=\"header.type === 'day'\"\n >\n {{ header.displayText }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"\n let week of data?.calendar?.calendarGrid;\n trackBy: trackWeek;\n let i = index\n \"\n >\n <th\n *ngIf=\"data?.calendar?.weekNumbers as weekNumbers\"\n class=\"sg-week-number\"\n >\n {{ weekNumbers[i] }}\n </th>\n <td\n *ngFor=\"let day of week\"\n [attr.data-date]=\"day.formattedDate\"\n [attr.role]=\"day.selected ? 'gridcell' : null\"\n [attr.aria-selected]=\"\n day.selected && !data?.highlightedDate ? true : null\n \"\n [class.disabled]=\"day.disabled\"\n [class.sg-date-today]=\"day.today\"\n [title]=\"day.today ? 'Today' : ''\"\n [tabIndex]=\"\n day.highlighted ||\n (day.selected && !data?.highlightedDate) ||\n (day.today && !data?.highlightedDate && !data?.selectedDate)\n ? 0\n : -1\n \"\n (click)=\"day.currentMonth && dp?.select(day.date)\"\n >\n {{ day.day }}\n </td>\n </tr>\n </tbody>\n </table>\n </main>\n </div>\n</div>\n", components: [{ type: i1.NggDropdownComponent, selector: "ngg-dropdown", inputs: ["id", "texts", "loop", "display", "selectValue", "useValue", "label", "options", "valid", "invalid", "searchableProperties", "multiSelect", "searchable", "value"], outputs: ["valueChange", "touched"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
120
120
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: NggDatepickerComponent, decorators: [{
121
121
  type: Component,
122
122
  args: [{ selector: 'ngg-datepicker', providers: [
@@ -8,8 +8,9 @@ export class NggDropdownComponent {
8
8
  constructor(cd) {
9
9
  this.cd = cd;
10
10
  this.loop = false;
11
- this._multiSelect = false;
12
11
  this.options = [];
12
+ this._multiSelect = false;
13
+ this._searchable = false;
13
14
  this.valueChange = new EventEmitter();
14
15
  this.touched = new EventEmitter();
15
16
  this.toggler = dropdownValues.elements?.toggler;
@@ -20,18 +21,23 @@ export class NggDropdownComponent {
20
21
  };
21
22
  }
22
23
  set multiSelect(value) {
23
- this._multiSelect =
24
- value === '' || value === 'true' || value.toString() === 'true' || false;
24
+ this._multiSelect = this.convertToBoolean(value);
25
25
  }
26
26
  get multiSelect() {
27
27
  return this._multiSelect;
28
28
  }
29
- get value() {
30
- return this._value;
29
+ set searchable(value) {
30
+ this._searchable = this.convertToBoolean(value);
31
+ }
32
+ get searchable() {
33
+ return this._searchable;
31
34
  }
32
35
  set value(newValue) {
33
36
  this.setSelectionByValue(newValue);
34
37
  }
38
+ get value() {
39
+ return this._value;
40
+ }
35
41
  ngAfterViewInit() {
36
42
  if (this.togglerRef?.nativeElement && this.listboxRef?.nativeElement) {
37
43
  this.handler = createDropdown(this.props, this.togglerRef.nativeElement, this.listboxRef.nativeElement, this.fieldsetRef?.nativeElement, (dropdown) => {
@@ -89,6 +95,9 @@ export class NggDropdownComponent {
89
95
  registerOnTouched(fn) {
90
96
  this.onTouchedFn = fn;
91
97
  }
98
+ search($event) {
99
+ this.handler?.search($event.target.value);
100
+ }
92
101
  get props() {
93
102
  return {
94
103
  id: this.id || this.dropdown?.id,
@@ -100,6 +109,8 @@ export class NggDropdownComponent {
100
109
  loop: this.loop,
101
110
  value: this.value,
102
111
  multiSelect: this.multiSelect,
112
+ searchable: this.searchable,
113
+ searchableProperties: this.searchableProperties,
103
114
  onTouched: () => {
104
115
  this.onTouchedFn?.();
105
116
  this.touched.emit(true);
@@ -123,9 +134,12 @@ export class NggDropdownComponent {
123
134
  }
124
135
  }
125
136
  }
137
+ convertToBoolean(value) {
138
+ return (value === '' || value === 'true' || value.toString() === 'true' || false);
139
+ }
126
140
  }
127
141
  NggDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: NggDropdownComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
128
- NggDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: NggDropdownComponent, selector: "ngg-dropdown", inputs: { id: "id", texts: "texts", loop: "loop", display: "display", selectValue: "selectValue", useValue: "useValue", multiSelect: "multiSelect", label: "label", options: "options", valid: "valid", invalid: "invalid", value: "value" }, outputs: { valueChange: "valueChange", touched: "touched" }, providers: [
142
+ NggDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: NggDropdownComponent, selector: "ngg-dropdown", inputs: { id: "id", texts: "texts", loop: "loop", display: "display", selectValue: "selectValue", useValue: "useValue", label: "label", options: "options", valid: "valid", invalid: "invalid", searchableProperties: "searchableProperties", multiSelect: "multiSelect", searchable: "searchable", value: "value" }, outputs: { valueChange: "valueChange", touched: "touched" }, providers: [
129
143
  {
130
144
  provide: NG_VALUE_ACCESSOR,
131
145
  useExisting: NggDropdownComponent,
@@ -190,6 +204,7 @@ NggDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", v
190
204
  <span class="sr-only">{{ dropdown?.texts?.close }}</span>
191
205
  </button>
192
206
  <ul role="listbox" *ngIf="!dropdown?.isMultiSelect">
207
+ <ng-container *ngTemplateOutlet="searchInput"></ng-container>
193
208
  <li
194
209
  *ngFor="
195
210
  let option of dropdown?.options;
@@ -214,6 +229,7 @@ NggDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", v
214
229
  </li>
215
230
  </ul>
216
231
  <div *ngIf="dropdown?.isMultiSelect" class="sg-fieldset-container">
232
+ <ng-container *ngTemplateOutlet="searchInput"></ng-container>
217
233
  <fieldset
218
234
  #fieldsetRef
219
235
  [attr.aria-describedby]="fieldset?.attributes?.id"
@@ -260,7 +276,17 @@ NggDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", v
260
276
  <ng-template #defaultOption let-option="option">
261
277
  {{ option[dropdown!.display] }}
262
278
  </ng-template>
263
- `, isInline: true, directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
279
+
280
+ <ng-template #searchInput>
281
+ <input
282
+ *ngIf="dropdown?.isSearchable"
283
+ type="search"
284
+ (input)="search($event)"
285
+ placeholder="{{ dropdown?.texts?.searchPlaceholder }}"
286
+ class="rounded-0 rounded-top border-0 border-bottom border-info"
287
+ />
288
+ </ng-template>
289
+ `, isInline: true, directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
264
290
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: NggDropdownComponent, decorators: [{
265
291
  type: Component,
266
292
  args: [{
@@ -324,6 +350,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
324
350
  <span class="sr-only">{{ dropdown?.texts?.close }}</span>
325
351
  </button>
326
352
  <ul role="listbox" *ngIf="!dropdown?.isMultiSelect">
353
+ <ng-container *ngTemplateOutlet="searchInput"></ng-container>
327
354
  <li
328
355
  *ngFor="
329
356
  let option of dropdown?.options;
@@ -348,6 +375,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
348
375
  </li>
349
376
  </ul>
350
377
  <div *ngIf="dropdown?.isMultiSelect" class="sg-fieldset-container">
378
+ <ng-container *ngTemplateOutlet="searchInput"></ng-container>
351
379
  <fieldset
352
380
  #fieldsetRef
353
381
  [attr.aria-describedby]="fieldset?.attributes?.id"
@@ -394,6 +422,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
394
422
  <ng-template #defaultOption let-option="option">
395
423
  {{ option[dropdown!.display] }}
396
424
  </ng-template>
425
+
426
+ <ng-template #searchInput>
427
+ <input
428
+ *ngIf="dropdown?.isSearchable"
429
+ type="search"
430
+ (input)="search($event)"
431
+ placeholder="{{ dropdown?.texts?.searchPlaceholder }}"
432
+ class="rounded-0 rounded-top border-0 border-bottom border-info"
433
+ />
434
+ </ng-template>
397
435
  `,
398
436
  providers: [
399
437
  {
@@ -416,8 +454,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
416
454
  type: Input
417
455
  }], useValue: [{
418
456
  type: Input
419
- }], multiSelect: [{
420
- type: Input
421
457
  }], label: [{
422
458
  type: Input
423
459
  }], options: [{
@@ -426,6 +462,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
426
462
  type: Input
427
463
  }], invalid: [{
428
464
  type: Input
465
+ }], searchableProperties: [{
466
+ type: Input
467
+ }], multiSelect: [{
468
+ type: Input
469
+ }], searchable: [{
470
+ type: Input
429
471
  }], value: [{
430
472
  type: Input
431
473
  }], valueChange: [{
@@ -445,4 +487,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
445
487
  type: ContentChild,
446
488
  args: [NggDropdownOptionDirective]
447
489
  }] } });
448
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL3NyYy9saWIvZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQTtBQUN0QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDeEUsT0FBTyxFQUNMLGNBQWMsRUFPZCxjQUFjLEdBRWYsTUFBTSxtQkFBbUIsQ0FBQTtBQUMxQixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQTs7O0FBK0l4RSxNQUFNLE9BQU8sb0JBQW9CO0lBbUQvQixZQUFvQixFQUFxQjtRQUFyQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQTlDaEMsU0FBSSxHQUFhLEtBQUssQ0FBQTtRQVl2QixpQkFBWSxHQUFHLEtBQUssQ0FBQTtRQUVuQixZQUFPLEdBQXFCLEVBQUUsQ0FBQTtRQVlwQixnQkFBVyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFBO1FBQ3hELFlBQU8sR0FDeEIsSUFBSSxZQUFZLEVBQVcsQ0FBQTtRQWM3QixZQUFPLEdBQTJCLGNBQWMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFBO1FBQ2xFLFlBQU8sR0FBMkIsY0FBYyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUE7UUFDbEUsYUFBUSxHQUEyQixjQUFjLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQTtRQXNGcEUsZUFBVSxHQUFHLENBQUMsS0FBYSxFQUFFLE1BQThCLEVBQVUsRUFBRTtZQUNyRSxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMs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QW5CLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFFTyxXQUFXO3NCQUF2QixLQUFLO2dCQVFHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFLTyxLQUFLO3NCQUFqQixLQUFLO2dCQUthLFdBQVc7c0JBQTdCLE1BQU07Z0JBQ1ksT0FBTztzQkFBekIsTUFBTTtnQkFHeUIsVUFBVTtzQkFBekMsU0FBUzt1QkFBQyxZQUFZO2dCQUNTLFVBQVU7c0JBQXpDLFNBQVM7dUJBQUMsWUFBWTtnQkFDVSxXQUFXO3NCQUEzQyxTQUFTO3VCQUFDLGFBQWE7Z0JBR3hCLFlBQVk7c0JBRFgsWUFBWTt1QkFBQywwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBDb250ZW50Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3JtcydcbmltcG9ydCB7XG4gIGNyZWF0ZURyb3Bkb3duLFxuICBBYnN0cmFjdERyb3Bkb3duLFxuICBEcm9wZG93bkhhbmRsZXIsXG4gIERyb3Bkb3duT3B0aW9uLFxuICBFeHRlbmRlZERyb3Bkb3duT3B0aW9uLFxuICBFbGVtZW50UHJvcHMsXG4gIERyb3Bkb3duQXJncyxcbiAgZHJvcGRvd25WYWx1ZXMsXG4gIERyb3Bkb3duVGV4dHMsXG59IGZyb20gJ0BzZWJncm91cC9leHRyYWN0J1xuaW1wb3J0IHsgTmdnRHJvcGRvd25PcHRpb25EaXJlY3RpdmUgfSBmcm9tICcuL2Ryb3Bkb3duLW9wdGlvbi5kaXJlY3RpdmUnXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nZy1kcm9wZG93bicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwibGFiZWxcIlxuICAgICAgICAqbmdJZj1cImxhYmVsXCJcbiAgICAgICAgW2lkXT1cInRvZ2dsZXI/LmF0dHJpYnV0ZXM/LmlkICsgJ19sYWJlbCdcIlxuICAgICAgICA+e3sgbGFiZWwgfX08L3NwYW5cbiAgICAgID5cbiAgICAgIDxidXR0b25cbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIlxuICAgICAgICAgIGxhYmVsID8gdG9nZ2xlcj8uYXR0cmlidXRlcz8uaWQgKyAnX2xhYmVsJyA6IG51bGxcbiAgICAgICAgXCJcbiAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJcbiAgICAgICAgICBmb3JtSW5mbz8udGV4dENvbnRlbnQgJiYgKGZvcm1JbmZvPy50ZXh0Q29udGVudD8ubGVuZ3RoID8/IDAgPiAwKVxuICAgICAgICAgICAgPyB0b2dnbGVyPy5hdHRyaWJ1dGVzPy5pZCArICdfaW5mbydcbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgICBcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgI3RvZ2dsZXJSZWZcbiAgICAgICAgW2lkXT1cInRvZ2dsZXI/LmF0dHJpYnV0ZXM/LmlkXCJcbiAgICAgICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCJ0b2dnbGVyPy5hdHRyaWJ1dGVzPy5bJ2FyaWEtaGFzcG9wdXAnXVwiXG4gICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwidG9nZ2xlcj8uYXR0cmlidXRlcz8uWydhcmlhLWV4cGFuZGVkJ11cIlxuICAgICAgICBbYXR0ci5hcmlhLW93bnNdPVwidG9nZ2xlcj8uYXR0cmlidXRlcz8uWydhcmlhLW93bnMnXVwiXG4gICAgICAgIFt0YWJpbmRleF09XCJ0b2dnbGVyPy5hdHRyaWJ1dGVzPy50YWJJbmRleFwiXG4gICAgICAgIFtzdHlsZV09XCJ0b2dnbGVyPy5hdHRyaWJ1dGVzPy5zdHlsZVwiXG4gICAgICAgIFtjbGFzc109XCJ0b2dnbGVyPy5jbGFzc2VzXCJcbiAgICAgICAgKGNsaWNrKT1cImhhbmRsZXI/LnRvZ2dsZSgpXCJcbiAgICAgICAgW2NsYXNzLmlzLXZhbGlkXT1cInZhbGlkXCJcbiAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiaW52YWxpZFwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgZHJvcGRvd24/LnRleHRzPy5zZWxlY3QgfHwgZHJvcGRvd24/LnRleHRzPy5wbGFjZWhvbGRlclxuICAgICAgICB9fTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJmb3JtLWluZm9cIlxuICAgICAgICAjZm9ybUluZm9cbiAgICAgICAgW2F0dHIuaWRdPVwidG9nZ2xlcj8uYXR0cmlidXRlcz8uaWQgKyAnX2luZm8nXCJcbiAgICAgICAgPjxuZy1jb250ZW50IHNlbGVjdD1cIltkYXRhLWZvcm0taW5mb11cIj48L25nLWNvbnRlbnRcbiAgICAgID48L3NwYW4+XG4gICAgICA8ZGl2XG4gICAgICAgICNsaXN0Ym94UmVmXG4gICAgICAgIFtpZF09XCJsaXN0Ym94Py5hdHRyaWJ1dGVzPy5pZFwiXG4gICAgICAgIFthdHRyLnJvbGVdPVwibGlzdGJveD8uYXR0cmlidXRlcz8ucm9sZVwiXG4gICAgICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJcbiAgICAgICAgICBsaXN0Ym94Py5hdHRyaWJ1dGVzPy5bJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCddXG4gICAgICAgIFwiXG4gICAgICAgIFt0YWJpbmRleF09XCJsaXN0Ym94Py5hdHRyaWJ1dGVzPy50YWJJbmRleFwiXG4gICAgICAgIFtzdHlsZV09XCJsaXN0Ym94Py5hdHRyaWJ1dGVzPy5zdHlsZVwiXG4gICAgICAgIFtjbGFzc109XCJsaXN0Ym94Py5jbGFzc2VzXCJcbiAgICAgID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY2xvc2UgbS00IG0tc20tMiBkLWJsb2NrIGQtc20tbm9uZVwiXG4gICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXI/LmNsb3NlKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+e3sgZHJvcGRvd24/LnRleHRzPy5jbG9zZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDx1bCByb2xlPVwibGlzdGJveFwiICpuZ0lmPVwiIWRyb3Bkb3duPy5pc011bHRpU2VsZWN0XCI+XG4gICAgICAgICAgPGxpXG4gICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgbGV0IG9wdGlvbiBvZiBkcm9wZG93bj8ub3B0aW9ucztcbiAgICAgICAgICAgICAgbGV0IGluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlLZXlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbaWRdPVwib3B0aW9uLmF0dHJpYnV0ZXMuaWRcIlxuICAgICAgICAgICAgW2F0dHIucm9sZV09XCJvcHRpb24uYXR0cmlidXRlcy5yb2xlXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwib3B0aW9uLmF0dHJpYnV0ZXNbJ2FyaWEtc2VsZWN0ZWQnXVwiXG4gICAgICAgICAgICBbc3R5bGVdPVwib3B0aW9uLmF0dHJpYnV0ZXMuc3R5bGVcIlxuICAgICAgICAgICAgW2NsYXNzXT1cIm9wdGlvbi5jbGFzc2VzXCJcbiAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyPy5zZWxlY3Qob3B0aW9uKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGN1c3RvbU9wdGlvbj8udGVtcGxhdGVSZWZcbiAgICAgICAgICAgICAgICAgID8gY3VzdG9tT3B0aW9uIS50ZW1wbGF0ZVJlZlxuICAgICAgICAgICAgICAgICAgOiBkZWZhdWx0T3B0aW9uO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgb3B0aW9uOiBvcHRpb24sIGluZGV4OiBpbmRleCB9XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgICAgPGRpdiAqbmdJZj1cImRyb3Bkb3duPy5pc011bHRpU2VsZWN0XCIgY2xhc3M9XCJzZy1maWVsZHNldC1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZmllbGRzZXRcbiAgICAgICAgICAgICNmaWVsZHNldFJlZlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJmaWVsZHNldD8uYXR0cmlidXRlcz8uaWRcIlxuICAgICAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxuICAgICAgICAgICAgdGFiSW5kZXg9XCItMVwiXG4gICAgICAgICAgICBhcmlhLW11bHRpc2VsZWN0YWJsZT1cInRydWVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsZWdlbmQgY2xhc3M9XCJzci1vbmx5XCIgW2lkXT1cImZpZWxkc2V0Py5hdHRyaWJ1dGVzPy5pZFwiPlxuICAgICAgICAgICAgICBPcHRpb25zXG4gICAgICAgICAgICA8L2xlZ2VuZD5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwib3B0aW9uLmF0dHJpYnV0ZXMucm9sZVwiXG4gICAgICAgICAgICAgIFtpZF09XCJvcHRpb24uYXR0cmlidXRlcy5pZFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwib3B0aW9uLmF0dHJpYnV0ZXNbJ2FyaWEtc2VsZWN0ZWQnXVwiXG4gICAgICAgICAgICAgIFtjbGFzc109XCJvcHRpb24uY2xhc3Nlc1wiXG4gICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgIGxldCBvcHRpb24gb2YgZHJvcGRvd24/Lm9wdGlvbnM7XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeUtleVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlcj8uc2VsZWN0KG9wdGlvbiwgZmFsc2UpXCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJvcHRpb24uc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIHRhYkluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgIGN1c3RvbU9wdGlvbj8udGVtcGxhdGVSZWZcbiAgICAgICAgICAgICAgICAgICAgPyBjdXN0b21PcHRpb24hLnRlbXBsYXRlUmVmXG4gICAgICAgICAgICAgICAgICAgIDogZGVmYXVsdE9wdGlvbjtcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgb3B0aW9uOiBvcHRpb24sIGluZGV4OiBpbmRleCB9XG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8aT48L2k+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRPcHRpb24gbGV0LW9wdGlvbj1cIm9wdGlvblwiPlxuICAgICAge3sgb3B0aW9uW2Ryb3Bkb3duIS5kaXNwbGF5XSB9fVxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IE5nZ0Ryb3Bkb3duQ29tcG9uZW50LFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE5nZ0Ryb3Bkb3duQ29tcG9uZW50XG4gIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzXG57XG4gIEBJbnB1dCgpIGlkPzogc3RyaW5nXG4gIEBJbnB1dCgpIHRleHRzPzogRHJvcGRvd25UZXh0c1xuICBASW5wdXQoKSBsb29wPzogYm9vbGVhbiA9IGZhbHNlXG4gIEBJbnB1dCgpIGRpc3BsYXk/OiBzdHJpbmdcbiAgQElucHV0KCkgc2VsZWN0VmFsdWU/OiBzdHJpbmdcbiAgQElucHV0KCkgdXNlVmFsdWU/OiBzdHJpbmdcblxuICBASW5wdXQoKSBzZXQgbXVsdGlTZWxlY3QodmFsdWU6IHN0cmluZyB8IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9tdWx0aVNlbGVjdCA9XG4gICAgICB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09ICd0cnVlJyB8fCB2YWx1ZS50b1N0cmluZygpID09PSAndHJ1ZScgfHwgZmFsc2VcbiAgfVxuICBnZXQgbXVsdGlTZWxlY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX211bHRpU2VsZWN0XG4gIH1cbiAgcHJpdmF0ZSBfbXVsdGlTZWxlY3QgPSBmYWxzZVxuICBASW5wdXQoKSBsYWJlbD86IHN0cmluZ1xuICBASW5wdXQoKSBvcHRpb25zOiBEcm9wZG93bk9wdGlvbltdID0gW11cbiAgQElucHV0KCkgdmFsaWQ/OiBib29sZWFuXG4gIEBJbnB1dCgpIGludmFsaWQ/OiBib29sZWFuXG5cbiAgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlXG4gIH1cbiAgQElucHV0KCkgc2V0IHZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnNldFNlbGVjdGlvbkJ5VmFsdWUobmV3VmFsdWUpXG4gIH1cbiAgcHJpdmF0ZSBfdmFsdWU6IGFueVxuXG4gIEBPdXRwdXQoKSByZWFkb25seSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKVxuICBAT3V0cHV0KCkgcmVhZG9ubHkgdG91Y2hlZDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KClcblxuICBAVmlld0NoaWxkKCd0b2dnbGVyUmVmJykgcHVibGljIHRvZ2dsZXJSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PlxuICBAVmlld0NoaWxkKCdsaXN0Ym94UmVmJykgcHVibGljIGxpc3Rib3hSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PlxuICBAVmlld0NoaWxkKCdmaWVsZHNldFJlZicpIHB1YmxpYyBmaWVsZHNldFJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG5cbiAgQENvbnRlbnRDaGlsZChOZ2dEcm9wZG93bk9wdGlvbkRpcmVjdGl2ZSlcbiAgY3VzdG9tT3B0aW9uPzogTmdnRHJvcGRvd25PcHRpb25EaXJlY3RpdmVcblxuICBvbkNoYW5nZUZuPzogKHZhbHVlOiBhbnkpID0+IHZvaWRcbiAgb25Ub3VjaGVkRm4/OiAoKSA9PiB2b2lkXG5cbiAgZHJvcGRvd24/OiBBYnN0cmFjdERyb3Bkb3duXG4gIGhhbmRsZXI/OiBEcm9wZG93bkhhbmRsZXJcbiAgdG9nZ2xlcj86IFBhcnRpYWw8RWxlbWVudFByb3BzPiA9IGRyb3Bkb3duVmFsdWVzLmVsZW1lbnRzPy50b2dnbGVyXG4gIGxpc3Rib3g/OiBQYXJ0aWFsPEVsZW1lbnRQcm9wcz4gPSBkcm9wZG93blZhbHVlcy5lbGVtZW50cz8ubGlzdGJveFxuICBmaWVsZHNldD86IFBhcnRpYWw8RWxlbWVudFByb3BzPiA9IGRyb3Bkb3duVmFsdWVzLmVsZW1lbnRzPy5maWVsZHNldFxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50b2dnbGVyUmVmPy5uYXRpdmVFbGVtZW50ICYmIHRoaXMubGlzdGJveFJlZj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy5oYW5kbGVyID0gY3JlYXRlRHJvcGRvd24oXG4gICAgICAgIHRoaXMucHJvcHMsXG4gICAgICAgIHRoaXMudG9nZ2xlclJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICB0aGlzLmxpc3Rib3hSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgdGhpcy5maWVsZHNldFJlZj8ubmF0aXZlRWxlbWVudCxcbiAgICAgICAgKGRyb3Bkb3duKSA9PiB7XG4gICAgICAgICAgdGhpcy5kcm9wZG93biA9IGRyb3Bkb3duXG4gICAgICAgICAgdGhpcy50b2dnbGVyID0gZHJvcGRvd24uZWxlbWVudHMudG9nZ2xlclxuICAgICAgICAgIHRoaXMubGlzdGJveCA9IGRyb3Bkb3duLmVsZW1lbnRzLmxpc3Rib3hcbiAgICAgICAgICB0aGlzLmZpZWxkc2V0ID0gZHJvcGRvd24uZWxlbWVudHMuZmllbGRzZXRcblxuICAgICAgICAgIC8vIFRPRE86IHJlZmFjdG9yIHN0YXRlIGhhbmRsaW5nIHRvIG9ubHkgZW1pdCB2YWx1ZSBjaGFuZ2VzIHdoZW4gdmFsdWUgY2hhbmdlcyAobm90IG9uIHN0YXRlIGNoYW5nZSksIHBlcmhhcHMgdXNpbmcgcnhqcz9cbiAgICAgICAgICBpZiAoIWRyb3Bkb3duLmlzTXVsdGlTZWxlY3QpIHtcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZE9wdGlvbiA9IHRoaXMuZHJvcGRvd24ub3B0aW9ucz8uZmluZChcbiAgICAgICAgICAgICAgKG9wdGlvbikgPT4gb3B0aW9uLnNlbGVjdGVkXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIChzZWxlY3RlZE9wdGlvbiAmJiAhdGhpcy5fdmFsdWUpIHx8XG4gICAgICAgICAgICAgIChzZWxlY3RlZE9wdGlvbiAmJlxuICAgICAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9uW2Ryb3Bkb3duLnVzZVZhbHVlXSAhPT1cbiAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlW2Ryb3Bkb3duLnVzZVZhbHVlXSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zdCB7IGF0dHJpYnV0ZXMsIGNsYXNzZXMsIGFjdGl2ZSwgc2VsZWN0ZWQsIC4uLmRhdGEgfSA9XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb25cbiAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb24gPSBkcm9wZG93bi5zZWxlY3RWYWx1ZVxuICAgICAgICAgICAgICAgID8gZGF0YVtkcm9wZG93bi5zZWxlY3RWYWx1ZV1cbiAgICAgICAgICAgICAgICA6IGRhdGFcblxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKHNlbGVjdGVkT3B0aW9uKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IHRoaXMuZHJvcGRvd24ub3B0aW9uc1xuICAgICAgICAgICAgICA/LmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24uc2VsZWN0ZWQpXG4gICAgICAgICAgICAgIC5tYXAoKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgYXR0cmlidXRlcywgY2xhc3NlcywgYWN0aXZlLCBzZWxlY3RlZCwgLi4uZGF0YSB9ID1cbiAgICAgICAgICAgICAgICAgIG9wdGlvblxuICAgICAgICAgICAgICAgIHJldHVybiBkcm9wZG93bi5zZWxlY3RWYWx1ZSA/IGRhdGFbZHJvcGRvd24uc2VsZWN0VmFsdWVdIDogZGF0YVxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICh0aGlzLl92YWx1ZSAhPT0gdW5kZWZpbmVkIHx8IHNlbGVjdGVkT3B0aW9uPy5sZW5ndGggPiAwKSAmJlxuICAgICAgICAgICAgICB0aGlzLl92YWx1ZSAhPT0gW10gJiZcbiAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb24gJiZcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5fdmFsdWUpICE9PSBKU09OLnN0cmluZ2lmeShzZWxlY3RlZE9wdGlvbilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKHNlbGVjdGVkT3B0aW9uKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRsZXI/LmRlc3Ryb3koKVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaGFuZGxlciAmJlxuICAgICAgKGNoYW5nZXMuaWQgfHwgY2hhbmdlcy50ZXh0IHx8IGNoYW5nZXMubG9vcCB8fCBjaGFuZ2VzLm9wdGlvbnMpXG4gICAgKSB7XG4gICAgICB0aGlzLmhhbmRsZXIudXBkYXRlKHRoaXMucHJvcHMpXG4gICAgfVxuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmblxuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkRm4gPSBmblxuICB9XG5cbiAgdHJhY2tCeUtleSA9IChpbmRleDogbnVtYmVyLCBvcHRpb246IEV4dGVuZGVkRHJvcGRvd25PcHRpb24pOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBvcHRpb25bJyddIHx8IG9wdGlvbi5rZXlcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHByb3BzKCk6IERyb3Bkb3duQXJncyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkIHx8IHRoaXMuZHJvcGRvd24/LmlkLFxuICAgICAgdGV4dHM6IHRoaXMudGV4dHMsXG4gICAgICB1c2VWYWx1ZTogdGhpcy51c2VWYWx1ZSxcbiAgICAgIGRpc3BsYXk6IHRoaXMuZGlzcGxheSxcbiAgICAgIHNlbGVjdFZhbHVlOiB0aGlzLnNlbGVjdFZhbHVlLFxuICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgbG9vcDogdGhpcy5sb29wLFxuICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG4gICAgICBtdWx0aVNlbGVjdDogdGhpcy5tdWx0aVNlbGVjdCxcbiAgICAgIG9uVG91Y2hlZDogKCkgPT4ge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZEZuPy4oKVxuICAgICAgICB0aGlzLnRvdWNoZWQuZW1pdCh0cnVlKVxuICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpXG4gICAgICB9LFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVmFsdWUob3B0aW9uOiBhbnkpIHtcbiAgICB0aGlzLl92YWx1ZSA9IG9wdGlvblxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChvcHRpb24pXG4gICAgdGhpcy5vbkNoYW5nZUZuPy4ob3B0aW9uKVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRTZWxlY3Rpb25CeVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd24/LmlzTXVsdGlTZWxlY3QpIHtcbiAgICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gdmFsdWUgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlXG4gICAgICAgIGNvbnN0IHZhbHVlS2V5ID0gPHN0cmluZz50aGlzLmhhbmRsZXI/LmRyb3Bkb3duLnVzZVZhbHVlXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5oYW5kbGVyPy5kcm9wZG93bj8ub3B0aW9ucy5maW5kKFxuICAgICAgICAgIChvcHRpb24pID0+XG4gICAgICAgICAgICBvcHRpb25bdmFsdWVLZXldID09PSB2YWx1ZVt2YWx1ZUtleV0gfHwgb3B0aW9uW3ZhbHVlS2V5XSA9PT0gdmFsdWVcbiAgICAgICAgKVxuICAgICAgICBpZiAoc2VsZWN0ZWQpIHRoaXMuaGFuZGxlcj8uc2VsZWN0KHNlbGVjdGVkKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
490
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL3NyYy9saWIvZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQTtBQUN0QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDeEUsT0FBTyxFQUNMLGNBQWMsRUFPZCxjQUFjLEdBRWYsTUFBTSxtQkFBbUIsQ0FBQTtBQUMxQixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQTs7O0FBMkp4RSxNQUFNLE9BQU8sb0JBQW9CO0lBMkQvQixZQUFvQixFQUFxQjtRQUFyQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQXREaEMsU0FBSSxHQUFhLEtBQUssQ0FBQTtRQUt0QixZQUFPLEdBQXFCLEVBQUUsQ0FBQTtRQVcvQixpQkFBWSxHQUFHLEtBQUssQ0FBQTtRQVFwQixnQkFBVyxHQUFHLEtBQUssQ0FBQTtRQVVSLGdCQUFXLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUE7UUFDeEQsWUFBTyxHQUN4QixJQUFJLFlBQVksRUFBVyxDQUFBO1FBYzdCLFlBQU8sR0FBMkIsY0FBYyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUE7UUFDbEUsWUFBTyxHQUEyQixjQUFjLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQTtRQUNsRSxhQUFRLEdBQTJCLGNBQWMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFBO1FBc0ZwRSxlQUFVLEdBQUcsQ0FBQyxLQUFhLEVBQUUsTUFBOEIsRUFBVSxFQUFFO1lBQ3JFLE9BQU8sTUFBTSxDQUFD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ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIEV2ZW50RW1pdHRlcixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgQ29udGVudENoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5pbXBvcnQge1xuICBjcmVhdGVEcm9wZG93bixcbiAgQWJzdHJhY3REcm9wZG93bixcbiAgRHJvcGRvd25IYW5kbGVyLFxuICBEcm9wZG93bk9wdGlvbixcbiAgRXh0ZW5kZWREcm9wZG93bk9wdGlvbixcbiAgRWxlbWVudFByb3BzLFxuICBEcm9wZG93bkFyZ3MsXG4gIGRyb3Bkb3duVmFsdWVzLFxuICBEcm9wZG93blRleHRzLFxufSBmcm9tICdAc2ViZ3JvdXAvZXh0cmFjdCdcbmltcG9ydCB7IE5nZ0Ryb3Bkb3duT3B0aW9uRGlyZWN0aXZlIH0gZnJvbSAnLi9kcm9wZG93bi1vcHRpb24uZGlyZWN0aXZlJ1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ2ctZHJvcGRvd24nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXY+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImxhYmVsXCJcbiAgICAgICAgKm5nSWY9XCJsYWJlbFwiXG4gICAgICAgIFtpZF09XCJ0b2dnbGVyPy5hdHRyaWJ1dGVzPy5pZCArICdfbGFiZWwnXCJcbiAgICAgICAgPnt7IGxhYmVsIH19PC9zcGFuXG4gICAgICA+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJcbiAgICAgICAgICBsYWJlbCA/IHRvZ2dsZXI/LmF0dHJpYnV0ZXM/LmlkICsgJ19sYWJlbCcgOiBudWxsXG4gICAgICAgIFwiXG4gICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiXG4gICAgICAgICAgZm9ybUluZm8/LnRleHRDb250ZW50ICYmIChmb3JtSW5mbz8udGV4dENvbnRlbnQ/Lmxlbmd0aCA/PyAwID4gMClcbiAgICAgICAgICAgID8gdG9nZ2xlcj8uYXR0cmlidXRlcz8uaWQgKyAnX2luZm8nXG4gICAgICAgICAgICA6IG51bGxcbiAgICAgICAgXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICN0b2dnbGVyUmVmXG4gICAgICAgIFtpZF09XCJ0b2dnbGVyPy5hdHRyaWJ1dGVzPy5pZFwiXG4gICAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwidG9nZ2xlcj8uYXR0cmlidXRlcz8uWydhcmlhLWhhc3BvcHVwJ11cIlxuICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInRvZ2dsZXI/LmF0dHJpYnV0ZXM/LlsnYXJpYS1leHBhbmRlZCddXCJcbiAgICAgICAgW2F0dHIuYXJpYS1vd25zXT1cInRvZ2dsZXI/LmF0dHJpYnV0ZXM/LlsnYXJpYS1vd25zJ11cIlxuICAgICAgICBbdGFiaW5kZXhdPVwidG9nZ2xlcj8uYXR0cmlidXRlcz8udGFiSW5kZXhcIlxuICAgICAgICBbc3R5bGVdPVwidG9nZ2xlcj8uYXR0cmlidXRlcz8uc3R5bGVcIlxuICAgICAgICBbY2xhc3NdPVwidG9nZ2xlcj8uY2xhc3Nlc1wiXG4gICAgICAgIChjbGljayk9XCJoYW5kbGVyPy50b2dnbGUoKVwiXG4gICAgICAgIFtjbGFzcy5pcy12YWxpZF09XCJ2YWxpZFwiXG4gICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImludmFsaWRcIlxuICAgICAgPlxuICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgIGRyb3Bkb3duPy50ZXh0cz8uc2VsZWN0IHx8IGRyb3Bkb3duPy50ZXh0cz8ucGxhY2Vob2xkZXJcbiAgICAgICAgfX08L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwiZm9ybS1pbmZvXCJcbiAgICAgICAgI2Zvcm1JbmZvXG4gICAgICAgIFthdHRyLmlkXT1cInRvZ2dsZXI/LmF0dHJpYnV0ZXM/LmlkICsgJ19pbmZvJ1wiXG4gICAgICAgID48bmctY29udGVudCBzZWxlY3Q9XCJbZGF0YS1mb3JtLWluZm9dXCI+PC9uZy1jb250ZW50XG4gICAgICA+PC9zcGFuPlxuICAgICAgPGRpdlxuICAgICAgICAjbGlzdGJveFJlZlxuICAgICAgICBbaWRdPVwibGlzdGJveD8uYXR0cmlidXRlcz8uaWRcIlxuICAgICAgICBbYXR0ci5yb2xlXT1cImxpc3Rib3g/LmF0dHJpYnV0ZXM/LnJvbGVcIlxuICAgICAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiXG4gICAgICAgICAgbGlzdGJveD8uYXR0cmlidXRlcz8uWydhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnXVxuICAgICAgICBcIlxuICAgICAgICBbdGFiaW5kZXhdPVwibGlzdGJveD8uYXR0cmlidXRlcz8udGFiSW5kZXhcIlxuICAgICAgICBbc3R5bGVdPVwibGlzdGJveD8uYXR0cmlidXRlcz8uc3R5bGVcIlxuICAgICAgICBbY2xhc3NdPVwibGlzdGJveD8uY2xhc3Nlc1wiXG4gICAgICA+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNsb3NlIG0tNCBtLXNtLTIgZC1ibG9jayBkLXNtLW5vbmVcIlxuICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyPy5jbG9zZSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPnt7IGRyb3Bkb3duPy50ZXh0cz8uY2xvc2UgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8dWwgcm9sZT1cImxpc3Rib3hcIiAqbmdJZj1cIiFkcm9wZG93bj8uaXNNdWx0aVNlbGVjdFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWFyY2hJbnB1dFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxsaVxuICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgIGxldCBvcHRpb24gb2YgZHJvcGRvd24/Lm9wdGlvbnM7XG4gICAgICAgICAgICAgIGxldCBpbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5S2V5XG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2lkXT1cIm9wdGlvbi5hdHRyaWJ1dGVzLmlkXCJcbiAgICAgICAgICAgIFthdHRyLnJvbGVdPVwib3B0aW9uLmF0dHJpYnV0ZXMucm9sZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cIm9wdGlvbi5hdHRyaWJ1dGVzWydhcmlhLXNlbGVjdGVkJ11cIlxuICAgICAgICAgICAgW3N0eWxlXT1cIm9wdGlvbi5hdHRyaWJ1dGVzLnN0eWxlXCJcbiAgICAgICAgICAgIFtjbGFzc109XCJvcHRpb24uY2xhc3Nlc1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlcj8uc2VsZWN0KG9wdGlvbilcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICBjdXN0b21PcHRpb24/LnRlbXBsYXRlUmVmXG4gICAgICAgICAgICAgICAgICA/IGN1c3RvbU9wdGlvbiEudGVtcGxhdGVSZWZcbiAgICAgICAgICAgICAgICAgIDogZGVmYXVsdE9wdGlvbjtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7IG9wdGlvbjogb3B0aW9uLCBpbmRleDogaW5kZXggfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJkcm9wZG93bj8uaXNNdWx0aVNlbGVjdFwiIGNsYXNzPVwic2ctZmllbGRzZXQtY29udGFpbmVyXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlYXJjaElucHV0XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPGZpZWxkc2V0XG4gICAgICAgICAgICAjZmllbGRzZXRSZWZcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiZmllbGRzZXQ/LmF0dHJpYnV0ZXM/LmlkXCJcbiAgICAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgICAgIHRhYkluZGV4PVwiLTFcIlxuICAgICAgICAgICAgYXJpYS1tdWx0aXNlbGVjdGFibGU9XCJ0cnVlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bGVnZW5kIGNsYXNzPVwic3Itb25seVwiIFtpZF09XCJmaWVsZHNldD8uYXR0cmlidXRlcz8uaWRcIj5cbiAgICAgICAgICAgICAgT3B0aW9uc1xuICAgICAgICAgICAgPC9sZWdlbmQ+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cIm9wdGlvbi5hdHRyaWJ1dGVzLnJvbGVcIlxuICAgICAgICAgICAgICBbaWRdPVwib3B0aW9uLmF0dHJpYnV0ZXMuaWRcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cIm9wdGlvbi5hdHRyaWJ1dGVzWydhcmlhLXNlbGVjdGVkJ11cIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwib3B0aW9uLmNsYXNzZXNcIlxuICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICBsZXQgb3B0aW9uIG9mIGRyb3Bkb3duPy5vcHRpb25zO1xuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlLZXlcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZXI/LnNlbGVjdChvcHRpb24sIGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwib3B0aW9uLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICB0YWJJbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICBjdXN0b21PcHRpb24/LnRlbXBsYXRlUmVmXG4gICAgICAgICAgICAgICAgICAgID8gY3VzdG9tT3B0aW9uIS50ZW1wbGF0ZVJlZlxuICAgICAgICAgICAgICAgICAgICA6IGRlZmF1bHRPcHRpb247XG4gICAgICAgICAgICAgICAgICBjb250ZXh0OiB7IG9wdGlvbjogb3B0aW9uLCBpbmRleDogaW5kZXggfVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPGk+PC9pPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0T3B0aW9uIGxldC1vcHRpb249XCJvcHRpb25cIj5cbiAgICAgIHt7IG9wdGlvbltkcm9wZG93biEuZGlzcGxheV0gfX1cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlICNzZWFyY2hJbnB1dD5cbiAgICAgIDxpbnB1dFxuICAgICAgICAqbmdJZj1cImRyb3Bkb3duPy5pc1NlYXJjaGFibGVcIlxuICAgICAgICB0eXBlPVwic2VhcmNoXCJcbiAgICAgICAgKGlucHV0KT1cInNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyBkcm9wZG93bj8udGV4dHM/LnNlYXJjaFBsYWNlaG9sZGVyIH19XCJcbiAgICAgICAgY2xhc3M9XCJyb3VuZGVkLTAgcm91bmRlZC10b3AgYm9yZGVyLTAgYm9yZGVyLWJvdHRvbSBib3JkZXItaW5mb1wiXG4gICAgICAvPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IE5nZ0Ryb3Bkb3duQ29tcG9uZW50LFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE5nZ0Ryb3Bkb3duQ29tcG9uZW50XG4gIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzXG57XG4gIEBJbnB1dCgpIGlkPzogc3RyaW5nXG4gIEBJbnB1dCgpIHRleHRzPzogRHJvcGRvd25UZXh0c1xuICBASW5wdXQoKSBsb29wPzogYm9vbGVhbiA9IGZhbHNlXG4gIEBJbnB1dCgpIGRpc3BsYXk/OiBzdHJpbmdcbiAgQElucHV0KCkgc2VsZWN0VmFsdWU/OiBzdHJpbmdcbiAgQElucHV0KCkgdXNlVmFsdWU/OiBzdHJpbmdcbiAgQElucHV0KCkgbGFiZWw/OiBzdHJpbmdcbiAgQElucHV0KCkgb3B0aW9uczogRHJvcGRvd25PcHRpb25bXSA9IFtdXG4gIEBJbnB1dCgpIHZhbGlkPzogYm9vbGVhblxuICBASW5wdXQoKSBpbnZhbGlkPzogYm9vbGVhblxuICBASW5wdXQoKSBzZWFyY2hhYmxlUHJvcGVydGllcz86IHN0cmluZ1tdXG5cbiAgQElucHV0KCkgc2V0IG11bHRpU2VsZWN0KHZhbHVlOiBzdHJpbmcgfCBib29sZWFuKSB7XG4gICAgdGhpcy5fbXVsdGlTZWxlY3QgPSB0aGlzLmNvbnZlcnRUb0Jvb2xlYW4odmFsdWUpXG4gIH1cbiAgZ2V0IG11bHRpU2VsZWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9tdWx0aVNlbGVjdFxuICB9XG4gIHByaXZhdGUgX211bHRpU2VsZWN0ID0gZmFsc2VcblxuICBASW5wdXQoKSBzZXQgc2VhcmNoYWJsZSh2YWx1ZTogc3RyaW5nIHwgYm9vbGVhbikge1xuICAgIHRoaXMuX3NlYXJjaGFibGUgPSB0aGlzLmNvbnZlcnRUb0Jvb2xlYW4odmFsdWUpXG4gIH1cbiAgZ2V0IHNlYXJjaGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlYXJjaGFibGVcbiAgfVxuICBwcml2YXRlIF9zZWFyY2hhYmxlID0gZmFsc2VcblxuICBASW5wdXQoKSBzZXQgdmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIHRoaXMuc2V0U2VsZWN0aW9uQnlWYWx1ZShuZXdWYWx1ZSlcbiAgfVxuICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVcbiAgfVxuICBwcml2YXRlIF92YWx1ZTogYW55XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIEBPdXRwdXQoKSByZWFkb25seSB0b3VjaGVkOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKVxuXG4gIEBWaWV3Q2hpbGQoJ3RvZ2dsZXJSZWYnKSBwdWJsaWMgdG9nZ2xlclJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gIEBWaWV3Q2hpbGQoJ2xpc3Rib3hSZWYnKSBwdWJsaWMgbGlzdGJveFJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gIEBWaWV3Q2hpbGQoJ2ZpZWxkc2V0UmVmJykgcHVibGljIGZpZWxkc2V0UmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cblxuICBAQ29udGVudENoaWxkKE5nZ0Ryb3Bkb3duT3B0aW9uRGlyZWN0aXZlKVxuICBjdXN0b21PcHRpb24/OiBOZ2dEcm9wZG93bk9wdGlvbkRpcmVjdGl2ZVxuXG4gIG9uQ2hhbmdlRm4/OiAodmFsdWU6IGFueSkgPT4gdm9pZFxuICBvblRvdWNoZWRGbj86ICgpID0+IHZvaWRcblxuICBkcm9wZG93bj86IEFic3RyYWN0RHJvcGRvd25cbiAgaGFuZGxlcj86IERyb3Bkb3duSGFuZGxlclxuICB0b2dnbGVyPzogUGFydGlhbDxFbGVtZW50UHJvcHM+ID0gZHJvcGRvd25WYWx1ZXMuZWxlbWVudHM/LnRvZ2dsZXJcbiAgbGlzdGJveD86IFBhcnRpYWw8RWxlbWVudFByb3BzPiA9IGRyb3Bkb3duVmFsdWVzLmVsZW1lbnRzPy5saXN0Ym94XG4gIGZpZWxkc2V0PzogUGFydGlhbDxFbGVtZW50UHJvcHM+ID0gZHJvcGRvd25WYWx1ZXMuZWxlbWVudHM/LmZpZWxkc2V0XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRvZ2dsZXJSZWY/Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5saXN0Ym94UmVmPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLmhhbmRsZXIgPSBjcmVhdGVEcm9wZG93bihcbiAgICAgICAgdGhpcy5wcm9wcyxcbiAgICAgICAgdGhpcy50b2dnbGVyUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIHRoaXMubGlzdGJveFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICB0aGlzLmZpZWxkc2V0UmVmPy5uYXRpdmVFbGVtZW50LFxuICAgICAgICAoZHJvcGRvd24pID0+IHtcbiAgICAgICAgICB0aGlzLmRyb3Bkb3duID0gZHJvcGRvd25cbiAgICAgICAgICB0aGlzLnRvZ2dsZXIgPSBkcm9wZG93bi5lbGVtZW50cy50b2dnbGVyXG4gICAgICAgICAgdGhpcy5saXN0Ym94ID0gZHJvcGRvd24uZWxlbWVudHMubGlzdGJveFxuICAgICAgICAgIHRoaXMuZmllbGRzZXQgPSBkcm9wZG93bi5lbGVtZW50cy5maWVsZHNldFxuXG4gICAgICAgICAgLy8gVE9ETzogcmVmYWN0b3Igc3RhdGUgaGFuZGxpbmcgdG8gb25seSBlbWl0IHZhbHVlIGNoYW5nZXMgd2hlbiB2YWx1ZSBjaGFuZ2VzIChub3Qgb24gc3RhdGUgY2hhbmdlKSwgcGVyaGFwcyB1c2luZyByeGpzP1xuICAgICAgICAgIGlmICghZHJvcGRvd24uaXNNdWx0aVNlbGVjdCkge1xuICAgICAgICAgICAgbGV0IHNlbGVjdGVkT3B0aW9uID0gdGhpcy5kcm9wZG93bi5vcHRpb25zPy5maW5kKFxuICAgICAgICAgICAgICAob3B0aW9uKSA9PiBvcHRpb24uc2VsZWN0ZWRcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKHNlbGVjdGVkT3B0aW9uICYmICF0aGlzLl92YWx1ZSkgfHxcbiAgICAgICAgICAgICAgKHNlbGVjdGVkT3B0aW9uICYmXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb25bZHJvcGRvd24udXNlVmFsdWVdICE9PVxuICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVbZHJvcGRvd24udXNlVmFsdWVdKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgYXR0cmlidXRlcywgY2xhc3NlcywgYWN0aXZlLCBzZWxlY3RlZCwgLi4uZGF0YSB9ID1cbiAgICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvblxuICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvbiA9IGRyb3Bkb3duLnNlbGVjdFZhbHVlXG4gICAgICAgICAgICAgICAgPyBkYXRhW2Ryb3Bkb3duLnNlbGVjdFZhbHVlXVxuICAgICAgICAgICAgICAgIDogZGF0YVxuXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWUoc2VsZWN0ZWRPcHRpb24pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gdGhpcy5kcm9wZG93bi5vcHRpb25zXG4gICAgICAgICAgICAgID8uZmlsdGVyKChvcHRpb24pID0+IG9wdGlvbi5zZWxlY3RlZClcbiAgICAgICAgICAgICAgLm1hcCgob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBhdHRyaWJ1dGVzLCBjbGFzc2VzLCBhY3RpdmUsIHNlbGVjdGVkLCAuLi5kYXRhIH0gPVxuICAgICAgICAgICAgICAgICAgb3B0aW9uXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRyb3Bkb3duLnNlbGVjdFZhbHVlID8gZGF0YVtkcm9wZG93bi5zZWxlY3RWYWx1ZV0gOiBkYXRhXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKHRoaXMuX3ZhbHVlICE9PSB1bmRlZmluZWQgfHwgc2VsZWN0ZWRPcHRpb24/Lmxlbmd0aCA+IDApICYmXG4gICAgICAgICAgICAgIHRoaXMuX3ZhbHVlICE9PSBbXSAmJlxuICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvbiAmJlxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLl92YWx1ZSkgIT09IEpTT04uc3RyaW5naWZ5KHNlbGVjdGVkT3B0aW9uKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWUoc2VsZWN0ZWRPcHRpb24pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKClcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlcj8uZGVzdHJveSgpXG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5oYW5kbGVyICYmXG4gICAgICAoY2hhbmdlcy5pZCB8fCBjaGFuZ2VzLnRleHQgfHwgY2hhbmdlcy5sb29wIHx8IGNoYW5nZXMub3B0aW9ucylcbiAgICApIHtcbiAgICAgIHRoaXMuaGFuZGxlci51cGRhdGUodGhpcy5wcm9wcylcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWVcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2VGbiA9IGZuXG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWRGbiA9IGZuXG4gIH1cblxuICB0cmFja0J5S2V5ID0gKGluZGV4OiBudW1iZXIsIG9wdGlvbjogRXh0ZW5kZWREcm9wZG93bk9wdGlvbik6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIG9wdGlvblsnJ10gfHwgb3B0aW9uLmtleVxuICB9XG5cbiAgc2VhcmNoKCRldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5oYW5kbGVyPy5zZWFyY2goJGV2ZW50LnRhcmdldC52YWx1ZSlcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHByb3BzKCk6IERyb3Bkb3duQXJncyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkIHx8IHRoaXMuZHJvcGRvd24/LmlkLFxuICAgICAgdGV4dHM6IHRoaXMudGV4dHMsXG4gICAgICB1c2VWYWx1ZTogdGhpcy51c2VWYWx1ZSxcbiAgICAgIGRpc3BsYXk6IHRoaXMuZGlzcGxheSxcbiAgICAgIHNlbGVjdFZhbHVlOiB0aGlzLnNlbGVjdFZhbHVlLFxuICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgbG9vcDogdGhpcy5sb29wLFxuICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG4gICAgICBtdWx0aVNlbGVjdDogdGhpcy5tdWx0aVNlbGVjdCxcbiAgICAgIHNlYXJjaGFibGU6IHRoaXMuc2VhcmNoYWJsZSxcbiAgICAgIHNlYXJjaGFibGVQcm9wZXJ0aWVzOiB0aGlzLnNlYXJjaGFibGVQcm9wZXJ0aWVzLFxuICAgICAgb25Ub3VjaGVkOiAoKSA9PiB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkRm4/LigpXG4gICAgICAgIHRoaXMudG91Y2hlZC5lbWl0KHRydWUpXG4gICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKClcbiAgICAgIH0sXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVWYWx1ZShvcHRpb246IGFueSkge1xuICAgIHRoaXMuX3ZhbHVlID0gb3B0aW9uXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KG9wdGlvbilcbiAgICB0aGlzLm9uQ2hhbmdlRm4/LihvcHRpb24pXG4gIH1cblxuICBwcml2YXRlIHNldFNlbGVjdGlvbkJ5VmFsdWUodmFsdWU6IGFueSkge1xuICAgIGlmICghdGhpcy5kcm9wZG93bj8uaXNNdWx0aVNlbGVjdCkge1xuICAgICAgaWYgKHRoaXMuX3ZhbHVlICE9PSB2YWx1ZSAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWVcbiAgICAgICAgY29uc3QgdmFsdWVLZXkgPSA8c3RyaW5nPnRoaXMuaGFuZGxlcj8uZHJvcGRvd24udXNlVmFsdWVcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmhhbmRsZXI/LmRyb3Bkb3duPy5vcHRpb25zLmZpbmQoXG4gICAgICAgICAgKG9wdGlvbikgPT5cbiAgICAgICAgICAgIG9wdGlvblt2YWx1ZUtleV0gPT09IHZhbHVlW3ZhbHVlS2V5XSB8fCBvcHRpb25bdmFsdWVLZXldID09PSB2YWx1ZVxuICAgICAgICApXG4gICAgICAgIGlmIChzZWxlY3RlZCkgdGhpcy5oYW5kbGVyPy5zZWxlY3Qoc2VsZWN0ZWQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0VG9Cb29sZWFuKHZhbHVlOiBzdHJpbmcgfCBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gJ3RydWUnIHx8IHZhbHVlLnRvU3RyaW5nKCkgPT09ICd0cnVlJyB8fCBmYWxzZVxuICAgIClcbiAgfVxufVxuIl19
@@ -78,8 +78,9 @@ class NggDropdownComponent {
78
78
  var _a, _b, _c;
79
79
  this.cd = cd;
80
80
  this.loop = false;
81
- this._multiSelect = false;
82
81
  this.options = [];
82
+ this._multiSelect = false;
83
+ this._searchable = false;
83
84
  this.valueChange = new EventEmitter();
84
85
  this.touched = new EventEmitter();
85
86
  this.toggler = (_a = dropdownValues.elements) === null || _a === void 0 ? void 0 : _a.toggler;
@@ -90,18 +91,23 @@ class NggDropdownComponent {
90
91
  };
91
92
  }
92
93
  set multiSelect(value) {
93
- this._multiSelect =
94
- value === '' || value === 'true' || value.toString() === 'true' || false;
94
+ this._multiSelect = this.convertToBoolean(value);
95
95
  }
96
96
  get multiSelect() {
97
97
  return this._multiSelect;
98
98
  }
99
- get value() {
100
- return this._value;
99
+ set searchable(value) {
100
+ this._searchable = this.convertToBoolean(value);
101
+ }
102
+ get searchable() {
103
+ return this._searchable;
101
104
  }
102
105
  set value(newValue) {
103
106
  this.setSelectionByValue(newValue);
104
107
  }
108
+ get value() {
109
+ return this._value;
110
+ }
105
111
  ngAfterViewInit() {
106
112
  var _a, _b, _c;
107
113
  if (((_a = this.togglerRef) === null || _a === void 0 ? void 0 : _a.nativeElement) && ((_b = this.listboxRef) === null || _b === void 0 ? void 0 : _b.nativeElement)) {
@@ -160,6 +166,10 @@ class NggDropdownComponent {
160
166
  registerOnTouched(fn) {
161
167
  this.onTouchedFn = fn;
162
168
  }
169
+ search($event) {
170
+ var _a;
171
+ (_a = this.handler) === null || _a === void 0 ? void 0 : _a.search($event.target.value);
172
+ }
163
173
  get props() {
164
174
  var _a;
165
175
  return {
@@ -172,6 +182,8 @@ class NggDropdownComponent {
172
182
  loop: this.loop,
173
183
  value: this.value,
174
184
  multiSelect: this.multiSelect,
185
+ searchable: this.searchable,
186
+ searchableProperties: this.searchableProperties,
175
187
  onTouched: () => {
176
188
  var _a;
177
189
  (_a = this.onTouchedFn) === null || _a === void 0 ? void 0 : _a.call(this);
@@ -198,9 +210,12 @@ class NggDropdownComponent {
198
210
  }
199
211
  }
200
212
  }
213
+ convertToBoolean(value) {
214
+ return (value === '' || value === 'true' || value.toString() === 'true' || false);
215
+ }
201
216
  }
202
217
  NggDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: NggDropdownComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
203
- NggDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: NggDropdownComponent, selector: "ngg-dropdown", inputs: { id: "id", texts: "texts", loop: "loop", display: "display", selectValue: "selectValue", useValue: "useValue", multiSelect: "multiSelect", label: "label", options: "options", valid: "valid", invalid: "invalid", value: "value" }, outputs: { valueChange: "valueChange", touched: "touched" }, providers: [
218
+ NggDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: NggDropdownComponent, selector: "ngg-dropdown", inputs: { id: "id", texts: "texts", loop: "loop", display: "display", selectValue: "selectValue", useValue: "useValue", label: "label", options: "options", valid: "valid", invalid: "invalid", searchableProperties: "searchableProperties", multiSelect: "multiSelect", searchable: "searchable", value: "value" }, outputs: { valueChange: "valueChange", touched: "touched" }, providers: [
204
219
  {
205
220
  provide: NG_VALUE_ACCESSOR,
206
221
  useExisting: NggDropdownComponent,
@@ -265,6 +280,7 @@ NggDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", v
265
280
  <span class="sr-only">{{ dropdown?.texts?.close }}</span>
266
281
  </button>
267
282
  <ul role="listbox" *ngIf="!dropdown?.isMultiSelect">
283
+ <ng-container *ngTemplateOutlet="searchInput"></ng-container>
268
284
  <li
269
285
  *ngFor="
270
286
  let option of dropdown?.options;
@@ -289,6 +305,7 @@ NggDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", v
289
305
  </li>
290
306
  </ul>
291
307
  <div *ngIf="dropdown?.isMultiSelect" class="sg-fieldset-container">
308
+ <ng-container *ngTemplateOutlet="searchInput"></ng-container>
292
309
  <fieldset
293
310
  #fieldsetRef
294
311
  [attr.aria-describedby]="fieldset?.attributes?.id"
@@ -335,7 +352,17 @@ NggDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", v
335
352
  <ng-template #defaultOption let-option="option">
336
353
  {{ option[dropdown!.display] }}
337
354
  </ng-template>
338
- `, isInline: true, directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
355
+
356
+ <ng-template #searchInput>
357
+ <input
358
+ *ngIf="dropdown?.isSearchable"
359
+ type="search"
360
+ (input)="search($event)"
361
+ placeholder="{{ dropdown?.texts?.searchPlaceholder }}"
362
+ class="rounded-0 rounded-top border-0 border-bottom border-info"
363
+ />
364
+ </ng-template>
365
+ `, isInline: true, directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
339
366
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: NggDropdownComponent, decorators: [{
340
367
  type: Component,
341
368
  args: [{
@@ -399,6 +426,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
399
426
  <span class="sr-only">{{ dropdown?.texts?.close }}</span>
400
427
  </button>
401
428
  <ul role="listbox" *ngIf="!dropdown?.isMultiSelect">
429
+ <ng-container *ngTemplateOutlet="searchInput"></ng-container>
402
430
  <li
403
431
  *ngFor="
404
432
  let option of dropdown?.options;
@@ -423,6 +451,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
423
451
  </li>
424
452
  </ul>
425
453
  <div *ngIf="dropdown?.isMultiSelect" class="sg-fieldset-container">
454
+ <ng-container *ngTemplateOutlet="searchInput"></ng-container>
426
455
  <fieldset
427
456
  #fieldsetRef
428
457
  [attr.aria-describedby]="fieldset?.attributes?.id"
@@ -469,6 +498,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
469
498
  <ng-template #defaultOption let-option="option">
470
499
  {{ option[dropdown!.display] }}
471
500
  </ng-template>
501
+
502
+ <ng-template #searchInput>
503
+ <input
504
+ *ngIf="dropdown?.isSearchable"
505
+ type="search"
506
+ (input)="search($event)"
507
+ placeholder="{{ dropdown?.texts?.searchPlaceholder }}"
508
+ class="rounded-0 rounded-top border-0 border-bottom border-info"
509
+ />
510
+ </ng-template>
472
511
  `,
473
512
  providers: [
474
513
  {
@@ -491,8 +530,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
491
530
  type: Input
492
531
  }], useValue: [{
493
532
  type: Input
494
- }], multiSelect: [{
495
- type: Input
496
533
  }], label: [{
497
534
  type: Input
498
535
  }], options: [{
@@ -501,6 +538,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
501
538
  type: Input
502
539
  }], invalid: [{
503
540
  type: Input
541
+ }], searchableProperties: [{
542
+ type: Input
543
+ }], multiSelect: [{
544
+ type: Input
545
+ }], searchable: [{
546
+ type: Input
504
547
  }], value: [{
505
548
  type: Input
506
549
  }], valueChange: [{
@@ -647,7 +690,7 @@ NggDatepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
647
690
  useExisting: NggDatepickerComponent,
648
691
  multi: true,
649
692
  },
650
- ], viewQueries: [{ propertyName: "datepickerDialogElRef", first: true, predicate: ["datepickerDialogElRef"], descendants: true }, { propertyName: "dateInputElRef", first: true, predicate: ["dateInputElRef"], descendants: true }, { propertyName: "datepickerElRef", first: true, predicate: ["datepickerElRef"], descendants: true }, { propertyName: "datepickerTriggerElRef", first: true, predicate: ["datepickerTriggerElRef"], descendants: true }], ngImport: i0, template: "<div class=\"form-group\">\n <label *ngIf=\"label\" [for]=\"id\">{{ label }}</label>\n <div\n class=\"group\"\n #datepickerElRef\n [class.is-valid]=\"isValid\"\n [class.is-invalid]=\"isValid === false\"\n >\n <input\n [attr.id]=\"id\"\n [attr.aria-describedby]=\"\n formInfo?.innerText && formInfo.innerText.length > 0\n ? id + '_info'\n : null\n \"\n type=\"text\"\n placeholder=\"yyyy-mm-dd\"\n #dateInputElRef\n [value]=\"data?.formattedSelectedDate || ''\"\n (change)=\"onDateChange(dateInputElRef.value)\"\n />\n <button\n #datepickerTriggerElRef\n (click)=\"dp?.toggle()\"\n type=\"button\"\n class=\"primary\"\n >\n <i class=\"sg-icon sg-icon-calendar\">Select date</i>\n </button>\n </div>\n <span class=\"form-info\" #formInfo [attr.id]=\"id + '_info'\"\n ><ng-content select=\"[data-form-info]\"></ng-content\n ></span>\n</div>\n<!-- TODO: get or set attributes from within datepicker instance (dp) -->\n<div\n #datepickerDialogElRef\n class=\"popover popover-datepicker\"\n [class.active]=\"dp?.state?.isActive\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Choose Date\"\n>\n <button type=\"button\" class=\"close\" (click)=\"dp?.close()\">Close</button>\n <div class=\"sg-date\">\n <header>\n <button type=\"button\" class=\"link\" (click)=\"dp?.sub(1, 'months')\">\n <i class=\"sg-icon sg-icon-previous\">Previous month</i>\n </button>\n <ngg-dropdown\n [options]=\"months\"\n text=\"Select\"\n [value]=\"data?.month\"\n selectValue=\"value\"\n (valueChange)=\"dp?.setMonth($event)\"\n ></ngg-dropdown>\n <ngg-dropdown\n *ngIf=\"years\"\n [options]=\"years\"\n text=\"Select\"\n [value]=\"data?.year\"\n selectValue=\"value\"\n (valueChange)=\"dp?.setYear($event)\"\n ></ngg-dropdown>\n <button type=\"button\" class=\"link\" (click)=\"dp?.add(1, 'months')\">\n <i class=\"sg-icon sg-icon-next\">Next month</i>\n </button>\n </header>\n <main>\n <table role=\"grid\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let header of data?.calendar?.headers\"\n [abbr]=\"header.abbr\"\n [class.sg-week-header]=\"header.type === 'week'\"\n [class.sg-day-header]=\"header.type === 'day'\"\n >\n {{ header.displayText }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"\n let week of data?.calendar?.calendarGrid;\n trackBy: trackWeek;\n let i = index\n \"\n >\n <th\n *ngIf=\"data?.calendar?.weekNumbers as weekNumbers\"\n class=\"sg-week-number\"\n >\n {{ weekNumbers[i] }}\n </th>\n <td\n *ngFor=\"let day of week\"\n [attr.data-date]=\"day.formattedDate\"\n [attr.role]=\"day.selected ? 'gridcell' : null\"\n [attr.aria-selected]=\"\n day.selected && !data?.highlightedDate ? true : null\n \"\n [class.disabled]=\"day.disabled\"\n [class.sg-date-today]=\"day.today\"\n [title]=\"day.today ? 'Today' : ''\"\n [tabIndex]=\"\n day.highlighted ||\n (day.selected && !data?.highlightedDate) ||\n (day.today && !data?.highlightedDate && !data?.selectedDate)\n ? 0\n : -1\n \"\n (click)=\"day.currentMonth && dp?.select(day.date)\"\n >\n {{ day.day }}\n </td>\n </tr>\n </tbody>\n </table>\n </main>\n </div>\n</div>\n", components: [{ type: NggDropdownComponent, selector: "ngg-dropdown", inputs: ["id", "texts", "loop", "display", "selectValue", "useValue", "multiSelect", "label", "options", "valid", "invalid", "value"], outputs: ["valueChange", "touched"] }], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
693
+ ], viewQueries: [{ propertyName: "datepickerDialogElRef", first: true, predicate: ["datepickerDialogElRef"], descendants: true }, { propertyName: "dateInputElRef", first: true, predicate: ["dateInputElRef"], descendants: true }, { propertyName: "datepickerElRef", first: true, predicate: ["datepickerElRef"], descendants: true }, { propertyName: "datepickerTriggerElRef", first: true, predicate: ["datepickerTriggerElRef"], descendants: true }], ngImport: i0, template: "<div class=\"form-group\">\n <label *ngIf=\"label\" [for]=\"id\">{{ label }}</label>\n <div\n class=\"group\"\n #datepickerElRef\n [class.is-valid]=\"isValid\"\n [class.is-invalid]=\"isValid === false\"\n >\n <input\n [attr.id]=\"id\"\n [attr.aria-describedby]=\"\n formInfo?.innerText && formInfo.innerText.length > 0\n ? id + '_info'\n : null\n \"\n type=\"text\"\n placeholder=\"yyyy-mm-dd\"\n #dateInputElRef\n [value]=\"data?.formattedSelectedDate || ''\"\n (change)=\"onDateChange(dateInputElRef.value)\"\n />\n <button\n #datepickerTriggerElRef\n (click)=\"dp?.toggle()\"\n type=\"button\"\n class=\"primary\"\n >\n <i class=\"sg-icon sg-icon-calendar\">Select date</i>\n </button>\n </div>\n <span class=\"form-info\" #formInfo [attr.id]=\"id + '_info'\"\n ><ng-content select=\"[data-form-info]\"></ng-content\n ></span>\n</div>\n<!-- TODO: get or set attributes from within datepicker instance (dp) -->\n<div\n #datepickerDialogElRef\n class=\"popover popover-datepicker\"\n [class.active]=\"dp?.state?.isActive\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Choose Date\"\n>\n <button type=\"button\" class=\"close\" (click)=\"dp?.close()\">Close</button>\n <div class=\"sg-date\">\n <header>\n <button type=\"button\" class=\"link\" (click)=\"dp?.sub(1, 'months')\">\n <i class=\"sg-icon sg-icon-previous\">Previous month</i>\n </button>\n <ngg-dropdown\n [options]=\"months\"\n text=\"Select\"\n [value]=\"data?.month\"\n selectValue=\"value\"\n (valueChange)=\"dp?.setMonth($event)\"\n ></ngg-dropdown>\n <ngg-dropdown\n *ngIf=\"years\"\n [options]=\"years\"\n text=\"Select\"\n [value]=\"data?.year\"\n selectValue=\"value\"\n (valueChange)=\"dp?.setYear($event)\"\n ></ngg-dropdown>\n <button type=\"button\" class=\"link\" (click)=\"dp?.add(1, 'months')\">\n <i class=\"sg-icon sg-icon-next\">Next month</i>\n </button>\n </header>\n <main>\n <table role=\"grid\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let header of data?.calendar?.headers\"\n [abbr]=\"header.abbr\"\n [class.sg-week-header]=\"header.type === 'week'\"\n [class.sg-day-header]=\"header.type === 'day'\"\n >\n {{ header.displayText }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"\n let week of data?.calendar?.calendarGrid;\n trackBy: trackWeek;\n let i = index\n \"\n >\n <th\n *ngIf=\"data?.calendar?.weekNumbers as weekNumbers\"\n class=\"sg-week-number\"\n >\n {{ weekNumbers[i] }}\n </th>\n <td\n *ngFor=\"let day of week\"\n [attr.data-date]=\"day.formattedDate\"\n [attr.role]=\"day.selected ? 'gridcell' : null\"\n [attr.aria-selected]=\"\n day.selected && !data?.highlightedDate ? true : null\n \"\n [class.disabled]=\"day.disabled\"\n [class.sg-date-today]=\"day.today\"\n [title]=\"day.today ? 'Today' : ''\"\n [tabIndex]=\"\n day.highlighted ||\n (day.selected && !data?.highlightedDate) ||\n (day.today && !data?.highlightedDate && !data?.selectedDate)\n ? 0\n : -1\n \"\n (click)=\"day.currentMonth && dp?.select(day.date)\"\n >\n {{ day.day }}\n </td>\n </tr>\n </tbody>\n </table>\n </main>\n </div>\n</div>\n", components: [{ type: NggDropdownComponent, selector: "ngg-dropdown", inputs: ["id", "texts", "loop", "display", "selectValue", "useValue", "label", "options", "valid", "invalid", "searchableProperties", "multiSelect", "searchable", "value"], outputs: ["valueChange", "touched"] }], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
651
694
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: NggDatepickerComponent, decorators: [{
652
695
  type: Component,
653
696
  args: [{ selector: 'ngg-datepicker', providers: [