ng-pli-commons 0.0.1908 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (471) hide show
  1. package/esm2022/lib/components/backoffice.commons.component.mjs +40 -0
  2. package/esm2022/lib/components/common.lists.component.mjs +194 -0
  3. package/{esm2020 → esm2022}/lib/components/configuration-token/configuration-token-subject.service.mjs +23 -23
  4. package/esm2022/lib/components/configuration-token/configuration-token.component.mjs +665 -0
  5. package/esm2022/lib/components/configuration-token/guarantee-token/guarantee-token.component.mjs +103 -0
  6. package/esm2022/lib/components/configuration-token/snapshot-token/snapshot-token.component.mjs +108 -0
  7. package/esm2022/lib/components/configuration.commons.component.mjs +40 -0
  8. package/{esm2020 → esm2022}/lib/components/dashboard.commons.component.mjs +84 -84
  9. package/esm2022/lib/components/dynamic-filter/dynamic-filter.component.mjs +131 -0
  10. package/esm2022/lib/components/excel-to-json/excel-to-json.component.mjs +54 -0
  11. package/esm2022/lib/components/frontoffice.commons.component.mjs +86 -0
  12. package/esm2022/lib/components/pdf-analyzer/pdf-analyzer.component.mjs +162 -0
  13. package/{esm2020 → esm2022}/lib/components/pdf-config/pdf-config.component.mjs +170 -170
  14. package/esm2022/lib/components/pdf-generator/pdf-generator.component.mjs +223 -0
  15. package/esm2022/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.mjs +307 -0
  16. package/esm2022/lib/components/pdf-visualizer/pdf-visualizer.component.mjs +387 -0
  17. package/esm2022/lib/components/progress-bar/progress-bar.component.mjs +92 -0
  18. package/esm2022/lib/components/segmentation-tokens/segmentation-tokens.component.mjs +199 -0
  19. package/esm2022/lib/components/select-ppp/select-ppp.component.mjs +199 -0
  20. package/esm2022/lib/components/show-hide-columns/show-hide-columns-table.component.mjs +116 -0
  21. package/esm2022/lib/components/token/token.component.mjs +1006 -0
  22. package/esm2022/lib/components/tokens-calculator/tokens-calculator.component.mjs +128 -0
  23. package/{esm2020 → esm2022}/lib/directives/currency-colfuturo-formatter.directive.mjs +47 -47
  24. package/{esm2020 → esm2022}/lib/directives/currency-decimal-colfuturo-formatter.directive.mjs +34 -34
  25. package/esm2022/lib/ng-pli-commons.module.mjs +387 -0
  26. package/{esm2020 → esm2022}/lib/ng-pli-commons.service.mjs +14 -14
  27. package/esm2022/lib/pipes/currency-colfuturo.pipe.mjs +35 -0
  28. package/{esm2020 → esm2022}/lib/pipes/currency-decimal-colfuturo.pipe.mjs +36 -36
  29. package/{esm2020 → esm2022}/lib/pipes/currency-print-colfuturo.pipe.mjs +33 -33
  30. package/esm2022/lib/pipes/thousands.pipe.mjs +60 -0
  31. package/{esm2020 → esm2022}/lib/services/application-fill-percentage.service.mjs +30 -30
  32. package/{esm2020 → esm2022}/lib/services/application-tag.service.mjs +56 -56
  33. package/{esm2020 → esm2022}/lib/services/application.service.mjs +247 -247
  34. package/esm2022/lib/services/authentication.service.mjs +133 -0
  35. package/{esm2020 → esm2022}/lib/services/blocked-beneficiary.service.mjs +42 -42
  36. package/esm2022/lib/services/budget-application.service.mjs +265 -0
  37. package/{esm2020 → esm2022}/lib/services/budget-simulation.service.mjs +61 -61
  38. package/esm2022/lib/services/budget.service.mjs +205 -0
  39. package/{esm2020 → esm2022}/lib/services/closure-wallet.service.mjs +39 -39
  40. package/{esm2020 → esm2022}/lib/services/cnf-correspondence-document-manager.service.mjs +39 -39
  41. package/{esm2020 → esm2022}/lib/services/committee-money.service.mjs +44 -44
  42. package/{esm2020 → esm2022}/lib/services/committee-pdf.service.mjs +27 -27
  43. package/{esm2020 → esm2022}/lib/services/committee-snapshot.service.mjs +60 -60
  44. package/{esm2020 → esm2022}/lib/services/common-info.service.mjs +51 -51
  45. package/esm2022/lib/services/common.service.mjs +291 -0
  46. package/esm2022/lib/services/configuration-document.service.mjs +297 -0
  47. package/{esm2020 → esm2022}/lib/services/configuration-minisite.service.mjs +26 -26
  48. package/{esm2020 → esm2022}/lib/services/configuration.service.mjs +53 -53
  49. package/{esm2020 → esm2022}/lib/services/correspondence-document-category.service.mjs +31 -31
  50. package/{esm2020 → esm2022}/lib/services/correspondence-manager.service.mjs +67 -67
  51. package/{esm2020 → esm2022}/lib/services/credit-score.service.mjs +48 -48
  52. package/{esm2020 → esm2022}/lib/services/credit-study.service.mjs +292 -292
  53. package/{esm2020 → esm2022}/lib/services/cube.service.mjs +27 -27
  54. package/{esm2020 → esm2022}/lib/services/data-form-history.service.mjs +25 -25
  55. package/{esm2020 → esm2022}/lib/services/data-form.service.mjs +176 -176
  56. package/{esm2020 → esm2022}/lib/services/data-letter-segmentation.service.mjs +64 -64
  57. package/{esm2020 → esm2022}/lib/services/document-analysis-auto.service.mjs +27 -27
  58. package/{esm2020 → esm2022}/lib/services/document-history.service.mjs +43 -43
  59. package/{esm2020 → esm2022}/lib/services/document-management.service.mjs +57 -57
  60. package/{esm2020 → esm2022}/lib/services/document-validation-attempt.service.mjs +32 -32
  61. package/{esm2020 → esm2022}/lib/services/document.service.mjs +131 -131
  62. package/esm2022/lib/services/documentary.type.service.mjs +69 -0
  63. package/{esm2020 → esm2022}/lib/services/email.service.mjs +30 -30
  64. package/{esm2020 → esm2022}/lib/services/evaluation.service.mjs +181 -181
  65. package/{esm2020 → esm2022}/lib/services/export-excel.service.mjs +32 -32
  66. package/esm2022/lib/services/file.service.mjs +153 -0
  67. package/{esm2020 → esm2022}/lib/services/form.service.mjs +112 -112
  68. package/{esm2020 → esm2022}/lib/services/gic-client-disbursement-metadata.service.mjs +31 -31
  69. package/{esm2020 → esm2022}/lib/services/gic-client.service.mjs +49 -49
  70. package/{esm2020 → esm2022}/lib/services/gic-cnf-bankvision-transaction.service.mjs +31 -31
  71. package/{esm2020 → esm2022}/lib/services/gic-cnf-closing-date.service.mjs +34 -34
  72. package/{esm2020 → esm2022}/lib/services/gic-cnf-maintenance.service.mjs +30 -30
  73. package/{esm2020 → esm2022}/lib/services/gic-collection.service.mjs +53 -53
  74. package/{esm2020 → esm2022}/lib/services/gic-disbursement.service.mjs +39 -39
  75. package/{esm2020 → esm2022}/lib/services/gic-extract.service.mjs +41 -41
  76. package/{esm2020 → esm2022}/lib/services/gic-log.service.mjs +41 -41
  77. package/{esm2020 → esm2022}/lib/services/gic-payment-application.service.mjs +35 -35
  78. package/{esm2020 → esm2022}/lib/services/gic-payment-plan-cube.service.mjs +27 -27
  79. package/{esm2020 → esm2022}/lib/services/gic-payment-plan.service.mjs +32 -32
  80. package/{esm2020 → esm2022}/lib/services/gic-trm.service.mjs +27 -27
  81. package/{esm2020 → esm2022}/lib/services/global.show.task.service.mjs +37 -37
  82. package/{esm2020 → esm2022}/lib/services/guarantee-document.service.mjs +52 -52
  83. package/{esm2020 → esm2022}/lib/services/guarantee-enrollment.service.mjs +37 -37
  84. package/esm2022/lib/services/guarantee.service.mjs +128 -0
  85. package/{esm2020 → esm2022}/lib/services/hash.service.mjs +36 -36
  86. package/{esm2020 → esm2022}/lib/services/import-data.service.mjs +27 -27
  87. package/{esm2020 → esm2022}/lib/services/import-excel-gic.service.mjs +45 -45
  88. package/{esm2020 → esm2022}/lib/services/initial-configuration-gic-parameters.service.mjs +51 -51
  89. package/{esm2020 → esm2022}/lib/services/initial-record.service.mjs +51 -51
  90. package/{esm2020 → esm2022}/lib/services/integration-ado.service.mjs +54 -54
  91. package/{esm2020 → esm2022}/lib/services/interaction-application-user.service.mjs +81 -81
  92. package/{esm2020 → esm2022}/lib/services/interest-adjustment.service.mjs +34 -34
  93. package/esm2022/lib/services/keys-assignation.service.mjs +127 -0
  94. package/{esm2020 → esm2022}/lib/services/legalization.service.mjs +150 -150
  95. package/{esm2020 → esm2022}/lib/services/letter-campaing.service.mjs +49 -49
  96. package/{esm2020 → esm2022}/lib/services/letter-task-mapping.service.mjs +40 -40
  97. package/{esm2020 → esm2022}/lib/services/log.service.mjs +41 -41
  98. package/{esm2020 → esm2022}/lib/services/maintenance.service.mjs +66 -66
  99. package/{esm2020 → esm2022}/lib/services/master-category.service.mjs +66 -66
  100. package/{esm2020 → esm2022}/lib/services/master-program.service.mjs +78 -78
  101. package/{esm2020 → esm2022}/lib/services/master-university.service.mjs +68 -68
  102. package/{esm2020 → esm2022}/lib/services/migration-plis.service.mjs +27 -27
  103. package/{esm2020 → esm2022}/lib/services/migration-survey-queue.service.mjs +24 -24
  104. package/{esm2020 → esm2022}/lib/services/page.service.mjs +38 -38
  105. package/{esm2020 → esm2022}/lib/services/partner-system.service.mjs +30 -30
  106. package/{esm2020 → esm2022}/lib/services/partner.service.mjs +34 -34
  107. package/{esm2020 → esm2022}/lib/services/pdf-analyzer.service.mjs +33 -33
  108. package/{esm2020 → esm2022}/lib/services/people-master.service.mjs +42 -42
  109. package/{esm2020 → esm2022}/lib/services/permission.service.mjs +29 -29
  110. package/{esm2020 → esm2022}/lib/services/pli-cnf-acuity-fields.service.mjs +34 -34
  111. package/{esm2020 → esm2022}/lib/services/pli-cnf-app-card-filter.service.mjs +40 -40
  112. package/{esm2020 → esm2022}/lib/services/pli-cnf-appointment-type.service.mjs +41 -41
  113. package/{esm2020 → esm2022}/lib/services/pli-cnf-budget-program-type.service.mjs +54 -54
  114. package/{esm2020 → esm2022}/lib/services/pli-cnf-budget.service.mjs +31 -31
  115. package/{esm2020 → esm2022}/lib/services/pli-cnf-cloning.service.mjs +27 -27
  116. package/{esm2020 → esm2022}/lib/services/pli-cnf-committee-pdf-config-table-config.service.mjs +47 -47
  117. package/{esm2020 → esm2022}/lib/services/pli-cnf-committee-pdf-gen-status.service.mjs +30 -30
  118. package/{esm2020 → esm2022}/lib/services/pli-cnf-committee-valpro-columns.service.mjs +42 -42
  119. package/{esm2020 → esm2022}/lib/services/pli-cnf-committee-visualization-mode.service.mjs +42 -42
  120. package/{esm2020 → esm2022}/lib/services/pli-cnf-committee.service.mjs +51 -51
  121. package/{esm2020 → esm2022}/lib/services/pli-cnf-config-minisite.service.mjs +90 -90
  122. package/{esm2020 → esm2022}/lib/services/pli-cnf-configuration-credit-study.service.mjs +41 -41
  123. package/{esm2020 → esm2022}/lib/services/pli-cnf-document-management.service.mjs +40 -40
  124. package/{esm2020 → esm2022}/lib/services/pli-cnf-dynamic-keys-assign.service.mjs +52 -52
  125. package/{esm2020 → esm2022}/lib/services/pli-cnf-evaluation-task-mailing.service.mjs +31 -31
  126. package/esm2022/lib/services/pli-cnf-evaluation-task.service.mjs +112 -0
  127. package/{esm2020 → esm2022}/lib/services/pli-cnf-evaluation-template.service.mjs +95 -95
  128. package/{esm2020 → esm2022}/lib/services/pli-cnf-form-edit.service.mjs +68 -68
  129. package/{esm2020 → esm2022}/lib/services/pli-cnf-form-multiaplicacion.service.mjs +46 -46
  130. package/{esm2020 → esm2022}/lib/services/pli-cnf-guarantee-documents-template.service.mjs +40 -40
  131. package/{esm2020 → esm2022}/lib/services/pli-cnf-guarantee-token.service.mjs +42 -42
  132. package/{esm2020 → esm2022}/lib/services/pli-cnf-header.service.mjs +39 -39
  133. package/{esm2020 → esm2022}/lib/services/pli-cnf-indicator.service.mjs +39 -39
  134. package/{esm2020 → esm2022}/lib/services/pli-cnf-information-system.service.mjs +24 -24
  135. package/{esm2020 → esm2022}/lib/services/pli-cnf-interaction.service.mjs +78 -78
  136. package/{esm2020 → esm2022}/lib/services/pli-cnf-letter-template-type.service.mjs +29 -29
  137. package/{esm2020 → esm2022}/lib/services/pli-cnf-letter-template.service.mjs +48 -48
  138. package/{esm2020 → esm2022}/lib/services/pli-cnf-look-and-feel.service.mjs +28 -28
  139. package/{esm2020 → esm2022}/lib/services/pli-cnf-mail.service.mjs +30 -30
  140. package/{esm2020 → esm2022}/lib/services/pli-cnf-menu-form.service.mjs +34 -34
  141. package/{esm2020 → esm2022}/lib/services/pli-cnf-migration-plis-field-budget.service.mjs +33 -33
  142. package/{esm2020 → esm2022}/lib/services/pli-cnf-migration-plis-field.service.mjs +47 -47
  143. package/{esm2020 → esm2022}/lib/services/pli-cnf-migration-status-plis.service.mjs +44 -44
  144. package/{esm2020 → esm2022}/lib/services/pli-cnf-page-section-form.service.mjs +66 -66
  145. package/{esm2020 → esm2022}/lib/services/pli-cnf-page-sub-process.service.mjs +25 -25
  146. package/{esm2020 → esm2022}/lib/services/pli-cnf-pdfs.service.mjs +31 -31
  147. package/{esm2020 → esm2022}/lib/services/pli-cnf-profile-form.service.mjs +40 -40
  148. package/{esm2020 → esm2022}/lib/services/pli-cnf-profile-user.service.mjs +49 -49
  149. package/{esm2020 → esm2022}/lib/services/pli-cnf-project-summary.service.mjs +39 -39
  150. package/{esm2020 → esm2022}/lib/services/pli-cnf-scenario.service.mjs +47 -47
  151. package/{esm2020 → esm2022}/lib/services/pli-cnf-segmentation.service.mjs +72 -72
  152. package/{esm2020 → esm2022}/lib/services/pli-cnf-snapshot-token.service.mjs +42 -42
  153. package/{esm2020 → esm2022}/lib/services/pli-cnf-status-flow-interaction.service.mjs +74 -74
  154. package/{esm2020 → esm2022}/lib/services/pli-cnf-status-flow.service.mjs +56 -56
  155. package/{esm2020 → esm2022}/lib/services/pli-cnf-support-document-category.service.mjs +47 -47
  156. package/{esm2020 → esm2022}/lib/services/pli-cnf-support-document.service.mjs +56 -56
  157. package/{esm2020 → esm2022}/lib/services/pli-cnf-survey-document.service.mjs +37 -37
  158. package/{esm2020 → esm2022}/lib/services/pli-cnf-survey-pdf.service.mjs +34 -34
  159. package/{esm2020 → esm2022}/lib/services/pli-cnf-survey.service.mjs +46 -46
  160. package/{esm2020 → esm2022}/lib/services/pli-cnf-task-group.service.mjs +33 -33
  161. package/{esm2020 → esm2022}/lib/services/pli-cnf-text-category.service.mjs +38 -38
  162. package/{esm2020 → esm2022}/lib/services/pli-cnf-text-option.service.mjs +39 -39
  163. package/{esm2020 → esm2022}/lib/services/pli-cnf-text.service.mjs +62 -62
  164. package/{esm2020 → esm2022}/lib/services/pli-cnf-type-text.service.mjs +45 -45
  165. package/{esm2020 → esm2022}/lib/services/pli-cnf-university-article.service.mjs +39 -39
  166. package/{esm2020 → esm2022}/lib/services/pli-cnf-user-calendar.service.mjs +36 -36
  167. package/{esm2020 → esm2022}/lib/services/pli-cnf-user-workspace.service.mjs +35 -35
  168. package/{esm2020 → esm2022}/lib/services/pli-cnf-valpro-keys.service.mjs +35 -35
  169. package/{esm2020 → esm2022}/lib/services/pli-cnf-workspace-segmentation.service.mjs +31 -31
  170. package/{esm2020 → esm2022}/lib/services/pli-message-type.service.mjs +40 -40
  171. package/{esm2020 → esm2022}/lib/services/pli-multiple-value-filter.service.mjs +39 -39
  172. package/{esm2020 → esm2022}/lib/services/pli-promocion-username.service.mjs +57 -57
  173. package/{esm2020 → esm2022}/lib/services/pli-seg-action-user.service.mjs +37 -37
  174. package/{esm2020 → esm2022}/lib/services/pli-segmentation.service.mjs +130 -130
  175. package/{esm2020 → esm2022}/lib/services/pli-tag-assignment.service.mjs +36 -36
  176. package/{esm2020 → esm2022}/lib/services/pli-tag.service.mjs +55 -55
  177. package/{esm2020 → esm2022}/lib/services/pli-user.service.mjs +51 -51
  178. package/{esm2020 → esm2022}/lib/services/plis-beneficiario.service.mjs +29 -29
  179. package/{esm2020 → esm2022}/lib/services/plis-estatus-change.service.mjs +30 -30
  180. package/esm2022/lib/services/ppp.service.mjs +360 -0
  181. package/{esm2020 → esm2022}/lib/services/profile.service.mjs +60 -60
  182. package/esm2022/lib/services/progress-bar.service.mjs +40 -0
  183. package/{esm2020 → esm2022}/lib/services/promotion-score.service.mjs +44 -44
  184. package/{esm2020 → esm2022}/lib/services/registry-identifier.service.mjs +39 -39
  185. package/{esm2020 → esm2022}/lib/services/return-refund.service.mjs +53 -53
  186. package/esm2022/lib/services/segmentation-tokens.service.mjs +43 -0
  187. package/{esm2020 → esm2022}/lib/services/segmentation-user-service.service.mjs +90 -90
  188. package/{esm2020 → esm2022}/lib/services/segmentation.service.mjs +31 -31
  189. package/esm2022/lib/services/send-application.service.mjs +492 -0
  190. package/{esm2020 → esm2022}/lib/services/sesion-form.service.mjs +31 -31
  191. package/{esm2020 → esm2022}/lib/services/sesion.service.mjs +48 -48
  192. package/{esm2020 → esm2022}/lib/services/spinner.service.mjs +16 -16
  193. package/{esm2020 → esm2022}/lib/services/sponsorship-letter.service.mjs +68 -68
  194. package/{esm2020 → esm2022}/lib/services/status.service.mjs +100 -100
  195. package/{esm2020 → esm2022}/lib/services/summary-budget.service.mjs +24 -24
  196. package/{esm2020 → esm2022}/lib/services/survey-metadata.service.mjs +28 -28
  197. package/{esm2020 → esm2022}/lib/services/survey-queue.service.mjs +24 -24
  198. package/{esm2020 → esm2022}/lib/services/survey.service.mjs +52 -52
  199. package/{esm2020 → esm2022}/lib/services/tasa.cambio.service.mjs +35 -35
  200. package/{esm2020 → esm2022}/lib/services/token-transformation.service.mjs +62 -62
  201. package/esm2022/lib/services/token.service.mjs +1345 -0
  202. package/{esm2020 → esm2022}/lib/services/university.service.mjs +50 -50
  203. package/esm2022/lib/services/upload-documents.service.mjs +60 -0
  204. package/{esm2020 → esm2022}/lib/services/user.service.mjs +28 -28
  205. package/{esm2020 → esm2022}/lib/services/visualization-committee.service.mjs +84 -84
  206. package/esm2022/lib/utils/custom-validator.mjs +95 -0
  207. package/esm2022/lib/utils/form-util.mjs +35 -0
  208. package/esm2022/lib/utils/formio-util.mjs +582 -0
  209. package/{esm2020 → esm2022}/lib/utils/version-commons.mjs +9 -9
  210. package/{esm2020 → esm2022}/ng-pli-commons.mjs +4 -4
  211. package/{esm2020 → esm2022}/public-api.mjs +214 -214
  212. package/{esm2020 → esm2022}/version.mjs +29 -29
  213. package/{fesm2020 → fesm2022}/ng-pli-commons.mjs +16724 -16725
  214. package/fesm2022/ng-pli-commons.mjs.map +1 -0
  215. package/{ng-pli-commons.d.ts → index.d.ts} +5 -5
  216. package/lib/components/backoffice.commons.component.d.ts +15 -15
  217. package/lib/components/common.lists.component.d.ts +61 -61
  218. package/lib/components/configuration-token/configuration-token-subject.service.d.ts +10 -10
  219. package/lib/components/configuration-token/configuration-token.component.d.ts +124 -124
  220. package/lib/components/configuration-token/guarantee-token/guarantee-token.component.d.ts +33 -33
  221. package/lib/components/configuration-token/snapshot-token/snapshot-token.component.d.ts +37 -37
  222. package/lib/components/configuration.commons.component.d.ts +15 -15
  223. package/lib/components/dashboard.commons.component.d.ts +39 -39
  224. package/lib/components/dynamic-filter/dynamic-filter.component.d.ts +50 -50
  225. package/lib/components/excel-to-json/excel-to-json.component.d.ts +12 -12
  226. package/lib/components/frontoffice.commons.component.d.ts +26 -26
  227. package/lib/components/pdf-analyzer/pdf-analyzer.component.d.ts +36 -36
  228. package/lib/components/pdf-config/pdf-config.component.d.ts +78 -78
  229. package/lib/components/pdf-generator/pdf-generator.component.d.ts +69 -69
  230. package/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.d.ts +114 -114
  231. package/lib/components/pdf-visualizer/pdf-visualizer.component.d.ts +147 -147
  232. package/lib/components/progress-bar/progress-bar.component.d.ts +30 -30
  233. package/lib/components/segmentation-tokens/segmentation-tokens.component.d.ts +48 -48
  234. package/lib/components/select-ppp/select-ppp.component.d.ts +42 -42
  235. package/lib/components/show-hide-columns/show-hide-columns-table.component.d.ts +39 -39
  236. package/lib/components/token/token.component.d.ts +99 -99
  237. package/lib/components/tokens-calculator/tokens-calculator.component.d.ts +37 -37
  238. package/lib/directives/currency-colfuturo-formatter.directive.d.ts +14 -14
  239. package/lib/directives/currency-decimal-colfuturo-formatter.directive.d.ts +13 -13
  240. package/lib/ng-pli-commons.module.d.ts +47 -47
  241. package/lib/ng-pli-commons.service.d.ts +6 -6
  242. package/lib/pipes/currency-colfuturo.pipe.d.ts +12 -12
  243. package/lib/pipes/currency-decimal-colfuturo.pipe.d.ts +11 -11
  244. package/lib/pipes/currency-print-colfuturo.pipe.d.ts +11 -11
  245. package/lib/pipes/thousands.pipe.d.ts +9 -9
  246. package/lib/services/application-fill-percentage.service.d.ts +15 -15
  247. package/lib/services/application-tag.service.d.ts +23 -23
  248. package/lib/services/application.service.d.ts +107 -107
  249. package/lib/services/authentication.service.d.ts +45 -45
  250. package/lib/services/blocked-beneficiary.service.d.ts +17 -17
  251. package/lib/services/budget-application.service.d.ts +52 -52
  252. package/lib/services/budget-simulation.service.d.ts +32 -32
  253. package/lib/services/budget.service.d.ts +65 -65
  254. package/lib/services/closure-wallet.service.d.ts +16 -16
  255. package/lib/services/cnf-correspondence-document-manager.service.d.ts +14 -14
  256. package/lib/services/committee-money.service.d.ts +12 -12
  257. package/lib/services/committee-pdf.service.d.ts +13 -13
  258. package/lib/services/committee-snapshot.service.d.ts +24 -24
  259. package/lib/services/common-info.service.d.ts +30 -30
  260. package/lib/services/common.service.d.ts +103 -103
  261. package/lib/services/configuration-document.service.d.ts +84 -84
  262. package/lib/services/configuration-minisite.service.d.ts +13 -13
  263. package/lib/services/configuration.service.d.ts +15 -15
  264. package/lib/services/correspondence-document-category.service.d.ts +12 -12
  265. package/lib/services/correspondence-manager.service.d.ts +21 -21
  266. package/lib/services/credit-score.service.d.ts +14 -14
  267. package/lib/services/credit-study.service.d.ts +52 -52
  268. package/lib/services/cube.service.d.ts +14 -14
  269. package/lib/services/data-form-history.service.d.ts +13 -13
  270. package/lib/services/data-form.service.d.ts +82 -82
  271. package/lib/services/data-letter-segmentation.service.d.ts +20 -20
  272. package/lib/services/document-analysis-auto.service.d.ts +14 -14
  273. package/lib/services/document-history.service.d.ts +18 -18
  274. package/lib/services/document-management.service.d.ts +22 -22
  275. package/lib/services/document-validation-attempt.service.d.ts +13 -13
  276. package/lib/services/document.service.d.ts +51 -51
  277. package/lib/services/documentary.type.service.d.ts +23 -23
  278. package/lib/services/email.service.d.ts +15 -15
  279. package/lib/services/evaluation.service.d.ts +58 -58
  280. package/lib/services/export-excel.service.d.ts +8 -8
  281. package/lib/services/file.service.d.ts +63 -63
  282. package/lib/services/form.service.d.ts +39 -39
  283. package/lib/services/gic-client-disbursement-metadata.service.d.ts +12 -12
  284. package/lib/services/gic-client.service.d.ts +20 -20
  285. package/lib/services/gic-cnf-bankvision-transaction.service.d.ts +13 -13
  286. package/lib/services/gic-cnf-closing-date.service.d.ts +15 -15
  287. package/lib/services/gic-cnf-maintenance.service.d.ts +13 -13
  288. package/lib/services/gic-collection.service.d.ts +19 -19
  289. package/lib/services/gic-disbursement.service.d.ts +16 -16
  290. package/lib/services/gic-extract.service.d.ts +15 -15
  291. package/lib/services/gic-log.service.d.ts +17 -17
  292. package/lib/services/gic-payment-application.service.d.ts +15 -15
  293. package/lib/services/gic-payment-plan-cube.service.d.ts +13 -13
  294. package/lib/services/gic-payment-plan.service.d.ts +19 -19
  295. package/lib/services/gic-trm.service.d.ts +14 -14
  296. package/lib/services/global.show.task.service.d.ts +20 -20
  297. package/lib/services/guarantee-document.service.d.ts +17 -17
  298. package/lib/services/guarantee-enrollment.service.d.ts +14 -14
  299. package/lib/services/guarantee.service.d.ts +34 -34
  300. package/lib/services/hash.service.d.ts +18 -18
  301. package/lib/services/import-data.service.d.ts +14 -14
  302. package/lib/services/import-excel-gic.service.d.ts +22 -22
  303. package/lib/services/initial-configuration-gic-parameters.service.d.ts +19 -19
  304. package/lib/services/initial-record.service.d.ts +24 -24
  305. package/lib/services/integration-ado.service.d.ts +15 -15
  306. package/lib/services/interaction-application-user.service.d.ts +28 -28
  307. package/lib/services/interest-adjustment.service.d.ts +16 -16
  308. package/lib/services/keys-assignation.service.d.ts +33 -33
  309. package/lib/services/legalization.service.d.ts +46 -46
  310. package/lib/services/letter-campaing.service.d.ts +24 -24
  311. package/lib/services/letter-task-mapping.service.d.ts +22 -22
  312. package/lib/services/log.service.d.ts +17 -17
  313. package/lib/services/maintenance.service.d.ts +23 -23
  314. package/lib/services/master-category.service.d.ts +40 -40
  315. package/lib/services/master-program.service.d.ts +45 -45
  316. package/lib/services/master-university.service.d.ts +40 -40
  317. package/lib/services/migration-plis.service.d.ts +14 -14
  318. package/lib/services/migration-survey-queue.service.d.ts +12 -12
  319. package/lib/services/page.service.d.ts +18 -18
  320. package/lib/services/partner-system.service.d.ts +13 -13
  321. package/lib/services/partner.service.d.ts +17 -17
  322. package/lib/services/pdf-analyzer.service.d.ts +11 -11
  323. package/lib/services/people-master.service.d.ts +14 -14
  324. package/lib/services/permission.service.d.ts +14 -14
  325. package/lib/services/pli-cnf-acuity-fields.service.d.ts +14 -14
  326. package/lib/services/pli-cnf-app-card-filter.service.d.ts +20 -20
  327. package/lib/services/pli-cnf-appointment-type.service.d.ts +16 -16
  328. package/lib/services/pli-cnf-budget-program-type.service.d.ts +18 -18
  329. package/lib/services/pli-cnf-budget.service.d.ts +13 -13
  330. package/lib/services/pli-cnf-cloning.service.d.ts +12 -12
  331. package/lib/services/pli-cnf-committee-pdf-config-table-config.service.d.ts +19 -19
  332. package/lib/services/pli-cnf-committee-pdf-gen-status.service.d.ts +13 -13
  333. package/lib/services/pli-cnf-committee-valpro-columns.service.d.ts +15 -15
  334. package/lib/services/pli-cnf-committee-visualization-mode.service.d.ts +17 -17
  335. package/lib/services/pli-cnf-committee.service.d.ts +21 -21
  336. package/lib/services/pli-cnf-config-minisite.service.d.ts +26 -26
  337. package/lib/services/pli-cnf-configuration-credit-study.service.d.ts +16 -16
  338. package/lib/services/pli-cnf-document-management.service.d.ts +15 -15
  339. package/lib/services/pli-cnf-dynamic-keys-assign.service.d.ts +21 -21
  340. package/lib/services/pli-cnf-evaluation-task-mailing.service.d.ts +13 -13
  341. package/lib/services/pli-cnf-evaluation-task.service.d.ts +35 -35
  342. package/lib/services/pli-cnf-evaluation-template.service.d.ts +44 -44
  343. package/lib/services/pli-cnf-form-edit.service.d.ts +29 -29
  344. package/lib/services/pli-cnf-form-multiaplicacion.service.d.ts +21 -21
  345. package/lib/services/pli-cnf-guarantee-documents-template.service.d.ts +17 -17
  346. package/lib/services/pli-cnf-guarantee-token.service.d.ts +16 -16
  347. package/lib/services/pli-cnf-header.service.d.ts +18 -18
  348. package/lib/services/pli-cnf-indicator.service.d.ts +20 -20
  349. package/lib/services/pli-cnf-information-system.service.d.ts +12 -12
  350. package/lib/services/pli-cnf-interaction.service.d.ts +31 -31
  351. package/lib/services/pli-cnf-letter-template-type.service.d.ts +15 -15
  352. package/lib/services/pli-cnf-letter-template.service.d.ts +22 -22
  353. package/lib/services/pli-cnf-look-and-feel.service.d.ts +13 -13
  354. package/lib/services/pli-cnf-mail.service.d.ts +13 -13
  355. package/lib/services/pli-cnf-menu-form.service.d.ts +16 -16
  356. package/lib/services/pli-cnf-migration-plis-field-budget.service.d.ts +14 -14
  357. package/lib/services/pli-cnf-migration-plis-field.service.d.ts +17 -17
  358. package/lib/services/pli-cnf-migration-status-plis.service.d.ts +17 -17
  359. package/lib/services/pli-cnf-page-section-form.service.d.ts +24 -24
  360. package/lib/services/pli-cnf-page-sub-process.service.d.ts +12 -12
  361. package/lib/services/pli-cnf-pdfs.service.d.ts +14 -14
  362. package/lib/services/pli-cnf-profile-form.service.d.ts +20 -20
  363. package/lib/services/pli-cnf-profile-user.service.d.ts +24 -24
  364. package/lib/services/pli-cnf-project-summary.service.d.ts +16 -16
  365. package/lib/services/pli-cnf-scenario.service.d.ts +23 -23
  366. package/lib/services/pli-cnf-segmentation.service.d.ts +32 -32
  367. package/lib/services/pli-cnf-snapshot-token.service.d.ts +16 -16
  368. package/lib/services/pli-cnf-status-flow-interaction.service.d.ts +28 -28
  369. package/lib/services/pli-cnf-status-flow.service.d.ts +26 -26
  370. package/lib/services/pli-cnf-support-document-category.service.d.ts +17 -17
  371. package/lib/services/pli-cnf-support-document.service.d.ts +23 -23
  372. package/lib/services/pli-cnf-survey-document.service.d.ts +16 -16
  373. package/lib/services/pli-cnf-survey-pdf.service.d.ts +15 -15
  374. package/lib/services/pli-cnf-survey.service.d.ts +19 -19
  375. package/lib/services/pli-cnf-task-group.service.d.ts +15 -15
  376. package/lib/services/pli-cnf-text-category.service.d.ts +15 -15
  377. package/lib/services/pli-cnf-text-option.service.d.ts +15 -15
  378. package/lib/services/pli-cnf-text.service.d.ts +21 -21
  379. package/lib/services/pli-cnf-type-text.service.d.ts +16 -16
  380. package/lib/services/pli-cnf-university-article.service.d.ts +20 -20
  381. package/lib/services/pli-cnf-user-calendar.service.d.ts +16 -16
  382. package/lib/services/pli-cnf-user-workspace.service.d.ts +18 -18
  383. package/lib/services/pli-cnf-valpro-keys.service.d.ts +18 -18
  384. package/lib/services/pli-cnf-workspace-segmentation.service.d.ts +16 -16
  385. package/lib/services/pli-message-type.service.d.ts +15 -15
  386. package/lib/services/pli-multiple-value-filter.service.d.ts +17 -17
  387. package/lib/services/pli-promocion-username.service.d.ts +26 -26
  388. package/lib/services/pli-seg-action-user.service.d.ts +20 -20
  389. package/lib/services/pli-segmentation.service.d.ts +48 -48
  390. package/lib/services/pli-tag-assignment.service.d.ts +15 -15
  391. package/lib/services/pli-tag.service.d.ts +21 -21
  392. package/lib/services/pli-user.service.d.ts +24 -24
  393. package/lib/services/plis-beneficiario.service.d.ts +10 -10
  394. package/lib/services/plis-estatus-change.service.d.ts +13 -13
  395. package/lib/services/ppp.service.d.ts +77 -77
  396. package/lib/services/profile.service.d.ts +26 -26
  397. package/lib/services/progress-bar.service.d.ts +14 -14
  398. package/lib/services/promotion-score.service.d.ts +14 -14
  399. package/lib/services/registry-identifier.service.d.ts +16 -16
  400. package/lib/services/return-refund.service.d.ts +20 -20
  401. package/lib/services/segmentation-tokens.service.d.ts +22 -22
  402. package/lib/services/segmentation-user-service.service.d.ts +26 -26
  403. package/lib/services/segmentation.service.d.ts +16 -16
  404. package/lib/services/send-application.service.d.ts +71 -71
  405. package/lib/services/sesion-form.service.d.ts +16 -16
  406. package/lib/services/sesion.service.d.ts +27 -27
  407. package/lib/services/spinner.service.d.ts +6 -6
  408. package/lib/services/sponsorship-letter.service.d.ts +34 -34
  409. package/lib/services/status.service.d.ts +31 -31
  410. package/lib/services/summary-budget.service.d.ts +11 -11
  411. package/lib/services/survey-metadata.service.d.ts +13 -13
  412. package/lib/services/survey-queue.service.d.ts +12 -12
  413. package/lib/services/survey.service.d.ts +17 -17
  414. package/lib/services/tasa.cambio.service.d.ts +14 -14
  415. package/lib/services/token-transformation.service.d.ts +19 -19
  416. package/lib/services/token.service.d.ts +270 -270
  417. package/lib/services/university.service.d.ts +28 -28
  418. package/lib/services/upload-documents.service.d.ts +21 -21
  419. package/lib/services/user.service.d.ts +12 -12
  420. package/lib/services/visualization-committee.service.d.ts +32 -32
  421. package/lib/utils/custom-validator.d.ts +19 -19
  422. package/lib/utils/form-util.d.ts +11 -11
  423. package/lib/utils/formio-util.d.ts +105 -105
  424. package/lib/utils/version-commons.d.ts +4 -4
  425. package/package.json +10 -16
  426. package/public-api.d.ts +210 -210
  427. package/version.d.ts +25 -25
  428. package/esm2020/lib/components/backoffice.commons.component.mjs +0 -40
  429. package/esm2020/lib/components/common.lists.component.mjs +0 -194
  430. package/esm2020/lib/components/configuration-token/configuration-token.component.mjs +0 -665
  431. package/esm2020/lib/components/configuration-token/guarantee-token/guarantee-token.component.mjs +0 -103
  432. package/esm2020/lib/components/configuration-token/snapshot-token/snapshot-token.component.mjs +0 -108
  433. package/esm2020/lib/components/configuration.commons.component.mjs +0 -40
  434. package/esm2020/lib/components/dynamic-filter/dynamic-filter.component.mjs +0 -131
  435. package/esm2020/lib/components/excel-to-json/excel-to-json.component.mjs +0 -54
  436. package/esm2020/lib/components/frontoffice.commons.component.mjs +0 -86
  437. package/esm2020/lib/components/pdf-analyzer/pdf-analyzer.component.mjs +0 -162
  438. package/esm2020/lib/components/pdf-generator/pdf-generator.component.mjs +0 -223
  439. package/esm2020/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.mjs +0 -307
  440. package/esm2020/lib/components/pdf-visualizer/pdf-visualizer.component.mjs +0 -387
  441. package/esm2020/lib/components/progress-bar/progress-bar.component.mjs +0 -92
  442. package/esm2020/lib/components/segmentation-tokens/segmentation-tokens.component.mjs +0 -199
  443. package/esm2020/lib/components/select-ppp/select-ppp.component.mjs +0 -199
  444. package/esm2020/lib/components/show-hide-columns/show-hide-columns-table.component.mjs +0 -116
  445. package/esm2020/lib/components/token/token.component.mjs +0 -1006
  446. package/esm2020/lib/components/tokens-calculator/tokens-calculator.component.mjs +0 -128
  447. package/esm2020/lib/ng-pli-commons.module.mjs +0 -390
  448. package/esm2020/lib/pipes/currency-colfuturo.pipe.mjs +0 -35
  449. package/esm2020/lib/pipes/thousands.pipe.mjs +0 -60
  450. package/esm2020/lib/services/authentication.service.mjs +0 -133
  451. package/esm2020/lib/services/budget-application.service.mjs +0 -265
  452. package/esm2020/lib/services/budget.service.mjs +0 -205
  453. package/esm2020/lib/services/common.service.mjs +0 -291
  454. package/esm2020/lib/services/configuration-document.service.mjs +0 -297
  455. package/esm2020/lib/services/documentary.type.service.mjs +0 -69
  456. package/esm2020/lib/services/file.service.mjs +0 -153
  457. package/esm2020/lib/services/guarantee.service.mjs +0 -128
  458. package/esm2020/lib/services/keys-assignation.service.mjs +0 -127
  459. package/esm2020/lib/services/pli-cnf-evaluation-task.service.mjs +0 -112
  460. package/esm2020/lib/services/ppp.service.mjs +0 -360
  461. package/esm2020/lib/services/progress-bar.service.mjs +0 -40
  462. package/esm2020/lib/services/segmentation-tokens.service.mjs +0 -43
  463. package/esm2020/lib/services/send-application.service.mjs +0 -492
  464. package/esm2020/lib/services/token.service.mjs +0 -1345
  465. package/esm2020/lib/services/upload-documents.service.mjs +0 -60
  466. package/esm2020/lib/utils/custom-validator.mjs +0 -95
  467. package/esm2020/lib/utils/form-util.mjs +0 -35
  468. package/esm2020/lib/utils/formio-util.mjs +0 -580
  469. package/fesm2015/ng-pli-commons.mjs +0 -17373
  470. package/fesm2015/ng-pli-commons.mjs.map +0 -1
  471. package/fesm2020/ng-pli-commons.mjs.map +0 -1
@@ -0,0 +1,1345 @@
1
+ import { HttpParams } from '@angular/common/http';
2
+ import { Inject, Injectable, LOCALE_ID } from '@angular/core';
3
+ import { DateUtil, HEADER_JSON, UtilString } from 'ng-pli-util';
4
+ import { FormioUtil } from '../utils/formio-util';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common/http";
7
+ import * as i2 from "./form.service";
8
+ import * as i3 from "@angular/common";
9
+ export class TokenService {
10
+ /** */
11
+ static { this.SIGN_LETTER_TAG_ID = '_sign-letter-tag-id'; }
12
+ /** */
13
+ static { this.TOKEN_LABEL_FORM = 'Frm'; }
14
+ /** */
15
+ static { this.TOKEN_LABEL_BUDGET = 'Presupuesto'; }
16
+ /** */
17
+ static { this.TOKEN_LABEL_CALCULATED = 'Calculado'; }
18
+ /** */
19
+ static { this.TOKEN_LABEL_SNAPSHOT = 'Snapshot'; }
20
+ /** */
21
+ static { this.TOKEN_LABEL_STATIC = 'Estático'; }
22
+ /** */
23
+ static { this.TOKEN_LABEL_DOCUMENTO = 'Documento'; }
24
+ /** */
25
+ static { this.TOKEN_LABEL_DOCUMENTO_ANALISIS_AUTOMATICO = 'Análisis automático de documentos'; }
26
+ /** */
27
+ static { this.TOKEN_DOCUMENTO_ANALYSIS_TYPE = 'document_analysis'; }
28
+ /** */
29
+ static { this.TOKEN_LABEL_TASK = 'Tarea'; }
30
+ /** */
31
+ static { this.TOKEN_LABEL_TASKL = 'task'; }
32
+ /** */
33
+ static { this.TOKEN_LABEL_GUARANTEE = 'Garantia'; }
34
+ /** */
35
+ static { this.BUDGET_TOKENS_KEY_TOTAL_AMOUNT = 'totalAmount'; }
36
+ /** */
37
+ static { this.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_AMOUNT = 'applicationTotal'; }
38
+ /** */
39
+ static { this.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_OWN_FOUNDS = 'applicationOwnFounds'; }
40
+ /** */
41
+ static { this.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_FINANCING = 'applicationFinancing'; }
42
+ /** */
43
+ static { this.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_AMOUNT = 'legalizationTotal'; }
44
+ /** */
45
+ static { this.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_OWN_FOUNDS = 'legalizationOwnFounds'; }
46
+ /** */
47
+ static { this.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_FINANCING = 'legalizationFinancing'; }
48
+ /** */
49
+ static { this.BUDGET_TOKENS_KEY_INSURANCE_AMOUNT = 'insuranceAmount'; }
50
+ /** */
51
+ static { this.LEGALIZATION_OR_APPLICATION_TOTAL_FINANCING = 'leglizationOrApplicationTotalFinancing'; }
52
+ /** */
53
+ static { this.BUDGET_TOKENS_KEY_RESUME_CATEGORY_YEAR = 'resumeCategoryYear'; }
54
+ /** */
55
+ static { this.BUDGET_TOKENS_KEY_FECHA_FINANCING_START = 'fechaInicioFinanciacion'; }
56
+ /** */
57
+ static { this.BUDGET_TOKENS_KEY_FECHA_FINANCING_END = 'fechaFinFinanciacion'; }
58
+ /** */
59
+ static { this.BUDGET_TOKENS_DURATION_STUDIES = 'duracionEstudios'; }
60
+ /** */
61
+ static { this.BUDGET_TOKENS_FINANCING_DURATION = 'duracionFinanciacion'; }
62
+ /** */
63
+ static { this.STATIC_TOKENS_KEY_CODIGO_VERIFICACION = 'codigoVerificacion'; }
64
+ /** */
65
+ static { this.STATIC_TOKENS_KEY_A_QUIEN_VA_DIRIGIDO = 'aQuienVaDirigido'; }
66
+ /** */
67
+ static { this.STATIC_TOKENS_KEY_FECHA_ACTUAL = 'fechaActual'; }
68
+ /** */
69
+ static { this.STATIC_TOKENS_KEY_STATUS_NAME = 'statusName'; }
70
+ /** */
71
+ static { this.STATIC_TOKENS_KEY_PATROCINADOR = 'pliPatrocinador'; }
72
+ /** */
73
+ static { this.STATIC_TOKENS_KEY_PATROCINADOR_CORTO = 'pliPatrocinadorCorto'; }
74
+ /** */
75
+ static { this.STATIC_TOKENS_KEY_PROGRAMA = 'pliPrograma'; }
76
+ /** */
77
+ static { this.STATIC_TOKENS_KEY_PROGRAMA_CORTO = 'pliProgramaCorto'; }
78
+ /** */
79
+ static { this.STATIC_TOKENS_KEY_PROMOCION = 'pliPromocion'; }
80
+ /** */
81
+ static { this.STATIC_TOKENS_KEY_PROMOCION_CORTO = 'pliPromocionCorto'; }
82
+ /** */
83
+ static { this.STATIC_TOKENS_KEY_ANIO_PROMOCION = 'anioPromocion'; }
84
+ /** */
85
+ static { this.STATIC_TOKENS_KEY_ISO_MONEDA_BASE = 'isoMonedaBase'; }
86
+ /** */
87
+ static { this.STATIC_TOKENS_KEY_SALUDO_COMPLEMENTARIO = 'saludoComplementario'; }
88
+ /** */
89
+ static { this.STATIC_TOKENS_KEY_NUMBER_APPLICATION = 'numeroRadicado'; }
90
+ /** */
91
+ static { this.STATIC_TOKENS_KEY_USER_INITIALS = 'inicialesUsuario'; }
92
+ /** */
93
+ static { this.STATIC_TOKENS_KEY_LETTER_SIGN = 'firmaCarta'; }
94
+ /** */
95
+ static { this.STATIC_TOKENS_COMMITTEE_NAME = 'comiteNombre'; }
96
+ /** */
97
+ static { this.STATIC_TOKENS_COMMITTEE_SEGMENTATION = 'comiteSegmentacion'; }
98
+ /** */
99
+ static { this.STATIC_TOKENS_COMMITTEE_AGGRUPATION = 'comiteAgrupacion'; }
100
+ /** */
101
+ static { this.STATIC_TOKENS_COMMITTEE_CUTLINE_DATE = 'comiteFechaLinea'; }
102
+ /** */
103
+ static { this.STATIC_TOKENS_CONFIRM_LEGALIZATION_APPOINTMENT = 'confirmacionCita'; }
104
+ /** */
105
+ static { this.STATIC_TOKENS_CODEBTOR_DOCUMENT_NUMBER = 'numeroDocumentoCodeudor'; }
106
+ /** */
107
+ static { this.STATIC_TOKENS_CODEBTOR_DOCUMENT_TYPE = 'tipoDocumentoCodeudor'; }
108
+ /** */
109
+ static { this.STATIC_TOKENS_CODEBTOR_NAME = 'nombresCodeudor'; }
110
+ /** */
111
+ static { this.STATIC_TOKENS_CODEBTOR_LASTNAME = 'apellidosCodeudor'; }
112
+ /** */
113
+ static { this.STATIC_TOKENS_TYPE_CODEBTOR = 'tipoPersonaCodeudor'; }
114
+ /** */
115
+ static { this.STATIC_TOKENS_CODEBTOR_REVIEWER = 'revisorCodeudores'; }
116
+ /** */
117
+ static { this.STATIC_TOKENS_TOTAL_WEIGHTED = 'ponderadoTotal'; }
118
+ /** */
119
+ static { this.STATIC_TOKENS_CONSECUTIVE_GUARANTEE = 'consecutivoGarantias'; }
120
+ /** */
121
+ static { this.STATIC_TOKENS_DAY = 'dia'; }
122
+ /** */
123
+ static { this.STATIC_TOKENS_MONTH = 'mes'; }
124
+ /** */
125
+ static { this.STATIC_TOKENS_YEAR = 'ano'; }
126
+ /** */
127
+ static { this.STATIC_TOKENS_REPRESENTATIVE_NAME = 'nombresRepresentante'; }
128
+ /** */
129
+ static { this.STATIC_TOKENS_REPRESENTATIVE_LASTNAME = 'apellidosRepresentante'; }
130
+ /** */
131
+ static { this.STATIC_TOKENS_REPRESENTATIVE_DOCUMENT_NUMBER = 'cedulaRepresentante'; }
132
+ /** */
133
+ static { this.STATIC_TOKENS_CITY_SIGNATURE = 'ciudadFirma'; }
134
+ /** */
135
+ static { this.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY = 'tipoUsuarioEstudioCredito'; }
136
+ /** */
137
+ static { this.STATIC_TOKENS_CODEBTOR_VEHICLES_QUANTITY = 'cantidadVehiculosCodeudor'; }
138
+ /** */
139
+ static { this.STATIC_TOKENS_CODEBTOR_ASSETS_QUANTITY = 'cantidadBienesCodeudor'; }
140
+ /** */
141
+ static { this.STATIC_TOKENS_LIST_CODEBTORS = 'listaCodeudores'; }
142
+ /** */
143
+ static { this.STATIC_TOKEN_INGRESO_CODEUDOR_HABEAS_DATA = 'ingresoCodeudorHabeasData'; }
144
+ /** */
145
+ static { this.STATIC_TOKEN_PDF_RESUMEN_CODEUDOR = 'pdfResumenCodeudor'; }
146
+ /** */
147
+ static { this.STATIC_TOKENS_QUANTITY_VEHICLE_BENEFICIARY = 'cantidadVehiculosSeleccionado'; }
148
+ /** */
149
+ static { this.STATIC_TOKENS_QUANTITY_ASSETS_BENEFICIARY = 'cantidadBienesSeleccionado'; }
150
+ /** */
151
+ static { this.STATIC_TOKENS_BEN_CODIGO = 'benCodigo'; }
152
+ /** */
153
+ static { this.STATIC_TOKEN_CREDIT_REVIEWER_OBSERVATIONS_CODEBTOR = 'creditReviewerObservationsCodebtor'; }
154
+ /** */
155
+ static { this.STATIC_TOKEN_CREDIT_REVIEWER_OBSERVATIONS = 'creditReviewerObservations'; }
156
+ static { this.STATIC_TOKEN_TAG_NAME = 'tagName'; }
157
+ static { this.STATIC_TOKEN_NAME_REVIEWER_TASK = 'nameReviwerTask'; }
158
+ static { this.STATIC_TOKEN_LAST_NAME_REVIEWER_TASK = 'lastNameReviwerTask'; }
159
+ static { this.STATIC_TOKEN_TASK_TOTAL_ASSIGNED_TO_REVIEWER = 'taskTotalAssignedToReviewer'; }
160
+ static { this.STATIC_TOKENS = [
161
+ {
162
+ key: TokenService.STATIC_TOKENS_KEY_PATROCINADOR,
163
+ label: 'Patrocinador'
164
+ },
165
+ {
166
+ key: TokenService.STATIC_TOKENS_KEY_PROGRAMA,
167
+ label: 'Programa'
168
+ },
169
+ {
170
+ key: TokenService.STATIC_TOKENS_KEY_PROMOCION,
171
+ label: 'Promoción'
172
+ },
173
+ {
174
+ key: TokenService.STATIC_TOKENS_KEY_ANIO_PROMOCION,
175
+ label: 'Año promoción'
176
+ },
177
+ {
178
+ key: TokenService.STATIC_TOKENS_KEY_ISO_MONEDA_BASE,
179
+ label: 'ISO Moneda base'
180
+ },
181
+ {
182
+ key: TokenService.STATIC_TOKENS_KEY_SALUDO_COMPLEMENTARIO,
183
+ label: 'Saludo complementario'
184
+ },
185
+ {
186
+ key: TokenService.STATIC_TOKENS_KEY_CODIGO_VERIFICACION,
187
+ label: 'Código de verificación'
188
+ },
189
+ {
190
+ key: TokenService.STATIC_TOKENS_KEY_A_QUIEN_VA_DIRIGIDO,
191
+ label: 'A quien va dirigido'
192
+ },
193
+ {
194
+ key: TokenService.STATIC_TOKENS_KEY_FECHA_ACTUAL,
195
+ label: 'Fecha actual'
196
+ },
197
+ {
198
+ key: TokenService.STATIC_TOKENS_KEY_STATUS_NAME,
199
+ label: 'Estado actual'
200
+ },
201
+ {
202
+ key: TokenService.STATIC_TOKENS_KEY_NUMBER_APPLICATION,
203
+ label: 'Número radicado'
204
+ },
205
+ {
206
+ key: TokenService.STATIC_TOKENS_KEY_USER_INITIALS,
207
+ label: 'Iniciales de usuario'
208
+ },
209
+ {
210
+ key: TokenService.STATIC_TOKENS_KEY_LETTER_SIGN,
211
+ label: 'Firma de cartas'
212
+ },
213
+ {
214
+ key: TokenService.STATIC_TOKENS_COMMITTEE_NAME,
215
+ label: 'Nombre comité'
216
+ },
217
+ {
218
+ key: TokenService.STATIC_TOKENS_COMMITTEE_SEGMENTATION,
219
+ label: 'Segmentación comité'
220
+ },
221
+ {
222
+ key: TokenService.STATIC_TOKENS_COMMITTEE_AGGRUPATION,
223
+ label: 'Agrupación comité'
224
+ },
225
+ {
226
+ key: TokenService.STATIC_TOKENS_COMMITTEE_CUTLINE_DATE,
227
+ label: 'Fecha Línea de corte'
228
+ },
229
+ {
230
+ key: TokenService.STATIC_TOKENS_CONFIRM_LEGALIZATION_APPOINTMENT,
231
+ label: 'Confirmación de cita'
232
+ },
233
+ {
234
+ key: TokenService.STATIC_TOKENS_CODEBTOR_DOCUMENT_NUMBER,
235
+ label: 'Número de documento de codeudor'
236
+ },
237
+ {
238
+ key: TokenService.STATIC_TOKENS_CODEBTOR_DOCUMENT_TYPE,
239
+ label: 'Tipo de documento de codeudor'
240
+ },
241
+ {
242
+ key: TokenService.STATIC_TOKENS_CODEBTOR_NAME,
243
+ label: 'Nombres codeudor'
244
+ },
245
+ {
246
+ key: TokenService.STATIC_TOKENS_CODEBTOR_LASTNAME,
247
+ label: 'Apellidos codeudor'
248
+ },
249
+ {
250
+ key: TokenService.STATIC_TOKENS_TYPE_CODEBTOR,
251
+ label: 'Tipo de persona codeudor'
252
+ },
253
+ {
254
+ key: TokenService.STATIC_TOKENS_CODEBTOR_VEHICLES_QUANTITY,
255
+ label: 'Cantidad vehiculos codeudor'
256
+ },
257
+ {
258
+ key: TokenService.STATIC_TOKENS_CODEBTOR_ASSETS_QUANTITY,
259
+ label: 'Cantidad bienes codeudor'
260
+ },
261
+ {
262
+ key: TokenService.STATIC_TOKENS_CODEBTOR_REVIEWER,
263
+ label: 'Revisor de codeudores'
264
+ },
265
+ {
266
+ key: TokenService.STATIC_TOKENS_TOTAL_WEIGHTED,
267
+ label: 'Ponderado total'
268
+ },
269
+ {
270
+ key: TokenService.STATIC_TOKENS_CONSECUTIVE_GUARANTEE,
271
+ label: 'Consecutivo de garantias'
272
+ },
273
+ {
274
+ key: TokenService.STATIC_TOKENS_REPRESENTATIVE_NAME,
275
+ label: 'Nombres representante legal'
276
+ },
277
+ {
278
+ key: TokenService.STATIC_TOKENS_REPRESENTATIVE_LASTNAME,
279
+ label: 'Apellidos representante legal'
280
+ },
281
+ {
282
+ key: TokenService.STATIC_TOKENS_REPRESENTATIVE_DOCUMENT_NUMBER,
283
+ label: 'Cedula representante legal'
284
+ },
285
+ {
286
+ key: TokenService.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY,
287
+ label: 'Tipo usuario estudio crédito'
288
+ },
289
+ {
290
+ key: TokenService.STATIC_TOKENS_DAY,
291
+ label: 'Dia'
292
+ },
293
+ {
294
+ key: TokenService.STATIC_TOKENS_MONTH,
295
+ label: 'Mes'
296
+ },
297
+ {
298
+ key: TokenService.STATIC_TOKENS_YEAR,
299
+ label: 'Año'
300
+ },
301
+ {
302
+ key: TokenService.STATIC_TOKENS_CITY_SIGNATURE,
303
+ label: 'Ciudad de la firma'
304
+ },
305
+ {
306
+ key: TokenService.STATIC_TOKENS_LIST_CODEBTORS,
307
+ label: 'Lista de codeudores'
308
+ },
309
+ {
310
+ key: TokenService.STATIC_TOKEN_INGRESO_CODEUDOR_HABEAS_DATA,
311
+ label: 'Ingreso Codeudor Habeas Data'
312
+ },
313
+ {
314
+ key: TokenService.STATIC_TOKEN_PDF_RESUMEN_CODEUDOR,
315
+ label: 'Pdf codeudor'
316
+ },
317
+ {
318
+ key: TokenService.STATIC_TOKENS_QUANTITY_VEHICLE_BENEFICIARY,
319
+ label: 'Cantidad de vehículos del seleccionado'
320
+ },
321
+ {
322
+ key: TokenService.STATIC_TOKENS_QUANTITY_ASSETS_BENEFICIARY,
323
+ label: 'Cantidad bienes del seleccionado'
324
+ },
325
+ {
326
+ key: TokenService.STATIC_TOKENS_BEN_CODIGO,
327
+ label: 'Código beneficiario'
328
+ },
329
+ {
330
+ key: TokenService.STATIC_TOKEN_CREDIT_REVIEWER_OBSERVATIONS,
331
+ label: 'Observaciones revisor financiero seleccionado'
332
+ },
333
+ {
334
+ key: TokenService.STATIC_TOKEN_CREDIT_REVIEWER_OBSERVATIONS_CODEBTOR,
335
+ label: 'Observaciones revisor financiero codeudores'
336
+ },
337
+ {
338
+ key: TokenService.STATIC_TOKEN_TAG_NAME,
339
+ label: 'Nombre del tag'
340
+ },
341
+ { key: TokenService.STATIC_TOKEN_NAME_REVIEWER_TASK, label: 'Nombre revisor tareas' },
342
+ {
343
+ key: TokenService.STATIC_TOKEN_LAST_NAME_REVIEWER_TASK,
344
+ label: 'Apellido revisor tareas'
345
+ },
346
+ {
347
+ key: TokenService.STATIC_TOKEN_TASK_TOTAL_ASSIGNED_TO_REVIEWER,
348
+ label: 'Total tareas asignadas a revisor'
349
+ }
350
+ ]; }
351
+ static { this.excludedToken = [
352
+ TokenService.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY.toLowerCase(),
353
+ TokenService.STATIC_TOKENS_CODEBTOR_VEHICLES_QUANTITY.toLowerCase(),
354
+ TokenService.STATIC_TOKENS_CODEBTOR_ASSETS_QUANTITY.toLowerCase()
355
+ ]; }
356
+ constructor(environment, httpClient, formService, currencyPipe) {
357
+ this.environment = environment;
358
+ this.httpClient = httpClient;
359
+ this.formService = formService;
360
+ this.currencyPipe = currencyPipe;
361
+ }
362
+ /** This promise allows to execute a function when consulting the form fields. */
363
+ getFormFieldsByPromCode(promCodigo) {
364
+ return new Promise((resolve, reject) => {
365
+ // Search the dynamic form
366
+ let lFormFieldsToken = null;
367
+ this.formService.getByPromCodigo(promCodigo).subscribe({
368
+ next: (arrayForms) => {
369
+ if (arrayForms.length > 0) {
370
+ for (const forms of arrayForms) {
371
+ let components = [];
372
+ components.push(...FormioUtil.getComponents(forms.components));
373
+ if (forms.components && forms.components.length > 0) {
374
+ for (const components of forms.components) {
375
+ if (components.components && components.components.length > 0) {
376
+ for (const component of components.components) {
377
+ if (component.columns && component.columns.length > 0) {
378
+ for (const cComponents of component.columns) {
379
+ if (cComponents.components &&
380
+ cComponents.components.length > 0) {
381
+ for (const iterator of cComponents.components) {
382
+ if (iterator.type === 'address') {
383
+ delete iterator.components;
384
+ }
385
+ }
386
+ }
387
+ }
388
+ }
389
+ }
390
+ }
391
+ }
392
+ }
393
+ }
394
+ }
395
+ let form = arrayForms;
396
+ if (!form ||
397
+ !form[0] ||
398
+ !form[0].promCodigo ||
399
+ form[0].promCodigo != promCodigo) {
400
+ // this.router.navigate(['404']);
401
+ resolve(lFormFieldsToken);
402
+ }
403
+ lFormFieldsToken = [];
404
+ for (let formComp of form) {
405
+ let newComponents;
406
+ let components = [];
407
+ if (formComp.components) {
408
+ newComponents = formComp.components;
409
+ }
410
+ else if (formComp.columns) {
411
+ newComponents = formComp.columns;
412
+ }
413
+ if (newComponents && UtilString.isValid(formComp.title)) {
414
+ lFormFieldsToken.push({
415
+ title: {
416
+ key: TokenService.getKeyFormulario(formComp.title),
417
+ value: formComp.title,
418
+ object: formComp
419
+ },
420
+ value: []
421
+ });
422
+ lFormFieldsToken[lFormFieldsToken.length - 1].value =
423
+ this.getComponenetForm(components, newComponents, null, false, null);
424
+ }
425
+ }
426
+ resolve(lFormFieldsToken);
427
+ },
428
+ error: (error) => {
429
+ reject(error);
430
+ }
431
+ });
432
+ });
433
+ }
434
+ getFormFieldsByFormId(formId) {
435
+ return new Promise((resolve, reject) => {
436
+ // Search the dynamic form
437
+ let lFormFieldsToken = null;
438
+ this.formService.getById(formId).subscribe((result) => {
439
+ let form = result;
440
+ if (!form || !form[0]) {
441
+ resolve(lFormFieldsToken);
442
+ }
443
+ lFormFieldsToken = [];
444
+ for (let formComp of form) {
445
+ let newComponents;
446
+ let components = [];
447
+ if (formComp.components) {
448
+ newComponents = formComp.components;
449
+ }
450
+ else if (formComp.columns) {
451
+ newComponents = formComp.columns;
452
+ }
453
+ if (newComponents && UtilString.isValid(formComp.title)) {
454
+ lFormFieldsToken.push({
455
+ title: {
456
+ key: TokenService.getKeyFormulario(formComp.title),
457
+ value: formComp.title,
458
+ object: formComp
459
+ },
460
+ value: []
461
+ });
462
+ lFormFieldsToken[lFormFieldsToken.length - 1].value =
463
+ this.getComponenetForm(components, newComponents, null, false, null);
464
+ }
465
+ }
466
+ resolve(lFormFieldsToken);
467
+ }, (error) => {
468
+ reject(error);
469
+ });
470
+ });
471
+ }
472
+ /** This promise allows to execute a function when consulting the form fields. */
473
+ getFormPanelsByPromCode(promCodigo) {
474
+ return new Promise((resolve, reject) => {
475
+ // Search the dynamic form
476
+ let lFormPannelsToken = null;
477
+ this.formService.getByPromCodigo(promCodigo).subscribe((result) => {
478
+ let form = result;
479
+ if (!form ||
480
+ !form[0] ||
481
+ !form[0].promCodigo ||
482
+ form[0].promCodigo != promCodigo) {
483
+ // this.router.navigate(['404']);
484
+ resolve(lFormPannelsToken);
485
+ }
486
+ lFormPannelsToken = [];
487
+ for (let formComp of form) {
488
+ let newComponents;
489
+ let components = [];
490
+ if (formComp.components) {
491
+ newComponents = formComp.components;
492
+ }
493
+ else if (formComp.columns) {
494
+ newComponents = formComp.columns;
495
+ }
496
+ if (newComponents && UtilString.isValid(formComp.title)) {
497
+ lFormPannelsToken.push({
498
+ title: {
499
+ key: TokenService.getKeyFormulario(formComp.title),
500
+ value: formComp.title,
501
+ object: formComp
502
+ },
503
+ value: []
504
+ });
505
+ lFormPannelsToken[lFormPannelsToken.length - 1].value =
506
+ this.getPanelComponenet(components, newComponents, null);
507
+ }
508
+ }
509
+ resolve(lFormPannelsToken);
510
+ }, (error) => {
511
+ reject(error);
512
+ });
513
+ });
514
+ }
515
+ /**
516
+ * A recursive method to get all the information of the editGrid dynamic form
517
+ * @param components
518
+ * @param form
519
+ */
520
+ getPanelComponenet(components, form, panelName) {
521
+ for (let formComp of form) {
522
+ if (formComp.type === 'panel') {
523
+ components.push(formComp);
524
+ }
525
+ else if (formComp.components || formComp.columns) {
526
+ let newComponents;
527
+ if (formComp.components) {
528
+ newComponents = formComp.components;
529
+ }
530
+ else if (formComp.columns) {
531
+ newComponents = formComp.columns;
532
+ }
533
+ components = this.getPanelComponenet(components, newComponents, panelName);
534
+ }
535
+ }
536
+ return components;
537
+ }
538
+ /**
539
+ * A recursive method to get all the information of the components a columns of the dynamic form
540
+ * @param components
541
+ * @param form
542
+ */
543
+ getComponenetForm(components, form, panelName, editgrid, editGridKey) {
544
+ for (let formComp of form) {
545
+ //MO- mantis 8743 fix address token
546
+ if ((formComp.components || formComp.columns) && formComp.type !== 'address') {
547
+ let newComponents;
548
+ if (formComp.components) {
549
+ newComponents = formComp.components;
550
+ if (formComp.type === 'editgrid') {
551
+ editgrid = true;
552
+ editGridKey = formComp.key;
553
+ }
554
+ }
555
+ else if (formComp.columns) {
556
+ newComponents = formComp.columns;
557
+ }
558
+ if (formComp.type && formComp.type === 'panel') {
559
+ panelName = formComp.title;
560
+ }
561
+ components = this.getComponenetForm(components, newComponents, panelName, editgrid, editGridKey);
562
+ }
563
+ else {
564
+ formComp.panelName = panelName;
565
+ formComp.editgrid = editgrid;
566
+ formComp.editGridKey = editGridKey;
567
+ components.push(formComp);
568
+ }
569
+ }
570
+ return components;
571
+ }
572
+ /** This promise allows to execute a function when consulting the form fields. */
573
+ getFormEditGridFieldsByPromCode(promCodigo) {
574
+ return new Promise((resolve, reject) => {
575
+ // Search the dynamic form
576
+ let lFormFieldsToken = null;
577
+ this.formService.getByPromCodigo(promCodigo).subscribe((result) => {
578
+ let form = result;
579
+ if (!form ||
580
+ !form[0] ||
581
+ !form[0].promCodigo ||
582
+ form[0].promCodigo != promCodigo) {
583
+ // this.router.navigate(['404']);
584
+ resolve(lFormFieldsToken);
585
+ }
586
+ lFormFieldsToken = [];
587
+ for (let formComp of form) {
588
+ let newComponents;
589
+ let components = [];
590
+ if (formComp.components) {
591
+ newComponents = formComp.components;
592
+ }
593
+ else if (formComp.columns) {
594
+ newComponents = formComp.columns;
595
+ }
596
+ if (newComponents && UtilString.isValid(formComp.title)) {
597
+ lFormFieldsToken.push({
598
+ title: {
599
+ key: TokenService.getKeyFormulario(formComp.title),
600
+ value: formComp.title,
601
+ object: formComp
602
+ },
603
+ value: []
604
+ });
605
+ lFormFieldsToken[lFormFieldsToken.length - 1].value =
606
+ this.getEditGridComponenet(components, newComponents, null);
607
+ }
608
+ }
609
+ resolve(lFormFieldsToken);
610
+ }, (error) => {
611
+ reject(error);
612
+ });
613
+ });
614
+ }
615
+ /**
616
+ * A recursive method to get all the information of the editGrid dynamic form
617
+ * @param components
618
+ * @param form
619
+ */
620
+ getEditGridComponenet(components, form, panelName) {
621
+ for (let formComp of form) {
622
+ if (formComp.type === 'editgrid') {
623
+ formComp.panelName = panelName;
624
+ components.push(formComp);
625
+ }
626
+ else if (formComp.components || formComp.columns) {
627
+ let newComponents;
628
+ if (formComp.components) {
629
+ newComponents = formComp.components;
630
+ }
631
+ else if (formComp.columns) {
632
+ newComponents = formComp.columns;
633
+ }
634
+ if (formComp.type && formComp.type === 'panel') {
635
+ panelName = formComp.title;
636
+ }
637
+ components = this.getEditGridComponenet(components, newComponents, panelName);
638
+ }
639
+ }
640
+ return components;
641
+ }
642
+ /** It returns the tokens by promCodigo */
643
+ getListByPromCodigo(promCode) {
644
+ return this.httpClient.get(this.environment.host.backend.configuration + 'token/getByPromCodigo', { params: new HttpParams().set('promCodigo', promCode.toString()) });
645
+ }
646
+ /** It returns the token by id */
647
+ getById(id) {
648
+ return this.httpClient.get(this.environment.host.backend.configuration + 'token/getById', {
649
+ params: new HttpParams().set('id', id.toString())
650
+ });
651
+ }
652
+ /** It deletes a form by id */
653
+ delete(id) {
654
+ return this.httpClient.delete(this.environment.host.backend.configuration + 'token/delete', { params: new HttpParams().set('id', id) });
655
+ }
656
+ /** It saves the token */
657
+ save(token) {
658
+ return this.httpClient.post(this.environment.host.backend.configuration + 'token/save', token, HEADER_JSON);
659
+ }
660
+ static getKeyFormulario(formTitle) {
661
+ if (UtilString.isValid(formTitle)) {
662
+ return (UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_FORM) +
663
+ UtilString.replaceAccentSpacesOthers(formTitle).replace(/_/g, '-'));
664
+ }
665
+ return '';
666
+ }
667
+ /** It returns the unique verification code */
668
+ getUniqueVerificationCode(login, token) {
669
+ return this.httpClient.get(this.environment.host.backend.documentsRepository +
670
+ 'documento/consultarCodigoUnico/' +
671
+ login +
672
+ '/' +
673
+ token, { params: new HttpParams() });
674
+ }
675
+ /** It send the information to copy the Document viewer */
676
+ copyDocumentInformationViewer(login, token, uniqueCode, documentURL, documentName) {
677
+ let infoDocumento = {
678
+ codigoUnico: uniqueCode,
679
+ rutaDocumento: documentURL,
680
+ documentName: documentName
681
+ };
682
+ return this.httpClient.post(this.environment.host.backend.documentsRepository +
683
+ 'documento/adicionarDocumento/' +
684
+ login +
685
+ '/' +
686
+ token, infoDocumento, HEADER_JSON);
687
+ }
688
+ static getKeyBudget() {
689
+ return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_BUDGET);
690
+ }
691
+ static getKeyDocument() {
692
+ return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_DOCUMENTO);
693
+ }
694
+ static getKeyDocumentAnalysis() {
695
+ return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_DOCUMENTO_ANALYSIS_TYPE);
696
+ }
697
+ static getKeyTask() {
698
+ return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_TASKL);
699
+ }
700
+ static getKeyStatic() {
701
+ return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_STATIC);
702
+ }
703
+ static getKeyCalculated(token) {
704
+ return (UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_CALCULATED) +
705
+ '_' +
706
+ UtilString.replaceAccentSpacesOthers(token.name));
707
+ }
708
+ static getKeySnapshot(token) {
709
+ return (UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_SNAPSHOT) +
710
+ '_' +
711
+ UtilString.replaceAccentSpacesOthers(token.name));
712
+ }
713
+ static getKeyGuarantee(token) {
714
+ return (UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_GUARANTEE) +
715
+ '_' +
716
+ UtilString.replaceAccentSpacesOthers(token.name));
717
+ }
718
+ /**
719
+ * Return a value that represent the type of label: 1=Form, 2=Budget, 3=Static, 4=Calculated
720
+ * @param key Value to evalueate
721
+ */
722
+ static getKeyType(key) {
723
+ key = key.replace('{', '').replace('}', '');
724
+ key = key.substring(1, key.indexOf('_'));
725
+ if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_FORM))) {
726
+ return 1;
727
+ }
728
+ else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_BUDGET))) {
729
+ return 2;
730
+ }
731
+ else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_STATIC))) {
732
+ return 3;
733
+ }
734
+ else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_CALCULATED))) {
735
+ return 4;
736
+ }
737
+ else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_TASKL))) {
738
+ return 5;
739
+ }
740
+ else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_DOCUMENTO_ANALYSIS_TYPE))) {
741
+ return 6;
742
+ }
743
+ return null;
744
+ }
745
+ /**
746
+ * Depends of the type of formFieldToken return de value of the valueData
747
+ * @param formFieldToken
748
+ * @param valueData
749
+ */
750
+ getValueFromFormField(formFieldToken, valueData) {
751
+ if (typeof valueData == 'object') {
752
+ if (formFieldToken.type) {
753
+ if (formFieldToken.type == 'address') {
754
+ return valueData.formatted_address;
755
+ }
756
+ if (formFieldToken.type == 'select' &&
757
+ valueData.hasOwnProperty(formFieldToken.searchField)) {
758
+ if (valueData.hasOwnProperty('original_name') !== '') {
759
+ return valueData.original_name;
760
+ }
761
+ else if (valueData.hasOwnProperty('nativeName') !== '') {
762
+ return valueData.nativeName;
763
+ }
764
+ else if (formFieldToken.searchField) {
765
+ return valueData[formFieldToken.searchField];
766
+ }
767
+ }
768
+ }
769
+ }
770
+ return valueData;
771
+ }
772
+ formatDate(value, locale) {
773
+ const date = new Date(value);
774
+ const months = {
775
+ es: [
776
+ 'enero',
777
+ 'febrero',
778
+ 'marzo',
779
+ 'abril',
780
+ 'mayo',
781
+ 'junio',
782
+ 'julio',
783
+ 'agosto',
784
+ 'septiembre',
785
+ 'octubre',
786
+ 'noviembre',
787
+ 'diciembre'
788
+ ],
789
+ en: [
790
+ 'January',
791
+ 'February',
792
+ 'March',
793
+ 'April',
794
+ 'May',
795
+ 'June',
796
+ 'July',
797
+ 'August',
798
+ 'September',
799
+ 'October',
800
+ 'November',
801
+ 'December'
802
+ ],
803
+ fr: [
804
+ 'janvier',
805
+ 'février',
806
+ 'mars',
807
+ 'avril',
808
+ 'mai',
809
+ 'juin',
810
+ 'juillet',
811
+ 'août',
812
+ 'septembre',
813
+ 'octobre',
814
+ 'novembre',
815
+ 'décembre'
816
+ ],
817
+ de: [
818
+ 'Januar',
819
+ 'Februar',
820
+ 'März',
821
+ 'April',
822
+ 'Mai',
823
+ 'Juni',
824
+ 'Juli',
825
+ 'August',
826
+ 'September',
827
+ 'Oktober',
828
+ 'November',
829
+ 'Dezember'
830
+ ],
831
+ it: [
832
+ 'gennaio',
833
+ 'febbraio',
834
+ 'marzo',
835
+ 'aprile',
836
+ 'maggio',
837
+ 'giugno',
838
+ 'luglio',
839
+ 'agosto',
840
+ 'settembre',
841
+ 'ottobre',
842
+ 'novembre',
843
+ 'dicembre'
844
+ ]
845
+ };
846
+ const localeMonths = months[locale];
847
+ const month = localeMonths[date.getMonth()];
848
+ const year = date.getFullYear();
849
+ return `${month} ${year}`;
850
+ }
851
+ /**
852
+ * Try to find the token in the stringText and replace with dataValue. If detect format of number or date try to format the dataValue
853
+ * @param stringText
854
+ * @param token
855
+ * @param dataValue
856
+ */
857
+ replaceToken(stringText, token, dataValue, locale) {
858
+ let valueReplace = null;
859
+ if (token && token[0] == '#') {
860
+ let typeToken = token.substring(1, token.indexOf('('));
861
+ if (typeToken == 'date') {
862
+ let dateFormat = token.substring(token.indexOf('}') + 1, token.indexOf(')'));
863
+ dateFormat = dateFormat.trim().replace(/\"/g, '').replace(/\'/g, '');
864
+ let dateValue = DateUtil.getDate(dataValue);
865
+ if (locale != null && locale) {
866
+ valueReplace = this.formatDate(dateValue, locale);
867
+ }
868
+ else if (dateValue) {
869
+ valueReplace = DateUtil.getMoment(dateValue).format(dateFormat);
870
+ }
871
+ else {
872
+ valueReplace = '';
873
+ }
874
+ }
875
+ else if (typeToken == 'number') {
876
+ let numberValue = Number(dataValue);
877
+ if (numberValue != undefined && !isNaN(numberValue)) {
878
+ let numberFormat = token.substring(token.indexOf('}') + 1, token.indexOf(')'));
879
+ numberFormat = numberFormat.trim().replace(/\"/g, '').replace(/\'/g, '');
880
+ valueReplace = this.currencyPipe.transform(numberValue, this.locale, '', numberFormat);
881
+ }
882
+ else {
883
+ console.log('El dato [' +
884
+ dataValue +
885
+ '] para el token [' +
886
+ token +
887
+ '] tipo númerico no es valido');
888
+ valueReplace = '';
889
+ }
890
+ }
891
+ else {
892
+ console.log('tipo de token indefinido. [typeToken[' + typeToken + ']]');
893
+ }
894
+ }
895
+ else if (token && token[0] == '$') {
896
+ if (dataValue !== null &&
897
+ dataValue !== undefined &&
898
+ dataValue.original_name !== undefined &&
899
+ dataValue.original_name !== null) {
900
+ valueReplace = dataValue.original_name;
901
+ }
902
+ else {
903
+ valueReplace = dataValue;
904
+ }
905
+ // valueReplace = dataValue;
906
+ }
907
+ else {
908
+ console.log('El token no es valido. [token[' + token + ']]');
909
+ }
910
+ if (stringText && valueReplace !== null) {
911
+ // replace text in a more efficient way
912
+ stringText = stringText.split(token).join(valueReplace);
913
+ //stringText = stringText.replace(token, valueReplace);
914
+ }
915
+ return stringText;
916
+ }
917
+ getListTokensByStringSegmentation(stringText) {
918
+ const arrayToken = stringText.match(/\${([^}]+)\}/g);
919
+ const arrayTokenFormattedDate = stringText.match(/\#date[^)]+\)/g);
920
+ const arrayTokenFormattedNumber = stringText.match(/\#number[^)]+\)/g);
921
+ let arrayTokenFormatted = [];
922
+ if (arrayTokenFormattedDate &&
923
+ arrayTokenFormattedDate.length > 0 &&
924
+ arrayTokenFormattedNumber &&
925
+ arrayTokenFormattedNumber.length > 0) {
926
+ arrayTokenFormatted = arrayTokenFormattedDate.concat(arrayTokenFormattedNumber);
927
+ }
928
+ else if (arrayTokenFormattedDate && arrayTokenFormattedDate.length > 0) {
929
+ arrayTokenFormatted = arrayTokenFormattedDate.slice();
930
+ }
931
+ else if (arrayTokenFormattedNumber && arrayTokenFormattedNumber.length > 0) {
932
+ arrayTokenFormatted = arrayTokenFormattedNumber.slice();
933
+ }
934
+ const result = [];
935
+ if (arrayToken) {
936
+ for (const token of arrayToken) {
937
+ const infoToken = { key: token, value: token };
938
+ if (arrayTokenFormatted) {
939
+ for (const tokenFormatted of arrayTokenFormatted) {
940
+ const index = tokenFormatted.indexOf(token);
941
+ if (index >= 0) {
942
+ infoToken.value = tokenFormatted;
943
+ break;
944
+ }
945
+ }
946
+ }
947
+ result.push(infoToken);
948
+ }
949
+ }
950
+ return result;
951
+ }
952
+ changeIdPropertiesOfObject(normalizationColumns, listData) {
953
+ const newData = [];
954
+ listData.forEach((data) => {
955
+ const objData = {};
956
+ Object.keys(data).forEach((property) => {
957
+ if (data.hasOwnProperty(property)) {
958
+ normalizationColumns.forEach((column) => {
959
+ if (column.idColumn.toString() === property) {
960
+ objData[column.key] = data[property];
961
+ }
962
+ });
963
+ }
964
+ });
965
+ if (objData) {
966
+ newData.push(objData);
967
+ }
968
+ });
969
+ return newData;
970
+ }
971
+ generateHtmlByTokensAndData(html, listData, listTokens) {
972
+ const translatedCards = [];
973
+ listData.forEach((data) => {
974
+ const objToken = {};
975
+ const htmlTranslated = { html: html };
976
+ Object.keys(data).forEach((property) => {
977
+ listTokens.forEach((token) => {
978
+ if (property == token.key.replace('${', '').replace('}', '')) {
979
+ objToken[token.key] = data[property];
980
+ htmlTranslated.html = htmlTranslated.html.replace(token.key, data[property]);
981
+ }
982
+ });
983
+ });
984
+ translatedCards.push(htmlTranslated);
985
+ });
986
+ return translatedCards;
987
+ }
988
+ getListTokensByString(stringText) {
989
+ var arrayToken = stringText.match(/\${([^}]+)\}/g);
990
+ var arrayTokenFormattedDate = stringText.match(/\#date[^)]+\)/g);
991
+ var arrayTokenFormattedNumber = stringText.match(/\#number[^)]+\)/g);
992
+ var arrayTokenFormatted = [];
993
+ if (arrayTokenFormattedDate &&
994
+ arrayTokenFormattedDate.length > 0 &&
995
+ arrayTokenFormattedNumber &&
996
+ arrayTokenFormattedNumber.length > 0) {
997
+ arrayTokenFormatted = arrayTokenFormattedDate.concat(arrayTokenFormattedNumber);
998
+ }
999
+ else if (arrayTokenFormattedDate && arrayTokenFormattedDate.length > 0) {
1000
+ arrayTokenFormatted = arrayTokenFormattedDate.slice();
1001
+ }
1002
+ else if (arrayTokenFormattedNumber && arrayTokenFormattedNumber.length > 0) {
1003
+ arrayTokenFormatted = arrayTokenFormattedNumber.slice();
1004
+ }
1005
+ var result = [];
1006
+ if (arrayToken) {
1007
+ for (const token of arrayToken) {
1008
+ let keyType = TokenService.getKeyType(token);
1009
+ if (keyType === null) {
1010
+ continue;
1011
+ }
1012
+ var infoToken = { key: token, value: token };
1013
+ if (arrayTokenFormatted) {
1014
+ for (const tokenFormatted of arrayTokenFormatted) {
1015
+ var index = tokenFormatted.indexOf(token);
1016
+ if (index >= 0) {
1017
+ infoToken.value = tokenFormatted;
1018
+ break;
1019
+ }
1020
+ }
1021
+ }
1022
+ result.push(infoToken);
1023
+ }
1024
+ }
1025
+ return result;
1026
+ // let tokens: any[] = [];
1027
+ // let i = this.nextValidPositionTokens(stringText, 0);
1028
+ // let count = 0;
1029
+ // while (i >= 0 && count <= 10) {
1030
+ // let infoToken: {} = null;
1031
+ // let nextI: number = i;
1032
+ // let character = stringText.substring(i, (i + 1));
1033
+ // if (character == "$") {
1034
+ // let nextCharacter = stringText.substring((i + 1), (i + 2));
1035
+ // // The next character need to be a { sign
1036
+ // if (nextCharacter != "{") {
1037
+ // i = this.nextValidPositionTokens(stringText, nextI + 1);
1038
+ // continue;
1039
+ // }
1040
+ // let keyToken: string = stringText.substring(i, stringText.indexOf("}", i) + 1);
1041
+ // // If the token have a valid key type
1042
+ // let keyType: number = TokenService.getKeyType(keyToken.replace("{", "").replace("}", ""));
1043
+ // if (keyType === null) {
1044
+ // i = this.nextValidPositionTokens(stringText, nextI + 1);
1045
+ // continue;
1046
+ // }
1047
+ // infoToken = {
1048
+ // key: keyToken,
1049
+ // value: keyToken
1050
+ // };
1051
+ // nextI = stringText.indexOf("}", i);
1052
+ // } else {
1053
+ // let nextSign: number = stringText.indexOf("$", i);
1054
+ // // We inly support #date($ and #number($ in this 2 scenarios the lenght can't be more than 10 characters
1055
+ // if (nextSign < 0 || (nextSign - i) > 10) {
1056
+ // i = this.nextValidPositionTokens(stringText, nextI + 1);
1057
+ // continue;
1058
+ // }
1059
+ // let keyToken: string = stringText.substring(stringText.indexOf("$", i), stringText.indexOf("}", i) + 1);
1060
+ // let valueToken: string = stringText.substring(i, stringText.indexOf(")", i) + 1);
1061
+ // infoToken = {
1062
+ // key: keyToken,
1063
+ // value: valueToken
1064
+ // };
1065
+ // nextI = stringText.indexOf(")", i);
1066
+ // }
1067
+ // tokens.push(infoToken);
1068
+ // i = this.nextValidPositionTokens(stringText, nextI);
1069
+ // count++;
1070
+ // }
1071
+ // return tokens;
1072
+ }
1073
+ nextValidPositionTokens(stringText, nextI) {
1074
+ let tokenDollarSign = stringText.indexOf('$', nextI);
1075
+ let tokenNumSign = stringText.indexOf('#', nextI);
1076
+ let i = tokenDollarSign < 0 && tokenNumSign >= 0
1077
+ ? tokenNumSign
1078
+ : tokenNumSign < 0 && tokenDollarSign >= 0
1079
+ ? tokenDollarSign
1080
+ : tokenDollarSign < tokenNumSign
1081
+ ? tokenDollarSign
1082
+ : tokenNumSign;
1083
+ return i;
1084
+ }
1085
+ /**
1086
+ * It reuses replaceTokensFromListObjectPublic but set all keys lobjecttokens as lowercase
1087
+ * @param tokenName
1088
+ * @param formula
1089
+ * @param lObjectTokens
1090
+ */
1091
+ replaceTokensFromListObjectPublic(tokenName, formula, lObjectTokens) {
1092
+ let lDataOrg = [];
1093
+ if (lObjectTokens) {
1094
+ for (let dataForm in lObjectTokens) {
1095
+ lDataOrg[dataForm.toLowerCase()] = lObjectTokens[dataForm];
1096
+ }
1097
+ }
1098
+ return this.replaceTokensFromListObject(tokenName, formula, lDataOrg);
1099
+ }
1100
+ /**
1101
+ * @param tokenName token name
1102
+ * @param formula String with the formula to execute
1103
+ * @param lObjectTokens List of tokens with the values to replace
1104
+ */
1105
+ replaceTokensFromListObject(tokenName, formula, lObjectTokens) {
1106
+ if (!formula || formula.length == 0) {
1107
+ throw {
1108
+ message: 'La formula del token ' + tokenName + ' esta vacía',
1109
+ title: 'Alerta!',
1110
+ error: 'La formula del token ' + tokenName + ' esta vacía. [formula[' + formula + ']]'
1111
+ };
1112
+ }
1113
+ let replacedTokens = formula.toString();
1114
+ if (replacedTokens.startsWith('file://')) {
1115
+ return replacedTokens;
1116
+ }
1117
+ // Find the tokens in the formula
1118
+ let tokensArray = this.getListTokensByString(replacedTokens);
1119
+ if (tokensArray.length == 0) {
1120
+ return replacedTokens;
1121
+ }
1122
+ // If there any token, try to replace
1123
+ for (let i = 0; i < tokensArray.length; i++) {
1124
+ let objectToken = lObjectTokens[tokensArray[i].key] !== undefined
1125
+ ? lObjectTokens[tokensArray[i].key]
1126
+ : null;
1127
+ let clearKey;
1128
+ if (objectToken == null) {
1129
+ clearKey = tokensArray[i].key.replace('${', '').replace('}', '').toLowerCase();
1130
+ objectToken =
1131
+ lObjectTokens[clearKey] !== undefined ? lObjectTokens[clearKey] : null;
1132
+ if (objectToken == null) {
1133
+ clearKey = tokensArray[i].key
1134
+ .replace('{', '')
1135
+ .replace('}', '')
1136
+ .split('_')[1]
1137
+ .toLowerCase();
1138
+ objectToken =
1139
+ lObjectTokens[clearKey] !== undefined ? lObjectTokens[clearKey] : null;
1140
+ if (objectToken === null || objectToken === undefined) {
1141
+ const arrayKey = tokensArray[i].key
1142
+ .replace('{', '')
1143
+ .replace('}', '')
1144
+ .split('_')[1]
1145
+ .split('.');
1146
+ if (arrayKey.length > 0) {
1147
+ let value = lObjectTokens;
1148
+ for (let index = 0; index < arrayKey.length; index++) {
1149
+ let element = arrayKey[index];
1150
+ if (index == 0) {
1151
+ element = element.toLowerCase();
1152
+ }
1153
+ value = value[element];
1154
+ }
1155
+ objectToken = value;
1156
+ }
1157
+ }
1158
+ }
1159
+ }
1160
+ if (objectToken == null) {
1161
+ // If not find the token, by default put an empty string
1162
+ /*if (TokenService.excludedToken.indexOf(clearKey) === -1) {
1163
+ console.error(
1164
+ 'El token ' + tokensArray[i].value + ' no fue encontrado.',
1165
+ lObjectTokens,
1166
+ tokensArray
1167
+ );
1168
+ }*/
1169
+ objectToken = '';
1170
+ }
1171
+ if (objectToken != null) {
1172
+ // let value: any = Number(objectToken)
1173
+ // ? objectToken
1174
+ // : Array.isArray(objectToken)
1175
+ // ? JSON.stringify(objectToken)
1176
+ // : "'" + objectToken + "'";
1177
+ let value;
1178
+ if (Number(objectToken)) {
1179
+ value = Number(objectToken);
1180
+ }
1181
+ else if (Array.isArray(objectToken)) {
1182
+ value = Array.isArray(objectToken);
1183
+ }
1184
+ else if (JSON.stringify(objectToken)) {
1185
+ value = objectToken.original_name ? "'" + objectToken.original_name + "'" : JSON.stringify(objectToken);
1186
+ }
1187
+ else {
1188
+ value = "'" + objectToken + "'";
1189
+ }
1190
+ replacedTokens = this.replaceToken(replacedTokens, tokensArray[i].value, value);
1191
+ // } else {
1192
+ // console.error(lObjectTokens, tokensArray);
1193
+ // throw {
1194
+ // message: "No se encontró valor para un token",
1195
+ // title: "Alerta!",
1196
+ // error: "El token " + tokensArray[i].value + " no fue encontrado."
1197
+ // };
1198
+ //
1199
+ // Si es la ultima iteracion y la formula tiene [ es porque tiene un array en el valor que resolvio el token
1200
+ if (i == tokensArray.length - 1 && replacedTokens.includes('[')) {
1201
+ // Se ponen todos los operandos como elementos en un array ['expresion a', '&&', 'Expresion B']
1202
+ let formExpressions = replacedTokens.split(/ (\|\||&&) /);
1203
+ let lAuxformExpression = [];
1204
+ formExpressions.forEach((expression) => {
1205
+ if (expression.charAt(0) == '[') {
1206
+ let isTagFound = '';
1207
+ isTagFound = this.findTag(expression);
1208
+ lAuxformExpression.push(isTagFound);
1209
+ }
1210
+ else {
1211
+ lAuxformExpression.push(expression);
1212
+ }
1213
+ });
1214
+ replacedTokens = lAuxformExpression.join(' ');
1215
+ }
1216
+ }
1217
+ }
1218
+ return replacedTokens;
1219
+ }
1220
+ /**
1221
+ * MEtodo que teniendo una expresion de la forma ['tag1', 'tag2']==tag3
1222
+ * evalua si tag3 hace parte del array si tiene el operador ==.
1223
+ * Si tiene el operador != examina que tag3 no haga parte del array+
1224
+ *
1225
+ * @param expression Operando que evalua tag. Es de la forma ['tag1', 'tag2']==tag3
1226
+ * @returns Retorna 'true' o 'false' en string que despues sera pasado a un eval()
1227
+ * mas adelante en el flujo
1228
+ */
1229
+ findTag(expression) {
1230
+ let regexOperator = new RegExp('(===|==|!==|!=)');
1231
+ // Retorna el operador
1232
+ let operator = expression.match(regexOperator);
1233
+ // Si no encuentra un operador segun el patron retorna 'false'
1234
+ // para evitar resultados inesperados
1235
+ if (operator == null) {
1236
+ console.error('No se encontro un operador permitido para la expresion');
1237
+ return 'false';
1238
+ }
1239
+ // Separa la sentencia por el operador
1240
+ // La primera parte es el valor por el cual se remplaza el token que es un array en string "['a', 'b']"
1241
+ // El segundo es el valor con el cual se va a comparar
1242
+ let valueToken, valueToCompare;
1243
+ [valueToken, valueToCompare] = expression.split(operator[0]);
1244
+ // Se limpia el string correspondiente al array para que los elementos queden separados por ","
1245
+ valueToken = valueToken.replace(/[^a-zA-Z0-9 ,]/g, '');
1246
+ // Si no hay tags asociados al registro se devuelve 'false'
1247
+ if (!valueToken) {
1248
+ console.error('No hay tags asociados a esta aplicación');
1249
+ return 'false';
1250
+ }
1251
+ // Se limpia el string correspondiente al valor por comparar
1252
+ valueToCompare = valueToCompare.replace(/[^a-zA-Z0-9 ]/g, '');
1253
+ // El string correspondiente al array pasa a ser tipo array
1254
+ valueToken = valueToken.split(',');
1255
+ // Se trata de constatar si el valor a comparar se encuetra o no dentro
1256
+ // Si el operador que se encontro == returna true si lo encuentra
1257
+ let isTagFound = true;
1258
+ switch (operator[0]) {
1259
+ case '==':
1260
+ isTagFound = valueToken.some((tag) => tag == valueToCompare);
1261
+ break;
1262
+ case '===':
1263
+ isTagFound = valueToken.some((tag) => tag === valueToCompare);
1264
+ break;
1265
+ case '!==':
1266
+ isTagFound = valueToken.some((tag) => tag !== valueToCompare);
1267
+ break;
1268
+ case '!=':
1269
+ isTagFound = valueToken.some((tag) => tag != valueToCompare);
1270
+ break;
1271
+ default:
1272
+ break;
1273
+ }
1274
+ expression = isTagFound ? 'true' : 'false';
1275
+ return expression;
1276
+ }
1277
+ /**
1278
+ * Try to eval the formula depend of the type of fields.
1279
+ * @param lStaticToken
1280
+ * @param formulaName
1281
+ * @param formula
1282
+ */
1283
+ validateFormula(lStaticToken, formulaName, formula) {
1284
+ let evalFormula = false;
1285
+ // To validate the formula, first organize the info to key - value array
1286
+ let objectTokens = [];
1287
+ for (let panel of lStaticToken) {
1288
+ for (let groupToken of panel.value) {
1289
+ for (let staticToken of groupToken.value) {
1290
+ for (let arrayTokenInfo of staticToken) {
1291
+ objectTokens[arrayTokenInfo.key] = arrayTokenInfo.object
1292
+ ? arrayTokenInfo.object.type == 'number'
1293
+ ? '0'
1294
+ : ''
1295
+ : '';
1296
+ }
1297
+ }
1298
+ }
1299
+ }
1300
+ try {
1301
+ formula = this.replaceTokensFromListObject(formulaName, formula, objectTokens);
1302
+ }
1303
+ catch (error) {
1304
+ //console.error(error);
1305
+ throw error;
1306
+ }
1307
+ if (formula !== null) {
1308
+ try {
1309
+ let result = formula.startsWith('file://') ? formula : eval(formula);
1310
+ evalFormula = true;
1311
+ }
1312
+ catch (e) {
1313
+ //console.error("Error evaluating the formula", e);
1314
+ throw {
1315
+ message: 'La formula no fue posible evaluar',
1316
+ title: 'Alerta!',
1317
+ error: e
1318
+ };
1319
+ }
1320
+ }
1321
+ return evalFormula;
1322
+ }
1323
+ getConfigCloningTokenMap(oldPPP, newPPP) {
1324
+ return this.httpClient.get(this.environment.host.backend.configuration + 'token/getConfigCloningTokenMap', {
1325
+ params: new HttpParams()
1326
+ .set('oldPPP', oldPPP.toString())
1327
+ .set('newPPP', newPPP.toString())
1328
+ });
1329
+ }
1330
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenService, deps: [{ token: 'environment' }, { token: i1.HttpClient }, { token: i2.FormService }, { token: i3.CurrencyPipe }], target: i0.ɵɵFactoryTarget.Injectable }); }
1331
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenService, providedIn: 'root' }); }
1332
+ }
1333
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenService, decorators: [{
1334
+ type: Injectable,
1335
+ args: [{
1336
+ providedIn: 'root'
1337
+ }]
1338
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
1339
+ type: Inject,
1340
+ args: ['environment']
1341
+ }] }, { type: i1.HttpClient }, { type: i2.FormService }, { type: i3.CurrencyPipe }], propDecorators: { locale: [{
1342
+ type: Inject,
1343
+ args: [LOCALE_ID]
1344
+ }] } });
1345
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXBsaS1jb21tb25zL3NyYy9saWIvc2VydmljZXMvdG9rZW4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUErQixVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFN0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7OztBQU1sRCxNQUFNLE9BQU8sWUFBWTtJQUN4QixNQUFNO2FBQ0MsdUJBQWtCLEdBQVcscUJBQXFCLEFBQWhDLENBQWlDO0lBSzFELE1BQU07YUFDQyxxQkFBZ0IsR0FBVyxLQUFLLEFBQWhCLENBQWlCO0lBQ3hDLE1BQU07YUFDQyx1QkFBa0IsR0FBVyxhQUFhLEFBQXhCLENBQXlCO0lBQ2xELE1BQU07YUFDQywyQkFBc0IsR0FBVyxXQUFXLEFBQXRCLENBQXVCO0lBQ3BELE1BQU07YUFDQyx5QkFBb0IsR0FBVyxVQUFVLEFBQXJCLENBQXNCO0lBQ2pELE1BQU07YUFDQyx1QkFBa0IsR0FBVyxVQUFVLEFBQXJCLENBQXNCO0lBQy9DLE1BQU07YUFDQywwQkFBcUIsR0FBVyxXQUFXLEFBQXRCLENBQXVCO0lBQ25ELE1BQU07YUFDQyw4Q0FBeUMsR0FBVyxtQ0FBbUMsQUFBOUMsQ0FBK0M7SUFDL0YsTUFBTTthQUNDLGtDQUE2QixHQUFXLG1CQUFtQixBQUE5QixDQUErQjtJQUNuRSxNQUFNO2FBQ0MscUJBQWdCLEdBQVcsT0FBTyxBQUFsQixDQUFtQjtJQUMxQyxNQUFNO2FBQ0Msc0JBQWlCLEdBQVcsTUFBTSxBQUFqQixDQUFrQjtJ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UUFBUSxFQUFFLENBQUM7aUJBQ2hDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ2xDLENBQ0QsQ0FBQztJQUNILENBQUM7K0dBcjdDVyxZQUFZLGtCQXFXZixhQUFhO21IQXJXVixZQUFZLGNBRlosTUFBTTs7NEZBRU4sWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEI7OzBCQXNXRSxNQUFNOzJCQUFDLGFBQWE7dUhBaFdJLE1BQU07c0JBQS9CLE1BQU07dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1cnJlbmN5UGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgTE9DQUxFX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERhdGVVdGlsLCBIRUFERVJfSlNPTiwgUGxpQ25mR3VhcmFudGVlVG9rZW4sIFRva2VuLCBVdGlsU3RyaW5nIH0gZnJvbSAnbmctcGxpLXV0aWwnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEZvcm1pb1V0aWwgfSBmcm9tICcuLi91dGlscy9mb3JtaW8tdXRpbCc7XHJcbmltcG9ydCB7IEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi9mb3JtLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG5cdHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVG9rZW5TZXJ2aWNlIHtcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU0lHTl9MRVRURVJfVEFHX0lEOiBzdHJpbmcgPSAnX3NpZ24tbGV0dGVyLXRhZy1pZCc7XHJcblxyXG5cdC8qKiAqL1xyXG5cdEBJbmplY3QoTE9DQUxFX0lEKSBwdWJsaWMgbG9jYWxlOiBzdHJpbmc7XHJcblxyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBUT0tFTl9MQUJFTF9GT1JNOiBzdHJpbmcgPSAnRnJtJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fTEFCRUxfQlVER0VUOiBzdHJpbmcgPSAnUHJlc3VwdWVzdG8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBUT0tFTl9MQUJFTF9DQUxDVUxBVEVEOiBzdHJpbmcgPSAnQ2FsY3VsYWRvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fTEFCRUxfU05BUFNIT1Q6IHN0cmluZyA9ICdTbmFwc2hvdCc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFRPS0VOX0xBQkVMX1NUQVRJQzogc3RyaW5nID0gJ0VzdMOhdGljbyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFRPS0VOX0xBQkVMX0RPQ1VNRU5UTzogc3RyaW5nID0gJ0RvY3VtZW50byc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFRPS0VOX0xBQkVMX0RPQ1VNRU5UT19BTkFMSVNJU19BVVRPTUFUSUNPOiBzdHJpbmcgPSAnQW7DoWxpc2lzIGF1dG9tw6F0aWNvIGRlIGRvY3VtZW50b3MnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBUT0tFTl9ET0NVTUVOVE9fQU5BTFlTSVNfVFlQRTogc3RyaW5nID0gJ2RvY3VtZW50X2FuYWx5c2lzJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fTEFCRUxfVEFTSzogc3RyaW5nID0gJ1RhcmVhJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fTEFCRUxfVEFTS0w6IHN0cmluZyA9ICd0YXNrJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fTEFCRUxfR1VBUkFOVEVFOiBzdHJpbmcgPSAnR2FyYW50aWEnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9UT1RBTF9BTU9VTlQ6IHN0cmluZyA9ICd0b3RhbEFtb3VudCc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfS0VZX0FQUExJQ0FUSU9OX1BST0NFU1NfVE9UQUxfQU1PVU5UOiBzdHJpbmcgPSAnYXBwbGljYXRpb25Ub3RhbCc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfS0VZX0FQUExJQ0FUSU9OX1BST0NFU1NfVE9UQUxfT1dOX0ZPVU5EUzogc3RyaW5nID0gJ2FwcGxpY2F0aW9uT3duRm91bmRzJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19LRVlfQVBQTElDQVRJT05fUFJPQ0VTU19UT1RBTF9GSU5BTkNJTkc6IHN0cmluZyA9ICdhcHBsaWNhdGlvbkZpbmFuY2luZyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfS0VZX0xFR0FMSVpBVElPTl9QUk9DRVNTX1RPVEFMX0FNT1VOVDogc3RyaW5nID0gJ2xlZ2FsaXphdGlvblRvdGFsJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19LRVlfTEVHQUxJWkFUSU9OX1BST0NFU1NfVE9UQUxfT1dOX0ZPVU5EUzogc3RyaW5nID1cclxuXHRcdCdsZWdhbGl6YXRpb25Pd25Gb3VuZHMnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9MRUdBTElaQVRJT05fUFJPQ0VTU19UT1RBTF9GSU5BTkNJTkc6IHN0cmluZyA9ICdsZWdhbGl6YXRpb25GaW5hbmNpbmcnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9JTlNVUkFOQ0VfQU1PVU5UOiBzdHJpbmcgPSAnaW5zdXJhbmNlQW1vdW50JztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgTEVHQUxJWkFUSU9OX09SX0FQUExJQ0FUSU9OX1RPVEFMX0ZJTkFOQ0lORzogc3RyaW5nID1cclxuXHRcdCdsZWdsaXphdGlvbk9yQXBwbGljYXRpb25Ub3RhbEZpbmFuY2luZyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfS0VZX1JFU1VNRV9DQVRFR09SWV9ZRUFSOiBzdHJpbmcgPSAncmVzdW1lQ2F0ZWdvcnlZZWFyJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19LRVlfRkVDSEFfRklOQU5DSU5HX1NUQVJUOiBzdHJpbmcgPSAnZmVjaGFJbmljaW9GaW5hbmNpYWNpb24nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9GRUNIQV9GSU5BTkNJTkdfRU5EOiBzdHJpbmcgPSAnZmVjaGFGaW5GaW5hbmNpYWNpb24nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0RVUkFUSU9OX1NUVURJRVM6IHN0cmluZyA9ICdkdXJhY2lvbkVzdHVkaW9zJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19GSU5BTkNJTkdfRFVSQVRJT046IHN0cmluZyA9ICdkdXJhY2lvbkZpbmFuY2lhY2lvbic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX0NPRElHT19WRVJJRklDQUNJT046IHN0cmluZyA9ICdjb2RpZ29WZXJpZmljYWNpb24nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9BX1FVSUVOX1ZBX0RJUklHSURPOiBzdHJpbmcgPSAnYVF1aWVuVmFEaXJpZ2lkbyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX0ZFQ0hBX0FDVFVBTDogc3RyaW5nID0gJ2ZlY2hhQWN0dWFsJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfU1RBVFVTX05BTUU6IHN0cmluZyA9ICdzdGF0dXNOYW1lJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfUEFUUk9DSU5BRE9SOiBzdHJpbmcgPSAncGxpUGF0cm9jaW5hZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfUEFUUk9DSU5BRE9SX0NPUlRPOiBzdHJpbmcgPSAncGxpUGF0cm9jaW5hZG9yQ29ydG8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9QUk9HUkFNQTogc3RyaW5nID0gJ3BsaVByb2dyYW1hJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfUFJPR1JBTUFfQ09SVE86IHN0cmluZyA9ICdwbGlQcm9ncmFtYUNvcnRvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfUFJPTU9DSU9OOiBzdHJpbmcgPSAncGxpUHJvbW9jaW9uJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfUFJPTU9DSU9OX0NPUlRPOiBzdHJpbmcgPSAncGxpUHJvbW9jaW9uQ29ydG8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9BTklPX1BST01PQ0lPTjogc3RyaW5nID0gJ2FuaW9Qcm9tb2Npb24nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9JU09fTU9ORURBX0JBU0U6IHN0cmluZyA9ICdpc29Nb25lZGFCYXNlJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfU0FMVURPX0NPTVBMRU1FTlRBUklPOiBzdHJpbmcgPSAnc2FsdWRvQ29tcGxlbWVudGFyaW8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9OVU1CRVJfQVBQTElDQVRJT046IHN0cmluZyA9ICdudW1lcm9SYWRpY2Fkbyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX1VTRVJfSU5JVElBTFM6IHN0cmluZyA9ICdpbmljaWFsZXNVc3VhcmlvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfTEVUVEVSX1NJR046IHN0cmluZyA9ICdmaXJtYUNhcnRhJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT01NSVRURUVfTkFNRTogc3RyaW5nID0gJ2NvbWl0ZU5vbWJyZSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX1NFR01FTlRBVElPTjogc3RyaW5nID0gJ2NvbWl0ZVNlZ21lbnRhY2lvbic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX0FHR1JVUEFUSU9OOiBzdHJpbmcgPSAnY29taXRlQWdydXBhY2lvbic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX0NVVExJTkVfREFURTogc3RyaW5nID0gJ2NvbWl0ZUZlY2hhTGluZWEnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPTkZJUk1fTEVHQUxJWkFUSU9OX0FQUE9JTlRNRU5UOiBzdHJpbmcgPSAnY29uZmlybWFjaW9uQ2l0YSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfRE9DVU1FTlRfTlVNQkVSOiBzdHJpbmcgPSAnbnVtZXJvRG9jdW1lbnRvQ29kZXVkb3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPREVCVE9SX0RPQ1VNRU5UX1RZUEU6IHN0cmluZyA9ICd0aXBvRG9jdW1lbnRvQ29kZXVkb3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPREVCVE9SX05BTUU6IHN0cmluZyA9ICdub21icmVzQ29kZXVkb3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPREVCVE9SX0xBU1ROQU1FOiBzdHJpbmcgPSAnYXBlbGxpZG9zQ29kZXVkb3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX1RZUEVfQ09ERUJUT1I6IHN0cmluZyA9ICd0aXBvUGVyc29uYUNvZGV1ZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT0RFQlRPUl9SRVZJRVdFUjogc3RyaW5nID0gJ3Jldmlzb3JDb2RldWRvcmVzJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19UT1RBTF9XRUlHSFRFRDogc3RyaW5nID0gJ3BvbmRlcmFkb1RvdGFsJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT05TRUNVVElWRV9HVUFSQU5URUU6IHN0cmluZyA9ICdjb25zZWN1dGl2b0dhcmFudGlhcyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfREFZOiBzdHJpbmcgPSAnZGlhJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19NT05USDogc3RyaW5nID0gJ21lcyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfWUVBUjogc3RyaW5nID0gJ2Fubyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfUkVQUkVTRU5UQVRJVkVfTkFNRTogc3RyaW5nID0gJ25vbWJyZXNSZXByZXNlbnRhbnRlJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19SRVBSRVNFTlRBVElWRV9MQVNUTkFNRTogc3RyaW5nID0gJ2FwZWxsaWRvc1JlcHJlc2VudGFudGUnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX1JFUFJFU0VOVEFUSVZFX0RPQ1VNRU5UX05VTUJFUjogc3RyaW5nID0gJ2NlZHVsYVJlcHJlc2VudGFudGUnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NJVFlfU0lHTkFUVVJFOiBzdHJpbmcgPSAnY2l1ZGFkRmlybWEnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX1VTRVJfVFlQRV9DUkVESVRfU1RVRFk6IHN0cmluZyA9ICd0aXBvVXN1YXJpb0VzdHVkaW9DcmVkaXRvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT0RFQlRPUl9WRUhJQ0xFU19RVUFOVElUWTogc3RyaW5nID0gJ2NhbnRpZGFkVmVoaWN1bG9zQ29kZXVkb3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPREVCVE9SX0FTU0VUU19RVUFOVElUWTogc3RyaW5nID0gJ2NhbnRpZGFkQmllbmVzQ29kZXVkb3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0xJU1RfQ09ERUJUT1JTOiBzdHJpbmcgPSAnbGlzdGFDb2RldWRvcmVzJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOX0lOR1JFU09fQ09ERVVET1JfSEFCRUFTX0RBVEE6IHN0cmluZyA9ICdpbmdyZXNvQ29kZXVkb3JIYWJlYXNEYXRhJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOX1BERl9SRVNVTUVOX0NPREVVRE9SOiBzdHJpbmcgPSAncGRmUmVzdW1lbkNvZGV1ZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19RVUFOVElUWV9WRUhJQ0xFX0JFTkVGSUNJQVJZOiBzdHJpbmcgPSAnY2FudGlkYWRWZWhpY3Vsb3NTZWxlY2Npb25hZG8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX1FVQU5USVRZX0FTU0VUU19CRU5FRklDSUFSWTogc3RyaW5nID0gJ2NhbnRpZGFkQmllbmVzU2VsZWNjaW9uYWRvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19CRU5fQ09ESUdPOiBzdHJpbmcgPSAnYmVuQ29kaWdvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOX0NSRURJVF9SRVZJRVdFUl9PQlNFUlZBVElPTlNfQ09ERUJUT1I6IHN0cmluZyA9XHJcblx0XHQnY3JlZGl0UmV2aWV3ZXJPYnNlcnZhdGlvbnNDb2RlYnRvcic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTl9DUkVESVRfUkVWSUVXRVJfT0JTRVJWQVRJT05TOiBzdHJpbmcgPSAnY3JlZGl0UmV2aWV3ZXJPYnNlcnZhdGlvbnMnO1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5fVEFHX05BTUU6IHN0cmluZyA9ICd0YWdOYW1lJztcclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOX05BTUVfUkVWSUVXRVJfVEFTSyA9ICduYW1lUmV2aXdlclRhc2snO1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5fTEFTVF9OQU1FX1JFVklFV0VSX1RBU0sgPSAnbGFzdE5hbWVSZXZpd2VyVGFzayc7XHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTl9UQVNLX1RPVEFMX0FTU0lHTkVEX1RPX1JFVklFV0VSID0gJ3Rhc2tUb3RhbEFzc2lnbmVkVG9SZXZpZXdlcic7XHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlM6IGFueVtdID0gW1xyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9QQVRST0NJTkFET1IsXHJcblx0XHRcdGxhYmVsOiAnUGF0cm9jaW5hZG9yJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfUFJPR1JBTUEsXHJcblx0XHRcdGxhYmVsOiAnUHJvZ3JhbWEnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9QUk9NT0NJT04sXHJcblx0XHRcdGxhYmVsOiAnUHJvbW9jacOzbidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX0FOSU9fUFJPTU9DSU9OLFxyXG5cdFx0XHRsYWJlbDogJ0HDsW8gcHJvbW9jacOzbidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX0lTT19NT05FREFfQkFTRSxcclxuXHRcdFx0bGFiZWw6ICdJU08gTW9uZWRhIGJhc2UnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9TQUxVRE9fQ09NUExFTUVOVEFSSU8sXHJcblx0XHRcdGxhYmVsOiAnU2FsdWRvIGNvbXBsZW1lbnRhcmlvJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfQ09ESUdPX1ZFUklGSUNBQ0lPTixcclxuXHRcdFx0bGFiZWw6ICdDw7NkaWdvIGRlIHZlcmlmaWNhY2nDs24nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9BX1FVSUVOX1ZBX0RJUklHSURPLFxyXG5cdFx0XHRsYWJlbDogJ0EgcXVpZW4gdmEgZGlyaWdpZG8nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9GRUNIQV9BQ1RVQUwsXHJcblx0XHRcdGxhYmVsOiAnRmVjaGEgYWN0dWFsJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfU1RBVFVTX05BTUUsXHJcblx0XHRcdGxhYmVsOiAnRXN0YWRvIGFjdHVhbCdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX05VTUJFUl9BUFBMSUNBVElPTixcclxuXHRcdFx0bGFiZWw6ICdOw7ptZXJvIHJhZGljYWRvJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfVVNFUl9JTklUSUFMUyxcclxuXHRcdFx0bGFiZWw6ICdJbmljaWFsZXMgZGUgdXN1YXJpbydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX0xFVFRFUl9TSUdOLFxyXG5cdFx0XHRsYWJlbDogJ0Zpcm1hIGRlIGNhcnRhcydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX05BTUUsXHJcblx0XHRcdGxhYmVsOiAnTm9tYnJlIGNvbWl0w6knXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9TRUdNRU5UQVRJT04sXHJcblx0XHRcdGxhYmVsOiAnU2VnbWVudGFjacOzbiBjb21pdMOpJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT01NSVRURUVfQUdHUlVQQVRJT04sXHJcblx0XHRcdGxhYmVsOiAnQWdydXBhY2nDs24gY29taXTDqSdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX0NVVExJTkVfREFURSxcclxuXHRcdFx0bGFiZWw6ICdGZWNoYSBMw61uZWEgZGUgY29ydGUnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTkZJUk1fTEVHQUxJWkFUSU9OX0FQUE9JTlRNRU5ULFxyXG5cdFx0XHRsYWJlbDogJ0NvbmZpcm1hY2nDs24gZGUgY2l0YSdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfRE9DVU1FTlRfTlVNQkVSLFxyXG5cdFx0XHRsYWJlbDogJ07Dum1lcm8gZGUgZG9jdW1lbnRvIGRlIGNvZGV1ZG9yJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT0RFQlRPUl9ET0NVTUVOVF9UWVBFLFxyXG5cdFx0XHRsYWJlbDogJ1RpcG8gZGUgZG9jdW1lbnRvIGRlIGNvZGV1ZG9yJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT0RFQlRPUl9OQU1FLFxyXG5cdFx0XHRsYWJlbDogJ05vbWJyZXMgY29kZXVkb3InXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPREVCVE9SX0xBU1ROQU1FLFxyXG5cdFx0XHRsYWJlbDogJ0FwZWxsaWRvcyBjb2RldWRvcidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfVFlQRV9DT0RFQlRPUixcclxuXHRcdFx0bGFiZWw6ICdUaXBvIGRlIHBlcnNvbmEgY29kZXVkb3InXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPREVCVE9SX1ZFSElDTEVTX1FVQU5USVRZLFxyXG5cdFx0XHRsYWJlbDogJ0NhbnRpZGFkIHZlaGljdWxvcyBjb2RldWRvcidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfQVNTRVRTX1FVQU5USVRZLFxyXG5cdFx0XHRsYWJlbDogJ0NhbnRpZGFkIGJpZW5lcyBjb2RldWRvcidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfUkVWSUVXRVIsXHJcblx0XHRcdGxhYmVsOiAnUmV2aXNvciBkZSBjb2RldWRvcmVzJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19UT1RBTF9XRUlHSFRFRCxcclxuXHRcdFx0bGFiZWw6ICdQb25kZXJhZG8gdG90YWwnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTlNFQ1VUSVZFX0dVQVJBTlRFRSxcclxuXHRcdFx0bGFiZWw6ICdDb25zZWN1dGl2byBkZSBnYXJhbnRpYXMnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX1JFUFJFU0VOVEFUSVZFX05BTUUsXHJcblx0XHRcdGxhYmVsOiAnTm9tYnJlcyByZXByZXNlbnRhbnRlIGxlZ2FsJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19SRVBSRVNFTlRBVElWRV9MQVNUTkFNRSxcclxuXHRcdFx0bGFiZWw6ICdBcGVsbGlkb3MgcmVwcmVzZW50YW50ZSBsZWdhbCdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfUkVQUkVTRU5UQVRJVkVfRE9DVU1FTlRfTlVNQkVSLFxyXG5cdFx0XHRsYWJlbDogJ0NlZHVsYSByZXByZXNlbnRhbnRlIGxlZ2FsJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19VU0VSX1RZUEVfQ1JFRElUX1NUVURZLFxyXG5cdFx0XHRsYWJlbDogJ1RpcG8gdXN1YXJpbyBlc3R1ZGlvIGNyw6lkaXRvJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19EQVksXHJcblx0XHRcdGxhYmVsOiAnRGlhJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19NT05USCxcclxuXHRcdFx0bGFiZWw6ICdNZXMnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX1lFQVIsXHJcblx0XHRcdGxhYmVsOiAnQcOxbydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ0lUWV9TSUdOQVRVUkUsXHJcblx0XHRcdGxhYmVsOiAnQ2l1ZGFkIGRlIGxhIGZpcm1hJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19MSVNUX0NPREVCVE9SUyxcclxuXHRcdFx0bGFiZWw6ICdMaXN0YSBkZSBjb2RldWRvcmVzJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOX0lOR1JFU09fQ09ERVVET1JfSEFCRUFTX0RBVEEsXHJcblx0XHRcdGxhYmVsOiAnSW5ncmVzbyBDb2RldWRvciBIYWJlYXMgRGF0YSdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTl9QREZfUkVTVU1FTl9DT0RFVURPUixcclxuXHRcdFx0bGFiZWw6ICdQZGYgY29kZXVkb3InXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX1FVQU5USVRZX1ZFSElDTEVfQkVORUZJQ0lBUlksXHJcblx0XHRcdGxhYmVsOiAnQ2FudGlkYWQgZGUgdmVow61jdWxvcyBkZWwgc2VsZWNjaW9uYWRvJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19RVUFOVElUWV9BU1NFVFNfQkVORUZJQ0lBUlksXHJcblx0XHRcdGxhYmVsOiAnQ2FudGlkYWQgYmllbmVzIGRlbCBzZWxlY2Npb25hZG8nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0JFTl9DT0RJR08sXHJcblx0XHRcdGxhYmVsOiAnQ8OzZGlnbyBiZW5lZmljaWFyaW8nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5fQ1JFRElUX1JFVklFV0VSX09CU0VSVkFUSU9OUyxcclxuXHRcdFx0bGFiZWw6ICdPYnNlcnZhY2lvbmVzIHJldmlzb3IgZmluYW5jaWVybyBzZWxlY2Npb25hZG8nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5fQ1JFRElUX1JFVklFV0VSX09CU0VSVkFUSU9OU19DT0RFQlRPUixcclxuXHRcdFx0bGFiZWw6ICdPYnNlcnZhY2lvbmVzIHJldmlzb3IgZmluYW5jaWVybyBjb2RldWRvcmVzJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOX1RBR19OQU1FLFxyXG5cdFx0XHRsYWJlbDogJ05vbWJyZSBkZWwgdGFnJ1xyXG5cdFx0fSxcclxuXHRcdHsga2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOX05BTUVfUkVWSUVXRVJfVEFTSywgbGFiZWw6ICdOb21icmUgcmV2aXNvciB0YXJlYXMnIH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTl9MQVNUX05BTUVfUkVWSUVXRVJfVEFTSyxcclxuXHRcdFx0bGFiZWw6ICdBcGVsbGlkbyByZXZpc29yIHRhcmVhcydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTl9UQVNLX1RPVEFMX0FTU0lHTkVEX1RPX1JFVklFV0VSLFxyXG5cdFx0XHRsYWJlbDogJ1RvdGFsIHRhcmVhcyBhc2lnbmFkYXMgYSByZXZpc29yJ1xyXG5cdFx0fVxyXG5cdF07XHJcblxyXG5cdHN0YXRpYyBleGNsdWRlZFRva2VuID0gW1xyXG5cdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfVVNFUl9UWVBFX0NSRURJVF9TVFVEWS50b0xvd2VyQ2FzZSgpLFxyXG5cdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfVkVISUNMRVNfUVVBTlRJVFkudG9Mb3dlckNhc2UoKSxcclxuXHRcdFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPREVCVE9SX0FTU0VUU19RVUFOVElUWS50b0xvd2VyQ2FzZSgpXHJcblx0XTtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRASW5qZWN0KCdlbnZpcm9ubWVudCcpIHByaXZhdGUgZW52aXJvbm1lbnQsXHJcblx0XHRwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsXHJcblx0XHRwcml2YXRlIGZvcm1TZXJ2aWNlOiBGb3JtU2VydmljZSxcclxuXHRcdHByaXZhdGUgY3VycmVuY3lQaXBlOiBDdXJyZW5jeVBpcGVcclxuXHQpIHt9XHJcblxyXG5cdC8qKiBUaGlzIHByb21pc2UgYWxsb3dzIHRvIGV4ZWN1dGUgYSBmdW5jdGlvbiB3aGVuIGNvbnN1bHRpbmcgdGhlIGZvcm0gZmllbGRzLiAqL1xyXG5cdGdldEZvcm1GaWVsZHNCeVByb21Db2RlKHByb21Db2RpZ28pOiBQcm9taXNlPGFueVtdPiB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cdFx0XHQvLyBTZWFyY2ggdGhlIGR5bmFtaWMgZm9ybVxyXG5cdFx0XHRsZXQgbEZvcm1GaWVsZHNUb2tlbjogYW55W10gPSBudWxsO1xyXG5cdFx0XHR0aGlzLmZvcm1TZXJ2aWNlLmdldEJ5UHJvbUNvZGlnbyhwcm9tQ29kaWdvKS5zdWJzY3JpYmUoe1xyXG5cdFx0XHRcdG5leHQ6IChhcnJheUZvcm1zOiBhbnkpID0+IHtcclxuXHRcdFx0XHRcdGlmIChhcnJheUZvcm1zLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBmb3JtcyBvZiBhcnJheUZvcm1zKSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IGNvbXBvbmVudHMgPSBbXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50cy5wdXNoKC4uLkZvcm1pb1V0aWwuZ2V0Q29tcG9uZW50cyhmb3Jtcy5jb21wb25lbnRzKSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmIChmb3Jtcy5jb21wb25lbnRzICYmIGZvcm1zLmNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjb21wb25lbnRzIG9mIGZvcm1zLmNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudHMuY29tcG9uZW50cyAmJiBjb21wb25lbnRzLmNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudC5jb2x1bW5zICYmIGNvbXBvbmVudC5jb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjQ29tcG9uZW50cyBvZiBjb21wb25lbnQuY29sdW1ucykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNDb21wb25lbnRzLmNvbXBvbmVudHMgJiZcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNDb21wb25lbnRzLmNvbXBvbmVudHMubGVuZ3RoID4gMFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVyYXRvciBvZiBjQ29tcG9uZW50cy5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChpdGVyYXRvci50eXBlID09PSAnYWRkcmVzcycpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWxldGUgaXRlcmF0b3IuY29tcG9uZW50cztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGxldCBmb3JtOiBhbnkgPSBhcnJheUZvcm1zO1xyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHQhZm9ybSB8fFxyXG5cdFx0XHRcdFx0XHQhZm9ybVswXSB8fFxyXG5cdFx0XHRcdFx0XHQhZm9ybVswXS5wcm9tQ29kaWdvIHx8XHJcblx0XHRcdFx0XHRcdGZvcm1bMF0ucHJvbUNvZGlnbyAhPSBwcm9tQ29kaWdvXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0Ly8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWyc0MDQnXSk7XHJcblx0XHRcdFx0XHRcdHJlc29sdmUobEZvcm1GaWVsZHNUb2tlbik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuID0gW107XHJcblx0XHRcdFx0XHRmb3IgKGxldCBmb3JtQ29tcCBvZiBmb3JtKSB7XHJcblx0XHRcdFx0XHRcdGxldCBuZXdDb21wb25lbnRzOiBhbnk7XHJcblx0XHRcdFx0XHRcdGxldCBjb21wb25lbnRzOiBhbnlbXSA9IFtdO1xyXG5cdFx0XHRcdFx0XHRpZiAoZm9ybUNvbXAuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb21wb25lbnRzO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGZvcm1Db21wLmNvbHVtbnMpIHtcclxuXHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29sdW1ucztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAobmV3Q29tcG9uZW50cyAmJiBVdGlsU3RyaW5nLmlzVmFsaWQoZm9ybUNvbXAudGl0bGUpKSB7XHJcblx0XHRcdFx0XHRcdFx0bEZvcm1GaWVsZHNUb2tlbi5wdXNoKHtcclxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLmdldEtleUZvcm11bGFyaW8oZm9ybUNvbXAudGl0bGUpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogZm9ybUNvbXAudGl0bGUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdG9iamVjdDogZm9ybUNvbXBcclxuXHRcdFx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogW11cclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuW2xGb3JtRmllbGRzVG9rZW4ubGVuZ3RoIC0gMV0udmFsdWUgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRDb21wb25lbmV0Rm9ybShcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50cyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bmV3Q29tcG9uZW50cyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bnVsbCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRcdG51bGxcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJlc29sdmUobEZvcm1GaWVsZHNUb2tlbik7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRlcnJvcjogKGVycm9yKSA9PiB7XHJcblx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGdldEZvcm1GaWVsZHNCeUZvcm1JZChmb3JtSWQ6IHN0cmluZyk6IFByb21pc2U8YW55W10+IHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblx0XHRcdC8vIFNlYXJjaCB0aGUgZHluYW1pYyBmb3JtXHJcblx0XHRcdGxldCBsRm9ybUZpZWxkc1Rva2VuOiBhbnlbXSA9IG51bGw7XHJcblx0XHRcdHRoaXMuZm9ybVNlcnZpY2UuZ2V0QnlJZChmb3JtSWQpLnN1YnNjcmliZShcclxuXHRcdFx0XHQocmVzdWx0OiBhbnkpID0+IHtcclxuXHRcdFx0XHRcdGxldCBmb3JtOiBhbnkgPSByZXN1bHQ7XHJcblx0XHRcdFx0XHRpZiAoIWZvcm0gfHwgIWZvcm1bMF0pIHtcclxuXHRcdFx0XHRcdFx0cmVzb2x2ZShsRm9ybUZpZWxkc1Rva2VuKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW4gPSBbXTtcclxuXHRcdFx0XHRcdGZvciAobGV0IGZvcm1Db21wIG9mIGZvcm0pIHtcclxuXHRcdFx0XHRcdFx0bGV0IG5ld0NvbXBvbmVudHM6IGFueTtcclxuXHRcdFx0XHRcdFx0bGV0IGNvbXBvbmVudHM6IGFueVtdID0gW107XHJcblx0XHRcdFx0XHRcdGlmIChmb3JtQ29tcC5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbXBvbmVudHM7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZm9ybUNvbXAuY29sdW1ucykge1xyXG5cdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb2x1bW5zO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmIChuZXdDb21wb25lbnRzICYmIFV0aWxTdHJpbmcuaXNWYWxpZChmb3JtQ29tcC50aXRsZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuZ2V0S2V5Rm9ybXVsYXJpbyhmb3JtQ29tcC50aXRsZSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBmb3JtQ29tcC50aXRsZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0b2JqZWN0OiBmb3JtQ29tcFxyXG5cdFx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBbXVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW5bbEZvcm1GaWVsZHNUb2tlbi5sZW5ndGggLSAxXS52YWx1ZSA9XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldENvbXBvbmVuZXRGb3JtKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wb25lbnRzLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bnVsbFxyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmVzb2x2ZShsRm9ybUZpZWxkc1Rva2VuKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdChlcnJvcikgPT4ge1xyXG5cdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKiBUaGlzIHByb21pc2UgYWxsb3dzIHRvIGV4ZWN1dGUgYSBmdW5jdGlvbiB3aGVuIGNvbnN1bHRpbmcgdGhlIGZvcm0gZmllbGRzLiAqL1xyXG5cdGdldEZvcm1QYW5lbHNCeVByb21Db2RlKHByb21Db2RpZ28pOiBQcm9taXNlPGFueVtdPiB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cdFx0XHQvLyBTZWFyY2ggdGhlIGR5bmFtaWMgZm9ybVxyXG5cdFx0XHRsZXQgbEZvcm1QYW5uZWxzVG9rZW46IGFueVtdID0gbnVsbDtcclxuXHRcdFx0dGhpcy5mb3JtU2VydmljZS5nZXRCeVByb21Db2RpZ28ocHJvbUNvZGlnbykuc3Vic2NyaWJlKFxyXG5cdFx0XHRcdChyZXN1bHQ6IGFueSkgPT4ge1xyXG5cdFx0XHRcdFx0bGV0IGZvcm06IGFueSA9IHJlc3VsdDtcclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0IWZvcm0gfHxcclxuXHRcdFx0XHRcdFx0IWZvcm1bMF0gfHxcclxuXHRcdFx0XHRcdFx0IWZvcm1bMF0ucHJvbUNvZGlnbyB8fFxyXG5cdFx0XHRcdFx0XHRmb3JtWzBdLnByb21Db2RpZ28gIT0gcHJvbUNvZGlnb1xyXG5cdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnNDA0J10pO1xyXG5cdFx0XHRcdFx0XHRyZXNvbHZlKGxGb3JtUGFubmVsc1Rva2VuKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxGb3JtUGFubmVsc1Rva2VuID0gW107XHJcblx0XHRcdFx0XHRmb3IgKGxldCBmb3JtQ29tcCBvZiBmb3JtKSB7XHJcblx0XHRcdFx0XHRcdGxldCBuZXdDb21wb25lbnRzOiBhbnk7XHJcblx0XHRcdFx0XHRcdGxldCBjb21wb25lbnRzOiBhbnlbXSA9IFtdO1xyXG5cdFx0XHRcdFx0XHRpZiAoZm9ybUNvbXAuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb21wb25lbnRzO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGZvcm1Db21wLmNvbHVtbnMpIHtcclxuXHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29sdW1ucztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAobmV3Q29tcG9uZW50cyAmJiBVdGlsU3RyaW5nLmlzVmFsaWQoZm9ybUNvbXAudGl0bGUpKSB7XHJcblx0XHRcdFx0XHRcdFx0bEZvcm1QYW5uZWxzVG9rZW4ucHVzaCh7XHJcblx0XHRcdFx0XHRcdFx0XHR0aXRsZToge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRrZXk6IFRva2VuU2VydmljZS5nZXRLZXlGb3JtdWxhcmlvKGZvcm1Db21wLnRpdGxlKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IGZvcm1Db21wLnRpdGxlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRvYmplY3Q6IGZvcm1Db21wXHJcblx0XHRcdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6IFtdXHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0bEZvcm1QYW5uZWxzVG9rZW5bbEZvcm1QYW5uZWxzVG9rZW4ubGVuZ3RoIC0gMV0udmFsdWUgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRQYW5lbENvbXBvbmVuZXQoY29tcG9uZW50cywgbmV3Q29tcG9uZW50cywgbnVsbCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJlc29sdmUobEZvcm1QYW5uZWxzVG9rZW4pO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0KGVycm9yKSA9PiB7XHJcblx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSByZWN1cnNpdmUgbWV0aG9kIHRvIGdldCBhbGwgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBlZGl0R3JpZCBkeW5hbWljIGZvcm1cclxuXHQgKiBAcGFyYW0gY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSBmb3JtXHJcblx0ICovXHJcblx0Z2V0UGFuZWxDb21wb25lbmV0KGNvbXBvbmVudHM6IGFueVtdLCBmb3JtOiBhbnksIHBhbmVsTmFtZTogc3RyaW5nKTogYW55W10ge1xyXG5cdFx0Zm9yIChsZXQgZm9ybUNvbXAgb2YgZm9ybSkge1xyXG5cdFx0XHRpZiAoZm9ybUNvbXAudHlwZSA9PT0gJ3BhbmVsJykge1xyXG5cdFx0XHRcdGNvbXBvbmVudHMucHVzaChmb3JtQ29tcCk7XHJcblx0XHRcdH0gZWxzZSBpZiAoZm9ybUNvbXAuY29tcG9uZW50cyB8fCBmb3JtQ29tcC5jb2x1bW5zKSB7XHJcblx0XHRcdFx0bGV0IG5ld0NvbXBvbmVudHM6IGFueTtcclxuXHRcdFx0XHRpZiAoZm9ybUNvbXAuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbXBvbmVudHM7XHJcblx0XHRcdFx0fSBlbHNlIGlmIChmb3JtQ29tcC5jb2x1bW5zKSB7XHJcblx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29sdW1ucztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29tcG9uZW50cyA9IHRoaXMuZ2V0UGFuZWxDb21wb25lbmV0KGNvbXBvbmVudHMsIG5ld0NvbXBvbmVudHMsIHBhbmVsTmFtZSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBjb21wb25lbnRzO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSByZWN1cnNpdmUgbWV0aG9kIHRvIGdldCBhbGwgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBjb21wb25lbnRzIGEgY29sdW1ucyBvZiB0aGUgZHluYW1pYyBmb3JtXHJcblx0ICogQHBhcmFtIGNvbXBvbmVudHNcclxuXHQgKiBAcGFyYW0gZm9ybVxyXG5cdCAqL1xyXG5cdGdldENvbXBvbmVuZXRGb3JtKFxyXG5cdFx0Y29tcG9uZW50czogYW55W10sXHJcblx0XHRmb3JtOiBhbnksXHJcblx0XHRwYW5lbE5hbWU6IHN0cmluZyxcclxuXHRcdGVkaXRncmlkOiBib29sZWFuLFxyXG5cdFx0ZWRpdEdyaWRLZXk6IHN0cmluZ1xyXG5cdCk6IGFueVtdIHtcclxuXHRcdGZvciAobGV0IGZvcm1Db21wIG9mIGZvcm0pIHtcclxuXHRcdFx0Ly9NTy0gIG1hbnRpcyA4NzQzIGZpeCBhZGRyZXNzIHRva2VuXHJcblx0XHRcdGlmICgoZm9ybUNvbXAuY29tcG9uZW50cyB8fCBmb3JtQ29tcC5jb2x1bW5zKSAmJiBmb3JtQ29tcC50eXBlICE9PSAnYWRkcmVzcycpIHtcclxuXHRcdFx0XHRsZXQgbmV3Q29tcG9uZW50czogYW55O1xyXG5cdFx0XHRcdGlmIChmb3JtQ29tcC5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29tcG9uZW50cztcclxuXHRcdFx0XHRcdGlmIChmb3JtQ29tcC50eXBlID09PSAnZWRpdGdyaWQnKSB7XHJcblx0XHRcdFx0XHRcdGVkaXRncmlkID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0ZWRpdEdyaWRLZXkgPSBmb3JtQ29tcC5rZXk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIGlmIChmb3JtQ29tcC5jb2x1bW5zKSB7XHJcblx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29sdW1ucztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGZvcm1Db21wLnR5cGUgJiYgZm9ybUNvbXAudHlwZSA9PT0gJ3BhbmVsJykge1xyXG5cdFx0XHRcdFx0cGFuZWxOYW1lID0gZm9ybUNvbXAudGl0bGU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbXBvbmVudHMgPSB0aGlzLmdldENvbXBvbmVuZXRGb3JtKFxyXG5cdFx0XHRcdFx0Y29tcG9uZW50cyxcclxuXHRcdFx0XHRcdG5ld0NvbXBvbmVudHMsXHJcblx0XHRcdFx0XHRwYW5lbE5hbWUsXHJcblx0XHRcdFx0XHRlZGl0Z3JpZCxcclxuXHRcdFx0XHRcdGVkaXRHcmlkS2V5XHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRmb3JtQ29tcC5wYW5lbE5hbWUgPSBwYW5lbE5hbWU7XHJcblx0XHRcdFx0Zm9ybUNvbXAuZWRpdGdyaWQgPSBlZGl0Z3JpZDtcclxuXHRcdFx0XHRmb3JtQ29tcC5lZGl0R3JpZEtleSA9IGVkaXRHcmlkS2V5O1xyXG5cdFx0XHRcdGNvbXBvbmVudHMucHVzaChmb3JtQ29tcCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBjb21wb25lbnRzO1xyXG5cdH1cclxuXHJcblx0LyoqIFRoaXMgcHJvbWlzZSBhbGxvd3MgdG8gZXhlY3V0ZSBhIGZ1bmN0aW9uIHdoZW4gY29uc3VsdGluZyB0aGUgZm9ybSBmaWVsZHMuICovXHJcblx0Z2V0Rm9ybUVkaXRHcmlkRmllbGRzQnlQcm9tQ29kZShwcm9tQ29kaWdvKTogUHJvbWlzZTxhbnlbXT4ge1xyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHRcdFx0Ly8gU2VhcmNoIHRoZSBkeW5hbWljIGZvcm1cclxuXHRcdFx0bGV0IGxGb3JtRmllbGRzVG9rZW46IGFueVtdID0gbnVsbDtcclxuXHRcdFx0dGhpcy5mb3JtU2VydmljZS5nZXRCeVByb21Db2RpZ28ocHJvbUNvZGlnbykuc3Vic2NyaWJlKFxyXG5cdFx0XHRcdChyZXN1bHQ6IGFueSkgPT4ge1xyXG5cdFx0XHRcdFx0bGV0IGZvcm06IGFueSA9IHJlc3VsdDtcclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0IWZvcm0gfHxcclxuXHRcdFx0XHRcdFx0IWZvcm1bMF0gfHxcclxuXHRcdFx0XHRcdFx0IWZvcm1bMF0ucHJvbUNvZGlnbyB8fFxyXG5cdFx0XHRcdFx0XHRmb3JtWzBdLnByb21Db2RpZ28gIT0gcHJvbUNvZGlnb1xyXG5cdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnNDA0J10pO1xyXG5cdFx0XHRcdFx0XHRyZXNvbHZlKGxGb3JtRmllbGRzVG9rZW4pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0bEZvcm1GaWVsZHNUb2tlbiA9IFtdO1xyXG5cdFx0XHRcdFx0Zm9yIChsZXQgZm9ybUNvbXAgb2YgZm9ybSkge1xyXG5cdFx0XHRcdFx0XHRsZXQgbmV3Q29tcG9uZW50czogYW55O1xyXG5cdFx0XHRcdFx0XHRsZXQgY29tcG9uZW50czogYW55W10gPSBbXTtcclxuXHRcdFx0XHRcdFx0aWYgKGZvcm1Db21wLmNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29tcG9uZW50cztcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChmb3JtQ29tcC5jb2x1bW5zKSB7XHJcblx0XHRcdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbHVtbnM7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKG5ld0NvbXBvbmVudHMgJiYgVXRpbFN0cmluZy5pc1ZhbGlkKGZvcm1Db21wLnRpdGxlKSkge1xyXG5cdFx0XHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW4ucHVzaCh7XHJcblx0XHRcdFx0XHRcdFx0XHR0aXRsZToge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRrZXk6IFRva2VuU2VydmljZS5nZXRLZXlGb3JtdWxhcmlvKGZvcm1Db21wLnRpdGxlKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IGZvcm1Db21wLnRpdGxlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRvYmplY3Q6IGZvcm1Db21wXHJcblx0XHRcdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6IFtdXHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0bEZvcm1GaWVsZHNUb2tlbltsRm9ybUZpZWxkc1Rva2VuLmxlbmd0aCAtIDFdLnZhbHVlID1cclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZ2V0RWRpdEdyaWRDb21wb25lbmV0KGNvbXBvbmVudHMsIG5ld0NvbXBvbmVudHMsIG51bGwpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXNvbHZlKGxGb3JtRmllbGRzVG9rZW4pO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0KGVycm9yKSA9PiB7XHJcblx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSByZWN1cnNpdmUgbWV0aG9kIHRvIGdldCBhbGwgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBlZGl0R3JpZCBkeW5hbWljIGZvcm1cclxuXHQgKiBAcGFyYW0gY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSBmb3JtXHJcblx0ICovXHJcblx0Z2V0RWRpdEdyaWRDb21wb25lbmV0KGNvbXBvbmVudHM6IGFueVtdLCBmb3JtOiBhbnksIHBhbmVsTmFtZTogc3RyaW5nKTogYW55W10ge1xyXG5cdFx0Zm9yIChsZXQgZm9ybUNvbXAgb2YgZm9ybSkge1xyXG5cdFx0XHRpZiAoZm9ybUNvbXAudHlwZSA9PT0gJ2VkaXRncmlkJykge1xyXG5cdFx0XHRcdGZvcm1Db21wLnBhbmVsTmFtZSA9IHBhbmVsTmFtZTtcclxuXHRcdFx0XHRjb21wb25lbnRzLnB1c2goZm9ybUNvbXApO1xyXG5cdFx0XHR9IGVsc2UgaWYgKGZvcm1Db21wLmNvbXBvbmVudHMgfHwgZm9ybUNvbXAuY29sdW1ucykge1xyXG5cdFx0XHRcdGxldCBuZXdDb21wb25lbnRzOiBhbnk7XHJcblx0XHRcdFx0aWYgKGZvcm1Db21wLmNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb21wb25lbnRzO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAoZm9ybUNvbXAuY29sdW1ucykge1xyXG5cdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbHVtbnM7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChmb3JtQ29tcC50eXBlICYmIGZvcm1Db21wLnR5cGUgPT09ICdwYW5lbCcpIHtcclxuXHRcdFx0XHRcdHBhbmVsTmFtZSA9IGZvcm1Db21wLnRpdGxlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjb21wb25lbnRzID0gdGhpcy5nZXRFZGl0R3JpZENvbXBvbmVuZXQoY29tcG9uZW50cywgbmV3Q29tcG9uZW50cywgcGFuZWxOYW1lKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGNvbXBvbmVudHM7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgcmV0dXJucyB0aGUgdG9rZW5zIGJ5IHByb21Db2RpZ28gKi9cclxuXHRnZXRMaXN0QnlQcm9tQ29kaWdvKHByb21Db2RlOiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoXHJcblx0XHRcdHRoaXMuZW52aXJvbm1lbnQuaG9zdC5iYWNrZW5kLmNvbmZpZ3VyYXRpb24gKyAndG9rZW4vZ2V0QnlQcm9tQ29kaWdvJyxcclxuXHRcdFx0eyBwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuc2V0KCdwcm9tQ29kaWdvJywgcHJvbUNvZGUudG9TdHJpbmcoKSkgfVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKiBJdCByZXR1cm5zIHRoZSB0b2tlbiBieSBpZCAqL1xyXG5cdGdldEJ5SWQoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldCh0aGlzLmVudmlyb25tZW50Lmhvc3QuYmFja2VuZC5jb25maWd1cmF0aW9uICsgJ3Rva2VuL2dldEJ5SWQnLCB7XHJcblx0XHRcdHBhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoJ2lkJywgaWQudG9TdHJpbmcoKSlcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqIEl0IGRlbGV0ZXMgYSBmb3JtIGJ5IGlkICovXHJcblx0ZGVsZXRlKGlkKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdHJldHVybiB0aGlzLmh0dHBDbGllbnQuZGVsZXRlKFxyXG5cdFx0XHR0aGlzLmVudmlyb25tZW50Lmhvc3QuYmFja2VuZC5jb25maWd1cmF0aW9uICsgJ3Rva2VuL2RlbGV0ZScsXHJcblx0XHRcdHsgcGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldCgnaWQnLCBpZCkgfVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKiBJdCBzYXZlcyB0aGUgdG9rZW4gKi9cclxuXHRzYXZlKHRva2VuOiBUb2tlbik6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3QoXHJcblx0XHRcdHRoaXMuZW52aXJvbm1lbnQuaG9zdC5iYWNrZW5kLmNvbmZpZ3VyYXRpb24gKyAndG9rZW4vc2F2ZScsXHJcblx0XHRcdHRva2VuLFxyXG5cdFx0XHRIRUFERVJfSlNPTlxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRLZXlGb3JtdWxhcmlvKGZvcm1UaXRsZTogc3RyaW5nKTogc3RyaW5nIHtcclxuXHRcdGlmIChVdGlsU3RyaW5nLmlzVmFsaWQoZm9ybVRpdGxlKSkge1xyXG5cdFx0XHRyZXR1cm4gKFxyXG5cdFx0XHRcdFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfRk9STSkgK1xyXG5cdFx0XHRcdFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhmb3JtVGl0bGUpLnJlcGxhY2UoL18vZywgJy0nKVxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuICcnO1xyXG5cdH1cclxuXHJcblx0LyoqIEl0IHJldHVybnMgdGhlIHVuaXF1ZSB2ZXJpZmljYXRpb24gY29kZSAqL1xyXG5cdGdldFVuaXF1ZVZlcmlmaWNhdGlvbkNvZGUobG9naW46IHN0cmluZywgdG9rZW46IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChcclxuXHRcdFx0dGhpcy5lbnZpcm9ubWVudC5ob3N0LmJhY2tlbmQuZG9jdW1lbnRzUmVwb3NpdG9yeSArXHJcblx0XHRcdFx0J2RvY3VtZW50by9jb25zdWx0YXJDb2RpZ29Vbmljby8nICtcclxuXHRcdFx0XHRsb2dpbiArXHJcblx0XHRcdFx0Jy8nICtcclxuXHRcdFx0XHR0b2tlbixcclxuXHRcdFx0eyBwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkgfVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKiBJdCBzZW5kIHRoZSBpbmZvcm1hdGlvbiB0byBjb3B5IHRoZSBEb2N1bWVudCB2aWV3ZXIgKi9cclxuXHRjb3B5RG9jdW1lbnRJbmZvcm1hdGlvblZpZXdlcihcclxuXHRcdGxvZ2luOiBzdHJpbmcsXHJcblx0XHR0b2tlbjogc3RyaW5nLFxyXG5cdFx0dW5pcXVlQ29kZTogc3RyaW5nLFxyXG5cdFx0ZG9jdW1lbnRVUkw6IHN0cmluZyxcclxuXHRcdGRvY3VtZW50TmFtZTogc3RyaW5nXHJcblx0KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdGxldCBpbmZvRG9jdW1lbnRvID0ge1xyXG5cdFx0XHRjb2RpZ29VbmljbzogdW5pcXVlQ29kZSxcclxuXHRcdFx0cnV0YURvY3VtZW50bzogZG9jdW1lbnRVUkwsXHJcblx0XHRcdGRvY3VtZW50TmFtZTogZG9jdW1lbnROYW1lXHJcblx0XHR9O1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0KFxyXG5cdFx0XHR0aGlzLmVudmlyb25tZW50Lmhvc3QuYmFja2VuZC5kb2N1bWVudHNSZXBvc2l0b3J5ICtcclxuXHRcdFx0XHQnZG9jdW1lbnRvL2FkaWNpb25hckRvY3VtZW50by8nICtcclxuXHRcdFx0XHRsb2dpbiArXHJcblx0XHRcdFx0Jy8nICtcclxuXHRcdFx0XHR0b2tlbixcclxuXHRcdFx0aW5mb0RvY3VtZW50byxcclxuXHRcdFx0SEVBREVSX0pTT05cclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0S2V5QnVkZ2V0KCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gVXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9CVURHRVQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEtleURvY3VtZW50KCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gVXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9ET0NVTUVOVE8pO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEtleURvY3VtZW50QW5hbHlzaXMoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0RPQ1VNRU5UT19BTkFMWVNJU19UWVBFKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRLZXlUYXNrKCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gVXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9UQVNLTCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0S2V5U3RhdGljKCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gVXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9TVEFUSUMpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEtleUNhbGN1bGF0ZWQodG9rZW46IFRva2VuKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQ0FMQ1VMQVRFRCkgK1xyXG5cdFx0XHQnXycgK1xyXG5cdFx0XHRVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnModG9rZW4ubmFtZSlcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0S2V5U25hcHNob3QodG9rZW46IFRva2VuKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfU05BUFNIT1QpICtcclxuXHRcdFx0J18nICtcclxuXHRcdFx0VXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKHRva2VuLm5hbWUpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEtleUd1YXJhbnRlZSh0b2tlbjogUGxpQ25mR3VhcmFudGVlVG9rZW4pOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIChcclxuXHRcdFx0VXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9HVUFSQU5URUUpICtcclxuXHRcdFx0J18nICtcclxuXHRcdFx0VXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKHRva2VuLm5hbWUpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJuIGEgdmFsdWUgdGhhdCByZXByZXNlbnQgdGhlIHR5cGUgb2YgbGFiZWw6IDE9Rm9ybSwgMj1CdWRnZXQsIDM9U3RhdGljLCA0PUNhbGN1bGF0ZWRcclxuXHQgKiBAcGFyYW0ga2V5IFZhbHVlIHRvIGV2YWx1ZWF0ZVxyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRLZXlUeXBlKGtleTogc3RyaW5nKTogbnVtYmVyIHtcclxuXHRcdGtleSA9IGtleS5yZXBsYWNlKCd7JywgJycpLnJlcGxhY2UoJ30nLCAnJyk7XHJcblx0XHRrZXkgPSBrZXkuc3Vic3RyaW5nKDEsIGtleS5pbmRleE9mKCdfJykpO1xyXG5cdFx0aWYgKGtleS5zdGFydHNXaXRoKFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfRk9STSkpKSB7XHJcblx0XHRcdHJldHVybiAxO1xyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoVXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9CVURHRVQpKVxyXG5cdFx0KSB7XHJcblx0XHRcdHJldHVybiAyO1xyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoVXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9TVEFUSUMpKVxyXG5cdFx0KSB7XHJcblx0XHRcdHJldHVybiAzO1xyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoXHJcblx0XHRcdFx0VXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9DQUxDVUxBVEVEKVxyXG5cdFx0XHQpXHJcblx0XHQpIHtcclxuXHRcdFx0cmV0dXJuIDQ7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRrZXkuc3RhcnRzV2l0aChVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1RBU0tMKSlcclxuXHRcdCkge1xyXG5cdFx0XHRyZXR1cm4gNTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdGtleS5zdGFydHNXaXRoKFxyXG5cdFx0XHRcdFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fRE9DVU1FTlRPX0FOQUxZU0lTX1RZUEUpXHJcblx0XHRcdClcclxuXHRcdCkge1xyXG5cdFx0XHRyZXR1cm4gNjtcclxuXHRcdH1cclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVwZW5kcyBvZiB0aGUgdHlwZSBvZiBmb3JtRmllbGRUb2tlbiByZXR1cm4gZGUgdmFsdWUgb2YgdGhlIHZhbHVlRGF0YVxyXG5cdCAqIEBwYXJhbSBmb3JtRmllbGRUb2tlblxyXG5cdCAqIEBwYXJhbSB2YWx1ZURhdGFcclxuXHQgKi9cclxuXHRnZXRWYWx1ZUZyb21Gb3JtRmllbGQoZm9ybUZpZWxkVG9rZW46IGFueSwgdmFsdWVEYXRhOiBhbnkpOiBhbnkge1xyXG5cdFx0aWYgKHR5cGVvZiB2YWx1ZURhdGEgPT0gJ29iamVjdCcpIHtcclxuXHRcdFx0aWYgKGZvcm1GaWVsZFRva2VuLnR5cGUpIHtcclxuXHRcdFx0XHRpZiAoZm9ybUZpZWxkVG9rZW4udHlwZSA9PSAnYWRkcmVzcycpIHtcclxuXHRcdFx0XHRcdHJldHVybiB2YWx1ZURhdGEuZm9ybWF0dGVkX2FkZHJlc3M7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdGZvcm1GaWVsZFRva2VuLnR5cGUgPT0gJ3NlbGVjdCcgJiZcclxuXHRcdFx0XHRcdHZhbHVlRGF0YS5oYXNPd25Qcm9wZXJ0eShmb3JtRmllbGRUb2tlbi5zZWFyY2hGaWVsZClcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdGlmICh2YWx1ZURhdGEuaGFzT3duUHJvcGVydHkoJ29yaWdpbmFsX25hbWUnKSAhPT0gJycpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlRGF0YS5vcmlnaW5hbF9uYW1lO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICh2YWx1ZURhdGEuaGFzT3duUHJvcGVydHkoJ25hdGl2ZU5hbWUnKSAhPT0gJycpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlRGF0YS5uYXRpdmVOYW1lO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChmb3JtRmllbGRUb2tlbi5zZWFyY2hGaWVsZCkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWVEYXRhW2Zvcm1GaWVsZFRva2VuLnNlYXJjaEZpZWxkXTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiB2YWx1ZURhdGE7XHJcblx0fVxyXG5cdGZvcm1hdERhdGUodmFsdWU6IERhdGUsIGxvY2FsZTogc3RyaW5nKTogc3RyaW5nIHtcclxuXHRcdGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcblxyXG5cdFx0Y29uc3QgbW9udGhzID0ge1xyXG5cdFx0XHRlczogW1xyXG5cdFx0XHRcdCdlbmVybycsXHJcblx0XHRcdFx0J2ZlYnJlcm8nLFxyXG5cdFx0XHRcdCdtYXJ6bycsXHJcblx0XHRcdFx0J2FicmlsJyxcclxuXHRcdFx0XHQnbWF5bycsXHJcblx0XHRcdFx0J2p1bmlvJyxcclxuXHRcdFx0XHQnanVsaW8nLFxyXG5cdFx0XHRcdCdhZ29zdG8nLFxyXG5cdFx0XHRcdCdzZXB0aWVtYnJlJyxcclxuXHRcdFx0XHQnb2N0dWJyZScsXHJcblx0XHRcdFx0J25vdmllbWJyZScsXHJcblx0XHRcdFx0J2RpY2llbWJyZSdcclxuXHRcdFx0XSxcclxuXHRcdFx0ZW46IFtcclxuXHRcdFx0XHQnSmFudWFyeScsXHJcblx0XHRcdFx0J0ZlYnJ1YXJ5JyxcclxuXHRcdFx0XHQnTWFyY2gnLFxyXG5cdFx0XHRcdCdBcHJpbCcsXHJcblx0XHRcdFx0J01heScsXHJcblx0XHRcdFx0J0p1bmUnLFxyXG5cdFx0XHRcdCdKdWx5JyxcclxuXHRcdFx0XHQnQXVndXN0JyxcclxuXHRcdFx0XHQnU2VwdGVtYmVyJyxcclxuXHRcdFx0XHQnT2N0b2JlcicsXHJcblx0XHRcdFx0J05vdmVtYmVyJyxcclxuXHRcdFx0XHQnRGVjZW1iZXInXHJcblx0XHRcdF0sXHJcblx0XHRcdGZyOiBbXHJcblx0XHRcdFx0J2phbnZpZXInLFxyXG5cdFx0XHRcdCdmw6l2cmllcicsXHJcblx0XHRcdFx0J21hcnMnLFxyXG5cdFx0XHRcdCdhdnJpbCcsXHJcblx0XHRcdFx0J21haScsXHJcblx0XHRcdFx0J2p1aW4nLFxyXG5cdFx0XHRcdCdqdWlsbGV0JyxcclxuXHRcdFx0XHQnYW/Du3QnLFxyXG5cdFx0XHRcdCdzZXB0ZW1icmUnLFxyXG5cdFx0XHRcdCdvY3RvYnJlJyxcclxuXHRcdFx0XHQnbm92ZW1icmUnLFxyXG5cdFx0XHRcdCdkw6ljZW1icmUnXHJcblx0XHRcdF0sXHJcblx0XHRcdGRlOiBbXHJcblx0XHRcdFx0J0phbnVhcicsXHJcblx0XHRcdFx0J0ZlYnJ1YXInLFxyXG5cdFx0XHRcdCdNw6RyeicsXHJcblx0XHRcdFx0J0FwcmlsJyxcclxuXHRcdFx0XHQnTWFpJyxcclxuXHRcdFx0XHQnSnVuaScsXHJcblx0XHRcdFx0J0p1bGknLFxyXG5cdFx0XHRcdCdBdWd1c3QnLFxyXG5cdFx0XHRcdCdTZXB0ZW1iZXInLFxyXG5cdFx0XHRcdCdPa3RvYmVyJyxcclxuXHRcdFx0XHQnTm92ZW1iZXInLFxyXG5cdFx0XHRcdCdEZXplbWJlcidcclxuXHRcdFx0XSxcclxuXHRcdFx0aXQ6IFtcclxuXHRcdFx0XHQnZ2VubmFpbycsXHJcblx0XHRcdFx0J2ZlYmJyYWlvJyxcclxuXHRcdFx0XHQnbWFyem8nLFxyXG5cdFx0XHRcdCdhcHJpbGUnLFxyXG5cdFx0XHRcdCdtYWdnaW8nLFxyXG5cdFx0XHRcdCdnaXVnbm8nLFxyXG5cdFx0XHRcdCdsdWdsaW8nLFxyXG5cdFx0XHRcdCdhZ29zdG8nLFxyXG5cdFx0XHRcdCdzZXR0ZW1icmUnLFxyXG5cdFx0XHRcdCdvdHRvYnJlJyxcclxuXHRcdFx0XHQnbm92ZW1icmUnLFxyXG5cdFx0XHRcdCdkaWNlbWJyZSdcclxuXHRcdFx0XVxyXG5cdFx0fTtcclxuXHJcblx0XHRjb25zdCBsb2NhbGVNb250aHMgPSBtb250aHNbbG9jYWxlXTtcclxuXHJcblx0XHRjb25zdCBtb250aCA9IGxvY2FsZU1vbnRoc1tkYXRlLmdldE1vbnRoKCldO1xyXG5cdFx0Y29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuXHJcblx0XHRyZXR1cm4gYCR7bW9udGh9ICR7eWVhcn1gO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBUcnkgdG8gZmluZCB0aGUgdG9rZW4gaW4gdGhlIHN0cmluZ1RleHQgYW5kIHJlcGxhY2Ugd2l0aCBkYXRhVmFsdWUuIElmIGRldGVjdCBmb3JtYXQgb2YgbnVtYmVyIG9yIGRhdGUgdHJ5IHRvIGZvcm1hdCB0aGUgZGF0YVZhbHVlXHJcblx0ICogQHBhcmFtIHN0cmluZ1RleHRcclxuXHQgKiBAcGFyYW0gdG9rZW5cclxuXHQgKiBAcGFyYW0gZGF0YVZhbHVlXHJcblx0ICovXHJcblx0cmVwbGFjZVRva2VuKHN0cmluZ1RleHQ6IHN0cmluZywgdG9rZW46IGFueSwgZGF0YVZhbHVlOiBhbnksIGxvY2FsZT86IHN0cmluZyk6IHN0cmluZyB7XHJcblx0XHRsZXQgdmFsdWVSZXBsYWNlOiBzdHJpbmcgPSBudWxsO1xyXG5cdFx0aWYgKHRva2VuICYmIHRva2VuWzBdID09ICcjJykge1xyXG5cdFx0XHRsZXQgdHlwZVRva2VuID0gdG9rZW4uc3Vic3RyaW5nKDEsIHRva2VuLmluZGV4T2YoJygnKSk7XHJcblx0XHRcdGlmICh0eXBlVG9rZW4gPT0gJ2RhdGUnKSB7XHJcblx0XHRcdFx0bGV0IGRhdGVGb3JtYXQ6IHN0cmluZyA9IHRva2VuLnN1YnN0cmluZyhcclxuXHRcdFx0XHRcdHRva2VuLmluZGV4T2YoJ30nKSArIDEsXHJcblx0XHRcdFx0XHR0b2tlbi5pbmRleE9mKCcpJylcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHRcdGRhdGVGb3JtYXQgPSBkYXRlRm9ybWF0LnRyaW0oKS5yZXBsYWNlKC9cXFwiL2csICcnKS5yZXBsYWNlKC9cXCcvZywgJycpO1xyXG5cdFx0XHRcdGxldCBkYXRlVmFsdWUgPSBEYXRlVXRpbC5nZXREYXRlKGRhdGFWYWx1ZSk7XHJcblx0XHRcdFx0aWYgKGxvY2FsZSAhPSBudWxsICYmIGxvY2FsZSkge1xyXG5cdFx0XHRcdFx0dmFsdWVSZXBsYWNlID0gdGhpcy5mb3JtYXREYXRlKGRhdGVWYWx1ZSwgbG9jYWxlKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKGRhdGVWYWx1ZSkge1xyXG5cdFx0XHRcdFx0dmFsdWVSZXBsYWNlID0gRGF0ZVV0aWwuZ2V0TW9tZW50KGRhdGVWYWx1ZSkuZm9ybWF0KGRhdGVGb3JtYXQpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR2YWx1ZVJlcGxhY2UgPSAnJztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSBpZiAodHlwZVRva2VuID09ICdudW1iZXInKSB7XHJcblx0XHRcdFx0bGV0IG51bWJlclZhbHVlOiBudW1iZXIgPSBOdW1iZXIoZGF0YVZhbHVlKTtcclxuXHRcdFx0XHRpZiAobnVtYmVyVmFsdWUgIT0gdW5kZWZpbmVkICYmICFpc05hTihudW1iZXJWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdGxldCBudW1iZXJGb3JtYXQ6IHN0cmluZyA9IHRva2VuLnN1YnN0cmluZyhcclxuXHRcdFx0XHRcdFx0dG9rZW4uaW5kZXhPZignfScpICsgMSxcclxuXHRcdFx0XHRcdFx0dG9rZW4uaW5kZXhPZignKScpXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0bnVtYmVyRm9ybWF0ID0gbnVtYmVyRm9ybWF0LnRyaW0oKS5yZXBsYWNlKC9cXFwiL2csICcnKS5yZXBsYWNlKC9cXCcvZywgJycpO1xyXG5cdFx0XHRcdFx0dmFsdWVSZXBsYWNlID0gdGhpcy5jdXJyZW5jeVBpcGUudHJhbnNmb3JtKFxyXG5cdFx0XHRcdFx0XHRudW1iZXJWYWx1ZSxcclxuXHRcdFx0XHRcdFx0dGhpcy5sb2NhbGUsXHJcblx0XHRcdFx0XHRcdCcnLFxyXG5cdFx0XHRcdFx0XHRudW1iZXJGb3JtYXRcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKFxyXG5cdFx0XHRcdFx0XHQnRWwgZGF0byBbJyArXHJcblx0XHRcdFx0XHRcdFx0ZGF0YVZhbHVlICtcclxuXHRcdFx0XHRcdFx0XHQnXSBwYXJhIGVsIHRva2VuIFsnICtcclxuXHRcdFx0XHRcdFx0XHR0b2tlbiArXHJcblx0XHRcdFx0XHRcdFx0J10gdGlwbyBuw7ptZXJpY28gbm8gZXMgdmFsaWRvJ1xyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdHZhbHVlUmVwbGFjZSA9ICcnO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRjb25zb2xlLmxvZygndGlwbyBkZSB0b2tlbiBpbmRlZmluaWRvLiBbdHlwZVRva2VuWycgKyB0eXBlVG9rZW4gKyAnXV0nKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmICh0b2tlbiAmJiB0b2tlblswXSA9PSAnJCcpIHtcclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdGRhdGFWYWx1ZSAhPT0gbnVsbCAmJlxyXG5cdFx0XHRcdGRhdGFWYWx1ZSAhPT0gdW5kZWZpbmVkICYmXHJcblx0XHRcdFx0ZGF0YVZhbHVlLm9yaWdpbmFsX25hbWUgIT09IHVuZGVmaW5lZCAmJlxyXG5cdFx0XHRcdGRhdGFWYWx1ZS5vcmlnaW5hbF9uYW1lICE9PSBudWxsXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdHZhbHVlUmVwbGFjZSA9IGRhdGFWYWx1ZS5vcmlnaW5hbF9uYW1lO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHZhbHVlUmVwbGFjZSA9IGRhdGFWYWx1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyB2YWx1ZVJlcGxhY2UgPSBkYXRhVmFsdWU7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjb25zb2xlLmxvZygnRWwgdG9rZW4gbm8gZXMgdmFsaWRvLiBbdG9rZW5bJyArIHRva2VuICsgJ11dJyk7XHJcblx0XHR9XHJcblx0XHRpZiAoc3RyaW5nVGV4dCAmJiB2YWx1ZVJlcGxhY2UgIT09IG51bGwpIHtcclxuXHRcdFx0Ly8gcmVwbGFjZSB0ZXh0IGluIGEgbW9yZSBlZmZpY2llbnQgd2F5XHJcblx0XHRcdHN0cmluZ1RleHQgPSBzdHJpbmdUZXh0LnNwbGl0KHRva2VuKS5qb2luKHZhbHVlUmVwbGFjZSk7XHJcblx0XHRcdC8vc3RyaW5nVGV4dCA9IHN0cmluZ1RleHQucmVwbGFjZSh0b2tlbiwgdmFsdWVSZXBsYWNlKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBzdHJpbmdUZXh0O1xyXG5cdH1cclxuXHJcblx0Z2V0TGlzdFRva2Vuc0J5U3RyaW5nU2VnbWVudGF0aW9uKHN0cmluZ1RleHQ6IHN0cmluZyk6IGFueVtdIHtcclxuXHRcdGNvbnN0IGFycmF5VG9rZW4gPSBzdHJpbmdUZXh0Lm1hdGNoKC9cXCR7KFtefV0rKVxcfS9nKTtcclxuXHRcdGNvbnN0IGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlID0gc3RyaW5nVGV4dC5tYXRjaCgvXFwjZGF0ZVteKV0rXFwpL2cpO1xyXG5cdFx0Y29uc3QgYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlciA9IHN0cmluZ1RleHQubWF0Y2goL1xcI251bWJlclteKV0rXFwpL2cpO1xyXG5cdFx0bGV0IGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBbXTtcclxuXHRcdGlmIChcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZERhdGUgJiZcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZERhdGUubGVuZ3RoID4gMCAmJlxyXG5cdFx0XHRhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyICYmXHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIubGVuZ3RoID4gMFxyXG5cdFx0KSB7XHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBhcnJheVRva2VuRm9ybWF0dGVkRGF0ZS5jb25jYXQoYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlcik7XHJcblx0XHR9IGVsc2UgaWYgKGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlICYmIGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZCA9IGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlLnNsaWNlKCk7XHJcblx0XHR9IGVsc2UgaWYgKGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIgJiYgYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlci5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyLnNsaWNlKCk7XHJcblx0XHR9XHJcblx0XHRjb25zdCByZXN1bHQ6IGFueVtdID0gW107XHJcblxyXG5cdFx0aWYgKGFycmF5VG9rZW4pIHtcclxuXHRcdFx0Zm9yIChjb25zdCB0b2tlbiBvZiBhcnJheVRva2VuKSB7XHJcblx0XHRcdFx0Y29uc3QgaW5mb1Rva2VuID0geyBrZXk6IHRva2VuLCB2YWx1ZTogdG9rZW4gfTtcclxuXHRcdFx0XHRpZiAoYXJyYXlUb2tlbkZvcm1hdHRlZCkge1xyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCB0b2tlbkZvcm1hdHRlZCBvZiBhcnJheVRva2VuRm9ybWF0dGVkKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGluZGV4ID0gdG9rZW5Gb3JtYXR0ZWQuaW5kZXhPZih0b2tlbik7XHJcblx0XHRcdFx0XHRcdGlmIChpbmRleCA+PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0aW5mb1Rva2VuLnZhbHVlID0gdG9rZW5Gb3JtYXR0ZWQ7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmVzdWx0LnB1c2goaW5mb1Rva2VuKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRjaGFuZ2VJZFByb3BlcnRpZXNPZk9iamVjdChub3JtYWxpemF0aW9uQ29sdW1uczogYW55W10sIGxpc3REYXRhOiBhbnlbXSk6IGFueVtdIHtcclxuXHRcdGNvbnN0IG5ld0RhdGEgPSBbXTtcclxuXHRcdGxpc3REYXRhLmZvckVhY2goKGRhdGEpID0+IHtcclxuXHRcdFx0Y29uc3Qgb2JqRGF0YSA9IHt9O1xyXG5cdFx0XHRPYmplY3Qua2V5cyhkYXRhKS5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xyXG5cdFx0XHRcdGlmIChkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xyXG5cdFx0XHRcdFx0bm9ybWFsaXphdGlvbkNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcblx0XHRcdFx0XHRcdGlmIChjb2x1bW4uaWRDb2x1bW4udG9TdHJpbmcoKSA9PT0gcHJvcGVydHkpIHtcclxuXHRcdFx0XHRcdFx0XHRvYmpEYXRhW2NvbHVtbi5rZXldID0gZGF0YVtwcm9wZXJ0eV07XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHRcdGlmIChvYmpEYXRhKSB7XHJcblx0XHRcdFx0bmV3RGF0YS5wdXNoKG9iakRhdGEpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdHJldHVybiBuZXdEYXRhO1xyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGVIdG1sQnlUb2tlbnNBbmREYXRhKGh0bWw6IHN0cmluZywgbGlzdERhdGE6IGFueVtdLCBsaXN0VG9rZW5zOiBhbnlbXSk6IHN0cmluZ1tdIHtcclxuXHRcdGNvbnN0IHRyYW5zbGF0ZWRDYXJkczogYW55W10gPSBbXTtcclxuXHRcdGxpc3REYXRhLmZvckVhY2goKGRhdGEpID0+IHtcclxuXHRcdFx0Y29uc3Qgb2JqVG9rZW4gPSB7fTtcclxuXHRcdFx0Y29uc3QgaHRtbFRyYW5zbGF0ZWQgPSB7IGh0bWw6IGh0bWwgfTtcclxuXHRcdFx0T2JqZWN0LmtleXMoZGF0YSkuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcclxuXHRcdFx0XHRsaXN0VG9rZW5zLmZvckVhY2goKHRva2VuKSA9PiB7XHJcblx0XHRcdFx0XHRpZiAocHJvcGVydHkgPT0gdG9rZW4ua2V5LnJlcGxhY2UoJyR7JywgJycpLnJlcGxhY2UoJ30nLCAnJykpIHtcclxuXHRcdFx0XHRcdFx0b2JqVG9rZW5bdG9rZW4ua2V5XSA9IGRhdGFbcHJvcGVydHldO1xyXG5cdFx0XHRcdFx0XHRodG1sVHJhbnNsYXRlZC5odG1sID0gaHRtbFRyYW5zbGF0ZWQuaHRtbC5yZXBsYWNlKFxyXG5cdFx0XHRcdFx0XHRcdHRva2VuLmtleSxcclxuXHRcdFx0XHRcdFx0XHRkYXRhW3Byb3BlcnR5XVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0dHJhbnNsYXRlZENhcmRzLnB1c2goaHRtbFRyYW5zbGF0ZWQpO1xyXG5cdFx0fSk7XHJcblx0XHRyZXR1cm4gdHJhbnNsYXRlZENhcmRzO1xyXG5cdH1cclxuXHJcblx0Z2V0TGlzdFRva2Vuc0J5U3RyaW5nKHN0cmluZ1RleHQ6IHN0cmluZyk6IGFueVtdIHtcclxuXHRcdHZhciBhcnJheVRva2VuID0gc3RyaW5nVGV4dC5tYXRjaCgvXFwkeyhbXn1dKylcXH0vZyk7XHJcblx0XHR2YXIgYXJyYXlUb2tlbkZvcm1hdHRlZERhdGUgPSBzdHJpbmdUZXh0Lm1hdGNoKC9cXCNkYXRlW14pXStcXCkvZyk7XHJcblx0XHR2YXIgYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlciA9IHN0cmluZ1RleHQubWF0Y2goL1xcI251bWJlclteKV0rXFwpL2cpO1xyXG5cdFx0dmFyIGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBbXTtcclxuXHRcdGlmIChcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZERhdGUgJiZcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZERhdGUubGVuZ3RoID4gMCAmJlxyXG5cdFx0XHRhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyICYmXHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIubGVuZ3RoID4gMFxyXG5cdFx0KSB7XHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBhcnJheVRva2VuRm9ybWF0dGVkRGF0ZS5jb25jYXQoYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlcik7XHJcblx0XHR9IGVsc2UgaWYgKGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlICYmIGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZCA9IGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlLnNsaWNlKCk7XHJcblx0XHR9IGVsc2UgaWYgKGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIgJiYgYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlci5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyLnNsaWNlKCk7XHJcblx0XHR9XHJcblx0XHR2YXIgcmVzdWx0OiBhbnlbXSA9IFtdO1xyXG5cclxuXHRcdGlmIChhcnJheVRva2VuKSB7XHJcblx0XHRcdGZvciAoY29uc3QgdG9rZW4gb2YgYXJyYXlUb2tlbikge1xyXG5cdFx0XHRcdGxldCBrZXlUeXBlOiBudW1iZXIgPSBUb2tlblNlcnZpY2UuZ2V0S2V5VHlwZSh0b2tlbik7XHJcblx0XHRcdFx0aWYgKGtleVR5cGUgPT09IG51bGwpIHtcclxuXHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR2YXIgaW5mb1Rva2VuID0geyBrZXk6IHRva2VuLCB2YWx1ZTogdG9rZW4gfTtcclxuXHRcdFx0XHRpZiAoYXJyYXlUb2tlbkZvcm1hdHRlZCkge1xyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCB0b2tlbkZvcm1hdHRlZCBvZiBhcnJheVRva2VuRm9ybWF0dGVkKSB7XHJcblx0XHRcdFx0XHRcdHZhciBpbmRleCA9IHRva2VuRm9ybWF0dGVkLmluZGV4T2YodG9rZW4pO1xyXG5cdFx0XHRcdFx0XHRpZiAoaW5kZXggPj0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdGluZm9Ub2tlbi52YWx1ZSA9IHRva2VuRm9ybWF0dGVkO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJlc3VsdC5wdXNoKGluZm9Ub2tlbik7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cclxuXHRcdC8vIGxldCB0b2tlbnM6IGFueVtdID0gW107XHJcblx0XHQvLyBsZXQgaSA9IHRoaXMubmV4dFZhbGlkUG9zaXRpb25Ub2tlbnMoc3RyaW5nVGV4dCwgMCk7XHJcblx0XHQvLyBsZXQgY291bnQgPSAwO1xyXG5cdFx0Ly8gd2hpbGUgKGkgPj0gMCAmJiBjb3VudCA8PSAxMCkge1xyXG5cdFx0Ly8gICBsZXQgaW5mb1Rva2VuOiB7fSA9IG51bGw7XHJcblx0XHQvLyAgIGxldCBuZXh0STogbnVtYmVyID0gaTtcclxuXHRcdC8vICAgbGV0IGNoYXJhY3RlciA9IHN0cmluZ1RleHQuc3Vic3RyaW5nKGksIChpICsgMSkpO1xyXG5cdFx0Ly8gICBpZiAoY2hhcmFjdGVyID09IFwiJFwiKSB7XHJcblx0XHQvLyAgICAgbGV0IG5leHRDaGFyYWN0ZXIgPSBzdHJpbmdUZXh0LnN1YnN0cmluZygoaSArIDEpLCAoaSArIDIpKTtcclxuXHRcdC8vICAgICAvLyBUaGUgbmV4dCBjaGFyYWN0ZXIgbmVlZCB0byBiZSBhIHsgc2lnblxyXG5cdFx0Ly8gICAgIGlmIChuZXh0Q2hhcmFjdGVyICE9IFwie1wiKSB7XHJcblx0XHQvLyAgICAgICBpID0gdGhpcy5uZXh0VmFsaWRQb3NpdGlvblRva2VucyhzdHJpbmdUZXh0LCBuZXh0SSArIDEpO1xyXG5cdFx0Ly8gICAgICAgY29udGludWU7XHJcblx0XHQvLyAgICAgfVxyXG5cdFx0Ly8gICAgIGxldCBrZXlUb2tlbjogc3RyaW5nID0gc3RyaW5nVGV4dC5zdWJzdHJpbmcoaSwgc3RyaW5nVGV4dC5pbmRleE9mKFwifVwiLCBpKSArIDEpO1xyXG5cdFx0Ly8gICAgIC8vIElmIHRoZSB0b2tlbiBoYXZlIGEgdmFsaWQga2V5IHR5cGVcclxuXHRcdC8vICAgICBsZXQga2V5VHlwZTogbnVtYmVyID0gVG9rZW5TZXJ2aWNlLmdldEtleVR5cGUoa2V5VG9rZW4ucmVwbGFjZShcIntcIiwgXCJcIikucmVwbGFjZShcIn1cIiwgXCJcIikpO1xyXG5cdFx0Ly8gICAgIGlmIChrZXlUeXBlID09PSBudWxsKSB7XHJcblx0XHQvLyAgICAgICBpID0gdGhpcy5uZXh0VmFsaWRQb3NpdGlvblRva2VucyhzdHJpbmdUZXh0LCBuZXh0SSArIDEpO1xyXG5cdFx0Ly8gICAgICAgY29udGludWU7XHJcblx0XHQvLyAgICAgfVxyXG5cdFx0Ly8gICAgIGluZm9Ub2tlbiA9IHtcclxuXHRcdC8vICAgICAgIGtleToga2V5VG9rZW4sXHJcblx0XHQvLyAgICAgICB2YWx1ZToga2V5VG9rZW5cclxuXHRcdC8vICAgICB9O1xyXG5cdFx0Ly8gICAgIG5leHRJID0gc3RyaW5nVGV4dC5pbmRleE9mKFwifVwiLCBpKTtcclxuXHRcdC8vICAgfSBlbHNlIHtcclxuXHRcdC8vICAgICBsZXQgbmV4dFNpZ246IG51bWJlciA9IHN0cmluZ1RleHQuaW5kZXhPZihcIiRcIiwgaSk7XHJcblx0XHQvLyAgICAgLy8gV2UgaW5seSBzdXBwb3J0ICNkYXRlKCQgYW5kICNudW1iZXIoJCBpbiB0aGlzIDIgc2NlbmFyaW9zIHRoZSBsZW5naHQgY2FuJ3QgYmUgbW9yZSB0aGFuIDEwIGNoYXJhY3RlcnNcclxuXHRcdC8vICAgICBpZiAobmV4dFNpZ24gPCAwIHx8IChuZXh0U2lnbiAtIGkpID4gMTApIHtcclxuXHRcdC8vICAgICAgIGkgPSB0aGlzLm5leHRWYWxpZFBvc2l0aW9uVG9rZW5zKHN0cmluZ1RleHQsIG5leHRJICsgMSk7XHJcblx0XHQvLyAgICAgICBjb250aW51ZTtcclxuXHRcdC8vICAgICB9XHJcblx0XHQvLyAgICAgbGV0IGtleVRva2VuOiBzdHJpbmcgPSBzdHJpbmdUZXh0LnN1YnN0cmluZyhzdHJpbmdUZXh0LmluZGV4T2YoXCIkXCIsIGkpLCBzdHJpbmdUZXh0LmluZGV4T2YoXCJ9XCIsIGkpICsgMSk7XHJcblx0XHQvLyAgICAgbGV0IHZhbHVlVG9rZW46IHN0cmluZyA9IHN0cmluZ1RleHQuc3Vic3RyaW5nKGksIHN0cmluZ1RleHQuaW5kZXhPZihcIilcIiwgaSkgKyAxKTtcclxuXHRcdC8vICAgICBpbmZvVG9rZW4gPSB7XHJcblx0XHQvLyAgICAgICBrZXk6IGtleVRva2VuLFxyXG5cdFx0Ly8gICAgICAgdmFsdWU6IHZhbHVlVG9rZW5cclxuXHRcdC8vICAgICB9O1xyXG5cdFx0Ly8gICAgIG5leHRJID0gc3RyaW5nVGV4dC5pbmRleE9mKFwiKVwiLCBpKTtcclxuXHRcdC8vICAgfVxyXG5cdFx0Ly8gICB0b2tlbnMucHVzaChpbmZvVG9rZW4pO1xyXG5cdFx0Ly8gICBpID0gdGhpcy5uZXh0VmFsaWRQb3NpdGlvblRva2VucyhzdHJpbmdUZXh0LCBuZXh0SSk7XHJcblx0XHQvLyAgIGNvdW50Kys7XHJcblx0XHQvLyB9XHJcblx0XHQvLyByZXR1cm4gdG9rZW5zO1xyXG5cdH1cclxuXHJcblx0bmV4dFZhbGlkUG9zaXRpb25Ub2tlbnMoc3RyaW5nVGV4dDogc3RyaW5nLCBuZXh0STogbnVtYmVyKTogbnVtYmVyIHtcclxuXHRcdGxldCB0b2tlbkRvbGxhclNpZ246IG51bWJlciA9IHN0cmluZ1RleHQuaW5kZXhPZignJCcsIG5leHRJKTtcclxuXHRcdGxldCB0b2tlbk51bVNpZ246IG51bWJlciA9IHN0cmluZ1RleHQuaW5kZXhPZignIycsIG5leHRJKTtcclxuXHRcdGxldCBpOiBudW1iZXIgPVxyXG5cdFx0XHR0b2tlbkRvbGxhclNpZ24gPCAwICYmIHRva2VuTnVtU2lnbiA+PSAwXHJcblx0XHRcdFx0PyB0b2tlbk51bVNpZ25cclxuXHRcdFx0XHQ6IHRva2VuTnVtU2lnbiA8IDAgJiYgdG9rZW5Eb2xsYXJTaWduID49IDBcclxuXHRcdFx0XHQ/IHRva2VuRG9sbGFyU2lnblxyXG5cdFx0XHRcdDogdG9rZW5Eb2xsYXJTaWduIDwgdG9rZW5OdW1TaWduXHJcblx0XHRcdFx0PyB0b2tlbkRvbGxhclNpZ25cclxuXHRcdFx0XHQ6IHRva2VuTnVtU2lnbjtcclxuXHRcdHJldHVybiBpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmV1c2VzIHJlcGxhY2VUb2tlbnNGcm9tTGlzdE9iamVjdFB1YmxpYyBidXQgc2V0IGFsbCBrZXlzIGxvYmplY3R0b2tlbnMgYXMgbG93ZXJjYXNlXHJcblx0ICogQHBhcmFtIHRva2VuTmFtZVxyXG5cdCAqIEBwYXJhbSBmb3JtdWxhXHJcblx0ICogQHBhcmFtIGxPYmplY3RUb2tlbnNcclxuXHQgKi9cclxuXHRyZXBsYWNlVG9rZW5zRnJvbUxpc3RPYmplY3RQdWJsaWMoXHJcblx0XHR0b2tlbk5hbWU6IHN0cmluZyxcclxuXHRcdGZvcm11bGE6IHN0cmluZyxcclxuXHRcdGxPYmplY3RUb2tlbnM6IGFueVtdXHJcblx0KTogc3RyaW5nIHtcclxuXHRcdGxldCBsRGF0YU9yZzogYW55W10gPSBbXTtcclxuXHRcdGlmIChsT2JqZWN0VG9rZW5zKSB7XHJcblx0XHRcdGZvciAobGV0IGRhdGFGb3JtIGluIGxPYmplY3RUb2tlbnMpIHtcclxuXHRcdFx0XHRsRGF0YU9yZ1tkYXRhRm9ybS50b0xvd2VyQ2FzZSgpXSA9IGxPYmplY3RUb2tlbnNbZGF0YUZvcm1dO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdGhpcy5yZXBsYWNlVG9rZW5zRnJvbUxpc3RPYmplY3QodG9rZW5OYW1lLCBmb3JtdWxhLCBsRGF0YU9yZyk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIEBwYXJhbSB0b2tlbk5hbWUgdG9rZW4gbmFtZVxyXG5cdCAqIEBwYXJhbSBmb3JtdWxhIFN0cmluZyB3aXRoIHRoZSBmb3JtdWxhIHRvIGV4ZWN1dGVcclxuXHQgKiBAcGFyYW0gbE9iamVjdFRva2VucyBMaXN0IG9mIHRva2VucyB3aXRoIHRoZSB2YWx1ZXMgdG8gcmVwbGFjZVxyXG5cdCAqL1xyXG5cdHJlcGxhY2VUb2tlbnNGcm9tTGlzdE9iamVjdCh0b2tlbk5hbWU6IHN0cmluZywgZm9ybXVsYTogc3RyaW5nLCBsT2JqZWN0VG9rZW5zOiBhbnkpOiBzdHJpbmcge1xyXG5cdFx0aWYgKCFmb3JtdWxhIHx8IGZvcm11bGEubGVuZ3RoID09IDApIHtcclxuXHRcdFx0dGhyb3cge1xyXG5cdFx0XHRcdG1lc3NhZ2U6ICdMYSBmb3JtdWxhIGRlbCB0b2tlbiAnICsgdG9rZW5OYW1lICsgJyBlc3RhIHZhY8OtYScsXHJcblx0XHRcdFx0dGl0bGU6ICdBbGVydGEhJyxcclxuXHRcdFx0XHRlcnJvcjpcclxuXHRcdFx0XHRcdCdMYSBmb3JtdWxhIGRlbCB0b2tlbiAnICsgdG9rZW5OYW1lICsgJyBlc3RhIHZhY8OtYS4gW2Zvcm11bGFbJyArIGZvcm11bGEgKyAnXV0nXHJcblx0XHRcdH07XHJcblx0XHR9XHJcblx0XHRsZXQgcmVwbGFjZWRUb2tlbnM6IHN0cmluZyA9IGZvcm11bGEudG9TdHJpbmcoKTtcclxuXHRcdGlmIChyZXBsYWNlZFRva2Vucy5zdGFydHNXaXRoKCdmaWxlOi8vJykpIHtcclxuXHRcdFx0cmV0dXJuIHJlcGxhY2VkVG9rZW5zO1xyXG5cdFx0fVxyXG5cdFx0Ly8gRmluZCB0aGUgdG9rZW5zIGluIHRoZSBmb3JtdWxhXHJcblx0XHRsZXQgdG9rZW5zQXJyYXk6IGFueVtdID0gdGhpcy5nZXRMaXN0VG9rZW5zQnlTdHJpbmcocmVwbGFjZWRUb2tlbnMpO1xyXG5cdFx0aWYgKHRva2Vuc0FycmF5Lmxlbmd0aCA9PSAwKSB7XHJcblx0XHRcdHJldHVybiByZXBsYWNlZFRva2VucztcclxuXHRcdH1cclxuXHRcdC8vIElmIHRoZXJlIGFueSB0b2tlbiwgdHJ5IHRvIHJlcGxhY2VcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0bGV0IG9iamVjdFRva2VuID1cclxuXHRcdFx0XHRsT2JqZWN0VG9rZW5zW3Rva2Vuc0FycmF5W2ldLmtleV0gIT09IHVuZGVmaW5lZFxyXG5cdFx0XHRcdFx0PyBsT2JqZWN0VG9rZW5zW3Rva2Vuc0FycmF5W2ldLmtleV1cclxuXHRcdFx0XHRcdDogbnVsbDtcclxuXHRcdFx0bGV0IGNsZWFyS2V5O1xyXG5cdFx0XHRpZiAob2JqZWN0VG9rZW4gPT0gbnVsbCkge1xyXG5cdFx0XHRcdGNsZWFyS2V5ID0gdG9rZW5zQXJyYXlbaV0ua2V5LnJlcGxhY2UoJyR7JywgJycpLnJlcGxhY2UoJ30nLCAnJykudG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0XHRvYmplY3RUb2tlbiA9XHJcblx0XHRcdFx0XHRsT2JqZWN0VG9rZW5zW2NsZWFyS2V5XSAhPT0gdW5kZWZpbmVkID8gbE9iamVjdFRva2Vuc1tjbGVhcktleV0gOiBudWxsO1xyXG5cclxuXHRcdFx0XHRpZiAob2JqZWN0VG9rZW4gPT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0Y2xlYXJLZXkgPSB0b2tlbnNBcnJheVtpXS5rZXlcclxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoJ3snLCAnJylcclxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoJ30nLCAnJylcclxuXHRcdFx0XHRcdFx0LnNwbGl0KCdfJylbMV1cclxuXHRcdFx0XHRcdFx0LnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0XHRvYmplY3RUb2tlbiA9XHJcblx0XHRcdFx0XHRcdGxPYmplY3RUb2tlbnNbY2xlYXJLZXldICE9PSB1bmRlZmluZWQgPyBsT2JqZWN0VG9rZW5zW2NsZWFyS2V5XSA6IG51bGw7XHJcblx0XHRcdFx0XHRpZiAob2JqZWN0VG9rZW4gPT09IG51bGwgfHwgb2JqZWN0VG9rZW4gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBhcnJheUtleSA9IHRva2Vuc0FycmF5W2ldLmtleVxyXG5cdFx0XHRcdFx0XHRcdC5yZXBsYWNlKCd7JywgJycpXHJcblx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoJ30nLCAnJylcclxuXHRcdFx0XHRcdFx0XHQuc3BsaXQoJ18nKVsxXVxyXG5cdFx0XHRcdFx0XHRcdC5zcGxpdCgnLicpO1xyXG5cdFx0XHRcdFx0XHRpZiAoYXJyYXlLZXkubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHRcdGxldCB2YWx1ZSA9IGxPYmplY3RUb2tlbnM7XHJcblx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5S2V5Lmxlbmd0aDsgaW5kZXgrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0bGV0IGVsZW1lbnQgPSBhcnJheUtleVtpbmRleF07XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoaW5kZXggPT0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbGVtZW50ID0gZWxlbWVudC50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZVtlbGVtZW50XTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0b2JqZWN0VG9rZW4gPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAob2JqZWN0VG9rZW4gPT0gbnVsbCkge1xyXG5cdFx0XHRcdC8vIElmIG5vdCBmaW5kIHRoZSB0b2tlbiwgYnkgZGVmYXVsdCBwdXQgYW4gZW1wdHkgc3RyaW5nXHJcblx0XHRcdFx0LyppZiAoVG9rZW5TZXJ2aWNlLmV4Y2x1ZGVkVG9rZW4uaW5kZXhPZihjbGVhcktleSkgPT09IC0xKSB7XHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKFxyXG5cdFx0XHRcdFx0XHQnRWwgdG9rZW4gJyArIHRva2Vuc0FycmF5W2ldLnZhbHVlICsgJyBubyBmdWUgZW5jb250cmFkby4nLFxyXG5cdFx0XHRcdFx0XHRsT2JqZWN0VG9rZW5zLFxyXG5cdFx0XHRcdFx0XHR0b2tlbnNBcnJheVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHR9Ki9cclxuXHRcdFx0XHRvYmplY3RUb2tlbiA9ICcnO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChvYmplY3RUb2tlbiAhPSBudWxsKSB7XHJcblx0XHRcdFx0Ly8gbGV0IHZhbHVlOiBhbnkgPSBOdW1iZXIob2JqZWN0VG9rZW4pXHJcblx0XHRcdFx0Ly8gXHQ/IG9iamVjdFRva2VuXHJcblx0XHRcdFx0Ly8gXHQ6IEFycmF5LmlzQXJyYXkob2JqZWN0VG9rZW4pXHJcblx0XHRcdFx0Ly8gXHQ/IEpTT04uc3RyaW5naWZ5KG9iamVjdFRva2VuKVxyXG5cdFx0XHRcdC8vIFx0OiBcIidcIiArIG9iamVjdFRva2VuICsgXCInXCI7XHJcblx0XHRcdFx0bGV0IHZhbHVlOiBhbnk7XHJcblx0XHRcdFx0aWYoTnVtYmVyKG9iamVjdFRva2VuKSl7XHJcblx0XHRcdFx0XHR2YWx1ZSA9IE51bWJlcihvYmplY3RUb2tlbik7XHJcblx0XHRcdFx0fWVsc2UgaWYoQXJyYXkuaXNBcnJheShvYmplY3RUb2tlbikpe1xyXG5cdFx0XHRcdFx0dmFsdWUgPSBBcnJheS5pc0FycmF5KG9iamVjdFRva2VuKTtcclxuXHRcdFx0XHR9ZWxzZSBpZihKU09OLnN0cmluZ2lmeShvYmplY3RUb2tlbikpe1xyXG5cdFx0XHRcdFx0dmFsdWUgPSBvYmplY3RUb2tlbi5vcmlnaW5hbF9uYW1lID8gXCInXCIgKyBvYmplY3RUb2tlbi5vcmlnaW5hbF9uYW1lICsgXCInXCIgOiBKU09OLnN0cmluZ2lmeShvYmplY3RUb2tlbik7XHJcblx0XHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0XHR2YWx1ZSA9IFwiJ1wiICsgb2JqZWN0VG9rZW4gKyBcIidcIjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmVwbGFjZWRUb2tlbnMgPSB0aGlzLnJlcGxhY2VUb2tlbihyZXBsYWNlZFRva2VucywgdG9rZW5zQXJyYXlbaV0udmFsdWUsIHZhbHVlKTtcclxuXHRcdFx0XHQvLyB9IGVsc2Uge1xyXG5cdFx0XHRcdC8vICAgY29uc29sZS5lcnJvcihsT2JqZWN0VG9rZW5zLCB0b2tlbnNBcnJheSk7XHJcblx0XHRcdFx0Ly8gICB0aHJvdyB7XHJcblx0XHRcdFx0Ly8gICAgIG1lc3NhZ2U6IFwiTm8gc2UgZW5jb250csOzIHZhbG9yIHBhcmEgdW4gdG9rZW5cIixcclxuXHRcdFx0XHQvLyAgICAgdGl0bGU6IFwiQWxlcnRhIVwiLFxyXG5cdFx0XHRcdC8vICAgICBlcnJvcjogXCJFbCB0b2tlbiBcIiArIHRva2Vuc0FycmF5W2ldLnZhbHVlICsgXCIgbm8gZnVlIGVuY29udHJhZG8uXCJcclxuXHRcdFx0XHQvLyAgIH07XHJcblx0XHRcdFx0Ly9cclxuXHRcdFx0XHQvLyBTaSBlcyBsYSB1bHRpbWEgaXRlcmFjaW9uIHkgbGEgZm9ybXVsYSB0aWVuZSBbIGVzIHBvcnF1ZSB0aWVuZSB1biBhcnJheSBlbiBlbCB2YWxvciBxdWUgcmVzb2x2aW8gZWwgdG9rZW5cclxuXHRcdFx0XHRpZiAoaSA9PSB0b2tlbnNBcnJheS5sZW5ndGggLSAxICYmIHJlcGxhY2VkVG9rZW5zLmluY2x1ZGVzKCdbJykpIHtcclxuXHRcdFx0XHRcdC8vIFNlIHBvbmVuIHRvZG9zIGxvcyBvcGVyYW5kb3MgY29tbyBlbGVtZW50b3MgZW4gdW4gYXJyYXkgWydleHByZXNpb24gYScsICcmJicsICdFeHByZXNpb24gQiddXHJcblx0XHRcdFx0XHRsZXQgZm9ybUV4cHJlc3Npb25zOiBzdHJpbmdbXSA9IHJlcGxhY2VkVG9rZW5zLnNwbGl0KC8gKFxcfFxcfHwmJikgLyk7XHJcblx0XHRcdFx0XHRsZXQgbEF1eGZvcm1FeHByZXNzaW9uOiBzdHJpbmdbXSA9IFtdO1xyXG5cdFx0XHRcdFx0Zm9ybUV4cHJlc3Npb25zLmZvckVhY2goKGV4cHJlc3Npb246IHN0cmluZykgPT4ge1xyXG5cdFx0XHRcdFx0XHRpZiAoZXhwcmVzc2lvbi5jaGFyQXQoMCkgPT0gJ1snKSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IGlzVGFnRm91bmQ6IHN0cmluZyA9ICcnO1xyXG5cdFx0XHRcdFx0XHRcdGlzVGFnRm91bmQgPSB0aGlzLmZpbmRUYWcoZXhwcmVzc2lvbik7XHJcblx0XHRcdFx0XHRcdFx0bEF1eGZvcm1FeHByZXNzaW9uLnB1c2goaXNUYWdGb3VuZCk7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0bEF1eGZvcm1FeHByZXNzaW9uLnB1c2goZXhwcmVzc2lvbik7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0cmVwbGFjZWRUb2tlbnMgPSBsQXV4Zm9ybUV4cHJlc3Npb24uam9pbignICcpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJlcGxhY2VkVG9rZW5zO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTUV0b2RvIHF1ZSB0ZW5pZW5kbyB1bmEgZXhwcmVzaW9uIGRlIGxhIGZvcm1hIFsndGFnMScsICd0YWcyJ109PXRhZzNcclxuXHQgKiBldmFsdWEgc2kgdGFnMyBoYWNlIHBhcnRlIGRlbCBhcnJheSBzaSB0aWVuZSBlbCBvcGVyYWRvciA9PS5cclxuXHQgKiBTaSB0aWVuZSBlbCBvcGVyYWRvciAhPSBleGFtaW5hIHF1ZSB0YWczIG5vIGhhZ2EgcGFydGUgZGVsIGFycmF5K1xyXG5cdCAqXHJcblx0ICogQHBhcmFtIGV4cHJlc3Npb24gT3BlcmFuZG8gcXVlIGV2YWx1YSB0YWcuIEVzIGRlIGxhIGZvcm1hIFsndGFnMScsICd0YWcyJ109PXRhZzNcclxuXHQgKiBAcmV0dXJucyBSZXRvcm5hICd0cnVlJyBvICdmYWxzZScgZW4gc3RyaW5nIHF1ZSBkZXNwdWVzIHNlcmEgcGFzYWRvIGEgdW4gZXZhbCgpXHJcblx0ICogbWFzIGFkZWxhbnRlIGVuIGVsIGZsdWpvXHJcblx0ICovXHJcblx0ZmluZFRhZyhleHByZXNzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdFx0bGV0IHJlZ2V4T3BlcmF0b3IgPSBuZXcgUmVnRXhwKCcoPT09fD09fCE9PXwhPSknKTtcclxuXHRcdC8vIFJldG9ybmEgZWwgb3BlcmFkb3JcclxuXHRcdGxldCBvcGVyYXRvcjogc3RyaW5nW10gPSBleHByZXNzaW9uLm1hdGNoKHJlZ2V4T3BlcmF0b3IpO1xyXG5cdFx0Ly8gU2kgbm8gZW5jdWVudHJhIHVuIG9wZXJhZG9yIHNlZ3VuIGVsIHBhdHJvbiByZXRvcm5hICdmYWxzZSdcclxuXHRcdC8vIHBhcmEgZXZpdGFyIHJlc3VsdGFkb3MgaW5lc3BlcmFkb3NcclxuXHRcdGlmIChvcGVyYXRvciA9PSBudWxsKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ05vIHNlIGVuY29udHJvIHVuIG9wZXJhZG9yIHBlcm1pdGlkbyBwYXJhIGxhIGV4cHJlc2lvbicpO1xyXG5cdFx0XHRyZXR1cm4gJ2ZhbHNlJztcclxuXHRcdH1cclxuXHRcdC8vIFNlcGFyYSBsYSBzZW50ZW5jaWEgcG9yIGVsIG9wZXJhZG9yXHJcblx0XHQvLyBMYSBwcmltZXJhIHBhcnRlIGVzIGVsIHZhbG9yIHBvciBlbCBjdWFsIHNlIHJlbXBsYXphIGVsIHRva2VuIHF1ZSBlcyB1biBhcnJheSBlbiBzdHJpbmcgXCJbJ2EnLCAnYiddXCJcclxuXHRcdC8vIEVsIHNlZ3VuZG8gZXMgZWwgdmFsb3IgY29uIGVsIGN1YWwgc2UgdmEgYSBjb21wYXJhclxyXG5cdFx0bGV0IHZhbHVlVG9rZW4sIHZhbHVlVG9Db21wYXJlO1xyXG5cdFx0W3ZhbHVlVG9rZW4sIHZhbHVlVG9Db21wYXJlXSA9IGV4cHJlc3Npb24uc3BsaXQob3BlcmF0b3JbMF0pO1xyXG5cdFx0Ly8gU2UgbGltcGlhIGVsIHN0cmluZyBjb3JyZXNwb25kaWVudGUgYWwgYXJyYXkgcGFyYSBxdWUgbG9zIGVsZW1lbnRvcyBxdWVkZW4gc2VwYXJhZG9zIHBvciBcIixcIlxyXG5cdFx0dmFsdWVUb2tlbiA9IHZhbHVlVG9rZW4ucmVwbGFjZSgvW15hLXpBLVowLTkgLF0vZywgJycpO1xyXG5cdFx0Ly8gU2kgbm8gaGF5IHRhZ3MgYXNvY2lhZG9zIGFsIHJlZ2lzdHJvIHNlIGRldnVlbHZlICdmYWxzZSdcclxuXHRcdGlmICghdmFsdWVUb2tlbikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdObyBoYXkgdGFncyBhc29jaWFkb3MgYSBlc3RhIGFwbGljYWNpw7NuJyk7XHJcblx0XHRcdHJldHVybiAnZmFsc2UnO1xyXG5cdFx0fVxyXG5cdFx0Ly8gU2UgbGltcGlhIGVsIHN0cmluZyBjb3JyZXNwb25kaWVudGUgYWwgdmFsb3IgcG9yIGNvbXBhcmFyXHJcblx0XHR2YWx1ZVRvQ29tcGFyZSA9IHZhbHVlVG9Db21wYXJlLnJlcGxhY2UoL1teYS16QS1aMC05IF0vZywgJycpO1xyXG5cdFx0Ly8gRWwgc3RyaW5nIGNvcnJlc3BvbmRpZW50ZSBhbCBhcnJheSBwYXNhIGEgc2VyIHRpcG8gYXJyYXlcclxuXHRcdHZhbHVlVG9rZW4gPSB2YWx1ZVRva2VuLnNwbGl0KCcsJyk7XHJcblxyXG5cdFx0Ly8gU2UgdHJhdGEgZGUgY29uc3RhdGFyIHNpIGVsIHZhbG9yIGEgY29tcGFyYXIgc2UgZW5jdWV0cmEgbyBubyBkZW50cm9cclxuXHRcdC8vIFNpIGVsIG9wZXJhZG9yIHF1ZSBzZSBlbmNvbnRybyA9PSByZXR1cm5hIHRydWUgc2kgbG8gZW5jdWVudHJhXHJcblx0XHRsZXQgaXNUYWdGb3VuZDogYm9vbGVhbiA9IHRydWU7XHJcblx0XHRzd2l0Y2ggKG9wZXJhdG9yWzBdKSB7XHJcblx0XHRcdGNhc2UgJz09JzpcclxuXHRcdFx0XHRpc1RhZ0ZvdW5kID0gdmFsdWVUb2tlbi5zb21lKCh0YWcpID0+IHRhZyA9PSB2YWx1ZVRvQ29tcGFyZSk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJz09PSc6XHJcblx0XHRcdFx0aXNUYWdGb3VuZCA9IHZhbHVlVG9rZW4uc29tZSgodGFnKSA9PiB0YWcgPT09IHZhbHVlVG9Db21wYXJlKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAnIT09JzpcclxuXHRcdFx0XHRpc1RhZ0ZvdW5kID0gdmFsdWVUb2tlbi5zb21lKCh0YWcpID0+IHRhZyAhPT0gdmFsdWVUb0NvbXBhcmUpO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlICchPSc6XHJcblx0XHRcdFx0aXNUYWdGb3VuZCA9IHZhbHVlVG9rZW4uc29tZSgodGFnKSA9PiB0YWcgIT0gdmFsdWVUb0NvbXBhcmUpO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0fVxyXG5cdFx0ZXhwcmVzc2lvbiA9IGlzVGFnRm91bmQgPyAndHJ1ZScgOiAnZmFsc2UnO1xyXG5cdFx0cmV0dXJuIGV4cHJlc3Npb247XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcnkgdG8gZXZhbCB0aGUgZm9ybXVsYSBkZXBlbmQgb2YgdGhlIHR5cGUgb2YgZmllbGRzLlxyXG5cdCAqIEBwYXJhbSBsU3RhdGljVG9rZW5cclxuXHQgKiBAcGFyYW0gZm9ybXVsYU5hbWVcclxuXHQgKiBAcGFyYW0gZm9ybXVsYVxyXG5cdCAqL1xyXG5cdHZhbGlkYXRlRm9ybXVsYShsU3RhdGljVG9rZW46IGFueSwgZm9ybXVsYU5hbWU6IHN0cmluZywgZm9ybXVsYTogc3RyaW5nKTogYm9vbGVhbiB7XHJcblx0XHRsZXQgZXZhbEZvcm11bGE6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRcdC8vIFRvIHZhbGlkYXRlIHRoZSBmb3JtdWxhLCBmaXJzdCBvcmdhbml6ZSB0aGUgaW5mbyB0byBrZXkgLSB2YWx1ZSBhcnJheVxyXG5cdFx0bGV0IG9iamVjdFRva2VuczogYW55W10gPSBbXTtcclxuXHRcdGZvciAobGV0IHBhbmVsIG9mIGxTdGF0aWNUb2tlbikge1xyXG5cdFx0XHRmb3IgKGxldCBncm91cFRva2VuIG9mIHBhbmVsLnZhbHVlKSB7XHJcblx0XHRcdFx0Zm9yIChsZXQgc3RhdGljVG9rZW4gb2YgZ3JvdXBUb2tlbi52YWx1ZSkge1xyXG5cdFx0XHRcdFx0Zm9yIChsZXQgYXJyYXlUb2tlbkluZm8gb2Ygc3RhdGljVG9rZW4pIHtcclxuXHRcdFx0XHRcdFx0b2JqZWN0VG9rZW5zW2FycmF5VG9rZW5JbmZvLmtleV0gPSBhcnJheVRva2VuSW5mby5vYmplY3RcclxuXHRcdFx0XHRcdFx0XHQ/IGFycmF5VG9rZW5JbmZvLm9iamVjdC50eXBlID09ICdudW1iZXInXHJcblx0XHRcdFx0XHRcdFx0XHQ/ICcwJ1xyXG5cdFx0XHRcdFx0XHRcdFx0OiAnJ1xyXG5cdFx0XHRcdFx0XHRcdDogJyc7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHR0cnkge1xyXG5cdFx0XHRmb3JtdWxhID0gdGhpcy5yZXBsYWNlVG9rZW5zRnJvbUxpc3RPYmplY3QoZm9ybXVsYU5hbWUsIGZvcm11bGEsIG9iamVjdFRva2Vucyk7XHJcblx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHQvL2NvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG5cdFx0XHR0aHJvdyBlcnJvcjtcclxuXHRcdH1cclxuXHRcdGlmIChmb3JtdWxhICE9PSBudWxsKSB7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0bGV0IHJlc3VsdCA9IGZvcm11bGEuc3RhcnRzV2l0aCgnZmlsZTovLycpID8gZm9ybXVsYSA6IGV2YWwoZm9ybXVsYSk7XHJcblx0XHRcdFx0ZXZhbEZvcm11bGEgPSB0cnVlO1xyXG5cdFx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdFx0Ly9jb25zb2xlLmVycm9yKFwiRXJyb3IgZXZhbHVhdGluZyB0aGUgZm9ybXVsYVwiLCBlKTtcclxuXHRcdFx0XHR0aHJvdyB7XHJcblx0XHRcdFx0XHRtZXNzYWdlOiAnTGEgZm9ybXVsYSBubyBmdWUgcG9zaWJsZSBldmFsdWFyJyxcclxuXHRcdFx0XHRcdHRpdGxlOiAnQWxlcnRhIScsXHJcblx0XHRcdFx0XHRlcnJvcjogZVxyXG5cdFx0XHRcdH07XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBldmFsRm9ybXVsYTtcclxuXHR9XHJcblxyXG5cdGdldENvbmZpZ0Nsb25pbmdUb2tlbk1hcChvbGRQUFA6IG51bWJlciwgbmV3UFBQOiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoXHJcblx0XHRcdHRoaXMuZW52aXJvbm1lbnQuaG9zdC5iYWNrZW5kLmNvbmZpZ3VyYXRpb24gKyAndG9rZW4vZ2V0Q29uZmlnQ2xvbmluZ1Rva2VuTWFwJyxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHBhcmFtczogbmV3IEh0dHBQYXJhbXMoKVxyXG5cdFx0XHRcdFx0LnNldCgnb2xkUFBQJywgb2xkUFBQLnRvU3RyaW5nKCkpXHJcblx0XHRcdFx0XHQuc2V0KCduZXdQUFAnLCBuZXdQUFAudG9TdHJpbmcoKSlcclxuXHRcdFx0fVxyXG5cdFx0KTtcclxuXHR9XHJcbn1cclxuIl19