ng-tailwind 5.2.1 → 5.2.2

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 (212) 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/components/ngt-action/ngt-action.component.d.ts +30 -30
  5. package/components/ngt-action/ngt-action.module.d.ts +10 -10
  6. package/components/ngt-button/ngt-button.component.d.ts +35 -35
  7. package/components/ngt-button/ngt-button.module.d.ts +10 -10
  8. package/components/ngt-checkbox/ngt-checkbox.component.d.ts +53 -53
  9. package/components/ngt-checkbox/ngt-checkbox.module.d.ts +10 -10
  10. package/components/ngt-content/ngt-content.component.d.ts +12 -12
  11. package/components/ngt-content/ngt-content.module.d.ts +8 -8
  12. package/components/ngt-context-menu/ngt-context-menu.component.d.ts +19 -19
  13. package/components/ngt-context-menu/ngt-context-menu.directive.d.ts +25 -25
  14. package/components/ngt-context-menu/ngt-context-menu.module.d.ts +10 -10
  15. package/components/ngt-datatable/ngt-datatable.component.d.ts +125 -125
  16. package/components/ngt-datatable/ngt-datatable.module.d.ts +25 -25
  17. package/components/ngt-datatable/ngt-tbody/ngt-tbody.component.d.ts +14 -14
  18. package/components/ngt-datatable/ngt-td/ngt-td.component.d.ts +14 -14
  19. package/components/ngt-datatable/ngt-td-check/ngt-td-check.component.d.ts +29 -29
  20. package/components/ngt-datatable/ngt-th/ngt-th.component.d.ts +55 -55
  21. package/components/ngt-datatable/ngt-th-check/ngt-th-check.component.d.ts +32 -32
  22. package/components/ngt-datatable/ngt-thead/ngt-thead.component.d.ts +13 -13
  23. package/components/ngt-datatable/ngt-tr/ngt-tr.component.d.ts +20 -20
  24. package/components/ngt-date/ngt-date.component.d.ts +85 -85
  25. package/components/ngt-date/ngt-date.module.d.ts +13 -13
  26. package/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.d.ts +8 -8
  27. package/components/ngt-dropdown/ngt-dropdown.component.d.ts +53 -53
  28. package/components/ngt-dropdown/ngt-dropdown.module.d.ts +9 -9
  29. package/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.d.ts +14 -14
  30. package/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.d.ts +25 -25
  31. package/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.d.ts +35 -35
  32. package/components/ngt-dropzone/ngt-dropzone.component.d.ts +95 -95
  33. package/components/ngt-dropzone/ngt-dropzone.meta.d.ts +27 -27
  34. package/components/ngt-dropzone/ngt-dropzone.module.d.ts +17 -17
  35. package/components/ngt-floating-button/ngt-floating-button.component.d.ts +35 -35
  36. package/components/ngt-floating-button/ngt-floating-button.module.d.ts +10 -10
  37. package/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.d.ts +10 -10
  38. package/components/ngt-form/ngt-form.component.d.ts +60 -60
  39. package/components/ngt-form/ngt-form.module.d.ts +9 -9
  40. package/components/ngt-header-nav/ngt-header-nav.component.d.ts +14 -14
  41. package/components/ngt-header-nav/ngt-header-nav.module.d.ts +8 -8
  42. package/components/ngt-helper/ngt-helper.component.d.ts +25 -25
  43. package/components/ngt-helper/ngt-helper.module.d.ts +10 -10
  44. package/components/ngt-input/ngt-input.component.d.ts +129 -129
  45. package/components/ngt-input/ngt-input.module.d.ts +14 -14
  46. package/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.d.ts +17 -17
  47. package/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.d.ts +12 -12
  48. package/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.d.ts +15 -15
  49. package/components/ngt-modal/ngt-modal.component.d.ts +31 -31
  50. package/components/ngt-modal/ngt-modal.module.d.ts +11 -11
  51. package/components/ngt-multi-select/ngt-multi-select.component.d.ts +116 -116
  52. package/components/ngt-multi-select/ngt-multi-select.module.d.ts +15 -15
  53. package/components/ngt-pagination/ngt-pagination.component.d.ts +43 -43
  54. package/components/ngt-pagination/ngt-pagination.module.d.ts +12 -12
  55. package/components/ngt-popover/ngt-popover-tooltip/ngt-popover-tooltip.component.d.ts +21 -21
  56. package/components/ngt-popover/ngt-popover.component.d.ts +31 -31
  57. package/components/ngt-popover/ngt-popover.directive.d.ts +31 -31
  58. package/components/ngt-popover/ngt-popover.module.d.ts +11 -11
  59. package/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.d.ts +12 -12
  60. package/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.d.ts +12 -12
  61. package/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.d.ts +18 -18
  62. package/components/ngt-portlet/ngt-portlet.component.d.ts +20 -20
  63. package/components/ngt-portlet/ngt-portlet.module.d.ts +13 -13
  64. package/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.d.ts +9 -9
  65. package/components/ngt-radio-button/ngt-radio-button.component.d.ts +45 -45
  66. package/components/ngt-radio-button/ngt-radio-button.module.d.ts +11 -11
  67. package/components/ngt-section/ngt-section.component.d.ts +38 -38
  68. package/components/ngt-section/ngt-section.module.d.ts +11 -11
  69. package/components/ngt-select/ngt-select.component.d.ts +154 -154
  70. package/components/ngt-select/ngt-select.directive.d.ts +20 -20
  71. package/components/ngt-select/ngt-select.module.d.ts +16 -16
  72. package/components/ngt-shining/ngt-shining.component.d.ts +19 -19
  73. package/components/ngt-shining/ngt-shining.module.d.ts +8 -8
  74. package/components/ngt-sidenav/ngt-sidenav.component.d.ts +32 -32
  75. package/components/ngt-sidenav/ngt-sidenav.module.d.ts +8 -8
  76. package/components/ngt-slider/ngt-slider.component.d.ts +36 -36
  77. package/components/ngt-slider/ngt-slider.module.d.ts +9 -9
  78. package/components/ngt-svg/ngt-svg.component.d.ts +13 -13
  79. package/components/ngt-svg/ngt-svg.module.d.ts +10 -10
  80. package/components/ngt-tag/ngt-tag.component.d.ts +13 -13
  81. package/components/ngt-tag/ngt-tag.module.d.ts +9 -9
  82. package/components/ngt-textarea/ngt-textarea.component.d.ts +49 -49
  83. package/components/ngt-textarea/ngt-textarea.module.d.ts +13 -13
  84. package/components/ngt-validation/ngt-validation.component.d.ts +13 -13
  85. package/components/ngt-validation/ngt-validation.module.d.ts +8 -8
  86. package/directives/ngt-stylizable/ngt-stylizable.directive.d.ts +68 -68
  87. package/directives/ngt-stylizable/ngt-stylizable.module.d.ts +8 -8
  88. package/enums/size.enum.d.ts +8 -8
  89. package/esm2020/animations/ngt-angular-animations.mjs +34 -34
  90. package/esm2020/base/ngt-base-ng-model.mjs +90 -90
  91. package/esm2020/components/ngt-action/ngt-action.component.mjs +96 -96
  92. package/esm2020/components/ngt-action/ngt-action.module.mjs +28 -28
  93. package/esm2020/components/ngt-button/ngt-button.component.mjs +142 -142
  94. package/esm2020/components/ngt-button/ngt-button.module.mjs +28 -28
  95. package/esm2020/components/ngt-checkbox/ngt-checkbox.component.mjs +192 -192
  96. package/esm2020/components/ngt-checkbox/ngt-checkbox.module.mjs +28 -28
  97. package/esm2020/components/ngt-content/ngt-content.component.mjs +32 -32
  98. package/esm2020/components/ngt-content/ngt-content.module.mjs +20 -20
  99. package/esm2020/components/ngt-context-menu/ngt-context-menu.component.mjs +25 -25
  100. package/esm2020/components/ngt-context-menu/ngt-context-menu.directive.mjs +89 -89
  101. package/esm2020/components/ngt-context-menu/ngt-context-menu.module.mjs +33 -33
  102. package/esm2020/components/ngt-datatable/ngt-datatable.component.mjs +470 -470
  103. package/esm2020/components/ngt-datatable/ngt-datatable.module.mjs +99 -99
  104. package/esm2020/components/ngt-datatable/ngt-tbody/ngt-tbody.component.mjs +57 -57
  105. package/esm2020/components/ngt-datatable/ngt-td/ngt-td.component.mjs +62 -62
  106. package/esm2020/components/ngt-datatable/ngt-td-check/ngt-td-check.component.mjs +113 -113
  107. package/esm2020/components/ngt-datatable/ngt-th/ngt-th.component.mjs +228 -228
  108. package/esm2020/components/ngt-datatable/ngt-th-check/ngt-th-check.component.mjs +127 -127
  109. package/esm2020/components/ngt-datatable/ngt-thead/ngt-thead.component.mjs +55 -55
  110. package/esm2020/components/ngt-datatable/ngt-tr/ngt-tr.component.mjs +86 -86
  111. package/esm2020/components/ngt-date/ngt-date.component.mjs +435 -435
  112. package/esm2020/components/ngt-date/ngt-date.module.mjs +40 -40
  113. package/esm2020/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.mjs +19 -19
  114. package/esm2020/components/ngt-dropdown/ngt-dropdown.component.mjs +204 -204
  115. package/esm2020/components/ngt-dropdown/ngt-dropdown.module.mjs +21 -21
  116. package/esm2020/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.mjs +54 -54
  117. package/esm2020/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.mjs +69 -66
  118. package/esm2020/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.mjs +94 -94
  119. package/esm2020/components/ngt-dropzone/ngt-dropzone.component.mjs +496 -496
  120. package/esm2020/components/ngt-dropzone/ngt-dropzone.meta.mjs +24 -24
  121. package/esm2020/components/ngt-dropzone/ngt-dropzone.module.mjs +55 -55
  122. package/esm2020/components/ngt-floating-button/ngt-floating-button.component.mjs +119 -119
  123. package/esm2020/components/ngt-floating-button/ngt-floating-button.module.mjs +28 -28
  124. package/esm2020/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.mjs +22 -22
  125. package/esm2020/components/ngt-form/ngt-form.component.mjs +207 -207
  126. package/esm2020/components/ngt-form/ngt-form.module.mjs +29 -29
  127. package/esm2020/components/ngt-header-nav/ngt-header-nav.component.mjs +39 -39
  128. package/esm2020/components/ngt-header-nav/ngt-header-nav.module.mjs +20 -20
  129. package/esm2020/components/ngt-helper/ngt-helper.component.mjs +68 -68
  130. package/esm2020/components/ngt-helper/ngt-helper.module.mjs +28 -28
  131. package/esm2020/components/ngt-input/ngt-input.component.mjs +844 -844
  132. package/esm2020/components/ngt-input/ngt-input.module.mjs +47 -47
  133. package/esm2020/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.mjs +46 -46
  134. package/esm2020/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.mjs +33 -33
  135. package/esm2020/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.mjs +40 -40
  136. package/esm2020/components/ngt-modal/ngt-modal.component.mjs +122 -122
  137. package/esm2020/components/ngt-modal/ngt-modal.module.mjs +39 -39
  138. package/esm2020/components/ngt-multi-select/ngt-multi-select.component.mjs +503 -503
  139. package/esm2020/components/ngt-multi-select/ngt-multi-select.module.mjs +52 -52
  140. package/esm2020/components/ngt-pagination/ngt-pagination.component.mjs +162 -162
  141. package/esm2020/components/ngt-pagination/ngt-pagination.module.mjs +36 -36
  142. package/esm2020/components/ngt-popover/ngt-popover-tooltip/ngt-popover-tooltip.component.mjs +58 -58
  143. package/esm2020/components/ngt-popover/ngt-popover.component.mjs +85 -85
  144. package/esm2020/components/ngt-popover/ngt-popover.directive.mjs +126 -126
  145. package/esm2020/components/ngt-popover/ngt-popover.module.mjs +36 -36
  146. package/esm2020/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.mjs +34 -34
  147. package/esm2020/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.mjs +35 -35
  148. package/esm2020/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.mjs +57 -57
  149. package/esm2020/components/ngt-portlet/ngt-portlet.component.mjs +74 -74
  150. package/esm2020/components/ngt-portlet/ngt-portlet.module.mjs +47 -47
  151. package/esm2020/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.mjs +19 -19
  152. package/esm2020/components/ngt-radio-button/ngt-radio-button.component.mjs +153 -153
  153. package/esm2020/components/ngt-radio-button/ngt-radio-button.module.mjs +29 -29
  154. package/esm2020/components/ngt-section/ngt-section.component.mjs +151 -151
  155. package/esm2020/components/ngt-section/ngt-section.module.mjs +32 -32
  156. package/esm2020/components/ngt-select/ngt-select.component.mjs +670 -670
  157. package/esm2020/components/ngt-select/ngt-select.directive.mjs +36 -36
  158. package/esm2020/components/ngt-select/ngt-select.module.mjs +65 -65
  159. package/esm2020/components/ngt-shining/ngt-shining.component.mjs +40 -40
  160. package/esm2020/components/ngt-shining/ngt-shining.module.mjs +20 -20
  161. package/esm2020/components/ngt-sidenav/ngt-sidenav.component.mjs +132 -132
  162. package/esm2020/components/ngt-sidenav/ngt-sidenav.module.mjs +20 -20
  163. package/esm2020/components/ngt-slider/ngt-slider.component.mjs +100 -100
  164. package/esm2020/components/ngt-slider/ngt-slider.module.mjs +24 -24
  165. package/esm2020/components/ngt-svg/ngt-svg.component.mjs +53 -53
  166. package/esm2020/components/ngt-svg/ngt-svg.module.mjs +28 -28
  167. package/esm2020/components/ngt-tag/ngt-tag.component.mjs +37 -37
  168. package/esm2020/components/ngt-tag/ngt-tag.module.mjs +24 -24
  169. package/esm2020/components/ngt-textarea/ngt-textarea.component.mjs +238 -238
  170. package/esm2020/components/ngt-textarea/ngt-textarea.module.mjs +43 -43
  171. package/esm2020/components/ngt-validation/ngt-validation.component.mjs +26 -26
  172. package/esm2020/components/ngt-validation/ngt-validation.module.mjs +20 -20
  173. package/esm2020/directives/ngt-stylizable/ngt-stylizable.directive.mjs +290 -290
  174. package/esm2020/directives/ngt-stylizable/ngt-stylizable.module.mjs +20 -20
  175. package/esm2020/enums/size.enum.mjs +11 -11
  176. package/esm2020/helpers/enum/enum.mjs +7 -7
  177. package/esm2020/helpers/form/form.mjs +14 -14
  178. package/esm2020/helpers/input-mask/input-mask.helper.mjs +26 -26
  179. package/esm2020/helpers/promise/promise-helper.mjs +4 -4
  180. package/esm2020/helpers/routing/route.mjs +11 -11
  181. package/esm2020/helpers/uuid.mjs +10 -10
  182. package/esm2020/ng-tailwind.mjs +4 -4
  183. package/esm2020/public-api.mjs +127 -127
  184. package/esm2020/services/http/ngt-attachment-http.service.mjs +3 -3
  185. package/esm2020/services/http/ngt-http-form.service.mjs +3 -3
  186. package/esm2020/services/http/ngt-http-resource.service.mjs +3 -3
  187. package/esm2020/services/http/ngt-http-validation.service.mjs +3 -3
  188. package/esm2020/services/http/ngt-http.service.mjs +3 -3
  189. package/esm2020/services/http/ngt-translate.service.mjs +3 -3
  190. package/esm2020/services/ngt-stylizable/ngt-stylizable.service.mjs +273 -273
  191. package/esm2020/services/validation/ngt-ability-validation.service.mjs +3 -3
  192. package/fesm2015/ng-tailwind.mjs +8656 -8653
  193. package/fesm2015/ng-tailwind.mjs.map +1 -1
  194. package/fesm2020/ng-tailwind.mjs +8481 -8478
  195. package/fesm2020/ng-tailwind.mjs.map +1 -1
  196. package/helpers/enum/enum.d.ts +1 -1
  197. package/helpers/form/form.d.ts +4 -4
  198. package/helpers/input-mask/input-mask.helper.d.ts +20 -20
  199. package/helpers/promise/promise-helper.d.ts +1 -1
  200. package/helpers/routing/route.d.ts +2 -2
  201. package/helpers/uuid.d.ts +1 -1
  202. package/index.d.ts +5 -5
  203. package/package.json +1 -1
  204. package/public-api.d.ts +87 -87
  205. package/services/http/ngt-attachment-http.service.d.ts +9 -9
  206. package/services/http/ngt-http-form.service.d.ts +5 -5
  207. package/services/http/ngt-http-resource.service.d.ts +12 -12
  208. package/services/http/ngt-http-validation.service.d.ts +12 -12
  209. package/services/http/ngt-http.service.d.ts +27 -27
  210. package/services/http/ngt-translate.service.d.ts +33 -33
  211. package/services/ngt-stylizable/ngt-stylizable.service.d.ts +96 -96
  212. package/services/validation/ngt-ability-validation.service.d.ts +5 -5
@@ -1,470 +1,470 @@
1
- import { Component, EventEmitter, Input, Optional, Output, ViewChild, } from '@angular/core';
2
- import { getEnumFromString } from '../../helpers/enum/enum';
3
- import { NgtStylizableService } from '../../services/ngt-stylizable/ngt-stylizable.service';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "../../services/http/ngt-http.service";
6
- import * as i2 from "../../services/http/ngt-translate.service";
7
- import * as i3 from "@angular/common";
8
- import * as i4 from "../ngt-shining/ngt-shining.component";
9
- import * as i5 from "../ngt-pagination/ngt-pagination.component";
10
- import * as i6 from "../ngt-modal/ngt-modal.component";
11
- import * as i7 from "../ngt-tag/ngt-tag.component";
12
- import * as i8 from "../../directives/ngt-stylizable/ngt-stylizable.directive";
13
- export class NgtDatatableComponent {
14
- constructor(injector, ngtHttpService, changeDetector, ngtTranslateService) {
15
- this.injector = injector;
16
- this.ngtHttpService = ngtHttpService;
17
- this.changeDetector = changeDetector;
18
- this.ngtTranslateService = ngtTranslateService;
19
- this.type = NgtDatatableType.REMOTE;
20
- this.filterTagBgColor = 'bg-blue-500';
21
- this.filterTagMargin = 'mb-4';
22
- this.paginationMargin = 'mt-2 md:mt-8';
23
- this.searchDelay = 500;
24
- this.searchTermMinLength = 1;
25
- this.searchTermOnEnter = true;
26
- this.defaultFilters = {};
27
- this.filtersDescription = {};
28
- this.canSelectAllRegisters = false;
29
- this.onDataChange = new EventEmitter();
30
- this.onClearFilter = new EventEmitter();
31
- this.onClearSelectedElements = new EventEmitter();
32
- this.onSelectedElementsChange = new EventEmitter();
33
- this.onToogleAllCheckboxes = new EventEmitter();
34
- this.onToogleCheckbox = new EventEmitter();
35
- this.onSelectAllRegisters = new EventEmitter();
36
- this.onOpenSearchModal = new EventEmitter();
37
- this.onSearch = new EventEmitter();
38
- this.data = [];
39
- this.loading = false;
40
- this.cleaningFilter = false;
41
- this.componentReady = false;
42
- this.filtersTranslated = [];
43
- this.columnCount = [];
44
- this.selectedElements = [];
45
- this.filterModalStyle = new NgtStylizableService();
46
- this.subscriptions = [];
47
- this.currentState = {
48
- filters: {
49
- defaultFilters: {},
50
- silentFilters: {},
51
- qualifiedFilters: {},
52
- },
53
- sort: {
54
- field: '',
55
- direction: ''
56
- }
57
- };
58
- this.filterModalStyle.load(this.injector, 'FilterModal', {
59
- w: 'md:max-w-md',
60
- py: 'py-4',
61
- px: 'px-6',
62
- border: 'border border-teal-500',
63
- overflow: 'overflow-visible',
64
- color: {}
65
- });
66
- }
67
- ngOnInit() {
68
- if (this.table && this.table.nativeElement && this.table.nativeElement.rows
69
- && this.table.nativeElement.rows[0] && this.table.nativeElement.rows[0].cells) {
70
- this.columnCount = this.table.nativeElement.rows[0].cells;
71
- }
72
- if (this.inputSearch) {
73
- this.initSearchWithInput();
74
- }
75
- this.initCheckboxEvent();
76
- if (this.searchDelay == 500) {
77
- this.searchDelay = this.injector.get('NgtDatatableSearchDelay', 500);
78
- }
79
- if (this.searchTermMinLength == 1) {
80
- this.searchTermMinLength = this.injector.get('NgtDatatableSearchTermMinLength', 1);
81
- }
82
- }
83
- ngOnDestroy() {
84
- this.destroySubscriptions();
85
- }
86
- setSearchModalTemplate(template) {
87
- this.searchModalTemplate = template;
88
- }
89
- openSearchModal(reference) {
90
- this.searchModal.open();
91
- this.onOpenSearchModal.emit(reference);
92
- }
93
- clearSelectedElements() {
94
- this.selectedElements = [];
95
- this.onClearSelectedElements.emit();
96
- }
97
- getCurrentState() {
98
- return this.currentState;
99
- }
100
- init() {
101
- this.componentReady = true;
102
- }
103
- async search(filters, searchType = NgtDatatableSearchType.DEFAULT, applyDelayOnSearch = true) {
104
- if (this.canApplyFilters(filters)) {
105
- this.onSearch.emit(filters);
106
- if (searchType == NgtDatatableSearchType.DEFAULT) {
107
- this.currentState.filters.defaultFilters = { ...this.currentState.filters.defaultFilters, ...filters };
108
- }
109
- else {
110
- this.currentState.filters.silentFilters = { ...this.currentState.filters.silentFilters, ...filters };
111
- }
112
- this.applyFiltersDescription();
113
- return this.apply(1, applyDelayOnSearch);
114
- }
115
- }
116
- async sort(field, direction) {
117
- this.currentState.sort = {
118
- field: field,
119
- direction: direction
120
- };
121
- return this.apply(this.ngtPagination.getCurrentPage());
122
- }
123
- async refresh(stayInPage = NgtDatatableParam.RESET_PAGE, loader = NgtDatatableParam.ENABLE_LOADER) {
124
- return this.apply(stayInPage ? this.ngtPagination.getCurrentPage() : 1, false, loader).then(() => !this.data?.length ? this.apply(1, false) : null);
125
- }
126
- getData() {
127
- return this.data;
128
- }
129
- getCurrentSort() {
130
- return this.currentState.sort;
131
- }
132
- setPerPage(perPage) {
133
- this.ngtPagination.onRegistersPerPageChange(perPage);
134
- }
135
- applyFiltersDescription() {
136
- if (!this.cleaningFilter) {
137
- this.filtersTranslated = [];
138
- for (let reference in this.currentState.filters.defaultFilters) {
139
- if (this.filtersDescription[reference] && this.currentState.filters.defaultFilters[reference]) {
140
- this.filtersTranslated.push({
141
- reference: reference,
142
- value: this.currentState.filters.defaultFilters[reference],
143
- translation: this.filtersDescription[reference]
144
- });
145
- }
146
- }
147
- }
148
- }
149
- setFilterDescription(reference, description) {
150
- this.filtersDescription[reference] = description;
151
- }
152
- async removeFilter(reference, refresh = true) {
153
- return new Promise(resolve => {
154
- if (reference && !this.hasAppliedFilter(reference)) {
155
- return resolve();
156
- }
157
- this.cleaningFilter = true;
158
- if (!reference) {
159
- this.currentState.filters.defaultFilters = {};
160
- this.currentState.filters.silentFilters = {};
161
- this.filtersTranslated = [];
162
- }
163
- else {
164
- delete this.currentState.filters.defaultFilters[reference];
165
- delete this.currentState.filters.silentFilters[reference];
166
- this.filtersTranslated = this.filtersTranslated.filter(element => element && element.reference !== reference);
167
- }
168
- this.onClearFilter.emit(reference);
169
- if (this.inputSearch && (reference === 'term' || !reference)) {
170
- this.inputSearch.clearInput();
171
- }
172
- if (refresh) {
173
- return this.apply(this.ngtPagination.getCurrentPage(), false)
174
- .then(() => {
175
- this.cleaningFilter = false;
176
- resolve();
177
- });
178
- }
179
- resolve();
180
- });
181
- }
182
- hasAppliedFilter(filter) {
183
- const reference = typeof filter === 'string' ? filter : Object.keys(filter ?? {})[0];
184
- const appliedFilters = this.currentState.filters.qualifiedFilters;
185
- return !!Object.keys(appliedFilters).find(key => key == reference);
186
- }
187
- hasAppliedFilters(searchType = NgtDatatableSearchType.DEFAULT) {
188
- let appliedFilters = {};
189
- if (searchType == NgtDatatableSearchType.DEFAULT) {
190
- appliedFilters = this.currentState.filters.defaultFilters;
191
- }
192
- else if (searchType == NgtDatatableSearchType.SILENT) {
193
- appliedFilters = this.currentState.filters.silentFilters;
194
- }
195
- else {
196
- appliedFilters = { ...this.currentState.filters.defaultFilters, ...this.currentState.filters.silentFilters };
197
- }
198
- return !!Object.values(appliedFilters)?.find(filter => !!filter);
199
- }
200
- ngOnChanges(changes) {
201
- if (changes.inputSearch) {
202
- if (changes.inputSearch.currentValue) {
203
- this.initSearchWithInput();
204
- }
205
- }
206
- if (changes.type) {
207
- this.type = getEnumFromString(changes.type.currentValue, NgtDatatableType);
208
- }
209
- }
210
- async apply(page = 1, applyDelayOnSearch = true, loader = NgtDatatableParam.ENABLE_LOADER) {
211
- return new Promise(resolve => {
212
- if (!this.componentReady) {
213
- return resolve();
214
- }
215
- else if (this.searchTimeout) {
216
- clearTimeout(this.searchTimeout);
217
- }
218
- this.ngtPagination.displayPagination = false;
219
- this.selectedElements = [];
220
- if (this.type === NgtDatatableType.REMOTE) {
221
- if (this.remoteResource) {
222
- if (loader) {
223
- this.loading = true;
224
- this.bindVisibilityAttributes();
225
- }
226
- if (applyDelayOnSearch) {
227
- this.searchTimeout = setTimeout(() => {
228
- this.loadData(page).then(() => resolve());
229
- }, this.searchDelay);
230
- }
231
- else {
232
- this.loadData(page).then(() => resolve());
233
- }
234
- }
235
- else {
236
- console.error('The property [remoteResource] needs to be present to be able to make remote search');
237
- }
238
- }
239
- else if (this.type == NgtDatatableType.FIXED) {
240
- this.bindVisibilityAttributes();
241
- resolve();
242
- }
243
- });
244
- }
245
- getTagFilterValue(filter) {
246
- const filtersTag = this.getFiltersTagArray(filter);
247
- return filtersTag.length > 1
248
- ? filtersTag[0] + " +"
249
- : filtersTag[0];
250
- }
251
- getTitle(filter) {
252
- const filtersTag = this.getFiltersTagArray(filter);
253
- return filtersTag.length > 1
254
- ? filtersTag.slice(1).join(",")
255
- : '';
256
- }
257
- getFiltersTagArray(filter) {
258
- const tag = filter?.value?.tagValue ? filter.value.tagValue : filter.value;
259
- return tag.split(",");
260
- }
261
- loadData(page) {
262
- return new Promise((resolve, reject) => {
263
- const pagination = { ...this.ngtPagination.getPagination(), ...{ page: page } };
264
- this.currentState.filters.qualifiedFilters = this.getQualifiedFilters();
265
- this.searching = true;
266
- if (this.inputSearch) {
267
- this.inputSearch.isDisabled = true;
268
- }
269
- this.subscriptions.push(this.ngtHttpService.get(this.remoteResource, this.currentState.filters.qualifiedFilters, pagination, this.currentState.sort).subscribe((response) => {
270
- this.proccessRemoteResponse(response.data);
271
- if (response.meta) {
272
- this.ngtPagination.proccessPagination(response.meta);
273
- }
274
- this.searching = false;
275
- this.loading = false;
276
- if (this.inputSearch) {
277
- this.inputSearch.isDisabled = false;
278
- }
279
- this.onDataChange.emit(this.data);
280
- this.bindVisibilityAttributes();
281
- resolve();
282
- }, (error) => {
283
- console.error(error);
284
- this.loading = false;
285
- this.inputSearch.isDisabled = false;
286
- this.changeDetector.detectChanges();
287
- reject();
288
- }));
289
- });
290
- }
291
- getQualifiedFilters() {
292
- const qualifiedFilters = {};
293
- const requestedFilters = { ...this.currentState.filters.defaultFilters, ...this.currentState.filters.silentFilters };
294
- if (requestedFilters) {
295
- for (const reference in requestedFilters) {
296
- const filter = requestedFilters[reference];
297
- if (this.isValidFilter(filter, reference)) {
298
- if (filter instanceof NgtCustomFilter) {
299
- if (filter.tagLabel) {
300
- this.filtersDescription[reference] = filter.tagLabel;
301
- this.applyFiltersDescription();
302
- }
303
- qualifiedFilters[reference] = filter.term;
304
- }
305
- else {
306
- qualifiedFilters[reference] = filter;
307
- }
308
- }
309
- }
310
- }
311
- return qualifiedFilters;
312
- }
313
- bindVisibilityAttributes() {
314
- this.changeDetector.detectChanges();
315
- if (this.type == NgtDatatableType.REMOTE && !this.data.length && !this.loading) {
316
- this.emptyStateVisible = true;
317
- }
318
- else if (this.type == NgtDatatableType.FIXED) {
319
- this.emptyStateVisible = false;
320
- }
321
- else {
322
- this.emptyStateVisible = false;
323
- }
324
- this.changeDetector.detectChanges();
325
- }
326
- proccessRemoteResponse(response) {
327
- this.data = response;
328
- }
329
- initSearchWithInput() {
330
- this.subscriptions.push(this.inputSearch.onValueChange().subscribe((value) => {
331
- if (this.currentState.filters.defaultFilters['term']) {
332
- if (!value) {
333
- this.removeFilter('term');
334
- }
335
- else if (value.length < this.searchTermMinLength) {
336
- delete this.currentState.filters.defaultFilters['term'];
337
- this.search({ term: '' });
338
- }
339
- }
340
- if (value.length >= this.searchTermMinLength) {
341
- this.search({ term: value });
342
- }
343
- }));
344
- if (this.searchTermOnEnter) {
345
- this.inputSearch.element.nativeElement.addEventListener('keydown', (event) => {
346
- event.stopImmediatePropagation();
347
- if (event.keyCode == 13) {
348
- if (this.inputSearch.value && this.inputSearch.value.length >= this.searchTermMinLength) {
349
- this.apply(1, false);
350
- }
351
- }
352
- });
353
- }
354
- }
355
- initCheckboxEvent() {
356
- this.subscriptions.push(this.onToogleCheckbox.subscribe((checkedElement) => {
357
- this.selectedElements = this.selectedElements.filter(item => item.id !== checkedElement.id);
358
- if (checkedElement.checked) {
359
- this.selectedElements.push(checkedElement);
360
- }
361
- this.onSelectedElementsChange.emit(this.selectedElements);
362
- }));
363
- this.subscriptions.push(this.onSelectAllRegisters.subscribe(() => {
364
- this.hasSelectedAllElements = !this.hasSelectedAllElements;
365
- if (!this.hasSelectedAllElements) {
366
- this.selectedElements = [];
367
- }
368
- }));
369
- }
370
- canApplyFilters(filters) {
371
- if (!this.searching) {
372
- for (const reference in filters) {
373
- if (this.isValidFilter(filters[reference], reference)) {
374
- return true;
375
- }
376
- }
377
- }
378
- return false;
379
- }
380
- isValidFilter(filter, reference) {
381
- const hasValue = !!((filter instanceof NgtCustomFilter && filter.term) || filter);
382
- const isApplied = this.hasAppliedFilter(reference);
383
- return isApplied || (!isApplied && hasValue);
384
- }
385
- destroySubscriptions() {
386
- this.subscriptions.forEach(subscription => subscription.unsubscribe());
387
- this.subscriptions = [];
388
- }
389
- }
390
- NgtDatatableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtDatatableComponent, deps: [{ token: i0.Injector }, { token: i1.NgtHttpService }, { token: i0.ChangeDetectorRef }, { token: i2.NgtTranslateService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
391
- NgtDatatableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: NgtDatatableComponent, selector: "ngt-datatable", inputs: { remoteResource: "remoteResource", type: "type", filterTagBgColor: "filterTagBgColor", filterTagMargin: "filterTagMargin", paginationMargin: "paginationMargin", inputSearch: "inputSearch", searchDelay: "searchDelay", searchTermMinLength: "searchTermMinLength", searchTermOnEnter: "searchTermOnEnter", defaultFilters: "defaultFilters", filtersDescription: "filtersDescription", canSelectAllRegisters: "canSelectAllRegisters" }, outputs: { onDataChange: "onDataChange", onClearFilter: "onClearFilter", onClearSelectedElements: "onClearSelectedElements", onSelectedElementsChange: "onSelectedElementsChange", onToogleAllCheckboxes: "onToogleAllCheckboxes", onToogleCheckbox: "onToogleCheckbox", onSelectAllRegisters: "onSelectAllRegisters", onOpenSearchModal: "onOpenSearchModal", onSearch: "onSearch" }, viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true, static: true }, { propertyName: "ngtPagination", first: true, predicate: ["ngtPagination"], descendants: true, static: true }, { propertyName: "searchModal", first: true, predicate: ["searchModal"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, 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 [title]=\"getTitle(filter)\">\n {{ filter.translation + ': ' + getTagFilterValue(filter) }}\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 [customLayout]=\"true\" [isDisabled]=\"false\" [ngtStyle]=\"filterModalStyle\" #searchModal>\n <ng-container *ngTemplateOutlet=\"searchModalTemplate\"></ng-container>\n</ngt-modal>", 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"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.NgtShiningComponent, selector: "ngt-shining", inputs: ["shiningWidth"] }, { kind: "component", type: i5.NgtPaginationComponent, selector: "ngt-pagination", inputs: ["pagesInterval"], outputs: ["onPageChange", "onPerPageChange"] }, { kind: "component", type: i6.NgtModalComponent, selector: "ngt-modal", inputs: ["customLayout", "disableDefaultCloses", "isDisabled", "ngtStyle"], outputs: ["onCloseModal", "onOpenModal"] }, { kind: "component", type: i7.NgtTagComponent, selector: "ngt-tag", inputs: ["icon"] }, { kind: "directive", type: i8.NgtStylizableDirective, selector: "[ngt-stylizable]", inputs: ["color", "color.text", "color.bg", "color.border", "h", "w", "p", "px", "py", "pt", "pr", "pb", "pl", "m", "mx", "my", "mt", "mr", "mb", "ml", "border", "shadow", "rounded", "font", "text", "breakWords", "overflow", "position", "justifyContent", "cursor", "fontCase"] }] });
392
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtDatatableComponent, decorators: [{
393
- type: Component,
394
- args: [{ selector: 'ngt-datatable', 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 [title]=\"getTitle(filter)\">\n {{ filter.translation + ': ' + getTagFilterValue(filter) }}\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 [customLayout]=\"true\" [isDisabled]=\"false\" [ngtStyle]=\"filterModalStyle\" #searchModal>\n <ng-container *ngTemplateOutlet=\"searchModalTemplate\"></ng-container>\n</ngt-modal>", 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"] }]
395
- }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.NgtHttpService }, { type: i0.ChangeDetectorRef }, { type: i2.NgtTranslateService, decorators: [{
396
- type: Optional
397
- }] }]; }, propDecorators: { table: [{
398
- type: ViewChild,
399
- args: ['table', { static: true }]
400
- }], ngtPagination: [{
401
- type: ViewChild,
402
- args: ['ngtPagination', { static: true }]
403
- }], searchModal: [{
404
- type: ViewChild,
405
- args: ['searchModal', { static: true }]
406
- }], remoteResource: [{
407
- type: Input
408
- }], type: [{
409
- type: Input
410
- }], filterTagBgColor: [{
411
- type: Input
412
- }], filterTagMargin: [{
413
- type: Input
414
- }], paginationMargin: [{
415
- type: Input
416
- }], inputSearch: [{
417
- type: Input
418
- }], searchDelay: [{
419
- type: Input
420
- }], searchTermMinLength: [{
421
- type: Input
422
- }], searchTermOnEnter: [{
423
- type: Input
424
- }], defaultFilters: [{
425
- type: Input
426
- }], filtersDescription: [{
427
- type: Input
428
- }], canSelectAllRegisters: [{
429
- type: Input
430
- }], onDataChange: [{
431
- type: Output
432
- }], onClearFilter: [{
433
- type: Output
434
- }], onClearSelectedElements: [{
435
- type: Output
436
- }], onSelectedElementsChange: [{
437
- type: Output
438
- }], onToogleAllCheckboxes: [{
439
- type: Output
440
- }], onToogleCheckbox: [{
441
- type: Output
442
- }], onSelectAllRegisters: [{
443
- type: Output
444
- }], onOpenSearchModal: [{
445
- type: Output
446
- }], onSearch: [{
447
- type: Output
448
- }] } });
449
- export var NgtDatatableType;
450
- (function (NgtDatatableType) {
451
- NgtDatatableType["REMOTE"] = "REMOTE";
452
- NgtDatatableType["FIXED"] = "FIXED";
453
- })(NgtDatatableType || (NgtDatatableType = {}));
454
- export var NgtDatatableSearchType;
455
- (function (NgtDatatableSearchType) {
456
- NgtDatatableSearchType["DEFAULT"] = "DEFAULT";
457
- NgtDatatableSearchType["SILENT"] = "SILENT";
458
- })(NgtDatatableSearchType || (NgtDatatableSearchType = {}));
459
- export var NgtDatatableParam;
460
- (function (NgtDatatableParam) {
461
- NgtDatatableParam[NgtDatatableParam["STAY_IN_PAGE"] = 1] = "STAY_IN_PAGE";
462
- NgtDatatableParam[NgtDatatableParam["RESET_PAGE"] = 0] = "RESET_PAGE";
463
- NgtDatatableParam[NgtDatatableParam["ENABLE_LOADER"] = 1] = "ENABLE_LOADER";
464
- NgtDatatableParam[NgtDatatableParam["DISABLE_LOADER"] = 0] = "DISABLE_LOADER";
465
- })(NgtDatatableParam || (NgtDatatableParam = {}));
466
- export class NgtCheckedElement {
467
- }
468
- export class NgtCustomFilter {
469
- }
470
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LWRhdGF0YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy10YWlsd2luZC9zcmMvY29tcG9uZW50cy9uZ3QtZGF0YXRhYmxlL25ndC1kYXRhdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdGFpbHdpbmQvc3JjL2NvbXBvbmVudHMvbmd0LWRhdGF0YWJsZS9uZ3QtZGF0YXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxTQUFTLEVBRVQsWUFBWSxFQUVaLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUdOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQU01RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzREFBc0QsQ0FBQzs7Ozs7Ozs7OztBQU81RixNQUFNLE9BQU8scUJBQXFCO0lBd0Q5QixZQUNZLFFBQWtCLEVBQ2xCLGNBQThCLEVBQzlCLGNBQWlDLEVBRWxDLG1CQUF3QztRQUp2QyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFFbEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQXZEbkMsU0FBSSxHQUFxQixnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7UUFDakQscUJBQWdCLEdBQVcsYUFBYSxDQUFDO1FBQ3pDLG9CQUFlLEdBQVcsTUFBTSxDQUFDO1FBQ2pDLHFCQUFnQixHQUFXLGNBQWMsQ0FBQztRQUUxQyxnQkFBVyxHQUFXLEdBQUcsQ0FBQztRQUMxQix3QkFBbUIsR0FBVyxDQUFDLENBQUM7UUFDaEMsc0JBQWlCLEdBQVksSUFBSSxDQUFDO1FBQ2xDLG1CQUFjLEdBQVEsRUFBRSxD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ckMsTUFBTTtnQkFDVSxnQkFBZ0I7c0JBQWhDLE1BQU07Z0JBQ1Usb0JBQW9CO3NCQUFwQyxNQUFNO2dCQUNVLGlCQUFpQjtzQkFBakMsTUFBTTtnQkFDVSxRQUFRO3NCQUF4QixNQUFNOztBQWdkWCxNQUFNLENBQU4sSUFBWSxnQkFHWDtBQUhELFdBQVksZ0JBQWdCO0lBQ3hCLHFDQUFpQixDQUFBO0lBQ2pCLG1DQUFlLENBQUE7QUFDbkIsQ0FBQyxFQUhXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFHM0I7QUFFRCxNQUFNLENBQU4sSUFBWSxzQkFHWDtBQUhELFdBQVksc0JBQXNCO0lBQzlCLDZDQUFtQixDQUFBO0lBQ25CLDJDQUFpQixDQUFBO0FBQ3JCLENBQUMsRUFIVyxzQkFBc0IsS0FBdEIsc0JBQXNCLFFBR2pDO0FBRUQsTUFBTSxDQUFOLElBQVksaUJBS1g7QUFMRCxXQUFZLGlCQUFpQjtJQUN6Qix5RUFBZ0IsQ0FBQTtJQUNoQixxRUFBYyxDQUFBO0lBQ2QsMkVBQWlCLENBQUE7SUFDakIsNkVBQWtCLENBQUE7QUFDdEIsQ0FBQyxFQUxXLGlCQUFpQixLQUFqQixpQkFBaUIsUUFLNUI7QUFFRCxNQUFNLE9BQU8saUJBQWlCO0NBSTdCO0FBRUQsTUFBTSxPQUFPLGVBQWU7Q0FJM0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbmplY3RvcixcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgZ2V0RW51bUZyb21TdHJpbmcgfSBmcm9tICcuLi8uLi9oZWxwZXJzL2VudW0vZW51bSc7XG5pbXBvcnQgeyBOZ3RIdHRwUGFnaW5hdGlvbiwgTmd0SHR0cFJlc3BvbnNlLCBOZ3RIdHRwU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2h0dHAvbmd0LWh0dHAuc2VydmljZSc7XG5pbXBvcnQgeyBOZ3RUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaHR0cC9uZ3QtdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd0SW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi9uZ3QtaW5wdXQvbmd0LWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ3RNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL25ndC1tb2RhbC9uZ3QtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IE5ndFBhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi9uZ3QtcGFnaW5hdGlvbi9uZ3QtcGFnaW5hdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmd0U3R5bGl6YWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9uZ3Qtc3R5bGl6YWJsZS9uZ3Qtc3R5bGl6YWJsZS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3QtZGF0YXRhYmxlJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbmd0LWRhdGF0YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vbmd0LWRhdGF0YWJsZS5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTmd0RGF0YXRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIEBWaWV3Q2hpbGQoJ3RhYmxlJywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIHRhYmxlOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ25ndFBhZ2luYXRpb24nLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgbmd0UGFnaW5hdGlvbjogTmd0UGFnaW5hdGlvbkNvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKCdzZWFyY2hNb2RhbCcsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBzZWFyY2hNb2RhbDogTmd0TW9kYWxDb21wb25lbnQ7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgcmVtb3RlUmVzb3VyY2U6IGFueTtcbiAgICBASW5wdXQoKSBwdWJsaWMgdHlwZTogTmd0RGF0YXRhYmxlVHlwZSA9IE5ndERhdGF0YWJsZVR5cGUuUkVNT1RFO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBmaWx0ZXJUYWdCZ0NvbG9yOiBzdHJpbmcgPSAnYmctYmx1ZS01MDAnO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBmaWx0ZXJUYWdNYXJnaW46IHN0cmluZyA9ICdtYi00JztcbiAgICBASW5wdXQoKSBwdWJsaWMgcGFnaW5hdGlvbk1hcmdpbjogc3RyaW5nID0gJ210LTIgbWQ6bXQtOCc7XG4gICAgQElucHV0KCkgcHVibGljIGlucHV0U2VhcmNoOiBOZ3RJbnB1dENvbXBvbmVudDtcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VhcmNoRGVsYXk6IG51bWJlciA9IDUwMDtcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VhcmNoVGVybU1pbkxlbmd0aDogbnVtYmVyID0gMTtcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VhcmNoVGVybU9uRW50ZXI6IGJvb2xlYW4gPSB0cnVlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkZWZhdWx0RmlsdGVyczogYW55ID0ge307XG4gICAgQElucHV0KCkgcHVibGljIGZpbHRlcnNEZXNjcmlwdGlvbiA9IHt9O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjYW5TZWxlY3RBbGxSZWdpc3RlcnM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25EYXRhQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uQ2xlYXJGaWx0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25DbGVhclNlbGVjdGVkRWxlbWVudHM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25TZWxlY3RlZEVsZW1lbnRzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8QXJyYXk8Tmd0Q2hlY2tlZEVsZW1lbnQ+PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uVG9vZ2xlQWxsQ2hlY2tib3hlczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvblRvb2dsZUNoZWNrYm94OiBFdmVudEVtaXR0ZXI8Tmd0Q2hlY2tlZEVsZW1lbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25TZWxlY3RBbGxSZWdpc3RlcnM6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uT3BlblNlYXJjaE1vZGFsOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uU2VhcmNoOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIHB1YmxpYyBzZWFyY2hNb2RhbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIHB1YmxpYyBkYXRhID0gW107XG4gICAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcbiAgICBwdWJsaWMgY2xlYW5pbmdGaWx0ZXIgPSBmYWxzZTtcbiAgICBwdWJsaWMgY29tcG9uZW50UmVhZHkgPSBmYWxzZTtcbiAgICBwdWJsaWMgZmlsdGVyc1RyYW5zbGF0ZWQgPSBbXTtcbiAgICBwdWJsaWMgZW1wdHlTdGF0ZVZpc2libGU6IGJvb2xlYW47XG4gICAgcHVibGljIGNvbHVtbkNvdW50ID0gW107XG4gICAgcHVibGljIGhhc1NlbGVjdGVkQWxsRWxlbWVudHM6IGJvb2xlYW47XG4gICAgcHVibGljIHNlbGVjdGVkRWxlbWVudHM6IEFycmF5PE5ndENoZWNrZWRFbGVtZW50PiA9IFtdO1xuXG4gICAgcHVibGljIGZpbHRlck1vZGFsU3R5bGU6IE5ndFN0eWxpemFibGVTZXJ2aWNlID0gbmV3IE5ndFN0eWxpemFibGVTZXJ2aWNlKCk7XG5cbiAgICBwcml2YXRlIHNlYXJjaGluZzogYm9vbGVhbjtcbiAgICBwcml2YXRlIHNlYXJjaFRpbWVvdXQ6IGFueTtcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IEFycmF5PFN1YnNjcmlwdGlvbj4gPSBbXTtcbiAgICBwcml2YXRlIGN1cnJlbnRTdGF0ZSA9IHtcbiAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnM6IHt9LFxuICAgICAgICAgICAgc2lsZW50RmlsdGVyczoge30sXG4gICAgICAgICAgICBxdWFsaWZpZWRGaWx0ZXJzOiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAgc29ydDoge1xuICAgICAgICAgICAgZmllbGQ6ICcnLFxuICAgICAgICAgICAgZGlyZWN0aW9uOiAnJ1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgbmd0SHR0cFNlcnZpY2U6IE5ndEh0dHBTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgcHVibGljIG5ndFRyYW5zbGF0ZVNlcnZpY2U6IE5ndFRyYW5zbGF0ZVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RhbFN0eWxlLmxvYWQodGhpcy5pbmplY3RvciwgJ0ZpbHRlck1vZGFsJywge1xuICAgICAgICAgICAgdzogJ21kOm1heC13LW1kJyxcbiAgICAgICAgICAgIHB5OiAncHktNCcsXG4gICAgICAgICAgICBweDogJ3B4LTYnLFxuICAgICAgICAgICAgYm9yZGVyOiAnYm9yZGVyIGJvcmRlci10ZWFsLTUwMCcsXG4gICAgICAgICAgICBvdmVyZmxvdzogJ292ZXJmbG93LXZpc2libGUnLFxuICAgICAgICAgICAgY29sb3I6IHt9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGFibGUgJiYgdGhpcy50YWJsZS5uYXRpdmVFbGVtZW50ICYmIHRoaXMudGFibGUubmF0aXZlRWxlbWVudC5yb3dzXG4gICAgICAgICAgICAmJiB0aGlzLnRhYmxlLm5hdGl2ZUVsZW1lbnQucm93c1swXSAmJiB0aGlzLnRhYmxlLm5hdGl2ZUVsZW1lbnQucm93c1swXS5jZWxscykge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5Db3VudCA9IHRoaXMudGFibGUubmF0aXZlRWxlbWVudC5yb3dzWzBdLmNlbGxzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5wdXRTZWFyY2gpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdFNlYXJjaFdpdGhJbnB1dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0Q2hlY2tib3hFdmVudCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaERlbGF5ID09IDUwMCkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hEZWxheSA9IHRoaXMuaW5qZWN0b3IuZ2V0KCdOZ3REYXRhdGFibGVTZWFyY2hEZWxheScsIDUwMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWFyY2hUZXJtTWluTGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVGVybU1pbkxlbmd0aCA9IHRoaXMuaW5qZWN0b3IuZ2V0KCdOZ3REYXRhdGFibGVTZWFyY2hUZXJtTWluTGVuZ3RoJywgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveVN1YnNjcmlwdGlvbnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0U2VhcmNoTW9kYWxUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55Pikge1xuICAgICAgICB0aGlzLnNlYXJjaE1vZGFsVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3BlblNlYXJjaE1vZGFsKHJlZmVyZW5jZT86IHN0cmluZykge1xuICAgICAgICB0aGlzLnNlYXJjaE1vZGFsLm9wZW4oKTtcbiAgICAgICAgdGhpcy5vbk9wZW5TZWFyY2hNb2RhbC5lbWl0KHJlZmVyZW5jZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyU2VsZWN0ZWRFbGVtZW50cygpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzID0gW107XG4gICAgICAgIHRoaXMub25DbGVhclNlbGVjdGVkRWxlbWVudHMuZW1pdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDdXJyZW50U3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdCgpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWFkeSA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlYXJjaChcbiAgICAgICAgZmlsdGVyczogT2JqZWN0LFxuICAgICAgICBzZWFyY2hUeXBlOiBOZ3REYXRhdGFibGVTZWFyY2hUeXBlID0gTmd0RGF0YXRhYmxlU2VhcmNoVHlwZS5ERUZBVUxULFxuICAgICAgICBhcHBseURlbGF5T25TZWFyY2g6IGJvb2xlYW4gPSB0cnVlXG4gICAgKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbkFwcGx5RmlsdGVycyhmaWx0ZXJzKSkge1xuICAgICAgICAgICAgdGhpcy5vblNlYXJjaC5lbWl0KGZpbHRlcnMpO1xuXG4gICAgICAgICAgICBpZiAoc2VhcmNoVHlwZSA9PSBOZ3REYXRhdGFibGVTZWFyY2hUeXBlLkRFRkFVTFQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzID0geyAuLi50aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzLCAuLi5maWx0ZXJzIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuc2lsZW50RmlsdGVycyA9IHsgLi4udGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzLCAuLi5maWx0ZXJzIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzRGVzY3JpcHRpb24oKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHkoMSwgYXBwbHlEZWxheU9uU2VhcmNoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzb3J0KGZpZWxkOiBhbnksIGRpcmVjdGlvbjogYW55KSB7XG4gICAgICAgIHRoaXMuY3VycmVudFN0YXRlLnNvcnQgPSB7XG4gICAgICAgICAgICBmaWVsZDogZmllbGQsXG4gICAgICAgICAgICBkaXJlY3Rpb246IGRpcmVjdGlvblxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5KHRoaXMubmd0UGFnaW5hdGlvbi5nZXRDdXJyZW50UGFnZSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVmcmVzaChzdGF5SW5QYWdlOiBOZ3REYXRhdGFibGVQYXJhbSA9IE5ndERhdGF0YWJsZVBhcmFtLlJFU0VUX1BBR0UsIGxvYWRlcjogTmd0RGF0YXRhYmxlUGFyYW0gPSBOZ3REYXRhdGFibGVQYXJhbS5FTkFCTEVfTE9BREVSKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5KFxuICAgICAgICAgICAgc3RheUluUGFnZSA/IHRoaXMubmd0UGFnaW5hdGlvbi5nZXRDdXJyZW50UGFnZSgpIDogMSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgbG9hZGVyXG4gICAgICAgICkudGhlbigoKSA9PiAhdGhpcy5kYXRhPy5sZW5ndGggPyB0aGlzLmFwcGx5KDEsIGZhbHNlKSA6IG51bGwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDdXJyZW50U29ydCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLnNvcnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFBlclBhZ2UocGVyUGFnZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMubmd0UGFnaW5hdGlvbi5vblJlZ2lzdGVyc1BlclBhZ2VDaGFuZ2UocGVyUGFnZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFwcGx5RmlsdGVyc0Rlc2NyaXB0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuY2xlYW5pbmdGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyc1RyYW5zbGF0ZWQgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgcmVmZXJlbmNlIGluIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzRGVzY3JpcHRpb25bcmVmZXJlbmNlXSAmJiB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzW3JlZmVyZW5jZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzVHJhbnNsYXRlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnNbcmVmZXJlbmNlXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uOiB0aGlzLmZpbHRlcnNEZXNjcmlwdGlvbltyZWZlcmVuY2VdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRGaWx0ZXJEZXNjcmlwdGlvbihyZWZlcmVuY2U6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZykge1xuICAgICAgICB0aGlzLmZpbHRlcnNEZXNjcmlwdGlvbltyZWZlcmVuY2VdID0gZGVzY3JpcHRpb247XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZUZpbHRlcihyZWZlcmVuY2U/OiBzdHJpbmcsIHJlZnJlc2g6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGlmIChyZWZlcmVuY2UgJiYgIXRoaXMuaGFzQXBwbGllZEZpbHRlcihyZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jbGVhbmluZ0ZpbHRlciA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmICghcmVmZXJlbmNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVycyA9IHt9O1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuc2lsZW50RmlsdGVycyA9IHt9O1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyc1RyYW5zbGF0ZWQgPSBbXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnNbcmVmZXJlbmNlXTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzW3JlZmVyZW5jZV07XG5cbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnNUcmFuc2xhdGVkID0gdGhpcy5maWx0ZXJzVHJhbnNsYXRlZC5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50ICYmIGVsZW1lbnQucmVmZXJlbmNlICE9PSByZWZlcmVuY2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm9uQ2xlYXJGaWx0ZXIuZW1pdChyZWZlcmVuY2UpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dFNlYXJjaCAmJiAocmVmZXJlbmNlID09PSAndGVybScgfHwgIXJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0U2VhcmNoLmNsZWFySW5wdXQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlZnJlc2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseSh0aGlzLm5ndFBhZ2luYXRpb24uZ2V0Q3VycmVudFBhZ2UoKSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYW5pbmdGaWx0ZXIgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzQXBwbGllZEZpbHRlcihmaWx0ZXI6IE9iamVjdCB8IE5ndEN1c3RvbUZpbHRlciB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByZWZlcmVuY2U6IHN0cmluZyA9IHR5cGVvZiBmaWx0ZXIgPT09ICdzdHJpbmcnID8gZmlsdGVyIDogT2JqZWN0LmtleXMoZmlsdGVyID8/IHt9KVswXTtcbiAgICAgICAgY29uc3QgYXBwbGllZEZpbHRlcnMgPSB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLnF1YWxpZmllZEZpbHRlcnM7XG5cbiAgICAgICAgcmV0dXJuICEhT2JqZWN0LmtleXMoYXBwbGllZEZpbHRlcnMpLmZpbmQoa2V5ID0+IGtleSA9PSByZWZlcmVuY2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNBcHBsaWVkRmlsdGVycyhzZWFyY2hUeXBlOiBOZ3REYXRhdGFibGVTZWFyY2hUeXBlID0gTmd0RGF0YXRhYmxlU2VhcmNoVHlwZS5ERUZBVUxUKSB7XG4gICAgICAgIGxldCBhcHBsaWVkRmlsdGVycyA9IHt9O1xuXG4gICAgICAgIGlmIChzZWFyY2hUeXBlID09IE5ndERhdGF0YWJsZVNlYXJjaFR5cGUuREVGQVVMVCkge1xuICAgICAgICAgICAgYXBwbGllZEZpbHRlcnMgPSB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzO1xuICAgICAgICB9IGVsc2UgaWYgKHNlYXJjaFR5cGUgPT0gTmd0RGF0YXRhYmxlU2VhcmNoVHlwZS5TSUxFTlQpIHtcbiAgICAgICAgICAgIGFwcGxpZWRGaWx0ZXJzID0gdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXBwbGllZEZpbHRlcnMgPSB7IC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnMsIC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuc2lsZW50RmlsdGVycyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhT2JqZWN0LnZhbHVlcyhhcHBsaWVkRmlsdGVycyk/LmZpbmQoZmlsdGVyID0+ICEhZmlsdGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlcy5pbnB1dFNlYXJjaCkge1xuICAgICAgICAgICAgaWYgKGNoYW5nZXMuaW5wdXRTZWFyY2guY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0U2VhcmNoV2l0aElucHV0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlcy50eXBlKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSBnZXRFbnVtRnJvbVN0cmluZyhjaGFuZ2VzLnR5cGUuY3VycmVudFZhbHVlLCBOZ3REYXRhdGFibGVUeXBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhcHBseShwYWdlID0gMSwgYXBwbHlEZWxheU9uU2VhcmNoOiBib29sZWFuID0gdHJ1ZSwgbG9hZGVyOiBOZ3REYXRhdGFibGVQYXJhbSA9IE5ndERhdGF0YWJsZVBhcmFtLkVOQUJMRV9MT0FERVIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlYWR5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWFyY2hUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2VhcmNoVGltZW91dCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubmd0UGFnaW5hdGlvbi5kaXNwbGF5UGFnaW5hdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzID0gW107XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09IE5ndERhdGF0YWJsZVR5cGUuUkVNT1RFKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVtb3RlUmVzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmluZFZpc2liaWxpdHlBdHRyaWJ1dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoYXBwbHlEZWxheU9uU2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWREYXRhKHBhZ2UpLnRoZW4oKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2VhcmNoRGVsYXkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkRGF0YShwYWdlKS50aGVuKCgpID0+IHJlc29sdmUoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUaGUgcHJvcGVydHkgW3JlbW90ZVJlc291cmNlXSBuZWVkcyB0byBiZSBwcmVzZW50IHRvIGJlIGFibGUgdG8gbWFrZSByZW1vdGUgc2VhcmNoJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT0gTmd0RGF0YXRhYmxlVHlwZS5GSVhFRCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZFZpc2liaWxpdHlBdHRyaWJ1dGVzKCk7XG5cbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUYWdGaWx0ZXJWYWx1ZShmaWx0ZXI6IGFueSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGZpbHRlcnNUYWcgPSB0aGlzLmdldEZpbHRlcnNUYWdBcnJheShmaWx0ZXIpO1xuXG4gICAgICAgIHJldHVybiBmaWx0ZXJzVGFnLmxlbmd0aCA+IDFcbiAgICAgICAgICAgID8gZmlsdGVyc1RhZ1swXSArIFwiICtcIlxuICAgICAgICAgICAgOiBmaWx0ZXJzVGFnWzBdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUaXRsZShmaWx0ZXI6IGFueSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGZpbHRlcnNUYWcgPSB0aGlzLmdldEZpbHRlcnNUYWdBcnJheShmaWx0ZXIpO1xuXG4gICAgICAgIHJldHVybiBmaWx0ZXJzVGFnLmxlbmd0aCA+IDFcbiAgICAgICAgICAgID8gZmlsdGVyc1RhZy5zbGljZSgxKS5qb2luKFwiLFwiKVxuICAgICAgICAgICAgOiAnJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZpbHRlcnNUYWdBcnJheShmaWx0ZXI6IGFueSk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgdGFnID0gZmlsdGVyPy52YWx1ZT8udGFnVmFsdWUgPyBmaWx0ZXIudmFsdWUudGFnVmFsdWUgOiBmaWx0ZXIudmFsdWU7XG5cbiAgICAgICAgcmV0dXJuIHRhZy5zcGxpdChcIixcIik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkRGF0YShwYWdlOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2luYXRpb246IE5ndEh0dHBQYWdpbmF0aW9uID0geyAuLi50aGlzLm5ndFBhZ2luYXRpb24uZ2V0UGFnaW5hdGlvbigpLCAuLi57IHBhZ2U6IHBhZ2UgfSB9O1xuXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLnF1YWxpZmllZEZpbHRlcnMgPSB0aGlzLmdldFF1YWxpZmllZEZpbHRlcnMoKTtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoaW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXRTZWFyY2gpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0U2VhcmNoLmlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICB0aGlzLm5ndEh0dHBTZXJ2aWNlLmdldChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdGVSZXNvdXJjZSwgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5xdWFsaWZpZWRGaWx0ZXJzLCBwYWdpbmF0aW9uLCB0aGlzLmN1cnJlbnRTdGF0ZS5zb3J0XG4gICAgICAgICAgICAgICAgKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAgIChyZXNwb25zZTogTmd0SHR0cFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2NjZXNzUmVtb3RlUmVzcG9uc2UocmVzcG9uc2UuZGF0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5tZXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ3RQYWdpbmF0aW9uLnByb2NjZXNzUGFnaW5hdGlvbihyZXNwb25zZS5tZXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnB1dFNlYXJjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2guaXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRGF0YUNoYW5nZS5lbWl0KHRoaXMuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmRWaXNpYmlsaXR5QXR0cmlidXRlcygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2guaXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRRdWFsaWZpZWRGaWx0ZXJzKCkge1xuICAgICAgICBjb25zdCBxdWFsaWZpZWRGaWx0ZXJzID0ge307XG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZEZpbHRlcnMgPSB7IC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnMsIC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuc2lsZW50RmlsdGVycyB9O1xuXG4gICAgICAgIGlmIChyZXF1ZXN0ZWRGaWx0ZXJzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBpbiByZXF1ZXN0ZWRGaWx0ZXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gcmVxdWVzdGVkRmlsdGVyc1tyZWZlcmVuY2VdO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZEZpbHRlcihmaWx0ZXIsIHJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlciBpbnN0YW5jZW9mIE5ndEN1c3RvbUZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci50YWdMYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyc0Rlc2NyaXB0aW9uW3JlZmVyZW5jZV0gPSBmaWx0ZXIudGFnTGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcnNEZXNjcmlwdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWRGaWx0ZXJzW3JlZmVyZW5jZV0gPSBmaWx0ZXIudGVybTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZEZpbHRlcnNbcmVmZXJlbmNlXSA9IGZpbHRlcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxdWFsaWZpZWRGaWx0ZXJzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZFZpc2liaWxpdHlBdHRyaWJ1dGVzKCkge1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICBpZiAodGhpcy50eXBlID09IE5ndERhdGF0YWJsZVR5cGUuUkVNT1RFICYmICF0aGlzLmRhdGEubGVuZ3RoICYmICF0aGlzLmxvYWRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZW1wdHlTdGF0ZVZpc2libGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PSBOZ3REYXRhdGFibGVUeXBlLkZJWEVEKSB7XG4gICAgICAgICAgICB0aGlzLmVtcHR5U3RhdGVWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVtcHR5U3RhdGVWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2NjZXNzUmVtb3RlUmVzcG9uc2UocmVzcG9uc2U6IGFueSkge1xuICAgICAgICB0aGlzLmRhdGEgPSByZXNwb25zZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRTZWFyY2hXaXRoSW5wdXQoKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5pbnB1dFNlYXJjaC5vblZhbHVlQ2hhbmdlKCkuc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnNbJ3Rlcm0nXSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZpbHRlcigndGVybScpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA8IHRoaXMuc2VhcmNoVGVybU1pbkxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnNbJ3Rlcm0nXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2goeyB0ZXJtOiAnJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gdGhpcy5zZWFyY2hUZXJtTWluTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoKHsgdGVybTogdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhpcy5zZWFyY2hUZXJtT25FbnRlcikge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFNlYXJjaC5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSAxMykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnB1dFNlYXJjaC52YWx1ZSAmJiB0aGlzLmlucHV0U2VhcmNoLnZhbHVlLmxlbmd0aCA+PSB0aGlzLnNlYXJjaFRlcm1NaW5MZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHkoMSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRDaGVja2JveEV2ZW50KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgIHRoaXMub25Ub29nbGVDaGVja2JveC5zdWJzY3JpYmUoKGNoZWNrZWRFbGVtZW50OiBOZ3RDaGVja2VkRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50cyA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50cy5maWx0ZXIoaXRlbSA9PiBpdGVtLmlkICE9PSBjaGVja2VkRWxlbWVudC5pZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZEVsZW1lbnQuY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudHMucHVzaChjaGVja2VkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdGVkRWxlbWVudHNDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkRWxlbWVudHMpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgIHRoaXMub25TZWxlY3RBbGxSZWdpc3RlcnMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc1NlbGVjdGVkQWxsRWxlbWVudHMgPSAhdGhpcy5oYXNTZWxlY3RlZEFsbEVsZW1lbnRzO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmhhc1NlbGVjdGVkQWxsRWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbkFwcGx5RmlsdGVycyhmaWx0ZXJzOiBPYmplY3QpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlYXJjaGluZykge1xuICAgICAgICAgICAgZm9yIChjb25zdCByZWZlcmVuY2UgaW4gZmlsdGVycykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWRGaWx0ZXIoZmlsdGVyc1tyZWZlcmVuY2VdLCByZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzVmFsaWRGaWx0ZXIoZmlsdGVyOiBzdHJpbmcgfCBOZ3RDdXN0b21GaWx0ZXIsIHJlZmVyZW5jZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGhhc1ZhbHVlOiBib29sZWFuID0gISEoKGZpbHRlciBpbnN0YW5jZW9mIE5ndEN1c3RvbUZpbHRlciAmJiBmaWx0ZXIudGVybSkgfHwgZmlsdGVyKTtcbiAgICAgICAgY29uc3QgaXNBcHBsaWVkOiBib29sZWFuID0gdGhpcy5oYXNBcHBsaWVkRmlsdGVyKHJlZmVyZW5jZSk7XG5cbiAgICAgICAgcmV0dXJuIGlzQXBwbGllZCB8fCAoIWlzQXBwbGllZCAmJiBoYXNWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXN0cm95U3Vic2NyaXB0aW9ucygpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goc3Vic2NyaXB0aW9uID0+IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gW107XG4gICAgfVxufVxuXG5leHBvcnQgZW51bSBOZ3REYXRhdGFibGVUeXBlIHtcbiAgICBSRU1PVEUgPSAnUkVNT1RFJyxcbiAgICBGSVhFRCA9ICdGSVhFRCdcbn1cblxuZXhwb3J0IGVudW0gTmd0RGF0YXRhYmxlU2VhcmNoVHlwZSB7XG4gICAgREVGQVVMVCA9ICdERUZBVUxUJyxcbiAgICBTSUxFTlQgPSAnU0lMRU5UJyxcbn1cblxuZXhwb3J0IGVudW0gTmd0RGF0YXRhYmxlUGFyYW0ge1xuICAgIFNUQVlfSU5fUEFHRSA9IDEsXG4gICAgUkVTRVRfUEFHRSA9IDAsXG4gICAgRU5BQkxFX0xPQURFUiA9IDEsXG4gICAgRElTQUJMRV9MT0FERVIgPSAwXG59XG5cbmV4cG9ydCBjbGFzcyBOZ3RDaGVja2VkRWxlbWVudCB7XG4gICAgcHVibGljIGlkOiBzdHJpbmc7XG4gICAgcHVibGljIGNoZWNrZWQ6IGJvb2xlYW47XG4gICAgcHVibGljIHJlZmVyZW5jZTogYW55O1xufVxuXG5leHBvcnQgY2xhc3MgTmd0Q3VzdG9tRmlsdGVyIHtcbiAgICBwdWJsaWMgdGVybTogc3RyaW5nO1xuICAgIHB1YmxpYyB0YWdWYWx1ZTogc3RyaW5nO1xuICAgIHB1YmxpYyB0YWdMYWJlbD86IHN0cmluZztcbn1cbiIsIjxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgdy1mdWxsXCI+XG4gICAgICAgIDxuZ3QtdGFnICpuZ0lmPVwiaGFzQXBwbGllZEZpbHRlcnMoKVwiIGNsYXNzPVwidy1mdWxsIHNtOnctYXV0byB7eyBmaWx0ZXJUYWdNYXJnaW4gfX1cIlxuICAgICAgICAgICAgW2NsYXNzLnNtOm1yLTRdPVwiZmlsdGVyVGFnTWFyZ2luID09ICdtYi00J1wiIGNvbG9yLmJnPVwiYmctcmVkLTUwMFwiIChjbGljayk9XCJyZW1vdmVGaWx0ZXIoKVwiIG5ndC1zdHlsaXphYmxlPlxuICAgICAgICAgICAgTGltcGFyIEZpbHRyb3NcbiAgICAgICAgPC9uZ3QtdGFnPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNBcHBsaWVkRmlsdGVycygpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgZmlsdGVyc1RyYW5zbGF0ZWRcIj5cbiAgICAgICAgICAgICAgICA8bmd0LXRhZyBjbGFzcz1cInctZnVsbCBzbTp3LWF1dG8ge3sgZmlsdGVyVGFnTWFyZ2luIH19XCIgW2NsYXNzLnNtOm1yLTRdPVwiZmlsdGVyVGFnTWFyZ2luID09ICdtYi00J1wiXG4gICAgICAgICAgICAgICAgICAgIFtjb2xvci5iZ109XCJmaWx0ZXJUYWdCZ0NvbG9yXCIgKGNsaWNrKT1cInJlbW92ZUZpbHRlcihmaWx0ZXIucmVmZXJlbmNlKVwiIG5ndC1zdHlsaXphYmxlXG4gICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJnZXRUaXRsZShmaWx0ZXIpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGZpbHRlci50cmFuc2xhdGlvbiArICc6ICcgKyBnZXRUYWdGaWx0ZXJWYWx1ZShmaWx0ZXIpIH19XG4gICAgICAgICAgICAgICAgPC9uZ3QtdGFnPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPHRhYmxlIHN0eWxlPVwiZGlzcGxheTogdGFibGU7XCIgY2xhc3M9XCJ0ZXh0LWxlZnQgdy1mdWxsIGJvcmRlci1jb2xsYXBzZSB0YWJsZS1yZXNwb25zaXZlXCIgI3RhYmxlPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC90YWJsZT5cblxuICAgIDxwICpuZ0lmPVwiZW1wdHlTdGF0ZVZpc2libGVcIiBjbGFzcz1cIm10LTggbXgtYXV0byBzZWxmLWNlbnRlciB0ZXh0LWNlbnRlciB0ZXh0LXhsXCI+XG4gICAgICAgIHt7IG5ndFRyYW5zbGF0ZVNlcnZpY2Uubmd0RGF0YXRhYmxlTm9EYXRhRm91bmQgfX1cbiAgICA8L3A+XG5cbiAgICA8ZGl2ICpuZ0lmPVwibG9hZGluZ1wiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpIG9mIFsxLCAyLCAzLCA0XVwiIGNsYXNzPVwiZmxleCB3LWZ1bGwgbXQtM1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbkNvdW50Lmxlbmd0aCA+PSAyXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaiBvZiBjb2x1bW5Db3VudDsgbGV0IGxhc3QgPSBsYXN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsYXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmd0LXNoaW5pbmcgY2xhc3M9XCJoLTEwIHctZnVsbFwiPjwvbmd0LXNoaW5pbmc+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5ndC1zaGluaW5nIGNsYXNzPVwiaC0xMCB3LWZ1bGwgbXItMTBcIj48L25ndC1zaGluaW5nPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uQ291bnQubGVuZ3RoIDwgMlwiPlxuICAgICAgICAgICAgICAgIDxuZ3Qtc2hpbmluZyBjbGFzcz1cImgtMTAgdy1mdWxsXCI+PC9uZ3Qtc2hpbmluZz5cbiAgICAgICAgICAgICAgICA8bmd0LXNoaW5pbmcgY2xhc3M9XCJoLTEwIHctZnVsbCBtci0xMCBtbC0xMFwiPjwvbmd0LXNoaW5pbmc+XG4gICAgICAgICAgICAgICAgPG5ndC1zaGluaW5nIGNsYXNzPVwiaC0xMCB3LWZ1bGxcIj48L25ndC1zaGluaW5nPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJjbGVhcmZpeCB7eyBwYWdpbmF0aW9uTWFyZ2luIH19XCIgW2hpZGRlbl09JyFkYXRhIHx8IGRhdGEubGVuZ3RoID09IDAnPlxuICAgIDxuZ3QtcGFnaW5hdGlvbiBbcGFnZXNJbnRlcnZhbF09JzQnIChvblBhZ2VDaGFuZ2UpPSdhcHBseSgkZXZlbnQsIGZhbHNlKScgKG9uUGVyUGFnZUNoYW5nZSk9J2FwcGx5KDEsIGZhbHNlKSdcbiAgICAgICAgI25ndFBhZ2luYXRpb24+XG4gICAgPC9uZ3QtcGFnaW5hdGlvbj5cbjwvZGl2PlxuXG48bmd0LW1vZGFsIFtjdXN0b21MYXlvdXRdPVwidHJ1ZVwiIFtpc0Rpc2FibGVkXT1cImZhbHNlXCIgW25ndFN0eWxlXT1cImZpbHRlck1vZGFsU3R5bGVcIiAjc2VhcmNoTW9kYWw+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlYXJjaE1vZGFsVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbjwvbmd0LW1vZGFsPiJdfQ==
1
+ import { Component, EventEmitter, Input, Optional, Output, ViewChild, } from '@angular/core';
2
+ import { getEnumFromString } from '../../helpers/enum/enum';
3
+ import { NgtStylizableService } from '../../services/ngt-stylizable/ngt-stylizable.service';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../services/http/ngt-http.service";
6
+ import * as i2 from "../../services/http/ngt-translate.service";
7
+ import * as i3 from "@angular/common";
8
+ import * as i4 from "../ngt-shining/ngt-shining.component";
9
+ import * as i5 from "../ngt-pagination/ngt-pagination.component";
10
+ import * as i6 from "../ngt-modal/ngt-modal.component";
11
+ import * as i7 from "../ngt-tag/ngt-tag.component";
12
+ import * as i8 from "../../directives/ngt-stylizable/ngt-stylizable.directive";
13
+ export class NgtDatatableComponent {
14
+ constructor(injector, ngtHttpService, changeDetector, ngtTranslateService) {
15
+ this.injector = injector;
16
+ this.ngtHttpService = ngtHttpService;
17
+ this.changeDetector = changeDetector;
18
+ this.ngtTranslateService = ngtTranslateService;
19
+ this.type = NgtDatatableType.REMOTE;
20
+ this.filterTagBgColor = 'bg-blue-500';
21
+ this.filterTagMargin = 'mb-4';
22
+ this.paginationMargin = 'mt-2 md:mt-8';
23
+ this.searchDelay = 500;
24
+ this.searchTermMinLength = 1;
25
+ this.searchTermOnEnter = true;
26
+ this.defaultFilters = {};
27
+ this.filtersDescription = {};
28
+ this.canSelectAllRegisters = false;
29
+ this.onDataChange = new EventEmitter();
30
+ this.onClearFilter = new EventEmitter();
31
+ this.onClearSelectedElements = new EventEmitter();
32
+ this.onSelectedElementsChange = new EventEmitter();
33
+ this.onToogleAllCheckboxes = new EventEmitter();
34
+ this.onToogleCheckbox = new EventEmitter();
35
+ this.onSelectAllRegisters = new EventEmitter();
36
+ this.onOpenSearchModal = new EventEmitter();
37
+ this.onSearch = new EventEmitter();
38
+ this.data = [];
39
+ this.loading = false;
40
+ this.cleaningFilter = false;
41
+ this.componentReady = false;
42
+ this.filtersTranslated = [];
43
+ this.columnCount = [];
44
+ this.selectedElements = [];
45
+ this.filterModalStyle = new NgtStylizableService();
46
+ this.subscriptions = [];
47
+ this.currentState = {
48
+ filters: {
49
+ defaultFilters: {},
50
+ silentFilters: {},
51
+ qualifiedFilters: {},
52
+ },
53
+ sort: {
54
+ field: '',
55
+ direction: ''
56
+ }
57
+ };
58
+ this.filterModalStyle.load(this.injector, 'FilterModal', {
59
+ w: 'md:max-w-md',
60
+ py: 'py-4',
61
+ px: 'px-6',
62
+ border: 'border border-teal-500',
63
+ overflow: 'overflow-visible',
64
+ color: {}
65
+ });
66
+ }
67
+ ngOnInit() {
68
+ if (this.table && this.table.nativeElement && this.table.nativeElement.rows
69
+ && this.table.nativeElement.rows[0] && this.table.nativeElement.rows[0].cells) {
70
+ this.columnCount = this.table.nativeElement.rows[0].cells;
71
+ }
72
+ if (this.inputSearch) {
73
+ this.initSearchWithInput();
74
+ }
75
+ this.initCheckboxEvent();
76
+ if (this.searchDelay == 500) {
77
+ this.searchDelay = this.injector.get('NgtDatatableSearchDelay', 500);
78
+ }
79
+ if (this.searchTermMinLength == 1) {
80
+ this.searchTermMinLength = this.injector.get('NgtDatatableSearchTermMinLength', 1);
81
+ }
82
+ }
83
+ ngOnDestroy() {
84
+ this.destroySubscriptions();
85
+ }
86
+ setSearchModalTemplate(template) {
87
+ this.searchModalTemplate = template;
88
+ }
89
+ openSearchModal(reference) {
90
+ this.searchModal.open();
91
+ this.onOpenSearchModal.emit(reference);
92
+ }
93
+ clearSelectedElements() {
94
+ this.selectedElements = [];
95
+ this.onClearSelectedElements.emit();
96
+ }
97
+ getCurrentState() {
98
+ return this.currentState;
99
+ }
100
+ init() {
101
+ this.componentReady = true;
102
+ }
103
+ async search(filters, searchType = NgtDatatableSearchType.DEFAULT, applyDelayOnSearch = true) {
104
+ if (this.canApplyFilters(filters)) {
105
+ this.onSearch.emit(filters);
106
+ if (searchType == NgtDatatableSearchType.DEFAULT) {
107
+ this.currentState.filters.defaultFilters = { ...this.currentState.filters.defaultFilters, ...filters };
108
+ }
109
+ else {
110
+ this.currentState.filters.silentFilters = { ...this.currentState.filters.silentFilters, ...filters };
111
+ }
112
+ this.applyFiltersDescription();
113
+ return this.apply(1, applyDelayOnSearch);
114
+ }
115
+ }
116
+ async sort(field, direction) {
117
+ this.currentState.sort = {
118
+ field: field,
119
+ direction: direction
120
+ };
121
+ return this.apply(this.ngtPagination.getCurrentPage());
122
+ }
123
+ async refresh(stayInPage = NgtDatatableParam.RESET_PAGE, loader = NgtDatatableParam.ENABLE_LOADER) {
124
+ return this.apply(stayInPage ? this.ngtPagination.getCurrentPage() : 1, false, loader).then(() => !this.data?.length ? this.apply(1, false) : null);
125
+ }
126
+ getData() {
127
+ return this.data;
128
+ }
129
+ getCurrentSort() {
130
+ return this.currentState.sort;
131
+ }
132
+ setPerPage(perPage) {
133
+ this.ngtPagination.onRegistersPerPageChange(perPage);
134
+ }
135
+ applyFiltersDescription() {
136
+ if (!this.cleaningFilter) {
137
+ this.filtersTranslated = [];
138
+ for (let reference in this.currentState.filters.defaultFilters) {
139
+ if (this.filtersDescription[reference] && this.currentState.filters.defaultFilters[reference]) {
140
+ this.filtersTranslated.push({
141
+ reference: reference,
142
+ value: this.currentState.filters.defaultFilters[reference],
143
+ translation: this.filtersDescription[reference]
144
+ });
145
+ }
146
+ }
147
+ }
148
+ }
149
+ setFilterDescription(reference, description) {
150
+ this.filtersDescription[reference] = description;
151
+ }
152
+ async removeFilter(reference, refresh = true) {
153
+ return new Promise(resolve => {
154
+ if (reference && !this.hasAppliedFilter(reference)) {
155
+ return resolve();
156
+ }
157
+ this.cleaningFilter = true;
158
+ if (!reference) {
159
+ this.currentState.filters.defaultFilters = {};
160
+ this.currentState.filters.silentFilters = {};
161
+ this.filtersTranslated = [];
162
+ }
163
+ else {
164
+ delete this.currentState.filters.defaultFilters[reference];
165
+ delete this.currentState.filters.silentFilters[reference];
166
+ this.filtersTranslated = this.filtersTranslated.filter(element => element && element.reference !== reference);
167
+ }
168
+ this.onClearFilter.emit(reference);
169
+ if (this.inputSearch && (reference === 'term' || !reference)) {
170
+ this.inputSearch.clearInput();
171
+ }
172
+ if (refresh) {
173
+ return this.apply(this.ngtPagination.getCurrentPage(), false)
174
+ .then(() => {
175
+ this.cleaningFilter = false;
176
+ resolve();
177
+ });
178
+ }
179
+ resolve();
180
+ });
181
+ }
182
+ hasAppliedFilter(filter) {
183
+ const reference = typeof filter === 'string' ? filter : Object.keys(filter ?? {})[0];
184
+ const appliedFilters = this.currentState.filters.qualifiedFilters;
185
+ return !!Object.keys(appliedFilters).find(key => key == reference);
186
+ }
187
+ hasAppliedFilters(searchType = NgtDatatableSearchType.DEFAULT) {
188
+ let appliedFilters = {};
189
+ if (searchType == NgtDatatableSearchType.DEFAULT) {
190
+ appliedFilters = this.currentState.filters.defaultFilters;
191
+ }
192
+ else if (searchType == NgtDatatableSearchType.SILENT) {
193
+ appliedFilters = this.currentState.filters.silentFilters;
194
+ }
195
+ else {
196
+ appliedFilters = { ...this.currentState.filters.defaultFilters, ...this.currentState.filters.silentFilters };
197
+ }
198
+ return !!Object.values(appliedFilters)?.find(filter => !!filter);
199
+ }
200
+ ngOnChanges(changes) {
201
+ if (changes.inputSearch) {
202
+ if (changes.inputSearch.currentValue) {
203
+ this.initSearchWithInput();
204
+ }
205
+ }
206
+ if (changes.type) {
207
+ this.type = getEnumFromString(changes.type.currentValue, NgtDatatableType);
208
+ }
209
+ }
210
+ async apply(page = 1, applyDelayOnSearch = true, loader = NgtDatatableParam.ENABLE_LOADER) {
211
+ return new Promise(resolve => {
212
+ if (!this.componentReady) {
213
+ return resolve();
214
+ }
215
+ else if (this.searchTimeout) {
216
+ clearTimeout(this.searchTimeout);
217
+ }
218
+ this.ngtPagination.displayPagination = false;
219
+ this.selectedElements = [];
220
+ if (this.type === NgtDatatableType.REMOTE) {
221
+ if (this.remoteResource) {
222
+ if (loader) {
223
+ this.loading = true;
224
+ this.bindVisibilityAttributes();
225
+ }
226
+ if (applyDelayOnSearch) {
227
+ this.searchTimeout = setTimeout(() => {
228
+ this.loadData(page).then(() => resolve());
229
+ }, this.searchDelay);
230
+ }
231
+ else {
232
+ this.loadData(page).then(() => resolve());
233
+ }
234
+ }
235
+ else {
236
+ console.error('The property [remoteResource] needs to be present to be able to make remote search');
237
+ }
238
+ }
239
+ else if (this.type == NgtDatatableType.FIXED) {
240
+ this.bindVisibilityAttributes();
241
+ resolve();
242
+ }
243
+ });
244
+ }
245
+ getTagFilterValue(filter) {
246
+ const filtersTag = this.getFiltersTagArray(filter);
247
+ return filtersTag.length > 1
248
+ ? filtersTag[0] + " +"
249
+ : filtersTag[0];
250
+ }
251
+ getTitle(filter) {
252
+ const filtersTag = this.getFiltersTagArray(filter);
253
+ return filtersTag.length > 1
254
+ ? filtersTag.slice(1).join(",")
255
+ : '';
256
+ }
257
+ getFiltersTagArray(filter) {
258
+ const tag = filter?.value?.tagValue ? filter.value.tagValue : filter.value;
259
+ return tag.split(",");
260
+ }
261
+ loadData(page) {
262
+ return new Promise((resolve, reject) => {
263
+ const pagination = { ...this.ngtPagination.getPagination(), ...{ page: page } };
264
+ this.currentState.filters.qualifiedFilters = this.getQualifiedFilters();
265
+ this.searching = true;
266
+ if (this.inputSearch) {
267
+ this.inputSearch.isDisabled = true;
268
+ }
269
+ this.subscriptions.push(this.ngtHttpService.get(this.remoteResource, this.currentState.filters.qualifiedFilters, pagination, this.currentState.sort).subscribe((response) => {
270
+ this.proccessRemoteResponse(response.data);
271
+ if (response.meta) {
272
+ this.ngtPagination.proccessPagination(response.meta);
273
+ }
274
+ this.searching = false;
275
+ this.loading = false;
276
+ if (this.inputSearch) {
277
+ this.inputSearch.isDisabled = false;
278
+ }
279
+ this.onDataChange.emit(this.data);
280
+ this.bindVisibilityAttributes();
281
+ resolve();
282
+ }, (error) => {
283
+ console.error(error);
284
+ this.loading = false;
285
+ this.inputSearch.isDisabled = false;
286
+ this.changeDetector.detectChanges();
287
+ reject();
288
+ }));
289
+ });
290
+ }
291
+ getQualifiedFilters() {
292
+ const qualifiedFilters = {};
293
+ const requestedFilters = { ...this.currentState.filters.defaultFilters, ...this.currentState.filters.silentFilters };
294
+ if (requestedFilters) {
295
+ for (const reference in requestedFilters) {
296
+ const filter = requestedFilters[reference];
297
+ if (this.isValidFilter(filter, reference)) {
298
+ if (filter instanceof NgtCustomFilter) {
299
+ if (filter.tagLabel) {
300
+ this.filtersDescription[reference] = filter.tagLabel;
301
+ this.applyFiltersDescription();
302
+ }
303
+ qualifiedFilters[reference] = filter.term;
304
+ }
305
+ else {
306
+ qualifiedFilters[reference] = filter;
307
+ }
308
+ }
309
+ }
310
+ }
311
+ return qualifiedFilters;
312
+ }
313
+ bindVisibilityAttributes() {
314
+ this.changeDetector.detectChanges();
315
+ if (this.type == NgtDatatableType.REMOTE && !this.data.length && !this.loading) {
316
+ this.emptyStateVisible = true;
317
+ }
318
+ else if (this.type == NgtDatatableType.FIXED) {
319
+ this.emptyStateVisible = false;
320
+ }
321
+ else {
322
+ this.emptyStateVisible = false;
323
+ }
324
+ this.changeDetector.detectChanges();
325
+ }
326
+ proccessRemoteResponse(response) {
327
+ this.data = response;
328
+ }
329
+ initSearchWithInput() {
330
+ this.subscriptions.push(this.inputSearch.onValueChange().subscribe((value) => {
331
+ if (this.currentState.filters.defaultFilters['term']) {
332
+ if (!value) {
333
+ this.removeFilter('term');
334
+ }
335
+ else if (value.length < this.searchTermMinLength) {
336
+ delete this.currentState.filters.defaultFilters['term'];
337
+ this.search({ term: '' });
338
+ }
339
+ }
340
+ if (value.length >= this.searchTermMinLength) {
341
+ this.search({ term: value });
342
+ }
343
+ }));
344
+ if (this.searchTermOnEnter) {
345
+ this.inputSearch.element.nativeElement.addEventListener('keydown', (event) => {
346
+ event.stopImmediatePropagation();
347
+ if (event.keyCode == 13) {
348
+ if (this.inputSearch.value && this.inputSearch.value.length >= this.searchTermMinLength) {
349
+ this.apply(1, false);
350
+ }
351
+ }
352
+ });
353
+ }
354
+ }
355
+ initCheckboxEvent() {
356
+ this.subscriptions.push(this.onToogleCheckbox.subscribe((checkedElement) => {
357
+ this.selectedElements = this.selectedElements.filter(item => item.id !== checkedElement.id);
358
+ if (checkedElement.checked) {
359
+ this.selectedElements.push(checkedElement);
360
+ }
361
+ this.onSelectedElementsChange.emit(this.selectedElements);
362
+ }));
363
+ this.subscriptions.push(this.onSelectAllRegisters.subscribe(() => {
364
+ this.hasSelectedAllElements = !this.hasSelectedAllElements;
365
+ if (!this.hasSelectedAllElements) {
366
+ this.selectedElements = [];
367
+ }
368
+ }));
369
+ }
370
+ canApplyFilters(filters) {
371
+ if (!this.searching) {
372
+ for (const reference in filters) {
373
+ if (this.isValidFilter(filters[reference], reference)) {
374
+ return true;
375
+ }
376
+ }
377
+ }
378
+ return false;
379
+ }
380
+ isValidFilter(filter, reference) {
381
+ const hasValue = !!((filter instanceof NgtCustomFilter && filter.term) || filter);
382
+ const isApplied = this.hasAppliedFilter(reference);
383
+ return isApplied || (!isApplied && hasValue);
384
+ }
385
+ destroySubscriptions() {
386
+ this.subscriptions.forEach(subscription => subscription.unsubscribe());
387
+ this.subscriptions = [];
388
+ }
389
+ }
390
+ NgtDatatableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtDatatableComponent, deps: [{ token: i0.Injector }, { token: i1.NgtHttpService }, { token: i0.ChangeDetectorRef }, { token: i2.NgtTranslateService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
391
+ NgtDatatableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: NgtDatatableComponent, selector: "ngt-datatable", inputs: { remoteResource: "remoteResource", type: "type", filterTagBgColor: "filterTagBgColor", filterTagMargin: "filterTagMargin", paginationMargin: "paginationMargin", inputSearch: "inputSearch", searchDelay: "searchDelay", searchTermMinLength: "searchTermMinLength", searchTermOnEnter: "searchTermOnEnter", defaultFilters: "defaultFilters", filtersDescription: "filtersDescription", canSelectAllRegisters: "canSelectAllRegisters" }, outputs: { onDataChange: "onDataChange", onClearFilter: "onClearFilter", onClearSelectedElements: "onClearSelectedElements", onSelectedElementsChange: "onSelectedElementsChange", onToogleAllCheckboxes: "onToogleAllCheckboxes", onToogleCheckbox: "onToogleCheckbox", onSelectAllRegisters: "onSelectAllRegisters", onOpenSearchModal: "onOpenSearchModal", onSearch: "onSearch" }, viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true, static: true }, { propertyName: "ngtPagination", first: true, predicate: ["ngtPagination"], descendants: true, static: true }, { propertyName: "searchModal", first: true, predicate: ["searchModal"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, 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 [title]=\"getTitle(filter)\">\r\n {{ filter.translation + ': ' + getTagFilterValue(filter) }}\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 [customLayout]=\"true\" [isDisabled]=\"false\" [ngtStyle]=\"filterModalStyle\" #searchModal>\r\n <ng-container *ngTemplateOutlet=\"searchModalTemplate\"></ng-container>\r\n</ngt-modal>", 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"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.NgtShiningComponent, selector: "ngt-shining", inputs: ["shiningWidth"] }, { kind: "component", type: i5.NgtPaginationComponent, selector: "ngt-pagination", inputs: ["pagesInterval"], outputs: ["onPageChange", "onPerPageChange"] }, { kind: "component", type: i6.NgtModalComponent, selector: "ngt-modal", inputs: ["customLayout", "disableDefaultCloses", "isDisabled", "ngtStyle"], outputs: ["onCloseModal", "onOpenModal"] }, { kind: "component", type: i7.NgtTagComponent, selector: "ngt-tag", inputs: ["icon"] }, { kind: "directive", type: i8.NgtStylizableDirective, selector: "[ngt-stylizable]", inputs: ["color", "color.text", "color.bg", "color.border", "h", "w", "p", "px", "py", "pt", "pr", "pb", "pl", "m", "mx", "my", "mt", "mr", "mb", "ml", "border", "shadow", "rounded", "font", "text", "breakWords", "overflow", "position", "justifyContent", "cursor", "fontCase"] }] });
392
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtDatatableComponent, decorators: [{
393
+ type: Component,
394
+ args: [{ selector: 'ngt-datatable', 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 [title]=\"getTitle(filter)\">\r\n {{ filter.translation + ': ' + getTagFilterValue(filter) }}\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 [customLayout]=\"true\" [isDisabled]=\"false\" [ngtStyle]=\"filterModalStyle\" #searchModal>\r\n <ng-container *ngTemplateOutlet=\"searchModalTemplate\"></ng-container>\r\n</ngt-modal>", 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"] }]
395
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.NgtHttpService }, { type: i0.ChangeDetectorRef }, { type: i2.NgtTranslateService, decorators: [{
396
+ type: Optional
397
+ }] }]; }, propDecorators: { table: [{
398
+ type: ViewChild,
399
+ args: ['table', { static: true }]
400
+ }], ngtPagination: [{
401
+ type: ViewChild,
402
+ args: ['ngtPagination', { static: true }]
403
+ }], searchModal: [{
404
+ type: ViewChild,
405
+ args: ['searchModal', { static: true }]
406
+ }], remoteResource: [{
407
+ type: Input
408
+ }], type: [{
409
+ type: Input
410
+ }], filterTagBgColor: [{
411
+ type: Input
412
+ }], filterTagMargin: [{
413
+ type: Input
414
+ }], paginationMargin: [{
415
+ type: Input
416
+ }], inputSearch: [{
417
+ type: Input
418
+ }], searchDelay: [{
419
+ type: Input
420
+ }], searchTermMinLength: [{
421
+ type: Input
422
+ }], searchTermOnEnter: [{
423
+ type: Input
424
+ }], defaultFilters: [{
425
+ type: Input
426
+ }], filtersDescription: [{
427
+ type: Input
428
+ }], canSelectAllRegisters: [{
429
+ type: Input
430
+ }], onDataChange: [{
431
+ type: Output
432
+ }], onClearFilter: [{
433
+ type: Output
434
+ }], onClearSelectedElements: [{
435
+ type: Output
436
+ }], onSelectedElementsChange: [{
437
+ type: Output
438
+ }], onToogleAllCheckboxes: [{
439
+ type: Output
440
+ }], onToogleCheckbox: [{
441
+ type: Output
442
+ }], onSelectAllRegisters: [{
443
+ type: Output
444
+ }], onOpenSearchModal: [{
445
+ type: Output
446
+ }], onSearch: [{
447
+ type: Output
448
+ }] } });
449
+ export var NgtDatatableType;
450
+ (function (NgtDatatableType) {
451
+ NgtDatatableType["REMOTE"] = "REMOTE";
452
+ NgtDatatableType["FIXED"] = "FIXED";
453
+ })(NgtDatatableType || (NgtDatatableType = {}));
454
+ export var NgtDatatableSearchType;
455
+ (function (NgtDatatableSearchType) {
456
+ NgtDatatableSearchType["DEFAULT"] = "DEFAULT";
457
+ NgtDatatableSearchType["SILENT"] = "SILENT";
458
+ })(NgtDatatableSearchType || (NgtDatatableSearchType = {}));
459
+ export var NgtDatatableParam;
460
+ (function (NgtDatatableParam) {
461
+ NgtDatatableParam[NgtDatatableParam["STAY_IN_PAGE"] = 1] = "STAY_IN_PAGE";
462
+ NgtDatatableParam[NgtDatatableParam["RESET_PAGE"] = 0] = "RESET_PAGE";
463
+ NgtDatatableParam[NgtDatatableParam["ENABLE_LOADER"] = 1] = "ENABLE_LOADER";
464
+ NgtDatatableParam[NgtDatatableParam["DISABLE_LOADER"] = 0] = "DISABLE_LOADER";
465
+ })(NgtDatatableParam || (NgtDatatableParam = {}));
466
+ export class NgtCheckedElement {
467
+ }
468
+ export class NgtCustomFilter {
469
+ }
470
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LWRhdGF0YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy10YWlsd2luZC9zcmMvY29tcG9uZW50cy9uZ3QtZGF0YXRhYmxlL25ndC1kYXRhdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdGFpbHdpbmQvc3JjL2NvbXBvbmVudHMvbmd0LWRhdGF0YWJsZS9uZ3QtZGF0YXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxTQUFTLEVBRVQsWUFBWSxFQUVaLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUdOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQU01RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzREFBc0QsQ0FBQzs7Ozs7Ozs7OztBQU81RixNQUFNLE9BQU8scUJBQXFCO0lBd0Q5QixZQUNZLFFBQWtCLEVBQ2xCLGNBQThCLEVBQzlCLGNBQWlDLEVBRWxDLG1CQUF3QztRQUp2QyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFFbEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQXZEbkMsU0FBSSxHQUFxQixnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7UUFDakQscUJBQWdCLEdBQVcsYUFBYSxDQUFDO1FBQ3pDLG9CQUFlLEdBQVcsTUFBTSxDQUFDO1FBQ2pDLHFCQUFnQixHQUFXLGNBQWMsQ0FBQztRQUUxQyxnQkFBVyxHQUFXLEdBQUcsQ0FBQztRQUMxQix3QkFBbUIsR0FBVyxDQUFDLENBQUM7UUFDaEMsc0JBQWlCLEdBQVksSUFBSSxDQUFDO1FBQ2xDLG1CQUFjLEdBQVEsRUFBRSxD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ckMsTUFBTTtnQkFDVSxnQkFBZ0I7c0JBQWhDLE1BQU07Z0JBQ1Usb0JBQW9CO3NCQUFwQyxNQUFNO2dCQUNVLGlCQUFpQjtzQkFBakMsTUFBTTtnQkFDVSxRQUFRO3NCQUF4QixNQUFNOztBQWdkWCxNQUFNLENBQU4sSUFBWSxnQkFHWDtBQUhELFdBQVksZ0JBQWdCO0lBQ3hCLHFDQUFpQixDQUFBO0lBQ2pCLG1DQUFlLENBQUE7QUFDbkIsQ0FBQyxFQUhXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFHM0I7QUFFRCxNQUFNLENBQU4sSUFBWSxzQkFHWDtBQUhELFdBQVksc0JBQXNCO0lBQzlCLDZDQUFtQixDQUFBO0lBQ25CLDJDQUFpQixDQUFBO0FBQ3JCLENBQUMsRUFIVyxzQkFBc0IsS0FBdEIsc0JBQXNCLFFBR2pDO0FBRUQsTUFBTSxDQUFOLElBQVksaUJBS1g7QUFMRCxXQUFZLGlCQUFpQjtJQUN6Qix5RUFBZ0IsQ0FBQTtJQUNoQixxRUFBYyxDQUFBO0lBQ2QsMkVBQWlCLENBQUE7SUFDakIsNkVBQWtCLENBQUE7QUFDdEIsQ0FBQyxFQUxXLGlCQUFpQixLQUFqQixpQkFBaUIsUUFLNUI7QUFFRCxNQUFNLE9BQU8saUJBQWlCO0NBSTdCO0FBRUQsTUFBTSxPQUFPLGVBQWU7Q0FJM0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgSW5qZWN0b3IsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIE9wdGlvbmFsLFxyXG4gICAgT3V0cHV0LFxyXG4gICAgU2ltcGxlQ2hhbmdlcyxcclxuICAgIFRlbXBsYXRlUmVmLFxyXG4gICAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IGdldEVudW1Gcm9tU3RyaW5nIH0gZnJvbSAnLi4vLi4vaGVscGVycy9lbnVtL2VudW0nO1xyXG5pbXBvcnQgeyBOZ3RIdHRwUGFnaW5hdGlvbiwgTmd0SHR0cFJlc3BvbnNlLCBOZ3RIdHRwU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2h0dHAvbmd0LWh0dHAuc2VydmljZSc7XHJcbmltcG9ydCB7IE5ndFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9odHRwL25ndC10cmFuc2xhdGUuc2VydmljZSc7XHJcbmltcG9ydCB7IE5ndElucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LWlucHV0L25ndC1pbnB1dC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBOZ3RNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL25ndC1tb2RhbC9uZ3QtbW9kYWwuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTmd0UGFnaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL25ndC1wYWdpbmF0aW9uL25ndC1wYWdpbmF0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5ndFN0eWxpemFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbmd0LXN0eWxpemFibGUvbmd0LXN0eWxpemFibGUuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbmd0LWRhdGF0YWJsZScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vbmd0LWRhdGF0YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9uZ3QtZGF0YXRhYmxlLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd0RGF0YXRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgQFZpZXdDaGlsZCgndGFibGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgdGFibGU6IEVsZW1lbnRSZWY7XHJcbiAgICBAVmlld0NoaWxkKCduZ3RQYWdpbmF0aW9uJywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIG5ndFBhZ2luYXRpb246IE5ndFBhZ2luYXRpb25Db21wb25lbnQ7XHJcbiAgICBAVmlld0NoaWxkKCdzZWFyY2hNb2RhbCcsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBzZWFyY2hNb2RhbDogTmd0TW9kYWxDb21wb25lbnQ7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIHJlbW90ZVJlc291cmNlOiBhbnk7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdHlwZTogTmd0RGF0YXRhYmxlVHlwZSA9IE5ndERhdGF0YWJsZVR5cGUuUkVNT1RFO1xyXG4gICAgQElucHV0KCkgcHVibGljIGZpbHRlclRhZ0JnQ29sb3I6IHN0cmluZyA9ICdiZy1ibHVlLTUwMCc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZmlsdGVyVGFnTWFyZ2luOiBzdHJpbmcgPSAnbWItNCc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgcGFnaW5hdGlvbk1hcmdpbjogc3RyaW5nID0gJ210LTIgbWQ6bXQtOCc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5wdXRTZWFyY2g6IE5ndElucHV0Q29tcG9uZW50O1xyXG4gICAgQElucHV0KCkgcHVibGljIHNlYXJjaERlbGF5OiBudW1iZXIgPSA1MDA7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VhcmNoVGVybU1pbkxlbmd0aDogbnVtYmVyID0gMTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWFyY2hUZXJtT25FbnRlcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZGVmYXVsdEZpbHRlcnM6IGFueSA9IHt9O1xyXG4gICAgQElucHV0KCkgcHVibGljIGZpbHRlcnNEZXNjcmlwdGlvbiA9IHt9O1xyXG4gICAgQElucHV0KCkgcHVibGljIGNhblNlbGVjdEFsbFJlZ2lzdGVyczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25EYXRhQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25DbGVhckZpbHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uQ2xlYXJTZWxlY3RlZEVsZW1lbnRzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25TZWxlY3RlZEVsZW1lbnRzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8QXJyYXk8Tmd0Q2hlY2tlZEVsZW1lbnQ+PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25Ub29nbGVBbGxDaGVja2JveGVzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25Ub29nbGVDaGVja2JveDogRXZlbnRFbWl0dGVyPE5ndENoZWNrZWRFbGVtZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25TZWxlY3RBbGxSZWdpc3RlcnM6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25PcGVuU2VhcmNoTW9kYWw6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBvblNlYXJjaDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgcHVibGljIHNlYXJjaE1vZGFsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBwdWJsaWMgZGF0YSA9IFtdO1xyXG4gICAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBjbGVhbmluZ0ZpbHRlciA9IGZhbHNlO1xyXG4gICAgcHVibGljIGNvbXBvbmVudFJlYWR5ID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgZmlsdGVyc1RyYW5zbGF0ZWQgPSBbXTtcclxuICAgIHB1YmxpYyBlbXB0eVN0YXRlVmlzaWJsZTogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBjb2x1bW5Db3VudCA9IFtdO1xyXG4gICAgcHVibGljIGhhc1NlbGVjdGVkQWxsRWxlbWVudHM6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgc2VsZWN0ZWRFbGVtZW50czogQXJyYXk8Tmd0Q2hlY2tlZEVsZW1lbnQ+ID0gW107XHJcblxyXG4gICAgcHVibGljIGZpbHRlck1vZGFsU3R5bGU6IE5ndFN0eWxpemFibGVTZXJ2aWNlID0gbmV3IE5ndFN0eWxpemFibGVTZXJ2aWNlKCk7XHJcblxyXG4gICAgcHJpdmF0ZSBzZWFyY2hpbmc6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIHNlYXJjaFRpbWVvdXQ6IGFueTtcclxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uczogQXJyYXk8U3Vic2NyaXB0aW9uPiA9IFtdO1xyXG4gICAgcHJpdmF0ZSBjdXJyZW50U3RhdGUgPSB7XHJcbiAgICAgICAgZmlsdGVyczoge1xyXG4gICAgICAgICAgICBkZWZhdWx0RmlsdGVyczoge30sXHJcbiAgICAgICAgICAgIHNpbGVudEZpbHRlcnM6IHt9LFxyXG4gICAgICAgICAgICBxdWFsaWZpZWRGaWx0ZXJzOiB7fSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNvcnQ6IHtcclxuICAgICAgICAgICAgZmllbGQ6ICcnLFxyXG4gICAgICAgICAgICBkaXJlY3Rpb246ICcnXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgcHJpdmF0ZSBuZ3RIdHRwU2VydmljZTogTmd0SHR0cFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgQE9wdGlvbmFsKClcclxuICAgICAgICBwdWJsaWMgbmd0VHJhbnNsYXRlU2VydmljZTogTmd0VHJhbnNsYXRlU2VydmljZVxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RhbFN0eWxlLmxvYWQodGhpcy5pbmplY3RvciwgJ0ZpbHRlck1vZGFsJywge1xyXG4gICAgICAgICAgICB3OiAnbWQ6bWF4LXctbWQnLFxyXG4gICAgICAgICAgICBweTogJ3B5LTQnLFxyXG4gICAgICAgICAgICBweDogJ3B4LTYnLFxyXG4gICAgICAgICAgICBib3JkZXI6ICdib3JkZXIgYm9yZGVyLXRlYWwtNTAwJyxcclxuICAgICAgICAgICAgb3ZlcmZsb3c6ICdvdmVyZmxvdy12aXNpYmxlJyxcclxuICAgICAgICAgICAgY29sb3I6IHt9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLnRhYmxlICYmIHRoaXMudGFibGUubmF0aXZlRWxlbWVudCAmJiB0aGlzLnRhYmxlLm5hdGl2ZUVsZW1lbnQucm93c1xyXG4gICAgICAgICAgICAmJiB0aGlzLnRhYmxlLm5hdGl2ZUVsZW1lbnQucm93c1swXSAmJiB0aGlzLnRhYmxlLm5hdGl2ZUVsZW1lbnQucm93c1swXS5jZWxscykge1xyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbkNvdW50ID0gdGhpcy50YWJsZS5uYXRpdmVFbGVtZW50LnJvd3NbMF0uY2VsbHM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pbnB1dFNlYXJjaCkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRTZWFyY2hXaXRoSW5wdXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdENoZWNrYm94RXZlbnQoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoRGVsYXkgPT0gNTAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoRGVsYXkgPSB0aGlzLmluamVjdG9yLmdldCgnTmd0RGF0YXRhYmxlU2VhcmNoRGVsYXknLCA1MDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGVybU1pbkxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVGVybU1pbkxlbmd0aCA9IHRoaXMuaW5qZWN0b3IuZ2V0KCdOZ3REYXRhdGFibGVTZWFyY2hUZXJtTWluTGVuZ3RoJywgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICB0aGlzLmRlc3Ryb3lTdWJzY3JpcHRpb25zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFNlYXJjaE1vZGFsVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHtcclxuICAgICAgICB0aGlzLnNlYXJjaE1vZGFsVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3BlblNlYXJjaE1vZGFsKHJlZmVyZW5jZT86IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuc2VhcmNoTW9kYWwub3BlbigpO1xyXG4gICAgICAgIHRoaXMub25PcGVuU2VhcmNoTW9kYWwuZW1pdChyZWZlcmVuY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbGVhclNlbGVjdGVkRWxlbWVudHMoKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzID0gW107XHJcbiAgICAgICAgdGhpcy5vbkNsZWFyU2VsZWN0ZWRFbGVtZW50cy5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEN1cnJlbnRTdGF0ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWFkeSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHNlYXJjaChcclxuICAgICAgICBmaWx0ZXJzOiBPYmplY3QsXHJcbiAgICAgICAgc2VhcmNoVHlwZTogTmd0RGF0YXRhYmxlU2VhcmNoVHlwZSA9IE5ndERhdGF0YWJsZVNlYXJjaFR5cGUuREVGQVVMVCxcclxuICAgICAgICBhcHBseURlbGF5T25TZWFyY2g6IGJvb2xlYW4gPSB0cnVlXHJcbiAgICApIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5BcHBseUZpbHRlcnMoZmlsdGVycykpIHtcclxuICAgICAgICAgICAgdGhpcy5vblNlYXJjaC5lbWl0KGZpbHRlcnMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNlYXJjaFR5cGUgPT0gTmd0RGF0YXRhYmxlU2VhcmNoVHlwZS5ERUZBVUxUKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzID0geyAuLi50aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzLCAuLi5maWx0ZXJzIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLnNpbGVudEZpbHRlcnMgPSB7IC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuc2lsZW50RmlsdGVycywgLi4uZmlsdGVycyB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0Rlc2NyaXB0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseSgxLCBhcHBseURlbGF5T25TZWFyY2gpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgc29ydChmaWVsZDogYW55LCBkaXJlY3Rpb246IGFueSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFN0YXRlLnNvcnQgPSB7XHJcbiAgICAgICAgICAgIGZpZWxkOiBmaWVsZCxcclxuICAgICAgICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb25cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5hcHBseSh0aGlzLm5ndFBhZ2luYXRpb24uZ2V0Q3VycmVudFBhZ2UoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHJlZnJlc2goc3RheUluUGFnZTogTmd0RGF0YXRhYmxlUGFyYW0gPSBOZ3REYXRhdGFibGVQYXJhbS5SRVNFVF9QQUdFLCBsb2FkZXI6IE5ndERhdGF0YWJsZVBhcmFtID0gTmd0RGF0YXRhYmxlUGFyYW0uRU5BQkxFX0xPQURFUikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5KFxyXG4gICAgICAgICAgICBzdGF5SW5QYWdlID8gdGhpcy5uZ3RQYWdpbmF0aW9uLmdldEN1cnJlbnRQYWdlKCkgOiAxLFxyXG4gICAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgICAgbG9hZGVyXHJcbiAgICAgICAgKS50aGVuKCgpID0+ICF0aGlzLmRhdGE/Lmxlbmd0aCA/IHRoaXMuYXBwbHkoMSwgZmFsc2UpIDogbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldERhdGEoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q3VycmVudFNvcnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLnNvcnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFBlclBhZ2UocGVyUGFnZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5uZ3RQYWdpbmF0aW9uLm9uUmVnaXN0ZXJzUGVyUGFnZUNoYW5nZShwZXJQYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXBwbHlGaWx0ZXJzRGVzY3JpcHRpb24oKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNsZWFuaW5nRmlsdGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyc1RyYW5zbGF0ZWQgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlZmVyZW5jZSBpbiB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzRGVzY3JpcHRpb25bcmVmZXJlbmNlXSAmJiB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzW3JlZmVyZW5jZV0pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnNUcmFuc2xhdGVkLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnNbcmVmZXJlbmNlXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb246IHRoaXMuZmlsdGVyc0Rlc2NyaXB0aW9uW3JlZmVyZW5jZV1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0RmlsdGVyRGVzY3JpcHRpb24ocmVmZXJlbmNlOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmZpbHRlcnNEZXNjcmlwdGlvbltyZWZlcmVuY2VdID0gZGVzY3JpcHRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZUZpbHRlcihyZWZlcmVuY2U/OiBzdHJpbmcsIHJlZnJlc2g6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVmZXJlbmNlICYmICF0aGlzLmhhc0FwcGxpZWRGaWx0ZXIocmVmZXJlbmNlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jbGVhbmluZ0ZpbHRlciA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXJlZmVyZW5jZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVycyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzID0ge307XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnNUcmFuc2xhdGVkID0gW107XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVyc1tyZWZlcmVuY2VdO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuc2lsZW50RmlsdGVyc1tyZWZlcmVuY2VdO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyc1RyYW5zbGF0ZWQgPSB0aGlzLmZpbHRlcnNUcmFuc2xhdGVkLmZpbHRlcihlbGVtZW50ID0+IGVsZW1lbnQgJiYgZWxlbWVudC5yZWZlcmVuY2UgIT09IHJlZmVyZW5jZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMub25DbGVhckZpbHRlci5lbWl0KHJlZmVyZW5jZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dFNlYXJjaCAmJiAocmVmZXJlbmNlID09PSAndGVybScgfHwgIXJlZmVyZW5jZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2guY2xlYXJJbnB1dCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocmVmcmVzaCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHkodGhpcy5uZ3RQYWdpbmF0aW9uLmdldEN1cnJlbnRQYWdlKCksIGZhbHNlKVxyXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhbmluZ0ZpbHRlciA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhc0FwcGxpZWRGaWx0ZXIoZmlsdGVyOiBPYmplY3QgfCBOZ3RDdXN0b21GaWx0ZXIgfCBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCByZWZlcmVuY2U6IHN0cmluZyA9IHR5cGVvZiBmaWx0ZXIgPT09ICdzdHJpbmcnID8gZmlsdGVyIDogT2JqZWN0LmtleXMoZmlsdGVyID8/IHt9KVswXTtcclxuICAgICAgICBjb25zdCBhcHBsaWVkRmlsdGVycyA9IHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMucXVhbGlmaWVkRmlsdGVycztcclxuXHJcbiAgICAgICAgcmV0dXJuICEhT2JqZWN0LmtleXMoYXBwbGllZEZpbHRlcnMpLmZpbmQoa2V5ID0+IGtleSA9PSByZWZlcmVuY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYXNBcHBsaWVkRmlsdGVycyhzZWFyY2hUeXBlOiBOZ3REYXRhdGFibGVTZWFyY2hUeXBlID0gTmd0RGF0YXRhYmxlU2VhcmNoVHlwZS5ERUZBVUxUKSB7XHJcbiAgICAgICAgbGV0IGFwcGxpZWRGaWx0ZXJzID0ge307XHJcblxyXG4gICAgICAgIGlmIChzZWFyY2hUeXBlID09IE5ndERhdGF0YWJsZVNlYXJjaFR5cGUuREVGQVVMVCkge1xyXG4gICAgICAgICAgICBhcHBsaWVkRmlsdGVycyA9IHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnM7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzZWFyY2hUeXBlID09IE5ndERhdGF0YWJsZVNlYXJjaFR5cGUuU0lMRU5UKSB7XHJcbiAgICAgICAgICAgIGFwcGxpZWRGaWx0ZXJzID0gdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFwcGxpZWRGaWx0ZXJzID0geyAuLi50aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzLCAuLi50aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLnNpbGVudEZpbHRlcnMgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAhIU9iamVjdC52YWx1ZXMoYXBwbGllZEZpbHRlcnMpPy5maW5kKGZpbHRlciA9PiAhIWZpbHRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICBpZiAoY2hhbmdlcy5pbnB1dFNlYXJjaCkge1xyXG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5pbnB1dFNlYXJjaC5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFNlYXJjaFdpdGhJbnB1dCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2hhbmdlcy50eXBlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IGdldEVudW1Gcm9tU3RyaW5nKGNoYW5nZXMudHlwZS5jdXJyZW50VmFsdWUsIE5ndERhdGF0YWJsZVR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgYXBwbHkocGFnZSA9IDEsIGFwcGx5RGVsYXlPblNlYXJjaDogYm9vbGVhbiA9IHRydWUsIGxvYWRlcjogTmd0RGF0YXRhYmxlUGFyYW0gPSBOZ3REYXRhdGFibGVQYXJhbS5FTkFCTEVfTE9BREVSKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29tcG9uZW50UmVhZHkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWFyY2hUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hUaW1lb3V0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5uZ3RQYWdpbmF0aW9uLmRpc3BsYXlQYWdpbmF0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50cyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gTmd0RGF0YXRhYmxlVHlwZS5SRU1PVEUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbW90ZVJlc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmRWaXNpYmlsaXR5QXR0cmlidXRlcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFwcGx5RGVsYXlPblNlYXJjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZERhdGEocGFnZSkudGhlbigoKSA9PiByZXNvbHZlKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnNlYXJjaERlbGF5KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWREYXRhKHBhZ2UpLnRoZW4oKCkgPT4gcmVzb2x2ZSgpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBwcm9wZXJ0eSBbcmVtb3RlUmVzb3VyY2VdIG5lZWRzIHRvIGJlIHByZXNlbnQgdG8gYmUgYWJsZSB0byBtYWtlIHJlbW90ZSBzZWFyY2gnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT0gTmd0RGF0YXRhYmxlVHlwZS5GSVhFRCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kVmlzaWJpbGl0eUF0dHJpYnV0ZXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VGFnRmlsdGVyVmFsdWUoZmlsdGVyOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGZpbHRlcnNUYWcgPSB0aGlzLmdldEZpbHRlcnNUYWdBcnJheShmaWx0ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gZmlsdGVyc1RhZy5sZW5ndGggPiAxXHJcbiAgICAgICAgICAgID8gZmlsdGVyc1RhZ1swXSArIFwiICtcIlxyXG4gICAgICAgICAgICA6IGZpbHRlcnNUYWdbMF07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFRpdGxlKGZpbHRlcjogYW55KTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBmaWx0ZXJzVGFnID0gdGhpcy5nZXRGaWx0ZXJzVGFnQXJyYXkoZmlsdGVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZpbHRlcnNUYWcubGVuZ3RoID4gMVxyXG4gICAgICAgICAgICA/IGZpbHRlcnNUYWcuc2xpY2UoMSkuam9pbihcIixcIilcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEZpbHRlcnNUYWdBcnJheShmaWx0ZXI6IGFueSk6IHN0cmluZ1tdIHtcclxuICAgICAgICBjb25zdCB0YWcgPSBmaWx0ZXI/LnZhbHVlPy50YWdWYWx1ZSA/IGZpbHRlci52YWx1ZS50YWdWYWx1ZSA6IGZpbHRlci52YWx1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRhZy5zcGxpdChcIixcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkRGF0YShwYWdlOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwYWdpbmF0aW9uOiBOZ3RIdHRwUGFnaW5hdGlvbiA9IHsgLi4udGhpcy5uZ3RQYWdpbmF0aW9uLmdldFBhZ2luYXRpb24oKSwgLi4ueyBwYWdlOiBwYWdlIH0gfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMucXVhbGlmaWVkRmlsdGVycyA9IHRoaXMuZ2V0UXVhbGlmaWVkRmlsdGVycygpO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaGluZyA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dFNlYXJjaCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dFNlYXJjaC5pc0Rpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXHJcbiAgICAgICAgICAgICAgICB0aGlzLm5ndEh0dHBTZXJ2aWNlLmdldChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW90ZVJlc291cmNlLCB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLnF1YWxpZmllZEZpbHRlcnMsIHBhZ2luYXRpb24sIHRoaXMuY3VycmVudFN0YXRlLnNvcnRcclxuICAgICAgICAgICAgICAgICkuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgICAgICAgIChyZXNwb25zZTogTmd0SHR0cFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Nlc3NSZW1vdGVSZXNwb25zZShyZXNwb25zZS5kYXRhKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5tZXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ndFBhZ2luYXRpb24ucHJvY2Nlc3NQYWdpbmF0aW9uKHJlc3BvbnNlLm1ldGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlucHV0U2VhcmNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0U2VhcmNoLmlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRhdGFDaGFuZ2UuZW1pdCh0aGlzLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmRWaXNpYmlsaXR5QXR0cmlidXRlcygpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dFNlYXJjaC5pc0Rpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0UXVhbGlmaWVkRmlsdGVycygpIHtcclxuICAgICAgICBjb25zdCBxdWFsaWZpZWRGaWx0ZXJzID0ge307XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdGVkRmlsdGVycyA9IHsgLi4udGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVycywgLi4udGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzIH07XHJcblxyXG4gICAgICAgIGlmIChyZXF1ZXN0ZWRGaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIGluIHJlcXVlc3RlZEZpbHRlcnMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IHJlcXVlc3RlZEZpbHRlcnNbcmVmZXJlbmNlXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkRmlsdGVyKGZpbHRlciwgcmVmZXJlbmNlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBOZ3RDdXN0b21GaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci50YWdMYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzRGVzY3JpcHRpb25bcmVmZXJlbmNlXSA9IGZpbHRlci50YWdMYWJlbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzRGVzY3JpcHRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkRmlsdGVyc1tyZWZlcmVuY2VdID0gZmlsdGVyLnRlcm07XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkRmlsdGVyc1tyZWZlcmVuY2VdID0gZmlsdGVyO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHF1YWxpZmllZEZpbHRlcnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBiaW5kVmlzaWJpbGl0eUF0dHJpYnV0ZXMoKSB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT0gTmd0RGF0YXRhYmxlVHlwZS5SRU1PVEUgJiYgIXRoaXMuZGF0YS5sZW5ndGggJiYgIXRoaXMubG9hZGluZykge1xyXG4gICAgICAgICAgICB0aGlzLmVtcHR5U3RhdGVWaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PSBOZ3REYXRhdGFibGVUeXBlLkZJWEVEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1wdHlTdGF0ZVZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmVtcHR5U3RhdGVWaXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHByb2NjZXNzUmVtb3RlUmVzcG9uc2UocmVzcG9uc2U6IGFueSkge1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IHJlc3BvbnNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFNlYXJjaFdpdGhJbnB1dCgpIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgICAgICAgdGhpcy5pbnB1dFNlYXJjaC5vblZhbHVlQ2hhbmdlKCkuc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVyc1sndGVybSddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZpbHRlcigndGVybScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoIDwgdGhpcy5zZWFyY2hUZXJtTWluTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzWyd0ZXJtJ107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaCh7IHRlcm06ICcnIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID49IHRoaXMuc2VhcmNoVGVybU1pbkxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoKHsgdGVybTogdmFsdWUgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGVybU9uRW50ZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnB1dFNlYXJjaC5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSAxMykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlucHV0U2VhcmNoLnZhbHVlICYmIHRoaXMuaW5wdXRTZWFyY2gudmFsdWUubGVuZ3RoID49IHRoaXMuc2VhcmNoVGVybU1pbkxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5KDEsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRDaGVja2JveEV2ZW50KCkge1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgICAgICB0aGlzLm9uVG9vZ2xlQ2hlY2tib3guc3Vic2NyaWJlKChjaGVja2VkRWxlbWVudDogTmd0Q2hlY2tlZEVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50cyA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50cy5maWx0ZXIoaXRlbSA9PiBpdGVtLmlkICE9PSBjaGVja2VkRWxlbWVudC5pZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrZWRFbGVtZW50LmNoZWNrZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudHMucHVzaChjaGVja2VkRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdGVkRWxlbWVudHNDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkRWxlbWVudHMpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0QWxsUmVnaXN0ZXJzLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhc1NlbGVjdGVkQWxsRWxlbWVudHMgPSAhdGhpcy5oYXNTZWxlY3RlZEFsbEVsZW1lbnRzO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5oYXNTZWxlY3RlZEFsbEVsZW1lbnRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzID0gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbkFwcGx5RmlsdGVycyhmaWx0ZXJzOiBPYmplY3QpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2VhcmNoaW5nKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIGluIGZpbHRlcnMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWRGaWx0ZXIoZmlsdGVyc1tyZWZlcmVuY2VdLCByZWZlcmVuY2UpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzVmFsaWRGaWx0ZXIoZmlsdGVyOiBzdHJpbmcgfCBOZ3RDdXN0b21GaWx0ZXIsIHJlZmVyZW5jZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgaGFzVmFsdWU6IGJvb2xlYW4gPSAhISgoZmlsdGVyIGluc3RhbmNlb2YgTmd0Q3VzdG9tRmlsdGVyICYmIGZpbHRlci50ZXJtKSB8fCBmaWx0ZXIpO1xyXG4gICAgICAgIGNvbnN0IGlzQXBwbGllZDogYm9vbGVhbiA9IHRoaXMuaGFzQXBwbGllZEZpbHRlcihyZWZlcmVuY2UpO1xyXG5cclxuICAgICAgICByZXR1cm4gaXNBcHBsaWVkIHx8ICghaXNBcHBsaWVkICYmIGhhc1ZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlc3Ryb3lTdWJzY3JpcHRpb25zKCkge1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gW107XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIE5ndERhdGF0YWJsZVR5cGUge1xyXG4gICAgUkVNT1RFID0gJ1JFTU9URScsXHJcbiAgICBGSVhFRCA9ICdGSVhFRCdcclxufVxyXG5cclxuZXhwb3J0IGVudW0gTmd0RGF0YXRhYmxlU2VhcmNoVHlwZSB7XHJcbiAgICBERUZBVUxUID0gJ0RFRkFVTFQnLFxyXG4gICAgU0lMRU5UID0gJ1NJTEVOVCcsXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIE5ndERhdGF0YWJsZVBhcmFtIHtcclxuICAgIFNUQVlfSU5fUEFHRSA9IDEsXHJcbiAgICBSRVNFVF9QQUdFID0gMCxcclxuICAgIEVOQUJMRV9MT0FERVIgPSAxLFxyXG4gICAgRElTQUJMRV9MT0FERVIgPSAwXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOZ3RDaGVja2VkRWxlbWVudCB7XHJcbiAgICBwdWJsaWMgaWQ6IHN0cmluZztcclxuICAgIHB1YmxpYyBjaGVja2VkOiBib29sZWFuO1xyXG4gICAgcHVibGljIHJlZmVyZW5jZTogYW55O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTmd0Q3VzdG9tRmlsdGVyIHtcclxuICAgIHB1YmxpYyB0ZXJtOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgdGFnVmFsdWU6IHN0cmluZztcclxuICAgIHB1YmxpYyB0YWdMYWJlbD86IHN0cmluZztcclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgdy1mdWxsXCI+XHJcbiAgICAgICAgPG5ndC10YWcgKm5nSWY9XCJoYXNBcHBsaWVkRmlsdGVycygpXCIgY2xhc3M9XCJ3LWZ1bGwgc206dy1hdXRvIHt7IGZpbHRlclRhZ01hcmdpbiB9fVwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5zbTptci00XT1cImZpbHRlclRhZ01hcmdpbiA9PSAnbWItNCdcIiBjb2xvci5iZz1cImJnLXJlZC01MDBcIiAoY2xpY2spPVwicmVtb3ZlRmlsdGVyKClcIiBuZ3Qtc3R5bGl6YWJsZT5cclxuICAgICAgICAgICAgTGltcGFyIEZpbHRyb3NcclxuICAgICAgICA8L25ndC10YWc+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNBcHBsaWVkRmlsdGVycygpXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpbHRlciBvZiBmaWx0ZXJzVHJhbnNsYXRlZFwiPlxyXG4gICAgICAgICAgICAgICAgPG5ndC10YWcgY2xhc3M9XCJ3LWZ1bGwgc206dy1hdXRvIHt7IGZpbHRlclRhZ01hcmdpbiB9fVwiIFtjbGFzcy5zbTptci00XT1cImZpbHRlclRhZ01hcmdpbiA9PSAnbWItNCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjb2xvci5iZ109XCJmaWx0ZXJUYWdCZ0NvbG9yXCIgKGNsaWNrKT1cInJlbW92ZUZpbHRlcihmaWx0ZXIucmVmZXJlbmNlKVwiIG5ndC1zdHlsaXphYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImdldFRpdGxlKGZpbHRlcilcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBmaWx0ZXIudHJhbnNsYXRpb24gKyAnOiAnICsgZ2V0VGFnRmlsdGVyVmFsdWUoZmlsdGVyKSB9fVxyXG4gICAgICAgICAgICAgICAgPC9uZ3QtdGFnPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDx0YWJsZSBzdHlsZT1cImRpc3BsYXk6IHRhYmxlO1wiIGNsYXNzPVwidGV4dC1sZWZ0IHctZnVsbCBib3JkZXItY29sbGFwc2UgdGFibGUtcmVzcG9uc2l2ZVwiICN0YWJsZT5cclxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICA8L3RhYmxlPlxyXG5cclxuICAgIDxwICpuZ0lmPVwiZW1wdHlTdGF0ZVZpc2libGVcIiBjbGFzcz1cIm10LTggbXgtYXV0byBzZWxmLWNlbnRlciB0ZXh0LWNlbnRlciB0ZXh0LXhsXCI+XHJcbiAgICAgICAge3sgbmd0VHJhbnNsYXRlU2VydmljZS5uZ3REYXRhdGFibGVOb0RhdGFGb3VuZCB9fVxyXG4gICAgPC9wPlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJsb2FkaW5nXCI+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaSBvZiBbMSwgMiwgMywgNF1cIiBjbGFzcz1cImZsZXggdy1mdWxsIG10LTNcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbkNvdW50Lmxlbmd0aCA+PSAyXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBqIG9mIGNvbHVtbkNvdW50OyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmd0LXNoaW5pbmcgY2xhc3M9XCJoLTEwIHctZnVsbFwiPjwvbmd0LXNoaW5pbmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmd0LXNoaW5pbmcgY2xhc3M9XCJoLTEwIHctZnVsbCBtci0xMFwiPjwvbmd0LXNoaW5pbmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uQ291bnQubGVuZ3RoIDwgMlwiPlxyXG4gICAgICAgICAgICAgICAgPG5ndC1zaGluaW5nIGNsYXNzPVwiaC0xMCB3LWZ1bGxcIj48L25ndC1zaGluaW5nPlxyXG4gICAgICAgICAgICAgICAgPG5ndC1zaGluaW5nIGNsYXNzPVwiaC0xMCB3LWZ1bGwgbXItMTAgbWwtMTBcIj48L25ndC1zaGluaW5nPlxyXG4gICAgICAgICAgICAgICAgPG5ndC1zaGluaW5nIGNsYXNzPVwiaC0xMCB3LWZ1bGxcIj48L25ndC1zaGluaW5nPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJjbGVhcmZpeCB7eyBwYWdpbmF0aW9uTWFyZ2luIH19XCIgW2hpZGRlbl09JyFkYXRhIHx8IGRhdGEubGVuZ3RoID09IDAnPlxyXG4gICAgPG5ndC1wYWdpbmF0aW9uIFtwYWdlc0ludGVydmFsXT0nNCcgKG9uUGFnZUNoYW5nZSk9J2FwcGx5KCRldmVudCwgZmFsc2UpJyAob25QZXJQYWdlQ2hhbmdlKT0nYXBwbHkoMSwgZmFsc2UpJ1xyXG4gICAgICAgICNuZ3RQYWdpbmF0aW9uPlxyXG4gICAgPC9uZ3QtcGFnaW5hdGlvbj5cclxuPC9kaXY+XHJcblxyXG48bmd0LW1vZGFsIFtjdXN0b21MYXlvdXRdPVwidHJ1ZVwiIFtpc0Rpc2FibGVkXT1cImZhbHNlXCIgW25ndFN0eWxlXT1cImZpbHRlck1vZGFsU3R5bGVcIiAjc2VhcmNoTW9kYWw+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VhcmNoTW9kYWxUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG48L25ndC1tb2RhbD4iXX0=