@paperless/angular 1.12.4 → 1.13.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 (87) hide show
  1. package/esm2020/lib/base/form.component.mjs +105 -0
  2. package/esm2020/lib/base/upload.component.mjs +56 -0
  3. package/esm2020/lib/base/value-accessor.mjs +42 -0
  4. package/esm2020/lib/directives/p-cropper.directive.mjs +37 -0
  5. package/esm2020/lib/directives/p-datepicker.directive.mjs +37 -0
  6. package/esm2020/lib/directives/p-page-size-select.directive.mjs +42 -0
  7. package/esm2020/lib/directives/p-pagination.directive.mjs +42 -0
  8. package/esm2020/lib/directives/p-select.directive.mjs +37 -0
  9. package/{esm2022 → esm2020}/lib/modules/overlay/overlay.module.mjs +14 -14
  10. package/esm2020/lib/modules/overlay/overlay.ref.mjs +12 -0
  11. package/esm2020/lib/modules/overlay/services/overlay.service.mjs +74 -0
  12. package/esm2020/lib/modules/table/base/table.component.mjs +209 -0
  13. package/esm2020/lib/modules/table/components/table/table.component.mjs +683 -0
  14. package/esm2020/lib/modules/table/components/table-cell/table-cell.component.mjs +212 -0
  15. package/esm2020/lib/modules/table/components/table-column/table-column.component.mjs +56 -0
  16. package/{esm2022 → esm2020}/lib/modules/table/directives/p-table-custom-filter.directive.mjs +3 -3
  17. package/{esm2022 → esm2020}/lib/modules/table/directives/p-table-filter-modal.directive.mjs +3 -3
  18. package/esm2020/lib/modules/table/directives/p-table-footer.directive.mjs +52 -0
  19. package/esm2020/lib/modules/table/directives/p-table-header.directive.mjs +60 -0
  20. package/esm2020/lib/modules/table/directives/p-table-ngx.directive.mjs +121 -0
  21. package/esm2020/lib/modules/table/directives/p-table.directive.mjs +78 -0
  22. package/{esm2022 → esm2020}/lib/modules/table/table.module.mjs +4 -4
  23. package/esm2020/lib/modules/toast/components/toast-container/toast-container.component.mjs +36 -0
  24. package/esm2020/lib/modules/toast/directives/toast.directive.mjs +51 -0
  25. package/esm2020/lib/modules/toast/services/toast.service.mjs +53 -0
  26. package/{esm2022 → esm2020}/lib/modules/toast/toast.module.mjs +4 -4
  27. package/{esm2022 → esm2020}/lib/paperless.module.mjs +4 -4
  28. package/esm2020/lib/pipes/currency.pipe.mjs +20 -0
  29. package/esm2020/lib/pipes/date.pipe.mjs +20 -0
  30. package/esm2020/lib/pipes/safe.pipe.mjs +33 -0
  31. package/esm2020/lib/stencil/components.mjs +1466 -0
  32. package/esm2020/lib/stencil.module.mjs +17 -0
  33. package/fesm2015/paperless-angular.mjs +3805 -0
  34. package/fesm2015/paperless-angular.mjs.map +1 -0
  35. package/{fesm2022 → fesm2020}/paperless-angular.mjs +496 -698
  36. package/{fesm2022 → fesm2020}/paperless-angular.mjs.map +1 -1
  37. package/package.json +11 -5
  38. package/esm2022/lib/base/form.component.mjs +0 -103
  39. package/esm2022/lib/base/upload.component.mjs +0 -57
  40. package/esm2022/lib/base/value-accessor.mjs +0 -44
  41. package/esm2022/lib/directives/p-cropper.directive.mjs +0 -37
  42. package/esm2022/lib/directives/p-datepicker.directive.mjs +0 -37
  43. package/esm2022/lib/directives/p-page-size-select.directive.mjs +0 -42
  44. package/esm2022/lib/directives/p-pagination.directive.mjs +0 -42
  45. package/esm2022/lib/directives/p-select.directive.mjs +0 -37
  46. package/esm2022/lib/modules/overlay/overlay.ref.mjs +0 -14
  47. package/esm2022/lib/modules/overlay/services/overlay.service.mjs +0 -77
  48. package/esm2022/lib/modules/table/base/table.component.mjs +0 -211
  49. package/esm2022/lib/modules/table/components/table/table.component.mjs +0 -734
  50. package/esm2022/lib/modules/table/components/table-cell/table-cell.component.mjs +0 -230
  51. package/esm2022/lib/modules/table/components/table-column/table-column.component.mjs +0 -59
  52. package/esm2022/lib/modules/table/directives/p-table-footer.directive.mjs +0 -52
  53. package/esm2022/lib/modules/table/directives/p-table-header.directive.mjs +0 -60
  54. package/esm2022/lib/modules/table/directives/p-table-ngx.directive.mjs +0 -122
  55. package/esm2022/lib/modules/table/directives/p-table.directive.mjs +0 -78
  56. package/esm2022/lib/modules/toast/components/toast-container/toast-container.component.mjs +0 -39
  57. package/esm2022/lib/modules/toast/directives/toast.directive.mjs +0 -51
  58. package/esm2022/lib/modules/toast/services/toast.service.mjs +0 -51
  59. package/esm2022/lib/pipes/currency.pipe.mjs +0 -21
  60. package/esm2022/lib/pipes/date.pipe.mjs +0 -21
  61. package/esm2022/lib/pipes/safe.pipe.mjs +0 -34
  62. package/esm2022/lib/stencil/components.mjs +0 -1582
  63. package/esm2022/lib/stencil.module.mjs +0 -17
  64. /package/{esm2022 → esm2020}/lib/animations/fade.mjs +0 -0
  65. /package/{esm2022 → esm2020}/lib/animations/index.mjs +0 -0
  66. /package/{esm2022 → esm2020}/lib/animations/slide.mjs +0 -0
  67. /package/{esm2022 → esm2020}/lib/base/index.mjs +0 -0
  68. /package/{esm2022 → esm2020}/lib/directives/index.mjs +0 -0
  69. /package/{esm2022 → esm2020}/lib/modules/index.mjs +0 -0
  70. /package/{esm2022 → esm2020}/lib/modules/overlay/index.mjs +0 -0
  71. /package/{esm2022 → esm2020}/lib/modules/overlay/services/index.mjs +0 -0
  72. /package/{esm2022 → esm2020}/lib/modules/table/base/index.mjs +0 -0
  73. /package/{esm2022 → esm2020}/lib/modules/table/components/index.mjs +0 -0
  74. /package/{esm2022 → esm2020}/lib/modules/table/components/table/constants.mjs +0 -0
  75. /package/{esm2022 → esm2020}/lib/modules/table/directives/index.mjs +0 -0
  76. /package/{esm2022 → esm2020}/lib/modules/table/index.mjs +0 -0
  77. /package/{esm2022 → esm2020}/lib/modules/table/utils.mjs +0 -0
  78. /package/{esm2022 → esm2020}/lib/modules/toast/components/index.mjs +0 -0
  79. /package/{esm2022 → esm2020}/lib/modules/toast/directives/index.mjs +0 -0
  80. /package/{esm2022 → esm2020}/lib/modules/toast/index.mjs +0 -0
  81. /package/{esm2022 → esm2020}/lib/modules/toast/services/index.mjs +0 -0
  82. /package/{esm2022 → esm2020}/lib/modules/toast/types.mjs +0 -0
  83. /package/{esm2022 → esm2020}/lib/pipes/index.mjs +0 -0
  84. /package/{esm2022 → esm2020}/lib/stencil/angular-component-lib/utils.mjs +0 -0
  85. /package/{esm2022 → esm2020}/lib/stencil/index.mjs +0 -0
  86. /package/{esm2022 → esm2020}/paperless-angular.mjs +0 -0
  87. /package/{esm2022 → esm2020}/public-api.mjs +0 -0
@@ -1,211 +0,0 @@
1
- import { __decorate } from "tslib";
2
- import { Component } from '@angular/core';
3
- import { FormControl, FormGroup } from '@angular/forms';
4
- import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
5
- import { timer } from 'rxjs';
6
- import { debounce, filter, map, pairwise, startWith } from 'rxjs/operators';
7
- import { BaseFormComponent } from '../../../base/form.component';
8
- import { createFormFilters } from '../utils';
9
- import * as i0 from "@angular/core";
10
- let BaseTableComponent = class BaseTableComponent extends BaseFormComponent {
11
- quickFilters = [];
12
- filterForm = new FormGroup({});
13
- filterFormQuickFilterKey;
14
- defaultFilterFormValues = {};
15
- pageSizeDefault = 12;
16
- tableOptions;
17
- _defaultTableValues = {
18
- pageSize: this.pageSizeDefault,
19
- page: 1,
20
- quickFilter: null,
21
- query: '',
22
- filters: [],
23
- selectedRows: [],
24
- };
25
- defaultTableValues = {};
26
- get pageSize() {
27
- if (!this.tableOptions) {
28
- return this._defaultTableValues.pageSize;
29
- }
30
- return this.tableOptions.value.pageSize;
31
- }
32
- set pageSize(pageSize) {
33
- this.tableValues = {
34
- pageSize,
35
- };
36
- }
37
- get page() {
38
- if (!this.tableOptions) {
39
- return this._defaultTableValues.page;
40
- }
41
- return this.tableOptions.value.page;
42
- }
43
- set page(page) {
44
- this.tableValues = {
45
- page,
46
- };
47
- }
48
- get quickFilter() {
49
- if (!this.tableOptions) {
50
- return this._defaultTableValues.quickFilter;
51
- }
52
- return this.tableOptions.value.quickFilter;
53
- }
54
- set quickFilter(quickFilter) {
55
- this.tableValues = {
56
- quickFilter,
57
- };
58
- }
59
- get query() {
60
- if (!this.tableOptions) {
61
- return this._defaultTableValues.query;
62
- }
63
- return this.tableOptions.value.query;
64
- }
65
- set query(query) {
66
- this.tableValues = {
67
- query,
68
- };
69
- }
70
- get filters() {
71
- if (!this.tableOptions) {
72
- return this._defaultTableValues.filters;
73
- }
74
- return this.tableOptions.value.filters;
75
- }
76
- set filters(filters) {
77
- this.tableValues = {
78
- filters,
79
- };
80
- }
81
- get selectedRows() {
82
- if (!this.tableOptions) {
83
- return this._defaultTableValues.selectedRows;
84
- }
85
- return this.tableOptions.value.selectedRows;
86
- }
87
- set selectedRows(selectedRows) {
88
- this.tableValues = {
89
- selectedRows,
90
- };
91
- }
92
- // setter
93
- get parsedDefaultTableValues() {
94
- return {
95
- ...this._defaultTableValues,
96
- ...this.defaultTableValues,
97
- pageSize: this.defaultTableValues?.pageSize || this.pageSizeDefault,
98
- };
99
- }
100
- get tableValues() {
101
- return this.tableOptions?.value ?? {};
102
- }
103
- set tableValues(values) {
104
- this._setTableValues({
105
- ...this.tableValues,
106
- ...values,
107
- });
108
- }
109
- constructor() {
110
- super();
111
- }
112
- ngOnInit() {
113
- this.tableOptions = new FormControl({
114
- pageSize: this.parsedDefaultTableValues.pageSize,
115
- page: this.parsedDefaultTableValues.page,
116
- quickFilter: this.parsedDefaultTableValues.quickFilter,
117
- query: this.parsedDefaultTableValues.query,
118
- filters: this.parsedDefaultTableValues.filters,
119
- selectedRows: this.parsedDefaultTableValues.selectedRows,
120
- });
121
- this.tableOptions.valueChanges
122
- .pipe(untilDestroyed(this), startWith(this.tableOptions.value), pairwise(), map(([previous, next]) => this._getChanges(previous, next)), filter((changes) => !!changes), debounce((changes) => {
123
- if (changes?.query && Object.keys(changes)?.length === 1) {
124
- return timer(300);
125
- }
126
- return timer(0);
127
- }))
128
- .subscribe((changes) => {
129
- if (changes?.page) {
130
- this._refresh();
131
- return;
132
- }
133
- this._resetPageOrRefresh();
134
- });
135
- this._refresh();
136
- }
137
- resetTable(emitEvent = true, forceRefresh = false) {
138
- this._setTableValues(this.parsedDefaultTableValues, emitEvent);
139
- if (forceRefresh) {
140
- this._refresh();
141
- }
142
- }
143
- applyFormFilters(values = null) {
144
- values = values ?? this.filterForm.value;
145
- const { filters, quickFilter } = createFormFilters(values, this.quickFilters, this.filterFormQuickFilterKey);
146
- if (quickFilter) {
147
- this.quickFilter = quickFilter;
148
- }
149
- this.filters = filters;
150
- }
151
- resetFormFilters(resetQuickFilter = false) {
152
- const values = this.filterForm.value;
153
- const defaultQuickFilter = this.quickFilters.find((f) => f.default);
154
- for (const key of Object.keys(values)) {
155
- if (key === this.filterFormQuickFilterKey) {
156
- if (resetQuickFilter) {
157
- values[key] = defaultQuickFilter.value;
158
- }
159
- continue;
160
- }
161
- values[key] = this.defaultFilterFormValues[key] ?? null;
162
- }
163
- this.filterForm.setValue(values);
164
- this.applyFormFilters(values);
165
- }
166
- _refresh() {
167
- console.warn('Not implemented');
168
- }
169
- _resetPageOrRefresh() {
170
- if (!this.tableOptions) {
171
- return;
172
- }
173
- if (this.page !== 1) {
174
- this.page = 1;
175
- }
176
- this._refresh();
177
- }
178
- _setTableValues(data, emitEvent = true) {
179
- this.tableOptions?.setValue({
180
- ...this.tableOptions.value,
181
- ...data,
182
- }, { emitEvent });
183
- }
184
- _getChanges(previous, next) {
185
- const changes = {};
186
- let key;
187
- for (key in next) {
188
- if (key === 'selectedRows') {
189
- continue;
190
- }
191
- if (JSON.stringify(previous[key]) !== JSON.stringify(next[key])) {
192
- // @ts-ignore
193
- changes[key] = next[key];
194
- }
195
- }
196
- return Object.keys(changes).length ? changes : null;
197
- }
198
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
199
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: BaseTableComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: ``, isInline: true });
200
- };
201
- BaseTableComponent = __decorate([
202
- UntilDestroy({ checkProperties: true })
203
- ], BaseTableComponent);
204
- export { BaseTableComponent };
205
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseTableComponent, decorators: [{
206
- type: Component,
207
- args: [{
208
- template: ``,
209
- }]
210
- }], ctorParameters: function () { return []; } });
211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGFwZXJsZXNzL3NyYy9saWIvbW9kdWxlcy90YWJsZS9iYXNlL3RhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7QUFvQnRDLElBQWUsa0JBQWtCLEdBQWpDLE1BQWUsa0JBQ2xCLFNBQVEsaUJBQWlCO0lBR2YsWUFBWSxHQUFVLEVBQUUsQ0FBQztJQUU1QixVQUFVLEdBQW1CLElBQUksU0FBUyxDQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELHdCQUF3QixDQUFVO0lBQ2xDLHVCQUF1QixHQUFRLEVBQUUsQ0FBQztJQUVsQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLFlBQVksQ0FBNkI7SUFFeEMsbUJBQW1CLEdBQWlCO1FBQ3hDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZTtRQUM5QixJQUFJLEVBQUUsQ0FBQztRQUNQLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLEtBQUssRUFBRSxFQUFFO1FBQ1QsT0FBTyxFQUFFLEVBQUU7UUFDWCxZQUFZLEVBQUUsRUFBRTtL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QUksR0FBdUIsQ0FBQztRQUM1QixLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDZCxJQUFJLEdBQUcsS0FBSyxjQUFjLEVBQUU7Z0JBQ3hCLFNBQVM7YUFDWjtZQUVELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUM3RCxhQUFhO2dCQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDNUI7U0FDSjtRQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3hELENBQUM7dUdBelBpQixrQkFBa0I7MkZBQWxCLGtCQUFrQiwyRUFGMUIsRUFBRTs7QUFFTSxrQkFBa0I7SUFKdkMsWUFBWSxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDO0dBSWxCLGtCQUFrQixDQTBQdkM7U0ExUHFCLGtCQUFrQjsyRkFBbEIsa0JBQWtCO2tCQUh2QyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxFQUFFO2lCQUNmIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBVbnRpbERlc3Ryb3ksIHVudGlsRGVzdHJveWVkIH0gZnJvbSAnQG5nbmVhdC91bnRpbC1kZXN0cm95JztcbmltcG9ydCB7IFF1aWNrRmlsdGVyIH0gZnJvbSAnQHBhcGVybGVzcy9jb3JlJztcbmltcG9ydCB7IHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZSwgZmlsdGVyLCBtYXAsIHBhaXJ3aXNlLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBCYXNlRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2Jhc2UvZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgY3JlYXRlRm9ybUZpbHRlcnMgfSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCB0eXBlIFRhYmxlUXVpY2tGaWx0ZXIgPSBRdWlja0ZpbHRlciAmIHtcbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIG1ldHJpY05hbWU/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlT3B0aW9ucyB7XG4gICAgcGFnZVNpemU6IG51bWJlcjtcbiAgICBwYWdlOiBudW1iZXI7XG4gICAgcXVpY2tGaWx0ZXI6IFRhYmxlUXVpY2tGaWx0ZXIgfCBzdHJpbmcgfCBudWxsO1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG4gICAgZmlsdGVyczogYW55W107XG4gICAgc2VsZWN0ZWRSb3dzOiBhbnlbXTtcbn1cblxuQFVudGlsRGVzdHJveSh7IGNoZWNrUHJvcGVydGllczogdHJ1ZSB9KVxuQENvbXBvbmVudCh7XG4gICAgdGVtcGxhdGU6IGBgLFxufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlVGFibGVDb21wb25lbnRcbiAgICBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50XG4gICAgaW1wbGVtZW50cyBPbkluaXRcbntcbiAgICBwcm90ZWN0ZWQgcXVpY2tGaWx0ZXJzOiBhbnlbXSA9IFtdO1xuXG4gICAgcHVibGljIGZpbHRlckZvcm06IEZvcm1Hcm91cDxhbnk+ID0gbmV3IEZvcm1Hcm91cDxhbnk+KHt9KTtcbiAgICBwdWJsaWMgZmlsdGVyRm9ybVF1aWNrRmlsdGVyS2V5Pzogc3RyaW5nO1xuICAgIHB1YmxpYyBkZWZhdWx0RmlsdGVyRm9ybVZhbHVlczogYW55ID0ge307XG5cbiAgICBwdWJsaWMgcGFnZVNpemVEZWZhdWx0ID0gMTI7XG4gICAgcHVibGljIHRhYmxlT3B0aW9ucz86IEZvcm1Db250cm9sPFRhYmxlT3B0aW9ucz47XG5cbiAgICBwcml2YXRlIF9kZWZhdWx0VGFibGVWYWx1ZXM6IFRhYmxlT3B0aW9ucyA9IHtcbiAgICAgICAgcGFnZVNpemU6IHRoaXMucGFnZVNpemVEZWZhdWx0LFxuICAgICAgICBwYWdlOiAxLFxuICAgICAgICBxdWlja0ZpbHRlcjogbnVsbCxcbiAgICAgICAgcXVlcnk6ICcnLFxuICAgICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgICAgc2VsZWN0ZWRSb3dzOiBbXSxcbiAgICB9O1xuICAgIHB1YmxpYyBkZWZhdWx0VGFibGVWYWx1ZXM6IFBhcnRpYWw8VGFibGVPcHRpb25zPiA9IHt9O1xuXG4gICAgZ2V0IHBhZ2VTaXplKCkge1xuICAgICAgICBpZiAoIXRoaXMudGFibGVPcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFRhYmxlVmFsdWVzLnBhZ2VTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVPcHRpb25zLnZhbHVlLnBhZ2VTaXplO1xuICAgIH1cblxuICAgIHNldCBwYWdlU2l6ZShwYWdlU2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMudGFibGVWYWx1ZXMgPSB7XG4gICAgICAgICAgICBwYWdlU2l6ZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXQgcGFnZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRhYmxlT3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRUYWJsZVZhbHVlcy5wYWdlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVPcHRpb25zLnZhbHVlLnBhZ2U7XG4gICAgfVxuXG4gICAgc2V0IHBhZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMudGFibGVWYWx1ZXMgPSB7XG4gICAgICAgICAgICBwYWdlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCBxdWlja0ZpbHRlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRhYmxlT3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRUYWJsZVZhbHVlcy5xdWlja0ZpbHRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlT3B0aW9ucy52YWx1ZS5xdWlja0ZpbHRlcjtcbiAgICB9XG4gICAgc2V0IHF1aWNrRmlsdGVyKHF1aWNrRmlsdGVyOiBUYWJsZVF1aWNrRmlsdGVyIHwgc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICB0aGlzLnRhYmxlVmFsdWVzID0ge1xuICAgICAgICAgICAgcXVpY2tGaWx0ZXIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0IHF1ZXJ5KCkge1xuICAgICAgICBpZiAoIXRoaXMudGFibGVPcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFRhYmxlVmFsdWVzLnF1ZXJ5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGVPcHRpb25zLnZhbHVlLnF1ZXJ5O1xuICAgIH1cbiAgICBzZXQgcXVlcnkocXVlcnk6IHN0cmluZykge1xuICAgICAgICB0aGlzLnRhYmxlVmFsdWVzID0ge1xuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0IGZpbHRlcnMoKSB7XG4gICAgICAgIGlmICghdGhpcy50YWJsZU9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VGFibGVWYWx1ZXMuZmlsdGVycztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlT3B0aW9ucy52YWx1ZS5maWx0ZXJzO1xuICAgIH1cbiAgICBzZXQgZmlsdGVycyhmaWx0ZXJzOiBhbnlbXSkge1xuICAgICAgICB0aGlzLnRhYmxlVmFsdWVzID0ge1xuICAgICAgICAgICAgZmlsdGVycyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXQgc2VsZWN0ZWRSb3dzKCkge1xuICAgICAgICBpZiAoIXRoaXMudGFibGVPcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFRhYmxlVmFsdWVzLnNlbGVjdGVkUm93cztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlT3B0aW9ucy52YWx1ZS5zZWxlY3RlZFJvd3M7XG4gICAgfVxuICAgIHNldCBzZWxlY3RlZFJvd3Moc2VsZWN0ZWRSb3dzOiBhbnlbXSkge1xuICAgICAgICB0aGlzLnRhYmxlVmFsdWVzID0ge1xuICAgICAgICAgICAgc2VsZWN0ZWRSb3dzLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIHNldHRlclxuICAgIGdldCBwYXJzZWREZWZhdWx0VGFibGVWYWx1ZXMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWZhdWx0VGFibGVWYWx1ZXMsXG4gICAgICAgICAgICAuLi50aGlzLmRlZmF1bHRUYWJsZVZhbHVlcyxcbiAgICAgICAgICAgIHBhZ2VTaXplOiB0aGlzLmRlZmF1bHRUYWJsZVZhbHVlcz8ucGFnZVNpemUgfHwgdGhpcy5wYWdlU2l6ZURlZmF1bHQsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0IHRhYmxlVmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZU9wdGlvbnM/LnZhbHVlID8/IHt9O1xuICAgIH1cblxuICAgIHNldCB0YWJsZVZhbHVlcyh2YWx1ZXM6IFBhcnRpYWw8VGFibGVPcHRpb25zPikge1xuICAgICAgICB0aGlzLl9zZXRUYWJsZVZhbHVlcyh7XG4gICAgICAgICAgICAuLi50aGlzLnRhYmxlVmFsdWVzLFxuICAgICAgICAgICAgLi4udmFsdWVzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy50YWJsZU9wdGlvbnMgPSBuZXcgRm9ybUNvbnRyb2w8VGFibGVPcHRpb25zPih7XG4gICAgICAgICAgICBwYWdlU2l6ZTogdGhpcy5wYXJzZWREZWZhdWx0VGFibGVWYWx1ZXMucGFnZVNpemUsXG4gICAgICAgICAgICBwYWdlOiB0aGlzLnBhcnNlZERlZmF1bHRUYWJsZVZhbHVlcy5wYWdlLFxuICAgICAgICAgICAgcXVpY2tGaWx0ZXI6IHRoaXMucGFyc2VkRGVmYXVsdFRhYmxlVmFsdWVzLnF1aWNrRmlsdGVyLFxuICAgICAgICAgICAgcXVlcnk6IHRoaXMucGFyc2VkRGVmYXVsdFRhYmxlVmFsdWVzLnF1ZXJ5LFxuICAgICAgICAgICAgZmlsdGVyczogdGhpcy5wYXJzZWREZWZhdWx0VGFibGVWYWx1ZXMuZmlsdGVycyxcbiAgICAgICAgICAgIHNlbGVjdGVkUm93czogdGhpcy5wYXJzZWREZWZhdWx0VGFibGVWYWx1ZXMuc2VsZWN0ZWRSb3dzLFxuICAgICAgICB9KSBhcyBGb3JtQ29udHJvbDxUYWJsZU9wdGlvbnM+O1xuXG4gICAgICAgIHRoaXMudGFibGVPcHRpb25zLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdW50aWxEZXN0cm95ZWQodGhpcyksXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoKHRoaXMudGFibGVPcHRpb25zLnZhbHVlKSxcbiAgICAgICAgICAgICAgICBwYWlyd2lzZSgpLFxuICAgICAgICAgICAgICAgIG1hcCgoW3ByZXZpb3VzLCBuZXh0XSkgPT4gdGhpcy5fZ2V0Q2hhbmdlcyhwcmV2aW91cywgbmV4dCkpLFxuICAgICAgICAgICAgICAgIGZpbHRlcigoY2hhbmdlczogYW55KSA9PiAhIWNoYW5nZXMpLFxuICAgICAgICAgICAgICAgIGRlYm91bmNlKChjaGFuZ2VzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VzPy5xdWVyeSAmJiBPYmplY3Qua2V5cyhjaGFuZ2VzKT8ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGltZXIoMzAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aW1lcigwKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlczogVGFibGVPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZXM/LnBhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVmcmVzaCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzZXRQYWdlT3JSZWZyZXNoKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9yZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgcmVzZXRUYWJsZShlbWl0RXZlbnQgPSB0cnVlLCBmb3JjZVJlZnJlc2ggPSBmYWxzZSkge1xuICAgICAgICB0aGlzLl9zZXRUYWJsZVZhbHVlcyh0aGlzLnBhcnNlZERlZmF1bHRUYWJsZVZhbHVlcywgZW1pdEV2ZW50KTtcblxuICAgICAgICBpZiAoZm9yY2VSZWZyZXNoKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWZyZXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBseUZvcm1GaWx0ZXJzKHZhbHVlczogYW55ID0gbnVsbCkge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMgPz8gdGhpcy5maWx0ZXJGb3JtLnZhbHVlO1xuXG4gICAgICAgIGNvbnN0IHsgZmlsdGVycywgcXVpY2tGaWx0ZXIgfSA9IGNyZWF0ZUZvcm1GaWx0ZXJzKFxuICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgdGhpcy5xdWlja0ZpbHRlcnMsXG4gICAgICAgICAgICB0aGlzLmZpbHRlckZvcm1RdWlja0ZpbHRlcktleVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChxdWlja0ZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5xdWlja0ZpbHRlciA9IHF1aWNrRmlsdGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maWx0ZXJzID0gZmlsdGVycztcbiAgICB9XG5cbiAgICByZXNldEZvcm1GaWx0ZXJzKHJlc2V0UXVpY2tGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBjb25zdCB2YWx1ZXM6IGFueSA9IHRoaXMuZmlsdGVyRm9ybS52YWx1ZTtcbiAgICAgICAgY29uc3QgZGVmYXVsdFF1aWNrRmlsdGVyID0gdGhpcy5xdWlja0ZpbHRlcnMuZmluZCgoZikgPT4gZi5kZWZhdWx0KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZXMpKSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSB0aGlzLmZpbHRlckZvcm1RdWlja0ZpbHRlcktleSkge1xuICAgICAgICAgICAgICAgIGlmIChyZXNldFF1aWNrRmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlc1trZXldID0gZGVmYXVsdFF1aWNrRmlsdGVyLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWVzW2tleV0gPSB0aGlzLmRlZmF1bHRGaWx0ZXJGb3JtVmFsdWVzW2tleV0gPz8gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybS5zZXRWYWx1ZSh2YWx1ZXMpO1xuICAgICAgICB0aGlzLmFwcGx5Rm9ybUZpbHRlcnModmFsdWVzKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3JlZnJlc2goKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzZXRQYWdlT3JSZWZyZXNoKCkge1xuICAgICAgICBpZiAoIXRoaXMudGFibGVPcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYWdlICE9PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2UgPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcmVmcmVzaCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldFRhYmxlVmFsdWVzKGRhdGE6IFBhcnRpYWw8VGFibGVPcHRpb25zPiwgZW1pdEV2ZW50ID0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnRhYmxlT3B0aW9ucz8uc2V0VmFsdWUoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy50YWJsZU9wdGlvbnMudmFsdWUsXG4gICAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGVtaXRFdmVudCB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0Q2hhbmdlcyhwcmV2aW91czogVGFibGVPcHRpb25zLCBuZXh0OiBUYWJsZU9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgY2hhbmdlczogUGFydGlhbDxUYWJsZU9wdGlvbnM+ID0ge307XG5cbiAgICAgICAgbGV0IGtleToga2V5b2YgVGFibGVPcHRpb25zO1xuICAgICAgICBmb3IgKGtleSBpbiBuZXh0KSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnc2VsZWN0ZWRSb3dzJykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkocHJldmlvdXNba2V5XSkgIT09IEpTT04uc3RyaW5naWZ5KG5leHRba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgY2hhbmdlc1trZXldID0gbmV4dFtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGNoYW5nZXMpLmxlbmd0aCA/IGNoYW5nZXMgOiBudWxsO1xuICAgIH1cbn1cbiJdfQ==