ng-pli-commons 1.0.113 → 1.0.116

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 (226) hide show
  1. package/fesm2022/ng-pli-commons.mjs +697 -684
  2. package/fesm2022/ng-pli-commons.mjs.map +1 -1
  3. package/package.json +3 -7
  4. package/esm2022/lib/components/backoffice.commons.component.mjs +0 -40
  5. package/esm2022/lib/components/common.lists.component.mjs +0 -176
  6. package/esm2022/lib/components/configuration-token/configuration-token-subject.service.mjs +0 -23
  7. package/esm2022/lib/components/configuration-token/configuration-token.component.mjs +0 -665
  8. package/esm2022/lib/components/configuration-token/guarantee-token/guarantee-token.component.mjs +0 -103
  9. package/esm2022/lib/components/configuration-token/snapshot-token/snapshot-token.component.mjs +0 -108
  10. package/esm2022/lib/components/configuration.commons.component.mjs +0 -40
  11. package/esm2022/lib/components/dashboard.commons.component.mjs +0 -84
  12. package/esm2022/lib/components/dynamic-filter/dynamic-filter.component.mjs +0 -131
  13. package/esm2022/lib/components/excel-to-json/excel-to-json.component.mjs +0 -54
  14. package/esm2022/lib/components/frontoffice.commons.component.mjs +0 -88
  15. package/esm2022/lib/components/pdf-analyzer/pdf-analyzer.component.mjs +0 -162
  16. package/esm2022/lib/components/pdf-config/pdf-config.component.mjs +0 -170
  17. package/esm2022/lib/components/pdf-generator/pdf-generator.component.mjs +0 -207
  18. package/esm2022/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.mjs +0 -307
  19. package/esm2022/lib/components/pdf-visualizer/pdf-visualizer.component.mjs +0 -387
  20. package/esm2022/lib/components/progress-bar/progress-bar.component.mjs +0 -92
  21. package/esm2022/lib/components/segmentation-tokens/segmentation-tokens.component.mjs +0 -199
  22. package/esm2022/lib/components/select-ppp/select-ppp.component.mjs +0 -200
  23. package/esm2022/lib/components/show-hide-columns/show-hide-columns-table.component.mjs +0 -116
  24. package/esm2022/lib/components/token/token.component.mjs +0 -1047
  25. package/esm2022/lib/components/tokens-calculator/tokens-calculator.component.mjs +0 -128
  26. package/esm2022/lib/directives/currency-colfuturo-formatter.directive.mjs +0 -47
  27. package/esm2022/lib/directives/currency-decimal-colfuturo-formatter.directive.mjs +0 -34
  28. package/esm2022/lib/ng-pli-commons.module.mjs +0 -385
  29. package/esm2022/lib/ng-pli-commons.service.mjs +0 -14
  30. package/esm2022/lib/pipes/currency-colfuturo.pipe.mjs +0 -35
  31. package/esm2022/lib/pipes/currency-decimal-colfuturo.pipe.mjs +0 -36
  32. package/esm2022/lib/pipes/currency-print-colfuturo.pipe.mjs +0 -33
  33. package/esm2022/lib/pipes/thousands.pipe.mjs +0 -60
  34. package/esm2022/lib/services/application-fill-percentage.service.mjs +0 -30
  35. package/esm2022/lib/services/application-pdf-form.service.mjs +0 -27
  36. package/esm2022/lib/services/application-tag.service.mjs +0 -56
  37. package/esm2022/lib/services/application.service.mjs +0 -253
  38. package/esm2022/lib/services/assign-task.service.mjs +0 -30
  39. package/esm2022/lib/services/authentication.service.mjs +0 -133
  40. package/esm2022/lib/services/blocked-beneficiary.service.mjs +0 -42
  41. package/esm2022/lib/services/budget-application.service.mjs +0 -265
  42. package/esm2022/lib/services/budget-setup.service.mjs +0 -26
  43. package/esm2022/lib/services/budget-simulation.service.mjs +0 -65
  44. package/esm2022/lib/services/budget.service.mjs +0 -205
  45. package/esm2022/lib/services/closure-wallet.service.mjs +0 -39
  46. package/esm2022/lib/services/cnf-correspondence-document-manager.service.mjs +0 -39
  47. package/esm2022/lib/services/codebtors.service.mjs +0 -28
  48. package/esm2022/lib/services/committee-assistant.service.mjs +0 -55
  49. package/esm2022/lib/services/committee-money.service.mjs +0 -44
  50. package/esm2022/lib/services/committee-pdf.service.mjs +0 -27
  51. package/esm2022/lib/services/committee-snapshot.service.mjs +0 -60
  52. package/esm2022/lib/services/common-info.service.mjs +0 -51
  53. package/esm2022/lib/services/common.service.mjs +0 -285
  54. package/esm2022/lib/services/configuration-document.service.mjs +0 -297
  55. package/esm2022/lib/services/configuration-minisite.service.mjs +0 -26
  56. package/esm2022/lib/services/configuration.service.mjs +0 -53
  57. package/esm2022/lib/services/correspondence-document-category.service.mjs +0 -31
  58. package/esm2022/lib/services/correspondence-manager.service.mjs +0 -67
  59. package/esm2022/lib/services/credit-score.service.mjs +0 -48
  60. package/esm2022/lib/services/credit-study.service.mjs +0 -292
  61. package/esm2022/lib/services/cube.service.mjs +0 -27
  62. package/esm2022/lib/services/data-form-history.service.mjs +0 -25
  63. package/esm2022/lib/services/data-form.service.mjs +0 -176
  64. package/esm2022/lib/services/data-letter-segmentation.service.mjs +0 -64
  65. package/esm2022/lib/services/document-analysis-auto.service.mjs +0 -27
  66. package/esm2022/lib/services/document-history.service.mjs +0 -43
  67. package/esm2022/lib/services/document-management.service.mjs +0 -57
  68. package/esm2022/lib/services/document-process.service.mjs +0 -27
  69. package/esm2022/lib/services/document-validation-attempt.service.mjs +0 -32
  70. package/esm2022/lib/services/document.service.mjs +0 -144
  71. package/esm2022/lib/services/documentary.type.service.mjs +0 -69
  72. package/esm2022/lib/services/email.service.mjs +0 -30
  73. package/esm2022/lib/services/evaluation.service.mjs +0 -181
  74. package/esm2022/lib/services/export-excel.service.mjs +0 -32
  75. package/esm2022/lib/services/file.service.mjs +0 -153
  76. package/esm2022/lib/services/form.service.mjs +0 -112
  77. package/esm2022/lib/services/gic-client-disbursement-metadata.service.mjs +0 -31
  78. package/esm2022/lib/services/gic-client.service.mjs +0 -49
  79. package/esm2022/lib/services/gic-cnf-bankvision-transaction.service.mjs +0 -31
  80. package/esm2022/lib/services/gic-cnf-closing-date.service.mjs +0 -34
  81. package/esm2022/lib/services/gic-cnf-maintenance.service.mjs +0 -30
  82. package/esm2022/lib/services/gic-collection.service.mjs +0 -53
  83. package/esm2022/lib/services/gic-disbursement.service.mjs +0 -39
  84. package/esm2022/lib/services/gic-extract.service.mjs +0 -41
  85. package/esm2022/lib/services/gic-log.service.mjs +0 -41
  86. package/esm2022/lib/services/gic-payment-application.service.mjs +0 -35
  87. package/esm2022/lib/services/gic-payment-plan-cube.service.mjs +0 -27
  88. package/esm2022/lib/services/gic-payment-plan.service.mjs +0 -32
  89. package/esm2022/lib/services/gic-trm.service.mjs +0 -27
  90. package/esm2022/lib/services/global.show.task.service.mjs +0 -37
  91. package/esm2022/lib/services/guarantee-document.service.mjs +0 -52
  92. package/esm2022/lib/services/guarantee-enrollment.service.mjs +0 -37
  93. package/esm2022/lib/services/guarantee.service.mjs +0 -128
  94. package/esm2022/lib/services/guarantees-summary-service.mjs +0 -26
  95. package/esm2022/lib/services/hash.service.mjs +0 -36
  96. package/esm2022/lib/services/import-data.service.mjs +0 -27
  97. package/esm2022/lib/services/import-excel-gic.service.mjs +0 -53
  98. package/esm2022/lib/services/initial-configuration-gic-parameters.service.mjs +0 -51
  99. package/esm2022/lib/services/initial-record.service.mjs +0 -51
  100. package/esm2022/lib/services/integration-ado.service.mjs +0 -54
  101. package/esm2022/lib/services/interaction-application-user.service.mjs +0 -81
  102. package/esm2022/lib/services/interest-adjustment.service.mjs +0 -34
  103. package/esm2022/lib/services/keys-assignation.service.mjs +0 -127
  104. package/esm2022/lib/services/legalization.service.mjs +0 -150
  105. package/esm2022/lib/services/letter-campaing.service.mjs +0 -49
  106. package/esm2022/lib/services/letter-task-mapping.service.mjs +0 -40
  107. package/esm2022/lib/services/log.service.mjs +0 -41
  108. package/esm2022/lib/services/maintenance.service.mjs +0 -86
  109. package/esm2022/lib/services/master-category.service.mjs +0 -66
  110. package/esm2022/lib/services/master-program.service.mjs +0 -78
  111. package/esm2022/lib/services/master-university.service.mjs +0 -79
  112. package/esm2022/lib/services/migration-plis.service.mjs +0 -27
  113. package/esm2022/lib/services/migration-survey-queue.service.mjs +0 -24
  114. package/esm2022/lib/services/openkm-document.service.mjs +0 -27
  115. package/esm2022/lib/services/page.service.mjs +0 -38
  116. package/esm2022/lib/services/partner-system.service.mjs +0 -30
  117. package/esm2022/lib/services/partner.service.mjs +0 -34
  118. package/esm2022/lib/services/pdf-analyzer.service.mjs +0 -33
  119. package/esm2022/lib/services/people-master.service.mjs +0 -42
  120. package/esm2022/lib/services/permission.service.mjs +0 -29
  121. package/esm2022/lib/services/pli-cnf-acuity-fields.service.mjs +0 -34
  122. package/esm2022/lib/services/pli-cnf-app-card-filter.service.mjs +0 -40
  123. package/esm2022/lib/services/pli-cnf-appointment-type.service.mjs +0 -41
  124. package/esm2022/lib/services/pli-cnf-budget-program-type.service.mjs +0 -54
  125. package/esm2022/lib/services/pli-cnf-budget.service.mjs +0 -31
  126. package/esm2022/lib/services/pli-cnf-cloning.service.mjs +0 -27
  127. package/esm2022/lib/services/pli-cnf-committee-pdf-config-table-config.service.mjs +0 -47
  128. package/esm2022/lib/services/pli-cnf-committee-pdf-gen-status.service.mjs +0 -30
  129. package/esm2022/lib/services/pli-cnf-committee-valpro-columns.service.mjs +0 -42
  130. package/esm2022/lib/services/pli-cnf-committee-visualization-mode.service.mjs +0 -42
  131. package/esm2022/lib/services/pli-cnf-committee.service.mjs +0 -66
  132. package/esm2022/lib/services/pli-cnf-config-minisite.service.mjs +0 -90
  133. package/esm2022/lib/services/pli-cnf-configuration-credit-study.service.mjs +0 -41
  134. package/esm2022/lib/services/pli-cnf-document-management.service.mjs +0 -40
  135. package/esm2022/lib/services/pli-cnf-dynamic-keys-assign.service.mjs +0 -52
  136. package/esm2022/lib/services/pli-cnf-evaluation-task-mailing.service.mjs +0 -31
  137. package/esm2022/lib/services/pli-cnf-evaluation-task-template.service.mjs +0 -39
  138. package/esm2022/lib/services/pli-cnf-evaluation-task.service.mjs +0 -112
  139. package/esm2022/lib/services/pli-cnf-evaluation-template.service.mjs +0 -95
  140. package/esm2022/lib/services/pli-cnf-form-edit.service.mjs +0 -68
  141. package/esm2022/lib/services/pli-cnf-form-multiaplicacion.service.mjs +0 -46
  142. package/esm2022/lib/services/pli-cnf-guarantee-documents-template.service.mjs +0 -40
  143. package/esm2022/lib/services/pli-cnf-guarantee-token.service.mjs +0 -42
  144. package/esm2022/lib/services/pli-cnf-header.service.mjs +0 -39
  145. package/esm2022/lib/services/pli-cnf-indicator.service.mjs +0 -39
  146. package/esm2022/lib/services/pli-cnf-information-system.service.mjs +0 -24
  147. package/esm2022/lib/services/pli-cnf-interaction.service.mjs +0 -78
  148. package/esm2022/lib/services/pli-cnf-letter-template-type.service.mjs +0 -29
  149. package/esm2022/lib/services/pli-cnf-letter-template.service.mjs +0 -48
  150. package/esm2022/lib/services/pli-cnf-look-and-feel.service.mjs +0 -28
  151. package/esm2022/lib/services/pli-cnf-mail.service.mjs +0 -30
  152. package/esm2022/lib/services/pli-cnf-menu-form.service.mjs +0 -34
  153. package/esm2022/lib/services/pli-cnf-migration-plis-field-budget.service.mjs +0 -34
  154. package/esm2022/lib/services/pli-cnf-migration-plis-field.service.mjs +0 -47
  155. package/esm2022/lib/services/pli-cnf-migration-status-plis.service.mjs +0 -44
  156. package/esm2022/lib/services/pli-cnf-page-section-form.service.mjs +0 -66
  157. package/esm2022/lib/services/pli-cnf-page-sub-process.service.mjs +0 -25
  158. package/esm2022/lib/services/pli-cnf-pdfs.service.mjs +0 -31
  159. package/esm2022/lib/services/pli-cnf-profile-form.service.mjs +0 -40
  160. package/esm2022/lib/services/pli-cnf-profile-user.service.mjs +0 -49
  161. package/esm2022/lib/services/pli-cnf-project-summary.service.mjs +0 -39
  162. package/esm2022/lib/services/pli-cnf-scenario.service.mjs +0 -47
  163. package/esm2022/lib/services/pli-cnf-segmentation.service.mjs +0 -72
  164. package/esm2022/lib/services/pli-cnf-snapshot-token.service.mjs +0 -42
  165. package/esm2022/lib/services/pli-cnf-status-flow-interaction.service.mjs +0 -74
  166. package/esm2022/lib/services/pli-cnf-status-flow.service.mjs +0 -56
  167. package/esm2022/lib/services/pli-cnf-support-document-category.service.mjs +0 -47
  168. package/esm2022/lib/services/pli-cnf-support-document.service.mjs +0 -56
  169. package/esm2022/lib/services/pli-cnf-survey-document.service.mjs +0 -37
  170. package/esm2022/lib/services/pli-cnf-survey-pdf.service.mjs +0 -34
  171. package/esm2022/lib/services/pli-cnf-survey.service.mjs +0 -46
  172. package/esm2022/lib/services/pli-cnf-task-group.service.mjs +0 -33
  173. package/esm2022/lib/services/pli-cnf-text-category.service.mjs +0 -38
  174. package/esm2022/lib/services/pli-cnf-text-option.service.mjs +0 -39
  175. package/esm2022/lib/services/pli-cnf-text.service.mjs +0 -62
  176. package/esm2022/lib/services/pli-cnf-type-text.service.mjs +0 -45
  177. package/esm2022/lib/services/pli-cnf-university-article.service.mjs +0 -39
  178. package/esm2022/lib/services/pli-cnf-user-calendar.service.mjs +0 -36
  179. package/esm2022/lib/services/pli-cnf-user-workspace.service.mjs +0 -35
  180. package/esm2022/lib/services/pli-cnf-valpro-keys.service.mjs +0 -35
  181. package/esm2022/lib/services/pli-cnf-workspace-segmentation.service.mjs +0 -31
  182. package/esm2022/lib/services/pli-message-type.service.mjs +0 -40
  183. package/esm2022/lib/services/pli-multiple-value-filter.service.mjs +0 -39
  184. package/esm2022/lib/services/pli-promocion-username.service.mjs +0 -57
  185. package/esm2022/lib/services/pli-seg-action-user.service.mjs +0 -37
  186. package/esm2022/lib/services/pli-segmentation.service.mjs +0 -130
  187. package/esm2022/lib/services/pli-tag-assignment.service.mjs +0 -36
  188. package/esm2022/lib/services/pli-tag.service.mjs +0 -55
  189. package/esm2022/lib/services/pli-user.service.mjs +0 -51
  190. package/esm2022/lib/services/plis-beneficiario.service.mjs +0 -29
  191. package/esm2022/lib/services/plis-estatus-change.service.mjs +0 -30
  192. package/esm2022/lib/services/post-selection.service.mjs +0 -25
  193. package/esm2022/lib/services/ppp.service.mjs +0 -360
  194. package/esm2022/lib/services/profile.service.mjs +0 -60
  195. package/esm2022/lib/services/progress-bar.service.mjs +0 -40
  196. package/esm2022/lib/services/promotion-score.service.mjs +0 -44
  197. package/esm2022/lib/services/registry-identifier.service.mjs +0 -49
  198. package/esm2022/lib/services/return-refund.service.mjs +0 -53
  199. package/esm2022/lib/services/segmentation-tokens.service.mjs +0 -43
  200. package/esm2022/lib/services/segmentation-user-service.service.mjs +0 -94
  201. package/esm2022/lib/services/segmentation.service.mjs +0 -31
  202. package/esm2022/lib/services/send-application.service.mjs +0 -484
  203. package/esm2022/lib/services/sesion-form.service.mjs +0 -31
  204. package/esm2022/lib/services/sesion.service.mjs +0 -48
  205. package/esm2022/lib/services/spinner.service.mjs +0 -16
  206. package/esm2022/lib/services/sponsorship-letter.service.mjs +0 -68
  207. package/esm2022/lib/services/status.service.mjs +0 -104
  208. package/esm2022/lib/services/summary-budget.service.mjs +0 -24
  209. package/esm2022/lib/services/survey-metadata.service.mjs +0 -28
  210. package/esm2022/lib/services/survey-queue.service.mjs +0 -24
  211. package/esm2022/lib/services/survey.service.mjs +0 -52
  212. package/esm2022/lib/services/tag-management.service.mjs +0 -58
  213. package/esm2022/lib/services/tasa.cambio.service.mjs +0 -35
  214. package/esm2022/lib/services/token-transformation.service.mjs +0 -62
  215. package/esm2022/lib/services/token.service.mjs +0 -1439
  216. package/esm2022/lib/services/university.service.mjs +0 -50
  217. package/esm2022/lib/services/upload-documents.service.mjs +0 -60
  218. package/esm2022/lib/services/user.service.mjs +0 -28
  219. package/esm2022/lib/services/visualization-committee.service.mjs +0 -91
  220. package/esm2022/lib/utils/custom-validator.mjs +0 -95
  221. package/esm2022/lib/utils/form-util.mjs +0 -35
  222. package/esm2022/lib/utils/formio-util.mjs +0 -582
  223. package/esm2022/lib/utils/version-commons.mjs +0 -10
  224. package/esm2022/ng-pli-commons.mjs +0 -5
  225. package/esm2022/public-api.mjs +0 -226
  226. package/esm2022/version.mjs +0 -29
@@ -1,484 +0,0 @@
1
- import { Injectable, Inject } from '@angular/core';
2
- import { BehaviorSubject } from 'rxjs';
3
- import { SendApplication, ETipoPresupuesto, EBudgetBuildType, EBudgetError, Document, EDocumentState, Email, InteractionApplicationUser, ETypeStaticInteraction, AuthenticationUtil, ECnfPageSection } from 'ng-pli-util';
4
- import { FormioUtil } from '../utils/formio-util';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./token.service";
7
- import * as i2 from "./email.service";
8
- import * as i3 from "./interaction-application-user.service";
9
- export class SendApplicationService {
10
- constructor(environment, tokenService, emailService, interactionApplicationUserService) {
11
- this.environment = environment;
12
- this.tokenService = tokenService;
13
- this.emailService = emailService;
14
- this.interactionApplicationUserService = interactionApplicationUserService;
15
- /** This observable allows to get the porcentage */
16
- this.percentageSubject = new BehaviorSubject(0);
17
- }
18
- /** It has an observable to notify if the percentage is changed */
19
- onChangePercentage() {
20
- return this.percentageSubject.asObservable();
21
- }
22
- /** it defines the value for percentage */
23
- setPercentage(current, total) {
24
- if (current && total) {
25
- const percentage = (current / total) * 100;
26
- this.percentageSubject.next(percentage);
27
- }
28
- else {
29
- this.resetPercentage();
30
- }
31
- }
32
- /** it resets the percentage */
33
- resetPercentage() {
34
- this.percentageSubject.next(0);
35
- }
36
- /**
37
- * It send email masively
38
- * @param application
39
- * @param i current idnex
40
- * @param length length
41
- * @param sendApplication
42
- */
43
- sendEmailMassively(application) {
44
- let email = new Email();
45
- email.addTo('pruebaconvo@ben.colfuturo.org');
46
- // uncomment when the environment
47
- email.setSubject('Envío de solicitud ' + application.id);
48
- email.setBody('Cordial saludo, <br/>Hemos enviado la solicitud ' + application.id);
49
- return this.emailService.send(email);
50
- }
51
- /** Send email application */
52
- sendEmail(application) {
53
- let email = new Email();
54
- email.addTo('pruebaconvo@ben.colfuturo.org');
55
- // uncomment when the environment
56
- email.setSubject('Envío de solicitud ' + application.id);
57
- email.setBody('Cordial saludo, <br/>Has enviado la solicitud ' + application.id);
58
- return this.emailService.send(email);
59
- }
60
- /** It saves the interaction */
61
- saveInteraction(applicationId, promCodigo, pliCnfStatusFlowInteraction, observation) {
62
- let interactionAppUser = new InteractionApplicationUser();
63
- interactionAppUser.applicationId = applicationId;
64
- interactionAppUser.promCodigo = promCodigo;
65
- if (pliCnfStatusFlowInteraction.pliCnfInteraction &&
66
- pliCnfStatusFlowInteraction.pliCnfInteraction.id)
67
- interactionAppUser.pliCnfInteractionId =
68
- pliCnfStatusFlowInteraction.pliCnfInteraction.id;
69
- if (pliCnfStatusFlowInteraction.pliCnfStatusFlow &&
70
- pliCnfStatusFlowInteraction.pliCnfStatusFlow.id)
71
- interactionAppUser.pliCnfStatusFlowId = pliCnfStatusFlowInteraction.pliCnfStatusFlow.id;
72
- if (pliCnfStatusFlowInteraction.id)
73
- interactionAppUser.pliCnfStatusFlowInteractionId = pliCnfStatusFlowInteraction.id;
74
- interactionAppUser.interactionStaticId = ETypeStaticInteraction.SEND_APPLICATION;
75
- interactionAppUser.pliUserId = AuthenticationUtil.getPliUsuario()
76
- ? AuthenticationUtil.getPliUsuario().usuCodigo
77
- : null;
78
- interactionAppUser.positive = true;
79
- interactionAppUser.observation = observation ? observation : 'Envío de solicitud';
80
- return this.interactionApplicationUserService.save(interactionAppUser);
81
- }
82
- /**
83
- * It validates the data
84
- * @param listApplication
85
- * @param listForm
86
- * @param listDataForm
87
- * @param listBudgetSetting
88
- * @param listBudget
89
- * @param listConfigurationDocument
90
- * @param listDocument
91
- * @param validateJustRequired eg. when the screern require get just require documents (send application)
92
- */
93
- validate(listTotalStatus, listApplication, listForm, listDataForm, listBudgetSetting, listBudget, listConfigurationDocument, listDocument, callback, validateJustRequired, validateSummarizedBudget) {
94
- let listSendApplication = [];
95
- // reset percentage
96
- // this.resetPercentage();
97
- if (listApplication && listApplication.length > 0) {
98
- // iterate over listApplication
99
- for (let i = 0; i < listApplication.length; i++) {
100
- // define application
101
- const application = listApplication[i];
102
- // create send application object
103
- let sendApplication = new SendApplication();
104
- // define applicationId
105
- sendApplication.applicationId = application.id;
106
- let currentStatus = [];
107
- if (listTotalStatus &&
108
- listTotalStatus.length &&
109
- application.stateId &&
110
- listForm &&
111
- listForm.length)
112
- // get the list page section according to statusId
113
- for (const status of listTotalStatus)
114
- if (status.id == application.stateId) {
115
- currentStatus = status;
116
- break;
117
- }
118
- // define the listForm that can be valdiated according to status
119
- const listFormActivated = this.getListFormsByStatus(currentStatus, listForm);
120
- // get validated list form
121
- sendApplication.listValidatedForm = this.getValidatedFormList(listFormActivated, listDataForm, sendApplication.applicationId);
122
- // get validated list budget
123
- if (!validateSummarizedBudget) {
124
- sendApplication.listValidatedBudget = this.getValidatedBudget(listBudgetSetting, listBudget, sendApplication.applicationId, currentStatus);
125
- }
126
- else {
127
- sendApplication.listValidatedBudget = this.getValidatedBudgetSummarized(listBudgetSetting, listBudget, sendApplication.applicationId, currentStatus);
128
- }
129
- // get validated list document
130
- sendApplication.listValidatedDocument = this.getValidatedDocument(currentStatus, listConfigurationDocument, listDocument, application, listDataForm, validateJustRequired);
131
- // resolve validation - no listValidatedDoc - listValidatedBudget - listValidatedForm
132
- sendApplication.validation =
133
- !sendApplication.listValidatedDocument.length &&
134
- !sendApplication.listValidatedBudget.length &&
135
- !sendApplication.listValidatedForm.length;
136
- // add to array
137
- listSendApplication.push(sendApplication);
138
- // call callback
139
- if (callback)
140
- callback(sendApplication, application, i, listApplication.length);
141
- }
142
- }
143
- return listSendApplication;
144
- }
145
- /** it returns the forms that are activated according to status */
146
- getListFormsByStatus(currentStatus, listForm) {
147
- let listActivatedForm = [];
148
- let listPliCnfStatusPageSection = currentStatus.listPliCnfStatusPageSection;
149
- if (listPliCnfStatusPageSection && listPliCnfStatusPageSection.length)
150
- // fill the list activated form
151
- for (const form of listForm)
152
- for (const section of listPliCnfStatusPageSection)
153
- if (section.idForm == form.id) {
154
- listActivatedForm.push(form);
155
- break;
156
- }
157
- return listActivatedForm;
158
- }
159
- /** it returns the validated document list */
160
- getValidatedDocument(currentStatus, listConfigurationDocument, listDocument, application, listDataForm, validateJustRequired) {
161
- let listValidatedDocument = [];
162
- if (listConfigurationDocument) {
163
- // it contains the documents that are visible
164
- let listConfigurationDocumentVisible = [];
165
- //checkIfShouldValidate
166
- let shouldValidateDocuments = false;
167
- let listPliCnfStatusPageSection = currentStatus.listPliCnfStatusPageSection;
168
- if (listPliCnfStatusPageSection && listPliCnfStatusPageSection.length)
169
- for (const section of listPliCnfStatusPageSection)
170
- if (section.pliCnfPageSection)
171
- switch (section.pliCnfPageSection.keyLabel) {
172
- case 'documentos': {
173
- shouldValidateDocuments = true;
174
- break;
175
- }
176
- }
177
- if (!shouldValidateDocuments)
178
- return listValidatedDocument;
179
- // resolve the configuration that is visible
180
- if (listConfigurationDocument) {
181
- for (const configurationDocument of listConfigurationDocument) {
182
- let visible = true;
183
- if (configurationDocument.formula && configurationDocument.formula.length) {
184
- let formula = '';
185
- try {
186
- let data = { statusname: application.stateName };
187
- if (listDataForm)
188
- for (const dataForm of listDataForm)
189
- for (const property in dataForm.data)
190
- data[property.toLowerCase()] = dataForm.data[property];
191
- formula = this.tokenService.replaceTokensFromListObject(configurationDocument.name, configurationDocument.formula, data);
192
- let result = eval(formula);
193
- if (result !== true) {
194
- visible = false;
195
- }
196
- }
197
- catch (error) {
198
- visible = false;
199
- }
200
- }
201
- if (visible) {
202
- listConfigurationDocumentVisible.push(configurationDocument);
203
- }
204
- }
205
- }
206
- // resolve the list of documents
207
- if (listConfigurationDocumentVisible) {
208
- for (let i = 0; i < listConfigurationDocumentVisible.length; i++) {
209
- let configurationDocument = listConfigurationDocumentVisible[i];
210
- let document = this.getDocumentByConfigurationId(configurationDocument.id, listDocument, application.id);
211
- if (validateJustRequired) {
212
- if ((!document ||
213
- (document && document.listArchive.length == 0) ||
214
- this.automaticDocumentsValidated(configurationDocument, listDataForm, document)) &&
215
- configurationDocument.required) {
216
- this.fillListValidateDocumentDefault(listValidatedDocument, application, configurationDocument);
217
- }
218
- }
219
- else {
220
- if (document) {
221
- if (document.state == EDocumentState.PENDIENTE) {
222
- listValidatedDocument.push(document);
223
- }
224
- }
225
- else {
226
- this.fillListValidateDocumentDefault(listValidatedDocument, application, configurationDocument);
227
- }
228
- }
229
- }
230
- }
231
- }
232
- return listValidatedDocument;
233
- }
234
- fillListValidateDocumentDefault(listValidatedDocument, application, configurationDocument) {
235
- let document = new Document();
236
- document.applicationId = application.id;
237
- document.promCodigo = configurationDocument.promCodigo;
238
- document.state = EDocumentState.PENDIENTE;
239
- document.configurationDocumentId = configurationDocument.id;
240
- document.listArchive = [];
241
- listValidatedDocument.push(document);
242
- }
243
- /** It gets document by configuration Id */
244
- getDocumentByConfigurationId(configurationDocumentId, list, applicationId) {
245
- if (list)
246
- for (const document of list)
247
- if (document.configurationDocumentId === configurationDocumentId &&
248
- document.applicationId === applicationId)
249
- return document;
250
- return null;
251
- }
252
- /** get the budget application by type budget and budget setup id */
253
- getValidatedBudgetApplication(budgetSetting, typeBudget, listBudget, applicationId) {
254
- if (listBudget)
255
- for (const budget of listBudget)
256
- if (budget.tag == typeBudget &&
257
- budgetSetting.cpreCodigo == budget.budgetSetupId &&
258
- budget.applicationId == applicationId) {
259
- return this.validateBudget(budget, budgetSetting, typeBudget);
260
- }
261
- return this.validateBudget(null, budgetSetting, typeBudget);
262
- }
263
- /** It validates the budget */
264
- validateBudget(budget, budgetSetting, type) {
265
- if (!budget || !budget.summary || !budget.summary.budgetTotal)
266
- // validate if there is a budget object
267
- return {
268
- budget: budget,
269
- type: type,
270
- budgetSetting: budgetSetting,
271
- error: EBudgetError.NO_OBJECT
272
- };
273
- else if ((type === EBudgetBuildType.financing || type === EBudgetBuildType.mixed) &&
274
- budget.summary.budgetTotal > budgetSetting.cpreMontoTotal)
275
- // validate if amount total overcomes the maximum
276
- return {
277
- budget: budget,
278
- type: type,
279
- budgetSetting: budgetSetting,
280
- error: EBudgetError.OVERCOME_MAXIMUM_AMOUNT
281
- };
282
- else if (type === EBudgetBuildType.financing &&
283
- (!budget.financingStart || !budget.financingEnd))
284
- // validate if financing dates are defined
285
- return {
286
- budget: budget,
287
- type: type,
288
- budgetSetting: budgetSetting,
289
- error: EBudgetError.FINANCING_DATES
290
- };
291
- return null;
292
- }
293
- validateSummarizedBudget(budgetSetting, type, budget) {
294
- if (!budget || !budget.summary || !budget.summary.budgetTotal) {
295
- // validate if there is a budget object
296
- return {
297
- budget: budget,
298
- type: type,
299
- budgetSetting: budgetSetting,
300
- error: EBudgetError.NO_OBJECT
301
- };
302
- }
303
- return null;
304
- }
305
- validateCompleteBudget(listBudgetSetting, listBudget, applicationId) {
306
- return this.getValidatedBudget(listBudgetSetting, listBudget, applicationId);
307
- }
308
- /** it returns the validated budget list */
309
- getValidatedBudget(listBudgetSetting, listBudget, applicationId, currentStatus) {
310
- let listValidatedBudget = [];
311
- if (listBudgetSetting) {
312
- let shouldValidateTotalBudget = false;
313
- let shouldValidateFinancingBudget = false;
314
- if (currentStatus) {
315
- let listPliCnfStatusPageSection = currentStatus.listPliCnfStatusPageSection;
316
- if (listPliCnfStatusPageSection && listPliCnfStatusPageSection.length)
317
- for (const section of listPliCnfStatusPageSection)
318
- if (section.pliCnfPageSection)
319
- switch (section.pliCnfPageSection.keyLabel) {
320
- case 'presupuesto.total': {
321
- shouldValidateTotalBudget = true;
322
- break;
323
- }
324
- case 'presupuesto.financiacion': {
325
- shouldValidateFinancingBudget = true;
326
- break;
327
- }
328
- }
329
- }
330
- else {
331
- shouldValidateTotalBudget = true;
332
- shouldValidateFinancingBudget = true;
333
- }
334
- // iterate over listBudgetSetting
335
- for (const budgetSetting of listBudgetSetting) {
336
- // skip general budget
337
- if (budgetSetting.pliTipoPresupuesto.tpresCodigo == ETipoPresupuesto.GENERAL)
338
- continue;
339
- // budget total
340
- const budgetDataTotal = this.getValidatedBudgetApplication(budgetSetting, EBudgetBuildType.total, listBudget, applicationId);
341
- if (budgetDataTotal && shouldValidateTotalBudget)
342
- listValidatedBudget.push(budgetDataTotal);
343
- // if it has own funds, so it validates total and financing
344
- if (budgetSetting.cpreEsFondosPropios) {
345
- const budgetDataFinancing = this.getValidatedBudgetApplication(budgetSetting, EBudgetBuildType.financing, listBudget, applicationId);
346
- if (budgetDataFinancing && shouldValidateFinancingBudget)
347
- listValidatedBudget.push(budgetDataFinancing);
348
- }
349
- }
350
- }
351
- return listValidatedBudget;
352
- }
353
- /** It returns the validated form list */
354
- getValidatedFormList(listForm, listDataForm, applicationId) {
355
- let listValidatedForm = [];
356
- if (listForm) {
357
- // iterate over listform
358
- for (const form of listForm) {
359
- // get errors by formId and ApplicationId
360
- const errors = this.getErrorsByFormIdAndApplicationId(listDataForm, form.id, applicationId);
361
- if (errors && errors.length) {
362
- const components = FormioUtil.getComponents(form.components);
363
- // generate the error components according to errors
364
- let errorComponent = [];
365
- for (const error of errors) {
366
- if (error && error.component && error.component.key && components) {
367
- for (const component of components) {
368
- if (component.key == error.component.key) {
369
- errorComponent.push(component);
370
- break;
371
- }
372
- }
373
- }
374
- }
375
- if (errorComponent && errorComponent.length) {
376
- // organizing by panels
377
- const panels = FormioUtil.getFormattedComponentsByPanel(errorComponent);
378
- // add to listValidatedForm
379
- listValidatedForm.push({
380
- id: form.id,
381
- name: form.title,
382
- panels: panels,
383
- toggle: false
384
- });
385
- }
386
- }
387
- else {
388
- // verify if data is completed
389
- // get data by form id and app id
390
- const data = this.getDataByFormIdAndApplicationId(listDataForm, form.id, applicationId);
391
- // get components are required according to data
392
- const components = FormioUtil.getRequiredComponentsByData(form.components, data);
393
- if (components && components.length) {
394
- // organizing by panels
395
- const panels = FormioUtil.getFormattedComponentsByPanel(components);
396
- // add to listValidatedForm
397
- listValidatedForm.push({
398
- id: form.id,
399
- name: form.title,
400
- panels: panels,
401
- toggle: false
402
- });
403
- }
404
- }
405
- }
406
- }
407
- return listValidatedForm;
408
- }
409
- /** It returns the data by formId and ApplicationId */
410
- getErrorsByFormIdAndApplicationId(listDataForm, formId, applicationId) {
411
- if (listDataForm && formId && applicationId)
412
- for (const data of listDataForm)
413
- if (data.formId == formId && data.applicationId == applicationId)
414
- return data.errors;
415
- return null;
416
- }
417
- /** It returns the data by formId and ApplicationId */
418
- getDataByFormIdAndApplicationId(listDataForm, formId, applicationId) {
419
- if (listDataForm && formId && applicationId)
420
- for (const data of listDataForm)
421
- if (data.formId == formId && data.applicationId == applicationId)
422
- return data.data;
423
- return null;
424
- }
425
- getValidatedBudgetSummarized(listBudgetSetting, listBudget, applicationId, currentStatus) {
426
- let listValidatedBudget = [];
427
- if (listBudgetSetting) {
428
- let shouldValidateTotalBudget = false;
429
- if (currentStatus) {
430
- let listPliCnfStatusPageSection = currentStatus.listPliCnfStatusPageSection;
431
- if (listPliCnfStatusPageSection && listPliCnfStatusPageSection.length)
432
- for (const section of listPliCnfStatusPageSection)
433
- if (section.pliCnfPageSection)
434
- switch (section.pliCnfPageSection.keyLabel) {
435
- case ECnfPageSection.presupuestoResumido: {
436
- shouldValidateTotalBudget = true;
437
- break;
438
- }
439
- }
440
- }
441
- else {
442
- shouldValidateTotalBudget = true;
443
- }
444
- const budgetDataTotal = this.validateSummarizedBudget(listBudgetSetting[0], EBudgetBuildType.total, listBudget[0]);
445
- if (budgetDataTotal && shouldValidateTotalBudget)
446
- listValidatedBudget.push(budgetDataTotal);
447
- }
448
- return listValidatedBudget;
449
- }
450
- automaticDocumentsValidated(configDocument, listDataForm, document) {
451
- if (configDocument.formulaValidateMultiple &&
452
- configDocument.formulaValidateMultiple.length > 0) {
453
- let data = { statusname: '' };
454
- if (listDataForm)
455
- for (const dataForm of listDataForm)
456
- for (const property in dataForm.data)
457
- data[property.toLowerCase()] = dataForm.data[property];
458
- let formula = this.tokenService.replaceTokensFromListObject(configDocument.name, configDocument.formulaValidateMultiple, data);
459
- let result = eval(formula);
460
- if (result) {
461
- let resultArray = JSON.parse(result);
462
- if (resultArray && resultArray.length > 0) {
463
- //Then document must have archives
464
- if (!document || document.listArchive.length !== resultArray.length) {
465
- return true;
466
- }
467
- }
468
- }
469
- }
470
- return false;
471
- }
472
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SendApplicationService, deps: [{ token: 'environment' }, { token: i1.TokenService }, { token: i2.EmailService }, { token: i3.InteractionApplicationUserService }], target: i0.ɵɵFactoryTarget.Injectable }); }
473
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SendApplicationService, providedIn: 'root' }); }
474
- }
475
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SendApplicationService, decorators: [{
476
- type: Injectable,
477
- args: [{
478
- providedIn: 'root'
479
- }]
480
- }], ctorParameters: () => [{ type: undefined, decorators: [{
481
- type: Inject,
482
- args: ['environment']
483
- }] }, { type: i1.TokenService }, { type: i2.EmailService }, { type: i3.InteractionApplicationUserService }] });
484
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC1hcHBsaWNhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcGxpLWNvbW1vbnMvc3JjL2xpYi9zZXJ2aWNlcy9zZW5kLWFwcGxpY2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUluRCxPQUFPLEVBSU4sZUFBZSxFQUNmLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLFFBQVEsRUFDUixjQUFjLEVBQ2QsS0FBSyxFQUNMLDBCQUEwQixFQUUxQixzQkFBc0IsRUFHdEIsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7O0FBS2xELE1BQU0sT0FBTyxzQkFBc0I7SUFJbEMsWUFDZ0MsV0FBVyxFQUNsQyxZQUEwQixFQUMxQixZQUEwQixFQUMxQixpQ0FBb0U7UUFIN0MsZ0JBQVcsR0FBWCxXQUFXLENBQUE7UUFDbEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsc0NBQWlDLEdBQWpDLGlDQUFpQyxDQUFtQztRQVA3RSxtREFBbUQ7UUFDM0Msc0JBQWlCLEdBQUcsSUFBSSxlQUFlLENBQVMsQ0FBQyxDQUFDLENBQUM7SUFPeEQsQ0FBQztJQUVKLG1FQUFtRTtJQUM1RCxrQkFBa0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVELDBDQUEwQztJQUNuQyxhQUFhLENBQUMsT0FBZSxFQUFFLEtBQWE7UUFDbEQsSUFBSSxPQUFPLElBQUksS0FBSyxFQUFF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Q0FBQyxNQUFNLENBQUMsQ0FBQztnQkFFckMsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDM0Msa0NBQWtDO29CQUNsQyxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQzt3QkFDckUsT0FBTyxJQUFJLENBQUM7b0JBQ2IsQ0FBQztnQkFDRixDQUFDO1lBQ0YsQ0FBQztRQUNGLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7K0dBMW5CVyxzQkFBc0Isa0JBS3pCLGFBQWE7bUhBTFYsc0JBQXNCLGNBRnRCLE1BQU07OzRGQUVOLHNCQUFzQjtrQkFIbEMsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEI7OzBCQU1FLE1BQU07MkJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVG9rZW5TZXJ2aWNlIH0gZnJvbSAnLi90b2tlbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW1haWxTZXJ2aWNlIH0gZnJvbSAnLi9lbWFpbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSW50ZXJhY3Rpb25BcHBsaWNhdGlvblVzZXJTZXJ2aWNlIH0gZnJvbSAnLi9pbnRlcmFjdGlvbi1hcHBsaWNhdGlvbi11c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG5cdEFwcGxpY2F0aW9uLFxyXG5cdEJ1ZGdldERhdGEsXHJcblx0Q29uZmlndXJhdGlvbkRvY3VtZW50LFxyXG5cdFNlbmRBcHBsaWNhdGlvbixcclxuXHRFVGlwb1ByZXN1cHVlc3RvLFxyXG5cdEVCdWRnZXRCdWlsZFR5cGUsXHJcblx0RUJ1ZGdldEVycm9yLFxyXG5cdERvY3VtZW50LFxyXG5cdEVEb2N1bWVudFN0YXRlLFxyXG5cdEVtYWlsLFxyXG5cdEludGVyYWN0aW9uQXBwbGljYXRpb25Vc2VyLFxyXG5cdFBsaUNuZlN0YXR1c0Zsb3dJbnRlcmFjdGlvbixcclxuXHRFVHlwZVN0YXRpY0ludGVyYWN0aW9uLFxyXG5cdFBsaUNuZlN0YXR1cyxcclxuXHRQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbixcclxuXHRBdXRoZW50aWNhdGlvblV0aWwsXHJcblx0RUNuZlBhZ2VTZWN0aW9uXHJcbn0gZnJvbSAnbmctcGxpLXV0aWwnO1xyXG5pbXBvcnQgeyBGb3JtaW9VdGlsIH0gZnJvbSAnLi4vdXRpbHMvZm9ybWlvLXV0aWwnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG5cdHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2VuZEFwcGxpY2F0aW9uU2VydmljZSB7XHJcblx0LyoqIFRoaXMgb2JzZXJ2YWJsZSBhbGxvd3MgdG8gZ2V0IHRoZSBwb3JjZW50YWdlICovXHJcblx0cHJpdmF0ZSBwZXJjZW50YWdlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRASW5qZWN0KCdlbnZpcm9ubWVudCcpIHByaXZhdGUgZW52aXJvbm1lbnQsXHJcblx0XHRwcml2YXRlIHRva2VuU2VydmljZTogVG9rZW5TZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBlbWFpbFNlcnZpY2U6IEVtYWlsU2VydmljZSxcclxuXHRcdHByaXZhdGUgaW50ZXJhY3Rpb25BcHBsaWNhdGlvblVzZXJTZXJ2aWNlOiBJbnRlcmFjdGlvbkFwcGxpY2F0aW9uVXNlclNlcnZpY2VcclxuXHQpIHt9XHJcblxyXG5cdC8qKiAgSXQgaGFzIGFuIG9ic2VydmFibGUgdG8gbm90aWZ5IGlmIHRoZSBwZXJjZW50YWdlIGlzIGNoYW5nZWQgKi9cclxuXHRwdWJsaWMgb25DaGFuZ2VQZXJjZW50YWdlKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XHJcblx0XHRyZXR1cm4gdGhpcy5wZXJjZW50YWdlU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuXHR9XHJcblxyXG5cdC8qKiBpdCBkZWZpbmVzIHRoZSB2YWx1ZSBmb3IgcGVyY2VudGFnZSAqL1xyXG5cdHB1YmxpYyBzZXRQZXJjZW50YWdlKGN1cnJlbnQ6IG51bWJlciwgdG90YWw6IG51bWJlcikge1xyXG5cdFx0aWYgKGN1cnJlbnQgJiYgdG90YWwpIHtcclxuXHRcdFx0Y29uc3QgcGVyY2VudGFnZSA9IChjdXJyZW50IC8gdG90YWwpICogMTAwO1xyXG5cdFx0XHR0aGlzLnBlcmNlbnRhZ2VTdWJqZWN0Lm5leHQocGVyY2VudGFnZSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnJlc2V0UGVyY2VudGFnZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqIGl0IHJlc2V0cyB0aGUgcGVyY2VudGFnZSAqL1xyXG5cdHB1YmxpYyByZXNldFBlcmNlbnRhZ2UoKSB7XHJcblx0XHR0aGlzLnBlcmNlbnRhZ2VTdWJqZWN0Lm5leHQoMCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCBzZW5kIGVtYWlsIG1hc2l2ZWx5XHJcblx0ICogQHBhcmFtIGFwcGxpY2F0aW9uXHJcblx0ICogQHBhcmFtIGkgY3VycmVudCBpZG5leFxyXG5cdCAqIEBwYXJhbSBsZW5ndGggbGVuZ3RoXHJcblx0ICogQHBhcmFtIHNlbmRBcHBsaWNhdGlvblxyXG5cdCAqL1xyXG5cdHNlbmRFbWFpbE1hc3NpdmVseShhcHBsaWNhdGlvbjogQXBwbGljYXRpb24pIHtcclxuXHRcdGxldCBlbWFpbDogRW1haWwgPSBuZXcgRW1haWwoKTtcclxuXHRcdGVtYWlsLmFkZFRvKCdwcnVlYmFjb252b0BiZW4uY29sZnV0dXJvLm9yZycpO1xyXG5cdFx0Ly8gdW5jb21tZW50IHdoZW4gdGhlIGVudmlyb25tZW50XHJcblx0XHRlbWFpbC5zZXRTdWJqZWN0KCdFbnbDrW8gZGUgc29saWNpdHVkICcgKyBhcHBsaWNhdGlvbi5pZCk7XHJcblx0XHRlbWFpbC5zZXRCb2R5KCdDb3JkaWFsIHNhbHVkbywgPGJyLz5IZW1vcyBlbnZpYWRvIGxhIHNvbGljaXR1ZCAnICsgYXBwbGljYXRpb24uaWQpO1xyXG5cdFx0cmV0dXJuIHRoaXMuZW1haWxTZXJ2aWNlLnNlbmQoZW1haWwpO1xyXG5cdH1cclxuXHJcblx0LyoqIFNlbmQgZW1haWwgYXBwbGljYXRpb24gKi9cclxuXHRzZW5kRW1haWwoYXBwbGljYXRpb246IEFwcGxpY2F0aW9uKSB7XHJcblx0XHRsZXQgZW1haWw6IEVtYWlsID0gbmV3IEVtYWlsKCk7XHJcblx0XHRlbWFpbC5hZGRUbygncHJ1ZWJhY29udm9AYmVuLmNvbGZ1dHVyby5vcmcnKTtcclxuXHRcdC8vIHVuY29tbWVudCB3aGVuIHRoZSBlbnZpcm9ubWVudFxyXG5cdFx0ZW1haWwuc2V0U3ViamVjdCgnRW52w61vIGRlIHNvbGljaXR1ZCAnICsgYXBwbGljYXRpb24uaWQpO1xyXG5cdFx0ZW1haWwuc2V0Qm9keSgnQ29yZGlhbCBzYWx1ZG8sIDxici8+SGFzIGVudmlhZG8gbGEgc29saWNpdHVkICcgKyBhcHBsaWNhdGlvbi5pZCk7XHJcblx0XHRyZXR1cm4gdGhpcy5lbWFpbFNlcnZpY2Uuc2VuZChlbWFpbCk7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgc2F2ZXMgdGhlIGludGVyYWN0aW9uICovXHJcblx0c2F2ZUludGVyYWN0aW9uKFxyXG5cdFx0YXBwbGljYXRpb25JZDogc3RyaW5nLFxyXG5cdFx0cHJvbUNvZGlnbzogbnVtYmVyLFxyXG5cdFx0cGxpQ25mU3RhdHVzRmxvd0ludGVyYWN0aW9uOiBQbGlDbmZTdGF0dXNGbG93SW50ZXJhY3Rpb24sXHJcblx0XHRvYnNlcnZhdGlvbj86IHN0cmluZ1xyXG5cdCk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRsZXQgaW50ZXJhY3Rpb25BcHBVc2VyOiBJbnRlcmFjdGlvbkFwcGxpY2F0aW9uVXNlciA9IG5ldyBJbnRlcmFjdGlvbkFwcGxpY2F0aW9uVXNlcigpO1xyXG5cdFx0aW50ZXJhY3Rpb25BcHBVc2VyLmFwcGxpY2F0aW9uSWQgPSBhcHBsaWNhdGlvbklkO1xyXG5cdFx0aW50ZXJhY3Rpb25BcHBVc2VyLnByb21Db2RpZ28gPSBwcm9tQ29kaWdvO1xyXG5cclxuXHRcdGlmIChcclxuXHRcdFx0cGxpQ25mU3RhdHVzRmxvd0ludGVyYWN0aW9uLnBsaUNuZkludGVyYWN0aW9uICYmXHJcblx0XHRcdHBsaUNuZlN0YXR1c0Zsb3dJbnRlcmFjdGlvbi5wbGlDbmZJbnRlcmFjdGlvbi5pZFxyXG5cdFx0KVxyXG5cdFx0XHRpbnRlcmFjdGlvbkFwcFVzZXIucGxpQ25mSW50ZXJhY3Rpb25JZCA9XHJcblx0XHRcdFx0cGxpQ25mU3RhdHVzRmxvd0ludGVyYWN0aW9uLnBsaUNuZkludGVyYWN0aW9uLmlkO1xyXG5cdFx0aWYgKFxyXG5cdFx0XHRwbGlDbmZTdGF0dXNGbG93SW50ZXJhY3Rpb24ucGxpQ25mU3RhdHVzRmxvdyAmJlxyXG5cdFx0XHRwbGlDbmZTdGF0dXNGbG93SW50ZXJhY3Rpb24ucGxpQ25mU3RhdHVzRmxvdy5pZFxyXG5cdFx0KVxyXG5cdFx0XHRpbnRlcmFjdGlvbkFwcFVzZXIucGxpQ25mU3RhdHVzRmxvd0lkID0gcGxpQ25mU3RhdHVzRmxvd0ludGVyYWN0aW9uLnBsaUNuZlN0YXR1c0Zsb3cuaWQ7XHJcblx0XHRpZiAocGxpQ25mU3RhdHVzRmxvd0ludGVyYWN0aW9uLmlkKVxyXG5cdFx0XHRpbnRlcmFjdGlvbkFwcFVzZXIucGxpQ25mU3RhdHVzRmxvd0ludGVyYWN0aW9uSWQgPSBwbGlDbmZTdGF0dXNGbG93SW50ZXJhY3Rpb24uaWQ7XHJcblxyXG5cdFx0aW50ZXJhY3Rpb25BcHBVc2VyLmludGVyYWN0aW9uU3RhdGljSWQgPSBFVHlwZVN0YXRpY0ludGVyYWN0aW9uLlNFTkRfQVBQTElDQVRJT047XHJcblx0XHRpbnRlcmFjdGlvbkFwcFVzZXIucGxpVXNlcklkID0gQXV0aGVudGljYXRpb25VdGlsLmdldFBsaVVzdWFyaW8oKVxyXG5cdFx0XHQ/IEF1dGhlbnRpY2F0aW9uVXRpbC5nZXRQbGlVc3VhcmlvKCkudXN1Q29kaWdvXHJcblx0XHRcdDogbnVsbDtcclxuXHRcdGludGVyYWN0aW9uQXBwVXNlci5wb3NpdGl2ZSA9IHRydWU7XHJcblx0XHRpbnRlcmFjdGlvbkFwcFVzZXIub2JzZXJ2YXRpb24gPSBvYnNlcnZhdGlvbiA/IG9ic2VydmF0aW9uIDogJ0VudsOtbyBkZSBzb2xpY2l0dWQnO1xyXG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJhY3Rpb25BcHBsaWNhdGlvblVzZXJTZXJ2aWNlLnNhdmUoaW50ZXJhY3Rpb25BcHBVc2VyKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHZhbGlkYXRlcyB0aGUgZGF0YVxyXG5cdCAqIEBwYXJhbSBsaXN0QXBwbGljYXRpb25cclxuXHQgKiBAcGFyYW0gbGlzdEZvcm1cclxuXHQgKiBAcGFyYW0gbGlzdERhdGFGb3JtXHJcblx0ICogQHBhcmFtIGxpc3RCdWRnZXRTZXR0aW5nXHJcblx0ICogQHBhcmFtIGxpc3RCdWRnZXRcclxuXHQgKiBAcGFyYW0gbGlzdENvbmZpZ3VyYXRpb25Eb2N1bWVudFxyXG5cdCAqIEBwYXJhbSBsaXN0RG9jdW1lbnRcclxuXHQgKiBAcGFyYW0gdmFsaWRhdGVKdXN0UmVxdWlyZWQgZWcuIHdoZW4gdGhlIHNjcmVlcm4gcmVxdWlyZSBnZXQganVzdCByZXF1aXJlIGRvY3VtZW50cyAoc2VuZCBhcHBsaWNhdGlvbilcclxuXHQgKi9cclxuXHRwdWJsaWMgdmFsaWRhdGUoXHJcblx0XHRsaXN0VG90YWxTdGF0dXM6IFBsaUNuZlN0YXR1c1tdLFxyXG5cdFx0bGlzdEFwcGxpY2F0aW9uOiBBcHBsaWNhdGlvbltdLFxyXG5cdFx0bGlzdEZvcm06IGFueVtdLFxyXG5cdFx0bGlzdERhdGFGb3JtOiBhbnlbXSxcclxuXHRcdGxpc3RCdWRnZXRTZXR0aW5nOiBhbnlbXSxcclxuXHRcdGxpc3RCdWRnZXQ6IEJ1ZGdldERhdGFbXSxcclxuXHRcdGxpc3RDb25maWd1cmF0aW9uRG9jdW1lbnQ6IENvbmZpZ3VyYXRpb25Eb2N1bWVudFtdLFxyXG5cdFx0bGlzdERvY3VtZW50OiBEb2N1bWVudFtdLFxyXG5cdFx0Y2FsbGJhY2s6IGFueSxcclxuXHRcdHZhbGlkYXRlSnVzdFJlcXVpcmVkOiBib29sZWFuLFxyXG5cdFx0dmFsaWRhdGVTdW1tYXJpemVkQnVkZ2V0PzogYm9vbGVhblxyXG5cdCk6IEFycmF5PFNlbmRBcHBsaWNhdGlvbj4ge1xyXG5cdFx0bGV0IGxpc3RTZW5kQXBwbGljYXRpb246IEFycmF5PFNlbmRBcHBsaWNhdGlvbj4gPSBbXTtcclxuXHRcdC8vIHJlc2V0IHBlcmNlbnRhZ2VcclxuXHRcdC8vIHRoaXMucmVzZXRQZXJjZW50YWdlKCk7XHJcblx0XHRpZiAobGlzdEFwcGxpY2F0aW9uICYmIGxpc3RBcHBsaWNhdGlvbi5sZW5ndGggPiAwKSB7XHJcblx0XHRcdC8vIGl0ZXJhdGUgb3ZlciBsaXN0QXBwbGljYXRpb25cclxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0QXBwbGljYXRpb24ubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHQvLyBkZWZpbmUgYXBwbGljYXRpb25cclxuXHRcdFx0XHRjb25zdCBhcHBsaWNhdGlvbiA9IGxpc3RBcHBsaWNhdGlvbltpXTtcclxuXHRcdFx0XHQvLyBjcmVhdGUgc2VuZCBhcHBsaWNhdGlvbiBvYmplY3RcclxuXHRcdFx0XHRsZXQgc2VuZEFwcGxpY2F0aW9uOiBTZW5kQXBwbGljYXRpb24gPSBuZXcgU2VuZEFwcGxpY2F0aW9uKCk7XHJcblx0XHRcdFx0Ly8gZGVmaW5lIGFwcGxpY2F0aW9uSWRcclxuXHRcdFx0XHRzZW5kQXBwbGljYXRpb24uYXBwbGljYXRpb25JZCA9IGFwcGxpY2F0aW9uLmlkO1xyXG5cclxuXHRcdFx0XHRsZXQgY3VycmVudFN0YXR1czogYW55ID0gW107XHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0bGlzdFRvdGFsU3RhdHVzICYmXHJcblx0XHRcdFx0XHRsaXN0VG90YWxTdGF0dXMubGVuZ3RoICYmXHJcblx0XHRcdFx0XHRhcHBsaWNhdGlvbi5zdGF0ZUlkICYmXHJcblx0XHRcdFx0XHRsaXN0Rm9ybSAmJlxyXG5cdFx0XHRcdFx0bGlzdEZvcm0ubGVuZ3RoXHJcblx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0Ly8gZ2V0IHRoZSBsaXN0IHBhZ2Ugc2VjdGlvbiBhY2NvcmRpbmcgdG8gc3RhdHVzSWRcclxuXHRcdFx0XHRcdGZvciAoY29uc3Qgc3RhdHVzIG9mIGxpc3RUb3RhbFN0YXR1cylcclxuXHRcdFx0XHRcdFx0aWYgKHN0YXR1cy5pZCA9PSBhcHBsaWNhdGlvbi5zdGF0ZUlkKSB7XHJcblx0XHRcdFx0XHRcdFx0Y3VycmVudFN0YXR1cyA9IHN0YXR1cztcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBkZWZpbmUgdGhlIGxpc3RGb3JtIHRoYXQgY2FuIGJlIHZhbGRpYXRlZCBhY2NvcmRpbmcgdG8gc3RhdHVzXHJcblx0XHRcdFx0Y29uc3QgbGlzdEZvcm1BY3RpdmF0ZWQgPSB0aGlzLmdldExpc3RGb3Jtc0J5U3RhdHVzKGN1cnJlbnRTdGF0dXMsIGxpc3RGb3JtKTtcclxuXHRcdFx0XHQvLyBnZXQgdmFsaWRhdGVkIGxpc3QgZm9ybVxyXG5cdFx0XHRcdHNlbmRBcHBsaWNhdGlvbi5saXN0VmFsaWRhdGVkRm9ybSA9IHRoaXMuZ2V0VmFsaWRhdGVkRm9ybUxpc3QoXHJcblx0XHRcdFx0XHRsaXN0Rm9ybUFjdGl2YXRlZCxcclxuXHRcdFx0XHRcdGxpc3REYXRhRm9ybSxcclxuXHRcdFx0XHRcdHNlbmRBcHBsaWNhdGlvbi5hcHBsaWNhdGlvbklkXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0Ly8gZ2V0IHZhbGlkYXRlZCBsaXN0IGJ1ZGdldFxyXG5cdFx0XHRcdGlmICghdmFsaWRhdGVTdW1tYXJpemVkQnVkZ2V0KSB7XHJcblx0XHRcdFx0XHRzZW5kQXBwbGljYXRpb24ubGlzdFZhbGlkYXRlZEJ1ZGdldCA9IHRoaXMuZ2V0VmFsaWRhdGVkQnVkZ2V0KFxyXG5cdFx0XHRcdFx0XHRsaXN0QnVkZ2V0U2V0dGluZyxcclxuXHRcdFx0XHRcdFx0bGlzdEJ1ZGdldCxcclxuXHRcdFx0XHRcdFx0c2VuZEFwcGxpY2F0aW9uLmFwcGxpY2F0aW9uSWQsXHJcblx0XHRcdFx0XHRcdGN1cnJlbnRTdGF0dXNcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHNlbmRBcHBsaWNhdGlvbi5saXN0VmFsaWRhdGVkQnVkZ2V0ID0gdGhpcy5nZXRWYWxpZGF0ZWRCdWRnZXRTdW1tYXJpemVkKFxyXG5cdFx0XHRcdFx0XHRsaXN0QnVkZ2V0U2V0dGluZyxcclxuXHRcdFx0XHRcdFx0bGlzdEJ1ZGdldCxcclxuXHRcdFx0XHRcdFx0c2VuZEFwcGxpY2F0aW9uLmFwcGxpY2F0aW9uSWQsXHJcblx0XHRcdFx0XHRcdGN1cnJlbnRTdGF0dXNcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBnZXQgdmFsaWRhdGVkIGxpc3QgZG9jdW1lbnRcclxuXHRcdFx0XHRzZW5kQXBwbGljYXRpb24ubGlzdFZhbGlkYXRlZERvY3VtZW50ID0gdGhpcy5nZXRWYWxpZGF0ZWREb2N1bWVudChcclxuXHRcdFx0XHRcdGN1cnJlbnRTdGF0dXMsXHJcblx0XHRcdFx0XHRsaXN0Q29uZmlndXJhdGlvbkRvY3VtZW50LFxyXG5cdFx0XHRcdFx0bGlzdERvY3VtZW50LFxyXG5cdFx0XHRcdFx0YXBwbGljYXRpb24sXHJcblx0XHRcdFx0XHRsaXN0RGF0YUZvcm0sXHJcblx0XHRcdFx0XHR2YWxpZGF0ZUp1c3RSZXF1aXJlZFxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdC8vIHJlc29sdmUgdmFsaWRhdGlvbiAtIG5vIGxpc3RWYWxpZGF0ZWREb2MgLSAgbGlzdFZhbGlkYXRlZEJ1ZGdldCAtIGxpc3RWYWxpZGF0ZWRGb3JtXHJcblx0XHRcdFx0c2VuZEFwcGxpY2F0aW9uLnZhbGlkYXRpb24gPVxyXG5cdFx0XHRcdFx0IXNlbmRBcHBsaWNhdGlvbi5saXN0VmFsaWRhdGVkRG9jdW1lbnQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHQhc2VuZEFwcGxpY2F0aW9uLmxpc3RWYWxpZGF0ZWRCdWRnZXQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHQhc2VuZEFwcGxpY2F0aW9uLmxpc3RWYWxpZGF0ZWRGb3JtLmxlbmd0aDtcclxuXHRcdFx0XHQvLyBhZGQgdG8gYXJyYXlcclxuXHRcdFx0XHRsaXN0U2VuZEFwcGxpY2F0aW9uLnB1c2goc2VuZEFwcGxpY2F0aW9uKTtcclxuXHRcdFx0XHQvLyBjYWxsIGNhbGxiYWNrXHJcblx0XHRcdFx0aWYgKGNhbGxiYWNrKSBjYWxsYmFjayhzZW5kQXBwbGljYXRpb24sIGFwcGxpY2F0aW9uLCBpLCBsaXN0QXBwbGljYXRpb24ubGVuZ3RoKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGxpc3RTZW5kQXBwbGljYXRpb247XHJcblx0fVxyXG5cclxuXHQvKiogaXQgcmV0dXJucyB0aGUgZm9ybXMgdGhhdCBhcmUgYWN0aXZhdGVkIGFjY29yZGluZyB0byBzdGF0dXMgKi9cclxuXHRnZXRMaXN0Rm9ybXNCeVN0YXR1cyhjdXJyZW50U3RhdHVzOiBQbGlDbmZTdGF0dXMsIGxpc3RGb3JtOiBhbnlbXSk6IGFueVtdIHtcclxuXHRcdGxldCBsaXN0QWN0aXZhdGVkRm9ybTogYW55W10gPSBbXTtcclxuXHRcdGxldCBsaXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb246IFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uW10gPVxyXG5cdFx0XHRjdXJyZW50U3RhdHVzLmxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbjtcclxuXHRcdGlmIChsaXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb24gJiYgbGlzdFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uLmxlbmd0aClcclxuXHRcdFx0Ly8gZmlsbCB0aGUgbGlzdCBhY3RpdmF0ZWQgZm9ybVxyXG5cdFx0XHRmb3IgKGNvbnN0IGZvcm0gb2YgbGlzdEZvcm0pXHJcblx0XHRcdFx0Zm9yIChjb25zdCBzZWN0aW9uIG9mIGxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbilcclxuXHRcdFx0XHRcdGlmIChzZWN0aW9uLmlkRm9ybSA9PSBmb3JtLmlkKSB7XHJcblx0XHRcdFx0XHRcdGxpc3RBY3RpdmF0ZWRGb3JtLnB1c2goZm9ybSk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0cmV0dXJuIGxpc3RBY3RpdmF0ZWRGb3JtO1xyXG5cdH1cclxuXHJcblx0LyoqIGl0IHJldHVybnMgdGhlIHZhbGlkYXRlZCBkb2N1bWVudCBsaXN0ICovXHJcblx0Z2V0VmFsaWRhdGVkRG9jdW1lbnQoXHJcblx0XHRjdXJyZW50U3RhdHVzOiBhbnksXHJcblx0XHRsaXN0Q29uZmlndXJhdGlvbkRvY3VtZW50LFxyXG5cdFx0bGlzdERvY3VtZW50LFxyXG5cdFx0YXBwbGljYXRpb246IEFwcGxpY2F0aW9uLFxyXG5cdFx0bGlzdERhdGFGb3JtLFxyXG5cdFx0dmFsaWRhdGVKdXN0UmVxdWlyZWQ6IGJvb2xlYW5cclxuXHQpOiBhbnlbXSB7XHJcblx0XHRsZXQgbGlzdFZhbGlkYXRlZERvY3VtZW50ID0gW107XHJcblx0XHRpZiAobGlzdENvbmZpZ3VyYXRpb25Eb2N1bWVudCkge1xyXG5cdFx0XHQvLyBpdCBjb250YWlucyB0aGUgZG9jdW1lbnRzIHRoYXQgYXJlIHZpc2libGVcclxuXHRcdFx0bGV0IGxpc3RDb25maWd1cmF0aW9uRG9jdW1lbnRWaXNpYmxlID0gW107XHJcblxyXG5cdFx0XHQvL2NoZWNrSWZTaG91bGRWYWxpZGF0ZVxyXG5cdFx0XHRsZXQgc2hvdWxkVmFsaWRhdGVEb2N1bWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRcdFx0bGV0IGxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbjogUGxpQ25mU3RhdHVzUGFnZVNlY3Rpb25bXSA9XHJcblx0XHRcdFx0Y3VycmVudFN0YXR1cy5saXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb247XHJcblx0XHRcdGlmIChsaXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb24gJiYgbGlzdFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uLmxlbmd0aClcclxuXHRcdFx0XHRmb3IgKGNvbnN0IHNlY3Rpb24gb2YgbGlzdFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uKVxyXG5cdFx0XHRcdFx0aWYgKHNlY3Rpb24ucGxpQ25mUGFnZVNlY3Rpb24pXHJcblx0XHRcdFx0XHRcdHN3aXRjaCAoc2VjdGlvbi5wbGlDbmZQYWdlU2VjdGlvbi5rZXlMYWJlbCkge1xyXG5cdFx0XHRcdFx0XHRcdGNhc2UgJ2RvY3VtZW50b3MnOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRzaG91bGRWYWxpZGF0ZURvY3VtZW50cyA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0aWYgKCFzaG91bGRWYWxpZGF0ZURvY3VtZW50cykgcmV0dXJuIGxpc3RWYWxpZGF0ZWREb2N1bWVudDtcclxuXHJcblx0XHRcdC8vIHJlc29sdmUgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCBpcyB2aXNpYmxlXHJcblx0XHRcdGlmIChsaXN0Q29uZmlndXJhdGlvbkRvY3VtZW50KSB7XHJcblx0XHRcdFx0Zm9yIChjb25zdCBjb25maWd1cmF0aW9uRG9jdW1lbnQgb2YgbGlzdENvbmZpZ3VyYXRpb25Eb2N1bWVudCkge1xyXG5cdFx0XHRcdFx0bGV0IHZpc2libGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cdFx0XHRcdFx0aWYgKGNvbmZpZ3VyYXRpb25Eb2N1bWVudC5mb3JtdWxhICYmIGNvbmZpZ3VyYXRpb25Eb2N1bWVudC5mb3JtdWxhLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRsZXQgZm9ybXVsYSA9ICcnO1xyXG5cdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBkYXRhID0geyBzdGF0dXNuYW1lOiBhcHBsaWNhdGlvbi5zdGF0ZU5hbWUgfTtcclxuXHRcdFx0XHRcdFx0XHRpZiAobGlzdERhdGFGb3JtKVxyXG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBkYXRhRm9ybSBvZiBsaXN0RGF0YUZvcm0pXHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgcHJvcGVydHkgaW4gZGF0YUZvcm0uZGF0YSlcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhW3Byb3BlcnR5LnRvTG93ZXJDYXNlKCldID0gZGF0YUZvcm0uZGF0YVtwcm9wZXJ0eV07XHJcblx0XHRcdFx0XHRcdFx0Zm9ybXVsYSA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbnNGcm9tTGlzdE9iamVjdChcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmZpZ3VyYXRpb25Eb2N1bWVudC5uYW1lLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29uZmlndXJhdGlvbkRvY3VtZW50LmZvcm11bGEsXHJcblx0XHRcdFx0XHRcdFx0XHRkYXRhXHJcblx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRsZXQgcmVzdWx0ID0gZXZhbChmb3JtdWxhKTtcclxuXHRcdFx0XHRcdFx0XHRpZiAocmVzdWx0ICE9PSB0cnVlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR2aXNpYmxlID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRcdFx0XHRcdHZpc2libGUgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKHZpc2libGUpIHtcclxuXHRcdFx0XHRcdFx0bGlzdENvbmZpZ3VyYXRpb25Eb2N1bWVudFZpc2libGUucHVzaChjb25maWd1cmF0aW9uRG9jdW1lbnQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gcmVzb2x2ZSB0aGUgbGlzdCBvZiBkb2N1bWVudHNcclxuXHRcdFx0aWYgKGxpc3RDb25maWd1cmF0aW9uRG9jdW1lbnRWaXNpYmxlKSB7XHJcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Q29uZmlndXJhdGlvbkRvY3VtZW50VmlzaWJsZS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0bGV0IGNvbmZpZ3VyYXRpb25Eb2N1bWVudCA9IGxpc3RDb25maWd1cmF0aW9uRG9jdW1lbnRWaXNpYmxlW2ldO1xyXG5cdFx0XHRcdFx0bGV0IGRvY3VtZW50OiBEb2N1bWVudCA9IHRoaXMuZ2V0RG9jdW1lbnRCeUNvbmZpZ3VyYXRpb25JZChcclxuXHRcdFx0XHRcdFx0Y29uZmlndXJhdGlvbkRvY3VtZW50LmlkLFxyXG5cdFx0XHRcdFx0XHRsaXN0RG9jdW1lbnQsXHJcblx0XHRcdFx0XHRcdGFwcGxpY2F0aW9uLmlkXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0aWYgKHZhbGlkYXRlSnVzdFJlcXVpcmVkKSB7XHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHQoIWRvY3VtZW50IHx8XHJcblx0XHRcdFx0XHRcdFx0XHQoZG9jdW1lbnQgJiYgZG9jdW1lbnQubGlzdEFyY2hpdmUubGVuZ3RoID09IDApIHx8XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmF1dG9tYXRpY0RvY3VtZW50c1ZhbGlkYXRlZChcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uZmlndXJhdGlvbkRvY3VtZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRsaXN0RGF0YUZvcm0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdGRvY3VtZW50XHJcblx0XHRcdFx0XHRcdFx0XHQpKSAmJlxyXG5cdFx0XHRcdFx0XHRcdGNvbmZpZ3VyYXRpb25Eb2N1bWVudC5yZXF1aXJlZFxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmZpbGxMaXN0VmFsaWRhdGVEb2N1bWVudERlZmF1bHQoXHJcblx0XHRcdFx0XHRcdFx0XHRsaXN0VmFsaWRhdGVkRG9jdW1lbnQsXHJcblx0XHRcdFx0XHRcdFx0XHRhcHBsaWNhdGlvbixcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmZpZ3VyYXRpb25Eb2N1bWVudFxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGlmIChkb2N1bWVudCkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChkb2N1bWVudC5zdGF0ZSA9PSBFRG9jdW1lbnRTdGF0ZS5QRU5ESUVOVEUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGxpc3RWYWxpZGF0ZWREb2N1bWVudC5wdXNoKGRvY3VtZW50KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5maWxsTGlzdFZhbGlkYXRlRG9jdW1lbnREZWZhdWx0KFxyXG5cdFx0XHRcdFx0XHRcdFx0bGlzdFZhbGlkYXRlZERvY3VtZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0YXBwbGljYXRpb24sXHJcblx0XHRcdFx0XHRcdFx0XHRjb25maWd1cmF0aW9uRG9jdW1lbnRcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbGlzdFZhbGlkYXRlZERvY3VtZW50O1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBmaWxsTGlzdFZhbGlkYXRlRG9jdW1lbnREZWZhdWx0KFxyXG5cdFx0bGlzdFZhbGlkYXRlZERvY3VtZW50LFxyXG5cdFx0YXBwbGljYXRpb24sXHJcblx0XHRjb25maWd1cmF0aW9uRG9jdW1lbnRcclxuXHQpIHtcclxuXHRcdGxldCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpO1xyXG5cdFx0ZG9jdW1lbnQuYXBwbGljYXRpb25JZCA9IGFwcGxpY2F0aW9uLmlkO1xyXG5cdFx0ZG9jdW1lbnQucHJvbUNvZGlnbyA9IGNvbmZpZ3VyYXRpb25Eb2N1bWVudC5wcm9tQ29kaWdvO1xyXG5cdFx0ZG9jdW1lbnQuc3RhdGUgPSBFRG9jdW1lbnRTdGF0ZS5QRU5ESUVOVEU7XHJcblx0XHRkb2N1bWVudC5jb25maWd1cmF0aW9uRG9jdW1lbnRJZCA9IGNvbmZpZ3VyYXRpb25Eb2N1bWVudC5pZDtcclxuXHRcdGRvY3VtZW50Lmxpc3RBcmNoaXZlID0gW107XHJcblx0XHRsaXN0VmFsaWRhdGVkRG9jdW1lbnQucHVzaChkb2N1bWVudCk7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgZ2V0cyBkb2N1bWVudCBieSBjb25maWd1cmF0aW9uIElkICovXHJcblx0cHJpdmF0ZSBnZXREb2N1bWVudEJ5Q29uZmlndXJhdGlvbklkKFxyXG5cdFx0Y29uZmlndXJhdGlvbkRvY3VtZW50SWQ6IG51bWJlcixcclxuXHRcdGxpc3Q6IEFycmF5PERvY3VtZW50PixcclxuXHRcdGFwcGxpY2F0aW9uSWQ6IHN0cmluZ1xyXG5cdCk6IERvY3VtZW50IHtcclxuXHRcdGlmIChsaXN0KVxyXG5cdFx0XHRmb3IgKGNvbnN0IGRvY3VtZW50IG9mIGxpc3QpXHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0ZG9jdW1lbnQuY29uZmlndXJhdGlvbkRvY3VtZW50SWQgPT09IGNvbmZpZ3VyYXRpb25Eb2N1bWVudElkICYmXHJcblx0XHRcdFx0XHRkb2N1bWVudC5hcHBsaWNhdGlvbklkID09PSBhcHBsaWNhdGlvbklkXHJcblx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0cmV0dXJuIGRvY3VtZW50O1xyXG5cclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHJcblx0LyoqIGdldCB0aGUgYnVkZ2V0IGFwcGxpY2F0aW9uIGJ5IHR5cGUgYnVkZ2V0IGFuZCBidWRnZXQgc2V0dXAgaWQgKi9cclxuXHRwcml2YXRlIGdldFZhbGlkYXRlZEJ1ZGdldEFwcGxpY2F0aW9uKFxyXG5cdFx0YnVkZ2V0U2V0dGluZzogYW55LFxyXG5cdFx0dHlwZUJ1ZGdldDogYW55LFxyXG5cdFx0bGlzdEJ1ZGdldDogQnVkZ2V0RGF0YVtdLFxyXG5cdFx0YXBwbGljYXRpb25JZFxyXG5cdCk6IGFueSB7XHJcblx0XHRpZiAobGlzdEJ1ZGdldClcclxuXHRcdFx0Zm9yIChjb25zdCBidWRnZXQgb2YgbGlzdEJ1ZGdldClcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRidWRnZXQudGFnID09IHR5cGVCdWRnZXQgJiZcclxuXHRcdFx0XHRcdGJ1ZGdldFNldHRpbmcuY3ByZUNvZGlnbyA9PSBidWRnZXQuYnVkZ2V0U2V0dXBJZCAmJlxyXG5cdFx0XHRcdFx0YnVkZ2V0LmFwcGxpY2F0aW9uSWQgPT0gYXBwbGljYXRpb25JZFxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMudmFsaWRhdGVCdWRnZXQoYnVkZ2V0LCBidWRnZXRTZXR0aW5nLCB0eXBlQnVkZ2V0KTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudmFsaWRhdGVCdWRnZXQobnVsbCwgYnVkZ2V0U2V0dGluZywgdHlwZUJ1ZGdldCk7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgdmFsaWRhdGVzIHRoZSBidWRnZXQgKi9cclxuXHRwcml2YXRlIHZhbGlkYXRlQnVkZ2V0KGJ1ZGdldDogYW55LCBidWRnZXRTZXR0aW5nOiBhbnksIHR5cGU6IGFueSkge1xyXG5cdFx0aWYgKCFidWRnZXQgfHwgIWJ1ZGdldC5zdW1tYXJ5IHx8ICFidWRnZXQuc3VtbWFyeS5idWRnZXRUb3RhbClcclxuXHRcdFx0Ly8gdmFsaWRhdGUgaWYgdGhlcmUgaXMgYSBidWRnZXQgb2JqZWN0XHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0YnVkZ2V0OiBidWRnZXQsXHJcblx0XHRcdFx0dHlwZTogdHlwZSxcclxuXHRcdFx0XHRidWRnZXRTZXR0aW5nOiBidWRnZXRTZXR0aW5nLFxyXG5cdFx0XHRcdGVycm9yOiBFQnVkZ2V0RXJyb3IuTk9fT0JKRUNUXHJcblx0XHRcdH07XHJcblx0XHRlbHNlIGlmIChcclxuXHRcdFx0KHR5cGUgPT09IEVCdWRnZXRCdWlsZFR5cGUuZmluYW5jaW5nIHx8IHR5cGUgPT09IEVCdWRnZXRCdWlsZFR5cGUubWl4ZWQpICYmXHJcblx0XHRcdGJ1ZGdldC5zdW1tYXJ5LmJ1ZGdldFRvdGFsID4gYnVkZ2V0U2V0dGluZy5jcHJlTW9udG9Ub3RhbFxyXG5cdFx0KVxyXG5cdFx0XHQvLyB2YWxpZGF0ZSBpZiBhbW91bnQgdG90YWwgb3ZlcmNvbWVzIHRoZSBtYXhpbXVtXHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0YnVkZ2V0OiBidWRnZXQsXHJcblx0XHRcdFx0dHlwZTogdHlwZSxcclxuXHRcdFx0XHRidWRnZXRTZXR0aW5nOiBidWRnZXRTZXR0aW5nLFxyXG5cdFx0XHRcdGVycm9yOiBFQnVkZ2V0RXJyb3IuT1ZFUkNPTUVfTUFYSU1VTV9BTU9VTlRcclxuXHRcdFx0fTtcclxuXHRcdGVsc2UgaWYgKFxyXG5cdFx0XHR0eXBlID09PSBFQnVkZ2V0QnVpbGRUeXBlLmZpbmFuY2luZyAmJlxyXG5cdFx0XHQoIWJ1ZGdldC5maW5hbmNpbmdTdGFydCB8fCAhYnVkZ2V0LmZpbmFuY2luZ0VuZClcclxuXHRcdClcclxuXHRcdFx0Ly8gdmFsaWRhdGUgaWYgZmluYW5jaW5nIGRhdGVzIGFyZSBkZWZpbmVkXHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0YnVkZ2V0OiBidWRnZXQsXHJcblx0XHRcdFx0dHlwZTogdHlwZSxcclxuXHRcdFx0XHRidWRnZXRTZXR0aW5nOiBidWRnZXRTZXR0aW5nLFxyXG5cdFx0XHRcdGVycm9yOiBFQnVkZ2V0RXJyb3IuRklOQU5DSU5HX0RBVEVTXHJcblx0XHRcdH07XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgdmFsaWRhdGVTdW1tYXJpemVkQnVkZ2V0KGJ1ZGdldFNldHRpbmc6IGFueSwgdHlwZTogYW55LCBidWRnZXQ6IGFueSkge1xyXG5cdFx0aWYgKCFidWRnZXQgfHwgIWJ1ZGdldC5zdW1tYXJ5IHx8ICFidWRnZXQuc3VtbWFyeS5idWRnZXRUb3RhbCkge1xyXG5cdFx0XHQvLyB2YWxpZGF0ZSBpZiB0aGVyZSBpcyBhIGJ1ZGdldCBvYmplY3RcclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRidWRnZXQ6IGJ1ZGdldCxcclxuXHRcdFx0XHR0eXBlOiB0eXBlLFxyXG5cdFx0XHRcdGJ1ZGdldFNldHRpbmc6IGJ1ZGdldFNldHRpbmcsXHJcblx0XHRcdFx0ZXJyb3I6IEVCdWRnZXRFcnJvci5OT19PQkpFQ1RcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblxyXG5cdHZhbGlkYXRlQ29tcGxldGVCdWRnZXQobGlzdEJ1ZGdldFNldHRpbmcsIGxpc3RCdWRnZXQsIGFwcGxpY2F0aW9uSWQpOiBhbnlbXSB7XHJcblx0XHRyZXR1cm4gdGhpcy5nZXRWYWxpZGF0ZWRCdWRnZXQobGlzdEJ1ZGdldFNldHRpbmcsIGxpc3RCdWRnZXQsIGFwcGxpY2F0aW9uSWQpO1xyXG5cdH1cclxuXHJcblx0LyoqIGl0IHJldHVybnMgdGhlIHZhbGlkYXRlZCBidWRnZXQgbGlzdCAqL1xyXG5cdHByaXZhdGUgZ2V0VmFsaWRhdGVkQnVkZ2V0KFxyXG5cdFx0bGlzdEJ1ZGdldFNldHRpbmcsXHJcblx0XHRsaXN0QnVkZ2V0LFxyXG5cdFx0YXBwbGljYXRpb25JZCxcclxuXHRcdGN1cnJlbnRTdGF0dXM/XHJcblx0KTogYW55W10ge1xyXG5cdFx0bGV0IGxpc3RWYWxpZGF0ZWRCdWRnZXQ6IGFueVtdID0gW107XHJcblx0XHRpZiAobGlzdEJ1ZGdldFNldHRpbmcpIHtcclxuXHRcdFx0bGV0IHNob3VsZFZhbGlkYXRlVG90YWxCdWRnZXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRcdFx0bGV0IHNob3VsZFZhbGlkYXRlRmluYW5jaW5nQnVkZ2V0OiBib29sZWFuID0gZmFsc2U7XHJcblx0XHRcdGlmIChjdXJyZW50U3RhdHVzKSB7XHJcblx0XHRcdFx0bGV0IGxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbjogUGxpQ25mU3RhdHVzUGFnZVNlY3Rpb25bXSA9XHJcblx0XHRcdFx0XHRjdXJyZW50U3RhdHVzLmxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbjtcclxuXHRcdFx0XHRpZiAobGlzdFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uICYmIGxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbi5sZW5ndGgpXHJcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHNlY3Rpb24gb2YgbGlzdFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uKVxyXG5cdFx0XHRcdFx0XHRpZiAoc2VjdGlvbi5wbGlDbmZQYWdlU2VjdGlvbilcclxuXHRcdFx0XHRcdFx0XHRzd2l0Y2ggKHNlY3Rpb24ucGxpQ25mUGFnZVNlY3Rpb24ua2V5TGFiZWwpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgJ3ByZXN1cHVlc3RvLnRvdGFsJzoge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRzaG91bGRWYWxpZGF0ZVRvdGFsQnVkZ2V0ID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlICdwcmVzdXB1ZXN0by5maW5hbmNpYWNpb24nOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHNob3VsZFZhbGlkYXRlRmluYW5jaW5nQnVkZ2V0ID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHNob3VsZFZhbGlkYXRlVG90YWxCdWRnZXQgPSB0cnVlO1xyXG5cdFx0XHRcdHNob3VsZFZhbGlkYXRlRmluYW5jaW5nQnVkZ2V0ID0gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gaXRlcmF0ZSBvdmVyIGxpc3RCdWRnZXRTZXR0aW5nXHJcblx0XHRcdGZvciAoY29uc3QgYnVkZ2V0U2V0dGluZyBvZiBsaXN0QnVkZ2V0U2V0dGluZykge1xyXG5cdFx0XHRcdC8vIHNraXAgZ2VuZXJhbCBidWRnZXRcclxuXHRcdFx0XHRpZiAoYnVkZ2V0U2V0dGluZy5wbGlUaXBvUHJlc3VwdWVzdG8udHByZXNDb2RpZ28gPT0gRVRpcG9QcmVzdXB1ZXN0by5HRU5FUkFMKVxyXG5cdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0Ly8gYnVkZ2V0IHRvdGFsXHJcblx0XHRcdFx0Y29uc3QgYnVkZ2V0RGF0YVRvdGFsID0gdGhpcy5nZXRWYWxpZGF0ZWRCdWRnZXRBcHBsaWNhdGlvbihcclxuXHRcdFx0XHRcdGJ1ZGdldFNldHRpbmcsXHJcblx0XHRcdFx0XHRFQnVkZ2V0QnVpbGRUeXBlLnRvdGFsLFxyXG5cdFx0XHRcdFx0bGlzdEJ1ZGdldCxcclxuXHRcdFx0XHRcdGFwcGxpY2F0aW9uSWRcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHRcdGlmIChidWRnZXREYXRhVG90YWwgJiYgc2hvdWxkVmFsaWRhdGVUb3RhbEJ1ZGdldClcclxuXHRcdFx0XHRcdGxpc3RWYWxpZGF0ZWRCdWRnZXQucHVzaChidWRnZXREYXRhVG90YWwpO1xyXG5cdFx0XHRcdC8vIGlmIGl0IGhhcyBvd24gZnVuZHMsIHNvIGl0IHZhbGlkYXRlcyB0b3RhbCBhbmQgZmluYW5jaW5nXHJcblx0XHRcdFx0aWYgKGJ1ZGdldFNldHRpbmcuY3ByZUVzRm9uZG9zUHJvcGlvcykge1xyXG5cdFx0XHRcdFx0Y29uc3QgYnVkZ2V0RGF0YUZpbmFuY2luZyA9IHRoaXMuZ2V0VmFsaWRhdGVkQnVkZ2V0QXBwbGljYXRpb24oXHJcblx0XHRcdFx0XHRcdGJ1ZGdldFNldHRpbmcsXHJcblx0XHRcdFx0XHRcdEVCdWRnZXRCdWlsZFR5cGUuZmluYW5jaW5nLFxyXG5cdFx0XHRcdFx0XHRsaXN0QnVkZ2V0LFxyXG5cdFx0XHRcdFx0XHRhcHBsaWNhdGlvbklkXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0aWYgKGJ1ZGdldERhdGFGaW5hbmNpbmcgJiYgc2hvdWxkVmFsaWRhdGVGaW5hbmNpbmdCdWRnZXQpXHJcblx0XHRcdFx0XHRcdGxpc3RWYWxpZGF0ZWRCdWRnZXQucHVzaChidWRnZXREYXRhRmluYW5jaW5nKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBsaXN0VmFsaWRhdGVkQnVkZ2V0O1xyXG5cdH1cclxuXHJcblx0LyoqIEl0IHJldHVybnMgdGhlIHZhbGlkYXRlZCBmb3JtIGxpc3QgKi9cclxuXHRwcml2YXRlIGdldFZhbGlkYXRlZEZvcm1MaXN0KGxpc3RGb3JtLCBsaXN0RGF0YUZvcm0sIGFwcGxpY2F0aW9uSWQpOiBhbnlbXSB7XHJcblx0XHRsZXQgbGlzdFZhbGlkYXRlZEZvcm06IGFueVtdID0gW107XHJcblx0XHRpZiAobGlzdEZvcm0pIHtcclxuXHRcdFx0Ly8gaXRlcmF0ZSBvdmVyIGxpc3Rmb3JtXHJcblx0XHRcdGZvciAoY29uc3QgZm9ybSBvZiBsaXN0Rm9ybSkge1xyXG5cdFx0XHRcdC8vIGdldCBlcnJvcnMgYnkgZm9ybUlkIGFuZCBBcHBsaWNhdGlvbklkXHJcblx0XHRcdFx0Y29uc3QgZXJyb3JzID0gdGhpcy5nZXRFcnJvcnNCeUZvcm1JZEFuZEFwcGxpY2F0aW9uSWQoXHJcblx0XHRcdFx0XHRsaXN0RGF0YUZvcm0sXHJcblx0XHRcdFx0XHRmb3JtLmlkLFxyXG5cdFx0XHRcdFx0YXBwbGljYXRpb25JZFxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0Y29uc3QgY29tcG9uZW50cyA9IEZvcm1pb1V0aWwuZ2V0Q29tcG9uZW50cyhmb3JtLmNvbXBvbmVudHMpO1xyXG5cclxuXHRcdFx0XHRcdC8vIGdlbmVyYXRlIHRoZSBlcnJvciBjb21wb25lbnRzIGFjY29yZGluZyB0byBlcnJvcnNcclxuXHRcdFx0XHRcdGxldCBlcnJvckNvbXBvbmVudCA9IFtdO1xyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBlcnJvciBvZiBlcnJvcnMpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGVycm9yICYmIGVycm9yLmNvbXBvbmVudCAmJiBlcnJvci5jb21wb25lbnQua2V5ICYmIGNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoY29tcG9uZW50LmtleSA9PSBlcnJvci5jb21wb25lbnQua2V5KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGVycm9yQ29tcG9uZW50LnB1c2goY29tcG9uZW50KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKGVycm9yQ29tcG9uZW50ICYmIGVycm9yQ29tcG9uZW50Lmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHQvLyBvcmdhbml6aW5nIGJ5IHBhbmVsc1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwYW5lbHMgPSBGb3JtaW9VdGlsLmdldEZvcm1hdHRlZENvbXBvbmVudHNCeVBhbmVsKGVycm9yQ29tcG9uZW50KTtcclxuXHRcdFx0XHRcdFx0Ly8gYWRkIHRvIGxpc3RWYWxpZGF0ZWRGb3JtXHJcblx0XHRcdFx0XHRcdGxpc3RWYWxpZGF0ZWRGb3JtLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdGlkOiBmb3JtLmlkLFxyXG5cdFx0XHRcdFx0XHRcdG5hbWU6IGZvcm0udGl0bGUsXHJcblx0XHRcdFx0XHRcdFx0cGFuZWxzOiBwYW5lbHMsXHJcblx0XHRcdFx0XHRcdFx0dG9nZ2xlOiBmYWxzZVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Ly8gdmVyaWZ5IGlmIGRhdGEgaXMgY29tcGxldGVkXHJcblx0XHRcdFx0XHQvLyBnZXQgZGF0YSBieSBmb3JtIGlkIGFuZCBhcHAgaWRcclxuXHRcdFx0XHRcdGNvbnN0IGRhdGEgPSB0aGlzLmdldERhdGFCeUZvcm1JZEFuZEFwcGxpY2F0aW9uSWQoXHJcblx0XHRcdFx0XHRcdGxpc3REYXRhRm9ybSxcclxuXHRcdFx0XHRcdFx0Zm9ybS5pZCxcclxuXHRcdFx0XHRcdFx0YXBwbGljYXRpb25JZFxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdC8vIGdldCBjb21wb25lbnRzIGFyZSByZXF1aXJlZCBhY2NvcmRpbmcgdG8gZGF0YVxyXG5cdFx0XHRcdFx0Y29uc3QgY29tcG9uZW50cyA9IEZvcm1pb1V0aWwuZ2V0UmVxdWlyZWRDb21wb25lbnRzQnlEYXRhKFxyXG5cdFx0XHRcdFx0XHRmb3JtLmNvbXBvbmVudHMsXHJcblx0XHRcdFx0XHRcdGRhdGFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRpZiAoY29tcG9uZW50cyAmJiBjb21wb25lbnRzLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHQvLyBvcmdhbml6aW5nIGJ5IHBhbmVsc1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwYW5lbHMgPSBGb3JtaW9VdGlsLmdldEZvcm1hdHRlZENvbXBvbmVudHNCeVBhbmVsKGNvbXBvbmVudHMpO1xyXG5cdFx0XHRcdFx0XHQvLyBhZGQgdG8gbGlzdFZhbGlkYXRlZEZvcm1cclxuXHRcdFx0XHRcdFx0bGlzdFZhbGlkYXRlZEZvcm0ucHVzaCh7XHJcblx0XHRcdFx0XHRcdFx0aWQ6IGZvcm0uaWQsXHJcblx0XHRcdFx0XHRcdFx0bmFtZTogZm9ybS50aXRsZSxcclxuXHRcdFx0XHRcdFx0XHRwYW5lbHM6IHBhbmVscyxcclxuXHRcdFx0XHRcdFx0XHR0b2dnbGU6IGZhbHNlXHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGxpc3RWYWxpZGF0ZWRGb3JtO1xyXG5cdH1cclxuXHJcblx0LyoqIEl0IHJldHVybnMgdGhlIGRhdGEgYnkgZm9ybUlkIGFuZCBBcHBsaWNhdGlvbklkICovXHJcblx0cHJpdmF0ZSBnZXRFcnJvcnNCeUZvcm1JZEFuZEFwcGxpY2F0aW9uSWQobGlzdERhdGFGb3JtLCBmb3JtSWQsIGFwcGxpY2F0aW9uSWQpOiBhbnkge1xyXG5cdFx0aWYgKGxpc3REYXRhRm9ybSAmJiBmb3JtSWQgJiYgYXBwbGljYXRpb25JZClcclxuXHRcdFx0Zm9yIChjb25zdCBkYXRhIG9mIGxpc3REYXRhRm9ybSlcclxuXHRcdFx0XHRpZiAoZGF0YS5mb3JtSWQgPT0gZm9ybUlkICYmIGRhdGEuYXBwbGljYXRpb25JZCA9PSBhcHBsaWNhdGlvbklkKVxyXG5cdFx0XHRcdFx0cmV0dXJuIGRhdGEuZXJyb3JzO1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgcmV0dXJucyB0aGUgZGF0YSBieSBmb3JtSWQgYW5kIEFwcGxpY2F0aW9uSWQgKi9cclxuXHRwcml2YXRlIGdldERhdGFCeUZvcm1JZEFuZEFwcGxpY2F0aW9uSWQobGlzdERhdGFGb3JtLCBmb3JtSWQsIGFwcGxpY2F0aW9uSWQpOiBhbnkge1xyXG5cdFx0aWYgKGxpc3REYXRhRm9ybSAmJiBmb3JtSWQgJiYgYXBwbGljYXRpb25JZClcclxuXHRcdFx0Zm9yIChjb25zdCBkYXRhIG9mIGxpc3REYXRhRm9ybSlcclxuXHRcdFx0XHRpZiAoZGF0YS5mb3JtSWQgPT0gZm9ybUlkICYmIGRhdGEuYXBwbGljYXRpb25JZCA9PSBhcHBsaWNhdGlvbklkKSByZXR1cm4gZGF0YS5kYXRhO1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cclxuXHRnZXRWYWxpZGF0ZWRCdWRnZXRTdW1tYXJpemVkKFxyXG5cdFx0bGlzdEJ1ZGdldFNldHRpbmcsXHJcblx0XHRsaXN0QnVkZ2V0LFxyXG5cdFx0YXBwbGljYXRpb25JZCxcclxuXHRcdGN1cnJlbnRTdGF0dXNcclxuXHQpOiBhbnlbXSB7XHJcblx0XHRsZXQgbGlzdFZhbGlkYXRlZEJ1ZGdldDogYW55W10gPSBbXTtcclxuXHRcdGlmIChsaXN0QnVkZ2V0U2V0dGluZykge1xyXG5cdFx0XHRsZXQgc2hvdWxkVmFsaWRhdGVUb3RhbEJ1ZGdldDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdFx0XHRpZiAoY3VycmVudFN0YXR1cykge1xyXG5cdFx0XHRcdGxldCBsaXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb246IFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uW10gPVxyXG5cdFx0XHRcdFx0Y3VycmVudFN0YXR1cy5saXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb247XHJcblx0XHRcdFx0aWYgKGxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbiAmJiBsaXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb24ubGVuZ3RoKVxyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBzZWN0aW9uIG9mIGxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbilcclxuXHRcdFx0XHRcdFx0aWYgKHNlY3Rpb24ucGxpQ25mUGFnZVNlY3Rpb24pXHJcblx0XHRcdFx0XHRcdFx0c3dpdGNoIChzZWN0aW9uLnBsaUNuZlBhZ2VTZWN0aW9uLmtleUxhYmVsKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIEVDbmZQYWdlU2VjdGlvbi5wcmVzdXB1ZXN0b1Jlc3VtaWRvOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHNob3VsZFZhbGlkYXRlVG90YWxCdWRnZXQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0c2hvdWxkVmFsaWRhdGVUb3RhbEJ1ZGdldCA9IHRydWU7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgYnVkZ2V0RGF0YVRvdGFsID0gdGhpcy52YWxpZGF0ZVN1bW1hcml6ZWRCdWRnZXQoXHJcblx0XHRcdFx0bGlzdEJ1ZGdldFNldHRpbmdbMF0sXHJcblx0XHRcdFx0RUJ1ZGdldEJ1aWxkVHlwZS50b3RhbCxcclxuXHRcdFx0XHRsaXN0QnVkZ2V0WzBdXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmIChidWRnZXREYXRhVG90YWwgJiYgc2hvdWxkVmFsaWRhdGVUb3RhbEJ1ZGdldClcclxuXHRcdFx0XHRsaXN0VmFsaWRhdGVkQnVkZ2V0LnB1c2goYnVkZ2V0RGF0YVRvdGFsKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBsaXN0VmFsaWRhdGVkQnVkZ2V0O1xyXG5cdH1cclxuXHJcblx0YXV0b21hdGljRG9jdW1lbnRzVmFsaWRhdGVkKFxyXG5cdFx0Y29uZmlnRG9jdW1lbnQ6IENvbmZpZ3VyYXRpb25Eb2N1bWVudCxcclxuXHRcdGxpc3REYXRhRm9ybTogYW55W10sXHJcblx0XHRkb2N1bWVudDogRG9jdW1lbnRcclxuXHQpIHtcclxuXHRcdGlmIChcclxuXHRcdFx0Y29uZmlnRG9jdW1lbnQuZm9ybXVsYVZhbGlkYXRlTXVsdGlwbGUgJiZcclxuXHRcdFx0Y29uZmlnRG9jdW1lbnQuZm9ybXVsYVZhbGlkYXRlTXVsdGlwbGUubGVuZ3RoID4gMFxyXG5cdFx0KSB7XHJcblx0XHRcdGxldCBkYXRhID0geyBzdGF0dXNuYW1lOiAnJyB9O1xyXG5cdFx0XHRpZiAobGlzdERhdGFGb3JtKVxyXG5cdFx0XHRcdGZvciAoY29uc3QgZGF0YUZvcm0gb2YgbGlzdERhdGFGb3JtKVxyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBwcm9wZXJ0eSBpbiBkYXRhRm9ybS5kYXRhKVxyXG5cdFx0XHRcdFx0XHRkYXRhW3Byb3BlcnR5LnRvTG93ZXJDYXNlKCldID0gZGF0YUZvcm0uZGF0YVtwcm9wZXJ0eV07XHJcblx0XHRcdGxldCBmb3JtdWxhID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2Vuc0Zyb21MaXN0T2JqZWN0KFxyXG5cdFx0XHRcdGNvbmZpZ0RvY3VtZW50Lm5hbWUsXHJcblx0XHRcdFx0Y29uZmlnRG9jdW1lbnQuZm9ybXVsYVZhbGlkYXRlTXVsdGlwbGUsXHJcblx0XHRcdFx0ZGF0YVxyXG5cdFx0XHQpO1xyXG5cdFx0XHRsZXQgcmVzdWx0ID0gZXZhbChmb3JtdWxhKTtcclxuXHRcdFx0aWYgKHJlc3VsdCkge1xyXG5cdFx0XHRcdGxldCByZXN1bHRBcnJheSA9IEpTT04ucGFyc2UocmVzdWx0KTtcclxuXHJcblx0XHRcdFx0aWYgKHJlc3VsdEFycmF5ICYmIHJlc3VsdEFycmF5Lmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdC8vVGhlbiBkb2N1bWVudCBtdXN0IGhhdmUgYXJjaGl2ZXNcclxuXHRcdFx0XHRcdGlmICghZG9jdW1lbnQgfHwgZG9jdW1lbnQubGlzdEFyY2hpdmUubGVuZ3RoICE9PSByZXN1bHRBcnJheS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG59XHJcbiJdfQ==
@@ -1,31 +0,0 @@
1
- import { Injectable, Inject } from '@angular/core';
2
- import { HttpHeaders, HttpParams } from '@angular/common/http';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common/http";
5
- export class SesionFormService {
6
- constructor(environment, httpClient) {
7
- this.environment = environment;
8
- this.httpClient = httpClient;
9
- this.headerJson = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
10
- }
11
- /** It returns the list of form by prom codigo */
12
- getByPromCodigo(promCodigo) {
13
- return this.httpClient.get(this.environment.host.backend.configuration + 'sesionForm/getByPromCodigo', { params: new HttpParams().set('promCodigo', promCodigo.toString()) });
14
- }
15
- /** It saves a form */
16
- save(sesionForm) {
17
- return this.httpClient.post(this.environment.host.backend.configuration + 'sesionForm/save', sesionForm, this.headerJson);
18
- }
19
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SesionFormService, deps: [{ token: 'environment' }, { token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
20
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SesionFormService, providedIn: 'root' }); }
21
- }
22
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SesionFormService, decorators: [{
23
- type: Injectable,
24
- args: [{
25
- providedIn: 'root'
26
- }]
27
- }], ctorParameters: () => [{ type: undefined, decorators: [{
28
- type: Inject,
29
- args: ['environment']
30
- }] }, { type: i1.HttpClient }] });
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VzaW9uLWZvcm0uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXBsaS1jb21tb25zL3NyYy9saWIvc2VydmljZXMvc2VzaW9uLWZvcm0uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7QUFPM0UsTUFBTSxPQUFPLGlCQUFpQjtJQUU3QixZQUEyQyxXQUFXLEVBQVUsVUFBc0I7UUFBM0MsZ0JBQVcsR0FBWCxXQUFXLENBQUE7UUFBVSxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBRDlFLGVBQVUsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNELENBQUM7SUFFMUYsaURBQWlEO0lBQ2pELGVBQWUsQ0FBQyxVQUFrQjtRQUNqQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxHQUFHLDRCQUE0QixFQUMxRSxFQUFFLE1BQU0sRUFBRSxJQUFJLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FDckUsQ0FBQztJQUNILENBQUM7SUFFRCxzQkFBc0I7SUFDdEIsSUFBSSxDQUFDLFVBQXNCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsaUJBQWlCLEVBQy9ELFVBQVUsRUFDVixJQUFJLENBQUMsVUFBVSxDQUNmLENBQUM7SUFDSCxDQUFDOytHQW5CVyxpQkFBaUIsa0JBRVQsYUFBYTttSEFGckIsaUJBQWlCLGNBRmpCLE1BQU07OzRGQUVOLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEI7OzBCQUdhLE1BQU07MkJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTZXNpb25Gb3JtIH0gZnJvbSAnbmctcGxpLXV0aWwnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG5cdHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2VzaW9uRm9ybVNlcnZpY2Uge1xyXG5cdHByaXZhdGUgaGVhZGVySnNvbiA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KSB9O1xyXG5cdGNvbnN0cnVjdG9yKEBJbmplY3QoJ2Vudmlyb25tZW50JykgcHJpdmF0ZSBlbnZpcm9ubWVudCwgcHJpdmF0ZSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50KSB7fVxyXG5cclxuXHQvKiogSXQgcmV0dXJucyB0aGUgbGlzdCBvZiBmb3JtIGJ5IHByb20gY29kaWdvICovXHJcblx0Z2V0QnlQcm9tQ29kaWdvKHByb21Db2RpZ286IG51bWJlcik6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChcclxuXHRcdFx0dGhpcy5lbnZpcm9ubWVudC5ob3N0LmJhY2tlbmQuY29uZmlndXJhdGlvbiArICdzZXNpb25Gb3JtL2dldEJ5UHJvbUNvZGlnbycsXHJcblx0XHRcdHsgcGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldCgncHJvbUNvZGlnbycsIHByb21Db2RpZ28udG9TdHJpbmcoKSkgfVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKiBJdCBzYXZlcyBhIGZvcm0gKi9cclxuXHRzYXZlKHNlc2lvbkZvcm06IFNlc2lvbkZvcm0pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0KFxyXG5cdFx0XHR0aGlzLmVudmlyb25tZW50Lmhvc3QuYmFja2VuZC5jb25maWd1cmF0aW9uICsgJ3Nlc2lvbkZvcm0vc2F2ZScsXHJcblx0XHRcdHNlc2lvbkZvcm0sXHJcblx0XHRcdHRoaXMuaGVhZGVySnNvblxyXG5cdFx0KTtcclxuXHR9XHJcbn1cclxuIl19