@one-paragon/angular-utilities 0.1.24 → 0.1.26

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 (229) hide show
  1. package/action-state/action-state-spinner/action-state-spinner.component.d.ts +12 -12
  2. package/action-state/action-state-ui/action-state-ui.module.d.ts +9 -9
  3. package/action-state/index.d.ts +4 -4
  4. package/action-state/ngrx-ext/ngrx-ext.module.d.ts +8 -8
  5. package/action-state/ngrx.d.ts +31 -31
  6. package/esm2020/action-state/action-state-spinner/action-state-spinner.component.mjs +23 -23
  7. package/esm2020/action-state/action-state-ui/action-state-ui.module.mjs +28 -28
  8. package/esm2020/action-state/index.mjs +8 -8
  9. package/esm2020/action-state/ngrx-ext/ngrx-ext.module.mjs +23 -23
  10. package/esm2020/action-state/ngrx.mjs +42 -42
  11. package/esm2020/http-request-state/HttpRequestStateFactory.mjs +26 -26
  12. package/esm2020/http-request-state/HttpRequestStateStore.mjs +96 -96
  13. package/esm2020/http-request-state/directives/HttpStateDirectiveBase.mjs +33 -33
  14. package/esm2020/http-request-state/directives/http-error-state-directive.mjs +28 -28
  15. package/esm2020/http-request-state/directives/http-inProgress-state-directive.mjs +28 -28
  16. package/esm2020/http-request-state/directives/http-notStarted-state-directive.mjs +28 -28
  17. package/esm2020/http-request-state/directives/http-success-state-directive.mjs +34 -29
  18. package/esm2020/http-request-state/directives/index.mjs +5 -5
  19. package/esm2020/http-request-state/directives/request-state-directive.mjs +60 -57
  20. package/esm2020/http-request-state/helpers.mjs +21 -21
  21. package/esm2020/http-request-state/http-request-state.mjs +38 -38
  22. package/esm2020/http-request-state/http-state-module.mjs +40 -40
  23. package/esm2020/http-request-state/index.mjs +6 -6
  24. package/esm2020/http-request-state/rxjs/getRequestorBody.mjs +3 -3
  25. package/esm2020/http-request-state/rxjs/getRequestorState.mjs +2 -2
  26. package/esm2020/http-request-state/rxjs/index.mjs +4 -4
  27. package/esm2020/http-request-state/rxjs/tapError.mjs +11 -11
  28. package/esm2020/http-request-state/rxjs/tapSuccess.mjs +11 -11
  29. package/esm2020/http-request-state/types.mjs +16 -16
  30. package/esm2020/ngrx/actionable-selector.mjs +76 -76
  31. package/esm2020/ngrx/index.mjs +1 -1
  32. package/esm2020/one-paragon-angular-utilities.mjs +4 -4
  33. package/esm2020/public-api.mjs +19 -19
  34. package/esm2020/rxjs/defaultShareReplay.mjs +6 -6
  35. package/esm2020/rxjs/index.mjs +5 -5
  36. package/esm2020/rxjs/mapError.mjs +7 -7
  37. package/esm2020/rxjs/rxjs-operators.mjs +91 -91
  38. package/esm2020/rxjs/subjectifier.mjs +15 -15
  39. package/esm2020/table-builder/classes/DefaultSettings.mjs +5 -5
  40. package/esm2020/table-builder/classes/GenericTableDataSource.mjs +12 -12
  41. package/esm2020/table-builder/classes/MatTableObservableDataSource.mjs +21 -21
  42. package/esm2020/table-builder/classes/TableBuilderConfig.mjs +2 -2
  43. package/esm2020/table-builder/classes/TableState.mjs +31 -31
  44. package/esm2020/table-builder/classes/data-filter.mjs +26 -26
  45. package/esm2020/table-builder/classes/display-col.mjs +1 -1
  46. package/esm2020/table-builder/classes/filter-info.mjs +71 -71
  47. package/esm2020/table-builder/classes/table-builder-general-settings.mjs +67 -67
  48. package/esm2020/table-builder/classes/table-builder.mjs +61 -61
  49. package/esm2020/table-builder/classes/table-store.mjs +292 -292
  50. package/esm2020/table-builder/components/array-column.component.mjs +32 -32
  51. package/esm2020/table-builder/components/column-builder/column-builder.component.mjs +111 -111
  52. package/esm2020/table-builder/components/date-filter/date-filter.component.mjs +25 -25
  53. package/esm2020/table-builder/components/filter/filter.component.mjs +53 -53
  54. package/esm2020/table-builder/components/filter/in-list/in-list-filter.component.mjs +79 -79
  55. package/esm2020/table-builder/components/gen-col-displayer/gen-col-displayer.component.mjs +45 -45
  56. package/esm2020/table-builder/components/generic-table/generic-table.component.mjs +202 -198
  57. package/esm2020/table-builder/components/generic-table/paginator.component.mjs +60 -60
  58. package/esm2020/table-builder/components/group-by-list/group-by-list.component.mjs +22 -22
  59. package/esm2020/table-builder/components/header-menu/header-menu.component.mjs +89 -89
  60. package/esm2020/table-builder/components/in-filter/in-filter.component.mjs +63 -63
  61. package/esm2020/table-builder/components/index.mjs +10 -10
  62. package/esm2020/table-builder/components/initialization-component/initialization-component.mjs +33 -33
  63. package/esm2020/table-builder/components/link-column.component.mjs +30 -30
  64. package/esm2020/table-builder/components/number-filter/number-filter.component.mjs +26 -26
  65. package/esm2020/table-builder/components/sort-menu/sort-menu.component-store.mjs +41 -41
  66. package/esm2020/table-builder/components/sort-menu/sort-menu.component.mjs +75 -75
  67. package/esm2020/table-builder/components/table-container/table-container.mjs +322 -312
  68. package/esm2020/table-builder/components/table-container-filter/filter-list/filter-list.component.mjs +42 -42
  69. package/esm2020/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.mjs +30 -30
  70. package/esm2020/table-builder/components/table-container-filter/table-wrapper-filter-store.mjs +24 -24
  71. package/esm2020/table-builder/directives/custom-cell-directive.mjs +58 -58
  72. package/esm2020/table-builder/directives/index.mjs +6 -6
  73. package/esm2020/table-builder/directives/multi-sort.directive.mjs +42 -42
  74. package/esm2020/table-builder/directives/resize-column.directive.mjs +85 -85
  75. package/esm2020/table-builder/directives/table-wrapper.directive.mjs +26 -26
  76. package/esm2020/table-builder/directives/tb-filter.directive.mjs +403 -403
  77. package/esm2020/table-builder/enums/filterTypes.mjs +59 -59
  78. package/esm2020/table-builder/functions/boolean-filter-function.mjs +9 -9
  79. package/esm2020/table-builder/functions/date-filter-function.mjs +32 -32
  80. package/esm2020/table-builder/functions/download-data.mjs +11 -11
  81. package/esm2020/table-builder/functions/null-filter-function.mjs +7 -7
  82. package/esm2020/table-builder/functions/number-filter-function.mjs +31 -31
  83. package/esm2020/table-builder/functions/sort-data-function.mjs +4 -4
  84. package/esm2020/table-builder/functions/string-filter-function.mjs +40 -40
  85. package/esm2020/table-builder/interfaces/ColumnInfo.mjs +1 -1
  86. package/esm2020/table-builder/interfaces/dictionary.mjs +1 -1
  87. package/esm2020/table-builder/interfaces/report-def.mjs +34 -34
  88. package/esm2020/table-builder/material.module.mjs +207 -207
  89. package/esm2020/table-builder/ngrx/actions.mjs +4 -4
  90. package/esm2020/table-builder/ngrx/effects.mjs +47 -47
  91. package/esm2020/table-builder/ngrx/reducer.mjs +51 -51
  92. package/esm2020/table-builder/ngrx/selectors.mjs +23 -23
  93. package/esm2020/table-builder/pipes/column-total.pipe.mjs +19 -19
  94. package/esm2020/table-builder/pipes/format-filter-type.pipe.mjs +17 -17
  95. package/esm2020/table-builder/pipes/format-filter-value.pipe.mjs +45 -45
  96. package/esm2020/table-builder/pipes/key-display.mjs +19 -19
  97. package/esm2020/table-builder/services/export-to-csv.service.mjs +84 -84
  98. package/esm2020/table-builder/services/link-creator.service.mjs +42 -42
  99. package/esm2020/table-builder/services/table-template-service.mjs +43 -43
  100. package/esm2020/table-builder/services/transform-creator.mjs +70 -70
  101. package/esm2020/table-builder/table-builder.module.mjs +204 -204
  102. package/esm2020/utilities/directives/auto-focus.directive.mjs +25 -25
  103. package/esm2020/utilities/directives/clickEmitterDirective.mjs +20 -20
  104. package/esm2020/utilities/directives/clickSubject.mjs +26 -26
  105. package/esm2020/utilities/directives/conditional-classes.directive.mjs +35 -35
  106. package/esm2020/utilities/directives/dialog-service.mjs +25 -25
  107. package/esm2020/utilities/directives/dialog.mjs +137 -137
  108. package/esm2020/utilities/directives/mat-toggle-group-directive.mjs +59 -59
  109. package/esm2020/utilities/directives/prevent-enter.directive.mjs +18 -18
  110. package/esm2020/utilities/directives/stop-propagation.directive.mjs +24 -24
  111. package/esm2020/utilities/directives/styler.mjs +25 -25
  112. package/esm2020/utilities/directives/trim-whitespace.directive.mjs +29 -29
  113. package/esm2020/utilities/index.mjs +16 -16
  114. package/esm2020/utilities/module.mjs +91 -91
  115. package/esm2020/utilities/pipes/function.pipe.mjs +20 -20
  116. package/esm2020/utilities/pipes/phone.pipe.mjs +19 -19
  117. package/esm2020/utilities/pipes/space-case.pipes.mjs +28 -28
  118. package/fesm2015/one-paragon-angular-utilities.mjs +4346 -4324
  119. package/fesm2015/one-paragon-angular-utilities.mjs.map +1 -1
  120. package/fesm2020/one-paragon-angular-utilities.mjs +4312 -4292
  121. package/fesm2020/one-paragon-angular-utilities.mjs.map +1 -1
  122. package/http-request-state/HttpRequestStateFactory.d.ts +14 -14
  123. package/http-request-state/HttpRequestStateStore.d.ts +48 -48
  124. package/http-request-state/directives/HttpStateDirectiveBase.d.ts +16 -16
  125. package/http-request-state/directives/http-error-state-directive.d.ts +12 -12
  126. package/http-request-state/directives/http-inProgress-state-directive.d.ts +12 -12
  127. package/http-request-state/directives/http-notStarted-state-directive.d.ts +12 -12
  128. package/http-request-state/directives/http-success-state-directive.d.ts +21 -14
  129. package/http-request-state/directives/index.d.ts +5 -5
  130. package/http-request-state/directives/request-state-directive.d.ts +35 -29
  131. package/http-request-state/helpers.d.ts +9 -9
  132. package/http-request-state/http-request-state.d.ts +12 -12
  133. package/http-request-state/http-state-module.d.ts +11 -11
  134. package/http-request-state/index.d.ts +6 -6
  135. package/http-request-state/rxjs/getRequestorBody.d.ts +3 -3
  136. package/http-request-state/rxjs/getRequestorState.d.ts +3 -3
  137. package/http-request-state/rxjs/index.d.ts +4 -4
  138. package/http-request-state/rxjs/tapError.d.ts +3 -3
  139. package/http-request-state/rxjs/tapSuccess.d.ts +3 -3
  140. package/http-request-state/types.d.ts +36 -36
  141. package/index.d.ts +5 -5
  142. package/ngrx/actionable-selector.d.ts +15 -15
  143. package/ngrx/index.d.ts +1 -1
  144. package/package.json +1 -1
  145. package/public-api.d.ts +15 -15
  146. package/rxjs/defaultShareReplay.d.ts +2 -2
  147. package/rxjs/index.d.ts +4 -4
  148. package/rxjs/mapError.d.ts +2 -2
  149. package/rxjs/rxjs-operators.d.ts +12 -12
  150. package/rxjs/subjectifier.d.ts +9 -9
  151. package/table-builder/classes/DefaultSettings.d.ts +8 -8
  152. package/table-builder/classes/GenericTableDataSource.d.ts +8 -8
  153. package/table-builder/classes/MatTableObservableDataSource.d.ts +9 -9
  154. package/table-builder/classes/TableBuilderConfig.d.ts +19 -19
  155. package/table-builder/classes/TableState.d.ts +46 -46
  156. package/table-builder/classes/data-filter.d.ts +9 -9
  157. package/table-builder/classes/display-col.d.ts +5 -5
  158. package/table-builder/classes/filter-info.d.ts +40 -40
  159. package/table-builder/classes/table-builder-general-settings.d.ts +43 -43
  160. package/table-builder/classes/table-builder.d.ts +14 -14
  161. package/table-builder/classes/table-store.d.ts +114 -114
  162. package/table-builder/components/array-column.component.d.ts +14 -14
  163. package/table-builder/components/column-builder/column-builder.component.d.ts +50 -50
  164. package/table-builder/components/date-filter/date-filter.component.d.ts +10 -10
  165. package/table-builder/components/filter/filter.component.d.ts +294 -294
  166. package/table-builder/components/filter/in-list/in-list-filter.component.d.ts +27 -27
  167. package/table-builder/components/gen-col-displayer/gen-col-displayer.component.d.ts +16 -16
  168. package/table-builder/components/generic-table/generic-table.component.d.ts +73 -71
  169. package/table-builder/components/generic-table/paginator.component.d.ts +28 -28
  170. package/table-builder/components/group-by-list/group-by-list.component.d.ts +10 -10
  171. package/table-builder/components/header-menu/header-menu.component.d.ts +25 -25
  172. package/table-builder/components/in-filter/in-filter.component.d.ts +21 -21
  173. package/table-builder/components/index.d.ts +9 -9
  174. package/table-builder/components/initialization-component/initialization-component.d.ts +12 -12
  175. package/table-builder/components/link-column.component.d.ts +17 -17
  176. package/table-builder/components/number-filter/number-filter.component.d.ts +12 -12
  177. package/table-builder/components/sort-menu/sort-menu.component-store.d.ts +24 -24
  178. package/table-builder/components/sort-menu/sort-menu.component.d.ts +25 -25
  179. package/table-builder/components/table-container/table-container.d.ts +68 -65
  180. package/table-builder/components/table-container-filter/filter-list/filter-list.component.d.ts +17 -17
  181. package/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.d.ts +14 -14
  182. package/table-builder/components/table-container-filter/table-wrapper-filter-store.d.ts +14 -14
  183. package/table-builder/directives/custom-cell-directive.d.ts +19 -19
  184. package/table-builder/directives/index.d.ts +5 -5
  185. package/table-builder/directives/multi-sort.directive.d.ts +11 -11
  186. package/table-builder/directives/resize-column.directive.d.ts +43 -43
  187. package/table-builder/directives/table-wrapper.directive.d.ts +11 -11
  188. package/table-builder/directives/tb-filter.directive.d.ts +120 -120
  189. package/table-builder/enums/filterTypes.d.ts +31 -31
  190. package/table-builder/functions/boolean-filter-function.d.ts +3 -3
  191. package/table-builder/functions/date-filter-function.d.ts +3 -3
  192. package/table-builder/functions/download-data.d.ts +1 -1
  193. package/table-builder/functions/null-filter-function.d.ts +2 -2
  194. package/table-builder/functions/number-filter-function.d.ts +4 -4
  195. package/table-builder/functions/sort-data-function.d.ts +3 -3
  196. package/table-builder/functions/string-filter-function.d.ts +7 -7
  197. package/table-builder/interfaces/ColumnInfo.d.ts +6 -6
  198. package/table-builder/interfaces/dictionary.d.ts +3 -3
  199. package/table-builder/interfaces/report-def.d.ts +135 -135
  200. package/table-builder/material.module.d.ts +32 -32
  201. package/table-builder/ngrx/actions.d.ts +23 -23
  202. package/table-builder/ngrx/effects.d.ts +19 -19
  203. package/table-builder/ngrx/reducer.d.ts +15 -15
  204. package/table-builder/ngrx/selectors.d.ts +22 -22
  205. package/table-builder/pipes/column-total.pipe.d.ts +8 -8
  206. package/table-builder/pipes/format-filter-type.pipe.d.ts +8 -8
  207. package/table-builder/pipes/format-filter-value.pipe.d.ts +14 -14
  208. package/table-builder/pipes/key-display.d.ts +11 -11
  209. package/table-builder/services/export-to-csv.service.d.ts +22 -22
  210. package/table-builder/services/link-creator.service.d.ts +12 -12
  211. package/table-builder/services/table-template-service.d.ts +14 -14
  212. package/table-builder/services/transform-creator.d.ts +19 -19
  213. package/table-builder/table-builder.module.d.ts +45 -45
  214. package/utilities/directives/auto-focus.directive.d.ts +10 -10
  215. package/utilities/directives/clickEmitterDirective.d.ts +7 -7
  216. package/utilities/directives/clickSubject.d.ts +9 -9
  217. package/utilities/directives/conditional-classes.directive.d.ts +14 -14
  218. package/utilities/directives/dialog-service.d.ts +10 -10
  219. package/utilities/directives/dialog.d.ts +46 -46
  220. package/utilities/directives/mat-toggle-group-directive.d.ts +21 -21
  221. package/utilities/directives/prevent-enter.directive.d.ts +6 -6
  222. package/utilities/directives/stop-propagation.directive.d.ts +7 -7
  223. package/utilities/directives/styler.d.ts +9 -9
  224. package/utilities/directives/trim-whitespace.directive.d.ts +9 -9
  225. package/utilities/index.d.ts +15 -15
  226. package/utilities/module.d.ts +19 -19
  227. package/utilities/pipes/function.pipe.d.ts +7 -7
  228. package/utilities/pipes/phone.pipe.d.ts +7 -7
  229. package/utilities/pipes/space-case.pipes.d.ts +17 -17
@@ -1,198 +1,202 @@
1
- import { Component, ViewChild, Input, ChangeDetectionStrategy, Output, ElementRef, Injector, } from '@angular/core';
2
- import { MatTable } from '@angular/material/table';
3
- import { SelectionModel } from '@angular/cdk/collections';
4
- import { tap, map } from 'rxjs/operators';
5
- import { ColumnBuilderComponent } from '../column-builder/column-builder.component';
6
- import { GenericTableDataSource } from '../../classes/GenericTableDataSource';
7
- import { FieldType } from '../../interfaces/report-def';
8
- import { previousAndCurrent } from '../../../rxjs/rxjs-operators';
9
- import { CdkDropList } from '@angular/cdk/drag-drop';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "@angular/material/sort";
12
- import * as i2 from "../../classes/table-store";
13
- import * as i3 from "@angular/common";
14
- import * as i4 from "@angular/material/table";
15
- import * as i5 from "@angular/material/button";
16
- import * as i6 from "@angular/material/tooltip";
17
- import * as i7 from "@angular/material/checkbox";
18
- import * as i8 from "@angular/material/icon";
19
- import * as i9 from "@angular/cdk/drag-drop";
20
- import * as i10 from "../../../utilities/directives/styler";
21
- import * as i11 from "./paginator.component";
22
- export class GenericTableComponent {
23
- constructor(sort, state, viewContainer, injector) {
24
- this.sort = sort;
25
- this.state = state;
26
- this.viewContainer = viewContainer;
27
- this.IndexColumn = false;
28
- this.SelectionColumn = false;
29
- this.isSticky = false;
30
- this.keys = [];
31
- this.rowDefArr = [];
32
- this.columns = [];
33
- this.myColumns = {};
34
- this.trackByFunction = (index, item) => {
35
- if (!item) {
36
- return null;
37
- }
38
- if (this.trackBy) {
39
- return item[this.trackBy];
40
- }
41
- return item;
42
- };
43
- this.initializeRowDefs = (defs) => {
44
- this.rowDefArr.forEach(r => this.table.removeRowDef(r));
45
- this.rowDefArr = defs;
46
- defs.forEach(r => {
47
- r.columns = this.columns.concat(Object.values(this.myColumns).filter(c => c.metaData.fieldType !== FieldType.Hidden).map(c => c.metaData.key));
48
- if (this.table) {
49
- this.table.addRowDef(r);
50
- }
51
- });
52
- };
53
- this.selection = new SelectionModel(true, []);
54
- this.selection$ = this.selection.changed;
55
- this.masterToggleChecked$ = this.selection$.pipe(map(() => this.selection.hasValue() && this.isAllSelected()));
56
- this.masterToggleIndeterminate$ = this.selection$.pipe(map(() => this.selection.hasValue() && !this.isAllSelected()));
57
- this.tableWidth = this.state.getUserDefinedTableSize$.pipe(previousAndCurrent(0), map(([previousUserDefinedWidth, currentUserDefinedWidth]) => {
58
- if (currentUserDefinedWidth) {
59
- return ({ width: `${currentUserDefinedWidth}px` });
60
- }
61
- if (wasReset()) {
62
- return ({ width: 'initial' });
63
- }
64
- return ({});
65
- function wasReset() {
66
- return (previousUserDefinedWidth ?? 0) >= 0 && currentUserDefinedWidth == null;
67
- }
68
- }));
69
- this.collapseFooter$ = this.state.state$.pipe(map(state => state.persistedTableSettings.collapseFooter));
70
- this.injector = Injector.create({ providers: [
71
- { provide: MatTable, useFactory: () => { return this.table; } },
72
- { provide: CdkDropList, useFactory: () => { return this.dropList; } },
73
- ], parent: injector });
74
- }
75
- drop(event) {
76
- this.state.setUserDefinedOrder({ newOrder: event.currentIndex, oldOrder: event.previousIndex });
77
- }
78
- set disableSort(val) {
79
- this._disableSort = val;
80
- if (val) {
81
- if (this.dataSource?.sort) {
82
- this.dataSource.sort = null;
83
- }
84
- }
85
- else {
86
- if (this.dataSource && !this.dataSource.sort) {
87
- this.dataSource.sort = this.sort;
88
- }
89
- }
90
- }
91
- get disableSort() { return this._disableSort; }
92
- ngOnChanges(changes) {
93
- if (changes.rows && this.rows && this.myColumns.length) {
94
- this.initializeRowDefs([...this.rows]);
95
- }
96
- }
97
- ngOnInit() {
98
- if (this.SelectionColumn) {
99
- this.columns.push('select');
100
- }
101
- if (this.IndexColumn) {
102
- this.columns.push('index');
103
- }
104
- this.createDataSource();
105
- this.state.on(this.columnInfos, columns => {
106
- columns.forEach(ci => this.addMetaData(ci));
107
- });
108
- this.initializeRowDefs([...this.rows]);
109
- this.state.on(this.state.displayedColumns$, keys => {
110
- this.keys = [...this.columns, ...keys];
111
- this.rowDefArr?.forEach(row => row.columns = this.keys);
112
- });
113
- this.showHeader$ = this.state.tableSettings$.pipe(map(settings => !(settings.hideColumnHeader)));
114
- }
115
- createDataSource() {
116
- this.dataSource = new GenericTableDataSource(this.data$.pipe(tap((d) => this.selection.clear())));
117
- if (!this.disableSort) {
118
- this.dataSource.sort = this.sort;
119
- }
120
- }
121
- isGroupHeader(_, row) {
122
- return row.isGroupHeader;
123
- }
124
- isGroupFooter(_, row) {
125
- return row.isGroupFooter;
126
- }
127
- updateGroup(group) {
128
- this.state.updateGroup({
129
- ...group,
130
- isExpanded: !group.isExpanded
131
- });
132
- }
133
- addMetaData(column) {
134
- let columnBuilder = this.myColumns[column.metaData.key];
135
- if (columnBuilder) {
136
- columnBuilder.metaData = column.metaData;
137
- }
138
- else {
139
- const component = this.viewContainer.createComponent(ColumnBuilderComponent, {
140
- index: 0,
141
- injector: this.injector
142
- });
143
- component.instance.customCell = column.customCell;
144
- component.instance.metaData = column.metaData;
145
- component.instance.data$ = this.data$;
146
- this.myColumns[column.metaData.key] = component.instance;
147
- }
148
- }
149
- isAllSelected() {
150
- const numSelected = this.selection.selected.length;
151
- const numRows = this.dataSource.data.length;
152
- return numSelected === numRows;
153
- }
154
- /** Selects all rows if they are not all selected; otherwise clear selection. */
155
- masterToggle() {
156
- this.isAllSelected() ?
157
- this.selection.clear() :
158
- this.selection.select(...this.dataSource.data);
159
- }
160
- }
161
- GenericTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: GenericTableComponent, deps: [{ token: i1.MatSort }, { token: i2.TableStore }, { token: i0.ViewContainerRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
162
- GenericTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.2", type: GenericTableComponent, selector: "tb-generic-table", inputs: { data$: "data$", IndexColumn: "IndexColumn", SelectionColumn: "SelectionColumn", trackBy: "trackBy", rows: "rows", isSticky: "isSticky", columnBuilders: "columnBuilders", columnInfos: "columnInfos", groupHeaderTemplate: "groupHeaderTemplate", disableSort: "disableSort" }, outputs: { selection$: "selection$" }, viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true, static: true }, { propertyName: "dropList", first: true, predicate: CdkDropList, descendants: true, static: true }, { propertyName: "tableElRef", first: true, predicate: ["table"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<mat-table\r\n cdkDropList\r\n cdkDropListLockAxis='x'\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n class=\"table-drag-list\"\r\n #table\r\n [dataSource]=\"dataSource\"\r\n [trackBy]='trackByFunction'\r\n [styler]=\"tableWidth | async\"\r\n>\r\n\r\n <ng-container matColumnDef=\"select\">\r\n\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\">\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"!!(masterToggleChecked$ | async)\"\r\n [indeterminate]=\"masterToggleIndeterminate$ | async\">\r\n </mat-checkbox>\r\n </mat-header-cell>\r\n\r\n <mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox *ngIf=\"!row.isGroupFooter\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\">\r\n </mat-checkbox>\r\n </mat-cell>\r\n\r\n <mat-footer-cell *matFooterCellDef>\r\n {{ selection.selected.length }}\r\n </mat-footer-cell>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"index\">\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" >#</mat-header-cell>\r\n <mat-cell *matCellDef=\"let i = index;\"> {{ (tbPaginator.paginator.pageIndex * tbPaginator.paginator.pageSize) + i + 1 }} </mat-cell>\r\n <mat-footer-cell *matFooterCellDef></mat-footer-cell>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"groupHeader\">\r\n <mat-cell *matCellDef=\"let row\">\r\n <div [style.paddingLeft]=\"row.padding + 'px !important'\" >\r\n <button mat-icon-button (click)=\"updateGroup(row);\">\r\n <mat-icon *ngIf=\"!row.isExpanded\">chevron_right</mat-icon>\r\n <mat-icon *ngIf=\"row.isExpanded\">expand_more</mat-icon>\r\n </button>\r\n {{row.groupHeaderName}}\r\n </div>\r\n <div style=\"flex-grow: 1\">\r\n <ng-container *ngTemplateOutlet=\"groupHeaderTemplate; context: { element: row }\"></ng-container>\r\n </div>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"showHeader$ | async\">\r\n <mat-header-row *matHeaderRowDef=\"keys; sticky: isSticky\"></mat-header-row>\r\n </ng-container>\r\n <mat-row *matRowDef=\"let row; columns: keys; let i = index\"></mat-row>\r\n <mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\" style=\"background-color: white;\"></mat-row>\r\n <mat-row *matRowDef=\"let row; columns: keys; when: isGroupFooter\" style=\"background-color: whitesmoke;\"></mat-row>\r\n <mat-footer-row *matFooterRowDef=\"keys\"></mat-footer-row>\r\n\r\n</mat-table>\r\n\r\n<div class=\"flx-row-end sticky\">\r\n <tb-paginator #tbPaginator\r\n [dataSource]=\"dataSource\"\r\n [tableElRef]=\"tableElRef\"\r\n [data$]=\"data$\">\r\n </tb-paginator>\r\n\r\n <mat-icon [matTooltip]=\"(collapseFooter$ | async) ? 'expand' : 'collapse'\" class=\"collapse-icon footer\" (click)=\"state.toggleCollapseFooter()\">\r\n {{(collapseFooter$ | async) ? 'expand_more' : 'expand_less'}}\r\n </mat-icon>\r\n</div>\r\n", styles: [".mat-mdc-row:nth-child(odd){background-color:#cdeefe}.sticky{bottom:0;position:sticky;border-top:.5px solid rgba(0,0,0,.12)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;background-color:#fff}:host::ng-deep .mat-mdc-paginator-container{min-height:initial!important}.group-header{display:flex}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell,:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:0 0 0 .2rem;line-height:normal}\n", ".collapse-icon{font-size:16px;height:16px;padding-bottom:.2rem;color:#3f51b5}.collapse-icon.header{align-self:flex-end}.collapse-icon.footer{align-self:flex-start}.collapse-icon:hover{cursor:pointer}.hide{display:none}\n"], dependencies: [{ 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.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i4.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i4.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i4.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i10.StylerDirective, selector: "[styler]", inputs: ["styler"] }, { kind: "component", type: i11.PaginatorComponent, selector: "tb-paginator", inputs: ["dataSource", "tableElRef", "data$"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
163
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: GenericTableComponent, decorators: [{
164
- type: Component,
165
- args: [{ selector: 'tb-generic-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-table\r\n cdkDropList\r\n cdkDropListLockAxis='x'\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n class=\"table-drag-list\"\r\n #table\r\n [dataSource]=\"dataSource\"\r\n [trackBy]='trackByFunction'\r\n [styler]=\"tableWidth | async\"\r\n>\r\n\r\n <ng-container matColumnDef=\"select\">\r\n\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\">\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"!!(masterToggleChecked$ | async)\"\r\n [indeterminate]=\"masterToggleIndeterminate$ | async\">\r\n </mat-checkbox>\r\n </mat-header-cell>\r\n\r\n <mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox *ngIf=\"!row.isGroupFooter\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\">\r\n </mat-checkbox>\r\n </mat-cell>\r\n\r\n <mat-footer-cell *matFooterCellDef>\r\n {{ selection.selected.length }}\r\n </mat-footer-cell>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"index\">\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" >#</mat-header-cell>\r\n <mat-cell *matCellDef=\"let i = index;\"> {{ (tbPaginator.paginator.pageIndex * tbPaginator.paginator.pageSize) + i + 1 }} </mat-cell>\r\n <mat-footer-cell *matFooterCellDef></mat-footer-cell>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"groupHeader\">\r\n <mat-cell *matCellDef=\"let row\">\r\n <div [style.paddingLeft]=\"row.padding + 'px !important'\" >\r\n <button mat-icon-button (click)=\"updateGroup(row);\">\r\n <mat-icon *ngIf=\"!row.isExpanded\">chevron_right</mat-icon>\r\n <mat-icon *ngIf=\"row.isExpanded\">expand_more</mat-icon>\r\n </button>\r\n {{row.groupHeaderName}}\r\n </div>\r\n <div style=\"flex-grow: 1\">\r\n <ng-container *ngTemplateOutlet=\"groupHeaderTemplate; context: { element: row }\"></ng-container>\r\n </div>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"showHeader$ | async\">\r\n <mat-header-row *matHeaderRowDef=\"keys; sticky: isSticky\"></mat-header-row>\r\n </ng-container>\r\n <mat-row *matRowDef=\"let row; columns: keys; let i = index\"></mat-row>\r\n <mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\" style=\"background-color: white;\"></mat-row>\r\n <mat-row *matRowDef=\"let row; columns: keys; when: isGroupFooter\" style=\"background-color: whitesmoke;\"></mat-row>\r\n <mat-footer-row *matFooterRowDef=\"keys\"></mat-footer-row>\r\n\r\n</mat-table>\r\n\r\n<div class=\"flx-row-end sticky\">\r\n <tb-paginator #tbPaginator\r\n [dataSource]=\"dataSource\"\r\n [tableElRef]=\"tableElRef\"\r\n [data$]=\"data$\">\r\n </tb-paginator>\r\n\r\n <mat-icon [matTooltip]=\"(collapseFooter$ | async) ? 'expand' : 'collapse'\" class=\"collapse-icon footer\" (click)=\"state.toggleCollapseFooter()\">\r\n {{(collapseFooter$ | async) ? 'expand_more' : 'expand_less'}}\r\n </mat-icon>\r\n</div>\r\n", styles: [".mat-mdc-row:nth-child(odd){background-color:#cdeefe}.sticky{bottom:0;position:sticky;border-top:.5px solid rgba(0,0,0,.12)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;background-color:#fff}:host::ng-deep .mat-mdc-paginator-container{min-height:initial!important}.group-header{display:flex}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell,:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:0 0 0 .2rem;line-height:normal}\n", ".collapse-icon{font-size:16px;height:16px;padding-bottom:.2rem;color:#3f51b5}.collapse-icon.header{align-self:flex-end}.collapse-icon.footer{align-self:flex-start}.collapse-icon:hover{cursor:pointer}.hide{display:none}\n"] }]
166
- }], ctorParameters: function () { return [{ type: i1.MatSort }, { type: i2.TableStore }, { type: i0.ViewContainerRef }, { type: i0.Injector }]; }, propDecorators: { data$: [{
167
- type: Input
168
- }], IndexColumn: [{
169
- type: Input
170
- }], SelectionColumn: [{
171
- type: Input
172
- }], trackBy: [{
173
- type: Input
174
- }], rows: [{
175
- type: Input
176
- }], isSticky: [{
177
- type: Input
178
- }], columnBuilders: [{
179
- type: Input
180
- }], columnInfos: [{
181
- type: Input
182
- }], groupHeaderTemplate: [{
183
- type: Input
184
- }], disableSort: [{
185
- type: Input
186
- }], table: [{
187
- type: ViewChild,
188
- args: [MatTable, { static: true }]
189
- }], dropList: [{
190
- type: ViewChild,
191
- args: [CdkDropList, { static: true }]
192
- }], tableElRef: [{
193
- type: ViewChild,
194
- args: ['table', { read: ElementRef }]
195
- }], selection$: [{
196
- type: Output
197
- }] } });
198
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jb21wb25lbnRzL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jb21wb25lbnRzL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxLQUFLLEVBQ0wsdUJBQXVCLEVBQ3ZCLE1BQU0sRUFLTixVQUFVLEVBQ1YsUUFBUSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBYSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFMUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVwRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFbEUsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7Ozs7O0FBU2xFLE1BQU0sT0FBTyxxQkFBcUI7SUE0Q2hDLFlBQ1UsSUFBYSxFQUNkLEtBQWlCLEVBQ2hCLGFBQStCLEVBQ3ZDLFFBQWtCO1FBSFYsU0FBSSxHQUFK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SUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7O2tIQXRLVSxxQkFBcUI7c0dBQXJCLHFCQUFxQixnYUFnQ3JCLFFBQVEseUZBQ1IsV0FBVywrSEFDSyxVQUFVLGtEQ3JFdkMsMHhHQTRFQTsyRkR6Q2EscUJBQXFCO2tCQU5qQyxTQUFTOytCQUNFLGtCQUFrQixtQkFHWCx1QkFBdUIsQ0FBQyxNQUFNOzZLQVN0QyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUdPLFdBQVc7c0JBQXZCLEtBQUs7Z0JBY2lDLEtBQUs7c0JBQTNDLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDSyxRQUFRO3NCQUFqRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ0EsVUFBVTtzQkFBakQsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFDO2dCQXFINUIsVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIFZpZXdDaGlsZCxcclxuICBJbnB1dCxcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBPbkluaXQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbiAgRWxlbWVudFJlZixcclxuICBJbmplY3RvcixcclxuICBUZW1wbGF0ZVJlZixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0U29ydCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xyXG5pbXBvcnQgeyBNYXRSb3dEZWYsIE1hdFRhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcclxuaW1wb3J0IHsgVGFibGVTdG9yZSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvdGFibGUtc3RvcmUnO1xyXG5pbXBvcnQgeyB0YXAsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQ29sdW1uQnVpbGRlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbHVtbi1idWlsZGVyL2NvbHVtbi1idWlsZGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RpY3Rpb25hcnknO1xyXG5pbXBvcnQgeyBHZW5lcmljVGFibGVEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9HZW5lcmljVGFibGVEYXRhU291cmNlJztcclxuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtZGVmJztcclxuaW1wb3J0IHsgcHJldmlvdXNBbmRDdXJyZW50IH0gZnJvbSAnLi4vLi4vLi4vcnhqcy9yeGpzLW9wZXJhdG9ycyc7XHJcbmltcG9ydCB7IENvbHVtbkluZm8gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0NvbHVtbkluZm8nO1xyXG5pbXBvcnQgeyBDZGtEcmFnRHJvcCwgQ2RrRHJvcExpc3QgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcclxuaW1wb3J0IHsgR3JvdXAgfSBmcm9tICcuLi8uLi9jbGFzc2VzL1RhYmxlU3RhdGUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0Yi1nZW5lcmljLXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuc2NzcycsJy4uLy4uL3N0eWxlcy9jb2xsYXBzZXIuc3R5bGVzLnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIEdlbmVyaWNUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG5cclxuICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxzdHJpbmdbXT4pIHtcclxuICAgIHRoaXMuc3RhdGUuc2V0VXNlckRlZmluZWRPcmRlcih7bmV3T3JkZXI6ZXZlbnQuY3VycmVudEluZGV4LG9sZE9yZGVyOmV2ZW50LnByZXZpb3VzSW5kZXh9KVxyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgZGF0YSQhOiBPYnNlcnZhYmxlPGFueVtdPjtcclxuICBASW5wdXQoKSBJbmRleENvbHVtbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIFNlbGVjdGlvbkNvbHVtbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHRyYWNrQnkhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcm93cyE6IFF1ZXJ5TGlzdDxNYXRSb3dEZWY8YW55Pj47XHJcbiAgQElucHV0KCkgaXNTdGlja3kgPSBmYWxzZTtcclxuICBASW5wdXQoKSBjb2x1bW5CdWlsZGVycyE6IENvbHVtbkJ1aWxkZXJDb21wb25lbnRbXTtcclxuICBASW5wdXQoKSBjb2x1bW5JbmZvcyE6IE9ic2VydmFibGU8Q29sdW1uSW5mb1tdPjtcclxuICBASW5wdXQoKSBncm91cEhlYWRlclRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgcHJpdmF0ZSBfZGlzYWJsZVNvcnQhOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHNldCBkaXNhYmxlU29ydCh2YWw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2Rpc2FibGVTb3J0ID0gdmFsO1xyXG4gICAgaWYgKHZhbCkge1xyXG4gICAgICBpZiAodGhpcy5kYXRhU291cmNlPy5zb3J0KSB7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlLnNvcnQgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5kYXRhU291cmNlICYmICF0aGlzLmRhdGFTb3VyY2Uuc29ydCkge1xyXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBkaXNhYmxlU29ydCgpIHsgcmV0dXJuIHRoaXMuX2Rpc2FibGVTb3J0OyB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoTWF0VGFibGUsIHsgc3RhdGljOiB0cnVlIH0pIHRhYmxlITogTWF0VGFibGU8YW55PjtcclxuICBAVmlld0NoaWxkKENka0Ryb3BMaXN0LCB7IHN0YXRpYzogdHJ1ZSB9KSBkcm9wTGlzdCE6IENka0Ryb3BMaXN0O1xyXG4gIEBWaWV3Q2hpbGQoJ3RhYmxlJywge3JlYWQ6IEVsZW1lbnRSZWZ9KSB0YWJsZUVsUmVmITogRWxlbWVudFJlZjtcclxuICBjdXJyZW50Q29sdW1ucyE6IHN0cmluZ1tdO1xyXG4gIGRhdGFTb3VyY2UhOiBHZW5lcmljVGFibGVEYXRhU291cmNlPGFueT47XHJcbiAga2V5czogc3RyaW5nIFtdID0gW107XHJcbiAgaW5qZWN0b3I6IEluamVjdG9yO1xyXG4gIHJvd0RlZkFyciA6TWF0Um93RGVmPGFueT5bXT0gW107XHJcbiAgY29sdW1uczpzdHJpbmcgW10gPSBbXTtcclxuICBteUNvbHVtbnM6IERpY3Rpb25hcnk8Q29sdW1uQnVpbGRlckNvbXBvbmVudD4gPSB7fTtcclxuICBzaG93SGVhZGVyJCE6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzb3J0OiBNYXRTb3J0LFxyXG4gICAgcHVibGljIHN0YXRlOiBUYWJsZVN0b3JlLFxyXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgKSB7XHJcblxyXG4gICAgdGhpcy5pbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7IHByb3ZpZGVyczogW1xyXG4gICAgICB7cHJvdmlkZTogTWF0VGFibGUsIHVzZUZhY3Rvcnk6ICgpPT4ge3JldHVybiB0aGlzLnRhYmxlfSB9LFxyXG4gICAgICB7cHJvdmlkZTogQ2RrRHJvcExpc3QsIHVzZUZhY3Rvcnk6ICgpPT4ge3JldHVybiB0aGlzLmRyb3BMaXN0fSB9LFxyXG4gICAgXSwgcGFyZW50OiBpbmplY3Rvcn0pO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeUZ1bmN0aW9uID0gKGluZGV4Om51bWJlciwgaXRlbTogYW55KSA9PiB7XHJcbiAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50cmFja0J5KSB7XHJcbiAgICAgIHJldHVybiBpdGVtW3RoaXMudHJhY2tCeV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXRlbTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzLnJvd3MgJiYgdGhpcy5yb3dzICYmIHRoaXMubXlDb2x1bW5zLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVSb3dEZWZzKFsuLi50aGlzLnJvd3NdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgaWYgKHRoaXMuU2VsZWN0aW9uQ29sdW1uKSB7XHJcbiAgICAgIHRoaXMuY29sdW1ucy5wdXNoKCdzZWxlY3QnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5JbmRleENvbHVtbikge1xyXG4gICAgIHRoaXMuY29sdW1ucy5wdXNoKCdpbmRleCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY3JlYXRlRGF0YVNvdXJjZSgpO1xyXG5cclxuICAgIHRoaXMuc3RhdGUub24odGhpcy5jb2x1bW5JbmZvcywgY29sdW1ucyA9PiB7XHJcbiAgICAgIGNvbHVtbnMuZm9yRWFjaChjaSA9PiB0aGlzLmFkZE1ldGFEYXRhKGNpKSlcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaW5pdGlhbGl6ZVJvd0RlZnMoWy4uLnRoaXMucm93c10pO1xyXG5cclxuICAgIHRoaXMuc3RhdGUub24odGhpcy5zdGF0ZS5kaXNwbGF5ZWRDb2x1bW5zJCwga2V5cyA9PiB7XHJcbiAgICAgIHRoaXMua2V5cyA9IFsuLi50aGlzLmNvbHVtbnMsIC4uLmtleXNdO1xyXG4gICAgICB0aGlzLnJvd0RlZkFycj8uZm9yRWFjaChyb3cgPT4gcm93LmNvbHVtbnMgPSB0aGlzLmtleXMpXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNob3dIZWFkZXIkID0gdGhpcy5zdGF0ZS50YWJsZVNldHRpbmdzJC5waXBlKG1hcChzZXR0aW5ncyA9PiAhKHNldHRpbmdzLmhpZGVDb2x1bW5IZWFkZXIpKSk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVEYXRhU291cmNlKCkge1xyXG4gICAgdGhpcy5kYXRhU291cmNlID0gbmV3IEdlbmVyaWNUYWJsZURhdGFTb3VyY2UoXHJcbiAgICAgIHRoaXMuZGF0YSQucGlwZSh0YXAoKGQpID0+IHRoaXMuc2VsZWN0aW9uLmNsZWFyKCkgKSlcclxuICAgICk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmRpc2FibGVTb3J0KSB7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNHcm91cEhlYWRlcihfOiBudW1iZXIsIHJvdzogeyBpc0dyb3VwSGVhZGVyOiBib29sZWFuIH0pIHtcclxuICAgIHJldHVybiByb3cuaXNHcm91cEhlYWRlcjtcclxuICB9XHJcblxyXG4gIGlzR3JvdXBGb290ZXIoXzogbnVtYmVyLCByb3c6IHsgaXNHcm91cEZvb3RlcjogYm9vbGVhbiB9KSB7XHJcbiAgICByZXR1cm4gcm93LmlzR3JvdXBGb290ZXI7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVHcm91cChncm91cDogR3JvdXApOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdGUudXBkYXRlR3JvdXAoe1xyXG4gICAgICAuLi5ncm91cCxcclxuICAgICAgaXNFeHBhbmRlZDogIWdyb3VwLmlzRXhwYW5kZWRcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkTWV0YURhdGEoY29sdW1uOiBDb2x1bW5JbmZvKSB7XHJcbiAgICBsZXQgY29sdW1uQnVpbGRlciA9IHRoaXMubXlDb2x1bW5zW2NvbHVtbi5tZXRhRGF0YS5rZXldO1xyXG4gICAgaWYoY29sdW1uQnVpbGRlcikge1xyXG4gICAgICBjb2x1bW5CdWlsZGVyLm1ldGFEYXRhID0gY29sdW1uLm1ldGFEYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChDb2x1bW5CdWlsZGVyQ29tcG9uZW50LCB7XHJcbiAgICAgICAgaW5kZXg6IDAsXHJcbiAgICAgICAgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3JcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbXBvbmVudC5pbnN0YW5jZS5jdXN0b21DZWxsID0gY29sdW1uLmN1c3RvbUNlbGw7XHJcbiAgICAgIGNvbXBvbmVudC5pbnN0YW5jZS5tZXRhRGF0YSA9IGNvbHVtbi5tZXRhRGF0YTtcclxuICAgICAgY29tcG9uZW50Lmluc3RhbmNlLmRhdGEkID0gdGhpcy5kYXRhJDtcclxuICAgICAgdGhpcy5teUNvbHVtbnNbY29sdW1uLm1ldGFEYXRhLmtleV0gPSBjb21wb25lbnQuaW5zdGFuY2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplUm93RGVmcyA9IChkZWZzOk1hdFJvd0RlZjxhbnk+W10pPT57XHJcbiAgICB0aGlzLnJvd0RlZkFyci5mb3JFYWNoKHI9PnRoaXMudGFibGUucmVtb3ZlUm93RGVmKHIpKTtcclxuICAgIHRoaXMucm93RGVmQXJyID0gZGVmcztcclxuICAgIGRlZnMuZm9yRWFjaChyID0+IHtcclxuICAgICAgci5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLmNvbmNhdChPYmplY3QudmFsdWVzKHRoaXMubXlDb2x1bW5zKS5maWx0ZXIoYyA9PiBjLm1ldGFEYXRhLmZpZWxkVHlwZSAhPT0gRmllbGRUeXBlLkhpZGRlbikubWFwKGMgPT4gYy5tZXRhRGF0YS5rZXkpKTtcclxuICAgICAgaWYgKHRoaXMudGFibGUpIHtcclxuICAgICAgICB0aGlzLnRhYmxlLmFkZFJvd0RlZihyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3Rpb24gOiBTZWxlY3Rpb25Nb2RlbDxhbnk+ID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odHJ1ZSwgW10pO1xyXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb24kOiBPYnNlcnZhYmxlPGFueT4gPSB0aGlzLnNlbGVjdGlvbi5jaGFuZ2VkO1xyXG4gIG1hc3RlclRvZ2dsZUNoZWNrZWQkID0gdGhpcy5zZWxlY3Rpb24kLnBpcGUobWFwKCgpPT50aGlzLnNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIHRoaXMuaXNBbGxTZWxlY3RlZCgpKSk7XHJcbiAgbWFzdGVyVG9nZ2xlSW5kZXRlcm1pbmF0ZSQgPSB0aGlzLnNlbGVjdGlvbiQucGlwZShtYXAoKCk9PnRoaXMuc2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgIXRoaXMuaXNBbGxTZWxlY3RlZCgpKSk7XHJcblxyXG4gIGlzQWxsU2VsZWN0ZWQoKSB7XHJcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcclxuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGg7XHJcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPT09IG51bVJvd3M7XHJcbiAgfVxyXG5cclxuICAvKiogU2VsZWN0cyBhbGwgcm93cyBpZiB0aGV5IGFyZSBub3QgYWxsIHNlbGVjdGVkOyBvdGhlcndpc2UgY2xlYXIgc2VsZWN0aW9uLiAqL1xyXG4gIG1hc3RlclRvZ2dsZSgpIHtcclxuICAgIHRoaXMuaXNBbGxTZWxlY3RlZCgpID9cclxuICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKSA6XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCguLi50aGlzLmRhdGFTb3VyY2UuZGF0YSk7XHJcbiAgfVxyXG5cclxuICB0YWJsZVdpZHRoID0gdGhpcy5zdGF0ZS5nZXRVc2VyRGVmaW5lZFRhYmxlU2l6ZSQucGlwZShcclxuICAgIHByZXZpb3VzQW5kQ3VycmVudDxudW1iZXIgfCB1bmRlZmluZWQ+KDApLFxyXG4gICAgbWFwKChbcHJldmlvdXNVc2VyRGVmaW5lZFdpZHRoLCBjdXJyZW50VXNlckRlZmluZWRXaWR0aF0pID0+IHtcclxuICAgICAgaWYoIGN1cnJlbnRVc2VyRGVmaW5lZFdpZHRoKXtcclxuICAgICAgICByZXR1cm4gKHt3aWR0aDpgJHtjdXJyZW50VXNlckRlZmluZWRXaWR0aH1weGB9KTtcclxuICAgICAgfSBpZiggd2FzUmVzZXQoKSApe1xyXG4gICAgICAgIHJldHVybiAoe3dpZHRoOidpbml0aWFsJ30pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAoe30pO1xyXG5cclxuICAgICAgZnVuY3Rpb24gd2FzUmVzZXQoKXtcclxuICAgICAgICByZXR1cm4gKHByZXZpb3VzVXNlckRlZmluZWRXaWR0aCA/PyAwKSA+PTAgJiYgY3VycmVudFVzZXJEZWZpbmVkV2lkdGggPT0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBjb2xsYXBzZUZvb3RlciQgPSB0aGlzLnN0YXRlLnN0YXRlJC5waXBlKG1hcChzdGF0ZSA9PiBzdGF0ZS5wZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmNvbGxhcHNlRm9vdGVyKSk7XHJcbn1cclxuIiwiPG1hdC10YWJsZVxyXG4gIGNka0Ryb3BMaXN0XHJcbiAgY2RrRHJvcExpc3RMb2NrQXhpcz0neCdcclxuICBjZGtEcm9wTGlzdE9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiXHJcbiAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudClcIlxyXG4gIGNsYXNzPVwidGFibGUtZHJhZy1saXN0XCJcclxuICAjdGFibGVcclxuICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCJcclxuICBbdHJhY2tCeV09J3RyYWNrQnlGdW5jdGlvbidcclxuICBbc3R5bGVyXT1cInRhYmxlV2lkdGggfCBhc3luY1wiXHJcbj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiPlxyXG5cclxuICAgICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwiZi1tYXQtaGVhZGVyLWNlbGxcIj5cclxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9XCIkZXZlbnQgPyBtYXN0ZXJUb2dnbGUoKSA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCIhIShtYXN0ZXJUb2dnbGVDaGVja2VkJCB8IGFzeW5jKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cIm1hc3RlclRvZ2dsZUluZGV0ZXJtaW5hdGUkIHwgYXN5bmNcIj5cclxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgIDwvbWF0LWhlYWRlci1jZWxsPlxyXG5cclxuICAgICAgICA8bWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XHJcbiAgICAgICAgICA8bWF0LWNoZWNrYm94ICpuZ0lmPVwiIXJvdy5pc0dyb3VwRm9vdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gc2VsZWN0aW9uLnRvZ2dsZShyb3cpIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdylcIj5cclxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgIDwvbWF0LWNlbGw+XHJcblxyXG4gICAgICAgIDxtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWY+XHJcbiAgICAgICAgICB7eyBzZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoIH19XHJcbiAgICAgICAgPC9tYXQtZm9vdGVyLWNlbGw+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJpbmRleFwiPlxyXG4gICAgICAgICAgPG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cImYtbWF0LWhlYWRlci1jZWxsXCIgPiM8L21hdC1oZWFkZXItY2VsbD5cclxuICAgICAgICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBpID0gaW5kZXg7XCI+IHt7ICh0YlBhZ2luYXRvci5wYWdpbmF0b3IucGFnZUluZGV4ICogdGJQYWdpbmF0b3IucGFnaW5hdG9yLnBhZ2VTaXplKSArICBpICsgMSB9fSA8L21hdC1jZWxsPlxyXG4gICAgICAgICAgPG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZj48L21hdC1mb290ZXItY2VsbD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImdyb3VwSGVhZGVyXCI+XHJcbiAgICAgICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxyXG4gICAgICAgICAgPGRpdiBbc3R5bGUucGFkZGluZ0xlZnRdPVwicm93LnBhZGRpbmcgKyAncHggIWltcG9ydGFudCdcIiA+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJ1cGRhdGVHcm91cChyb3cpO1wiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFyb3cuaXNFeHBhbmRlZFwiPmNoZXZyb25fcmlnaHQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInJvdy5pc0V4cGFuZGVkXCI+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAge3tyb3cuZ3JvdXBIZWFkZXJOYW1lfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXgtZ3JvdzogMVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ3JvdXBIZWFkZXJUZW1wbGF0ZTsgY29udGV4dDogeyBlbGVtZW50OiByb3cgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9tYXQtY2VsbD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93SGVhZGVyJCB8IGFzeW5jXCI+XHJcbiAgICA8bWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImtleXM7IHN0aWNreTogaXNTdGlja3lcIj48L21hdC1oZWFkZXItcm93PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG4gIDxtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBrZXlzOyBsZXQgaSA9IGluZGV4XCI+PC9tYXQtcm93PlxyXG4gIDxtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ2dyb3VwSGVhZGVyJ107IHdoZW46IGlzR3JvdXBIZWFkZXJcIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHdoaXRlO1wiPjwvbWF0LXJvdz5cclxuICA8bWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczoga2V5czsgd2hlbjogaXNHcm91cEZvb3RlclwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogd2hpdGVzbW9rZTtcIj48L21hdC1yb3c+XHJcbiAgPG1hdC1mb290ZXItcm93ICptYXRGb290ZXJSb3dEZWY9XCJrZXlzXCI+PC9tYXQtZm9vdGVyLXJvdz5cclxuXHJcbjwvbWF0LXRhYmxlPlxyXG5cclxuPGRpdiBjbGFzcz1cImZseC1yb3ctZW5kIHN0aWNreVwiPlxyXG4gIDx0Yi1wYWdpbmF0b3IgI3RiUGFnaW5hdG9yXHJcbiAgICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCJcclxuICAgIFt0YWJsZUVsUmVmXT1cInRhYmxlRWxSZWZcIlxyXG4gICAgW2RhdGEkXT1cImRhdGEkXCI+XHJcbiAgPC90Yi1wYWdpbmF0b3I+XHJcblxyXG4gIDxtYXQtaWNvbiBbbWF0VG9vbHRpcF09XCIoY29sbGFwc2VGb290ZXIkIHwgYXN5bmMpID8gJ2V4cGFuZCcgOiAnY29sbGFwc2UnXCIgY2xhc3M9XCJjb2xsYXBzZS1pY29uIGZvb3RlclwiIChjbGljayk9XCJzdGF0ZS50b2dnbGVDb2xsYXBzZUZvb3RlcigpXCI+XHJcbiAgICB7eyhjb2xsYXBzZUZvb3RlciQgfCBhc3luYykgPyAnZXhwYW5kX21vcmUnIDogJ2V4cGFuZF9sZXNzJ319XHJcbiAgPC9tYXQtaWNvbj5cclxuPC9kaXY+XHJcbiJdfQ==
1
+ import { Component, ViewChild, Input, ChangeDetectionStrategy, Output, ElementRef, Injector, } from '@angular/core';
2
+ import { MatTable } from '@angular/material/table';
3
+ import { SelectionModel } from '@angular/cdk/collections';
4
+ import { tap, map } from 'rxjs/operators';
5
+ import { ColumnBuilderComponent } from '../column-builder/column-builder.component';
6
+ import { GenericTableDataSource } from '../../classes/GenericTableDataSource';
7
+ import { FieldType } from '../../interfaces/report-def';
8
+ import { previousAndCurrent } from '../../../rxjs/rxjs-operators';
9
+ import { CdkDropList } from '@angular/cdk/drag-drop';
10
+ import { PaginatorComponent } from './paginator.component';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "@angular/material/sort";
13
+ import * as i2 from "../../classes/table-store";
14
+ import * as i3 from "@angular/common";
15
+ import * as i4 from "@angular/material/table";
16
+ import * as i5 from "@angular/material/button";
17
+ import * as i6 from "@angular/material/tooltip";
18
+ import * as i7 from "@angular/material/checkbox";
19
+ import * as i8 from "@angular/material/icon";
20
+ import * as i9 from "@angular/cdk/drag-drop";
21
+ import * as i10 from "../../../utilities/directives/styler";
22
+ import * as i11 from "./paginator.component";
23
+ export class GenericTableComponent {
24
+ constructor(sort, state, viewContainer, injector) {
25
+ this.sort = sort;
26
+ this.state = state;
27
+ this.viewContainer = viewContainer;
28
+ this.IndexColumn = false;
29
+ this.SelectionColumn = false;
30
+ this.isSticky = false;
31
+ this.keys = [];
32
+ this.rowDefArr = [];
33
+ this.columns = [];
34
+ this.myColumns = {};
35
+ this.trackByFunction = (index, item) => {
36
+ if (!item) {
37
+ return null;
38
+ }
39
+ if (this.trackBy) {
40
+ return item[this.trackBy];
41
+ }
42
+ return item;
43
+ };
44
+ this.initializeRowDefs = (defs) => {
45
+ this.rowDefArr.forEach(r => this.table.removeRowDef(r));
46
+ this.rowDefArr = defs;
47
+ defs.forEach(r => {
48
+ r.columns = this.columns.concat(Object.values(this.myColumns).filter(c => c.metaData.fieldType !== FieldType.Hidden).map(c => c.metaData.key));
49
+ if (this.table) {
50
+ this.table.addRowDef(r);
51
+ }
52
+ });
53
+ };
54
+ this.selection = new SelectionModel(true, []);
55
+ this.selection$ = this.selection.changed;
56
+ this.masterToggleChecked$ = this.selection$.pipe(map(() => this.selection.hasValue() && this.isAllSelected()));
57
+ this.masterToggleIndeterminate$ = this.selection$.pipe(map(() => this.selection.hasValue() && !this.isAllSelected()));
58
+ this.tableWidth = this.state.getUserDefinedTableSize$.pipe(previousAndCurrent(0), map(([previousUserDefinedWidth, currentUserDefinedWidth]) => {
59
+ if (currentUserDefinedWidth) {
60
+ return ({ width: `${currentUserDefinedWidth}px` });
61
+ }
62
+ if (wasReset()) {
63
+ return ({ width: 'initial' });
64
+ }
65
+ return ({});
66
+ function wasReset() {
67
+ return (previousUserDefinedWidth ?? 0) >= 0 && currentUserDefinedWidth == null;
68
+ }
69
+ }));
70
+ this.collapseFooter$ = this.state.state$.pipe(map(state => state.persistedTableSettings.collapseFooter));
71
+ this.injector = Injector.create({ providers: [
72
+ { provide: MatTable, useFactory: () => { return this.table; } },
73
+ { provide: CdkDropList, useFactory: () => { return this.dropList; } },
74
+ ], parent: injector });
75
+ }
76
+ drop(event) {
77
+ this.state.setUserDefinedOrder({ newOrder: event.currentIndex, oldOrder: event.previousIndex });
78
+ }
79
+ set disableSort(val) {
80
+ this._disableSort = val;
81
+ if (val) {
82
+ if (this.dataSource?.sort) {
83
+ this.dataSource.sort = null;
84
+ }
85
+ }
86
+ else {
87
+ if (this.dataSource && !this.dataSource.sort) {
88
+ this.dataSource.sort = this.sort;
89
+ }
90
+ }
91
+ }
92
+ get disableSort() { return this._disableSort; }
93
+ ngOnChanges(changes) {
94
+ if (changes.rows && this.rows && this.myColumns.length) {
95
+ this.initializeRowDefs([...this.rows]);
96
+ }
97
+ }
98
+ ngOnInit() {
99
+ if (this.SelectionColumn) {
100
+ this.columns.push('select');
101
+ }
102
+ if (this.IndexColumn) {
103
+ this.columns.push('index');
104
+ }
105
+ this.createDataSource();
106
+ this.state.on(this.columnInfos, columns => {
107
+ columns.forEach(ci => this.addMetaData(ci));
108
+ });
109
+ this.initializeRowDefs([...this.rows]);
110
+ this.state.on(this.state.displayedColumns$, keys => {
111
+ this.keys = [...this.columns, ...keys];
112
+ this.rowDefArr?.forEach(row => row.columns = this.keys);
113
+ });
114
+ this.showHeader$ = this.state.tableSettings$.pipe(map(settings => !(settings.hideColumnHeader)));
115
+ }
116
+ createDataSource() {
117
+ this.dataSource = new GenericTableDataSource(this.data$.pipe(tap((d) => this.selection.clear())));
118
+ if (!this.disableSort) {
119
+ this.dataSource.sort = this.sort;
120
+ }
121
+ }
122
+ isGroupHeader(_, row) {
123
+ return row.isGroupHeader;
124
+ }
125
+ isGroupFooter(_, row) {
126
+ return row.isGroupFooter;
127
+ }
128
+ updateGroup(group) {
129
+ this.state.updateGroup({
130
+ ...group,
131
+ isExpanded: !group.isExpanded
132
+ });
133
+ }
134
+ addMetaData(column) {
135
+ let columnBuilder = this.myColumns[column.metaData.key];
136
+ if (columnBuilder) {
137
+ columnBuilder.metaData = column.metaData;
138
+ }
139
+ else {
140
+ const component = this.viewContainer.createComponent(ColumnBuilderComponent, {
141
+ index: 0,
142
+ injector: this.injector
143
+ });
144
+ component.instance.customCell = column.customCell;
145
+ component.instance.metaData = column.metaData;
146
+ component.instance.data$ = this.data$;
147
+ this.myColumns[column.metaData.key] = component.instance;
148
+ }
149
+ }
150
+ isAllSelected() {
151
+ const numSelected = this.selection.selected.length;
152
+ const numRows = this.dataSource.data.length;
153
+ return numSelected === numRows;
154
+ }
155
+ /** Selects all rows if they are not all selected; otherwise clear selection. */
156
+ masterToggle() {
157
+ this.isAllSelected() ?
158
+ this.selection.clear() :
159
+ this.selection.select(...this.dataSource.data);
160
+ }
161
+ }
162
+ GenericTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: GenericTableComponent, deps: [{ token: i1.MatSort }, { token: i2.TableStore }, { token: i0.ViewContainerRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
163
+ GenericTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.2", type: GenericTableComponent, selector: "tb-generic-table", inputs: { data$: "data$", IndexColumn: "IndexColumn", SelectionColumn: "SelectionColumn", trackBy: "trackBy", rows: "rows", isSticky: "isSticky", columnBuilders: "columnBuilders", columnInfos: "columnInfos", groupHeaderTemplate: "groupHeaderTemplate", disableSort: "disableSort" }, outputs: { selection$: "selection$" }, viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true, static: true }, { propertyName: "dropList", first: true, predicate: CdkDropList, descendants: true, static: true }, { propertyName: "tableElRef", first: true, predicate: ["table"], descendants: true, read: ElementRef }, { propertyName: "paginatorComponent", first: true, predicate: PaginatorComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<mat-table\n cdkDropList\n cdkDropListLockAxis='x'\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"drop($event)\"\n class=\"table-drag-list\"\n #table\n [dataSource]=\"dataSource\"\n [trackBy]='trackByFunction'\n [styler]=\"tableWidth | async\"\n>\n\n <ng-container matColumnDef=\"select\">\n\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\n [checked]=\"!!(masterToggleChecked$ | async)\"\n [indeterminate]=\"masterToggleIndeterminate$ | async\">\n </mat-checkbox>\n </mat-header-cell>\n\n <mat-cell *matCellDef=\"let row\">\n <mat-checkbox *ngIf=\"!row.isGroupFooter\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </mat-cell>\n\n <mat-footer-cell *matFooterCellDef>\n {{ selection.selected.length }}\n </mat-footer-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"index\">\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" >#</mat-header-cell>\n <mat-cell *matCellDef=\"let i = index;\"> {{ (tbPaginator.paginator.pageIndex * tbPaginator.paginator.pageSize) + i + 1 }} </mat-cell>\n <mat-footer-cell *matFooterCellDef></mat-footer-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"groupHeader\">\n <mat-cell *matCellDef=\"let row\">\n <div [style.paddingLeft]=\"row.padding + 'px !important'\" >\n <button mat-icon-button (click)=\"updateGroup(row);\">\n <mat-icon *ngIf=\"!row.isExpanded\">chevron_right</mat-icon>\n <mat-icon *ngIf=\"row.isExpanded\">expand_more</mat-icon>\n </button>\n {{row.groupHeaderName}}\n </div>\n <div style=\"flex-grow: 1\">\n <ng-container *ngTemplateOutlet=\"groupHeaderTemplate; context: { element: row }\"></ng-container>\n </div>\n </mat-cell>\n </ng-container>\n\n <ng-container *ngIf=\"showHeader$ | async\">\n <mat-header-row *matHeaderRowDef=\"keys; sticky: isSticky\"></mat-header-row>\n </ng-container>\n <mat-row *matRowDef=\"let row; columns: keys; let i = index\"></mat-row>\n <mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\" style=\"background-color: white;\"></mat-row>\n <mat-row *matRowDef=\"let row; columns: keys; when: isGroupFooter\" style=\"background-color: whitesmoke;\"></mat-row>\n <mat-footer-row *matFooterRowDef=\"keys\"></mat-footer-row>\n\n</mat-table>\n\n<div class=\"flx-row-end sticky\">\n <tb-paginator #tbPaginator\n [dataSource]=\"dataSource\"\n [tableElRef]=\"tableElRef\"\n [data$]=\"data$\">\n </tb-paginator>\n\n <mat-icon [matTooltip]=\"(collapseFooter$ | async) ? 'expand' : 'collapse'\" class=\"collapse-icon footer\" (click)=\"state.toggleCollapseFooter()\">\n {{(collapseFooter$ | async) ? 'expand_more' : 'expand_less'}}\n </mat-icon>\n</div>\n", styles: [".mat-mdc-row:nth-child(odd){background-color:#cdeefe}.sticky{bottom:0;position:sticky;border-top:.5px solid rgba(0,0,0,.12)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;background-color:#fff}:host::ng-deep .mat-mdc-paginator-container{min-height:initial!important}.group-header{display:flex}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell,:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:0 0 0 .2rem;line-height:normal}\n", ".collapse-icon{font-size:16px;height:16px;padding-bottom:.2rem;color:#3f51b5}.collapse-icon.header{align-self:flex-end}.collapse-icon.footer{align-self:flex-start}.collapse-icon:hover{cursor:pointer}.hide{display:none}\n"], dependencies: [{ 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.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i4.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i4.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i4.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i10.StylerDirective, selector: "[styler]", inputs: ["styler"] }, { kind: "component", type: i11.PaginatorComponent, selector: "tb-paginator", inputs: ["dataSource", "tableElRef", "data$"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
164
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: GenericTableComponent, decorators: [{
165
+ type: Component,
166
+ args: [{ selector: 'tb-generic-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-table\n cdkDropList\n cdkDropListLockAxis='x'\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"drop($event)\"\n class=\"table-drag-list\"\n #table\n [dataSource]=\"dataSource\"\n [trackBy]='trackByFunction'\n [styler]=\"tableWidth | async\"\n>\n\n <ng-container matColumnDef=\"select\">\n\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\n [checked]=\"!!(masterToggleChecked$ | async)\"\n [indeterminate]=\"masterToggleIndeterminate$ | async\">\n </mat-checkbox>\n </mat-header-cell>\n\n <mat-cell *matCellDef=\"let row\">\n <mat-checkbox *ngIf=\"!row.isGroupFooter\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </mat-cell>\n\n <mat-footer-cell *matFooterCellDef>\n {{ selection.selected.length }}\n </mat-footer-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"index\">\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" >#</mat-header-cell>\n <mat-cell *matCellDef=\"let i = index;\"> {{ (tbPaginator.paginator.pageIndex * tbPaginator.paginator.pageSize) + i + 1 }} </mat-cell>\n <mat-footer-cell *matFooterCellDef></mat-footer-cell>\n </ng-container>\n\n <ng-container matColumnDef=\"groupHeader\">\n <mat-cell *matCellDef=\"let row\">\n <div [style.paddingLeft]=\"row.padding + 'px !important'\" >\n <button mat-icon-button (click)=\"updateGroup(row);\">\n <mat-icon *ngIf=\"!row.isExpanded\">chevron_right</mat-icon>\n <mat-icon *ngIf=\"row.isExpanded\">expand_more</mat-icon>\n </button>\n {{row.groupHeaderName}}\n </div>\n <div style=\"flex-grow: 1\">\n <ng-container *ngTemplateOutlet=\"groupHeaderTemplate; context: { element: row }\"></ng-container>\n </div>\n </mat-cell>\n </ng-container>\n\n <ng-container *ngIf=\"showHeader$ | async\">\n <mat-header-row *matHeaderRowDef=\"keys; sticky: isSticky\"></mat-header-row>\n </ng-container>\n <mat-row *matRowDef=\"let row; columns: keys; let i = index\"></mat-row>\n <mat-row *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\" style=\"background-color: white;\"></mat-row>\n <mat-row *matRowDef=\"let row; columns: keys; when: isGroupFooter\" style=\"background-color: whitesmoke;\"></mat-row>\n <mat-footer-row *matFooterRowDef=\"keys\"></mat-footer-row>\n\n</mat-table>\n\n<div class=\"flx-row-end sticky\">\n <tb-paginator #tbPaginator\n [dataSource]=\"dataSource\"\n [tableElRef]=\"tableElRef\"\n [data$]=\"data$\">\n </tb-paginator>\n\n <mat-icon [matTooltip]=\"(collapseFooter$ | async) ? 'expand' : 'collapse'\" class=\"collapse-icon footer\" (click)=\"state.toggleCollapseFooter()\">\n {{(collapseFooter$ | async) ? 'expand_more' : 'expand_less'}}\n </mat-icon>\n</div>\n", styles: [".mat-mdc-row:nth-child(odd){background-color:#cdeefe}.sticky{bottom:0;position:sticky;border-top:.5px solid rgba(0,0,0,.12)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;background-color:#fff}:host::ng-deep .mat-mdc-paginator-container{min-height:initial!important}.group-header{display:flex}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell,:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:0 0 0 .2rem;line-height:normal}\n", ".collapse-icon{font-size:16px;height:16px;padding-bottom:.2rem;color:#3f51b5}.collapse-icon.header{align-self:flex-end}.collapse-icon.footer{align-self:flex-start}.collapse-icon:hover{cursor:pointer}.hide{display:none}\n"] }]
167
+ }], ctorParameters: function () { return [{ type: i1.MatSort }, { type: i2.TableStore }, { type: i0.ViewContainerRef }, { type: i0.Injector }]; }, propDecorators: { data$: [{
168
+ type: Input
169
+ }], IndexColumn: [{
170
+ type: Input
171
+ }], SelectionColumn: [{
172
+ type: Input
173
+ }], trackBy: [{
174
+ type: Input
175
+ }], rows: [{
176
+ type: Input
177
+ }], isSticky: [{
178
+ type: Input
179
+ }], columnBuilders: [{
180
+ type: Input
181
+ }], columnInfos: [{
182
+ type: Input
183
+ }], groupHeaderTemplate: [{
184
+ type: Input
185
+ }], disableSort: [{
186
+ type: Input
187
+ }], table: [{
188
+ type: ViewChild,
189
+ args: [MatTable, { static: true }]
190
+ }], dropList: [{
191
+ type: ViewChild,
192
+ args: [CdkDropList, { static: true }]
193
+ }], tableElRef: [{
194
+ type: ViewChild,
195
+ args: ['table', { read: ElementRef }]
196
+ }], paginatorComponent: [{
197
+ type: ViewChild,
198
+ args: [PaginatorComponent]
199
+ }], selection$: [{
200
+ type: Output
201
+ }] } });
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jb21wb25lbnRzL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jb21wb25lbnRzL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxLQUFLLEVBQ0wsdUJBQXVCLEVBQ3ZCLE1BQU0sRUFLTixVQUFVLEVBQ1YsUUFBUSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBYSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFMUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVwRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFbEUsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWxFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7Ozs7O0FBUTNELE1BQU0sT0FBTyxxQkFBcUI7SUE2Q2hDLFlBQ1UsSUFBYSxFQUNk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QUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELENBQUM7O2tIQXZLVSxxQkFBcUI7c0dBQXJCLHFCQUFxQixnYUFnQ3JCLFFBQVEseUZBQ1IsV0FBVywrSEFDSyxVQUFVLGtFQUMxQixrQkFBa0IscUVDdkUvQixrb0dBNEVBOzJGRHhDYSxxQkFBcUI7a0JBTmpDLFNBQVM7K0JBQ0Usa0JBQWtCLG1CQUdYLHVCQUF1QixDQUFDLE1BQU07NktBU3RDLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBR08sV0FBVztzQkFBdkIsS0FBSztnQkFjaUMsS0FBSztzQkFBM0MsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNLLFFBQVE7c0JBQWpELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDQSxVQUFVO3NCQUFqRCxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUM7Z0JBQ1Asa0JBQWtCO3NCQUFoRCxTQUFTO3VCQUFDLGtCQUFrQjtnQkFxSG5CLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIFZpZXdDaGlsZCxcbiAgSW5wdXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBFbGVtZW50UmVmLFxuICBJbmplY3RvcixcbiAgVGVtcGxhdGVSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0U29ydCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgTWF0Um93RGVmLCBNYXRUYWJsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IFRhYmxlU3RvcmUgfSBmcm9tICcuLi8uLi9jbGFzc2VzL3RhYmxlLXN0b3JlJztcbmltcG9ydCB7IHRhcCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ29sdW1uQnVpbGRlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbHVtbi1idWlsZGVyL2NvbHVtbi1idWlsZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9kaWN0aW9uYXJ5JztcbmltcG9ydCB7IEdlbmVyaWNUYWJsZURhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9jbGFzc2VzL0dlbmVyaWNUYWJsZURhdGFTb3VyY2UnO1xuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtZGVmJztcbmltcG9ydCB7IHByZXZpb3VzQW5kQ3VycmVudCB9IGZyb20gJy4uLy4uLy4uL3J4anMvcnhqcy1vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ29sdW1uSW5mbyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvQ29sdW1uSW5mbyc7XG5pbXBvcnQgeyBDZGtEcmFnRHJvcCwgQ2RrRHJvcExpc3QgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IEdyb3VwIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9UYWJsZVN0YXRlJztcbmltcG9ydCB7IFBhZ2luYXRvckNvbXBvbmVudCB9IGZyb20gJy4vcGFnaW5hdG9yLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RiLWdlbmVyaWMtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dlbmVyaWMtdGFibGUuY29tcG9uZW50LnNjc3MnLCcuLi8uLi9zdHlsZXMvY29sbGFwc2VyLnN0eWxlcy5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBHZW5lcmljVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG5cbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KSB7XG4gICAgdGhpcy5zdGF0ZS5zZXRVc2VyRGVmaW5lZE9yZGVyKHtuZXdPcmRlcjpldmVudC5jdXJyZW50SW5kZXgsb2xkT3JkZXI6ZXZlbnQucHJldmlvdXNJbmRleH0pXG4gIH1cblxuICBASW5wdXQoKSBkYXRhJCE6IE9ic2VydmFibGU8YW55W10+O1xuICBASW5wdXQoKSBJbmRleENvbHVtbiA9IGZhbHNlO1xuICBASW5wdXQoKSBTZWxlY3Rpb25Db2x1bW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdHJhY2tCeSE6IHN0cmluZztcbiAgQElucHV0KCkgcm93cyE6IFF1ZXJ5TGlzdDxNYXRSb3dEZWY8YW55Pj47XG4gIEBJbnB1dCgpIGlzU3RpY2t5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbHVtbkJ1aWxkZXJzITogQ29sdW1uQnVpbGRlckNvbXBvbmVudFtdO1xuICBASW5wdXQoKSBjb2x1bW5JbmZvcyE6IE9ic2VydmFibGU8Q29sdW1uSW5mb1tdPjtcbiAgQElucHV0KCkgZ3JvdXBIZWFkZXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgcHJpdmF0ZSBfZGlzYWJsZVNvcnQhOiBib29sZWFuO1xuICBASW5wdXQoKSBzZXQgZGlzYWJsZVNvcnQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlzYWJsZVNvcnQgPSB2YWw7XG4gICAgaWYgKHZhbCkge1xuICAgICAgaWYgKHRoaXMuZGF0YVNvdXJjZT8uc29ydCkge1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmRhdGFTb3VyY2UgJiYgIXRoaXMuZGF0YVNvdXJjZS5zb3J0KSB7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXQgZGlzYWJsZVNvcnQoKSB7IHJldHVybiB0aGlzLl9kaXNhYmxlU29ydDsgfVxuXG4gIEBWaWV3Q2hpbGQoTWF0VGFibGUsIHsgc3RhdGljOiB0cnVlIH0pIHRhYmxlITogTWF0VGFibGU8YW55PjtcbiAgQFZpZXdDaGlsZChDZGtEcm9wTGlzdCwgeyBzdGF0aWM6IHRydWUgfSkgZHJvcExpc3QhOiBDZGtEcm9wTGlzdDtcbiAgQFZpZXdDaGlsZCgndGFibGUnLCB7cmVhZDogRWxlbWVudFJlZn0pIHRhYmxlRWxSZWYhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKFBhZ2luYXRvckNvbXBvbmVudCkgcGFnaW5hdG9yQ29tcG9uZW50ITogUGFnaW5hdG9yQ29tcG9uZW50O1xuICBjdXJyZW50Q29sdW1ucyE6IHN0cmluZ1tdO1xuICBkYXRhU291cmNlITogR2VuZXJpY1RhYmxlRGF0YVNvdXJjZTxhbnk+O1xuICBrZXlzOiBzdHJpbmcgW10gPSBbXTtcbiAgaW5qZWN0b3I6IEluamVjdG9yO1xuICByb3dEZWZBcnIgOk1hdFJvd0RlZjxhbnk+W109IFtdO1xuICBjb2x1bW5zOnN0cmluZyBbXSA9IFtdO1xuICBteUNvbHVtbnM6IERpY3Rpb25hcnk8Q29sdW1uQnVpbGRlckNvbXBvbmVudD4gPSB7fTtcbiAgc2hvd0hlYWRlciQhOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc29ydDogTWF0U29ydCxcbiAgICBwdWJsaWMgc3RhdGU6IFRhYmxlU3RvcmUsXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICApIHtcblxuICAgIHRoaXMuaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoeyBwcm92aWRlcnM6IFtcbiAgICAgIHtwcm92aWRlOiBNYXRUYWJsZSwgdXNlRmFjdG9yeTogKCk9PiB7cmV0dXJuIHRoaXMudGFibGV9IH0sXG4gICAgICB7cHJvdmlkZTogQ2RrRHJvcExpc3QsIHVzZUZhY3Rvcnk6ICgpPT4ge3JldHVybiB0aGlzLmRyb3BMaXN0fSB9LFxuICAgIF0sIHBhcmVudDogaW5qZWN0b3J9KTtcbiAgfVxuXG4gIHRyYWNrQnlGdW5jdGlvbiA9IChpbmRleDpudW1iZXIsIGl0ZW06IGFueSkgPT4ge1xuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnRyYWNrQnkpIHtcbiAgICAgIHJldHVybiBpdGVtW3RoaXMudHJhY2tCeV07XG4gICAgfVxuICAgIHJldHVybiBpdGVtO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLnJvd3MgJiYgdGhpcy5yb3dzICYmIHRoaXMubXlDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgdGhpcy5pbml0aWFsaXplUm93RGVmcyhbLi4udGhpcy5yb3dzXSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuU2VsZWN0aW9uQ29sdW1uKSB7XG4gICAgICB0aGlzLmNvbHVtbnMucHVzaCgnc2VsZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuSW5kZXhDb2x1bW4pIHtcbiAgICAgdGhpcy5jb2x1bW5zLnB1c2goJ2luZGV4Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5jcmVhdGVEYXRhU291cmNlKCk7XG5cbiAgICB0aGlzLnN0YXRlLm9uKHRoaXMuY29sdW1uSW5mb3MsIGNvbHVtbnMgPT4ge1xuICAgICAgY29sdW1ucy5mb3JFYWNoKGNpID0+IHRoaXMuYWRkTWV0YURhdGEoY2kpKVxuICAgIH0pO1xuXG4gICAgdGhpcy5pbml0aWFsaXplUm93RGVmcyhbLi4udGhpcy5yb3dzXSk7XG5cbiAgICB0aGlzLnN0YXRlLm9uKHRoaXMuc3RhdGUuZGlzcGxheWVkQ29sdW1ucyQsIGtleXMgPT4ge1xuICAgICAgdGhpcy5rZXlzID0gWy4uLnRoaXMuY29sdW1ucywgLi4ua2V5c107XG4gICAgICB0aGlzLnJvd0RlZkFycj8uZm9yRWFjaChyb3cgPT4gcm93LmNvbHVtbnMgPSB0aGlzLmtleXMpXG4gICAgfSk7XG5cbiAgICB0aGlzLnNob3dIZWFkZXIkID0gdGhpcy5zdGF0ZS50YWJsZVNldHRpbmdzJC5waXBlKG1hcChzZXR0aW5ncyA9PiAhKHNldHRpbmdzLmhpZGVDb2x1bW5IZWFkZXIpKSk7XG4gIH1cblxuICBjcmVhdGVEYXRhU291cmNlKCkge1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBHZW5lcmljVGFibGVEYXRhU291cmNlKFxuICAgICAgdGhpcy5kYXRhJC5waXBlKHRhcCgoZCkgPT4gdGhpcy5zZWxlY3Rpb24uY2xlYXIoKSApKVxuICAgICk7XG5cbiAgICBpZiAoIXRoaXMuZGlzYWJsZVNvcnQpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0O1xuICAgIH1cbiAgfVxuXG4gIGlzR3JvdXBIZWFkZXIoXzogbnVtYmVyLCByb3c6IHsgaXNHcm91cEhlYWRlcjogYm9vbGVhbiB9KSB7XG4gICAgcmV0dXJuIHJvdy5pc0dyb3VwSGVhZGVyO1xuICB9XG5cbiAgaXNHcm91cEZvb3RlcihfOiBudW1iZXIsIHJvdzogeyBpc0dyb3VwRm9vdGVyOiBib29sZWFuIH0pIHtcbiAgICByZXR1cm4gcm93LmlzR3JvdXBGb290ZXI7XG4gIH1cblxuICB1cGRhdGVHcm91cChncm91cDogR3JvdXApOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZUdyb3VwKHtcbiAgICAgIC4uLmdyb3VwLFxuICAgICAgaXNFeHBhbmRlZDogIWdyb3VwLmlzRXhwYW5kZWRcbiAgICB9KTtcbiAgfVxuXG4gIGFkZE1ldGFEYXRhKGNvbHVtbjogQ29sdW1uSW5mbykge1xuICAgIGxldCBjb2x1bW5CdWlsZGVyID0gdGhpcy5teUNvbHVtbnNbY29sdW1uLm1ldGFEYXRhLmtleV07XG4gICAgaWYoY29sdW1uQnVpbGRlcikge1xuICAgICAgY29sdW1uQnVpbGRlci5tZXRhRGF0YSA9IGNvbHVtbi5tZXRhRGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChDb2x1bW5CdWlsZGVyQ29tcG9uZW50LCB7XG4gICAgICAgIGluZGV4OiAwLFxuICAgICAgICBpbmplY3RvcjogdGhpcy5pbmplY3RvclxuICAgICAgfSk7XG4gICAgICBjb21wb25lbnQuaW5zdGFuY2UuY3VzdG9tQ2VsbCA9IGNvbHVtbi5jdXN0b21DZWxsO1xuICAgICAgY29tcG9uZW50Lmluc3RhbmNlLm1ldGFEYXRhID0gY29sdW1uLm1ldGFEYXRhO1xuICAgICAgY29tcG9uZW50Lmluc3RhbmNlLmRhdGEkID0gdGhpcy5kYXRhJDtcbiAgICAgIHRoaXMubXlDb2x1bW5zW2NvbHVtbi5tZXRhRGF0YS5rZXldID0gY29tcG9uZW50Lmluc3RhbmNlO1xuICAgIH1cbiAgfVxuXG4gIGluaXRpYWxpemVSb3dEZWZzID0gKGRlZnM6TWF0Um93RGVmPGFueT5bXSk9PntcbiAgICB0aGlzLnJvd0RlZkFyci5mb3JFYWNoKHI9PnRoaXMudGFibGUucmVtb3ZlUm93RGVmKHIpKTtcbiAgICB0aGlzLnJvd0RlZkFyciA9IGRlZnM7XG4gICAgZGVmcy5mb3JFYWNoKHIgPT4ge1xuICAgICAgci5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLmNvbmNhdChPYmplY3QudmFsdWVzKHRoaXMubXlDb2x1bW5zKS5maWx0ZXIoYyA9PiBjLm1ldGFEYXRhLmZpZWxkVHlwZSAhPT0gRmllbGRUeXBlLkhpZGRlbikubWFwKGMgPT4gYy5tZXRhRGF0YS5rZXkpKTtcbiAgICAgIGlmICh0aGlzLnRhYmxlKSB7XG4gICAgICAgIHRoaXMudGFibGUuYWRkUm93RGVmKHIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2VsZWN0aW9uIDogU2VsZWN0aW9uTW9kZWw8YW55PiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxhbnk+KHRydWUsIFtdKTtcbiAgQE91dHB1dCgpIHNlbGVjdGlvbiQ6IE9ic2VydmFibGU8YW55PiA9IHRoaXMuc2VsZWN0aW9uLmNoYW5nZWQ7XG4gIG1hc3RlclRvZ2dsZUNoZWNrZWQkID0gdGhpcy5zZWxlY3Rpb24kLnBpcGUobWFwKCgpPT50aGlzLnNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIHRoaXMuaXNBbGxTZWxlY3RlZCgpKSk7XG4gIG1hc3RlclRvZ2dsZUluZGV0ZXJtaW5hdGUkID0gdGhpcy5zZWxlY3Rpb24kLnBpcGUobWFwKCgpPT50aGlzLnNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmICF0aGlzLmlzQWxsU2VsZWN0ZWQoKSkpO1xuXG4gIGlzQWxsU2VsZWN0ZWQoKSB7XG4gICAgY29uc3QgbnVtU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XG4gICAgY29uc3QgbnVtUm93cyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aDtcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPT09IG51bVJvd3M7XG4gIH1cblxuICAvKiogU2VsZWN0cyBhbGwgcm93cyBpZiB0aGV5IGFyZSBub3QgYWxsIHNlbGVjdGVkOyBvdGhlcndpc2UgY2xlYXIgc2VsZWN0aW9uLiAqL1xuICBtYXN0ZXJUb2dnbGUoKSB7XG4gICAgdGhpcy5pc0FsbFNlbGVjdGVkKCkgP1xuICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKSA6XG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3QoLi4udGhpcy5kYXRhU291cmNlLmRhdGEpO1xuICB9XG5cbiAgdGFibGVXaWR0aCA9IHRoaXMuc3RhdGUuZ2V0VXNlckRlZmluZWRUYWJsZVNpemUkLnBpcGUoXG4gICAgcHJldmlvdXNBbmRDdXJyZW50PG51bWJlciB8IHVuZGVmaW5lZD4oMCksXG4gICAgbWFwKChbcHJldmlvdXNVc2VyRGVmaW5lZFdpZHRoLCBjdXJyZW50VXNlckRlZmluZWRXaWR0aF0pID0+IHtcbiAgICAgIGlmKCBjdXJyZW50VXNlckRlZmluZWRXaWR0aCl7XG4gICAgICAgIHJldHVybiAoe3dpZHRoOmAke2N1cnJlbnRVc2VyRGVmaW5lZFdpZHRofXB4YH0pO1xuICAgICAgfSBpZiggd2FzUmVzZXQoKSApe1xuICAgICAgICByZXR1cm4gKHt3aWR0aDonaW5pdGlhbCd9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoe30pO1xuXG4gICAgICBmdW5jdGlvbiB3YXNSZXNldCgpe1xuICAgICAgICByZXR1cm4gKHByZXZpb3VzVXNlckRlZmluZWRXaWR0aCA/PyAwKSA+PTAgJiYgY3VycmVudFVzZXJEZWZpbmVkV2lkdGggPT0gbnVsbDtcbiAgICAgIH1cbiAgICB9KVxuICApO1xuXG4gIGNvbGxhcHNlRm9vdGVyJCA9IHRoaXMuc3RhdGUuc3RhdGUkLnBpcGUobWFwKHN0YXRlID0+IHN0YXRlLnBlcnNpc3RlZFRhYmxlU2V0dGluZ3MuY29sbGFwc2VGb290ZXIpKTtcbn1cbiIsIjxtYXQtdGFibGVcbiAgY2RrRHJvcExpc3RcbiAgY2RrRHJvcExpc3RMb2NrQXhpcz0neCdcbiAgY2RrRHJvcExpc3RPcmllbnRhdGlvbj1cImhvcml6b250YWxcIlxuICAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50KVwiXG4gIGNsYXNzPVwidGFibGUtZHJhZy1saXN0XCJcbiAgI3RhYmxlXG4gIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxuICBbdHJhY2tCeV09J3RyYWNrQnlGdW5jdGlvbidcbiAgW3N0eWxlcl09XCJ0YWJsZVdpZHRoIHwgYXN5bmNcIlxuPlxuXG4gICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzZWxlY3RcIj5cblxuICAgICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwiZi1tYXQtaGVhZGVyLWNlbGxcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IChjaGFuZ2UpPVwiJGV2ZW50ID8gbWFzdGVyVG9nZ2xlKCkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIiEhKG1hc3RlclRvZ2dsZUNoZWNrZWQkIHwgYXN5bmMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cIm1hc3RlclRvZ2dsZUluZGV0ZXJtaW5hdGUkIHwgYXN5bmNcIj5cbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPC9tYXQtaGVhZGVyLWNlbGw+XG5cbiAgICAgICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggKm5nSWY9XCIhcm93LmlzR3JvdXBGb290ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IHNlbGVjdGlvbi50b2dnbGUocm93KSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiPlxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L21hdC1jZWxsPlxuXG4gICAgICAgIDxtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWY+XG4gICAgICAgICAge3sgc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCB9fVxuICAgICAgICA8L21hdC1mb290ZXItY2VsbD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImluZGV4XCI+XG4gICAgICAgICAgPG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cImYtbWF0LWhlYWRlci1jZWxsXCIgPiM8L21hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICA8bWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgaSA9IGluZGV4O1wiPiB7eyAodGJQYWdpbmF0b3IucGFnaW5hdG9yLnBhZ2VJbmRleCAqIHRiUGFnaW5hdG9yLnBhZ2luYXRvci5wYWdlU2l6ZSkgKyAgaSArIDEgfX0gPC9tYXQtY2VsbD5cbiAgICAgICAgICA8bWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmPjwvbWF0LWZvb3Rlci1jZWxsPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZ3JvdXBIZWFkZXJcIj5cbiAgICAgICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgIDxkaXYgW3N0eWxlLnBhZGRpbmdMZWZ0XT1cInJvdy5wYWRkaW5nICsgJ3B4ICFpbXBvcnRhbnQnXCIgPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInVwZGF0ZUdyb3VwKHJvdyk7XCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFyb3cuaXNFeHBhbmRlZFwiPmNoZXZyb25fcmlnaHQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJyb3cuaXNFeHBhbmRlZFwiPmV4cGFuZF9tb3JlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAge3tyb3cuZ3JvdXBIZWFkZXJOYW1lfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleC1ncm93OiAxXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ3JvdXBIZWFkZXJUZW1wbGF0ZTsgY29udGV4dDogeyBlbGVtZW50OiByb3cgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC1jZWxsPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dIZWFkZXIkIHwgYXN5bmNcIj5cbiAgICA8bWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImtleXM7IHN0aWNreTogaXNTdGlja3lcIj48L21hdC1oZWFkZXItcm93PlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGtleXM7IGxldCBpID0gaW5kZXhcIj48L21hdC1yb3c+XG4gIDxtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ2dyb3VwSGVhZGVyJ107IHdoZW46IGlzR3JvdXBIZWFkZXJcIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHdoaXRlO1wiPjwvbWF0LXJvdz5cbiAgPG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGtleXM7IHdoZW46IGlzR3JvdXBGb290ZXJcIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHdoaXRlc21va2U7XCI+PC9tYXQtcm93PlxuICA8bWF0LWZvb3Rlci1yb3cgKm1hdEZvb3RlclJvd0RlZj1cImtleXNcIj48L21hdC1mb290ZXItcm93PlxuXG48L21hdC10YWJsZT5cblxuPGRpdiBjbGFzcz1cImZseC1yb3ctZW5kIHN0aWNreVwiPlxuICA8dGItcGFnaW5hdG9yICN0YlBhZ2luYXRvclxuICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxuICAgIFt0YWJsZUVsUmVmXT1cInRhYmxlRWxSZWZcIlxuICAgIFtkYXRhJF09XCJkYXRhJFwiPlxuICA8L3RiLXBhZ2luYXRvcj5cblxuICA8bWF0LWljb24gW21hdFRvb2x0aXBdPVwiKGNvbGxhcHNlRm9vdGVyJCB8IGFzeW5jKSA/ICdleHBhbmQnIDogJ2NvbGxhcHNlJ1wiIGNsYXNzPVwiY29sbGFwc2UtaWNvbiBmb290ZXJcIiAoY2xpY2spPVwic3RhdGUudG9nZ2xlQ29sbGFwc2VGb290ZXIoKVwiPlxuICAgIHt7KGNvbGxhcHNlRm9vdGVyJCB8IGFzeW5jKSA/ICdleHBhbmRfbW9yZScgOiAnZXhwYW5kX2xlc3MnfX1cbiAgPC9tYXQtaWNvbj5cbjwvZGl2PlxuIl19