ngx-material-entity 18.2.6 → 20.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/fesm2022/ngx-material-entity.mjs +173 -168
  2. package/fesm2022/ngx-material-entity.mjs.map +1 -1
  3. package/index.d.ts +4501 -3
  4. package/package.json +10 -12
  5. package/classes/base.builder.d.ts +0 -37
  6. package/classes/entity.model.d.ts +0 -27
  7. package/components/confirm-dialog/confirm-dialog-data.builder.d.ts +0 -24
  8. package/components/confirm-dialog/confirm-dialog-data.d.ts +0 -48
  9. package/components/confirm-dialog/confirm-dialog.component.d.ts +0 -36
  10. package/components/create-page/create-data.route.d.ts +0 -16
  11. package/components/create-page/create-page.component.d.ts +0 -141
  12. package/components/create-page/page-create-data.builder.d.ts +0 -18
  13. package/components/custom-table/custom-table-configuration.model.d.ts +0 -65
  14. package/components/custom-table/custom-table.component.d.ts +0 -111
  15. package/components/edit-page/edit-data.route.d.ts +0 -16
  16. package/components/edit-page/edit-page.component.d.ts +0 -167
  17. package/components/edit-page/page-edit-data.builder.d.ts +0 -18
  18. package/components/form/form.component.d.ts +0 -64
  19. package/components/input/array/array-date-input/array-date-input.component.d.ts +0 -17
  20. package/components/input/array/array-date-range-input/array-date-range-input.component.d.ts +0 -25
  21. package/components/input/array/array-date-time-input/array-date-time-input.component.d.ts +0 -26
  22. package/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.d.ts +0 -30
  23. package/components/input/array/array-string-chips-input/array-string-chips-input.component.d.ts +0 -36
  24. package/components/input/array/array-table.class.d.ts +0 -56
  25. package/components/input/base-input.component.d.ts +0 -64
  26. package/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.d.ts +0 -10
  27. package/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.d.ts +0 -13
  28. package/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.d.ts +0 -10
  29. package/components/input/custom/custom.component.d.ts +0 -13
  30. package/components/input/date/date-input/date-input.component.d.ts +0 -11
  31. package/components/input/date/date-range-input/date-range-input.component.d.ts +0 -22
  32. package/components/input/date/date-time-input/date-time-input.component.d.ts +0 -32
  33. package/components/input/file/file-default-input/file-default-input.component.d.ts +0 -11
  34. package/components/input/file/file-image-input/file-image-input.component.d.ts +0 -28
  35. package/components/input/file/file-input/file-input.component.d.ts +0 -45
  36. package/components/input/input.component.d.ts +0 -590
  37. package/components/input/number/number-dropdown-input/number-dropdown-input.component.d.ts +0 -24
  38. package/components/input/number/number-input/number-input.component.d.ts +0 -9
  39. package/components/input/number/number-slider-input/number-slider-input.component.d.ts +0 -10
  40. package/components/input/relations/references-many-input/references-many-input.component.d.ts +0 -43
  41. package/components/input/string/string-autocomplete-input/string-autocomplete-input.component.d.ts +0 -19
  42. package/components/input/string/string-dropdown-input/string-dropdown-input.component.d.ts +0 -24
  43. package/components/input/string/string-input/string-input.component.d.ts +0 -9
  44. package/components/input/string/string-password-input/string-password-input.component.d.ts +0 -31
  45. package/components/input/string/string-textbox-input/string-textbox-input.component.d.ts +0 -9
  46. package/components/table/create-dialog/create-data.builder.d.ts +0 -25
  47. package/components/table/create-dialog/create-entity-data.builder.d.ts +0 -21
  48. package/components/table/create-dialog/create-entity-data.d.ts +0 -19
  49. package/components/table/create-dialog/create-entity-dialog.component.d.ts +0 -77
  50. package/components/table/default.actions.d.ts +0 -25
  51. package/components/table/display-column-value/base-display-column-value.component.d.ts +0 -15
  52. package/components/table/display-column-value/display-column-value.component.d.ts +0 -26
  53. package/components/table/edit-dialog/edit-data.builder.d.ts +0 -44
  54. package/components/table/edit-dialog/edit-entity-data.d.ts +0 -27
  55. package/components/table/edit-dialog/edit-entity-dialog.component.d.ts +0 -118
  56. package/components/table/edit-dialog/edit-entity.builder.d.ts +0 -23
  57. package/components/table/table-data.builder.d.ts +0 -102
  58. package/components/table/table-data.d.ts +0 -340
  59. package/components/table/table.component.d.ts +0 -119
  60. package/components/tooltip/tooltip.component.d.ts +0 -14
  61. package/decorators/array/array-decorator-internal.data.d.ts +0 -129
  62. package/decorators/array/array-decorator.data.d.ts +0 -252
  63. package/decorators/array/array.decorator.d.ts +0 -9
  64. package/decorators/base/base-property.decorator.d.ts +0 -9
  65. package/decorators/base/decorator-types.enum.d.ts +0 -48
  66. package/decorators/base/dropdown-value.interface.d.ts +0 -14
  67. package/decorators/base/property-decorator-internal.data.d.ts +0 -41
  68. package/decorators/base/property-decorator.data.d.ts +0 -88
  69. package/decorators/boolean/boolean-decorator-internal.data.d.ts +0 -26
  70. package/decorators/boolean/boolean-decorator.data.d.ts +0 -39
  71. package/decorators/boolean/boolean.decorator.d.ts +0 -7
  72. package/decorators/custom/custom-decorator-internal.data.d.ts +0 -17
  73. package/decorators/custom/custom-decorator.data.d.ts +0 -35
  74. package/decorators/custom/custom.decorator.d.ts +0 -9
  75. package/decorators/date/date-decorator-internal.data.d.ts +0 -45
  76. package/decorators/date/date-decorator.data.d.ts +0 -126
  77. package/decorators/date/date.decorator.d.ts +0 -7
  78. package/decorators/file/file-decorator-internal.data.d.ts +0 -93
  79. package/decorators/file/file-decorator.data.d.ts +0 -88
  80. package/decorators/file/file.decorator.d.ts +0 -8
  81. package/decorators/has-many/has-many-decorator-internal.data.d.ts +0 -16
  82. package/decorators/has-many/has-many-decorator.data.d.ts +0 -34
  83. package/decorators/has-many/has-many.decorator.d.ts +0 -8
  84. package/decorators/number/number-decorator-internal.data.d.ts +0 -38
  85. package/decorators/number/number-decorator.data.d.ts +0 -63
  86. package/decorators/number/number.decorator.d.ts +0 -7
  87. package/decorators/object/object-decorator-internal.data.d.ts +0 -23
  88. package/decorators/object/object-decorator.data.d.ts +0 -42
  89. package/decorators/object/object.decorator.d.ts +0 -8
  90. package/decorators/references-many/references-many-decorator-internal.data.d.ts +0 -30
  91. package/decorators/references-many/references-many-decorator.data.d.ts +0 -63
  92. package/decorators/references-many/references-many.decorator.d.ts +0 -8
  93. package/decorators/references-one/references-one-decorator-internal.data.d.ts +0 -16
  94. package/decorators/references-one/references-one-decorator.data.d.ts +0 -32
  95. package/decorators/references-one/references-one.decorator.d.ts +0 -8
  96. package/decorators/string/string-decorator-internal.data.d.ts +0 -56
  97. package/decorators/string/string-decorator.data.d.ts +0 -116
  98. package/decorators/string/string.decorator.d.ts +0 -7
  99. package/default-global-configuration-values.d.ts +0 -13
  100. package/directives/drag-drop.directive.d.ts +0 -29
  101. package/directives/dynamic-style-class.directive.d.ts +0 -24
  102. package/directives/included-in.directive.d.ts +0 -14
  103. package/directives/number.directive.d.ts +0 -16
  104. package/directives/password-match.directive.d.ts +0 -14
  105. package/directives/tooltip.directive.d.ts +0 -42
  106. package/encapsulation/js-2-xml.utilities.d.ts +0 -14
  107. package/encapsulation/jszip.utilities.d.ts +0 -12
  108. package/encapsulation/lodash.utilities.d.ts +0 -60
  109. package/encapsulation/reflect.utilities.d.ts +0 -59
  110. package/encapsulation/uuid.utilities.d.ts +0 -10
  111. package/esm2022/classes/base.builder.mjs +0 -47
  112. package/esm2022/classes/entity.model.mjs +0 -26
  113. package/esm2022/components/confirm-dialog/confirm-dialog-data.builder.mjs +0 -57
  114. package/esm2022/components/confirm-dialog/confirm-dialog-data.mjs +0 -2
  115. package/esm2022/components/confirm-dialog/confirm-dialog.component.mjs +0 -71
  116. package/esm2022/components/create-page/create-data.route.mjs +0 -12
  117. package/esm2022/components/create-page/create-page.component.mjs +0 -276
  118. package/esm2022/components/create-page/page-create-data.builder.mjs +0 -30
  119. package/esm2022/components/custom-table/custom-table-configuration.model.mjs +0 -37
  120. package/esm2022/components/custom-table/custom-table.component.mjs +0 -213
  121. package/esm2022/components/edit-page/edit-data.route.mjs +0 -12
  122. package/esm2022/components/edit-page/edit-page.component.mjs +0 -362
  123. package/esm2022/components/edit-page/page-edit-data.builder.mjs +0 -33
  124. package/esm2022/components/form/form.component.mjs +0 -106
  125. package/esm2022/components/input/array/array-date-input/array-date-input.component.mjs +0 -56
  126. package/esm2022/components/input/array/array-date-range-input/array-date-range-input.component.mjs +0 -82
  127. package/esm2022/components/input/array/array-date-time-input/array-date-time-input.component.mjs +0 -82
  128. package/esm2022/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.mjs +0 -81
  129. package/esm2022/components/input/array/array-string-chips-input/array-string-chips-input.component.mjs +0 -74
  130. package/esm2022/components/input/array/array-table.class.mjs +0 -107
  131. package/esm2022/components/input/base-input.component.mjs +0 -102
  132. package/esm2022/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.mjs +0 -29
  133. package/esm2022/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.mjs +0 -40
  134. package/esm2022/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.mjs +0 -29
  135. package/esm2022/components/input/custom/custom.component.mjs +0 -28
  136. package/esm2022/components/input/date/date-input/date-input.component.mjs +0 -28
  137. package/esm2022/components/input/date/date-range-input/date-range-input.component.mjs +0 -84
  138. package/esm2022/components/input/date/date-time-input/date-time-input.component.mjs +0 -90
  139. package/esm2022/components/input/file/file-default-input/file-default-input.component.mjs +0 -18
  140. package/esm2022/components/input/file/file-image-input/file-image-input.component.mjs +0 -104
  141. package/esm2022/components/input/file/file-input/file-input.component.mjs +0 -228
  142. package/esm2022/components/input/input.component.mjs +0 -1367
  143. package/esm2022/components/input/number/number-dropdown-input/number-dropdown-input.component.mjs +0 -65
  144. package/esm2022/components/input/number/number-input/number-input.component.mjs +0 -23
  145. package/esm2022/components/input/number/number-slider-input/number-slider-input.component.mjs +0 -27
  146. package/esm2022/components/input/relations/references-many-input/references-many-input.component.mjs +0 -145
  147. package/esm2022/components/input/string/string-autocomplete-input/string-autocomplete-input.component.mjs +0 -56
  148. package/esm2022/components/input/string/string-dropdown-input/string-dropdown-input.component.mjs +0 -65
  149. package/esm2022/components/input/string/string-input/string-input.component.mjs +0 -23
  150. package/esm2022/components/input/string/string-password-input/string-password-input.component.mjs +0 -107
  151. package/esm2022/components/input/string/string-textbox-input/string-textbox-input.component.mjs +0 -24
  152. package/esm2022/components/table/create-dialog/create-data.builder.mjs +0 -56
  153. package/esm2022/components/table/create-dialog/create-entity-data.builder.mjs +0 -32
  154. package/esm2022/components/table/create-dialog/create-entity-data.mjs +0 -2
  155. package/esm2022/components/table/create-dialog/create-entity-dialog.component.mjs +0 -180
  156. package/esm2022/components/table/default.actions.mjs +0 -83
  157. package/esm2022/components/table/display-column-value/base-display-column-value.component.mjs +0 -27
  158. package/esm2022/components/table/display-column-value/display-column-value.component.mjs +0 -41
  159. package/esm2022/components/table/edit-dialog/edit-data.builder.mjs +0 -136
  160. package/esm2022/components/table/edit-dialog/edit-entity-data.mjs +0 -2
  161. package/esm2022/components/table/edit-dialog/edit-entity-dialog.component.mjs +0 -295
  162. package/esm2022/components/table/edit-dialog/edit-entity.builder.mjs +0 -39
  163. package/esm2022/components/table/table-data.builder.mjs +0 -304
  164. package/esm2022/components/table/table-data.mjs +0 -2
  165. package/esm2022/components/table/table.component.mjs +0 -324
  166. package/esm2022/components/tooltip/tooltip.component.mjs +0 -26
  167. package/esm2022/decorators/array/array-decorator-internal.data.mjs +0 -310
  168. package/esm2022/decorators/array/array-decorator.data.mjs +0 -51
  169. package/esm2022/decorators/array/array.decorator.mjs +0 -37
  170. package/esm2022/decorators/base/base-property.decorator.mjs +0 -17
  171. package/esm2022/decorators/base/decorator-types.enum.mjs +0 -35
  172. package/esm2022/decorators/base/dropdown-value.interface.mjs +0 -2
  173. package/esm2022/decorators/base/property-decorator-internal.data.mjs +0 -101
  174. package/esm2022/decorators/base/property-decorator.data.mjs +0 -59
  175. package/esm2022/decorators/boolean/boolean-decorator-internal.data.mjs +0 -45
  176. package/esm2022/decorators/boolean/boolean-decorator.data.mjs +0 -11
  177. package/esm2022/decorators/boolean/boolean.decorator.mjs +0 -21
  178. package/esm2022/decorators/custom/custom-decorator-internal.data.mjs +0 -34
  179. package/esm2022/decorators/custom/custom-decorator.data.mjs +0 -2
  180. package/esm2022/decorators/custom/custom.decorator.mjs +0 -13
  181. package/esm2022/decorators/date/date-decorator-internal.data.mjs +0 -92
  182. package/esm2022/decorators/date/date-decorator.data.mjs +0 -11
  183. package/esm2022/decorators/date/date.decorator.mjs +0 -22
  184. package/esm2022/decorators/file/file-decorator-internal.data.mjs +0 -143
  185. package/esm2022/decorators/file/file-decorator.data.mjs +0 -59
  186. package/esm2022/decorators/file/file.decorator.mjs +0 -25
  187. package/esm2022/decorators/has-many/has-many-decorator-internal.data.mjs +0 -41
  188. package/esm2022/decorators/has-many/has-many-decorator.data.mjs +0 -2
  189. package/esm2022/decorators/has-many/has-many.decorator.mjs +0 -13
  190. package/esm2022/decorators/number/number-decorator-internal.data.mjs +0 -68
  191. package/esm2022/decorators/number/number-decorator.data.mjs +0 -11
  192. package/esm2022/decorators/number/number.decorator.mjs +0 -22
  193. package/esm2022/decorators/object/object-decorator-internal.data.mjs +0 -42
  194. package/esm2022/decorators/object/object-decorator.data.mjs +0 -22
  195. package/esm2022/decorators/object/object.decorator.mjs +0 -20
  196. package/esm2022/decorators/references-many/references-many-decorator-internal.data.mjs +0 -55
  197. package/esm2022/decorators/references-many/references-many-decorator.data.mjs +0 -2
  198. package/esm2022/decorators/references-many/references-many.decorator.mjs +0 -13
  199. package/esm2022/decorators/references-one/references-one-decorator-internal.data.mjs +0 -34
  200. package/esm2022/decorators/references-one/references-one-decorator.data.mjs +0 -2
  201. package/esm2022/decorators/references-one/references-one.decorator.mjs +0 -12
  202. package/esm2022/decorators/string/string-decorator-internal.data.mjs +0 -119
  203. package/esm2022/decorators/string/string-decorator.data.mjs +0 -11
  204. package/esm2022/decorators/string/string.decorator.mjs +0 -29
  205. package/esm2022/default-global-configuration-values.mjs +0 -91
  206. package/esm2022/directives/drag-drop.directive.mjs +0 -60
  207. package/esm2022/directives/dynamic-style-class.directive.mjs +0 -51
  208. package/esm2022/directives/included-in.directive.mjs +0 -33
  209. package/esm2022/directives/number.directive.mjs +0 -37
  210. package/esm2022/directives/password-match.directive.mjs +0 -30
  211. package/esm2022/directives/tooltip.directive.mjs +0 -142
  212. package/esm2022/encapsulation/js-2-xml.utilities.mjs +0 -17
  213. package/esm2022/encapsulation/jszip.utilities.mjs +0 -16
  214. package/esm2022/encapsulation/lodash.utilities.mjs +0 -80
  215. package/esm2022/encapsulation/reflect.utilities.mjs +0 -79
  216. package/esm2022/encapsulation/uuid.utilities.mjs +0 -14
  217. package/esm2022/functions/default-false.function.mjs +0 -9
  218. package/esm2022/functions/default-style-classes.function.mjs +0 -7
  219. package/esm2022/functions/default-true.function.mjs +0 -9
  220. package/esm2022/functions/dropdown-values-to-function.function.mjs +0 -15
  221. package/esm2022/functions/get-changes-tooltip-content.function.mjs +0 -23
  222. package/esm2022/functions/get-config-value.function.mjs +0 -14
  223. package/esm2022/functions/get-validation-error-message.function.mjs +0 -54
  224. package/esm2022/functions/get-validation-errors-tooltip-content.function.mjs +0 -23
  225. package/esm2022/functions/is-async-function.function.mjs +0 -9
  226. package/esm2022/functions/table-column-value-to-sort-value.function.mjs +0 -33
  227. package/esm2022/global-configuration-values.mjs +0 -27
  228. package/esm2022/mocks/placeholder-data.png.mjs +0 -3
  229. package/esm2022/ngx-material-entity.mjs +0 -5
  230. package/esm2022/public-api.mjs +0 -68
  231. package/esm2022/services/entity.service.mjs +0 -269
  232. package/esm2022/services/unsaved-changes.guard.mjs +0 -13
  233. package/esm2022/utilities/date.utilities.mjs +0 -138
  234. package/esm2022/utilities/entity.utilities.mjs +0 -611
  235. package/esm2022/utilities/file.utilities.mjs +0 -172
  236. package/esm2022/utilities/selection.utilities.mjs +0 -49
  237. package/esm2022/utilities/validation.utilities.mjs +0 -543
  238. package/functions/default-false.function.d.ts +0 -6
  239. package/functions/default-style-classes.function.d.ts +0 -6
  240. package/functions/default-true.function.d.ts +0 -6
  241. package/functions/dropdown-values-to-function.function.d.ts +0 -11
  242. package/functions/get-changes-tooltip-content.function.d.ts +0 -13
  243. package/functions/get-config-value.function.d.ts +0 -7
  244. package/functions/get-validation-error-message.function.d.ts +0 -5
  245. package/functions/get-validation-errors-tooltip-content.function.d.ts +0 -12
  246. package/functions/is-async-function.function.d.ts +0 -6
  247. package/functions/table-column-value-to-sort-value.function.d.ts +0 -9
  248. package/global-configuration-values.d.ts +0 -205
  249. package/mocks/placeholder-data.png.d.ts +0 -1
  250. package/public-api.d.ts +0 -60
  251. package/services/entity.service.d.ts +0 -146
  252. package/services/unsaved-changes.guard.d.ts +0 -23
  253. package/utilities/date.utilities.d.ts +0 -92
  254. package/utilities/entity.utilities.d.ts +0 -236
  255. package/utilities/file.utilities.d.ts +0 -67
  256. package/utilities/selection.utilities.d.ts +0 -28
  257. package/utilities/validation.utilities.d.ts +0 -58
@@ -1,324 +0,0 @@
1
- import { CommonModule } from '@angular/common';
2
- import { Component, EnvironmentInjector, EventEmitter, Inject, Input, Output, inject, runInInjectionContext } from '@angular/core';
3
- import { FormsModule } from '@angular/forms';
4
- import { MatButtonModule } from '@angular/material/button';
5
- import { MatDialog, MatDialogModule } from '@angular/material/dialog';
6
- import { MatFormFieldModule } from '@angular/material/form-field';
7
- import { MatInputModule } from '@angular/material/input';
8
- import { MatMenuModule } from '@angular/material/menu';
9
- import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
10
- import { MatSortModule } from '@angular/material/sort';
11
- import { Router } from '@angular/router';
12
- import { firstValueFrom } from 'rxjs';
13
- import { CreateEntityDialogDataBuilder } from './create-dialog/create-entity-data.builder';
14
- import { NgxMatEntityCreateDialogComponent } from './create-dialog/create-entity-dialog.component';
15
- import { NgxMatEntityEditDialogComponent } from './edit-dialog/edit-entity-dialog.component';
16
- import { EditEntityDataBuilder } from './edit-dialog/edit-entity.builder';
17
- import { BaseTableActionInternal, TableDataBuilder } from './table-data.builder';
18
- import { NGX_COMPLETE_GLOBAL_DEFAULT_VALUES } from '../../global-configuration-values';
19
- import { EntityUtilities } from '../../utilities/entity.utilities';
20
- import { ConfirmDialogDataBuilder } from '../confirm-dialog/confirm-dialog-data.builder';
21
- import { NgxMatEntityConfirmDialogComponent } from '../confirm-dialog/confirm-dialog.component';
22
- import { CustomTableComponent } from '../custom-table/custom-table.component';
23
- import * as i0 from "@angular/core";
24
- import * as i1 from "@angular/material/dialog";
25
- import * as i2 from "@angular/router";
26
- import * as i3 from "@angular/material/input";
27
- import * as i4 from "@angular/material/form-field";
28
- import * as i5 from "@angular/forms";
29
- import * as i6 from "@angular/material/button";
30
- import * as i7 from "@angular/material/menu";
31
- /**
32
- * Generates a fully functional table for displaying, creating, updating and deleting entities
33
- * based on the configuration passed in the @Input "tableData".
34
- *
35
- * It offers a lot of customization options which can be found in "TableData".
36
- */
37
- export class NgxMatEntityTableComponent {
38
- dialog;
39
- injector;
40
- router;
41
- globalConfig;
42
- /**
43
- * The configuration for the component.
44
- */
45
- tableData;
46
- /**
47
- * Emits when there are unsaved changes on either the create or update dialog.
48
- */
49
- unsavedDialogChanges = new EventEmitter();
50
- /**
51
- * The internal TableData.
52
- */
53
- data;
54
- /**
55
- * Configuration for the table.
56
- */
57
- tableConfig;
58
- /**
59
- * The entities to display inside the table.
60
- */
61
- entities;
62
- /**
63
- * A search string for filtering table results.
64
- */
65
- searchString = '';
66
- /**
67
- * The currently selected entities.
68
- */
69
- selected = [];
70
- /**
71
- * Whether or not the table content is currently loading.
72
- */
73
- isLoading = true;
74
- /**
75
- * Whether or not the current user is allowed to create entries for the table.
76
- */
77
- allowCreate;
78
- entityService;
79
- /**
80
- * The internal BaseTableAction. Sets default values.
81
- */
82
- importAction;
83
- constructor(dialog, injector, router, globalConfig) {
84
- this.dialog = dialog;
85
- this.injector = injector;
86
- this.router = router;
87
- this.globalConfig = globalConfig;
88
- }
89
- /**
90
- * Sets up all the configuration for the table and the EntityService.
91
- */
92
- ngOnInit() {
93
- this.data = new TableDataBuilder(this.globalConfig, this.tableData).getResult();
94
- runInInjectionContext(this.injector, () => {
95
- this.allowCreate = this.data.baseData.allowCreate();
96
- this.entityService = inject(this.data.baseData.EntityServiceClass);
97
- });
98
- this.importAction = new BaseTableActionInternal({
99
- ...this.data.baseData.importActionData,
100
- action: () => this.startImportJson()
101
- }, this.globalConfig);
102
- this.tableConfig = {
103
- displayColumns: this.tableData.baseData.displayColumns,
104
- withSelection: !!this.data.baseData.tableActions.filter(tA => tA.type === 'multi-select').length,
105
- allowClick: (value) => this.allowRead(value) || this.allowUpdate(value),
106
- dynamicRowStyleClasses: this.data.baseData.dynamicRowStyleClasses,
107
- searchStringForRow: this.data.baseData.searchString
108
- };
109
- this.entityService.entitiesSubject.subscribe((entities) => {
110
- this.entities = [...entities];
111
- });
112
- // eslint-disable-next-line promise/prefer-await-to-then
113
- void this.entityService.read().then(() => {
114
- this.isLoading = false;
115
- });
116
- }
117
- /**
118
- * Gets the value to display in the column.
119
- * Runs in environment context to enable injection.
120
- * @param entity - The entity to get the value from.
121
- * @param displayColumn - The display column to get the value from.
122
- * @returns The value of the display column.
123
- */
124
- getDisplayColumnValue(entity, displayColumn) {
125
- return runInInjectionContext(this.injector, () => {
126
- return displayColumn.value(entity);
127
- });
128
- }
129
- startImportJson() {
130
- const input = document.createElement('input');
131
- input.type = 'file';
132
- input.accept = 'application/json';
133
- input.onchange = async () => {
134
- if (input.files) {
135
- await this.importJson(input.files[0]);
136
- }
137
- };
138
- input.click();
139
- }
140
- async importJson(file) {
141
- const dialogData = new ConfirmDialogDataBuilder(this.globalConfig, this.importAction.confirmDialogData)
142
- .withDefault('text', this.data.baseData.importActionData.confirmDialogData.text)
143
- .withDefault('title', this.importAction.displayName)
144
- .getResult();
145
- const dialogRef = this.dialog.open(NgxMatEntityConfirmDialogComponent, {
146
- data: dialogData,
147
- autoFocus: false,
148
- restoreFocus: false
149
- });
150
- const res = await firstValueFrom(dialogRef.afterClosed());
151
- if (res == true) {
152
- await this.entityService.import(file);
153
- }
154
- }
155
- /**
156
- * Edits an entity. This either calls the edit-Method provided by the user or uses a default edit-dialog.
157
- * @param entity - The entity that should be updated.
158
- * @throws When no EntityClass was provided, as a new call is needed to initialize metadata.
159
- */
160
- editEntity(entity) {
161
- if (!this.data.baseData.EntityClass) {
162
- throw new Error('No "EntityClass" specified for this table');
163
- }
164
- if (this.data.baseData.edit) {
165
- this.data.baseData.edit(new this.data.baseData.EntityClass(entity));
166
- return;
167
- }
168
- if (this.data.baseData.defaultEdit == 'page') {
169
- this.editDefaultPage(new this.data.baseData.EntityClass(entity));
170
- return;
171
- }
172
- void this.editDefaultDialog(new this.data.baseData.EntityClass(entity));
173
- }
174
- /**
175
- * Whether updating the provided entity is allowed.
176
- * @param entity - The entity that the user wants to edit.
177
- * @returns True when the user can edit the provided entity and false otherwise.
178
- */
179
- allowUpdate(entity) {
180
- return runInInjectionContext(this.injector, () => {
181
- return this.data.baseData.allowUpdate(entity);
182
- });
183
- }
184
- /**
185
- * Whether viewing the provided entity is allowed.
186
- * @param entity - The entity that the user wants to view.
187
- * @returns True when the user can view the provided entity and false otherwise.
188
- */
189
- allowRead(entity) {
190
- return runInInjectionContext(this.injector, () => {
191
- return this.data.baseData.allowRead(entity);
192
- });
193
- }
194
- editDefaultPage(entity) {
195
- void this.router.navigate(['', this.entityService.editBaseRoute, entity.id]);
196
- }
197
- async editDefaultDialog(entity) {
198
- const inputDialogData = {
199
- entity: entity,
200
- EntityServiceClass: this.data.baseData.EntityServiceClass,
201
- allowUpdate: this.data.baseData.allowUpdate,
202
- allowDelete: this.data.baseData.allowDelete,
203
- editData: this.data.editData
204
- };
205
- const dialogData = new EditEntityDataBuilder(inputDialogData, this.globalConfig).getResult();
206
- const dialogRef = this.dialog.open(NgxMatEntityEditDialogComponent, {
207
- data: dialogData,
208
- autoFocus: false,
209
- restoreFocus: false
210
- });
211
- dialogRef.componentInstance.unsavedChanges.subscribe(res => this.unsavedDialogChanges.emit(res));
212
- const res = await firstValueFrom(dialogRef.afterClosed());
213
- this.unsavedDialogChanges.emit(false);
214
- if (res === 0) {
215
- this.entities[this.entities.findIndex((e) => e[this.entityService.idKey] === entity[this.entityService.idKey])] = entity;
216
- this.entities = this.entities;
217
- }
218
- }
219
- /**
220
- * Creates a new Entity. This either calls the create-Method provided by the user or uses a default create-dialog.
221
- * @throws When no EntityClass was provided, as a new call is needed to initialize metadata.
222
- */
223
- createEntity() {
224
- if (this.allowCreate) {
225
- if (!this.data.baseData.EntityClass) {
226
- throw new Error('No "EntityClass" specified for this table');
227
- }
228
- const entity = new this.data.baseData.EntityClass();
229
- EntityUtilities.setDefaultValues(entity);
230
- if (this.data.baseData.create) {
231
- this.data.baseData.create(entity);
232
- return;
233
- }
234
- if (this.data.baseData.defaultCreate == 'page') {
235
- this.createDefaultPage();
236
- return;
237
- }
238
- void this.createDefaultDialog(entity);
239
- }
240
- }
241
- createDefaultPage() {
242
- void this.router.navigateByUrl(this.entityService.createBaseRoute);
243
- }
244
- async createDefaultDialog(entity) {
245
- const dialogData = new CreateEntityDialogDataBuilder({
246
- entity: entity,
247
- EntityServiceClass: this.data.baseData.EntityServiceClass,
248
- createData: this.data.createData
249
- }, this.globalConfig).getResult();
250
- const dialogRef = this.dialog.open(NgxMatEntityCreateDialogComponent, {
251
- data: dialogData,
252
- minWidth: '60%',
253
- autoFocus: false,
254
- restoreFocus: false
255
- });
256
- dialogRef.componentInstance.unsavedChanges.subscribe(res => this.unsavedDialogChanges.emit(res));
257
- await firstValueFrom(dialogRef.afterClosed());
258
- this.unsavedDialogChanges.emit(false);
259
- }
260
- /**
261
- * Runs the TableAction for all selected entries.
262
- * Also handles confirmation with an additional dialog if configured.
263
- * @param action - The TableAction to run.
264
- */
265
- async runTableAction(action) {
266
- const requireConfirmDialog = runInInjectionContext(this.injector, () => {
267
- return action.requireConfirmDialog(this.selected);
268
- });
269
- if (!requireConfirmDialog) {
270
- await this.confirmRunTableAction(action);
271
- return;
272
- }
273
- const dialogRef = this.dialog.open(NgxMatEntityConfirmDialogComponent, {
274
- data: action.confirmDialogData,
275
- autoFocus: false,
276
- restoreFocus: false
277
- });
278
- const res = await firstValueFrom(dialogRef.afterClosed());
279
- if (res == true) {
280
- await this.confirmRunTableAction(action);
281
- }
282
- }
283
- async confirmRunTableAction(action) {
284
- await runInInjectionContext(this.injector, async () => {
285
- await action.action(this.selected);
286
- });
287
- }
288
- /**
289
- * Checks if an TableAction is disabled (e.g. Because no entries have been selected).
290
- * @param action - The TableAction to check.
291
- * @returns Whether or not the Action can be used.
292
- */
293
- tableActionDisabled(action) {
294
- return runInInjectionContext(this.injector, () => {
295
- return !action.enabled(this.selected);
296
- });
297
- }
298
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.7", ngImport: i0, type: NgxMatEntityTableComponent, deps: [{ token: i1.MatDialog }, { token: i0.EnvironmentInjector }, { token: i2.Router }, { token: NGX_COMPLETE_GLOBAL_DEFAULT_VALUES }], target: i0.ɵɵFactoryTarget.Component });
299
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.7", type: NgxMatEntityTableComponent, isStandalone: true, selector: "ngx-mat-entity-table", inputs: { tableData: "tableData" }, outputs: { unsavedDialogChanges: "unsavedDialogChanges" }, ngImport: i0, template: "<!-- eslint-disable angular/no-call-expression -->\n<h1 class=\"title\">{{data.baseData.title}}</h1>\n\n<div class=\"grid grid-cols-12 gap-x-6\">\n <mat-form-field class=\"lg:col-span-8 md:col-span-6 col-span-12\">\n <mat-label>{{data.baseData.searchLabel}}</mat-label>\n <input matInput [(ngModel)]=\"searchString\">\n </mat-form-field>\n @if (data.baseData.tableActions.length) {\n <div\n [class.lg:col-span-2]=\"allowCreate\"\n [class.lg:col-span-4]=\"!allowCreate\"\n [class.md:col-span-3]=\"allowCreate\"\n [class.md:col-span-6]=\"!allowCreate\"\n [class.col-span-6]=\"allowCreate\"\n [class.col-span-12]=\"!allowCreate\"\n >\n <button type=\"button\" class=\"actions-button\" mat-raised-button [matMenuTriggerFor]=\"menu\">\n {{data.baseData.tableActionsLabel}}\n </button>\n </div>\n }\n <mat-menu #menu=\"matMenu\">\n @if (data.baseData.allowJsonImport) {\n <button type=\"button\" mat-menu-item [disabled]=\"tableActionDisabled(importAction)\" (click)=\"runTableAction(importAction)\">\n {{importAction.displayName}}\n </button>\n }\n @for (action of data.baseData.tableActions; track $index) {\n <button type=\"button\" mat-menu-item [disabled]=\"tableActionDisabled(action)\" (click)=\"runTableAction(action)\">\n {{action.displayName}}\n </button>\n }\n </mat-menu>\n\n @if (allowCreate) {\n <div\n [class.lg:col-span-2]=\"data.baseData.tableActions.length\"\n [class.lg:col-span-4]=\"!data.baseData.tableActions.length\"\n [class.md:col-span-3]=\"data.baseData.tableActions.length\"\n [class.md:col-span-6]=\"!data.baseData.tableActions.length\"\n [class.col-span-6]=\"data.baseData.tableActions.length\"\n [class.col-span-12]=\"!data.baseData.tableActions.length\"\n >\n <button type=\"button\" class=\"create-button\" mat-raised-button (click)=\"createEntity()\">\n {{data.baseData.createButtonLabel}}\n </button>\n </div>\n }\n</div>\n\n<div class=\"mat-elevation-z8\">\n <custom-table\n [configuration]=\"tableConfig\"\n [data]=\"entities\"\n [isLoading]=\"isLoading\"\n [searchString]=\"searchString\"\n (cellClicked)=\"editEntity($event.value)\"\n (selectionChanged)=\"selected = $event\"\n >\n </custom-table>\n</div>", styles: ["button{width:100%}.title{text-align:center}.actions-button,.create-button{height:56px;line-height:24px;font-size:16px}@media (max-width: 767px){.actions-button,.create-button{margin-bottom:15px}}\n", ".grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.gap-x-6{column-gap:24px}.grid{display:grid}@media (min-width: 1024px){.lg\\:col-span-12{grid-column:span 12/span 12!important}.lg\\:col-span-11{grid-column:span 11/span 11!important}.lg\\:col-span-10{grid-column:span 10/span 10!important}.lg\\:col-span-9{grid-column:span 9/span 9!important}.lg\\:col-span-8{grid-column:span 8/span 8!important}.lg\\:col-span-7{grid-column:span 7/span 7!important}.lg\\:col-span-6{grid-column:span 6/span 6!important}.lg\\:col-span-5{grid-column:span 5/span 5!important}.lg\\:col-span-4{grid-column:span 4/span 4!important}.lg\\:col-span-3{grid-column:span 3/span 3!important}.lg\\:col-span-2{grid-column:span 2/span 2!important}.lg\\:col-span-1{grid-column:span 1/span 1!important}}@media (min-width: 768px) and (max-width: 1023px){.md\\:col-span-12{grid-column:span 12/span 12!important}.md\\:col-span-11{grid-column:span 11/span 11!important}.md\\:col-span-10{grid-column:span 10/span 10!important}.md\\:col-span-9{grid-column:span 9/span 9!important}.md\\:col-span-8{grid-column:span 8/span 8!important}.md\\:col-span-7{grid-column:span 7/span 7!important}.md\\:col-span-6{grid-column:span 6/span 6!important}.md\\:col-span-5{grid-column:span 5/span 5!important}.md\\:col-span-4{grid-column:span 4/span 4!important}.md\\:col-span-3{grid-column:span 3/span 3!important}.md\\:col-span-2{grid-column:span 2/span 2!important}.md\\:col-span-1{grid-column:span 1/span 1!important}}.col-span-12{grid-column:span 12/span 12}.col-span-11{grid-column:span 11/span 11}.col-span-10{grid-column:span 10/span 10}.col-span-9{grid-column:span 9/span 9}.col-span-8{grid-column:span 8/span 8}.col-span-7{grid-column:span 7/span 7}.col-span-6{grid-column:span 6/span 6}.col-span-5{grid-column:span 5/span 5}.col-span-4{grid-column:span 4/span 4}.col-span-3{grid-column:span 3/span 3}.col-span-2{grid-column:span 2/span 2}.col-span-1{grid-column:span 1/span 1}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatSortModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: CustomTableComponent, selector: "custom-table", inputs: ["data", "searchString", "required", "isLoading", "configuration"], outputs: ["cellClicked", "selectionChanged"] }] });
300
- }
301
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.7", ngImport: i0, type: NgxMatEntityTableComponent, decorators: [{
302
- type: Component,
303
- args: [{ selector: 'ngx-mat-entity-table', standalone: true, imports: [
304
- CommonModule,
305
- MatInputModule,
306
- FormsModule,
307
- MatFormFieldModule,
308
- MatSortModule,
309
- MatButtonModule,
310
- MatMenuModule,
311
- MatDialogModule,
312
- MatProgressSpinnerModule,
313
- CustomTableComponent
314
- ], template: "<!-- eslint-disable angular/no-call-expression -->\n<h1 class=\"title\">{{data.baseData.title}}</h1>\n\n<div class=\"grid grid-cols-12 gap-x-6\">\n <mat-form-field class=\"lg:col-span-8 md:col-span-6 col-span-12\">\n <mat-label>{{data.baseData.searchLabel}}</mat-label>\n <input matInput [(ngModel)]=\"searchString\">\n </mat-form-field>\n @if (data.baseData.tableActions.length) {\n <div\n [class.lg:col-span-2]=\"allowCreate\"\n [class.lg:col-span-4]=\"!allowCreate\"\n [class.md:col-span-3]=\"allowCreate\"\n [class.md:col-span-6]=\"!allowCreate\"\n [class.col-span-6]=\"allowCreate\"\n [class.col-span-12]=\"!allowCreate\"\n >\n <button type=\"button\" class=\"actions-button\" mat-raised-button [matMenuTriggerFor]=\"menu\">\n {{data.baseData.tableActionsLabel}}\n </button>\n </div>\n }\n <mat-menu #menu=\"matMenu\">\n @if (data.baseData.allowJsonImport) {\n <button type=\"button\" mat-menu-item [disabled]=\"tableActionDisabled(importAction)\" (click)=\"runTableAction(importAction)\">\n {{importAction.displayName}}\n </button>\n }\n @for (action of data.baseData.tableActions; track $index) {\n <button type=\"button\" mat-menu-item [disabled]=\"tableActionDisabled(action)\" (click)=\"runTableAction(action)\">\n {{action.displayName}}\n </button>\n }\n </mat-menu>\n\n @if (allowCreate) {\n <div\n [class.lg:col-span-2]=\"data.baseData.tableActions.length\"\n [class.lg:col-span-4]=\"!data.baseData.tableActions.length\"\n [class.md:col-span-3]=\"data.baseData.tableActions.length\"\n [class.md:col-span-6]=\"!data.baseData.tableActions.length\"\n [class.col-span-6]=\"data.baseData.tableActions.length\"\n [class.col-span-12]=\"!data.baseData.tableActions.length\"\n >\n <button type=\"button\" class=\"create-button\" mat-raised-button (click)=\"createEntity()\">\n {{data.baseData.createButtonLabel}}\n </button>\n </div>\n }\n</div>\n\n<div class=\"mat-elevation-z8\">\n <custom-table\n [configuration]=\"tableConfig\"\n [data]=\"entities\"\n [isLoading]=\"isLoading\"\n [searchString]=\"searchString\"\n (cellClicked)=\"editEntity($event.value)\"\n (selectionChanged)=\"selected = $event\"\n >\n </custom-table>\n</div>", styles: ["button{width:100%}.title{text-align:center}.actions-button,.create-button{height:56px;line-height:24px;font-size:16px}@media (max-width: 767px){.actions-button,.create-button{margin-bottom:15px}}\n", ".grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.gap-x-6{column-gap:24px}.grid{display:grid}@media (min-width: 1024px){.lg\\:col-span-12{grid-column:span 12/span 12!important}.lg\\:col-span-11{grid-column:span 11/span 11!important}.lg\\:col-span-10{grid-column:span 10/span 10!important}.lg\\:col-span-9{grid-column:span 9/span 9!important}.lg\\:col-span-8{grid-column:span 8/span 8!important}.lg\\:col-span-7{grid-column:span 7/span 7!important}.lg\\:col-span-6{grid-column:span 6/span 6!important}.lg\\:col-span-5{grid-column:span 5/span 5!important}.lg\\:col-span-4{grid-column:span 4/span 4!important}.lg\\:col-span-3{grid-column:span 3/span 3!important}.lg\\:col-span-2{grid-column:span 2/span 2!important}.lg\\:col-span-1{grid-column:span 1/span 1!important}}@media (min-width: 768px) and (max-width: 1023px){.md\\:col-span-12{grid-column:span 12/span 12!important}.md\\:col-span-11{grid-column:span 11/span 11!important}.md\\:col-span-10{grid-column:span 10/span 10!important}.md\\:col-span-9{grid-column:span 9/span 9!important}.md\\:col-span-8{grid-column:span 8/span 8!important}.md\\:col-span-7{grid-column:span 7/span 7!important}.md\\:col-span-6{grid-column:span 6/span 6!important}.md\\:col-span-5{grid-column:span 5/span 5!important}.md\\:col-span-4{grid-column:span 4/span 4!important}.md\\:col-span-3{grid-column:span 3/span 3!important}.md\\:col-span-2{grid-column:span 2/span 2!important}.md\\:col-span-1{grid-column:span 1/span 1!important}}.col-span-12{grid-column:span 12/span 12}.col-span-11{grid-column:span 11/span 11}.col-span-10{grid-column:span 10/span 10}.col-span-9{grid-column:span 9/span 9}.col-span-8{grid-column:span 8/span 8}.col-span-7{grid-column:span 7/span 7}.col-span-6{grid-column:span 6/span 6}.col-span-5{grid-column:span 5/span 5}.col-span-4{grid-column:span 4/span 4}.col-span-3{grid-column:span 3/span 3}.col-span-2{grid-column:span 2/span 2}.col-span-1{grid-column:span 1/span 1}\n"] }]
315
- }], ctorParameters: () => [{ type: i1.MatDialog }, { type: i0.EnvironmentInjector }, { type: i2.Router }, { type: undefined, decorators: [{
316
- type: Inject,
317
- args: [NGX_COMPLETE_GLOBAL_DEFAULT_VALUES]
318
- }] }], propDecorators: { tableData: [{
319
- type: Input,
320
- args: [{ required: true }]
321
- }], unsavedDialogChanges: [{
322
- type: Output
323
- }] } });
324
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0ksT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QyxPQUFPLEVBQTRCLDZCQUE2QixFQUFFLE1BQU0s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QkFBMEI7a0JBbEJ0QyxTQUFTOytCQUNJLHNCQUFzQixjQUdwQixJQUFJLFdBQ1A7d0JBQ0wsWUFBWTt3QkFDWixjQUFjO3dCQUNkLFdBQVc7d0JBQ1gsa0JBQWtCO3dCQUNsQixhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixlQUFlO3dCQUNmLHdCQUF3Qjt3QkFDeEIsb0JBQW9CO3FCQUN2Qjs7MEJBNkRJLE1BQU07MkJBQUMsa0NBQWtDO3lDQXJEOUMsU0FBUztzQkFEUixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFPaEIsb0JBQW9CO3NCQUQ1QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRW52aXJvbm1lbnRJbmplY3RvciwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBPbkluaXQsIE91dHB1dCwgaW5qZWN0LCBydW5JbkluamVjdGlvbkNvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nTW9kdWxlLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xuaW1wb3J0IHsgTWF0U29ydE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IENyZWF0ZUVudGl0eURhdGFJbnRlcm5hbCwgQ3JlYXRlRW50aXR5RGlhbG9nRGF0YUJ1aWxkZXIgfSBmcm9tICcuL2NyZWF0ZS1kaWFsb2cvY3JlYXRlLWVudGl0eS1kYXRhLmJ1aWxkZXInO1xuaW1wb3J0IHsgTmd4TWF0RW50aXR5Q3JlYXRlRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9jcmVhdGUtZGlhbG9nL2NyZWF0ZS1lbnRpdHktZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFZGl0RW50aXR5RGF0YSB9IGZyb20gJy4vZWRpdC1kaWFsb2cvZWRpdC1lbnRpdHktZGF0YSc7XG5pbXBvcnQgeyBOZ3hNYXRFbnRpdHlFZGl0RGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9lZGl0LWRpYWxvZy9lZGl0LWVudGl0eS1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IEVkaXRFbnRpdHlEYXRhQnVpbGRlciwgRWRpdEVudGl0eURhdGFJbnRlcm5hbCB9IGZyb20gJy4vZWRpdC1kaWFsb2cvZWRpdC1lbnRpdHkuYnVpbGRlcic7XG5pbXBvcnQgeyBEaXNwbGF5Q29sdW1uLCBUYWJsZURhdGEgfSBmcm9tICcuL3RhYmxlLWRhdGEnO1xuaW1wb3J0IHsgQmFzZVRhYmxlQWN0aW9uSW50ZXJuYWwsIFRhYmxlQWN0aW9uSW50ZXJuYWwsIFRhYmxlRGF0YUJ1aWxkZXIsIFRhYmxlRGF0YUludGVybmFsIH0gZnJvbSAnLi90YWJsZS1kYXRhLmJ1aWxkZXInO1xuaW1wb3J0IHsgQmFzZUVudGl0eVR5cGUsIEVudGl0eSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7IE5HWF9DT01QTEVURV9HTE9CQUxfREVGQVVMVF9WQUxVRVMsIE5neEdsb2JhbERlZmF1bHRWYWx1ZXMgfSBmcm9tICcuLi8uLi9nbG9iYWwtY29uZmlndXJhdGlvbi12YWx1ZXMnO1xuaW1wb3J0IHsgRW50aXR5U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VudGl0eS5zZXJ2aWNlJztcbmltcG9ydCB7IEVudGl0eVV0aWxpdGllcyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9lbnRpdHkudXRpbGl0aWVzJztcbmltcG9ydCB7IENvbmZpcm1EaWFsb2dEYXRhQnVpbGRlciwgQ29uZmlybURpYWxvZ0RhdGFJbnRlcm5hbCB9IGZyb20gJy4uL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLWRhdGEuYnVpbGRlcic7XG5pbXBvcnQgeyBOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vY29uZmlybS1kaWFsb2cvY29uZmlybS1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IEN1c3RvbVRhYmxlQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL2N1c3RvbS10YWJsZS9jdXN0b20tdGFibGUtY29uZmlndXJhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBDdXN0b21UYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uL2N1c3RvbS10YWJsZS9jdXN0b20tdGFibGUuY29tcG9uZW50JztcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBmdWxseSBmdW5jdGlvbmFsIHRhYmxlIGZvciBkaXNwbGF5aW5nLCBjcmVhdGluZywgdXBkYXRpbmcgYW5kIGRlbGV0aW5nIGVudGl0aWVzXG4gKiBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiBwYXNzZWQgaW4gdGhlIEBJbnB1dCBcInRhYmxlRGF0YVwiLlxuICpcbiAqIEl0IG9mZmVycyBhIGxvdCBvZiBjdXN0b21pemF0aW9uIG9wdGlvbnMgd2hpY2ggY2FuIGJlIGZvdW5kIGluIFwiVGFibGVEYXRhXCIuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd4LW1hdC1lbnRpdHktdGFibGUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnLCAnLi4vLi4vc2Nzcy90YWlsd2luZC1jbGFzc2VzLnNjc3MnXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICAgICAgTWF0U29ydE1vZHVsZSxcbiAgICAgICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgICAgICBNYXRNZW51TW9kdWxlLFxuICAgICAgICBNYXREaWFsb2dNb2R1bGUsXG4gICAgICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcbiAgICAgICAgQ3VzdG9tVGFibGVDb21wb25lbnRcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIE5neE1hdEVudGl0eVRhYmxlQ29tcG9uZW50PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHk+PiBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICAgIHRhYmxlRGF0YSE6IFRhYmxlRGF0YTxFbnRpdHlUeXBlPjtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIHdoZW4gdGhlcmUgYXJlIHVuc2F2ZWQgY2hhbmdlcyBvbiBlaXRoZXIgdGhlIGNyZWF0ZSBvciB1cGRhdGUgZGlhbG9nLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IHVuc2F2ZWREaWFsb2dDaGFuZ2VzOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJuYWwgVGFibGVEYXRhLlxuICAgICAqL1xuICAgIGRhdGEhOiBUYWJsZURhdGFJbnRlcm5hbDxFbnRpdHlUeXBlPjtcblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICB0YWJsZUNvbmZpZyE6IEN1c3RvbVRhYmxlQ29uZmlndXJhdGlvbjxFbnRpdHlUeXBlPjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBlbnRpdGllcyB0byBkaXNwbGF5IGluc2lkZSB0aGUgdGFibGUuXG4gICAgICovXG4gICAgZW50aXRpZXMhOiBFbnRpdHlUeXBlW107XG5cbiAgICAvKipcbiAgICAgKiBBIHNlYXJjaCBzdHJpbmcgZm9yIGZpbHRlcmluZyB0YWJsZSByZXN1bHRzLlxuICAgICAqL1xuICAgIHNlYXJjaFN0cmluZzogc3RyaW5nID0gJyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGVudGl0aWVzLlxuICAgICAqL1xuICAgIHNlbGVjdGVkOiBFbnRpdHlUeXBlW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB0YWJsZSBjb250ZW50IGlzIGN1cnJlbnRseSBsb2FkaW5nLlxuICAgICAqL1xuICAgIGlzTG9hZGluZzogYm9vbGVhbiA9IHRydWU7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIGN1cnJlbnQgdXNlciBpcyBhbGxvd2VkIHRvIGNyZWF0ZSBlbnRyaWVzIGZvciB0aGUgdGFibGUuXG4gICAgICovXG4gICAgYWxsb3dDcmVhdGUhOiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBlbnRpdHlTZXJ2aWNlITogRW50aXR5U2VydmljZTxFbnRpdHlUeXBlPjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBpbnRlcm5hbCBCYXNlVGFibGVBY3Rpb24uIFNldHMgZGVmYXVsdCB2YWx1ZXMuXG4gICAgICovXG4gICAgaW1wb3J0QWN0aW9uITogQmFzZVRhYmxlQWN0aW9uSW50ZXJuYWw7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgQEluamVjdChOR1hfQ09NUExFVEVfR0xPQkFMX0RFRkFVTFRfVkFMVUVTKVxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbENvbmZpZzogTmd4R2xvYmFsRGVmYXVsdFZhbHVlc1xuICAgICkge31cblxuICAgIC8qKlxuICAgICAqIFNldHMgdXAgYWxsIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgdGFibGUgYW5kIHRoZSBFbnRpdHlTZXJ2aWNlLlxuICAgICAqL1xuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgVGFibGVEYXRhQnVpbGRlcih0aGlzLmdsb2JhbENvbmZpZywgdGhpcy50YWJsZURhdGEpLmdldFJlc3VsdCgpO1xuICAgICAgICBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvciwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbGxvd0NyZWF0ZSA9IHRoaXMuZGF0YS5iYXNlRGF0YS5hbGxvd0NyZWF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5lbnRpdHlTZXJ2aWNlID0gaW5qZWN0PEVudGl0eVNlcnZpY2U8RW50aXR5VHlwZT4+KHRoaXMuZGF0YS5iYXNlRGF0YS5FbnRpdHlTZXJ2aWNlQ2xhc3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmltcG9ydEFjdGlvbiA9IG5ldyBCYXNlVGFibGVBY3Rpb25JbnRlcm5hbCh7XG4gICAgICAgICAgICAuLi50aGlzLmRhdGEuYmFzZURhdGEuaW1wb3J0QWN0aW9uRGF0YSxcbiAgICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5zdGFydEltcG9ydEpzb24oKVxuICAgICAgICB9LCB0aGlzLmdsb2JhbENvbmZpZyk7XG5cbiAgICAgICAgdGhpcy50YWJsZUNvbmZpZyA9IHtcbiAgICAgICAgICAgIGRpc3BsYXlDb2x1bW5zOiB0aGlzLnRhYmxlRGF0YS5iYXNlRGF0YS5kaXNwbGF5Q29sdW1ucyxcbiAgICAgICAgICAgIHdpdGhTZWxlY3Rpb246ICEhdGhpcy5kYXRhLmJhc2VEYXRhLnRhYmxlQWN0aW9ucy5maWx0ZXIodEEgPT4gdEEudHlwZSA9PT0gJ211bHRpLXNlbGVjdCcpLmxlbmd0aCxcbiAgICAgICAgICAgIGFsbG93Q2xpY2s6ICh2YWx1ZSkgPT4gdGhpcy5hbGxvd1JlYWQodmFsdWUpIHx8IHRoaXMuYWxsb3dVcGRhdGUodmFsdWUpLFxuICAgICAgICAgICAgZHluYW1pY1Jvd1N0eWxlQ2xhc3NlczogdGhpcy5kYXRhLmJhc2VEYXRhLmR5bmFtaWNSb3dTdHlsZUNsYXNzZXMsXG4gICAgICAgICAgICBzZWFyY2hTdHJpbmdGb3JSb3c6IHRoaXMuZGF0YS5iYXNlRGF0YS5zZWFyY2hTdHJpbmdcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmVudGl0eVNlcnZpY2UuZW50aXRpZXNTdWJqZWN0LnN1YnNjcmliZSgoZW50aXRpZXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW50aXRpZXMgPSBbLi4uZW50aXRpZXNdO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLXRoZW5cbiAgICAgICAgdm9pZCB0aGlzLmVudGl0eVNlcnZpY2UucmVhZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgdG8gZGlzcGxheSBpbiB0aGUgY29sdW1uLlxuICAgICAqIFJ1bnMgaW4gZW52aXJvbm1lbnQgY29udGV4dCB0byBlbmFibGUgaW5qZWN0aW9uLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIGdldCB0aGUgdmFsdWUgZnJvbS5cbiAgICAgKiBAcGFyYW0gZGlzcGxheUNvbHVtbiAtIFRoZSBkaXNwbGF5IGNvbHVtbiB0byBnZXQgdGhlIHZhbHVlIGZyb20uXG4gICAgICogQHJldHVybnMgVGhlIHZhbHVlIG9mIHRoZSBkaXNwbGF5IGNvbHVtbi5cbiAgICAgKi9cbiAgICBnZXREaXNwbGF5Q29sdW1uVmFsdWUoZW50aXR5OiBFbnRpdHlUeXBlLCBkaXNwbGF5Q29sdW1uOiBEaXNwbGF5Q29sdW1uPEVudGl0eVR5cGU+KTogdW5rbm93biB7XG4gICAgICAgIHJldHVybiBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvciwgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGRpc3BsYXlDb2x1bW4udmFsdWUoZW50aXR5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydEltcG9ydEpzb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlucHV0OiBIVE1MSW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgaW5wdXQudHlwZSA9ICdmaWxlJztcbiAgICAgICAgaW5wdXQuYWNjZXB0ID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuICAgICAgICBpbnB1dC5vbmNoYW5nZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5maWxlcykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaW1wb3J0SnNvbihpbnB1dC5maWxlc1swXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlucHV0LmNsaWNrKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbXBvcnRKc29uKGZpbGU6IEZpbGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZGlhbG9nRGF0YTogQ29uZmlybURpYWxvZ0RhdGFJbnRlcm5hbCA9IG5ldyBDb25maXJtRGlhbG9nRGF0YUJ1aWxkZXIodGhpcy5nbG9iYWxDb25maWcsIHRoaXMuaW1wb3J0QWN0aW9uLmNvbmZpcm1EaWFsb2dEYXRhKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0ZXh0JywgdGhpcy5kYXRhLmJhc2VEYXRhLmltcG9ydEFjdGlvbkRhdGEuY29uZmlybURpYWxvZ0RhdGEudGV4dClcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGl0bGUnLCB0aGlzLmltcG9ydEFjdGlvbi5kaXNwbGF5TmFtZSlcbiAgICAgICAgICAgIC5nZXRSZXN1bHQoKTtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Tmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwgYm9vbGVhbj4gPSB0aGlzLmRpYWxvZy5vcGVuKE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRhdGE6IGRpYWxvZ0RhdGEsXG4gICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmVzOiBib29sZWFuIHwgdW5kZWZpbmVkID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkpO1xuICAgICAgICBpZiAocmVzID09IHRydWUpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW50aXR5U2VydmljZS5pbXBvcnQoZmlsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFZGl0cyBhbiBlbnRpdHkuIFRoaXMgZWl0aGVyIGNhbGxzIHRoZSBlZGl0LU1ldGhvZCBwcm92aWRlZCBieSB0aGUgdXNlciBvciB1c2VzIGEgZGVmYXVsdCBlZGl0LWRpYWxvZy5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0aGF0IHNob3VsZCBiZSB1cGRhdGVkLlxuICAgICAqIEB0aHJvd3MgV2hlbiBubyBFbnRpdHlDbGFzcyB3YXMgcHJvdmlkZWQsIGFzIGEgbmV3IGNhbGwgaXMgbmVlZGVkIHRvIGluaXRpYWxpemUgbWV0YWRhdGEuXG4gICAgICovXG4gICAgZWRpdEVudGl0eShlbnRpdHk6IEVudGl0eVR5cGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmRhdGEuYmFzZURhdGEuRW50aXR5Q2xhc3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gXCJFbnRpdHlDbGFzc1wiIHNwZWNpZmllZCBmb3IgdGhpcyB0YWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRhdGEuYmFzZURhdGEuZWRpdCkge1xuICAgICAgICAgICAgdGhpcy5kYXRhLmJhc2VEYXRhLmVkaXQobmV3IHRoaXMuZGF0YS5iYXNlRGF0YS5FbnRpdHlDbGFzcyhlbnRpdHkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhLmJhc2VEYXRhLmRlZmF1bHRFZGl0ID09ICdwYWdlJykge1xuICAgICAgICAgICAgdGhpcy5lZGl0RGVmYXVsdFBhZ2UobmV3IHRoaXMuZGF0YS5iYXNlRGF0YS5FbnRpdHlDbGFzcyhlbnRpdHkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2b2lkIHRoaXMuZWRpdERlZmF1bHREaWFsb2cobmV3IHRoaXMuZGF0YS5iYXNlRGF0YS5FbnRpdHlDbGFzcyhlbnRpdHkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHVwZGF0aW5nIHRoZSBwcm92aWRlZCBlbnRpdHkgaXMgYWxsb3dlZC5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0aGF0IHRoZSB1c2VyIHdhbnRzIHRvIGVkaXQuXG4gICAgICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSB1c2VyIGNhbiBlZGl0IHRoZSBwcm92aWRlZCBlbnRpdHkgYW5kIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBhbGxvd1VwZGF0ZShlbnRpdHk6IEVudGl0eVR5cGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmluamVjdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmJhc2VEYXRhLmFsbG93VXBkYXRlKGVudGl0eSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdmlld2luZyB0aGUgcHJvdmlkZWQgZW50aXR5IGlzIGFsbG93ZWQuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdGhhdCB0aGUgdXNlciB3YW50cyB0byB2aWV3LlxuICAgICAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgdXNlciBjYW4gdmlldyB0aGUgcHJvdmlkZWQgZW50aXR5IGFuZCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgYWxsb3dSZWFkKGVudGl0eTogRW50aXR5VHlwZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuaW5qZWN0b3IsICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuYmFzZURhdGEuYWxsb3dSZWFkKGVudGl0eSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZWRpdERlZmF1bHRQYWdlKGVudGl0eTogRW50aXR5VHlwZSk6IHZvaWQge1xuICAgICAgICB2b2lkIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnJywgdGhpcy5lbnRpdHlTZXJ2aWNlLmVkaXRCYXNlUm91dGUsIGVudGl0eS5pZF0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZWRpdERlZmF1bHREaWFsb2coZW50aXR5OiBFbnRpdHlUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGlucHV0RGlhbG9nRGF0YTogRWRpdEVudGl0eURhdGE8RW50aXR5VHlwZT4gPSB7XG4gICAgICAgICAgICBlbnRpdHk6IGVudGl0eSxcbiAgICAgICAgICAgIEVudGl0eVNlcnZpY2VDbGFzczogdGhpcy5kYXRhLmJhc2VEYXRhLkVudGl0eVNlcnZpY2VDbGFzcyxcbiAgICAgICAgICAgIGFsbG93VXBkYXRlOiB0aGlzLmRhdGEuYmFzZURhdGEuYWxsb3dVcGRhdGUsXG4gICAgICAgICAgICBhbGxvd0RlbGV0ZTogdGhpcy5kYXRhLmJhc2VEYXRhLmFsbG93RGVsZXRlLFxuICAgICAgICAgICAgZWRpdERhdGE6IHRoaXMuZGF0YS5lZGl0RGF0YVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBkaWFsb2dEYXRhOiBFZGl0RW50aXR5RGF0YUludGVybmFsPEVudGl0eVR5cGU+ID0gbmV3IEVkaXRFbnRpdHlEYXRhQnVpbGRlcihpbnB1dERpYWxvZ0RhdGEsIHRoaXMuZ2xvYmFsQ29uZmlnKS5nZXRSZXN1bHQoKTtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Tmd4TWF0RW50aXR5RWRpdERpYWxvZ0NvbXBvbmVudDxCYXNlRW50aXR5VHlwZTx1bmtub3duPj4sIG51bWJlcj4gPSB0aGlzLmRpYWxvZy5vcGVuKFxuICAgICAgICAgICAgTmd4TWF0RW50aXR5RWRpdERpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgIGRhdGE6IGRpYWxvZ0RhdGEsXG4gICAgICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS51bnNhdmVkQ2hhbmdlcy5zdWJzY3JpYmUocmVzID0+IHRoaXMudW5zYXZlZERpYWxvZ0NoYW5nZXMuZW1pdChyZXMpKTtcbiAgICAgICAgY29uc3QgcmVzOiBudW1iZXIgfCB1bmRlZmluZWQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKSk7XG4gICAgICAgIHRoaXMudW5zYXZlZERpYWxvZ0NoYW5nZXMuZW1pdChmYWxzZSk7XG4gICAgICAgIGlmIChyZXMgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZW50aXRpZXNbdGhpcy5lbnRpdGllcy5maW5kSW5kZXgoKGUpID0+IGVbdGhpcy5lbnRpdHlTZXJ2aWNlLmlkS2V5XSA9PT0gZW50aXR5W3RoaXMuZW50aXR5U2VydmljZS5pZEtleV0pXSA9IGVudGl0eTtcbiAgICAgICAgICAgIHRoaXMuZW50aXRpZXMgPSB0aGlzLmVudGl0aWVzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBFbnRpdHkuIFRoaXMgZWl0aGVyIGNhbGxzIHRoZSBjcmVhdGUtTWV0aG9kIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIG9yIHVzZXMgYSBkZWZhdWx0IGNyZWF0ZS1kaWFsb2cuXG4gICAgICogQHRocm93cyBXaGVuIG5vIEVudGl0eUNsYXNzIHdhcyBwcm92aWRlZCwgYXMgYSBuZXcgY2FsbCBpcyBuZWVkZWQgdG8gaW5pdGlhbGl6ZSBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBjcmVhdGVFbnRpdHkoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFsbG93Q3JlYXRlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YS5iYXNlRGF0YS5FbnRpdHlDbGFzcykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gXCJFbnRpdHlDbGFzc1wiIHNwZWNpZmllZCBmb3IgdGhpcyB0YWJsZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZW50aXR5OiBFbnRpdHlUeXBlID0gbmV3IHRoaXMuZGF0YS5iYXNlRGF0YS5FbnRpdHlDbGFzcygpO1xuICAgICAgICAgICAgRW50aXR5VXRpbGl0aWVzLnNldERlZmF1bHRWYWx1ZXMoZW50aXR5KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuYmFzZURhdGEuY3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLmJhc2VEYXRhLmNyZWF0ZShlbnRpdHkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuYmFzZURhdGEuZGVmYXVsdENyZWF0ZSA9PSAncGFnZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZURlZmF1bHRQYWdlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdm9pZCB0aGlzLmNyZWF0ZURlZmF1bHREaWFsb2coZW50aXR5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRGVmYXVsdFBhZ2UoKTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLmVudGl0eVNlcnZpY2UuY3JlYXRlQmFzZVJvdXRlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNyZWF0ZURlZmF1bHREaWFsb2coZW50aXR5OiBFbnRpdHlUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRpYWxvZ0RhdGE6IENyZWF0ZUVudGl0eURhdGFJbnRlcm5hbDxFbnRpdHlUeXBlPiA9IG5ldyBDcmVhdGVFbnRpdHlEaWFsb2dEYXRhQnVpbGRlcihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbnRpdHk6IGVudGl0eSxcbiAgICAgICAgICAgICAgICBFbnRpdHlTZXJ2aWNlQ2xhc3M6IHRoaXMuZGF0YS5iYXNlRGF0YS5FbnRpdHlTZXJ2aWNlQ2xhc3MsXG4gICAgICAgICAgICAgICAgY3JlYXRlRGF0YTogdGhpcy5kYXRhLmNyZWF0ZURhdGFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLmdsb2JhbENvbmZpZ1xuICAgICAgICApLmdldFJlc3VsdCgpO1xuICAgICAgICBjb25zdCBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxOZ3hNYXRFbnRpdHlDcmVhdGVEaWFsb2dDb21wb25lbnQ8QmFzZUVudGl0eVR5cGU8dW5rbm93bj4+PiA9IHRoaXMuZGlhbG9nLm9wZW4oXG4gICAgICAgICAgICBOZ3hNYXRFbnRpdHlDcmVhdGVEaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBkaWFsb2dEYXRhLFxuICAgICAgICAgICAgICAgIG1pbldpZHRoOiAnNjAlJyxcbiAgICAgICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLnVuc2F2ZWRDaGFuZ2VzLnN1YnNjcmliZShyZXMgPT4gdGhpcy51bnNhdmVkRGlhbG9nQ2hhbmdlcy5lbWl0KHJlcykpO1xuICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKSk7XG4gICAgICAgIHRoaXMudW5zYXZlZERpYWxvZ0NoYW5nZXMuZW1pdChmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyB0aGUgVGFibGVBY3Rpb24gZm9yIGFsbCBzZWxlY3RlZCBlbnRyaWVzLlxuICAgICAqIEFsc28gaGFuZGxlcyBjb25maXJtYXRpb24gd2l0aCBhbiBhZGRpdGlvbmFsIGRpYWxvZyBpZiBjb25maWd1cmVkLlxuICAgICAqIEBwYXJhbSBhY3Rpb24gLSBUaGUgVGFibGVBY3Rpb24gdG8gcnVuLlxuICAgICAqL1xuICAgIGFzeW5jIHJ1blRhYmxlQWN0aW9uKGFjdGlvbjogVGFibGVBY3Rpb25JbnRlcm5hbDxFbnRpdHlUeXBlPik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCByZXF1aXJlQ29uZmlybURpYWxvZzogYm9vbGVhbiA9IHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmluamVjdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnJlcXVpcmVDb25maXJtRGlhbG9nKHRoaXMuc2VsZWN0ZWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXJlcXVpcmVDb25maXJtRGlhbG9nKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbmZpcm1SdW5UYWJsZUFjdGlvbihhY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIGJvb2xlYW4+ID0gdGhpcy5kaWFsb2cub3BlbihOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBkYXRhOiBhY3Rpb24uY29uZmlybURpYWxvZ0RhdGEsXG4gICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmVzOiBib29sZWFuIHwgdW5kZWZpbmVkID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkpO1xuICAgICAgICBpZiAocmVzID09IHRydWUpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29uZmlybVJ1blRhYmxlQWN0aW9uKGFjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNvbmZpcm1SdW5UYWJsZUFjdGlvbihhY3Rpb246IFRhYmxlQWN0aW9uSW50ZXJuYWw8RW50aXR5VHlwZT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuaW5qZWN0b3IsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGFjdGlvbi5hY3Rpb24odGhpcy5zZWxlY3RlZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbiBUYWJsZUFjdGlvbiBpcyBkaXNhYmxlZCAoZS5nLiBCZWNhdXNlIG5vIGVudHJpZXMgaGF2ZSBiZWVuIHNlbGVjdGVkKS5cbiAgICAgKiBAcGFyYW0gYWN0aW9uIC0gVGhlIFRhYmxlQWN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBBY3Rpb24gY2FuIGJlIHVzZWQuXG4gICAgICovXG4gICAgdGFibGVBY3Rpb25EaXNhYmxlZChhY3Rpb246IFRhYmxlQWN0aW9uSW50ZXJuYWw8RW50aXR5VHlwZT4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLmluamVjdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gIWFjdGlvbi5lbmFibGVkKHRoaXMuc2VsZWN0ZWQpO1xuICAgICAgICB9KTtcbiAgICB9XG59IiwiPCEtLSBlc2xpbnQtZGlzYWJsZSBhbmd1bGFyL25vLWNhbGwtZXhwcmVzc2lvbiAtLT5cbjxoMSBjbGFzcz1cInRpdGxlXCI+e3tkYXRhLmJhc2VEYXRhLnRpdGxlfX08L2gxPlxuXG48ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtMTIgZ2FwLXgtNlwiPlxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImxnOmNvbC1zcGFuLTggbWQ6Y29sLXNwYW4tNiBjb2wtc3Bhbi0xMlwiPlxuICAgICAgICA8bWF0LWxhYmVsPnt7ZGF0YS5iYXNlRGF0YS5zZWFyY2hMYWJlbH19PC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cInNlYXJjaFN0cmluZ1wiPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgQGlmIChkYXRhLmJhc2VEYXRhLnRhYmxlQWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgW2NsYXNzLmxnOmNvbC1zcGFuLTJdPVwiYWxsb3dDcmVhdGVcIlxuICAgICAgICAgICAgW2NsYXNzLmxnOmNvbC1zcGFuLTRdPVwiIWFsbG93Q3JlYXRlXCJcbiAgICAgICAgICAgIFtjbGFzcy5tZDpjb2wtc3Bhbi0zXT1cImFsbG93Q3JlYXRlXCJcbiAgICAgICAgICAgIFtjbGFzcy5tZDpjb2wtc3Bhbi02XT1cIiFhbGxvd0NyZWF0ZVwiXG4gICAgICAgICAgICBbY2xhc3MuY29sLXNwYW4tNl09XCJhbGxvd0NyZWF0ZVwiXG4gICAgICAgICAgICBbY2xhc3MuY29sLXNwYW4tMTJdPVwiIWFsbG93Q3JlYXRlXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhY3Rpb25zLWJ1dHRvblwiIG1hdC1yYWlzZWQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCI+XG4gICAgICAgICAgICAgICAge3tkYXRhLmJhc2VEYXRhLnRhYmxlQWN0aW9uc0xhYmVsfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG4gICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgICAgICBAaWYgKGRhdGEuYmFzZURhdGEuYWxsb3dKc29uSW1wb3J0KSB7XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJ0YWJsZUFjdGlvbkRpc2FibGVkKGltcG9ydEFjdGlvbilcIiAoY2xpY2spPVwicnVuVGFibGVBY3Rpb24oaW1wb3J0QWN0aW9uKVwiPlxuICAgICAgICAgICAgICAgIHt7aW1wb3J0QWN0aW9uLmRpc3BsYXlOYW1lfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICAgIEBmb3IgKGFjdGlvbiBvZiBkYXRhLmJhc2VEYXRhLnRhYmxlQWN0aW9uczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJ0YWJsZUFjdGlvbkRpc2FibGVkKGFjdGlvbilcIiAoY2xpY2spPVwicnVuVGFibGVBY3Rpb24oYWN0aW9uKVwiPlxuICAgICAgICAgICAgICAgIHt7YWN0aW9uLmRpc3BsYXlOYW1lfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgPC9tYXQtbWVudT5cblxuICAgIEBpZiAoYWxsb3dDcmVhdGUpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgW2NsYXNzLmxnOmNvbC1zcGFuLTJdPVwiZGF0YS5iYXNlRGF0YS50YWJsZUFjdGlvbnMubGVuZ3RoXCJcbiAgICAgICAgICAgIFtjbGFzcy5sZzpjb2wtc3Bhbi00XT1cIiFkYXRhLmJhc2VEYXRhLnRhYmxlQWN0aW9ucy5sZW5ndGhcIlxuICAgICAgICAgICAgW2NsYXNzLm1kOmNvbC1zcGFuLTNdPVwiZGF0YS5iYXNlRGF0YS50YWJsZUFjdGlvbnMubGVuZ3RoXCJcbiAgICAgICAgICAgIFtjbGFzcy5tZDpjb2wtc3Bhbi02XT1cIiFkYXRhLmJhc2VEYXRhLnRhYmxlQWN0aW9ucy5sZW5ndGhcIlxuICAgICAgICAgICAgW2NsYXNzLmNvbC1zcGFuLTZdPVwiZGF0YS5iYXNlRGF0YS50YWJsZUFjdGlvbnMubGVuZ3RoXCJcbiAgICAgICAgICAgIFtjbGFzcy5jb2wtc3Bhbi0xMl09XCIhZGF0YS5iYXNlRGF0YS50YWJsZUFjdGlvbnMubGVuZ3RoXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjcmVhdGUtYnV0dG9uXCIgbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cImNyZWF0ZUVudGl0eSgpXCI+XG4gICAgICAgICAgICAgICAge3tkYXRhLmJhc2VEYXRhLmNyZWF0ZUJ1dHRvbkxhYmVsfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejhcIj5cbiAgICA8Y3VzdG9tLXRhYmxlXG4gICAgICAgIFtjb25maWd1cmF0aW9uXT1cInRhYmxlQ29uZmlnXCJcbiAgICAgICAgW2RhdGFdPVwiZW50aXRpZXNcIlxuICAgICAgICBbaXNMb2FkaW5nXT1cImlzTG9hZGluZ1wiXG4gICAgICAgIFtzZWFyY2hTdHJpbmddPVwic2VhcmNoU3RyaW5nXCJcbiAgICAgICAgKGNlbGxDbGlja2VkKT1cImVkaXRFbnRpdHkoJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgIChzZWxlY3Rpb25DaGFuZ2VkKT1cInNlbGVjdGVkID0gJGV2ZW50XCJcbiAgICA+XG4gICAgPC9jdXN0b20tdGFibGU+XG48L2Rpdj4iXX0=
@@ -1,26 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import { FaIconComponent } from '@fortawesome/angular-fontawesome';
3
- import { faInfo } from '@fortawesome/free-solid-svg-icons';
4
- import { TooltipDirective } from '../../directives/tooltip.directive';
5
- import * as i0 from "@angular/core";
6
- /**
7
- * A component that displays an info-symbol and a tooltip when it is hovered/clicked.
8
- */
9
- export class TooltipComponent {
10
- // eslint-disable-next-line jsdoc/require-jsdoc
11
- faInfo = faInfo;
12
- /**
13
- * What to display inside the tooltip.
14
- */
15
- tooltipContent;
16
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.7", ngImport: i0, type: TooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
17
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.7", type: TooltipComponent, isStandalone: true, selector: "ngx-mat-entity-tooltip", inputs: { tooltipContent: "tooltipContent" }, ngImport: i0, template: "<div class=\"info\" [tooltip]=\"tooltipContent\">\n <fa-icon [icon]=\"faInfo\"></fa-icon>\n</div>", styles: [".info{display:flex;align-items:center;justify-content:center;height:25px;min-height:25px;width:25px;min-width:25px;border:2px solid black;border-radius:50%}.info:hover{cursor:pointer;background-color:#e3e3e3}\n"], dependencies: [{ kind: "directive", type: TooltipDirective, selector: "[tooltip]", inputs: ["tooltip"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }] });
18
- }
19
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.7", ngImport: i0, type: TooltipComponent, decorators: [{
20
- type: Component,
21
- args: [{ selector: 'ngx-mat-entity-tooltip', standalone: true, imports: [TooltipDirective, FaIconComponent], template: "<div class=\"info\" [tooltip]=\"tooltipContent\">\n <fa-icon [icon]=\"faInfo\"></fa-icon>\n</div>", styles: [".info{display:flex;align-items:center;justify-content:center;height:25px;min-height:25px;width:25px;min-width:25px;border:2px solid black;border-radius:50%}.info:hover{cursor:pointer;background-color:#e3e3e3}\n"] }]
22
- }], propDecorators: { tooltipContent: [{
23
- type: Input,
24
- args: [{ required: true }]
25
- }] } });
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFrQixNQUFNLGtDQUFrQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUUzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7QUFFdEU7O0dBRUc7QUFRSCxNQUFNLE9BQU8sZ0JBQWdCO0lBRXpCLCtDQUErQztJQUMvQyxNQUFNLEdBQW1CLE1BQU0sQ0FBQztJQUVoQzs7T0FFRztJQUVILGNBQWMsQ0FBVTt1R0FUZixnQkFBZ0I7MkZBQWhCLGdCQUFnQixnSUNoQjdCLHNHQUVNLDRRRFlRLGdCQUFnQiwyRUFBRSxlQUFlOzsyRkFFbEMsZ0JBQWdCO2tCQVA1QixTQUFTOytCQUNJLHdCQUF3QixjQUd0QixJQUFJLFdBQ1AsQ0FBQyxnQkFBZ0IsRUFBRSxlQUFlLENBQUM7OEJBVzVDLGNBQWM7c0JBRGIsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGYUljb25Db21wb25lbnQsIEljb25EZWZpbml0aW9uIH0gZnJvbSAnQGZvcnRhd2Vzb21lL2FuZ3VsYXItZm9udGF3ZXNvbWUnO1xuaW1wb3J0IHsgZmFJbmZvIH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZyZWUtc29saWQtc3ZnLWljb25zJztcblxuaW1wb3J0IHsgVG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvdG9vbHRpcC5kaXJlY3RpdmUnO1xuXG4vKipcbiAqIEEgY29tcG9uZW50IHRoYXQgZGlzcGxheXMgYW4gaW5mby1zeW1ib2wgYW5kIGEgdG9vbHRpcCB3aGVuIGl0IGlzIGhvdmVyZWQvY2xpY2tlZC5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3gtbWF0LWVudGl0eS10b29sdGlwJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdG9vbHRpcC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vdG9vbHRpcC5jb21wb25lbnQuc2NzcyddLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1Rvb2x0aXBEaXJlY3RpdmUsIEZhSWNvbkNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgVG9vbHRpcENvbXBvbmVudCB7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuICAgIGZhSW5mbzogSWNvbkRlZmluaXRpb24gPSBmYUluZm87XG5cbiAgICAvKipcbiAgICAgKiBXaGF0IHRvIGRpc3BsYXkgaW5zaWRlIHRoZSB0b29sdGlwLlxuICAgICAqL1xuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gICAgdG9vbHRpcENvbnRlbnQhOiBzdHJpbmc7XG59IiwiPGRpdiBjbGFzcz1cImluZm9cIiBbdG9vbHRpcF09XCJ0b29sdGlwQ29udGVudFwiPlxuICAgIDxmYS1pY29uIFtpY29uXT1cImZhSW5mb1wiPjwvZmEtaWNvbj5cbjwvZGl2PiJdfQ==