@unifylib/ui-lib 1.0.3 → 1.0.65

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 (265) hide show
  1. package/esm2022/iq-ui-lib.mjs +5 -0
  2. package/esm2022/lib/base-model/SearchStrConfig.mjs +11 -0
  3. package/esm2022/lib/base-model/api-response.mjs +2 -0
  4. package/esm2022/lib/base-model/audit-log-entry.mjs +3 -0
  5. package/esm2022/lib/base-model/button-action-settings.mjs +17 -0
  6. package/esm2022/lib/base-model/column-def.model.mjs +28 -0
  7. package/esm2022/lib/base-model/do-action-request.mjs +8 -0
  8. package/esm2022/lib/base-model/field-action.mjs +6 -0
  9. package/esm2022/lib/base-model/field-filter.model.mjs +3 -0
  10. package/esm2022/lib/base-model/field-info.mjs +64 -0
  11. package/esm2022/lib/base-model/field-predicate.model.mjs +10 -0
  12. package/esm2022/lib/base-model/filter-request.mjs +13 -0
  13. package/esm2022/lib/base-model/filter.model.mjs +25 -0
  14. package/esm2022/lib/base-model/get-items-list.mjs +10 -0
  15. package/esm2022/lib/base-model/index.mjs +13 -0
  16. package/esm2022/lib/base-model/items-total.model.mjs +8 -0
  17. package/esm2022/lib/base-model/line-item.model.mjs +12 -0
  18. package/esm2022/lib/base-model/lookupItem.mjs +16 -0
  19. package/esm2022/lib/base-model/page-info.mjs +17 -0
  20. package/esm2022/lib/base-model/permission-matrix.model.mjs +2 -0
  21. package/esm2022/lib/base-model/report-request.model.mjs +17 -0
  22. package/esm2022/lib/base-model/response-envelop.model.mjs +10 -0
  23. package/esm2022/lib/base-model/snack-message.model.mjs +11 -0
  24. package/esm2022/lib/base-model/table-column.interface.mjs +2 -0
  25. package/esm2022/lib/base-model/table-page-user-action.interface.mjs +21 -0
  26. package/esm2022/lib/base-model/workflow/workflow-steps.model.mjs +9 -0
  27. package/esm2022/lib/base-model/workflow/workflow.model.mjs +42 -0
  28. package/esm2022/lib/components/action-comment/action-comment.component.mjs +111 -0
  29. package/esm2022/lib/components/action-confirmation/action-confirmation.component.mjs +68 -0
  30. package/esm2022/lib/components/activity-report-form/activity-report-form.component.mjs +486 -0
  31. package/esm2022/lib/components/advanced-filter/field-filter/field-filter.component.mjs +44 -0
  32. package/esm2022/lib/components/advanced-filter/filter-builder/filter-builder.component.mjs +323 -0
  33. package/esm2022/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.mjs +70 -0
  34. package/esm2022/lib/components/audit-log-list/audit-log.component.mjs +97 -0
  35. package/esm2022/lib/components/auto-complete/auto-complete.component.mjs +300 -0
  36. package/esm2022/lib/components/base-form/base-form.component.mjs +284 -0
  37. package/esm2022/lib/components/base-form-canvas/MaxDigitsDirective.mjs +29 -0
  38. package/esm2022/lib/components/base-form-canvas/NumbersOnlyDirective.mjs +132 -0
  39. package/esm2022/lib/components/base-form-canvas/base-form-canvas.component.mjs +789 -0
  40. package/esm2022/lib/components/base-input-dialog/base-input-dialog.component.mjs +72 -0
  41. package/esm2022/lib/components/base-table/base-table.component.mjs +708 -0
  42. package/esm2022/lib/components/button-actions/button-actions.component.mjs +101 -0
  43. package/esm2022/lib/components/editable-base-table/editable-base-table.component.mjs +507 -0
  44. package/esm2022/lib/components/equation-builder/equation-builder.component.mjs +117 -0
  45. package/esm2022/lib/components/item-line-editor/item-line-editor.component.mjs +322 -0
  46. package/esm2022/lib/components/multi-auto-complete/multi-auto-complete.component.mjs +294 -0
  47. package/esm2022/lib/components/paginator/paginator.component.mjs +181 -0
  48. package/esm2022/lib/components/permission-matrix/permission-matrix.component.mjs +129 -0
  49. package/esm2022/lib/components/report-details-dialog/report-details-dialog.component.mjs +102 -0
  50. package/esm2022/lib/components/report-form/report-form.component.mjs +485 -0
  51. package/esm2022/lib/components/search-bar/search-bar.component.mjs +63 -0
  52. package/esm2022/lib/components/section-form-canvas/section-form-canvas.component.mjs +99 -0
  53. package/esm2022/lib/components/shared/action-button/action-button.component.mjs +59 -0
  54. package/esm2022/lib/components/shared/action-card/action-card.component.mjs +93 -0
  55. package/esm2022/lib/components/shared/attachment-uploader/attachment-uploader.component.mjs +74 -0
  56. package/esm2022/lib/components/shared-list/shared-list.component.mjs +47 -0
  57. package/esm2022/lib/components/snackbar-static/snackbar-static.component.mjs +43 -0
  58. package/esm2022/lib/components/title-bar/title-bar.component.mjs +185 -0
  59. package/esm2022/lib/services/backend-service.mjs +241 -0
  60. package/esm2022/lib/services/index.mjs +4 -0
  61. package/esm2022/lib/services/top-panel.mjs +22 -0
  62. package/esm2022/lib/services/trigger-form.service.mjs +17 -0
  63. package/esm2022/lib/utils/base-utils.mjs +101 -0
  64. package/esm2022/lib/validators/date-range-validator.mjs +27 -0
  65. package/esm2022/lib/validators/index.mjs +4 -0
  66. package/esm2022/lib/validators/match-list.validator.mjs +9 -0
  67. package/esm2022/lib/validators/multi-email-validator.mjs +13 -0
  68. package/esm2022/public-api.mjs +30 -0
  69. package/esm2022/unifylib-ui-lib.mjs +5 -0
  70. package/fesm2022/iq-ui-lib.mjs +6713 -0
  71. package/fesm2022/iq-ui-lib.mjs.map +1 -0
  72. package/fesm2022/unifylib-ui-lib.mjs +6713 -0
  73. package/fesm2022/unifylib-ui-lib.mjs.map +1 -0
  74. package/index.d.ts +5 -0
  75. package/lib/base-model/SearchStrConfig.d.ts +8 -0
  76. package/{src/lib/base-model/api-response.ts → lib/base-model/api-response.d.ts} +5 -7
  77. package/lib/base-model/audit-log-entry.d.ts +7 -0
  78. package/lib/base-model/button-action-settings.d.ts +16 -0
  79. package/lib/base-model/column-def.model.d.ts +11 -0
  80. package/lib/base-model/do-action-request.d.ts +10 -0
  81. package/lib/base-model/field-action.d.ts +6 -0
  82. package/lib/base-model/field-filter.model.d.ts +7 -0
  83. package/lib/base-model/field-info.d.ts +59 -0
  84. package/lib/base-model/field-predicate.model.d.ts +7 -0
  85. package/lib/base-model/filter-request.d.ts +15 -0
  86. package/lib/base-model/filter.model.d.ts +22 -0
  87. package/lib/base-model/get-items-list.d.ts +21 -0
  88. package/lib/base-model/index.d.ts +12 -0
  89. package/lib/base-model/items-total.model.d.ts +6 -0
  90. package/lib/base-model/line-item.model.d.ts +10 -0
  91. package/lib/base-model/lookupItem.d.ts +13 -0
  92. package/{src/lib/base-model/page-info.ts → lib/base-model/page-info.d.ts} +26 -24
  93. package/lib/base-model/permission-matrix.model.d.ts +18 -0
  94. package/lib/base-model/report-request.model.d.ts +18 -0
  95. package/lib/base-model/response-envelop.model.d.ts +8 -0
  96. package/lib/base-model/snack-message.model.d.ts +7 -0
  97. package/lib/base-model/table-column.interface.d.ts +31 -0
  98. package/lib/base-model/table-page-user-action.interface.d.ts +14 -0
  99. package/lib/base-model/workflow/workflow-steps.model.d.ts +7 -0
  100. package/lib/base-model/workflow/workflow.model.d.ts +13 -0
  101. package/lib/components/action-comment/action-comment.component.d.ts +35 -0
  102. package/lib/components/action-confirmation/action-confirmation.component.d.ts +27 -0
  103. package/lib/components/activity-report-form/activity-report-form.component.d.ts +93 -0
  104. package/lib/components/advanced-filter/field-filter/field-filter.component.d.ts +21 -0
  105. package/lib/components/advanced-filter/filter-builder/filter-builder.component.d.ts +51 -0
  106. package/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.d.ts +25 -0
  107. package/lib/components/audit-log-list/audit-log.component.d.ts +29 -0
  108. package/lib/components/auto-complete/auto-complete.component.d.ts +52 -0
  109. package/lib/components/base-form/base-form.component.d.ts +59 -0
  110. package/lib/components/base-form-canvas/MaxDigitsDirective.d.ts +7 -0
  111. package/lib/components/base-form-canvas/NumbersOnlyDirective.d.ts +23 -0
  112. package/lib/components/base-form-canvas/base-form-canvas.component.d.ts +142 -0
  113. package/lib/components/base-input-dialog/base-input-dialog.component.d.ts +23 -0
  114. package/lib/components/base-table/base-table.component.d.ts +172 -0
  115. package/lib/components/button-actions/button-actions.component.d.ts +19 -0
  116. package/lib/components/editable-base-table/editable-base-table.component.d.ts +109 -0
  117. package/lib/components/equation-builder/equation-builder.component.d.ts +23 -0
  118. package/lib/components/item-line-editor/item-line-editor.component.d.ts +66 -0
  119. package/lib/components/multi-auto-complete/multi-auto-complete.component.d.ts +53 -0
  120. package/lib/components/paginator/paginator.component.d.ts +41 -0
  121. package/lib/components/permission-matrix/permission-matrix.component.d.ts +26 -0
  122. package/lib/components/report-details-dialog/report-details-dialog.component.d.ts +34 -0
  123. package/lib/components/report-form/report-form.component.d.ts +92 -0
  124. package/lib/components/search-bar/search-bar.component.d.ts +29 -0
  125. package/lib/components/section-form-canvas/section-form-canvas.component.d.ts +32 -0
  126. package/lib/components/shared/action-button/action-button.component.d.ts +17 -0
  127. package/lib/components/shared/action-card/action-card.component.d.ts +37 -0
  128. package/lib/components/shared/attachment-uploader/attachment-uploader.component.d.ts +18 -0
  129. package/lib/components/shared-list/shared-list.component.d.ts +21 -0
  130. package/lib/components/snackbar-static/snackbar-static.component.d.ts +15 -0
  131. package/lib/components/title-bar/title-bar.component.d.ts +54 -0
  132. package/lib/services/backend-service.d.ts +59 -0
  133. package/{src/lib/services/index.ts → lib/services/index.d.ts} +1 -1
  134. package/lib/services/top-panel.d.ts +8 -0
  135. package/lib/services/trigger-form.service.d.ts +7 -0
  136. package/lib/utils/base-utils.d.ts +13 -0
  137. package/lib/validators/date-range-validator.d.ts +2 -0
  138. package/lib/validators/match-list.validator.d.ts +4 -0
  139. package/lib/validators/multi-email-validator.d.ts +6 -0
  140. package/package.json +16 -3
  141. package/public-api.d.ts +26 -0
  142. package/ng-package.json +0 -7
  143. package/src/lib/base-model/SearchStrConfig.ts +0 -12
  144. package/src/lib/base-model/audit-log-entry.ts +0 -7
  145. package/src/lib/base-model/button-action-settings.ts +0 -25
  146. package/src/lib/base-model/column-def.model.ts +0 -34
  147. package/src/lib/base-model/do-action-request.ts +0 -11
  148. package/src/lib/base-model/field-action.ts +0 -7
  149. package/src/lib/base-model/field-filter.model.ts +0 -14
  150. package/src/lib/base-model/field-info.ts +0 -98
  151. package/src/lib/base-model/field-predicate.model.ts +0 -7
  152. package/src/lib/base-model/filter-request.ts +0 -27
  153. package/src/lib/base-model/filter.model.ts +0 -49
  154. package/src/lib/base-model/get-items-list.ts +0 -24
  155. package/src/lib/base-model/index.ts +0 -11
  156. package/src/lib/base-model/lookupItem.ts +0 -21
  157. package/src/lib/base-model/null-snackmessage.ts +0 -9
  158. package/src/lib/base-model/report-request.model.ts +0 -33
  159. package/src/lib/base-model/response-envelop.model.ts +0 -15
  160. package/src/lib/base-model/snack-message.model.ts +0 -14
  161. package/src/lib/base-model/snackmessage-interface.ts +0 -7
  162. package/src/lib/base-model/table-column.interface.ts +0 -29
  163. package/src/lib/base-model/table-page-user-action.interface.ts +0 -33
  164. package/src/lib/base-model/workflow/workflow-steps.model.ts +0 -9
  165. package/src/lib/base-model/workflow/workflow.model.ts +0 -52
  166. package/src/lib/components/action-confirmation/action-confirmation.component.css +0 -34
  167. package/src/lib/components/action-confirmation/action-confirmation.component.html +0 -18
  168. package/src/lib/components/action-confirmation/action-confirmation.component.spec.ts +0 -23
  169. package/src/lib/components/action-confirmation/action-confirmation.component.ts +0 -58
  170. package/src/lib/components/activity-report-form/activity-report-form.component.html +0 -109
  171. package/src/lib/components/activity-report-form/activity-report-form.component.scss +0 -0
  172. package/src/lib/components/activity-report-form/activity-report-form.component.spec.ts +0 -25
  173. package/src/lib/components/activity-report-form/activity-report-form.component.ts +0 -605
  174. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.css +0 -51
  175. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.html +0 -23
  176. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.spec.ts +0 -23
  177. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.ts +0 -69
  178. package/src/lib/components/audit-log-list/audit-log.component.html +0 -23
  179. package/src/lib/components/audit-log-list/audit-log.component.scss +0 -0
  180. package/src/lib/components/audit-log-list/audit-log.component.spec.ts +0 -25
  181. package/src/lib/components/audit-log-list/audit-log.component.ts +0 -116
  182. package/src/lib/components/auto-complete/auto-complete.component.css +0 -14
  183. package/src/lib/components/auto-complete/auto-complete.component.html +0 -29
  184. package/src/lib/components/auto-complete/auto-complete.component.spec.ts +0 -23
  185. package/src/lib/components/auto-complete/auto-complete.component.ts +0 -330
  186. package/src/lib/components/base-form/base-form.component.html +0 -58
  187. package/src/lib/components/base-form/base-form.component.scss +0 -0
  188. package/src/lib/components/base-form/base-form.component.spec.ts +0 -25
  189. package/src/lib/components/base-form/base-form.component.ts +0 -305
  190. package/src/lib/components/base-form-canvas/base-form-canvas.component.css +0 -22
  191. package/src/lib/components/base-form-canvas/base-form-canvas.component.html +0 -1006
  192. package/src/lib/components/base-form-canvas/base-form-canvas.component.spec.ts +0 -23
  193. package/src/lib/components/base-form-canvas/base-form-canvas.component.ts +0 -573
  194. package/src/lib/components/base-input-dialog/base-input-dialog.component.css +0 -0
  195. package/src/lib/components/base-input-dialog/base-input-dialog.component.html +0 -42
  196. package/src/lib/components/base-input-dialog/base-input-dialog.component.spec.ts +0 -23
  197. package/src/lib/components/base-input-dialog/base-input-dialog.component.ts +0 -78
  198. package/src/lib/components/base-table/base-table.component.html +0 -242
  199. package/src/lib/components/base-table/base-table.component.scss +0 -31
  200. package/src/lib/components/base-table/base-table.component.spec.ts +0 -25
  201. package/src/lib/components/base-table/base-table.component.ts +0 -568
  202. package/src/lib/components/button-actions/button-actions.component.html +0 -28
  203. package/src/lib/components/button-actions/button-actions.component.scss +0 -6
  204. package/src/lib/components/button-actions/button-actions.component.spec.ts +0 -23
  205. package/src/lib/components/button-actions/button-actions.component.ts +0 -72
  206. package/src/lib/components/editable-base-table/editable-base-table.component.html +0 -372
  207. package/src/lib/components/editable-base-table/editable-base-table.component.scss +0 -44
  208. package/src/lib/components/editable-base-table/editable-base-table.component.spec.ts +0 -25
  209. package/src/lib/components/editable-base-table/editable-base-table.component.ts +0 -570
  210. package/src/lib/components/equation-builder/equation-builder.component.css +0 -0
  211. package/src/lib/components/equation-builder/equation-builder.component.html +0 -31
  212. package/src/lib/components/equation-builder/equation-builder.component.spec.ts +0 -23
  213. package/src/lib/components/equation-builder/equation-builder.component.ts +0 -121
  214. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.css +0 -11
  215. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.html +0 -38
  216. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.spec.ts +0 -23
  217. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.ts +0 -317
  218. package/src/lib/components/paginator/paginator.component.css +0 -25
  219. package/src/lib/components/paginator/paginator.component.html +0 -34
  220. package/src/lib/components/paginator/paginator.component.ts +0 -94
  221. package/src/lib/components/rejection-comment/action-comment.component.css +0 -33
  222. package/src/lib/components/rejection-comment/action-comment.component.html +0 -46
  223. package/src/lib/components/rejection-comment/action-comment.component.spec.ts +0 -23
  224. package/src/lib/components/rejection-comment/action-comment.component.ts +0 -86
  225. package/src/lib/components/report-details-dialog/report-details-dialog.component.css +0 -17
  226. package/src/lib/components/report-details-dialog/report-details-dialog.component.html +0 -16
  227. package/src/lib/components/report-details-dialog/report-details-dialog.component.spec.ts +0 -23
  228. package/src/lib/components/report-details-dialog/report-details-dialog.component.ts +0 -113
  229. package/src/lib/components/report-form/report-form.component.html +0 -94
  230. package/src/lib/components/report-form/report-form.component.scss +0 -0
  231. package/src/lib/components/report-form/report-form.component.spec.ts +0 -25
  232. package/src/lib/components/report-form/report-form.component.ts +0 -588
  233. package/src/lib/components/search-bar/search-bar.component.html +0 -62
  234. package/src/lib/components/search-bar/search-bar.component.scss +0 -8
  235. package/src/lib/components/search-bar/search-bar.component.spec.ts +0 -25
  236. package/src/lib/components/search-bar/search-bar.component.ts +0 -70
  237. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.css +0 -54
  238. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.html +0 -22
  239. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.spec.ts +0 -23
  240. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.ts +0 -45
  241. package/src/lib/components/shared-list/shared-list.component.css +0 -0
  242. package/src/lib/components/shared-list/shared-list.component.html +0 -17
  243. package/src/lib/components/shared-list/shared-list.component.spec.ts +0 -23
  244. package/src/lib/components/shared-list/shared-list.component.ts +0 -53
  245. package/src/lib/components/title-bar/title-bar.component.css +0 -0
  246. package/src/lib/components/title-bar/title-bar.component.css.map +0 -1
  247. package/src/lib/components/title-bar/title-bar.component.html +0 -31
  248. package/src/lib/components/title-bar/title-bar.component.scss +0 -23
  249. package/src/lib/components/title-bar/title-bar.component.spec.ts +0 -23
  250. package/src/lib/components/title-bar/title-bar.component.ts +0 -119
  251. package/src/lib/services/backend-service.ts +0 -286
  252. package/src/lib/services/top-panel.ts +0 -17
  253. package/src/lib/services/trigger-form.service.ts +0 -11
  254. package/src/lib/share-module/shared-module.ts +0 -10
  255. package/src/lib/styles/invoiceq-theme.scss +0 -252
  256. package/src/lib/styles/styles.scss +0 -1723
  257. package/src/lib/utils/base-utils.ts +0 -102
  258. package/src/lib/validators/date-range-validator.ts +0 -31
  259. package/src/lib/validators/match-list.validator.ts +0 -10
  260. package/src/lib/validators/multi-email-validator.ts +0 -15
  261. package/src/public-api.ts +0 -21
  262. package/tsconfig.lib.json +0 -15
  263. package/tsconfig.lib.prod.json +0 -11
  264. package/tsconfig.spec.json +0 -15
  265. /package/{src/lib/validators/index.ts → lib/validators/index.d.ts} +0 -0
@@ -0,0 +1,708 @@
1
+ import { Component, effect, EventEmitter, Inject, Input, Output } from "@angular/core";
2
+ import { MatTableDataSource } from "@angular/material/table";
3
+ import { TranslateModule } from "@ngx-translate/core";
4
+ import { MatSortModule } from "@angular/material/sort";
5
+ import { CurrencyPipe, DatePipe, DecimalPipe, NgClass, NgForOf, NgIf, NgStyle, NgSwitch, NgSwitchCase, NgSwitchDefault } from "@angular/common";
6
+ import { MatIcon } from "@angular/material/icon";
7
+ import { MatButton, MatButtonModule, MatIconButton } from "@angular/material/button";
8
+ import { NgxPaginationModule } from "ngx-pagination";
9
+ import { ButtonActionsComponent } from "../button-actions/button-actions.component";
10
+ import { BaseUtils } from "../../utils/base-utils";
11
+ import { FilterRequest } from "../../base-model/filter-request";
12
+ import { EMPTY_PAGE_INFO, FRONT_END_COLUMN_TYPES, TABLE_RECORD_ACTION } from "../../base-model";
13
+ import { ReportRequest } from "../../base-model/report-request.model";
14
+ import { ResponseEnvelop } from "../../base-model/response-envelop.model";
15
+ import { TitleBarComponent } from "../title-bar/title-bar.component";
16
+ import { PaginatorComponent } from "../paginator/paginator.component";
17
+ import { MatCheckbox } from "@angular/material/checkbox";
18
+ import { FilterBuilderComponent } from "../advanced-filter/filter-builder/filter-builder.component";
19
+ import { MatMenu, MatMenuItem, MatMenuTrigger } from "@angular/material/menu";
20
+ import * as i0 from "@angular/core";
21
+ import * as i1 from "../../services/backend-service";
22
+ import * as i2 from "@ngx-translate/core";
23
+ import * as i3 from "../../services/trigger-form.service";
24
+ import * as i4 from "@angular/router";
25
+ import * as i5 from "@angular/cdk/a11y";
26
+ import * as i6 from "@angular/material/button";
27
+ export class BaseTableComponent extends BaseUtils {
28
+ constructor(backendService, translateService, shareDataService, securityManager, router, liveAnnouncer) {
29
+ super();
30
+ this.backendService = backendService;
31
+ this.translateService = translateService;
32
+ this.shareDataService = shareDataService;
33
+ this.securityManager = securityManager;
34
+ this.router = router;
35
+ this.liveAnnouncer = liveAnnouncer;
36
+ this.types = ["pdf", "csv", "xlsx"];
37
+ this.collection = { count: 60, data: [] };
38
+ this.config = {
39
+ itemsPerPage: 10,
40
+ currentPage: 1,
41
+ totalItems: this.collection.count
42
+ };
43
+ this.maxSize = 7;
44
+ this.directionLinks = true;
45
+ this.autoHide = false;
46
+ this.responsive = true;
47
+ this.labels = {
48
+ previousLabel: '<',
49
+ nextLabel: '>',
50
+ screenReaderPaginationLabel: 'Pagination',
51
+ screenReaderPageLabel: 'page',
52
+ screenReaderCurrentLabel: `You're on page`
53
+ };
54
+ this.noDataFoundTitle = 'noDataFoundTitle';
55
+ this.noDataFoundSubtitle = 'noDataFoundSubtitle';
56
+ this.noResultTitle = 'noResultTitle';
57
+ this.noResultSubtitle = 'noResultSubtitle';
58
+ this.totalElements = 0;
59
+ this.pagesCount = 0;
60
+ this.pageIndex = 1;
61
+ this.pageSize = 10;
62
+ this.mobileDisplayedItems = 0;
63
+ this.selectedStatusFilter = [];
64
+ this.advancedAppliedFilter = [];
65
+ this.pendingFilters = [];
66
+ this.searchStr = '';
67
+ this.filterRequest = new FilterRequest();
68
+ this.pageInfo = EMPTY_PAGE_INFO;
69
+ this.enablePagination = true;
70
+ this.mobilePageSize = 2;
71
+ this.mobileLoadMoreIncrement = 2;
72
+ this.listAction = [];
73
+ this.extraActions = [];
74
+ this.buttonsDisplayMode = 'dropdown';
75
+ this.filters = [];
76
+ this.extraButton = [];
77
+ this.buttonClicked = new EventEmitter();
78
+ this.enforceRefresh = false;
79
+ this.isPending = false;
80
+ this.trigger = false;
81
+ this.reportRequest = new ReportRequest({});
82
+ this.manageablePages = false;
83
+ this.totalPagesCount = 0;
84
+ this.currentPageIndex = 0;
85
+ this.pageChange = new EventEmitter();
86
+ this.userAction = new EventEmitter();
87
+ this.hyperLinkAction = new EventEmitter();
88
+ this.extraAction = new EventEmitter();
89
+ this.selectedColumn = new EventEmitter();
90
+ this.listActionClicked = new EventEmitter();
91
+ this.showDialog = new EventEmitter();
92
+ this.selectedRowIndex = -1;
93
+ this.noDataFound = false;
94
+ this.totalRequiredCountItem = 0;
95
+ this.clickRoutePage = new EventEmitter();
96
+ this.sortState = {};
97
+ this.groupNames = [];
98
+ this.groupSpans = new Map();
99
+ this.dataSource = new MatTableDataSource();
100
+ this.columns = [];
101
+ this.filterRequest = new FilterRequest();
102
+ this.initializeMobilePageSize();
103
+ effect(() => {
104
+ if (this.pageInfo.lazyLoadData !== true || this.enforceRefresh === true) {
105
+ this.loadData();
106
+ }
107
+ });
108
+ }
109
+ ngOnDestroy() {
110
+ }
111
+ ngOnInit() {
112
+ this.backendService.isEmptyItems = this.dataSource.data.length <= 0;
113
+ if (this.customizedData) {
114
+ this.dataSource = this.customizedData;
115
+ }
116
+ if (this.manageablePages) {
117
+ this.pagesCount = this.totalPagesCount;
118
+ this.pageIndex = this.currentPageIndex;
119
+ }
120
+ this.initializeMobilePageSize();
121
+ this.mobileDisplayedItems = this.pageSize;
122
+ }
123
+ isMobile() {
124
+ return typeof window !== 'undefined' && window.innerWidth <= 768;
125
+ }
126
+ initializeMobilePageSize() {
127
+ if (this.isMobile() && this.pageSize > this.mobilePageSize) {
128
+ this.pageSize = this.mobilePageSize;
129
+ if (this.reportRequest?.filterRequest) {
130
+ this.reportRequest.filterRequest.pageSize = this.mobilePageSize;
131
+ }
132
+ }
133
+ }
134
+ onPageChange(event) {
135
+ this.pageIndex = event;
136
+ this.getNext(this.pageIndex - 1);
137
+ if (this.manageablePages) {
138
+ this.pageChange.emit(this.pageIndex);
139
+ }
140
+ }
141
+ extractFieldName(element, property) {
142
+ if (property?.includes('.')) {
143
+ return property.split('.').reduce((acc, part) => acc && acc[part], element);
144
+ }
145
+ else {
146
+ const c = this.columns.find(c => c.property === property);
147
+ if (Array.isArray(element[property]) && c.arraySubProperty) {
148
+ const fieldValues = element[property].map(f => f[c.arraySubProperty]);
149
+ return fieldValues.join(', ');
150
+ }
151
+ else {
152
+ return element[property];
153
+ }
154
+ }
155
+ }
156
+ get visibleColumns() {
157
+ this.buildGroups();
158
+ return this.columns.filter(column => column.visible).map(column => column.property);
159
+ }
160
+ get visibleColumnsArray() {
161
+ return this.visibleColumns;
162
+ }
163
+ getColumn(property) {
164
+ return this.columns.find(c => c.property === property);
165
+ }
166
+ getSortDirection(property) {
167
+ if (this.reportRequest?.filterRequest?.sortKey) {
168
+ return this.reportRequest.filterRequest.sortDirection === 'ASC' ? 'asc' : 'desc';
169
+ }
170
+ return '';
171
+ }
172
+ handleSortClick(property) {
173
+ const COLUMN = this.getColumn(property);
174
+ if (!COLUMN || !COLUMN.enableSorting) {
175
+ return;
176
+ }
177
+ const CURRENT_DIRECTION = this.getSortDirection(property);
178
+ let NEW_DIRECTION = 'asc';
179
+ if (CURRENT_DIRECTION === 'asc') {
180
+ NEW_DIRECTION = 'desc';
181
+ }
182
+ this.onSortAction({
183
+ active: property,
184
+ direction: NEW_DIRECTION
185
+ });
186
+ }
187
+ onSortHeaderKeydown(event, columnProp) {
188
+ if (!this.getColumn(columnProp)?.enableSorting) {
189
+ return;
190
+ }
191
+ if (event.key === 'Enter' || event.key === ' ') {
192
+ event.preventDefault();
193
+ this.handleSortClick(columnProp);
194
+ }
195
+ }
196
+ /** aria-sort on sortable column headers (WCAG table semantics). */
197
+ getColumnAriaSort(columnProp) {
198
+ if (!this.getColumn(columnProp)?.enableSorting) {
199
+ return null;
200
+ }
201
+ const d = this.getSortDirection(columnProp);
202
+ if (d === 'asc') {
203
+ return 'ascending';
204
+ }
205
+ if (d === 'desc') {
206
+ return 'descending';
207
+ }
208
+ return 'none';
209
+ }
210
+ onDefaultCellLinkKeydown(event, row) {
211
+ if (event.key !== 'Enter' && event.key !== ' ') {
212
+ return;
213
+ }
214
+ event.preventDefault();
215
+ event.stopPropagation();
216
+ this.emitRoutePage(row);
217
+ }
218
+ getNext(pageIndex) {
219
+ this.reportRequest.filterRequest.pageIndex = pageIndex;
220
+ this.reportRequest.filterRequest.pageSize = this.pageSize;
221
+ this.loadData();
222
+ }
223
+ onPageSizeChange(event) {
224
+ this.pageSize = event;
225
+ this.pageIndex = 1; // reset to first page on page size change
226
+ this.mobileDisplayedItems = 0;
227
+ this.reportRequest.filterRequest.pageSize = this.pageSize;
228
+ this.getNext(0);
229
+ }
230
+ onLoadMore(itemsToLoad) {
231
+ const currentDisplayed = this.mobileDisplayedItems || this.dataSource.data.length || this.pageSize;
232
+ this.pageSize = Math.min(currentDisplayed + itemsToLoad, this.totalElements);
233
+ this.mobileDisplayedItems = this.pageSize;
234
+ this.reportRequest.filterRequest.pageSize = this.pageSize;
235
+ this.reportRequest.filterRequest.pageIndex = 0;
236
+ this.pageIndex = 1;
237
+ this.loadData(true);
238
+ }
239
+ loadData(skipMobileReset = false) {
240
+ clearTimeout(this.timer);
241
+ if (!skipMobileReset) {
242
+ this.initializeMobilePageSize();
243
+ }
244
+ if (!this.reportRequest.filterRequest) {
245
+ this.reportRequest.filterRequest = new FilterRequest(this.pageSize || this.pageInfo.pageSize);
246
+ this.reportRequest.filterRequest.searchStr = this.searchStr;
247
+ this.reportRequest.filterRequest.filters = [
248
+ ...(this.advancedAppliedFilter || []),
249
+ ...(this.filters || []).filter(f => !(this.advancedAppliedFilter || []).some(a => a.field === f.fieldName))
250
+ ];
251
+ }
252
+ this.reportRequest.filterRequest.pageSize = this.pageSize;
253
+ if (this.separateEndpointData || !this.pageInfo.apiUri || this.pageInfo.apiUri.length === 0) {
254
+ this.dataSource.data = this.separateEndpointData;
255
+ queueMicrotask(() => this.announceTableResults());
256
+ }
257
+ else if (this.reportRequest == undefined) {
258
+ return;
259
+ }
260
+ else if (!this.manageablePages) {
261
+ this.timer = setTimeout(() => {
262
+ this.reportRequest.filterRequest.pageSize = this.pageSize;
263
+ this.reportRequest.filterRequest.columns = this.columns?.filter(c => FRONT_END_COLUMN_TYPES.indexOf(c.type) < 0).map(c => c.property) || [];
264
+ this.reportRequest.filterRequest.pendingPage = this.isPending;
265
+ this.reportRequest.filterRequest.searchStr = this.searchStr;
266
+ this.reportRequest.filterRequest.filters = [
267
+ ...(this.advancedAppliedFilter || []),
268
+ ...(this.filters || []).filter(f => !(this.advancedAppliedFilter || []).some(a => a.field === f.fieldName))
269
+ ];
270
+ this.backendService.getItemsByFilter(this.reportRequest?.filterRequest, this.pageInfo.apiUri).subscribe(resp => {
271
+ const responseEnvelope = new ResponseEnvelop(resp);
272
+ if (responseEnvelope.valid) {
273
+ this.totalRequiredCountItem = this.reportRequest.filterRequest.pageSize;
274
+ this.noDataFound = responseEnvelope.body.length < 1;
275
+ this.dataSource.data = responseEnvelope.body;
276
+ this.backendService.isEmptyItems = this.dataSource.data.length <= 0;
277
+ this.totalElements = responseEnvelope.totalSize || 0;
278
+ this.pagesCount = Math.ceil(this.totalElements / this.pageSize) || 1;
279
+ this.pageIndex = (this.reportRequest.filterRequest.pageIndex || 0) + 1;
280
+ this.config.totalItems = responseEnvelope.totalSize || 0;
281
+ this.config.currentPage = this.pageIndex + 1;
282
+ this.mobileDisplayedItems = this.dataSource.data.length;
283
+ queueMicrotask(() => this.announceTableResults());
284
+ }
285
+ });
286
+ }, 300);
287
+ }
288
+ }
289
+ announceTableResults() {
290
+ const visible = this.dataSource?.data?.length ?? 0;
291
+ const total = this.totalElements ?? visible;
292
+ const message = this.translateService.instant('BASE_TABLE.resultsAnnouncement', {
293
+ visible,
294
+ total,
295
+ });
296
+ void this.liveAnnouncer.announce(message, 'polite');
297
+ }
298
+ getStatusDescription(element) {
299
+ return this.backendService.getStatusDescription(element, this.usedWorkflow);
300
+ }
301
+ getStateType(element) {
302
+ return element.stateType;
303
+ }
304
+ ngOnChanges(changes) {
305
+ if (changes["customizedData"] && !changes["customizedData"].isFirstChange()) {
306
+ this.dataSource.data = changes["customizedData"].currentValue?.data || []; // Update data source with new data
307
+ this.pagesCount = this.totalPagesCount;
308
+ this.pageIndex = this.currentPageIndex;
309
+ queueMicrotask(() => this.announceTableResults());
310
+ }
311
+ if (changes["enforceRefresh"] && !changes["enforceRefresh"].isFirstChange()) {
312
+ this.loadData();
313
+ }
314
+ if (changes["isPending"] && !changes["isPending"].isFirstChange()) {
315
+ this.loadData();
316
+ }
317
+ }
318
+ getCroppedText(elementValue, subWidth = 20) {
319
+ return elementValue && elementValue.length > subWidth ? elementValue.substring(0, subWidth) + "..." : elementValue;
320
+ }
321
+ emitEvent(element) {
322
+ this.showDialog.emit(element);
323
+ }
324
+ extractFormat(column) {
325
+ return column?.format || 'd/M/yyyy, h:mm a';
326
+ }
327
+ actionListClicked(listAction, element) {
328
+ this.listActionClicked.emit({ action: listAction, row: element, isPending: this.isPending });
329
+ }
330
+ hyperLinkClicked(actionName, element) {
331
+ const action = TABLE_RECORD_ACTION;
332
+ action.actionKey = actionName;
333
+ action.item = element;
334
+ action.pageInfo = this.pageInfo;
335
+ this.hyperLinkAction.emit(action);
336
+ }
337
+ emitRoutePage(element) {
338
+ this.clickRoutePage.emit(element);
339
+ }
340
+ onSelectItem(row) {
341
+ if (this.pageInfo.selfRouting) {
342
+ const mode = this.isPending ? 'pending' : 'view';
343
+ const url = `${this.pageInfo.listRoutePath || this.router.url}/view`;
344
+ const encryptedId = this.backendService.encrypt(String(row.id));
345
+ const encryptedMode = this.backendService.encrypt(mode);
346
+ const encryptedRow = this.backendService.encrypt(JSON.stringify(row));
347
+ this.router.navigate([url], {
348
+ queryParams: { token: encryptedId, mode: encryptedMode },
349
+ state: { raw: encryptedRow },
350
+ });
351
+ return;
352
+ }
353
+ // const action = SELECT_RECORD_ACTION;
354
+ // action.id = row?.id;
355
+ // action.item = row;
356
+ // this.userAction.emit(action)
357
+ }
358
+ openNewTab(row) {
359
+ if (!this.pageInfo.embededTableOnly) {
360
+ const mode = this.isPending ? 'pending' : 'view';
361
+ window.open(`${this.pageInfo.listRoutePath}/${mode}` + '/' + row?.id);
362
+ }
363
+ }
364
+ onViewModeChangedReceived(isPending) {
365
+ this.switchViewMode(isPending);
366
+ }
367
+ switchViewMode(isPending) {
368
+ this.isPending = isPending;
369
+ this.loadData();
370
+ }
371
+ onAddNewAction($event) {
372
+ const url = `${this.pageInfo.listRoutePath || this.router.url}/view`;
373
+ const encryptedId = this.backendService.encrypt("-1");
374
+ const encryptedMode = this.backendService.encrypt("pending");
375
+ this.router.navigate([`${url}`], { queryParams: { token: encryptedId, mode: encryptedMode } });
376
+ // const action = SELECT_RECORD_ACTION;
377
+ // action.id = row?.id;
378
+ // action.item = row;
379
+ // this.userAction.emit(action)
380
+ }
381
+ showAddNew() {
382
+ return this.pageInfo.hasAddButton;
383
+ }
384
+ onExtraButtionAction($event) {
385
+ this.extraAction.emit($event);
386
+ }
387
+ hasGroups() {
388
+ let b = this.columns.findIndex(p => p.group);
389
+ return b >= 0;
390
+ }
391
+ buildGroups() {
392
+ let count = 0;
393
+ this.groupNames = [];
394
+ this.groupSpans.clear();
395
+ if (this.hasGroups() === false) {
396
+ return;
397
+ }
398
+ this.columns
399
+ .filter(column => column.visible === true)
400
+ .forEach((column) => {
401
+ if (column.group === "-") {
402
+ this.groupNames.push(count.toString());
403
+ this.insertInMap(count);
404
+ count++;
405
+ return;
406
+ }
407
+ else if (!this.groupNames.includes(column.group)) {
408
+ this.groupNames.push(column.group);
409
+ this.insertInMap(column.group);
410
+ return;
411
+ }
412
+ this.insertInMap(column.group);
413
+ });
414
+ }
415
+ insertInMap(key) {
416
+ if (this.groupSpans.has(key)) {
417
+ this.groupSpans.set(key.toString(), this.groupSpans.get(key) + 1);
418
+ }
419
+ else {
420
+ this.groupSpans.set(key.toString(), 1);
421
+ }
422
+ }
423
+ isHumanMade(str) {
424
+ return isNaN(str);
425
+ }
426
+ actionButtonClicked(actionKey, item) {
427
+ if (actionKey === 'navigate') {
428
+ this.handleNavigateAction(item);
429
+ return;
430
+ }
431
+ this.emitTableAction(actionKey, item);
432
+ }
433
+ handleNavigateAction(item) {
434
+ const mode = this.isPending ? 'pending' : 'view';
435
+ const basePath = this.pageInfo.listRoutePath || this.router.url;
436
+ const url = `${basePath}/view`;
437
+ const encryptedId = this.backendService.encrypt(item.id.toString());
438
+ const encryptedMode = this.backendService.encrypt(mode);
439
+ this.router.navigate([url], {
440
+ queryParams: { token: encryptedId, mode: encryptedMode }
441
+ });
442
+ }
443
+ emitTableAction(actionKey, item) {
444
+ const action = TABLE_RECORD_ACTION;
445
+ action.actionKey = actionKey;
446
+ action.item = item;
447
+ action.pageInfo = this.pageInfo;
448
+ this.userAction.emit(action);
449
+ }
450
+ extractReport(reportType) {
451
+ const myFilters = this.reportRequest.filterRequest;
452
+ const reportRequest = this.backendService.buildReportRequest(this.columns, this.pageInfo.labelsSection + '.list_title', myFilters, reportType, this.pageInfo, this.searchStr, 'LANDSCAPE');
453
+ this.backendService.downloadReport(reportRequest, this.pageInfo.apiUri);
454
+ }
455
+ getIcon(status) {
456
+ switch (status) {
457
+ case 'pass': return 'check_circle';
458
+ case 'warning': return 'warning';
459
+ case 'error': return 'error';
460
+ default: return 'help';
461
+ }
462
+ }
463
+ getIconAriaLabelKey(status) {
464
+ switch (status) {
465
+ case 'pass':
466
+ return 'BASE_TABLE.statusIconPass';
467
+ case 'warning':
468
+ return 'BASE_TABLE.statusIconWarning';
469
+ case 'error':
470
+ return 'BASE_TABLE.statusIconError';
471
+ default:
472
+ return 'BASE_TABLE.statusIconUnknown';
473
+ }
474
+ }
475
+ getOnOffFlagAriaLabelKey(value) {
476
+ if (value === true) {
477
+ return 'BASE_TABLE.statusFlagActive';
478
+ }
479
+ if (value === false) {
480
+ return 'BASE_TABLE.statusFlagInactive';
481
+ }
482
+ return 'BASE_TABLE.statusFlagPending';
483
+ }
484
+ actionCheckedClicked(property, element) {
485
+ element[property] = !element[property];
486
+ this.actionButtonClicked(property, element);
487
+ }
488
+ isDarkHighlight(row) {
489
+ const groupByProp = this.pageInfo?.groupByProperty;
490
+ const groupByValues = this.pageInfo?.groupByValue;
491
+ if (!groupByProp || !groupByValues || !row[groupByProp]) {
492
+ return false;
493
+ }
494
+ const cellValue = row[groupByProp].toString();
495
+ return groupByValues.some(val => cellValue.includes(val) && cellValue.length > val.length);
496
+ }
497
+ shouldRenderAsHyperLink(element) {
498
+ const groupByProp = this.pageInfo?.groupByProperty;
499
+ const groupByValues = this.pageInfo?.groupByValue;
500
+ if (!groupByProp || !groupByValues || !element[groupByProp]) {
501
+ return false;
502
+ }
503
+ const value = element[groupByProp].toString();
504
+ return !groupByValues.some(v => value.includes(v) && value.length >= v.length);
505
+ }
506
+ onSortAction($event) {
507
+ const col = this.columns.find(c => c.property === $event.active);
508
+ this.reportRequest.filterRequest.sortKey =
509
+ $event.active && $event.direction
510
+ ? (col?.sortKey ?? $event.active)
511
+ : 'id';
512
+ this.reportRequest.filterRequest.sortDirection = $event.direction === 'asc' ? 'ASC' : 'DESC';
513
+ this.reportRequest.filterRequest.pageIndex = 0;
514
+ this.selectedColumn.emit($event);
515
+ this.loadData();
516
+ }
517
+ shouldShowButton(element) {
518
+ const groupByProp = this.pageInfo?.groupByProperty;
519
+ const groupByValues = this.pageInfo?.groupByValue;
520
+ if (!groupByProp || !groupByValues || !element[groupByProp]) {
521
+ return true;
522
+ }
523
+ const value = element[groupByProp].toString();
524
+ return !groupByValues.some(v => value.includes(v) && value.length >= v.length);
525
+ }
526
+ storePendingFilters($event) {
527
+ this.pendingFilters = $event.filters || [];
528
+ this.searchStr = $event.searchStr;
529
+ }
530
+ resetPaginationForFilterChange() {
531
+ if (!this.reportRequest.filterRequest) {
532
+ this.reportRequest.filterRequest = new FilterRequest(this.pageSize || this.pageInfo.pageSize);
533
+ }
534
+ this.reportRequest.filterRequest.pageIndex = 0;
535
+ this.pageIndex = 1;
536
+ if (this.manageablePages) {
537
+ this.pageChange.emit(this.pageIndex);
538
+ }
539
+ }
540
+ applyPendingFilters() {
541
+ this.advancedAppliedFilter = this.pendingFilters || [];
542
+ this.resetPaginationForFilterChange();
543
+ this.loadData();
544
+ }
545
+ handleFilterEmpty($event) {
546
+ if ($event) {
547
+ this.pendingFilters = [];
548
+ this.advancedAppliedFilter = [];
549
+ this.searchStr = '';
550
+ this.resetPaginationForFilterChange();
551
+ this.loadData();
552
+ }
553
+ }
554
+ resetData($event) {
555
+ if ($event) {
556
+ this.advancedAppliedFilter = [];
557
+ this.pendingFilters = [];
558
+ this.resetPaginationForFilterChange();
559
+ this.loadData();
560
+ // this.paginator.firstPage();
561
+ }
562
+ }
563
+ hasFiltersApplied() {
564
+ return (this.advancedAppliedFilter && this.advancedAppliedFilter.length > 0) ||
565
+ (this.filters && this.filters.length > 0) ||
566
+ (this.pendingFilters && this.pendingFilters.length > 0);
567
+ }
568
+ getDisplaySvgPath() {
569
+ return this.hasFiltersApplied() && this.noResultSvgPath ? this.noResultSvgPath : this.noDataFoundSvgPath;
570
+ }
571
+ getDisplayTitle() {
572
+ return this.hasFiltersApplied() && this.noResultSvgPath ? this.noResultTitle : this.noDataFoundTitle;
573
+ }
574
+ getDisplaySubtitle() {
575
+ return this.hasFiltersApplied() && this.noResultSvgPath ? this.noResultSubtitle : this.noDataFoundSubtitle;
576
+ }
577
+ buttonClickedEvent($event) {
578
+ }
579
+ getMobileCardIdColumn() {
580
+ return this.columns.find(c => c.visible && c.mobileCardId === true);
581
+ }
582
+ getMobileCardStatusColumn() {
583
+ return this.columns.find(c => c.visible && c.mobileCardStatus === true);
584
+ }
585
+ getMobileCardColumns() {
586
+ const idCol = this.getMobileCardIdColumn();
587
+ const statusCol = this.getMobileCardStatusColumn();
588
+ return this.columns.filter(c => c.visible &&
589
+ c.property !== 'actions' &&
590
+ c !== idCol &&
591
+ c !== statusCol);
592
+ }
593
+ labelKeyByValue(column, row) {
594
+ if (!column || !column.property)
595
+ return '';
596
+ return super.labelKeyByValue(column, row);
597
+ }
598
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseTableComponent, deps: [{ token: i1.BackendService }, { token: i2.TranslateService }, { token: i3.ShareDataService }, { token: 'securityManager' }, { token: i4.Router }, { token: i5.LiveAnnouncer }], target: i0.ɵɵFactoryTarget.Component }); }
599
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BaseTableComponent, isStandalone: true, selector: "app-base-table", inputs: { filterFields: "filterFields", noDataFoundSvgPath: "noDataFoundSvgPath", noDataFoundTitle: "noDataFoundTitle", noDataFoundSubtitle: "noDataFoundSubtitle", noResultSvgPath: "noResultSvgPath", noResultTitle: "noResultTitle", noResultSubtitle: "noResultSubtitle", pageInfo: "pageInfo", enablePagination: "enablePagination", mobilePageSize: "mobilePageSize", mobileLoadMoreIncrement: "mobileLoadMoreIncrement", data: "data", listAction: "listAction", extraActions: "extraActions", buttonsDisplayMode: "buttonsDisplayMode", columns: "columns", filters: "filters", pathParam: "pathParam", extraButton: "extraButton", enforceRefresh: "enforceRefresh", isPending: "isPending", trigger: "trigger", reportRequest: "reportRequest", separateEndpointData: "separateEndpointData", manageablePages: "manageablePages", totalPagesCount: "totalPagesCount", currentPageIndex: "currentPageIndex", customizedData: "customizedData" }, outputs: { buttonClicked: "buttonClicked", pageChange: "pageChange", userAction: "userAction", hyperLinkAction: "hyperLinkAction", extraAction: "extraAction", selectedColumn: "selectedColumn", listActionClicked: "listActionClicked", showDialog: "showDialog", clickRoutePage: "clickRoutePage" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"flex-column baseTable\">\r\n <div class=\"flex-row flex-100\" >\r\n <div class=\"flex-column align-start flex-100\" style=\"width: 100%;\">\r\n <app-title-bar\r\n [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\r\n [subTitle]=\"(pageInfo.hideTitle || pageInfo.hideSubtitle) ? '' : pageInfo.labelsSection+'.subtitle'\"\r\n [titleMode]=\"''\"\r\n [pageInfo]=\"pageInfo\"\r\n [newAction]=\"showAddNew()\"\r\n [showExtractButton]=\"!pageInfo.hideExtractButton\"\r\n [draftSupported]=\"pageInfo.draftSupported\"\r\n [isPending]=\"isPending\"\r\n [onViewModeChange]=\"switchViewMode.bind(this)\"\r\n [buttons]=\"extraActions\"\r\n [buttonsDisplayMode]=\"buttonsDisplayMode\"\r\n (newActionClicked)=\"onAddNewAction($event)\"\r\n (extractReport)=\"extractReport($event)\"\r\n (viewModeChanged)=\"onViewModeChangedReceived($event)\"\r\n (buttonClicked)=\"buttonClicked.emit($event)\"\r\n [totalElements]=\"pageInfo.hideTitle ? undefined : totalElements\">\r\n </app-title-bar>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filter-row\" *ngIf=\"!pageInfo.hideAdvancedFilter\">\r\n <app-filter-builder\r\n *ngIf=\"!pageInfo.hideAdvancedFilter\"\r\n [pageInfo]=\"pageInfo\"\r\n [columns]=\"columns\"\r\n [filterFields]=\"filterFields\"\r\n [pendingFilters]=\"pendingFilters\"\r\n [showExportButton]=\"!pageInfo.hideExtractButton\"\r\n (filterInformation)=\"storePendingFilters($event)\"\r\n (isEmpty)=\"handleFilterEmpty($event)\"\r\n (applyFilter)=\"applyPendingFilters()\"\r\n (sortByClicked)=\"handleSortClick($event)\"\r\n (exportClicked)=\"extractReport($event)\">\r\n </app-filter-builder>\r\n\r\n <div class=\"button-group\" *ngIf=\"!pageInfo.hideExtractButton\">\r\n <button *ngIf=\"!pageInfo.hideExtractButton\"\r\n mat-flat-button\r\n type=\"button\"\r\n [matMenuTriggerFor]=\"exportMenu\"\r\n class=\"btn-export\"\r\n [attr.aria-label]=\"'export' | translate\"\r\n [attr.aria-haspopup]=\"true\"\r\n >\r\n <div class=\"button-text\">\r\n <mat-icon>file_export</mat-icon>\r\n <span>{{ 'export' | translate }}</span>\r\n <mat-icon class=\"arrow-icon\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n </button>\r\n\r\n <mat-menu #exportMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"extractReport('pdf')\">PDF</button>\r\n <button mat-menu-item (click)=\"extractReport('xlsx')\">Excel</button>\r\n <button mat-menu-item (click)=\"extractReport('csv')\">CSV</button>\r\n </mat-menu>\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"flex-row flex-100 baseTable__detailsColumn\">\r\n <div class=\"flex-100\">\r\n <div class=\"flex-row flex-100 mainTable\">\r\n <div\r\n class=\"table-container\"\r\n role=\"table\"\r\n [attr.aria-label]=\"\r\n pageInfo.labelsSection && !pageInfo.hideTitle\r\n ? (pageInfo.labelsSection + '.list_title' | translate)\r\n : null\r\n \">\r\n <div class=\"table-header\" [attr.data-sort]=\"sortState\" role=\"row\">\r\n <div *ngFor=\"let columnProp of visibleColumnsArray; let i = index\"\r\n class=\"table-header-cell\"\r\n role=\"columnheader\"\r\n [attr.aria-sort]=\"getColumnAriaSort(columnProp)\"\r\n [attr.tabindex]=\"getColumn(columnProp)?.enableSorting ? 0 : null\"\r\n [class.sortable]=\"getColumn(columnProp)?.enableSorting\"\r\n [class.first-cell]=\"i === 0\"\r\n [class.last-cell]=\"i === visibleColumnsArray.length - 1\"\r\n [class.actions-cell]=\"i === visibleColumnsArray.length - 1 && columnProp === 'actions'\"\r\n [class.has-width]=\"getColumn(columnProp)?.width\"\r\n [ngStyle]=\"getColumn(columnProp)?.width ? {'width': getColumn(columnProp)?.width + '%', 'flex-basis': getColumn(columnProp)?.width + '%'} : {}\"\r\n (click)=\"getColumn(columnProp)?.enableSorting && handleSortClick(columnProp)\"\r\n (keydown)=\"onSortHeaderKeydown($event, columnProp)\">\r\n <div class=\"table-header-content\">\r\n <span class=\"table-header-label\">{{ labelKey(getColumn(columnProp)) | translate }}</span>\r\n <ng-container *ngIf=\"getColumn(columnProp)?.enableSorting\">\r\n <mat-icon *ngIf=\"getSortDirection(columnProp) === 'asc'\"\r\n class=\"sort-icon sort-asc\">arrow_drop_up</mat-icon>\r\n <mat-icon *ngIf=\"getSortDirection(columnProp) === 'desc'\"\r\n class=\"sort-icon sort-desc\">arrow_drop_down</mat-icon>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"table-body\" role=\"rowgroup\">\r\n <div *ngFor=\"let row of dataSource.data; let rowIndex = index\"\r\n class=\"table-row\"\r\n role=\"row\"\r\n [attr.id]=\"'table-row-' + (row?.id || row?.key || '')\"\r\n [ngClass]=\"{\r\n 'table-row--highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\r\n 'table-row--dark-highlight': isDarkHighlight(row)\r\n }\"\r\n (auxclick)=\"openNewTab(row)\"\r\n (click)=\"$event.stopPropagation(); onSelectItem(row)\">\r\n <div *ngFor=\"let columnProp of visibleColumnsArray; let i = index\"\r\n class=\"table-cell\"\r\n role=\"cell\"\r\n [class.first-cell]=\"i === 0\"\r\n [class.last-cell]=\"i === visibleColumnsArray.length - 1\"\r\n [class.actions-cell]=\"i === visibleColumnsArray.length - 1 && columnProp === 'actions'\"\r\n [class.has-width]=\"getColumn(columnProp)?.width\"\r\n [ngStyle]=\"getColumn(columnProp)?.width ? {'width': getColumn(columnProp)?.width + '%', 'flex-basis': getColumn(columnProp)?.width + '%'} : {}\">\r\n <ng-container [ngSwitch]=\"getColumn(columnProp)?.type\">\r\n <ng-container *ngSwitchCase=\"'workflowStatus'\">\r\n <button mat-button class=\"wfStatus {{ getStatusDescription(row)}}\" [attr.id]=\"'table-btn-wf-'+columnProp+'-'+(row.id || row.key || '')\">{{ getStatusDescription(row) }}</button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'hyper-text'\">\r\n <span\r\n *ngIf=\"shouldRenderAsHyperLink(row); else plainHyperText\"\r\n role=\"link\"\r\n tabindex=\"0\"\r\n class=\"mat-mdc-form-field-label hyper-link\"\r\n (click)=\"hyperLinkClicked(columnProp, row)\"\r\n (keydown.enter)=\"hyperLinkClicked(columnProp, row)\"\r\n (keydown.space)=\"$event.preventDefault(); hyperLinkClicked(columnProp, row)\">\r\n {{ extractFieldName(row, columnProp) }}\r\n </span>\r\n <ng-template #plainHyperText>\r\n <span class=\"mat-mdc-form-field-label\">{{ extractFieldName(row, columnProp) }}</span>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <button *ngIf=\"shouldShowButton(row)\" mat-button class=\"primary\" (click)=\"$event.stopPropagation(); actionButtonClicked(columnProp, row)\" [attr.id]=\"'table-btn-action-'+columnProp\">\r\n {{ labelKey(getColumn(columnProp)) + '_title' | translate }}\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'icon'\">\r\n <mat-icon [ngClass]=\"{\r\n 'mainTable__td__icon-green': row[columnProp] === 'pass',\r\n 'mainTable__td__icon-orange': row[columnProp] === 'warning',\r\n 'mainTable__td__icon-red': row[columnProp] === 'error'\r\n }\"\r\n [attr.aria-label]=\"getIconAriaLabelKey(row[columnProp]) | translate\">\r\n {{ getIcon(row[columnProp]) }}\r\n </mat-icon>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <mat-checkbox class=\"primary\" [checked]=\"row[columnProp]\" (click)=\"$event.stopPropagation();actionCheckedClicked(columnProp,row)\"></mat-checkbox>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <button mat-button class=\"stateType {{ row[columnProp]}}\" [attr.id]=\"'table-btn-state-'+columnProp\">{{ labelKeyByValue(getColumn(columnProp), row) | translate}}</button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n {{ extractFieldName(row, columnProp) | date:'dd/MM/yyyy' }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'croppedText'\">\r\n {{ getCroppedText(row[columnProp], row[getColumn(columnProp)?.width]) }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'download'\">\r\n <mat-icon class=\"mainTable__td__icon-blue\"\r\n [attr.aria-label]=\"'BASE_TABLE.downloadAction' | translate\">system_update_alt</mat-icon>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'onOff'\">\r\n <mat-icon *ngIf=\"row[columnProp] === null\" class=\"mainTable__td__icon-darkorange\"\r\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(null) | translate\">flag</mat-icon>\r\n <mat-icon *ngIf=\"row[columnProp] === false\" class=\"mainTable__td__icon-red\"\r\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(false) | translate\">flag</mat-icon>\r\n <mat-icon *ngIf=\"row[columnProp] === true\" class=\"mainTable__td__icon-green\"\r\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(true) | translate\">flag</mat-icon>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <span *ngIf=\"row[columnProp] === null || row[columnProp] === false\">\r\n {{ pageInfo.labelsSection + '.' + getColumn(columnProp)?.label + 'InActive' | translate }}\r\n </span>\r\n <span *ngIf=\"row[columnProp] === true\">\r\n {{ pageInfo.labelsSection + '.' + getColumn(columnProp)?.label + 'Active' | translate }}\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'info'\">\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n [attr.aria-label]=\"'BASE_TABLE.rowDetails' | translate\"\r\n (click)=\"$event.stopPropagation();emitEvent(row)\"\r\n [attr.id]=\"'table-btn-info-'+row.id\">\r\n <mat-icon aria-hidden=\"true\">info</mat-icon>\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'netAmount'\">\r\n <div class=\"mainTable__td__currency\" style=\"display:inline-block;\">{{ row[getColumn(columnProp)?.currency] }}</div>\r\n <span class=\"mainTable__td__property\" style=\"display:inline-block; margin-left:6px; margin-right:6px;\">\r\n {{ extractFieldName(row, columnProp) | currency:'':'' }}</span>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'localDateTime'\">\r\n {{ extractFieldName(row, columnProp) | date : extractFormat(getColumn(columnProp)) }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\r\n <small><sup class=\"mainTable__td__currency\">{{row[getColumn(columnProp)?.currency]}}</sup></small>\r\n {{ extractFieldName(row, columnProp) | number : (getColumn(columnProp)?.digitInfo || '1.3-5') }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'listAction'\">\r\n <app-button-actions\r\n [row]=\"row\"\r\n [buttonsAction]=\"getColumn(columnProp)?.viewType === 'buttonsAction'\"\r\n [listAction]=\"listAction\"\r\n [actions]=\"listAction\"\r\n (clickedButton)=\"actionListClicked($event,row)\">\r\n </app-button-actions>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngIf=\"getColumn(columnProp)?.translate; else noTranslate\">\r\n <span\r\n role=\"link\"\r\n tabindex=\"0\"\r\n (click)=\"$event.stopPropagation(); emitRoutePage(row)\"\r\n (keydown)=\"onDefaultCellLinkKeydown($event, row)\">\r\n {{ pageInfo.labelsSection + \".\" + extractFieldName(row, columnProp) | translate }}\r\n </span>\r\n </ng-container>\r\n <ng-template #noTranslate>\r\n <span\r\n role=\"link\"\r\n tabindex=\"0\"\r\n (click)=\"$event.stopPropagation(); emitRoutePage(row)\"\r\n (keydown)=\"onDefaultCellLinkKeydown($event, row)\"\r\n [innerText]='extractFieldName(row, columnProp)'></span>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Mobile Card View -->\r\n <div class=\"mobile-cards-container\">\r\n <div *ngFor=\"let row of dataSource.data; let rowIndex = index\"\r\n class=\"mobile-card\"\r\n [attr.id]=\"'mobile-card-' + (row?.id || row?.key || '')\"\r\n [ngClass]=\"{\r\n 'mobile-card--highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\r\n 'mobile-card--dark-highlight': isDarkHighlight(row)\r\n }\"\r\n (auxclick)=\"openNewTab(row)\"\r\n (click)=\"$event.stopPropagation(); onSelectItem(row)\">\r\n\r\n <!-- Mobile Card Header: ID/Name and Status -->\r\n <div class=\"mobile-card__header\">\r\n <div class=\"mobile-card__header-id\">\r\n <span class=\"mobile-card__id-text\">{{ extractFieldName(row, getMobileCardIdColumn()?.property || 'id') }}</span>\r\n </div>\r\n <div class=\"mobile-card__header-status\" *ngIf=\"getMobileCardStatusColumn()\">\r\n <button mat-button class=\"stateType {{ row[getMobileCardStatusColumn()?.property]}}\"\r\n [attr.id]=\"'mobile-btn-state-'+getMobileCardStatusColumn()?.property\">\r\n {{ labelKeyByValue(getMobileCardStatusColumn(), row) | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Divider -->\r\n <div class=\"mobile-card__divider\"></div>\r\n\r\n <!-- Mobile Card Body: Other columns -->\r\n <div class=\"mobile-card__body\">\r\n <div *ngFor=\"let column of getMobileCardColumns()\" class=\"mobile-card__row\">\r\n <div class=\"mobile-card__row-label\">\r\n <span>{{ labelKey(column) | translate }} :</span>\r\n </div>\r\n <div class=\"mobile-card__row-value\">\r\n <ng-container [ngSwitch]=\"column.type\">\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <button mat-button class=\"stateType {{ row[column.property]}}\"\r\n [attr.id]=\"'mobile-btn-state-'+column.property\">\r\n {{ labelKeyByValue(column, row) | translate}}\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n {{ extractFieldName(row, column.property) | date:'dd/MM/yyyy' }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'netAmount'\">\r\n <span class=\"mobile-card__amount-currency\">{{ row[column.currency] }}</span>\r\n <span class=\"mobile-card__amount-value\">{{ extractFieldName(row, column.property) | currency:'':'' }}</span>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'localDateTime'\">\r\n {{ extractFieldName(row, column.property) | date : extractFormat(column) }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\r\n <small><sup class=\"mainTable__td__currency\">{{row[column.currency]}}</sup></small>\r\n {{ extractFieldName(row, column.property) | number : (column.digitInfo || '1.3-5') }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngIf=\"column.translate; else noTranslate\">\r\n <span>{{ pageInfo.labelsSection + \".\" + extractFieldName(row, column.property) | translate }}</span>\r\n </ng-container>\r\n <ng-template #noTranslate>\r\n <span [innerText]='extractFieldName(row, column.property)'></span>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Mobile Card Actions -->\r\n <div class=\"mobile-card__actions\" *ngIf=\"listAction && listAction.length > 0\">\r\n <app-button-actions\r\n [row]=\"row\"\r\n [buttonsAction]=\"true\"\r\n [listAction]=\"listAction\"\r\n [actions]=\"listAction\"\r\n (clickedButton)=\"actionListClicked($event,row)\">\r\n </app-button-actions>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"noDataFound\" class=\"dataNotFound flex-column\">\r\n <img *ngIf=\"getDisplaySvgPath()\" [src]=\"getDisplaySvgPath()\" class=\"dataNotFound__icon\" alt=\"No data found\" />\r\n <span class=\"dataNotFound__title\">{{ getDisplayTitle() | translate}}</span>\r\n <span class=\"dataNotFound__subtitle\">{{ getDisplaySubtitle() | translate}}</span>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"(dataSource.data?.length > 0 || customizedData) && !pageInfo.hidePagination\" class=\"main-pagination flex-row\">\r\n <ng-container *ngIf=\"enablePagination\">\r\n <div class=\"flex-column flex-100\">\r\n <app-paginator\r\n [currentPage]=\"pageIndex\"\r\n [totalItems]=\"totalElements\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"[5, 10, 25, 50]\"\r\n [mobileLoadMoreIncrement]=\"mobileLoadMoreIncrement\"\r\n [displayedItems]=\"mobileDisplayedItems || dataSource.data.length\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"\r\n (loadMore)=\"onLoadMore($event)\">\r\n </app-paginator>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;width:100%;max-width:100%;box-sizing:border-box}.baseTable{width:100%!important;max-width:100%!important;box-sizing:border-box}.flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column;width:100%;max-width:100%;box-sizing:border-box}.flex-100{flex:1 1 100%}.flex-49{flex:0 0 49%}.flex-50{flex:0 0 50%}.align-start{justify-content:flex-start;align-items:flex-start}.align-center{justify-content:center;align-items:center}.align-end{justify-content:flex-end;align-items:flex-end}.gap-0{gap:0}.gap-5{gap:5px}.gap-10{gap:10px}.dataNotFound{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;text-align:center;margin-top:80px}.dataNotFound__icon{height:auto;width:auto;max-width:200px;max-height:200px;margin-bottom:8px;object-fit:contain}.dataNotFound__title{color:#6a6a6a;font-size:20px;font-weight:700;margin-bottom:4px}.dataNotFound__subtitle{color:#6a6a6a;font-size:20px;font-weight:400}@media (max-width: 960px){.flex-column-sm{flex-direction:column}.align-center-sm{justify-content:center;align-items:flex-start}}.filter-row{display:flex!important;flex-direction:row!important;align-items:center!important;width:100%!important;max-width:100%!important;gap:16px!important;box-sizing:border-box;margin-top:20px;margin-bottom:16px;padding:0;flex-wrap:nowrap!important;min-width:0!important;min-height:48px!important;overflow:visible!important}.filter-row app-filter-builder{flex:1 1 auto!important;min-width:0!important;max-width:none!important;width:auto!important;flex-shrink:1!important;display:flex!important;align-items:center!important;overflow:visible!important}.button-group{display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:flex-end;gap:8px!important;flex-shrink:0!important;flex-grow:0!important;flex-basis:auto!important;height:46px!important;white-space:nowrap!important;z-index:1!important}.mainTable{margin-top:0!important}.btn-apply-filter{background:#fff!important;border:1px solid #3e627b!important;border-radius:8px!important;height:46px!important;min-width:120px!important;padding:0 16px!important;box-shadow:none!important}.btn-apply-filter .button-text{display:flex;align-items:center;justify-content:center;gap:4px;width:100%}.btn-apply-filter mat-icon{font-size:24px;width:24px;height:30px;color:#0d4261}.btn-apply-filter span{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.btn-apply-filter:hover{background:#fafafa!important}.btn-export{background:#fff!important;border:1px solid #0d4261!important;border-radius:8px!important;height:46px!important;min-width:109px!important;padding:0 16px!important;box-shadow:none!important;margin-bottom:7px!important}.btn-export .button-text{display:flex;align-items:center;justify-content:center;gap:4px;width:100%}.btn-export mat-icon{font-size:24px;width:24px;height:30px;color:#0d4261}.btn-export .arrow-icon{font-size:16px;width:16px;height:16px;margin-left:0}.btn-export span{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.btn-export:hover{background:#fafafa!important}.arrow-icon{font-size:16px;width:16px;height:16px}@media (max-width: 1024px){.button-group{width:auto}}@media (max-width: 768px){.filter-row{flex-direction:column;align-items:stretch}.button-group{display:none!important}.btn-export{width:100%}}.table-container{width:100%;overflow:hidden;background:#f7f7f7;box-sizing:border-box;display:flex;flex-direction:column}.table-header{display:flex;align-items:center;background:#f7f7f7;border:1px solid #f0eeee;max-height:48px;height:48px;margin-bottom:16px;border-radius:8px;overflow:hidden;width:100%;box-sizing:border-box;min-width:0}.table-header-cell{display:flex;align-items:center;max-height:48px;height:48px;padding:8px 16px;flex:1;min-width:100px;position:sticky;top:0;background:none;z-index:10;box-sizing:border-box}.table-header-cell.has-width{flex:0 0 auto!important;min-width:0!important;max-width:none!important}.table-header-cell:last-child{border-right:none}.table-header-cell.first-cell{border-top-left-radius:8px;border-bottom-left-radius:8px}.table-header-cell.last-cell{border-top-right-radius:8px;border-bottom-right-radius:8px}.table-header-cell.actions-cell{justify-content:center;text-align:center}.table-header-cell.actions-cell .table-header-content{justify-content:center}.table-header-cell.sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.table-header-cell.sortable:hover{background:#fafafa}.table-header-content{display:flex;align-items:center;gap:8px;width:100%}.table-header-label{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.sort-icon{font-size:18px;width:18px;height:18px;color:#5c5c5c;display:flex;align-items:center;justify-content:center;transition:color .2s}.sort-icon.sort-asc,.sort-icon.sort-desc{color:#0d4261}.table-body{display:flex;flex-direction:column;gap:8px;background:#f7f7f7}.table-row{display:flex;align-items:center;min-height:48px;background:#fff;border-bottom:1px solid #f0eeee;transition:background-color .2s;border-radius:8px;overflow:hidden;width:100%;box-sizing:border-box;min-width:0}.table-row:hover{background:#fafafa}.table-row--highlight{background:#f0f8ff}.table-row--dark-highlight{background:#e8f4f8}.table-row .table-cell.first-cell{border-top-left-radius:8px;border-bottom-left-radius:8px}.table-row .table-cell.last-cell{border-top-right-radius:8px;border-bottom-right-radius:8px}.table-cell{display:flex;align-items:center;min-height:48px;max-height:none;padding:8px 16px;flex:1;min-width:100px;font-family:Lusail,sans-serif;font-weight:400;font-size:16px;line-height:1.2;color:#000;box-sizing:border-box}.table-cell.has-width{flex:0 0 auto!important;min-width:0!important;max-width:none!important}.table-cell:last-child{border-right:none}.table-cell.actions-cell{justify-content:center;text-align:center}.mobile-cards-container{display:none;flex-direction:column;gap:12px;width:100%;box-sizing:border-box}.mobile-card{background:#fff;border:1px solid #f0eeee;border-radius:8px;padding:12px 20px;display:flex;flex-direction:column;gap:4px;cursor:pointer;transition:background-color .2s;box-sizing:border-box;width:100%}.mobile-card:hover{background:#fafafa}.mobile-card--highlight{background:#f0f8ff}.mobile-card--dark-highlight{background:#e8f4f8}.mobile-card__header{display:flex;align-items:center;justify-content:space-between;height:48px;width:100%;box-sizing:border-box}.mobile-card__header-id{display:flex;flex-direction:column;justify-content:center;flex:1}.mobile-card__id-text{font-family:Lusail,sans-serif;font-weight:700;font-size:14px;line-height:1.2;color:#222;text-align:left;white-space:nowrap}.mobile-card__header-status{display:flex;align-items:center;justify-content:flex-end;flex-shrink:0}.mobile-card__divider{height:.347px;width:100%;background:#f0eeee;margin:0;flex-shrink:0}.mobile-card__body{display:flex;flex-direction:column;gap:0;width:100%;box-sizing:border-box}.mobile-card__row{display:flex;align-items:center;justify-content:space-between;height:40px;width:100%;overflow:hidden;box-sizing:border-box}.mobile-card__row-label{display:flex;flex-direction:column;justify-content:center;flex-shrink:0}.mobile-card__row-label span{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;white-space:nowrap}.mobile-card__row-value{display:flex;flex-direction:column;justify-content:center;flex-shrink:0;text-align:right}.mobile-card__row-value span{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;white-space:nowrap}.mobile-card__amount-currency{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;display:inline-block}.mobile-card__amount-value{font-family:Lusail,sans-serif;font-weight:700;font-size:14px;line-height:1.2;color:#222;display:inline-block;margin-left:6px;margin-right:6px}.mobile-card__actions{border-top:1px solid #f0eeee;padding-top:8px;margin-top:4px;display:flex;align-items:center;justify-content:center;min-height:48px;max-height:48px;width:100%;box-sizing:border-box}@media (max-width: 768px){.table-container{display:none}.mobile-cards-container{display:flex}}@media (min-width: 769px){.mobile-cards-container{display:none}.table-container{display:flex}}:host ::ng-deep button.mat-mdc-button.stateType,:host ::ng-deep button.mdc-button.stateType{white-space:normal!important;height:auto!important;min-height:28px!important;max-width:100%!important;align-items:center!important;justify-content:center!important;cursor:default!important}:host ::ng-deep button.mat-mdc-button.stateType .mdc-button__label,:host ::ng-deep button.mdc-button.stateType .mdc-button__label{white-space:normal!important;display:-webkit-box!important;-webkit-box-orient:vertical!important;-webkit-line-clamp:2!important;line-clamp:2!important;overflow:hidden!important;word-break:break-word!important;line-height:1.25!important;max-width:100%!important;text-align:center!important}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { 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: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: CurrencyPipe, name: "currency" }, { kind: "ngmodule", type: NgxPaginationModule }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ButtonActionsComponent, selector: "app-button-actions", inputs: ["actions", "disabled", "buttonsAction", "listAction", "row"], outputs: ["clickedButton"] }, { kind: "component", type: TitleBarComponent, selector: "app-title-bar", inputs: ["pageTitle", "showExtractButton", "totalElements", "titleMode", "pageInfo", "subTitle", "statusDesc", "newAction", "extraButton", "showDetails", "showImport", "showButton", "extraData", "titleCorporateAdmin", "hideBackButton", "buttons", "buttonsDisplayMode", "draftSupported", "isPending", "onViewModeChange"], outputs: ["newActionClicked", "extraButtonClicked", "extractReport", "buttonClicked", "viewModeChanged"] }, { kind: "component", type: PaginatorComponent, selector: "app-paginator", inputs: ["currentPage", "totalItems", "pageSize", "pageSizeOptions", "mobileLoadMoreIncrement", "displayedItems"], outputs: ["pageChange", "pageSizeChange", "loadMore"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: FilterBuilderComponent, selector: "app-filter-builder", inputs: ["columns", "isChecked", "filterFields", "pageInfo", "pendingFilters", "showExportButton"], outputs: ["filterInformation", "isEmpty", "applyFilter", "sortByClicked", "exportClicked"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: 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: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }], animations: [] }); }
600
+ }
601
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseTableComponent, decorators: [{
602
+ type: Component,
603
+ args: [{ selector: 'app-base-table', standalone: true, animations: [], imports: [
604
+ NgStyle,
605
+ NgClass,
606
+ TranslateModule,
607
+ MatIcon,
608
+ MatSortModule,
609
+ NgIf,
610
+ NgSwitch,
611
+ MatButtonModule,
612
+ DatePipe,
613
+ CurrencyPipe,
614
+ NgxPaginationModule,
615
+ NgSwitchCase,
616
+ NgSwitchDefault,
617
+ MatIconButton,
618
+ NgForOf,
619
+ MatButton,
620
+ ButtonActionsComponent,
621
+ TitleBarComponent,
622
+ PaginatorComponent,
623
+ DecimalPipe,
624
+ MatCheckbox,
625
+ FilterBuilderComponent,
626
+ MatMenuTrigger,
627
+ MatMenu,
628
+ MatMenuItem,
629
+ ], template: "<div class=\"flex-column baseTable\">\r\n <div class=\"flex-row flex-100\" >\r\n <div class=\"flex-column align-start flex-100\" style=\"width: 100%;\">\r\n <app-title-bar\r\n [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\r\n [subTitle]=\"(pageInfo.hideTitle || pageInfo.hideSubtitle) ? '' : pageInfo.labelsSection+'.subtitle'\"\r\n [titleMode]=\"''\"\r\n [pageInfo]=\"pageInfo\"\r\n [newAction]=\"showAddNew()\"\r\n [showExtractButton]=\"!pageInfo.hideExtractButton\"\r\n [draftSupported]=\"pageInfo.draftSupported\"\r\n [isPending]=\"isPending\"\r\n [onViewModeChange]=\"switchViewMode.bind(this)\"\r\n [buttons]=\"extraActions\"\r\n [buttonsDisplayMode]=\"buttonsDisplayMode\"\r\n (newActionClicked)=\"onAddNewAction($event)\"\r\n (extractReport)=\"extractReport($event)\"\r\n (viewModeChanged)=\"onViewModeChangedReceived($event)\"\r\n (buttonClicked)=\"buttonClicked.emit($event)\"\r\n [totalElements]=\"pageInfo.hideTitle ? undefined : totalElements\">\r\n </app-title-bar>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filter-row\" *ngIf=\"!pageInfo.hideAdvancedFilter\">\r\n <app-filter-builder\r\n *ngIf=\"!pageInfo.hideAdvancedFilter\"\r\n [pageInfo]=\"pageInfo\"\r\n [columns]=\"columns\"\r\n [filterFields]=\"filterFields\"\r\n [pendingFilters]=\"pendingFilters\"\r\n [showExportButton]=\"!pageInfo.hideExtractButton\"\r\n (filterInformation)=\"storePendingFilters($event)\"\r\n (isEmpty)=\"handleFilterEmpty($event)\"\r\n (applyFilter)=\"applyPendingFilters()\"\r\n (sortByClicked)=\"handleSortClick($event)\"\r\n (exportClicked)=\"extractReport($event)\">\r\n </app-filter-builder>\r\n\r\n <div class=\"button-group\" *ngIf=\"!pageInfo.hideExtractButton\">\r\n <button *ngIf=\"!pageInfo.hideExtractButton\"\r\n mat-flat-button\r\n type=\"button\"\r\n [matMenuTriggerFor]=\"exportMenu\"\r\n class=\"btn-export\"\r\n [attr.aria-label]=\"'export' | translate\"\r\n [attr.aria-haspopup]=\"true\"\r\n >\r\n <div class=\"button-text\">\r\n <mat-icon>file_export</mat-icon>\r\n <span>{{ 'export' | translate }}</span>\r\n <mat-icon class=\"arrow-icon\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n </button>\r\n\r\n <mat-menu #exportMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"extractReport('pdf')\">PDF</button>\r\n <button mat-menu-item (click)=\"extractReport('xlsx')\">Excel</button>\r\n <button mat-menu-item (click)=\"extractReport('csv')\">CSV</button>\r\n </mat-menu>\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"flex-row flex-100 baseTable__detailsColumn\">\r\n <div class=\"flex-100\">\r\n <div class=\"flex-row flex-100 mainTable\">\r\n <div\r\n class=\"table-container\"\r\n role=\"table\"\r\n [attr.aria-label]=\"\r\n pageInfo.labelsSection && !pageInfo.hideTitle\r\n ? (pageInfo.labelsSection + '.list_title' | translate)\r\n : null\r\n \">\r\n <div class=\"table-header\" [attr.data-sort]=\"sortState\" role=\"row\">\r\n <div *ngFor=\"let columnProp of visibleColumnsArray; let i = index\"\r\n class=\"table-header-cell\"\r\n role=\"columnheader\"\r\n [attr.aria-sort]=\"getColumnAriaSort(columnProp)\"\r\n [attr.tabindex]=\"getColumn(columnProp)?.enableSorting ? 0 : null\"\r\n [class.sortable]=\"getColumn(columnProp)?.enableSorting\"\r\n [class.first-cell]=\"i === 0\"\r\n [class.last-cell]=\"i === visibleColumnsArray.length - 1\"\r\n [class.actions-cell]=\"i === visibleColumnsArray.length - 1 && columnProp === 'actions'\"\r\n [class.has-width]=\"getColumn(columnProp)?.width\"\r\n [ngStyle]=\"getColumn(columnProp)?.width ? {'width': getColumn(columnProp)?.width + '%', 'flex-basis': getColumn(columnProp)?.width + '%'} : {}\"\r\n (click)=\"getColumn(columnProp)?.enableSorting && handleSortClick(columnProp)\"\r\n (keydown)=\"onSortHeaderKeydown($event, columnProp)\">\r\n <div class=\"table-header-content\">\r\n <span class=\"table-header-label\">{{ labelKey(getColumn(columnProp)) | translate }}</span>\r\n <ng-container *ngIf=\"getColumn(columnProp)?.enableSorting\">\r\n <mat-icon *ngIf=\"getSortDirection(columnProp) === 'asc'\"\r\n class=\"sort-icon sort-asc\">arrow_drop_up</mat-icon>\r\n <mat-icon *ngIf=\"getSortDirection(columnProp) === 'desc'\"\r\n class=\"sort-icon sort-desc\">arrow_drop_down</mat-icon>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"table-body\" role=\"rowgroup\">\r\n <div *ngFor=\"let row of dataSource.data; let rowIndex = index\"\r\n class=\"table-row\"\r\n role=\"row\"\r\n [attr.id]=\"'table-row-' + (row?.id || row?.key || '')\"\r\n [ngClass]=\"{\r\n 'table-row--highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\r\n 'table-row--dark-highlight': isDarkHighlight(row)\r\n }\"\r\n (auxclick)=\"openNewTab(row)\"\r\n (click)=\"$event.stopPropagation(); onSelectItem(row)\">\r\n <div *ngFor=\"let columnProp of visibleColumnsArray; let i = index\"\r\n class=\"table-cell\"\r\n role=\"cell\"\r\n [class.first-cell]=\"i === 0\"\r\n [class.last-cell]=\"i === visibleColumnsArray.length - 1\"\r\n [class.actions-cell]=\"i === visibleColumnsArray.length - 1 && columnProp === 'actions'\"\r\n [class.has-width]=\"getColumn(columnProp)?.width\"\r\n [ngStyle]=\"getColumn(columnProp)?.width ? {'width': getColumn(columnProp)?.width + '%', 'flex-basis': getColumn(columnProp)?.width + '%'} : {}\">\r\n <ng-container [ngSwitch]=\"getColumn(columnProp)?.type\">\r\n <ng-container *ngSwitchCase=\"'workflowStatus'\">\r\n <button mat-button class=\"wfStatus {{ getStatusDescription(row)}}\" [attr.id]=\"'table-btn-wf-'+columnProp+'-'+(row.id || row.key || '')\">{{ getStatusDescription(row) }}</button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'hyper-text'\">\r\n <span\r\n *ngIf=\"shouldRenderAsHyperLink(row); else plainHyperText\"\r\n role=\"link\"\r\n tabindex=\"0\"\r\n class=\"mat-mdc-form-field-label hyper-link\"\r\n (click)=\"hyperLinkClicked(columnProp, row)\"\r\n (keydown.enter)=\"hyperLinkClicked(columnProp, row)\"\r\n (keydown.space)=\"$event.preventDefault(); hyperLinkClicked(columnProp, row)\">\r\n {{ extractFieldName(row, columnProp) }}\r\n </span>\r\n <ng-template #plainHyperText>\r\n <span class=\"mat-mdc-form-field-label\">{{ extractFieldName(row, columnProp) }}</span>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <button *ngIf=\"shouldShowButton(row)\" mat-button class=\"primary\" (click)=\"$event.stopPropagation(); actionButtonClicked(columnProp, row)\" [attr.id]=\"'table-btn-action-'+columnProp\">\r\n {{ labelKey(getColumn(columnProp)) + '_title' | translate }}\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'icon'\">\r\n <mat-icon [ngClass]=\"{\r\n 'mainTable__td__icon-green': row[columnProp] === 'pass',\r\n 'mainTable__td__icon-orange': row[columnProp] === 'warning',\r\n 'mainTable__td__icon-red': row[columnProp] === 'error'\r\n }\"\r\n [attr.aria-label]=\"getIconAriaLabelKey(row[columnProp]) | translate\">\r\n {{ getIcon(row[columnProp]) }}\r\n </mat-icon>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <mat-checkbox class=\"primary\" [checked]=\"row[columnProp]\" (click)=\"$event.stopPropagation();actionCheckedClicked(columnProp,row)\"></mat-checkbox>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <button mat-button class=\"stateType {{ row[columnProp]}}\" [attr.id]=\"'table-btn-state-'+columnProp\">{{ labelKeyByValue(getColumn(columnProp), row) | translate}}</button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n {{ extractFieldName(row, columnProp) | date:'dd/MM/yyyy' }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'croppedText'\">\r\n {{ getCroppedText(row[columnProp], row[getColumn(columnProp)?.width]) }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'download'\">\r\n <mat-icon class=\"mainTable__td__icon-blue\"\r\n [attr.aria-label]=\"'BASE_TABLE.downloadAction' | translate\">system_update_alt</mat-icon>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'onOff'\">\r\n <mat-icon *ngIf=\"row[columnProp] === null\" class=\"mainTable__td__icon-darkorange\"\r\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(null) | translate\">flag</mat-icon>\r\n <mat-icon *ngIf=\"row[columnProp] === false\" class=\"mainTable__td__icon-red\"\r\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(false) | translate\">flag</mat-icon>\r\n <mat-icon *ngIf=\"row[columnProp] === true\" class=\"mainTable__td__icon-green\"\r\n [attr.aria-label]=\"getOnOffFlagAriaLabelKey(true) | translate\">flag</mat-icon>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <span *ngIf=\"row[columnProp] === null || row[columnProp] === false\">\r\n {{ pageInfo.labelsSection + '.' + getColumn(columnProp)?.label + 'InActive' | translate }}\r\n </span>\r\n <span *ngIf=\"row[columnProp] === true\">\r\n {{ pageInfo.labelsSection + '.' + getColumn(columnProp)?.label + 'Active' | translate }}\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'info'\">\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n [attr.aria-label]=\"'BASE_TABLE.rowDetails' | translate\"\r\n (click)=\"$event.stopPropagation();emitEvent(row)\"\r\n [attr.id]=\"'table-btn-info-'+row.id\">\r\n <mat-icon aria-hidden=\"true\">info</mat-icon>\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'netAmount'\">\r\n <div class=\"mainTable__td__currency\" style=\"display:inline-block;\">{{ row[getColumn(columnProp)?.currency] }}</div>\r\n <span class=\"mainTable__td__property\" style=\"display:inline-block; margin-left:6px; margin-right:6px;\">\r\n {{ extractFieldName(row, columnProp) | currency:'':'' }}</span>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'localDateTime'\">\r\n {{ extractFieldName(row, columnProp) | date : extractFormat(getColumn(columnProp)) }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\r\n <small><sup class=\"mainTable__td__currency\">{{row[getColumn(columnProp)?.currency]}}</sup></small>\r\n {{ extractFieldName(row, columnProp) | number : (getColumn(columnProp)?.digitInfo || '1.3-5') }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'listAction'\">\r\n <app-button-actions\r\n [row]=\"row\"\r\n [buttonsAction]=\"getColumn(columnProp)?.viewType === 'buttonsAction'\"\r\n [listAction]=\"listAction\"\r\n [actions]=\"listAction\"\r\n (clickedButton)=\"actionListClicked($event,row)\">\r\n </app-button-actions>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngIf=\"getColumn(columnProp)?.translate; else noTranslate\">\r\n <span\r\n role=\"link\"\r\n tabindex=\"0\"\r\n (click)=\"$event.stopPropagation(); emitRoutePage(row)\"\r\n (keydown)=\"onDefaultCellLinkKeydown($event, row)\">\r\n {{ pageInfo.labelsSection + \".\" + extractFieldName(row, columnProp) | translate }}\r\n </span>\r\n </ng-container>\r\n <ng-template #noTranslate>\r\n <span\r\n role=\"link\"\r\n tabindex=\"0\"\r\n (click)=\"$event.stopPropagation(); emitRoutePage(row)\"\r\n (keydown)=\"onDefaultCellLinkKeydown($event, row)\"\r\n [innerText]='extractFieldName(row, columnProp)'></span>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Mobile Card View -->\r\n <div class=\"mobile-cards-container\">\r\n <div *ngFor=\"let row of dataSource.data; let rowIndex = index\"\r\n class=\"mobile-card\"\r\n [attr.id]=\"'mobile-card-' + (row?.id || row?.key || '')\"\r\n [ngClass]=\"{\r\n 'mobile-card--highlight': selectedRowIndex == row.id || (pageInfo.groupByProperty && pageInfo.groupByValue?.includes(row[pageInfo.groupByProperty])),\r\n 'mobile-card--dark-highlight': isDarkHighlight(row)\r\n }\"\r\n (auxclick)=\"openNewTab(row)\"\r\n (click)=\"$event.stopPropagation(); onSelectItem(row)\">\r\n\r\n <!-- Mobile Card Header: ID/Name and Status -->\r\n <div class=\"mobile-card__header\">\r\n <div class=\"mobile-card__header-id\">\r\n <span class=\"mobile-card__id-text\">{{ extractFieldName(row, getMobileCardIdColumn()?.property || 'id') }}</span>\r\n </div>\r\n <div class=\"mobile-card__header-status\" *ngIf=\"getMobileCardStatusColumn()\">\r\n <button mat-button class=\"stateType {{ row[getMobileCardStatusColumn()?.property]}}\"\r\n [attr.id]=\"'mobile-btn-state-'+getMobileCardStatusColumn()?.property\">\r\n {{ labelKeyByValue(getMobileCardStatusColumn(), row) | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Divider -->\r\n <div class=\"mobile-card__divider\"></div>\r\n\r\n <!-- Mobile Card Body: Other columns -->\r\n <div class=\"mobile-card__body\">\r\n <div *ngFor=\"let column of getMobileCardColumns()\" class=\"mobile-card__row\">\r\n <div class=\"mobile-card__row-label\">\r\n <span>{{ labelKey(column) | translate }} :</span>\r\n </div>\r\n <div class=\"mobile-card__row-value\">\r\n <ng-container [ngSwitch]=\"column.type\">\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <button mat-button class=\"stateType {{ row[column.property]}}\"\r\n [attr.id]=\"'mobile-btn-state-'+column.property\">\r\n {{ labelKeyByValue(column, row) | translate}}\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n {{ extractFieldName(row, column.property) | date:'dd/MM/yyyy' }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'netAmount'\">\r\n <span class=\"mobile-card__amount-currency\">{{ row[column.currency] }}</span>\r\n <span class=\"mobile-card__amount-value\">{{ extractFieldName(row, column.property) | currency:'':'' }}</span>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'localDateTime'\">\r\n {{ extractFieldName(row, column.property) | date : extractFormat(column) }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\r\n <small><sup class=\"mainTable__td__currency\">{{row[column.currency]}}</sup></small>\r\n {{ extractFieldName(row, column.property) | number : (column.digitInfo || '1.3-5') }}\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngIf=\"column.translate; else noTranslate\">\r\n <span>{{ pageInfo.labelsSection + \".\" + extractFieldName(row, column.property) | translate }}</span>\r\n </ng-container>\r\n <ng-template #noTranslate>\r\n <span [innerText]='extractFieldName(row, column.property)'></span>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Mobile Card Actions -->\r\n <div class=\"mobile-card__actions\" *ngIf=\"listAction && listAction.length > 0\">\r\n <app-button-actions\r\n [row]=\"row\"\r\n [buttonsAction]=\"true\"\r\n [listAction]=\"listAction\"\r\n [actions]=\"listAction\"\r\n (clickedButton)=\"actionListClicked($event,row)\">\r\n </app-button-actions>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"noDataFound\" class=\"dataNotFound flex-column\">\r\n <img *ngIf=\"getDisplaySvgPath()\" [src]=\"getDisplaySvgPath()\" class=\"dataNotFound__icon\" alt=\"No data found\" />\r\n <span class=\"dataNotFound__title\">{{ getDisplayTitle() | translate}}</span>\r\n <span class=\"dataNotFound__subtitle\">{{ getDisplaySubtitle() | translate}}</span>\r\n </div>\r\n\r\n\r\n <div *ngIf=\"(dataSource.data?.length > 0 || customizedData) && !pageInfo.hidePagination\" class=\"main-pagination flex-row\">\r\n <ng-container *ngIf=\"enablePagination\">\r\n <div class=\"flex-column flex-100\">\r\n <app-paginator\r\n [currentPage]=\"pageIndex\"\r\n [totalItems]=\"totalElements\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"[5, 10, 25, 50]\"\r\n [mobileLoadMoreIncrement]=\"mobileLoadMoreIncrement\"\r\n [displayedItems]=\"mobileDisplayedItems || dataSource.data.length\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"\r\n (loadMore)=\"onLoadMore($event)\">\r\n </app-paginator>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;width:100%;max-width:100%;box-sizing:border-box}.baseTable{width:100%!important;max-width:100%!important;box-sizing:border-box}.flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column;width:100%;max-width:100%;box-sizing:border-box}.flex-100{flex:1 1 100%}.flex-49{flex:0 0 49%}.flex-50{flex:0 0 50%}.align-start{justify-content:flex-start;align-items:flex-start}.align-center{justify-content:center;align-items:center}.align-end{justify-content:flex-end;align-items:flex-end}.gap-0{gap:0}.gap-5{gap:5px}.gap-10{gap:10px}.dataNotFound{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;text-align:center;margin-top:80px}.dataNotFound__icon{height:auto;width:auto;max-width:200px;max-height:200px;margin-bottom:8px;object-fit:contain}.dataNotFound__title{color:#6a6a6a;font-size:20px;font-weight:700;margin-bottom:4px}.dataNotFound__subtitle{color:#6a6a6a;font-size:20px;font-weight:400}@media (max-width: 960px){.flex-column-sm{flex-direction:column}.align-center-sm{justify-content:center;align-items:flex-start}}.filter-row{display:flex!important;flex-direction:row!important;align-items:center!important;width:100%!important;max-width:100%!important;gap:16px!important;box-sizing:border-box;margin-top:20px;margin-bottom:16px;padding:0;flex-wrap:nowrap!important;min-width:0!important;min-height:48px!important;overflow:visible!important}.filter-row app-filter-builder{flex:1 1 auto!important;min-width:0!important;max-width:none!important;width:auto!important;flex-shrink:1!important;display:flex!important;align-items:center!important;overflow:visible!important}.button-group{display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:flex-end;gap:8px!important;flex-shrink:0!important;flex-grow:0!important;flex-basis:auto!important;height:46px!important;white-space:nowrap!important;z-index:1!important}.mainTable{margin-top:0!important}.btn-apply-filter{background:#fff!important;border:1px solid #3e627b!important;border-radius:8px!important;height:46px!important;min-width:120px!important;padding:0 16px!important;box-shadow:none!important}.btn-apply-filter .button-text{display:flex;align-items:center;justify-content:center;gap:4px;width:100%}.btn-apply-filter mat-icon{font-size:24px;width:24px;height:30px;color:#0d4261}.btn-apply-filter span{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.btn-apply-filter:hover{background:#fafafa!important}.btn-export{background:#fff!important;border:1px solid #0d4261!important;border-radius:8px!important;height:46px!important;min-width:109px!important;padding:0 16px!important;box-shadow:none!important;margin-bottom:7px!important}.btn-export .button-text{display:flex;align-items:center;justify-content:center;gap:4px;width:100%}.btn-export mat-icon{font-size:24px;width:24px;height:30px;color:#0d4261}.btn-export .arrow-icon{font-size:16px;width:16px;height:16px;margin-left:0}.btn-export span{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.btn-export:hover{background:#fafafa!important}.arrow-icon{font-size:16px;width:16px;height:16px}@media (max-width: 1024px){.button-group{width:auto}}@media (max-width: 768px){.filter-row{flex-direction:column;align-items:stretch}.button-group{display:none!important}.btn-export{width:100%}}.table-container{width:100%;overflow:hidden;background:#f7f7f7;box-sizing:border-box;display:flex;flex-direction:column}.table-header{display:flex;align-items:center;background:#f7f7f7;border:1px solid #f0eeee;max-height:48px;height:48px;margin-bottom:16px;border-radius:8px;overflow:hidden;width:100%;box-sizing:border-box;min-width:0}.table-header-cell{display:flex;align-items:center;max-height:48px;height:48px;padding:8px 16px;flex:1;min-width:100px;position:sticky;top:0;background:none;z-index:10;box-sizing:border-box}.table-header-cell.has-width{flex:0 0 auto!important;min-width:0!important;max-width:none!important}.table-header-cell:last-child{border-right:none}.table-header-cell.first-cell{border-top-left-radius:8px;border-bottom-left-radius:8px}.table-header-cell.last-cell{border-top-right-radius:8px;border-bottom-right-radius:8px}.table-header-cell.actions-cell{justify-content:center;text-align:center}.table-header-cell.actions-cell .table-header-content{justify-content:center}.table-header-cell.sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.table-header-cell.sortable:hover{background:#fafafa}.table-header-content{display:flex;align-items:center;gap:8px;width:100%}.table-header-label{font-family:Lusail,sans-serif;font-weight:500;font-size:16px;line-height:1.2;color:#0d4261;white-space:nowrap}.sort-icon{font-size:18px;width:18px;height:18px;color:#5c5c5c;display:flex;align-items:center;justify-content:center;transition:color .2s}.sort-icon.sort-asc,.sort-icon.sort-desc{color:#0d4261}.table-body{display:flex;flex-direction:column;gap:8px;background:#f7f7f7}.table-row{display:flex;align-items:center;min-height:48px;background:#fff;border-bottom:1px solid #f0eeee;transition:background-color .2s;border-radius:8px;overflow:hidden;width:100%;box-sizing:border-box;min-width:0}.table-row:hover{background:#fafafa}.table-row--highlight{background:#f0f8ff}.table-row--dark-highlight{background:#e8f4f8}.table-row .table-cell.first-cell{border-top-left-radius:8px;border-bottom-left-radius:8px}.table-row .table-cell.last-cell{border-top-right-radius:8px;border-bottom-right-radius:8px}.table-cell{display:flex;align-items:center;min-height:48px;max-height:none;padding:8px 16px;flex:1;min-width:100px;font-family:Lusail,sans-serif;font-weight:400;font-size:16px;line-height:1.2;color:#000;box-sizing:border-box}.table-cell.has-width{flex:0 0 auto!important;min-width:0!important;max-width:none!important}.table-cell:last-child{border-right:none}.table-cell.actions-cell{justify-content:center;text-align:center}.mobile-cards-container{display:none;flex-direction:column;gap:12px;width:100%;box-sizing:border-box}.mobile-card{background:#fff;border:1px solid #f0eeee;border-radius:8px;padding:12px 20px;display:flex;flex-direction:column;gap:4px;cursor:pointer;transition:background-color .2s;box-sizing:border-box;width:100%}.mobile-card:hover{background:#fafafa}.mobile-card--highlight{background:#f0f8ff}.mobile-card--dark-highlight{background:#e8f4f8}.mobile-card__header{display:flex;align-items:center;justify-content:space-between;height:48px;width:100%;box-sizing:border-box}.mobile-card__header-id{display:flex;flex-direction:column;justify-content:center;flex:1}.mobile-card__id-text{font-family:Lusail,sans-serif;font-weight:700;font-size:14px;line-height:1.2;color:#222;text-align:left;white-space:nowrap}.mobile-card__header-status{display:flex;align-items:center;justify-content:flex-end;flex-shrink:0}.mobile-card__divider{height:.347px;width:100%;background:#f0eeee;margin:0;flex-shrink:0}.mobile-card__body{display:flex;flex-direction:column;gap:0;width:100%;box-sizing:border-box}.mobile-card__row{display:flex;align-items:center;justify-content:space-between;height:40px;width:100%;overflow:hidden;box-sizing:border-box}.mobile-card__row-label{display:flex;flex-direction:column;justify-content:center;flex-shrink:0}.mobile-card__row-label span{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;white-space:nowrap}.mobile-card__row-value{display:flex;flex-direction:column;justify-content:center;flex-shrink:0;text-align:right}.mobile-card__row-value span{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;white-space:nowrap}.mobile-card__amount-currency{font-family:Lusail,sans-serif;font-weight:400;font-size:14px;line-height:1.2;color:#222;display:inline-block}.mobile-card__amount-value{font-family:Lusail,sans-serif;font-weight:700;font-size:14px;line-height:1.2;color:#222;display:inline-block;margin-left:6px;margin-right:6px}.mobile-card__actions{border-top:1px solid #f0eeee;padding-top:8px;margin-top:4px;display:flex;align-items:center;justify-content:center;min-height:48px;max-height:48px;width:100%;box-sizing:border-box}@media (max-width: 768px){.table-container{display:none}.mobile-cards-container{display:flex}}@media (min-width: 769px){.mobile-cards-container{display:none}.table-container{display:flex}}:host ::ng-deep button.mat-mdc-button.stateType,:host ::ng-deep button.mdc-button.stateType{white-space:normal!important;height:auto!important;min-height:28px!important;max-width:100%!important;align-items:center!important;justify-content:center!important;cursor:default!important}:host ::ng-deep button.mat-mdc-button.stateType .mdc-button__label,:host ::ng-deep button.mdc-button.stateType .mdc-button__label{white-space:normal!important;display:-webkit-box!important;-webkit-box-orient:vertical!important;-webkit-line-clamp:2!important;line-clamp:2!important;overflow:hidden!important;word-break:break-word!important;line-height:1.25!important;max-width:100%!important;text-align:center!important}\n"] }]
630
+ }], ctorParameters: () => [{ type: i1.BackendService }, { type: i2.TranslateService }, { type: i3.ShareDataService }, { type: undefined, decorators: [{
631
+ type: Inject,
632
+ args: ['securityManager']
633
+ }] }, { type: i4.Router }, { type: i5.LiveAnnouncer }], propDecorators: { filterFields: [{
634
+ type: Input
635
+ }], noDataFoundSvgPath: [{
636
+ type: Input
637
+ }], noDataFoundTitle: [{
638
+ type: Input
639
+ }], noDataFoundSubtitle: [{
640
+ type: Input
641
+ }], noResultSvgPath: [{
642
+ type: Input
643
+ }], noResultTitle: [{
644
+ type: Input
645
+ }], noResultSubtitle: [{
646
+ type: Input
647
+ }], pageInfo: [{
648
+ type: Input
649
+ }], enablePagination: [{
650
+ type: Input
651
+ }], mobilePageSize: [{
652
+ type: Input
653
+ }], mobileLoadMoreIncrement: [{
654
+ type: Input
655
+ }], data: [{
656
+ type: Input
657
+ }], listAction: [{
658
+ type: Input
659
+ }], extraActions: [{
660
+ type: Input
661
+ }], buttonsDisplayMode: [{
662
+ type: Input
663
+ }], columns: [{
664
+ type: Input
665
+ }], filters: [{
666
+ type: Input
667
+ }], pathParam: [{
668
+ type: Input
669
+ }], extraButton: [{
670
+ type: Input
671
+ }], buttonClicked: [{
672
+ type: Output
673
+ }], enforceRefresh: [{
674
+ type: Input
675
+ }], isPending: [{
676
+ type: Input
677
+ }], trigger: [{
678
+ type: Input
679
+ }], reportRequest: [{
680
+ type: Input
681
+ }], separateEndpointData: [{
682
+ type: Input
683
+ }], manageablePages: [{
684
+ type: Input
685
+ }], totalPagesCount: [{
686
+ type: Input
687
+ }], currentPageIndex: [{
688
+ type: Input
689
+ }], pageChange: [{
690
+ type: Output
691
+ }], userAction: [{
692
+ type: Output
693
+ }], hyperLinkAction: [{
694
+ type: Output
695
+ }], extraAction: [{
696
+ type: Output
697
+ }], selectedColumn: [{
698
+ type: Output
699
+ }], listActionClicked: [{
700
+ type: Output
701
+ }], showDialog: [{
702
+ type: Output
703
+ }], customizedData: [{
704
+ type: Input
705
+ }], clickRoutePage: [{
706
+ type: Output
707
+ }] } });
708
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtdGFibGUvYmFzZS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtdGFibGUvYmFzZS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFJTCxNQUFNLEVBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFDLGVBQWUsRUFBbUIsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsYUFBYSxFQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUNMLFlBQVksRUFDWixRQUFRLEVBQ1IsV0FBVyxFQUNYLE9BQU8sRUFDUCxPQUFPLEVBQ1AsSUFBSSxFQUNKLE9BQU8sRUFDUCxRQUFRLEVBQ1IsWUFBWSxFQUNaLGVBQWUsRUFDaEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDbkYsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sNENBQTRDLENBQUM7QUFFbEYsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FB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QUFLO2dCQUlOLE9BQU87c0JBRE4sS0FBSztnQkFJTixhQUFhO3NCQURaLEtBQUs7Z0JBSU4sb0JBQW9CO3NCQURuQixLQUFLO2dCQUdOLGVBQWU7c0JBRGQsS0FBSztnQkFHTixlQUFlO3NCQURkLEtBQUs7Z0JBR04sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxNQUFNO2dCQUtQLFVBQVU7c0JBRFQsTUFBTTtnQkFHUCxlQUFlO3NCQURkLE1BQU07Z0JBSVAsV0FBVztzQkFEVixNQUFNO2dCQUlQLGNBQWM7c0JBRGIsTUFBTTtnQkFJUCxpQkFBaUI7c0JBRGhCLE1BQU07Z0JBUVAsVUFBVTtzQkFEVCxNQUFNO2dCQVFQLGNBQWM7c0JBRGIsS0FBSztnQkFTTixjQUFjO3NCQURiLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBlZmZlY3QsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlc1xyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7TWF0VGFibGVEYXRhU291cmNlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGVcIjtcclxuaW1wb3J0IHtUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2V9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XHJcbmltcG9ydCB7TWF0U29ydE1vZHVsZSwgU29ydH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3NvcnRcIjtcclxuaW1wb3J0IHtcclxuICBDdXJyZW5jeVBpcGUsXHJcbiAgRGF0ZVBpcGUsXHJcbiAgRGVjaW1hbFBpcGUsXHJcbiAgTmdDbGFzcyxcclxuICBOZ0Zvck9mLFxyXG4gIE5nSWYsXHJcbiAgTmdTdHlsZSxcclxuICBOZ1N3aXRjaCxcclxuICBOZ1N3aXRjaENhc2UsXHJcbiAgTmdTd2l0Y2hEZWZhdWx0XHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge01hdEljb259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pY29uXCI7XHJcbmltcG9ydCB7TWF0QnV0dG9uLCBNYXRCdXR0b25Nb2R1bGUsIE1hdEljb25CdXR0b259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9idXR0b25cIjtcclxuaW1wb3J0IHtOZ3hQYWdpbmF0aW9uTW9kdWxlfSBmcm9tIFwibmd4LXBhZ2luYXRpb25cIjtcclxuaW1wb3J0IHtCdXR0b25BY3Rpb25zQ29tcG9uZW50fSBmcm9tIFwiLi4vYnV0dG9uLWFjdGlvbnMvYnV0dG9uLWFjdGlvbnMuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7U2hhcmVEYXRhU2VydmljZX0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3RyaWdnZXItZm9ybS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7QmFzZVV0aWxzfSBmcm9tIFwiLi4vLi4vdXRpbHMvYmFzZS11dGlsc1wiO1xyXG5pbXBvcnQge0JhY2tlbmRTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvYmFja2VuZC1zZXJ2aWNlXCI7XHJcbmltcG9ydCB7RmlsdGVyfSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9maWx0ZXIubW9kZWxcIjtcclxuaW1wb3J0IHtGaWx0ZXJSZXF1ZXN0fSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9maWx0ZXItcmVxdWVzdFwiO1xyXG5pbXBvcnQge1xyXG4gIEJ1dHRvbkFjdGlvblNldHRpbmdzLFxyXG4gIEVNUFRZX1BBR0VfSU5GTyxcclxuICBGaWVsZEluZm8sXHJcbiAgRlJPTlRfRU5EX0NPTFVNTl9UWVBFUyxcclxuICBQYWdlSW5mbyxcclxuICBUQUJMRV9SRUNPUkRfQUNUSU9OLFxyXG4gIFRhYmxlQ29sdW1uXHJcbn0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWxcIjtcclxuaW1wb3J0IHtSZXBvcnRSZXF1ZXN0fSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9yZXBvcnQtcmVxdWVzdC5tb2RlbFwiO1xyXG5pbXBvcnQge1RhYmxlUGFnZVVzZXJBY3Rpb259IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL3RhYmxlLXBhZ2UtdXNlci1hY3Rpb24uaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7V29ya2Zsb3d9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL3dvcmtmbG93L3dvcmtmbG93Lm1vZGVsXCI7XHJcbmltcG9ydCB7UmVzcG9uc2VFbnZlbG9wfSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9yZXNwb25zZS1lbnZlbG9wLm1vZGVsXCI7XHJcbmltcG9ydCB7Um91dGVyfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7TGl2ZUFubm91bmNlcn0gZnJvbSBcIkBhbmd1bGFyL2Nkay9hMTF5XCI7XHJcbmltcG9ydCB7VGl0bGVCYXJDb21wb25lbnR9IGZyb20gXCIuLi90aXRsZS1iYXIvdGl0bGUtYmFyLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge1BhZ2luYXRvckNvbXBvbmVudH0gZnJvbSBcIi4uL3BhZ2luYXRvci9wYWdpbmF0b3IuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7TWF0Q2hlY2tib3h9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveFwiO1xyXG5pbXBvcnQge0ZpbHRlckJ1aWxkZXJDb21wb25lbnR9IGZyb20gXCIuLi9hZHZhbmNlZC1maWx0ZXIvZmlsdGVyLWJ1aWxkZXIvZmlsdGVyLWJ1aWxkZXIuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7RmllbGRGaWx0ZXJ9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL2ZpZWxkLWZpbHRlci5tb2RlbFwiO1xyXG5pbXBvcnQge01hdE1lbnUsIE1hdE1lbnVJdGVtLCBNYXRNZW51VHJpZ2dlcn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL21lbnVcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWJhc2UtdGFibGUnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Jhc2UtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2Jhc2UtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICBhbmltYXRpb25zOiBbXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBOZ1N0eWxlLFxyXG4gICAgTmdDbGFzcyxcclxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcclxuICAgIE1hdEljb24sXHJcbiAgICBNYXRTb3J0TW9kdWxlLFxyXG4gICAgTmdJZixcclxuICAgIE5nU3dpdGNoLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgRGF0ZVBpcGUsXHJcbiAgICBDdXJyZW5jeVBpcGUsXHJcbiAgICBOZ3hQYWdpbmF0aW9uTW9kdWxlLFxyXG4gICAgTmdTd2l0Y2hDYXNlLFxyXG4gICAgTmdTd2l0Y2hEZWZhdWx0LFxyXG4gICAgTWF0SWNvbkJ1dHRvbixcclxuICAgIE5nRm9yT2YsXHJcbiAgICBNYXRCdXR0b24sXHJcbiAgICBCdXR0b25BY3Rpb25zQ29tcG9uZW50LFxyXG4gICAgVGl0bGVCYXJDb21wb25lbnQsXHJcbiAgICBQYWdpbmF0b3JDb21wb25lbnQsXHJcbiAgICBEZWNpbWFsUGlwZSxcclxuICAgIE1hdENoZWNrYm94LFxyXG4gICAgRmlsdGVyQnVpbGRlckNvbXBvbmVudCxcclxuICAgIE1hdE1lbnVUcmlnZ2VyLFxyXG4gICAgTWF0TWVudSxcclxuICAgIE1hdE1lbnVJdGVtLFxyXG5cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYXNlVGFibGVDb21wb25lbnQgZXh0ZW5kcyBCYXNlVXRpbHMgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICB0eXBlczogc3RyaW5nW10gPSBbXCJwZGZcIiwgXCJjc3ZcIiwgXCJ4bHN4XCJdXHJcbiAgY29sbGVjdGlvbiA9IHtjb3VudDogNjAsIGRhdGE6IFtdfTtcclxuICBjb25maWcgPSB7XHJcbiAgICBpdGVtc1BlclBhZ2U6IDEwLFxyXG4gICAgY3VycmVudFBhZ2U6IDEsXHJcbiAgICB0b3RhbEl0ZW1zOiB0aGlzLmNvbGxlY3Rpb24uY291bnRcclxuICB9O1xyXG4gIHB1YmxpYyBtYXhTaXplOiBudW1iZXIgPSA3O1xyXG4gIHB1YmxpYyBkaXJlY3Rpb25MaW5rczogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHVibGljIGF1dG9IaWRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHJlc3BvbnNpdmU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHB1YmxpYyBsYWJlbHM6IGFueSA9IHtcclxuICAgIHByZXZpb3VzTGFiZWw6ICc8JyxcclxuICAgIG5leHRMYWJlbDogJz4nLFxyXG4gICAgc2NyZWVuUmVhZGVyUGFnaW5hdGlvbkxhYmVsOiAnUGFnaW5hdGlvbicsXHJcbiAgICBzY3JlZW5SZWFkZXJQYWdlTGFiZWw6ICdwYWdlJyxcclxuICAgIHNjcmVlblJlYWRlckN1cnJlbnRMYWJlbDogYFlvdSdyZSBvbiBwYWdlYFxyXG4gIH07XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZmlsdGVyRmllbGRzOiBGaWVsZEluZm9bXTtcclxuICBASW5wdXQoKSBub0RhdGFGb3VuZFN2Z1BhdGg6IHN0cmluZztcclxuICBASW5wdXQoKSBub0RhdGFGb3VuZFRpdGxlID0gJ25vRGF0YUZvdW5kVGl0bGUnO1xyXG4gIEBJbnB1dCgpIG5vRGF0YUZvdW5kU3VidGl0bGUgPSAnbm9EYXRhRm91bmRTdWJ0aXRsZSc7XHJcbiAgQElucHV0KCkgbm9SZXN1bHRTdmdQYXRoOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbm9SZXN1bHRUaXRsZSA9ICdub1Jlc3VsdFRpdGxlJztcclxuICBASW5wdXQoKSBub1Jlc3VsdFN1YnRpdGxlID0gJ25vUmVzdWx0U3VidGl0bGUnO1xyXG4gIHRvdGFsRWxlbWVudHMgPSAwO1xyXG4gIHBhZ2VzQ291bnQgPSAwO1xyXG4gIHBhZ2VJbmRleCA9IDE7XHJcbiAgcGFnZVNpemUgPSAxMDtcclxuICBtb2JpbGVEaXNwbGF5ZWRJdGVtcyA9IDA7XHJcbiAgcHJpdmF0ZSBzZWxlY3RlZFN0YXR1c0ZpbHRlcjogRmlsdGVyW10gPSBbXTtcclxuICBhZHZhbmNlZEFwcGxpZWRGaWx0ZXI6IGFueVtdID0gW107XHJcbiAgcGVuZGluZ0ZpbHRlcnM6IGFueVtdID0gW107XHJcbiAgc2VhcmNoU3RyOiBzdHJpbmcgPSAnJztcclxuICBwcml2YXRlIGZpbHRlclJlcXVlc3Q6IEZpbHRlclJlcXVlc3QgPSBuZXcgRmlsdGVyUmVxdWVzdCgpO1xyXG4gIHByaXZhdGUgdGltZXI6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIG92ZXJyaWRlIHBhZ2VJbmZvOiBQYWdlSW5mbyA9IEVNUFRZX1BBR0VfSU5GTztcclxuXHJcbiAgQElucHV0KClcclxuICBlbmFibGVQYWdpbmF0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KClcclxuICBtb2JpbGVQYWdlU2l6ZTogbnVtYmVyID0gMjtcclxuXHJcbiAgQElucHV0KClcclxuICBtb2JpbGVMb2FkTW9yZUluY3JlbWVudDogbnVtYmVyID0gMjtcclxuXHJcbiAgQElucHV0KCkgZGF0YT86IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+O1xyXG4gIEBJbnB1dCgpXHJcbiAgbGlzdEFjdGlvbjogQnV0dG9uQWN0aW9uU2V0dGluZ3NbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGV4dHJhQWN0aW9uczogQnV0dG9uQWN0aW9uU2V0dGluZ3NbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGJ1dHRvbnNEaXNwbGF5TW9kZTogJ2Ryb3Bkb3duJyB8ICdsaXN0JyA9ICdkcm9wZG93bic7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgY29sdW1uczogVGFibGVDb2x1bW48YW55PltdO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGZpbHRlcnM6IEZpbHRlcltdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIC8vQHRzLWlnbm9yZVxyXG4gIHBhdGhQYXJhbTogbnVtYmVyO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGV4dHJhQnV0dG9uOiAgQnV0dG9uQWN0aW9uU2V0dGluZ3NbXSA9IFtdO1xyXG5cclxuICBAT3V0cHV0KCkgYnV0dG9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QnV0dG9uQWN0aW9uU2V0dGluZ3M+KCk7XHJcblxyXG4gIEBJbnB1dCgpIC8vQHRzLWlnbm9yZVxyXG4gIGVuZm9yY2VSZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaXNQZW5kaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgdHJpZ2dlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHJlcG9ydFJlcXVlc3Q6IFJlcG9ydFJlcXVlc3QgPSBuZXcgUmVwb3J0UmVxdWVzdCh7fSk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2VwYXJhdGVFbmRwb2ludERhdGE6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIG1hbmFnZWFibGVQYWdlczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgdG90YWxQYWdlc0NvdW50OiBudW1iZXIgPSAwO1xyXG4gIEBJbnB1dCgpXHJcbiAgY3VycmVudFBhZ2VJbmRleDogbnVtYmVyID0gMDtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcGFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG5cclxuICBAT3V0cHV0KClcclxuICB1c2VyQWN0aW9uOiBFdmVudEVtaXR0ZXI8VGFibGVQYWdlVXNlckFjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlUGFnZVVzZXJBY3Rpb24+KCk7XHJcbiAgQE91dHB1dCgpXHJcbiAgaHlwZXJMaW5rQWN0aW9uOiBFdmVudEVtaXR0ZXI8VGFibGVQYWdlVXNlckFjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlUGFnZVVzZXJBY3Rpb24+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGV4dHJhQWN0aW9uOiBFdmVudEVtaXR0ZXI8VGFibGVQYWdlVXNlckFjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlUGFnZVVzZXJBY3Rpb24+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHNlbGVjdGVkQ29sdW1uOiBFdmVudEVtaXR0ZXI8U29ydD4gPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnQ+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGxpc3RBY3Rpb25DbGlja2VkOiBFdmVudEVtaXR0ZXI8eyBhY3Rpb246IEJ1dHRvbkFjdGlvblNldHRpbmdzLCByb3c6IGFueSAsIGlzUGVuZGluZzogYm9vbGVhbn0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7XHJcbiAgICBhY3Rpb246IEJ1dHRvbkFjdGlvblNldHRpbmdzLFxyXG4gICAgcm93OiBhbnksXHJcbiAgICBpc1BlbmRpbmc6IGJvb2xlYW5cclxuICB9PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBzaG93RGlhbG9nOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICB1c2VkV29ya2Zsb3chOiBXb3JrZmxvdztcclxuXHJcbiAgbW9kZTphbnk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgY3VzdG9taXplZERhdGE/OiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcclxuICBkYXRhU291cmNlOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcclxuICBzZWxlY3RlZFJvd0luZGV4ID0gLTE7XHJcbiAgbm9EYXRhRm91bmQgPSBmYWxzZTtcclxuICB0b3RhbFJlcXVpcmVkQ291bnRJdGVtID0gMDtcclxuXHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGNsaWNrUm91dGVQYWdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgICAgcHJpdmF0ZSBiYWNrZW5kU2VydmljZTogQmFja2VuZFNlcnZpY2UsXHJcbiAgICAgIHB1YmxpYyB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICBwdWJsaWMgc2hhcmVEYXRhU2VydmljZTogU2hhcmVEYXRhU2VydmljZSxcclxuICAgICAgQEluamVjdCgnc2VjdXJpdHlNYW5hZ2VyJykgcHJpdmF0ZSBzZWN1cml0eU1hbmFnZXI6IGFueSxcclxuICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgICAgcHJpdmF0ZSByZWFkb25seSBsaXZlQW5ub3VuY2VyOiBMaXZlQW5ub3VuY2VyLFxyXG4gICkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoKTtcclxuICAgIHRoaXMuY29sdW1ucyA9IFtdO1xyXG4gICAgdGhpcy5maWx0ZXJSZXF1ZXN0ID0gbmV3IEZpbHRlclJlcXVlc3QoKTtcclxuXHJcbiAgICB0aGlzLmluaXRpYWxpemVNb2JpbGVQYWdlU2l6ZSgpO1xyXG5cclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnBhZ2VJbmZvLmxhenlMb2FkRGF0YSAhPT0gdHJ1ZSB8fCB0aGlzLmVuZm9yY2VSZWZyZXNoID09PSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5iYWNrZW5kU2VydmljZS5pc0VtcHR5SXRlbXMgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGggPD0gMDtcclxuICAgIGlmICh0aGlzLmN1c3RvbWl6ZWREYXRhKSB7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IHRoaXMuY3VzdG9taXplZERhdGE7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLm1hbmFnZWFibGVQYWdlcykge1xyXG4gICAgICB0aGlzLnBhZ2VzQ291bnQgPSB0aGlzLnRvdGFsUGFnZXNDb3VudDtcclxuICAgICAgdGhpcy5wYWdlSW5kZXggPSB0aGlzLmN1cnJlbnRQYWdlSW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbml0aWFsaXplTW9iaWxlUGFnZVNpemUoKTtcclxuICAgIHRoaXMubW9iaWxlRGlzcGxheWVkSXRlbXMgPSB0aGlzLnBhZ2VTaXplO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc01vYmlsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8PSA3Njg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVNb2JpbGVQYWdlU2l6ZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzTW9iaWxlKCkgJiYgdGhpcy5wYWdlU2l6ZSA+IHRoaXMubW9iaWxlUGFnZVNpemUpIHtcclxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMubW9iaWxlUGFnZVNpemU7XHJcbiAgICAgIGlmICh0aGlzLnJlcG9ydFJlcXVlc3Q/LmZpbHRlclJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMubW9iaWxlUGFnZVNpemU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uUGFnZUNoYW5nZShldmVudDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmRleCA9IGV2ZW50O1xyXG4gICAgdGhpcy5nZXROZXh0KHRoaXMucGFnZUluZGV4IC0gMSk7XHJcbiAgICBpZiAodGhpcy5tYW5hZ2VhYmxlUGFnZXMpIHtcclxuICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQodGhpcy5wYWdlSW5kZXgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGV4dHJhY3RGaWVsZE5hbWUoZWxlbWVudDogYW55LCBwcm9wZXJ0eTogc3RyaW5nKSB7XHJcbiAgICBpZiAocHJvcGVydHk/LmluY2x1ZGVzKCcuJykpIHtcclxuICAgICAgcmV0dXJuIHByb3BlcnR5LnNwbGl0KCcuJykucmVkdWNlKChhY2MsIHBhcnQpID0+IGFjYyAmJiBhY2NbcGFydF0sIGVsZW1lbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgYyA9IHRoaXMuY29sdW1ucy5maW5kKGMgPT4gYy5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpO1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50W3Byb3BlcnR5XSkgJiYgYy5hcnJheVN1YlByb3BlcnR5ICkge1xyXG4gICAgICAgIGNvbnN0IGZpZWxkVmFsdWVzID0gZWxlbWVudFtwcm9wZXJ0eV0ubWFwKGYgPT4gZltjLmFycmF5U3ViUHJvcGVydHldKTtcclxuICAgICAgICByZXR1cm4gIGZpZWxkVmFsdWVzLmpvaW4oJywgJyk7XHJcbiAgICAgIH1lbHNlIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudFtwcm9wZXJ0eV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCB2aXNpYmxlQ29sdW1ucygpIHtcclxuICAgIHRoaXMuYnVpbGRHcm91cHMoKVxyXG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi52aXNpYmxlKS5tYXAoY29sdW1uID0+IGNvbHVtbi5wcm9wZXJ0eSk7XHJcbiAgfVxyXG5cclxuICBnZXQgdmlzaWJsZUNvbHVtbnNBcnJheSgpIHtcclxuICAgIHJldHVybiB0aGlzLnZpc2libGVDb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29sdW1uKHByb3BlcnR5OiBzdHJpbmcpOiBUYWJsZUNvbHVtbjxhbnk+IHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmluZChjID0+IGMucHJvcGVydHkgPT09IHByb3BlcnR5KTtcclxuICB9XHJcblxyXG4gIGdldFNvcnREaXJlY3Rpb24ocHJvcGVydHk6IHN0cmluZyk6ICdhc2MnIHwgJ2Rlc2MnIHwgJycge1xyXG4gICAgaWYgKHRoaXMucmVwb3J0UmVxdWVzdD8uZmlsdGVyUmVxdWVzdD8uc29ydEtleSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3Quc29ydERpcmVjdGlvbiA9PT0gJ0FTQycgPyAnYXNjJyA6ICdkZXNjJztcclxuICAgIH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIGhhbmRsZVNvcnRDbGljayhwcm9wZXJ0eTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBDT0xVTU4gPSB0aGlzLmdldENvbHVtbihwcm9wZXJ0eSk7XHJcbiAgICBpZiAoIUNPTFVNTiB8fCAhQ09MVU1OLmVuYWJsZVNvcnRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IENVUlJFTlRfRElSRUNUSU9OID0gdGhpcy5nZXRTb3J0RGlyZWN0aW9uKHByb3BlcnR5KTtcclxuICAgIGxldCBORVdfRElSRUNUSU9OOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnO1xyXG5cclxuICAgIGlmIChDVVJSRU5UX0RJUkVDVElPTiA9PT0gJ2FzYycpIHtcclxuICAgICAgTkVXX0RJUkVDVElPTiA9ICdkZXNjJztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9uU29ydEFjdGlvbih7XHJcbiAgICAgIGFjdGl2ZTogcHJvcGVydHksXHJcbiAgICAgIGRpcmVjdGlvbjogTkVXX0RJUkVDVElPTlxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvblNvcnRIZWFkZXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBjb2x1bW5Qcm9wOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5nZXRDb2x1bW4oY29sdW1uUHJvcCk/LmVuYWJsZVNvcnRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkgPT09ICcgJykge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLmhhbmRsZVNvcnRDbGljayhjb2x1bW5Qcm9wKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBhcmlhLXNvcnQgb24gc29ydGFibGUgY29sdW1uIGhlYWRlcnMgKFdDQUcgdGFibGUgc2VtYW50aWNzKS4gKi9cclxuICBnZXRDb2x1bW5BcmlhU29ydChjb2x1bW5Qcm9wOiBzdHJpbmcpOiAnYXNjZW5kaW5nJyB8ICdkZXNjZW5kaW5nJyB8ICdub25lJyB8IG51bGwge1xyXG4gICAgaWYgKCF0aGlzLmdldENvbHVtbihjb2x1bW5Qcm9wKT8uZW5hYmxlU29ydGluZykge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IGQgPSB0aGlzLmdldFNvcnREaXJlY3Rpb24oY29sdW1uUHJvcCk7XHJcbiAgICBpZiAoZCA9PT0gJ2FzYycpIHtcclxuICAgICAgcmV0dXJuICdhc2NlbmRpbmcnO1xyXG4gICAgfVxyXG4gICAgaWYgKGQgPT09ICdkZXNjJykge1xyXG4gICAgICByZXR1cm4gJ2Rlc2NlbmRpbmcnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICdub25lJztcclxuICB9XHJcblxyXG4gIG9uRGVmYXVsdENlbGxMaW5rS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgcm93OiB1bmtub3duKTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQua2V5ICE9PSAnRW50ZXInICYmIGV2ZW50LmtleSAhPT0gJyAnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuZW1pdFJvdXRlUGFnZShyb3cpO1xyXG4gIH1cclxuXHJcbiAgc29ydFN0YXRlOiBhbnkgPSB7fTtcclxuXHJcbiAgZ2V0TmV4dChwYWdlSW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZUluZGV4ID0gcGFnZUluZGV4O1xyXG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xyXG4gICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gIH1cclxuICBvblBhZ2VTaXplQ2hhbmdlKGV2ZW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMucGFnZVNpemUgPSBldmVudDtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gMTsgLy8gcmVzZXQgdG8gZmlyc3QgcGFnZSBvbiBwYWdlIHNpemUgY2hhbmdlXHJcbiAgICB0aGlzLm1vYmlsZURpc3BsYXllZEl0ZW1zID0gMDtcclxuICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZTtcclxuICAgIHRoaXMuZ2V0TmV4dCgwKTtcclxuICB9XHJcblxyXG4gIG9uTG9hZE1vcmUoaXRlbXNUb0xvYWQ6IG51bWJlcikge1xyXG4gICAgY29uc3QgY3VycmVudERpc3BsYXllZCA9IHRoaXMubW9iaWxlRGlzcGxheWVkSXRlbXMgfHwgdGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoIHx8IHRoaXMucGFnZVNpemU7XHJcbiAgICB0aGlzLnBhZ2VTaXplID0gTWF0aC5taW4oY3VycmVudERpc3BsYXllZCArIGl0ZW1zVG9Mb2FkLCB0aGlzLnRvdGFsRWxlbWVudHMpO1xyXG4gICAgdGhpcy5tb2JpbGVEaXNwbGF5ZWRJdGVtcyA9IHRoaXMucGFnZVNpemU7XHJcbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XHJcbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlSW5kZXggPSAwO1xyXG4gICAgdGhpcy5wYWdlSW5kZXggPSAxO1xyXG4gICAgdGhpcy5sb2FkRGF0YSh0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZERhdGEoc2tpcE1vYmlsZVJlc2V0OiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcclxuXHJcbiAgICBpZiAoIXNraXBNb2JpbGVSZXNldCkge1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVNb2JpbGVQYWdlU2l6ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QpIHtcclxuICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QgPSBuZXcgRmlsdGVyUmVxdWVzdCh0aGlzLnBhZ2VTaXplIHx8IHRoaXMucGFnZUluZm8ucGFnZVNpemUpO1xyXG4gICAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5zZWFyY2hTdHIgPSB0aGlzLnNlYXJjaFN0cjtcclxuICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QuZmlsdGVycyA9IFtcclxuICAgICAgICAuLi4odGhpcy5hZHZhbmNlZEFwcGxpZWRGaWx0ZXIgfHwgW10pLFxyXG4gICAgICAgIC4uLih0aGlzLmZpbHRlcnMgfHwgW10pLmZpbHRlcihmID0+XHJcbiAgICAgICAgICAhKHRoaXMuYWR2YW5jZWRBcHBsaWVkRmlsdGVyIHx8IFtdKS5zb21lKGEgPT4gYS5maWVsZCA9PT0gZi5maWVsZE5hbWUpXHJcbiAgICAgICAgKVxyXG4gICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZTtcclxuICAgIGlmICh0aGlzLnNlcGFyYXRlRW5kcG9pbnREYXRhIHx8ICF0aGlzLnBhZ2VJbmZvLmFwaVVyaSB8fCB0aGlzLnBhZ2VJbmZvLmFwaVVyaS5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLnNlcGFyYXRlRW5kcG9pbnREYXRhO1xyXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLmFubm91bmNlVGFibGVSZXN1bHRzKCkpO1xyXG4gICAgfSBlbHNlIGlmKHRoaXMucmVwb3J0UmVxdWVzdCA9PSB1bmRlZmluZWQpe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2UgaWYoIXRoaXMubWFuYWdlYWJsZVBhZ2VzKSAge1xyXG4gICAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XHJcbiAgICAgICAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5jb2x1bW5zID0gdGhpcy5jb2x1bW5zPy5maWx0ZXIoYyA9PiBGUk9OVF9FTkRfQ09MVU1OX1RZUEVTLmluZGV4T2YoYy50eXBlKSA8IDAgKS5tYXAoYyA9PiBjLnByb3BlcnR5KSB8fCBbXTtcclxuICAgICAgICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBlbmRpbmdQYWdlID0gdGhpcy5pc1BlbmRpbmc7XHJcbiAgICAgICAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5zZWFyY2hTdHIgPSB0aGlzLnNlYXJjaFN0cjtcclxuICAgICAgICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LmZpbHRlcnMgPSBbXHJcbiAgICAgICAgICAgIC4uLih0aGlzLmFkdmFuY2VkQXBwbGllZEZpbHRlciB8fCBbXSksXHJcbiAgICAgICAgICAgIC4uLih0aGlzLmZpbHRlcnMgfHwgW10pLmZpbHRlcihmID0+XHJcbiAgICAgICAgICAgICAgISh0aGlzLmFkdmFuY2VkQXBwbGllZEZpbHRlciB8fCBbXSkuc29tZShhID0+IGEuZmllbGQgPT09IGYuZmllbGROYW1lKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICBdO1xyXG4gICAgICAgICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmdldEl0ZW1zQnlGaWx0ZXIodGhpcy5yZXBvcnRSZXF1ZXN0Py5maWx0ZXJSZXF1ZXN0LCB0aGlzLnBhZ2VJbmZvLmFwaVVyaSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRW52ZWxvcGUgPSBuZXcgUmVzcG9uc2VFbnZlbG9wKHJlc3ApO1xyXG4gICAgICAgICAgICAgIGlmIChyZXNwb25zZUVudmVsb3BlLnZhbGlkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvdGFsUmVxdWlyZWRDb3VudEl0ZW0gPSB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ub0RhdGFGb3VuZCA9IHJlc3BvbnNlRW52ZWxvcGUuYm9keS5sZW5ndGggPCAxO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSByZXNwb25zZUVudmVsb3BlLmJvZHk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmlzRW1wdHlJdGVtcyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCA8PSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b3RhbEVsZW1lbnRzID0gcmVzcG9uc2VFbnZlbG9wZS50b3RhbFNpemUgfHwgMDtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFnZXNDb3VudCA9IE1hdGguY2VpbCh0aGlzLnRvdGFsRWxlbWVudHMgLyB0aGlzLnBhZ2VTaXplKSB8fCAxO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlSW5kZXggPSAodGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QucGFnZUluZGV4IHx8IDApICsgMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnRvdGFsSXRlbXMgPSByZXNwb25zZUVudmVsb3BlLnRvdGFsU2l6ZSB8fCAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuY3VycmVudFBhZ2UgPSB0aGlzLnBhZ2VJbmRleCArIDE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vYmlsZURpc3BsYXllZEl0ZW1zID0gdGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5hbm5vdW5jZVRhYmxlUmVzdWx0cygpKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLCAzMDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhbm5vdW5jZVRhYmxlUmVzdWx0cygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLmRhdGFTb3VyY2U/LmRhdGE/Lmxlbmd0aCA/PyAwO1xyXG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnRvdGFsRWxlbWVudHMgPz8gdmlzaWJsZTtcclxuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQkFTRV9UQUJMRS5yZXN1bHRzQW5ub3VuY2VtZW50Jywge1xyXG4gICAgICB2aXNpYmxlLFxyXG4gICAgICB0b3RhbCxcclxuICAgIH0pO1xyXG4gICAgdm9pZCB0aGlzLmxpdmVBbm5vdW5jZXIuYW5ub3VuY2UobWVzc2FnZSwgJ3BvbGl0ZScpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RhdHVzRGVzY3JpcHRpb24oZWxlbWVudDogYW55KSB7XHJcbiAgICByZXR1cm4gdGhpcy5iYWNrZW5kU2VydmljZS5nZXRTdGF0dXNEZXNjcmlwdGlvbihlbGVtZW50LCB0aGlzLnVzZWRXb3JrZmxvdyk7XHJcbiAgfVxyXG5cclxuICBnZXRTdGF0ZVR5cGUoZWxlbWVudDogYW55KSB7XHJcbiAgICByZXR1cm4gZWxlbWVudC5zdGF0ZVR5cGVcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzW1wiY3VzdG9taXplZERhdGFcIl0gJiYgIWNoYW5nZXNbXCJjdXN0b21pemVkRGF0YVwiXS5pc0ZpcnN0Q2hhbmdlKCkpIHtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBjaGFuZ2VzW1wiY3VzdG9taXplZERhdGFcIl0uY3VycmVudFZhbHVlPy5kYXRhIHx8IFtdOyAgLy8gVXBkYXRlIGRhdGEgc291cmNlIHdpdGggbmV3IGRhdGFcclxuICAgICAgdGhpcy5wYWdlc0NvdW50PXRoaXMudG90YWxQYWdlc0NvdW50O1xyXG4gICAgICB0aGlzLnBhZ2VJbmRleD10aGlzLmN1cnJlbnRQYWdlSW5kZXg7XHJcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuYW5ub3VuY2VUYWJsZVJlc3VsdHMoKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1tcImVuZm9yY2VSZWZyZXNoXCJdICYmICFjaGFuZ2VzW1wiZW5mb3JjZVJlZnJlc2hcIl0uaXNGaXJzdENoYW5nZSgpKSB7XHJcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzW1wiaXNQZW5kaW5nXCJdICYmICFjaGFuZ2VzW1wiaXNQZW5kaW5nXCJdLmlzRmlyc3RDaGFuZ2UoKSkge1xyXG4gICAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldENyb3BwZWRUZXh0KGVsZW1lbnRWYWx1ZTogYW55LCBzdWJXaWR0aDogbnVtYmVyID0gMjApIHtcclxuICAgIHJldHVybiBlbGVtZW50VmFsdWUgJiYgZWxlbWVudFZhbHVlLmxlbmd0aCA+IHN1YldpZHRoID8gZWxlbWVudFZhbHVlLnN1YnN0cmluZygwLCBzdWJXaWR0aCkgKyBcIi4uLlwiIDogZWxlbWVudFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZW1pdEV2ZW50KGVsZW1lbnQ6IGFueSkge1xyXG4gICAgdGhpcy5zaG93RGlhbG9nLmVtaXQoZWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBleHRyYWN0Rm9ybWF0KGNvbHVtbjogVGFibGVDb2x1bW48YW55Pikge1xyXG4gICAgcmV0dXJuIGNvbHVtbj8uZm9ybWF0IHx8ICdkL00veXl5eSwgaDptbSBhJztcclxuICB9XHJcblxyXG4gIGFjdGlvbkxpc3RDbGlja2VkKGxpc3RBY3Rpb246IEJ1dHRvbkFjdGlvblNldHRpbmdzLCBlbGVtZW50OiBhbnkpIHtcclxuICAgIHRoaXMubGlzdEFjdGlvbkNsaWNrZWQuZW1pdCh7YWN0aW9uOmxpc3RBY3Rpb24sIHJvdzogZWxlbWVudCwgaXNQZW5kaW5nOiB0aGlzLmlzUGVuZGluZ30pO1xyXG4gIH1cclxuXHJcbiAgaHlwZXJMaW5rQ2xpY2tlZChhY3Rpb25OYW1lOiBzdHJpbmcsIGVsZW1lbnQ6IGFueSkge1xyXG4gICAgY29uc3QgYWN0aW9uID0gVEFCTEVfUkVDT1JEX0FDVElPTjtcclxuICAgIGFjdGlvbi5hY3Rpb25LZXkgPSBhY3Rpb25OYW1lO1xyXG4gICAgYWN0aW9uLml0ZW0gPSBlbGVtZW50O1xyXG4gICAgYWN0aW9uLnBhZ2VJbmZvID0gdGhpcy5wYWdlSW5mbztcclxuICAgIHRoaXMuaHlwZXJMaW5rQWN0aW9uLmVtaXQoYWN0aW9uKVxyXG4gIH1cclxuXHJcblxyXG4gIGVtaXRSb3V0ZVBhZ2UoZWxlbWVudDogYW55KXtcclxuICAgIHRoaXMuY2xpY2tSb3V0ZVBhZ2UuZW1pdChlbGVtZW50KTtcclxuICB9XHJcblxyXG4gIG9uU2VsZWN0SXRlbShyb3c6IGFueSkge1xyXG4gICAgaWYgKHRoaXMucGFnZUluZm8uc2VsZlJvdXRpbmcpIHtcclxuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuaXNQZW5kaW5nID8gJ3BlbmRpbmcnIDogJ3ZpZXcnO1xyXG4gICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnBhZ2VJbmZvLmxpc3RSb3V0ZVBhdGggfHwgdGhpcy5yb3V0ZXIudXJsfS92aWV3YDtcclxuXHJcbiAgICAgIGNvbnN0IGVuY3J5cHRlZElkID0gdGhpcy5iYWNrZW5kU2VydmljZS5lbmNyeXB0KFN0cmluZyhyb3cuaWQpKTtcclxuICAgICAgY29uc3QgZW5jcnlwdGVkTW9kZSA9IHRoaXMuYmFja2VuZFNlcnZpY2UuZW5jcnlwdChtb2RlKTtcclxuXHJcbiAgICAgIGNvbnN0IGVuY3J5cHRlZFJvdyA9IHRoaXMuYmFja2VuZFNlcnZpY2UuZW5jcnlwdChKU09OLnN0cmluZ2lmeShyb3cpKTtcclxuXHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt1cmxdLCB7XHJcbiAgICAgICAgcXVlcnlQYXJhbXM6IHsgdG9rZW46IGVuY3J5cHRlZElkLCBtb2RlOiBlbmNyeXB0ZWRNb2RlIH0sXHJcbiAgICAgICAgc3RhdGU6IHsgcmF3OiBlbmNyeXB0ZWRSb3cgfSxcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIGNvbnN0IGFjdGlvbiA9IFNFTEVDVF9SRUNPUkRfQUNUSU9OO1xyXG4gICAgLy8gYWN0aW9uLmlkID0gcm93Py5pZDtcclxuICAgIC8vIGFjdGlvbi5pdGVtID0gcm93O1xyXG4gICAgLy8gdGhpcy51c2VyQWN0aW9uLmVtaXQoYWN0aW9uKVxyXG4gIH1cclxuXHJcbiAgb3Blbk5ld1RhYihyb3cpIHtcclxuICAgIGlmICghdGhpcy5wYWdlSW5mby5lbWJlZGVkVGFibGVPbmx5KSB7XHJcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLmlzUGVuZGluZyA/ICdwZW5kaW5nJyA6ICd2aWV3JztcclxuICAgICAgd2luZG93Lm9wZW4oYCR7dGhpcy5wYWdlSW5mby5saXN0Um91dGVQYXRofS8ke21vZGV9YCArICcvJyArIHJvdz8uaWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25WaWV3TW9kZUNoYW5nZWRSZWNlaXZlZChpc1BlbmRpbmc6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuc3dpdGNoVmlld01vZGUoaXNQZW5kaW5nKTtcclxuICB9XHJcblxyXG4gIHN3aXRjaFZpZXdNb2RlKGlzUGVuZGluZzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5pc1BlbmRpbmcgPSBpc1BlbmRpbmc7XHJcbiAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgfVxyXG5cclxuICBvbkFkZE5ld0FjdGlvbigkZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5wYWdlSW5mby5saXN0Um91dGVQYXRoIHx8IHRoaXMucm91dGVyLnVybH0vdmlld2A7XHJcbiAgICBjb25zdCBlbmNyeXB0ZWRJZCA9IHRoaXMuYmFja2VuZFNlcnZpY2UuZW5jcnlwdChcIi0xXCIpO1xyXG4gICAgY29uc3QgZW5jcnlwdGVkTW9kZSA9IHRoaXMuYmFja2VuZFNlcnZpY2UuZW5jcnlwdChcInBlbmRpbmdcIik7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYCR7dXJsfWBdLFxyXG4gICAgICB7IHF1ZXJ5UGFyYW1zOiB7IHRva2VuOiBlbmNyeXB0ZWRJZCAsIG1vZGUgOiBlbmNyeXB0ZWRNb2RlIH0gfSk7XHJcblxyXG4gICAgLy8gY29uc3QgYWN0aW9uID0gU0VMRUNUX1JFQ09SRF9BQ1RJT047XHJcbiAgICAvLyBhY3Rpb24uaWQgPSByb3c/LmlkO1xyXG4gICAgLy8gYWN0aW9uLml0ZW0gPSByb3c7XHJcbiAgICAvLyB0aGlzLnVzZXJBY3Rpb24uZW1pdChhY3Rpb24pXHJcbiAgfVxyXG5cclxuICBzaG93QWRkTmV3KCkge1xyXG4gICAgcmV0dXJuIHRoaXMucGFnZUluZm8uaGFzQWRkQnV0dG9uIDtcclxuICB9XHJcblxyXG4gIG9uRXh0cmFCdXR0aW9uQWN0aW9uKCRldmVudDogYW55KSB7XHJcbiAgICB0aGlzLmV4dHJhQWN0aW9uLmVtaXQoJGV2ZW50KTtcclxuXHJcbiAgfVxyXG5cclxuICBoYXNHcm91cHMoKSB7XHJcbiAgICBsZXQgYiA9IHRoaXMuY29sdW1ucy5maW5kSW5kZXgocCA9PiBwLmdyb3VwKTtcclxuICAgIHJldHVybiBiID49IDA7XHJcbiAgfVxyXG4gIGdyb3VwTmFtZXM6IGFueSA9IFtdXHJcbiAgZ3JvdXBTcGFuczogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgYnVpbGRHcm91cHMoKXtcclxuICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICB0aGlzLmdyb3VwTmFtZXMgPSBbXTtcclxuICAgIHRoaXMuZ3JvdXBTcGFucy5jbGVhcigpO1xyXG4gICAgaWYodGhpcy5oYXNHcm91cHMoKSA9PT0gZmFsc2Upe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbHVtbnNcclxuICAgICAgLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLnZpc2libGUgPT09IHRydWUpXHJcbiAgICAgIC5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgICBpZiAoY29sdW1uLmdyb3VwID09PSBcIi1cIikge1xyXG4gICAgICAgICAgdGhpcy5ncm91cE5hbWVzLnB1c2goY291bnQudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICB0aGlzLmluc2VydEluTWFwKGNvdW50KTtcclxuICAgICAgICAgIGNvdW50Kys7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5ncm91cE5hbWVzLmluY2x1ZGVzKGNvbHVtbi5ncm91cCkpIHtcclxuICAgICAgICAgIHRoaXMuZ3JvdXBOYW1lcy5wdXNoKGNvbHVtbi5ncm91cCk7XHJcbiAgICAgICAgICB0aGlzLmluc2VydEluTWFwKGNvbHVtbi5ncm91cCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaW5zZXJ0SW5NYXAoY29sdW1uLmdyb3VwKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBpbnNlcnRJbk1hcChrZXkpe1xyXG4gICAgaWYodGhpcy5ncm91cFNwYW5zLmhhcyhrZXkpKXtcclxuICAgICAgdGhpcy5ncm91cFNwYW5zLnNldChrZXkudG9TdHJpbmcoKSwgdGhpcy5ncm91cFNwYW5zLmdldChrZXkpICsgMSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmdyb3VwU3BhbnMuc2V0KGtleS50b1N0cmluZygpLCAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzSHVtYW5NYWRlKHN0cil7XHJcbiAgICByZXR1cm4gaXNOYU4oc3RyKTtcclxuICB9XHJcblxyXG4gIGFjdGlvbkJ1dHRvbkNsaWNrZWQoYWN0aW9uS2V5OiBzdHJpbmcsIGl0ZW06IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGFjdGlvbktleSA9PT0gJ25hdmlnYXRlJykge1xyXG4gICAgICB0aGlzLmhhbmRsZU5hdmlnYXRlQWN0aW9uKGl0ZW0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbWl0VGFibGVBY3Rpb24oYWN0aW9uS2V5LCBpdGVtKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlTmF2aWdhdGVBY3Rpb24oaXRlbTogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBtb2RlID0gdGhpcy5pc1BlbmRpbmcgPyAncGVuZGluZycgOiAndmlldyc7XHJcbiAgICBjb25zdCBiYXNlUGF0aCA9IHRoaXMucGFnZUluZm8ubGlzdFJvdXRlUGF0aCB8fCB0aGlzLnJvdXRlci51cmw7XHJcbiAgICBjb25zdCB1cmwgPSBgJHtiYXNlUGF0aH0vdmlld2A7XHJcblxyXG4gICAgY29uc3QgZW5jcnlwdGVkSWQgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmVuY3J5cHQoaXRlbS5pZC50b1N0cmluZygpKTtcclxuICAgIGNvbnN0IGVuY3J5cHRlZE1vZGUgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmVuY3J5cHQobW9kZSk7XHJcblxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3VybF0sIHtcclxuICAgICAgcXVlcnlQYXJhbXM6IHsgdG9rZW46IGVuY3J5cHRlZElkLCBtb2RlOiBlbmNyeXB0ZWRNb2RlIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbWl0VGFibGVBY3Rpb24oYWN0aW9uS2V5OiBzdHJpbmcsIGl0ZW06IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgYWN0aW9uID0gVEFCTEVfUkVDT1JEX0FDVElPTjtcclxuICAgIGFjdGlvbi5hY3Rpb25LZXkgPSBhY3Rpb25LZXk7XHJcbiAgICBhY3Rpb24uaXRlbSA9IGl0ZW07XHJcbiAgICBhY3Rpb24ucGFnZUluZm8gPSB0aGlzLnBhZ2VJbmZvO1xyXG4gICAgdGhpcy51c2VyQWN0aW9uLmVtaXQoYWN0aW9uKTtcclxuICB9XHJcblxyXG4gIGV4dHJhY3RSZXBvcnQocmVwb3J0VHlwZTogYW55KSB7XHJcbiAgICBjb25zdCBteUZpbHRlcnMgPSB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdDtcclxuICAgIGNvbnN0IHJlcG9ydFJlcXVlc3QgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmJ1aWxkUmVwb3J0UmVxdWVzdCh0aGlzLmNvbHVtbnMsIHRoaXMucGFnZUluZm8ubGFiZWxzU2VjdGlvbiArICcubGlzdF90aXRsZScsXHJcbiAgICAgIG15RmlsdGVycywgcmVwb3J0VHlwZSwgdGhpcy5wYWdlSW5mbywgdGhpcy5zZWFyY2hTdHIsICdMQU5EU0NBUEUnKTtcclxuICAgIHRoaXMuYmFja2VuZFNlcnZpY2UuZG93bmxvYWRSZXBvcnQocmVwb3J0UmVxdWVzdCwgdGhpcy5wYWdlSW5mby5hcGlVcmkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SWNvbihzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKHN0YXR1cykge1xyXG4gICAgICBjYXNlICdwYXNzJzogcmV0dXJuICdjaGVja19jaXJjbGUnO1xyXG4gICAgICBjYXNlICd3YXJuaW5nJzogcmV0dXJuICd3YXJuaW5nJztcclxuICAgICAgY2FzZSAnZXJyb3InOiByZXR1cm4gJ2Vycm9yJztcclxuICAgICAgZGVmYXVsdDogcmV0dXJuICdoZWxwJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEljb25BcmlhTGFiZWxLZXkoc3RhdHVzOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoIChzdGF0dXMpIHtcclxuICAgICAgY2FzZSAncGFzcyc6XHJcbiAgICAgICAgcmV0dXJuICdCQVNFX1RBQkxFLnN0YXR1c0ljb25QYXNzJztcclxuICAgICAgY2FzZSAnd2FybmluZyc6XHJcbiAgICAgICAgcmV0dXJuICdCQVNFX1RBQkxFLnN0YXR1c0ljb25XYXJuaW5nJztcclxuICAgICAgY2FzZSAnZXJyb3InOlxyXG4gICAgICAgIHJldHVybiAnQkFTRV9UQUJMRS5zdGF0dXNJY29uRXJyb3InO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAnQkFTRV9UQUJMRS5zdGF0dXNJY29uVW5rbm93bic7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRPbk9mZkZsYWdBcmlhTGFiZWxLZXkodmFsdWU6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xyXG4gICAgICByZXR1cm4gJ0JBU0VfVEFCTEUuc3RhdHVzRmxhZ0FjdGl2ZSc7XHJcbiAgICB9XHJcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiAnQkFTRV9UQUJMRS5zdGF0dXNGbGFnSW5hY3RpdmUnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICdCQVNFX1RBQkxFLnN0YXR1c0ZsYWdQZW5kaW5nJztcclxuICB9XHJcblxyXG4gIGFjdGlvbkNoZWNrZWRDbGlja2VkKHByb3BlcnR5OiBzdHJpbmcsIGVsZW1lbnQpIHtcclxuICAgIGVsZW1lbnRbcHJvcGVydHldPSAhZWxlbWVudFtwcm9wZXJ0eV07XHJcbiAgICB0aGlzLmFjdGlvbkJ1dHRvbkNsaWNrZWQocHJvcGVydHksIGVsZW1lbnQpO1xyXG4gIH1cclxuXHJcblxyXG4gIGlzRGFya0hpZ2hsaWdodChyb3c6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZ3JvdXBCeVByb3AgPSB0aGlzLnBhZ2VJbmZvPy5ncm91cEJ5UHJvcGVydHk7XHJcbiAgICBjb25zdCBncm91cEJ5VmFsdWVzID0gdGhpcy5wYWdlSW5mbz8uZ3JvdXBCeVZhbHVlO1xyXG5cclxuICAgIGlmICghZ3JvdXBCeVByb3AgfHwgIWdyb3VwQnlWYWx1ZXMgfHwgIXJvd1tncm91cEJ5UHJvcF0pIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNlbGxWYWx1ZSA9IHJvd1tncm91cEJ5UHJvcF0udG9TdHJpbmcoKTtcclxuXHJcbiAgICByZXR1cm4gZ3JvdXBCeVZhbHVlcy5zb21lKHZhbCA9PlxyXG4gICAgICBjZWxsVmFsdWUuaW5jbHVkZXModmFsKSAmJiBjZWxsVmFsdWUubGVuZ3RoID4gdmFsLmxlbmd0aFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHNob3VsZFJlbmRlckFzSHlwZXJMaW5rKGVsZW1lbnQ6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZ3JvdXBCeVByb3AgPSB0aGlzLnBhZ2VJbmZvPy5ncm91cEJ5UHJvcGVydHk7XHJcbiAgICBjb25zdCBncm91cEJ5VmFsdWVzID0gdGhpcy5wYWdlSW5mbz8uZ3JvdXBCeVZhbHVlO1xyXG5cclxuICAgIGlmICghZ3JvdXBCeVByb3AgfHwgIWdyb3VwQnlWYWx1ZXMgfHwgIWVsZW1lbnRbZ3JvdXBCeVByb3BdKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnRbZ3JvdXBCeVByb3BdLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgcmV0dXJuICFncm91cEJ5VmFsdWVzLnNvbWUodiA9PiB2YWx1ZS5pbmNsdWRlcyh2KSAmJiB2YWx1ZS5sZW5ndGggPj0gdi5sZW5ndGgpO1xyXG4gIH1cclxuXHJcblxyXG4gIG9uU29ydEFjdGlvbigkZXZlbnQ6IFNvcnQpIHtcclxuICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sdW1ucy5maW5kKGMgPT4gYy5wcm9wZXJ0eSA9PT0gJGV2ZW50LmFjdGl2ZSk7XHJcblxyXG4gICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3Quc29ydEtleSA9XHJcbiAgICAgICRldmVudC5hY3RpdmUgJiYgJGV2ZW50LmRpcmVjdGlvblxyXG4gICAgICAgID8gKGNvbD8uc29ydEtleSA/PyAkZXZlbnQuYWN0aXZlKVxyXG4gICAgICAgIDogJ2lkJztcclxuXHJcbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5zb3J0RGlyZWN0aW9uID0gJGV2ZW50LmRpcmVjdGlvbiA9PT0gJ2FzYycgPyAnQVNDJyA6ICdERVNDJztcclxuICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleCA9IDA7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW4uZW1pdCgkZXZlbnQpO1xyXG4gICAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgfVxyXG5cclxuICBzaG91bGRTaG93QnV0dG9uKGVsZW1lbnQ6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZ3JvdXBCeVByb3AgPSB0aGlzLnBhZ2VJbmZvPy5ncm91cEJ5UHJvcGVydHk7XHJcbiAgICBjb25zdCBncm91cEJ5VmFsdWVzID0gdGhpcy5wYWdlSW5mbz8uZ3JvdXBCeVZhbHVlO1xyXG5cclxuICAgIGlmICghZ3JvdXBCeVByb3AgfHwgIWdyb3VwQnlWYWx1ZXMgfHwgIWVsZW1lbnRbZ3JvdXBCeVByb3BdKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudFtncm91cEJ5UHJvcF0udG9TdHJpbmcoKTtcclxuXHJcbiAgICByZXR1cm4gIWdyb3VwQnlWYWx1ZXMuc29tZSh2ID0+IHZhbHVlLmluY2x1ZGVzKHYpICYmIHZhbHVlLmxlbmd0aCA+PSB2Lmxlbmd0aCk7XHJcbiAgfVxyXG5cclxuICBzdG9yZVBlbmRpbmdGaWx0ZXJzKCRldmVudDogeyBmaWx0ZXJzOiBGaWVsZEZpbHRlcltdLCBzZWFyY2hTdHI6IHN0cmluZyB9KTogdm9pZCB7XHJcbiAgICB0aGlzLnBlbmRpbmdGaWx0ZXJzID0gJGV2ZW50LmZpbHRlcnMgfHwgW107XHJcbiAgICAgIHRoaXMuc2VhcmNoU3RyID0gJGV2ZW50LnNlYXJjaFN0cjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRQYWdpbmF0aW9uRm9yRmlsdGVyQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdCkge1xyXG4gICAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdCA9IG5ldyBGaWx0ZXJSZXF1ZXN0KHRoaXMucGFnZVNpemUgfHwgdGhpcy5wYWdlSW5mby5wYWdlU2l6ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlSW5kZXggPSAwO1xyXG4gICAgdGhpcy5wYWdlSW5kZXggPSAxO1xyXG4gICAgaWYgKHRoaXMubWFuYWdlYWJsZVBhZ2VzKSB7XHJcbiAgICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KHRoaXMucGFnZUluZGV4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFwcGx5UGVuZGluZ0ZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFkdmFuY2VkQXBwbGllZEZpbHRlciA9IHRoaXMucGVuZGluZ0ZpbHRlcnMgfHwgW107XHJcbiAgICB0aGlzLnJlc2V0UGFnaW5hdGlvbkZvckZpbHRlckNoYW5nZSgpO1xyXG4gICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRmlsdGVyRW1wdHkoJGV2ZW50OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoJGV2ZW50KSB7XHJcbiAgICAgIHRoaXMucGVuZGluZ0ZpbHRlcnMgPSBbXTtcclxuICAgICAgdGhpcy5hZHZhbmNlZEFwcGxpZWRGaWx0ZXIgPSBbXTtcclxuICAgICAgdGhpcy5zZWFyY2hTdHIgPSAnJztcclxuICAgICAgdGhpcy5yZXNldFBhZ2luYXRpb25Gb3JGaWx0ZXJDaGFuZ2UoKTtcclxuICAgICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXREYXRhKCRldmVudDogYm9vbGVhbikge1xyXG4gICAgaWYgKCRldmVudCkge1xyXG4gICAgICB0aGlzLmFkdmFuY2VkQXBwbGllZEZpbHRlciA9IFtdO1xyXG4gICAgICB0aGlzLnBlbmRpbmdGaWx0ZXJzID0gW107XHJcbiAgICAgIHRoaXMucmVzZXRQYWdpbmF0aW9uRm9yRmlsdGVyQ2hhbmdlKCk7XHJcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcclxuICAgICAgLy8gdGhpcy5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYXNGaWx0ZXJzQXBwbGllZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodGhpcy5hZHZhbmNlZEFwcGxpZWRGaWx0ZXIgJiYgdGhpcy5hZHZhbmNlZEFwcGxpZWRGaWx0ZXIubGVuZ3RoID4gMCkgfHxcclxuICAgICAgICAgICAodGhpcy5maWx0ZXJzICYmIHRoaXMuZmlsdGVycy5sZW5ndGggPiAwKSB8fFxyXG4gICAgICAgICAgICh0aGlzLnBlbmRpbmdGaWx0ZXJzICYmIHRoaXMucGVuZGluZ0ZpbHRlcnMubGVuZ3RoID4gMCk7XHJcbiAgfVxyXG5cclxuICBnZXREaXNwbGF5U3ZnUGF0aCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuaGFzRmlsdGVyc0FwcGxpZWQoKSAmJiB0aGlzLm5vUmVzdWx0U3ZnUGF0aCA/IHRoaXMubm9SZXN1bHRTdmdQYXRoIDogdGhpcy5ub0RhdGFGb3VuZFN2Z1BhdGg7XHJcbiAgfVxyXG5cclxuICBnZXREaXNwbGF5VGl0bGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmhhc0ZpbHRlcnNBcHBsaWVkKCkgJiYgdGhpcy5ub1Jlc3VsdFN2Z1BhdGggPyB0aGlzLm5vUmVzdWx0VGl0bGUgOiB0aGlzLm5vRGF0YUZvdW5kVGl0bGU7XHJcbiAgfVxyXG5cclxuICBnZXREaXNwbGF5U3VidGl0bGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmhhc0ZpbHRlcnNBcHBsaWVkKCkgJiYgdGhpcy5ub1Jlc3VsdFN2Z1BhdGggPyB0aGlzLm5vUmVzdWx0U3VidGl0bGUgOiB0aGlzLm5vRGF0YUZvdW5kU3VidGl0bGU7XHJcbiAgfVxyXG5cclxuICBidXR0b25DbGlja2VkRXZlbnQoJGV2ZW50OiBCdXR0b25BY3Rpb25TZXR0aW5ncykge1xyXG5cclxuICB9XHJcblxyXG4gIGdldE1vYmlsZUNhcmRJZENvbHVtbigpOiBUYWJsZUNvbHVtbjxhbnk+IHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmluZChjID0+IGMudmlzaWJsZSAmJiBjLm1vYmlsZUNhcmRJZCA9PT0gdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXRNb2JpbGVDYXJkU3RhdHVzQ29sdW1uKCk6IFRhYmxlQ29sdW1uPGFueT4gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maW5kKGMgPT4gYy52aXNpYmxlICYmIGMubW9iaWxlQ2FyZFN0YXR1cyA9PT0gdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXRNb2JpbGVDYXJkQ29sdW1ucygpOiBUYWJsZUNvbHVtbjxhbnk+W10ge1xyXG4gICAgY29uc3QgaWRDb2wgPSB0aGlzLmdldE1vYmlsZUNhcmRJZENvbHVtbigpO1xyXG4gICAgY29uc3Qgc3RhdHVzQ29sID0gdGhpcy5nZXRNb2JpbGVDYXJkU3RhdHVzQ29sdW1uKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PlxyXG4gICAgICBjLnZpc2libGUgJiZcclxuICAgICAgYy5wcm9wZXJ0eSAhPT0gJ2FjdGlvbnMnICYmXHJcbiAgICAgIGMgIT09IGlkQ29sICYmXHJcbiAgICAgIGMgIT09IHN0YXR1c0NvbFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGxhYmVsS2V5QnlWYWx1ZShjb2x1bW46IFRhYmxlQ29sdW1uPGFueT4gfCB1bmRlZmluZWQsIHJvdzogYW55KTogc3RyaW5nIHtcclxuICAgIGlmICghY29sdW1uIHx8ICFjb2x1bW4ucHJvcGVydHkpIHJldHVybiAnJztcclxuICAgIHJldHVybiBzdXBlci5sYWJlbEtleUJ5VmFsdWUoY29sdW1uLCByb3cpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZmxleC1jb2x1bW4gYmFzZVRhYmxlXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGZsZXgtMTAwXCIgPlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uIGFsaWduLXN0YXJ0IGZsZXgtMTAwXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cclxuICAgICAgPGFwcC10aXRsZS1iYXJcclxuICAgICAgICBbcGFnZVRpdGxlXT1cInBhZ2VJbmZvLmhpZGVUaXRsZSA/ICcnIDogcGFnZUluZm8ubGFiZWxzU2VjdGlvbisnLmxpc3RfdGl0bGUnXCJcclxuICAgICAgICBbc3ViVGl0bGVdPVwiKHBhZ2VJbmZvLmhpZGVUaXRsZSB8fCBwYWdlSW5mby5oaWRlU3VidGl0bGUpID8gJycgOiBwYWdlSW5mby5sYWJlbHNTZWN0aW9uKycuc3VidGl0bGUnXCJcclxuICAgICAgICBbdGl0bGVNb2RlXT1cIicnXCJcclxuICAgICAgICBbcGFnZUluZm9dPVwicGFnZUluZm9cIlxyXG4gICAgICAgIFtuZXdBY3Rpb25dPVwic2hvd0FkZE5ldygpXCJcclxuICAgICAgICBbc2hvd0V4dHJhY3RCdXR0b25dPVwiIXBhZ2VJbmZvLmhpZGVFeHRyYWN0QnV0dG9uXCJcclxuICAgICAgICBbZHJhZnRTdXBwb3J0ZWRdPVwicGFnZUluZm8uZHJhZnRTdXBwb3J0ZWRcIlxyXG4gICAgICAgIFtpc1BlbmRpbmddPVwiaXNQZW5kaW5nXCJcclxuICAgICAgICBbb25WaWV3TW9kZUNoYW5nZV09XCJzd2l0Y2hWaWV3TW9kZS5iaW5kKHRoaXMpXCJcclxuICAgICAgICBbYnV0dG9uc109XCJleHRyYUFjdGlvbnNcIlxyXG4gICAgICAgIFtidXR0b25zRGlzcGxheU1vZGVdPVwiYnV0dG9uc0Rpc3BsYXlNb2RlXCJcclxuICAgICAgICAobmV3QWN0aW9uQ2xpY2tlZCk9XCJvbkFkZE5ld0FjdGlvbigkZXZlbnQpXCJcclxuICAgICAgICAoZXh0cmFjdFJlcG9ydCk9XCJleHRyYWN0UmVwb3J0KCRldmVudClcIlxyXG4gICAgICAgICh2aWV3TW9kZUNoYW5nZWQpPVwib25WaWV3TW9kZUNoYW5nZWRSZWNlaXZlZCgkZXZlbnQpXCJcclxuICAgICAgICAoYnV0dG9uQ2xpY2tlZCk9XCJidXR0b25DbGlja2VkLmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgICAgW3RvdGFsRWxlbWVudHNdPVwicGFnZUluZm8uaGlkZVRpdGxlID8gdW5kZWZpbmVkIDogdG90YWxFbGVtZW50c1wiPlxyXG4gICAgICA8L2FwcC10aXRsZS1iYXI+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImZpbHRlci1yb3dcIiAqbmdJZj1cIiFwYWdlSW5mby5oaWRlQWR2YW5jZWRGaWx0ZXJcIj5cclxuICAgIDxhcHAtZmlsdGVyLWJ1aWxkZXJcclxuICAgICAgKm5nSWY9XCIhcGFnZUluZm8uaGlkZUFkdmFuY2VkRmlsdGVyXCJcclxuICAgICAgW3BhZ2VJbmZvXT1cInBhZ2VJbmZvXCJcclxuICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXHJcbiAgICAgIFtmaWx0ZXJGaWVsZHNdPVwiZmlsdGVyRmllbGRzXCJcclxuICAgICAgW3BlbmRpbmdGaWx0ZXJzXT1cInBlbmRpbmdGaWx0ZXJzXCJcclxuICAgICAgW3Nob3dFeHBvcnRCdXR0b25dPVwiIXBhZ2VJbmZvLmhpZGVFeHRyYWN0QnV0dG9uXCJcclxuICAgICAgKGZpbHRlckluZm9ybWF0aW9uKT1cInN0b3JlUGVuZGluZ0ZpbHRlcnMoJGV2ZW50KVwiXHJcbiAgICAgIChpc0VtcHR5KT1cImhhbmRsZUZpbHRlckVtcHR5KCRldmVudClcIlxyXG4gICAgICAoYXBwbHlGaWx0ZXIpPVwiYXBwbHlQZW5kaW5nRmlsdGVycygpXCJcclxuICAgICAgKHNvcnRCeUNsaWNrZWQpPVwiaGFuZGxlU29ydENsaWNrKCRldmVudClcIlxyXG4gICAgICAoZXhwb3J0Q2xpY2tlZCk9XCJleHRyYWN0UmVwb3J0KCRldmVudClcIj5cclxuICAgIDwvYXBwLWZpbHRlci1idWlsZGVyPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJidXR0b24tZ3JvdXBcIiAqbmdJZj1cIiFwYWdlSW5mby5oaWRlRXh0cmFjdEJ1dHRvblwiPlxyXG4gICAgICA8YnV0dG9uICpuZ0lmPVwiIXBhZ2VJbmZvLmhpZGVFeHRyYWN0QnV0dG9uXCJcclxuICAgICAgICBtYXQtZmxhdC1idXR0b25cclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZXhwb3J0TWVudVwiXHJcbiAgICAgICAgY2xhc3M9XCJidG4tZXhwb3J0XCJcclxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidleHBvcnQnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cInRydWVcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi10ZXh0XCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+ZmlsZV9leHBvcnQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgPHNwYW4+e3sgJ2V4cG9ydCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJhcnJvdy1pY29uXCI+a2V5Ym9hcmRfYXJyb3dfZG93bjwvbWF0LWljb24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPG1hdC1tZW51ICNleHBvcnRNZW51PVwibWF0TWVudVwiPlxyXG4gICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZXh0cmFjdFJlcG9ydCgncGRmJylcIj5QREY8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImV4dHJhY3RSZXBvcnQoJ3hsc3gnKVwiPkV4Y2VsPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJleHRyYWN0UmVwb3J0KCdjc3YnKVwiPkNTVjwvYnV0dG9uPlxyXG4gICAgICA8L21hdC1tZW51PlxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGZsZXgtMTAwIGJhc2VUYWJsZV9fZGV0YWlsc0NvbHVtblwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXgtMTAwXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdyBmbGV4LTEwMCBtYWluVGFibGVcIj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cInRhYmxlLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICByb2xlPVwidGFibGVcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcclxuICAgICAgICAgICAgcGFnZUluZm8ubGFiZWxzU2VjdGlvbiAmJiAhcGFnZUluZm8uaGlkZVRpdGxlXHJcbiAgICAgICAgICAgICAgPyAocGFnZUluZm8ubGFiZWxzU2VjdGlvbiArICcubGlzdF90aXRsZScgfCB0cmFuc2xhdGUpXHJcbiAgICAgICAgICAgICAgOiBudWxsXHJcbiAgICAgICAgICBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXJcIiBbYXR0ci5kYXRhLXNvcnRdPVwic29ydFN0YXRlXCIgcm9sZT1cInJvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2x1bW5Qcm9wIG9mIHZpc2libGVDb2x1bW5zQXJyYXk7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwidGFibGUtaGVhZGVyLWNlbGxcIlxyXG4gICAgICAgICAgICAgICAgIHJvbGU9XCJjb2x1bW5oZWFkZXJcIlxyXG4gICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc29ydF09XCJnZXRDb2x1bW5BcmlhU29ydChjb2x1bW5Qcm9wKVwiXHJcbiAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy5lbmFibGVTb3J0aW5nID8gMCA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgIFtjbGFzcy5zb3J0YWJsZV09XCJnZXRDb2x1bW4oY29sdW1uUHJvcCk/LmVuYWJsZVNvcnRpbmdcIlxyXG4gICAgICAgICAgICAgICAgIFtjbGFzcy5maXJzdC1jZWxsXT1cImkgPT09IDBcIlxyXG4gICAgICAgICAgICAgICAgIFtjbGFzcy5sYXN0LWNlbGxdPVwiaSA9PT0gdmlzaWJsZUNvbHVtbnNBcnJheS5sZW5ndGggLSAxXCJcclxuICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aW9ucy1jZWxsXT1cImkgPT09IHZpc2libGVDb2x1bW5zQXJyYXkubGVuZ3RoIC0gMSAmJiBjb2x1bW5Qcm9wID09PSAnYWN0aW9ucydcIlxyXG4gICAgICAgICAgICAgICAgIFtjbGFzcy5oYXMtd2lkdGhdPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy53aWR0aFwiXHJcbiAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy53aWR0aCA/IHsnd2lkdGgnOiBnZXRDb2x1bW4oY29sdW1uUHJvcCk/LndpZHRoICsgJyUnLCAnZmxleC1iYXNpcyc6IGdldENvbHVtbihjb2x1bW5Qcm9wKT8ud2lkdGggKyAnJSd9IDoge31cIlxyXG4gICAgICAgICAgICAgICAgIChjbGljayk9XCJnZXRDb2x1bW4oY29sdW1uUHJvcCk/LmVuYWJsZVNvcnRpbmcgJiYgaGFuZGxlU29ydENsaWNrKGNvbHVtblByb3ApXCJcclxuICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvblNvcnRIZWFkZXJLZXlkb3duKCRldmVudCwgY29sdW1uUHJvcClcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFibGUtaGVhZGVyLWxhYmVsXCI+e3sgbGFiZWxLZXkoZ2V0Q29sdW1uKGNvbHVtblByb3ApKSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRDb2x1bW4oY29sdW1uUHJvcCk/LmVuYWJsZVNvcnRpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZ2V0U29ydERpcmVjdGlvbihjb2x1bW5Qcm9wKSA9PT0gJ2FzYydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNvcnQtaWNvbiBzb3J0LWFzY1wiPmFycm93X2Ryb3BfdXA8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJnZXRTb3J0RGlyZWN0aW9uKGNvbHVtblByb3ApID09PSAnZGVzYydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNvcnQtaWNvbiBzb3J0LWRlc2NcIj5hcnJvd19kcm9wX2Rvd248L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWJvZHlcIiByb2xlPVwicm93Z3JvdXBcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIGRhdGFTb3VyY2UuZGF0YTsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwidGFibGUtcm93XCJcclxuICAgICAgICAgICAgICAgICByb2xlPVwicm93XCJcclxuICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCIndGFibGUtcm93LScgKyAocm93Py5pZCB8fCByb3c/LmtleSB8fCAnJylcIlxyXG4gICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICd0YWJsZS1yb3ctLWhpZ2hsaWdodCc6IHNlbGVjdGVkUm93SW5kZXggPT0gcm93LmlkIHx8IChwYWdlSW5mby5ncm91cEJ5UHJvcGVydHkgJiYgcGFnZUluZm8uZ3JvdXBCeVZhbHVlPy5pbmNsdWRlcyhyb3dbcGFnZUluZm8uZ3JvdXBCeVByb3BlcnR5XSkpLFxyXG4gICAgICAgICAgICAgICAgICAgJ3RhYmxlLXJvdy0tZGFyay1oaWdobGlnaHQnOiBpc0RhcmtIaWdobGlnaHQocm93KVxyXG4gICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgIChhdXhjbGljayk9XCJvcGVuTmV3VGFiKHJvdylcIlxyXG4gICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IG9uU2VsZWN0SXRlbShyb3cpXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sdW1uUHJvcCBvZiB2aXNpYmxlQ29sdW1uc0FycmF5OyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGFibGUtY2VsbFwiXHJcbiAgICAgICAgICAgICAgICAgICByb2xlPVwiY2VsbFwiXHJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3MuZmlyc3QtY2VsbF09XCJpID09PSAwXCJcclxuICAgICAgICAgICAgICAgICAgIFtjbGFzcy5sYXN0LWNlbGxdPVwiaSA9PT0gdmlzaWJsZUNvbHVtbnNBcnJheS5sZW5ndGggLSAxXCJcclxuICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3Rpb25zLWNlbGxdPVwiaSA9PT0gdmlzaWJsZUNvbHVtbnNBcnJheS5sZW5ndGggLSAxICYmIGNvbHVtblByb3AgPT09ICdhY3Rpb25zJ1wiXHJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLXdpZHRoXT1cImdldENvbHVtbihjb2x1bW5Qcm9wKT8ud2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0Q29sdW1uKGNvbHVtblByb3ApPy53aWR0aCA/IHsnd2lkdGgnOiBnZXRDb2x1bW4oY29sdW1uUHJvcCk/LndpZHRoICsgJyUnLCAnZmxleC1iYXNpcyc6IGdldENvbHVtbihjb2x1bW5Qcm9wKT8ud2lkdGggKyAnJSd9IDoge31cIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImdldENvbHVtbihjb2x1bW5Qcm9wKT8udHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInd29ya2Zsb3dTdGF0dXMnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwid2ZTdGF0dXMge3sgZ2V0U3RhdHVzRGVzY3JpcHRpb24ocm93KX19XCIgW2F0dHIuaWRdPVwiJ3RhYmxlLWJ0bi13Zi0nK2NvbHVtblByb3ArJy0nKyhyb3cuaWQgfHwgcm93LmtleSB8fCAnJylcIj57eyBnZXRTdGF0dXNEZXNjcmlwdGlvbihyb3cpIH19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2h5cGVyLXRleHQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvdWxkUmVuZGVyQXNIeXBlckxpbmsocm93KTsgZWxzZSBwbGFpbkh5cGVyVGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICByb2xlPVwibGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtbGFiZWwgaHlwZXItbGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaHlwZXJMaW5rQ2xpY2tlZChjb2x1bW5Qcm9wLCByb3cpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImh5cGVyTGlua0NsaWNrZWQoY29sdW1uUHJvcCwgcm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgaHlwZXJMaW5rQ2xpY2tlZChjb2x1bW5Qcm9wLCByb3cpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uUHJvcCkgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFpbkh5cGVyVGV4dD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWxhYmVsXCI+e3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtblByb3ApIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2J1dHRvbidcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2hvdWxkU2hvd0J1dHRvbihyb3cpXCIgbWF0LWJ1dHRvbiBjbGFzcz1cInByaW1hcnlcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBhY3Rpb25CdXR0b25DbGlja2VkKGNvbHVtblByb3AsIHJvdylcIiBbYXR0ci5pZF09XCIndGFibGUtYnRuLWFjdGlvbi0nK2NvbHVtblByb3BcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGxhYmVsS2V5KGdldENvbHVtbihjb2x1bW5Qcm9wKSkgKyAnX3RpdGxlJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpY29uJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAnbWFpblRhYmxlX190ZF9faWNvbi1ncmVlbic6IHJvd1tjb2x1bW5Qcm9wXSA9PT0gJ3Bhc3MnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgJ21haW5UYWJsZV9fdGRfX2ljb24tb3JhbmdlJzogcm93W2NvbHVtblByb3BdID09PSAnd2FybmluZycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAnbWFpblRhYmxlX190ZF9faWNvbi1yZWQnOiByb3dbY29sdW1uUHJvcF0gPT09ICdlcnJvcidcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJnZXRJY29uQXJpYUxhYmVsS2V5KHJvd1tjb2x1bW5Qcm9wXSkgfCB0cmFuc2xhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEljb24ocm93W2NvbHVtblByb3BdKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NoZWNrYm94J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggY2xhc3M9XCJwcmltYXJ5XCIgW2NoZWNrZWRdPVwicm93W2NvbHVtblByb3BdXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTthY3Rpb25DaGVja2VkQ2xpY2tlZChjb2x1bW5Qcm9wLHJvdylcIj48L21hdC1jaGVja2JveD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3RhdGVUeXBlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cInN0YXRlVHlwZSB7eyByb3dbY29sdW1uUHJvcF19fVwiIFthdHRyLmlkXT1cIid0YWJsZS1idG4tc3RhdGUtJytjb2x1bW5Qcm9wXCI+e3sgbGFiZWxLZXlCeVZhbHVlKGdldENvbHVtbihjb2x1bW5Qcm9wKSwgcm93KSB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtblByb3ApIHwgZGF0ZTonZGQvTU0veXl5eScgfX1cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY3JvcHBlZFRleHQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZ2V0Q3JvcHBlZFRleHQocm93W2NvbHVtblByb3BdLCByb3dbZ2V0Q29sdW1uKGNvbHVtblByb3ApPy53aWR0aF0pIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Rvd25sb2FkJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1haW5UYWJsZV9fdGRfX2ljb24tYmx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0JBU0VfVEFCTEUuZG93bmxvYWRBY3Rpb24nIHwgdHJhbnNsYXRlXCI+c3lzdGVtX3VwZGF0ZV9hbHQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidvbk9mZidcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJyb3dbY29sdW1uUHJvcF0gPT09IG51bGxcIiBjbGFzcz1cIm1haW5UYWJsZV9fdGRfX2ljb24tZGFya29yYW5nZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0T25PZmZGbGFnQXJpYUxhYmVsS2V5KG51bGwpIHwgdHJhbnNsYXRlXCI+ZmxhZzwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwicm93W2NvbHVtblByb3BdID09PSBmYWxzZVwiIGNsYXNzPVwibWFpblRhYmxlX190ZF9faWNvbi1yZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImdldE9uT2ZmRmxhZ0FyaWFMYWJlbEtleShmYWxzZSkgfCB0cmFuc2xhdGVcIj5mbGFnPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJyb3dbY29sdW1uUHJvcF0gPT09IHRydWVcIiBjbGFzcz1cIm1haW5UYWJsZV9fdGRfX2ljb24tZ3JlZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImdldE9uT2ZmRmxhZ0FyaWFMYWJlbEtleSh0cnVlKSB8IHRyYW5zbGF0ZVwiPmZsYWc8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzdGF0dXMnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3dbY29sdW1uUHJvcF0gPT09IG51bGwgfHwgcm93W2NvbHVtblByb3BdID09PSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgcGFnZUluZm8ubGFiZWxzU2VjdGlvbiArICcuJyArIGdldENvbHVtbihjb2x1bW5Qcm9wKT8ubGFiZWwgKyAnSW5BY3RpdmUnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93W2NvbHVtblByb3BdID09PSB0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBwYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgJy4nICsgZ2V0Q29sdW1uKGNvbHVtblByb3ApPy5sYWJlbCArICdBY3RpdmUnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpbmZvJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidCQVNFX1RBQkxFLnJvd0RldGFpbHMnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7ZW1pdEV2ZW50KHJvdylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiJ3RhYmxlLWJ0bi1pbmZvLScrcm93LmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gYXJpYS1oaWRkZW49XCJ0cnVlXCI+aW5mbzwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ25ldEFtb3VudCdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFpblRhYmxlX190ZF9fY3VycmVuY3lcIiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrO1wiPnt7IHJvd1tnZXRDb2x1bW4oY29sdW1uUHJvcCk/LmN1cnJlbmN5XSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFpblRhYmxlX190ZF9fcHJvcGVydHlcIiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWJsb2NrOyBtYXJnaW4tbGVmdDo2cHg7IG1hcmdpbi1yaWdodDo2cHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uUHJvcCkgfCBjdXJyZW5jeTonJzonJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbG9jYWxEYXRlVGltZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uUHJvcCkgfCBkYXRlIDogZXh0cmFjdEZvcm1hdChnZXRDb2x1bW4oY29sdW1uUHJvcCkpIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2JpZ2RlY2ltYWwnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsPjxzdXAgY2xhc3M9XCJtYWluVGFibGVfX3RkX19jdXJyZW5jeVwiPnt7cm93W2dldENvbHVtbihjb2x1bW5Qcm9wKT8uY3VycmVuY3ldfX08L3N1cD48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGV4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW5Qcm9wKSB8IG51bWJlciA6IChnZXRDb2x1bW4oY29sdW1uUHJvcCk/LmRpZ2l0SW5mbyB8fCAnMS4zLTUnKSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsaXN0QWN0aW9uJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhcHAtYnV0dG9uLWFjdGlvbnNcclxuICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtidXR0b25zQWN0aW9uXT1cImdldENvbHVtbihjb2x1bW5Qcm9wKT8udmlld1R5cGUgPT09ICdidXR0b25zQWN0aW9uJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbGlzdEFjdGlvbl09XCJsaXN0QWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zXT1cImxpc3RBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWRCdXR0b24pPVwiYWN0aW9uTGlzdENsaWNrZWQoJGV2ZW50LHJvdylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2FwcC1idXR0b24tYWN0aW9ucz5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldENvbHVtbihjb2x1bW5Qcm9wKT8udHJhbnNsYXRlOyBlbHNlIG5vVHJhbnNsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwibGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGVtaXRSb3V0ZVBhZ2Uocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uRGVmYXVsdENlbGxMaW5rS2V5ZG93bigkZXZlbnQsIHJvdylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgcGFnZUluZm8ubGFiZWxzU2VjdGlvbiArIFwiLlwiICsgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtblByb3ApIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub1RyYW5zbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJsaW5rXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgZW1pdFJvdXRlUGFnZShyb3cpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25EZWZhdWx0Q2VsbExpbmtLZXlkb3duKCRldmVudCwgcm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lclRleHRdPSdleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uUHJvcCknPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gTW9iaWxlIENhcmQgVmlldyAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkcy1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgZGF0YVNvdXJjZS5kYXRhOyBsZXQgcm93SW5kZXggPSBpbmRleFwiXHJcbiAgICAgICAgICAgICBjbGFzcz1cIm1vYmlsZS1jYXJkXCJcclxuICAgICAgICAgICAgIFthdHRyLmlkXT1cIidtb2JpbGUtY2FyZC0nICsgKHJvdz8uaWQgfHwgcm93Py5rZXkgfHwgJycpXCJcclxuICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgJ21vYmlsZS1jYXJkLS1oaWdobGlnaHQnOiBzZWxlY3RlZFJvd0luZGV4ID09IHJvdy5pZCB8fCAocGFnZUluZm8uZ3JvdXBCeVByb3BlcnR5ICYmIHBhZ2VJbmZvLmdyb3VwQnlWYWx1ZT8uaW5jbHVkZXMocm93W3BhZ2VJbmZvLmdyb3VwQnlQcm9wZXJ0eV0pKSxcclxuICAgICAgICAgICAgICAgJ21vYmlsZS1jYXJkLS1kYXJrLWhpZ2hsaWdodCc6IGlzRGFya0hpZ2hsaWdodChyb3cpXHJcbiAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgIChhdXhjbGljayk9XCJvcGVuTmV3VGFiKHJvdylcIlxyXG4gICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgb25TZWxlY3RJdGVtKHJvdylcIj5cclxuXHJcbiAgICAgICAgICA8IS0tIE1vYmlsZSBDYXJkIEhlYWRlcjogSUQvTmFtZSBhbmQgU3RhdHVzIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19oZWFkZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19oZWFkZXItaWRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1vYmlsZS1jYXJkX19pZC10ZXh0XCI+e3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGdldE1vYmlsZUNhcmRJZENvbHVtbigpPy5wcm9wZXJ0eSB8fCAnaWQnKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtY2FyZF9faGVhZGVyLXN0YXR1c1wiICpuZ0lmPVwiZ2V0TW9iaWxlQ2FyZFN0YXR1c0NvbHVtbigpXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwic3RhdGVUeXBlIHt7IHJvd1tnZXRNb2JpbGVDYXJkU3RhdHVzQ29sdW1uKCk/LnByb3BlcnR5XX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIidtb2JpbGUtYnRuLXN0YXRlLScrZ2V0TW9iaWxlQ2FyZFN0YXR1c0NvbHVtbigpPy5wcm9wZXJ0eVwiPlxyXG4gICAgICAgICAgICAgICAge3sgbGFiZWxLZXlCeVZhbHVlKGdldE1vYmlsZUNhcmRTdGF0dXNDb2x1bW4oKSwgcm93KSB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBEaXZpZGVyIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19kaXZpZGVyXCI+PC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBNb2JpbGUgQ2FyZCBCb2R5OiBPdGhlciBjb2x1bW5zIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBnZXRNb2JpbGVDYXJkQ29sdW1ucygpXCIgY2xhc3M9XCJtb2JpbGUtY2FyZF9fcm93XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jYXJkX19yb3ctbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX0gOjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLWNhcmRfX3Jvdy12YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sdW1uLnR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N0YXRlVHlwZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJzdGF0ZVR5cGUge3sgcm93W2NvbHVtbi5wcm9wZXJ0eV19fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCInbW9iaWxlLWJ0bi1zdGF0ZS0nK2NvbHVtbi5wcm9wZXJ0eVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgbGFiZWxLZXlCeVZhbHVlKGNvbHVtbiwgcm93KSB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtbi5wcm9wZXJ0eSkgfCBkYXRlOidkZC9NTS95eXl5JyB9fVxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIiduZXRBbW91bnQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb2JpbGUtY2FyZF9fYW1vdW50LWN1cnJlbmN5XCI+e3sgcm93W2NvbHVtbi5jdXJyZW5jeV0gfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb2JpbGUtY2FyZF9fYW1vdW50LXZhbHVlXCI+e3sgZXh0cmFjdEZpZWxkTmFtZShyb3csIGNvbHVtbi5wcm9wZXJ0eSkgfCBjdXJyZW5jeTonJzonJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbG9jYWxEYXRlVGltZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uLnByb3BlcnR5KSB8IGRhdGUgOiBleHRyYWN0Rm9ybWF0KGNvbHVtbikgfX1cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYmlnZGVjaW1hbCdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c21hbGw+PHN1cCBjbGFzcz1cIm1haW5UYWJsZV9fdGRfX2N1cnJlbmN5XCI+e3tyb3dbY29sdW1uLmN1cnJlbmN5XX19PC9zdXA+PC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICB7eyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uLnByb3BlcnR5KSB8IG51bWJlciA6IChjb2x1bW4uZGlnaXRJbmZvIHx8ICcxLjMtNScpIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHJhbnNsYXRlOyBlbHNlIG5vVHJhbnNsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBwYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgXCIuXCIgKyBleHRyYWN0RmllbGROYW1lKHJvdywgY29sdW1uLnByb3BlcnR5KSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vVHJhbnNsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVyVGV4dF09J2V4dHJhY3RGaWVsZE5hbWUocm93LCBjb2x1bW4ucHJvcGVydHkpJz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIE1vYmlsZSBDYXJkIEFjdGlvbnMgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLWNhcmRfX2FjdGlvbnNcIiAqbmdJZj1cImxpc3RBY3Rpb24gJiYgbGlzdEFjdGlvbi5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgIDxhcHAtYnV0dG9uLWFjdGlvbnNcclxuICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXHJcbiAgICAgICAgICAgICAgW2J1dHRvbnNBY3Rpb25dPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgW2xpc3RBY3Rpb25dPVwibGlzdEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgW2FjdGlvbnNdPVwibGlzdEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrZWRCdXR0b24pPVwiYWN0aW9uTGlzdENsaWNrZWQoJGV2ZW50LHJvdylcIj5cclxuICAgICAgICAgICAgPC9hcHAtYnV0dG9uLWFjdGlvbnM+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2ICpuZ0lmPVwibm9EYXRhRm91bmRcIiBjbGFzcz1cImRhdGFOb3RGb3VuZCBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgIDxpbWcgKm5nSWY9XCJnZXREaXNwbGF5U3ZnUGF0aCgpXCIgW3NyY109XCJnZXREaXNwbGF5U3ZnUGF0aCgpXCIgY2xhc3M9XCJkYXRhTm90Rm91bmRfX2ljb25cIiBhbHQ9XCJObyBkYXRhIGZvdW5kXCIgLz5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGFOb3RGb3VuZF9fdGl0bGVcIj57eyBnZXREaXNwbGF5VGl0bGUoKSB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0YU5vdEZvdW5kX19zdWJ0aXRsZVwiPnt7IGdldERpc3BsYXlTdWJ0aXRsZSgpIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgIDxkaXYgICpuZ0lmPVwiKGRhdGFTb3VyY2UuZGF0YT8ubGVuZ3RoID4gMCB8fCBjdXN0b21pemVkRGF0YSkgJiYgIXBhZ2VJbmZvLmhpZGVQYWdpbmF0aW9uXCIgY2xhc3M9XCJtYWluLXBhZ2luYXRpb24gZmxleC1yb3dcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW5hYmxlUGFnaW5hdGlvblwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uIGZsZXgtMTAwXCI+XHJcbiAgICAgICAgICAgIDxhcHAtcGFnaW5hdG9yXHJcbiAgICAgICAgICAgICAgW2N1cnJlbnRQYWdlXT1cInBhZ2VJbmRleFwiXHJcbiAgICAgICAgICAgICAgW3RvdGFsSXRlbXNdPVwidG90YWxFbGVtZW50c1wiXHJcbiAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcclxuICAgICAgICAgICAgICBbcGFnZVNpemVPcHRpb25zXT1cIls1LCAxMCwgMjUsIDUwXVwiXHJcbiAgICAgICAgICAgICAgW21vYmlsZUxvYWRNb3JlSW5jcmVtZW50XT1cIm1vYmlsZUxvYWRNb3JlSW5jcmVtZW50XCJcclxuICAgICAgICAgICAgICBbZGlzcGxheWVkSXRlbXNdPVwibW9iaWxlRGlzcGxheWVkSXRlbXMgfHwgZGF0YVNvdXJjZS5kYXRhLmxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvbkxvYWRNb3JlKCRldmVudClcIj5cclxuICAgICAgICAgICAgPC9hcHAtcGFnaW5hdG9yPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=