@unifylib/ui-lib 1.0.3 → 1.0.64

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 +6552 -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,507 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild } from "@angular/core";
2
+ import { MatCell, MatCellDef, MatColumnDef, MatHeaderCell, MatHeaderCellDef, MatHeaderRow, MatHeaderRowDef, MatRow, MatRowDef, MatTable } from "@angular/material/table";
3
+ import { TranslateModule } from "@ngx-translate/core";
4
+ import { MatSortModule } from "@angular/material/sort";
5
+ import { NgClass, NgForOf, NgIf, NgSwitch, NgSwitchCase, NgSwitchDefault } from "@angular/common";
6
+ import { MatIcon } from "@angular/material/icon";
7
+ import { MatButton, MatButtonModule } from "@angular/material/button";
8
+ import { NgxPaginationModule } from "ngx-pagination";
9
+ import { FormControl, ReactiveFormsModule } from "@angular/forms";
10
+ import { MatFormField, MatInput, MatLabel, MatSuffix } from "@angular/material/input";
11
+ import { BaseUtils, buildFormFields, getNegativeWfActionKey, getPositiveWfActionKey, getWfActionId } from "../../utils/base-utils";
12
+ import { EMPTY_PAGE_INFO, Filter, SELECT_RECORD_ACTION, SnackMessage } from "../../base-model";
13
+ import { DoActionRequest, REJECT, SAVE } from "../../base-model/do-action-request";
14
+ import { ActionCommentComponent } from "../action-comment/action-comment.component";
15
+ import { MatDatepicker, MatDatepickerInput, MatDatepickerToggle } from "@angular/material/datepicker";
16
+ import moment from 'moment';
17
+ import { AutoCompleteComponent } from "../auto-complete/auto-complete.component";
18
+ import { MatOption } from "@angular/material/core";
19
+ import { MatChipListbox, MatChipOption } from "@angular/material/chips";
20
+ import { TitleBarComponent } from "../title-bar/title-bar.component";
21
+ import { PaginatorComponent } from "../paginator/paginator.component";
22
+ import { AttachmentUploaderComponent } from "../shared/attachment-uploader/attachment-uploader.component";
23
+ import { EquationBuilderComponent } from "../equation-builder/equation-builder.component";
24
+ import { MatSelect } from "@angular/material/select";
25
+ import { BaseFormCanvasComponent } from "../base-form-canvas/base-form-canvas.component";
26
+ import { MatCheckbox } from "@angular/material/checkbox";
27
+ import * as i0 from "@angular/core";
28
+ import * as i1 from "../../services";
29
+ import * as i2 from "@angular/router";
30
+ import * as i3 from "@angular/forms";
31
+ import * as i4 from "@angular/material/dialog";
32
+ import * as i5 from "@angular/cdk/bidi";
33
+ import * as i6 from "@ngx-translate/core";
34
+ import * as i7 from "@angular/material/sort";
35
+ import * as i8 from "@angular/material/button";
36
+ import * as i9 from "ngx-pagination";
37
+ export class EditableBaseTableComponent extends BaseUtils {
38
+ constructor(backendService, router, fb, dialog, directionality) {
39
+ super();
40
+ this.backendService = backendService;
41
+ this.router = router;
42
+ this.fb = fb;
43
+ this.dialog = dialog;
44
+ this.directionality = directionality;
45
+ this.minDate = moment([1800, 0, 1]);
46
+ this.collection = { count: 60, data: [] };
47
+ this.config = {
48
+ itemsPerPage: 10,
49
+ currentPage: 1,
50
+ totalItems: this.collection.count
51
+ };
52
+ this.maxSize = 7;
53
+ this.directionLinks = true;
54
+ this.autoHide = false;
55
+ this.responsive = true;
56
+ this.labels = {
57
+ previousLabel: '<',
58
+ nextLabel: '>',
59
+ screenReaderPaginationLabel: 'Pagination',
60
+ screenReaderPageLabel: 'page',
61
+ screenReaderCurrentLabel: `You're on page`
62
+ };
63
+ this.dataElements = [];
64
+ this.noDataFound = false;
65
+ this.isLoaded = false;
66
+ this.totalElements = 0;
67
+ this.pagesCount = 0;
68
+ this.pageIndex = 1;
69
+ this.pageSize = 10;
70
+ this.pageInfo = EMPTY_PAGE_INFO;
71
+ this.enforceRefresh = false;
72
+ this.isPending = false;
73
+ this.isBulkItemsSupported = false;
74
+ this.fields = [];
75
+ this.searchFormFields = [];
76
+ this.translationKey = 'addNew';
77
+ this.formUpdated = new EventEmitter();
78
+ this.saveActionEmitter = new EventEmitter();
79
+ this.saveAttachmentEmitter = new EventEmitter();
80
+ this.selectedFileFromUploader = null;
81
+ this.getPositiveWfActionKey = getPositiveWfActionKey;
82
+ this.getNegativeWfActionKey = getNegativeWfActionKey;
83
+ this.SAVE = SAVE;
84
+ this.REJECT = REJECT;
85
+ }
86
+ get dataFormArray() {
87
+ return this.formParam.get('dataFormArray');
88
+ }
89
+ extractFormat(column) {
90
+ return column?.format || 'd/M/yyyy, h:mm a';
91
+ }
92
+ get dataSource() {
93
+ return this.dataFormArray.value;
94
+ }
95
+ ngOnInit() {
96
+ this.currentDirection = this.directionality.value;
97
+ this.directionality.change.subscribe((value) => {
98
+ this.currentDirection = value;
99
+ });
100
+ if (this.superDataElements?.length > 0) {
101
+ this.dataElements = this.superDataElements;
102
+ this.buildForm();
103
+ this.isLoaded = true;
104
+ }
105
+ else {
106
+ this.loadData();
107
+ }
108
+ }
109
+ loadData() {
110
+ this.fields.forEach(field => field.readonly = this.isPending);
111
+ this.dataElements = [];
112
+ this.totalElements = 0;
113
+ this.pagesCount = 1;
114
+ this.pageIndex = 1;
115
+ this.noDataFound = true;
116
+ this.isLoaded = true;
117
+ this.filterRequest.pendingPage = this.isPending;
118
+ if (!this.pageInfo.lazyLoadData) {
119
+ this.backendService.getItemsByFilter(this.filterRequest, this.pageInfo.apiUri)
120
+ .subscribe(resp => {
121
+ this.dataElements = resp.body || [];
122
+ this.totalElements = resp.totalSize || 0;
123
+ this.pagesCount = Math.max(Math.ceil(this.totalElements / this.pageSize), 1);
124
+ this.pageIndex = (this.filterRequest.pageIndex || 0) + 1;
125
+ this.noDataFound = this.dataElements.length === 0;
126
+ this.isLoaded = true;
127
+ });
128
+ }
129
+ this.buildForm();
130
+ }
131
+ buildForm() {
132
+ this.formParam = this.fb.group({
133
+ dataFormArray: this.fb.array(this.dataElements.map(item => this.fb.group(buildFormFields(this.fields, item)))),
134
+ });
135
+ this.formUpdated.next(this.formParam);
136
+ }
137
+ onPageChange(event) {
138
+ this.pageIndex = event;
139
+ this.getNext(this.pageIndex - 1);
140
+ }
141
+ getNext(pageIndex) {
142
+ this.filterRequest.pageIndex = pageIndex;
143
+ this.filterRequest.pageSize = this.pageSize;
144
+ this.loadData();
145
+ }
146
+ onPageSizeChange(event) {
147
+ this.pageSize = event;
148
+ this.pageIndex = 1;
149
+ this.filterRequest.pageSize = this.pageSize;
150
+ this.getNext(0);
151
+ }
152
+ extractFieldName(element, property) {
153
+ if (property.includes('.')) {
154
+ return property.split('.').reduce((acc, part) => acc && acc[part], element);
155
+ }
156
+ else {
157
+ return element[property];
158
+ }
159
+ }
160
+ get visibleColumns() {
161
+ return this.fields.filter(column => column.visible).map(column => column.property);
162
+ }
163
+ ngOnChanges(changes) {
164
+ if (changes["enforceRefresh"] && !changes["enforceRefresh"].isFirstChange() && changes["enforceRefresh"].currentValue === true) {
165
+ // this.loadData();
166
+ }
167
+ }
168
+ onSelectItem(row) {
169
+ if (this.pageInfo.selfRouting) {
170
+ const mode = this.isPending ? 'pending' : 'view';
171
+ const url = `${this.pageInfo.listRoutePath || this.router.url}/${mode}`;
172
+ this.router.navigate([`${url}`, row?.id]);
173
+ }
174
+ const action = SELECT_RECORD_ACTION;
175
+ action.id = row?.id;
176
+ // this.userAction.emit(action)
177
+ this.selectedItem = row;
178
+ }
179
+ openNewTab(row) {
180
+ if (!this.pageInfo.embededTableOnly) {
181
+ const mode = this.isPending ? 'pending' : 'view';
182
+ window.open(`${this.pageInfo.listRoutePath}/${mode}` + '/' + row?.id);
183
+ }
184
+ }
185
+ getField(element, column) {
186
+ return element.controls[column.property];
187
+ }
188
+ fieldButtonEvent(column, element, actionId) {
189
+ this.doSaveApproveAction(element, actionId);
190
+ }
191
+ patchLookupValue($event, property) {
192
+ this.formUpdated.emit(this.selectedItem);
193
+ }
194
+ addNewItem() {
195
+ const currentValues = this.formParam?.get('dataFormArray')?.value;
196
+ if (currentValues) {
197
+ this.dataElements = [...currentValues];
198
+ }
199
+ this.dataElements.push({});
200
+ this.buildForm();
201
+ }
202
+ doSaveApproveAction(element, userActionId) {
203
+ let actionId = getWfActionId(element.value.stateType);
204
+ if (userActionId === REJECT && this.isPending) {
205
+ actionId = 3;
206
+ }
207
+ let request = new DoActionRequest();
208
+ request.actionId = actionId;
209
+ request.subject = element.value;
210
+ if (this.actionRequestCallback) {
211
+ request = this.actionRequestCallback(request);
212
+ if (request.subject.id === "") {
213
+ request.subject.id = null;
214
+ request.subject.stateType = "NEW";
215
+ }
216
+ }
217
+ if (request.subject.id === "") {
218
+ request.subject.id = null;
219
+ request.subject.stateType = "NEW";
220
+ }
221
+ const dialogRef = this.dialog.open(ActionCommentComponent, {
222
+ data: { label: userActionId === 2 ? 'save' : 'reject', isTermination: false },
223
+ width: '600px',
224
+ height: 'auto',
225
+ direction: this.currentDirection
226
+ });
227
+ dialogRef.afterClosed().subscribe(result => {
228
+ if (result) {
229
+ request.comment = result.comment;
230
+ this.backendService.doActionWithAttachments(request, [], this.pageInfo).subscribe(resp => {
231
+ if (resp.valid) {
232
+ this.loadData();
233
+ let message = '';
234
+ if (actionId === 1) {
235
+ message = 'saved_successfully';
236
+ }
237
+ else if (actionId === 2) {
238
+ message = 'updated_successfully';
239
+ }
240
+ else if (actionId === 3) {
241
+ message = 'successful_reject_message';
242
+ }
243
+ else if (actionId === 4) {
244
+ message = 'approve_successfully';
245
+ }
246
+ this.backendService.topPanelMessage$.next(new SnackMessage(message, true, 'success'));
247
+ }
248
+ else {
249
+ const x = resp.message?.length > 0 ? resp.message[0].errorMessage : 'FAILED_CONTACT_ADMIN';
250
+ this.backendService.topPanelMessage$.next(new SnackMessage(x, true, 'error'));
251
+ }
252
+ this.saveActionEmitter.emit({ item: request.subject, resp });
253
+ });
254
+ }
255
+ });
256
+ }
257
+ setMonthAndYear(normalizedMonthAndYear, picker, element, column) {
258
+ const date = new FormControl(moment());
259
+ const ctrlValue = date.value;
260
+ ctrlValue.year(normalizedMonthAndYear.year());
261
+ ctrlValue.month(1);
262
+ ctrlValue.dayOfYear(1);
263
+ element.controls[column.property].setValue(ctrlValue);
264
+ picker.close();
265
+ }
266
+ switchViewMode(b) {
267
+ this.isPending = b;
268
+ this.loadData();
269
+ }
270
+ onChipSelectionChange(event, listbox) {
271
+ const value = event.value;
272
+ if (value !== 'COMPLETED' && value !== 'PENDING') {
273
+ setTimeout(() => listbox && (listbox.value = this.isPending ? 'PENDING' : 'COMPLETED'));
274
+ return;
275
+ }
276
+ const isPending = value === 'PENDING';
277
+ if (this.isPending !== isPending)
278
+ this.switchViewMode(isPending);
279
+ }
280
+ addBulkItems() {
281
+ const merged = [];
282
+ this.dataFormArray.controls.forEach((group) => {
283
+ merged.push(group.value);
284
+ });
285
+ let request = new DoActionRequest();
286
+ request.actionId = 1;
287
+ request.subject = { invoices: merged };
288
+ if (this.actionRequestCallback) {
289
+ request = this.actionRequestCallback(request);
290
+ request.subject.invoices = request.subject.invoices.map((item) => {
291
+ if (item.id === "") {
292
+ item.id = null;
293
+ item.stateType = "NEW";
294
+ }
295
+ return item;
296
+ });
297
+ }
298
+ request.subject.invoices = request.subject.invoices.map((item) => {
299
+ if (item.id === "") {
300
+ item.id = null;
301
+ item.stateType = "NEW";
302
+ }
303
+ return item;
304
+ });
305
+ const dialogRef = this.dialog.open(ActionCommentComponent, {
306
+ data: { label: 'save', isTermination: false },
307
+ width: '600px',
308
+ height: 'auto',
309
+ direction: this.currentDirection
310
+ });
311
+ dialogRef.afterClosed().subscribe(result => {
312
+ if (result) {
313
+ request.comment = result.comment;
314
+ this.backendService.doActionWithAttachment(request, this.selectedFileFromUploader, this.pageInfo).subscribe(resp => {
315
+ if (resp.valid) {
316
+ this.clearBulkItems();
317
+ this.backendService.topPanelMessage$.next(new SnackMessage('saved_successfully', true, 'success'));
318
+ this.loadData();
319
+ }
320
+ else {
321
+ this.backendService.topPanelMessage$.next(new SnackMessage(this.pageInfo.labelsSection + '.' + resp.message?.[0]?.errorCode, true, 'error'));
322
+ }
323
+ this.saveAttachmentEmitter.emit({ item: request.subject, resp });
324
+ });
325
+ }
326
+ });
327
+ }
328
+ handleFileUpload($event) {
329
+ let actionId = getWfActionId('NEW');
330
+ let request = new DoActionRequest();
331
+ request.actionId = actionId;
332
+ this.selectedFileFromUploader = $event;
333
+ }
334
+ shouldDisableBulkAdd() {
335
+ const hasFile = !!this.selectedFileFromUploader;
336
+ return (!this.formParam?.valid || this.dataFormArray.controls.length === 0) && !hasFile;
337
+ }
338
+ handleEquationChange(event, element, column) {
339
+ element.value[column.property] = event.value;
340
+ const { value, valid } = event;
341
+ element.get(column.property)?.setValue(value);
342
+ if (!valid) {
343
+ element.get(column.property)?.setErrors({ invalidEquation: true });
344
+ }
345
+ else {
346
+ element.get(column.property)?.setErrors(null);
347
+ }
348
+ }
349
+ clearBulkItems() {
350
+ this.dataElements = [];
351
+ this.selectedFileFromUploader = null;
352
+ this.uploaderComponent.clearFile();
353
+ this.buildForm();
354
+ this.formUpdated.emit(this.formParam);
355
+ }
356
+ hasDataToClear() {
357
+ return (this.dataElements && this.dataElements.length > 0) || !!this.selectedFileFromUploader;
358
+ }
359
+ getOptionValue(item) {
360
+ const value = typeof item === 'object' ?
361
+ item.englishName : item;
362
+ return value;
363
+ }
364
+ disabledSaveButton(element) {
365
+ return !element.valid || (!this.isPending && element.value.stateType == 'PENDING');
366
+ }
367
+ doSearch() {
368
+ if (this.searchForm.valid) {
369
+ const rawValues = this.searchForm.getRawValue();
370
+ this.filterRequest.pageIndex = 0;
371
+ this.filterRequest.filters = [];
372
+ this.searchFormFields.forEach(x => {
373
+ const value = rawValues[x.property];
374
+ if (value !== null && value !== undefined && value !== '') {
375
+ const filter = new Filter({
376
+ key: 0,
377
+ label: x.property,
378
+ fieldName: x.searchAttribute,
379
+ valueObject: x.searchAttribute.includes('.') ? value[x.searchAttribute.split('.').pop()] : value,
380
+ operator: x.searchOperator,
381
+ filterType: 'FILED_FILTER'
382
+ });
383
+ this.filterRequest.filters.push(filter);
384
+ }
385
+ });
386
+ this.loadData();
387
+ }
388
+ else {
389
+ this.backendService.topPanelMessage$.next(new SnackMessage('INVALID_SEARCH_FORM', true, 'error'));
390
+ }
391
+ }
392
+ showSearch() {
393
+ return this.searchFormFields?.length > 0;
394
+ }
395
+ clearSearch() {
396
+ this.searchForm.get('sectorType').setValue({ id: -100, englishName: 'aaa', code: 'aaa', arabicName: 'aaa' });
397
+ this.searchForm.reset();
398
+ this.doSearch();
399
+ }
400
+ updateSearchForm($event) {
401
+ this.searchForm = $event;
402
+ }
403
+ validSearchData() {
404
+ return !this.searchForm.valid || true;
405
+ }
406
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EditableBaseTableComponent, deps: [{ token: i1.BackendService }, { token: i2.Router }, { token: i3.FormBuilder }, { token: i4.MatDialog }, { token: i5.Directionality }], target: i0.ɵɵFactoryTarget.Component }); }
407
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EditableBaseTableComponent, isStandalone: true, selector: "app-editable-base-table", inputs: { filterRequest: "filterRequest", superDataElements: "superDataElements", pageInfo: "pageInfo", enforceRefresh: "enforceRefresh", isPending: "isPending", isBulkItemsSupported: "isBulkItemsSupported", fields: "fields", searchFormFields: "searchFormFields", translationKey: "translationKey", actionRequestCallback: "actionRequestCallback" }, outputs: { formUpdated: "formUpdated", saveActionEmitter: "saveActionEmitter", saveAttachmentEmitter: "saveAttachmentEmitter" }, providers: [
408
+ // `MomentDateAdapter` can be automatically provided by importing `MomentDateModule` in your
409
+ // application's root module. We provide it at the component level here, due to limitations of
410
+ // our example generation script.
411
+ // {
412
+ // provide: DateAdapter,
413
+ // useClass: MomentDateAdapter,
414
+ // deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS],
415
+ // },
416
+ // { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS },
417
+ ], viewQueries: [{ propertyName: "uploaderComponent", first: true, predicate: ["uploader"], descendants: true }, { propertyName: "fileUpload", first: true, predicate: ["fileUpload"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"baseTable flex-column\">\r\n <div class=\"left-align\">\r\n <app-attachment-uploader #uploader\r\n *ngIf=\"isBulkItemsSupported\"\r\n (fileSelected)=\"handleFileUpload($event)\">\r\n </app-attachment-uploader>\r\n </div>\r\n\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-half flex-column align-center-start\">\r\n <app-title-bar [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\r\n [titleMode]=\"''\"\r\n [newAction]=\"false\"\r\n [showExtractButton]=\"!pageInfo.hideExtractButton\">\r\n </app-title-bar>\r\n <span class=\"font-small\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\r\n </div>\r\n <div class=\"flex-half flex-column align-start-end\">\r\n <mat-chip-listbox #box [attr.aria-label]=\"'BASE_TABLE.documentStatus' | translate\" [multiple]=\"false\" [value]=\"isPending ? 'PENDING' : 'COMPLETED'\" (click)=\"$event.stopPropagation()\" (change)=\"onChipSelectionChange($event, box)\" *ngIf=\"pageInfo.draftSupported\">\r\n <mat-chip-option [selected]=\"!isPending\" [color]=\"'accent'\" value=\"COMPLETED\" (click)=\"$event.stopPropagation()\">\r\n {{ 'finished' | translate }}\r\n </mat-chip-option>\r\n <mat-chip-option [selected]=\"isPending\" [color]=\"'accent'\" value=\"PENDING\" (click)=\"$event.stopPropagation()\">\r\n {{ 'todo' | translate }}\r\n </mat-chip-option>\r\n </mat-chip-listbox>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"showSearch()\">\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-80 flex-column align-start-end\">\r\n <app-base-form-canvas class=\"flex-fill\"\r\n [pageInfo]=\"pageInfo\"\r\n [fields]=\"searchFormFields\"\r\n [editable]=\"true\"\r\n (formUpdated)=\"updateSearchForm($event)\">\r\n </app-base-form-canvas>\r\n </div>\r\n <div class=\"flex-15 flex-column align-start-end\">\r\n <div class=\"flex-row align-center-center gap-8 full-width\">\r\n <button mat-button color=\"primary\" type=\"button\" (click)=\"doSearch()\" id=\"editable-search-btn\">\r\n <mat-icon>search</mat-icon>\r\n {{ 'search' | translate }}\r\n </button>\r\n <button mat-button color=\"primary\" type=\"button\" (click)=\"clearSearch()\" id=\"editable-clear-search-btn\">\r\n <mat-icon>clear</mat-icon>\r\n {{ 'clear' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"flex-row full-width baseTable__detailsColumn\">\r\n <div class=\"flex-full\">\r\n <ng-container *ngIf=\"isLoaded\">\r\n <div class=\"flex-row mainTable gap-0 align-start-start\">\r\n <form [formGroup]=\"formParam\" class=\"flex-fill\">\r\n <table [dataSource]=\"dataFormArray.controls\" class=\"flex-fill\" mat-table matSort>\r\n <ng-container *ngFor=\"let column of this.fields; let i = index\">\r\n <ng-container matColumnDef=\"{{column.property}}\">\r\n <ng-container [ngSwitch]=\"column.type\">\r\n <ng-container *ngSwitchCase=\"'equation-builder'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\" mat-cell>\r\n <lib-equation-builder\r\n [form]=\"element\"\r\n [field]=\"column\"\r\n [readOnly]=\"column.readonly\"\r\n [isPending]=\"isPending\"\r\n (valueChanged)=\"handleEquationChange($event, element, column)\">\r\n </lib-equation-builder>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'lookup'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <app-auto-complete\r\n [form]=\"element\"\r\n [field]=\"column\"\r\n [defaultValue]=\"element.get(column.property)?.value\"\r\n (selectedValue)=\"patchLookupValue($event, column.property)\">\r\n </app-auto-complete>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'list'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}</th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-label>{{element}}</mat-label>\r\n <mat-select\r\n formControlName=\"{{column.property}}\"\r\n [attr.aria-label]=\"column.label! | translate\"\r\n [multiple]=\"false\"\r\n [(value)]=\"element[column.property]\">\r\n <ng-container>\r\n <mat-option\r\n *ngFor=\"let item of column.listOptions\"\r\n [value]=\"item\">\r\n {{ getOptionValue(item) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ 'action' | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n <div class=\"flex-column\">\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-third flex-column align-center-center\">\r\n <button mat-button class=\"btn-none-background-primary\"\r\n color=\"primary\"\r\n [disabled]=\"disabledSaveButton(element)\"\r\n (click)=\"fieldButtonEvent(column,element,SAVE)\"\r\n [attr.id]=\"'editable-save-' + (element.value?.id || '')\">\r\n {{ getPositiveWfActionKey(element.value.stateType) | translate }}\r\n </button>\r\n </div>\r\n <div class=\"flex-third flex-column align-center-center\">\r\n <button *ngIf=\"isPending\" mat-button class=\"btn-none-background-primary\"\r\n color=\"accent\"\r\n (click)=\"fieldButtonEvent(column,element,REJECT)\"\r\n [attr.id]=\"'editable-reject-' + (element.value?.id || '')\">\r\n {{ getNegativeWfActionKey(element.value.stateType) | translate }}\r\n </button>\r\n </div>\r\n <div class=\"flex-third flex-column align-center-center\"></div>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'year'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <mat-label>{{ labelKey(column) | translate }}</mat-label>\r\n <input matInput\r\n [disabled]=\"column.readonly\"\r\n [readonly]=\"column.readonly\"\r\n [matDatepicker]=\"picker\"\r\n [min]=\"minDate\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker startView=\"multi-year\"\r\n (yearSelected)=\"setMonthAndYear($event, picker, element,column)\"\r\n panelClass=\"example-month-picker\"></mat-datepicker>\r\n\r\n </mat-form-field>\r\n <!-- <mat-form-field class=\"flex-auto\" appearance=\"outline\" fxFlexFill>-->\r\n <!-- <input matInput [formControl]=\"getField(element, column)\">-->\r\n <!-- </mat-form-field>-->\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <!-- Visually hidden label just to trigger the floating label and asterisk -->\r\n <mat-label>\r\n </mat-label>\r\n\r\n <input matInput\r\n type=\"number\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-checkbox\r\n style=\"padding-bottom: 14px; padding-top: 14px;\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\"\r\n [style.pointer-events]=\"column.readonly ? 'none' : 'auto'\"\r\n [style.opacity]=\"column.readonly ? 0.7 : 1\"\r\n (click)=\"column.readonly ? $event.preventDefault() : null\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <mat-label>\r\n {{ labelKey(column) | translate }}\r\n </mat-label>\r\n <input matInput\r\n type=\"text\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <input matInput\r\n [matDatepicker]=\"xpicker\"\r\n [min]=\"minDate\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [disabled]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"xpicker\"\r\n [disabled]=\"column.readonly\">\r\n </mat-datepicker-toggle>\r\n <mat-datepicker #xpicker></mat-datepicker>\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <input matInput\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [formControl]=\"getField(element, column)\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <tr *matHeaderRowDef=\"visibleColumns\" mat-header-row></tr>\r\n <tr (click)=\"onSelectItem(row)\" (auxclick)=\"openNewTab(row)\"\r\n *matRowDef=\"let row; columns: visibleColumns | paginate:config\"\r\n [attr.id]=\"'editable-row-' + (row?.value?.id || row?.value?.key || '')\"\r\n mat-row></tr>\r\n </table>\r\n </form>\r\n </div>\r\n\r\n <div *ngIf=\"noDataFound && !pageInfo.lazyLoadData\" class=\"flex-row dataNotFound\">\r\n <div class=\"flex-column flex-full\">\r\n <span class=\"dataNotFound__details\">\r\n <mat-icon class=\"dataNotFound__details__icon\">info</mat-icon>\r\n <span>{{ 'dataNotFound' | translate }}</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-row mainTable\" *ngIf=\"!selectedFileFromUploader\">\r\n <div>\r\n <button *ngIf=\"!isPending && pageInfo.hasAddButton\" mat-button color=\"primary\" type=\"button\"\r\n (click)=\"addNewItem()\" id=\"editable-add-item-btn\">\r\n <mat-icon>add_box</mat-icon>\r\n {{ translationKey | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-row flex-wrap align-center-center main-pagination\" *ngIf=\"totalElements > 0\">\r\n <div class=\"flex-column flex-full\">\r\n <app-paginator [currentPage]=\"pageIndex\" [totalItems]=\"totalElements\" [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"[5, 10, 25, 50]\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></app-paginator>\r\n </div>\r\n <div class=\"flex-column flex-full countItem hide-gt-xs\">\r\n <span class=\"countItem__totalElement\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\r\n </div>\r\n <div class=\"flex-column flex-2\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"isBulkItemsSupported\" class=\"flex-row gap-10 align-start-start mainTable\">\r\n <div>\r\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"addBulkItems()\" [disabled]=\"shouldDisableBulkAdd()\" id=\"editable-bulk-add-btn\">\r\n <mat-icon>add_box</mat-icon>\r\n {{ 'addAll' | translate }}\r\n </button>\r\n </div>\r\n <div>\r\n <button mat-flat-button color=\"warn\" type=\"button\" [disabled]=\"!hasDataToClear()\" (click)=\"clearBulkItems()\" id=\"editable-bulk-clear-btn\">\r\n <mat-icon>delete</mat-icon>\r\n {{ 'clearAll' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".baseTable{padding:20px}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}.responsive-top-gap{margin-top:20px}@media (max-width: 959px){.responsive-top-gap{margin-top:1px}.baseTable{padding:20px;margin-inline:8px;width:max-content}}.flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column}.flex-half{flex:0 0 50%}.flex-80{flex:0 0 80%}.flex-15{flex:0 0 15%}.flex-2{flex:0 0 2%}.flex-full{flex:0 0 100%}.align-start-start{justify-content:flex-start;align-items:flex-start}.align-start-end{justify-content:flex-end;align-items:flex-start}.align-center-start{justify-content:flex-start;align-items:center}.align-center-center{justify-content:center;align-items:center}.align-end-start{justify-content:flex-start;align-items:flex-end}.align-end-end{justify-content:flex-end;align-items:flex-end}.gap-8{gap:8px}.gap-10{gap:10px}.gap-0{gap:0px}@media (max-width: 959px){.flex-column.lt-md{flex-direction:column}.flex-row.lt-md{flex-direction:row}.flex-full.lt-md{flex:0 0 100%}.align-center-center.lt-md{justify-content:center;align-items:center}}@media (max-width: 599px){.flex-hide.gt-xs{display:none!important}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i6.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: i7.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "directive", type: MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: MatCellDef, selector: "[matCellDef]" }, { kind: "ngmodule", type: NgxPaginationModule }, { kind: "pipe", type: i9.PaginatePipe, name: "paginate" }, { kind: "component", type: MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "component", type: MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: AutoCompleteComponent, selector: "app-auto-complete", inputs: ["field", "form", "defaultValue", "readonly", "supportingAttributes"], outputs: ["selectedValue"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { 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: "component", type: AttachmentUploaderComponent, selector: "app-attachment-uploader", inputs: ["acceptedTypes", "ariaDescribedBy"], outputs: ["fileSelected"] }, { kind: "component", type: EquationBuilderComponent, selector: "lib-equation-builder", inputs: ["form", "field", "isPending", "readOnly"], outputs: ["valueChanged"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: BaseFormCanvasComponent, selector: "app-base-form-canvas", inputs: ["pageInfo", "currency", "fields", "errors", "workflowEditableFields", "isWorkflowEditableManaged", "supportingAttributes", "editable", "emitOnValueChanges", "filterResetNonce", "item", "equationSuggestedFields", "currentEquationValue"], outputs: ["attachmentEmitter", "actionEmitter", "formUpdated", "hyperTextEvent", "currentEquationValueChange"] }, { 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"] }], animations: [] }); }
418
+ }
419
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EditableBaseTableComponent, decorators: [{
420
+ type: Component,
421
+ args: [{ selector: 'app-editable-base-table', standalone: true, animations: [], imports: [
422
+ NgClass,
423
+ TranslateModule,
424
+ MatIcon,
425
+ MatSortModule,
426
+ MatColumnDef,
427
+ MatHeaderCellDef,
428
+ NgIf,
429
+ MatTable,
430
+ MatHeaderCell,
431
+ NgSwitch,
432
+ MatButtonModule,
433
+ MatCell,
434
+ MatCellDef,
435
+ NgxPaginationModule,
436
+ MatRow,
437
+ MatRowDef,
438
+ MatHeaderRow,
439
+ NgSwitchCase,
440
+ NgSwitchDefault,
441
+ MatHeaderRowDef,
442
+ NgForOf,
443
+ MatButton,
444
+ ReactiveFormsModule,
445
+ MatInput,
446
+ AutoCompleteComponent,
447
+ MatFormField,
448
+ MatDatepicker,
449
+ MatDatepickerInput,
450
+ MatDatepickerToggle,
451
+ MatLabel,
452
+ MatSuffix,
453
+ MatChipListbox,
454
+ MatChipOption,
455
+ TitleBarComponent,
456
+ PaginatorComponent,
457
+ AttachmentUploaderComponent,
458
+ EquationBuilderComponent,
459
+ MatSelect,
460
+ MatOption,
461
+ BaseFormCanvasComponent,
462
+ MatCheckbox,
463
+ ], providers: [
464
+ // `MomentDateAdapter` can be automatically provided by importing `MomentDateModule` in your
465
+ // application's root module. We provide it at the component level here, due to limitations of
466
+ // our example generation script.
467
+ // {
468
+ // provide: DateAdapter,
469
+ // useClass: MomentDateAdapter,
470
+ // deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS],
471
+ // },
472
+ // { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS },
473
+ ], template: "<div class=\"baseTable flex-column\">\r\n <div class=\"left-align\">\r\n <app-attachment-uploader #uploader\r\n *ngIf=\"isBulkItemsSupported\"\r\n (fileSelected)=\"handleFileUpload($event)\">\r\n </app-attachment-uploader>\r\n </div>\r\n\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-half flex-column align-center-start\">\r\n <app-title-bar [pageTitle]=\"pageInfo.hideTitle ? '' : pageInfo.labelsSection+'.list_title'\"\r\n [titleMode]=\"''\"\r\n [newAction]=\"false\"\r\n [showExtractButton]=\"!pageInfo.hideExtractButton\">\r\n </app-title-bar>\r\n <span class=\"font-small\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\r\n </div>\r\n <div class=\"flex-half flex-column align-start-end\">\r\n <mat-chip-listbox #box [attr.aria-label]=\"'BASE_TABLE.documentStatus' | translate\" [multiple]=\"false\" [value]=\"isPending ? 'PENDING' : 'COMPLETED'\" (click)=\"$event.stopPropagation()\" (change)=\"onChipSelectionChange($event, box)\" *ngIf=\"pageInfo.draftSupported\">\r\n <mat-chip-option [selected]=\"!isPending\" [color]=\"'accent'\" value=\"COMPLETED\" (click)=\"$event.stopPropagation()\">\r\n {{ 'finished' | translate }}\r\n </mat-chip-option>\r\n <mat-chip-option [selected]=\"isPending\" [color]=\"'accent'\" value=\"PENDING\" (click)=\"$event.stopPropagation()\">\r\n {{ 'todo' | translate }}\r\n </mat-chip-option>\r\n </mat-chip-listbox>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"showSearch()\">\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-80 flex-column align-start-end\">\r\n <app-base-form-canvas class=\"flex-fill\"\r\n [pageInfo]=\"pageInfo\"\r\n [fields]=\"searchFormFields\"\r\n [editable]=\"true\"\r\n (formUpdated)=\"updateSearchForm($event)\">\r\n </app-base-form-canvas>\r\n </div>\r\n <div class=\"flex-15 flex-column align-start-end\">\r\n <div class=\"flex-row align-center-center gap-8 full-width\">\r\n <button mat-button color=\"primary\" type=\"button\" (click)=\"doSearch()\" id=\"editable-search-btn\">\r\n <mat-icon>search</mat-icon>\r\n {{ 'search' | translate }}\r\n </button>\r\n <button mat-button color=\"primary\" type=\"button\" (click)=\"clearSearch()\" id=\"editable-clear-search-btn\">\r\n <mat-icon>clear</mat-icon>\r\n {{ 'clear' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"flex-row full-width baseTable__detailsColumn\">\r\n <div class=\"flex-full\">\r\n <ng-container *ngIf=\"isLoaded\">\r\n <div class=\"flex-row mainTable gap-0 align-start-start\">\r\n <form [formGroup]=\"formParam\" class=\"flex-fill\">\r\n <table [dataSource]=\"dataFormArray.controls\" class=\"flex-fill\" mat-table matSort>\r\n <ng-container *ngFor=\"let column of this.fields; let i = index\">\r\n <ng-container matColumnDef=\"{{column.property}}\">\r\n <ng-container [ngSwitch]=\"column.type\">\r\n <ng-container *ngSwitchCase=\"'equation-builder'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\" mat-cell>\r\n <lib-equation-builder\r\n [form]=\"element\"\r\n [field]=\"column\"\r\n [readOnly]=\"column.readonly\"\r\n [isPending]=\"isPending\"\r\n (valueChanged)=\"handleEquationChange($event, element, column)\">\r\n </lib-equation-builder>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'lookup'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <app-auto-complete\r\n [form]=\"element\"\r\n [field]=\"column\"\r\n [defaultValue]=\"element.get(column.property)?.value\"\r\n (selectedValue)=\"patchLookupValue($event, column.property)\">\r\n </app-auto-complete>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'list'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}</th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-label>{{element}}</mat-label>\r\n <mat-select\r\n formControlName=\"{{column.property}}\"\r\n [attr.aria-label]=\"column.label! | translate\"\r\n [multiple]=\"false\"\r\n [(value)]=\"element[column.property]\">\r\n <ng-container>\r\n <mat-option\r\n *ngFor=\"let item of column.listOptions\"\r\n [value]=\"item\">\r\n {{ getOptionValue(item) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'stateType'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ 'action' | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td mainTable__td__text-secondary__td\" mat-cell>\r\n <div class=\"flex-column\">\r\n <div class=\"flex-row full-width\">\r\n <div class=\"flex-third flex-column align-center-center\">\r\n <button mat-button class=\"btn-none-background-primary\"\r\n color=\"primary\"\r\n [disabled]=\"disabledSaveButton(element)\"\r\n (click)=\"fieldButtonEvent(column,element,SAVE)\"\r\n [attr.id]=\"'editable-save-' + (element.value?.id || '')\">\r\n {{ getPositiveWfActionKey(element.value.stateType) | translate }}\r\n </button>\r\n </div>\r\n <div class=\"flex-third flex-column align-center-center\">\r\n <button *ngIf=\"isPending\" mat-button class=\"btn-none-background-primary\"\r\n color=\"accent\"\r\n (click)=\"fieldButtonEvent(column,element,REJECT)\"\r\n [attr.id]=\"'editable-reject-' + (element.value?.id || '')\">\r\n {{ getNegativeWfActionKey(element.value.stateType) | translate }}\r\n </button>\r\n </div>\r\n <div class=\"flex-third flex-column align-center-center\"></div>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'year'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <mat-label>{{ labelKey(column) | translate }}</mat-label>\r\n <input matInput\r\n [disabled]=\"column.readonly\"\r\n [readonly]=\"column.readonly\"\r\n [matDatepicker]=\"picker\"\r\n [min]=\"minDate\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker startView=\"multi-year\"\r\n (yearSelected)=\"setMonthAndYear($event, picker, element,column)\"\r\n panelClass=\"example-month-picker\"></mat-datepicker>\r\n\r\n </mat-form-field>\r\n <!-- <mat-form-field class=\"flex-auto\" appearance=\"outline\" fxFlexFill>-->\r\n <!-- <input matInput [formControl]=\"getField(element, column)\">-->\r\n <!-- </mat-form-field>-->\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <!-- Visually hidden label just to trigger the floating label and asterisk -->\r\n <mat-label>\r\n </mat-label>\r\n\r\n <input matInput\r\n type=\"number\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'status'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-checkbox\r\n style=\"padding-bottom: 14px; padding-top: 14px;\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\"\r\n [style.pointer-events]=\"column.readonly ? 'none' : 'auto'\"\r\n [style.opacity]=\"column.readonly ? 0.7 : 1\"\r\n (click)=\"column.readonly ? $event.preventDefault() : null\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <mat-label>\r\n {{ labelKey(column) | translate }}\r\n </mat-label>\r\n <input matInput\r\n type=\"text\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>\r\n {{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <input matInput\r\n [matDatepicker]=\"xpicker\"\r\n [min]=\"minDate\"\r\n [formControl]=\"getField(element, column)\"\r\n [required]=\"column.required\"\r\n [readonly]=\"column.readonly\"\r\n [disabled]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [attr.aria-labelledby]=\"'label-' + column.property\"\r\n [attr.aria-describedby]=\"'error-' + column.property\">\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"xpicker\"\r\n [disabled]=\"column.readonly\">\r\n </mat-datepicker-toggle>\r\n <mat-datepicker #xpicker></mat-datepicker>\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <th *matHeaderCellDef class=\"mainTable__th\" mat-header-cell>{{ labelKey(column) | translate }}\r\n </th>\r\n <td *matCellDef=\"let element\" class=\"mainTable__td\"\r\n [ngClass]=\"['mainTable__td__text-secondary__td']\"\r\n mat-cell>\r\n <mat-form-field class=\"flex-auto fx-flex-fill\" appearance=\"outline\">\r\n <input matInput\r\n [readonly]=\"column.readonly\"\r\n [attr.aria-required]=\"column.required\"\r\n [formControl]=\"getField(element, column)\">\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <tr *matHeaderRowDef=\"visibleColumns\" mat-header-row></tr>\r\n <tr (click)=\"onSelectItem(row)\" (auxclick)=\"openNewTab(row)\"\r\n *matRowDef=\"let row; columns: visibleColumns | paginate:config\"\r\n [attr.id]=\"'editable-row-' + (row?.value?.id || row?.value?.key || '')\"\r\n mat-row></tr>\r\n </table>\r\n </form>\r\n </div>\r\n\r\n <div *ngIf=\"noDataFound && !pageInfo.lazyLoadData\" class=\"flex-row dataNotFound\">\r\n <div class=\"flex-column flex-full\">\r\n <span class=\"dataNotFound__details\">\r\n <mat-icon class=\"dataNotFound__details__icon\">info</mat-icon>\r\n <span>{{ 'dataNotFound' | translate }}</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-row mainTable\" *ngIf=\"!selectedFileFromUploader\">\r\n <div>\r\n <button *ngIf=\"!isPending && pageInfo.hasAddButton\" mat-button color=\"primary\" type=\"button\"\r\n (click)=\"addNewItem()\" id=\"editable-add-item-btn\">\r\n <mat-icon>add_box</mat-icon>\r\n {{ translationKey | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-row flex-wrap align-center-center main-pagination\" *ngIf=\"totalElements > 0\">\r\n <div class=\"flex-column flex-full\">\r\n <app-paginator [currentPage]=\"pageIndex\" [totalItems]=\"totalElements\" [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"[5, 10, 25, 50]\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></app-paginator>\r\n </div>\r\n <div class=\"flex-column flex-full countItem hide-gt-xs\">\r\n <span class=\"countItem__totalElement\">{{ 'totalCountItem' | translate }} : {{ this.totalElements }}</span>\r\n </div>\r\n <div class=\"flex-column flex-2\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"isBulkItemsSupported\" class=\"flex-row gap-10 align-start-start mainTable\">\r\n <div>\r\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"addBulkItems()\" [disabled]=\"shouldDisableBulkAdd()\" id=\"editable-bulk-add-btn\">\r\n <mat-icon>add_box</mat-icon>\r\n {{ 'addAll' | translate }}\r\n </button>\r\n </div>\r\n <div>\r\n <button mat-flat-button color=\"warn\" type=\"button\" [disabled]=\"!hasDataToClear()\" (click)=\"clearBulkItems()\" id=\"editable-bulk-clear-btn\">\r\n <mat-icon>delete</mat-icon>\r\n {{ 'clearAll' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".baseTable{padding:20px}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}.responsive-top-gap{margin-top:20px}@media (max-width: 959px){.responsive-top-gap{margin-top:1px}.baseTable{padding:20px;margin-inline:8px;width:max-content}}.flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column}.flex-half{flex:0 0 50%}.flex-80{flex:0 0 80%}.flex-15{flex:0 0 15%}.flex-2{flex:0 0 2%}.flex-full{flex:0 0 100%}.align-start-start{justify-content:flex-start;align-items:flex-start}.align-start-end{justify-content:flex-end;align-items:flex-start}.align-center-start{justify-content:flex-start;align-items:center}.align-center-center{justify-content:center;align-items:center}.align-end-start{justify-content:flex-start;align-items:flex-end}.align-end-end{justify-content:flex-end;align-items:flex-end}.gap-8{gap:8px}.gap-10{gap:10px}.gap-0{gap:0px}@media (max-width: 959px){.flex-column.lt-md{flex-direction:column}.flex-row.lt-md{flex-direction:row}.flex-full.lt-md{flex:0 0 100%}.align-center-center.lt-md{justify-content:center;align-items:center}}@media (max-width: 599px){.flex-hide.gt-xs{display:none!important}}\n"] }]
474
+ }], ctorParameters: () => [{ type: i1.BackendService }, { type: i2.Router }, { type: i3.FormBuilder }, { type: i4.MatDialog }, { type: i5.Directionality }], propDecorators: { filterRequest: [{
475
+ type: Input
476
+ }], superDataElements: [{
477
+ type: Input
478
+ }], pageInfo: [{
479
+ type: Input
480
+ }], enforceRefresh: [{
481
+ type: Input
482
+ }], isPending: [{
483
+ type: Input
484
+ }], isBulkItemsSupported: [{
485
+ type: Input
486
+ }], fields: [{
487
+ type: Input
488
+ }], searchFormFields: [{
489
+ type: Input
490
+ }], translationKey: [{
491
+ type: Input
492
+ }], formUpdated: [{
493
+ type: Output
494
+ }], saveActionEmitter: [{
495
+ type: Output
496
+ }], saveAttachmentEmitter: [{
497
+ type: Output
498
+ }], actionRequestCallback: [{
499
+ type: Input
500
+ }], uploaderComponent: [{
501
+ type: ViewChild,
502
+ args: ['uploader']
503
+ }], fileUpload: [{
504
+ type: ViewChild,
505
+ args: ['fileUpload']
506
+ }] } });
507
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUtYmFzZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2VkaXRhYmxlLWJhc2UtdGFibGUvZWRpdGFibGUtYmFzZS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2VkaXRhYmxlLWJhc2UtdGFibGUvZWRpdGFibGUtYmFzZS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsT0FBTyxFQUNQLFVBQVUsRUFDVixZQUFZLEVBQ1osYUFBYSxFQUNiLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osZUFBZSxFQUNmLE1BQU0sRUFDTixTQUFTLEVBQ1QsUUFBUSxFQUNULE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRCxPQUFPLEVBQTBD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RkFBNEY7b0JBQzVGLDhGQUE4RjtvQkFDOUYsaUNBQWlDO29CQUNqQyxJQUFJO29CQUNKLDBCQUEwQjtvQkFDMUIsaUNBQWlDO29CQUNqQyw4REFBOEQ7b0JBQzlELEtBQUs7b0JBRUwsdURBQXVEO3FCQUN4RDt1TEFxQ0QsYUFBYTtzQkFEWixLQUFLO2dCQUlOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFJRyxRQUFRO3NCQURoQixLQUFLO2dCQUlOLGNBQWM7c0JBRGIsS0FBSztnQkFJTixTQUFTO3NCQURSLEtBQUs7Z0JBSU4sb0JBQW9CO3NCQURuQixLQUFLO2dCQUlDLE1BQU07c0JBRFosS0FBSztnQkFJQyxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFHTixXQUFXO3NCQURWLE1BQU07Z0JBSVAsaUJBQWlCO3NCQURoQixNQUFNO2dCQUdQLHFCQUFxQjtzQkFEcEIsTUFBTTtnQkFHRSxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRWlCLGlCQUFpQjtzQkFBdkMsU0FBUzt1QkFBQyxVQUFVO2dCQTRTSSxVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7XHJcbiAgTWF0Q2VsbCxcclxuICBNYXRDZWxsRGVmLFxyXG4gIE1hdENvbHVtbkRlZixcclxuICBNYXRIZWFkZXJDZWxsLFxyXG4gIE1hdEhlYWRlckNlbGxEZWYsXHJcbiAgTWF0SGVhZGVyUm93LFxyXG4gIE1hdEhlYWRlclJvd0RlZixcclxuICBNYXRSb3csXHJcbiAgTWF0Um93RGVmLFxyXG4gIE1hdFRhYmxlXHJcbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3RhYmxlXCI7XHJcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xyXG5pbXBvcnQge01hdFNvcnRNb2R1bGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zb3J0XCI7XHJcbmltcG9ydCB7TmdDbGFzcywgTmdGb3JPZiwgTmdJZiwgTmdTd2l0Y2gsIE5nU3dpdGNoQ2FzZSwgTmdTd2l0Y2hEZWZhdWx0fSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7TWF0SWNvbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2ljb25cIjtcclxuaW1wb3J0IHtNYXRCdXR0b24sIE1hdEJ1dHRvbk1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2J1dHRvblwiO1xyXG5pbXBvcnQge05neFBhZ2luYXRpb25Nb2R1bGV9IGZyb20gXCJuZ3gtcGFnaW5hdGlvblwiO1xyXG5pbXBvcnQge1JvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7TWF0RXJyb3IsIE1hdEZvcm1GaWVsZCwgTWF0SW5wdXQsIE1hdExhYmVsLCBNYXRTdWZmaXh9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pbnB1dFwiO1xyXG5pbXBvcnQge0JhY2tlbmRTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vc2VydmljZXNcIjtcclxuaW1wb3J0IHtcclxuICBCYXNlVXRpbHMsXHJcbiAgYnVpbGRGb3JtRmllbGRzLFxyXG4gIGdldE5lZ2F0aXZlV2ZBY3Rpb25LZXksXHJcbiAgZ2V0UG9zaXRpdmVXZkFjdGlvbktleSxcclxuICBnZXRXZkFjdGlvbklkXHJcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL2Jhc2UtdXRpbHNcIjtcclxuaW1wb3J0IHtcclxuICBFTVBUWV9QQUdFX0lORk8sXHJcbiAgRmllbGRJbmZvLFxyXG4gIEZpbHRlcixcclxuICBGaWx0ZXJSZXF1ZXN0LFxyXG4gIExvb2t1cEl0ZW0sXHJcbiAgUGFnZUluZm8sXHJcbiAgU0VMRUNUX1JFQ09SRF9BQ1RJT04sXHJcbiAgU25hY2tNZXNzYWdlLFxyXG4gIFRhYmxlQ29sdW1uXHJcbn0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWxcIjtcclxuaW1wb3J0IHtEb0FjdGlvblJlcXVlc3QsIFJFSkVDVCwgU0FWRX0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvZG8tYWN0aW9uLXJlcXVlc3RcIjtcclxuaW1wb3J0IHtBY3Rpb25Db21tZW50Q29tcG9uZW50fSBmcm9tIFwiLi4vYWN0aW9uLWNvbW1lbnQvYWN0aW9uLWNvbW1lbnQuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7TWF0RGF0ZXBpY2tlciwgTWF0RGF0ZXBpY2tlcklucHV0LCBNYXREYXRlcGlja2VyVG9nZ2xlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlclwiO1xyXG5pbXBvcnQgbW9tZW50LCB7TW9tZW50fSBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQge0F1dG9Db21wbGV0ZUNvbXBvbmVudH0gZnJvbSBcIi4uL2F1dG8tY29tcGxldGUvYXV0by1jb21wbGV0ZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtEYXRlQWRhcHRlciwgTUFUX0RBVEVfRk9STUFUUywgTUFUX0RBVEVfTE9DQUxFLCBNYXRPcHRpb259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jb3JlXCI7XHJcbmltcG9ydCB7TWF0Q2hpcExpc3Rib3gsIE1hdENoaXBPcHRpb259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jaGlwc1wiO1xyXG5pbXBvcnQge1RpdGxlQmFyQ29tcG9uZW50fSBmcm9tIFwiLi4vdGl0bGUtYmFyL3RpdGxlLWJhci5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtQYWdpbmF0b3JDb21wb25lbnR9IGZyb20gXCIuLi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0RpcmVjdGlvbmFsaXR5fSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2JpZGlcIjtcclxuaW1wb3J0IHtBdHRhY2htZW50VXBsb2FkZXJDb21wb25lbnR9IGZyb20gXCIuLi9zaGFyZWQvYXR0YWNobWVudC11cGxvYWRlci9hdHRhY2htZW50LXVwbG9hZGVyLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0VxdWF0aW9uQnVpbGRlckNvbXBvbmVudH0gZnJvbSBcIi4uL2VxdWF0aW9uLWJ1aWxkZXIvZXF1YXRpb24tYnVpbGRlci5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtNYXRTZWxlY3R9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3RcIjtcclxuXHJcbmltcG9ydCB7QmFzZUZvcm1DYW52YXNDb21wb25lbnR9IGZyb20gXCIuLi9iYXNlLWZvcm0tY2FudmFzL2Jhc2UtZm9ybS1jYW52YXMuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7TWF0Q2hlY2tib3h9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveFwiO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1lZGl0YWJsZS1iYXNlLXRhYmxlJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9lZGl0YWJsZS1iYXNlLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9lZGl0YWJsZS1iYXNlLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW10sXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTmdDbGFzcyxcclxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcclxuICAgIE1hdEljb24sXHJcbiAgICBNYXRTb3J0TW9kdWxlLFxyXG4gICAgTWF0Q29sdW1uRGVmLFxyXG4gICAgTWF0SGVhZGVyQ2VsbERlZixcclxuICAgIE5nSWYsXHJcbiAgICBNYXRUYWJsZSxcclxuICAgIE1hdEhlYWRlckNlbGwsXHJcbiAgICBOZ1N3aXRjaCxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIE1hdENlbGwsXHJcbiAgICBNYXRDZWxsRGVmLFxyXG4gICAgTmd4UGFnaW5hdGlvbk1vZHVsZSxcclxuICAgIE1hdFJvdyxcclxuICAgIE1hdFJvd0RlZixcclxuICAgIE1hdEhlYWRlclJvdyxcclxuICAgIE5nU3dpdGNoQ2FzZSxcclxuICAgIE5nU3dpdGNoRGVmYXVsdCxcclxuICAgIE1hdEhlYWRlclJvd0RlZixcclxuICAgIE5nRm9yT2YsXHJcbiAgICBNYXRCdXR0b24sXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgTWF0SW5wdXQsXHJcbiAgICBBdXRvQ29tcGxldGVDb21wb25lbnQsXHJcbiAgICBNYXRGb3JtRmllbGQsXHJcbiAgICBNYXREYXRlcGlja2VyLFxyXG4gICAgTWF0RGF0ZXBpY2tlcklucHV0LFxyXG4gICAgTWF0RGF0ZXBpY2tlclRvZ2dsZSxcclxuICAgIE1hdExhYmVsLFxyXG4gICAgTWF0U3VmZml4LFxyXG4gICAgTWF0Q2hpcExpc3Rib3gsXHJcbiAgICBNYXRDaGlwT3B0aW9uLFxyXG4gICAgVGl0bGVCYXJDb21wb25lbnQsXHJcbiAgICBQYWdpbmF0b3JDb21wb25lbnQsXHJcbiAgICBBdHRhY2htZW50VXBsb2FkZXJDb21wb25lbnQsXHJcbiAgICBFcXVhdGlvbkJ1aWxkZXJDb21wb25lbnQsXHJcbiAgICBNYXRTZWxlY3QsXHJcbiAgICBNYXRPcHRpb24sXHJcbiAgICBCYXNlRm9ybUNhbnZhc0NvbXBvbmVudCxcclxuICAgIE1hdENoZWNrYm94LFxyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICAvLyBgTW9tZW50RGF0ZUFkYXB0ZXJgIGNhbiBiZSBhdXRvbWF0aWNhbGx5IHByb3ZpZGVkIGJ5IGltcG9ydGluZyBgTW9tZW50RGF0ZU1vZHVsZWAgaW4geW91clxyXG4gICAgLy8gYXBwbGljYXRpb24ncyByb290IG1vZHVsZS4gV2UgcHJvdmlkZSBpdCBhdCB0aGUgY29tcG9uZW50IGxldmVsIGhlcmUsIGR1ZSB0byBsaW1pdGF0aW9ucyBvZlxyXG4gICAgLy8gb3VyIGV4YW1wbGUgZ2VuZXJhdGlvbiBzY3JpcHQuXHJcbiAgICAvLyB7XHJcbiAgICAvLyAgIHByb3ZpZGU6IERhdGVBZGFwdGVyLFxyXG4gICAgLy8gICB1c2VDbGFzczogTW9tZW50RGF0ZUFkYXB0ZXIsXHJcbiAgICAvLyAgIGRlcHM6IFtNQVRfREFURV9MT0NBTEUsIE1BVF9NT01FTlRfREFURV9BREFQVEVSX09QVElPTlNdLFxyXG4gICAgLy8gfSxcclxuXHJcbiAgICAvLyB7IHByb3ZpZGU6IE1BVF9EQVRFX0ZPUk1BVFMsIHVzZVZhbHVlOiBNWV9GT1JNQVRTIH0sXHJcbiAgXSxcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBFZGl0YWJsZUJhc2VUYWJsZUNvbXBvbmVudCBleHRlbmRzIEJhc2VVdGlscyBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuXHJcbiAgcmVhZG9ubHkgbWluRGF0ZSA9IG1vbWVudChbMTgwMCwgMCwgMV0pO1xyXG5cclxuICBjb2xsZWN0aW9uID0ge2NvdW50OiA2MCwgZGF0YTogW119O1xyXG4gIGNvbmZpZyA9IHtcclxuICAgIGl0ZW1zUGVyUGFnZTogMTAsXHJcbiAgICBjdXJyZW50UGFnZTogMSxcclxuICAgIHRvdGFsSXRlbXM6IHRoaXMuY29sbGVjdGlvbi5jb3VudFxyXG4gIH07XHJcbiAgcHVibGljIG1heFNpemU6IG51bWJlciA9IDc7XHJcbiAgcHVibGljIGRpcmVjdGlvbkxpbmtzOiBib29sZWFuID0gdHJ1ZTtcclxuICBwdWJsaWMgYXV0b0hpZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgcmVzcG9uc2l2ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHVibGljIGxhYmVsczogYW55ID0ge1xyXG4gICAgcHJldmlvdXNMYWJlbDogJzwnLFxyXG4gICAgbmV4dExhYmVsOiAnPicsXHJcbiAgICBzY3JlZW5SZWFkZXJQYWdpbmF0aW9uTGFiZWw6ICdQYWdpbmF0aW9uJyxcclxuICAgIHNjcmVlblJlYWRlclBhZ2VMYWJlbDogJ3BhZ2UnLFxyXG4gICAgc2NyZWVuUmVhZGVyQ3VycmVudExhYmVsOiBgWW91J3JlIG9uIHBhZ2VgXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSB0aW1lcjogYW55O1xyXG4gIGRhdGFFbGVtZW50czogYW55W10gPSBbXTtcclxuICBub0RhdGFGb3VuZCA9IGZhbHNlO1xyXG4gIGlzTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdG90YWxFbGVtZW50cyA9IDA7XHJcbiAgcGFnZXNDb3VudCA9IDA7XHJcbiAgcGFnZUluZGV4ID0gMTtcclxuICBwYWdlU2l6ZSA9IDEwO1xyXG4gIGZvcm1QYXJhbTogRm9ybUdyb3VwO1xyXG4gIHNlYXJjaEZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgQElucHV0KClcclxuICBmaWx0ZXJSZXF1ZXN0OiBGaWx0ZXJSZXF1ZXN0O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHN1cGVyRGF0YUVsZW1lbnRzOiBhbnlbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBvdmVycmlkZSBwYWdlSW5mbzogUGFnZUluZm8gPSBFTVBUWV9QQUdFX0lORk87XHJcblxyXG4gIEBJbnB1dCgpIC8vQHRzLWlnbm9yZVxyXG4gIGVuZm9yY2VSZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaXNQZW5kaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaXNCdWxrSXRlbXNTdXBwb3J0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkvLyBAdHMtaWdub3JlXHJcbiAgcHVibGljIGZpZWxkczogRmllbGRJbmZvW10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkvLyBAdHMtaWdub3JlXHJcbiAgcHVibGljIHNlYXJjaEZvcm1GaWVsZHM6IEZpZWxkSW5mb1tdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIHRyYW5zbGF0aW9uS2V5OiBzdHJpbmcgPSAnYWRkTmV3JztcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgZm9ybVVwZGF0ZWQ6IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+ID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHNhdmVBY3Rpb25FbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKVxyXG4gIHNhdmVBdHRhY2htZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQElucHV0KCkgYWN0aW9uUmVxdWVzdENhbGxiYWNrITogKGFjdGlvblJlcXVlc3Q6IERvQWN0aW9uUmVxdWVzdCkgPT4gRG9BY3Rpb25SZXF1ZXN0O1xyXG5cclxuICBAVmlld0NoaWxkKCd1cGxvYWRlcicpIHVwbG9hZGVyQ29tcG9uZW50ITogQXR0YWNobWVudFVwbG9hZGVyQ29tcG9uZW50O1xyXG5cclxuICBjdXJyZW50RGlyZWN0aW9uOiAnbHRyJyB8ICdydGwnO1xyXG4gIHNlbGVjdGVkRmlsZUZyb21VcGxvYWRlcjogRmlsZSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgc2VsZWN0ZWRJdGVtOiBhbnk7XHJcblxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYmFja2VuZFNlcnZpY2U6IEJhY2tlbmRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBkaXJlY3Rpb25hbGl0eTogRGlyZWN0aW9uYWxpdHlcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGF0YUZvcm1BcnJheSgpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybVBhcmFtLmdldCgnZGF0YUZvcm1BcnJheScpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGV4dHJhY3RGb3JtYXQoY29sdW1uOiBUYWJsZUNvbHVtbjxhbnk+KSB7XHJcbiAgICByZXR1cm4gY29sdW1uPy5mb3JtYXQgfHwgJ2QvTS95eXl5LCBoOm1tIGEnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGFTb3VyY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhRm9ybUFycmF5LnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5jdXJyZW50RGlyZWN0aW9uID0gdGhpcy5kaXJlY3Rpb25hbGl0eS52YWx1ZTtcclxuICAgIHRoaXMuZGlyZWN0aW9uYWxpdHkuY2hhbmdlLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgdGhpcy5jdXJyZW50RGlyZWN0aW9uID0gdmFsdWU7XHJcbiAgICB9KVxyXG5cclxuICAgIGlmKHRoaXMuc3VwZXJEYXRhRWxlbWVudHM/Lmxlbmd0aD4wKXtcclxuICAgICAgdGhpcy5kYXRhRWxlbWVudHM9dGhpcy5zdXBlckRhdGFFbGVtZW50cztcclxuICAgICAgdGhpcy5idWlsZEZvcm0oKTtcclxuICAgICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZERhdGEoKSB7XHJcbiAgICB0aGlzLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IGZpZWxkLnJlYWRvbmx5ID0gdGhpcy5pc1BlbmRpbmcpO1xyXG5cclxuICAgIHRoaXMuZGF0YUVsZW1lbnRzID0gW107XHJcbiAgICB0aGlzLnRvdGFsRWxlbWVudHMgPSAwO1xyXG4gICAgdGhpcy5wYWdlc0NvdW50ID0gMTtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMubm9EYXRhRm91bmQgPSB0cnVlO1xyXG4gICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJSZXF1ZXN0LnBlbmRpbmdQYWdlID0gdGhpcy5pc1BlbmRpbmc7XHJcblxyXG4gICAgaWYgKCF0aGlzLnBhZ2VJbmZvLmxhenlMb2FkRGF0YSkge1xyXG4gICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmdldEl0ZW1zQnlGaWx0ZXIodGhpcy5maWx0ZXJSZXF1ZXN0LCB0aGlzLnBhZ2VJbmZvLmFwaVVyaSlcclxuICAgICAgICAuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhRWxlbWVudHMgPSByZXNwLmJvZHkgfHwgW107XHJcbiAgICAgICAgICB0aGlzLnRvdGFsRWxlbWVudHMgPSByZXNwLnRvdGFsU2l6ZSB8fCAwO1xyXG4gICAgICAgICAgdGhpcy5wYWdlc0NvdW50ID0gTWF0aC5tYXgoTWF0aC5jZWlsKHRoaXMudG90YWxFbGVtZW50cyAvIHRoaXMucGFnZVNpemUpLCAxKTtcclxuICAgICAgICAgIHRoaXMucGFnZUluZGV4ID0gKHRoaXMuZmlsdGVyUmVxdWVzdC5wYWdlSW5kZXggfHwgMCkgKyAxO1xyXG4gICAgICAgICAgdGhpcy5ub0RhdGFGb3VuZCA9IHRoaXMuZGF0YUVsZW1lbnRzLmxlbmd0aCA9PT0gMDtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYnVpbGRGb3JtKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkRm9ybSgpIHtcclxuICAgIHRoaXMuZm9ybVBhcmFtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGRhdGFGb3JtQXJyYXk6IHRoaXMuZmIuYXJyYXkodGhpcy5kYXRhRWxlbWVudHMubWFwKGl0ZW0gPT4gdGhpcy5mYi5ncm91cChidWlsZEZvcm1GaWVsZHModGhpcy5maWVsZHMsIGl0ZW0pKSkpLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZvcm1VcGRhdGVkLm5leHQodGhpcy5mb3JtUGFyYW0pO1xyXG4gIH1cclxuXHJcbiAgb25QYWdlQ2hhbmdlKGV2ZW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gZXZlbnQ7XHJcbiAgICB0aGlzLmdldE5leHQodGhpcy5wYWdlSW5kZXggLSAxKTtcclxuICB9XHJcbiAgZ2V0TmV4dChwYWdlSW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcclxuICAgIHRoaXMuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XHJcbiAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VTaXplQ2hhbmdlKGV2ZW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMucGFnZVNpemUgPSBldmVudDtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMuZmlsdGVyUmVxdWVzdC5wYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XHJcbiAgICB0aGlzLmdldE5leHQoMCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZXh0cmFjdEZpZWxkTmFtZShlbGVtZW50OiBhbnksIHByb3BlcnR5OiBzdHJpbmcpIHtcclxuICAgIGlmIChwcm9wZXJ0eS5pbmNsdWRlcygnLicpKSB7XHJcbiAgICAgIHJldHVybiBwcm9wZXJ0eS5zcGxpdCgnLicpLnJlZHVjZSgoYWNjLCBwYXJ0KSA9PiBhY2MgJiYgYWNjW3BhcnRdLCBlbGVtZW50KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBlbGVtZW50W3Byb3BlcnR5XTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCB2aXNpYmxlQ29sdW1ucygpIHtcclxuICAgIHJldHVybiB0aGlzLmZpZWxkcy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi52aXNpYmxlKS5tYXAoY29sdW1uID0+IGNvbHVtbi5wcm9wZXJ0eSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbXCJlbmZvcmNlUmVmcmVzaFwiXSAmJiAhY2hhbmdlc1tcImVuZm9yY2VSZWZyZXNoXCJdLmlzRmlyc3RDaGFuZ2UoKSAmJiBjaGFuZ2VzW1wiZW5mb3JjZVJlZnJlc2hcIl0uY3VycmVudFZhbHVlID09PSB0cnVlKSB7XHJcbiAgICAgIC8vIHRoaXMubG9hZERhdGEoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU2VsZWN0SXRlbShyb3c6IGFueSkge1xyXG4gICAgaWYgKHRoaXMucGFnZUluZm8uc2VsZlJvdXRpbmcpIHtcclxuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuaXNQZW5kaW5nID8gJ3BlbmRpbmcnIDogJ3ZpZXcnO1xyXG4gICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnBhZ2VJbmZvLmxpc3RSb3V0ZVBhdGggfHwgdGhpcy5yb3V0ZXIudXJsfS8ke21vZGV9YDtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Ake3VybH1gLCByb3c/LmlkXSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhY3Rpb24gPSBTRUxFQ1RfUkVDT1JEX0FDVElPTjtcclxuICAgIGFjdGlvbi5pZCA9IHJvdz8uaWQ7XHJcbiAgICAvLyB0aGlzLnVzZXJBY3Rpb24uZW1pdChhY3Rpb24pXHJcbiAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IHJvdztcclxuICB9XHJcblxyXG4gIG9wZW5OZXdUYWIocm93KSB7XHJcbiAgICBpZiAoIXRoaXMucGFnZUluZm8uZW1iZWRlZFRhYmxlT25seSkge1xyXG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5pc1BlbmRpbmcgPyAncGVuZGluZycgOiAndmlldyc7XHJcbiAgICAgIHdpbmRvdy5vcGVuKGAke3RoaXMucGFnZUluZm8ubGlzdFJvdXRlUGF0aH0vJHttb2RlfWAgKyAnLycgKyByb3c/LmlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBnZXRGaWVsZChlbGVtZW50LCBjb2x1bW46IEZpZWxkSW5mbykge1xyXG4gICAgICByZXR1cm4gIGVsZW1lbnQuY29udHJvbHNbY29sdW1uLnByb3BlcnR5XTtcclxuICB9XHJcblxyXG4gIGZpZWxkQnV0dG9uRXZlbnQoY29sdW1uLCBlbGVtZW50LCBhY3Rpb25JZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmRvU2F2ZUFwcHJvdmVBY3Rpb24oZWxlbWVudCwgYWN0aW9uSWQpO1xyXG4gIH1cclxuXHJcbiAgcGF0Y2hMb29rdXBWYWx1ZSgkZXZlbnQ6IExvb2t1cEl0ZW0sIHByb3BlcnR5OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZm9ybVVwZGF0ZWQuZW1pdCh0aGlzLnNlbGVjdGVkSXRlbSlcclxuICB9XHJcblxyXG4gIGFkZE5ld0l0ZW0oKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gdGhpcy5mb3JtUGFyYW0/LmdldCgnZGF0YUZvcm1BcnJheScpPy52YWx1ZTtcclxuICAgIGlmIChjdXJyZW50VmFsdWVzKSB7XHJcbiAgICAgIHRoaXMuZGF0YUVsZW1lbnRzID0gWy4uLmN1cnJlbnRWYWx1ZXNdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kYXRhRWxlbWVudHMucHVzaCh7fSk7XHJcbiAgICB0aGlzLmJ1aWxkRm9ybSgpO1xyXG4gIH1cclxuXHJcblxyXG4gIGRvU2F2ZUFwcHJvdmVBY3Rpb24oZWxlbWVudCwgdXNlckFjdGlvbklkKSB7XHJcbiAgICBsZXQgYWN0aW9uSWQgPSAgZ2V0V2ZBY3Rpb25JZChlbGVtZW50LnZhbHVlLnN0YXRlVHlwZSk7XHJcbiAgICBpZiAodXNlckFjdGlvbklkID09PSBSRUpFQ1QgJiYgdGhpcy5pc1BlbmRpbmcpIHtcclxuICAgICAgYWN0aW9uSWQgPTNcclxuICAgIH1cclxuICAgIGxldCByZXF1ZXN0ID0gbmV3IERvQWN0aW9uUmVxdWVzdCgpO1xyXG4gICAgcmVxdWVzdC5hY3Rpb25JZCA9IGFjdGlvbklkO1xyXG4gICAgcmVxdWVzdC5zdWJqZWN0ID0gZWxlbWVudC52YWx1ZTtcclxuXHJcbiAgICBpZiAodGhpcy5hY3Rpb25SZXF1ZXN0Q2FsbGJhY2spIHtcclxuICAgICAgcmVxdWVzdCA9IHRoaXMuYWN0aW9uUmVxdWVzdENhbGxiYWNrKHJlcXVlc3QpO1xyXG4gICAgICBpZiAocmVxdWVzdC5zdWJqZWN0LmlkID09PSBcIlwiKSB7XHJcbiAgICAgICAgcmVxdWVzdC5zdWJqZWN0LmlkID0gbnVsbDtcclxuICAgICAgICByZXF1ZXN0LnN1YmplY3Quc3RhdGVUeXBlID0gXCJORVdcIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXF1ZXN0LnN1YmplY3QuaWQgPT09IFwiXCIpIHtcclxuICAgICAgcmVxdWVzdC5zdWJqZWN0LmlkID0gbnVsbDtcclxuICAgICAgcmVxdWVzdC5zdWJqZWN0LnN0YXRlVHlwZSA9IFwiTkVXXCI7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQWN0aW9uQ29tbWVudENvbXBvbmVudCwge1xyXG4gICAgICBkYXRhOiB7bGFiZWw6IHVzZXJBY3Rpb25JZCA9PT0gMiA/ICdzYXZlJyA6ICdyZWplY3QnLCBpc1Rlcm1pbmF0aW9uOiBmYWxzZX0sXHJcbiAgICAgIHdpZHRoOiAnNjAwcHgnLFxyXG4gICAgICBoZWlnaHQ6ICdhdXRvJyxcclxuICAgICAgZGlyZWN0aW9uOiAgdGhpcy5jdXJyZW50RGlyZWN0aW9uXHJcbiAgICB9KTtcclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgcmVxdWVzdC5jb21tZW50ID0gcmVzdWx0LmNvbW1lbnQ7XHJcbiAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5kb0FjdGlvbldpdGhBdHRhY2htZW50cyhyZXF1ZXN0LCBbXSwgdGhpcy5wYWdlSW5mbyEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwLnZhbGlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZERhdGEoKTtcclxuICAgICAgICAgICAgbGV0ICBtZXNzYWdlID0gJyc7XHJcbiAgICAgICAgICAgIGlmIChhY3Rpb25JZCA9PT0gMSApIHtcclxuICAgICAgICAgICAgICBtZXNzYWdlID0gJ3NhdmVkX3N1Y2Nlc3NmdWxseScgO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbklkID09PTIgKSB7XHJcbiAgICAgICAgICAgICAgbWVzc2FnZSA9ICd1cGRhdGVkX3N1Y2Nlc3NmdWxseSc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uSWQgPT09MyApIHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnc3VjY2Vzc2Z1bF9yZWplY3RfbWVzc2FnZSc7XHJcbiAgICAgICAgICAgIH0gIGVsc2UgaWYgKGFjdGlvbklkID09PTQgKSB7XHJcbiAgICAgICAgICAgICAgbWVzc2FnZSA9ICdhcHByb3ZlX3N1Y2Nlc3NmdWxseSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS50b3BQYW5lbE1lc3NhZ2UkLm5leHQobmV3IFNuYWNrTWVzc2FnZShtZXNzYWdlLCB0cnVlLCAnc3VjY2VzcycpKTtcclxuICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgeCA9IHJlc3AubWVzc2FnZT8ubGVuZ3RoID4wID8gcmVzcC5tZXNzYWdlWzBdLmVycm9yTWVzc2FnZSA6ICdGQUlMRURfQ09OVEFDVF9BRE1JTic7XHJcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UoeCwgdHJ1ZSwgJ2Vycm9yJykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zYXZlQWN0aW9uRW1pdHRlci5lbWl0KHtpdGVtOnJlcXVlc3Quc3ViamVjdCwgcmVzcH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGdldFBvc2l0aXZlV2ZBY3Rpb25LZXkgPSBnZXRQb3NpdGl2ZVdmQWN0aW9uS2V5O1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBnZXROZWdhdGl2ZVdmQWN0aW9uS2V5ID0gZ2V0TmVnYXRpdmVXZkFjdGlvbktleTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgU0FWRSA9IFNBVkU7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IFJFSkVDVCA9IFJFSkVDVDtcclxuXHJcblxyXG4gIHNldE1vbnRoQW5kWWVhcihub3JtYWxpemVkTW9udGhBbmRZZWFyOiBNb21lbnQsIHBpY2tlcjogTWF0RGF0ZXBpY2tlcjxNb21lbnQ+LCBlbGVtZW50LCBjb2x1bW4pIHtcclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRm9ybUNvbnRyb2wobW9tZW50KCkpO1xyXG4gICAgY29uc3QgY3RybFZhbHVlID0gZGF0ZS52YWx1ZTtcclxuICAgIGN0cmxWYWx1ZS55ZWFyKG5vcm1hbGl6ZWRNb250aEFuZFllYXIueWVhcigpKTtcclxuICAgIGN0cmxWYWx1ZS5tb250aCgxKTtcclxuICAgIGN0cmxWYWx1ZS5kYXlPZlllYXIoMSk7XHJcbiAgICBlbGVtZW50LmNvbnRyb2xzW2NvbHVtbi5wcm9wZXJ0eV0uc2V0VmFsdWUoY3RybFZhbHVlKTtcclxuICAgIHBpY2tlci5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgc3dpdGNoVmlld01vZGUoYjogYm9vbGVhbikge1xyXG4gICAgdGhpcy5pc1BlbmRpbmcgPSBiO1xyXG4gICAgdGhpcy5sb2FkRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgb25DaGlwU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiBhbnksIGxpc3Rib3g/OiBNYXRDaGlwTGlzdGJveCk6IHZvaWQge1xyXG4gICAgY29uc3QgdmFsdWUgPSBldmVudC52YWx1ZTtcclxuICAgIGlmICh2YWx1ZSAhPT0gJ0NPTVBMRVRFRCcgJiYgdmFsdWUgIT09ICdQRU5ESU5HJykge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGxpc3Rib3ggJiYgKGxpc3Rib3gudmFsdWUgPSB0aGlzLmlzUGVuZGluZyA/ICdQRU5ESU5HJyA6ICdDT01QTEVURUQnKSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGlzUGVuZGluZyA9IHZhbHVlID09PSAnUEVORElORyc7XHJcbiAgICBpZiAodGhpcy5pc1BlbmRpbmcgIT09IGlzUGVuZGluZykgdGhpcy5zd2l0Y2hWaWV3TW9kZShpc1BlbmRpbmcpO1xyXG4gIH1cclxuXHJcbiAgYWRkQnVsa0l0ZW1zKCkge1xyXG4gICAgY29uc3QgbWVyZ2VkOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIHRoaXMuZGF0YUZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChncm91cDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgIG1lcmdlZC5wdXNoKGdyb3VwLnZhbHVlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCByZXF1ZXN0ID0gbmV3IERvQWN0aW9uUmVxdWVzdCgpO1xyXG4gICAgcmVxdWVzdC5hY3Rpb25JZCA9IDE7XHJcblxyXG4gICAgcmVxdWVzdC5zdWJqZWN0ID0geyBpbnZvaWNlczogbWVyZ2VkIH07XHJcblxyXG4gICAgaWYgKHRoaXMuYWN0aW9uUmVxdWVzdENhbGxiYWNrKSB7XHJcbiAgICAgIHJlcXVlc3QgPSB0aGlzLmFjdGlvblJlcXVlc3RDYWxsYmFjayhyZXF1ZXN0KTtcclxuXHJcbiAgICAgIHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcyA9IHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcy5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLmlkID09PSBcIlwiKSB7XHJcbiAgICAgICAgICBpdGVtLmlkID0gbnVsbDtcclxuICAgICAgICAgIGl0ZW0uc3RhdGVUeXBlID0gXCJORVdcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcyA9IHJlcXVlc3Quc3ViamVjdC5pbnZvaWNlcy5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5pZCA9PT0gXCJcIikge1xyXG4gICAgICAgIGl0ZW0uaWQgPSBudWxsO1xyXG4gICAgICAgIGl0ZW0uc3RhdGVUeXBlID0gXCJORVdcIjtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gaXRlbTtcclxuICAgIH0pO1xyXG5cclxuXHJcblxyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihBY3Rpb25Db21tZW50Q29tcG9uZW50LCB7XHJcbiAgICAgIGRhdGE6IHtsYWJlbDogICdzYXZlJyAsIGlzVGVybWluYXRpb246IGZhbHNlfSxcclxuICAgICAgd2lkdGg6ICc2MDBweCcsXHJcbiAgICAgIGhlaWdodDogJ2F1dG8nLFxyXG4gICAgICBkaXJlY3Rpb246ICB0aGlzLmN1cnJlbnREaXJlY3Rpb25cclxuICAgIH0pO1xyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICByZXF1ZXN0LmNvbW1lbnQgPSByZXN1bHQuY29tbWVudDtcclxuICAgICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmRvQWN0aW9uV2l0aEF0dGFjaG1lbnQocmVxdWVzdCwgdGhpcy5zZWxlY3RlZEZpbGVGcm9tVXBsb2FkZXIsIHRoaXMucGFnZUluZm8hKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcC52YWxpZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyQnVsa0l0ZW1zKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UoJ3NhdmVkX3N1Y2Nlc3NmdWxseScsIHRydWUsICdzdWNjZXNzJykpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UodGhpcy5wYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgJy4nICsgcmVzcC5tZXNzYWdlPy5bMF0/LmVycm9yQ29kZSwgdHJ1ZSwgJ2Vycm9yJykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zYXZlQXR0YWNobWVudEVtaXR0ZXIuZW1pdCh7aXRlbTpyZXF1ZXN0LnN1YmplY3QsIHJlc3B9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7ICB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVVcGxvYWQnKSBmaWxlVXBsb2FkOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG5cclxuICBoYW5kbGVGaWxlVXBsb2FkKCRldmVudDogRmlsZSkge1xyXG4gICAgbGV0IGFjdGlvbklkID0gIGdldFdmQWN0aW9uSWQoJ05FVycpO1xyXG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgRG9BY3Rpb25SZXF1ZXN0KCk7XHJcbiAgICByZXF1ZXN0LmFjdGlvbklkID0gYWN0aW9uSWQ7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVGcm9tVXBsb2FkZXIgPSAkZXZlbnQ7XHJcblxyXG4gIH1cclxuXHJcbiAgc2hvdWxkRGlzYWJsZUJ1bGtBZGQoKSB7XHJcbiAgICBjb25zdCBoYXNGaWxlID0gISF0aGlzLnNlbGVjdGVkRmlsZUZyb21VcGxvYWRlcjtcclxuICAgIHJldHVybiAoIXRoaXMuZm9ybVBhcmFtPy52YWxpZCB8fCB0aGlzLmRhdGFGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoID09PSAwKSAmJiAhaGFzRmlsZTtcclxuICB9XHJcbiAgaGFuZGxlRXF1YXRpb25DaGFuZ2UoZXZlbnQ6IHsgdmFsdWU6IGFueVtdLCB2YWxpZDogYm9vbGVhbiB9LCBlbGVtZW50OiBGb3JtR3JvdXAsIGNvbHVtbjogYW55KTogdm9pZCB7XHJcbiAgICBlbGVtZW50LnZhbHVlW2NvbHVtbi5wcm9wZXJ0eV0gPSBldmVudC52YWx1ZTtcclxuICAgIGNvbnN0IHsgdmFsdWUsIHZhbGlkIH0gPSBldmVudDtcclxuICAgIGVsZW1lbnQuZ2V0KGNvbHVtbi5wcm9wZXJ0eSk/LnNldFZhbHVlKHZhbHVlKTtcclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgZWxlbWVudC5nZXQoY29sdW1uLnByb3BlcnR5KT8uc2V0RXJyb3JzKHsgaW52YWxpZEVxdWF0aW9uOiB0cnVlIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZWxlbWVudC5nZXQoY29sdW1uLnByb3BlcnR5KT8uc2V0RXJyb3JzKG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xlYXJCdWxrSXRlbXMoKSB7XHJcbiAgICB0aGlzLmRhdGFFbGVtZW50cyA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGVGcm9tVXBsb2FkZXIgPSBudWxsO1xyXG4gICAgdGhpcy51cGxvYWRlckNvbXBvbmVudC5jbGVhckZpbGUoKTtcclxuICAgIHRoaXMuYnVpbGRGb3JtKCk7XHJcbiAgICB0aGlzLmZvcm1VcGRhdGVkLmVtaXQodGhpcy5mb3JtUGFyYW0pO1xyXG4gIH1cclxuXHJcbiAgaGFzRGF0YVRvQ2xlYXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuZGF0YUVsZW1lbnRzICYmIHRoaXMuZGF0YUVsZW1lbnRzLmxlbmd0aCA+IDApIHx8ICEhdGhpcy5zZWxlY3RlZEZpbGVGcm9tVXBsb2FkZXI7XHJcbiAgfVxyXG5nZXRPcHRpb25WYWx1ZShpdGVtOiBhbnkpIHtcclxuICAgIGNvbnN0IHZhbHVlID0gdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnID9cclxuICAgICAgaXRlbS5lbmdsaXNoTmFtZSA6IGl0ZW07XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBkaXNhYmxlZFNhdmVCdXR0b24oZWxlbWVudCkge1xyXG4gICAgcmV0dXJuICFlbGVtZW50LnZhbGlkIHx8ICghdGhpcy5pc1BlbmRpbmcgJiYgZWxlbWVudC52YWx1ZS5zdGF0ZVR5cGUgPT0gJ1BFTkRJTkcnKTtcclxuICB9XHJcblxyXG4gIGRvU2VhcmNoKCkge1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoRm9ybS52YWxpZCkge1xyXG4gICAgICBjb25zdCByYXdWYWx1ZXMgPSB0aGlzLnNlYXJjaEZvcm0uZ2V0UmF3VmFsdWUoKTtcclxuICAgICAgdGhpcy5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleD0wO1xyXG4gICAgICB0aGlzLmZpbHRlclJlcXVlc3QuZmlsdGVycyA9IFtdO1xyXG4gICAgICB0aGlzLnNlYXJjaEZvcm1GaWVsZHMuZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmF3VmFsdWVzW3gucHJvcGVydHldO1xyXG4gICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgICAgICAgIGtleTogMCxcclxuICAgICAgICAgICAgICBsYWJlbDogeC5wcm9wZXJ0eSxcclxuICAgICAgICAgICAgICBmaWVsZE5hbWU6IHguc2VhcmNoQXR0cmlidXRlLFxyXG4gICAgICAgICAgICAgIHZhbHVlT2JqZWN0IDogeC5zZWFyY2hBdHRyaWJ1dGUuaW5jbHVkZXMoJy4nKSA/IHZhbHVlW3guc2VhcmNoQXR0cmlidXRlLnNwbGl0KCcuJykucG9wKCldIDogdmFsdWUsXHJcbiAgICAgICAgICAgICAgb3BlcmF0b3I6IHguc2VhcmNoT3BlcmF0b3IsXHJcbiAgICAgICAgICAgICAgZmlsdGVyVHlwZTogJ0ZJTEVEX0ZJTFRFUidcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyUmVxdWVzdC5maWx0ZXJzLnB1c2goZmlsdGVyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UoJ0lOVkFMSURfU0VBUkNIX0ZPUk0nLCB0cnVlLCAnZXJyb3InKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93U2VhcmNoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoRm9ybUZpZWxkcz8ubGVuZ3RoID4gMDtcclxuICB9XHJcblxyXG4gIGNsZWFyU2VhcmNoKCkge1xyXG4gICAgdGhpcy5zZWFyY2hGb3JtLmdldCgnc2VjdG9yVHlwZScpLnNldFZhbHVlKHtpZDotMTAwLCBlbmdsaXNoTmFtZTonYWFhJywgY29kZTonYWFhJywgYXJhYmljTmFtZTonYWFhJ30pO1xyXG4gICAgdGhpcy5zZWFyY2hGb3JtLnJlc2V0KCk7XHJcbiAgICB0aGlzLmRvU2VhcmNoKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVTZWFyY2hGb3JtKCRldmVudDogRm9ybUdyb3VwKSB7XHJcbiAgICB0aGlzLnNlYXJjaEZvcm0gPSAkZXZlbnRcclxuICB9XHJcblxyXG4gIHZhbGlkU2VhcmNoRGF0YSgpIHtcclxuICAgIHJldHVybiAhdGhpcy5zZWFyY2hGb3JtLnZhbGlkIHx8IHRydWU7XHJcbiAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiYmFzZVRhYmxlIGZsZXgtY29sdW1uXCI+XHJcbiAgPGRpdiBjbGFzcz1cImxlZnQtYWxpZ25cIj5cclxuICAgIDxhcHAtYXR0YWNobWVudC11cGxvYWRlciAjdXBsb2FkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzQnVsa0l0ZW1zU3VwcG9ydGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZVNlbGVjdGVkKT1cImhhbmRsZUZpbGVVcGxvYWQoJGV2ZW50KVwiPlxyXG4gICAgPC9hcHAtYXR0YWNobWVudC11cGxvYWRlcj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGZ1bGwtd2lkdGhcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LWhhbGYgZmxleC1jb2x1bW4gYWxpZ24tY2VudGVyLXN0YXJ0XCI+XHJcbiAgICAgIDxhcHAtdGl0bGUtYmFyIFtwYWdlVGl0bGVdPVwicGFnZUluZm8uaGlkZVRpdGxlID8gJycgOiBwYWdlSW5mby5sYWJlbHNTZWN0aW9uKycubGlzdF90aXRsZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbdGl0bGVNb2RlXT1cIicnXCJcclxuICAgICAgICAgICAgICAgICAgICAgW25ld0FjdGlvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtzaG93RXh0cmFjdEJ1dHRvbl09XCIhcGFnZUluZm8uaGlkZUV4dHJhY3RCdXR0b25cIj5cclxuICAgICAgPC9hcHAtdGl0bGUtYmFyPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImZvbnQtc21hbGxcIj57eyAndG90YWxDb3VudEl0ZW0nIHwgdHJhbnNsYXRlIH19IDoge3sgdGhpcy50b3RhbEVsZW1lbnRzIH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleC1oYWxmIGZsZXgtY29sdW1uIGFsaWduLXN0YXJ0LWVuZFwiPlxyXG4gICAgICA8bWF0LWNoaXAtbGlzdGJveCAjYm94IFthdHRyLmFyaWEtbGFiZWxdPVwiJ0JBU0VfVEFCTEUuZG9jdW1lbnRTdGF0dXMnIHwgdHJhbnNsYXRlXCIgW211bHRpcGxlXT1cImZhbHNlXCIgW3ZhbHVlXT1cImlzUGVuZGluZyA/ICdQRU5ESU5HJyA6ICdDT01QTEVURUQnXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjaGFuZ2UpPVwib25DaGlwU2VsZWN0aW9uQ2hhbmdlKCRldmVudCwgYm94KVwiICpuZ0lmPVwicGFnZUluZm8uZHJhZnRTdXBwb3J0ZWRcIj5cclxuICAgICAgICA8bWF0LWNoaXAtb3B0aW9uIFtzZWxlY3RlZF09XCIhaXNQZW5kaW5nXCIgW2NvbG9yXT1cIidhY2NlbnQnXCIgdmFsdWU9XCJDT01QTEVURURcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICB7eyAnZmluaXNoZWQnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgPC9tYXQtY2hpcC1vcHRpb24+XHJcbiAgICAgICAgPG1hdC1jaGlwLW9wdGlvbiBbc2VsZWN0ZWRdPVwiaXNQZW5kaW5nXCIgW2NvbG9yXT1cIidhY2NlbnQnXCIgdmFsdWU9XCJQRU5ESU5HXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAge3sgJ3RvZG8nIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgPC9tYXQtY2hpcC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LWNoaXAtbGlzdGJveD5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd1NlYXJjaCgpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3cgZnVsbC13aWR0aFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleC04MCBmbGV4LWNvbHVtbiBhbGlnbi1zdGFydC1lbmRcIj5cclxuICAgICAgICA8YXBwLWJhc2UtZm9ybS1jYW52YXMgY2xhc3M9XCJmbGV4LWZpbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFnZUluZm9dPVwicGFnZUluZm9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRzXT1cInNlYXJjaEZvcm1GaWVsZHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZWRpdGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtVXBkYXRlZCk9XCJ1cGRhdGVTZWFyY2hGb3JtKCRldmVudClcIj5cclxuICAgICAgICA8L2FwcC1iYXNlLWZvcm0tY2FudmFzPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMTUgZmxleC1jb2x1bW4gYWxpZ24tc3RhcnQtZW5kXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGFsaWduLWNlbnRlci1jZW50ZXIgZ2FwLTggZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZG9TZWFyY2goKVwiIGlkPVwiZWRpdGFibGUtc2VhcmNoLWJ0blwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+c2VhcmNoPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAge3sgJ3NlYXJjaCcgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2xlYXJTZWFyY2goKVwiIGlkPVwiZWRpdGFibGUtY2xlYXItc2VhcmNoLWJ0blwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxyXG4gICAgICAgICAgICB7eyAnY2xlYXInIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGZ1bGwtd2lkdGggYmFzZVRhYmxlX19kZXRhaWxzQ29sdW1uXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleC1mdWxsXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0xvYWRlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdyBtYWluVGFibGUgZ2FwLTAgYWxpZ24tc3RhcnQtc3RhcnRcIj5cclxuICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVBhcmFtXCIgY2xhc3M9XCJmbGV4LWZpbGxcIj5cclxuICAgICAgICAgICAgPHRhYmxlIFtkYXRhU291cmNlXT1cImRhdGFGb3JtQXJyYXkuY29udHJvbHNcIiBjbGFzcz1cImZsZXgtZmlsbFwiIG1hdC10YWJsZSBtYXRTb3J0PlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiB0aGlzLmZpZWxkczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ7e2NvbHVtbi5wcm9wZXJ0eX19XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbHVtbi50eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2VxdWF0aW9uLWJ1aWxkZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGggKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJtYWluVGFibGVfX3RoXCIgbWF0LWhlYWRlci1jZWxsPnt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiIG1hdC1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLWVxdWF0aW9uLWJ1aWxkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJlbGVtZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY29sdW1uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiY29sdW1uLnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNQZW5kaW5nXT1cImlzUGVuZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJoYW5kbGVFcXVhdGlvbkNoYW5nZSgkZXZlbnQsIGVsZW1lbnQsIGNvbHVtbilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItZXF1YXRpb24tYnVpbGRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsb29rdXAnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGggKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJtYWluVGFibGVfX3RoXCIgbWF0LWhlYWRlci1jZWxsPnt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtYXV0by1jb21wbGV0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImVsZW1lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2x1bW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VmFsdWVdPVwiZWxlbWVudC5nZXQoY29sdW1uLnByb3BlcnR5KT8udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZFZhbHVlKT1cInBhdGNoTG9va3VwVmFsdWUoJGV2ZW50LCBjb2x1bW4ucHJvcGVydHkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwLWF1dG8tY29tcGxldGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsaXN0J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibWFpblRhYmxlX190aFwiIG1hdC1oZWFkZXItY2VsbD57eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCAgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlsnbWFpblRhYmxlX190ZF9fdGV4dC1zZWNvbmRhcnlfX3RkJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e2VsZW1lbnR9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7Y29sdW1uLnByb3BlcnR5fX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29sdW1uLmxhYmVsISB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJlbGVtZW50W2NvbHVtbi5wcm9wZXJ0eV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29sdW1uLmxpc3RPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0T3B0aW9uVmFsdWUoaXRlbSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3RhdGVUeXBlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibWFpblRhYmxlX190aFwiIG1hdC1oZWFkZXItY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ2FjdGlvbicgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZCBtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGRcIiBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGZ1bGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXRoaXJkIGZsZXgtY29sdW1uIGFsaWduLWNlbnRlci1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwiYnRuLW5vbmUtYmFja2dyb3VuZC1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFNhdmVCdXR0b24oZWxlbWVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmaWVsZEJ1dHRvbkV2ZW50KGNvbHVtbixlbGVtZW50LFNBVkUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCInZWRpdGFibGUtc2F2ZS0nICsgKGVsZW1lbnQudmFsdWU/LmlkIHx8ICcnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldFBvc2l0aXZlV2ZBY3Rpb25LZXkoZWxlbWVudC52YWx1ZS5zdGF0ZVR5cGUpIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC10aGlyZCBmbGV4LWNvbHVtbiBhbGlnbi1jZW50ZXItY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpc1BlbmRpbmdcIiBtYXQtYnV0dG9uIGNsYXNzPVwiYnRuLW5vbmUtYmFja2dyb3VuZC1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cImFjY2VudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZpZWxkQnV0dG9uRXZlbnQoY29sdW1uLGVsZW1lbnQsUkVKRUNUKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiJ2VkaXRhYmxlLXJlamVjdC0nICsgKGVsZW1lbnQudmFsdWU/LmlkIHx8ICcnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldE5lZ2F0aXZlV2ZBY3Rpb25LZXkoZWxlbWVudC52YWx1ZS5zdGF0ZVR5cGUpIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC10aGlyZCBmbGV4LWNvbHVtbiBhbGlnbi1jZW50ZXItY2VudGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIneWVhcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIm1haW5UYWJsZV9fdGhcIiBtYXQtaGVhZGVyLWNlbGw+e3sgbGFiZWxLZXkoY29sdW1uKSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtYWluVGFibGVfX3RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJbJ21haW5UYWJsZV9fdGRfX3RleHQtc2Vjb25kYXJ5X190ZCddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtY2VsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZmxleC1hdXRvIGZ4LWZsZXgtZmlsbFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiY29sdW1uLnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwicGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldEZpZWxkKGVsZW1lbnQsIGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJjb2x1bW4ucmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2xhYmVsLScgKyBjb2x1bW4ucHJvcGVydHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIidlcnJvci0nICsgY29sdW1uLnByb3BlcnR5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI3BpY2tlciBzdGFydFZpZXc9XCJtdWx0aS15ZWFyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHllYXJTZWxlY3RlZCk9XCJzZXRNb250aEFuZFllYXIoJGV2ZW50LCBwaWNrZXIsIGVsZW1lbnQsY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M9XCJleGFtcGxlLW1vbnRoLXBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXgtYXV0b1wiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgZnhGbGV4RmlsbD4tLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiZ2V0RmllbGQoZWxlbWVudCwgY29sdW1uKVwiPi0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+LS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGggKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJtYWluVGFibGVfX3RoXCIgbWF0LWhlYWRlci1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBjbGFzcz1cIm1haW5UYWJsZV9fdGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlsnbWFpblRhYmxlX190ZF9fdGV4dC1zZWNvbmRhcnlfX3RkJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1jZWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmbGV4LWF1dG8gZngtZmxleC1maWxsXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFZpc3VhbGx5IGhpZGRlbiBsYWJlbCBqdXN0IHRvIHRyaWdnZXIgdGhlIGZsb2F0aW5nIGxhYmVsIGFuZCBhc3RlcmlzayAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJnZXRGaWVsZChlbGVtZW50LCBjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImNvbHVtbi5yZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJjb2x1bW4ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImNvbHVtbi5yZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGNvbHVtbi5wcm9wZXJ0eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiJ2Vycm9yLScgKyBjb2x1bW4ucHJvcGVydHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N0YXR1cydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIm1haW5UYWJsZV9fdGhcIiBtYXQtaGVhZGVyLWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmctYm90dG9tOiAxNHB4OyBwYWRkaW5nLXRvcDogMTRweDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJnZXRGaWVsZChlbGVtZW50LCBjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImNvbHVtbi5yZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgY29sdW1uLnByb3BlcnR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIidlcnJvci0nICsgY29sdW1uLnByb3BlcnR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUucG9pbnRlci1ldmVudHNdPVwiY29sdW1uLnJlYWRvbmx5ID8gJ25vbmUnIDogJ2F1dG8nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUub3BhY2l0eV09XCJjb2x1bW4ucmVhZG9ubHkgPyAwLjcgOiAxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29sdW1uLnJlYWRvbmx5ID8gJGV2ZW50LnByZXZlbnREZWZhdWx0KCkgOiBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGV4dCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIm1haW5UYWJsZV9fdGhcIiBtYXQtaGVhZGVyLWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXgtYXV0byBmeC1mbGV4LWZpbGxcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYWJlbEtleShjb2x1bW4pIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldEZpZWxkKGVsZW1lbnQsIGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImNvbHVtbi5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgY29sdW1uLnByb3BlcnR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCInZXJyb3ItJyArIGNvbHVtbi5wcm9wZXJ0eVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cIm1haW5UYWJsZV9fdGhcIiBtYXQtaGVhZGVyLWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXgtYXV0byBmeC1mbGV4LWZpbGxcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJ4cGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldEZpZWxkKGVsZW1lbnQsIGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29sdW1uLnJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImNvbHVtbi5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImNvbHVtbi5yZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGNvbHVtbi5wcm9wZXJ0eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiJ2Vycm9yLScgKyBjb2x1bW4ucHJvcGVydHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JdPVwieHBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uLnJlYWRvbmx5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyICN4cGlja2VyPjwvbWF0LWRhdGVwaWNrZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGggKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJtYWluVGFibGVfX3RoXCIgbWF0LWhlYWRlci1jZWxsPnt7IGxhYmVsS2V5KGNvbHVtbikgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibWFpblRhYmxlX190ZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWydtYWluVGFibGVfX3RkX190ZXh0LXNlY29uZGFyeV9fdGQnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZsZXgtYXV0byBmeC1mbGV4LWZpbGxcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiY29sdW1uLnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJjb2x1bW4ucmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZ2V0RmllbGQoZWxlbWVudCwgY29sdW1uKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8dHIgKm1hdEhlYWRlclJvd0RlZj1cInZpc2libGVDb2x1bW5zXCIgbWF0LWhlYWRlci1yb3c+PC90cj5cclxuICAgICAgICAgICAgICA8dHIgKGNsaWNrKT1cIm9uU2VsZWN0SXRlbShyb3cpXCIgKGF1eGNsaWNrKT1cIm9wZW5OZXdUYWIocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiB2aXNpYmxlQ29sdW1ucyAgfCBwYWdpbmF0ZTpjb25maWdcIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCInZWRpdGFibGUtcm93LScgKyAocm93Py52YWx1ZT8uaWQgfHwgcm93Py52YWx1ZT8ua2V5IHx8ICcnKVwiXHJcbiAgICAgICAgICAgICAgICAgIG1hdC1yb3c+PC90cj5cclxuICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIm5vRGF0YUZvdW5kICYmICFwYWdlSW5mby5sYXp5TG9hZERhdGFcIiBjbGFzcz1cImZsZXgtcm93IGRhdGFOb3RGb3VuZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uIGZsZXgtZnVsbFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGFOb3RGb3VuZF9fZGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImRhdGFOb3RGb3VuZF9fZGV0YWlsc19faWNvblwiPmluZm88L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDxzcGFuPnt7ICdkYXRhTm90Rm91bmQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93IG1haW5UYWJsZVwiICpuZ0lmPVwiIXNlbGVjdGVkRmlsZUZyb21VcGxvYWRlclwiPlxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFpc1BlbmRpbmcgJiYgcGFnZUluZm8uaGFzQWRkQnV0dG9uXCIgbWF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkTmV3SXRlbSgpXCIgaWQ9XCJlZGl0YWJsZS1hZGQtaXRlbS1idG5cIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24+YWRkX2JveDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAge3sgdHJhbnNsYXRpb25LZXkgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93IGZsZXgtd3JhcCBhbGlnbi1jZW50ZXItY2VudGVyIG1haW4tcGFnaW5hdGlvblwiICpuZ0lmPVwidG90YWxFbGVtZW50cyA+IDBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbHVtbiBmbGV4LWZ1bGxcIj5cclxuICAgICAgICAgICAgPGFwcC1wYWdpbmF0b3IgW2N1cnJlbnRQYWdlXT1cInBhZ2VJbmRleFwiIFt0b3RhbEl0ZW1zXT1cInRvdGFsRWxlbWVudHNcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFnZVNpemVPcHRpb25zXT1cIls1LCAxMCwgMjUsIDUwXVwiIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPjwvYXBwLXBhZ2luYXRvcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uIGZsZXgtZnVsbCBjb3VudEl0ZW0gaGlkZS1ndC14c1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvdW50SXRlbV9fdG90YWxFbGVtZW50XCI+e3sgJ3RvdGFsQ291bnRJdGVtJyB8IHRyYW5zbGF0ZSB9fSA6IHt7IHRoaXMudG90YWxFbGVtZW50cyB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sdW1uIGZsZXgtMlwiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2ICpuZ0lmPVwiaXNCdWxrSXRlbXNTdXBwb3J0ZWRcIiBjbGFzcz1cImZsZXgtcm93IGdhcC0xMCBhbGlnbi1zdGFydC1zdGFydCBtYWluVGFibGVcIj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiYWRkQnVsa0l0ZW1zKClcIiBbZGlzYWJsZWRdPVwic2hvdWxkRGlzYWJsZUJ1bGtBZGQoKVwiIGlkPVwiZWRpdGFibGUtYnVsay1hZGQtYnRuXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmFkZF9ib3g8L21hdC1pY29uPlxyXG4gICAgICAgIHt7ICdhZGRBbGwnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2PlxyXG4gICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cIndhcm5cIiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIiFoYXNEYXRhVG9DbGVhcigpXCIgKGNsaWNrKT1cImNsZWFyQnVsa0l0ZW1zKClcIiBpZD1cImVkaXRhYmxlLWJ1bGstY2xlYXItYnRuXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICAgICAge3sgJ2NsZWFyQWxsJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19