ng-tailwind 3.30.368 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/README.md +24 -24
  2. package/animations/ngt-angular-animations.d.ts +5 -5
  3. package/base/ngt-base-ng-model.d.ts +32 -32
  4. package/bundles/ng-tailwind.umd.js +7689 -7631
  5. package/bundles/ng-tailwind.umd.js.map +1 -1
  6. package/components/ngt-action/ngt-action.component.d.ts +13 -13
  7. package/components/ngt-action/ngt-action.module.d.ts +2 -2
  8. package/components/ngt-button/ngt-button.component.d.ts +22 -22
  9. package/components/ngt-button/ngt-button.module.d.ts +2 -2
  10. package/components/ngt-checkbox/ngt-checkbox.component.d.ts +41 -41
  11. package/components/ngt-checkbox/ngt-checkbox.module.d.ts +2 -2
  12. package/components/ngt-content/ngt-content.component.d.ts +9 -9
  13. package/components/ngt-content/ngt-content.module.d.ts +2 -2
  14. package/components/ngt-datatable/ngt-datatable.component.d.ts +114 -114
  15. package/components/ngt-datatable/ngt-datatable.module.d.ts +2 -2
  16. package/components/ngt-datatable/ngt-tbody/ngt-tbody.component.d.ts +11 -11
  17. package/components/ngt-datatable/ngt-td/ngt-td.component.d.ts +11 -11
  18. package/components/ngt-datatable/ngt-td-check/ngt-td-check.component.d.ts +26 -26
  19. package/components/ngt-datatable/ngt-th/ngt-th.component.d.ts +48 -48
  20. package/components/ngt-datatable/ngt-th-check/ngt-th-check.component.d.ts +19 -19
  21. package/components/ngt-datatable/ngt-thead/ngt-thead.component.d.ts +10 -10
  22. package/components/ngt-datatable/ngt-tr/ngt-tr.component.d.ts +17 -17
  23. package/components/ngt-date/ngt-date.component.d.ts +75 -75
  24. package/components/ngt-date/ngt-date.module.d.ts +2 -2
  25. package/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.d.ts +5 -5
  26. package/components/ngt-dropdown/ngt-dropdown.component.d.ts +48 -48
  27. package/components/ngt-dropdown/ngt-dropdown.module.d.ts +2 -2
  28. package/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.d.ts +11 -11
  29. package/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.d.ts +22 -22
  30. package/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.d.ts +21 -21
  31. package/components/ngt-dropzone/ngt-dropzone.component.d.ts +108 -108
  32. package/components/ngt-dropzone/ngt-dropzone.module.d.ts +2 -2
  33. package/components/ngt-floating-button/ngt-floating-button.component.d.ts +32 -32
  34. package/components/ngt-floating-button/ngt-floating-button.module.d.ts +2 -2
  35. package/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.d.ts +7 -7
  36. package/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.module.d.ts +2 -2
  37. package/components/ngt-form/ngt-form.component.d.ts +52 -52
  38. package/components/ngt-form/ngt-form.module.d.ts +2 -2
  39. package/components/ngt-header-nav/ngt-header-nav.component.d.ts +11 -11
  40. package/components/ngt-header-nav/ngt-header-nav.module.d.ts +2 -2
  41. package/components/ngt-helper/ngt-helper.component.d.ts +20 -20
  42. package/components/ngt-helper/ngt-helper.module.d.ts +2 -2
  43. package/components/ngt-input/ngt-input.component.d.ts +116 -116
  44. package/components/ngt-input/ngt-input.module.d.ts +2 -2
  45. package/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.d.ts +2 -2
  46. package/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.d.ts +2 -2
  47. package/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.d.ts +12 -12
  48. package/components/ngt-modal/ngt-modal.component.d.ts +19 -19
  49. package/components/ngt-modal/ngt-modal.module.d.ts +2 -2
  50. package/components/ngt-multi-select/ngt-multi-select.component.d.ts +97 -97
  51. package/components/ngt-multi-select/ngt-multi-select.module.d.ts +2 -2
  52. package/components/ngt-pagination/ngt-pagination.component.d.ts +40 -40
  53. package/components/ngt-pagination/ngt-pagination.module.d.ts +2 -2
  54. package/components/ngt-popover/ngt-popover.component.d.ts +28 -28
  55. package/components/ngt-popover/ngt-popover.module.d.ts +2 -2
  56. package/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.d.ts +9 -9
  57. package/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.d.ts +9 -9
  58. package/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.d.ts +14 -14
  59. package/components/ngt-portlet/ngt-portlet.component.d.ts +17 -17
  60. package/components/ngt-portlet/ngt-portlet.module.d.ts +2 -2
  61. package/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.d.ts +6 -6
  62. package/components/ngt-radio-button/ngt-radio-button.component.d.ts +32 -32
  63. package/components/ngt-radio-button/ngt-radio-button.module.d.ts +2 -2
  64. package/components/ngt-section/ngt-section.component.d.ts +26 -26
  65. package/components/ngt-section/ngt-section.module.d.ts +2 -2
  66. package/components/ngt-select/ngt-select.component.d.ts +131 -131
  67. package/components/ngt-select/ngt-select.directive.d.ts +13 -13
  68. package/components/ngt-select/ngt-select.module.d.ts +2 -2
  69. package/components/ngt-shining/ngt-shining.component.d.ts +16 -16
  70. package/components/ngt-shining/ngt-shining.module.d.ts +2 -2
  71. package/components/ngt-sidenav/ngt-sidenav.component.d.ts +29 -29
  72. package/components/ngt-sidenav/ngt-sidenav.module.d.ts +2 -2
  73. package/components/ngt-slider/ngt-slider.component.d.ts +31 -31
  74. package/components/ngt-slider/ngt-slider.module.d.ts +2 -2
  75. package/components/ngt-svg/ngt-svg.component.d.ts +10 -10
  76. package/components/ngt-svg/ngt-svg.module.d.ts +2 -2
  77. package/components/ngt-tag/ngt-tag.component.d.ts +10 -10
  78. package/components/ngt-tag/ngt-tag.module.d.ts +2 -2
  79. package/components/ngt-textarea/ngt-textarea.component.d.ts +46 -46
  80. package/components/ngt-textarea/ngt-textarea.module.d.ts +2 -2
  81. package/components/ngt-validation/ngt-validation.component.d.ts +10 -10
  82. package/components/ngt-validation/ngt-validation.module.d.ts +2 -2
  83. package/directives/ngt-stylizable/ngt-stylizable.directive.d.ts +65 -65
  84. package/directives/ngt-stylizable/ngt-stylizable.module.d.ts +2 -2
  85. package/enums/size.enum.d.ts +8 -8
  86. package/esm2015/animations/ngt-angular-animations.js +34 -34
  87. package/esm2015/base/ngt-base-ng-model.js +90 -90
  88. package/esm2015/components/ngt-action/ngt-action.component.js +49 -49
  89. package/esm2015/components/ngt-action/ngt-action.module.js +19 -19
  90. package/esm2015/components/ngt-button/ngt-button.component.js +106 -106
  91. package/esm2015/components/ngt-button/ngt-button.module.js +19 -19
  92. package/esm2015/components/ngt-checkbox/ngt-checkbox.component.js +139 -139
  93. package/esm2015/components/ngt-checkbox/ngt-checkbox.module.js +19 -19
  94. package/esm2015/components/ngt-content/ngt-content.component.js +33 -33
  95. package/esm2015/components/ngt-content/ngt-content.module.js +15 -15
  96. package/esm2015/components/ngt-datatable/ngt-datatable.component.js +409 -409
  97. package/esm2015/components/ngt-datatable/ngt-datatable.module.js +58 -58
  98. package/esm2015/components/ngt-datatable/ngt-tbody/ngt-tbody.component.js +58 -58
  99. package/esm2015/components/ngt-datatable/ngt-td/ngt-td.component.js +63 -63
  100. package/esm2015/components/ngt-datatable/ngt-td-check/ngt-td-check.component.js +105 -105
  101. package/esm2015/components/ngt-datatable/ngt-th/ngt-th.component.js +195 -195
  102. package/esm2015/components/ngt-datatable/ngt-th-check/ngt-th-check.component.js +87 -87
  103. package/esm2015/components/ngt-datatable/ngt-thead/ngt-thead.component.js +56 -56
  104. package/esm2015/components/ngt-datatable/ngt-tr/ngt-tr.component.js +76 -76
  105. package/esm2015/components/ngt-date/ngt-date.component.js +380 -380
  106. package/esm2015/components/ngt-date/ngt-date.module.js +25 -25
  107. package/esm2015/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.js +20 -20
  108. package/esm2015/components/ngt-dropdown/ngt-dropdown.component.js +185 -185
  109. package/esm2015/components/ngt-dropdown/ngt-dropdown.module.js +16 -16
  110. package/esm2015/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.js +50 -50
  111. package/esm2015/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.js +59 -59
  112. package/esm2015/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.js +67 -67
  113. package/esm2015/components/ngt-dropzone/ngt-dropzone.component.js +434 -434
  114. package/esm2015/components/ngt-dropzone/ngt-dropzone.module.js +37 -37
  115. package/esm2015/components/ngt-floating-button/ngt-floating-button.component.js +94 -94
  116. package/esm2015/components/ngt-floating-button/ngt-floating-button.module.js +19 -19
  117. package/esm2015/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.js +23 -23
  118. package/esm2015/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.module.js +15 -15
  119. package/esm2015/components/ngt-form/ngt-form.component.js +181 -181
  120. package/esm2015/components/ngt-form/ngt-form.module.js +17 -17
  121. package/esm2015/components/ngt-header-nav/ngt-header-nav.component.js +38 -38
  122. package/esm2015/components/ngt-header-nav/ngt-header-nav.module.js +15 -15
  123. package/esm2015/components/ngt-helper/ngt-helper.component.js +51 -51
  124. package/esm2015/components/ngt-helper/ngt-helper.module.js +19 -19
  125. package/esm2015/components/ngt-input/ngt-input.component.js +680 -680
  126. package/esm2015/components/ngt-input/ngt-input.module.js +28 -28
  127. package/esm2015/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.js +11 -11
  128. package/esm2015/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.js +11 -11
  129. package/esm2015/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.js +40 -40
  130. package/esm2015/components/ngt-modal/ngt-modal.component.js +79 -79
  131. package/esm2015/components/ngt-modal/ngt-modal.module.js +28 -28
  132. package/esm2015/components/ngt-multi-select/ngt-multi-select.component.js +394 -394
  133. package/esm2015/components/ngt-multi-select/ngt-multi-select.module.js +33 -33
  134. package/esm2015/components/ngt-pagination/ngt-pagination.component.js +172 -172
  135. package/esm2015/components/ngt-pagination/ngt-pagination.module.js +23 -23
  136. package/esm2015/components/ngt-popover/ngt-popover.component.js +73 -73
  137. package/esm2015/components/ngt-popover/ngt-popover.module.js +17 -17
  138. package/esm2015/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.js +34 -34
  139. package/esm2015/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.js +33 -33
  140. package/esm2015/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.js +47 -47
  141. package/esm2015/components/ngt-portlet/ngt-portlet.component.js +58 -58
  142. package/esm2015/components/ngt-portlet/ngt-portlet.module.js +32 -32
  143. package/esm2015/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.js +19 -19
  144. package/esm2015/components/ngt-radio-button/ngt-radio-button.component.js +103 -103
  145. package/esm2015/components/ngt-radio-button/ngt-radio-button.module.js +20 -20
  146. package/esm2015/components/ngt-section/ngt-section.component.js +101 -101
  147. package/esm2015/components/ngt-section/ngt-section.module.js +21 -21
  148. package/esm2015/components/ngt-select/ngt-select.component.js +488 -488
  149. package/esm2015/components/ngt-select/ngt-select.directive.js +35 -35
  150. package/esm2015/components/ngt-select/ngt-select.module.js +40 -40
  151. package/esm2015/components/ngt-shining/ngt-shining.component.js +41 -41
  152. package/esm2015/components/ngt-shining/ngt-shining.module.js +15 -15
  153. package/esm2015/components/ngt-sidenav/ngt-sidenav.component.js +123 -123
  154. package/esm2015/components/ngt-sidenav/ngt-sidenav.module.js +15 -15
  155. package/esm2015/components/ngt-slider/ngt-slider.component.js +82 -82
  156. package/esm2015/components/ngt-slider/ngt-slider.module.js +17 -17
  157. package/esm2015/components/ngt-svg/ngt-svg.component.js +52 -52
  158. package/esm2015/components/ngt-svg/ngt-svg.module.js +19 -19
  159. package/esm2015/components/ngt-tag/ngt-tag.component.js +36 -36
  160. package/esm2015/components/ngt-tag/ngt-tag.module.js +17 -17
  161. package/esm2015/components/ngt-textarea/ngt-textarea.component.js +210 -210
  162. package/esm2015/components/ngt-textarea/ngt-textarea.module.js +26 -26
  163. package/esm2015/components/ngt-validation/ngt-validation.component.js +24 -24
  164. package/esm2015/components/ngt-validation/ngt-validation.module.js +15 -15
  165. package/esm2015/directives/ngt-stylizable/ngt-stylizable.directive.js +227 -227
  166. package/esm2015/directives/ngt-stylizable/ngt-stylizable.module.js +15 -15
  167. package/esm2015/enums/size.enum.js +11 -11
  168. package/esm2015/helpers/enum/enum.js +7 -7
  169. package/esm2015/helpers/form/form.js +14 -14
  170. package/esm2015/helpers/routing/route.js +11 -11
  171. package/esm2015/helpers/uuid.js +10 -10
  172. package/esm2015/ng-tailwind.js +10 -10
  173. package/esm2015/public-api.js +120 -120
  174. package/esm2015/services/http/ngt-attachment-http.service.js +3 -3
  175. package/esm2015/services/http/ngt-http-form.service.js +3 -3
  176. package/esm2015/services/http/ngt-http-resource.service.js +3 -3
  177. package/esm2015/services/http/ngt-http-validation.service.js +3 -3
  178. package/esm2015/services/http/ngt-http.service.js +3 -3
  179. package/esm2015/services/http/ngt-translate.service.js +3 -3
  180. package/esm2015/services/ngt-stylizable/ngt-stylizable.service.js +273 -273
  181. package/fesm2015/ng-tailwind.js +6690 -6690
  182. package/fesm2015/ng-tailwind.js.map +1 -1
  183. package/helpers/enum/enum.d.ts +1 -1
  184. package/helpers/form/form.d.ts +4 -4
  185. package/helpers/routing/route.d.ts +2 -2
  186. package/helpers/uuid.d.ts +1 -1
  187. package/ng-tailwind.d.ts +10 -10
  188. package/ng-tailwind.metadata.json +1 -1
  189. package/package.json +2 -2
  190. package/public-api.d.ts +82 -82
  191. package/services/http/ngt-attachment-http.service.d.ts +10 -10
  192. package/services/http/ngt-http-form.service.d.ts +5 -5
  193. package/services/http/ngt-http-resource.service.d.ts +12 -12
  194. package/services/http/ngt-http-validation.service.d.ts +11 -11
  195. package/services/http/ngt-http.service.d.ts +27 -27
  196. package/services/http/ngt-translate.service.d.ts +29 -29
  197. package/services/ngt-stylizable/ngt-stylizable.service.d.ts +96 -96
@@ -1,409 +1,409 @@
1
- import { __awaiter } from "tslib";
2
- import { ChangeDetectorRef, Component, EventEmitter, Injector, Input, Optional, Output, ViewChild, } from '@angular/core';
3
- import { getEnumFromString } from '../../helpers/enum/enum';
4
- import { NgtHttpService } from '../../services/http/ngt-http.service';
5
- import { NgtTranslateService } from '../../services/http/ngt-translate.service';
6
- export class NgtDatatableComponent {
7
- constructor(injector, ngtHttpService, changeDetector, ngtTranslateService) {
8
- this.injector = injector;
9
- this.ngtHttpService = ngtHttpService;
10
- this.changeDetector = changeDetector;
11
- this.ngtTranslateService = ngtTranslateService;
12
- this.type = NgtDatatableType.REMOTE;
13
- this.filterTagBgColor = 'bg-blue-500';
14
- this.filterTagMargin = 'mb-4';
15
- this.paginationMargin = 'mt-2 md:mt-8';
16
- this.searchDelay = 500;
17
- this.searchTermMinLength = 1;
18
- this.searchTermOnEnter = true;
19
- this.defaultFilters = {};
20
- this.filtersDescription = {};
21
- this.onDataChange = new EventEmitter();
22
- this.onClearFilter = new EventEmitter();
23
- this.onClearSelectedElements = new EventEmitter();
24
- this.onSelectedElementsChange = new EventEmitter();
25
- this.onToogleAllCheckboxes = new EventEmitter();
26
- this.onToogleCheckbox = new EventEmitter();
27
- this.onOpenSearchModal = new EventEmitter();
28
- this.onSearch = new EventEmitter();
29
- this.data = [];
30
- this.loading = false;
31
- this.cleaningFilter = false;
32
- this.componentReady = false;
33
- this.filtersTranslated = [];
34
- this.columnCount = [];
35
- this.selectedElements = [];
36
- this.subscriptions = [];
37
- this.currentState = {
38
- filters: {
39
- defaultFilters: {},
40
- silentFilters: {},
41
- qualifiedFilters: {},
42
- },
43
- sort: {
44
- field: '',
45
- direction: ''
46
- }
47
- };
48
- }
49
- ngOnInit() {
50
- if (this.table && this.table.nativeElement && this.table.nativeElement.rows
51
- && this.table.nativeElement.rows[0] && this.table.nativeElement.rows[0].cells) {
52
- this.columnCount = this.table.nativeElement.rows[0].cells;
53
- }
54
- if (this.inputSearch) {
55
- this.initSearchWithInput();
56
- }
57
- this.initCheckboxEvent();
58
- if (this.searchDelay == 500) {
59
- this.searchDelay = this.injector.get('NgtDatatableSearchDelay', 500);
60
- }
61
- if (this.searchTermMinLength == 1) {
62
- this.searchTermMinLength = this.injector.get('NgtDatatableSearchTermMinLength', 1);
63
- }
64
- }
65
- ngOnDestroy() {
66
- this.destroySubscriptions();
67
- }
68
- setSearchModalTemplate(template) {
69
- this.searchModalTemplate = template;
70
- }
71
- openSearchModal(reference) {
72
- this.searchModal.open();
73
- this.onOpenSearchModal.emit(reference);
74
- }
75
- clearSelectedElements() {
76
- this.selectedElements = [];
77
- this.onClearSelectedElements.emit();
78
- }
79
- getCurrentState() {
80
- return this.currentState;
81
- }
82
- init() {
83
- this.componentReady = true;
84
- }
85
- search(filters, searchType = NgtDatatableSearchType.DEFAULT, applyDelayOnSearch = true) {
86
- return __awaiter(this, void 0, void 0, function* () {
87
- if (this.canApplyFilters(filters)) {
88
- this.onSearch.emit(filters);
89
- if (searchType == NgtDatatableSearchType.DEFAULT) {
90
- this.currentState.filters.defaultFilters = Object.assign(Object.assign({}, this.currentState.filters.defaultFilters), filters);
91
- }
92
- else {
93
- this.currentState.filters.silentFilters = Object.assign(Object.assign({}, this.currentState.filters.silentFilters), filters);
94
- }
95
- this.applyFiltersDescription();
96
- return this.apply(1, applyDelayOnSearch);
97
- }
98
- });
99
- }
100
- sort(field, direction) {
101
- return __awaiter(this, void 0, void 0, function* () {
102
- this.currentState.sort = {
103
- field: field,
104
- direction: direction
105
- };
106
- return this.apply(this.ngtPagination.getCurrentPage());
107
- });
108
- }
109
- refresh(stayInPage = NgtDatatableParam.RESET_PAGE, loader = NgtDatatableParam.ENABLE_LOADER) {
110
- return __awaiter(this, void 0, void 0, function* () {
111
- return this.apply(stayInPage ? this.ngtPagination.getCurrentPage() : 1, false, loader).then(() => { var _a; return !((_a = this.data) === null || _a === void 0 ? void 0 : _a.length) ? this.apply(1, false) : null; });
112
- });
113
- }
114
- getData() {
115
- return this.data;
116
- }
117
- getCurrentSort() {
118
- return this.currentState.sort;
119
- }
120
- setPerPage(perPage) {
121
- this.ngtPagination.onRegistersPerPageChange(perPage);
122
- }
123
- applyFiltersDescription() {
124
- if (!this.cleaningFilter) {
125
- this.filtersTranslated = [];
126
- for (let reference in this.currentState.filters.defaultFilters) {
127
- if (this.filtersDescription[reference] && this.currentState.filters.defaultFilters[reference]) {
128
- this.filtersTranslated.push({
129
- reference: reference,
130
- value: this.currentState.filters.defaultFilters[reference],
131
- translation: this.filtersDescription[reference]
132
- });
133
- }
134
- }
135
- }
136
- }
137
- setFilterDescription(reference, description) {
138
- this.filtersDescription[reference] = description;
139
- }
140
- removeFilter(reference, refresh = true) {
141
- if (reference && !this.hasAppliedFilter(reference)) {
142
- return;
143
- }
144
- this.cleaningFilter = true;
145
- if (!reference) {
146
- this.currentState.filters.defaultFilters = {};
147
- this.currentState.filters.silentFilters = {};
148
- this.filtersTranslated = [];
149
- }
150
- else {
151
- delete this.currentState.filters.defaultFilters[reference];
152
- delete this.currentState.filters.silentFilters[reference];
153
- this.filtersTranslated = this.filtersTranslated.filter(element => element && element.reference !== reference);
154
- }
155
- this.onClearFilter.emit(reference);
156
- if (this.inputSearch && (reference === 'term' || !reference)) {
157
- this.inputSearch.clearInput();
158
- }
159
- if (refresh) {
160
- this.apply(this.ngtPagination.getCurrentPage(), false).then(() => this.cleaningFilter = false);
161
- }
162
- }
163
- hasAppliedFilter(filter) {
164
- const reference = typeof filter === 'string' ? filter : Object.keys(filter !== null && filter !== void 0 ? filter : {})[0];
165
- const appliedFilters = this.currentState.filters.qualifiedFilters;
166
- return !!Object.keys(appliedFilters).find(key => key == reference);
167
- }
168
- hasAppliedFilters(searchType = NgtDatatableSearchType.DEFAULT) {
169
- var _a;
170
- let appliedFilters = {};
171
- if (searchType == NgtDatatableSearchType.DEFAULT) {
172
- appliedFilters = this.currentState.filters.defaultFilters;
173
- }
174
- else if (searchType == NgtDatatableSearchType.SILENT) {
175
- appliedFilters = this.currentState.filters.silentFilters;
176
- }
177
- else {
178
- appliedFilters = Object.assign(Object.assign({}, this.currentState.filters.defaultFilters), this.currentState.filters.silentFilters);
179
- }
180
- return !!((_a = Object.values(appliedFilters)) === null || _a === void 0 ? void 0 : _a.find(filter => !!filter));
181
- }
182
- ngOnChanges(changes) {
183
- if (changes.inputSearch) {
184
- if (changes.inputSearch.currentValue) {
185
- this.initSearchWithInput();
186
- }
187
- }
188
- if (changes.type) {
189
- this.type = getEnumFromString(changes.type.currentValue, NgtDatatableType);
190
- }
191
- }
192
- apply(page = 1, applyDelayOnSearch = true, loader = NgtDatatableParam.ENABLE_LOADER) {
193
- return __awaiter(this, void 0, void 0, function* () {
194
- return new Promise(resolve => {
195
- if (!this.componentReady) {
196
- return resolve();
197
- }
198
- else if (this.searchTimeout) {
199
- clearTimeout(this.searchTimeout);
200
- }
201
- this.ngtPagination.displayPagination = false;
202
- this.selectedElements = [];
203
- if (this.type === NgtDatatableType.REMOTE) {
204
- if (this.remoteResource) {
205
- if (loader) {
206
- this.loading = true;
207
- this.bindVisibilityAttributes();
208
- }
209
- if (applyDelayOnSearch) {
210
- this.searchTimeout = setTimeout(() => {
211
- this.loadData(page).then(() => resolve());
212
- }, this.searchDelay);
213
- }
214
- else {
215
- this.loadData(page).then(() => resolve());
216
- }
217
- }
218
- else {
219
- console.error('The property [remoteResource] needs to be present to be able to make remote search');
220
- }
221
- }
222
- else if (this.type == NgtDatatableType.FIXED) {
223
- this.bindVisibilityAttributes();
224
- resolve();
225
- }
226
- });
227
- });
228
- }
229
- loadData(page) {
230
- return new Promise((resolve, reject) => {
231
- const pagination = Object.assign(Object.assign({}, this.ngtPagination.getPagination()), { page: page });
232
- this.currentState.filters.qualifiedFilters = this.getQualifiedFilters();
233
- this.searching = true;
234
- if (this.inputSearch) {
235
- this.inputSearch.isDisabled = true;
236
- }
237
- this.subscriptions.push(this.ngtHttpService.get(this.remoteResource, this.currentState.filters.qualifiedFilters, pagination, this.currentState.sort).subscribe((response) => {
238
- this.proccessRemoteResponse(response.data);
239
- this.ngtPagination.proccessPagination(response.meta);
240
- this.searching = false;
241
- this.loading = false;
242
- if (this.inputSearch) {
243
- this.inputSearch.isDisabled = false;
244
- }
245
- this.onDataChange.emit(this.data);
246
- this.bindVisibilityAttributes();
247
- resolve();
248
- }, (error) => {
249
- console.error(error);
250
- this.loading = false;
251
- this.inputSearch.isDisabled = false;
252
- this.changeDetector.detectChanges();
253
- reject();
254
- }));
255
- });
256
- }
257
- getQualifiedFilters() {
258
- const qualifiedFilters = {};
259
- const requestedFilters = Object.assign(Object.assign({}, this.currentState.filters.defaultFilters), this.currentState.filters.silentFilters);
260
- if (requestedFilters) {
261
- for (const reference in requestedFilters) {
262
- const filter = requestedFilters[reference];
263
- if (this.isValidFilter(filter)) {
264
- if (filter instanceof NgtCustomFilter) {
265
- if (filter.tagLabel) {
266
- this.filtersDescription[reference] = filter.tagLabel;
267
- this.applyFiltersDescription();
268
- }
269
- qualifiedFilters[reference] = filter.term;
270
- }
271
- else {
272
- qualifiedFilters[reference] = filter;
273
- }
274
- }
275
- }
276
- }
277
- return qualifiedFilters;
278
- }
279
- bindVisibilityAttributes() {
280
- this.changeDetector.detectChanges();
281
- if (this.type == NgtDatatableType.REMOTE && !this.data.length && !this.loading) {
282
- this.emptyStateVisible = true;
283
- }
284
- else if (this.type == NgtDatatableType.FIXED) {
285
- this.emptyStateVisible = false;
286
- }
287
- else {
288
- this.emptyStateVisible = false;
289
- }
290
- this.changeDetector.detectChanges();
291
- }
292
- proccessRemoteResponse(response) {
293
- this.data = response;
294
- }
295
- initSearchWithInput() {
296
- this.subscriptions.push(this.inputSearch.onValueChange().subscribe((value) => {
297
- if (this.currentState.filters.defaultFilters['term']) {
298
- if (!value) {
299
- this.removeFilter('term');
300
- }
301
- else if (value.length < this.searchTermMinLength) {
302
- delete this.currentState.filters.defaultFilters['term'];
303
- this.search({ term: '' });
304
- }
305
- }
306
- if (value.length >= this.searchTermMinLength) {
307
- this.search({ term: value });
308
- }
309
- }));
310
- if (this.searchTermOnEnter) {
311
- this.inputSearch.element.nativeElement.addEventListener('keydown', (event) => {
312
- event.stopImmediatePropagation();
313
- if (event.keyCode == 13) {
314
- if (this.inputSearch.value && this.inputSearch.value.length >= this.searchTermMinLength) {
315
- this.apply(1, false);
316
- }
317
- }
318
- });
319
- }
320
- }
321
- initCheckboxEvent() {
322
- this.subscriptions.push(this.onToogleCheckbox.subscribe((checkedElement) => {
323
- this.selectedElements = this.selectedElements.filter(item => item.id !== checkedElement.id);
324
- if (checkedElement.checked) {
325
- this.selectedElements.push(checkedElement);
326
- }
327
- this.onSelectedElementsChange.emit(this.selectedElements);
328
- }));
329
- }
330
- canApplyFilters(filters) {
331
- if (!this.searching) {
332
- for (const reference in filters) {
333
- if (this.isValidFilter(filters[reference])) {
334
- return true;
335
- }
336
- }
337
- }
338
- return false;
339
- }
340
- isValidFilter(filter) {
341
- const value = Object.values(filter !== null && filter !== void 0 ? filter : {})[0];
342
- const hasValue = !!((value instanceof NgtCustomFilter && value.term) || value);
343
- const isApplied = this.hasAppliedFilter(filter);
344
- return isApplied || (!isApplied && hasValue);
345
- }
346
- destroySubscriptions() {
347
- this.subscriptions.forEach(subscription => subscription.unsubscribe());
348
- this.subscriptions = [];
349
- }
350
- }
351
- NgtDatatableComponent.decorators = [
352
- { type: Component, args: [{
353
- selector: 'ngt-datatable',
354
- template: "<div class=\"w-full\">\r\n <div class=\"flex flex-wrap w-full\">\r\n <ngt-tag *ngIf=\"hasAppliedFilters()\" class=\"w-full sm:w-auto {{ filterTagMargin }}\"\r\n [class.sm:mr-4]=\"filterTagMargin == 'mb-4'\" color.bg=\"bg-red-500\" (click)=\"removeFilter()\" ngt-stylizable>\r\n Limpar Filtros\r\n </ngt-tag>\r\n\r\n <ng-container *ngIf=\"hasAppliedFilters()\">\r\n <ng-container *ngFor=\"let filter of filtersTranslated\">\r\n <ngt-tag class=\"w-full sm:w-auto {{ filterTagMargin }}\" [class.sm:mr-4]=\"filterTagMargin == 'mb-4'\"\r\n [color.bg]=\"filterTagBgColor\" (click)=\"removeFilter(filter.reference)\" ngt-stylizable>\r\n {{ filter.translation + ': ' + (filter?.value?.tagValue ? filter.value.tagValue : filter.value)}}\r\n </ngt-tag>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <table style=\"display: table;\" class=\"text-left w-full border-collapse table-responsive\" #table>\r\n <ng-content></ng-content>\r\n </table>\r\n\r\n <p *ngIf=\"emptyStateVisible\" class=\"mt-8 mx-auto self-center text-center text-xl\">\r\n {{ ngtTranslateService.ngtDatatableNoDataFound }}\r\n </p>\r\n\r\n <div *ngIf=\"loading\">\r\n <div *ngFor=\"let i of [1, 2, 3, 4]\" class=\"flex w-full mt-3\">\r\n <ng-container *ngIf=\"columnCount.length >= 2\">\r\n <ng-container *ngFor=\"let j of columnCount; let last = last\">\r\n <ng-container *ngIf=\"last\">\r\n <ngt-shining class=\"h-10 w-full\"></ngt-shining>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!last\">\r\n <ngt-shining class=\"h-10 w-full mr-10\"></ngt-shining>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"columnCount.length < 2\">\r\n <ngt-shining class=\"h-10 w-full\"></ngt-shining>\r\n <ngt-shining class=\"h-10 w-full mr-10 ml-10\"></ngt-shining>\r\n <ngt-shining class=\"h-10 w-full\"></ngt-shining>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"clearfix {{ paginationMargin }}\" [hidden]='!data || data.length == 0'>\r\n <ngt-pagination [pagesInterval]='4' (onPageChange)='apply($event, false)' (onPerPageChange)='apply(1, false)'\r\n #ngtPagination>\r\n </ngt-pagination>\r\n</div>\r\n\r\n<ngt-modal #searchModal [customLayout]='true'>\r\n <ng-container *ngTemplateOutlet=\"searchModalTemplate\"></ng-container>\r\n</ngt-modal>",
355
- styles: ["@media (max-width: 767px){.table-responsive{display:block;position:relative;width:100%}.table-responsive thead,.table-responsive tbody,.table-responsive th,.table-responsive td,.table-responsive tr{display:block}.table-responsive td,.table-responsive th{height:50px}.table-responsive thead{float:left;margin-bottom:15px}.table-responsive tbody{width:auto;position:relative;overflow-x:auto;-webkit-overflow-scrolling:touch;white-space:nowrap}.table-responsive tbody tr{display:inline-block;min-width:100%}}\n"]
356
- },] }
357
- ];
358
- NgtDatatableComponent.ctorParameters = () => [
359
- { type: Injector },
360
- { type: NgtHttpService },
361
- { type: ChangeDetectorRef },
362
- { type: NgtTranslateService, decorators: [{ type: Optional }] }
363
- ];
364
- NgtDatatableComponent.propDecorators = {
365
- table: [{ type: ViewChild, args: ['table', { static: true },] }],
366
- ngtPagination: [{ type: ViewChild, args: ['ngtPagination', { static: true },] }],
367
- searchModal: [{ type: ViewChild, args: ['searchModal', { static: true },] }],
368
- remoteResource: [{ type: Input }],
369
- type: [{ type: Input }],
370
- filterTagBgColor: [{ type: Input }],
371
- filterTagMargin: [{ type: Input }],
372
- paginationMargin: [{ type: Input }],
373
- inputSearch: [{ type: Input }],
374
- searchDelay: [{ type: Input }],
375
- searchTermMinLength: [{ type: Input }],
376
- searchTermOnEnter: [{ type: Input }],
377
- defaultFilters: [{ type: Input }],
378
- filtersDescription: [{ type: Input }],
379
- onDataChange: [{ type: Output }],
380
- onClearFilter: [{ type: Output }],
381
- onClearSelectedElements: [{ type: Output }],
382
- onSelectedElementsChange: [{ type: Output }],
383
- onToogleAllCheckboxes: [{ type: Output }],
384
- onToogleCheckbox: [{ type: Output }],
385
- onOpenSearchModal: [{ type: Output }],
386
- onSearch: [{ type: Output }]
387
- };
388
- export var NgtDatatableType;
389
- (function (NgtDatatableType) {
390
- NgtDatatableType["REMOTE"] = "REMOTE";
391
- NgtDatatableType["FIXED"] = "FIXED";
392
- })(NgtDatatableType || (NgtDatatableType = {}));
393
- export var NgtDatatableSearchType;
394
- (function (NgtDatatableSearchType) {
395
- NgtDatatableSearchType["DEFAULT"] = "DEFAULT";
396
- NgtDatatableSearchType["SILENT"] = "SILENT";
397
- })(NgtDatatableSearchType || (NgtDatatableSearchType = {}));
398
- export var NgtDatatableParam;
399
- (function (NgtDatatableParam) {
400
- NgtDatatableParam[NgtDatatableParam["STAY_IN_PAGE"] = 1] = "STAY_IN_PAGE";
401
- NgtDatatableParam[NgtDatatableParam["RESET_PAGE"] = 0] = "RESET_PAGE";
402
- NgtDatatableParam[NgtDatatableParam["ENABLE_LOADER"] = 1] = "ENABLE_LOADER";
403
- NgtDatatableParam[NgtDatatableParam["DISABLE_LOADER"] = 0] = "DISABLE_LOADER";
404
- })(NgtDatatableParam || (NgtDatatableParam = {}));
405
- export class NgtCheckedElement {
406
- }
407
- export class NgtCustomFilter {
408
- }
409
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LWRhdGF0YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy10YWlsd2luZC9zcmMvY29tcG9uZW50cy9uZ3QtZGF0YXRhYmxlL25ndC1kYXRhdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUdOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQXNDLGNBQWMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzFHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBVWhGLE1BQU0sT0FBTyxxQkFBcUI7SUFtRDlCLFlBQ1ksUUFBa0IsRUFDbEIsY0FBOEIsRUFDOUIsY0FBaUMsRUFFbEMsbUJBQXdDO1FBSnZDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUVsQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBbERuQyxTQUFJLEdBQXFCLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztRQUNqRCxxQkFBZ0IsR0FBVyxhQUFhLENBQUM7UUFDekMsb0JBQWUsR0FBVyxNQUFNLENBQUM7UUFDakMscUJBQWdCLEdBQVcsY0FBYyxDQUFDO1FBRTFDLGdCQUFXLEdBQVcsR0FBRyxDQUFDO1FBQzFCLHdCQUFtQixHQUFXLENBQUMsQ0FBQztRQUNoQyxzQkFBaUIsR0FBWSxJQUFJLENBQUM7UUFDbEMsbUJBQWMsR0FBUSxFQUFFLENBQUM7UUFDekIsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBRXZC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QUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFOzZCQUV6QyxLQUFLO21CQUNMLEtBQUs7K0JBQ0wsS0FBSzs4QkFDTCxLQUFLOytCQUNMLEtBQUs7MEJBQ0wsS0FBSzswQkFDTCxLQUFLO2tDQUNMLEtBQUs7Z0NBQ0wsS0FBSzs2QkFDTCxLQUFLO2lDQUNMLEtBQUs7MkJBRUwsTUFBTTs0QkFDTixNQUFNO3NDQUNOLE1BQU07dUNBQ04sTUFBTTtvQ0FDTixNQUFNOytCQUNOLE1BQU07Z0NBQ04sTUFBTTt1QkFDTixNQUFNOztBQXlaWCxNQUFNLENBQU4sSUFBWSxnQkFHWDtBQUhELFdBQVksZ0JBQWdCO0lBQ3hCLHFDQUFpQixDQUFBO0lBQ2pCLG1DQUFlLENBQUE7QUFDbkIsQ0FBQyxFQUhXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFHM0I7QUFFRCxNQUFNLENBQU4sSUFBWSxzQkFHWDtBQUhELFdBQVksc0JBQXNCO0lBQzlCLDZDQUFtQixDQUFBO0lBQ25CLDJDQUFpQixDQUFBO0FBQ3JCLENBQUMsRUFIVyxzQkFBc0IsS0FBdEIsc0JBQXNCLFFBR2pDO0FBRUQsTUFBTSxDQUFOLElBQVksaUJBS1g7QUFMRCxXQUFZLGlCQUFpQjtJQUN6Qix5RUFBZ0IsQ0FBQTtJQUNoQixxRUFBYyxDQUFBO0lBQ2QsMkVBQWlCLENBQUE7SUFDakIsNkVBQWtCLENBQUE7QUFDdEIsQ0FBQyxFQUxXLGlCQUFpQixLQUFqQixpQkFBaUIsUUFLNUI7QUFFRCxNQUFNLE9BQU8saUJBQWlCO0NBSTdCO0FBRUQsTUFBTSxPQUFPLGVBQWU7Q0FJM0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgSW5qZWN0b3IsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIE9wdGlvbmFsLFxyXG4gICAgT3V0cHV0LFxyXG4gICAgU2ltcGxlQ2hhbmdlcyxcclxuICAgIFRlbXBsYXRlUmVmLFxyXG4gICAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IGdldEVudW1Gcm9tU3RyaW5nIH0gZnJvbSAnLi4vLi4vaGVscGVycy9lbnVtL2VudW0nO1xyXG5pbXBvcnQgeyBOZ3RIdHRwUGFnaW5hdGlvbiwgTmd0SHR0cFJlc3BvbnNlLCBOZ3RIdHRwU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2h0dHAvbmd0LWh0dHAuc2VydmljZSc7XHJcbmltcG9ydCB7IE5ndFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9odHRwL25ndC10cmFuc2xhdGUuc2VydmljZSc7XHJcbmltcG9ydCB7IE5ndElucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LWlucHV0L25ndC1pbnB1dC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBOZ3RNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL25ndC1tb2RhbC9uZ3QtbW9kYWwuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTmd0UGFnaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL25ndC1wYWdpbmF0aW9uL25ndC1wYWdpbmF0aW9uLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbmd0LWRhdGF0YWJsZScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vbmd0LWRhdGF0YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9uZ3QtZGF0YXRhYmxlLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd0RGF0YXRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgQFZpZXdDaGlsZCgndGFibGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgdGFibGU6IEVsZW1lbnRSZWY7XHJcbiAgICBAVmlld0NoaWxkKCduZ3RQYWdpbmF0aW9uJywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIG5ndFBhZ2luYXRpb246IE5ndFBhZ2luYXRpb25Db21wb25lbnQ7XHJcbiAgICBAVmlld0NoaWxkKCdzZWFyY2hNb2RhbCcsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBzZWFyY2hNb2RhbDogTmd0TW9kYWxDb21wb25lbnQ7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIHJlbW90ZVJlc291cmNlOiBhbnk7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdHlwZTogTmd0RGF0YXRhYmxlVHlwZSA9IE5ndERhdGF0YWJsZVR5cGUuUkVNT1RFO1xyXG4gICAgQElucHV0KCkgcHVibGljIGZpbHRlclRhZ0JnQ29sb3I6IHN0cmluZyA9ICdiZy1ibHVlLTUwMCc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZmlsdGVyVGFnTWFyZ2luOiBzdHJpbmcgPSAnbWItNCc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgcGFnaW5hdGlvbk1hcmdpbjogc3RyaW5nID0gJ210LTIgbWQ6bXQtOCc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5wdXRTZWFyY2g6IE5ndElucHV0Q29tcG9uZW50O1xyXG4gICAgQElucHV0KCkgcHVibGljIHNlYXJjaERlbGF5OiBudW1iZXIgPSA1MDA7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VhcmNoVGVybU1pbkxlbmd0aDogbnVtYmVyID0gMTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWFyY2hUZXJtT25FbnRlcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZGVmYXVsdEZpbHRlcnM6IGFueSA9IHt9O1xyXG4gICAgQElucHV0KCkgcHVibGljIGZpbHRlcnNEZXNjcmlwdGlvbiA9IHt9O1xyXG5cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25EYXRhQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25DbGVhckZpbHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uQ2xlYXJTZWxlY3RlZEVsZW1lbnRzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25TZWxlY3RlZEVsZW1lbnRzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8QXJyYXk8Tmd0Q2hlY2tlZEVsZW1lbnQ+PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25Ub29nbGVBbGxDaGVja2JveGVzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25Ub29nbGVDaGVja2JveDogRXZlbnRFbWl0dGVyPE5ndENoZWNrZWRFbGVtZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25PcGVuU2VhcmNoTW9kYWw6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBvblNlYXJjaDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgcHVibGljIHNlYXJjaE1vZGFsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBwdWJsaWMgZGF0YSA9IFtdO1xyXG4gICAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBjbGVhbmluZ0ZpbHRlciA9IGZhbHNlO1xyXG4gICAgcHVibGljIGNvbXBvbmVudFJlYWR5ID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgZmlsdGVyc1RyYW5zbGF0ZWQgPSBbXTtcclxuICAgIHB1YmxpYyBlbXB0eVN0YXRlVmlzaWJsZTogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBjb2x1bW5Db3VudCA9IFtdO1xyXG4gICAgcHVibGljIHNlbGVjdGVkRWxlbWVudHM6IEFycmF5PE5ndENoZWNrZWRFbGVtZW50PiA9IFtdO1xyXG5cclxuICAgIHByaXZhdGUgc2VhcmNoaW5nOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBzZWFyY2hUaW1lb3V0OiBhbnk7XHJcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IEFycmF5PFN1YnNjcmlwdGlvbj4gPSBbXTtcclxuICAgIHByaXZhdGUgY3VycmVudFN0YXRlID0ge1xyXG4gICAgICAgIGZpbHRlcnM6IHtcclxuICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnM6IHt9LFxyXG4gICAgICAgICAgICBzaWxlbnRGaWx0ZXJzOiB7fSxcclxuICAgICAgICAgICAgcXVhbGlmaWVkRmlsdGVyczoge30sXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzb3J0OiB7XHJcbiAgICAgICAgICAgIGZpZWxkOiAnJyxcclxuICAgICAgICAgICAgZGlyZWN0aW9uOiAnJ1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgICAgIHByaXZhdGUgbmd0SHR0cFNlcnZpY2U6IE5ndEh0dHBTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgIEBPcHRpb25hbCgpXHJcbiAgICAgICAgcHVibGljIG5ndFRyYW5zbGF0ZVNlcnZpY2U6IE5ndFRyYW5zbGF0ZVNlcnZpY2VcclxuICAgICkgeyB9XHJcblxyXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLnRhYmxlICYmIHRoaXMudGFibGUubmF0aXZlRWxlbWVudCAmJiB0aGlzLnRhYmxlLm5hdGl2ZUVsZW1lbnQucm93c1xyXG4gICAgICAgICAgICAmJiB0aGlzLnRhYmxlLm5hdGl2ZUVsZW1lbnQucm93c1swXSAmJiB0aGlzLnRhYmxlLm5hdGl2ZUVsZW1lbnQucm93c1swXS5jZWxscykge1xyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbkNvdW50ID0gdGhpcy50YWJsZS5uYXRpdmVFbGVtZW50LnJvd3NbMF0uY2VsbHM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pbnB1dFNlYXJjaCkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRTZWFyY2hXaXRoSW5wdXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdENoZWNrYm94RXZlbnQoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoRGVsYXkgPT0gNTAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoRGVsYXkgPSB0aGlzLmluamVjdG9yLmdldCgnTmd0RGF0YXRhYmxlU2VhcmNoRGVsYXknLCA1MDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGVybU1pbkxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVGVybU1pbkxlbmd0aCA9IHRoaXMuaW5qZWN0b3IuZ2V0KCdOZ3REYXRhdGFibGVTZWFyY2hUZXJtTWluTGVuZ3RoJywgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICB0aGlzLmRlc3Ryb3lTdWJzY3JpcHRpb25zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFNlYXJjaE1vZGFsVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHtcclxuICAgICAgICB0aGlzLnNlYXJjaE1vZGFsVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3BlblNlYXJjaE1vZGFsKHJlZmVyZW5jZT86IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuc2VhcmNoTW9kYWwub3BlbigpO1xyXG4gICAgICAgIHRoaXMub25PcGVuU2VhcmNoTW9kYWwuZW1pdChyZWZlcmVuY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbGVhclNlbGVjdGVkRWxlbWVudHMoKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzID0gW107XHJcbiAgICAgICAgdGhpcy5vbkNsZWFyU2VsZWN0ZWRFbGVtZW50cy5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEN1cnJlbnRTdGF0ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWFkeSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHNlYXJjaChcclxuICAgICAgICBmaWx0ZXJzOiBPYmplY3QsXHJcbiAgICAgICAgc2VhcmNoVHlwZTogTmd0RGF0YXRhYmxlU2VhcmNoVHlwZSA9IE5ndERhdGF0YWJsZVNlYXJjaFR5cGUuREVGQVVMVCxcclxuICAgICAgICBhcHBseURlbGF5T25TZWFyY2g6IGJvb2xlYW4gPSB0cnVlXHJcbiAgICApIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5BcHBseUZpbHRlcnMoZmlsdGVycykpIHtcclxuICAgICAgICAgICAgdGhpcy5vblNlYXJjaC5lbWl0KGZpbHRlcnMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNlYXJjaFR5cGUgPT0gTmd0RGF0YXRhYmxlU2VhcmNoVHlwZS5ERUZBVUxUKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzID0geyAuLi50aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzLCAuLi5maWx0ZXJzIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLnNpbGVudEZpbHRlcnMgPSB7IC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuc2lsZW50RmlsdGVycywgLi4uZmlsdGVycyB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0Rlc2NyaXB0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseSgxLCBhcHBseURlbGF5T25TZWFyY2gpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgc29ydChmaWVsZDogYW55LCBkaXJlY3Rpb246IGFueSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFN0YXRlLnNvcnQgPSB7XHJcbiAgICAgICAgICAgIGZpZWxkOiBmaWVsZCxcclxuICAgICAgICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb25cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5hcHBseSh0aGlzLm5ndFBhZ2luYXRpb24uZ2V0Q3VycmVudFBhZ2UoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHJlZnJlc2goc3RheUluUGFnZTogTmd0RGF0YXRhYmxlUGFyYW0gPSBOZ3REYXRhdGFibGVQYXJhbS5SRVNFVF9QQUdFLCBsb2FkZXI6IE5ndERhdGF0YWJsZVBhcmFtID0gTmd0RGF0YXRhYmxlUGFyYW0uRU5BQkxFX0xPQURFUikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5KFxyXG4gICAgICAgICAgICBzdGF5SW5QYWdlID8gdGhpcy5uZ3RQYWdpbmF0aW9uLmdldEN1cnJlbnRQYWdlKCkgOiAxLFxyXG4gICAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgICAgbG9hZGVyXHJcbiAgICAgICAgKS50aGVuKCgpID0+ICF0aGlzLmRhdGE/Lmxlbmd0aCA/IHRoaXMuYXBwbHkoMSwgZmFsc2UpIDogbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldERhdGEoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q3VycmVudFNvcnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLnNvcnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFBlclBhZ2UocGVyUGFnZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5uZ3RQYWdpbmF0aW9uLm9uUmVnaXN0ZXJzUGVyUGFnZUNoYW5nZShwZXJQYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXBwbHlGaWx0ZXJzRGVzY3JpcHRpb24oKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNsZWFuaW5nRmlsdGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyc1RyYW5zbGF0ZWQgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlZmVyZW5jZSBpbiB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzRGVzY3JpcHRpb25bcmVmZXJlbmNlXSAmJiB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzW3JlZmVyZW5jZV0pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnNUcmFuc2xhdGVkLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnNbcmVmZXJlbmNlXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb246IHRoaXMuZmlsdGVyc0Rlc2NyaXB0aW9uW3JlZmVyZW5jZV1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0RmlsdGVyRGVzY3JpcHRpb24ocmVmZXJlbmNlOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmZpbHRlcnNEZXNjcmlwdGlvbltyZWZlcmVuY2VdID0gZGVzY3JpcHRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlbW92ZUZpbHRlcihyZWZlcmVuY2U/OiBzdHJpbmcsIHJlZnJlc2g6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHJlZmVyZW5jZSAmJiAhdGhpcy5oYXNBcHBsaWVkRmlsdGVyKHJlZmVyZW5jZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jbGVhbmluZ0ZpbHRlciA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICghcmVmZXJlbmNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnMgPSB7fTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzID0ge307XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyc1RyYW5zbGF0ZWQgPSBbXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVyc1tyZWZlcmVuY2VdO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzW3JlZmVyZW5jZV07XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcnNUcmFuc2xhdGVkID0gdGhpcy5maWx0ZXJzVHJhbnNsYXRlZC5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50ICYmIGVsZW1lbnQucmVmZXJlbmNlICE9PSByZWZlcmVuY2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vbkNsZWFyRmlsdGVyLmVtaXQocmVmZXJlbmNlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRTZWFyY2ggJiYgKHJlZmVyZW5jZSA9PT0gJ3Rlcm0nIHx8ICFyZWZlcmVuY2UpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2guY2xlYXJJbnB1dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlZnJlc2gpIHtcclxuICAgICAgICAgICAgdGhpcy5hcHBseSh0aGlzLm5ndFBhZ2luYXRpb24uZ2V0Q3VycmVudFBhZ2UoKSwgZmFsc2UpLnRoZW4oKCkgPT4gdGhpcy5jbGVhbmluZ0ZpbHRlciA9IGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhc0FwcGxpZWRGaWx0ZXIoZmlsdGVyOiBPYmplY3QgfCBOZ3RDdXN0b21GaWx0ZXIgfCBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCByZWZlcmVuY2U6IHN0cmluZyA9IHR5cGVvZiBmaWx0ZXIgPT09ICdzdHJpbmcnID8gZmlsdGVyIDogT2JqZWN0LmtleXMoZmlsdGVyID8/IHt9KVswXTtcclxuICAgICAgICBjb25zdCBhcHBsaWVkRmlsdGVycyA9IHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMucXVhbGlmaWVkRmlsdGVycztcclxuXHJcbiAgICAgICAgcmV0dXJuICEhT2JqZWN0LmtleXMoYXBwbGllZEZpbHRlcnMpLmZpbmQoa2V5ID0+IGtleSA9PSByZWZlcmVuY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYXNBcHBsaWVkRmlsdGVycyhzZWFyY2hUeXBlOiBOZ3REYXRhdGFibGVTZWFyY2hUeXBlID0gTmd0RGF0YXRhYmxlU2VhcmNoVHlwZS5ERUZBVUxUKSB7XHJcbiAgICAgICAgbGV0IGFwcGxpZWRGaWx0ZXJzID0ge307XHJcblxyXG4gICAgICAgIGlmIChzZWFyY2hUeXBlID09IE5ndERhdGF0YWJsZVNlYXJjaFR5cGUuREVGQVVMVCkge1xyXG4gICAgICAgICAgICBhcHBsaWVkRmlsdGVycyA9IHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnM7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzZWFyY2hUeXBlID09IE5ndERhdGF0YWJsZVNlYXJjaFR5cGUuU0lMRU5UKSB7XHJcbiAgICAgICAgICAgIGFwcGxpZWRGaWx0ZXJzID0gdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFwcGxpZWRGaWx0ZXJzID0geyAuLi50aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzLCAuLi50aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLnNpbGVudEZpbHRlcnMgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAhIU9iamVjdC52YWx1ZXMoYXBwbGllZEZpbHRlcnMpPy5maW5kKGZpbHRlciA9PiAhIWZpbHRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICBpZiAoY2hhbmdlcy5pbnB1dFNlYXJjaCkge1xyXG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5pbnB1dFNlYXJjaC5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFNlYXJjaFdpdGhJbnB1dCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2hhbmdlcy50eXBlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IGdldEVudW1Gcm9tU3RyaW5nKGNoYW5nZXMudHlwZS5jdXJyZW50VmFsdWUsIE5ndERhdGF0YWJsZVR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgYXBwbHkocGFnZSA9IDEsIGFwcGx5RGVsYXlPblNlYXJjaDogYm9vbGVhbiA9IHRydWUsIGxvYWRlcjogTmd0RGF0YXRhYmxlUGFyYW0gPSBOZ3REYXRhdGFibGVQYXJhbS5FTkFCTEVfTE9BREVSKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29tcG9uZW50UmVhZHkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWFyY2hUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hUaW1lb3V0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5uZ3RQYWdpbmF0aW9uLmRpc3BsYXlQYWdpbmF0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50cyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gTmd0RGF0YXRhYmxlVHlwZS5SRU1PVEUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbW90ZVJlc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmRWaXNpYmlsaXR5QXR0cmlidXRlcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFwcGx5RGVsYXlPblNlYXJjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZERhdGEocGFnZSkudGhlbigoKSA9PiByZXNvbHZlKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnNlYXJjaERlbGF5KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWREYXRhKHBhZ2UpLnRoZW4oKCkgPT4gcmVzb2x2ZSgpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBwcm9wZXJ0eSBbcmVtb3RlUmVzb3VyY2VdIG5lZWRzIHRvIGJlIHByZXNlbnQgdG8gYmUgYWJsZSB0byBtYWtlIHJlbW90ZSBzZWFyY2gnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT0gTmd0RGF0YXRhYmxlVHlwZS5GSVhFRCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kVmlzaWJpbGl0eUF0dHJpYnV0ZXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvYWREYXRhKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhZ2luYXRpb246IE5ndEh0dHBQYWdpbmF0aW9uID0geyAuLi50aGlzLm5ndFBhZ2luYXRpb24uZ2V0UGFnaW5hdGlvbigpLCAuLi57IHBhZ2U6IHBhZ2UgfSB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5xdWFsaWZpZWRGaWx0ZXJzID0gdGhpcy5nZXRRdWFsaWZpZWRGaWx0ZXJzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlucHV0U2VhcmNoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0U2VhcmNoLmlzRGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgICAgICAgICAgIHRoaXMubmd0SHR0cFNlcnZpY2UuZ2V0KFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3RlUmVzb3VyY2UsIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMucXVhbGlmaWVkRmlsdGVycywgcGFnaW5hdGlvbiwgdGhpcy5jdXJyZW50U3RhdGUuc29ydFxyXG4gICAgICAgICAgICAgICAgKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlOiBOZ3RIdHRwUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jY2Vzc1JlbW90ZVJlc3BvbnNlKHJlc3BvbnNlLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ndFBhZ2luYXRpb24ucHJvY2Nlc3NQYWdpbmF0aW9uKHJlc3BvbnNlLm1ldGEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnB1dFNlYXJjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dFNlYXJjaC5pc0Rpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25EYXRhQ2hhbmdlLmVtaXQodGhpcy5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kVmlzaWJpbGl0eUF0dHJpYnV0ZXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2guaXNEaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFF1YWxpZmllZEZpbHRlcnMoKSB7XHJcbiAgICAgICAgY29uc3QgcXVhbGlmaWVkRmlsdGVycyA9IHt9O1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZEZpbHRlcnMgPSB7IC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnMsIC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuc2lsZW50RmlsdGVycyB9O1xyXG5cclxuICAgICAgICBpZiAocmVxdWVzdGVkRmlsdGVycykge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBpbiByZXF1ZXN0ZWRGaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSByZXF1ZXN0ZWRGaWx0ZXJzW3JlZmVyZW5jZV07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZEZpbHRlcihmaWx0ZXIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlciBpbnN0YW5jZW9mIE5ndEN1c3RvbUZpbHRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLnRhZ0xhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnNEZXNjcmlwdGlvbltyZWZlcmVuY2VdID0gZmlsdGVyLnRhZ0xhYmVsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcnNEZXNjcmlwdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWRGaWx0ZXJzW3JlZmVyZW5jZV0gPSBmaWx0ZXIudGVybTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWRGaWx0ZXJzW3JlZmVyZW5jZV0gPSBmaWx0ZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcXVhbGlmaWVkRmlsdGVycztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJpbmRWaXNpYmlsaXR5QXR0cmlidXRlcygpIHtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBOZ3REYXRhdGFibGVUeXBlLlJFTU9URSAmJiAhdGhpcy5kYXRhLmxlbmd0aCAmJiAhdGhpcy5sb2FkaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1wdHlTdGF0ZVZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09IE5ndERhdGF0YWJsZVR5cGUuRklYRUQpIHtcclxuICAgICAgICAgICAgdGhpcy5lbXB0eVN0YXRlVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1wdHlTdGF0ZVZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcHJvY2Nlc3NSZW1vdGVSZXNwb25zZShyZXNwb25zZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gcmVzcG9uc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0U2VhcmNoV2l0aElucHV0KCkge1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgICAgICB0aGlzLmlucHV0U2VhcmNoLm9uVmFsdWVDaGFuZ2UoKS5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzWyd0ZXJtJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRmlsdGVyKCd0ZXJtJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPCB0aGlzLnNlYXJjaFRlcm1NaW5MZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnNbJ3Rlcm0nXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoKHsgdGVybTogJycgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gdGhpcy5zZWFyY2hUZXJtTWluTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2goeyB0ZXJtOiB2YWx1ZSB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWFyY2hUZXJtT25FbnRlcikge1xyXG4gICAgICAgICAgICB0aGlzLmlucHV0U2VhcmNoLmVsZW1lbnQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09IDEzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXRTZWFyY2gudmFsdWUgJiYgdGhpcy5pbnB1dFNlYXJjaC52YWx1ZS5sZW5ndGggPj0gdGhpcy5zZWFyY2hUZXJtTWluTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHkoMSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdENoZWNrYm94RXZlbnQoKSB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgICAgIHRoaXMub25Ub29nbGVDaGVja2JveC5zdWJzY3JpYmUoKGNoZWNrZWRFbGVtZW50OiBOZ3RDaGVja2VkRWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzID0gdGhpcy5zZWxlY3RlZEVsZW1lbnRzLmZpbHRlcihpdGVtID0+IGl0ZW0uaWQgIT09IGNoZWNrZWRFbGVtZW50LmlkKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZEVsZW1lbnQuY2hlY2tlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50cy5wdXNoKGNoZWNrZWRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0ZWRFbGVtZW50c0NoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRFbGVtZW50cyk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbkFwcGx5RmlsdGVycyhmaWx0ZXJzOiBPYmplY3QpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2VhcmNoaW5nKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIGluIGZpbHRlcnMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWRGaWx0ZXIoZmlsdGVyc1tyZWZlcmVuY2VdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc1ZhbGlkRmlsdGVyKGZpbHRlcjogT2JqZWN0IHwgTmd0Q3VzdG9tRmlsdGVyKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWU6IHN0cmluZyB8IE5ndEN1c3RvbUZpbHRlciA9IE9iamVjdC52YWx1ZXMoZmlsdGVyID8/IHt9KVswXTtcclxuICAgICAgICBjb25zdCBoYXNWYWx1ZTogYm9vbGVhbiA9ICEhKCh2YWx1ZSBpbnN0YW5jZW9mIE5ndEN1c3RvbUZpbHRlciAmJiB2YWx1ZS50ZXJtKSB8fCB2YWx1ZSk7XHJcbiAgICAgICAgY29uc3QgaXNBcHBsaWVkOiBib29sZWFuID0gdGhpcy5oYXNBcHBsaWVkRmlsdGVyKGZpbHRlcik7XHJcblxyXG4gICAgICAgIHJldHVybiBpc0FwcGxpZWQgfHwgKCFpc0FwcGxpZWQgJiYgaGFzVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGVzdHJveVN1YnNjcmlwdGlvbnMoKSB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goc3Vic2NyaXB0aW9uID0+IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBbXTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGVudW0gTmd0RGF0YXRhYmxlVHlwZSB7XHJcbiAgICBSRU1PVEUgPSAnUkVNT1RFJyxcclxuICAgIEZJWEVEID0gJ0ZJWEVEJ1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBOZ3REYXRhdGFibGVTZWFyY2hUeXBlIHtcclxuICAgIERFRkFVTFQgPSAnREVGQVVMVCcsXHJcbiAgICBTSUxFTlQgPSAnU0lMRU5UJyxcclxufVxyXG5cclxuZXhwb3J0IGVudW0gTmd0RGF0YXRhYmxlUGFyYW0ge1xyXG4gICAgU1RBWV9JTl9QQUdFID0gMSxcclxuICAgIFJFU0VUX1BBR0UgPSAwLFxyXG4gICAgRU5BQkxFX0xPQURFUiA9IDEsXHJcbiAgICBESVNBQkxFX0xPQURFUiA9IDBcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE5ndENoZWNrZWRFbGVtZW50IHtcclxuICAgIHB1YmxpYyBpZDogc3RyaW5nO1xyXG4gICAgcHVibGljIGNoZWNrZWQ6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgcmVmZXJlbmNlOiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOZ3RDdXN0b21GaWx0ZXIge1xyXG4gICAgcHVibGljIHRlcm06IHN0cmluZztcclxuICAgIHB1YmxpYyB0YWdWYWx1ZTogc3RyaW5nO1xyXG4gICAgcHVibGljIHRhZ0xhYmVsPzogc3RyaW5nO1xyXG59XHJcbiJdfQ==
1
+ import { __awaiter } from "tslib";
2
+ import { ChangeDetectorRef, Component, EventEmitter, Injector, Input, Optional, Output, ViewChild, } from '@angular/core';
3
+ import { getEnumFromString } from '../../helpers/enum/enum';
4
+ import { NgtHttpService } from '../../services/http/ngt-http.service';
5
+ import { NgtTranslateService } from '../../services/http/ngt-translate.service';
6
+ export class NgtDatatableComponent {
7
+ constructor(injector, ngtHttpService, changeDetector, ngtTranslateService) {
8
+ this.injector = injector;
9
+ this.ngtHttpService = ngtHttpService;
10
+ this.changeDetector = changeDetector;
11
+ this.ngtTranslateService = ngtTranslateService;
12
+ this.type = NgtDatatableType.REMOTE;
13
+ this.filterTagBgColor = 'bg-blue-500';
14
+ this.filterTagMargin = 'mb-4';
15
+ this.paginationMargin = 'mt-2 md:mt-8';
16
+ this.searchDelay = 500;
17
+ this.searchTermMinLength = 1;
18
+ this.searchTermOnEnter = true;
19
+ this.defaultFilters = {};
20
+ this.filtersDescription = {};
21
+ this.onDataChange = new EventEmitter();
22
+ this.onClearFilter = new EventEmitter();
23
+ this.onClearSelectedElements = new EventEmitter();
24
+ this.onSelectedElementsChange = new EventEmitter();
25
+ this.onToogleAllCheckboxes = new EventEmitter();
26
+ this.onToogleCheckbox = new EventEmitter();
27
+ this.onOpenSearchModal = new EventEmitter();
28
+ this.onSearch = new EventEmitter();
29
+ this.data = [];
30
+ this.loading = false;
31
+ this.cleaningFilter = false;
32
+ this.componentReady = false;
33
+ this.filtersTranslated = [];
34
+ this.columnCount = [];
35
+ this.selectedElements = [];
36
+ this.subscriptions = [];
37
+ this.currentState = {
38
+ filters: {
39
+ defaultFilters: {},
40
+ silentFilters: {},
41
+ qualifiedFilters: {},
42
+ },
43
+ sort: {
44
+ field: '',
45
+ direction: ''
46
+ }
47
+ };
48
+ }
49
+ ngOnInit() {
50
+ if (this.table && this.table.nativeElement && this.table.nativeElement.rows
51
+ && this.table.nativeElement.rows[0] && this.table.nativeElement.rows[0].cells) {
52
+ this.columnCount = this.table.nativeElement.rows[0].cells;
53
+ }
54
+ if (this.inputSearch) {
55
+ this.initSearchWithInput();
56
+ }
57
+ this.initCheckboxEvent();
58
+ if (this.searchDelay == 500) {
59
+ this.searchDelay = this.injector.get('NgtDatatableSearchDelay', 500);
60
+ }
61
+ if (this.searchTermMinLength == 1) {
62
+ this.searchTermMinLength = this.injector.get('NgtDatatableSearchTermMinLength', 1);
63
+ }
64
+ }
65
+ ngOnDestroy() {
66
+ this.destroySubscriptions();
67
+ }
68
+ setSearchModalTemplate(template) {
69
+ this.searchModalTemplate = template;
70
+ }
71
+ openSearchModal(reference) {
72
+ this.searchModal.open();
73
+ this.onOpenSearchModal.emit(reference);
74
+ }
75
+ clearSelectedElements() {
76
+ this.selectedElements = [];
77
+ this.onClearSelectedElements.emit();
78
+ }
79
+ getCurrentState() {
80
+ return this.currentState;
81
+ }
82
+ init() {
83
+ this.componentReady = true;
84
+ }
85
+ search(filters, searchType = NgtDatatableSearchType.DEFAULT, applyDelayOnSearch = true) {
86
+ return __awaiter(this, void 0, void 0, function* () {
87
+ if (this.canApplyFilters(filters)) {
88
+ this.onSearch.emit(filters);
89
+ if (searchType == NgtDatatableSearchType.DEFAULT) {
90
+ this.currentState.filters.defaultFilters = Object.assign(Object.assign({}, this.currentState.filters.defaultFilters), filters);
91
+ }
92
+ else {
93
+ this.currentState.filters.silentFilters = Object.assign(Object.assign({}, this.currentState.filters.silentFilters), filters);
94
+ }
95
+ this.applyFiltersDescription();
96
+ return this.apply(1, applyDelayOnSearch);
97
+ }
98
+ });
99
+ }
100
+ sort(field, direction) {
101
+ return __awaiter(this, void 0, void 0, function* () {
102
+ this.currentState.sort = {
103
+ field: field,
104
+ direction: direction
105
+ };
106
+ return this.apply(this.ngtPagination.getCurrentPage());
107
+ });
108
+ }
109
+ refresh(stayInPage = NgtDatatableParam.RESET_PAGE, loader = NgtDatatableParam.ENABLE_LOADER) {
110
+ return __awaiter(this, void 0, void 0, function* () {
111
+ return this.apply(stayInPage ? this.ngtPagination.getCurrentPage() : 1, false, loader).then(() => { var _a; return !((_a = this.data) === null || _a === void 0 ? void 0 : _a.length) ? this.apply(1, false) : null; });
112
+ });
113
+ }
114
+ getData() {
115
+ return this.data;
116
+ }
117
+ getCurrentSort() {
118
+ return this.currentState.sort;
119
+ }
120
+ setPerPage(perPage) {
121
+ this.ngtPagination.onRegistersPerPageChange(perPage);
122
+ }
123
+ applyFiltersDescription() {
124
+ if (!this.cleaningFilter) {
125
+ this.filtersTranslated = [];
126
+ for (let reference in this.currentState.filters.defaultFilters) {
127
+ if (this.filtersDescription[reference] && this.currentState.filters.defaultFilters[reference]) {
128
+ this.filtersTranslated.push({
129
+ reference: reference,
130
+ value: this.currentState.filters.defaultFilters[reference],
131
+ translation: this.filtersDescription[reference]
132
+ });
133
+ }
134
+ }
135
+ }
136
+ }
137
+ setFilterDescription(reference, description) {
138
+ this.filtersDescription[reference] = description;
139
+ }
140
+ removeFilter(reference, refresh = true) {
141
+ if (reference && !this.hasAppliedFilter(reference)) {
142
+ return;
143
+ }
144
+ this.cleaningFilter = true;
145
+ if (!reference) {
146
+ this.currentState.filters.defaultFilters = {};
147
+ this.currentState.filters.silentFilters = {};
148
+ this.filtersTranslated = [];
149
+ }
150
+ else {
151
+ delete this.currentState.filters.defaultFilters[reference];
152
+ delete this.currentState.filters.silentFilters[reference];
153
+ this.filtersTranslated = this.filtersTranslated.filter(element => element && element.reference !== reference);
154
+ }
155
+ this.onClearFilter.emit(reference);
156
+ if (this.inputSearch && (reference === 'term' || !reference)) {
157
+ this.inputSearch.clearInput();
158
+ }
159
+ if (refresh) {
160
+ this.apply(this.ngtPagination.getCurrentPage(), false).then(() => this.cleaningFilter = false);
161
+ }
162
+ }
163
+ hasAppliedFilter(filter) {
164
+ const reference = typeof filter === 'string' ? filter : Object.keys(filter !== null && filter !== void 0 ? filter : {})[0];
165
+ const appliedFilters = this.currentState.filters.qualifiedFilters;
166
+ return !!Object.keys(appliedFilters).find(key => key == reference);
167
+ }
168
+ hasAppliedFilters(searchType = NgtDatatableSearchType.DEFAULT) {
169
+ var _a;
170
+ let appliedFilters = {};
171
+ if (searchType == NgtDatatableSearchType.DEFAULT) {
172
+ appliedFilters = this.currentState.filters.defaultFilters;
173
+ }
174
+ else if (searchType == NgtDatatableSearchType.SILENT) {
175
+ appliedFilters = this.currentState.filters.silentFilters;
176
+ }
177
+ else {
178
+ appliedFilters = Object.assign(Object.assign({}, this.currentState.filters.defaultFilters), this.currentState.filters.silentFilters);
179
+ }
180
+ return !!((_a = Object.values(appliedFilters)) === null || _a === void 0 ? void 0 : _a.find(filter => !!filter));
181
+ }
182
+ ngOnChanges(changes) {
183
+ if (changes.inputSearch) {
184
+ if (changes.inputSearch.currentValue) {
185
+ this.initSearchWithInput();
186
+ }
187
+ }
188
+ if (changes.type) {
189
+ this.type = getEnumFromString(changes.type.currentValue, NgtDatatableType);
190
+ }
191
+ }
192
+ apply(page = 1, applyDelayOnSearch = true, loader = NgtDatatableParam.ENABLE_LOADER) {
193
+ return __awaiter(this, void 0, void 0, function* () {
194
+ return new Promise(resolve => {
195
+ if (!this.componentReady) {
196
+ return resolve();
197
+ }
198
+ else if (this.searchTimeout) {
199
+ clearTimeout(this.searchTimeout);
200
+ }
201
+ this.ngtPagination.displayPagination = false;
202
+ this.selectedElements = [];
203
+ if (this.type === NgtDatatableType.REMOTE) {
204
+ if (this.remoteResource) {
205
+ if (loader) {
206
+ this.loading = true;
207
+ this.bindVisibilityAttributes();
208
+ }
209
+ if (applyDelayOnSearch) {
210
+ this.searchTimeout = setTimeout(() => {
211
+ this.loadData(page).then(() => resolve());
212
+ }, this.searchDelay);
213
+ }
214
+ else {
215
+ this.loadData(page).then(() => resolve());
216
+ }
217
+ }
218
+ else {
219
+ console.error('The property [remoteResource] needs to be present to be able to make remote search');
220
+ }
221
+ }
222
+ else if (this.type == NgtDatatableType.FIXED) {
223
+ this.bindVisibilityAttributes();
224
+ resolve();
225
+ }
226
+ });
227
+ });
228
+ }
229
+ loadData(page) {
230
+ return new Promise((resolve, reject) => {
231
+ const pagination = Object.assign(Object.assign({}, this.ngtPagination.getPagination()), { page: page });
232
+ this.currentState.filters.qualifiedFilters = this.getQualifiedFilters();
233
+ this.searching = true;
234
+ if (this.inputSearch) {
235
+ this.inputSearch.isDisabled = true;
236
+ }
237
+ this.subscriptions.push(this.ngtHttpService.get(this.remoteResource, this.currentState.filters.qualifiedFilters, pagination, this.currentState.sort).subscribe((response) => {
238
+ this.proccessRemoteResponse(response.data);
239
+ this.ngtPagination.proccessPagination(response.meta);
240
+ this.searching = false;
241
+ this.loading = false;
242
+ if (this.inputSearch) {
243
+ this.inputSearch.isDisabled = false;
244
+ }
245
+ this.onDataChange.emit(this.data);
246
+ this.bindVisibilityAttributes();
247
+ resolve();
248
+ }, (error) => {
249
+ console.error(error);
250
+ this.loading = false;
251
+ this.inputSearch.isDisabled = false;
252
+ this.changeDetector.detectChanges();
253
+ reject();
254
+ }));
255
+ });
256
+ }
257
+ getQualifiedFilters() {
258
+ const qualifiedFilters = {};
259
+ const requestedFilters = Object.assign(Object.assign({}, this.currentState.filters.defaultFilters), this.currentState.filters.silentFilters);
260
+ if (requestedFilters) {
261
+ for (const reference in requestedFilters) {
262
+ const filter = requestedFilters[reference];
263
+ if (this.isValidFilter(filter)) {
264
+ if (filter instanceof NgtCustomFilter) {
265
+ if (filter.tagLabel) {
266
+ this.filtersDescription[reference] = filter.tagLabel;
267
+ this.applyFiltersDescription();
268
+ }
269
+ qualifiedFilters[reference] = filter.term;
270
+ }
271
+ else {
272
+ qualifiedFilters[reference] = filter;
273
+ }
274
+ }
275
+ }
276
+ }
277
+ return qualifiedFilters;
278
+ }
279
+ bindVisibilityAttributes() {
280
+ this.changeDetector.detectChanges();
281
+ if (this.type == NgtDatatableType.REMOTE && !this.data.length && !this.loading) {
282
+ this.emptyStateVisible = true;
283
+ }
284
+ else if (this.type == NgtDatatableType.FIXED) {
285
+ this.emptyStateVisible = false;
286
+ }
287
+ else {
288
+ this.emptyStateVisible = false;
289
+ }
290
+ this.changeDetector.detectChanges();
291
+ }
292
+ proccessRemoteResponse(response) {
293
+ this.data = response;
294
+ }
295
+ initSearchWithInput() {
296
+ this.subscriptions.push(this.inputSearch.onValueChange().subscribe((value) => {
297
+ if (this.currentState.filters.defaultFilters['term']) {
298
+ if (!value) {
299
+ this.removeFilter('term');
300
+ }
301
+ else if (value.length < this.searchTermMinLength) {
302
+ delete this.currentState.filters.defaultFilters['term'];
303
+ this.search({ term: '' });
304
+ }
305
+ }
306
+ if (value.length >= this.searchTermMinLength) {
307
+ this.search({ term: value });
308
+ }
309
+ }));
310
+ if (this.searchTermOnEnter) {
311
+ this.inputSearch.element.nativeElement.addEventListener('keydown', (event) => {
312
+ event.stopImmediatePropagation();
313
+ if (event.keyCode == 13) {
314
+ if (this.inputSearch.value && this.inputSearch.value.length >= this.searchTermMinLength) {
315
+ this.apply(1, false);
316
+ }
317
+ }
318
+ });
319
+ }
320
+ }
321
+ initCheckboxEvent() {
322
+ this.subscriptions.push(this.onToogleCheckbox.subscribe((checkedElement) => {
323
+ this.selectedElements = this.selectedElements.filter(item => item.id !== checkedElement.id);
324
+ if (checkedElement.checked) {
325
+ this.selectedElements.push(checkedElement);
326
+ }
327
+ this.onSelectedElementsChange.emit(this.selectedElements);
328
+ }));
329
+ }
330
+ canApplyFilters(filters) {
331
+ if (!this.searching) {
332
+ for (const reference in filters) {
333
+ if (this.isValidFilter(filters[reference])) {
334
+ return true;
335
+ }
336
+ }
337
+ }
338
+ return false;
339
+ }
340
+ isValidFilter(filter) {
341
+ const value = Object.values(filter !== null && filter !== void 0 ? filter : {})[0];
342
+ const hasValue = !!((value instanceof NgtCustomFilter && value.term) || value);
343
+ const isApplied = this.hasAppliedFilter(filter);
344
+ return isApplied || (!isApplied && hasValue);
345
+ }
346
+ destroySubscriptions() {
347
+ this.subscriptions.forEach(subscription => subscription.unsubscribe());
348
+ this.subscriptions = [];
349
+ }
350
+ }
351
+ NgtDatatableComponent.decorators = [
352
+ { type: Component, args: [{
353
+ selector: 'ngt-datatable',
354
+ template: "<div class=\"w-full\">\n <div class=\"flex flex-wrap w-full\">\n <ngt-tag *ngIf=\"hasAppliedFilters()\" class=\"w-full sm:w-auto {{ filterTagMargin }}\"\n [class.sm:mr-4]=\"filterTagMargin == 'mb-4'\" color.bg=\"bg-red-500\" (click)=\"removeFilter()\" ngt-stylizable>\n Limpar Filtros\n </ngt-tag>\n\n <ng-container *ngIf=\"hasAppliedFilters()\">\n <ng-container *ngFor=\"let filter of filtersTranslated\">\n <ngt-tag class=\"w-full sm:w-auto {{ filterTagMargin }}\" [class.sm:mr-4]=\"filterTagMargin == 'mb-4'\"\n [color.bg]=\"filterTagBgColor\" (click)=\"removeFilter(filter.reference)\" ngt-stylizable>\n {{ filter.translation + ': ' + (filter?.value?.tagValue ? filter.value.tagValue : filter.value)}}\n </ngt-tag>\n </ng-container>\n </ng-container>\n </div>\n\n <table style=\"display: table;\" class=\"text-left w-full border-collapse table-responsive\" #table>\n <ng-content></ng-content>\n </table>\n\n <p *ngIf=\"emptyStateVisible\" class=\"mt-8 mx-auto self-center text-center text-xl\">\n {{ ngtTranslateService.ngtDatatableNoDataFound }}\n </p>\n\n <div *ngIf=\"loading\">\n <div *ngFor=\"let i of [1, 2, 3, 4]\" class=\"flex w-full mt-3\">\n <ng-container *ngIf=\"columnCount.length >= 2\">\n <ng-container *ngFor=\"let j of columnCount; let last = last\">\n <ng-container *ngIf=\"last\">\n <ngt-shining class=\"h-10 w-full\"></ngt-shining>\n </ng-container>\n\n <ng-container *ngIf=\"!last\">\n <ngt-shining class=\"h-10 w-full mr-10\"></ngt-shining>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"columnCount.length < 2\">\n <ngt-shining class=\"h-10 w-full\"></ngt-shining>\n <ngt-shining class=\"h-10 w-full mr-10 ml-10\"></ngt-shining>\n <ngt-shining class=\"h-10 w-full\"></ngt-shining>\n </ng-container>\n </div>\n </div>\n</div>\n\n<div class=\"clearfix {{ paginationMargin }}\" [hidden]='!data || data.length == 0'>\n <ngt-pagination [pagesInterval]='4' (onPageChange)='apply($event, false)' (onPerPageChange)='apply(1, false)'\n #ngtPagination>\n </ngt-pagination>\n</div>\n\n<ngt-modal #searchModal [customLayout]='true'>\n <ng-container *ngTemplateOutlet=\"searchModalTemplate\"></ng-container>\n</ngt-modal>",
355
+ styles: ["@media (max-width: 767px){.table-responsive{display:block;position:relative;width:100%}.table-responsive thead,.table-responsive tbody,.table-responsive th,.table-responsive td,.table-responsive tr{display:block}.table-responsive td,.table-responsive th{height:50px}.table-responsive thead{float:left;margin-bottom:15px}.table-responsive tbody{width:auto;position:relative;overflow-x:auto;-webkit-overflow-scrolling:touch;white-space:nowrap}.table-responsive tbody tr{display:inline-block;min-width:100%}}\n"]
356
+ },] }
357
+ ];
358
+ NgtDatatableComponent.ctorParameters = () => [
359
+ { type: Injector },
360
+ { type: NgtHttpService },
361
+ { type: ChangeDetectorRef },
362
+ { type: NgtTranslateService, decorators: [{ type: Optional }] }
363
+ ];
364
+ NgtDatatableComponent.propDecorators = {
365
+ table: [{ type: ViewChild, args: ['table', { static: true },] }],
366
+ ngtPagination: [{ type: ViewChild, args: ['ngtPagination', { static: true },] }],
367
+ searchModal: [{ type: ViewChild, args: ['searchModal', { static: true },] }],
368
+ remoteResource: [{ type: Input }],
369
+ type: [{ type: Input }],
370
+ filterTagBgColor: [{ type: Input }],
371
+ filterTagMargin: [{ type: Input }],
372
+ paginationMargin: [{ type: Input }],
373
+ inputSearch: [{ type: Input }],
374
+ searchDelay: [{ type: Input }],
375
+ searchTermMinLength: [{ type: Input }],
376
+ searchTermOnEnter: [{ type: Input }],
377
+ defaultFilters: [{ type: Input }],
378
+ filtersDescription: [{ type: Input }],
379
+ onDataChange: [{ type: Output }],
380
+ onClearFilter: [{ type: Output }],
381
+ onClearSelectedElements: [{ type: Output }],
382
+ onSelectedElementsChange: [{ type: Output }],
383
+ onToogleAllCheckboxes: [{ type: Output }],
384
+ onToogleCheckbox: [{ type: Output }],
385
+ onOpenSearchModal: [{ type: Output }],
386
+ onSearch: [{ type: Output }]
387
+ };
388
+ export var NgtDatatableType;
389
+ (function (NgtDatatableType) {
390
+ NgtDatatableType["REMOTE"] = "REMOTE";
391
+ NgtDatatableType["FIXED"] = "FIXED";
392
+ })(NgtDatatableType || (NgtDatatableType = {}));
393
+ export var NgtDatatableSearchType;
394
+ (function (NgtDatatableSearchType) {
395
+ NgtDatatableSearchType["DEFAULT"] = "DEFAULT";
396
+ NgtDatatableSearchType["SILENT"] = "SILENT";
397
+ })(NgtDatatableSearchType || (NgtDatatableSearchType = {}));
398
+ export var NgtDatatableParam;
399
+ (function (NgtDatatableParam) {
400
+ NgtDatatableParam[NgtDatatableParam["STAY_IN_PAGE"] = 1] = "STAY_IN_PAGE";
401
+ NgtDatatableParam[NgtDatatableParam["RESET_PAGE"] = 0] = "RESET_PAGE";
402
+ NgtDatatableParam[NgtDatatableParam["ENABLE_LOADER"] = 1] = "ENABLE_LOADER";
403
+ NgtDatatableParam[NgtDatatableParam["DISABLE_LOADER"] = 0] = "DISABLE_LOADER";
404
+ })(NgtDatatableParam || (NgtDatatableParam = {}));
405
+ export class NgtCheckedElement {
406
+ }
407
+ export class NgtCustomFilter {
408
+ }
409
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LWRhdGF0YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy10YWlsd2luZC9zcmMvY29tcG9uZW50cy9uZ3QtZGF0YXRhYmxlL25ndC1kYXRhdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUdOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQXNDLGNBQWMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzFHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBVWhGLE1BQU0sT0FBTyxxQkFBcUI7SUFtRDlCLFlBQ1ksUUFBa0IsRUFDbEIsY0FBOEIsRUFDOUIsY0FBaUMsRUFFbEMsbUJBQXdDO1FBSnZDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUVsQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBbERuQyxTQUFJLEdBQXFCLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztRQUNqRCxxQkFBZ0IsR0FBVyxhQUFhLENBQUM7UUFDekMsb0JBQWUsR0FBVyxNQUFNLENBQUM7UUFDakMscUJBQWdCLEdBQVcsY0FBYyxDQUFDO1FBRTFDLGdCQUFXLEdBQVcsR0FBRyxDQUFDO1FBQzFCLHdCQUFtQixHQUFXLENBQUMsQ0FBQztRQUNoQyxzQkFBaUIsR0FBWSxJQUFJLENBQUM7UUFDbEMsbUJBQWMsR0FBUSxFQUFFLENBQUM7UUFDekIsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBRXZC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QUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFOzZCQUV6QyxLQUFLO21CQUNMLEtBQUs7K0JBQ0wsS0FBSzs4QkFDTCxLQUFLOytCQUNMLEtBQUs7MEJBQ0wsS0FBSzswQkFDTCxLQUFLO2tDQUNMLEtBQUs7Z0NBQ0wsS0FBSzs2QkFDTCxLQUFLO2lDQUNMLEtBQUs7MkJBRUwsTUFBTTs0QkFDTixNQUFNO3NDQUNOLE1BQU07dUNBQ04sTUFBTTtvQ0FDTixNQUFNOytCQUNOLE1BQU07Z0NBQ04sTUFBTTt1QkFDTixNQUFNOztBQXlaWCxNQUFNLENBQU4sSUFBWSxnQkFHWDtBQUhELFdBQVksZ0JBQWdCO0lBQ3hCLHFDQUFpQixDQUFBO0lBQ2pCLG1DQUFlLENBQUE7QUFDbkIsQ0FBQyxFQUhXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFHM0I7QUFFRCxNQUFNLENBQU4sSUFBWSxzQkFHWDtBQUhELFdBQVksc0JBQXNCO0lBQzlCLDZDQUFtQixDQUFBO0lBQ25CLDJDQUFpQixDQUFBO0FBQ3JCLENBQUMsRUFIVyxzQkFBc0IsS0FBdEIsc0JBQXNCLFFBR2pDO0FBRUQsTUFBTSxDQUFOLElBQVksaUJBS1g7QUFMRCxXQUFZLGlCQUFpQjtJQUN6Qix5RUFBZ0IsQ0FBQTtJQUNoQixxRUFBYyxDQUFBO0lBQ2QsMkVBQWlCLENBQUE7SUFDakIsNkVBQWtCLENBQUE7QUFDdEIsQ0FBQyxFQUxXLGlCQUFpQixLQUFqQixpQkFBaUIsUUFLNUI7QUFFRCxNQUFNLE9BQU8saUJBQWlCO0NBSTdCO0FBRUQsTUFBTSxPQUFPLGVBQWU7Q0FJM0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbmplY3RvcixcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgZ2V0RW51bUZyb21TdHJpbmcgfSBmcm9tICcuLi8uLi9oZWxwZXJzL2VudW0vZW51bSc7XG5pbXBvcnQgeyBOZ3RIdHRwUGFnaW5hdGlvbiwgTmd0SHR0cFJlc3BvbnNlLCBOZ3RIdHRwU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2h0dHAvbmd0LWh0dHAuc2VydmljZSc7XG5pbXBvcnQgeyBOZ3RUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaHR0cC9uZ3QtdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd0SW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi9uZ3QtaW5wdXQvbmd0LWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ3RNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL25ndC1tb2RhbC9uZ3QtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IE5ndFBhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi9uZ3QtcGFnaW5hdGlvbi9uZ3QtcGFnaW5hdGlvbi5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25ndC1kYXRhdGFibGUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9uZ3QtZGF0YXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9uZ3QtZGF0YXRhYmxlLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3REYXRhdGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgQFZpZXdDaGlsZCgndGFibGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgdGFibGU6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnbmd0UGFnaW5hdGlvbicsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBuZ3RQYWdpbmF0aW9uOiBOZ3RQYWdpbmF0aW9uQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaE1vZGFsJywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIHNlYXJjaE1vZGFsOiBOZ3RNb2RhbENvbXBvbmVudDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyByZW1vdGVSZXNvdXJjZTogYW55O1xuICAgIEBJbnB1dCgpIHB1YmxpYyB0eXBlOiBOZ3REYXRhdGFibGVUeXBlID0gTmd0RGF0YXRhYmxlVHlwZS5SRU1PVEU7XG4gICAgQElucHV0KCkgcHVibGljIGZpbHRlclRhZ0JnQ29sb3I6IHN0cmluZyA9ICdiZy1ibHVlLTUwMCc7XG4gICAgQElucHV0KCkgcHVibGljIGZpbHRlclRhZ01hcmdpbjogc3RyaW5nID0gJ21iLTQnO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwYWdpbmF0aW9uTWFyZ2luOiBzdHJpbmcgPSAnbXQtMiBtZDptdC04JztcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5wdXRTZWFyY2g6IE5ndElucHV0Q29tcG9uZW50O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWFyY2hEZWxheTogbnVtYmVyID0gNTAwO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWFyY2hUZXJtTWluTGVuZ3RoOiBudW1iZXIgPSAxO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWFyY2hUZXJtT25FbnRlcjogYm9vbGVhbiA9IHRydWU7XG4gICAgQElucHV0KCkgcHVibGljIGRlZmF1bHRGaWx0ZXJzOiBhbnkgPSB7fTtcbiAgICBASW5wdXQoKSBwdWJsaWMgZmlsdGVyc0Rlc2NyaXB0aW9uID0ge307XG5cbiAgICBAT3V0cHV0KCkgcHVibGljIG9uRGF0YUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkNsZWFyRmlsdGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uQ2xlYXJTZWxlY3RlZEVsZW1lbnRzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uU2VsZWN0ZWRFbGVtZW50c0NoYW5nZTogRXZlbnRFbWl0dGVyPEFycmF5PE5ndENoZWNrZWRFbGVtZW50Pj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvblRvb2dsZUFsbENoZWNrYm94ZXM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25Ub29nbGVDaGVja2JveDogRXZlbnRFbWl0dGVyPE5ndENoZWNrZWRFbGVtZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uT3BlblNlYXJjaE1vZGFsOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uU2VhcmNoOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIHB1YmxpYyBzZWFyY2hNb2RhbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIHB1YmxpYyBkYXRhID0gW107XG4gICAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcbiAgICBwdWJsaWMgY2xlYW5pbmdGaWx0ZXIgPSBmYWxzZTtcbiAgICBwdWJsaWMgY29tcG9uZW50UmVhZHkgPSBmYWxzZTtcbiAgICBwdWJsaWMgZmlsdGVyc1RyYW5zbGF0ZWQgPSBbXTtcbiAgICBwdWJsaWMgZW1wdHlTdGF0ZVZpc2libGU6IGJvb2xlYW47XG4gICAgcHVibGljIGNvbHVtbkNvdW50ID0gW107XG4gICAgcHVibGljIHNlbGVjdGVkRWxlbWVudHM6IEFycmF5PE5ndENoZWNrZWRFbGVtZW50PiA9IFtdO1xuXG4gICAgcHJpdmF0ZSBzZWFyY2hpbmc6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBzZWFyY2hUaW1lb3V0OiBhbnk7XG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBBcnJheTxTdWJzY3JpcHRpb24+ID0gW107XG4gICAgcHJpdmF0ZSBjdXJyZW50U3RhdGUgPSB7XG4gICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzOiB7fSxcbiAgICAgICAgICAgIHNpbGVudEZpbHRlcnM6IHt9LFxuICAgICAgICAgICAgcXVhbGlmaWVkRmlsdGVyczoge30sXG4gICAgICAgIH0sXG4gICAgICAgIHNvcnQ6IHtcbiAgICAgICAgICAgIGZpZWxkOiAnJyxcbiAgICAgICAgICAgIGRpcmVjdGlvbjogJydcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIG5ndEh0dHBTZXJ2aWNlOiBOZ3RIdHRwU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIEBPcHRpb25hbCgpXG4gICAgICAgIHB1YmxpYyBuZ3RUcmFuc2xhdGVTZXJ2aWNlOiBOZ3RUcmFuc2xhdGVTZXJ2aWNlXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGFibGUgJiYgdGhpcy50YWJsZS5uYXRpdmVFbGVtZW50ICYmIHRoaXMudGFibGUubmF0aXZlRWxlbWVudC5yb3dzXG4gICAgICAgICAgICAmJiB0aGlzLnRhYmxlLm5hdGl2ZUVsZW1lbnQucm93c1swXSAmJiB0aGlzLnRhYmxlLm5hdGl2ZUVsZW1lbnQucm93c1swXS5jZWxscykge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5Db3VudCA9IHRoaXMudGFibGUubmF0aXZlRWxlbWVudC5yb3dzWzBdLmNlbGxzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5wdXRTZWFyY2gpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdFNlYXJjaFdpdGhJbnB1dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0Q2hlY2tib3hFdmVudCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaERlbGF5ID09IDUwMCkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hEZWxheSA9IHRoaXMuaW5qZWN0b3IuZ2V0KCdOZ3REYXRhdGFibGVTZWFyY2hEZWxheScsIDUwMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWFyY2hUZXJtTWluTGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVGVybU1pbkxlbmd0aCA9IHRoaXMuaW5qZWN0b3IuZ2V0KCdOZ3REYXRhdGFibGVTZWFyY2hUZXJtTWluTGVuZ3RoJywgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveVN1YnNjcmlwdGlvbnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0U2VhcmNoTW9kYWxUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55Pikge1xuICAgICAgICB0aGlzLnNlYXJjaE1vZGFsVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3BlblNlYXJjaE1vZGFsKHJlZmVyZW5jZT86IHN0cmluZykge1xuICAgICAgICB0aGlzLnNlYXJjaE1vZGFsLm9wZW4oKTtcbiAgICAgICAgdGhpcy5vbk9wZW5TZWFyY2hNb2RhbC5lbWl0KHJlZmVyZW5jZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyU2VsZWN0ZWRFbGVtZW50cygpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzID0gW107XG4gICAgICAgIHRoaXMub25DbGVhclNlbGVjdGVkRWxlbWVudHMuZW1pdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDdXJyZW50U3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdCgpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWFkeSA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlYXJjaChcbiAgICAgICAgZmlsdGVyczogT2JqZWN0LFxuICAgICAgICBzZWFyY2hUeXBlOiBOZ3REYXRhdGFibGVTZWFyY2hUeXBlID0gTmd0RGF0YXRhYmxlU2VhcmNoVHlwZS5ERUZBVUxULFxuICAgICAgICBhcHBseURlbGF5T25TZWFyY2g6IGJvb2xlYW4gPSB0cnVlXG4gICAgKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbkFwcGx5RmlsdGVycyhmaWx0ZXJzKSkge1xuICAgICAgICAgICAgdGhpcy5vblNlYXJjaC5lbWl0KGZpbHRlcnMpO1xuXG4gICAgICAgICAgICBpZiAoc2VhcmNoVHlwZSA9PSBOZ3REYXRhdGFibGVTZWFyY2hUeXBlLkRFRkFVTFQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzID0geyAuLi50aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzLCAuLi5maWx0ZXJzIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuc2lsZW50RmlsdGVycyA9IHsgLi4udGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzLCAuLi5maWx0ZXJzIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzRGVzY3JpcHRpb24oKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHkoMSwgYXBwbHlEZWxheU9uU2VhcmNoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzb3J0KGZpZWxkOiBhbnksIGRpcmVjdGlvbjogYW55KSB7XG4gICAgICAgIHRoaXMuY3VycmVudFN0YXRlLnNvcnQgPSB7XG4gICAgICAgICAgICBmaWVsZDogZmllbGQsXG4gICAgICAgICAgICBkaXJlY3Rpb246IGRpcmVjdGlvblxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5KHRoaXMubmd0UGFnaW5hdGlvbi5nZXRDdXJyZW50UGFnZSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVmcmVzaChzdGF5SW5QYWdlOiBOZ3REYXRhdGFibGVQYXJhbSA9IE5ndERhdGF0YWJsZVBhcmFtLlJFU0VUX1BBR0UsIGxvYWRlcjogTmd0RGF0YXRhYmxlUGFyYW0gPSBOZ3REYXRhdGFibGVQYXJhbS5FTkFCTEVfTE9BREVSKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5KFxuICAgICAgICAgICAgc3RheUluUGFnZSA/IHRoaXMubmd0UGFnaW5hdGlvbi5nZXRDdXJyZW50UGFnZSgpIDogMSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgbG9hZGVyXG4gICAgICAgICkudGhlbigoKSA9PiAhdGhpcy5kYXRhPy5sZW5ndGggPyB0aGlzLmFwcGx5KDEsIGZhbHNlKSA6IG51bGwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDdXJyZW50U29ydCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLnNvcnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFBlclBhZ2UocGVyUGFnZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMubmd0UGFnaW5hdGlvbi5vblJlZ2lzdGVyc1BlclBhZ2VDaGFuZ2UocGVyUGFnZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFwcGx5RmlsdGVyc0Rlc2NyaXB0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuY2xlYW5pbmdGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyc1RyYW5zbGF0ZWQgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgcmVmZXJlbmNlIGluIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzRGVzY3JpcHRpb25bcmVmZXJlbmNlXSAmJiB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzW3JlZmVyZW5jZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzVHJhbnNsYXRlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnNbcmVmZXJlbmNlXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uOiB0aGlzLmZpbHRlcnNEZXNjcmlwdGlvbltyZWZlcmVuY2VdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRGaWx0ZXJEZXNjcmlwdGlvbihyZWZlcmVuY2U6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZykge1xuICAgICAgICB0aGlzLmZpbHRlcnNEZXNjcmlwdGlvbltyZWZlcmVuY2VdID0gZGVzY3JpcHRpb247XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUZpbHRlcihyZWZlcmVuY2U/OiBzdHJpbmcsIHJlZnJlc2g6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIGlmIChyZWZlcmVuY2UgJiYgIXRoaXMuaGFzQXBwbGllZEZpbHRlcihyZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFuaW5nRmlsdGVyID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIXJlZmVyZW5jZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVycyA9IHt9O1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzID0ge307XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnNUcmFuc2xhdGVkID0gW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVyc1tyZWZlcmVuY2VdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuc2lsZW50RmlsdGVyc1tyZWZlcmVuY2VdO1xuXG4gICAgICAgICAgICB0aGlzLmZpbHRlcnNUcmFuc2xhdGVkID0gdGhpcy5maWx0ZXJzVHJhbnNsYXRlZC5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50ICYmIGVsZW1lbnQucmVmZXJlbmNlICE9PSByZWZlcmVuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbkNsZWFyRmlsdGVyLmVtaXQocmVmZXJlbmNlKTtcblxuICAgICAgICBpZiAodGhpcy5pbnB1dFNlYXJjaCAmJiAocmVmZXJlbmNlID09PSAndGVybScgfHwgIXJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2guY2xlYXJJbnB1dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlZnJlc2gpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHkodGhpcy5uZ3RQYWdpbmF0aW9uLmdldEN1cnJlbnRQYWdlKCksIGZhbHNlKS50aGVuKCgpID0+IHRoaXMuY2xlYW5pbmdGaWx0ZXIgPSBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzQXBwbGllZEZpbHRlcihmaWx0ZXI6IE9iamVjdCB8IE5ndEN1c3RvbUZpbHRlciB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByZWZlcmVuY2U6IHN0cmluZyA9IHR5cGVvZiBmaWx0ZXIgPT09ICdzdHJpbmcnID8gZmlsdGVyIDogT2JqZWN0LmtleXMoZmlsdGVyID8/IHt9KVswXTtcbiAgICAgICAgY29uc3QgYXBwbGllZEZpbHRlcnMgPSB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLnF1YWxpZmllZEZpbHRlcnM7XG5cbiAgICAgICAgcmV0dXJuICEhT2JqZWN0LmtleXMoYXBwbGllZEZpbHRlcnMpLmZpbmQoa2V5ID0+IGtleSA9PSByZWZlcmVuY2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNBcHBsaWVkRmlsdGVycyhzZWFyY2hUeXBlOiBOZ3REYXRhdGFibGVTZWFyY2hUeXBlID0gTmd0RGF0YXRhYmxlU2VhcmNoVHlwZS5ERUZBVUxUKSB7XG4gICAgICAgIGxldCBhcHBsaWVkRmlsdGVycyA9IHt9O1xuXG4gICAgICAgIGlmIChzZWFyY2hUeXBlID09IE5ndERhdGF0YWJsZVNlYXJjaFR5cGUuREVGQVVMVCkge1xuICAgICAgICAgICAgYXBwbGllZEZpbHRlcnMgPSB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzO1xuICAgICAgICB9IGVsc2UgaWYgKHNlYXJjaFR5cGUgPT0gTmd0RGF0YXRhYmxlU2VhcmNoVHlwZS5TSUxFTlQpIHtcbiAgICAgICAgICAgIGFwcGxpZWRGaWx0ZXJzID0gdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXBwbGllZEZpbHRlcnMgPSB7IC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnMsIC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuc2lsZW50RmlsdGVycyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhT2JqZWN0LnZhbHVlcyhhcHBsaWVkRmlsdGVycyk/LmZpbmQoZmlsdGVyID0+ICEhZmlsdGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlcy5pbnB1dFNlYXJjaCkge1xuICAgICAgICAgICAgaWYgKGNoYW5nZXMuaW5wdXRTZWFyY2guY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0U2VhcmNoV2l0aElucHV0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlcy50eXBlKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSBnZXRFbnVtRnJvbVN0cmluZyhjaGFuZ2VzLnR5cGUuY3VycmVudFZhbHVlLCBOZ3REYXRhdGFibGVUeXBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhcHBseShwYWdlID0gMSwgYXBwbHlEZWxheU9uU2VhcmNoOiBib29sZWFuID0gdHJ1ZSwgbG9hZGVyOiBOZ3REYXRhdGFibGVQYXJhbSA9IE5ndERhdGF0YWJsZVBhcmFtLkVOQUJMRV9MT0FERVIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlYWR5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWFyY2hUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2VhcmNoVGltZW91dCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubmd0UGFnaW5hdGlvbi5kaXNwbGF5UGFnaW5hdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzID0gW107XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09IE5ndERhdGF0YWJsZVR5cGUuUkVNT1RFKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVtb3RlUmVzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmluZFZpc2liaWxpdHlBdHRyaWJ1dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoYXBwbHlEZWxheU9uU2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWREYXRhKHBhZ2UpLnRoZW4oKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2VhcmNoRGVsYXkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkRGF0YShwYWdlKS50aGVuKCgpID0+IHJlc29sdmUoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUaGUgcHJvcGVydHkgW3JlbW90ZVJlc291cmNlXSBuZWVkcyB0byBiZSBwcmVzZW50IHRvIGJlIGFibGUgdG8gbWFrZSByZW1vdGUgc2VhcmNoJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT0gTmd0RGF0YXRhYmxlVHlwZS5GSVhFRCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZFZpc2liaWxpdHlBdHRyaWJ1dGVzKCk7XG5cbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZERhdGEocGFnZTogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYWdpbmF0aW9uOiBOZ3RIdHRwUGFnaW5hdGlvbiA9IHsgLi4udGhpcy5uZ3RQYWdpbmF0aW9uLmdldFBhZ2luYXRpb24oKSwgLi4ueyBwYWdlOiBwYWdlIH0gfTtcblxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5xdWFsaWZpZWRGaWx0ZXJzID0gdGhpcy5nZXRRdWFsaWZpZWRGaWx0ZXJzKCk7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlucHV0U2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dFNlYXJjaC5pc0Rpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgdGhpcy5uZ3RIdHRwU2VydmljZS5nZXQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3RlUmVzb3VyY2UsIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMucXVhbGlmaWVkRmlsdGVycywgcGFnaW5hdGlvbiwgdGhpcy5jdXJyZW50U3RhdGUuc29ydFxuICAgICAgICAgICAgICAgICkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2U6IE5ndEh0dHBSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jY2Vzc1JlbW90ZVJlc3BvbnNlKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ3RQYWdpbmF0aW9uLnByb2NjZXNzUGFnaW5hdGlvbihyZXNwb25zZS5tZXRhKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnB1dFNlYXJjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2guaXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRGF0YUNoYW5nZS5lbWl0KHRoaXMuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmRWaXNpYmlsaXR5QXR0cmlidXRlcygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2guaXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRRdWFsaWZpZWRGaWx0ZXJzKCkge1xuICAgICAgICBjb25zdCBxdWFsaWZpZWRGaWx0ZXJzID0ge307XG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZEZpbHRlcnMgPSB7IC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnMsIC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuc2lsZW50RmlsdGVycyB9O1xuXG4gICAgICAgIGlmIChyZXF1ZXN0ZWRGaWx0ZXJzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBpbiByZXF1ZXN0ZWRGaWx0ZXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gcmVxdWVzdGVkRmlsdGVyc1tyZWZlcmVuY2VdO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZEZpbHRlcihmaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBOZ3RDdXN0b21GaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIudGFnTGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnNEZXNjcmlwdGlvbltyZWZlcmVuY2VdID0gZmlsdGVyLnRhZ0xhYmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzRGVzY3JpcHRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkRmlsdGVyc1tyZWZlcmVuY2VdID0gZmlsdGVyLnRlcm07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWRGaWx0ZXJzW3JlZmVyZW5jZV0gPSBmaWx0ZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcXVhbGlmaWVkRmlsdGVycztcbiAgICB9XG5cbiAgICBwcml2YXRlIGJpbmRWaXNpYmlsaXR5QXR0cmlidXRlcygpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBOZ3REYXRhdGFibGVUeXBlLlJFTU9URSAmJiAhdGhpcy5kYXRhLmxlbmd0aCAmJiAhdGhpcy5sb2FkaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmVtcHR5U3RhdGVWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT0gTmd0RGF0YXRhYmxlVHlwZS5GSVhFRCkge1xuICAgICAgICAgICAgdGhpcy5lbXB0eVN0YXRlVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbXB0eVN0YXRlVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jY2Vzc1JlbW90ZVJlc3BvbnNlKHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5kYXRhID0gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0U2VhcmNoV2l0aElucHV0KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2gub25WYWx1ZUNoYW5nZSgpLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzWyd0ZXJtJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGaWx0ZXIoJ3Rlcm0nKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPCB0aGlzLnNlYXJjaFRlcm1NaW5MZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzWyd0ZXJtJ107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoKHsgdGVybTogJycgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID49IHRoaXMuc2VhcmNoVGVybU1pbkxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaCh7IHRlcm06IHZhbHVlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGVybU9uRW50ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2guZWxlbWVudC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gMTMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXRTZWFyY2gudmFsdWUgJiYgdGhpcy5pbnB1dFNlYXJjaC52YWx1ZS5sZW5ndGggPj0gdGhpcy5zZWFyY2hUZXJtTWluTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5KDEsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0Q2hlY2tib3hFdmVudCgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICB0aGlzLm9uVG9vZ2xlQ2hlY2tib3guc3Vic2NyaWJlKChjaGVja2VkRWxlbWVudDogTmd0Q2hlY2tlZEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudHMgPSB0aGlzLnNlbGVjdGVkRWxlbWVudHMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pZCAhPT0gY2hlY2tlZEVsZW1lbnQuaWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrZWRFbGVtZW50LmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzLnB1c2goY2hlY2tlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3RlZEVsZW1lbnRzQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZEVsZW1lbnRzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYW5BcHBseUZpbHRlcnMoZmlsdGVyczogT2JqZWN0KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5zZWFyY2hpbmcpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIGluIGZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkRmlsdGVyKGZpbHRlcnNbcmVmZXJlbmNlXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNWYWxpZEZpbHRlcihmaWx0ZXI6IE9iamVjdCB8IE5ndEN1c3RvbUZpbHRlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB2YWx1ZTogc3RyaW5nIHwgTmd0Q3VzdG9tRmlsdGVyID0gT2JqZWN0LnZhbHVlcyhmaWx0ZXIgPz8ge30pWzBdO1xuICAgICAgICBjb25zdCBoYXNWYWx1ZTogYm9vbGVhbiA9ICEhKCh2YWx1ZSBpbnN0YW5jZW9mIE5ndEN1c3RvbUZpbHRlciAmJiB2YWx1ZS50ZXJtKSB8fCB2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGlzQXBwbGllZDogYm9vbGVhbiA9IHRoaXMuaGFzQXBwbGllZEZpbHRlcihmaWx0ZXIpO1xuXG4gICAgICAgIHJldHVybiBpc0FwcGxpZWQgfHwgKCFpc0FwcGxpZWQgJiYgaGFzVmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveVN1YnNjcmlwdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIH1cbn1cblxuZXhwb3J0IGVudW0gTmd0RGF0YXRhYmxlVHlwZSB7XG4gICAgUkVNT1RFID0gJ1JFTU9URScsXG4gICAgRklYRUQgPSAnRklYRUQnXG59XG5cbmV4cG9ydCBlbnVtIE5ndERhdGF0YWJsZVNlYXJjaFR5cGUge1xuICAgIERFRkFVTFQgPSAnREVGQVVMVCcsXG4gICAgU0lMRU5UID0gJ1NJTEVOVCcsXG59XG5cbmV4cG9ydCBlbnVtIE5ndERhdGF0YWJsZVBhcmFtIHtcbiAgICBTVEFZX0lOX1BBR0UgPSAxLFxuICAgIFJFU0VUX1BBR0UgPSAwLFxuICAgIEVOQUJMRV9MT0FERVIgPSAxLFxuICAgIERJU0FCTEVfTE9BREVSID0gMFxufVxuXG5leHBvcnQgY2xhc3MgTmd0Q2hlY2tlZEVsZW1lbnQge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nO1xuICAgIHB1YmxpYyBjaGVja2VkOiBib29sZWFuO1xuICAgIHB1YmxpYyByZWZlcmVuY2U6IGFueTtcbn1cblxuZXhwb3J0IGNsYXNzIE5ndEN1c3RvbUZpbHRlciB7XG4gICAgcHVibGljIHRlcm06IHN0cmluZztcbiAgICBwdWJsaWMgdGFnVmFsdWU6IHN0cmluZztcbiAgICBwdWJsaWMgdGFnTGFiZWw/OiBzdHJpbmc7XG59XG4iXX0=