@firestitch/filter 18.1.0 → 18.2.1

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 (72) hide show
  1. package/app/components/filter/filter.component.d.ts +9 -13
  2. package/app/components/filter-chip/filter-chip.component.d.ts +7 -7
  3. package/app/components/filter-drawer/filter-drawer.component.d.ts +7 -7
  4. package/app/components/filter-drawer-actions/filter-drawer-actions.component.d.ts +2 -2
  5. package/app/components/saved-filter/index.d.ts +0 -1
  6. package/app/components/saved-filter/saved-filter-autocomplete-chips/saved-filter-autocomplete-chips.component.d.ts +6 -5
  7. package/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/index.d.ts +1 -0
  8. package/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/saved-filter-chips.component.d.ts +13 -0
  9. package/app/components/saved-filter/saved-filter-manage/saved-filter-manage.component.d.ts +6 -2
  10. package/app/fs-filter.module.d.ts +7 -8
  11. package/app/helpers/build-query-params.d.ts +2 -2
  12. package/app/helpers/create-filter-item.d.ts +1 -1
  13. package/app/interfaces/external-params.interface.d.ts +1 -1
  14. package/app/interfaces/saved-filters.interface.d.ts +2 -2
  15. package/app/models/items/autocomplete-chips-item.d.ts +1 -1
  16. package/app/models/items/base-item.d.ts +1 -1
  17. package/app/models/items/chips-item.d.ts +1 -1
  18. package/app/models/items/date/base-date-item.d.ts +1 -1
  19. package/app/models/items/date-range/base-date-range-item.d.ts +1 -1
  20. package/app/models/items/select/multiple-select-item.d.ts +3 -3
  21. package/app/models/items/select/simple-select-item.d.ts +2 -2
  22. package/app/models/items/week-item.d.ts +1 -1
  23. package/app/services/index.d.ts +5 -5
  24. package/app/services/{items-store.service.d.ts → item-store.service.d.ts} +9 -9
  25. package/app/services/{external-params-controller.service.d.ts → param-controller.service.d.ts} +9 -10
  26. package/app/services/{query-persistance-controller.service.d.ts → persistance-controller.service.d.ts} +3 -3
  27. package/app/services/query-param-controller.service.d.ts +21 -0
  28. package/app/services/{saved-filters-controller.service.d.ts → saved-filter-controller.service.d.ts} +6 -10
  29. package/esm2022/app/components/filter/filter.component.mjs +68 -77
  30. package/esm2022/app/components/filter-chip/filter-chip.component.mjs +22 -16
  31. package/esm2022/app/components/filter-chips/filter-chips.component.mjs +3 -3
  32. package/esm2022/app/components/filter-drawer/filter-drawer.component.mjs +18 -18
  33. package/esm2022/app/components/filter-drawer-actions/filter-drawer-actions.component.mjs +1 -1
  34. package/esm2022/app/components/filters-item/autocompletechips/autocompletechips.component.mjs +5 -5
  35. package/esm2022/app/components/saved-filter/index.mjs +1 -2
  36. package/esm2022/app/components/saved-filter/saved-filter-autocomplete-chips/saved-filter-autocomplete-chips.component.mjs +17 -16
  37. package/esm2022/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/index.mjs +2 -0
  38. package/esm2022/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/saved-filter-chips.component.mjs +28 -0
  39. package/esm2022/app/components/saved-filter/saved-filter-manage/saved-filter-manage.component.mjs +24 -17
  40. package/esm2022/app/fs-filter.module.mjs +1 -5
  41. package/esm2022/app/helpers/build-query-params.mjs +1 -1
  42. package/esm2022/app/interfaces/external-params.interface.mjs +1 -1
  43. package/esm2022/app/interfaces/saved-filters.interface.mjs +1 -1
  44. package/esm2022/app/models/items/autocomplete-chips-item.mjs +4 -4
  45. package/esm2022/app/models/items/base-item.mjs +4 -4
  46. package/esm2022/app/models/items/chips-item.mjs +5 -5
  47. package/esm2022/app/models/items/date/base-date-item.mjs +9 -9
  48. package/esm2022/app/models/items/date-range/base-date-range-item.mjs +12 -12
  49. package/esm2022/app/models/items/select/multiple-select-item.mjs +17 -17
  50. package/esm2022/app/models/items/select/simple-select-item.mjs +10 -10
  51. package/esm2022/app/models/items/week-item.mjs +11 -9
  52. package/esm2022/app/services/index.mjs +6 -6
  53. package/esm2022/app/services/item-store.service.mjs +356 -0
  54. package/esm2022/app/services/param-controller.service.mjs +149 -0
  55. package/esm2022/app/services/persistance-controller.service.mjs +65 -0
  56. package/esm2022/app/services/query-param-controller.service.mjs +65 -0
  57. package/esm2022/app/services/saved-filter-controller.service.mjs +169 -0
  58. package/esm2022/public_api.mjs +2 -3
  59. package/fesm2022/firestitch-filter.mjs +1714 -1787
  60. package/fesm2022/firestitch-filter.mjs.map +1 -1
  61. package/package.json +1 -1
  62. package/public_api.d.ts +1 -2
  63. package/app/components/saved-filter/saved-filter-edit/index.d.ts +0 -1
  64. package/app/components/saved-filter/saved-filter-edit/saved-filter-edit.component.d.ts +0 -18
  65. package/app/services/query-params-controller.service.d.ts +0 -21
  66. package/esm2022/app/components/saved-filter/saved-filter-edit/index.mjs +0 -2
  67. package/esm2022/app/components/saved-filter/saved-filter-edit/saved-filter-edit.component.mjs +0 -72
  68. package/esm2022/app/services/external-params-controller.service.mjs +0 -154
  69. package/esm2022/app/services/items-store.service.mjs +0 -356
  70. package/esm2022/app/services/query-params-controller.service.mjs +0 -65
  71. package/esm2022/app/services/query-persistance-controller.service.mjs +0 -65
  72. package/esm2022/app/services/saved-filters-controller.service.mjs +0 -210
@@ -1,210 +0,0 @@
1
- import { inject, Injectable } from '@angular/core';
2
- import { MatDialog } from '@angular/material/dialog';
3
- import { FsMessage } from '@firestitch/message';
4
- import { FsPrompt } from '@firestitch/prompt';
5
- import { BehaviorSubject, Subject } from 'rxjs';
6
- import { distinctUntilChanged, switchMap, take, takeUntil, tap, } from 'rxjs/operators';
7
- import { FsFilterSavedFilterEditComponent, } from '../components/saved-filter/saved-filter-edit/saved-filter-edit.component';
8
- import { restoreItems } from '../helpers/restore-items';
9
- import { FsFilterItemsStore } from './items-store.service';
10
- import * as i0 from "@angular/core";
11
- export class SavedFiltersController {
12
- _config;
13
- _savedFilters$ = new BehaviorSubject([]);
14
- _activeFilter$ = new BehaviorSubject(null);
15
- _enabled$ = new BehaviorSubject(false);
16
- _destroy$ = new Subject();
17
- _itemsStore = inject(FsFilterItemsStore);
18
- _dialog = inject(MatDialog);
19
- _prompt = inject(FsPrompt);
20
- _message = inject(FsMessage);
21
- get singularLabel() {
22
- return this._config?.label?.singular || 'Saved filter';
23
- }
24
- get singularLabelLower() {
25
- return this.singularLabel.toLowerCase();
26
- }
27
- get labelIcon() {
28
- return this._config?.label?.icon || 'save';
29
- }
30
- get pluralLabel() {
31
- return this._config?.label?.plural || 'Saved filters';
32
- }
33
- get pluralLabelLower() {
34
- return this.pluralLabel.toLowerCase();
35
- }
36
- get enabled() {
37
- return this._enabled$.getValue();
38
- }
39
- get enabled$() {
40
- return this._enabled$
41
- .pipe(distinctUntilChanged());
42
- }
43
- get savedFilters() {
44
- return this._savedFilters$.getValue();
45
- }
46
- set savedFilters(filters) {
47
- this._savedFilters$.next(filters);
48
- }
49
- get savedFilters$() {
50
- return this._savedFilters$
51
- .pipe(distinctUntilChanged());
52
- }
53
- get activeFilter() {
54
- return this._activeFilter$.getValue();
55
- }
56
- get activeFilter$() {
57
- return this._activeFilter$
58
- .pipe(distinctUntilChanged());
59
- }
60
- get activeFilterData() {
61
- return this._activeFilter$.getValue()?.filters;
62
- }
63
- ngOnDestroy() {
64
- this._destroy$.next(null);
65
- this._destroy$.complete();
66
- }
67
- init(filterSavedFiltersConfig) {
68
- if (!filterSavedFiltersConfig) {
69
- this._setEnabledStatus(false);
70
- return;
71
- }
72
- this._setEnabledStatus(true);
73
- this._config = filterSavedFiltersConfig;
74
- }
75
- initSavedFilters(filters) {
76
- this.savedFilters = filters;
77
- }
78
- load() {
79
- return this._config.load()
80
- .pipe(tap((response) => {
81
- this.initSavedFilters(response);
82
- }));
83
- }
84
- create() {
85
- return this._prompt.input({
86
- title: `Create ${this.singularLabel}`,
87
- label: 'Name',
88
- required: true,
89
- commitLabel: 'Create',
90
- dialogConfig: {
91
- restoreFocus: false,
92
- },
93
- })
94
- .pipe(switchMap((name) => {
95
- const data = {
96
- name,
97
- filters: this._itemsStore.queryParams(),
98
- };
99
- return this.save(data);
100
- }), tap((savedFilter) => {
101
- this.setActiveFilter(savedFilter);
102
- }));
103
- }
104
- save(savedFilter) {
105
- const exists = !!savedFilter.id;
106
- savedFilter = {
107
- ...this.activeFilter,
108
- ...savedFilter,
109
- filters: this._itemsStore.models(),
110
- };
111
- return this._config.save(savedFilter)
112
- .pipe(tap((_savedFilter) => {
113
- this.savedFilters = exists ? this.savedFilters
114
- .map((f) => f.id === savedFilter.id ? _savedFilter : f) : [
115
- ...this.savedFilters,
116
- _savedFilter,
117
- ];
118
- this.setActiveFilter(_savedFilter);
119
- }));
120
- }
121
- get orderable() {
122
- return !!this._config.order;
123
- }
124
- order(savedFilters) {
125
- return this._config.order(savedFilters)
126
- .pipe(tap(() => {
127
- this.savedFilters = [
128
- ...savedFilters,
129
- ];
130
- }));
131
- }
132
- delete(savedFilter) {
133
- return this._config.delete(savedFilter)
134
- .pipe(tap(() => {
135
- this.savedFilters = this.savedFilters
136
- .filter((f) => f.id !== savedFilter.id);
137
- }));
138
- }
139
- setActiveFilter(savedFilter) {
140
- if (savedFilter) {
141
- const existingFilter = this.savedFilters
142
- .find((f) => f.id === savedFilter.id);
143
- if (!existingFilter) {
144
- throw new Error(`Saved filter cannot be activated, because it does not exists. Filter ID = ${savedFilter.id}`);
145
- }
146
- this._activeFilter$.next(existingFilter);
147
- }
148
- else {
149
- this._activeFilter$.next(null);
150
- }
151
- }
152
- openSavedFilterEditDialog() {
153
- const params = this._itemsStore.queryParams();
154
- const dialogConfig = {
155
- data: {
156
- params: params,
157
- savedFilters: this.savedFilters,
158
- saveCallback: this.save.bind(this),
159
- },
160
- };
161
- this._dialog
162
- .open(FsFilterSavedFilterEditComponent, dialogConfig)
163
- .beforeClosed()
164
- .pipe(take(1), takeUntil(this._destroy$))
165
- .subscribe((updatedFilter) => {
166
- if (updatedFilter) {
167
- // get already saved related filter object
168
- const savedFilter = this.savedFilters
169
- .find((f) => f.id === updatedFilter.id);
170
- // restore values from query string
171
- updatedFilter.filters = restoreItems(updatedFilter.filters, this._itemsStore.items);
172
- if (savedFilter) {
173
- Object.assign(savedFilter, updatedFilter);
174
- }
175
- else {
176
- this.resetActiveFilter();
177
- this.savedFilters = [
178
- ...this.savedFilters,
179
- updatedFilter,
180
- ];
181
- }
182
- this.updateActiveFilter();
183
- }
184
- });
185
- }
186
- updateActiveFilter() {
187
- // Lookup active filter
188
- const acitveFilter = this.savedFilters
189
- .find((f) => f.active);
190
- if (acitveFilter) {
191
- this.setActiveFilter(acitveFilter);
192
- }
193
- }
194
- resetActiveFilter() {
195
- // Reset all previously activated filters
196
- this.savedFilters.forEach((savedFilter) => {
197
- savedFilter.active = false;
198
- });
199
- this.setActiveFilter(null);
200
- }
201
- _setEnabledStatus(value) {
202
- this._enabled$.next(value);
203
- }
204
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SavedFiltersController, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
205
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SavedFiltersController });
206
- }
207
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SavedFiltersController, decorators: [{
208
- type: Injectable
209
- }] });
210
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZWQtZmlsdGVycy1jb250cm9sbGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL3NlcnZpY2VzL3NhdmVkLWZpbHRlcnMtY29udHJvbGxlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRTlELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsU0FBUyxFQUNULElBQUksRUFDSixTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUNMLGdDQUFnQyxHQUNqQyxNQUFNLDBFQUEwRSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQU94RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7QUFJM0QsTUFBTSxPQUFPLHNCQUFzQjtJQUV6QixPQUFPLENBQTRCO0lBQ25DLGNBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBdUIsRUFBRSxDQUFDLENBQUM7SUFDL0QsY0FBYyxHQUFHLElBQUksZUFBZSxDQUFxQixJQUFJLENBQUMsQ0FBQztJQUMvRCxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDaEQsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFDaEMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sR0FB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T25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5cbmltcG9ydCB7IEZzTWVzc2FnZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gIEZzRmlsdGVyU2F2ZWRGaWx0ZXJFZGl0Q29tcG9uZW50LFxufSBmcm9tICcuLi9jb21wb25lbnRzL3NhdmVkLWZpbHRlci9zYXZlZC1maWx0ZXItZWRpdC9zYXZlZC1maWx0ZXItZWRpdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgcmVzdG9yZUl0ZW1zIH0gZnJvbSAnLi4vaGVscGVycy9yZXN0b3JlLWl0ZW1zJztcbmltcG9ydCB7IElGaWx0ZXJFeHRlcm5hbFBhcmFtcyB9IGZyb20gJy4uL2ludGVyZmFjZXMvZXh0ZXJuYWwtcGFyYW1zLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBJRmlsdGVyU2F2ZWRGaWx0ZXIsXG4gIElGaWx0ZXJTYXZlZEZpbHRlcnNDb25maWcsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvc2F2ZWQtZmlsdGVycy5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyBGc0ZpbHRlckl0ZW1zU3RvcmUgfSBmcm9tICcuL2l0ZW1zLXN0b3JlLnNlcnZpY2UnO1xuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTYXZlZEZpbHRlcnNDb250cm9sbGVyIGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICBwcml2YXRlIF9jb25maWc6IElGaWx0ZXJTYXZlZEZpbHRlcnNDb25maWc7XG4gIHByaXZhdGUgX3NhdmVkRmlsdGVycyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElGaWx0ZXJTYXZlZEZpbHRlcltdPihbXSk7XG4gIHByaXZhdGUgX2FjdGl2ZUZpbHRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElGaWx0ZXJTYXZlZEZpbHRlcj4obnVsbCk7XG4gIHByaXZhdGUgX2VuYWJsZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfaXRlbXNTdG9yZSA9IGluamVjdChGc0ZpbHRlckl0ZW1zU3RvcmUpO1xuICBwcml2YXRlIF9kaWFsb2cgPSBpbmplY3QoTWF0RGlhbG9nKTtcbiAgcHJpdmF0ZSBfcHJvbXB0ID0gaW5qZWN0KEZzUHJvbXB0KTtcbiAgcHJpdmF0ZSBfbWVzc2FnZSA9IGluamVjdChGc01lc3NhZ2UpO1xuXG4gIHB1YmxpYyBnZXQgc2luZ3VsYXJMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc/LmxhYmVsPy5zaW5ndWxhciB8fCAnU2F2ZWQgZmlsdGVyJztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2luZ3VsYXJMYWJlbExvd2VyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2luZ3VsYXJMYWJlbC50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBsYWJlbEljb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnPy5sYWJlbD8uaWNvbiB8fCAnc2F2ZSc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBsdXJhbExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZz8ubGFiZWw/LnBsdXJhbCB8fCAnU2F2ZWQgZmlsdGVycyc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBsdXJhbExhYmVsTG93ZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wbHVyYWxMYWJlbC50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBlbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lbmFibGVkJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBlbmFibGVkJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlZCRcbiAgICAgIC5waXBlKFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2F2ZWRGaWx0ZXJzKCk6IElGaWx0ZXJTYXZlZEZpbHRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fc2F2ZWRGaWx0ZXJzJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgcHVibGljIHNldCBzYXZlZEZpbHRlcnMoZmlsdGVyczogSUZpbHRlclNhdmVkRmlsdGVyW10pIHtcbiAgICB0aGlzLl9zYXZlZEZpbHRlcnMkLm5leHQoZmlsdGVycyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNhdmVkRmlsdGVycyQoKTogT2JzZXJ2YWJsZTxJRmlsdGVyU2F2ZWRGaWx0ZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLl9zYXZlZEZpbHRlcnMkXG4gICAgICAucGlwZShcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZUZpbHRlcigpOiBJRmlsdGVyU2F2ZWRGaWx0ZXIge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVGaWx0ZXIkLmdldFZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZUZpbHRlciQoKTogT2JzZXJ2YWJsZTxJRmlsdGVyU2F2ZWRGaWx0ZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRmlsdGVyJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVGaWx0ZXJEYXRhKCk6IElGaWx0ZXJFeHRlcm5hbFBhcmFtcyB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUZpbHRlciQuZ2V0VmFsdWUoKT8uZmlsdGVycztcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdChcbiAgICBmaWx0ZXJTYXZlZEZpbHRlcnNDb25maWc6IElGaWx0ZXJTYXZlZEZpbHRlcnNDb25maWcsXG4gICk6IHZvaWQge1xuICAgIGlmICghZmlsdGVyU2F2ZWRGaWx0ZXJzQ29uZmlnKSB7XG4gICAgICB0aGlzLl9zZXRFbmFibGVkU3RhdHVzKGZhbHNlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zZXRFbmFibGVkU3RhdHVzKHRydWUpO1xuXG4gICAgdGhpcy5fY29uZmlnID0gZmlsdGVyU2F2ZWRGaWx0ZXJzQ29uZmlnO1xuICB9XG5cbiAgcHVibGljIGluaXRTYXZlZEZpbHRlcnMoZmlsdGVyczogSUZpbHRlclNhdmVkRmlsdGVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnNhdmVkRmlsdGVycyA9IGZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgbG9hZCgpOiBPYnNlcnZhYmxlPElGaWx0ZXJTYXZlZEZpbHRlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5sb2FkKClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbml0U2F2ZWRGaWx0ZXJzKHJlc3BvbnNlKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZSgpOiBPYnNlcnZhYmxlPElGaWx0ZXJTYXZlZEZpbHRlcj4ge1xuICAgIHJldHVybiB0aGlzLl9wcm9tcHQuaW5wdXQoe1xuICAgICAgdGl0bGU6IGBDcmVhdGUgJHt0aGlzLnNpbmd1bGFyTGFiZWx9YCxcbiAgICAgIGxhYmVsOiAnTmFtZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIGNvbW1pdExhYmVsOiAnQ3JlYXRlJyxcbiAgICAgIGRpYWxvZ0NvbmZpZzoge1xuICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgobmFtZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRhdGE6IElGaWx0ZXJTYXZlZEZpbHRlciA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBmaWx0ZXJzOiB0aGlzLl9pdGVtc1N0b3JlLnF1ZXJ5UGFyYW1zKCksXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJldHVybiB0aGlzLnNhdmUoZGF0YSk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YXAoKHNhdmVkRmlsdGVyKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXRBY3RpdmVGaWx0ZXIoc2F2ZWRGaWx0ZXIpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZShzYXZlZEZpbHRlcjogSUZpbHRlclNhdmVkRmlsdGVyKTogT2JzZXJ2YWJsZTxJRmlsdGVyU2F2ZWRGaWx0ZXI+IHtcbiAgICBjb25zdCBleGlzdHMgPSAhIXNhdmVkRmlsdGVyLmlkO1xuXG4gICAgc2F2ZWRGaWx0ZXIgPSB7XG4gICAgICAuLi50aGlzLmFjdGl2ZUZpbHRlcixcbiAgICAgIC4uLnNhdmVkRmlsdGVyLFxuICAgICAgZmlsdGVyczogdGhpcy5faXRlbXNTdG9yZS5tb2RlbHMoKSxcbiAgICB9OyAgXG5cbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLnNhdmUoc2F2ZWRGaWx0ZXIpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChfc2F2ZWRGaWx0ZXIpID0+IHtcbiAgICAgICAgICB0aGlzLnNhdmVkRmlsdGVycyA9IGV4aXN0cyA/IHRoaXMuc2F2ZWRGaWx0ZXJzXG4gICAgICAgICAgICAubWFwKChmKSA9PiBmLmlkID09PSBzYXZlZEZpbHRlci5pZCA/IF9zYXZlZEZpbHRlciA6IGYpIDogW1xuICAgICAgICAgICAgLi4udGhpcy5zYXZlZEZpbHRlcnMsXG4gICAgICAgICAgICBfc2F2ZWRGaWx0ZXIsXG4gICAgICAgICAgXTtcbiAgICAgICAgICBcbiAgICAgICAgICB0aGlzLnNldEFjdGl2ZUZpbHRlcihfc2F2ZWRGaWx0ZXIpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9yZGVyYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLl9jb25maWcub3JkZXI7XG4gIH1cblxuICBwdWJsaWMgb3JkZXIoc2F2ZWRGaWx0ZXJzOiBJRmlsdGVyU2F2ZWRGaWx0ZXJbXSk6IE9ic2VydmFibGU8SUZpbHRlclNhdmVkRmlsdGVyW10+IHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLm9yZGVyKHNhdmVkRmlsdGVycylcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2F2ZWRGaWx0ZXJzID0gW1xuICAgICAgICAgICAgLi4uc2F2ZWRGaWx0ZXJzLFxuICAgICAgICAgIF07XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGUoc2F2ZWRGaWx0ZXI6IElGaWx0ZXJTYXZlZEZpbHRlcik6IE9ic2VydmFibGU8SUZpbHRlclNhdmVkRmlsdGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5kZWxldGUoc2F2ZWRGaWx0ZXIpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnNhdmVkRmlsdGVycyA9IHRoaXMuc2F2ZWRGaWx0ZXJzXG4gICAgICAgICAgICAuZmlsdGVyKChmKSA9PiBmLmlkICE9PSBzYXZlZEZpbHRlci5pZCk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBY3RpdmVGaWx0ZXIoc2F2ZWRGaWx0ZXI6IElGaWx0ZXJTYXZlZEZpbHRlcik6IHZvaWQge1xuICAgIGlmIChzYXZlZEZpbHRlcikge1xuICAgICAgY29uc3QgZXhpc3RpbmdGaWx0ZXIgPSB0aGlzLnNhdmVkRmlsdGVyc1xuICAgICAgICAuZmluZCgoZikgPT4gZi5pZCA9PT0gc2F2ZWRGaWx0ZXIuaWQpO1xuXG4gICAgICBpZiAoIWV4aXN0aW5nRmlsdGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2F2ZWQgZmlsdGVyIGNhbm5vdCBiZSBhY3RpdmF0ZWQsIGJlY2F1c2UgaXQgZG9lcyBub3QgZXhpc3RzLiBGaWx0ZXIgSUQgPSAke3NhdmVkRmlsdGVyLmlkfWApO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLl9hY3RpdmVGaWx0ZXIkLm5leHQoZXhpc3RpbmdGaWx0ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9hY3RpdmVGaWx0ZXIkLm5leHQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9wZW5TYXZlZEZpbHRlckVkaXREaWFsb2coKTogdm9pZCB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5faXRlbXNTdG9yZS5xdWVyeVBhcmFtcygpO1xuXG4gICAgY29uc3QgZGlhbG9nQ29uZmlnID0ge1xuICAgICAgZGF0YToge1xuICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgc2F2ZWRGaWx0ZXJzOiB0aGlzLnNhdmVkRmlsdGVycyxcbiAgICAgICAgc2F2ZUNhbGxiYWNrOiB0aGlzLnNhdmUuYmluZCh0aGlzKSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHRoaXMuX2RpYWxvZ1xuICAgICAgLm9wZW4oRnNGaWx0ZXJTYXZlZEZpbHRlckVkaXRDb21wb25lbnQsIGRpYWxvZ0NvbmZpZylcbiAgICAgIC5iZWZvcmVDbG9zZWQoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCh1cGRhdGVkRmlsdGVyOiBJRmlsdGVyU2F2ZWRGaWx0ZXIgfCBudWxsKSA9PiB7XG4gICAgICAgIGlmICh1cGRhdGVkRmlsdGVyKSB7XG4gICAgICAgICAgLy8gZ2V0IGFscmVhZHkgc2F2ZWQgcmVsYXRlZCBmaWx0ZXIgb2JqZWN0XG4gICAgICAgICAgY29uc3Qgc2F2ZWRGaWx0ZXIgPSB0aGlzLnNhdmVkRmlsdGVyc1xuICAgICAgICAgICAgLmZpbmQoKGYpID0+IGYuaWQgPT09IHVwZGF0ZWRGaWx0ZXIuaWQpO1xuXG4gICAgICAgICAgLy8gcmVzdG9yZSB2YWx1ZXMgZnJvbSBxdWVyeSBzdHJpbmdcbiAgICAgICAgICB1cGRhdGVkRmlsdGVyLmZpbHRlcnMgPSByZXN0b3JlSXRlbXMoXG4gICAgICAgICAgICB1cGRhdGVkRmlsdGVyLmZpbHRlcnMsXG4gICAgICAgICAgICB0aGlzLl9pdGVtc1N0b3JlLml0ZW1zLFxuICAgICAgICAgICk7XG5cblxuICAgICAgICAgIGlmIChzYXZlZEZpbHRlcikge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzYXZlZEZpbHRlciwgdXBkYXRlZEZpbHRlcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRBY3RpdmVGaWx0ZXIoKTtcbiAgICAgICAgICAgIHRoaXMuc2F2ZWRGaWx0ZXJzID0gW1xuICAgICAgICAgICAgICAuLi50aGlzLnNhdmVkRmlsdGVycyxcbiAgICAgICAgICAgICAgdXBkYXRlZEZpbHRlcixcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVGaWx0ZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQWN0aXZlRmlsdGVyKCk6IHZvaWQge1xuICAgIC8vIExvb2t1cCBhY3RpdmUgZmlsdGVyXG4gICAgY29uc3QgYWNpdHZlRmlsdGVyID0gdGhpcy5zYXZlZEZpbHRlcnNcbiAgICAgIC5maW5kKChmKSA9PiBmLmFjdGl2ZSk7XG5cbiAgICBpZiAoYWNpdHZlRmlsdGVyKSB7XG4gICAgICB0aGlzLnNldEFjdGl2ZUZpbHRlcihhY2l0dmVGaWx0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNldEFjdGl2ZUZpbHRlcigpOiB2b2lkIHtcbiAgICAvLyBSZXNldCBhbGwgcHJldmlvdXNseSBhY3RpdmF0ZWQgZmlsdGVyc1xuICAgIHRoaXMuc2F2ZWRGaWx0ZXJzLmZvckVhY2goKHNhdmVkRmlsdGVyKSA9PiB7XG4gICAgICBzYXZlZEZpbHRlci5hY3RpdmUgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0QWN0aXZlRmlsdGVyKG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0RW5hYmxlZFN0YXR1cyh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2VuYWJsZWQkLm5leHQodmFsdWUpO1xuICB9XG59XG4iXX0=