@seniorsistemas/yms-integration 2.0.0 → 2.1.0

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 (228) hide show
  1. package/bundles/seniorsistemas-yms-integration.umd.js +2922 -1185
  2. package/bundles/seniorsistemas-yms-integration.umd.js.map +1 -1
  3. package/bundles/seniorsistemas-yms-integration.umd.min.js +1 -1
  4. package/bundles/seniorsistemas-yms-integration.umd.min.js.map +1 -1
  5. package/esm2015/index.js +9 -1
  6. package/esm2015/seniorsistemas-yms-integration.js +48 -38
  7. package/esm2015/src/devices/balancas/balancas.service.js +4 -1
  8. package/esm2015/src/devices/balancas/visualiar-balanca/visualizar-balanca.component.js +8 -25
  9. package/esm2015/src/devices/balancas/weightScale.js +1 -1
  10. package/esm2015/src/devices/cancelas/cancelas.service.js +5 -1
  11. package/esm2015/src/devices/cancelas/controlador-cancela/controlador-cancela.component.js +91 -21
  12. package/esm2015/src/devices/cancelas/gate.js +1 -1
  13. package/esm2015/src/devices/dock/dock.module.js +12 -0
  14. package/esm2015/src/devices/dock/dock.service.js +22 -0
  15. package/esm2015/src/erp-senior/components/nota-form/nota-form.component.js +24 -9
  16. package/esm2015/src/erp-senior/core/entities/agenda/agenda.module.js +2 -2
  17. package/esm2015/src/erp-senior/core/entities/cidade/cidade.module.js +2 -2
  18. package/esm2015/src/erp-senior/core/entities/contrato-compra/contrato-compra.module.js +2 -2
  19. package/esm2015/src/erp-senior/core/entities/contrato-compra-item/contrato-compra-item.module.js +2 -2
  20. package/esm2015/src/erp-senior/core/entities/derivacao/derivacao.module.js +2 -2
  21. package/esm2015/src/erp-senior/core/entities/devolucao/devolucao.module.js +2 -2
  22. package/esm2015/src/erp-senior/core/entities/empresa/empresa.module.js +2 -2
  23. package/esm2015/src/erp-senior/core/entities/estado/estado.module.js +2 -2
  24. package/esm2015/src/erp-senior/core/entities/expedicao/expedicao.module.js +2 -2
  25. package/esm2015/src/erp-senior/core/entities/familia-produto/familia-produto.js +5 -7
  26. package/esm2015/src/erp-senior/core/entities/familia-produto/familia-produto.module.js +2 -2
  27. package/esm2015/src/erp-senior/core/entities/filial/filial.module.js +2 -2
  28. package/esm2015/src/erp-senior/core/entities/log-integracao/log-integracao.module.js +2 -2
  29. package/esm2015/src/erp-senior/core/entities/motorista/motorista.js +1 -1
  30. package/esm2015/src/erp-senior/core/entities/ordem-compra/ordem-compra.module.js +7 -2
  31. package/esm2015/src/erp-senior/core/entities/pais/pais.module.js +2 -2
  32. package/esm2015/src/erp-senior/core/entities/pedido-venda/pedido-venda.module.js +2 -2
  33. package/esm2015/src/erp-senior/core/entities/pedido-venda-item/pedido-venda-item.module.js +2 -2
  34. package/esm2015/src/erp-senior/core/entities/pessoa/pessoa.module.js +2 -2
  35. package/esm2015/src/erp-senior/core/entities/pessoa-endereco/pessoa-endereco-dto.js +1 -5
  36. package/esm2015/src/erp-senior/core/entities/pessoa-endereco/pessoa-endereco.js +1 -7
  37. package/esm2015/src/erp-senior/core/entities/pessoa-endereco/pessoa-endereco.module.js +2 -2
  38. package/esm2015/src/erp-senior/core/entities/pessoa-fisica/pessoa-fisica.module.js +2 -2
  39. package/esm2015/src/erp-senior/core/entities/pessoa-juridica/pessoa-juridica.module.js +2 -2
  40. package/esm2015/src/erp-senior/core/entities/processo-avulso/processo-avulso.module.js +7 -2
  41. package/esm2015/src/erp-senior/core/entities/produto/produto.js +1 -9
  42. package/esm2015/src/erp-senior/core/entities/produto/produto.module.js +2 -2
  43. package/esm2015/src/erp-senior/core/entities/recebimento-contrato/recebimento.module.js +7 -2
  44. package/esm2015/src/erp-senior/core/entities/recebimento-ordem-compra/recebimento-ordem-compra.module.js +11 -12
  45. package/esm2015/src/erp-senior/core/entities/royalty/royalty.module.js +2 -2
  46. package/esm2015/src/erp-senior/core/entities/safra/safra.module.js +2 -2
  47. package/esm2015/src/erp-senior/core/entities/transgenia/transgenia.js +1 -1
  48. package/esm2015/src/erp-senior/core/entities/transportadora/transportadora.module.js +2 -2
  49. package/esm2015/src/erp-senior/core/entities/unidade-medida/unidade-medida.module.js +2 -2
  50. package/esm2015/src/erp-senior/core/verifica-nota-fiscal/verificaNotaFiscal.js +9 -1
  51. package/esm2015/src/erp-senior/devolucao/form/devolucao-form.component.js +12 -7
  52. package/esm2015/src/erp-senior/expedicao/form/expedicao-form.component.js +15 -21
  53. package/esm2015/src/erp-senior/processo-avulso/form/processo-avulso-form.component.js +7 -2
  54. package/esm2015/src/erp-senior/recebimento/contrato-form/contrato-form.component.js +20 -4
  55. package/esm2015/src/erp-senior/recebimento/form/recebimento-form.component.js +242 -199
  56. package/esm2015/src/erp-senior/recebimento-ordem-compra/form/recebimento-ordem-compra-form.component.js +29 -20
  57. package/esm2015/src/erp-senior/recebimento-ordem-compra/ordem-compra-form/ordem-compra-form.component.js +13 -4
  58. package/esm2015/src/sam-senior/components/credencial-form/credencial-form.component.js +126 -0
  59. package/esm2015/src/sam-senior/components/scheduling/lobby.service.js +22 -0
  60. package/esm2015/src/sam-senior/components/scheduling/scheduling.component.js +191 -0
  61. package/esm2015/src/sam-senior/components/scheduling/shechuling.service.js +40 -0
  62. package/esm2015/src/sam-senior/components/visited-info/visited-info.component.js +59 -0
  63. package/esm2015/src/sam-senior/components/visited-info/visited-info.service.js +26 -0
  64. package/esm2015/src/sam-senior/components/visitor-edit/visitor-edit-form/visitante-form/visitor-edit-form.component.js +84 -0
  65. package/esm2015/src/sam-senior/components/visitor-edit/visitor-edit-list/visitor-edit-list.component.js +364 -0
  66. package/esm2015/src/sam-senior/components/visitor-list/visitor-list.component.js +64 -0
  67. package/esm2015/src/sam-senior/components/visitor-list/visitor-list.service.js +26 -0
  68. package/esm2015/src/sam-senior/components/visitor-list.module.js +36 -0
  69. package/esm2015/src/sam-senior/core/entity-service.js +102 -0
  70. package/esm2015/src/sam-senior/core/lookup.js +184 -0
  71. package/esm2015/src/sam-senior/core/utils.js +26 -0
  72. package/esm2015/src/sam-senior/entities/credential-card-dto.js +9 -0
  73. package/esm2015/src/sam-senior/entities/lobby-dto.js +3 -0
  74. package/esm2015/src/sam-senior/entities/scheduling-dto.js +3 -0
  75. package/esm2015/src/sam-senior/entities/scheduling-visitors.js +3 -0
  76. package/esm2015/src/sam-senior/entities/scheduling.js +26 -0
  77. package/esm2015/src/sam-senior/entities/visited.js +3 -0
  78. package/esm2015/src/sam-senior/entities/visitor-credentials-dto.js +6 -0
  79. package/esm2015/src/sam-senior/entities/visitor-dto.js +1 -0
  80. package/esm2015/src/sam-senior/entities/visitor-situation.js +10 -0
  81. package/esm2015/src/sam-senior/form/form-sam.component.js +61 -0
  82. package/esm2015/src/sam-senior/models/card-credential.js +7 -0
  83. package/esm2015/src/sam-senior/models/visit-situation.js +8 -0
  84. package/esm2015/src/sam-senior/models/visitor-situation.js +10 -0
  85. package/esm2015/src/sam-senior/models/visitor.js +23 -0
  86. package/esm2015/src/sam-senior/sam-senior.module.js +75 -0
  87. package/esm2015/src/utils/build-form-field.js +28 -0
  88. package/esm5/index.js +9 -1
  89. package/esm5/seniorsistemas-yms-integration.js +48 -38
  90. package/esm5/src/devices/balancas/balancas.service.js +4 -1
  91. package/esm5/src/devices/balancas/visualiar-balanca/visualizar-balanca.component.js +8 -25
  92. package/esm5/src/devices/balancas/weightScale.js +1 -1
  93. package/esm5/src/devices/cancelas/cancelas.service.js +5 -1
  94. package/esm5/src/devices/cancelas/controlador-cancela/controlador-cancela.component.js +94 -21
  95. package/esm5/src/devices/cancelas/gate.js +1 -1
  96. package/esm5/src/devices/dock/dock.module.js +15 -0
  97. package/esm5/src/devices/dock/dock.service.js +25 -0
  98. package/esm5/src/erp-senior/components/nota-form/nota-form.component.js +24 -9
  99. package/esm5/src/erp-senior/core/entities/agenda/agenda.module.js +2 -2
  100. package/esm5/src/erp-senior/core/entities/cidade/cidade.module.js +2 -2
  101. package/esm5/src/erp-senior/core/entities/contrato-compra/contrato-compra.module.js +2 -2
  102. package/esm5/src/erp-senior/core/entities/contrato-compra-item/contrato-compra-item.module.js +2 -2
  103. package/esm5/src/erp-senior/core/entities/derivacao/derivacao.module.js +2 -2
  104. package/esm5/src/erp-senior/core/entities/devolucao/devolucao.module.js +2 -2
  105. package/esm5/src/erp-senior/core/entities/empresa/empresa.module.js +2 -2
  106. package/esm5/src/erp-senior/core/entities/estado/estado.module.js +2 -2
  107. package/esm5/src/erp-senior/core/entities/expedicao/expedicao.module.js +2 -2
  108. package/esm5/src/erp-senior/core/entities/familia-produto/familia-produto.js +5 -7
  109. package/esm5/src/erp-senior/core/entities/familia-produto/familia-produto.module.js +2 -2
  110. package/esm5/src/erp-senior/core/entities/filial/filial.module.js +2 -2
  111. package/esm5/src/erp-senior/core/entities/log-integracao/log-integracao.module.js +2 -2
  112. package/esm5/src/erp-senior/core/entities/motorista/motorista.js +1 -1
  113. package/esm5/src/erp-senior/core/entities/ordem-compra/ordem-compra.module.js +7 -2
  114. package/esm5/src/erp-senior/core/entities/pais/pais.module.js +2 -2
  115. package/esm5/src/erp-senior/core/entities/pedido-venda/pedido-venda.module.js +2 -2
  116. package/esm5/src/erp-senior/core/entities/pedido-venda-item/pedido-venda-item.module.js +2 -2
  117. package/esm5/src/erp-senior/core/entities/pessoa/pessoa.module.js +2 -2
  118. package/esm5/src/erp-senior/core/entities/pessoa-endereco/pessoa-endereco-dto.js +1 -5
  119. package/esm5/src/erp-senior/core/entities/pessoa-endereco/pessoa-endereco.js +1 -7
  120. package/esm5/src/erp-senior/core/entities/pessoa-endereco/pessoa-endereco.module.js +2 -2
  121. package/esm5/src/erp-senior/core/entities/pessoa-fisica/pessoa-fisica.module.js +2 -2
  122. package/esm5/src/erp-senior/core/entities/pessoa-juridica/pessoa-juridica.module.js +2 -2
  123. package/esm5/src/erp-senior/core/entities/processo-avulso/processo-avulso.module.js +7 -2
  124. package/esm5/src/erp-senior/core/entities/produto/produto.js +1 -9
  125. package/esm5/src/erp-senior/core/entities/produto/produto.module.js +2 -2
  126. package/esm5/src/erp-senior/core/entities/recebimento-contrato/recebimento.module.js +7 -2
  127. package/esm5/src/erp-senior/core/entities/recebimento-ordem-compra/recebimento-ordem-compra.module.js +11 -12
  128. package/esm5/src/erp-senior/core/entities/royalty/royalty.module.js +2 -2
  129. package/esm5/src/erp-senior/core/entities/safra/safra.module.js +2 -2
  130. package/esm5/src/erp-senior/core/entities/transgenia/transgenia.js +1 -1
  131. package/esm5/src/erp-senior/core/entities/transportadora/transportadora.module.js +2 -2
  132. package/esm5/src/erp-senior/core/entities/unidade-medida/unidade-medida.module.js +2 -2
  133. package/esm5/src/erp-senior/core/verifica-nota-fiscal/verificaNotaFiscal.js +9 -1
  134. package/esm5/src/erp-senior/devolucao/form/devolucao-form.component.js +12 -7
  135. package/esm5/src/erp-senior/expedicao/form/expedicao-form.component.js +15 -21
  136. package/esm5/src/erp-senior/processo-avulso/form/processo-avulso-form.component.js +7 -2
  137. package/esm5/src/erp-senior/recebimento/contrato-form/contrato-form.component.js +21 -4
  138. package/esm5/src/erp-senior/recebimento/form/recebimento-form.component.js +244 -203
  139. package/esm5/src/erp-senior/recebimento-ordem-compra/form/recebimento-ordem-compra-form.component.js +29 -20
  140. package/esm5/src/erp-senior/recebimento-ordem-compra/ordem-compra-form/ordem-compra-form.component.js +14 -4
  141. package/esm5/src/sam-senior/components/credencial-form/credencial-form.component.js +144 -0
  142. package/esm5/src/sam-senior/components/scheduling/lobby.service.js +25 -0
  143. package/esm5/src/sam-senior/components/scheduling/scheduling.component.js +199 -0
  144. package/esm5/src/sam-senior/components/scheduling/shechuling.service.js +43 -0
  145. package/esm5/src/sam-senior/components/visited-info/visited-info.component.js +56 -0
  146. package/esm5/src/sam-senior/components/visited-info/visited-info.service.js +29 -0
  147. package/esm5/src/sam-senior/components/visitor-edit/visitor-edit-form/visitante-form/visitor-edit-form.component.js +87 -0
  148. package/esm5/src/sam-senior/components/visitor-edit/visitor-edit-list/visitor-edit-list.component.js +384 -0
  149. package/esm5/src/sam-senior/components/visitor-list/visitor-list.component.js +82 -0
  150. package/esm5/src/sam-senior/components/visitor-list/visitor-list.service.js +29 -0
  151. package/esm5/src/sam-senior/components/visitor-list.module.js +37 -0
  152. package/esm5/src/sam-senior/core/entity-service.js +107 -0
  153. package/esm5/src/sam-senior/core/lookup.js +229 -0
  154. package/esm5/src/sam-senior/core/utils.js +28 -0
  155. package/esm5/src/sam-senior/entities/credential-card-dto.js +13 -0
  156. package/esm5/src/sam-senior/entities/lobby-dto.js +7 -0
  157. package/esm5/src/sam-senior/entities/scheduling-dto.js +7 -0
  158. package/esm5/src/sam-senior/entities/scheduling-visitors.js +7 -0
  159. package/esm5/src/sam-senior/entities/scheduling.js +30 -0
  160. package/esm5/src/sam-senior/entities/visited.js +7 -0
  161. package/esm5/src/sam-senior/entities/visitor-credentials-dto.js +8 -0
  162. package/esm5/src/sam-senior/entities/visitor-dto.js +1 -0
  163. package/esm5/src/sam-senior/entities/visitor-situation.js +10 -0
  164. package/esm5/src/sam-senior/form/form-sam.component.js +64 -0
  165. package/esm5/src/sam-senior/models/card-credential.js +7 -0
  166. package/esm5/src/sam-senior/models/visit-situation.js +8 -0
  167. package/esm5/src/sam-senior/models/visitor-situation.js +10 -0
  168. package/esm5/src/sam-senior/models/visitor.js +32 -0
  169. package/esm5/src/sam-senior/sam-senior.module.js +76 -0
  170. package/esm5/src/utils/build-form-field.js +29 -0
  171. package/fesm2015/seniorsistemas-yms-integration.js +2763 -1193
  172. package/fesm2015/seniorsistemas-yms-integration.js.map +1 -1
  173. package/fesm5/seniorsistemas-yms-integration.js +2888 -1169
  174. package/fesm5/seniorsistemas-yms-integration.js.map +1 -1
  175. package/index.d.ts +7 -0
  176. package/package.json +3 -3
  177. package/seniorsistemas-yms-integration.d.ts +47 -37
  178. package/seniorsistemas-yms-integration.metadata.json +1 -1
  179. package/src/devices/balancas/balancas.service.d.ts +1 -0
  180. package/src/devices/balancas/visualiar-balanca/visualizar-balanca.component.d.ts +2 -11
  181. package/src/devices/balancas/weightScale.d.ts +2 -2
  182. package/src/devices/cancelas/cancelas.service.d.ts +1 -0
  183. package/src/devices/cancelas/controlador-cancela/controlador-cancela.component.d.ts +12 -8
  184. package/src/devices/cancelas/gate.d.ts +2 -0
  185. package/src/devices/dock/dock.module.d.ts +2 -0
  186. package/src/devices/dock/dock.service.d.ts +10 -0
  187. package/src/erp-senior/components/nota-form/nota-form.component.d.ts +7 -1
  188. package/src/erp-senior/core/entities/motorista/motorista.d.ts +3 -0
  189. package/src/erp-senior/core/entities/pessoa-endereco/pessoa-endereco-dto.d.ts +2 -0
  190. package/src/erp-senior/core/entities/pessoa-endereco/pessoa-endereco.d.ts +2 -0
  191. package/src/erp-senior/core/entities/transgenia/transgenia.d.ts +2 -0
  192. package/src/erp-senior/core/verifica-nota-fiscal/verificaNotaFiscal.d.ts +2 -0
  193. package/src/erp-senior/devolucao/form/devolucao-form.component.d.ts +2 -0
  194. package/src/erp-senior/processo-avulso/form/processo-avulso-form.component.d.ts +2 -0
  195. package/src/erp-senior/recebimento/contrato-form/contrato-form.component.d.ts +10 -4
  196. package/src/erp-senior/recebimento/form/recebimento-form.component.d.ts +25 -10
  197. package/src/erp-senior/recebimento-ordem-compra/form/recebimento-ordem-compra-form.component.d.ts +4 -2
  198. package/src/erp-senior/recebimento-ordem-compra/ordem-compra-form/ordem-compra-form.component.d.ts +6 -2
  199. package/src/sam-senior/components/credencial-form/credencial-form.component.d.ts +29 -0
  200. package/src/sam-senior/components/scheduling/lobby.service.d.ts +9 -0
  201. package/src/sam-senior/components/scheduling/scheduling.component.d.ts +43 -0
  202. package/src/sam-senior/components/scheduling/shechuling.service.d.ts +14 -0
  203. package/src/sam-senior/components/visited-info/visited-info.component.d.ts +15 -0
  204. package/src/sam-senior/components/visited-info/visited-info.service.d.ts +10 -0
  205. package/src/sam-senior/components/visitor-edit/visitor-edit-form/visitante-form/visitor-edit-form.component.d.ts +22 -0
  206. package/src/sam-senior/components/visitor-edit/visitor-edit-list/visitor-edit-list.component.d.ts +56 -0
  207. package/src/sam-senior/components/visitor-list/visitor-list.component.d.ts +16 -0
  208. package/src/sam-senior/components/visitor-list/visitor-list.service.d.ts +10 -0
  209. package/src/sam-senior/components/visitor-list.module.d.ts +5 -0
  210. package/src/sam-senior/core/entity-service.d.ts +35 -0
  211. package/src/sam-senior/core/lookup.d.ts +38 -0
  212. package/src/sam-senior/core/utils.d.ts +18 -0
  213. package/src/sam-senior/entities/credential-card-dto.d.ts +12 -0
  214. package/src/sam-senior/entities/lobby-dto.d.ts +5 -0
  215. package/src/sam-senior/entities/scheduling-dto.d.ts +11 -0
  216. package/src/sam-senior/entities/scheduling-visitors.d.ts +6 -0
  217. package/src/sam-senior/entities/scheduling.d.ts +12 -0
  218. package/src/sam-senior/entities/visited.d.ts +4 -0
  219. package/src/sam-senior/entities/visitor-credentials-dto.d.ts +6 -0
  220. package/src/sam-senior/entities/visitor-dto.d.ts +10 -0
  221. package/src/sam-senior/entities/visitor-situation.d.ts +8 -0
  222. package/src/sam-senior/form/form-sam.component.d.ts +18 -0
  223. package/src/sam-senior/models/card-credential.d.ts +16 -0
  224. package/src/sam-senior/models/visit-situation.d.ts +6 -0
  225. package/src/sam-senior/models/visitor-situation.d.ts +8 -0
  226. package/src/sam-senior/models/visitor.d.ts +24 -0
  227. package/src/sam-senior/sam-senior.module.d.ts +6 -0
  228. package/src/utils/build-form-field.d.ts +9 -0
@@ -1,6 +1,5 @@
1
1
  import * as tslib_1 from "tslib";
2
- import { VerificaNotafiscal } from '../../core/verifica-nota-fiscal/verificaNotaFiscal';
3
- import { ErpFormConfigService } from './../../core/erp-form-config/erp-form-config-service';
2
+ import { BuildFormField } from '../../../utils/build-form-field';
4
3
  import { Component, Input, TemplateRef, ViewChild } from "@angular/core";
5
4
  import { FormArray, FormBuilder, FormControl, FormGroup, Validators } from "@angular/forms";
6
5
  import { ActivatedRoute, Router } from "@angular/router";
@@ -18,6 +17,7 @@ import { onLookupRequest } from "../../../utils/lookup-utils";
18
17
  import { dialogConfig, isValidFilter, mergeUnique, userCanVisualize } from "../../../utils/utils";
19
18
  import { NotaFormComponent } from "../../components/nota-form/nota-form.component";
20
19
  import { Agenda } from "../../core/entities/agenda/agenda";
20
+ import { AgendaService } from "../../core/entities/agenda/agenda.service";
21
21
  import { ContratoCompraService } from "../../core/entities/contrato-compra/contrato-compra.service";
22
22
  import { Derivacao } from "../../core/entities/derivacao/derivacao";
23
23
  import { DerivacaoService } from "../../core/entities/derivacao/derivacao.service";
@@ -33,18 +33,19 @@ import { RecebimentoContrato } from "../../core/entities/recebimento-contrato/re
33
33
  import { RecebimentoContratoService } from "../../core/entities/recebimento-contrato/recebimento.service";
34
34
  import { TransgeniaService } from "../../core/entities/transgenia/transgenia.service";
35
35
  import { TransportadoraService } from "../../core/entities/transportadora/transportadora.service";
36
- import { StatusAgenda } from "./../../core/enums/status-agenda";
37
36
  import { TipoNotaFiscal } from "../../core/enums/tipo-nota-fiscal";
38
- import { TipoParticipanteTransgenia } from "../../core/enums/tipo-participante-transgenia";
37
+ import { ErpProcessService } from "../../core/erp-process-data/erp-process-service";
38
+ import { HasChangeService } from '../../core/has-change/has-change-service';
39
39
  import { NotaValidatorService } from "../../core/nota-validator.service";
40
+ import { VerificaNotafiscal } from '../../core/verifica-nota-fiscal/verificaNotaFiscal';
40
41
  import { ContratoFormComponent } from "../contrato-form/contrato-form.component";
41
42
  import { RecebimentoChegadaVeiculoOverride } from "../recebimento-chegada-veiculo.override";
42
- import { AgendaService } from "../../core/entities/agenda/agenda.service";
43
- import { ErpProcessService } from "../../core/erp-process-data/erp-process-service";
44
- import { HasChangeService } from '../../core/has-change/has-change-service';
43
+ import { StatusAgenda } from "./../../core/enums/status-agenda";
44
+ import { ErpFormConfigService } from './../../core/erp-form-config/erp-form-config-service';
45
+ import { Situacao } from '../../core/enums/situacao';
45
46
  var moment = _moment;
46
47
  var RecebimentoFormComponent = /** @class */ (function () {
47
- function RecebimentoFormComponent(recebimentoService, router, route, messageService, confirmationService, formBuilder, translate, hotkeysService, fieldCustomization, focusService, filialService, transportadoraService, pessoaEnderecoService, contratoCompraService, pessoaService, produtoService, derivacaoService, recebimentoChegadaOverride, notaValidatorService, transgeniaService, dialogService, agendaService, erpProcessService, erpFormConfigService, verificaNotaFiscal, hasChangeService) {
48
+ function RecebimentoFormComponent(recebimentoService, router, route, messageService, confirmationService, formBuilder, translate, hotkeysService, fieldCustomization, focusService, filialService, transportadoraService, pessoaEnderecoService, contratoCompraService, pessoaService, produtoService, derivacaoService, recebimentoChegadaOverride, notaValidatorService, transgeniaService, dialogService, agendaService, erpProcessService, erpFormConfigService, verificaNotaFiscal, hasChangeService, buildFormField) {
48
49
  var _this = this;
49
50
  this.recebimentoService = recebimentoService;
50
51
  this.router = router;
@@ -72,6 +73,7 @@ var RecebimentoFormComponent = /** @class */ (function () {
72
73
  this.erpFormConfigService = erpFormConfigService;
73
74
  this.verificaNotaFiscal = verificaNotaFiscal;
74
75
  this.hasChangeService = hasChangeService;
76
+ this.buildFormField = buildFormField;
75
77
  this.localeConfig = {};
76
78
  this.currencyLocaleOptions = {};
77
79
  this.permissions = {};
@@ -86,7 +88,8 @@ var RecebimentoFormComponent = /** @class */ (function () {
86
88
  this.fornecedorAdvancedDisplayFields = ["id", "codigo", "nome", "situacao", "cpfCnpj", "tipoParticipante"];
87
89
  this.fornecedorLookupSeparator = " - ";
88
90
  this.origemMercadoriaLookupDisplayFields = ["codigo", "cep", "endereco", "empresa.descricao"];
89
- this.origemMercadoriaAdvancedDisplayFields = ["id", "codigo", "cep", "endereco", "numero", "complemento", "cidade.*", "bairro", "situacao", "empresa.descricao"];
91
+ this.origemMercadoriaAdvancedDisplayFields = ["id", "codigo", "cep", "endereco", "numero", "complemento", "cidade.*", "bairro", "situacao", "empresa.descricao",
92
+ "cnpjCpf", "inscricaoEstadual"];
90
93
  this.origemMercadoriaLookupSeparator = " - ";
91
94
  this.produtoLookupDisplayFields = ["codigo", "descricao", "tipo"];
92
95
  this.produtoAdvancedDisplayFields = ["id", "codigo", "comprado", "descricao", "produtoMisto", "situacao", "tipo"];
@@ -101,7 +104,7 @@ var RecebimentoFormComponent = /** @class */ (function () {
101
104
  this.transportadoraAdvancedDisplayFields = ["id", "codigo", "pessoa.nome", "pessoa.cpfCnpj"];
102
105
  this.transportadoraLookupSeparator = " - ";
103
106
  this.transgeniaLookupDisplayFields = ["codigo", "descricao"];
104
- this.transgeniaAdvancedDisplayFields = ["id", "codigo", "descricao"];
107
+ this.transgeniaAdvancedDisplayFields = ["id", "codigo", "descricao", "familia", "tipoParticipante", "situacao"];
105
108
  this.transgeniaLookupSeparator = " - ";
106
109
  this.disableButtonSave = false;
107
110
  this.disableOrdersButtons = true;
@@ -113,11 +116,15 @@ var RecebimentoFormComponent = /** @class */ (function () {
113
116
  ];
114
117
  this.erroChaveNota = false;
115
118
  this.erroFornecedores = false;
119
+ this.erroFornecedoresNotaDuplicada = null;
116
120
  this.notasTokens = [];
117
121
  this.fornecedorNotasTokens = [];
118
122
  this.fornecedorNotas = [];
119
123
  this.contratoSelecionado = null;
120
124
  this.ngUnsubscribe = new Subject();
125
+ this.carregandoErpFilial = true;
126
+ this.carregandoErpRouteData = true;
127
+ this.carregandoErpRecebimento = true;
121
128
  this.onChangeRevalidation = function (_) {
122
129
  if (_this.erpProcessData && _this.formGroup) {
123
130
  _this.erpProcessData = _this.erpProcessService.builderErpProcessData(_this.erpProcessData, _this.formGroup);
@@ -125,13 +132,6 @@ var RecebimentoFormComponent = /** @class */ (function () {
125
132
  }
126
133
  return;
127
134
  };
128
- this.getTipoTransgenia = function () {
129
- if (_this.formGroup.get("fornecedores").length <= 0) {
130
- return TipoParticipanteTransgenia.NAO_INFORMADO;
131
- }
132
- var fornecedor = _this.formGroup.get("fornecedores").at(0).getRawValue().fornecedor;
133
- return fornecedor ? (fornecedor.tipoParticipante || TipoParticipanteTransgenia.NAO_INFORMADO) : TipoParticipanteTransgenia.NAO_INFORMADO;
134
- };
135
135
  this.onFilialValueChange = function (filial) {
136
136
  _this.disableOrdersButtons = !filial;
137
137
  if (!filial && _this.isNew()) {
@@ -139,10 +139,12 @@ var RecebimentoFormComponent = /** @class */ (function () {
139
139
  _this.formGroup.get("produto").disable();
140
140
  _this.formGroup.get("transgenia").setValue(undefined);
141
141
  _this.formGroup.get("transgenia").disable();
142
+ _this.carregandoErpFilial = false;
142
143
  return;
143
144
  }
144
145
  _this.formGroup.get("produto").enable();
145
146
  _this.formGroup.get("transgenia").enable();
147
+ _this.carregandoErpFilial = false;
146
148
  };
147
149
  }
148
150
  RecebimentoFormComponent.prototype.ngOnInit = function () {
@@ -222,13 +224,7 @@ var RecebimentoFormComponent = /** @class */ (function () {
222
224
  this.setTransportadora(this.agenda.externalTenant.cnpj);
223
225
  }
224
226
  this.totalEixosComposicao = this.agenda && this.agenda.veiculo ? this.agenda.veiculo.eixos || 0 : 0;
225
- var statusAgenda = [
226
- "AGUARDANDO_CONFIRMACAO_SOLICITANTE",
227
- "AGENDADO",
228
- "AGUARDANDO_CONFIRMACAO",
229
- "EM_EXECUCAO",
230
- "REJEITADO_POR_VALIDACAO",
231
- ];
227
+ var statusAgenda = ["AGUARDANDO_CONFIRMACAO_SOLICITANTE", "AGENDADO", "AGUARDANDO_CONFIRMACAO", "REJEITADO_POR_VALIDACAO"];
232
228
  if (this.agenda && !statusAgenda.includes(this.agenda.status)) {
233
229
  this.formGroup.disable();
234
230
  this.disableButtonSave = true;
@@ -236,6 +232,12 @@ var RecebimentoFormComponent = /** @class */ (function () {
236
232
  this.erpProcessService.current.subscribe(function (message) { return _this.erpProcessData = message; });
237
233
  this.erpFormConfigService.current.subscribe(function (message) { return _this.enableRevalidation = message; });
238
234
  this.verificaSeTemAlteracao();
235
+ this.formGroup.get('produto').valueChanges.subscribe(function () {
236
+ _this.validaTransgenia();
237
+ });
238
+ this.formGroup.get('fornecedores').valueChanges.subscribe(function () {
239
+ _this.validaTransgenia();
240
+ });
239
241
  };
240
242
  RecebimentoFormComponent.prototype.verificaSeTemAlteracao = function () {
241
243
  var _this = this;
@@ -245,6 +247,69 @@ var RecebimentoFormComponent = /** @class */ (function () {
245
247
  }
246
248
  });
247
249
  };
250
+ RecebimentoFormComponent.prototype.validaTransgenia = function () {
251
+ if (this.erpCarregado()) {
252
+ return;
253
+ }
254
+ var transgenia = this.formGroup.get("transgenia").value;
255
+ var produto = this.formGroup.get("produto").value;
256
+ var familiaProduto = this.getFamiliaProduto();
257
+ if (!produto || !transgenia) {
258
+ return;
259
+ }
260
+ if (!this.validaFamiliaProdutoCorrespondeFamiliaTrangenia(transgenia, familiaProduto)) {
261
+ this.mensagemTransgeniaInvalida();
262
+ return;
263
+ }
264
+ this.validaFornecedorCorrespondeTipoPaticipanteDaTransgenia(transgenia);
265
+ };
266
+ RecebimentoFormComponent.prototype.erpCarregado = function () {
267
+ if (this.carregandoErpFilial) {
268
+ return true;
269
+ }
270
+ if (this.carregandoErpRouteData) {
271
+ return true;
272
+ }
273
+ if (this.carregandoErpRecebimento) {
274
+ return true;
275
+ }
276
+ return false;
277
+ };
278
+ RecebimentoFormComponent.prototype.mensagemTransgeniaInvalida = function () {
279
+ this.addMessage("error", "yms.integration.mensagem_erro_titulo_informar_transgenia", "yms.integration.mensagem_erro_conteuto_informar_transgenia");
280
+ this.formGroup.get("transgenia").setValue(undefined);
281
+ };
282
+ RecebimentoFormComponent.prototype.validaFamiliaProdutoCorrespondeFamiliaTrangenia = function (transgenia, familiaProduto) {
283
+ if (familiaProduto !== null && transgenia.familia === familiaProduto) {
284
+ return true;
285
+ }
286
+ return false;
287
+ };
288
+ RecebimentoFormComponent.prototype.validaFornecedorCorrespondeTipoPaticipanteDaTransgenia = function (transgenia) {
289
+ var tipoParticipanteFornecedores = this.getTipoTransgenia();
290
+ var fornecedores = this.formGroup.get("fornecedores");
291
+ if (fornecedores.length > 0) {
292
+ var fornecedorEstaVazio_1 = true;
293
+ fornecedores.controls.forEach(function (form) {
294
+ fornecedorEstaVazio_1 = form.value.fornecedor === null;
295
+ });
296
+ if (fornecedorEstaVazio_1) {
297
+ return true;
298
+ }
299
+ if (tipoParticipanteFornecedores === null) {
300
+ this.mensagemTransgeniaInvalida();
301
+ return false;
302
+ }
303
+ if (tipoParticipanteFornecedores !== transgenia.tipoParticipante) {
304
+ this.mensagemTransgeniaInvalida();
305
+ return false;
306
+ }
307
+ if (tipoParticipanteFornecedores === transgenia.tipoParticipante) {
308
+ return true;
309
+ }
310
+ }
311
+ return false;
312
+ };
248
313
  RecebimentoFormComponent.prototype.ngAfterViewInit = function () {
249
314
  var _this = this;
250
315
  var inputList = document.getElementsByTagName("input");
@@ -268,6 +333,14 @@ var RecebimentoFormComponent = /** @class */ (function () {
268
333
  };
269
334
  RecebimentoFormComponent.prototype.createdByErpDisableForm = function () {
270
335
  this.disableOrdersButtons = this.agenda.createdByErp;
336
+ if (this.isNew()) {
337
+ this.createdByErp = false;
338
+ this.formGroup.get('filial').enable();
339
+ this.formGroup.get('produto').enable();
340
+ this.formGroup.get('derivacao').enable();
341
+ this.formGroup.get('transportadora').enable();
342
+ this.formGroup.get("fornecedores").controls.forEach(function (form) { return form.get("fornecedor").enable(); });
343
+ }
271
344
  if (this.agenda && this.agenda.createdByErp) {
272
345
  this.createdByErp = true;
273
346
  this.formGroup.get('filial').disable();
@@ -312,9 +385,59 @@ var RecebimentoFormComponent = /** @class */ (function () {
312
385
  this.notaValidatorService.pesquisarDocumentoValidaNotaEmUso({
313
386
  filialId: (this.formGroup.get("filial").value && this.formGroup.get("filial").value.id) || null,
314
387
  chaveDocumento: value.trim()
315
- }).pipe(takeUntil(this.ngUnsubscribe), finalize(function () { return _this.loading = false; })).subscribe(function (response) { return _this.adicionarNovaNota(response); });
388
+ }).pipe(takeUntil(this.ngUnsubscribe), finalize(function () { return _this.loading = false; })).subscribe(function (response) { return _this.addNovaNota(response); });
316
389
  }
317
390
  };
391
+ RecebimentoFormComponent.prototype.addNovaNota = function (response) {
392
+ var value = (response.documentos || []).length ? response.documentos[0] : undefined;
393
+ if (!value)
394
+ return;
395
+ var itemProduto = value.itens[0] || { produto: undefined, derivacao: undefined };
396
+ var produto = Produto.fromDto(itemProduto.produto);
397
+ if (!this.formGroup.get("produto").value && !!itemProduto.produto) {
398
+ this.formGroup.get("produto").setValue(produto);
399
+ this.formGroup.get("derivacao").setValue(Derivacao.fromDto(itemProduto.derivacao));
400
+ }
401
+ else if (!!itemProduto.produto && !this.validateProduto(produto)) {
402
+ this.addNotaError();
403
+ return;
404
+ }
405
+ var fornecedor = Pessoa.fromDto(value.fornecedor);
406
+ var origemMercadoria = PessoaEndereco.fromDto(value.origemMercadoria);
407
+ var fornecedorForm = this.getFornecedoresForm().controls.find(function (_a) {
408
+ var value = _a.value;
409
+ return value.fornecedor.id === fornecedor.id;
410
+ });
411
+ var fornecedorOfGroup = this.validarCnpjFornecedor(fornecedor.cpfCnpj);
412
+ if (fornecedorOfGroup) {
413
+ if (!fornecedorForm) {
414
+ this.addFornecedor({ fornecedor: fornecedor, origemMercadoria: origemMercadoria });
415
+ }
416
+ this.addFornecedorNotasToken(value);
417
+ }
418
+ else if (!fornecedorForm) {
419
+ this.addFornecedor({ fornecedor: fornecedor, origemMercadoria: origemMercadoria });
420
+ this.addFornecedorNotasToken(value);
421
+ }
422
+ this.validaRetornoPesquisaDocumentos(response);
423
+ };
424
+ RecebimentoFormComponent.prototype.validaRetornoPesquisaDocumentos = function (response) {
425
+ var duplicateFornecedores = this.verificaNotaFiscal.findDuplicateFornecedores(response);
426
+ if (duplicateFornecedores !== null) {
427
+ this.erroFornecedoresNotaDuplicada = this.translate.instant("yms.patio.duplicate_supplier") + duplicateFornecedores;
428
+ }
429
+ };
430
+ RecebimentoFormComponent.prototype.addFornecedorNotasToken = function (value) {
431
+ this.fornecedorNotasTokens.push({ id: this.chaveNotaFiscal, label: value.numero });
432
+ this.fornecedorNotas.push({
433
+ chaveNotaFiscal: this.chaveNotaFiscal,
434
+ serieNotaFiscal: value.serie,
435
+ serieLegalNotaFiscal: value.serieLegal,
436
+ numeroNotaFiscal: value.numero,
437
+ });
438
+ this.chaveNotaFiscal = undefined;
439
+ this.loading = false;
440
+ };
318
441
  RecebimentoFormComponent.prototype.isNew = function () {
319
442
  return !this.formGroup.value.id;
320
443
  };
@@ -359,9 +482,8 @@ var RecebimentoFormComponent = /** @class */ (function () {
359
482
  thousands: thousandsSeparator,
360
483
  decimal: decimalSeparator,
361
484
  };
362
- this.permissions = data.allPermissions.recebimento;
485
+ this.permissions = data.allPermissions.agenda;
363
486
  this.allPermissions = data.allPermissions;
364
- //this.validateVisualization();
365
487
  if (data.entity) {
366
488
  var canEdit = this.permissions.editar;
367
489
  if (!canEdit)
@@ -373,6 +495,7 @@ var RecebimentoFormComponent = /** @class */ (function () {
373
495
  else {
374
496
  this.formGroup.patchValue(new RecebimentoContrato());
375
497
  }
498
+ this.carregandoErpRouteData = false;
376
499
  };
377
500
  RecebimentoFormComponent.prototype.onCancel = function () {
378
501
  this.goBack();
@@ -522,7 +645,7 @@ var RecebimentoFormComponent = /** @class */ (function () {
522
645
  _this.formGroup.patchValue(recebimento);
523
646
  recebimento.fornecedores.forEach(function (fornecedor) {
524
647
  var form = _this.getFornecedorForm(fornecedor);
525
- _this.getFornecedores().push(form);
648
+ _this.getFornecedoresForm().push(form);
526
649
  fornecedor.contratos.forEach(function (contrato) {
527
650
  var contratoForm = _this.getContratoForm(contrato);
528
651
  _this.getContratos(form).push(contratoForm);
@@ -536,8 +659,9 @@ var RecebimentoFormComponent = /** @class */ (function () {
536
659
  });
537
660
  });
538
661
  });
539
- _this.formCarregado = true;
540
662
  _this.createdByErpDisableForm();
663
+ _this.formCarregado = true;
664
+ _this.carregandoErpRecebimento = false;
541
665
  });
542
666
  };
543
667
  RecebimentoFormComponent.prototype.onFilialLookupRequest = function (value) {
@@ -674,6 +798,9 @@ var RecebimentoFormComponent = /** @class */ (function () {
674
798
  _this.fornecedorSearchTotalRecords = list.totalElements;
675
799
  });
676
800
  };
801
+ RecebimentoFormComponent.prototype.montaQueryOrigemMercadoria = function (pessoaId) {
802
+ return "situacao eq 'ATIVO' and origem eq 'true' and pessoa.id eq '" + pessoaId + "'";
803
+ };
677
804
  RecebimentoFormComponent.prototype.onOrigemMercadoriaLookupRequest = function (value, fornecedorForm) {
678
805
  var _this = this;
679
806
  var sort = this.origemMercadoriaLookupDisplayFields.map(function (field) { return ({ field: field, order: 1 }); });
@@ -698,7 +825,8 @@ var RecebimentoFormComponent = /** @class */ (function () {
698
825
  return name + " eq '" + value + "'";
699
826
  })
700
827
  .join(" or ");
701
- filterQuery = "(" + filterQuery + ")" + (!!filterQuery ? ' and ' : '') + "situacao eq 'ATIVO' and pessoa.id eq '" + fornecedorForm.get("fornecedor").value.id + "'";
828
+ filterQuery = "(" + filterQuery + ")" + (!!filterQuery ? ' and ' : '');
829
+ filterQuery += this.montaQueryOrigemMercadoria(fornecedorForm.get("fornecedor").value.id);
702
830
  var displayFields = mergeUnique(this.origemMercadoriaLookupDisplayFields, this.origemMercadoriaAdvancedDisplayFields);
703
831
  this.pessoaEnderecoService
704
832
  .list({ filterQuery: filterQuery, displayFields: displayFields })
@@ -743,7 +871,8 @@ var RecebimentoFormComponent = /** @class */ (function () {
743
871
  return name + " eq '" + value + "'";
744
872
  })
745
873
  .join(" and ");
746
- filterQuery = filterQuery.concat((!!filterQuery ? ' and ' : '') + "situacao eq 'ATIVO' and pessoa.id eq '" + fornecedorForm.get("fornecedor").value.id + "'");
874
+ filterQuery = filterQuery.concat("" + (!!filterQuery ? ' and ' : ''));
875
+ filterQuery += this.montaQueryOrigemMercadoria(fornecedorForm.get("fornecedor").value.id);
747
876
  var displayFields = mergeUnique(this.origemMercadoriaLookupDisplayFields, this.origemMercadoriaAdvancedDisplayFields);
748
877
  this.pessoaEnderecoService
749
878
  .list({ page: page, sort: sort, filterQuery: filterQuery, displayFields: displayFields })
@@ -814,7 +943,7 @@ var RecebimentoFormComponent = /** @class */ (function () {
814
943
  .pipe(takeUntil(this.ngUnsubscribe))
815
944
  .subscribe(function (res) {
816
945
  _this.produtoSearchTotalRecords = res.qtdTotalRegistros;
817
- _this.produtoSearchGridData = res.produtos.map(Produto.fromDto);
946
+ _this.produtoSearchGridData = (res.produtos || []).map(function (produto) { return Produto.fromDto(produto); });
818
947
  });
819
948
  };
820
949
  RecebimentoFormComponent.prototype.onDerivacaoLookupRequest = function (value) {
@@ -957,7 +1086,7 @@ var RecebimentoFormComponent = /** @class */ (function () {
957
1086
  };
958
1087
  RecebimentoFormComponent.prototype.onTransgeniaLookupRequest = function (value) {
959
1088
  var _this = this;
960
- onLookupRequest(this.getTransgeniaSearchFields(), this.transgeniaLookupDisplayFields, this.transgeniaAdvancedDisplayFields, this.transgeniaLookupSeparator, this.transgeniaService, value, "empresa.id eq '" + this.formGroup.get('filial').value.empresa.id + "' and tipoParticipante eq '" + this.getTipoTransgenia() + "'")
1089
+ onLookupRequest(this.getTransgeniaSearchFields(), this.transgeniaLookupDisplayFields, this.transgeniaAdvancedDisplayFields, this.transgeniaLookupSeparator, this.transgeniaService, value, this.geraFiltroTransgenia())
961
1090
  .pipe(takeUntil(this.ngUnsubscribe))
962
1091
  .subscribe(function (list) { return _this.transgeniaLookupSuggestions = list.contents; });
963
1092
  };
@@ -984,6 +1113,10 @@ var RecebimentoFormComponent = /** @class */ (function () {
984
1113
  return name + " eq '" + value + "'";
985
1114
  })
986
1115
  .join(" and ");
1116
+ var filtroTransgenia = this.geraFiltroTransgenia();
1117
+ if (filtroTransgenia && filtroTransgenia.trim()) {
1118
+ filterQuery = filterQuery ? "(" + filterQuery + ") and " + filtroTransgenia : filtroTransgenia;
1119
+ }
987
1120
  var displayFields = mergeUnique(this.transgeniaLookupDisplayFields, this.transgeniaAdvancedDisplayFields);
988
1121
  this.transgeniaService
989
1122
  .list({ page: page, sort: sort, filterQuery: filterQuery, displayFields: displayFields })
@@ -1006,7 +1139,7 @@ var RecebimentoFormComponent = /** @class */ (function () {
1006
1139
  this.erroFornecedores = false;
1007
1140
  var form = this.getFornecedorForm(data);
1008
1141
  this.configureFornecedor(form);
1009
- this.getFornecedores().push(form);
1142
+ this.getFornecedoresForm().push(form);
1010
1143
  return form;
1011
1144
  };
1012
1145
  RecebimentoFormComponent.prototype.removeFornecedor = function (control) {
@@ -1015,12 +1148,12 @@ var RecebimentoFormComponent = /** @class */ (function () {
1015
1148
  header: this.translate.instant("yms.erp.remove_fornecedor_header"),
1016
1149
  message: this.translate.instant("yms.erp.remove_fornecedor_message"),
1017
1150
  accept: function () {
1018
- var index = _this.getFornecedores().controls.indexOf(control);
1019
- _this.getFornecedores().removeAt(index);
1151
+ var index = _this.getFornecedoresForm().controls.indexOf(control);
1152
+ _this.getFornecedoresForm().removeAt(index);
1020
1153
  }
1021
1154
  });
1022
1155
  };
1023
- RecebimentoFormComponent.prototype.getFornecedores = function () {
1156
+ RecebimentoFormComponent.prototype.getFornecedoresForm = function () {
1024
1157
  return this.formGroup.get("fornecedores");
1025
1158
  };
1026
1159
  RecebimentoFormComponent.prototype.addContrato = function (fornecedorForm) {
@@ -1099,7 +1232,7 @@ var RecebimentoFormComponent = /** @class */ (function () {
1099
1232
  RecebimentoFormComponent.prototype.showButtons = function () {
1100
1233
  if (!this.agenda)
1101
1234
  return false;
1102
- return [
1235
+ return this.isNew() || [
1103
1236
  StatusAgenda.AGENDADO,
1104
1237
  StatusAgenda.AGUARDANDO_CONFIRMACAO,
1105
1238
  StatusAgenda.AGUARDANDO_CONFIRMACAO_SOLICITANTE,
@@ -1112,6 +1245,44 @@ var RecebimentoFormComponent = /** @class */ (function () {
1112
1245
  }
1113
1246
  return false;
1114
1247
  };
1248
+ RecebimentoFormComponent.prototype.getTipoTransgenia = function () {
1249
+ if (this.formGroup.get("fornecedores").length <= 0) {
1250
+ return null;
1251
+ }
1252
+ var tipoParticipanteTransgeniaGeral = null;
1253
+ var recebimentoDto = RecebimentoContrato.toDto(this.formGroup.getRawValue());
1254
+ recebimentoDto.fornecedores.forEach(function (current) {
1255
+ if (current.fornecedor != null && current.fornecedor.tipoParticipante != null) {
1256
+ tipoParticipanteTransgeniaGeral = current.fornecedor.tipoParticipante;
1257
+ }
1258
+ });
1259
+ return tipoParticipanteTransgeniaGeral;
1260
+ };
1261
+ RecebimentoFormComponent.prototype.getFamiliaProduto = function () {
1262
+ var produto = this.formGroup.get("produto").value;
1263
+ if (produto && produto.familia && produto.familia.codigo) {
1264
+ return produto.familia.codigo;
1265
+ }
1266
+ if (produto && produto.familia) {
1267
+ return produto.familia;
1268
+ }
1269
+ return null;
1270
+ };
1271
+ RecebimentoFormComponent.prototype.geraFiltroTransgenia = function () {
1272
+ var buildString = "empresa.id eq '" + this.formGroup.get('filial').value.empresa.id + "'";
1273
+ buildString += "and situacao eq '" + Situacao.ATIVO + "'";
1274
+ var familia = this.getFamiliaProduto();
1275
+ if (familia) {
1276
+ buildString += " and ";
1277
+ buildString += "familia eq '" + familia + "'";
1278
+ }
1279
+ var tipoTransgenia = this.getTipoTransgenia();
1280
+ if (tipoTransgenia) {
1281
+ buildString += " and ";
1282
+ buildString += "tipoParticipante eq '" + tipoTransgenia + "'";
1283
+ }
1284
+ return buildString;
1285
+ };
1115
1286
  RecebimentoFormComponent.prototype.getNotaForm = function (data) {
1116
1287
  if (data === void 0) { data = {}; }
1117
1288
  return this.formBuilder.group({
@@ -1148,7 +1319,7 @@ var RecebimentoFormComponent = /** @class */ (function () {
1148
1319
  RecebimentoFormComponent.prototype.getFormGroup = function () {
1149
1320
  return this.formBuilder.group({
1150
1321
  id: [{ value: undefined, disabled: true }, Validators.compose([])],
1151
- filial: [undefined, Validators.required],
1322
+ filial: [{ value: undefined, disabled: false }, Validators.required],
1152
1323
  produto: [{ value: undefined, disabled: true }, Validators.compose([Validators.required])],
1153
1324
  derivacao: [{ value: undefined, disabled: true }, Validators.compose([])],
1154
1325
  transportadora: [{ value: undefined, disabled: false }, Validators.compose([])],
@@ -1206,7 +1377,6 @@ var RecebimentoFormComponent = /** @class */ (function () {
1206
1377
  this.addMessage("error", "Contrato não selecionado", "Nenhum contrato foi selecionado!");
1207
1378
  };
1208
1379
  RecebimentoFormComponent.prototype.onNotaSaved = function (value, fornecedorForm) {
1209
- var _this = this;
1210
1380
  if (this.contratoSelecionado === null) {
1211
1381
  this.mensagemContratoNaoSelecionado();
1212
1382
  return;
@@ -1219,7 +1389,6 @@ var RecebimentoFormComponent = /** @class */ (function () {
1219
1389
  return;
1220
1390
  }
1221
1391
  var existsFornecedor = this.formGroup.get("fornecedores").controls.find(function (form) { return (form.value.fornecedor || { id: undefined }).id === value.fornecedor.id; });
1222
- var fornecedorOfGroup = this.validarCnpjFornecedor((fornecedorForm.value.fornecedor || { cpfCnpj: undefined }).cpfCnpj);
1223
1392
  var infoNota = value.infoNota;
1224
1393
  var notaForm = this.getNotaForm({
1225
1394
  chaveNotaFiscal: infoNota.chave,
@@ -1237,21 +1406,6 @@ var RecebimentoFormComponent = /** @class */ (function () {
1237
1406
  var notasForm = this.getNotasFromContratos(fornecedorForm, this.contratoSelecionado.id);
1238
1407
  notasForm.push(notaForm);
1239
1408
  }
1240
- else if (fornecedorOfGroup) {
1241
- this.confirmationService.confirm({
1242
- header: 'Fornecedor do mesmo grupo já cadastrado',
1243
- message: 'Um fornecedor do mesmo grupo parece já ter sido selecionado, deseja vincular a nota ao mesmo fornecedor?',
1244
- accept: function () {
1245
- var notasForm = _this.getNotasFromContratos(fornecedorOfGroup, _this.contratoSelecionado.id);
1246
- notasForm.push(notaForm);
1247
- },
1248
- reject: function () {
1249
- var fornecedor = _this.addFornecedor({ fornecedor: Pessoa.fromDto(value.fornecedor), origemMercadoria: PessoaEndereco.fromDto(value.origemMercadoria) });
1250
- var notasForm = _this.getNotasFromContratos(fornecedor, _this.contratoSelecionado.id);
1251
- notasForm.push(notaForm);
1252
- }
1253
- });
1254
- }
1255
1409
  else {
1256
1410
  var fornecedor = this.addFornecedor({ fornecedor: Pessoa.fromDto(value.fornecedor), origemMercadoria: PessoaEndereco.fromDto(value.origemMercadoria) });
1257
1411
  var notasForm = this.getNotasFromContratos(fornecedor, this.contratoSelecionado.id);
@@ -1295,60 +1449,8 @@ var RecebimentoFormComponent = /** @class */ (function () {
1295
1449
  this.fornecedorNotasTokens.splice(this.fornecedorNotasTokens.indexOf(token), 1);
1296
1450
  this.fornecedorNotas = this.fornecedorNotas.filter(function (fornecedorNota) { return fornecedorNota.chaveNotaFiscal !== token.id; });
1297
1451
  };
1298
- RecebimentoFormComponent.prototype.adicionarNovaNota = function (response) {
1299
- var _this = this;
1300
- var value = (response.documentos || []).length ? response.documentos[0] : undefined;
1301
- if (!value)
1302
- return;
1303
- var itemProduto = value.itens[0] || { produto: undefined, derivacao: undefined };
1304
- var produto = Produto.fromDto(itemProduto.produto);
1305
- if (!this.formGroup.get("produto").value && !!itemProduto.produto) {
1306
- this.formGroup.get("produto").setValue(produto);
1307
- this.formGroup.get("derivacao").setValue(Derivacao.fromDto(itemProduto.derivacao));
1308
- }
1309
- else if (!!itemProduto.produto && !this.validateProduto(produto)) {
1310
- this.addNotaError();
1311
- return;
1312
- }
1313
- var fornecedor = Pessoa.fromDto(value.fornecedor);
1314
- var origemMercadoria = PessoaEndereco.fromDto(value.origemMercadoria);
1315
- var fornecedorForm = this.getFornecedores().controls.find(function (_a) {
1316
- var value = _a.value;
1317
- return value.fornecedor.id === fornecedor.id;
1318
- });
1319
- var fornecedorOfGroup = this.validarCnpjFornecedor(fornecedor.cpfCnpj);
1320
- if (fornecedorOfGroup) {
1321
- this.confirmationService.confirm({
1322
- header: 'Fornecedor do mesmo grupo já cadastrado',
1323
- message: 'Um fornecedor do mesmo grupo parece já ter sido selecionado, deseja vincular a nota ao mesmo fornecedor?',
1324
- accept: function () {
1325
- _this.addFornecedorNotasToken(value);
1326
- },
1327
- reject: function () {
1328
- if (!fornecedorForm) {
1329
- _this.addFornecedor({ fornecedor: fornecedor, origemMercadoria: origemMercadoria });
1330
- }
1331
- _this.addFornecedorNotasToken(value);
1332
- }
1333
- });
1334
- }
1335
- else if (!fornecedorForm) {
1336
- this.addFornecedor({ fornecedor: fornecedor, origemMercadoria: origemMercadoria });
1337
- this.addFornecedorNotasToken(value);
1338
- }
1339
- };
1340
- RecebimentoFormComponent.prototype.addFornecedorNotasToken = function (value) {
1341
- this.fornecedorNotasTokens.push({ id: this.chaveNotaFiscal, label: value.numero });
1342
- this.fornecedorNotas.push({
1343
- chaveNotaFiscal: this.chaveNotaFiscal,
1344
- serieNotaFiscal: value.serie,
1345
- serieLegalNotaFiscal: value.serieLegal,
1346
- numeroNotaFiscal: value.numero,
1347
- });
1348
- this.chaveNotaFiscal = undefined;
1349
- this.loading = false;
1350
- };
1351
1452
  RecebimentoFormComponent.prototype.removeNotaError = function () {
1453
+ this.erroFornecedoresNotaDuplicada = null;
1352
1454
  this.erroChaveNota = false;
1353
1455
  };
1354
1456
  RecebimentoFormComponent.prototype.addNotaError = function () {
@@ -1395,86 +1497,23 @@ var RecebimentoFormComponent = /** @class */ (function () {
1395
1497
  ];
1396
1498
  };
1397
1499
  RecebimentoFormComponent.prototype.getFornecedorSearchGridFields = function () {
1398
- return [
1399
- new FormField({
1400
- name: "codigo",
1401
- label: this.translate.instant("yms.erp.pessoa_codigo"),
1402
- type: FieldType.Integer,
1403
- }),
1404
- new FormField({
1405
- name: "nome",
1406
- label: this.translate.instant("yms.erp.pessoa_nome"),
1407
- type: FieldType.String,
1408
- }),
1409
- new FormField({
1410
- name: "cpfCnpj",
1411
- label: this.translate.instant("yms.erp.pessoa_cpfCnpj"),
1412
- type: FieldType.String,
1413
- }),
1414
- ];
1500
+ return this.getFornecedorSearchFields();
1415
1501
  };
1416
1502
  RecebimentoFormComponent.prototype.getOrigemMercadoriaFields = function () {
1417
1503
  return [
1418
- new FormField({
1419
- name: "codigo",
1420
- label: this.translate.instant("yms.erp.pessoa_endereco_codigo"),
1421
- type: FieldType.Integer
1422
- }),
1423
- new FormField({
1424
- name: "cep",
1425
- label: this.translate.instant("yms.erp.pessoa_endereco_cep"),
1426
- type: FieldType.String
1427
- }),
1428
- new FormField({
1429
- name: "endereco",
1430
- label: this.translate.instant("yms.erp.pessoa_endereco_endereco"),
1431
- type: FieldType.String
1432
- }),
1433
- new FormField({
1434
- name: "numero",
1435
- label: this.translate.instant("yms.erp.pessoa_endereco_numero"),
1436
- type: FieldType.String
1437
- }),
1438
- new FormField({
1439
- name: "bairro",
1440
- label: this.translate.instant("yms.erp.pessoa_endereco_bairro"),
1441
- type: FieldType.String
1442
- }),
1504
+ this.buildFormField.buildForInteger("codigo", "yms.erp.pessoa_endereco_codigo"),
1505
+ this.buildFormField.buildForString("cnpjCpf", "yms.erp.pessoa_endereco_cnpj_cpf"),
1506
+ this.buildFormField.buildForString("inscricaoEstadual", "yms.erp.pessoa_endereco_inscricao_estadual"),
1507
+ this.buildFormField.buildForString("cep", "yms.erp.pessoa_endereco_cep"),
1508
+ this.buildFormField.buildForString("endereco", "yms.erp.pessoa_endereco_endereco"),
1509
+ this.buildFormField.buildForString("numero", "yms.erp.pessoa_endereco_numero"),
1510
+ this.buildFormField.buildForString("bairro", "yms.erp.pessoa_endereco_bairro"),
1443
1511
  ];
1444
1512
  };
1445
1513
  RecebimentoFormComponent.prototype.getOrigemMercadoriaGridFields = function () {
1446
- return [
1447
- new FormField({
1448
- name: "codigo",
1449
- label: this.translate.instant("yms.erp.pessoa_endereco_codigo"),
1450
- type: FieldType.Integer
1451
- }),
1452
- new FormField({
1453
- name: "cep",
1454
- label: this.translate.instant("yms.erp.pessoa_endereco_cep"),
1455
- type: FieldType.String
1456
- }),
1457
- new FormField({
1458
- name: "endereco",
1459
- label: this.translate.instant("yms.erp.pessoa_endereco_endereco"),
1460
- type: FieldType.String
1461
- }),
1462
- new FormField({
1463
- name: "numero",
1464
- label: this.translate.instant("yms.erp.pessoa_endereco_numero"),
1465
- type: FieldType.String
1466
- }),
1467
- new FormField({
1468
- name: "bairro",
1469
- label: this.translate.instant("yms.erp.pessoa_endereco_bairro"),
1470
- type: FieldType.String
1471
- }),
1472
- new FormField({
1473
- name: "empresa.descricao",
1474
- label: this.translate.instant("yms.erp.empresa"),
1475
- type: FieldType.String
1476
- })
1477
- ];
1514
+ var origemMercadoriaFields = this.getOrigemMercadoriaFields();
1515
+ origemMercadoriaFields.push(this.buildFormField.buildForString("empresa.descricao", "yms.erp.empresa"));
1516
+ return origemMercadoriaFields;
1478
1517
  };
1479
1518
  RecebimentoFormComponent.prototype.getProdutoSearchFields = function () {
1480
1519
  return [
@@ -1491,23 +1530,13 @@ var RecebimentoFormComponent = /** @class */ (function () {
1491
1530
  ];
1492
1531
  };
1493
1532
  RecebimentoFormComponent.prototype.getProdutoSearchGridFields = function () {
1494
- return [
1495
- new FormField({
1496
- name: "codigo",
1497
- label: this.translate.instant("yms.erp.produto_codigo"),
1498
- type: FieldType.String,
1499
- }),
1500
- new FormField({
1501
- name: "descricao",
1502
- label: this.translate.instant("yms.erp.produto_descricao"),
1503
- type: FieldType.String,
1504
- }),
1505
- new FormField({
1506
- name: "descricaoComplementar",
1507
- label: this.translate.instant("yms.erp.produto_descricao_complementar"),
1508
- type: FieldType.String,
1509
- }),
1510
- ];
1533
+ var produtoSearchFields = this.getProdutoSearchFields();
1534
+ produtoSearchFields.push(new FormField({
1535
+ name: "descricaoComplementar",
1536
+ label: this.translate.instant("yms.erp.produto_descricao_complementar"),
1537
+ type: FieldType.String,
1538
+ }));
1539
+ return produtoSearchFields;
1511
1540
  };
1512
1541
  RecebimentoFormComponent.prototype.getAgendaSearchFields = function () {
1513
1542
  return [
@@ -1642,6 +1671,17 @@ var RecebimentoFormComponent = /** @class */ (function () {
1642
1671
  var value = this.formGroup.getRawValue();
1643
1672
  value.agenda = this.agenda;
1644
1673
  var recebimentoDto = RecebimentoContrato.toDto(value);
1674
+ var fornecedores = recebimentoDto.fornecedores;
1675
+ recebimentoDto.fornecedores.forEach(function (anterior) {
1676
+ recebimentoDto.fornecedores.forEach(function (posterior) {
1677
+ if (anterior.fornecedor.id === posterior.fornecedor.id &&
1678
+ anterior.origemMercadoria.id === posterior.origemMercadoria.id) {
1679
+ posterior.contratos.forEach(function (contrato) { return anterior.contratos.push(contrato); });
1680
+ fornecedores = fornecedores.splice(fornecedores.indexOf(posterior), 1);
1681
+ }
1682
+ });
1683
+ });
1684
+ recebimentoDto.fornecedores = fornecedores;
1645
1685
  var observable;
1646
1686
  if (this.isNew() && !value.id) {
1647
1687
  observable = this.recebimentoService.insert(recebimentoDto);
@@ -1769,7 +1809,7 @@ var RecebimentoFormComponent = /** @class */ (function () {
1769
1809
  RecebimentoFormComponent = tslib_1.__decorate([
1770
1810
  Component({
1771
1811
  selector: 'recebimento-form',
1772
- template: "<p-confirmDialog [acceptLabel]=\"'yes' | translate\" acceptIcon=\"\" [rejectLabel]=\"'no' | translate\" rejectIcon=\"\"></p-confirmDialog>\n<div *sLoadingState=\"loading\">\n <form [formGroup]=\"formGroup\">\n <div class=\"ui-g ui-fluid\">\n <div class=\"ui-g-12 ui-md-6\">\n <label for=\"chaveNotaFiscal\">{{\"yms.erp.recebimento_chave_nota_fiscal\" | translate}}</label>\n <input [class.ng-invalid]=\"erroChaveNota\" [(ngModel)]=\"chaveNotaFiscal\" [ngModelOptions]=\"{ standalone: true }\" type=\"text\" id=\"chaveNotaFiscal\" name=\"chaveNotaFiscal\" pInputText autocomplete=\"off\" (blur)=\"onBlurChaveNotaFiscal()\"/>\n <span class=\"nota-error\" *ngIf=\"erroChaveNota\">{{'yms.erp.produto_nota_error_detail' | translate}}</span>\n </div>\n </div>\n <div class=\"ui-fluid\">\n <div class=\"ui-g\">\n <div [attr.data-hidden]=\"true\" class=\"ui-g-12 ui-md-6\">\n <label for=\"id\">{{\"yms.erp.recebimento_id\" | translate}}</label>\n <input #idFormInput type=\"text\" id=\"id\" name=\"id\" pInputText formControlName=\"id\" autocomplete=\"off\" />\n </div>\n <div class=\"ui-g-12 ui-md-6 required\">\n <label for=\"filial\">{{\"yms.erp.filial\" | translate}}</label>\n <s-lookup dataKey=\"id\" id=\"filial\" name=\"filial\" formControlName=\"filial\"\n [searchFields]=\"filialSearchFields\" [searchGridFields]=\"filialSearchGridFields\"\n [searchGridData]=\"filialSearchGridData\" [multiple]=\"false\"\n [lookupSuggestions]=\"filialLookupSuggestions\"\n (onLookupRequest)=\"onFilialLookupRequest($event)\"\n (onSearchRequest)=\"onFilialSearchRequest($event)\" lookupDisplayField=\"label\"\n [searchTotalRecords]=\"filialSearchTotalRecords\"\n [searchTitle]=\"'yms.erp.filial_search_title' | translate\"\n [searchEmptyTitle]=\"'yms.erp.nothing_found' | translate\"\n [filterLabel]=\"'yms.erp.filter' | translate\" [clearLabel]=\"'yms.erp.clear' | translate\"\n [cancelLabel]=\"'yms.erp.cancel' | translate\" [selectLabel]=\"'yms.erp.select' | translate\"\n [searchTotalRecordsLabel]=\"'yms.erp.total_records' | translate: {value: filialSearchTotalRecords}\">\n </s-lookup>\n <s-control-errors [control]=\"formGroup.controls['filial']\"\n [errorMessages]=\"{ required: 'yms.erp.error_required' | translate }\"></s-control-errors>\n </div>\n <div class=\"ui-g-12 ui-md-6 required\">\n <label for=\"produto\">{{\"yms.erp.recebimento_produto\" | translate}}</label>\n <s-lookup dataKey=\"id\" id=\"produto\" name=\"produto\" formControlName=\"produto\"\n [searchFields]=\"produtoSearchFields\" [searchGridFields]=\"produtoSearchGridFields\"\n [searchGridData]=\"produtoSearchGridData\" [multiple]=\"false\"\n [lookupSuggestions]=\"produtoLookupSuggestions\"\n (onLookupRequest)=\"onProdutoLookupRequest($event)\"\n (onSearchRequest)=\"onProdutoSearchRequest($event)\" lookupDisplayField=\"label\"\n [searchTotalRecords]=produtoSearchTotalRecords\n [searchTitle]=\"'yms.erp.recebimento_produto_search_title' | translate\"\n [searchEmptyTitle]=\"'yms.erp.nothing_found' | translate\"\n [filterLabel]=\"'yms.erp.filter' | translate\" [clearLabel]=\"'yms.erp.clear' | translate\"\n [cancelLabel]=\"'yms.erp.cancel' | translate\" [selectLabel]=\"'yms.erp.select' | translate\"\n [searchTotalRecordsLabel]=\"'yms.erp.total_records' | translate: {value: produtoSearchTotalRecords}\">\n </s-lookup>\n <s-control-errors [control]=\"formGroup.controls['produto']\"\n [errorMessages]=\"{ required: 'yms.erp.error_required' | translate }\"></s-control-errors>\n </div>\n <div class=\"ui-g-12 ui-md-6\">\n <label for=\"derivacao\">{{\"yms.erp.recebimento_derivacao\" | translate}}</label>\n <s-lookup dataKey=\"id\" id=\"derivacao\" name=\"derivacao\" formControlName=\"derivacao\"\n [searchFields]=\"derivacaoSearchFields\" [searchGridFields]=\"derivacaoSearchGridFields\"\n [searchGridData]=\"derivacaoSearchGridData\" [multiple]=\"false\"\n [lookupSuggestions]=\"derivacaoLookupSuggestions\"\n (onLookupRequest)=\"onDerivacaoLookupRequest($event)\"\n (onSearchRequest)=\"onDerivacaoSearchRequest($event)\" lookupDisplayField=\"label\"\n [searchTotalRecords]=derivacaoSearchTotalRecords\n [searchTitle]=\"'yms.erp.recebimento_derivacao_search_title' | translate\"\n [searchEmptyTitle]=\"'yms.erp.nothing_found' | translate\"\n [filterLabel]=\"'yms.erp.filter' | translate\" [clearLabel]=\"'yms.erp.clear' | translate\"\n [cancelLabel]=\"'yms.erp.cancel' | translate\" [selectLabel]=\"'yms.erp.select' | translate\"\n [searchTotalRecordsLabel]=\"'yms.erp.total_records' | translate: {value: derivacaoSearchTotalRecords}\">\n </s-lookup>\n </div>\n <div class=\"ui-g-12 ui-md-6\">\n <label for=\"transportadora\">{{\"yms.erp.recebimento_transportadora\" | translate}}</label>\n <s-lookup dataKey=\"id\" id=\"transportadora\" name=\"transportadora\" formControlName=\"transportadora\"\n [searchFields]=\"transportadoraSearchFields\" [searchGridFields]=\"transportadoraSearchGridFields\"\n [searchGridData]=\"transportadoraSearchGridData\" [multiple]=\"false\"\n [lookupSuggestions]=\"transportadoraLookupSuggestions\"\n (onLookupRequest)=\"onTransportadoraLookupRequest($event)\"\n (onSearchRequest)=\"onTransportadoraSearchRequest($event)\" lookupDisplayField=\"label\"\n [searchTotalRecords]=\"transportadoraSearchTotalRecords\"\n [searchTitle]=\"'yms.erp.transportadora_search_title' | translate\"\n [searchEmptyTitle]=\"'yms.erp.nothing_found' | translate\"\n [filterLabel]=\"'yms.erp.filter' | translate\" [clearLabel]=\"'yms.erp.clear' | translate\"\n [cancelLabel]=\"'yms.erp.cancel' | translate\" [selectLabel]=\"'yms.erp.select' | translate\"\n [searchTotalRecordsLabel]=\"'yms.erp.total_records' | translate: {value: transportadoraSearchTotalRecords}\">\n </s-lookup>\n </div>\n <div class=\"ui-g-12 ui-md-6\">\n <label for=\"transgenia\">{{\"yms.erp.recebimento_transgenia\" | translate}}</label>\n <s-lookup dataKey=\"id\" id=\"transgenia\" name=\"transgenia\"\n formControlName=\"transgenia\" [searchFields]=\"transgeniaSearchFields\"\n [searchGridFields]=\"transgeniaSearchGridFields\"\n [searchGridData]=\"transgeniaSearchGridData\" [multiple]=\"false\"\n [lookupSuggestions]=\"transgeniaLookupSuggestions\"\n (onLookupRequest)=\"onTransgeniaLookupRequest($event)\"\n (onSearchRequest)=\"onTransgeniaSearchRequest($event)\" lookupDisplayField=\"label\"\n [searchTotalRecords]=\"transgeniaSearchTotalRecords\"\n [searchTitle]=\"'yms.erp.recebimento_transgenia_search_title' | translate\"\n [searchEmptyTitle]=\"'yms.erp.nothing_found' | translate\"\n [filterLabel]=\"'yms.erp.filter' | translate\" [clearLabel]=\"'yms.erp.clear' | translate\"\n [cancelLabel]=\"'yms.erp.cancel' | translate\" [selectLabel]=\"'yms.erp.select' | translate\"\n [searchTotalRecordsLabel]=\"'yms.erp.total_records' | translate: {value: transgeniaSearchTotalRecords}\">\n </s-lookup>\n </div>\n\n <div class=\"ui-md-12\">\n <s-button styleClass=\"btn-erp-forms\" *ngIf=\"showButtons() && !!formGroup.get('filial').value && !createdByErp\" iconClass=\"fas fa-plus\" label=\"Adicionar fornecedor\" priority=\"secondary\" (onClick)=\"addFornecedor()\"></s-button>\n <span style=\"display: block;\" class=\"input-error\" *ngIf=\"erroFornecedores\">{{'Selecione ao menos um fornecedor para continuar' | translate}}</span>\n </div>\n\n <form class=\"ui-g-12\" *ngFor=\"let fornecedorForm of getFornecedores().controls; let i = index;\" [formGroup]=\"fornecedorForm\">\n <p-panel [style]=\"{position: 'relative'}\" styleClass=\"form-group ui-g-12 ui-md-12\" [toggleable]=\"true\" >\n\n <p-header>\n Fornecedor {{+i+1}}\n <s-button \n style=\"display: inline-block; position: absolute; right: 50px; top: 10px\" \n *ngIf=\"showButtons() && !createdByErp\"\n iconClass=\"fas fa-trash\"\n label=\"Remover\"\n priority=\"default\"\n [auxiliary]=\"true\"\n (onClick)=\"removeFornecedor(fornecedorForm)\"\n >\n </s-button>\n </p-header>\n <div class=\"ui-g-12 ui-md-6 required\">\n <label for=\"fornecedor\">{{\"yms.erp.recebimento_fornecedor\" | translate}}</label>\n <s-lookup dataKey=\"id\" id=\"fornecedor\" name=\"fornecedor\" formControlName=\"fornecedor\"\n [searchFields]=\"fornecedorSearchFields\" [searchGridFields]=\"fornecedorSearchGridFields\"\n [searchGridData]=\"fornecedorSearchGridData\" [multiple]=\"false\"\n [lookupSuggestions]=\"fornecedorLookupSuggestions\"\n (onLookupRequest)=\"onFornecedorLookupRequest($event)\"\n (onSearchRequest)=\"onFornecedorSearchRequest($event)\" \n lookupDisplayField=\"label\"\n [searchTotalRecords]=fornecedorSearchTotalRecords\n [searchTitle]=\"'yms.erp.recebimento_fornecedor_search_title' | translate\"\n [searchEmptyTitle]=\"'yms.erp.nothing_found' | translate\"\n [filterLabel]=\"'yms.erp.filter' | translate\" [clearLabel]=\"'yms.erp.clear' | translate\"\n [cancelLabel]=\"'yms.erp.cancel' | translate\" [selectLabel]=\"'yms.erp.select' | translate\"\n [searchTotalRecordsLabel]=\"'yms.erp.total_records' | translate: {value: fornecedorSearchTotalRecords}\">\n </s-lookup>\n <s-control-errors [control]=\"fornecedorForm.get('fornecedor')\"\n [errorMessages]=\"{ required: 'yms.erp.error_required' | translate }\"></s-control-errors>\n </div>\n <div class=\"ui-g-12 ui-md-6 required\">\n <label for=\"origemMercadoria\">{{\"yms.erp.recebimento_origem_mercadoria\" | translate}}</label>\n <s-lookup dataKey=\"id\" id=\"origemMercadoria\" name=\"origemMercadoria\"\n formControlName=\"origemMercadoria\" [searchFields]=\"origemMercadoriaSearchFields\"\n [searchGridFields]=\"origemMercadoriaSearchGridFields\"\n [searchGridData]=\"origemMercadoriaSearchGridData\" [multiple]=\"false\"\n [lookupSuggestions]=\"origemMercadoriaLookupSuggestions\"\n (onLookupRequest)=\"onOrigemMercadoriaLookupRequest($event, fornecedorForm)\"\n (onSearchRequest)=\"onOrigemMercadoriaSearchRequest($event, fornecedorForm)\" lookupDisplayField=\"label\"\n [searchTotalRecords]=\"origemMercadoriaSearchTotalRecords\"\n [searchTitle]=\"'yms.erp.recebimento_pessoa_endereco_search_title' | translate\"\n [searchEmptyTitle]=\"'yms.erp.nothing_found' | translate\"\n [filterLabel]=\"'yms.erp.filter' | translate\" [clearLabel]=\"'yms.erp.clear' | translate\"\n [cancelLabel]=\"'yms.erp.cancel' | translate\" [selectLabel]=\"'yms.erp.select' | translate\"\n [searchTotalRecordsLabel]=\"'yms.erp.total_records' | translate: {value: origemMercadoriaSearchTotalRecords}\">\n </s-lookup>\n <s-control-errors [control]=\"fornecedorForm.get('origemMercadoria')\"\n [errorMessages]=\"{ required: 'yms.erp.error_required' | translate }\"></s-control-errors>\n </div>\n\n <div class=\"ui-g-12\">\n <label for=\"fornecedorNotas\">Notas a serem adicionadas</label>\n <s-token-list id=\"fornecedorNotas\" [tokens]=\"fornecedorNotasTokens\" (tokenSelected)=\"addFornecedorNotasTokenEmContrato(fornecedorForm, $event)\" (tokenRemoved)=\"removeFornecedorNotasTokenDoContrato($event)\" [removableTokens]=\"true\"></s-token-list>\n </div>\n\n <div class=\"ui-g-12\">\n <s-button label=\"Adicionar nota\" *ngIf=\"showButtons()\" styleClass=\"btn-erp-forms\" priority=\"secondary\" (onClick)=\"addNota(fornecedorForm)\" [disabled]=\"disableAdicionarNota()\"></s-button>\n <s-button label=\"Adicionar contrato\" *ngIf=\"showButtons() && !createdByErp\" styleClass=\"btn-erp-forms\" priority=\"secondary\" (onClick)=\"addContrato(fornecedorForm)\"></s-button>\n </div>\n\n <div class=\"ui-g-12 ui-md-6\">\n <label for=\"tipoNotaFiscal\">{{\"yms.erp.recebimento_tipo_nota_fiscal\" | translate}}</label>\n <p-dropdown inputId=\"tipoNotaFiscal\" name=\"tipoNotaFiscal\" [options]=\"tiposNota\" formControlName=\"tipoNotaFiscal\">\n </p-dropdown>\n </div>\n\n <div class=\"ui-g-12\">\n <h4>Contratos</h4>\n <p-table [value]=\"getContratos(fornecedorForm).controls\" [(selection)]=\"contratoSelecionado\">\n <ng-template pTemplate=\"body\" let-rowData>\n <tr [pSelectableRow]=\"rowData\">\n <td style=\"width: 50px\">\n <p-tableRadioButton [value]=\"rowData.get('contrato').value\"></p-tableRadioButton>\n </td>\n <td>\n <p-accordion>\n <p-accordionTab>\n <p-header>\n Contrato {{rowData.get('contrato').value.numero}}, Filial {{rowData.get('contrato').value.filial?.codigo}}\n\n <span *ngIf=\"showButtons() && !createdByErp\" style=\"margin-left: 10px; float: right;\" class=\"fas fa-trash\" (click)=\"removerContrato(fornecedorForm, rowData)\"></span>\n </p-header>\n \n <div class=\"detail-pane\" *ngFor=\"let item of getItensContrato(rowData).controls\">\n <div class=\"detail-span\">\n <span class=\"title\">Sequ\u00EAncia</span>\n <span class=\"data\">{{item.value?.item.sequencia}}</span>\n </div>\n </div>\n \n <div class=\"detail-pane\">\n <div class=\"detail-span\">\n <span class=\"title\">Notas</span>\n <span class=\"data\">\n <p-accordion>\n <p-accordionTab *ngFor=\"let nota of getNotas(rowData).controls\">\n <p-header>\n {{nota.get('chaveNotaFiscal').value || (nota.get('serieNotaFiscal').value + ' - ' + nota.get('numeroNotaFiscal').value)}}\n\n <span *ngIf=\"showButtons()\" style=\"margin-left: 10px; float: right;\" class=\"fas fa-trash\" (click)=\"removerNota(fornecedorForm, rowData, nota)\"></span>\n </p-header>\n \n <div class=\"detail-pane\">\n <div class=\"detail-span\">\n <span class=\"title\">S\u00E9rie nota fiscal</span>\n <span class=\"data\">{{nota.value?.serieNotaFiscal}}</span>\n </div>\n <div class=\"detail-span\">\n <span class=\"title\">S\u00E9rie legal nota fiscal</span>\n <span class=\"data\">{{nota.value?.serieLegalNotaFiscal}}</span>\n </div>\n <div class=\"detail-span\">\n <span class=\"title\">N\u00FAmero nota fiscal</span>\n <span class=\"data\">{{nota.value?.numeroNotaFiscal}}</span>\n </div>\n </div>\n \n </p-accordionTab> \n </p-accordion>\n </span>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n\n </p-panel>\n\n <div class=\"ui-g-12\" style=\"text-align: right;\" *ngIf=\"totalEixosContratados || totalEixosComposicao\">\n <label for=\"totalEixosContratados\" float=\"right\" style=\"display: inline;\">{{totalEixosContratados}} {{'yms.erp.total_eixos_contratados' | translate}} / </label>\n <label for=\"totalEixosComposicao\" float=\"right\" style=\"display: inline;\">{{totalEixosComposicao}} {{'yms.erp.total_eixos_composicao' | translate}}</label>\n </div>\n </form>\n\n </div>\n </div>\n </form>\n\n <div style=\"margin: 5px 0 5px 0;\">\n <s-button *ngIf=\"showButtons()\" priority=\"primary\" [label]=\"'save' | translate\" (onClick)=\"onSave()\" [disabled]=\"disableButtonSave\"></s-button>\n <s-button *ngIf=\"saveAndInitButton && showButtons()\" priority=\"primary\" [label]=\"'save_and_init' | translate\" (onClick)=\"onSave(true)\" [disabled]=\"disableButtonSave\"></s-button>\n </div>\n</div>",
1812
+ template: "<p-confirmDialog [acceptLabel]=\"'yes' | translate\" acceptIcon=\"\" [rejectLabel]=\"'no' | translate\" rejectIcon=\"\"></p-confirmDialog>\n<div *sLoadingState=\"loading\">\n <form [formGroup]=\"formGroup\">\n <div class=\"ui-g ui-fluid\">\n <div class=\"ui-g-12 ui-md-6\">\n <label for=\"chaveNotaFiscal\">{{\"yms.erp.recebimento_chave_nota_fiscal\" | translate}}</label>\n <input [class.ng-invalid]=\"erroChaveNota\" [(ngModel)]=\"chaveNotaFiscal\" [ngModelOptions]=\"{ standalone: true }\" type=\"text\" id=\"chaveNotaFiscal\" name=\"chaveNotaFiscal\" pInputText autocomplete=\"off\" (blur)=\"onBlurChaveNotaFiscal()\"/>\n <span class=\"nota-error\" *ngIf=\"erroChaveNota\">{{'yms.erp.produto_nota_error_detail' | translate}}</span>\n </div>\n </div>\n <div class=\"ui-fluid\">\n <div class=\"ui-g\">\n <div [attr.data-hidden]=\"true\" class=\"ui-g-12 ui-md-6\">\n <label for=\"id\">{{\"yms.erp.recebimento_id\" | translate}}</label>\n <input #idFormInput type=\"text\" id=\"id\" name=\"id\" pInputText formControlName=\"id\" autocomplete=\"off\" />\n </div>\n <div class=\"ui-g-12 ui-md-6 required\">\n <label for=\"filial\">{{\"yms.erp.filial\" | translate}}</label>\n <s-lookup dataKey=\"id\" id=\"filial\" name=\"filial\" formControlName=\"filial\"\n [searchFields]=\"filialSearchFields\" [searchGridFields]=\"filialSearchGridFields\"\n [searchGridData]=\"filialSearchGridData\" [multiple]=\"false\"\n [lookupSuggestions]=\"filialLookupSuggestions\"\n (onLookupRequest)=\"onFilialLookupRequest($event)\"\n (onSearchRequest)=\"onFilialSearchRequest($event)\" lookupDisplayField=\"label\"\n [searchTotalRecords]=\"filialSearchTotalRecords\"\n [searchTitle]=\"'yms.erp.filial_search_title' | translate\"\n [searchEmptyTitle]=\"'yms.erp.nothing_found' | translate\"\n [filterLabel]=\"'yms.erp.filter' | translate\" [clearLabel]=\"'yms.erp.clear' | translate\"\n [cancelLabel]=\"'yms.erp.cancel' | translate\" [selectLabel]=\"'yms.erp.select' | translate\"\n [searchTotalRecordsLabel]=\"'yms.erp.total_records' | translate: {value: filialSearchTotalRecords}\">\n </s-lookup>\n <s-control-errors [control]=\"formGroup.controls['filial']\"\n [errorMessages]=\"{ required: 'yms.erp.error_required' | translate }\"></s-control-errors>\n </div>\n <div class=\"ui-g-12 ui-md-6 required\">\n <label for=\"produto\">{{\"yms.erp.recebimento_produto\" | translate}}</label>\n <s-lookup dataKey=\"id\" id=\"produto\" name=\"produto\" formControlName=\"produto\"\n [searchFields]=\"produtoSearchFields\" [searchGridFields]=\"produtoSearchGridFields\"\n [searchGridData]=\"produtoSearchGridData\" [multiple]=\"false\"\n [lookupSuggestions]=\"produtoLookupSuggestions\"\n (onLookupRequest)=\"onProdutoLookupRequest($event)\"\n (onSearchRequest)=\"onProdutoSearchRequest($event)\" lookupDisplayField=\"label\"\n [searchTotalRecords]=produtoSearchTotalRecords\n [searchTitle]=\"'yms.erp.recebimento_produto_search_title' | translate\"\n [searchEmptyTitle]=\"'yms.erp.nothing_found' | translate\"\n [filterLabel]=\"'yms.erp.filter' | translate\" [clearLabel]=\"'yms.erp.clear' | translate\"\n [cancelLabel]=\"'yms.erp.cancel' | translate\" [selectLabel]=\"'yms.erp.select' | translate\"\n [searchTotalRecordsLabel]=\"'yms.erp.total_records' | translate: {value: produtoSearchTotalRecords}\">\n </s-lookup>\n <s-control-errors [control]=\"formGroup.controls['produto']\"\n [errorMessages]=\"{ required: 'yms.erp.error_required' | translate }\"></s-control-errors>\n </div>\n <div class=\"ui-g-12 ui-md-6\">\n <label for=\"derivacao\">{{\"yms.erp.recebimento_derivacao\" | translate}}</label>\n <s-lookup dataKey=\"id\" id=\"derivacao\" name=\"derivacao\" formControlName=\"derivacao\"\n [searchFields]=\"derivacaoSearchFields\" [searchGridFields]=\"derivacaoSearchGridFields\"\n [searchGridData]=\"derivacaoSearchGridData\" [multiple]=\"false\"\n [lookupSuggestions]=\"derivacaoLookupSuggestions\"\n (onLookupRequest)=\"onDerivacaoLookupRequest($event)\"\n (onSearchRequest)=\"onDerivacaoSearchRequest($event)\" lookupDisplayField=\"label\"\n [searchTotalRecords]=derivacaoSearchTotalRecords\n [searchTitle]=\"'yms.erp.recebimento_derivacao_search_title' | translate\"\n [searchEmptyTitle]=\"'yms.erp.nothing_found' | translate\"\n [filterLabel]=\"'yms.erp.filter' | translate\" [clearLabel]=\"'yms.erp.clear' | translate\"\n [cancelLabel]=\"'yms.erp.cancel' | translate\" [selectLabel]=\"'yms.erp.select' | translate\"\n [searchTotalRecordsLabel]=\"'yms.erp.total_records' | translate: {value: derivacaoSearchTotalRecords}\">\n </s-lookup>\n </div>\n <div class=\"ui-g-12 ui-md-6\">\n <label for=\"transportadora\">{{\"yms.erp.recebimento_transportadora\" | translate}}</label>\n <s-lookup dataKey=\"id\" id=\"transportadora\" name=\"transportadora\" formControlName=\"transportadora\"\n [searchFields]=\"transportadoraSearchFields\" [searchGridFields]=\"transportadoraSearchGridFields\"\n [searchGridData]=\"transportadoraSearchGridData\" [multiple]=\"false\"\n [lookupSuggestions]=\"transportadoraLookupSuggestions\"\n (onLookupRequest)=\"onTransportadoraLookupRequest($event)\"\n (onSearchRequest)=\"onTransportadoraSearchRequest($event)\" lookupDisplayField=\"label\"\n [searchTotalRecords]=\"transportadoraSearchTotalRecords\"\n [searchTitle]=\"'yms.erp.transportadora_search_title' | translate\"\n [searchEmptyTitle]=\"'yms.erp.nothing_found' | translate\"\n [filterLabel]=\"'yms.erp.filter' | translate\" [clearLabel]=\"'yms.erp.clear' | translate\"\n [cancelLabel]=\"'yms.erp.cancel' | translate\" [selectLabel]=\"'yms.erp.select' | translate\"\n [searchTotalRecordsLabel]=\"'yms.erp.total_records' | translate: {value: transportadoraSearchTotalRecords}\">\n </s-lookup>\n </div>\n <div class=\"ui-g-12 ui-md-6\">\n <label for=\"transgenia\">{{\"yms.erp.recebimento_transgenia\" | translate}}</label>\n <s-lookup dataKey=\"id\" id=\"transgenia\" name=\"transgenia\"\n formControlName=\"transgenia\" [searchFields]=\"transgeniaSearchFields\"\n [searchGridFields]=\"transgeniaSearchGridFields\"\n [searchGridData]=\"transgeniaSearchGridData\" [multiple]=\"false\"\n [lookupSuggestions]=\"transgeniaLookupSuggestions\"\n (onLookupRequest)=\"onTransgeniaLookupRequest($event)\"\n (onSearchRequest)=\"onTransgeniaSearchRequest($event)\" lookupDisplayField=\"label\"\n [searchTotalRecords]=\"transgeniaSearchTotalRecords\"\n [searchTitle]=\"'yms.erp.recebimento_transgenia_search_title' | translate\"\n [searchEmptyTitle]=\"'yms.erp.nothing_found' | translate\"\n [filterLabel]=\"'yms.erp.filter' | translate\" [clearLabel]=\"'yms.erp.clear' | translate\"\n [cancelLabel]=\"'yms.erp.cancel' | translate\" [selectLabel]=\"'yms.erp.select' | translate\"\n [searchTotalRecordsLabel]=\"'yms.erp.total_records' | translate: {value: transgeniaSearchTotalRecords}\">\n </s-lookup>\n </div>\n\n <div class=\"ui-md-12\">\n <s-button styleClass=\"btn-erp-forms\" *ngIf=\"showButtons() && !!formGroup.get('filial').value && !createdByErp\"\n iconClass=\"fas fa-plus\" label=\"Adicionar fornecedor\" priority=\"secondary\" (onClick)=\"addFornecedor()\"\n [disabled]=\"disableButtonSave || !permissions.editar\"></s-button>\n <span style=\"display: block;\" class=\"input-error\" *ngIf=\"erroFornecedores\">{{'Selecione ao menos um fornecedor para continuar' | translate}}</span>\n <span style=\"display: block;\" class=\"input-error\" *ngIf=\"erroFornecedoresNotaDuplicada\">{{ erroFornecedoresNotaDuplicada }}</span>\n </div>\n\n <form class=\"ui-g-12\" *ngFor=\"let fornecedorForm of getFornecedoresForm().controls; let i = index;\" [formGroup]=\"fornecedorForm\">\n <p-panel [style]=\"{position: 'relative'}\" styleClass=\"form-group ui-g-12 ui-md-12\" [toggleable]=\"true\" >\n\n <p-header>\n Fornecedor {{+i+1}}\n <s-button \n style=\"display: inline-block; position: absolute; right: 50px; top: 10px\" \n *ngIf=\"showButtons() && !createdByErp\"\n iconClass=\"fas fa-trash\"\n label=\"Remover\"\n priority=\"default\"\n [auxiliary]=\"true\"\n (onClick)=\"removeFornecedor(fornecedorForm)\"\n >\n </s-button>\n </p-header>\n <div class=\"ui-g-12 ui-md-6 required\">\n <label for=\"fornecedor\">{{\"yms.erp.recebimento_fornecedor\" | translate}}</label>\n <s-lookup dataKey=\"id\" id=\"fornecedor\" name=\"fornecedor\" formControlName=\"fornecedor\"\n [searchFields]=\"fornecedorSearchFields\" [searchGridFields]=\"fornecedorSearchGridFields\"\n [searchGridData]=\"fornecedorSearchGridData\" [multiple]=\"false\"\n [lookupSuggestions]=\"fornecedorLookupSuggestions\"\n (onLookupRequest)=\"onFornecedorLookupRequest($event)\"\n (onSearchRequest)=\"onFornecedorSearchRequest($event)\" \n lookupDisplayField=\"label\"\n [searchTotalRecords]=fornecedorSearchTotalRecords\n [searchTitle]=\"'yms.erp.recebimento_fornecedor_search_title' | translate\"\n [searchEmptyTitle]=\"'yms.erp.nothing_found' | translate\"\n [filterLabel]=\"'yms.erp.filter' | translate\" [clearLabel]=\"'yms.erp.clear' | translate\"\n [cancelLabel]=\"'yms.erp.cancel' | translate\" [selectLabel]=\"'yms.erp.select' | translate\"\n [searchTotalRecordsLabel]=\"'yms.erp.total_records' | translate: {value: fornecedorSearchTotalRecords}\">\n </s-lookup>\n <s-control-errors [control]=\"fornecedorForm.get('fornecedor')\"\n [errorMessages]=\"{ required: 'yms.erp.error_required' | translate }\"></s-control-errors>\n </div>\n <div class=\"ui-g-12 ui-md-6 required\">\n <label for=\"origemMercadoria\">{{\"yms.erp.recebimento_origem_mercadoria\" | translate}}</label>\n <s-lookup dataKey=\"id\" id=\"origemMercadoria\" name=\"origemMercadoria\"\n formControlName=\"origemMercadoria\" [searchFields]=\"origemMercadoriaSearchFields\"\n [searchGridFields]=\"origemMercadoriaSearchGridFields\"\n [searchGridData]=\"origemMercadoriaSearchGridData\" [multiple]=\"false\"\n [lookupSuggestions]=\"origemMercadoriaLookupSuggestions\"\n (onLookupRequest)=\"onOrigemMercadoriaLookupRequest($event, fornecedorForm)\"\n (onSearchRequest)=\"onOrigemMercadoriaSearchRequest($event, fornecedorForm)\" lookupDisplayField=\"label\"\n [searchTotalRecords]=\"origemMercadoriaSearchTotalRecords\"\n [searchTitle]=\"'yms.erp.recebimento_pessoa_endereco_search_title' | translate\"\n [searchEmptyTitle]=\"'yms.erp.nothing_found' | translate\"\n [filterLabel]=\"'yms.erp.filter' | translate\" [clearLabel]=\"'yms.erp.clear' | translate\"\n [cancelLabel]=\"'yms.erp.cancel' | translate\" [selectLabel]=\"'yms.erp.select' | translate\"\n [searchTotalRecordsLabel]=\"'yms.erp.total_records' | translate: {value: origemMercadoriaSearchTotalRecords}\">\n </s-lookup>\n <s-control-errors [control]=\"fornecedorForm.get('origemMercadoria')\"\n [errorMessages]=\"{ required: 'yms.erp.error_required' | translate }\"></s-control-errors>\n </div>\n\n <div class=\"ui-g-12\">\n <label for=\"fornecedorNotas\">Notas a serem adicionadas</label>\n <s-token-list id=\"fornecedorNotas\" [tokens]=\"fornecedorNotasTokens\" (tokenSelected)=\"addFornecedorNotasTokenEmContrato(fornecedorForm, $event)\" (tokenRemoved)=\"removeFornecedorNotasTokenDoContrato($event)\" [removableTokens]=\"true\"></s-token-list>\n </div>\n\n <div class=\"ui-g-12\">\n <s-button label=\"Adicionar nota\" *ngIf=\"showButtons()\" styleClass=\"btn-erp-forms\" priority=\"secondary\" (onClick)=\"addNota(fornecedorForm)\" [disabled]=\"disableAdicionarNota()\"></s-button>\n <s-button label=\"Adicionar contrato\" *ngIf=\"showButtons() && !createdByErp\" styleClass=\"btn-erp-forms\" priority=\"secondary\" (onClick)=\"addContrato(fornecedorForm)\"></s-button>\n </div>\n\n <div class=\"ui-g-12 ui-md-6\">\n <label for=\"tipoNotaFiscal\">{{\"yms.erp.recebimento_tipo_nota_fiscal\" | translate}}</label>\n <p-dropdown inputId=\"tipoNotaFiscal\" name=\"tipoNotaFiscal\" [options]=\"tiposNota\" formControlName=\"tipoNotaFiscal\">\n </p-dropdown>\n </div>\n\n <div class=\"ui-g-12\">\n <h4>Contratos</h4>\n <p-table [value]=\"getContratos(fornecedorForm).controls\" [(selection)]=\"contratoSelecionado\">\n <ng-template pTemplate=\"body\" let-rowData>\n <tr [pSelectableRow]=\"rowData\">\n <td style=\"width: 50px\">\n <p-tableRadioButton [value]=\"rowData.get('contrato').value\"></p-tableRadioButton>\n </td>\n <td>\n <p-accordion>\n <p-accordionTab>\n <p-header>\n Contrato {{rowData.get('contrato').value.numero}}, Filial {{rowData.get('contrato').value.filial?.codigo}}\n\n <span *ngIf=\"showButtons() && !createdByErp\" style=\"margin-left: 10px; float: right;\" class=\"fas fa-trash\" (click)=\"removerContrato(fornecedorForm, rowData)\"></span>\n </p-header>\n \n <div class=\"detail-pane\" *ngFor=\"let item of getItensContrato(rowData).controls\">\n <div class=\"detail-span\">\n <span class=\"title\">Sequ\u00EAncia</span>\n <span class=\"data\">{{item.value?.item.sequencia}}</span>\n </div>\n </div>\n \n <div class=\"detail-pane\">\n <div class=\"detail-span\">\n <span class=\"title\">Notas</span>\n <span class=\"data\">\n <p-accordion>\n <p-accordionTab *ngFor=\"let nota of getNotas(rowData).controls\">\n <p-header>\n {{nota.get('chaveNotaFiscal').value || (nota.get('serieNotaFiscal').value + ' - ' + nota.get('numeroNotaFiscal').value)}}\n\n <span *ngIf=\"showButtons()\" style=\"margin-left: 10px; float: right;\" class=\"fas fa-trash\" (click)=\"removerNota(fornecedorForm, rowData, nota)\"></span>\n </p-header>\n \n <div class=\"detail-pane\">\n <div class=\"detail-span\">\n <span class=\"title\">S\u00E9rie nota fiscal</span>\n <span class=\"data\">{{nota.value?.serieNotaFiscal}}</span>\n </div>\n <div class=\"detail-span\">\n <span class=\"title\">S\u00E9rie legal nota fiscal</span>\n <span class=\"data\">{{nota.value?.serieLegalNotaFiscal}}</span>\n </div>\n <div class=\"detail-span\">\n <span class=\"title\">N\u00FAmero nota fiscal</span>\n <span class=\"data\">{{nota.value?.numeroNotaFiscal}}</span>\n </div>\n </div>\n \n </p-accordionTab> \n </p-accordion>\n </span>\n </div>\n </div>\n </p-accordionTab>\n </p-accordion>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n\n </p-panel>\n\n <div class=\"ui-g-12\" style=\"text-align: right;\" *ngIf=\"totalEixosContratados || totalEixosComposicao\">\n <label for=\"totalEixosContratados\" float=\"right\" style=\"display: inline;\">{{totalEixosContratados}} {{'yms.erp.total_eixos_contratados' | translate}} / </label>\n <label for=\"totalEixosComposicao\" float=\"right\" style=\"display: inline;\">{{totalEixosComposicao}} {{'yms.erp.total_eixos_composicao' | translate}}</label>\n </div>\n </form>\n\n </div>\n </div>\n </form>\n\n <div style=\"margin: 5px 0 5px 0;\">\n <s-button *ngIf=\"showButtons()\" priority=\"primary\" [label]=\"'save' | translate\" (onClick)=\"onSave()\"\n [disabled]=\"disableButtonSave || !allPermissions.agenda.editar\"></s-button>\n <s-button *ngIf=\"saveAndInitButton && showButtons()\" priority=\"primary\" [label]=\"'save_and_init' | translate\"\n (onClick)=\"onSave(true)\" [disabled]=\"disableButtonSave || !allPermissions.agenda.editar\"></s-button>\n </div>\n</div>",
1773
1813
  providers: [
1774
1814
  ConfirmationService,
1775
1815
  ],
@@ -1800,9 +1840,10 @@ var RecebimentoFormComponent = /** @class */ (function () {
1800
1840
  ErpProcessService,
1801
1841
  ErpFormConfigService,
1802
1842
  VerificaNotafiscal,
1803
- HasChangeService])
1843
+ HasChangeService,
1844
+ BuildFormField])
1804
1845
  ], RecebimentoFormComponent);
1805
1846
  return RecebimentoFormComponent;
1806
1847
  }());
1807
1848
  export { RecebimentoFormComponent };
1808
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjZWJpbWVudG8tZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yc2lzdGVtYXMveW1zLWludGVncmF0aW9uLyIsInNvdXJjZXMiOlsic3JjL2VycC1zZW5pb3IvcmVjZWJpbWVudG8vZm9ybS9yZWNlYmltZW50by1mb3JtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDeEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDNUYsT0FBTyxFQUFpQixTQUFTLEVBQUUsS0FBSyxFQUFxQixXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNHLE9BQU8sRUFBbUIsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQVUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNsRixPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFELE9BQU8sS0FBSyxPQUFPLE1BQU0sUUFBUSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxhQUFhLEVBQVksTUFBTSxhQUFhLENBQUM7QUFDM0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxF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QVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ3hDLE9BQU8sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzFGLFNBQVMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6RSxjQUFjLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0UsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzVGLFVBQVUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hDLFNBQVMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6RSxXQUFXLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFB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QUFqNURELElBaTVEQztTQWo1RFksd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmVyaWZpY2FOb3RhZmlzY2FsIH0gZnJvbSAnLi4vLi4vY29yZS92ZXJpZmljYS1ub3RhLWZpc2NhbC92ZXJpZmljYU5vdGFGaXNjYWwnO1xuaW1wb3J0IHsgRXJwRm9ybUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLy4uLy4uL2NvcmUvZXJwLWZvcm0tY29uZmlnL2VycC1mb3JtLWNvbmZpZy1zZXJ2aWNlJztcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xuaW1wb3J0IHsgRmllbGRUeXBlLCBGb3JtRmllbGQsIElUb2tlbiB9IGZyb20gXCJAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBIb3RrZXksIEhvdGtleXNTZXJ2aWNlIH0gZnJvbSBcImFuZ3VsYXIyLWhvdGtleXNcIjtcbmltcG9ydCAqIGFzIF9tb21lbnQgZnJvbSBcIm1vbWVudFwiO1xuaW1wb3J0IHsgQ29uZmlybWF0aW9uU2VydmljZSwgRGlhbG9nU2VydmljZSwgU29ydE1ldGEgfSBmcm9tIFwicHJpbWVuZy9hcGlcIjtcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSBcInByaW1lbmcvY29tcG9uZW50cy9jb21tb24vbWVzc2FnZXNlcnZpY2VcIjtcbmltcG9ydCB7IGVtcHR5LCBmb3JrSm9pbiwgb2YsIFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgY29uY2F0TWFwLCBkZWJvdW5jZVRpbWUsIGZpbHRlciwgZmluYWxpemUsIG1hcCwgbWVyZ2VNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBGaWVsZEN1c3RvbWl6YXRpb25TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2ZpZWxkLWN1c3RvbWl6YXRpb24uc2VydmljZVwiO1xuaW1wb3J0IHsgRm9jdXNTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2ZvY3VzLnNlcnZpY2VcIjtcbmltcG9ydCB7IG9uTG9va3VwUmVxdWVzdCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9sb29rdXAtdXRpbHNcIjtcbmltcG9ydCB7IGRpYWxvZ0NvbmZpZywgaXNWYWxpZEZpbHRlciwgbWVyZ2VVbmlxdWUsIHVzZXJDYW5WaXN1YWxpemUgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IE5vdGFGb3JtQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvbm90YS1mb3JtL25vdGEtZm9ybS5jb21wb25lbnRcIjtcbmltcG9ydCB7IEFnZW5kYSB9IGZyb20gXCIuLi8uLi9jb3JlL2VudGl0aWVzL2FnZW5kYS9hZ2VuZGFcIjtcbmltcG9ydCB7IENvbnRyYXRvQ29tcHJhSXRlbSB9IGZyb20gXCIuLi8uLi9jb3JlL2VudGl0aWVzL2NvbnRyYXRvLWNvbXByYS1pdGVtL2NvbnRyYXRvLWNvbXByYS1pdGVtXCI7XG5pbXBvcnQgeyBDb250cmF0b0NvbXByYUR0byB9IGZyb20gXCIuLi8uLi9jb3JlL2VudGl0aWVzL2NvbnRyYXRvLWNvbXByYS9jb250cmF0by1jb21wcmEtZHRvXCI7XG5pbXBvcnQgeyBDb250cmF0b0NvbXByYVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY29yZS9lbnRpdGllcy9jb250cmF0by1jb21wcmEvY29udHJhdG8tY29tcHJhLnNlcnZpY2VcIjtcbmltcG9ydCB7IERlcml2YWNhbyB9IGZyb20gXCIuLi8uLi9jb3JlL2VudGl0aWVzL2Rlcml2YWNhby9kZXJpdmFjYW9cIjtcbmltcG9ydCB7IERlcml2YWNhb1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY29yZS9lbnRpdGllcy9kZXJpdmFjYW8vZGVyaXZhY2FvLnNlcnZpY2VcIjtcbmltcG9ydCB7IEZpbGlhbCB9IGZyb20gXCIuLi8uLi9jb3JlL2VudGl0aWVzL2ZpbGlhbC9maWxpYWxcIjtcbmltcG9ydCB7IEZpbGlhbFNlcnZpY2UsIFBlc3F1aXNhckZpbGlhaXNJbnB1dCB9IGZyb20gXCIuLi8uLi9jb3JlL2VudGl0aWVzL2ZpbGlhbC9maWxpYWwuc2VydmljZVwiO1xuaW1wb3J0IHsgUGVzc29hRW5kZXJlY28gfSBmcm9tIFwiLi4vLi4vY29yZS9lbnRpdGllcy9wZXNzb2EtZW5kZXJlY28vcGVzc29hLWVuZGVyZWNvXCI7XG5pbXBvcnQgeyBQZXNzb2FFbmRlcmVjb1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY29yZS9lbnRpdGllcy9wZXNzb2EtZW5kZXJlY28vcGVzc29hLWVuZGVyZWNvLnNlcnZpY2VcIjtcbmltcG9ydCB7IFBlc3NvYSB9IGZyb20gXCIuLi8uLi9jb3JlL2VudGl0aWVzL3Blc3NvYS9wZXNzb2FcIjtcbmltcG9ydCB7IFBlc3NvYVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY29yZS9lbnRpdGllcy9wZXNzb2EvcGVzc29hLnNlcnZpY2VcIjtcbmltcG9ydCB7IFByb2R1dG8gfSBmcm9tIFwiLi4vLi4vY29yZS9lbnRpdGllcy9wcm9kdXRvL3Byb2R1dG9cIjtcbmltcG9ydCB7IFByb2R1dG9SZWNlYmltZW50b1BhcmFtcywgUHJvZHV0b1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY29yZS9lbnRpdGllcy9wcm9kdXRvL3Byb2R1dG8uc2VydmljZVwiO1xuaW1wb3J0IHsgUmVjZWJpbWVudG9Db250cmF0byB9IGZyb20gXCIuLi8uLi9jb3JlL2VudGl0aWVzL3JlY2ViaW1lbnRvLWNvbnRyYXRvL3JlY2ViaW1lbnRvXCI7XG5pbXBvcnQgeyBSZWNlYmltZW50b0NvbnRyYXRvU2VydmljZSB9IGZyb20gXCIuLi8uLi9jb3JlL2VudGl0aWVzL3JlY2ViaW1lbnRvLWNvbnRyYXRvL3JlY2ViaW1lbnRvLnNlcnZpY2VcIjtcbmltcG9ydCB7IFRyYW5zZ2VuaWEgfSBmcm9tIFwiLi4vLi4vY29yZS9lbnRpdGllcy90cmFuc2dlbmlhL3RyYW5zZ2VuaWFcIjtcbmltcG9ydCB7IFRyYW5zZ2VuaWFTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2NvcmUvZW50aXRpZXMvdHJhbnNnZW5pYS90cmFuc2dlbmlhLnNlcnZpY2VcIjtcbmltcG9ydCB7IFRyYW5zcG9ydGFkb3JhIH0gZnJvbSBcIi4uLy4uL2NvcmUvZW50aXRpZXMvdHJhbnNwb3J0YWRvcmEvdHJhbnNwb3J0YWRvcmFcIjtcbmltcG9ydCB7IFRyYW5zcG9ydGFkb3JhU2VydmljZSB9IGZyb20gXCIuLi8uLi9jb3JlL2VudGl0aWVzL3RyYW5zcG9ydGFkb3JhL3RyYW5zcG9ydGFkb3JhLnNlcnZpY2VcIjtcbmltcG9ydCB7IFN0YXR1c0FnZW5kYSB9IGZyb20gXCIuLy4uLy4uL2NvcmUvZW51bXMvc3RhdHVzLWFnZW5kYVwiO1xuaW1wb3J0IHsgVGlwb05vdGFGaXNjYWwgfSBmcm9tIFwiLi4vLi4vY29yZS9lbnVtcy90aXBvLW5vdGEtZmlzY2FsXCI7XG5pbXBvcnQgeyBUaXBvUGFydGljaXBhbnRlVHJhbnNnZW5pYSB9IGZyb20gXCIuLi8uLi9jb3JlL2VudW1zL3RpcG8tcGFydGljaXBhbnRlLXRyYW5zZ2VuaWFcIjtcbmltcG9ydCB7IE5vdGFWYWxpZGF0b3JTZXJ2aWNlLCBQZXNxdWlzYXJEb2N1bWVudG9SZXNwb25zZSB9IGZyb20gXCIuLi8uLi9jb3JlL25vdGEtdmFsaWRhdG9yLnNlcnZpY2VcIjtcbmltcG9ydCB7IENvbnRyYXRvRm9ybUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb250cmF0by1mb3JtL2NvbnRyYXRvLWZvcm0uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBSZWNlYmltZW50b0NoZWdhZGFWZWljdWxvT3ZlcnJpZGUgfSBmcm9tIFwiLi4vcmVjZWJpbWVudG8tY2hlZ2FkYS12ZWljdWxvLm92ZXJyaWRlXCI7XG5pbXBvcnQgeyBBZ2VuZGFTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2NvcmUvZW50aXRpZXMvYWdlbmRhL2FnZW5kYS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBFcnBQcm9jZXNzRGF0YSB9IGZyb20gXCIuLi8uLi9jb3JlL2VycC1wcm9jZXNzLWRhdGEvZXJwLXByb2Nlc3MtZGF0YVwiO1xuaW1wb3J0IHsgRXJwUHJvY2Vzc1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY29yZS9lcnAtcHJvY2Vzcy1kYXRhL2VycC1wcm9jZXNzLXNlcnZpY2VcIjtcbmltcG9ydCB7IEhhc0NoYW5nZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL2hhcy1jaGFuZ2UvaGFzLWNoYW5nZS1zZXJ2aWNlJztcblxuY29uc3QgbW9tZW50ID0gX21vbWVudDtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdyZWNlYmltZW50by1mb3JtJyxcbiAgICB0ZW1wbGF0ZVVybDogXCIuL3JlY2ViaW1lbnRvLWZvcm0uY29tcG9uZW50Lmh0bWxcIixcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgQ29uZmlybWF0aW9uU2VydmljZSxcbiAgICBdLFxuICAgIHN0eWxlVXJsczogWycuLi8uLi9lcnAtc2VuaW9yLnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBSZWNlYmltZW50b0Zvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgcHVibGljIGxvY2FsZUNvbmZpZzogYW55ID0ge307XG4gICAgcHVibGljIGN1cnJlbmN5TG9jYWxlT3B0aW9uczogYW55ID0ge307XG4gICAgcHVibGljIHBlcm1pc3Npb25zOiBhbnkgPSB7fTtcbiAgICBwdWJsaWMgYWxsUGVybWlzc2lvbnM6IGFueSA9IHt9O1xuXG4gICAgcHVibGljIHZpc2libGVEaWFsb2cgPSBmYWxzZTtcbiAgICBwdWJsaWMgcXVhbnRpZGFkZVNlbGVjaW9uYWRhID0gMTtcblxuICAgIHB1YmxpYyBmb3JtR3JvdXA6IEZvcm1Hcm91cDtcbiAgICBwdWJsaWMgaXRlbUZvcm1Hcm91cDogRm9ybUdyb3VwO1xuICAgIHB1YmxpYyBsb2FkaW5nOiBib29sZWFuO1xuICAgIHB1YmxpYyBtYWluUGFuZWxDb2xsYXBzZWQgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBmaWxpYWxMb29rdXBTdWdnZXN0aW9uczogRmlsaWFsW107XG4gICAgcHVibGljIGZpbGlhbExvb2t1cERpc3BsYXlGaWVsZHMgPSBbXCJjb2RpZ29cIiwgXCJub21lXCIsIFwiZW1wcmVzYS5ub21lXCJdO1xuICAgIHB1YmxpYyBmaWxpYWxBZHZhbmNlZERpc3BsYXlGaWVsZHMgPSBbXCJpZFwiLCBcImNvZGlnb1wiLCBcIm5vbWVcIiwgXCJlbXByZXNhLm5vbWVcIl07XG4gICAgcHVibGljIGZpbGlhbExvb2t1cFNlcGFyYXRvciA9IFwiIC0gXCI7XG4gICAgcHVibGljIGZpbGlhbFNlYXJjaEZpZWxkczogRm9ybUZpZWxkW107XG4gICAgcHVibGljIGZpbGlhbFNlYXJjaEdyaWRGaWVsZHM6IEZvcm1GaWVsZFtdO1xuICAgIHB1YmxpYyBmaWxpYWxTZWFyY2hHcmlkRGF0YTogRmlsaWFsW107XG4gICAgcHVibGljIGZpbGlhbFNlYXJjaFRvdGFsUmVjb3JkczogbnVtYmVyO1xuXG4gICAgcHVibGljIGZvcm5lY2Vkb3JMb29rdXBTdWdnZXN0aW9uczogUGVzc29hW107XG4gICAgcHVibGljIGZvcm5lY2Vkb3JMb29rdXBEaXNwbGF5RmllbGRzID0gW1wiY29kaWdvXCIsIFwibm9tZVwiLCBcImNwZkNucGpcIl07XG4gICAgcHVibGljIGZvcm5lY2Vkb3JBZHZhbmNlZERpc3BsYXlGaWVsZHMgPSBbXCJpZFwiLCBcImNvZGlnb1wiLCBcIm5vbWVcIiwgXCJzaXR1YWNhb1wiLCBcImNwZkNucGpcIiwgXCJ0aXBvUGFydGljaXBhbnRlXCJdO1xuICAgIHB1YmxpYyBmb3JuZWNlZG9yTG9va3VwU2VwYXJhdG9yID0gXCIgLSBcIjtcbiAgICBwdWJsaWMgZm9ybmVjZWRvclNlYXJjaEZpZWxkczogRm9ybUZpZWxkW107XG4gICAgcHVibGljIGZvcm5lY2Vkb3JTZWFyY2hHcmlkRmllbGRzOiBGb3JtRmllbGRbXTtcbiAgICBwdWJsaWMgZm9ybmVjZWRvclNlYXJjaEdyaWREYXRhOiBQZXNzb2FbXTtcbiAgICBwdWJsaWMgZm9ybmVjZWRvclNlYXJjaFRvdGFsUmVjb3JkczogbnVtYmVyO1xuXG4gICAgcHVibGljIG9yaWdlbU1lcmNhZG9yaWFMb29rdXBTdWdnZXN0aW9uczogUGVzc29hRW5kZXJlY29bXTtcbiAgICBwdWJsaWMgb3JpZ2VtTWVyY2Fkb3JpYUxvb2t1cERpc3BsYXlGaWVsZHMgPSBbXCJjb2RpZ29cIiwgXCJjZXBcIiwgXCJlbmRlcmVjb1wiLCBcImVtcHJlc2EuZGVzY3JpY2FvXCJdO1xuICAgIHB1YmxpYyBvcmlnZW1NZXJjYWRvcmlhQWR2YW5jZWREaXNwbGF5RmllbGRzID0gW1wiaWRcIiwgXCJjb2RpZ29cIiwgXCJjZXBcIiwgXCJlbmRlcmVjb1wiLCBcIm51bWVyb1wiLCBcImNvbXBsZW1lbnRvXCIsIFwiY2lkYWRlLipcIiwgXCJiYWlycm9cIiwgXCJzaXR1YWNhb1wiLCBcImVtcHJlc2EuZGVzY3JpY2FvXCJdO1xuICAgIHB1YmxpYyBvcmlnZW1NZXJjYWRvcmlhTG9va3VwU2VwYXJhdG9yID0gXCIgLSBcIjtcbiAgICBwdWJsaWMgb3JpZ2VtTWVyY2Fkb3JpYVNlYXJjaEZpZWxkczogRm9ybUZpZWxkW107XG4gICAgcHVibGljIG9yaWdlbU1lcmNhZG9yaWFTZWFyY2hHcmlkRmllbGRzOiBGb3JtRmllbGRbXTtcbiAgICBwdWJsaWMgb3JpZ2VtTWVyY2Fkb3JpYVNlYXJjaEdyaWREYXRhOiBQZXNzb2FFbmRlcmVjb1tdO1xuICAgIHB1YmxpYyBvcmlnZW1NZXJjYWRvcmlhU2VhcmNoVG90YWxSZWNvcmRzOiBudW1iZXI7XG5cbiAgICBwdWJsaWMgcHJvZHV0b0xvb2t1cFN1Z2dlc3Rpb25zOiBQcm9kdXRvW107XG4gICAgcHVibGljIHByb2R1dG9Mb29rdXBEaXNwbGF5RmllbGRzID0gW1wiY29kaWdvXCIsIFwiZGVzY3JpY2FvXCIsIFwidGlwb1wiXTtcbiAgICBwdWJsaWMgcHJvZHV0b0FkdmFuY2VkRGlzcGxheUZpZWxkcyA9IFtcImlkXCIsIFwiY29kaWdvXCIsIFwiY29tcHJhZG9cIiwgXCJkZXNjcmljYW9cIiwgXCJwcm9kdXRvTWlzdG9cIiwgXCJzaXR1YWNhb1wiLCBcInRpcG9cIl07XG4gICAgcHVibGljIHByb2R1dG9Mb29rdXBTZXBhcmF0b3IgPSBcIiAtIFwiO1xuICAgIHB1YmxpYyBwcm9kdXRvU2VhcmNoRmllbGRzOiBGb3JtRmllbGRbXTtcbiAgICBwdWJsaWMgcHJvZHV0b1NlYXJjaEdyaWRGaWVsZHM6IEZvcm1GaWVsZFtdO1xuICAgIHB1YmxpYyBwcm9kdXRvU2VhcmNoR3JpZERhdGE6IFByb2R1dG9bXTtcbiAgICBwdWJsaWMgcHJvZHV0b1NlYXJjaFRvdGFsUmVjb3JkczogbnVtYmVyO1xuXG4gICAgcHVibGljIGFnZW5kYUxvb2t1cFN1Z2dlc3Rpb25zOiBBZ2VuZGFbXTtcbiAgICBwdWJsaWMgYWdlbmRhTG9va3VwRGlzcGxheUZpZWxkcyA9IFtcImlkXCIsIFwiZGVzY3JpY2FvXCJdO1xuICAgIHB1YmxpYyBhZ2VuZGFBZHZhbmNlZERpc3BsYXlGaWVsZHMgPSBbXCJpZFwiLCBcImRlc2NyaWNhb1wiXTtcbiAgICBwdWJsaWMgYWdlbmRhTG9va3VwU2VwYXJhdG9yID0gXCIgLSBcIjtcbiAgICBwdWJsaWMgYWdlbmRhU2VhcmNoRmllbGRzOiBGb3JtRmllbGRbXTtcbiAgICBwdWJsaWMgYWdlbmRhU2VhcmNoR3JpZEZpZWxkczogRm9ybUZpZWxkW107XG4gICAgcHVibGljIGFnZW5kYVNlYXJjaEdyaWREYXRhOiBBZ2VuZGFbXTtcbiAgICBwdWJsaWMgYWdlbmRhU2VhcmNoVG90YWxSZWNvcmRzOiBudW1iZXI7XG5cbiAgICBwdWJsaWMgZGVyaXZhY2FvTG9va3VwU3VnZ2VzdGlvbnM6IERlcml2YWNhb1tdO1xuICAgIHB1YmxpYyBkZXJpdmFjYW9Mb29rdXBEaXNwbGF5RmllbGRzID0gW1wiY29kaWdvXCIsIFwiZGVzY3JpY2FvXCJdO1xuICAgIHB1YmxpYyBkZXJpdmFjYW9BZHZhbmNlZERpc3BsYXlGaWVsZHMgPSBbXCJpZFwiLCBcImNvZGlnb1wiLCBcImRlc2NyaWNhb1wiXTtcbiAgICBwdWJsaWMgZGVyaXZhY2FvTG9va3VwU2VwYXJhdG9yID0gXCIgLSBcIjtcbiAgICBwdWJsaWMgZGVyaXZhY2FvU2VhcmNoRmllbGRzOiBGb3JtRmllbGRbXTtcbiAgICBwdWJsaWMgZGVyaXZhY2FvU2VhcmNoR3JpZEZpZWxkczogRm9ybUZpZWxkW107XG4gICAgcHVibGljIGRlcml2YWNhb1NlYXJjaEdyaWREYXRhOiBEZXJpdmFjYW9bXTtcbiAgICBwdWJsaWMgZGVyaXZhY2FvU2VhcmNoVG90YWxSZWNvcmRzOiBudW1iZXI7XG5cbiAgICBwdWJsaWMgdHJhbnNwb3J0YWRvcmFMb29rdXBTdWdnZXN0aW9uczogVHJhbnNwb3J0YWRvcmFbXTtcbiAgICBwdWJsaWMgdHJhbnNwb3J0YWRvcmFMb29rdXBEaXNwbGF5RmllbGRzID0gW1wiY29kaWdvXCIsIFwicGVzc29hLm5vbWVcIiwgXCJwZXNzb2EuY3BmQ25walwiXTtcbiAgICBwdWJsaWMgdHJhbnNwb3J0YWRvcmFBZHZhbmNlZERpc3BsYXlGaWVsZHMgPSBbXCJpZFwiLCBcImNvZGlnb1wiLCBcInBlc3NvYS5ub21lXCIsIFwicGVzc29hLmNwZkNucGpcIl07XG4gICAgcHVibGljIHRyYW5zcG9ydGFkb3JhTG9va3VwU2VwYXJhdG9yID0gXCIgLSBcIjtcbiAgICBwdWJsaWMgdHJhbnNwb3J0YWRvcmFTZWFyY2hGaWVsZHM6IEZvcm1GaWVsZFtdO1xuICAgIHB1YmxpYyB0cmFuc3BvcnRhZG9yYVNlYXJjaEdyaWRGaWVsZHM6IEZvcm1GaWVsZFtdO1xuICAgIHB1YmxpYyB0cmFuc3BvcnRhZG9yYVNlYXJjaEdyaWREYXRhOiBUcmFuc3BvcnRhZG9yYVtdO1xuICAgIHB1YmxpYyB0cmFuc3BvcnRhZG9yYVNlYXJjaFRvdGFsUmVjb3JkczogbnVtYmVyO1xuXG4gICAgcHVibGljIHRyYW5zZ2VuaWFMb29rdXBTdWdnZXN0aW9uczogVHJhbnNnZW5pYVtdO1xuICAgIHB1YmxpYyB0cmFuc2dlbmlhTG9va3VwRGlzcGxheUZpZWxkcyA9IFtcImNvZGlnb1wiLCBcImRlc2NyaWNhb1wiXTtcbiAgICBwdWJsaWMgdHJhbnNnZW5pYUFkdmFuY2VkRGlzcGxheUZpZWxkcyA9IFtcImlkXCIsIFwiY29kaWdvXCIsIFwiZGVzY3JpY2FvXCJdO1xuICAgIHB1YmxpYyB0cmFuc2dlbmlhTG9va3VwU2VwYXJhdG9yID0gXCIgLSBcIjtcbiAgICBwdWJsaWMgdHJhbnNnZW5pYVNlYXJjaEZpZWxkczogRm9ybUZpZWxkW107XG4gICAgcHVibGljIHRyYW5zZ2VuaWFTZWFyY2hHcmlkRmllbGRzOiBGb3JtRmllbGRbXTtcbiAgICBwdWJsaWMgdHJhbnNnZW5pYVNlYXJjaEdyaWREYXRhOiBUcmFuc2dlbmlhW107XG4gICAgcHVibGljIHRyYW5zZ2VuaWFTZWFyY2hUb3RhbFJlY29yZHM6IG51bWJlcjtcblxuICAgIHB1YmxpYyBkaXNhYmxlQnV0dG9uU2F2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBkaXNhYmxlT3JkZXJzQnV0dG9uczogYm9vbGVhbiA9IHRydWU7XG4gICAgcHVibGljIGNyZWF0ZWRCeUVycDogYm9vbGVhbjtcblxuICAgIHB1YmxpYyB0b3RhbEVpeG9zQ29udHJhdGFkb3M6IG51bWJlciA9IDA7XG4gICAgcHVibGljIHRvdGFsRWl4b3NDb21wb3NpY2FvOiBudW1iZXIgPSAwO1xuXG4gICAgcHVibGljIHRpcG9zTm90YTogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogVGlwb05vdGFGaXNjYWwgfVtdID0gW1xuICAgICAgICB7IGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC50aXBvX25vdGFfZmlzY2FsX2VtcHJlc2FfanVyaWRpY2FcIiksIHZhbHVlOiBUaXBvTm90YUZpc2NhbC5FTVBSRVNBX0pVUklESUNBIH0sXG4gICAgICAgIHsgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnRpcG9fbm90YV9maXNjYWxfcHJvZHV0b3JfcnVyYWxcIiksIHZhbHVlOiBUaXBvTm90YUZpc2NhbC5QUk9EVVRPUl9SVVJBTCB9LFxuICAgIF07XG5cbiAgICBwdWJsaWMgc2F2ZUFuZEluaXRCdXR0b246IGFueTtcblxuICAgIEBJbnB1dCgpIHByaXZhdGUgYWdlbmRhOiBBZ2VuZGE7XG5cbiAgICBAVmlld0NoaWxkKFwiY3VzdG9tVGVtcGxhdGVcIilcbiAgICBwdWJsaWMgY3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKFwiY3VzdG9tRm9ybUZpZWxkc1wiKVxuICAgIHB1YmxpYyBjdXN0b21Gb3JtRmllbGRzOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgcHVibGljIGNoYXZlTm90YUZpc2NhbDogc3RyaW5nO1xuICAgIHB1YmxpYyBlcnJvQ2hhdmVOb3RhID0gZmFsc2U7XG4gICAgcHVibGljIGVycm9Gb3JuZWNlZG9yZXMgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBub3Rhc1Rva2VuczogSVRva2VuW10gPSBbXTtcbiAgICBwdWJsaWMgZm9ybmVjZWRvck5vdGFzVG9rZW5zOiBJVG9rZW5bXSA9IFtdO1xuICAgIHB1YmxpYyBmb3JuZWNlZG9yTm90YXMgPSBbXTtcblxuICAgIHB1YmxpYyBjb250cmF0b1NlbGVjaW9uYWRvOiBhbnkgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3QoKTtcblxuICAgIHByaXZhdGUgZm9ybUNhcnJlZ2FkbzogYW55O1xuXG4gICAgcHJpdmF0ZSBlcnBQcm9jZXNzRGF0YTogRXJwUHJvY2Vzc0RhdGE7XG4gICAgcHJpdmF0ZSBlbmFibGVSZXZhbGlkYXRpb246IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIGNvbnRyYXRvczogYW55O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVjZWJpbWVudG9TZXJ2aWNlOiBSZWNlYmltZW50b0NvbnRyYXRvU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBob3RrZXlzU2VydmljZTogSG90a2V5c1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZmllbGRDdXN0b21pemF0aW9uOiBGaWVsZEN1c3RvbWl6YXRpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGZvY3VzU2VydmljZTogRm9jdXNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGZpbGlhbFNlcnZpY2U6IEZpbGlhbFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdHJhbnNwb3J0YWRvcmFTZXJ2aWNlOiBUcmFuc3BvcnRhZG9yYVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcGVzc29hRW5kZXJlY29TZXJ2aWNlOiBQZXNzb2FFbmRlcmVjb1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY29udHJhdG9Db21wcmFTZXJ2aWNlOiBDb250cmF0b0NvbXByYVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcGVzc29hU2VydmljZTogUGVzc29hU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBwcm9kdXRvU2VydmljZTogUHJvZHV0b1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZGVyaXZhY2FvU2VydmljZTogRGVyaXZhY2FvU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWNlYmltZW50b0NoZWdhZGFPdmVycmlkZTogUmVjZWJpbWVudG9DaGVnYWRhVmVpY3Vsb092ZXJyaWRlLFxuICAgICAgICBwcml2YXRlIG5vdGFWYWxpZGF0b3JTZXJ2aWNlOiBOb3RhVmFsaWRhdG9yU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2dlbmlhU2VydmljZTogVHJhbnNnZW5pYVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBhZ2VuZGFTZXJ2aWNlOiBBZ2VuZGFTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGVycFByb2Nlc3NTZXJ2aWNlOiBFcnBQcm9jZXNzU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBlcnBGb3JtQ29uZmlnU2VydmljZTogRXJwRm9ybUNvbmZpZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdmVyaWZpY2FOb3RhRmlzY2FsOiBWZXJpZmljYU5vdGFmaXNjYWwsXG4gICAgICAgIHByaXZhdGUgaGFzQ2hhbmdlU2VydmljZTogSGFzQ2hhbmdlU2VydmljZSxcblxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwID0gdGhpcy5nZXRGb3JtR3JvdXAoKTtcbiAgICAgICAgdGhpcy5pdGVtRm9ybUdyb3VwID0gdGhpcy5nZXRJdGVtRm9ybSgpO1xuXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcImZpbGlhbFwiKVxuICAgICAgICAgICAgLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHRoaXMub25GaWxpYWxWYWx1ZUNoYW5nZSk7XG5cbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KFwicHJvZHV0b1wiKVxuICAgICAgICAgICAgLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDUwMCksXG4gICAgICAgICAgICAgICAgZmlsdGVyKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVyaXZhY2FvID0gdGhpcy5mb3JtR3JvdXAuZ2V0KFwiZGVyaXZhY2FvXCIpLnZhbHVlIGFzIERlcml2YWNhbztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhZGVyaXZhY2FvICYmIGRlcml2YWNhby5wcm9kdXRvLmlkID09PSB2YWx1ZS5pZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5nZXQoXCJkZXJpdmFjYW9cIikuc2V0VmFsdWUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcImRlcml2YWNhb1wiKS5kaXNhYmxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAodmFsdWUgPT4gdGhpcy5kZXJpdmFjYW9TZXJ2aWNlLmxpc3Qoe1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRdWVyeTogYHByb2R1dG8uaWQgZXEgJyR7dmFsdWUuaWR9JyBhbmQgc2l0dWFjYW8gZXEgJ0FUSVZPJ2AsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2U6IDAsXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IDFcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHsgY29udGVudHMgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY29udGVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcImRlcml2YWNhb1wiKS5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcImRlcml2YWNhb1wiKS5zZXRWYWx1ZShjb250ZW50c1swXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KFwiZGVyaXZhY2FvXCIpLmRpc2FibGUoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucm91dGUuZGF0YS5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4gdGhpcy5vblJvdXRlRGF0YUNoYW5nZShkYXRhKSk7XG5cbiAgICAgICAgdGhpcy5yb3V0ZS5wYXJhbXMucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCh7IGFnZW5kYSB9KSA9PiB7XG4gICAgICAgICAgICBpZiAoYWdlbmRhID09ICduZXcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idXNjYXJGaWxpYWwoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRSZWNlYmltZW50byhhZ2VuZGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZvcm1Hcm91cFxuICAgICAgICAuZ2V0KCd0cmFuc3BvcnRhZG9yYScpXG4gICAgICAgIC52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgLnN1YnNjcmliZSh0aGlzLm9uQ2hhbmdlUmV2YWxpZGF0aW9uKTtcblxuICAgICAgICB0aGlzLmZvcm1Hcm91cFxuICAgICAgICAuZ2V0KCd0cmFuc2dlbmlhJylcbiAgICAgICAgLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKHRoaXMub25DaGFuZ2VSZXZhbGlkYXRpb24pO1xuXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwXG4gICAgICAgIC5nZXQoJ2Zvcm5lY2Vkb3JlcycpXG4gICAgICAgIC52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgLnN1YnNjcmliZSh0aGlzLm9uQ2hhbmdlUmV2YWxpZGF0aW9uKTtcblxuICAgICAgICB0aGlzLmZpbGlhbFNlYXJjaEZpZWxkcyA9IHRoaXMuZ2V0RmlsaWFsU2VhcmNoRmllbGRzKCk7XG4gICAgICAgIHRoaXMuZmlsaWFsU2VhcmNoR3JpZEZpZWxkcyA9IHRoaXMuZ2V0RmlsaWFsU2VhcmNoRmllbGRzKCk7XG5cbiAgICAgICAgdGhpcy5mb3JuZWNlZG9yU2VhcmNoRmllbGRzID0gdGhpcy5nZXRGb3JuZWNlZG9yU2VhcmNoRmllbGRzKCk7XG4gICAgICAgIHRoaXMuZm9ybmVjZWRvclNlYXJjaEdyaWRGaWVsZHMgPSB0aGlzLmdldEZvcm5lY2Vkb3JTZWFyY2hHcmlkRmllbGRzKCk7XG5cbiAgICAgICAgdGhpcy5vcmlnZW1NZXJjYWRvcmlhU2VhcmNoRmllbGRzID0gdGhpcy5nZXRPcmlnZW1NZXJjYWRvcmlhRmllbGRzKCk7XG4gICAgICAgIHRoaXMub3JpZ2VtTWVyY2Fkb3JpYVNlYXJjaEdyaWRGaWVsZHMgPSB0aGlzLmdldE9yaWdlbU1lcmNhZG9yaWFHcmlkRmllbGRzKCk7XG5cbiAgICAgICAgdGhpcy5wcm9kdXRvU2VhcmNoRmllbGRzID0gdGhpcy5nZXRQcm9kdXRvU2VhcmNoRmllbGRzKCk7XG4gICAgICAgIHRoaXMucHJvZHV0b1NlYXJjaEdyaWRGaWVsZHMgPSB0aGlzLmdldFByb2R1dG9TZWFyY2hHcmlkRmllbGRzKCk7XG5cbiAgICAgICAgdGhpcy5hZ2VuZGFTZWFyY2hGaWVsZHMgPSB0aGlzLmdldEFnZW5kYVNlYXJjaEZpZWxkcygpO1xuICAgICAgICB0aGlzLmFnZW5kYVNlYXJjaEdyaWRGaWVsZHMgPSB0aGlzLmdldEFnZW5kYVNlYXJjaEdyaWRGaWVsZHMoKTtcblxuICAgICAgICB0aGlzLmRlcml2YWNhb1NlYXJjaEZpZWxkcyA9IHRoaXMuZ2V0RGVyaXZhY2FvU2VhcmNoRmllbGRzKCk7XG4gICAgICAgIHRoaXMuZGVyaXZhY2FvU2VhcmNoR3JpZEZpZWxkcyA9IHRoaXMuZ2V0RGVyaXZhY2FvU2VhcmNoR3JpZEZpZWxkcygpO1xuXG4gICAgICAgIHRoaXMudHJhbnNwb3J0YWRvcmFTZWFyY2hGaWVsZHMgPSB0aGlzLmdldFRyYW5zcG9ydGFkb3JhU2VhcmNoRmllbGRzKCk7XG4gICAgICAgIHRoaXMudHJhbnNwb3J0YWRvcmFTZWFyY2hHcmlkRmllbGRzID0gdGhpcy5nZXRUcmFuc3BvcnRhZG9yYVNlYXJjaEdyaWRGaWVsZHMoKTtcblxuICAgICAgICB0aGlzLnRyYW5zZ2VuaWFTZWFyY2hGaWVsZHMgPSB0aGlzLmdldFRyYW5zZ2VuaWFTZWFyY2hGaWVsZHMoKTtcbiAgICAgICAgdGhpcy50cmFuc2dlbmlhU2VhcmNoR3JpZEZpZWxkcyA9IHRoaXMuZ2V0VHJhbnNnZW5pYVNlYXJjaEdyaWRGaWVsZHMoKTtcblxuICAgICAgICB0aGlzLnNldEhvdGtleXMoKTtcblxuICAgICAgICBpZiAodGhpcy5hZ2VuZGEgJiYgdGhpcy5hZ2VuZGEuZXh0ZXJuYWxUZW5hbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VHJhbnNwb3J0YWRvcmEodGhpcy5hZ2VuZGEuZXh0ZXJuYWxUZW5hbnQuY25waik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRvdGFsRWl4b3NDb21wb3NpY2FvID0gdGhpcy5hZ2VuZGEgJiYgdGhpcy5hZ2VuZGEudmVpY3VsbyA/IHRoaXMuYWdlbmRhLnZlaWN1bG8uZWl4b3MgfHwgMCA6IDA7XG5cbiAgICAgICAgY29uc3Qgc3RhdHVzQWdlbmRhID0gW1xuICAgICAgICAgICAgXCJBR1VBUkRBTkRPX0NPTkZJUk1BQ0FPX1NPTElDSVRBTlRFXCIsXG4gICAgICAgICAgICBcIkFHRU5EQURPXCIsXG4gICAgICAgICAgICBcIkFHVUFSREFORE9fQ09ORklSTUFDQU9cIixcbiAgICAgICAgICAgIFwiRU1fRVhFQ1VDQU9cIixcbiAgICAgICAgICAgIFwiUkVKRUlUQURPX1BPUl9WQUxJREFDQU9cIixcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAodGhpcy5hZ2VuZGEgJiYgIXN0YXR1c0FnZW5kYS5pbmNsdWRlcyh0aGlzLmFnZW5kYS5zdGF0dXMpKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5kaXNhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVCdXR0b25TYXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXJwUHJvY2Vzc1NlcnZpY2UuY3VycmVudC5zdWJzY3JpYmUobWVzc2FnZSA9PiB0aGlzLmVycFByb2Nlc3NEYXRhID0gbWVzc2FnZSk7XG4gICAgICAgIHRoaXMuZXJwRm9ybUNvbmZpZ1NlcnZpY2UuY3VycmVudC5zdWJzY3JpYmUobWVzc2FnZSA9PiB0aGlzLmVuYWJsZVJldmFsaWRhdGlvbiA9IG1lc3NhZ2UpO1xuXG4gICAgICAgIHRoaXMudmVyaWZpY2FTZVRlbUFsdGVyYWNhbygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmVyaWZpY2FTZVRlbUFsdGVyYWNhbygpIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtQ2FycmVnYWRvKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNDaGFuZ2VTZXJ2aWNlLmhhc0NoYW5nZSh0aGlzLmFnZW5kYS5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25DaGFuZ2VSZXZhbGlkYXRpb24gPSAoXykgPT4ge1xuICAgICAgICBpZiAodGhpcy5lcnBQcm9jZXNzRGF0YSAmJiB0aGlzLmZvcm1Hcm91cCkge1xuICAgICAgICAgICAgdGhpcy5lcnBQcm9jZXNzRGF0YSA9IHRoaXMuZXJwUHJvY2Vzc1NlcnZpY2UuYnVpbGRlckVycFByb2Nlc3NEYXRhKHRoaXMuZXJwUHJvY2Vzc0RhdGEsIHRoaXMuZm9ybUdyb3VwKTtcbiAgICAgICAgICAgIHRoaXMuZXJwUHJvY2Vzc1NlcnZpY2UuY2hhbmdlRGF0YSh0aGlzLmVycFByb2Nlc3NEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgY29uc3QgaW5wdXRMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJpbnB1dFwiKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJbnB1dCA9IEFycmF5LmZyb20oaW5wdXRMaXN0KS5maW5kKChmOiBhbnkpID0+ICFmLmRpc2FibGVkKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkSW5wdXQpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkSW5wdXQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdGhpcy5yZWNlYmltZW50b0NoZWdhZGFPdmVycmlkZS5pbml0aWFsaXplKCk7XG4gICAgICAgIHRoaXMuc2F2ZUFuZEluaXRCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5pdCcpO1xuICAgICAgICB0aGlzLmNyZWF0ZWRCeUVycERpc2FibGVGb3JtKCk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1DYXJyZWdhZG8pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc0NoYW5nZVNlcnZpY2UuaGFzQ2hhbmdlKHRoaXMuYWdlbmRhLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5yZWNlYmltZW50b0NoZWdhZGFPdmVycmlkZS5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlZEJ5RXJwRGlzYWJsZUZvcm0oKSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZU9yZGVyc0J1dHRvbnMgPSB0aGlzLmFnZW5kYS5jcmVhdGVkQnlFcnA7XG4gICAgICAgIGlmICh0aGlzLmFnZW5kYSAmJiB0aGlzLmFnZW5kYS5jcmVhdGVkQnlFcnApIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlZEJ5RXJwID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldCgnZmlsaWFsJykuZGlzYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KCdwcm9kdXRvJykuZGlzYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KCdkZXJpdmFjYW8nKS5kaXNhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVGb3JuZWNlZG9yZXMoKTtcblxuICAgICAgICAgICAgaWYgKCEhdGhpcy5mb3JtR3JvdXAuZ2V0KFwidHJhbnNwb3J0YWRvcmFcIikudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5nZXQoJ3RyYW5zcG9ydGFkb3JhJykuZGlzYWJsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGRpc2FibGVGb3JuZWNlZG9yZXMoKSB7ICAgICAgICBcbiAgICAgICAgKHRoaXMuZm9ybUdyb3VwLmdldChcImZvcm5lY2Vkb3Jlc1wiKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzLmZvckVhY2goZm9ybSA9PiBmb3JtLmdldChcImZvcm5lY2Vkb3JcIikuZGlzYWJsZSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0SG90a2V5cygpIHtcbiAgICAgICAgdGhpcy5ob3RrZXlzU2VydmljZS5hZGQoXG4gICAgICAgICAgICBuZXcgSG90a2V5KFxuICAgICAgICAgICAgICAgIFwiYWx0K3NoaWZ0K3hcIixcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBlcm1pc3Npb25zLmV4Y2x1aXIpIHRoaXMub25EZWxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW1wiSU5QVVRcIiwgXCJTRUxFQ1RcIiwgXCJURVhUQVJFQVwiXVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuaG90a2V5c1NlcnZpY2UuYWRkKFxuICAgICAgICAgICAgbmV3IEhvdGtleShcbiAgICAgICAgICAgICAgICBcImFsdCtzaGlmdCtzXCIsXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc05ldygpIHx8IHRoaXMucGVybWlzc2lvbnMuZWRpdGFyKSB0aGlzLm9uU2F2ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbXCJJTlBVVFwiLCBcIlNFTEVDVFwiLCBcIlRFWFRBUkVBXCJdXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5ob3RrZXlzU2VydmljZS5hZGQoXG4gICAgICAgICAgICBuZXcgSG90a2V5KFxuICAgICAgICAgICAgICAgIFwiYWx0K3NoaWZ0K2NcIixcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25DYW5jZWwoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW1wiSU5QVVRcIiwgXCJTRUxFQ1RcIiwgXCJURVhUQVJFQVwiXVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkJsdXJDaGF2ZU5vdGFGaXNjYWwoKSB7XG4gICAgICAgIGlmICh0aGlzLnZlcmlmaWNhTm90YUZpc2NhbC52ZXJpZmljYVNlTm90YUZpc2NhbEVzdGFEdXBsaWNhZGEodGhpcy5jaGF2ZU5vdGFGaXNjYWwsIHRoaXMuY29udHJhdG9zLCB0aGlzLmZvcm5lY2Vkb3JOb3Rhc1Rva2VucykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVtb3ZlTm90YUVycm9yKCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jaGF2ZU5vdGFGaXNjYWw7XG4gICAgICAgIGlmICghIXZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5tZW5zYWdlbUJ1c2NhbmRvTm90YSgpO1xuICAgICAgICAgICAgdGhpcy5ub3RhVmFsaWRhdG9yU2VydmljZS5wZXNxdWlzYXJEb2N1bWVudG9WYWxpZGFOb3RhRW1Vc28oe1xuICAgICAgICAgICAgICAgIGZpbGlhbElkOiAodGhpcy5mb3JtR3JvdXAuZ2V0KFwiZmlsaWFsXCIpLnZhbHVlICYmIHRoaXMuZm9ybUdyb3VwLmdldChcImZpbGlhbFwiKS52YWx1ZS5pZCkgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBjaGF2ZURvY3VtZW50bzogdmFsdWUudHJpbSgpXG4gICAgICAgICAgICB9KS5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLFxuICAgICAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMubG9hZGluZyA9IGZhbHNlKVxuICAgICAgICAgICAgKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB0aGlzLmFkaWNpb25hck5vdmFOb3RhKHJlc3BvbnNlKSk7XG4gICAgICAgIH0gXG4gICAgfVxuXG4gICAgcHVibGljIGlzTmV3KCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuZm9ybUdyb3VwLnZhbHVlLmlkO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVTdWdnZXN0aW9ucyh2YWx1ZTogYW55KSB7XG4gICAgICAgIGlmICh2YWx1ZS5mb3JuZWNlZG9yKSB7XG4gICAgICAgICAgICB2YWx1ZS5mb3JuZWNlZG9yLmxhYmVsID0gdGhpcy5nZXRTdWdnZXN0aW9uVmFsdWUoXG4gICAgICAgICAgICAgICAgW1wiaWRcIiwgXCJjb2RpZ29cIiwgXCJub21lXCIsIFwic2l0dWFjYW9cIl0sXG4gICAgICAgICAgICAgICAgXCJmb3JuZWNlZG9yXCIsXG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JuZWNlZG9yTG9va3VwU2VwYXJhdG9yXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHZhbHVlLmZvcm5lY2Vkb3IubGFiZWwudHJpbSgpID09PSB0aGlzLmZvcm5lY2Vkb3JMb29rdXBTZXBhcmF0b3IudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHZhbHVlLmZvcm5lY2Vkb3IubGFiZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUucHJvZHV0bykge1xuICAgICAgICAgICAgdmFsdWUucHJvZHV0by5sYWJlbCA9IHRoaXMuZ2V0U3VnZ2VzdGlvblZhbHVlKFxuICAgICAgICAgICAgICAgIFtcImlkXCIsIFwiY29kaWdvXCIsIFwiY29tcHJhZG9cIiwgXCJkZXNjcmljYW9cIiwgXCJwcm9kdXRvTWlzdG9cIiwgXCJzaXR1YWNhb1wiLCBcInRpcG9cIl0sXG4gICAgICAgICAgICAgICAgXCJwcm9kdXRvXCIsXG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9kdXRvTG9va3VwU2VwYXJhdG9yXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHZhbHVlLnByb2R1dG8ubGFiZWwudHJpbSgpID09PSB0aGlzLnByb2R1dG9Mb29rdXBTZXBhcmF0b3IudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHZhbHVlLnByb2R1dG8ubGFiZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUuYWdlbmRhKSB7XG4gICAgICAgICAgICB2YWx1ZS5hZ2VuZGEubGFiZWwgPSB0aGlzLmdldFN1Z2dlc3Rpb25WYWx1ZShbXCJpZFwiLCBcImRlc2NyaWNhb1wiXSwgXCJhZ2VuZGFcIiwgdmFsdWUsIHRoaXMuYWdlbmRhTG9va3VwU2VwYXJhdG9yKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5hZ2VuZGEubGFiZWwudHJpbSgpID09PSB0aGlzLmFnZW5kYUxvb2t1cFNlcGFyYXRvci50cmltKCkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdmFsdWUuYWdlbmRhLmxhYmVsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlLmRlcml2YWNhbykge1xuICAgICAgICAgICAgdmFsdWUuZGVyaXZhY2FvLmxhYmVsID0gdGhpcy5nZXRTdWdnZXN0aW9uVmFsdWUoXG4gICAgICAgICAgICAgICAgW1wiaWRcIiwgXCJjb2RpZ29cIiwgXCJkZXNjcmljYW9cIl0sXG4gICAgICAgICAgICAgICAgXCJkZXJpdmFjYW9cIixcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICB0aGlzLmRlcml2YWNhb0xvb2t1cFNlcGFyYXRvclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5kZXJpdmFjYW8ubGFiZWwudHJpbSgpID09PSB0aGlzLmRlcml2YWNhb0xvb2t1cFNlcGFyYXRvci50cmltKCkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdmFsdWUuZGVyaXZhY2FvLmxhYmVsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN1Z2dlc3Rpb25WYWx1ZShkaXNwbGF5RmllbGRzOiBzdHJpbmdbXSwgb3duZXJFbnRpdHk6IHN0cmluZywgdmFsdWU6IGFueSwgc2VwYXJhdG9yOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGRpc3BsYXlGaWVsZHNcbiAgICAgICAgICAgIC5tYXAoZmllbGQgPT4gdGhpcy5nZXRQcm9wKHZhbHVlLCBgJHtvd25lckVudGl0eX0uJHtmaWVsZH1gKSlcbiAgICAgICAgICAgIC5yZWR1Y2UoKGFjYzogYW55LCB2YWw6IGFueSkgPT4gYCR7YWNjfSR7c2VwYXJhdG9yfSR7dmFsfWApO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblJvdXRlRGF0YUNoYW5nZShkYXRhOiBhbnkpIHtcbiAgICAgICAgY29uc3QgeyBjdXJyZW5jeVN5bWJvbCwgdGhvdXNhbmRzU2VwYXJhdG9yLCBkZWNpbWFsU2VwYXJhdG9yIH0gPSBkYXRhLmxvY2FsZUNvbmZpZy5udW1iZXI7XG5cbiAgICAgICAgdGhpcy5sb2NhbGVDb25maWcgPSBkYXRhLmxvY2FsZUNvbmZpZztcbiAgICAgICAgdGhpcy5jdXJyZW5jeUxvY2FsZU9wdGlvbnMgPSB7XG4gICAgICAgICAgICBhbGlnbjogXCJsZWZ0XCIsXG4gICAgICAgICAgICBwcmVmaXg6IGN1cnJlbmN5U3ltYm9sLFxuICAgICAgICAgICAgdGhvdXNhbmRzOiB0aG91c2FuZHNTZXBhcmF0b3IsXG4gICAgICAgICAgICBkZWNpbWFsOiBkZWNpbWFsU2VwYXJhdG9yLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gZGF0YS5hbGxQZXJtaXNzaW9ucy5yZWNlYmltZW50bztcbiAgICAgICAgdGhpcy5hbGxQZXJtaXNzaW9ucyA9IGRhdGEuYWxsUGVybWlzc2lvbnM7XG4gICAgICAgIC8vdGhpcy52YWxpZGF0ZVZpc3VhbGl6YXRpb24oKTtcbiAgICAgICAgaWYgKGRhdGEuZW50aXR5KSB7XG4gICAgICAgICAgICBjb25zdCBjYW5FZGl0ID0gdGhpcy5wZXJtaXNzaW9ucy5lZGl0YXI7XG4gICAgICAgICAgICBpZiAoIWNhbkVkaXQpIHRoaXMuZm9ybUdyb3VwLmRpc2FibGUoKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlOiBhbnkgPSBSZWNlYmltZW50b0NvbnRyYXRvLmZyb21EdG8oZGF0YS5lbnRpdHkpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdWdnZXN0aW9ucyh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUobmV3IFJlY2ViaW1lbnRvQ29udHJhdG8oKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25DYW5jZWwoKSB7XG4gICAgICAgIHRoaXMuZ29CYWNrKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uU2VuZEZpbGUoZmlsZXNUb0RlbGV0ZTogYW55LCBmaWxlc1RvQ29tbWl0OiBhbnlbXSkge1xuICAgICAgICBjb25zdCBvYnNlcnZhYmxlczogYW55W10gPSBbXTtcblxuICAgICAgICBpZiAoIXRoaXMuZmllbGRDdXN0b21pemF0aW9uLmlzRW1wdHkoZmlsZXNUb0RlbGV0ZSkpIHtcbiAgICAgICAgICAgIG9ic2VydmFibGVzLnB1c2godGhpcy5maWVsZEN1c3RvbWl6YXRpb24uZGVsZXRlRmlsZXMoZmlsZXNUb0RlbGV0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5maWVsZEN1c3RvbWl6YXRpb24uaXNFbXB0eShmaWxlc1RvQ29tbWl0KSkge1xuICAgICAgICAgICAgb2JzZXJ2YWJsZXMucHVzaCh0aGlzLmZpZWxkQ3VzdG9taXphdGlvbi5jb21taXRGaWxlcyhmaWxlc1RvQ29tbWl0KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZmllbGRDdXN0b21pemF0aW9uLmlzRW1wdHkob2JzZXJ2YWJsZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ya0pvaW4ob2JzZXJ2YWJsZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9mKHt9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvblNhdmUoc3RhcnQ/OiBib29sZWFuKSB7XG4gICAgICAgIFxuICAgICAgICBpZiAoKHRoaXMuZm9ybUdyb3VwLmdldChcImZvcm5lY2Vkb3Jlc1wiKSBhcyBGb3JtQXJyYXkpLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9Gb3JuZWNlZG9yZXMgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZm9ybUdyb3VwLmludmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQWxsRm9ybUZpZWxkcyh0aGlzLmZvcm1Hcm91cCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLmlzTmV3KCkgIHx8ICF0aGlzLmVuYWJsZVJldmFsaWRhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2F2ZUFuZEluaXQoc3RhcnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lcnBQcm9jZXNzRGF0YSA9IHRoaXMuZXJwUHJvY2Vzc1NlcnZpY2UuYnVpbGRlckVycFByb2Nlc3NEYXRhVmFsaWRhTm90YU5vQ29udHJhdG8odGhpcy5lcnBQcm9jZXNzRGF0YSwgdGhpcy5mb3JtR3JvdXApO1xuICAgICAgICB0aGlzLmVycFByb2Nlc3NTZXJ2aWNlLmNoYW5nZURhdGFFcnAodGhpcy5lcnBQcm9jZXNzRGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzLmFnZW5kYVNlcnZpY2VcbiAgICAgICAgICAgIC5jaGVjYXJSZXZhbGlkYWNhbyh0aGlzLmVycFByb2Nlc3NEYXRhKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksXG4gICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5sb2FkaW5nID0gZmFsc2UpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5yZXF1ZXJSZXZhbGlkYWNhbykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dWFsaXphQWdlbmRhUGFyYVJlamVpdGFkb1BvclZhbGlkYWNhbygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlQW5kSW5pdChzdGFydCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhdHVhbGl6YUFnZW5kYVBhcmFSZWplaXRhZG9Qb3JWYWxpZGFjYW8oKSB7XG4gICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgICAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5wYXRpby5hZ2VuZGFfcmV2YWxpZGFjYW9fdGl0bGVcIiksXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLnBhdGlvLmFnZW5kYV9yZXZhbGlkYWNhb19tZXNzYWdlXCIpLFxuICAgICAgICAgICAgYWNjZXB0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNDaGFuZ2VTZXJ2aWNlLmhhc0NoYW5nZVNhdmUodGhpcy5hZ2VuZGEuaWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWdlbmRhLnN0YXR1cyA9IFN0YXR1c0FnZW5kYS5SRUpFSVRBRE9fUE9SX1ZBTElEQUNBTztcbiAgICAgICAgICAgICAgICB0aGlzLmFnZW5kYS5tb3RvcmlzdGEgPSB7aWQ6IHRoaXMuZXJwUHJvY2Vzc0RhdGEubW90b3Jpc3RhSWR9O1xuICAgICAgICAgICAgICAgIHRoaXMuYWdlbmRhLnZlaWN1bG8gPSB7aWQ6IHRoaXMuZXJwUHJvY2Vzc0RhdGEudmVpY3Vsb0lkfTtcbiAgICAgICAgICAgICAgICB0aGlzLmFnZW5kYVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmF0dWFsaXphckFnZW5kYSh0aGlzLmFnZW5kYSlcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNhdE1hcCgoXykgPT4gdGhpcy5nZXRTYXZlT2JzZXJ2YWJsZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMubG9hZGluZyA9IGZhbHNlKSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChfKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Y2Nlc3NNZXNzYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCIvY2hlZ2FkYS12ZWljdWxvXCJdLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlamVjdDogKCkgPT4gdGhpcy5sb2FkaW5nID0gZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2F2ZUFuZEluaXQoc3RhcnQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5nZXRTYXZlT2JzZXJ2YWJsZSgpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSxcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmxvYWRpbmcgPSBmYWxzZSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KFwiaWRcIikuc2V0VmFsdWUodmFsdWUuaWQgfHwgbnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWNjZXNzTWVzc2FnZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzQ2hhbmdlU2VydmljZS5oYXNDaGFuZ2VTYXZlKHRoaXMuYWdlbmRhLmlkKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnQgJiYgdGhpcy5zYXZlQW5kSW5pdEJ1dHRvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmVBbmRJbml0QnV0dG9uLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdWNjZXNzTWVzc2FnZSgpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgc2V2ZXJpdHk6IFwic3VjY2Vzc1wiLFxuICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInNhdmVkX21lc3NhZ2VfdGl0bGVcIiksXG4gICAgICAgICAgICBkZXRhaWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJzYXZlZF9tZXNzYWdlX2NvbnRlbnRcIiksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkRlbGV0ZSgpIHtcbiAgICAgICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAuZGVsZXRlX2NvbmZpcm1hdGlvbl9tZXNzYWdlXCIpLFxuICAgICAgICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5kZWxldGVfY29uZmlybWF0aW9uX3RpdGxlXCIpLFxuICAgICAgICAgICAgYWNjZXB0OiAoKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGVsZXRlT2JzZXJ2YWJsZSgpXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRUcmFuc3BvcnRhZG9yYSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgY25waiA9IHZhbHVlLnJlcGxhY2UoJy4nLCAnJykucmVwbGFjZSgnLycsICcnKS5yZXBsYWNlKCctJywgJycpO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyUXVlcnkgPSBgcGVzc29hLmNwZkNucGogZXEgJyR7Y25wan0nYDtcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0YWRvcmFTZXJ2aWNlLmxpc3QoeyBmaWx0ZXJRdWVyeSwgcGFnZTogMCwgc2l6ZTogMTAgfSlcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCh7IGNvbnRlbnRzIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IGNvbnRlbnRzWzBdLmNvZGlnbyA/IGNvbnRlbnRzWzBdLmNvZGlnby50b1N0cmluZygpIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGNvbnRlbnRzWzBdLmRlc2NyaWNhbyA/IGNvbnRlbnRzWzBdLmRlc2NyaWNhby50b1N0cmluZygpIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlc2NyaXB0aW9uLnRyaW0oKSAmJiAhY29kZS50cmltKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50c1swXS5sYWJlbCA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3ltcy5lcnAuZGVyaXZhY2FvX3NlbV9kZXNjcmljYW8nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNbMF0ubGFiZWwgPSBgJHtjb2RlfSAtICR7ZGVzY3JpcHRpb259YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldCgndHJhbnNwb3J0YWRvcmEnKS5zZXRWYWx1ZShjb250ZW50c1swXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQcm9wKG9iajogYW55LCBwYXRoOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoXCIuXCIpLnJlZHVjZSgocmVzdWx0OiBhbnksIHByb3A6IGFueSkgPT4gKHJlc3VsdFtwcm9wXSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHJlc3VsdFtwcm9wXSksIG9iaik7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJlY2ViaW1lbnRvKGFnZW5kYUlkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZWNlYmltZW50b1NlcnZpY2VcbiAgICAgICAgICAgIC5saXN0KHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJRdWVyeTogYGFnZW5kYS5pZCBlcSAnJHthZ2VuZGFJZH0nYCxcbiAgICAgICAgICAgICAgICBzaXplOiAxLFxuICAgICAgICAgICAgICAgIHBhZ2U6IDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSwgZmluYWxpemUoKCkgPT4gdGhpcy5sb2FkaW5nID0gZmFsc2UpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoeyBjb250ZW50cyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb250ZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idXNjYXJGaWxpYWwoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMudG90YWxFaXhvc0NvbnRyYXRhZG9zID0gY29udGVudHNbMF0uZWl4b3MgfHwgMDtcbiAgICAgICAgICAgICAgICB0aGlzLnRvdGFsRWl4b3NDb21wb3NpY2FvID0gY29udGVudHNbMF0uYWdlbmRhICYmIGNvbnRlbnRzWzBdLmFnZW5kYS52ZWljdWxvXG4gICAgICAgICAgICAgICAgICAgID8gY29udGVudHNbMF0uYWdlbmRhLnZlaWN1bG8uZWl4b3MgfHwgMCA6IDA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWNlYmltZW50byA9IFJlY2ViaW1lbnRvQ29udHJhdG8uZnJvbUR0byhjb250ZW50c1swXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZW5hYmxlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZShyZWNlYmltZW50byk7XG5cbiAgICAgICAgICAgICAgICByZWNlYmltZW50by5mb3JuZWNlZG9yZXMuZm9yRWFjaChmb3JuZWNlZG9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybSA9IHRoaXMuZ2V0Rm9ybmVjZWRvckZvcm0oZm9ybmVjZWRvcik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybmVjZWRvcmVzKCkucHVzaChmb3JtKTtcblxuICAgICAgICAgICAgICAgICAgICBmb3JuZWNlZG9yLmNvbnRyYXRvcy5mb3JFYWNoKGNvbnRyYXRvID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyYXRvRm9ybSA9IHRoaXMuZ2V0Q29udHJhdG9Gb3JtKGNvbnRyYXRvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJhdG9zKGZvcm0pLnB1c2goY29udHJhdG9Gb3JtKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhdG8uaXRlbnMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtRm9ybSA9IHRoaXMuZ2V0SXRlbUZvcm0oaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRJdGVuc0NvbnRyYXRvKGNvbnRyYXRvRm9ybSkucHVzaChpdGVtRm9ybSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhdG8ubm90YXMuZm9yRWFjaChub3RhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3RhRm9ybSA9IHRoaXMuZ2V0Tm90YUZvcm0obm90YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXROb3Rhcyhjb250cmF0b0Zvcm0pLnB1c2gobm90YUZvcm0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtQ2FycmVnYWRvID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlZEJ5RXJwRGlzYWJsZUZvcm0oKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkZpbGlhbExvb2t1cFJlcXVlc3QodmFsdWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBmaWx0ZXJJbnB1dCA9IHRoaXMuZ2V0RmlsaWFsU2VhcmNoRmllbGRzKClcbiAgICAgICAgICAgIC5maWx0ZXIoKHsgdHlwZSB9KSA9PiBpc1ZhbGlkRmlsdGVyKHR5cGUsIHZhbHVlKSlcbiAgICAgICAgICAgIC5yZWR1Y2UoKGEsIHsgbmFtZSwgdHlwZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09IEZpZWxkVHlwZS5JbnRlZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmEsIFtuYW1lXTogdmFsdWUucmVwbGFjZSgvXFxELywgXCJcIikgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYSwgW25hbWVdOiB2YWx1ZSB9O1xuICAgICAgICAgICAgfSwgeyBjbnBqczogdGhpcy5hZ2VuZGEucGxhbnRhLmNucGosIHBhZ2luYTogeyBsaW1pdDogMTAsIG9mZnNldDogMCB9IH0gYXMgUGVzcXVpc2FyRmlsaWFpc0lucHV0KTtcblxuICAgICAgICB0aGlzLmZpbGlhbFNlcnZpY2VcbiAgICAgICAgICAgIC5saXN0RmlsaWFpcyhmaWx0ZXJJbnB1dClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobGlzdDogYW55KSA9PiB0aGlzLmZpbGlhbExvb2t1cFN1Z2dlc3Rpb25zID0gbGlzdC5maWxpYWlzLm1hcChGaWxpYWwuZnJvbUR0bykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkZpbGlhbFNlYXJjaFJlcXVlc3QoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCB7IGZpcnN0LCByb3dzLCBtdWx0aVNvcnRNZXRhLCBmaWx0ZXJEYXRhIH0gPSBldmVudDtcbiAgICAgICAgY29uc3QgcGFnZSA9IGZpcnN0IC8gcm93cztcbiAgICAgICAgY29uc3Qgc29ydDogU29ydE1ldGFbXSA9IG11bHRpU29ydE1ldGE7XG4gICAgICAgIGNvbnN0IHNvcnRGb3JtYXR0ZWQgPSAhIShzb3J0IHx8IFtdKS5sZW5ndGggJiYgeyBjYW1wbzogc29ydFswXS5maWVsZCwgb3JkZW5hY2FvOiBzb3J0WzBdLm9yZGVyID4gMCA/ICdBc2MnIDogJ0Rlc2MnIH07XG4gICAgICAgIGNvbnN0IGZpbHRlcklucHV0ID0gdGhpcy5nZXRGaWxpYWxTZWFyY2hGaWVsZHMoKVxuICAgICAgICAgICAgLmZpbHRlcigoeyBuYW1lIH0pID0+IGZpbHRlckRhdGFbbmFtZV0gIT0gdW5kZWZpbmVkICYmIGZpbHRlckRhdGFbbmFtZV0gIT0gXCJcIilcbiAgICAgICAgICAgIC5yZWR1Y2UoKGEsIHsgbmFtZSwgdHlwZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWx0ZXJEYXRhW25hbWVdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBGaWVsZFR5cGUuSW50ZWdlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5hLCBbbmFtZV06IGAke3ZhbHVlfWAucmVwbGFjZSgvXFxELywgXCJcIikgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYSwgW25hbWVdOiB2YWx1ZSB9O1xuICAgICAgICAgICAgfSwgeyBjbnBqczogdGhpcy5hZ2VuZGEucGxhbnRhLmNucGosIHBhZ2luYTogeyBsaW1pdDogcm93cywgb2Zmc2V0OiBwYWdlLCBsaXN0YU9yZGVuYWNhbzogc29ydEZvcm1hdHRlZCA/IFt7IC4uLihzb3J0Rm9ybWF0dGVkKSB9XSA6IG51bGwgfSB9IGFzIFBlc3F1aXNhckZpbGlhaXNJbnB1dCk7XG5cbiAgICAgICAgdGhpcy5maWxpYWxTZXJ2aWNlXG4gICAgICAgICAgICAubGlzdEZpbGlhaXMoZmlsdGVySW5wdXQpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGxpc3Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsaWFsU2VhcmNoR3JpZERhdGEgPSBsaXN0LmZpbGlhaXMubWFwKEZpbGlhbC5mcm9tRHRvKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGlhbFNlYXJjaFRvdGFsUmVjb3JkcyA9IGxpc3QucXRkVG90YWxSZWdpc3Ryb3M7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Gb3JuZWNlZG9yTG9va3VwUmVxdWVzdCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHNvcnQgPSB0aGlzLmZvcm5lY2Vkb3JMb29rdXBEaXNwbGF5RmllbGRzLm1hcCgoZmllbGQ6IGFueSkgPT4gKHsgZmllbGQsIG9yZGVyOiAxIH0pKTtcblxuICAgICAgICBsZXQgZmlsdGVyUXVlcnkgPSB0aGlzLmdldEZvcm5lY2Vkb3JTZWFyY2hGaWVsZHMoKVxuICAgICAgICAgICAgLmZpbHRlcigoeyB0eXBlIH0pID0+IGlzVmFsaWRGaWx0ZXIodHlwZSwgdmFsdWUpKVxuICAgICAgICAgICAgLm1hcCgoeyBuYW1lLCB0eXBlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09IFwibnVtYmVyXCIpIHJldHVybiBgJHtuYW1lfSBlcSAke3ZhbHVlfWA7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuRGF0ZSkgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5UaW1lKSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7bW9tZW50KHZhbHVlKS5mb3JtYXQoXCJISDptbTpzc1wiKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5EYXRlVGltZSkgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSkuZm9ybWF0KCl9J2A7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuU3RyaW5nKSByZXR1cm4gYGNvbnRhaW5pbmcobG93ZXIoJHtuYW1lfSksIGxvd2VyKCcke3ZhbHVlLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKX0nKSlgO1xuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIGAke25hbWV9IGVxICcke3ZhbHVlfSdgO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiIG9yIFwiKTtcblxuICAgICAgICBmaWx0ZXJRdWVyeSA9IGAoJHtmaWx0ZXJRdWVyeX0pJHshIWZpbHRlclF1ZXJ5ID8gJyBhbmQgJyA6IFwiXCJ9c2l0dWFjYW8gZXEgJ0FUSVZPJyBhbmQgZm9ybmVjZWRvciBlcSB0cnVlYDtcblxuICAgICAgICBjb25zdCBkaXNwbGF5RmllbGRzID0gbWVyZ2VVbmlxdWUodGhpcy5mb3JuZWNlZG9yTG9va3VwRGlzcGxheUZpZWxkcywgdGhpcy5mb3JuZWNlZG9yQWR2YW5jZWREaXNwbGF5RmllbGRzKTtcbiAgICAgICAgdGhpcy5wZXNzb2FTZXJ2aWNlXG4gICAgICAgICAgICAubGlzdCh7IHNvcnQsIGZpbHRlclF1ZXJ5LCBkaXNwbGF5RmllbGRzIH0pXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgobGlzdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAuLi5saXN0LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50czogbGlzdC5jb250ZW50cy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5mb3JuZWNlZG9yTG9va3VwRGlzcGxheUZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaW5kZXhPZihcIi5cIikgPiAwKSByZXR1cm4gdGhpcy5nZXRQcm9wKGl0ZW0sIGZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1bZmllbGRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4odGhpcy5mb3JuZWNlZG9yTG9va3VwU2VwYXJhdG9yKSxcbiAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobGlzdDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JuZWNlZG9yTG9va3VwU3VnZ2VzdGlvbnMgPSBsaXN0LmNvbnRlbnRzO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRm9ybmVjZWRvclNlYXJjaFJlcXVlc3QoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCB7IGZpcnN0LCByb3dzLCBtdWx0aVNvcnRNZXRhLCBmaWx0ZXJEYXRhIH0gPSBldmVudDtcbiAgICAgICAgY29uc3QgcGFnZSA9IGZpcnN0IC8gcm93cztcbiAgICAgICAgY29uc3Qgc29ydCA9IG11bHRpU29ydE1ldGE7XG4gICAgICAgIGxldCBmaWx0ZXJRdWVyeSA9IHRoaXMuZ2V0Rm9ybmVjZWRvclNlYXJjaEZpZWxkcygpXG4gICAgICAgICAgICAuZmlsdGVyKCh7IG5hbWUgfSkgPT4gZmlsdGVyRGF0YVtuYW1lXSAhPSB1bmRlZmluZWQgJiYgZmlsdGVyRGF0YVtuYW1lXSAhPSBcIlwiKVxuICAgICAgICAgICAgLm1hcCgoeyBuYW1lLCB0eXBlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpbHRlckRhdGFbbmFtZV07XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09IFwibnVtYmVyXCIpIHJldHVybiBgJHtuYW1lfSBlcSAke3ZhbHVlfWA7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuRGF0ZSkgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5UaW1lKSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7bW9tZW50KHZhbHVlKS5mb3JtYXQoXCJISDptbTpzc1wiKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5EYXRlVGltZSkgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSkuZm9ybWF0KCl9J2A7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuRW51bSkgcmV0dXJuIGAke25hbWV9IGVxICcke3ZhbHVlfSdgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRmllbGRUeXBlLlN0cmluZykgcmV0dXJuIGBjb250YWluaW5nKGxvd2VyKCR7bmFtZX0pLCBsb3dlcignJHt2YWx1ZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIil9JykpYDtcbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBgJHtuYW1lfSBlcSAnJHt2YWx1ZX0nYDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihcIiBhbmQgXCIpO1xuXG4gICAgICAgIGZpbHRlclF1ZXJ5ID0gZmlsdGVyUXVlcnkuY29uY2F0KGAkeyEhZmlsdGVyUXVlcnkgPyAnIGFuZCAnIDogXCJcIn1zaXR1YWNhbyBlcSAnQVRJVk8nIGFuZCBmb3JuZWNlZG9yIGVxIHRydWVgKTtcblxuICAgICAgICBjb25zdCBkaXNwbGF5RmllbGRzID0gbWVyZ2VVbmlxdWUodGhpcy5mb3JuZWNlZG9yTG9va3VwRGlzcGxheUZpZWxkcywgdGhpcy5mb3JuZWNlZG9yQWR2YW5jZWREaXNwbGF5RmllbGRzKTtcbiAgICAgICAgdGhpcy5wZXNzb2FTZXJ2aWNlXG4gICAgICAgICAgICAubGlzdCh7IHBhZ2UsIHNvcnQsIGZpbHRlclF1ZXJ5LCBkaXNwbGF5RmllbGRzIH0pXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgobGlzdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAuLi5saXN0LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50czogbGlzdC5jb250ZW50cy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5mb3JuZWNlZG9yTG9va3VwRGlzcGxheUZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaW5kZXhPZihcIi5cIikgPiAwKSByZXR1cm4gdGhpcy5nZXRQcm9wKGl0ZW0sIGZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1bZmllbGRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4odGhpcy5mb3JuZWNlZG9yTG9va3VwU2VwYXJhdG9yKSxcbiAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobGlzdDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JuZWNlZG9yU2VhcmNoR3JpZERhdGEgPSBsaXN0LmNvbnRlbnRzO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybmVjZWRvclNlYXJjaFRvdGFsUmVjb3JkcyA9IGxpc3QudG90YWxFbGVtZW50cztcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbk9yaWdlbU1lcmNhZG9yaWFMb29rdXBSZXF1ZXN0KHZhbHVlOiBzdHJpbmcsIGZvcm5lY2Vkb3JGb3JtOiBGb3JtR3JvdXApIHtcbiAgICAgICAgY29uc3Qgc29ydCA9IHRoaXMub3JpZ2VtTWVyY2Fkb3JpYUxvb2t1cERpc3BsYXlGaWVsZHMubWFwKChmaWVsZDogYW55KSA9PiAoeyBmaWVsZCwgb3JkZXI6IDEgfSkpO1xuXG4gICAgICAgIGxldCBmaWx0ZXJRdWVyeSA9IHRoaXMuZ2V0T3JpZ2VtTWVyY2Fkb3JpYUZpZWxkcygpXG4gICAgICAgICAgICAuZmlsdGVyKCh7IHR5cGUgfSkgPT4gaXNWYWxpZEZpbHRlcih0eXBlLCB2YWx1ZSkpXG4gICAgICAgICAgICAubWFwKCh7IG5hbWUsIHR5cGUgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJudW1iZXJcIikgcmV0dXJuIGAke25hbWV9IGVxICR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5EYXRlKSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7bW9tZW50KHZhbHVlKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpfSdgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRmllbGRUeXBlLlRpbWUpIHJldHVybiBgJHtuYW1lfSBlcSAnJHttb21lbnQodmFsdWUpLmZvcm1hdChcIkhIOm1tOnNzXCIpfSdgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRmllbGRUeXBlLkRhdGVUaW1lKSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7bW9tZW50KHZhbHVlKS5mb3JtYXQoKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5TdHJpbmcpIHJldHVybiBgY29udGFpbmluZyhsb3dlcigke25hbWV9KSwgbG93ZXIoJyR7dmFsdWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpfScpKWA7XG4gICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7dmFsdWV9J2A7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oXCIgb3IgXCIpO1xuXG4gICAgICAgIGZpbHRlclF1ZXJ5ID0gYCgke2ZpbHRlclF1ZXJ5fSkkeyEhZmlsdGVyUXVlcnkgPyAnIGFuZCAnIDogJyd9c2l0dWFjYW8gZXEgJ0FUSVZPJyBhbmQgcGVzc29hLmlkIGVxICcke2Zvcm5lY2Vkb3JGb3JtLmdldChcImZvcm5lY2Vkb3JcIikudmFsdWUuaWR9J2A7XG5cbiAgICAgICAgY29uc3QgZGlzcGxheUZpZWxkcyA9IG1lcmdlVW5pcXVlKHRoaXMub3JpZ2VtTWVyY2Fkb3JpYUxvb2t1cERpc3BsYXlGaWVsZHMsIHRoaXMub3JpZ2VtTWVyY2Fkb3JpYUFkdmFuY2VkRGlzcGxheUZpZWxkcyk7XG4gICAgICAgIHRoaXMucGVzc29hRW5kZXJlY29TZXJ2aWNlXG4gICAgICAgICAgICAubGlzdCh7IGZpbHRlclF1ZXJ5LCBkaXNwbGF5RmllbGRzIH0pXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgobGlzdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAuLi5saXN0LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50czogbGlzdC5jb250ZW50cy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5vcmlnZW1NZXJjYWRvcmlhTG9va3VwRGlzcGxheUZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaW5kZXhPZihcIi5cIikgPiAwKSByZXR1cm4gdGhpcy5nZXRQcm9wKGl0ZW0sIGZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1bZmllbGRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4odGhpcy5vcmlnZW1NZXJjYWRvcmlhTG9va3VwU2VwYXJhdG9yKSxcbiAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobGlzdDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcmlnZW1NZXJjYWRvcmlhTG9va3VwU3VnZ2VzdGlvbnMgPSBsaXN0LmNvbnRlbnRzO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uT3JpZ2VtTWVyY2Fkb3JpYVNlYXJjaFJlcXVlc3QoZXZlbnQ6IGFueSwgZm9ybmVjZWRvckZvcm06IEZvcm1Hcm91cCkge1xuICAgICAgICBjb25zdCB7IGZpcnN0LCByb3dzLCBtdWx0aVNvcnRNZXRhLCBmaWx0ZXJEYXRhIH0gPSBldmVudDtcbiAgICAgICAgY29uc3QgcGFnZSA9IGZpcnN0IC8gcm93cztcbiAgICAgICAgY29uc3Qgc29ydCA9IG11bHRpU29ydE1ldGE7XG4gICAgICAgIGxldCBmaWx0ZXJRdWVyeSA9IHRoaXMuZ2V0T3JpZ2VtTWVyY2Fkb3JpYUZpZWxkcygpXG4gICAgICAgICAgICAuZmlsdGVyKCh7IG5hbWUgfSkgPT4gZmlsdGVyRGF0YVtuYW1lXSAhPSB1bmRlZmluZWQgJiYgZmlsdGVyRGF0YVtuYW1lXSAhPSBcIlwiKVxuICAgICAgICAgICAgLm1hcCgoeyBuYW1lLCB0eXBlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpbHRlckRhdGFbbmFtZV07XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09IFwibnVtYmVyXCIpIHJldHVybiBgJHtuYW1lfSBlcSAke3ZhbHVlfWA7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuRGF0ZSkgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5UaW1lKSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7bW9tZW50KHZhbHVlKS5mb3JtYXQoXCJISDptbTpzc1wiKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5EYXRlVGltZSkgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSkuZm9ybWF0KCl9J2A7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuRW51bSkgcmV0dXJuIGAke25hbWV9IGVxICcke3ZhbHVlfSdgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRmllbGRUeXBlLlN0cmluZykgcmV0dXJuIGBjb250YWluaW5nKGxvd2VyKCR7bmFtZX0pLCBsb3dlcignJHt2YWx1ZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIil9JykpYDtcbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBgJHtuYW1lfSBlcSAnJHt2YWx1ZX0nYDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihcIiBhbmQgXCIpO1xuXG4gICAgICAgIGZpbHRlclF1ZXJ5ID0gZmlsdGVyUXVlcnkuY29uY2F0KGAkeyEhZmlsdGVyUXVlcnkgPyAnIGFuZCAnIDogJyd9c2l0dWFjYW8gZXEgJ0FUSVZPJyBhbmQgcGVzc29hLmlkIGVxICcke2Zvcm5lY2Vkb3JGb3JtLmdldChcImZvcm5lY2Vkb3JcIikudmFsdWUuaWR9J2ApO1xuXG4gICAgICAgIGNvbnN0IGRpc3BsYXlGaWVsZHMgPSBtZXJnZVVuaXF1ZSh0aGlzLm9yaWdlbU1lcmNhZG9yaWFMb29rdXBEaXNwbGF5RmllbGRzLCB0aGlzLm9yaWdlbU1lcmNhZG9yaWFBZHZhbmNlZERpc3BsYXlGaWVsZHMpO1xuICAgICAgICB0aGlzLnBlc3NvYUVuZGVyZWNvU2VydmljZVxuICAgICAgICAgICAgLmxpc3QoeyBwYWdlLCBzb3J0LCBmaWx0ZXJRdWVyeSwgZGlzcGxheUZpZWxkcyB9KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGxpc3Q6IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgLi4ubGlzdCxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudHM6IGxpc3QuY29udGVudHMubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMub3JpZ2VtTWVyY2Fkb3JpYUxvb2t1cERpc3BsYXlGaWVsZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZpZWxkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmluZGV4T2YoXCIuXCIpID4gMCkgcmV0dXJuIHRoaXMuZ2V0UHJvcChpdGVtLCBmaWVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtW2ZpZWxkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKHRoaXMub3JpZ2VtTWVyY2Fkb3JpYUxvb2t1cFNlcGFyYXRvciksXG4gICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGxpc3Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub3JpZ2VtTWVyY2Fkb3JpYVNlYXJjaEdyaWREYXRhID0gbGlzdC5jb250ZW50cztcbiAgICAgICAgICAgICAgICB0aGlzLm9yaWdlbU1lcmNhZG9yaWFTZWFyY2hUb3RhbFJlY29yZHMgPSBsaXN0LnRvdGFsRWxlbWVudHM7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVjUGFnaW5hKGZpcnN0OiBudW1iZXIsIHJvd3M6IG51bWJlciwgc29ydDogYW55KSB7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBmaXJzdCAvIHJvd3M7XG4gICAgICAgIGNvbnN0IG9yZGVyQnkgPSBzb3J0ICYmIHNvcnQubGVuZ3RoIFxuICAgICAgICAgICAgPyBzb3J0Lm1hcCgoczogYW55KSA9PiAoeyBjYW1wbzogcy5maWVsZCwgb3JkZW5hY2FvOiBzLm9yZGVyID09PSAxID8gJ0FzYycgOiAnRGVzYycgfSkpIFxuICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9mZnNldDogcGFnZSxcbiAgICAgICAgICAgIGxpbWl0OiByb3dzLFxuICAgICAgICAgICAgbGlzdGFPcmRlbmFjYW86IG9yZGVyQnlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvblByb2R1dG9Mb29rdXBSZXF1ZXN0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZmlsaWFsID0gdGhpcy5mb3JtR3JvdXAuZ2V0KFwiZmlsaWFsXCIpLnZhbHVlO1xuICAgICAgICBjb25zdCB0aXBvQWdlbmRhbWVudG8gPSB0aGlzLmFnZW5kYS50aXBvQWdlbmRhbWVudG87XG5cbiAgICAgICAgdGhpcy5wcm9kdXRvU2VydmljZVxuICAgICAgICAgICAgLmxpc3RQcm9kdXRvc1JlY2ViaW1lbnRvKHtcbiAgICAgICAgICAgICAgICBwZXNxdWlzYTogdmFsdWUsXG4gICAgICAgICAgICAgICAgZW1wcmVzYUlkOiAhIWZpbGlhbCA/IGZpbGlhbC5lbXByZXNhLmlkIDogbnVsbCxcbiAgICAgICAgICAgICAgICBmaWxpYWxJZDogISFmaWxpYWwgPyBmaWxpYWwuaWQgOiBudWxsLFxuICAgICAgICAgICAgICAgIHRpcG9BZ2VuZGFtZW50b0lkOiAhIXRpcG9BZ2VuZGFtZW50byA/IHRpcG9BZ2VuZGFtZW50by5pZCA6IG51bGxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGxpc3Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvZHV0b0xvb2t1cFN1Z2dlc3Rpb25zID0gKGxpc3QucHJvZHV0b3MgfHwgW10pLm1hcCgocHJvZHV0bzogYW55KSA9PiBQcm9kdXRvLmZyb21EdG8ocHJvZHV0bykpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUHJvZHV0b1NlYXJjaFJlcXVlc3QoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCB7IGZpcnN0LCByb3dzLCBtdWx0aVNvcnRNZXRhLCBmaWx0ZXJEYXRhIH0gPSBldmVudDtcbiAgICAgICAgY29uc3QgcGFnZSA9IGZpcnN0IC8gcm93cztcbiAgICAgICAgY29uc3Qgc29ydDogU29ydE1ldGFbXSA9IG11bHRpU29ydE1ldGE7XG4gICAgICAgIGNvbnN0IHNvcnRGb3JtYXR0ZWQgPSAhIShzb3J0IHx8IFtdKS5sZW5ndGggJiYgeyBjYW1wbzogc29ydFswXS5maWVsZCwgb3JkZW5hY2FvOiBzb3J0WzBdLm9yZGVyID4gMCA/ICdBc2MnIDogJ0Rlc2MnIH07XG4gICAgICAgIGNvbnN0IGZpbHRlcklucHV0ID0gdGhpcy5nZXRQcm9kdXRvU2VhcmNoRmllbGRzKClcbiAgICAgICAgICAgIC5maWx0ZXIoKHsgbmFtZSB9KSA9PiBmaWx0ZXJEYXRhW25hbWVdICE9IHVuZGVmaW5lZCAmJiBmaWx0ZXJEYXRhW25hbWVdICE9IFwiXCIpXG4gICAgICAgICAgICAucmVkdWNlKChhLCB7IG5hbWUsIHR5cGUgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZmlsdGVyRGF0YVtuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gRmllbGRUeXBlLkludGVnZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYSwgW25hbWVdOiBgJHt2YWx1ZX1gLnJlcGxhY2UoL1xcRC8sIFwiXCIpIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmEsIFtuYW1lXTogdmFsdWUgfTtcbiAgICAgICAgICAgIH0sIHsgcGFnaW5hOiB7IGxpbWl0OiByb3dzLCBvZmZzZXQ6IHBhZ2UsIGxpc3RhT3JkZW5hY2FvOiBzb3J0Rm9ybWF0dGVkID8gW3sgLi4uKHNvcnRGb3JtYXR0ZWQpIH1dIDogbnVsbCB9IH0gYXMgUHJvZHV0b1JlY2ViaW1lbnRvUGFyYW1zKTtcblxuICAgICAgICBjb25zdCBmaWxpYWwgPSB0aGlzLmZvcm1Hcm91cC5nZXQoXCJmaWxpYWxcIikudmFsdWU7XG4gICAgICAgIGNvbnN0IHRpcG9BZ2VuZGFtZW50byA9IHRoaXMuYWdlbmRhLnRpcG9BZ2VuZGFtZW50bztcblxuICAgICAgICB0aGlzLnByb2R1dG9TZXJ2aWNlXG4gICAgICAgICAgICAubGlzdFByb2R1dG9zUmVjZWJpbWVudG8oe1xuICAgICAgICAgICAgICAgIC4uLmZpbHRlcklucHV0LFxuICAgICAgICAgICAgICAgIGVtcHJlc2FJZDogISFmaWxpYWwgPyBmaWxpYWwuZW1wcmVzYS5pZCA6IG51bGwsXG4gICAgICAgICAgICAgICAgZmlsaWFsSWQ6ICEhZmlsaWFsID8gZmlsaWFsLmlkIDogbnVsbCxcbiAgICAgICAgICAgICAgICB0aXBvQWdlbmRhbWVudG9JZDogISF0aXBvQWdlbmRhbWVudG8gPyB0aXBvQWdlbmRhbWVudG8uaWQgOiBudWxsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvZHV0b1NlYXJjaFRvdGFsUmVjb3JkcyA9IHJlcy5xdGRUb3RhbFJlZ2lzdHJvcztcbiAgICAgICAgICAgICAgICB0aGlzLnByb2R1dG9TZWFyY2hHcmlkRGF0YSA9IHJlcy5wcm9kdXRvcy5tYXAoUHJvZHV0by5mcm9tRHRvKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkRlcml2YWNhb0xvb2t1cFJlcXVlc3QodmFsdWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBzb3J0ID0gdGhpcy5kZXJpdmFjYW9Mb29rdXBEaXNwbGF5RmllbGRzLm1hcCgoZmllbGQ6IGFueSkgPT4gKHsgZmllbGQsIG9yZGVyOiAxIH0pKTtcblxuICAgICAgICBjb25zdCBmaWx0ZXJRdWVyeSA9IHRoaXMuZ2V0RGVyaXZhY2FvU2VhcmNoRmllbGRzKClcbiAgICAgICAgICAgIC5maWx0ZXIoKHsgdHlwZSB9KSA9PiBpc1ZhbGlkRmlsdGVyKHR5cGUsIHZhbHVlKSlcbiAgICAgICAgICAgIC5tYXAoKHsgbmFtZSwgdHlwZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSBcIm51bWJlclwiKSByZXR1cm4gYCR7bmFtZX0gZXEgJHt2YWx1ZX1gO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRmllbGRUeXBlLkRhdGUpIHJldHVybiBgJHtuYW1lfSBlcSAnJHttb21lbnQodmFsdWUpLmZvcm1hdChcIllZWVktTU0tRERcIil9J2A7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuVGltZSkgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSkuZm9ybWF0KFwiSEg6bW06c3NcIil9J2A7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuRGF0ZVRpbWUpIHJldHVybiBgJHtuYW1lfSBlcSAnJHttb21lbnQodmFsdWUpLmZvcm1hdCgpfSdgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRmllbGRUeXBlLlN0cmluZykgcmV0dXJuIGBjb250YWluaW5nKGxvd2VyKCR7bmFtZX0pLCBsb3dlcignJHt2YWx1ZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIil9JykpYDtcbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBgJHtuYW1lfSBlcSAnJHt2YWx1ZX0nYDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihcIiBvciBcIik7XG5cbiAgICAgICAgY29uc3QgZGlzcGxheUZpZWxkcyA9IG1lcmdlVW5pcXVlKHRoaXMuZGVyaXZhY2FvTG9va3VwRGlzcGxheUZpZWxkcywgdGhpcy5kZXJpdmFjYW9BZHZhbmNlZERpc3BsYXlGaWVsZHMpO1xuICAgICAgICB0aGlzLmRlcml2YWNhb1NlcnZpY2VcbiAgICAgICAgICAgIC5saXN0KHsgc29ydCwgZmlsdGVyUXVlcnksIGRpc3BsYXlGaWVsZHMgfSlcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChsaXN0OiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmxpc3QsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBsaXN0LmNvbnRlbnRzLm1hcCgoaXRlbTogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLmRlcml2YWNhb0xvb2t1cERpc3BsYXlGaWVsZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZpZWxkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmluZGV4T2YoXCIuXCIpID4gMCkgcmV0dXJuIHRoaXMuZ2V0UHJvcChpdGVtLCBmaWVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtW2ZpZWxkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKHRoaXMuZGVyaXZhY2FvTG9va3VwU2VwYXJhdG9yKSxcbiAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobGlzdDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXJpdmFjYW9Mb29rdXBTdWdnZXN0aW9ucyA9IGxpc3QuY29udGVudHM7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25EZXJpdmFjYW9TZWFyY2hSZXF1ZXN0KGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgeyBmaXJzdCwgcm93cywgbXVsdGlTb3J0TWV0YSwgZmlsdGVyRGF0YSB9ID0gZXZlbnQ7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBmaXJzdCAvIHJvd3M7XG4gICAgICAgIGNvbnN0IHNvcnQgPSBtdWx0aVNvcnRNZXRhO1xuICAgICAgICBjb25zdCBmaWx0ZXJRdWVyeSA9IHRoaXMuZ2V0RGVyaXZhY2FvU2VhcmNoRmllbGRzKClcbiAgICAgICAgICAgIC5maWx0ZXIoKHsgbmFtZSB9KSA9PiBmaWx0ZXJEYXRhW25hbWVdICE9IHVuZGVmaW5lZCAmJiBmaWx0ZXJEYXRhW25hbWVdICE9IFwiXCIpXG4gICAgICAgICAgICAubWFwKCh7IG5hbWUsIHR5cGUgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZmlsdGVyRGF0YVtuYW1lXTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJudW1iZXJcIikgcmV0dXJuIGAke25hbWV9IGVxICR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5EYXRlKSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7bW9tZW50KHZhbHVlKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpfSdgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRmllbGRUeXBlLlRpbWUpIHJldHVybiBgJHtuYW1lfSBlcSAnJHttb21lbnQodmFsdWUpLmZvcm1hdChcIkhIOm1tOnNzXCIpfSdgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRmllbGRUeXBlLkRhdGVUaW1lKSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7bW9tZW50KHZhbHVlKS5mb3JtYXQoKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5FbnVtKSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7dmFsdWV9J2A7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuU3RyaW5nKSByZXR1cm4gYGNvbnRhaW5pbmcobG93ZXIoJHtuYW1lfSksIGxvd2VyKCcke3ZhbHVlLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKX0nKSlgO1xuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIGAke25hbWV9IGVxICcke3ZhbHVlfSdgO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiIGFuZCBcIik7XG5cbiAgICAgICAgY29uc3QgZGlzcGxheUZpZWxkcyA9IG1lcmdlVW5pcXVlKHRoaXMuZGVyaXZhY2FvTG9va3VwRGlzcGxheUZpZWxkcywgdGhpcy5kZXJpdmFjYW9BZHZhbmNlZERpc3BsYXlGaWVsZHMpO1xuICAgICAgICB0aGlzLmRlcml2YWNhb1NlcnZpY2VcbiAgICAgICAgICAgIC5saXN0KHsgcGFnZSwgc29ydCwgZmlsdGVyUXVlcnksIGRpc3BsYXlGaWVsZHMgfSlcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChsaXN0OiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmxpc3QsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBsaXN0LmNvbnRlbnRzLm1hcCgoaXRlbTogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLmRlcml2YWNhb0xvb2t1cERpc3BsYXlGaWVsZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZpZWxkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmluZGV4T2YoXCIuXCIpID4gMCkgcmV0dXJuIHRoaXMuZ2V0UHJvcChpdGVtLCBmaWVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtW2ZpZWxkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKHRoaXMuZGVyaXZhY2FvTG9va3VwU2VwYXJhdG9yKSxcbiAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobGlzdDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXJpdmFjYW9TZWFyY2hHcmlkRGF0YSA9IGxpc3QuY29udGVudHM7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXJpdmFjYW9TZWFyY2hUb3RhbFJlY29yZHMgPSBsaXN0LnRvdGFsRWxlbWVudHM7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25UcmFuc3BvcnRhZG9yYUxvb2t1cFJlcXVlc3QodmFsdWU6IHN0cmluZykge1xuICAgICAgICBvbkxvb2t1cFJlcXVlc3QodGhpcy50cmFuc3BvcnRhZG9yYVNlYXJjaEZpZWxkcywgdGhpcy50cmFuc3BvcnRhZG9yYUxvb2t1cERpc3BsYXlGaWVsZHMsIHRoaXMudHJhbnNwb3J0YWRvcmFBZHZhbmNlZERpc3BsYXlGaWVsZHMsIHRoaXMudHJhbnNwb3J0YWRvcmFMb29rdXBTZXBhcmF0b3IsIHRoaXMudHJhbnNwb3J0YWRvcmFTZXJ2aWNlLCB2YWx1ZSlcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobGlzdDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc3BvcnRhZG9yYUxvb2t1cFN1Z2dlc3Rpb25zID0gbGlzdC5jb250ZW50cztcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblRyYW5zcG9ydGFkb3JhU2VhcmNoUmVxdWVzdChldmVudDogYW55KSB7XG5cbiAgICAgICAgY29uc3QgeyBmaXJzdCwgcm93cywgbXVsdGlTb3J0TWV0YSwgZmlsdGVyRGF0YSB9ID0gZXZlbnQ7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBmaXJzdCAvIHJvd3M7XG4gICAgICAgIGNvbnN0IHNvcnQgPSBtdWx0aVNvcnRNZXRhO1xuICAgICAgICBjb25zdCBmaWx0ZXJRdWVyeSA9IHRoaXMuZ2V0VHJhbnNwb3J0YWRvcmFTZWFyY2hGaWVsZHMoKVxuICAgICAgICAgICAgLmZpbHRlcigoeyBuYW1lIH0pID0+IGZpbHRlckRhdGFbbmFtZV0gIT0gdW5kZWZpbmVkICYmIGZpbHRlckRhdGFbbmFtZV0gIT0gXCJcIilcbiAgICAgICAgICAgIC5tYXAoKHsgbmFtZSwgdHlwZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWx0ZXJEYXRhW25hbWVdO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSBcIm51bWJlclwiKSByZXR1cm4gYCR7bmFtZX0gZXEgJHt2YWx1ZX1gO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRmllbGRUeXBlLkRhdGUpIHJldHVybiBgJHtuYW1lfSBlcSAnJHttb21lbnQodmFsdWUpLmZvcm1hdChcIllZWVktTU0tRERcIil9J2A7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuVGltZSkgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSkuZm9ybWF0KFwiSEg6bW06c3NcIil9J2A7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuRGF0ZVRpbWUpIHJldHVybiBgJHtuYW1lfSBlcSAnJHttb21lbnQodmFsdWUpLmZvcm1hdCgpfSdgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRmllbGRUeXBlLkVudW0pIHJldHVybiBgJHtuYW1lfSBlcSAnJHt2YWx1ZX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5TdHJpbmcpIHJldHVybiBgY29udGFpbmluZyhsb3dlcigke25hbWV9KSwgbG93ZXIoJyR7dmFsdWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpfScpKWA7XG4gICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7dmFsdWV9J2A7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oXCIgYW5kIFwiKTtcblxuICAgICAgICBjb25zdCBkaXNwbGF5RmllbGRzID0gbWVyZ2VVbmlxdWUodGhpcy50cmFuc3BvcnRhZG9yYUxvb2t1cERpc3BsYXlGaWVsZHMsIHRoaXMudHJhbnNwb3J0YWRvcmFBZHZhbmNlZERpc3BsYXlGaWVsZHMpO1xuICAgICAgICB0aGlzLnRyYW5zcG9ydGFkb3JhU2VydmljZVxuICAgICAgICAgICAgLmxpc3QoeyBwYWdlLCBzb3J0LCBmaWx0ZXJRdWVyeSwgZGlzcGxheUZpZWxkcyB9KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGxpc3Q6IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgLi4ubGlzdCxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudHM6IGxpc3QuY29udGVudHMubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNwb3J0YWRvcmFMb29rdXBEaXNwbGF5RmllbGRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pbmRleE9mKFwiLlwiKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFByb3AoaXRlbSwgZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtW2ZpZWxkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKHRoaXMudHJhbnNwb3J0YWRvcmFMb29rdXBTZXBhcmF0b3IpLFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChsaXN0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydGFkb3JhU2VhcmNoR3JpZERhdGEgPSBsaXN0LmNvbnRlbnRzO1xuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0YWRvcmFTZWFyY2hUb3RhbFJlY29yZHMgPSBsaXN0LnRvdGFsRWxlbWVudHM7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25UcmFuc2dlbmlhTG9va3VwUmVxdWVzdCh2YWx1ZTogYW55KSB7XG4gICAgICAgIG9uTG9va3VwUmVxdWVzdCh0aGlzLmdldFRyYW5zZ2VuaWFTZWFyY2hGaWVsZHMoKSwgdGhpcy50cmFuc2dlbmlhTG9va3VwRGlzcGxheUZpZWxkcywgdGhpcy50cmFuc2dlbmlhQWR2YW5jZWREaXNwbGF5RmllbGRzLCB0aGlzLnRyYW5zZ2VuaWFMb29rdXBTZXBhcmF0b3IsIHRoaXMudHJhbnNnZW5pYVNlcnZpY2UsIHZhbHVlLFxuICAgICAgICAgICAgYGVtcHJlc2EuaWQgZXEgJyR7dGhpcy5mb3JtR3JvdXAuZ2V0KCdmaWxpYWwnKS52YWx1ZS5lbXByZXNhLmlkfScgYW5kIHRpcG9QYXJ0aWNpcGFudGUgZXEgJyR7dGhpcy5nZXRUaXBvVHJhbnNnZW5pYSgpfSdgKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChsaXN0OiBhbnkpID0+IHRoaXMudHJhbnNnZW5pYUxvb2t1cFN1Z2dlc3Rpb25zID0gbGlzdC5jb250ZW50cyk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uVHJhbnNnZW5pYVNlYXJjaFJlcXVlc3QoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCB7IGZpcnN0LCByb3dzLCBtdWx0aVNvcnRNZXRhLCBmaWx0ZXJEYXRhIH0gPSBldmVudDtcbiAgICAgICAgY29uc3QgcGFnZSA9IGZpcnN0IC8gcm93cztcbiAgICAgICAgY29uc3Qgc29ydCA9IG11bHRpU29ydE1ldGE7XG4gICAgICAgIGNvbnN0IGZpbHRlclF1ZXJ5ID0gdGhpcy5nZXRUcmFuc2dlbmlhU2VhcmNoRmllbGRzKClcbiAgICAgICAgICAgIC5maWx0ZXIoKHsgbmFtZSB9KSA9PiBmaWx0ZXJEYXRhW25hbWVdICE9IHVuZGVmaW5lZCAmJiBmaWx0ZXJEYXRhW25hbWVdICE9IFwiXCIpXG4gICAgICAgICAgICAubWFwKCh7IG5hbWUsIHR5cGUgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZmlsdGVyRGF0YVtuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09IFwibnVtYmVyXCIpIHJldHVybiBgJHtuYW1lfSBlcSAke3ZhbHVlfWA7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuRW51bSkgcmV0dXJuIGAke25hbWV9IGVxICcke3ZhbHVlfSdgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRmllbGRUeXBlLlN0cmluZykgcmV0dXJuIGBjb250YWluaW5nKGxvd2VyKCR7bmFtZX0pLCBsb3dlcignJHt2YWx1ZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIil9JykpYDtcbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBgJHtuYW1lfSBlcSAnJHt2YWx1ZX0nYDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihcIiBhbmQgXCIpO1xuXG4gICAgICAgIGNvbnN0IGRpc3BsYXlGaWVsZHMgPSBtZXJnZVVuaXF1ZSh0aGlzLnRyYW5zZ2VuaWFMb29rdXBEaXNwbGF5RmllbGRzLCB0aGlzLnRyYW5zZ2VuaWFBZHZhbmNlZERpc3BsYXlGaWVsZHMpO1xuICAgICAgICB0aGlzLnRyYW5zZ2VuaWFTZXJ2aWNlXG4gICAgICAgICAgICAubGlzdCh7IHBhZ2UsIHNvcnQsIGZpbHRlclF1ZXJ5LCBkaXNwbGF5RmllbGRzIH0pXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgobGlzdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAuLi5saXN0LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50czogbGlzdC5jb250ZW50cy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2dlbmlhTG9va3VwRGlzcGxheUZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaW5kZXhPZihcIi5cIikgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9wKGl0ZW0sIGZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVtmaWVsZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbih0aGlzLnRyYW5zZ2VuaWFMb29rdXBTZXBhcmF0b3IpLFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChsaXN0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZ2VuaWFTZWFyY2hHcmlkRGF0YSA9IGxpc3QuY29udGVudHM7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2dlbmlhU2VhcmNoVG90YWxSZWNvcmRzID0gbGlzdC50b3RhbEVsZW1lbnRzO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZvcm5lY2Vkb3IoZGF0YTogYW55ID0ge30pIHtcbiAgICAgICAgdGhpcy5lcnJvRm9ybmVjZWRvcmVzID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmdldEZvcm5lY2Vkb3JGb3JtKGRhdGEpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZUZvcm5lY2Vkb3IoZm9ybSk7XG4gICAgICAgIHRoaXMuZ2V0Rm9ybmVjZWRvcmVzKCkucHVzaChmb3JtKTtcbiAgICAgICAgcmV0dXJuIGZvcm07XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUZvcm5lY2Vkb3IoY29udHJvbDogRm9ybUdyb3VwKSB7XG4gICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgICAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAucmVtb3ZlX2Zvcm5lY2Vkb3JfaGVhZGVyXCIpLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAucmVtb3ZlX2Zvcm5lY2Vkb3JfbWVzc2FnZVwiKSxcbiAgICAgICAgICAgIGFjY2VwdDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXRGb3JuZWNlZG9yZXMoKS5jb250cm9scy5pbmRleE9mKGNvbnRyb2wpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybmVjZWRvcmVzKCkucmVtb3ZlQXQoaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Rm9ybmVjZWRvcmVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAuZ2V0KFwiZm9ybmVjZWRvcmVzXCIpIGFzIEZvcm1BcnJheTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQ29udHJhdG8oZm9ybmVjZWRvckZvcm06IEZvcm1Hcm91cCkge1xuICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2VcbiAgICAgICAgICAgIC5vcGVuKENvbnRyYXRvRm9ybUNvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgIC4uLmRpYWxvZ0NvbmZpZyxcbiAgICAgICAgICAgICAgICBoZWFkZXI6ICdBZGljaW9uYXIgQ29udHJhdG8nLFxuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgYWdlbmRhOiB0aGlzLmFnZW5kYSxcbiAgICAgICAgICAgICAgICAgICAgZmlsaWFsOiB0aGlzLmZvcm1Hcm91cC5nZXQoXCJmaWxpYWxcIikudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHByb2R1dG86IHRoaXMuZm9ybUdyb3VwLmdldChcInByb2R1dG9cIikudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGZvcm5lY2Vkb3I6IGZvcm5lY2Vkb3JGb3JtLmdldChcImZvcm5lY2Vkb3JcIikudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyYXRvczogZm9ybmVjZWRvckZvcm0uZ2V0KFwiY29udHJhdG9zXCIpLnZhbHVlLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub25DbG9zZVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksIGZpbHRlcih2YWx1ZSA9PiAhIXZhbHVlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHsgY29udHJhdG8gfTogYW55KSA9PiB0aGlzLm9uQ29udHJhdG9TYXZlZChjb250cmF0bywgZm9ybmVjZWRvckZvcm0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlckNvbnRyYXRvKGZvcm5lY2Vkb3JGb3JtOiBGb3JtR3JvdXAsIGNvbnRyYXRvRm9ybTogRm9ybUdyb3VwKSB7XG4gICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgICAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAucmVtb3ZlX2NvbnRyYXRvX2hlYWRlclwiKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnJlbW92ZV9jb250cmF0b19tZXNzYWdlXCIpLFxuICAgICAgICAgICAgYWNjZXB0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSAoZm9ybmVjZWRvckZvcm0uZ2V0KFwiY29udHJhdG9zXCIpIGFzIEZvcm1BcnJheSkuY29udHJvbHMuaW5kZXhPZihjb250cmF0b0Zvcm0pO1xuICAgICAgICAgICAgICAgIChmb3JuZWNlZG9yRm9ybS5nZXQoXCJjb250cmF0b3NcIikgYXMgRm9ybUFycmF5KS5yZW1vdmVBdChpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb250cmF0b3MoZm9ybmVjZWRvckZvcm06IEZvcm1Hcm91cCkge1xuICAgICAgICB0aGlzLmNvbnRyYXRvcyA9IGZvcm5lY2Vkb3JGb3JtLmdldChcImNvbnRyYXRvc1wiKVxuICAgICAgICByZXR1cm4gdGhpcy5jb250cmF0b3MgYXMgRm9ybUFycmF5O1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGROb3RhKGZvcm1Hcm91cDogRm9ybUdyb3VwKSB7XG4gICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKE5vdGFGb3JtQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLmFkaWNpb25hcl9ub3RhXCIpLFxuICAgICAgICAgICAgLi4uZGlhbG9nQ29uZmlnLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGZvcm5lY2Vkb3I6IGZvcm1Hcm91cC5nZXQoXCJmb3JuZWNlZG9yXCIpLnZhbHVlLFxuICAgICAgICAgICAgICAgIHByb2R1dG86IHRoaXMuZm9ybUdyb3VwLmdldChcInByb2R1dG9cIikudmFsdWUsXG4gICAgICAgICAgICAgICAgZmlsaWFsOiB0aGlzLmZvcm1Hcm91cC5nZXQoXCJmaWxpYWxcIikudmFsdWUsXG4gICAgICAgICAgICAgICAgZm9ybmVjZWRvck5vdGFzVG9rZW5zOiB0aGlzLmZvcm5lY2Vkb3JOb3Rhc1Rva2VucyxcbiAgICAgICAgICAgICAgICBjb250cmF0b3M6IHRoaXMuY29udHJhdG9zLFxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAub25DbG9zZVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSwgZmlsdGVyKHZhbHVlID0+ICEhdmFsdWUpKVxuICAgICAgICAuc3Vic2NyaWJlKHZhbHVlID0+IHRoaXMub25Ob3RhU2F2ZWQodmFsdWUsIGZvcm1Hcm91cCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVyTm90YShmb3JuZWNlZG9yRm9ybTogRm9ybUdyb3VwLCBjb250cmF0b0Zvcm06IEZvcm1Hcm91cCwgbm90YUZvcm06IEZvcm1Hcm91cCkge1xuICAgICAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICAgICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnJlbW92ZV9ub3RhX2hlYWRlclwiKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnJlbW92ZV9ub3RhX21lc3NhZ2VcIiksXG4gICAgICAgICAgICBhY2NlcHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250cmF0b0lkID0gY29udHJhdG9Gb3JtW1widmFsdWVcIl1bXCJjb250cmF0b1wiXVtcImlkXCJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXROb3Rhc0Zyb21Db250cmF0b3MoZm9ybmVjZWRvckZvcm0sIGNvbnRyYXRvSWQpLmNvbnRyb2xzLmluZGV4T2Yobm90YUZvcm0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Tm90YXNGcm9tQ29udHJhdG9zKGZvcm5lY2Vkb3JGb3JtLCBjb250cmF0b0lkKS5yZW1vdmVBdChpbmRleCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBub3RhID0gbm90YUZvcm1bXCJ2YWx1ZVwiXTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm5lY2Vkb3JOb3Rhc1Rva2Vucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IG5vdGEuY2hhdmVOb3RhRmlzY2FsLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogbm90YS5udW1lcm9Ob3RhRmlzY2FsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JuZWNlZG9yTm90YXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNoYXZlTm90YUZpc2NhbDogbm90YS5jaGF2ZU5vdGFGaXNjYWwsXG4gICAgICAgICAgICAgICAgICAgIHNlcmllTm90YUZpc2NhbDogbm90YS5zZXJpZU5vdGFGaXNjYWwsXG4gICAgICAgICAgICAgICAgICAgIHNlcmllTGVnYWxOb3RhRmlzY2FsOiBub3RhLnNlcmllTGVnYWxOb3RhRmlzY2FsLFxuICAgICAgICAgICAgICAgICAgICBudW1lcm9Ob3RhRmlzY2FsOiBub3RhLm51bWVyb05vdGFGaXNjYWwsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXROb3Rhcyhjb250cmF0b0Zvcm06IEZvcm1Hcm91cCkge1xuICAgICAgICByZXR1cm4gY29udHJhdG9Gb3JtW1wiY29udHJvbHNcIl1bXCJub3Rhc1wiXSBhcyBGb3JtQXJyYXk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEl0ZW5zQ29udHJhdG8oY29udHJhdG9Gb3JtOiBGb3JtR3JvdXApIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyYXRvRm9ybS5nZXQoXCJpdGVuc1wiKSBhcyBGb3JtQXJyYXk7XG4gICAgfVxuXG4gICAgcHVibGljIHNob3dCdXR0b25zKCkge1xuICAgICAgICBpZiAoIXRoaXMuYWdlbmRhKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBTdGF0dXNBZ2VuZGEuQUdFTkRBRE8sXG4gICAgICAgICAgICBTdGF0dXNBZ2VuZGEuQUdVQVJEQU5ET19DT05GSVJNQUNBTyxcbiAgICAgICAgICAgIFN0YXR1c0FnZW5kYS5BR1VBUkRBTkRPX0NPTkZJUk1BQ0FPX1NPTElDSVRBTlRFLFxuICAgICAgICAgICAgU3RhdHVzQWdlbmRhLlJFSkVJVEFET19QT1JfVkFMSURBQ0FPXG4gICAgICAgIF0uaW5jbHVkZXModGhpcy5hZ2VuZGEuc3RhdHVzIGFzIFN0YXR1c0FnZW5kYSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc2FibGVBZGljaW9uYXJOb3RhKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5jb250cmF0b1NlbGVjaW9uYWRvID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRUaXBvVHJhbnNnZW5pYSA9ICgpID0+IHtcbiAgICAgICAgaWYgKCh0aGlzLmZvcm1Hcm91cC5nZXQoXCJmb3JuZWNlZG9yZXNcIikgYXMgRm9ybUFycmF5KS5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFRpcG9QYXJ0aWNpcGFudGVUcmFuc2dlbmlhLk5BT19JTkZPUk1BRE87XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm9ybmVjZWRvciA9ICgodGhpcy5mb3JtR3JvdXAuZ2V0KFwiZm9ybmVjZWRvcmVzXCIpIGFzIEZvcm1BcnJheSkuYXQoMCkgYXMgRm9ybUdyb3VwKS5nZXRSYXdWYWx1ZSgpLmZvcm5lY2Vkb3I7XG4gICAgICAgIHJldHVybiBmb3JuZWNlZG9yID8gKGZvcm5lY2Vkb3IudGlwb1BhcnRpY2lwYW50ZSB8fCBUaXBvUGFydGljaXBhbnRlVHJhbnNnZW5pYS5OQU9fSU5GT1JNQURPKSA6IFRpcG9QYXJ0aWNpcGFudGVUcmFuc2dlbmlhLk5BT19JTkZPUk1BRE87XG4gICAgfTtcblxuICAgIHByaXZhdGUgZ2V0Tm90YUZvcm0oZGF0YTogYW55ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICAgICAgY2hhdmVOb3RhRmlzY2FsOiBbZGF0YS5jaGF2ZU5vdGFGaXNjYWxdLFxuICAgICAgICAgICAgc2VyaWVOb3RhRmlzY2FsOiBbZGF0YS5zZXJpZU5vdGFGaXNjYWxdLFxuICAgICAgICAgICAgc2VyaWVMZWdhbE5vdGFGaXNjYWw6IFtkYXRhLnNlcmllTGVnYWxOb3RhRmlzY2FsXSxcbiAgICAgICAgICAgIG51bWVyb05vdGFGaXNjYWw6IFtkYXRhLm51bWVyb05vdGFGaXNjYWxdLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvbnRyYXRvRm9ybShkYXRhOiBhbnkgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgICAgICBjb250cmF0bzogW2RhdGEuY29udHJhdG8sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgaXRlbnM6IHRoaXMuZm9ybUJ1aWxkZXIuYXJyYXkoW10pLFxuICAgICAgICAgICAgbm90YXM6IHRoaXMuZm9ybUJ1aWxkZXIuYXJyYXkoW10pXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0SXRlbUZvcm0oZGF0YTogYW55ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICAgICAgaXRlbTogW2RhdGEuaXRlbSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICBxdWFudGlkYWRlOiBbZGF0YS5xdWFudGlkYWRlXVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZvcm5lY2Vkb3JGb3JtKGRhdGE6IGFueSA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgICAgIGZvcm5lY2Vkb3I6IFtkYXRhLmZvcm5lY2Vkb3IsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgb3JpZ2VtTWVyY2Fkb3JpYTogW2RhdGEub3JpZ2VtTWVyY2Fkb3JpYSwgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSldLFxuICAgICAgICAgICAgdGlwb05vdGFGaXNjYWw6IFtkYXRhLnRpcG9Ob3RhRmlzY2FsIHx8IFRpcG9Ob3RhRmlzY2FsLkVNUFJFU0FfSlVSSURJQ0EsIFZhbGlkYXRvcnMuY29tcG9zZShbXSldLFxuICAgICAgICAgICAgY29udHJhdG9zOiB0aGlzLmZvcm1CdWlsZGVyLmFycmF5KFtdKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRGb3JtR3JvdXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgICAgIGlkOiBbeyB2YWx1ZTogdW5kZWZpbmVkLCBkaXNhYmxlZDogdHJ1ZSB9LCBWYWxpZGF0b3JzLmNvbXBvc2UoW10pXSxcbiAgICAgICAgICAgIGZpbGlhbDogW3VuZGVmaW5lZCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICBwcm9kdXRvOiBbeyB2YWx1ZTogdW5kZWZpbmVkLCBkaXNhYmxlZDogdHJ1ZSB9LCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKV0sXG4gICAgICAgICAgICBkZXJpdmFjYW86IFt7IHZhbHVlOiB1bmRlZmluZWQsIGRpc2FibGVkOiB0cnVlIH0sIFZhbGlkYXRvcnMuY29tcG9zZShbXSldLFxuICAgICAgICAgICAgdHJhbnNwb3J0YWRvcmE6IFt7IHZhbHVlOiB1bmRlZmluZWQsIGRpc2FibGVkOiBmYWxzZSB9LCBWYWxpZGF0b3JzLmNvbXBvc2UoW10pXSxcbiAgICAgICAgICAgIGFnZW5kYTogW3sgdmFsdWU6IHRoaXMuYWdlbmRhLCBkaXNhYmxlZDogZmFsc2UgfSwgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSldLFxuICAgICAgICAgICAgdHJhbnNnZW5pYTogW3sgdmFsdWU6IHVuZGVmaW5lZCwgZGlzYWJsZWQ6IHRydWUgfSwgVmFsaWRhdG9ycy5jb21wb3NlKFtdKV0sXG4gICAgICAgICAgICBmb3JuZWNlZG9yZXM6IHRoaXMuZm9ybUJ1aWxkZXIuYXJyYXkoW10pLFxuICAgICAgICAgICAgY3JlYXRlZEJ5OiBbeyB2YWx1ZTogdW5kZWZpbmVkLCBkaXNhYmxlZDogdHJ1ZSB9LCBWYWxpZGF0b3JzLmNvbXBvc2UoW10pXSxcbiAgICAgICAgICAgIGNyZWF0ZWREYXRlOiBbeyB2YWx1ZTogdW5kZWZpbmVkLCBkaXNhYmxlZDogdHJ1ZSB9LCBWYWxpZGF0b3JzLmNvbXBvc2UoW10pXSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZEJ5OiBbeyB2YWx1ZTogdW5kZWZpbmVkLCBkaXNhYmxlZDogdHJ1ZSB9LCBWYWxpZGF0b3JzLmNvbXBvc2UoW10pXSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZERhdGU6IFt7IHZhbHVlOiB1bmRlZmluZWQsIGRpc2FibGVkOiB0cnVlIH0sIFZhbGlkYXRvcnMuY29tcG9zZShbXSldLFxuICAgICAgICAgICAgY3VzdG9tOiBbXSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRGb3JuZWNlZG9yQnlDb250cmF0byhjb250cmF0bzogQ29udHJhdG9Db21wcmFEdG8sIGZvcm5lY2Vkb3JGb3JtOiBGb3JtR3JvdXApIHtcbiAgICAgICAgdGhpcy5wZXNzb2FTZXJ2aWNlLmxpc3QoeyBzaXplOiAxLCBwYWdlOiAwLCBmaWx0ZXJRdWVyeTogYGlkIGVxICcke2NvbnRyYXRvLnBlc3NvYS5pZH0nYCB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksXG4gICAgICAgICAgICAgICAgbWFwKCh7IGNvbnRlbnRzIH0pID0+IChjb250ZW50cyB8fCBbXSkubGVuZ3RoICYmIGNvbnRlbnRzWzBdKSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIodmFsdWUgPT4gISF2YWx1ZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocGVzc29hID0+IHtcbiAgICAgICAgICAgICAgICBmb3JuZWNlZG9yRm9ybS5nZXQoXCJmb3JuZWNlZG9yXCIpLnNldFZhbHVlKFBlc3NvYS5mcm9tRHRvKHBlc3NvYSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQcm9kdXRvQnlDb250cmF0byhjb250cmF0bzogQ29udHJhdG9Db21wcmFEdG8pIHtcbiAgICAgICAgdGhpcy5jb250cmF0b0NvbXByYVNlcnZpY2UubGlzdEl0ZW5zKGNvbnRyYXRvLmlkLCB7IHNpemU6IDEsIHBhZ2U6IDAsIGRpc3BsYXlGaWVsZHM6IFsnc2t1LmlkJ10gfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLFxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKCh7IGNvbnRlbnRzIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHRoaXMucHJvZHV0b1NlcnZpY2UubGlzdCh7IHNpemU6IDEsIHBhZ2U6IDAsIGZpbHRlclF1ZXJ5OiBgaWQgZXEgJyR7Y29udGVudHNbMF0uc2t1LmlkfSdgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKHsgY29udGVudHMgfSkgPT4gKGNvbnRlbnRzIHx8IFtdKS5sZW5ndGggJiYgY29udGVudHNbMF0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtcHR5KCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZmlsdGVyKHZhbHVlID0+ICEhdmFsdWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHByb2R1dG8gPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcInByb2R1dG9cIikuc2V0VmFsdWUoUHJvZHV0by5mcm9tRHRvKHByb2R1dG8pKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5nZXQoXCJwcm9kdXRvXCIpLmRpc2FibGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25Db250cmF0b1NhdmVkKGNvbnRyYXRvOiBhbnksIGZvcm5lY2Vkb3JGb3JtOiBGb3JtR3JvdXApIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1Hcm91cC5nZXQoXCJwcm9kdXRvXCIpLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmdldFByb2R1dG9CeUNvbnRyYXRvKGNvbnRyYXRvLmNvbnRyYXRvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZm9ybmVjZWRvckZvcm0uZ2V0KFwiZm9ybmVjZWRvclwiKS52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5nZXRGb3JuZWNlZG9yQnlDb250cmF0byhjb250cmF0by5jb250cmF0bywgZm9ybmVjZWRvckZvcm0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udHJhdG9Gb3JtID0gdGhpcy5nZXRDb250cmF0b0Zvcm0oY29udHJhdG8pO1xuICAgICAgICAoY29udHJhdG8uaXRlbnMgfHwgW10pLmZvckVhY2goKGl0ZW06IGFueSkgPT4gKGNvbnRyYXRvRm9ybS5nZXQoXCJpdGVuc1wiKSBhcyBGb3JtQXJyYXkpLnB1c2godGhpcy5nZXRJdGVtRm9ybShpdGVtKSkpO1xuXG4gICAgICAgIHRoaXMuZ2V0Q29udHJhdG9zKGZvcm5lY2Vkb3JGb3JtKS5wdXNoKGNvbnRyYXRvRm9ybSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtZW5zYWdlbUNvbnRyYXRvTmFvU2VsZWNpb25hZG8oKSB7XG4gICAgICAgIHRoaXMuYWRkTWVzc2FnZShcImVycm9yXCIsIFwiQ29udHJhdG8gbsOjbyBzZWxlY2lvbmFkb1wiLCBcIk5lbmh1bSBjb250cmF0byBmb2kgc2VsZWNpb25hZG8hXCIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25Ob3RhU2F2ZWQodmFsdWU6IGFueSwgZm9ybmVjZWRvckZvcm06IEZvcm1Hcm91cCkge1xuXG4gICAgICAgIGlmICh0aGlzLmNvbnRyYXRvU2VsZWNpb25hZG8gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubWVuc2FnZW1Db250cmF0b05hb1NlbGVjaW9uYWRvKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXZhbHVlLmFkZEZvcm5lY2Vkb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vdGFzRm9ybSA9IHRoaXMuZ2V0Tm90YXNGcm9tQ29udHJhdG9zKGZvcm5lY2Vkb3JGb3JtLCB0aGlzLmNvbnRyYXRvU2VsZWNpb25hZG8uaWQpO1xuICAgICAgICAgICAgaWYgKG5vdGFzRm9ybSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5vdGFzRm9ybS5wdXNoKHRoaXMuZ2V0Tm90YUZvcm0odmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4aXN0c0Zvcm5lY2Vkb3IgPSAodGhpcy5mb3JtR3JvdXAuZ2V0KFwiZm9ybmVjZWRvcmVzXCIpIGFzIEZvcm1BcnJheSkuY29udHJvbHMuZmluZCgoZm9ybSkgPT4gKGZvcm0udmFsdWUuZm9ybmVjZWRvciB8fCB7IGlkOiB1bmRlZmluZWQgfSkuaWQgPT09IHZhbHVlLmZvcm5lY2Vkb3IuaWQpO1xuICAgICAgICBjb25zdCBmb3JuZWNlZG9yT2ZHcm91cCA9IHRoaXMudmFsaWRhckNucGpGb3JuZWNlZG9yKChmb3JuZWNlZG9yRm9ybS52YWx1ZS5mb3JuZWNlZG9yIHx8IHsgY3BmQ25wajogdW5kZWZpbmVkIH0pLmNwZkNucGopO1xuICAgICAgICBjb25zdCB7IGluZm9Ob3RhIH0gPSB2YWx1ZTtcbiAgICAgICAgY29uc3Qgbm90YUZvcm0gPSB0aGlzLmdldE5vdGFGb3JtKHsgXG4gICAgICAgICAgICBjaGF2ZU5vdGFGaXNjYWw6IGluZm9Ob3RhLmNoYXZlLFxuICAgICAgICAgICAgc2VyaWVOb3RhRmlzY2FsOiBpbmZvTm90YS5zZXJpZSxcbiAgICAgICAgICAgIHNlcmllTGVnYWxOb3RhRmlzY2FsOiBpbmZvTm90YS5zZXJpZUxlZ2FsLFxuICAgICAgICAgICAgbnVtZXJvTm90YUZpc2NhbDogaW5mb05vdGEubnVtZXJvLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoISFleGlzdHNGb3JuZWNlZG9yKSB7XG4gICAgICAgICAgICBjb25zdCBub3Rhc0Zvcm0gPSB0aGlzLmdldE5vdGFzRnJvbUNvbnRyYXRvcyhleGlzdHNGb3JuZWNlZG9yLCB0aGlzLmNvbnRyYXRvU2VsZWNpb25hZG8uaWQpO1xuICAgICAgICAgICAgbm90YXNGb3JtLnB1c2gobm90YUZvcm0pO1xuICAgICAgICB9IGVsc2UgaWYgKCFmb3JuZWNlZG9yRm9ybS5nZXQoXCJmb3JuZWNlZG9yXCIpLnZhbHVlKSB7XG4gICAgICAgICAgICBmb3JuZWNlZG9yRm9ybS5nZXQoXCJmb3JuZWNlZG9yXCIpLnNldFZhbHVlKFBlc3NvYS5mcm9tRHRvKHZhbHVlLmZvcm5lY2Vkb3IpKTtcbiAgICAgICAgICAgIGZvcm5lY2Vkb3JGb3JtLmdldChcIm9yaWdlbU1lcmNhZG9yaWFcIikuc2V0VmFsdWUoUGVzc29hRW5kZXJlY28uZnJvbUR0byh2YWx1ZS5vcmlnZW1NZXJjYWRvcmlhKSk7XG4gICAgICAgICAgICBjb25zdCBub3Rhc0Zvcm0gPSB0aGlzLmdldE5vdGFzRnJvbUNvbnRyYXRvcyhmb3JuZWNlZG9yRm9ybSwgdGhpcy5jb250cmF0b1NlbGVjaW9uYWRvLmlkKTtcbiAgICAgICAgICAgIG5vdGFzRm9ybS5wdXNoKG5vdGFGb3JtKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JuZWNlZG9yT2ZHcm91cCkge1xuICAgICAgICAgICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xuICAgICAgICAgICAgICAgIGhlYWRlcjogJ0Zvcm5lY2Vkb3IgZG8gbWVzbW8gZ3J1cG8gasOhIGNhZGFzdHJhZG8nLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVbSBmb3JuZWNlZG9yIGRvIG1lc21vIGdydXBvIHBhcmVjZSBqw6EgdGVyIHNpZG8gc2VsZWNpb25hZG8sIGRlc2VqYSB2aW5jdWxhciBhIG5vdGEgYW8gbWVzbW8gZm9ybmVjZWRvcj8nLFxuICAgICAgICAgICAgICAgIGFjY2VwdDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub3Rhc0Zvcm0gPSB0aGlzLmdldE5vdGFzRnJvbUNvbnRyYXRvcyhmb3JuZWNlZG9yT2ZHcm91cCwgdGhpcy5jb250cmF0b1NlbGVjaW9uYWRvLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgbm90YXNGb3JtLnB1c2gobm90YUZvcm0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVqZWN0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm5lY2Vkb3IgPSB0aGlzLmFkZEZvcm5lY2Vkb3IoeyBmb3JuZWNlZG9yOiBQZXNzb2EuZnJvbUR0byh2YWx1ZS5mb3JuZWNlZG9yKSwgb3JpZ2VtTWVyY2Fkb3JpYTogUGVzc29hRW5kZXJlY28uZnJvbUR0byh2YWx1ZS5vcmlnZW1NZXJjYWRvcmlhKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm90YXNGb3JtID0gdGhpcy5nZXROb3Rhc0Zyb21Db250cmF0b3MoZm9ybmVjZWRvciwgdGhpcy5jb250cmF0b1NlbGVjaW9uYWRvLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgbm90YXNGb3JtLnB1c2gobm90YUZvcm0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZm9ybmVjZWRvciA9IHRoaXMuYWRkRm9ybmVjZWRvcih7IGZvcm5lY2Vkb3I6IFBlc3NvYS5mcm9tRHRvKHZhbHVlLmZvcm5lY2Vkb3IpLCBvcmlnZW1NZXJjYWRvcmlhOiBQZXNzb2FFbmRlcmVjby5mcm9tRHRvKHZhbHVlLm9yaWdlbU1lcmNhZG9yaWEpIH0pO1xuICAgICAgICAgICAgY29uc3Qgbm90YXNGb3JtID0gdGhpcy5nZXROb3Rhc0Zyb21Db250cmF0b3MoZm9ybmVjZWRvciwgdGhpcy5jb250cmF0b1NlbGVjaW9uYWRvLmlkKTtcbiAgICAgICAgICAgIG5vdGFzRm9ybS5wdXNoKG5vdGFGb3JtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXROb3Rhc0Zyb21Db250cmF0b3MoZm9ybmVjZWRvckZvcm06IEFic3RyYWN0Q29udHJvbCwgY29udHJhdG9JZDogYW55KSB7XG4gICAgICAgIGxldCBjb250cmF0b3NGb3JtU2VsZWNpb25hZG8gPSBudWxsO1xuICAgICAgICBjb25zdCBjb250cmF0b3NGb3JtID0gZm9ybmVjZWRvckZvcm1bXCJjb250cm9sc1wiXVtcImNvbnRyYXRvc1wiXVtcImNvbnRyb2xzXCJdO1xuXG4gICAgICAgIGZvciAobGV0IGNvbnRyYXRvRm9ybSBvZiBjb250cmF0b3NGb3JtKSB7XG4gICAgICAgICAgICBpZiAoY29udHJhdG9Gb3JtW1wiY29udHJvbHNcIl1bXCJjb250cmF0b1wiXVtcInZhbHVlXCJdLmlkID09PSBjb250cmF0b0lkKSB7XG4gICAgICAgICAgICAgICAgY29udHJhdG9zRm9ybVNlbGVjaW9uYWRvID0gY29udHJhdG9Gb3JtW1wiY29udHJvbHNcIl1bXCJub3Rhc1wiXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udHJhdG9zRm9ybVNlbGVjaW9uYWRvIGFzIEZvcm1BcnJheTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRm9ybmVjZWRvck5vdGFzVG9rZW5FbUNvbnRyYXRvKGZvcm5lY2Vkb3JGb3JtOiBGb3JtR3JvdXAsIHRva2VuOiBJVG9rZW4pIHtcbiAgICAgICAgaWYgKHRoaXMuY29udHJhdG9TZWxlY2lvbmFkbyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5tZW5zYWdlbUNvbnRyYXRvTmFvU2VsZWNpb25hZG8oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vdGFzID0gdGhpcy5mb3JuZWNlZG9yTm90YXMuZmlsdGVyKGZvcm5lY2Vkb3JOb3RhID0+IGZvcm5lY2Vkb3JOb3RhLmNoYXZlTm90YUZpc2NhbCA9PT0gdG9rZW4uaWQpO1xuICAgICAgICBjb25zdCBub3Rhc0Zvcm0gPSB0aGlzLmdldE5vdGFzRnJvbUNvbnRyYXRvcyhmb3JuZWNlZG9yRm9ybSwgdGhpcy5jb250cmF0b1NlbGVjaW9uYWRvLmlkKTtcbiAgICAgICAgaWYgKG5vdGFzRm9ybSAhPT0gbnVsbCAmJiBub3Rhc1swXSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbm90YXNGb3JtLnB1c2godGhpcy5nZXROb3RhRm9ybShub3Rhc1swXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW1vdmVGb3JuZWNlZG9yTm90YXNUb2tlbkRvQ29udHJhdG8odG9rZW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVGb3JuZWNlZG9yTm90YXNUb2tlbkRvQ29udHJhdG8odG9rZW46IElUb2tlbikge1xuICAgICAgICB0aGlzLmZvcm5lY2Vkb3JOb3Rhc1Rva2Vucy5zcGxpY2UodGhpcy5mb3JuZWNlZG9yTm90YXNUb2tlbnMuaW5kZXhPZih0b2tlbiksIDEpO1xuICAgICAgICB0aGlzLmZvcm5lY2Vkb3JOb3RhcyA9IHRoaXMuZm9ybmVjZWRvck5vdGFzLmZpbHRlcihmb3JuZWNlZG9yTm90YSA9PiBmb3JuZWNlZG9yTm90YS5jaGF2ZU5vdGFGaXNjYWwgIT09IHRva2VuLmlkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkaWNpb25hck5vdmFOb3RhKHJlc3BvbnNlOiBQZXNxdWlzYXJEb2N1bWVudG9SZXNwb25zZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChyZXNwb25zZS5kb2N1bWVudG9zIHx8IFtdKS5sZW5ndGggPyByZXNwb25zZS5kb2N1bWVudG9zWzBdIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgaXRlbVByb2R1dG8gPSB2YWx1ZS5pdGVuc1swXSB8fCB7IHByb2R1dG86IHVuZGVmaW5lZCwgZGVyaXZhY2FvOiB1bmRlZmluZWQgfSBhcyBhbnk7XG4gICAgICAgIGNvbnN0IHByb2R1dG8gPSBQcm9kdXRvLmZyb21EdG8oaXRlbVByb2R1dG8ucHJvZHV0byk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmZvcm1Hcm91cC5nZXQoXCJwcm9kdXRvXCIpLnZhbHVlICYmICEhaXRlbVByb2R1dG8ucHJvZHV0bykge1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KFwicHJvZHV0b1wiKS5zZXRWYWx1ZShwcm9kdXRvKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcImRlcml2YWNhb1wiKS5zZXRWYWx1ZShEZXJpdmFjYW8uZnJvbUR0byhpdGVtUHJvZHV0by5kZXJpdmFjYW8pKTtcbiAgICAgICAgfSBlbHNlIGlmICghIWl0ZW1Qcm9kdXRvLnByb2R1dG8gJiYgIXRoaXMudmFsaWRhdGVQcm9kdXRvKHByb2R1dG8pKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE5vdGFFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybmVjZWRvciA9IFBlc3NvYS5mcm9tRHRvKHZhbHVlLmZvcm5lY2Vkb3IpO1xuICAgICAgICBjb25zdCBvcmlnZW1NZXJjYWRvcmlhID0gUGVzc29hRW5kZXJlY28uZnJvbUR0byh2YWx1ZS5vcmlnZW1NZXJjYWRvcmlhKTtcblxuICAgICAgICBjb25zdCBmb3JuZWNlZG9yRm9ybSA9IHRoaXMuZ2V0Rm9ybmVjZWRvcmVzKCkuY29udHJvbHMuZmluZCgoeyB2YWx1ZSB9KSA9PiB2YWx1ZS5mb3JuZWNlZG9yLmlkID09PSBmb3JuZWNlZG9yLmlkKSBhcyBGb3JtR3JvdXA7XG4gICAgICAgIGNvbnN0IGZvcm5lY2Vkb3JPZkdyb3VwID0gdGhpcy52YWxpZGFyQ25wakZvcm5lY2Vkb3IoZm9ybmVjZWRvci5jcGZDbnBqKTtcblxuICAgICAgICBpZiAoZm9ybmVjZWRvck9mR3JvdXApIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgICAgICAgICAgICBoZWFkZXI6ICdGb3JuZWNlZG9yIGRvIG1lc21vIGdydXBvIGrDoSBjYWRhc3RyYWRvJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVW0gZm9ybmVjZWRvciBkbyBtZXNtbyBncnVwbyBwYXJlY2UgasOhIHRlciBzaWRvIHNlbGVjaW9uYWRvLCBkZXNlamEgdmluY3VsYXIgYSBub3RhIGFvIG1lc21vIGZvcm5lY2Vkb3I/JyxcbiAgICAgICAgICAgICAgICBhY2NlcHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRGb3JuZWNlZG9yTm90YXNUb2tlbih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZWplY3Q6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3JuZWNlZG9yRm9ybSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRGb3JuZWNlZG9yKHsgZm9ybmVjZWRvciwgb3JpZ2VtTWVyY2Fkb3JpYSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEZvcm5lY2Vkb3JOb3Rhc1Rva2VuKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2UgaWYgKCFmb3JuZWNlZG9yRm9ybSkge1xuICAgICAgICAgICAgdGhpcy5hZGRGb3JuZWNlZG9yKHsgZm9ybmVjZWRvciwgb3JpZ2VtTWVyY2Fkb3JpYSB9KTtcbiAgICAgICAgICAgIHRoaXMuYWRkRm9ybmVjZWRvck5vdGFzVG9rZW4odmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRGb3JuZWNlZG9yTm90YXNUb2tlbih2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuZm9ybmVjZWRvck5vdGFzVG9rZW5zLnB1c2goeyBpZDogdGhpcy5jaGF2ZU5vdGFGaXNjYWwsIGxhYmVsOiB2YWx1ZS5udW1lcm8gfSk7XG5cbiAgICAgICAgdGhpcy5mb3JuZWNlZG9yTm90YXMucHVzaCh7XG4gICAgICAgICAgICBjaGF2ZU5vdGFGaXNjYWw6IHRoaXMuY2hhdmVOb3RhRmlzY2FsLFxuICAgICAgICAgICAgc2VyaWVOb3RhRmlzY2FsOiB2YWx1ZS5zZXJpZSxcbiAgICAgICAgICAgIHNlcmllTGVnYWxOb3RhRmlzY2FsOiB2YWx1ZS5zZXJpZUxlZ2FsLFxuICAgICAgICAgICAgbnVtZXJvTm90YUZpc2NhbDogdmFsdWUubnVtZXJvLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNoYXZlTm90YUZpc2NhbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVOb3RhRXJyb3IoKSB7XG4gICAgICAgIHRoaXMuZXJyb0NoYXZlTm90YSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkTm90YUVycm9yKCkge1xuICAgICAgICB0aGlzLmVycm9DaGF2ZU5vdGEgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRhdGVQcm9kdXRvKHByb2R1dG86IFByb2R1dG8pIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gdGhpcy5mb3JtR3JvdXAuZ2V0KFwicHJvZHV0b1wiKTtcbiAgICAgICAgaWYgKHZhbHVlLmlkICE9PSBwcm9kdXRvLmlkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRGaWxpYWxTZWFyY2hGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImNvZGlnb1wiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5maWxpYWxfY29kaWdvXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5JbnRlZ2VyXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwibm9tZVwiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5maWxpYWxfbm9tZVwiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZvcm5lY2Vkb3JTZWFyY2hGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImNvZGlnb1wiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5wZXNzb2FfY29kaWdvXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5JbnRlZ2VyLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIm5vbWVcIixcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAucGVzc29hX25vbWVcIiksXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJjcGZDbnBqXCIsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnBlc3NvYV9jcGZDbnBqXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZvcm5lY2Vkb3JTZWFyY2hHcmlkRmllbGRzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJjb2RpZ29cIixcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAucGVzc29hX2NvZGlnb1wiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuSW50ZWdlcixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJub21lXCIsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnBlc3NvYV9ub21lXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiY3BmQ25walwiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5wZXNzb2FfY3BmQ25walwiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRPcmlnZW1NZXJjYWRvcmlhRmllbGRzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJjb2RpZ29cIixcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAucGVzc29hX2VuZGVyZWNvX2NvZGlnb1wiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuSW50ZWdlclxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImNlcFwiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5wZXNzb2FfZW5kZXJlY29fY2VwXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmdcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJlbmRlcmVjb1wiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5wZXNzb2FfZW5kZXJlY29fZW5kZXJlY29cIiksXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZ1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIm51bWVyb1wiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5wZXNzb2FfZW5kZXJlY29fbnVtZXJvXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmdcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJiYWlycm9cIixcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAucGVzc29hX2VuZGVyZWNvX2JhaXJyb1wiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE9yaWdlbU1lcmNhZG9yaWFHcmlkRmllbGRzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJjb2RpZ29cIixcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAucGVzc29hX2VuZGVyZWNvX2NvZGlnb1wiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuSW50ZWdlclxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImNlcFwiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5wZXNzb2FfZW5kZXJlY29fY2VwXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmdcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJlbmRlcmVjb1wiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5wZXNzb2FfZW5kZXJlY29fZW5kZXJlY29cIiksXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZ1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIm51bWVyb1wiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5wZXNzb2FfZW5kZXJlY29fbnVtZXJvXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmdcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJiYWlycm9cIixcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAucGVzc29hX2VuZGVyZWNvX2JhaXJyb1wiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiZW1wcmVzYS5kZXNjcmljYW9cIixcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAuZW1wcmVzYVwiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJvZHV0b1NlYXJjaEZpZWxkcygpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiY29kaWdvXCIsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnByb2R1dG9fY29kaWdvXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiZGVzY3JpY2FvXCIsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnByb2R1dG9fZGVzY3JpY2FvXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcsXG4gICAgICAgICAgICB9KVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJvZHV0b1NlYXJjaEdyaWRGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImNvZGlnb1wiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5wcm9kdXRvX2NvZGlnb1wiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImRlc2NyaWNhb1wiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5wcm9kdXRvX2Rlc2NyaWNhb1wiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImRlc2NyaWNhb0NvbXBsZW1lbnRhclwiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5wcm9kdXRvX2Rlc2NyaWNhb19jb21wbGVtZW50YXJcIiksXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QWdlbmRhU2VhcmNoRmllbGRzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJkZXNjcmljYW9cIixcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAuYWdlbmRhX2Rlc2NyaWNhb1wiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRBZ2VuZGFTZWFyY2hHcmlkRmllbGRzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJkZXNjcmljYW9cIixcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAuYWdlbmRhX2Rlc2NyaWNhb1wiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREZXJpdmFjYW9TZWFyY2hGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImNvZGlnb1wiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5kZXJpdmFjYW9fY29kaWdvXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiZGVzY3JpY2FvXCIsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLmRlcml2YWNhb19kZXNjcmljYW9cIiksXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGVyaXZhY2FvU2VhcmNoR3JpZEZpZWxkcygpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiY29kaWdvXCIsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLmRlcml2YWNhb19jb2RpZ29cIiksXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJkZXNjcmljYW9cIixcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAuZGVyaXZhY2FvX2Rlc2NyaWNhb1wiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRUcmFuc3BvcnRhZG9yYVNlYXJjaEZpZWxkcygpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiY29kaWdvXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkludGVnZXIsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnRyYW5zcG9ydGFkb3JhX2NvZGlnb1wiKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcInBlc3NvYS5ub21lXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAudHJhbnNwb3J0YWRvcmFfZGVzY3JpY2FvXCIpXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwicGVzc29hLmNwZkNucGpcIixcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC50cmFuc3BvcnRhZG9yYV9jbnBqXCIpXG4gICAgICAgICAgICB9KVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VHJhbnNwb3J0YWRvcmFTZWFyY2hHcmlkRmllbGRzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJjb2RpZ29cIixcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuSW50ZWdlcixcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAudHJhbnNwb3J0YWRvcmFfY29kaWdvXCIpXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwicGVzc29hLm5vbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuSW50ZWdlcixcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAucGVzc29hX25vbWVcIilcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJwZXNzb2EuY3BmQ25walwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnRyYW5zcG9ydGFkb3JhX2NucGpcIilcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRUcmFuc2dlbmlhU2VhcmNoRmllbGRzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJjb2RpZ29cIixcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC50cmFuc2dlbmlhX2NvZGlnb1wiKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImRlc2NyaWNhb1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnRyYW5zZ2VuaWFfZGVzY3JpY2FvXCIpXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFRyYW5zZ2VuaWFTZWFyY2hHcmlkRmllbGRzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJjb2RpZ29cIixcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC50cmFuc2dlbmlhX2NvZGlnb1wiKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImRlc2NyaWNhb1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnRyYW5zZ2VuaWFfZGVzY3JpY2FvXCIpXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdvQmFjaygpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNSb3V0ZSA9IFwiLi4vXCI7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtwcmV2aW91c1JvdXRlXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLnBhcmVudCB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZhbGlkYXRlQWxsRm9ybUZpZWxkcyhmb3JtR3JvdXA6IEZvcm1Hcm91cCkge1xuICAgICAgICBPYmplY3Qua2V5cyhmb3JtR3JvdXAuY29udHJvbHMpLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IGZvcm1Hcm91cC5nZXQoZmllbGQpO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkgY29udHJvbC5tYXJrQXNEaXJ0eSh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICAgICAgZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkgdGhpcy52YWxpZGF0ZUFsbEZvcm1GaWVsZHMoY29udHJvbCk7XG4gICAgICAgICAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSBjb250cm9sLmNvbnRyb2xzLmZvckVhY2goZm9ybSA9PiB0aGlzLnZhbGlkYXRlQWxsRm9ybUZpZWxkcyhmb3JtIGFzIEZvcm1Hcm91cCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZvY3VzU2VydmljZS5mb2N1c0ZpcnN0SW52YWxpZElucHV0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTYXZlT2JzZXJ2YWJsZSgpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpO1xuICAgICAgICB2YWx1ZS5hZ2VuZGEgPSB0aGlzLmFnZW5kYTtcbiAgICAgICAgY29uc3QgcmVjZWJpbWVudG9EdG8gPSBSZWNlYmltZW50b0NvbnRyYXRvLnRvRHRvKHZhbHVlKTtcblxuICAgICAgICBsZXQgb2JzZXJ2YWJsZTtcblxuICAgICAgICBpZiAodGhpcy5pc05ldygpICYmICF2YWx1ZS5pZCkge1xuICAgICAgICAgICAgb2JzZXJ2YWJsZSA9IHRoaXMucmVjZWJpbWVudG9TZXJ2aWNlLmluc2VydChyZWNlYmltZW50b0R0byk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHZhbHVlLmlkO1xuICAgICAgICAgICAgb2JzZXJ2YWJsZSA9IHRoaXMucmVjZWJpbWVudG9TZXJ2aWNlLnVwZGF0ZShpZCwgcmVjZWJpbWVudG9EdG8pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9ic2VydmFibGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREZWxldGVPYnNlcnZhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWNlYmltZW50b1NlcnZpY2UuZGVsZXRlKCcnKS5waXBlKFxuICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZE1lc3NhZ2UoXCJzdWNjZXNzXCIsIFwieW1zLmVycC5kZWxldGVkX21lc3NhZ2VfdGl0bGVcIiwgXCJ5bXMuZXJwLmRlbGV0ZWRfbWVzc2FnZV9jb250ZW50XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ29CYWNrKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRhdGVWaXN1YWxpemF0aW9uKCkge1xuICAgICAgICBpZiAoIXVzZXJDYW5WaXN1YWxpemUodGhpcy5mb3JtR3JvdXAsIHRoaXMuYWxsUGVybWlzc2lvbnMpKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE1lc3NhZ2UoXCJlcnJvclwiLCBcInltcy5lcnAuY2Fubm90X3Zpc3VhbGl6ZV9mb3JtX3N1bW1hcnlcIiwgXCJ5bXMuZXJwLmNhbm5vdF92aXN1YWxpemVfZm9ybV9kZXRhaWxcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZE1lc3NhZ2Uoc2V2ZXJpdHk6IHN0cmluZywgc3VtbWFyeTogc3RyaW5nLCBkZXRhaWw6IHN0cmluZykge1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICBzZXZlcml0eSxcbiAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoc3VtbWFyeSksXG4gICAgICAgICAgICBkZXRhaWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoZGV0YWlsKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkZpbGlhbFZhbHVlQ2hhbmdlID0gKGZpbGlhbDogRmlsaWFsKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzYWJsZU9yZGVyc0J1dHRvbnMgPSAhZmlsaWFsO1xuICAgICAgICBpZiAoIWZpbGlhbCAmJiB0aGlzLmlzTmV3KCkpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcInByb2R1dG9cIikuc2V0VmFsdWUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcInByb2R1dG9cIikuZGlzYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KFwidHJhbnNnZW5pYVwiKS5zZXRWYWx1ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KFwidHJhbnNnZW5pYVwiKS5kaXNhYmxlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5nZXQoXCJwcm9kdXRvXCIpLmVuYWJsZSgpO1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5nZXQoXCJ0cmFuc2dlbmlhXCIpLmVuYWJsZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYnVzY2FyRmlsaWFsKCkge1xuICAgICAgICBjb25zdCBwbGFudGEgPSB0aGlzLmFnZW5kYS5wbGFudGEgfHwgeyBjbnBqOiBbXSB9O1xuICAgICAgICBpZiAocGxhbnRhLmNucGoubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1DYXJyZWdhZG8gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maWxpYWxTZXJ2aWNlXG4gICAgICAgICAgICAubGlzdCh7XG4gICAgICAgICAgICAgICAgcGFnZTogMCxcbiAgICAgICAgICAgICAgICBzaXplOiAxLFxuICAgICAgICAgICAgICAgIGZpbHRlclF1ZXJ5OiBgcGVzc29hLmNwZkNucGogZXEgJyR7cGxhbnRhLmNucGpbMF19J2AsXG4gICAgICAgICAgICAgICAgZGlzcGxheUZpZWxkczogWycqJywgJ2VtcHJlc2Eubm9tZSddXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh7IGNvbnRlbnRzIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcImZpbGlhbFwiKS5zZXRWYWx1ZShGaWxpYWwuZnJvbUR0byhjb250ZW50c1swXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1DYXJyZWdhZG8gPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25maWd1cmVGb3JuZWNlZG9yKGZvcm5lY2Vkb3JGb3JtOiBGb3JtR3JvdXApIHtcbiAgICAgICAgZm9ybmVjZWRvckZvcm0uZ2V0KFwiZm9ybmVjZWRvclwiKVxuICAgICAgICAgICAgLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDUwMCksXG4gICAgICAgICAgICAgICAgdGFwKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5laFBlc3NvYUp1cmlkaWNhKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm5lY2Vkb3JGb3JtLmdldChcInRpcG9Ob3RhRmlzY2FsXCIpLnNldFZhbHVlKFRpcG9Ob3RhRmlzY2FsLkVNUFJFU0FfSlVSSURJQ0EpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm5lY2Vkb3JGb3JtLmdldChcInRpcG9Ob3RhRmlzY2FsXCIpLmVuYWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybmVjZWRvckZvcm0uZ2V0KFwidGlwb05vdGFGaXNjYWxcIikuc2V0VmFsdWUoVGlwb05vdGFGaXNjYWwuUFJPRFVUT1JfUlVSQUwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm5lY2Vkb3JGb3JtLmdldChcInRpcG9Ob3RhRmlzY2FsXCIpLmRpc2FibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9ybmVjZWRvckZvcm0uZ2V0KFwidGlwb05vdGFGaXNjYWxcIikuc2V0VmFsdWUoVGlwb05vdGFGaXNjYWwuRU1QUkVTQV9KVVJJRElDQSk7XG4gICAgICAgICAgICAgICAgICAgIGZvcm5lY2Vkb3JGb3JtLmdldChcInRpcG9Ob3RhRmlzY2FsXCIpLmRpc2FibGUoKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcInRyYW5zZ2VuaWFcIikuc2V0VmFsdWUobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5nZXQoXCJ0cmFuc2dlbmlhXCIpLmRpc2FibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBtZXJnZU1hcCh2YWx1ZSA9PiB0aGlzLnBlc3NvYUVuZGVyZWNvU2VydmljZS5saXN0KHsgc2l6ZTogMTAsIHBhZ2U6IDAsIGZpbHRlclF1ZXJ5OiBgc2l0dWFjYW8gZXEgJ0FUSVZPJyBhbmQgcGVzc29hLmlkIGVxICcke3ZhbHVlLmlkfSdgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHsgY29udGVudHMgfSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcInRyYW5zZ2VuaWFcIikuZW5hYmxlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29udGVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm5lY2Vkb3JGb3JtLmdldChcIm9yaWdlbU1lcmNhZG9yaWFcIikuc2V0VmFsdWUoUGVzc29hRW5kZXJlY28uZnJvbUR0byhjb250ZW50c1swXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybmVjZWRvckZvcm0uZ2V0KFwib3JpZ2VtTWVyY2Fkb3JpYVwiKS5zZXRWYWx1ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICBmb3JuZWNlZG9yRm9ybS5nZXQoXCJvcmlnZW1NZXJjYWRvcmlhXCIpLmVuYWJsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZWhQZXNzb2FKdXJpZGljYShwZXNzb2E6IFBlc3NvYSkge1xuICAgICAgICBjb25zdCBjcGZDbnBqID0gKHBlc3NvYS5jcGZDbnBqIHx8IFwiXCIpLnJlcGxhY2UoL1xcRCsvZywgXCJcIik7XG4gICAgICAgIHJldHVybiBjcGZDbnBqLmxlbmd0aCA+IDExO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWVuc2FnZW1CdXNjYW5kb05vdGEoKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgIHNldmVyaXR5OiAnaW5mbycsXG4gICAgICAgICAgICBzdW1tYXJ5OiAnQnVzY2FuZG8gZGFkb3MgZGEgbm90YScsXG4gICAgICAgICAgICBkZXRhaWw6ICdBZ3VhcmRlLCBidXNjYW5kbyBkYWRvcyBkYSBub3RhJyxcbiAgICAgICAgICAgIGxpZmU6IDUwMDBcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2YWxpZGFyQ25wakZvcm5lY2Vkb3IodmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMuZWhQZXNzb2FKdXJpZGljYSh7IGNwZkNucGo6IHZhbHVlIH0gYXMgUGVzc29hKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBmb3JuZWNlZG9yID0gKHRoaXMuZm9ybUdyb3VwLmdldChcImZvcm5lY2Vkb3Jlc1wiKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzLmZpbmQoKGZvcm0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoKGZvcm0udmFsdWUuZm9ybmVjZWRvciB8fCB7IGNwZkNucGo6ICcnIH0pLmNwZkNucGogYXMgc3RyaW5nKS5zdWJzdHJpbmcoMCwgOCkgPT09IHZhbHVlLnN1YnN0cmluZygwLCA4KVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZvcm5lY2Vkb3I7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyYXRvSXRlbSB7XG4gICAgaXRlbTogQ29udHJhdG9Db21wcmFJdGVtO1xuICAgIHF1YW50aWRhZGU6IG51bWJlcjtcbn1cbiJdfQ==
1849
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjZWJpbWVudG8tZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yc2lzdGVtYXMveW1zLWludGVncmF0aW9uLyIsInNvdXJjZXMiOlsic3JjL2VycC1zZW5pb3IvcmVjZWJpbWVudG8vZm9ybS9yZWNlYmltZW50by1mb3JtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pFLE9BQU8sRUFBaUIsU0FBUyxFQUFFLEtBQUssRUFBcUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRyxPQUFPLEVBQW1CLFNBQVMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFVLE1BQU0sb0NBQW9DLENBQUM7QUFDbEYsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRCxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFZLE1BQU0sYUFBYSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FB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LElBQUksRUFBRSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ3BFLE9BQU8sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzFGLFNBQVMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6RSxjQUFjLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0UsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzVGLFVBQVUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hDLFNBQVMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6RSxXQUFXLEVBQUUs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O1FBQ0gsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQTMzRFE7UUFBUixLQUFLLEVBQUU7MENBQWlCLE1BQU07NERBQUM7SUFHaEM7UUFEQyxTQUFTLENBQUMsZ0JBQWdCLENBQUM7MENBQ0wsV0FBVztvRUFBTTtJQUd4QztRQURDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQzswQ0FDTCxXQUFXO3NFQUFNO0lBM0dqQyx3QkFBd0I7UUFScEMsU0FBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLGtCQUFrQjtZQUM1QixrdnJCQUFnRDtZQUNoRCxTQUFTLEVBQUU7Z0JBQ1AsbUJBQW1CO2FBQ3RCOztTQUVKLENBQUM7aURBdUlrQywwQkFBMEI7WUFDdEMsTUFBTTtZQUNQLGNBQWM7WUFDTCxjQUFjO1lBQ1QsbUJBQW1CO1lBQzNCLFdBQVc7WUFDYixnQkFBZ0I7WUFDWCxjQUFjO1lBQ1YseUJBQXlCO1lBQy9CLFlBQVk7WUFDWCxhQUFhO1lBQ0wscUJBQXFCO1lBQ3JCLHFCQUFxQjtZQUNyQixxQkFBcUI7WUFDN0IsYUFBYTtZQUNaLGNBQWM7WUFDWixnQkFBZ0I7WUFDTixpQ0FBaUM7WUFDdkMsb0JBQW9CO1lBQ3ZCLGlCQUFpQjtZQUNyQixhQUFhO1lBQ2IsYUFBYTtZQUNULGlCQUFpQjtZQUNkLG9CQUFvQjtZQUN0QixrQkFBa0I7WUFDcEIsZ0JBQWdCO1lBQ1QsY0FBYztPQWhLMUMsd0JBQXdCLENBaStEcEM7SUFBRCwrQkFBQztDQUFBLEFBaitERCxJQWkrREM7U0FqK0RZLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1aWxkRm9ybUZpZWxkIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvYnVpbGQtZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcbmltcG9ydCB7IEZpZWxkVHlwZSwgRm9ybUZpZWxkLCBJVG9rZW4gfSBmcm9tIFwiQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgSG90a2V5LCBIb3RrZXlzU2VydmljZSB9IGZyb20gXCJhbmd1bGFyMi1ob3RrZXlzXCI7XG5pbXBvcnQgKiBhcyBfbW9tZW50IGZyb20gXCJtb21lbnRcIjtcbmltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UsIERpYWxvZ1NlcnZpY2UsIFNvcnRNZXRhIH0gZnJvbSBcInByaW1lbmcvYXBpXCI7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gXCJwcmltZW5nL2NvbXBvbmVudHMvY29tbW9uL21lc3NhZ2VzZXJ2aWNlXCI7XG5pbXBvcnQgeyBlbXB0eSwgZm9ya0pvaW4sIG9mLCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGNvbmNhdE1hcCwgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIGZpbmFsaXplLCBtYXAsIG1lcmdlTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgRmllbGRDdXN0b21pemF0aW9uU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9maWVsZC1jdXN0b21pemF0aW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IEZvY3VzU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9mb2N1cy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBvbkxvb2t1cFJlcXVlc3QgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbG9va3VwLXV0aWxzXCI7XG5pbXBvcnQgeyBkaWFsb2dDb25maWcsIGlzVmFsaWRGaWx0ZXIsIG1lcmdlVW5pcXVlLCB1c2VyQ2FuVmlzdWFsaXplIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBOb3RhRm9ybUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL25vdGEtZm9ybS9ub3RhLWZvcm0uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBBZ2VuZGEgfSBmcm9tIFwiLi4vLi4vY29yZS9lbnRpdGllcy9hZ2VuZGEvYWdlbmRhXCI7XG5pbXBvcnQgeyBBZ2VuZGFTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2NvcmUvZW50aXRpZXMvYWdlbmRhL2FnZW5kYS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBDb250cmF0b0NvbXByYUl0ZW0gfSBmcm9tIFwiLi4vLi4vY29yZS9lbnRpdGllcy9jb250cmF0by1jb21wcmEtaXRlbS9jb250cmF0by1jb21wcmEtaXRlbVwiO1xuaW1wb3J0IHsgQ29udHJhdG9Db21wcmFEdG8gfSBmcm9tIFwiLi4vLi4vY29yZS9lbnRpdGllcy9jb250cmF0by1jb21wcmEvY29udHJhdG8tY29tcHJhLWR0b1wiO1xuaW1wb3J0IHsgQ29udHJhdG9Db21wcmFTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2NvcmUvZW50aXRpZXMvY29udHJhdG8tY29tcHJhL2NvbnRyYXRvLWNvbXByYS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBEZXJpdmFjYW8gfSBmcm9tIFwiLi4vLi4vY29yZS9lbnRpdGllcy9kZXJpdmFjYW8vZGVyaXZhY2FvXCI7XG5pbXBvcnQgeyBEZXJpdmFjYW9TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2NvcmUvZW50aXRpZXMvZGVyaXZhY2FvL2Rlcml2YWNhby5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBGaWxpYWwgfSBmcm9tIFwiLi4vLi4vY29yZS9lbnRpdGllcy9maWxpYWwvZmlsaWFsXCI7XG5pbXBvcnQgeyBGaWxpYWxTZXJ2aWNlLCBQZXNxdWlzYXJGaWxpYWlzSW5wdXQgfSBmcm9tIFwiLi4vLi4vY29yZS9lbnRpdGllcy9maWxpYWwvZmlsaWFsLnNlcnZpY2VcIjtcbmltcG9ydCB7IFBlc3NvYUVuZGVyZWNvIH0gZnJvbSBcIi4uLy4uL2NvcmUvZW50aXRpZXMvcGVzc29hLWVuZGVyZWNvL3Blc3NvYS1lbmRlcmVjb1wiO1xuaW1wb3J0IHsgUGVzc29hRW5kZXJlY29TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2NvcmUvZW50aXRpZXMvcGVzc29hLWVuZGVyZWNvL3Blc3NvYS1lbmRlcmVjby5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQZXNzb2EgfSBmcm9tIFwiLi4vLi4vY29yZS9lbnRpdGllcy9wZXNzb2EvcGVzc29hXCI7XG5pbXBvcnQgeyBQZXNzb2FTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2NvcmUvZW50aXRpZXMvcGVzc29hL3Blc3NvYS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQcm9kdXRvIH0gZnJvbSBcIi4uLy4uL2NvcmUvZW50aXRpZXMvcHJvZHV0by9wcm9kdXRvXCI7XG5pbXBvcnQgeyBQcm9kdXRvUmVjZWJpbWVudG9QYXJhbXMsIFByb2R1dG9TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2NvcmUvZW50aXRpZXMvcHJvZHV0by9wcm9kdXRvLnNlcnZpY2VcIjtcbmltcG9ydCB7IFJlY2ViaW1lbnRvQ29udHJhdG8gfSBmcm9tIFwiLi4vLi4vY29yZS9lbnRpdGllcy9yZWNlYmltZW50by1jb250cmF0by9yZWNlYmltZW50b1wiO1xuaW1wb3J0IHsgUmVjZWJpbWVudG9Db250cmF0b1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY29yZS9lbnRpdGllcy9yZWNlYmltZW50by1jb250cmF0by9yZWNlYmltZW50by5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBUcmFuc2dlbmlhIH0gZnJvbSBcIi4uLy4uL2NvcmUvZW50aXRpZXMvdHJhbnNnZW5pYS90cmFuc2dlbmlhXCI7XG5pbXBvcnQgeyBUcmFuc2dlbmlhU2VydmljZSB9IGZyb20gXCIuLi8uLi9jb3JlL2VudGl0aWVzL3RyYW5zZ2VuaWEvdHJhbnNnZW5pYS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBUcmFuc3BvcnRhZG9yYSB9IGZyb20gXCIuLi8uLi9jb3JlL2VudGl0aWVzL3RyYW5zcG9ydGFkb3JhL3RyYW5zcG9ydGFkb3JhXCI7XG5pbXBvcnQgeyBUcmFuc3BvcnRhZG9yYVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY29yZS9lbnRpdGllcy90cmFuc3BvcnRhZG9yYS90cmFuc3BvcnRhZG9yYS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBUaXBvTm90YUZpc2NhbCB9IGZyb20gXCIuLi8uLi9jb3JlL2VudW1zL3RpcG8tbm90YS1maXNjYWxcIjtcbmltcG9ydCB7IEVycFByb2Nlc3NEYXRhIH0gZnJvbSBcIi4uLy4uL2NvcmUvZXJwLXByb2Nlc3MtZGF0YS9lcnAtcHJvY2Vzcy1kYXRhXCI7XG5pbXBvcnQgeyBFcnBQcm9jZXNzU2VydmljZSB9IGZyb20gXCIuLi8uLi9jb3JlL2VycC1wcm9jZXNzLWRhdGEvZXJwLXByb2Nlc3Mtc2VydmljZVwiO1xuaW1wb3J0IHsgSGFzQ2hhbmdlU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvaGFzLWNoYW5nZS9oYXMtY2hhbmdlLXNlcnZpY2UnO1xuaW1wb3J0IHsgTm90YVZhbGlkYXRvclNlcnZpY2UsIFBlc3F1aXNhckRvY3VtZW50b1Jlc3BvbnNlIH0gZnJvbSBcIi4uLy4uL2NvcmUvbm90YS12YWxpZGF0b3Iuc2VydmljZVwiO1xuaW1wb3J0IHsgVmVyaWZpY2FOb3RhZmlzY2FsIH0gZnJvbSAnLi4vLi4vY29yZS92ZXJpZmljYS1ub3RhLWZpc2NhbC92ZXJpZmljYU5vdGFGaXNjYWwnO1xuaW1wb3J0IHsgQ29udHJhdG9Gb3JtQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbnRyYXRvLWZvcm0vY29udHJhdG8tZm9ybS5jb21wb25lbnRcIjtcbmltcG9ydCB7IFJlY2ViaW1lbnRvQ2hlZ2FkYVZlaWN1bG9PdmVycmlkZSB9IGZyb20gXCIuLi9yZWNlYmltZW50by1jaGVnYWRhLXZlaWN1bG8ub3ZlcnJpZGVcIjtcbmltcG9ydCB7IFN0YXR1c0FnZW5kYSB9IGZyb20gXCIuLy4uLy4uL2NvcmUvZW51bXMvc3RhdHVzLWFnZW5kYVwiO1xuaW1wb3J0IHsgRXJwRm9ybUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLy4uLy4uL2NvcmUvZXJwLWZvcm0tY29uZmlnL2VycC1mb3JtLWNvbmZpZy1zZXJ2aWNlJztcbmltcG9ydCB7IFNpdHVhY2FvIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy9zaXR1YWNhbyc7XG5cbmNvbnN0IG1vbWVudCA9IF9tb21lbnQ7XG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3JlY2ViaW1lbnRvLWZvcm0nLFxuICAgIHRlbXBsYXRlVXJsOiBcIi4vcmVjZWJpbWVudG8tZm9ybS5jb21wb25lbnQuaHRtbFwiLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBDb25maXJtYXRpb25TZXJ2aWNlLFxuICAgIF0sXG4gICAgc3R5bGVVcmxzOiBbJy4uLy4uL2VycC1zZW5pb3Iuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFJlY2ViaW1lbnRvRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgICBwdWJsaWMgbG9jYWxlQ29uZmlnOiBhbnkgPSB7fTtcbiAgICBwdWJsaWMgY3VycmVuY3lMb2NhbGVPcHRpb25zOiBhbnkgPSB7fTtcbiAgICBwdWJsaWMgcGVybWlzc2lvbnM6IGFueSA9IHt9O1xuICAgIHB1YmxpYyBhbGxQZXJtaXNzaW9uczogYW55ID0ge307XG5cbiAgICBwdWJsaWMgdmlzaWJsZURpYWxvZyA9IGZhbHNlO1xuICAgIHB1YmxpYyBxdWFudGlkYWRlU2VsZWNpb25hZGEgPSAxO1xuXG4gICAgcHVibGljIGZvcm1Hcm91cDogRm9ybUdyb3VwO1xuICAgIHB1YmxpYyBpdGVtRm9ybUdyb3VwOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIGxvYWRpbmc6IGJvb2xlYW47XG4gICAgcHVibGljIG1haW5QYW5lbENvbGxhcHNlZCA9IGZhbHNlO1xuXG4gICAgcHVibGljIGZpbGlhbExvb2t1cFN1Z2dlc3Rpb25zOiBGaWxpYWxbXTtcbiAgICBwdWJsaWMgZmlsaWFsTG9va3VwRGlzcGxheUZpZWxkcyA9IFtcImNvZGlnb1wiLCBcIm5vbWVcIiwgXCJlbXByZXNhLm5vbWVcIl07XG4gICAgcHVibGljIGZpbGlhbEFkdmFuY2VkRGlzcGxheUZpZWxkcyA9IFtcImlkXCIsIFwiY29kaWdvXCIsIFwibm9tZVwiLCBcImVtcHJlc2Eubm9tZVwiXTtcbiAgICBwdWJsaWMgZmlsaWFsTG9va3VwU2VwYXJhdG9yID0gXCIgLSBcIjtcbiAgICBwdWJsaWMgZmlsaWFsU2VhcmNoRmllbGRzOiBGb3JtRmllbGRbXTtcbiAgICBwdWJsaWMgZmlsaWFsU2VhcmNoR3JpZEZpZWxkczogRm9ybUZpZWxkW107XG4gICAgcHVibGljIGZpbGlhbFNlYXJjaEdyaWREYXRhOiBGaWxpYWxbXTtcbiAgICBwdWJsaWMgZmlsaWFsU2VhcmNoVG90YWxSZWNvcmRzOiBudW1iZXI7XG5cbiAgICBwdWJsaWMgZm9ybmVjZWRvckxvb2t1cFN1Z2dlc3Rpb25zOiBQZXNzb2FbXTtcbiAgICBwdWJsaWMgZm9ybmVjZWRvckxvb2t1cERpc3BsYXlGaWVsZHMgPSBbXCJjb2RpZ29cIiwgXCJub21lXCIsIFwiY3BmQ25walwiXTtcbiAgICBwdWJsaWMgZm9ybmVjZWRvckFkdmFuY2VkRGlzcGxheUZpZWxkcyA9IFtcImlkXCIsIFwiY29kaWdvXCIsIFwibm9tZVwiLCBcInNpdHVhY2FvXCIsIFwiY3BmQ25walwiLCBcInRpcG9QYXJ0aWNpcGFudGVcIl07XG4gICAgcHVibGljIGZvcm5lY2Vkb3JMb29rdXBTZXBhcmF0b3IgPSBcIiAtIFwiO1xuICAgIHB1YmxpYyBmb3JuZWNlZG9yU2VhcmNoRmllbGRzOiBGb3JtRmllbGRbXTtcbiAgICBwdWJsaWMgZm9ybmVjZWRvclNlYXJjaEdyaWRGaWVsZHM6IEZvcm1GaWVsZFtdO1xuICAgIHB1YmxpYyBmb3JuZWNlZG9yU2VhcmNoR3JpZERhdGE6IFBlc3NvYVtdO1xuICAgIHB1YmxpYyBmb3JuZWNlZG9yU2VhcmNoVG90YWxSZWNvcmRzOiBudW1iZXI7XG5cbiAgICBwdWJsaWMgb3JpZ2VtTWVyY2Fkb3JpYUxvb2t1cFN1Z2dlc3Rpb25zOiBQZXNzb2FFbmRlcmVjb1tdO1xuICAgIHB1YmxpYyBvcmlnZW1NZXJjYWRvcmlhTG9va3VwRGlzcGxheUZpZWxkcyA9IFtcImNvZGlnb1wiLCBcImNlcFwiLCBcImVuZGVyZWNvXCIsIFwiZW1wcmVzYS5kZXNjcmljYW9cIl07XG4gICAgcHVibGljIG9yaWdlbU1lcmNhZG9yaWFBZHZhbmNlZERpc3BsYXlGaWVsZHMgPSBbXCJpZFwiLCBcImNvZGlnb1wiLCBcImNlcFwiLCBcImVuZGVyZWNvXCIsIFwibnVtZXJvXCIsIFwiY29tcGxlbWVudG9cIiwgXCJjaWRhZGUuKlwiLCBcImJhaXJyb1wiLCBcInNpdHVhY2FvXCIsIFwiZW1wcmVzYS5kZXNjcmljYW9cIixcbiAgICAgICAgXCJjbnBqQ3BmXCIsIFwiaW5zY3JpY2FvRXN0YWR1YWxcIl07XG4gICAgcHVibGljIG9yaWdlbU1lcmNhZG9yaWFMb29rdXBTZXBhcmF0b3IgPSBcIiAtIFwiO1xuICAgIHB1YmxpYyBvcmlnZW1NZXJjYWRvcmlhU2VhcmNoRmllbGRzOiBGb3JtRmllbGRbXTtcbiAgICBwdWJsaWMgb3JpZ2VtTWVyY2Fkb3JpYVNlYXJjaEdyaWRGaWVsZHM6IEZvcm1GaWVsZFtdO1xuICAgIHB1YmxpYyBvcmlnZW1NZXJjYWRvcmlhU2VhcmNoR3JpZERhdGE6IFBlc3NvYUVuZGVyZWNvW107XG4gICAgcHVibGljIG9yaWdlbU1lcmNhZG9yaWFTZWFyY2hUb3RhbFJlY29yZHM6IG51bWJlcjtcblxuICAgIHB1YmxpYyBwcm9kdXRvTG9va3VwU3VnZ2VzdGlvbnM6IFByb2R1dG9bXTtcbiAgICBwdWJsaWMgcHJvZHV0b0xvb2t1cERpc3BsYXlGaWVsZHMgPSBbXCJjb2RpZ29cIiwgXCJkZXNjcmljYW9cIiwgXCJ0aXBvXCJdO1xuICAgIHB1YmxpYyBwcm9kdXRvQWR2YW5jZWREaXNwbGF5RmllbGRzID0gW1wiaWRcIiwgXCJjb2RpZ29cIiwgXCJjb21wcmFkb1wiLCBcImRlc2NyaWNhb1wiLCBcInByb2R1dG9NaXN0b1wiLCBcInNpdHVhY2FvXCIsIFwidGlwb1wiXTtcbiAgICBwdWJsaWMgcHJvZHV0b0xvb2t1cFNlcGFyYXRvciA9IFwiIC0gXCI7XG4gICAgcHVibGljIHByb2R1dG9TZWFyY2hGaWVsZHM6IEZvcm1GaWVsZFtdO1xuICAgIHB1YmxpYyBwcm9kdXRvU2VhcmNoR3JpZEZpZWxkczogRm9ybUZpZWxkW107XG4gICAgcHVibGljIHByb2R1dG9TZWFyY2hHcmlkRGF0YTogUHJvZHV0b1tdO1xuICAgIHB1YmxpYyBwcm9kdXRvU2VhcmNoVG90YWxSZWNvcmRzOiBudW1iZXI7XG5cbiAgICBwdWJsaWMgYWdlbmRhTG9va3VwU3VnZ2VzdGlvbnM6IEFnZW5kYVtdO1xuICAgIHB1YmxpYyBhZ2VuZGFMb29rdXBEaXNwbGF5RmllbGRzID0gW1wiaWRcIiwgXCJkZXNjcmljYW9cIl07XG4gICAgcHVibGljIGFnZW5kYUFkdmFuY2VkRGlzcGxheUZpZWxkcyA9IFtcImlkXCIsIFwiZGVzY3JpY2FvXCJdO1xuICAgIHB1YmxpYyBhZ2VuZGFMb29rdXBTZXBhcmF0b3IgPSBcIiAtIFwiO1xuICAgIHB1YmxpYyBhZ2VuZGFTZWFyY2hGaWVsZHM6IEZvcm1GaWVsZFtdO1xuICAgIHB1YmxpYyBhZ2VuZGFTZWFyY2hHcmlkRmllbGRzOiBGb3JtRmllbGRbXTtcbiAgICBwdWJsaWMgYWdlbmRhU2VhcmNoR3JpZERhdGE6IEFnZW5kYVtdO1xuICAgIHB1YmxpYyBhZ2VuZGFTZWFyY2hUb3RhbFJlY29yZHM6IG51bWJlcjtcblxuICAgIHB1YmxpYyBkZXJpdmFjYW9Mb29rdXBTdWdnZXN0aW9uczogRGVyaXZhY2FvW107XG4gICAgcHVibGljIGRlcml2YWNhb0xvb2t1cERpc3BsYXlGaWVsZHMgPSBbXCJjb2RpZ29cIiwgXCJkZXNjcmljYW9cIl07XG4gICAgcHVibGljIGRlcml2YWNhb0FkdmFuY2VkRGlzcGxheUZpZWxkcyA9IFtcImlkXCIsIFwiY29kaWdvXCIsIFwiZGVzY3JpY2FvXCJdO1xuICAgIHB1YmxpYyBkZXJpdmFjYW9Mb29rdXBTZXBhcmF0b3IgPSBcIiAtIFwiO1xuICAgIHB1YmxpYyBkZXJpdmFjYW9TZWFyY2hGaWVsZHM6IEZvcm1GaWVsZFtdO1xuICAgIHB1YmxpYyBkZXJpdmFjYW9TZWFyY2hHcmlkRmllbGRzOiBGb3JtRmllbGRbXTtcbiAgICBwdWJsaWMgZGVyaXZhY2FvU2VhcmNoR3JpZERhdGE6IERlcml2YWNhb1tdO1xuICAgIHB1YmxpYyBkZXJpdmFjYW9TZWFyY2hUb3RhbFJlY29yZHM6IG51bWJlcjtcblxuICAgIHB1YmxpYyB0cmFuc3BvcnRhZG9yYUxvb2t1cFN1Z2dlc3Rpb25zOiBUcmFuc3BvcnRhZG9yYVtdO1xuICAgIHB1YmxpYyB0cmFuc3BvcnRhZG9yYUxvb2t1cERpc3BsYXlGaWVsZHMgPSBbXCJjb2RpZ29cIiwgXCJwZXNzb2Eubm9tZVwiLCBcInBlc3NvYS5jcGZDbnBqXCJdO1xuICAgIHB1YmxpYyB0cmFuc3BvcnRhZG9yYUFkdmFuY2VkRGlzcGxheUZpZWxkcyA9IFtcImlkXCIsIFwiY29kaWdvXCIsIFwicGVzc29hLm5vbWVcIiwgXCJwZXNzb2EuY3BmQ25walwiXTtcbiAgICBwdWJsaWMgdHJhbnNwb3J0YWRvcmFMb29rdXBTZXBhcmF0b3IgPSBcIiAtIFwiO1xuICAgIHB1YmxpYyB0cmFuc3BvcnRhZG9yYVNlYXJjaEZpZWxkczogRm9ybUZpZWxkW107XG4gICAgcHVibGljIHRyYW5zcG9ydGFkb3JhU2VhcmNoR3JpZEZpZWxkczogRm9ybUZpZWxkW107XG4gICAgcHVibGljIHRyYW5zcG9ydGFkb3JhU2VhcmNoR3JpZERhdGE6IFRyYW5zcG9ydGFkb3JhW107XG4gICAgcHVibGljIHRyYW5zcG9ydGFkb3JhU2VhcmNoVG90YWxSZWNvcmRzOiBudW1iZXI7XG5cbiAgICBwdWJsaWMgdHJhbnNnZW5pYUxvb2t1cFN1Z2dlc3Rpb25zOiBUcmFuc2dlbmlhW107XG4gICAgcHVibGljIHRyYW5zZ2VuaWFMb29rdXBEaXNwbGF5RmllbGRzID0gW1wiY29kaWdvXCIsIFwiZGVzY3JpY2FvXCJdO1xuICAgIHB1YmxpYyB0cmFuc2dlbmlhQWR2YW5jZWREaXNwbGF5RmllbGRzID0gW1wiaWRcIiwgXCJjb2RpZ29cIiwgXCJkZXNjcmljYW9cIiwgXCJmYW1pbGlhXCIsIFwidGlwb1BhcnRpY2lwYW50ZVwiLCBcInNpdHVhY2FvXCJdO1xuICAgIHB1YmxpYyB0cmFuc2dlbmlhTG9va3VwU2VwYXJhdG9yID0gXCIgLSBcIjtcbiAgICBwdWJsaWMgdHJhbnNnZW5pYVNlYXJjaEZpZWxkczogRm9ybUZpZWxkW107XG4gICAgcHVibGljIHRyYW5zZ2VuaWFTZWFyY2hHcmlkRmllbGRzOiBGb3JtRmllbGRbXTtcbiAgICBwdWJsaWMgdHJhbnNnZW5pYVNlYXJjaEdyaWREYXRhOiBUcmFuc2dlbmlhW107XG4gICAgcHVibGljIHRyYW5zZ2VuaWFTZWFyY2hUb3RhbFJlY29yZHM6IG51bWJlcjtcblxuICAgIHB1YmxpYyBkaXNhYmxlQnV0dG9uU2F2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBkaXNhYmxlT3JkZXJzQnV0dG9uczogYm9vbGVhbiA9IHRydWU7XG4gICAgcHVibGljIGNyZWF0ZWRCeUVycDogYm9vbGVhbjtcblxuICAgIHB1YmxpYyB0b3RhbEVpeG9zQ29udHJhdGFkb3M6IG51bWJlciA9IDA7XG4gICAgcHVibGljIHRvdGFsRWl4b3NDb21wb3NpY2FvOiBudW1iZXIgPSAwO1xuXG4gICAgcHVibGljIHRpcG9zTm90YTogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogVGlwb05vdGFGaXNjYWwgfVtdID0gW1xuICAgICAgICB7IGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC50aXBvX25vdGFfZmlzY2FsX2VtcHJlc2FfanVyaWRpY2FcIiksIHZhbHVlOiBUaXBvTm90YUZpc2NhbC5FTVBSRVNBX0pVUklESUNBIH0sXG4gICAgICAgIHsgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnRpcG9fbm90YV9maXNjYWxfcHJvZHV0b3JfcnVyYWxcIiksIHZhbHVlOiBUaXBvTm90YUZpc2NhbC5QUk9EVVRPUl9SVVJBTCB9LFxuICAgIF07XG5cbiAgICBwdWJsaWMgc2F2ZUFuZEluaXRCdXR0b246IGFueTtcblxuICAgIEBJbnB1dCgpIHByaXZhdGUgYWdlbmRhOiBBZ2VuZGE7XG5cbiAgICBAVmlld0NoaWxkKFwiY3VzdG9tVGVtcGxhdGVcIilcbiAgICBwdWJsaWMgY3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKFwiY3VzdG9tRm9ybUZpZWxkc1wiKVxuICAgIHB1YmxpYyBjdXN0b21Gb3JtRmllbGRzOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgcHVibGljIGNoYXZlTm90YUZpc2NhbDogc3RyaW5nO1xuICAgIHB1YmxpYyBlcnJvQ2hhdmVOb3RhID0gZmFsc2U7XG4gICAgcHVibGljIGVycm9Gb3JuZWNlZG9yZXMgPSBmYWxzZTtcbiAgICBwdWJsaWMgZXJyb0Zvcm5lY2Vkb3Jlc05vdGFEdXBsaWNhZGE6IHN0cmluZyA9IG51bGw7XG5cbiAgICBwdWJsaWMgbm90YXNUb2tlbnM6IElUb2tlbltdID0gW107XG4gICAgcHVibGljIGZvcm5lY2Vkb3JOb3Rhc1Rva2VuczogSVRva2VuW10gPSBbXTtcbiAgICBwdWJsaWMgZm9ybmVjZWRvck5vdGFzID0gW107XG5cbiAgICBwdWJsaWMgY29udHJhdG9TZWxlY2lvbmFkbzogYW55ID0gbnVsbDtcblxuICAgIHByaXZhdGUgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICBwcml2YXRlIGZvcm1DYXJyZWdhZG86IGFueTtcblxuICAgIHByaXZhdGUgZXJwUHJvY2Vzc0RhdGE6IEVycFByb2Nlc3NEYXRhO1xuICAgIHByaXZhdGUgZW5hYmxlUmV2YWxpZGF0aW9uOiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBjb250cmF0b3M6IGFueTtcblxuICAgIHByaXZhdGUgY2FycmVnYW5kb0VycEZpbGlhbCA9IHRydWU7XG4gICAgcHJpdmF0ZSBjYXJyZWdhbmRvRXJwUm91dGVEYXRhID0gdHJ1ZTtcbiAgICBwcml2YXRlIGNhcnJlZ2FuZG9FcnBSZWNlYmltZW50byA9IHRydWU7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWNlYmltZW50b1NlcnZpY2U6IFJlY2ViaW1lbnRvQ29udHJhdG9TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY29uZmlybWF0aW9uU2VydmljZTogQ29uZmlybWF0aW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGhvdGtleXNTZXJ2aWNlOiBIb3RrZXlzU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBmaWVsZEN1c3RvbWl6YXRpb246IEZpZWxkQ3VzdG9taXphdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZm9jdXNTZXJ2aWNlOiBGb2N1c1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZmlsaWFsU2VydmljZTogRmlsaWFsU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0cmFuc3BvcnRhZG9yYVNlcnZpY2U6IFRyYW5zcG9ydGFkb3JhU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBwZXNzb2FFbmRlcmVjb1NlcnZpY2U6IFBlc3NvYUVuZGVyZWNvU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjb250cmF0b0NvbXByYVNlcnZpY2U6IENvbnRyYXRvQ29tcHJhU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBwZXNzb2FTZXJ2aWNlOiBQZXNzb2FTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHByb2R1dG9TZXJ2aWNlOiBQcm9kdXRvU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBkZXJpdmFjYW9TZXJ2aWNlOiBEZXJpdmFjYW9TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlY2ViaW1lbnRvQ2hlZ2FkYU92ZXJyaWRlOiBSZWNlYmltZW50b0NoZWdhZGFWZWljdWxvT3ZlcnJpZGUsXG4gICAgICAgIHByaXZhdGUgbm90YVZhbGlkYXRvclNlcnZpY2U6IE5vdGFWYWxpZGF0b3JTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRyYW5zZ2VuaWFTZXJ2aWNlOiBUcmFuc2dlbmlhU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGFnZW5kYVNlcnZpY2U6IEFnZW5kYVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZXJwUHJvY2Vzc1NlcnZpY2U6IEVycFByb2Nlc3NTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGVycEZvcm1Db25maWdTZXJ2aWNlOiBFcnBGb3JtQ29uZmlnU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB2ZXJpZmljYU5vdGFGaXNjYWw6IFZlcmlmaWNhTm90YWZpc2NhbCxcbiAgICAgICAgcHJpdmF0ZSBoYXNDaGFuZ2VTZXJ2aWNlOiBIYXNDaGFuZ2VTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJ1aWxkRm9ybUZpZWxkOiBCdWlsZEZvcm1GaWVsZCxcbiAgICApIHsgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cCA9IHRoaXMuZ2V0Rm9ybUdyb3VwKCk7XG4gICAgICAgIHRoaXMuaXRlbUZvcm1Hcm91cCA9IHRoaXMuZ2V0SXRlbUZvcm0oKTtcblxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5nZXQoXCJmaWxpYWxcIilcbiAgICAgICAgICAgIC52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLm9uRmlsaWFsVmFsdWVDaGFuZ2UpO1xuXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcInByb2R1dG9cIilcbiAgICAgICAgICAgIC52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSg1MDApLFxuICAgICAgICAgICAgICAgIGZpbHRlcih2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcml2YWNhbyA9IHRoaXMuZm9ybUdyb3VwLmdldChcImRlcml2YWNhb1wiKS52YWx1ZSBhcyBEZXJpdmFjYW87XG4gICAgICAgICAgICAgICAgICAgIGlmICghIWRlcml2YWNhbyAmJiBkZXJpdmFjYW8ucHJvZHV0by5pZCA9PT0gdmFsdWUuaWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KFwiZGVyaXZhY2FvXCIpLnNldFZhbHVlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5nZXQoXCJkZXJpdmFjYW9cIikuZGlzYWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKHZhbHVlID0+IHRoaXMuZGVyaXZhY2FvU2VydmljZS5saXN0KHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyUXVlcnk6IGBwcm9kdXRvLmlkIGVxICcke3ZhbHVlLmlkfScgYW5kIHNpdHVhY2FvIGVxICdBVElWTydgLFxuICAgICAgICAgICAgICAgICAgICBwYWdlOiAwLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiAxXG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh7IGNvbnRlbnRzIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5nZXQoXCJkZXJpdmFjYW9cIikuZW5hYmxlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5nZXQoXCJkZXJpdmFjYW9cIikuc2V0VmFsdWUoY29udGVudHNbMF0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcImRlcml2YWNhb1wiKS5kaXNhYmxlKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJvdXRlLmRhdGEucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHRoaXMub25Sb3V0ZURhdGFDaGFuZ2UoZGF0YSkpO1xuXG4gICAgICAgIHRoaXMucm91dGUucGFyYW1zLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpLnN1YnNjcmliZSgoeyBhZ2VuZGEgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKGFnZW5kYSA9PSAnbmV3Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVzY2FyRmlsaWFsKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVjZWJpbWVudG8oYWdlbmRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5mb3JtR3JvdXBcbiAgICAgICAgLmdldCgndHJhbnNwb3J0YWRvcmEnKVxuICAgICAgICAudmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUodGhpcy5vbkNoYW5nZVJldmFsaWRhdGlvbik7XG5cbiAgICAgICAgdGhpcy5mb3JtR3JvdXBcbiAgICAgICAgLmdldCgndHJhbnNnZW5pYScpXG4gICAgICAgIC52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgLnN1YnNjcmliZSh0aGlzLm9uQ2hhbmdlUmV2YWxpZGF0aW9uKTtcblxuICAgICAgICB0aGlzLmZvcm1Hcm91cFxuICAgICAgICAuZ2V0KCdmb3JuZWNlZG9yZXMnKVxuICAgICAgICAudmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUodGhpcy5vbkNoYW5nZVJldmFsaWRhdGlvbik7XG5cbiAgICAgICAgdGhpcy5maWxpYWxTZWFyY2hGaWVsZHMgPSB0aGlzLmdldEZpbGlhbFNlYXJjaEZpZWxkcygpO1xuICAgICAgICB0aGlzLmZpbGlhbFNlYXJjaEdyaWRGaWVsZHMgPSB0aGlzLmdldEZpbGlhbFNlYXJjaEZpZWxkcygpO1xuXG4gICAgICAgIHRoaXMuZm9ybmVjZWRvclNlYXJjaEZpZWxkcyA9IHRoaXMuZ2V0Rm9ybmVjZWRvclNlYXJjaEZpZWxkcygpO1xuICAgICAgICB0aGlzLmZvcm5lY2Vkb3JTZWFyY2hHcmlkRmllbGRzID0gdGhpcy5nZXRGb3JuZWNlZG9yU2VhcmNoR3JpZEZpZWxkcygpO1xuXG4gICAgICAgIHRoaXMub3JpZ2VtTWVyY2Fkb3JpYVNlYXJjaEZpZWxkcyA9IHRoaXMuZ2V0T3JpZ2VtTWVyY2Fkb3JpYUZpZWxkcygpO1xuICAgICAgICB0aGlzLm9yaWdlbU1lcmNhZG9yaWFTZWFyY2hHcmlkRmllbGRzID0gdGhpcy5nZXRPcmlnZW1NZXJjYWRvcmlhR3JpZEZpZWxkcygpO1xuXG4gICAgICAgIHRoaXMucHJvZHV0b1NlYXJjaEZpZWxkcyA9IHRoaXMuZ2V0UHJvZHV0b1NlYXJjaEZpZWxkcygpO1xuICAgICAgICB0aGlzLnByb2R1dG9TZWFyY2hHcmlkRmllbGRzID0gdGhpcy5nZXRQcm9kdXRvU2VhcmNoR3JpZEZpZWxkcygpO1xuXG4gICAgICAgIHRoaXMuYWdlbmRhU2VhcmNoRmllbGRzID0gdGhpcy5nZXRBZ2VuZGFTZWFyY2hGaWVsZHMoKTtcbiAgICAgICAgdGhpcy5hZ2VuZGFTZWFyY2hHcmlkRmllbGRzID0gdGhpcy5nZXRBZ2VuZGFTZWFyY2hHcmlkRmllbGRzKCk7XG5cbiAgICAgICAgdGhpcy5kZXJpdmFjYW9TZWFyY2hGaWVsZHMgPSB0aGlzLmdldERlcml2YWNhb1NlYXJjaEZpZWxkcygpO1xuICAgICAgICB0aGlzLmRlcml2YWNhb1NlYXJjaEdyaWRGaWVsZHMgPSB0aGlzLmdldERlcml2YWNhb1NlYXJjaEdyaWRGaWVsZHMoKTtcblxuICAgICAgICB0aGlzLnRyYW5zcG9ydGFkb3JhU2VhcmNoRmllbGRzID0gdGhpcy5nZXRUcmFuc3BvcnRhZG9yYVNlYXJjaEZpZWxkcygpO1xuICAgICAgICB0aGlzLnRyYW5zcG9ydGFkb3JhU2VhcmNoR3JpZEZpZWxkcyA9IHRoaXMuZ2V0VHJhbnNwb3J0YWRvcmFTZWFyY2hHcmlkRmllbGRzKCk7XG5cbiAgICAgICAgdGhpcy50cmFuc2dlbmlhU2VhcmNoRmllbGRzID0gdGhpcy5nZXRUcmFuc2dlbmlhU2VhcmNoRmllbGRzKCk7XG4gICAgICAgIHRoaXMudHJhbnNnZW5pYVNlYXJjaEdyaWRGaWVsZHMgPSB0aGlzLmdldFRyYW5zZ2VuaWFTZWFyY2hHcmlkRmllbGRzKCk7XG5cbiAgICAgICAgdGhpcy5zZXRIb3RrZXlzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYWdlbmRhICYmIHRoaXMuYWdlbmRhLmV4dGVybmFsVGVuYW50KSB7XG4gICAgICAgICAgICB0aGlzLnNldFRyYW5zcG9ydGFkb3JhKHRoaXMuYWdlbmRhLmV4dGVybmFsVGVuYW50LmNucGopO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50b3RhbEVpeG9zQ29tcG9zaWNhbyA9IHRoaXMuYWdlbmRhICYmIHRoaXMuYWdlbmRhLnZlaWN1bG8gPyB0aGlzLmFnZW5kYS52ZWljdWxvLmVpeG9zIHx8IDAgOiAwO1xuXG4gICAgICAgIGNvbnN0IHN0YXR1c0FnZW5kYSA9IFtcIkFHVUFSREFORE9fQ09ORklSTUFDQU9fU09MSUNJVEFOVEVcIiwgXCJBR0VOREFET1wiLCBcIkFHVUFSREFORE9fQ09ORklSTUFDQU9cIiwgXCJSRUpFSVRBRE9fUE9SX1ZBTElEQUNBT1wiXTtcbiAgICAgICAgaWYgKHRoaXMuYWdlbmRhICYmICFzdGF0dXNBZ2VuZGEuaW5jbHVkZXModGhpcy5hZ2VuZGEuc3RhdHVzKSkge1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZGlzYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5kaXNhYmxlQnV0dG9uU2F2ZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVycFByb2Nlc3NTZXJ2aWNlLmN1cnJlbnQuc3Vic2NyaWJlKG1lc3NhZ2UgPT4gdGhpcy5lcnBQcm9jZXNzRGF0YSA9IG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmVycEZvcm1Db25maWdTZXJ2aWNlLmN1cnJlbnQuc3Vic2NyaWJlKG1lc3NhZ2UgPT4gdGhpcy5lbmFibGVSZXZhbGlkYXRpb24gPSBtZXNzYWdlKTtcblxuICAgICAgICB0aGlzLnZlcmlmaWNhU2VUZW1BbHRlcmFjYW8oKTtcblxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5nZXQoJ3Byb2R1dG8nKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhVHJhbnNnZW5pYSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KCdmb3JuZWNlZG9yZXMnKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhVHJhbnNnZW5pYSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZlcmlmaWNhU2VUZW1BbHRlcmFjYW8oKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybUNhcnJlZ2Fkbykge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzQ2hhbmdlU2VydmljZS5oYXNDaGFuZ2UodGhpcy5hZ2VuZGEuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQ2hhbmdlUmV2YWxpZGF0aW9uID0gKF8pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZXJwUHJvY2Vzc0RhdGEgJiYgdGhpcy5mb3JtR3JvdXApIHtcbiAgICAgICAgICAgIHRoaXMuZXJwUHJvY2Vzc0RhdGEgPSB0aGlzLmVycFByb2Nlc3NTZXJ2aWNlLmJ1aWxkZXJFcnBQcm9jZXNzRGF0YSh0aGlzLmVycFByb2Nlc3NEYXRhLCB0aGlzLmZvcm1Hcm91cCk7XG4gICAgICAgICAgICB0aGlzLmVycFByb2Nlc3NTZXJ2aWNlLmNoYW5nZURhdGEodGhpcy5lcnBQcm9jZXNzRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRhVHJhbnNnZW5pYSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZXJwQ2FycmVnYWRvKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRyYW5zZ2VuaWEgPSB0aGlzLmZvcm1Hcm91cC5nZXQoXCJ0cmFuc2dlbmlhXCIpLnZhbHVlO1xuICAgICAgICBjb25zdCBwcm9kdXRvID0gdGhpcy5mb3JtR3JvdXAuZ2V0KFwicHJvZHV0b1wiKS52YWx1ZTtcbiAgICAgICAgY29uc3QgZmFtaWxpYVByb2R1dG8gPSB0aGlzLmdldEZhbWlsaWFQcm9kdXRvKCk7XG5cbiAgICAgICAgaWYoIXByb2R1dG8gfHwgIXRyYW5zZ2VuaWEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCF0aGlzLnZhbGlkYUZhbWlsaWFQcm9kdXRvQ29ycmVzcG9uZGVGYW1pbGlhVHJhbmdlbmlhKHRyYW5zZ2VuaWEsIGZhbWlsaWFQcm9kdXRvKSkge1xuICAgICAgICAgICAgdGhpcy5tZW5zYWdlbVRyYW5zZ2VuaWFJbnZhbGlkYSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52YWxpZGFGb3JuZWNlZG9yQ29ycmVzcG9uZGVUaXBvUGF0aWNpcGFudGVEYVRyYW5zZ2VuaWEodHJhbnNnZW5pYSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlcnBDYXJyZWdhZG8oKXtcbiAgICAgICAgaWYgKCB0aGlzLmNhcnJlZ2FuZG9FcnBGaWxpYWwgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICggdGhpcy5jYXJyZWdhbmRvRXJwUm91dGVEYXRhICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIHRoaXMuY2FycmVnYW5kb0VycFJlY2ViaW1lbnRvICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtZW5zYWdlbVRyYW5zZ2VuaWFJbnZhbGlkYSgpe1xuICAgICAgICB0aGlzLmFkZE1lc3NhZ2UoXCJlcnJvclwiLCBcInltcy5pbnRlZ3JhdGlvbi5tZW5zYWdlbV9lcnJvX3RpdHVsb19pbmZvcm1hcl90cmFuc2dlbmlhXCIsIFwieW1zLmludGVncmF0aW9uLm1lbnNhZ2VtX2Vycm9fY29udGV1dG9faW5mb3JtYXJfdHJhbnNnZW5pYVwiKTtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KFwidHJhbnNnZW5pYVwiKS5zZXRWYWx1ZSh1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRhRmFtaWxpYVByb2R1dG9Db3JyZXNwb25kZUZhbWlsaWFUcmFuZ2VuaWEodHJhbnNnZW5pYTogYW55LCBmYW1pbGlhUHJvZHV0bzogYW55KSB7XG4gICAgICAgIGlmKGZhbWlsaWFQcm9kdXRvICE9PSBudWxsICYmIHRyYW5zZ2VuaWEuZmFtaWxpYSA9PT0gZmFtaWxpYVByb2R1dG8pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZhbGlkYUZvcm5lY2Vkb3JDb3JyZXNwb25kZVRpcG9QYXRpY2lwYW50ZURhVHJhbnNnZW5pYSh0cmFuc2dlbmlhOiBhbnkpIHtcbiAgICAgICAgY29uc3QgdGlwb1BhcnRpY2lwYW50ZUZvcm5lY2Vkb3JlcyA9IHRoaXMuZ2V0VGlwb1RyYW5zZ2VuaWEoKTtcbiAgICAgICAgY29uc3QgZm9ybmVjZWRvcmVzID0gKHRoaXMuZm9ybUdyb3VwLmdldChcImZvcm5lY2Vkb3Jlc1wiKSBhcyBGb3JtQXJyYXkpO1xuXG4gICAgICAgIGlmIChmb3JuZWNlZG9yZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGZvcm5lY2Vkb3JFc3RhVmF6aW8gPSB0cnVlO1xuICAgICAgICAgICAgZm9ybmVjZWRvcmVzLmNvbnRyb2xzLmZvckVhY2goZm9ybSA9PiB7XG4gICAgICAgICAgICAgICAgZm9ybmVjZWRvckVzdGFWYXppbyA9IGZvcm0udmFsdWUuZm9ybmVjZWRvciA9PT0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoZm9ybmVjZWRvckVzdGFWYXppbykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZih0aXBvUGFydGljaXBhbnRlRm9ybmVjZWRvcmVzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZW5zYWdlbVRyYW5zZ2VuaWFJbnZhbGlkYSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYodGlwb1BhcnRpY2lwYW50ZUZvcm5lY2Vkb3JlcyAhPT0gdHJhbnNnZW5pYS50aXBvUGFydGljaXBhbnRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZW5zYWdlbVRyYW5zZ2VuaWFJbnZhbGlkYSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYodGlwb1BhcnRpY2lwYW50ZUZvcm5lY2Vkb3JlcyA9PT0gdHJhbnNnZW5pYS50aXBvUGFydGljaXBhbnRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICB9XG4gICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgY29uc3QgaW5wdXRMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJpbnB1dFwiKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJbnB1dCA9IEFycmF5LmZyb20oaW5wdXRMaXN0KS5maW5kKChmOiBhbnkpID0+ICFmLmRpc2FibGVkKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkSW5wdXQpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkSW5wdXQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdGhpcy5yZWNlYmltZW50b0NoZWdhZGFPdmVycmlkZS5pbml0aWFsaXplKCk7XG4gICAgICAgIHRoaXMuc2F2ZUFuZEluaXRCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5pdCcpO1xuICAgICAgICB0aGlzLmNyZWF0ZWRCeUVycERpc2FibGVGb3JtKCk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1DYXJyZWdhZG8pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc0NoYW5nZVNlcnZpY2UuaGFzQ2hhbmdlKHRoaXMuYWdlbmRhLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5yZWNlYmltZW50b0NoZWdhZGFPdmVycmlkZS5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlZEJ5RXJwRGlzYWJsZUZvcm0oKSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZU9yZGVyc0J1dHRvbnMgPSB0aGlzLmFnZW5kYS5jcmVhdGVkQnlFcnA7XG4gICAgICAgIGlmICh0aGlzLmlzTmV3KCkpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlZEJ5RXJwID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5nZXQoJ2ZpbGlhbCcpLmVuYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KCdwcm9kdXRvJykuZW5hYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5nZXQoJ2Rlcml2YWNhbycpLmVuYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KCd0cmFuc3BvcnRhZG9yYScpLmVuYWJsZSgpO1xuICAgICAgICAgICAgKHRoaXMuZm9ybUdyb3VwLmdldChcImZvcm5lY2Vkb3Jlc1wiKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzLmZvckVhY2goZm9ybSA9PiBmb3JtLmdldChcImZvcm5lY2Vkb3JcIikuZW5hYmxlKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFnZW5kYSAmJiB0aGlzLmFnZW5kYS5jcmVhdGVkQnlFcnApIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlZEJ5RXJwID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldCgnZmlsaWFsJykuZGlzYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KCdwcm9kdXRvJykuZGlzYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KCdkZXJpdmFjYW8nKS5kaXNhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVGb3JuZWNlZG9yZXMoKTtcblxuICAgICAgICAgICAgaWYgKCEhdGhpcy5mb3JtR3JvdXAuZ2V0KFwidHJhbnNwb3J0YWRvcmFcIikudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5nZXQoJ3RyYW5zcG9ydGFkb3JhJykuZGlzYWJsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGRpc2FibGVGb3JuZWNlZG9yZXMoKSB7ICAgICAgICBcbiAgICAgICAgKHRoaXMuZm9ybUdyb3VwLmdldChcImZvcm5lY2Vkb3Jlc1wiKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzLmZvckVhY2goZm9ybSA9PiBmb3JtLmdldChcImZvcm5lY2Vkb3JcIikuZGlzYWJsZSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0SG90a2V5cygpIHtcbiAgICAgICAgdGhpcy5ob3RrZXlzU2VydmljZS5hZGQoXG4gICAgICAgICAgICBuZXcgSG90a2V5KFxuICAgICAgICAgICAgICAgIFwiYWx0K3NoaWZ0K3hcIixcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBlcm1pc3Npb25zLmV4Y2x1aXIpIHRoaXMub25EZWxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW1wiSU5QVVRcIiwgXCJTRUxFQ1RcIiwgXCJURVhUQVJFQVwiXVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuaG90a2V5c1NlcnZpY2UuYWRkKFxuICAgICAgICAgICAgbmV3IEhvdGtleShcbiAgICAgICAgICAgICAgICBcImFsdCtzaGlmdCtzXCIsXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc05ldygpIHx8IHRoaXMucGVybWlzc2lvbnMuZWRpdGFyKSB0aGlzLm9uU2F2ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbXCJJTlBVVFwiLCBcIlNFTEVDVFwiLCBcIlRFWFRBUkVBXCJdXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5ob3RrZXlzU2VydmljZS5hZGQoXG4gICAgICAgICAgICBuZXcgSG90a2V5KFxuICAgICAgICAgICAgICAgIFwiYWx0K3NoaWZ0K2NcIixcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25DYW5jZWwoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW1wiSU5QVVRcIiwgXCJTRUxFQ1RcIiwgXCJURVhUQVJFQVwiXVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkJsdXJDaGF2ZU5vdGFGaXNjYWwoKSB7XG4gICAgICAgIGlmICh0aGlzLnZlcmlmaWNhTm90YUZpc2NhbC52ZXJpZmljYVNlTm90YUZpc2NhbEVzdGFEdXBsaWNhZGEodGhpcy5jaGF2ZU5vdGFGaXNjYWwsIHRoaXMuY29udHJhdG9zLCB0aGlzLmZvcm5lY2Vkb3JOb3Rhc1Rva2VucykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVtb3ZlTm90YUVycm9yKCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jaGF2ZU5vdGFGaXNjYWw7XG4gICAgICAgIGlmICghIXZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5tZW5zYWdlbUJ1c2NhbmRvTm90YSgpO1xuICAgICAgICAgICAgdGhpcy5ub3RhVmFsaWRhdG9yU2VydmljZS5wZXNxdWlzYXJEb2N1bWVudG9WYWxpZGFOb3RhRW1Vc28oe1xuICAgICAgICAgICAgICAgIGZpbGlhbElkOiAodGhpcy5mb3JtR3JvdXAuZ2V0KFwiZmlsaWFsXCIpLnZhbHVlICYmIHRoaXMuZm9ybUdyb3VwLmdldChcImZpbGlhbFwiKS52YWx1ZS5pZCkgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBjaGF2ZURvY3VtZW50bzogdmFsdWUudHJpbSgpXG4gICAgICAgICAgICB9KS5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLFxuICAgICAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMubG9hZGluZyA9IGZhbHNlKVxuICAgICAgICAgICAgKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB0aGlzLmFkZE5vdmFOb3RhKHJlc3BvbnNlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZE5vdmFOb3RhKHJlc3BvbnNlOiBQZXNxdWlzYXJEb2N1bWVudG9SZXNwb25zZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChyZXNwb25zZS5kb2N1bWVudG9zIHx8IFtdKS5sZW5ndGggPyByZXNwb25zZS5kb2N1bWVudG9zWzBdIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgaXRlbVByb2R1dG8gPSB2YWx1ZS5pdGVuc1swXSB8fCB7IHByb2R1dG86IHVuZGVmaW5lZCwgZGVyaXZhY2FvOiB1bmRlZmluZWQgfSBhcyBhbnk7XG4gICAgICAgIGNvbnN0IHByb2R1dG8gPSBQcm9kdXRvLmZyb21EdG8oaXRlbVByb2R1dG8ucHJvZHV0byk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmZvcm1Hcm91cC5nZXQoXCJwcm9kdXRvXCIpLnZhbHVlICYmICEhaXRlbVByb2R1dG8ucHJvZHV0bykge1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KFwicHJvZHV0b1wiKS5zZXRWYWx1ZShwcm9kdXRvKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcImRlcml2YWNhb1wiKS5zZXRWYWx1ZShEZXJpdmFjYW8uZnJvbUR0byhpdGVtUHJvZHV0by5kZXJpdmFjYW8pKTtcbiAgICAgICAgfSBlbHNlIGlmICghIWl0ZW1Qcm9kdXRvLnByb2R1dG8gJiYgIXRoaXMudmFsaWRhdGVQcm9kdXRvKHByb2R1dG8pKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE5vdGFFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICBcbiAgICAgICAgY29uc3QgZm9ybmVjZWRvciA9IFBlc3NvYS5mcm9tRHRvKHZhbHVlLmZvcm5lY2Vkb3IpO1xuICAgICAgICBjb25zdCBvcmlnZW1NZXJjYWRvcmlhID0gUGVzc29hRW5kZXJlY28uZnJvbUR0byh2YWx1ZS5vcmlnZW1NZXJjYWRvcmlhKTtcblxuICAgICAgICBjb25zdCBmb3JuZWNlZG9yRm9ybSA9IHRoaXMuZ2V0Rm9ybmVjZWRvcmVzRm9ybSgpLmNvbnRyb2xzLmZpbmQoKHsgdmFsdWUgfSkgPT4gdmFsdWUuZm9ybmVjZWRvci5pZCA9PT0gZm9ybmVjZWRvci5pZCkgYXMgRm9ybUdyb3VwO1xuICAgICAgICBjb25zdCBmb3JuZWNlZG9yT2ZHcm91cCA9IHRoaXMudmFsaWRhckNucGpGb3JuZWNlZG9yKGZvcm5lY2Vkb3IuY3BmQ25waik7XG5cbiAgICAgICAgaWYgKGZvcm5lY2Vkb3JPZkdyb3VwKSB7XG4gICAgICAgICAgICBpZiAoIWZvcm5lY2Vkb3JGb3JtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGb3JuZWNlZG9yKHsgZm9ybmVjZWRvciwgb3JpZ2VtTWVyY2Fkb3JpYSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWRkRm9ybmVjZWRvck5vdGFzVG9rZW4odmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKCFmb3JuZWNlZG9yRm9ybSkge1xuICAgICAgICAgICAgdGhpcy5hZGRGb3JuZWNlZG9yKHsgZm9ybmVjZWRvciwgb3JpZ2VtTWVyY2Fkb3JpYSB9KTtcbiAgICAgICAgICAgIHRoaXMuYWRkRm9ybmVjZWRvck5vdGFzVG9rZW4odmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsaWRhUmV0b3Jub1Blc3F1aXNhRG9jdW1lbnRvcyhyZXNwb25zZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2YWxpZGFSZXRvcm5vUGVzcXVpc2FEb2N1bWVudG9zKHJlc3BvbnNlOiBQZXNxdWlzYXJEb2N1bWVudG9SZXNwb25zZSkgeyAgICAgICAgXG4gICAgICAgIGNvbnN0IGR1cGxpY2F0ZUZvcm5lY2Vkb3JlcyA9IHRoaXMudmVyaWZpY2FOb3RhRmlzY2FsLmZpbmREdXBsaWNhdGVGb3JuZWNlZG9yZXMocmVzcG9uc2UpO1xuICAgICAgICBpZiAoZHVwbGljYXRlRm9ybmVjZWRvcmVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9Gb3JuZWNlZG9yZXNOb3RhRHVwbGljYWRhID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5wYXRpby5kdXBsaWNhdGVfc3VwcGxpZXJcIikgKyBkdXBsaWNhdGVGb3JuZWNlZG9yZXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEZvcm5lY2Vkb3JOb3Rhc1Rva2VuKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5mb3JuZWNlZG9yTm90YXNUb2tlbnMucHVzaCh7IGlkOiB0aGlzLmNoYXZlTm90YUZpc2NhbCwgbGFiZWw6IHZhbHVlLm51bWVybyB9KTtcblxuICAgICAgICB0aGlzLmZvcm5lY2Vkb3JOb3Rhcy5wdXNoKHtcbiAgICAgICAgICAgIGNoYXZlTm90YUZpc2NhbDogdGhpcy5jaGF2ZU5vdGFGaXNjYWwsXG4gICAgICAgICAgICBzZXJpZU5vdGFGaXNjYWw6IHZhbHVlLnNlcmllLFxuICAgICAgICAgICAgc2VyaWVMZWdhbE5vdGFGaXNjYWw6IHZhbHVlLnNlcmllTGVnYWwsXG4gICAgICAgICAgICBudW1lcm9Ob3RhRmlzY2FsOiB2YWx1ZS5udW1lcm8sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2hhdmVOb3RhRmlzY2FsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNOZXcoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5mb3JtR3JvdXAudmFsdWUuaWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZVN1Z2dlc3Rpb25zKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKHZhbHVlLmZvcm5lY2Vkb3IpIHtcbiAgICAgICAgICAgIHZhbHVlLmZvcm5lY2Vkb3IubGFiZWwgPSB0aGlzLmdldFN1Z2dlc3Rpb25WYWx1ZShcbiAgICAgICAgICAgICAgICBbXCJpZFwiLCBcImNvZGlnb1wiLCBcIm5vbWVcIiwgXCJzaXR1YWNhb1wiXSxcbiAgICAgICAgICAgICAgICBcImZvcm5lY2Vkb3JcIixcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm5lY2Vkb3JMb29rdXBTZXBhcmF0b3JcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodmFsdWUuZm9ybmVjZWRvci5sYWJlbC50cmltKCkgPT09IHRoaXMuZm9ybmVjZWRvckxvb2t1cFNlcGFyYXRvci50cmltKCkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdmFsdWUuZm9ybmVjZWRvci5sYWJlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5wcm9kdXRvKSB7XG4gICAgICAgICAgICB2YWx1ZS5wcm9kdXRvLmxhYmVsID0gdGhpcy5nZXRTdWdnZXN0aW9uVmFsdWUoXG4gICAgICAgICAgICAgICAgW1wiaWRcIiwgXCJjb2RpZ29cIiwgXCJjb21wcmFkb1wiLCBcImRlc2NyaWNhb1wiLCBcInByb2R1dG9NaXN0b1wiLCBcInNpdHVhY2FvXCIsIFwidGlwb1wiXSxcbiAgICAgICAgICAgICAgICBcInByb2R1dG9cIixcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICB0aGlzLnByb2R1dG9Mb29rdXBTZXBhcmF0b3JcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodmFsdWUucHJvZHV0by5sYWJlbC50cmltKCkgPT09IHRoaXMucHJvZHV0b0xvb2t1cFNlcGFyYXRvci50cmltKCkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdmFsdWUucHJvZHV0by5sYWJlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5hZ2VuZGEpIHtcbiAgICAgICAgICAgIHZhbHVlLmFnZW5kYS5sYWJlbCA9IHRoaXMuZ2V0U3VnZ2VzdGlvblZhbHVlKFtcImlkXCIsIFwiZGVzY3JpY2FvXCJdLCBcImFnZW5kYVwiLCB2YWx1ZSwgdGhpcy5hZ2VuZGFMb29rdXBTZXBhcmF0b3IpO1xuICAgICAgICAgICAgaWYgKHZhbHVlLmFnZW5kYS5sYWJlbC50cmltKCkgPT09IHRoaXMuYWdlbmRhTG9va3VwU2VwYXJhdG9yLnRyaW0oKSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZS5hZ2VuZGEubGFiZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUuZGVyaXZhY2FvKSB7XG4gICAgICAgICAgICB2YWx1ZS5kZXJpdmFjYW8ubGFiZWwgPSB0aGlzLmdldFN1Z2dlc3Rpb25WYWx1ZShcbiAgICAgICAgICAgICAgICBbXCJpZFwiLCBcImNvZGlnb1wiLCBcImRlc2NyaWNhb1wiXSxcbiAgICAgICAgICAgICAgICBcImRlcml2YWNhb1wiLFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIHRoaXMuZGVyaXZhY2FvTG9va3VwU2VwYXJhdG9yXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHZhbHVlLmRlcml2YWNhby5sYWJlbC50cmltKCkgPT09IHRoaXMuZGVyaXZhY2FvTG9va3VwU2VwYXJhdG9yLnRyaW0oKSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZS5kZXJpdmFjYW8ubGFiZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3VnZ2VzdGlvblZhbHVlKGRpc3BsYXlGaWVsZHM6IHN0cmluZ1tdLCBvd25lckVudGl0eTogc3RyaW5nLCB2YWx1ZTogYW55LCBzZXBhcmF0b3I6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gZGlzcGxheUZpZWxkc1xuICAgICAgICAgICAgLm1hcChmaWVsZCA9PiB0aGlzLmdldFByb3AodmFsdWUsIGAke293bmVyRW50aXR5fS4ke2ZpZWxkfWApKVxuICAgICAgICAgICAgLnJlZHVjZSgoYWNjOiBhbnksIHZhbDogYW55KSA9PiBgJHthY2N9JHtzZXBhcmF0b3J9JHt2YWx9YCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUm91dGVEYXRhQ2hhbmdlKGRhdGE6IGFueSkge1xuICAgICAgICBjb25zdCB7IGN1cnJlbmN5U3ltYm9sLCB0aG91c2FuZHNTZXBhcmF0b3IsIGRlY2ltYWxTZXBhcmF0b3IgfSA9IGRhdGEubG9jYWxlQ29uZmlnLm51bWJlcjtcblxuICAgICAgICB0aGlzLmxvY2FsZUNvbmZpZyA9IGRhdGEubG9jYWxlQ29uZmlnO1xuICAgICAgICB0aGlzLmN1cnJlbmN5TG9jYWxlT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGFsaWduOiBcImxlZnRcIixcbiAgICAgICAgICAgIHByZWZpeDogY3VycmVuY3lTeW1ib2wsXG4gICAgICAgICAgICB0aG91c2FuZHM6IHRob3VzYW5kc1NlcGFyYXRvcixcbiAgICAgICAgICAgIGRlY2ltYWw6IGRlY2ltYWxTZXBhcmF0b3IsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBkYXRhLmFsbFBlcm1pc3Npb25zLmFnZW5kYTtcbiAgICAgICAgdGhpcy5hbGxQZXJtaXNzaW9ucyA9IGRhdGEuYWxsUGVybWlzc2lvbnM7XG4gICAgICAgIGlmIChkYXRhLmVudGl0eSkge1xuICAgICAgICAgICAgY29uc3QgY2FuRWRpdCA9IHRoaXMucGVybWlzc2lvbnMuZWRpdGFyO1xuICAgICAgICAgICAgaWYgKCFjYW5FZGl0KSB0aGlzLmZvcm1Hcm91cC5kaXNhYmxlKCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZTogYW55ID0gUmVjZWJpbWVudG9Db250cmF0by5mcm9tRHRvKGRhdGEuZW50aXR5KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3VnZ2VzdGlvbnModmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKG5ldyBSZWNlYmltZW50b0NvbnRyYXRvKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYXJyZWdhbmRvRXJwUm91dGVEYXRhID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2FuY2VsKCkge1xuICAgICAgICB0aGlzLmdvQmFjaygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblNlbmRGaWxlKGZpbGVzVG9EZWxldGU6IGFueSwgZmlsZXNUb0NvbW1pdDogYW55W10pIHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZXM6IGFueVtdID0gW107XG5cbiAgICAgICAgaWYgKCF0aGlzLmZpZWxkQ3VzdG9taXphdGlvbi5pc0VtcHR5KGZpbGVzVG9EZWxldGUpKSB7XG4gICAgICAgICAgICBvYnNlcnZhYmxlcy5wdXNoKHRoaXMuZmllbGRDdXN0b21pemF0aW9uLmRlbGV0ZUZpbGVzKGZpbGVzVG9EZWxldGUpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZmllbGRDdXN0b21pemF0aW9uLmlzRW1wdHkoZmlsZXNUb0NvbW1pdCkpIHtcbiAgICAgICAgICAgIG9ic2VydmFibGVzLnB1c2godGhpcy5maWVsZEN1c3RvbWl6YXRpb24uY29tbWl0RmlsZXMoZmlsZXNUb0NvbW1pdCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmZpZWxkQ3VzdG9taXphdGlvbi5pc0VtcHR5KG9ic2VydmFibGVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKG9ic2VydmFibGVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvZih7fSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25TYXZlKHN0YXJ0PzogYm9vbGVhbikge1xuICAgICAgICBcbiAgICAgICAgaWYgKCh0aGlzLmZvcm1Hcm91cC5nZXQoXCJmb3JuZWNlZG9yZXNcIikgYXMgRm9ybUFycmF5KS5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgdGhpcy5lcnJvRm9ybmVjZWRvcmVzID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZvcm1Hcm91cC5pbnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUFsbEZvcm1GaWVsZHModGhpcy5mb3JtR3JvdXApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5pc05ldygpICB8fCAhdGhpcy5lbmFibGVSZXZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNhdmVBbmRJbml0KHN0YXJ0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXJwUHJvY2Vzc0RhdGEgPSB0aGlzLmVycFByb2Nlc3NTZXJ2aWNlLmJ1aWxkZXJFcnBQcm9jZXNzRGF0YVZhbGlkYU5vdGFOb0NvbnRyYXRvKHRoaXMuZXJwUHJvY2Vzc0RhdGEsIHRoaXMuZm9ybUdyb3VwKTtcbiAgICAgICAgdGhpcy5lcnBQcm9jZXNzU2VydmljZS5jaGFuZ2VEYXRhRXJwKHRoaXMuZXJwUHJvY2Vzc0RhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZ2VuZGFTZXJ2aWNlXG4gICAgICAgICAgICAuY2hlY2FyUmV2YWxpZGFjYW8odGhpcy5lcnBQcm9jZXNzRGF0YSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLFxuICAgICAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMubG9hZGluZyA9IGZhbHNlKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UucmVxdWVyUmV2YWxpZGFjYW8pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHVhbGl6YUFnZW5kYVBhcmFSZWplaXRhZG9Qb3JWYWxpZGFjYW8oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUFuZEluaXQoc3RhcnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXR1YWxpemFBZ2VuZGFQYXJhUmVqZWl0YWRvUG9yVmFsaWRhY2FvKCkge1xuICAgICAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICAgICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMucGF0aW8uYWdlbmRhX3JldmFsaWRhY2FvX3RpdGxlXCIpLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5wYXRpby5hZ2VuZGFfcmV2YWxpZGFjYW9fbWVzc2FnZVwiKSxcbiAgICAgICAgICAgIGFjY2VwdDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzQ2hhbmdlU2VydmljZS5oYXNDaGFuZ2VTYXZlKHRoaXMuYWdlbmRhLmlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFnZW5kYS5zdGF0dXMgPSBTdGF0dXNBZ2VuZGEuUkVKRUlUQURPX1BPUl9WQUxJREFDQU87XG4gICAgICAgICAgICAgICAgdGhpcy5hZ2VuZGEubW90b3Jpc3RhID0ge2lkOiB0aGlzLmVycFByb2Nlc3NEYXRhLm1vdG9yaXN0YUlkfTtcbiAgICAgICAgICAgICAgICB0aGlzLmFnZW5kYS52ZWljdWxvID0ge2lkOiB0aGlzLmVycFByb2Nlc3NEYXRhLnZlaWN1bG9JZH07XG4gICAgICAgICAgICAgICAgdGhpcy5hZ2VuZGFTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIC5hdHVhbGl6YXJBZ2VuZGEodGhpcy5hZ2VuZGEpXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25jYXRNYXAoKF8pID0+IHRoaXMuZ2V0U2F2ZU9ic2VydmFibGUoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmxvYWRpbmcgPSBmYWxzZSksXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoXykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWNjZXNzTWVzc2FnZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiL2NoZWdhZGEtdmVpY3Vsb1wiXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWplY3Q6ICgpID0+IHRoaXMubG9hZGluZyA9IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNhdmVBbmRJbml0KHN0YXJ0OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZ2V0U2F2ZU9ic2VydmFibGUoKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksXG4gICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5sb2FkaW5nID0gZmFsc2UpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcImlkXCIpLnNldFZhbHVlKHZhbHVlLmlkIHx8IG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VjY2Vzc01lc3NhZ2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc0NoYW5nZVNlcnZpY2UuaGFzQ2hhbmdlU2F2ZSh0aGlzLmFnZW5kYS5pZCk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ICYmIHRoaXMuc2F2ZUFuZEluaXRCdXR0b24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlQW5kSW5pdEJ1dHRvbi5jbGljaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3VjY2Vzc01lc3NhZ2UoKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgIHNldmVyaXR5OiBcInN1Y2Nlc3NcIixcbiAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJzYXZlZF9tZXNzYWdlX3RpdGxlXCIpLFxuICAgICAgICAgICAgZGV0YWlsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwic2F2ZWRfbWVzc2FnZV9jb250ZW50XCIpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25EZWxldGUoKSB7XG4gICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLmRlbGV0ZV9jb25maXJtYXRpb25fbWVzc2FnZVwiKSxcbiAgICAgICAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAuZGVsZXRlX2NvbmZpcm1hdGlvbl90aXRsZVwiKSxcbiAgICAgICAgICAgIGFjY2VwdDogKCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmdldERlbGV0ZU9ic2VydmFibGUoKVxuICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VHJhbnNwb3J0YWRvcmEodmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNucGogPSB2YWx1ZS5yZXBsYWNlKCcuJywgJycpLnJlcGxhY2UoJy8nLCAnJykucmVwbGFjZSgnLScsICcnKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlclF1ZXJ5ID0gYHBlc3NvYS5jcGZDbnBqIGVxICcke2NucGp9J2A7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydGFkb3JhU2VydmljZS5saXN0KHsgZmlsdGVyUXVlcnksIHBhZ2U6IDAsIHNpemU6IDEwIH0pXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoeyBjb250ZW50cyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBjb250ZW50c1swXS5jb2RpZ28gPyBjb250ZW50c1swXS5jb2RpZ28udG9TdHJpbmcoKSA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBjb250ZW50c1swXS5kZXNjcmljYW8gPyBjb250ZW50c1swXS5kZXNjcmljYW8udG9TdHJpbmcoKSA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXNjcmlwdGlvbi50cmltKCkgJiYgIWNvZGUudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNbMF0ubGFiZWwgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5bXMuZXJwLmRlcml2YWNhb19zZW1fZGVzY3JpY2FvJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzWzBdLmxhYmVsID0gYCR7Y29kZX0gLSAke2Rlc2NyaXB0aW9ufWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5nZXQoJ3RyYW5zcG9ydGFkb3JhJykuc2V0VmFsdWUoY29udGVudHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UHJvcChvYmo6IGFueSwgcGF0aDogYW55KSB7XG4gICAgICAgIHJldHVybiBwYXRoLnNwbGl0KFwiLlwiKS5yZWR1Y2UoKHJlc3VsdDogYW55LCBwcm9wOiBhbnkpID0+IChyZXN1bHRbcHJvcF0gPT09IHVuZGVmaW5lZCA/IFwiXCIgOiByZXN1bHRbcHJvcF0pLCBvYmopO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWNlYmltZW50byhhZ2VuZGFJZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMucmVjZWJpbWVudG9TZXJ2aWNlXG4gICAgICAgICAgICAubGlzdCh7XG4gICAgICAgICAgICAgICAgZmlsdGVyUXVlcnk6IGBhZ2VuZGEuaWQgZXEgJyR7YWdlbmRhSWR9J2AsXG4gICAgICAgICAgICAgICAgc2l6ZTogMSxcbiAgICAgICAgICAgICAgICBwYWdlOiAwXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksIGZpbmFsaXplKCgpID0+IHRoaXMubG9hZGluZyA9IGZhbHNlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHsgY29udGVudHMgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY29udGVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVzY2FyRmlsaWFsKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRvdGFsRWl4b3NDb250cmF0YWRvcyA9IGNvbnRlbnRzWzBdLmVpeG9zIHx8IDA7XG4gICAgICAgICAgICAgICAgdGhpcy50b3RhbEVpeG9zQ29tcG9zaWNhbyA9IGNvbnRlbnRzWzBdLmFnZW5kYSAmJiBjb250ZW50c1swXS5hZ2VuZGEudmVpY3Vsb1xuICAgICAgICAgICAgICAgICAgICA/IGNvbnRlbnRzWzBdLmFnZW5kYS52ZWljdWxvLmVpeG9zIHx8IDAgOiAwO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjZWJpbWVudG8gPSBSZWNlYmltZW50b0NvbnRyYXRvLmZyb21EdG8oY29udGVudHNbMF0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmVuYWJsZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUocmVjZWJpbWVudG8pO1xuXG4gICAgICAgICAgICAgICAgcmVjZWJpbWVudG8uZm9ybmVjZWRvcmVzLmZvckVhY2goZm9ybmVjZWRvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmdldEZvcm5lY2Vkb3JGb3JtKGZvcm5lY2Vkb3IpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEZvcm5lY2Vkb3Jlc0Zvcm0oKS5wdXNoKGZvcm0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvcm5lY2Vkb3IuY29udHJhdG9zLmZvckVhY2goY29udHJhdG8gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udHJhdG9Gb3JtID0gdGhpcy5nZXRDb250cmF0b0Zvcm0oY29udHJhdG8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cmF0b3MoZm9ybSkucHVzaChjb250cmF0b0Zvcm0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cmF0by5pdGVucy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Gb3JtID0gdGhpcy5nZXRJdGVtRm9ybShpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEl0ZW5zQ29udHJhdG8oY29udHJhdG9Gb3JtKS5wdXNoKGl0ZW1Gb3JtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cmF0by5ub3Rhcy5mb3JFYWNoKG5vdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdGFGb3JtID0gdGhpcy5nZXROb3RhRm9ybShub3RhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE5vdGFzKGNvbnRyYXRvRm9ybSkucHVzaChub3RhRm9ybSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVkQnlFcnBEaXNhYmxlRm9ybSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUNhcnJlZ2FkbyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJyZWdhbmRvRXJwUmVjZWJpbWVudG8gPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkZpbGlhbExvb2t1cFJlcXVlc3QodmFsdWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBmaWx0ZXJJbnB1dCA9IHRoaXMuZ2V0RmlsaWFsU2VhcmNoRmllbGRzKClcbiAgICAgICAgICAgIC5maWx0ZXIoKHsgdHlwZSB9KSA9PiBpc1ZhbGlkRmlsdGVyKHR5cGUsIHZhbHVlKSlcbiAgICAgICAgICAgIC5yZWR1Y2UoKGEsIHsgbmFtZSwgdHlwZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09IEZpZWxkVHlwZS5JbnRlZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmEsIFtuYW1lXTogdmFsdWUucmVwbGFjZSgvXFxELywgXCJcIikgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYSwgW25hbWVdOiB2YWx1ZSB9O1xuICAgICAgICAgICAgfSwgeyBjbnBqczogdGhpcy5hZ2VuZGEucGxhbnRhLmNucGosIHBhZ2luYTogeyBsaW1pdDogMTAsIG9mZnNldDogMCB9IH0gYXMgUGVzcXVpc2FyRmlsaWFpc0lucHV0KTtcblxuICAgICAgICB0aGlzLmZpbGlhbFNlcnZpY2VcbiAgICAgICAgICAgIC5saXN0RmlsaWFpcyhmaWx0ZXJJbnB1dClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobGlzdDogYW55KSA9PiB0aGlzLmZpbGlhbExvb2t1cFN1Z2dlc3Rpb25zID0gbGlzdC5maWxpYWlzLm1hcChGaWxpYWwuZnJvbUR0bykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkZpbGlhbFNlYXJjaFJlcXVlc3QoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCB7IGZpcnN0LCByb3dzLCBtdWx0aVNvcnRNZXRhLCBmaWx0ZXJEYXRhIH0gPSBldmVudDtcbiAgICAgICAgY29uc3QgcGFnZSA9IGZpcnN0IC8gcm93cztcbiAgICAgICAgY29uc3Qgc29ydDogU29ydE1ldGFbXSA9IG11bHRpU29ydE1ldGE7XG4gICAgICAgIGNvbnN0IHNvcnRGb3JtYXR0ZWQgPSAhIShzb3J0IHx8IFtdKS5sZW5ndGggJiYgeyBjYW1wbzogc29ydFswXS5maWVsZCwgb3JkZW5hY2FvOiBzb3J0WzBdLm9yZGVyID4gMCA/ICdBc2MnIDogJ0Rlc2MnIH07XG4gICAgICAgIGNvbnN0IGZpbHRlcklucHV0ID0gdGhpcy5nZXRGaWxpYWxTZWFyY2hGaWVsZHMoKVxuICAgICAgICAgICAgLmZpbHRlcigoeyBuYW1lIH0pID0+IGZpbHRlckRhdGFbbmFtZV0gIT0gdW5kZWZpbmVkICYmIGZpbHRlckRhdGFbbmFtZV0gIT0gXCJcIilcbiAgICAgICAgICAgIC5yZWR1Y2UoKGEsIHsgbmFtZSwgdHlwZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWx0ZXJEYXRhW25hbWVdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBGaWVsZFR5cGUuSW50ZWdlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5hLCBbbmFtZV06IGAke3ZhbHVlfWAucmVwbGFjZSgvXFxELywgXCJcIikgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYSwgW25hbWVdOiB2YWx1ZSB9O1xuICAgICAgICAgICAgfSwgeyBjbnBqczogdGhpcy5hZ2VuZGEucGxhbnRhLmNucGosIHBhZ2luYTogeyBsaW1pdDogcm93cywgb2Zmc2V0OiBwYWdlLCBsaXN0YU9yZGVuYWNhbzogc29ydEZvcm1hdHRlZCA/IFt7IC4uLihzb3J0Rm9ybWF0dGVkKSB9XSA6IG51bGwgfSB9IGFzIFBlc3F1aXNhckZpbGlhaXNJbnB1dCk7XG5cbiAgICAgICAgdGhpcy5maWxpYWxTZXJ2aWNlXG4gICAgICAgICAgICAubGlzdEZpbGlhaXMoZmlsdGVySW5wdXQpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGxpc3Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsaWFsU2VhcmNoR3JpZERhdGEgPSBsaXN0LmZpbGlhaXMubWFwKEZpbGlhbC5mcm9tRHRvKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGlhbFNlYXJjaFRvdGFsUmVjb3JkcyA9IGxpc3QucXRkVG90YWxSZWdpc3Ryb3M7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Gb3JuZWNlZG9yTG9va3VwUmVxdWVzdCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHNvcnQgPSB0aGlzLmZvcm5lY2Vkb3JMb29rdXBEaXNwbGF5RmllbGRzLm1hcCgoZmllbGQ6IGFueSkgPT4gKHsgZmllbGQsIG9yZGVyOiAxIH0pKTtcblxuICAgICAgICBsZXQgZmlsdGVyUXVlcnkgPSB0aGlzLmdldEZvcm5lY2Vkb3JTZWFyY2hGaWVsZHMoKVxuICAgICAgICAgICAgLmZpbHRlcigoeyB0eXBlIH0pID0+IGlzVmFsaWRGaWx0ZXIodHlwZSwgdmFsdWUpKVxuICAgICAgICAgICAgLm1hcCgoeyBuYW1lLCB0eXBlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09IFwibnVtYmVyXCIpIHJldHVybiBgJHtuYW1lfSBlcSAke3ZhbHVlfWA7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuRGF0ZSkgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5UaW1lKSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7bW9tZW50KHZhbHVlKS5mb3JtYXQoXCJISDptbTpzc1wiKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5EYXRlVGltZSkgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSkuZm9ybWF0KCl9J2A7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuU3RyaW5nKSByZXR1cm4gYGNvbnRhaW5pbmcobG93ZXIoJHtuYW1lfSksIGxvd2VyKCcke3ZhbHVlLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKX0nKSlgO1xuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIGAke25hbWV9IGVxICcke3ZhbHVlfSdgO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiIG9yIFwiKTtcblxuICAgICAgICBmaWx0ZXJRdWVyeSA9IGAoJHtmaWx0ZXJRdWVyeX0pJHshIWZpbHRlclF1ZXJ5ID8gJyBhbmQgJyA6IFwiXCJ9c2l0dWFjYW8gZXEgJ0FUSVZPJyBhbmQgZm9ybmVjZWRvciBlcSB0cnVlYDtcblxuICAgICAgICBjb25zdCBkaXNwbGF5RmllbGRzID0gbWVyZ2VVbmlxdWUodGhpcy5mb3JuZWNlZG9yTG9va3VwRGlzcGxheUZpZWxkcywgdGhpcy5mb3JuZWNlZG9yQWR2YW5jZWREaXNwbGF5RmllbGRzKTtcbiAgICAgICAgdGhpcy5wZXNzb2FTZXJ2aWNlXG4gICAgICAgICAgICAubGlzdCh7IHNvcnQsIGZpbHRlclF1ZXJ5LCBkaXNwbGF5RmllbGRzIH0pXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgobGlzdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAuLi5saXN0LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50czogbGlzdC5jb250ZW50cy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5mb3JuZWNlZG9yTG9va3VwRGlzcGxheUZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaW5kZXhPZihcIi5cIikgPiAwKSByZXR1cm4gdGhpcy5nZXRQcm9wKGl0ZW0sIGZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1bZmllbGRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4odGhpcy5mb3JuZWNlZG9yTG9va3VwU2VwYXJhdG9yKSxcbiAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobGlzdDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JuZWNlZG9yTG9va3VwU3VnZ2VzdGlvbnMgPSBsaXN0LmNvbnRlbnRzO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRm9ybmVjZWRvclNlYXJjaFJlcXVlc3QoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCB7IGZpcnN0LCByb3dzLCBtdWx0aVNvcnRNZXRhLCBmaWx0ZXJEYXRhIH0gPSBldmVudDtcbiAgICAgICAgY29uc3QgcGFnZSA9IGZpcnN0IC8gcm93cztcbiAgICAgICAgY29uc3Qgc29ydCA9IG11bHRpU29ydE1ldGE7XG4gICAgICAgIGxldCBmaWx0ZXJRdWVyeSA9IHRoaXMuZ2V0Rm9ybmVjZWRvclNlYXJjaEZpZWxkcygpXG4gICAgICAgICAgICAuZmlsdGVyKCh7IG5hbWUgfSkgPT4gZmlsdGVyRGF0YVtuYW1lXSAhPSB1bmRlZmluZWQgJiYgZmlsdGVyRGF0YVtuYW1lXSAhPSBcIlwiKVxuICAgICAgICAgICAgLm1hcCgoeyBuYW1lLCB0eXBlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpbHRlckRhdGFbbmFtZV07XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09IFwibnVtYmVyXCIpIHJldHVybiBgJHtuYW1lfSBlcSAke3ZhbHVlfWA7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuRGF0ZSkgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5UaW1lKSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7bW9tZW50KHZhbHVlKS5mb3JtYXQoXCJISDptbTpzc1wiKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5EYXRlVGltZSkgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSkuZm9ybWF0KCl9J2A7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuRW51bSkgcmV0dXJuIGAke25hbWV9IGVxICcke3ZhbHVlfSdgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRmllbGRUeXBlLlN0cmluZykgcmV0dXJuIGBjb250YWluaW5nKGxvd2VyKCR7bmFtZX0pLCBsb3dlcignJHt2YWx1ZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIil9JykpYDtcbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBgJHtuYW1lfSBlcSAnJHt2YWx1ZX0nYDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihcIiBhbmQgXCIpO1xuXG4gICAgICAgIGZpbHRlclF1ZXJ5ID0gZmlsdGVyUXVlcnkuY29uY2F0KGAkeyEhZmlsdGVyUXVlcnkgPyAnIGFuZCAnIDogXCJcIn1zaXR1YWNhbyBlcSAnQVRJVk8nIGFuZCBmb3JuZWNlZG9yIGVxIHRydWVgKTtcblxuICAgICAgICBjb25zdCBkaXNwbGF5RmllbGRzID0gbWVyZ2VVbmlxdWUodGhpcy5mb3JuZWNlZG9yTG9va3VwRGlzcGxheUZpZWxkcywgdGhpcy5mb3JuZWNlZG9yQWR2YW5jZWREaXNwbGF5RmllbGRzKTtcbiAgICAgICAgdGhpcy5wZXNzb2FTZXJ2aWNlXG4gICAgICAgICAgICAubGlzdCh7IHBhZ2UsIHNvcnQsIGZpbHRlclF1ZXJ5LCBkaXNwbGF5RmllbGRzIH0pXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgobGlzdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAuLi5saXN0LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50czogbGlzdC5jb250ZW50cy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5mb3JuZWNlZG9yTG9va3VwRGlzcGxheUZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaW5kZXhPZihcIi5cIikgPiAwKSByZXR1cm4gdGhpcy5nZXRQcm9wKGl0ZW0sIGZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1bZmllbGRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4odGhpcy5mb3JuZWNlZG9yTG9va3VwU2VwYXJhdG9yKSxcbiAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobGlzdDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JuZWNlZG9yU2VhcmNoR3JpZERhdGEgPSBsaXN0LmNvbnRlbnRzO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybmVjZWRvclNlYXJjaFRvdGFsUmVjb3JkcyA9IGxpc3QudG90YWxFbGVtZW50cztcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICBwcml2YXRlIG1vbnRhUXVlcnlPcmlnZW1NZXJjYWRvcmlhKHBlc3NvYUlkOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuICBgc2l0dWFjYW8gZXEgJ0FUSVZPJyBhbmQgb3JpZ2VtIGVxICd0cnVlJyBhbmQgcGVzc29hLmlkIGVxICcke3Blc3NvYUlkfSdgO1xuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgb25PcmlnZW1NZXJjYWRvcmlhTG9va3VwUmVxdWVzdCh2YWx1ZTogc3RyaW5nLCBmb3JuZWNlZG9yRm9ybTogRm9ybUdyb3VwKSB7XG4gICAgICAgIGNvbnN0IHNvcnQgPSB0aGlzLm9yaWdlbU1lcmNhZG9yaWFMb29rdXBEaXNwbGF5RmllbGRzLm1hcCgoZmllbGQ6IGFueSkgPT4gKHsgZmllbGQsIG9yZGVyOiAxIH0pKTtcblxuICAgICAgICBsZXQgZmlsdGVyUXVlcnkgPSB0aGlzLmdldE9yaWdlbU1lcmNhZG9yaWFGaWVsZHMoKVxuICAgICAgICAgICAgLmZpbHRlcigoeyB0eXBlIH0pID0+IGlzVmFsaWRGaWx0ZXIodHlwZSwgdmFsdWUpKVxuICAgICAgICAgICAgLm1hcCgoeyBuYW1lLCB0eXBlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09IFwibnVtYmVyXCIpIHJldHVybiBgJHtuYW1lfSBlcSAke3ZhbHVlfWA7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuRGF0ZSkgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5UaW1lKSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7bW9tZW50KHZhbHVlKS5mb3JtYXQoXCJISDptbTpzc1wiKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5EYXRlVGltZSkgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSkuZm9ybWF0KCl9J2A7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuU3RyaW5nKSByZXR1cm4gYGNvbnRhaW5pbmcobG93ZXIoJHtuYW1lfSksIGxvd2VyKCcke3ZhbHVlLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKX0nKSlgO1xuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIGAke25hbWV9IGVxICcke3ZhbHVlfSdgO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiIG9yIFwiKTtcblxuICAgICAgICBmaWx0ZXJRdWVyeSA9IGAoJHtmaWx0ZXJRdWVyeX0pJHshIWZpbHRlclF1ZXJ5ID8gJyBhbmQgJyA6ICcnfWA7XG4gICAgICAgIGZpbHRlclF1ZXJ5ICs9IHRoaXMubW9udGFRdWVyeU9yaWdlbU1lcmNhZG9yaWEoZm9ybmVjZWRvckZvcm0uZ2V0KFwiZm9ybmVjZWRvclwiKS52YWx1ZS5pZCk7XG5cbiAgICAgICAgY29uc3QgZGlzcGxheUZpZWxkcyA9IG1lcmdlVW5pcXVlKHRoaXMub3JpZ2VtTWVyY2Fkb3JpYUxvb2t1cERpc3BsYXlGaWVsZHMsIHRoaXMub3JpZ2VtTWVyY2Fkb3JpYUFkdmFuY2VkRGlzcGxheUZpZWxkcyk7XG4gICAgICAgIHRoaXMucGVzc29hRW5kZXJlY29TZXJ2aWNlXG4gICAgICAgICAgICAubGlzdCh7IGZpbHRlclF1ZXJ5LCBkaXNwbGF5RmllbGRzIH0pXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgobGlzdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAuLi5saXN0LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50czogbGlzdC5jb250ZW50cy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5vcmlnZW1NZXJjYWRvcmlhTG9va3VwRGlzcGxheUZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaW5kZXhPZihcIi5cIikgPiAwKSByZXR1cm4gdGhpcy5nZXRQcm9wKGl0ZW0sIGZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1bZmllbGRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4odGhpcy5vcmlnZW1NZXJjYWRvcmlhTG9va3VwU2VwYXJhdG9yKSxcbiAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobGlzdDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcmlnZW1NZXJjYWRvcmlhTG9va3VwU3VnZ2VzdGlvbnMgPSBsaXN0LmNvbnRlbnRzO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uT3JpZ2VtTWVyY2Fkb3JpYVNlYXJjaFJlcXVlc3QoZXZlbnQ6IGFueSwgZm9ybmVjZWRvckZvcm06IEZvcm1Hcm91cCkge1xuICAgICAgICBjb25zdCB7IGZpcnN0LCByb3dzLCBtdWx0aVNvcnRNZXRhLCBmaWx0ZXJEYXRhIH0gPSBldmVudDtcbiAgICAgICAgY29uc3QgcGFnZSA9IGZpcnN0IC8gcm93cztcbiAgICAgICAgY29uc3Qgc29ydCA9IG11bHRpU29ydE1ldGE7XG4gICAgICAgIGxldCBmaWx0ZXJRdWVyeSA9IHRoaXMuZ2V0T3JpZ2VtTWVyY2Fkb3JpYUZpZWxkcygpXG4gICAgICAgICAgICAuZmlsdGVyKCh7IG5hbWUgfSkgPT4gZmlsdGVyRGF0YVtuYW1lXSAhPSB1bmRlZmluZWQgJiYgZmlsdGVyRGF0YVtuYW1lXSAhPSBcIlwiKVxuICAgICAgICAgICAgLm1hcCgoeyBuYW1lLCB0eXBlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpbHRlckRhdGFbbmFtZV07XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09IFwibnVtYmVyXCIpIHJldHVybiBgJHtuYW1lfSBlcSAke3ZhbHVlfWA7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuRGF0ZSkgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5UaW1lKSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7bW9tZW50KHZhbHVlKS5mb3JtYXQoXCJISDptbTpzc1wiKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5EYXRlVGltZSkgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSkuZm9ybWF0KCl9J2A7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuRW51bSkgcmV0dXJuIGAke25hbWV9IGVxICcke3ZhbHVlfSdgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRmllbGRUeXBlLlN0cmluZykgcmV0dXJuIGBjb250YWluaW5nKGxvd2VyKCR7bmFtZX0pLCBsb3dlcignJHt2YWx1ZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIil9JykpYDtcbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBgJHtuYW1lfSBlcSAnJHt2YWx1ZX0nYDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihcIiBhbmQgXCIpO1xuICAgICAgICAgICAgXG4gICAgICAgIGZpbHRlclF1ZXJ5ID0gZmlsdGVyUXVlcnkuY29uY2F0KGAkeyEhZmlsdGVyUXVlcnkgPyAnIGFuZCAnIDogJyd9YCk7XG4gICAgICAgIGZpbHRlclF1ZXJ5ICs9IHRoaXMubW9udGFRdWVyeU9yaWdlbU1lcmNhZG9yaWEoZm9ybmVjZWRvckZvcm0uZ2V0KFwiZm9ybmVjZWRvclwiKS52YWx1ZS5pZCk7XG5cbiAgICAgICAgY29uc3QgZGlzcGxheUZpZWxkcyA9IG1lcmdlVW5pcXVlKHRoaXMub3JpZ2VtTWVyY2Fkb3JpYUxvb2t1cERpc3BsYXlGaWVsZHMsIHRoaXMub3JpZ2VtTWVyY2Fkb3JpYUFkdmFuY2VkRGlzcGxheUZpZWxkcyk7XG4gICAgICAgIHRoaXMucGVzc29hRW5kZXJlY29TZXJ2aWNlXG4gICAgICAgICAgICAubGlzdCh7IHBhZ2UsIHNvcnQsIGZpbHRlclF1ZXJ5LCBkaXNwbGF5RmllbGRzIH0pXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgobGlzdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAuLi5saXN0LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50czogbGlzdC5jb250ZW50cy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5vcmlnZW1NZXJjYWRvcmlhTG9va3VwRGlzcGxheUZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaW5kZXhPZihcIi5cIikgPiAwKSByZXR1cm4gdGhpcy5nZXRQcm9wKGl0ZW0sIGZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1bZmllbGRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4odGhpcy5vcmlnZW1NZXJjYWRvcmlhTG9va3VwU2VwYXJhdG9yKSxcbiAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobGlzdDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcmlnZW1NZXJjYWRvcmlhU2VhcmNoR3JpZERhdGEgPSBsaXN0LmNvbnRlbnRzO1xuICAgICAgICAgICAgICAgIHRoaXMub3JpZ2VtTWVyY2Fkb3JpYVNlYXJjaFRvdGFsUmVjb3JkcyA9IGxpc3QudG90YWxFbGVtZW50cztcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWNQYWdpbmEoZmlyc3Q6IG51bWJlciwgcm93czogbnVtYmVyLCBzb3J0OiBhbnkpIHtcbiAgICAgICAgY29uc3QgcGFnZSA9IGZpcnN0IC8gcm93cztcbiAgICAgICAgY29uc3Qgb3JkZXJCeSA9IHNvcnQgJiYgc29ydC5sZW5ndGggXG4gICAgICAgICAgICA/IHNvcnQubWFwKChzOiBhbnkpID0+ICh7IGNhbXBvOiBzLmZpZWxkLCBvcmRlbmFjYW86IHMub3JkZXIgPT09IDEgPyAnQXNjJyA6ICdEZXNjJyB9KSkgXG4gICAgICAgICAgICA6IFtdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb2Zmc2V0OiBwYWdlLFxuICAgICAgICAgICAgbGltaXQ6IHJvd3MsXG4gICAgICAgICAgICBsaXN0YU9yZGVuYWNhbzogb3JkZXJCeVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uUHJvZHV0b0xvb2t1cFJlcXVlc3QodmFsdWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBmaWxpYWwgPSB0aGlzLmZvcm1Hcm91cC5nZXQoXCJmaWxpYWxcIikudmFsdWU7XG4gICAgICAgIGNvbnN0IHRpcG9BZ2VuZGFtZW50byA9IHRoaXMuYWdlbmRhLnRpcG9BZ2VuZGFtZW50bztcblxuICAgICAgICB0aGlzLnByb2R1dG9TZXJ2aWNlXG4gICAgICAgICAgICAubGlzdFByb2R1dG9zUmVjZWJpbWVudG8oe1xuICAgICAgICAgICAgICAgIHBlc3F1aXNhOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICBlbXByZXNhSWQ6ICEhZmlsaWFsID8gZmlsaWFsLmVtcHJlc2EuaWQgOiBudWxsLFxuICAgICAgICAgICAgICAgIGZpbGlhbElkOiAhIWZpbGlhbCA/IGZpbGlhbC5pZCA6IG51bGwsXG4gICAgICAgICAgICAgICAgdGlwb0FnZW5kYW1lbnRvSWQ6ICEhdGlwb0FnZW5kYW1lbnRvID8gdGlwb0FnZW5kYW1lbnRvLmlkIDogbnVsbFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobGlzdDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9kdXRvTG9va3VwU3VnZ2VzdGlvbnMgPSAobGlzdC5wcm9kdXRvcyB8fCBbXSkubWFwKChwcm9kdXRvOiBhbnkpID0+IFByb2R1dG8uZnJvbUR0byhwcm9kdXRvKSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Qcm9kdXRvU2VhcmNoUmVxdWVzdChldmVudDogYW55KSB7XG4gICAgICAgIGNvbnN0IHsgZmlyc3QsIHJvd3MsIG11bHRpU29ydE1ldGEsIGZpbHRlckRhdGEgfSA9IGV2ZW50O1xuICAgICAgICBjb25zdCBwYWdlID0gZmlyc3QgLyByb3dzO1xuICAgICAgICBjb25zdCBzb3J0OiBTb3J0TWV0YVtdID0gbXVsdGlTb3J0TWV0YTtcbiAgICAgICAgY29uc3Qgc29ydEZvcm1hdHRlZCA9ICEhKHNvcnQgfHwgW10pLmxlbmd0aCAmJiB7IGNhbXBvOiBzb3J0WzBdLmZpZWxkLCBvcmRlbmFjYW86IHNvcnRbMF0ub3JkZXIgPiAwID8gJ0FzYycgOiAnRGVzYycgfTtcbiAgICAgICAgY29uc3QgZmlsdGVySW5wdXQgPSB0aGlzLmdldFByb2R1dG9TZWFyY2hGaWVsZHMoKVxuICAgICAgICAgICAgLmZpbHRlcigoeyBuYW1lIH0pID0+IGZpbHRlckRhdGFbbmFtZV0gIT0gdW5kZWZpbmVkICYmIGZpbHRlckRhdGFbbmFtZV0gIT0gXCJcIilcbiAgICAgICAgICAgIC5yZWR1Y2UoKGEsIHsgbmFtZSwgdHlwZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWx0ZXJEYXRhW25hbWVdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBGaWVsZFR5cGUuSW50ZWdlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5hLCBbbmFtZV06IGAke3ZhbHVlfWAucmVwbGFjZSgvXFxELywgXCJcIikgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYSwgW25hbWVdOiB2YWx1ZSB9O1xuICAgICAgICAgICAgfSwgeyBwYWdpbmE6IHsgbGltaXQ6IHJvd3MsIG9mZnNldDogcGFnZSwgbGlzdGFPcmRlbmFjYW86IHNvcnRGb3JtYXR0ZWQgPyBbeyAuLi4oc29ydEZvcm1hdHRlZCkgfV0gOiBudWxsIH0gfSBhcyBQcm9kdXRvUmVjZWJpbWVudG9QYXJhbXMpO1xuXG4gICAgICAgIGNvbnN0IGZpbGlhbCA9IHRoaXMuZm9ybUdyb3VwLmdldChcImZpbGlhbFwiKS52YWx1ZTtcbiAgICAgICAgY29uc3QgdGlwb0FnZW5kYW1lbnRvID0gdGhpcy5hZ2VuZGEudGlwb0FnZW5kYW1lbnRvO1xuXG4gICAgICAgIHRoaXMucHJvZHV0b1NlcnZpY2VcbiAgICAgICAgICAgIC5saXN0UHJvZHV0b3NSZWNlYmltZW50byh7XG4gICAgICAgICAgICAgICAgLi4uZmlsdGVySW5wdXQsXG4gICAgICAgICAgICAgICAgZW1wcmVzYUlkOiAhIWZpbGlhbCA/IGZpbGlhbC5lbXByZXNhLmlkIDogbnVsbCxcbiAgICAgICAgICAgICAgICBmaWxpYWxJZDogISFmaWxpYWwgPyBmaWxpYWwuaWQgOiBudWxsLFxuICAgICAgICAgICAgICAgIHRpcG9BZ2VuZGFtZW50b0lkOiAhIXRpcG9BZ2VuZGFtZW50byA/IHRpcG9BZ2VuZGFtZW50by5pZCA6IG51bGxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9kdXRvU2VhcmNoVG90YWxSZWNvcmRzID0gcmVzLnF0ZFRvdGFsUmVnaXN0cm9zO1xuICAgICAgICAgICAgICAgIHRoaXMucHJvZHV0b1NlYXJjaEdyaWREYXRhID0gKHJlcy5wcm9kdXRvcyB8fCBbXSkubWFwKChwcm9kdXRvOiBhbnkpID0+IFByb2R1dG8uZnJvbUR0byhwcm9kdXRvKSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25EZXJpdmFjYW9Mb29rdXBSZXF1ZXN0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc29ydCA9IHRoaXMuZGVyaXZhY2FvTG9va3VwRGlzcGxheUZpZWxkcy5tYXAoKGZpZWxkOiBhbnkpID0+ICh7IGZpZWxkLCBvcmRlcjogMSB9KSk7XG5cbiAgICAgICAgY29uc3QgZmlsdGVyUXVlcnkgPSB0aGlzLmdldERlcml2YWNhb1NlYXJjaEZpZWxkcygpXG4gICAgICAgICAgICAuZmlsdGVyKCh7IHR5cGUgfSkgPT4gaXNWYWxpZEZpbHRlcih0eXBlLCB2YWx1ZSkpXG4gICAgICAgICAgICAubWFwKCh7IG5hbWUsIHR5cGUgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJudW1iZXJcIikgcmV0dXJuIGAke25hbWV9IGVxICR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5EYXRlKSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7bW9tZW50KHZhbHVlKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpfSdgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRmllbGRUeXBlLlRpbWUpIHJldHVybiBgJHtuYW1lfSBlcSAnJHttb21lbnQodmFsdWUpLmZvcm1hdChcIkhIOm1tOnNzXCIpfSdgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRmllbGRUeXBlLkRhdGVUaW1lKSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7bW9tZW50KHZhbHVlKS5mb3JtYXQoKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5TdHJpbmcpIHJldHVybiBgY29udGFpbmluZyhsb3dlcigke25hbWV9KSwgbG93ZXIoJyR7dmFsdWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpfScpKWA7XG4gICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7dmFsdWV9J2A7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oXCIgb3IgXCIpO1xuXG4gICAgICAgIGNvbnN0IGRpc3BsYXlGaWVsZHMgPSBtZXJnZVVuaXF1ZSh0aGlzLmRlcml2YWNhb0xvb2t1cERpc3BsYXlGaWVsZHMsIHRoaXMuZGVyaXZhY2FvQWR2YW5jZWREaXNwbGF5RmllbGRzKTtcbiAgICAgICAgdGhpcy5kZXJpdmFjYW9TZXJ2aWNlXG4gICAgICAgICAgICAubGlzdCh7IHNvcnQsIGZpbHRlclF1ZXJ5LCBkaXNwbGF5RmllbGRzIH0pXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgobGlzdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAuLi5saXN0LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50czogbGlzdC5jb250ZW50cy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5kZXJpdmFjYW9Mb29rdXBEaXNwbGF5RmllbGRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pbmRleE9mKFwiLlwiKSA+IDApIHJldHVybiB0aGlzLmdldFByb3AoaXRlbSwgZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVtmaWVsZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbih0aGlzLmRlcml2YWNhb0xvb2t1cFNlcGFyYXRvciksXG4gICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGxpc3Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVyaXZhY2FvTG9va3VwU3VnZ2VzdGlvbnMgPSBsaXN0LmNvbnRlbnRzO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRGVyaXZhY2FvU2VhcmNoUmVxdWVzdChldmVudDogYW55KSB7XG4gICAgICAgIGNvbnN0IHsgZmlyc3QsIHJvd3MsIG11bHRpU29ydE1ldGEsIGZpbHRlckRhdGEgfSA9IGV2ZW50O1xuICAgICAgICBjb25zdCBwYWdlID0gZmlyc3QgLyByb3dzO1xuICAgICAgICBjb25zdCBzb3J0ID0gbXVsdGlTb3J0TWV0YTtcbiAgICAgICAgY29uc3QgZmlsdGVyUXVlcnkgPSB0aGlzLmdldERlcml2YWNhb1NlYXJjaEZpZWxkcygpXG4gICAgICAgICAgICAuZmlsdGVyKCh7IG5hbWUgfSkgPT4gZmlsdGVyRGF0YVtuYW1lXSAhPSB1bmRlZmluZWQgJiYgZmlsdGVyRGF0YVtuYW1lXSAhPSBcIlwiKVxuICAgICAgICAgICAgLm1hcCgoeyBuYW1lLCB0eXBlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpbHRlckRhdGFbbmFtZV07XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09IFwibnVtYmVyXCIpIHJldHVybiBgJHtuYW1lfSBlcSAke3ZhbHVlfWA7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuRGF0ZSkgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5UaW1lKSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7bW9tZW50KHZhbHVlKS5mb3JtYXQoXCJISDptbTpzc1wiKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5EYXRlVGltZSkgcmV0dXJuIGAke25hbWV9IGVxICcke21vbWVudCh2YWx1ZSkuZm9ybWF0KCl9J2A7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuRW51bSkgcmV0dXJuIGAke25hbWV9IGVxICcke3ZhbHVlfSdgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRmllbGRUeXBlLlN0cmluZykgcmV0dXJuIGBjb250YWluaW5nKGxvd2VyKCR7bmFtZX0pLCBsb3dlcignJHt2YWx1ZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIil9JykpYDtcbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBgJHtuYW1lfSBlcSAnJHt2YWx1ZX0nYDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihcIiBhbmQgXCIpO1xuXG4gICAgICAgIGNvbnN0IGRpc3BsYXlGaWVsZHMgPSBtZXJnZVVuaXF1ZSh0aGlzLmRlcml2YWNhb0xvb2t1cERpc3BsYXlGaWVsZHMsIHRoaXMuZGVyaXZhY2FvQWR2YW5jZWREaXNwbGF5RmllbGRzKTtcbiAgICAgICAgdGhpcy5kZXJpdmFjYW9TZXJ2aWNlXG4gICAgICAgICAgICAubGlzdCh7IHBhZ2UsIHNvcnQsIGZpbHRlclF1ZXJ5LCBkaXNwbGF5RmllbGRzIH0pXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgobGlzdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAuLi5saXN0LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50czogbGlzdC5jb250ZW50cy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5kZXJpdmFjYW9Mb29rdXBEaXNwbGF5RmllbGRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pbmRleE9mKFwiLlwiKSA+IDApIHJldHVybiB0aGlzLmdldFByb3AoaXRlbSwgZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVtmaWVsZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbih0aGlzLmRlcml2YWNhb0xvb2t1cFNlcGFyYXRvciksXG4gICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGxpc3Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVyaXZhY2FvU2VhcmNoR3JpZERhdGEgPSBsaXN0LmNvbnRlbnRzO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVyaXZhY2FvU2VhcmNoVG90YWxSZWNvcmRzID0gbGlzdC50b3RhbEVsZW1lbnRzO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uVHJhbnNwb3J0YWRvcmFMb29rdXBSZXF1ZXN0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgb25Mb29rdXBSZXF1ZXN0KHRoaXMudHJhbnNwb3J0YWRvcmFTZWFyY2hGaWVsZHMsIHRoaXMudHJhbnNwb3J0YWRvcmFMb29rdXBEaXNwbGF5RmllbGRzLCB0aGlzLnRyYW5zcG9ydGFkb3JhQWR2YW5jZWREaXNwbGF5RmllbGRzLCB0aGlzLnRyYW5zcG9ydGFkb3JhTG9va3VwU2VwYXJhdG9yLCB0aGlzLnRyYW5zcG9ydGFkb3JhU2VydmljZSwgdmFsdWUpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGxpc3Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0YWRvcmFMb29rdXBTdWdnZXN0aW9ucyA9IGxpc3QuY29udGVudHM7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25UcmFuc3BvcnRhZG9yYVNlYXJjaFJlcXVlc3QoZXZlbnQ6IGFueSkge1xuXG4gICAgICAgIGNvbnN0IHsgZmlyc3QsIHJvd3MsIG11bHRpU29ydE1ldGEsIGZpbHRlckRhdGEgfSA9IGV2ZW50O1xuICAgICAgICBjb25zdCBwYWdlID0gZmlyc3QgLyByb3dzO1xuICAgICAgICBjb25zdCBzb3J0ID0gbXVsdGlTb3J0TWV0YTtcbiAgICAgICAgY29uc3QgZmlsdGVyUXVlcnkgPSB0aGlzLmdldFRyYW5zcG9ydGFkb3JhU2VhcmNoRmllbGRzKClcbiAgICAgICAgICAgIC5maWx0ZXIoKHsgbmFtZSB9KSA9PiBmaWx0ZXJEYXRhW25hbWVdICE9IHVuZGVmaW5lZCAmJiBmaWx0ZXJEYXRhW25hbWVdICE9IFwiXCIpXG4gICAgICAgICAgICAubWFwKCh7IG5hbWUsIHR5cGUgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZmlsdGVyRGF0YVtuYW1lXTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJudW1iZXJcIikgcmV0dXJuIGAke25hbWV9IGVxICR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5EYXRlKSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7bW9tZW50KHZhbHVlKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpfSdgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRmllbGRUeXBlLlRpbWUpIHJldHVybiBgJHtuYW1lfSBlcSAnJHttb21lbnQodmFsdWUpLmZvcm1hdChcIkhIOm1tOnNzXCIpfSdgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRmllbGRUeXBlLkRhdGVUaW1lKSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7bW9tZW50KHZhbHVlKS5mb3JtYXQoKX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5FbnVtKSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7dmFsdWV9J2A7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBGaWVsZFR5cGUuU3RyaW5nKSByZXR1cm4gYGNvbnRhaW5pbmcobG93ZXIoJHtuYW1lfSksIGxvd2VyKCcke3ZhbHVlLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKX0nKSlgO1xuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIGAke25hbWV9IGVxICcke3ZhbHVlfSdgO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiIGFuZCBcIik7XG5cbiAgICAgICAgY29uc3QgZGlzcGxheUZpZWxkcyA9IG1lcmdlVW5pcXVlKHRoaXMudHJhbnNwb3J0YWRvcmFMb29rdXBEaXNwbGF5RmllbGRzLCB0aGlzLnRyYW5zcG9ydGFkb3JhQWR2YW5jZWREaXNwbGF5RmllbGRzKTtcbiAgICAgICAgdGhpcy50cmFuc3BvcnRhZG9yYVNlcnZpY2VcbiAgICAgICAgICAgIC5saXN0KHsgcGFnZSwgc29ydCwgZmlsdGVyUXVlcnksIGRpc3BsYXlGaWVsZHMgfSlcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChsaXN0OiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmxpc3QsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBsaXN0LmNvbnRlbnRzLm1hcCgoaXRlbTogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zcG9ydGFkb3JhTG9va3VwRGlzcGxheUZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaW5kZXhPZihcIi5cIikgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9wKGl0ZW0sIGZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVtmaWVsZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbih0aGlzLnRyYW5zcG9ydGFkb3JhTG9va3VwU2VwYXJhdG9yKSxcbiAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobGlzdDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc3BvcnRhZG9yYVNlYXJjaEdyaWREYXRhID0gbGlzdC5jb250ZW50cztcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydGFkb3JhU2VhcmNoVG90YWxSZWNvcmRzID0gbGlzdC50b3RhbEVsZW1lbnRzO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uVHJhbnNnZW5pYUxvb2t1cFJlcXVlc3QodmFsdWU6IGFueSkge1xuICAgICAgICBvbkxvb2t1cFJlcXVlc3QodGhpcy5nZXRUcmFuc2dlbmlhU2VhcmNoRmllbGRzKCksXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2dlbmlhTG9va3VwRGlzcGxheUZpZWxkcyxcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZ2VuaWFBZHZhbmNlZERpc3BsYXlGaWVsZHMsXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2dlbmlhTG9va3VwU2VwYXJhdG9yLFxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNnZW5pYVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgdGhpcy5nZXJhRmlsdHJvVHJhbnNnZW5pYSgpKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChsaXN0OiBhbnkpID0+IHRoaXMudHJhbnNnZW5pYUxvb2t1cFN1Z2dlc3Rpb25zID0gbGlzdC5jb250ZW50cyk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uVHJhbnNnZW5pYVNlYXJjaFJlcXVlc3QoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCB7IGZpcnN0LCByb3dzLCBtdWx0aVNvcnRNZXRhLCBmaWx0ZXJEYXRhIH0gPSBldmVudDtcbiAgICAgICAgY29uc3QgcGFnZSA9IGZpcnN0IC8gcm93cztcbiAgICAgICAgY29uc3Qgc29ydCA9IG11bHRpU29ydE1ldGE7XG4gICAgICAgIGxldCBmaWx0ZXJRdWVyeSA9IHRoaXMuZ2V0VHJhbnNnZW5pYVNlYXJjaEZpZWxkcygpXG4gICAgICAgICAgICAuZmlsdGVyKCh7IG5hbWUgfSkgPT4gZmlsdGVyRGF0YVtuYW1lXSAhPSB1bmRlZmluZWQgJiYgZmlsdGVyRGF0YVtuYW1lXSAhPSBcIlwiKVxuICAgICAgICAgICAgLm1hcCgoeyBuYW1lLCB0eXBlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpbHRlckRhdGFbbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSBcIm51bWJlclwiKSByZXR1cm4gYCR7bmFtZX0gZXEgJHt2YWx1ZX1gO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRmllbGRUeXBlLkVudW0pIHJldHVybiBgJHtuYW1lfSBlcSAnJHt2YWx1ZX0nYDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IEZpZWxkVHlwZS5TdHJpbmcpIHJldHVybiBgY29udGFpbmluZyhsb3dlcigke25hbWV9KSwgbG93ZXIoJyR7dmFsdWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpfScpKWA7XG4gICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gYCR7bmFtZX0gZXEgJyR7dmFsdWV9J2A7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oXCIgYW5kIFwiKTtcblxuICAgICAgICBjb25zdCAgZmlsdHJvVHJhbnNnZW5pYSA9IHRoaXMuZ2VyYUZpbHRyb1RyYW5zZ2VuaWEoKTtcbiAgICAgICAgaWYgKGZpbHRyb1RyYW5zZ2VuaWEgJiYgZmlsdHJvVHJhbnNnZW5pYS50cmltKCkpIHtcbiAgICAgICAgICAgIGZpbHRlclF1ZXJ5ID0gZmlsdGVyUXVlcnkgPyBgKCR7ZmlsdGVyUXVlcnl9KSBhbmQgJHtmaWx0cm9UcmFuc2dlbmlhfWAgOiBmaWx0cm9UcmFuc2dlbmlhO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlzcGxheUZpZWxkcyA9IG1lcmdlVW5pcXVlKHRoaXMudHJhbnNnZW5pYUxvb2t1cERpc3BsYXlGaWVsZHMsIHRoaXMudHJhbnNnZW5pYUFkdmFuY2VkRGlzcGxheUZpZWxkcyk7XG4gICAgICAgIHRoaXMudHJhbnNnZW5pYVNlcnZpY2VcbiAgICAgICAgICAgIC5saXN0KHsgcGFnZSwgc29ydCwgZmlsdGVyUXVlcnksIGRpc3BsYXlGaWVsZHMgfSlcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChsaXN0OiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmxpc3QsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBsaXN0LmNvbnRlbnRzLm1hcCgoaXRlbTogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zZ2VuaWFMb29rdXBEaXNwbGF5RmllbGRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pbmRleE9mKFwiLlwiKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFByb3AoaXRlbSwgZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtW2ZpZWxkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKHRoaXMudHJhbnNnZW5pYUxvb2t1cFNlcGFyYXRvciksXG4gICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGxpc3Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNnZW5pYVNlYXJjaEdyaWREYXRhID0gbGlzdC5jb250ZW50cztcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZ2VuaWFTZWFyY2hUb3RhbFJlY29yZHMgPSBsaXN0LnRvdGFsRWxlbWVudHM7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRm9ybmVjZWRvcihkYXRhOiBhbnkgPSB7fSkge1xuICAgICAgICB0aGlzLmVycm9Gb3JuZWNlZG9yZXMgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgZm9ybSA9IHRoaXMuZ2V0Rm9ybmVjZWRvckZvcm0oZGF0YSk7XG4gICAgICAgIHRoaXMuY29uZmlndXJlRm9ybmVjZWRvcihmb3JtKTtcbiAgICAgICAgdGhpcy5nZXRGb3JuZWNlZG9yZXNGb3JtKCkucHVzaChmb3JtKTtcbiAgICAgICAgcmV0dXJuIGZvcm07XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUZvcm5lY2Vkb3IoY29udHJvbDogRm9ybUdyb3VwKSB7XG4gICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgICAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAucmVtb3ZlX2Zvcm5lY2Vkb3JfaGVhZGVyXCIpLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAucmVtb3ZlX2Zvcm5lY2Vkb3JfbWVzc2FnZVwiKSxcbiAgICAgICAgICAgIGFjY2VwdDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXRGb3JuZWNlZG9yZXNGb3JtKCkuY29udHJvbHMuaW5kZXhPZihjb250cm9sKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdldEZvcm5lY2Vkb3Jlc0Zvcm0oKS5yZW1vdmVBdChpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JuZWNlZG9yZXNGb3JtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAuZ2V0KFwiZm9ybmVjZWRvcmVzXCIpIGFzIEZvcm1BcnJheTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQ29udHJhdG8oZm9ybmVjZWRvckZvcm06IEZvcm1Hcm91cCkge1xuICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2VcbiAgICAgICAgICAgIC5vcGVuKENvbnRyYXRvRm9ybUNvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgIC4uLmRpYWxvZ0NvbmZpZyxcbiAgICAgICAgICAgICAgICBoZWFkZXI6ICdBZGljaW9uYXIgQ29udHJhdG8nLFxuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgYWdlbmRhOiB0aGlzLmFnZW5kYSxcbiAgICAgICAgICAgICAgICAgICAgZmlsaWFsOiB0aGlzLmZvcm1Hcm91cC5nZXQoXCJmaWxpYWxcIikudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHByb2R1dG86IHRoaXMuZm9ybUdyb3VwLmdldChcInByb2R1dG9cIikudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGZvcm5lY2Vkb3I6IGZvcm5lY2Vkb3JGb3JtLmdldChcImZvcm5lY2Vkb3JcIikudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyYXRvczogZm9ybmVjZWRvckZvcm0uZ2V0KFwiY29udHJhdG9zXCIpLnZhbHVlLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub25DbG9zZVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksIGZpbHRlcih2YWx1ZSA9PiAhIXZhbHVlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHsgY29udHJhdG8gfTogYW55KSA9PiB0aGlzLm9uQ29udHJhdG9TYXZlZChjb250cmF0bywgZm9ybmVjZWRvckZvcm0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlckNvbnRyYXRvKGZvcm5lY2Vkb3JGb3JtOiBGb3JtR3JvdXAsIGNvbnRyYXRvRm9ybTogRm9ybUdyb3VwKSB7XG4gICAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgICAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAucmVtb3ZlX2NvbnRyYXRvX2hlYWRlclwiKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnJlbW92ZV9jb250cmF0b19tZXNzYWdlXCIpLFxuICAgICAgICAgICAgYWNjZXB0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSAoZm9ybmVjZWRvckZvcm0uZ2V0KFwiY29udHJhdG9zXCIpIGFzIEZvcm1BcnJheSkuY29udHJvbHMuaW5kZXhPZihjb250cmF0b0Zvcm0pO1xuICAgICAgICAgICAgICAgIChmb3JuZWNlZG9yRm9ybS5nZXQoXCJjb250cmF0b3NcIikgYXMgRm9ybUFycmF5KS5yZW1vdmVBdChpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb250cmF0b3MoZm9ybmVjZWRvckZvcm06IEZvcm1Hcm91cCkge1xuICAgICAgICB0aGlzLmNvbnRyYXRvcyA9IGZvcm5lY2Vkb3JGb3JtLmdldChcImNvbnRyYXRvc1wiKVxuICAgICAgICByZXR1cm4gdGhpcy5jb250cmF0b3MgYXMgRm9ybUFycmF5O1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGROb3RhKGZvcm1Hcm91cDogRm9ybUdyb3VwKSB7XG4gICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKE5vdGFGb3JtQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLmFkaWNpb25hcl9ub3RhXCIpLFxuICAgICAgICAgICAgLi4uZGlhbG9nQ29uZmlnLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGZvcm5lY2Vkb3I6IGZvcm1Hcm91cC5nZXQoXCJmb3JuZWNlZG9yXCIpLnZhbHVlLFxuICAgICAgICAgICAgICAgIHByb2R1dG86IHRoaXMuZm9ybUdyb3VwLmdldChcInByb2R1dG9cIikudmFsdWUsXG4gICAgICAgICAgICAgICAgZmlsaWFsOiB0aGlzLmZvcm1Hcm91cC5nZXQoXCJmaWxpYWxcIikudmFsdWUsXG4gICAgICAgICAgICAgICAgZm9ybmVjZWRvck5vdGFzVG9rZW5zOiB0aGlzLmZvcm5lY2Vkb3JOb3Rhc1Rva2VucyxcbiAgICAgICAgICAgICAgICBjb250cmF0b3M6IHRoaXMuY29udHJhdG9zLFxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAub25DbG9zZVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSwgZmlsdGVyKHZhbHVlID0+ICEhdmFsdWUpKVxuICAgICAgICAuc3Vic2NyaWJlKHZhbHVlID0+IHRoaXMub25Ob3RhU2F2ZWQodmFsdWUsIGZvcm1Hcm91cCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVyTm90YShmb3JuZWNlZG9yRm9ybTogRm9ybUdyb3VwLCBjb250cmF0b0Zvcm06IEZvcm1Hcm91cCwgbm90YUZvcm06IEZvcm1Hcm91cCkge1xuICAgICAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICAgICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnJlbW92ZV9ub3RhX2hlYWRlclwiKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnJlbW92ZV9ub3RhX21lc3NhZ2VcIiksXG4gICAgICAgICAgICBhY2NlcHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250cmF0b0lkID0gY29udHJhdG9Gb3JtW1widmFsdWVcIl1bXCJjb250cmF0b1wiXVtcImlkXCJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXROb3Rhc0Zyb21Db250cmF0b3MoZm9ybmVjZWRvckZvcm0sIGNvbnRyYXRvSWQpLmNvbnRyb2xzLmluZGV4T2Yobm90YUZvcm0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Tm90YXNGcm9tQ29udHJhdG9zKGZvcm5lY2Vkb3JGb3JtLCBjb250cmF0b0lkKS5yZW1vdmVBdChpbmRleCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBub3RhID0gbm90YUZvcm1bXCJ2YWx1ZVwiXTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm5lY2Vkb3JOb3Rhc1Rva2Vucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IG5vdGEuY2hhdmVOb3RhRmlzY2FsLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogbm90YS5udW1lcm9Ob3RhRmlzY2FsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JuZWNlZG9yTm90YXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNoYXZlTm90YUZpc2NhbDogbm90YS5jaGF2ZU5vdGFGaXNjYWwsXG4gICAgICAgICAgICAgICAgICAgIHNlcmllTm90YUZpc2NhbDogbm90YS5zZXJpZU5vdGFGaXNjYWwsXG4gICAgICAgICAgICAgICAgICAgIHNlcmllTGVnYWxOb3RhRmlzY2FsOiBub3RhLnNlcmllTGVnYWxOb3RhRmlzY2FsLFxuICAgICAgICAgICAgICAgICAgICBudW1lcm9Ob3RhRmlzY2FsOiBub3RhLm51bWVyb05vdGFGaXNjYWwsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXROb3Rhcyhjb250cmF0b0Zvcm06IEZvcm1Hcm91cCkge1xuICAgICAgICByZXR1cm4gY29udHJhdG9Gb3JtW1wiY29udHJvbHNcIl1bXCJub3Rhc1wiXSBhcyBGb3JtQXJyYXk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEl0ZW5zQ29udHJhdG8oY29udHJhdG9Gb3JtOiBGb3JtR3JvdXApIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyYXRvRm9ybS5nZXQoXCJpdGVuc1wiKSBhcyBGb3JtQXJyYXk7XG4gICAgfVxuXG4gICAgcHVibGljIHNob3dCdXR0b25zKCkge1xuICAgICAgICBpZiAoIXRoaXMuYWdlbmRhKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTmV3KCkgfHwgW1xuICAgICAgICAgICAgU3RhdHVzQWdlbmRhLkFHRU5EQURPLFxuICAgICAgICAgICAgU3RhdHVzQWdlbmRhLkFHVUFSREFORE9fQ09ORklSTUFDQU8sXG4gICAgICAgICAgICBTdGF0dXNBZ2VuZGEuQUdVQVJEQU5ET19DT05GSVJNQUNBT19TT0xJQ0lUQU5URSxcbiAgICAgICAgICAgIFN0YXR1c0FnZW5kYS5SRUpFSVRBRE9fUE9SX1ZBTElEQUNBT1xuICAgICAgICBdLmluY2x1ZGVzKHRoaXMuYWdlbmRhLnN0YXR1cyBhcyBTdGF0dXNBZ2VuZGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNhYmxlQWRpY2lvbmFyTm90YSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuY29udHJhdG9TZWxlY2lvbmFkbyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VGlwb1RyYW5zZ2VuaWEoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCh0aGlzLmZvcm1Hcm91cC5nZXQoXCJmb3JuZWNlZG9yZXNcIikgYXMgRm9ybUFycmF5KS5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCB0aXBvUGFydGljaXBhbnRlVHJhbnNnZW5pYUdlcmFsID0gbnVsbDsgICAgICAgIFxuICAgICAgICBjb25zdCByZWNlYmltZW50b0R0byA9IFJlY2ViaW1lbnRvQ29udHJhdG8udG9EdG8odGhpcy5mb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKSk7ICAgICAgICBcbiAgICAgICAgcmVjZWJpbWVudG9EdG8uZm9ybmVjZWRvcmVzLmZvckVhY2goY3VycmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoY3VycmVudC5mb3JuZWNlZG9yICE9IG51bGwgJiYgY3VycmVudC5mb3JuZWNlZG9yLnRpcG9QYXJ0aWNpcGFudGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRpcG9QYXJ0aWNpcGFudGVUcmFuc2dlbmlhR2VyYWwgPSBjdXJyZW50LmZvcm5lY2Vkb3IudGlwb1BhcnRpY2lwYW50ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aXBvUGFydGljaXBhbnRlVHJhbnNnZW5pYUdlcmFsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RmFtaWxpYVByb2R1dG8oKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcHJvZHV0byA9IHRoaXMuZm9ybUdyb3VwLmdldChcInByb2R1dG9cIikudmFsdWU7XG5cbiAgICAgICAgaWYocHJvZHV0byAmJiBwcm9kdXRvLmZhbWlsaWEgJiYgcHJvZHV0by5mYW1pbGlhLmNvZGlnbyl7XG4gICAgICAgICAgICByZXR1cm4gcHJvZHV0by5mYW1pbGlhLmNvZGlnbztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHByb2R1dG8gJiYgcHJvZHV0by5mYW1pbGlhKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvZHV0by5mYW1pbGlhO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXJhRmlsdHJvVHJhbnNnZW5pYSgpeyAgICAgICAgXG4gICAgICAgIGxldCBidWlsZFN0cmluZyA9IGBlbXByZXNhLmlkIGVxICcke3RoaXMuZm9ybUdyb3VwLmdldCgnZmlsaWFsJykudmFsdWUuZW1wcmVzYS5pZH0nYDtcblxuICAgICAgICBidWlsZFN0cmluZyArPSBgYW5kIHNpdHVhY2FvIGVxICcke1NpdHVhY2FvLkFUSVZPfSdgO1xuXG4gICAgICAgIGNvbnN0IGZhbWlsaWEgPSB0aGlzLmdldEZhbWlsaWFQcm9kdXRvKCk7XG4gICAgICAgIGlmIChmYW1pbGlhKSB7XG4gICAgICAgICAgICBidWlsZFN0cmluZyArPSBgIGFuZCBgO1xuICAgICAgICAgICAgYnVpbGRTdHJpbmcgKz0gYGZhbWlsaWEgZXEgJyR7ZmFtaWxpYX0nYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpcG9UcmFuc2dlbmlhID0gdGhpcy5nZXRUaXBvVHJhbnNnZW5pYSgpO1xuICAgICAgICBpZiAodGlwb1RyYW5zZ2VuaWEpIHtcbiAgICAgICAgICAgIGJ1aWxkU3RyaW5nICs9IGAgYW5kIGA7XG4gICAgICAgICAgICBidWlsZFN0cmluZyArPSBgdGlwb1BhcnRpY2lwYW50ZSBlcSAnJHt0aXBvVHJhbnNnZW5pYX0nYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBidWlsZFN0cmluZztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5vdGFGb3JtKGRhdGE6IGFueSA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgICAgIGNoYXZlTm90YUZpc2NhbDogW2RhdGEuY2hhdmVOb3RhRmlzY2FsXSxcbiAgICAgICAgICAgIHNlcmllTm90YUZpc2NhbDogW2RhdGEuc2VyaWVOb3RhRmlzY2FsXSxcbiAgICAgICAgICAgIHNlcmllTGVnYWxOb3RhRmlzY2FsOiBbZGF0YS5zZXJpZUxlZ2FsTm90YUZpc2NhbF0sXG4gICAgICAgICAgICBudW1lcm9Ob3RhRmlzY2FsOiBbZGF0YS5udW1lcm9Ob3RhRmlzY2FsXSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDb250cmF0b0Zvcm0oZGF0YTogYW55ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICAgICAgY29udHJhdG86IFtkYXRhLmNvbnRyYXRvLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgIGl0ZW5zOiB0aGlzLmZvcm1CdWlsZGVyLmFycmF5KFtdKSxcbiAgICAgICAgICAgIG5vdGFzOiB0aGlzLmZvcm1CdWlsZGVyLmFycmF5KFtdKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEl0ZW1Gb3JtKGRhdGE6IGFueSA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgICAgIGl0ZW06IFtkYXRhLml0ZW0sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgcXVhbnRpZGFkZTogW2RhdGEucXVhbnRpZGFkZV1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRGb3JuZWNlZG9yRm9ybShkYXRhOiBhbnkgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgICAgICBmb3JuZWNlZG9yOiBbZGF0YS5mb3JuZWNlZG9yLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgIG9yaWdlbU1lcmNhZG9yaWE6IFtkYXRhLm9yaWdlbU1lcmNhZG9yaWEsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXSxcbiAgICAgICAgICAgIHRpcG9Ob3RhRmlzY2FsOiBbZGF0YS50aXBvTm90YUZpc2NhbCB8fCBUaXBvTm90YUZpc2NhbC5FTVBSRVNBX0pVUklESUNBLCBWYWxpZGF0b3JzLmNvbXBvc2UoW10pXSxcbiAgICAgICAgICAgIGNvbnRyYXRvczogdGhpcy5mb3JtQnVpbGRlci5hcnJheShbXSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Rm9ybUdyb3VwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgICAgICBpZDogW3sgdmFsdWU6IHVuZGVmaW5lZCwgZGlzYWJsZWQ6IHRydWUgfSwgVmFsaWRhdG9ycy5jb21wb3NlKFtdKV0sXG4gICAgICAgICAgICBmaWxpYWw6IFt7IHZhbHVlOiB1bmRlZmluZWQsIGRpc2FibGVkOiBmYWxzZSB9LCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgIHByb2R1dG86IFt7IHZhbHVlOiB1bmRlZmluZWQsIGRpc2FibGVkOiB0cnVlIH0sIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXSxcbiAgICAgICAgICAgIGRlcml2YWNhbzogW3sgdmFsdWU6IHVuZGVmaW5lZCwgZGlzYWJsZWQ6IHRydWUgfSwgVmFsaWRhdG9ycy5jb21wb3NlKFtdKV0sXG4gICAgICAgICAgICB0cmFuc3BvcnRhZG9yYTogW3sgdmFsdWU6IHVuZGVmaW5lZCwgZGlzYWJsZWQ6IGZhbHNlIH0sIFZhbGlkYXRvcnMuY29tcG9zZShbXSldLFxuICAgICAgICAgICAgYWdlbmRhOiBbeyB2YWx1ZTogdGhpcy5hZ2VuZGEsIGRpc2FibGVkOiBmYWxzZSB9LCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKV0sXG4gICAgICAgICAgICB0cmFuc2dlbmlhOiBbeyB2YWx1ZTogdW5kZWZpbmVkLCBkaXNhYmxlZDogdHJ1ZSB9LCBWYWxpZGF0b3JzLmNvbXBvc2UoW10pXSxcbiAgICAgICAgICAgIGZvcm5lY2Vkb3JlczogdGhpcy5mb3JtQnVpbGRlci5hcnJheShbXSksXG4gICAgICAgICAgICBjcmVhdGVkQnk6IFt7IHZhbHVlOiB1bmRlZmluZWQsIGRpc2FibGVkOiB0cnVlIH0sIFZhbGlkYXRvcnMuY29tcG9zZShbXSldLFxuICAgICAgICAgICAgY3JlYXRlZERhdGU6IFt7IHZhbHVlOiB1bmRlZmluZWQsIGRpc2FibGVkOiB0cnVlIH0sIFZhbGlkYXRvcnMuY29tcG9zZShbXSldLFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkQnk6IFt7IHZhbHVlOiB1bmRlZmluZWQsIGRpc2FibGVkOiB0cnVlIH0sIFZhbGlkYXRvcnMuY29tcG9zZShbXSldLFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkRGF0ZTogW3sgdmFsdWU6IHVuZGVmaW5lZCwgZGlzYWJsZWQ6IHRydWUgfSwgVmFsaWRhdG9ycy5jb21wb3NlKFtdKV0sXG4gICAgICAgICAgICBjdXN0b206IFtdLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZvcm5lY2Vkb3JCeUNvbnRyYXRvKGNvbnRyYXRvOiBDb250cmF0b0NvbXByYUR0bywgZm9ybmVjZWRvckZvcm06IEZvcm1Hcm91cCkge1xuICAgICAgICB0aGlzLnBlc3NvYVNlcnZpY2UubGlzdCh7IHNpemU6IDEsIHBhZ2U6IDAsIGZpbHRlclF1ZXJ5OiBgaWQgZXEgJyR7Y29udHJhdG8ucGVzc29hLmlkfSdgIH0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSxcbiAgICAgICAgICAgICAgICBtYXAoKHsgY29udGVudHMgfSkgPT4gKGNvbnRlbnRzIHx8IFtdKS5sZW5ndGggJiYgY29udGVudHNbMF0pLFxuICAgICAgICAgICAgICAgIGZpbHRlcih2YWx1ZSA9PiAhIXZhbHVlKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZShwZXNzb2EgPT4ge1xuICAgICAgICAgICAgICAgIGZvcm5lY2Vkb3JGb3JtLmdldChcImZvcm5lY2Vkb3JcIikuc2V0VmFsdWUoUGVzc29hLmZyb21EdG8ocGVzc29hKSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFByb2R1dG9CeUNvbnRyYXRvKGNvbnRyYXRvOiBDb250cmF0b0NvbXByYUR0bykge1xuICAgICAgICB0aGlzLmNvbnRyYXRvQ29tcHJhU2VydmljZS5saXN0SXRlbnMoY29udHJhdG8uaWQsIHsgc2l6ZTogMSwgcGFnZTogMCwgZGlzcGxheUZpZWxkczogWydza3UuaWQnXSB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoKHsgY29udGVudHMgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudHMubGVuZ3RoID09PSAxKSByZXR1cm4gdGhpcy5wcm9kdXRvU2VydmljZS5saXN0KHsgc2l6ZTogMSwgcGFnZTogMCwgZmlsdGVyUXVlcnk6IGBpZCBlcSAnJHtjb250ZW50c1swXS5za3UuaWR9J2AgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoeyBjb250ZW50cyB9KSA9PiAoY29udGVudHMgfHwgW10pLmxlbmd0aCAmJiBjb250ZW50c1swXSksXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1wdHkoKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIodmFsdWUgPT4gISF2YWx1ZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocHJvZHV0byA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KFwicHJvZHV0b1wiKS5zZXRWYWx1ZShQcm9kdXRvLmZyb21EdG8ocHJvZHV0bykpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcInByb2R1dG9cIikuZGlzYWJsZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkNvbnRyYXRvU2F2ZWQoY29udHJhdG86IGFueSwgZm9ybmVjZWRvckZvcm06IEZvcm1Hcm91cCkge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybUdyb3VwLmdldChcInByb2R1dG9cIikudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0UHJvZHV0b0J5Q29udHJhdG8oY29udHJhdG8uY29udHJhdG8pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmb3JuZWNlZG9yRm9ybS5nZXQoXCJmb3JuZWNlZG9yXCIpLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmdldEZvcm5lY2Vkb3JCeUNvbnRyYXRvKGNvbnRyYXRvLmNvbnRyYXRvLCBmb3JuZWNlZG9yRm9ybSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250cmF0b0Zvcm0gPSB0aGlzLmdldENvbnRyYXRvRm9ybShjb250cmF0byk7XG4gICAgICAgIChjb250cmF0by5pdGVucyB8fCBbXSkuZm9yRWFjaCgoaXRlbTogYW55KSA9PiAoY29udHJhdG9Gb3JtLmdldChcIml0ZW5zXCIpIGFzIEZvcm1BcnJheSkucHVzaCh0aGlzLmdldEl0ZW1Gb3JtKGl0ZW0pKSk7XG5cbiAgICAgICAgdGhpcy5nZXRDb250cmF0b3MoZm9ybmVjZWRvckZvcm0pLnB1c2goY29udHJhdG9Gb3JtKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1lbnNhZ2VtQ29udHJhdG9OYW9TZWxlY2lvbmFkbygpIHtcbiAgICAgICAgdGhpcy5hZGRNZXNzYWdlKFwiZXJyb3JcIiwgXCJDb250cmF0byBuw6NvIHNlbGVjaW9uYWRvXCIsIFwiTmVuaHVtIGNvbnRyYXRvIGZvaSBzZWxlY2lvbmFkbyFcIik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbk5vdGFTYXZlZCh2YWx1ZTogYW55LCBmb3JuZWNlZG9yRm9ybTogRm9ybUdyb3VwKSB7XG5cbiAgICAgICAgaWYgKHRoaXMuY29udHJhdG9TZWxlY2lvbmFkbyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5tZW5zYWdlbUNvbnRyYXRvTmFvU2VsZWNpb25hZG8oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdmFsdWUuYWRkRm9ybmVjZWRvcikge1xuICAgICAgICAgICAgY29uc3Qgbm90YXNGb3JtID0gdGhpcy5nZXROb3Rhc0Zyb21Db250cmF0b3MoZm9ybmVjZWRvckZvcm0sIHRoaXMuY29udHJhdG9TZWxlY2lvbmFkby5pZCk7XG4gICAgICAgICAgICBpZiAobm90YXNGb3JtICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbm90YXNGb3JtLnB1c2godGhpcy5nZXROb3RhRm9ybSh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhpc3RzRm9ybmVjZWRvciA9ICh0aGlzLmZvcm1Hcm91cC5nZXQoXCJmb3JuZWNlZG9yZXNcIikgYXMgRm9ybUFycmF5KS5jb250cm9scy5maW5kKChmb3JtKSA9PiAoZm9ybS52YWx1ZS5mb3JuZWNlZG9yIHx8IHsgaWQ6IHVuZGVmaW5lZCB9KS5pZCA9PT0gdmFsdWUuZm9ybmVjZWRvci5pZCk7XG4gICAgICAgIGNvbnN0IHsgaW5mb05vdGEgfSA9IHZhbHVlO1xuICAgICAgICBjb25zdCBub3RhRm9ybSA9IHRoaXMuZ2V0Tm90YUZvcm0oeyBcbiAgICAgICAgICAgIGNoYXZlTm90YUZpc2NhbDogaW5mb05vdGEuY2hhdmUsXG4gICAgICAgICAgICBzZXJpZU5vdGFGaXNjYWw6IGluZm9Ob3RhLnNlcmllLFxuICAgICAgICAgICAgc2VyaWVMZWdhbE5vdGFGaXNjYWw6IGluZm9Ob3RhLnNlcmllTGVnYWwsXG4gICAgICAgICAgICBudW1lcm9Ob3RhRmlzY2FsOiBpbmZvTm90YS5udW1lcm8sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghIWV4aXN0c0Zvcm5lY2Vkb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vdGFzRm9ybSA9IHRoaXMuZ2V0Tm90YXNGcm9tQ29udHJhdG9zKGV4aXN0c0Zvcm5lY2Vkb3IsIHRoaXMuY29udHJhdG9TZWxlY2lvbmFkby5pZCk7XG4gICAgICAgICAgICBub3Rhc0Zvcm0ucHVzaChub3RhRm9ybSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWZvcm5lY2Vkb3JGb3JtLmdldChcImZvcm5lY2Vkb3JcIikudmFsdWUpIHtcbiAgICAgICAgICAgIGZvcm5lY2Vkb3JGb3JtLmdldChcImZvcm5lY2Vkb3JcIikuc2V0VmFsdWUoUGVzc29hLmZyb21EdG8odmFsdWUuZm9ybmVjZWRvcikpO1xuICAgICAgICAgICAgZm9ybmVjZWRvckZvcm0uZ2V0KFwib3JpZ2VtTWVyY2Fkb3JpYVwiKS5zZXRWYWx1ZShQZXNzb2FFbmRlcmVjby5mcm9tRHRvKHZhbHVlLm9yaWdlbU1lcmNhZG9yaWEpKTtcbiAgICAgICAgICAgIGNvbnN0IG5vdGFzRm9ybSA9IHRoaXMuZ2V0Tm90YXNGcm9tQ29udHJhdG9zKGZvcm5lY2Vkb3JGb3JtLCB0aGlzLmNvbnRyYXRvU2VsZWNpb25hZG8uaWQpO1xuICAgICAgICAgICAgbm90YXNGb3JtLnB1c2gobm90YUZvcm0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZm9ybmVjZWRvciA9IHRoaXMuYWRkRm9ybmVjZWRvcih7IGZvcm5lY2Vkb3I6IFBlc3NvYS5mcm9tRHRvKHZhbHVlLmZvcm5lY2Vkb3IpLCBvcmlnZW1NZXJjYWRvcmlhOiBQZXNzb2FFbmRlcmVjby5mcm9tRHRvKHZhbHVlLm9yaWdlbU1lcmNhZG9yaWEpIH0pO1xuICAgICAgICAgICAgY29uc3Qgbm90YXNGb3JtID0gdGhpcy5nZXROb3Rhc0Zyb21Db250cmF0b3MoZm9ybmVjZWRvciwgdGhpcy5jb250cmF0b1NlbGVjaW9uYWRvLmlkKTtcbiAgICAgICAgICAgIG5vdGFzRm9ybS5wdXNoKG5vdGFGb3JtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXROb3Rhc0Zyb21Db250cmF0b3MoZm9ybmVjZWRvckZvcm06IEFic3RyYWN0Q29udHJvbCwgY29udHJhdG9JZDogYW55KSB7XG4gICAgICAgIGxldCBjb250cmF0b3NGb3JtU2VsZWNpb25hZG8gPSBudWxsO1xuICAgICAgICBjb25zdCBjb250cmF0b3NGb3JtID0gZm9ybmVjZWRvckZvcm1bXCJjb250cm9sc1wiXVtcImNvbnRyYXRvc1wiXVtcImNvbnRyb2xzXCJdO1xuXG4gICAgICAgIGZvciAobGV0IGNvbnRyYXRvRm9ybSBvZiBjb250cmF0b3NGb3JtKSB7XG4gICAgICAgICAgICBpZiAoY29udHJhdG9Gb3JtW1wiY29udHJvbHNcIl1bXCJjb250cmF0b1wiXVtcInZhbHVlXCJdLmlkID09PSBjb250cmF0b0lkKSB7XG4gICAgICAgICAgICAgICAgY29udHJhdG9zRm9ybVNlbGVjaW9uYWRvID0gY29udHJhdG9Gb3JtW1wiY29udHJvbHNcIl1bXCJub3Rhc1wiXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udHJhdG9zRm9ybVNlbGVjaW9uYWRvIGFzIEZvcm1BcnJheTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRm9ybmVjZWRvck5vdGFzVG9rZW5FbUNvbnRyYXRvKGZvcm5lY2Vkb3JGb3JtOiBGb3JtR3JvdXAsIHRva2VuOiBJVG9rZW4pIHtcbiAgICAgICAgaWYgKHRoaXMuY29udHJhdG9TZWxlY2lvbmFkbyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5tZW5zYWdlbUNvbnRyYXRvTmFvU2VsZWNpb25hZG8oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vdGFzID0gdGhpcy5mb3JuZWNlZG9yTm90YXMuZmlsdGVyKGZvcm5lY2Vkb3JOb3RhID0+IGZvcm5lY2Vkb3JOb3RhLmNoYXZlTm90YUZpc2NhbCA9PT0gdG9rZW4uaWQpO1xuICAgICAgICBjb25zdCBub3Rhc0Zvcm0gPSB0aGlzLmdldE5vdGFzRnJvbUNvbnRyYXRvcyhmb3JuZWNlZG9yRm9ybSwgdGhpcy5jb250cmF0b1NlbGVjaW9uYWRvLmlkKTtcbiAgICAgICAgaWYgKG5vdGFzRm9ybSAhPT0gbnVsbCAmJiBub3Rhc1swXSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbm90YXNGb3JtLnB1c2godGhpcy5nZXROb3RhRm9ybShub3Rhc1swXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW1vdmVGb3JuZWNlZG9yTm90YXNUb2tlbkRvQ29udHJhdG8odG9rZW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVGb3JuZWNlZG9yTm90YXNUb2tlbkRvQ29udHJhdG8odG9rZW46IElUb2tlbikge1xuICAgICAgICB0aGlzLmZvcm5lY2Vkb3JOb3Rhc1Rva2Vucy5zcGxpY2UodGhpcy5mb3JuZWNlZG9yTm90YXNUb2tlbnMuaW5kZXhPZih0b2tlbiksIDEpO1xuICAgICAgICB0aGlzLmZvcm5lY2Vkb3JOb3RhcyA9IHRoaXMuZm9ybmVjZWRvck5vdGFzLmZpbHRlcihmb3JuZWNlZG9yTm90YSA9PiBmb3JuZWNlZG9yTm90YS5jaGF2ZU5vdGFGaXNjYWwgIT09IHRva2VuLmlkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZU5vdGFFcnJvcigpIHtcbiAgICAgICAgdGhpcy5lcnJvRm9ybmVjZWRvcmVzTm90YUR1cGxpY2FkYSA9IG51bGw7XG4gICAgICAgIHRoaXMuZXJyb0NoYXZlTm90YSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkTm90YUVycm9yKCkge1xuICAgICAgICB0aGlzLmVycm9DaGF2ZU5vdGEgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRhdGVQcm9kdXRvKHByb2R1dG86IFByb2R1dG8pIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gdGhpcy5mb3JtR3JvdXAuZ2V0KFwicHJvZHV0b1wiKTtcbiAgICAgICAgaWYgKHZhbHVlLmlkICE9PSBwcm9kdXRvLmlkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRGaWxpYWxTZWFyY2hGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImNvZGlnb1wiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5maWxpYWxfY29kaWdvXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5JbnRlZ2VyXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwibm9tZVwiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5maWxpYWxfbm9tZVwiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZvcm5lY2Vkb3JTZWFyY2hGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImNvZGlnb1wiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5wZXNzb2FfY29kaWdvXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5JbnRlZ2VyLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIm5vbWVcIixcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAucGVzc29hX25vbWVcIiksXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJjcGZDbnBqXCIsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnBlc3NvYV9jcGZDbnBqXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZvcm5lY2Vkb3JTZWFyY2hHcmlkRmllbGRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGb3JuZWNlZG9yU2VhcmNoRmllbGRzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRPcmlnZW1NZXJjYWRvcmlhRmllbGRzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgdGhpcy5idWlsZEZvcm1GaWVsZC5idWlsZEZvckludGVnZXIoXCJjb2RpZ29cIiwgXCJ5bXMuZXJwLnBlc3NvYV9lbmRlcmVjb19jb2RpZ29cIiksXG4gICAgICAgICAgICB0aGlzLmJ1aWxkRm9ybUZpZWxkLmJ1aWxkRm9yU3RyaW5nKFwiY25wakNwZlwiLCBcInltcy5lcnAucGVzc29hX2VuZGVyZWNvX2NucGpfY3BmXCIpLFxuICAgICAgICAgICAgdGhpcy5idWlsZEZvcm1GaWVsZC5idWlsZEZvclN0cmluZyhcImluc2NyaWNhb0VzdGFkdWFsXCIsIFwieW1zLmVycC5wZXNzb2FfZW5kZXJlY29faW5zY3JpY2FvX2VzdGFkdWFsXCIpLFxuICAgICAgICAgICAgdGhpcy5idWlsZEZvcm1GaWVsZC5idWlsZEZvclN0cmluZyhcImNlcFwiLCBcInltcy5lcnAucGVzc29hX2VuZGVyZWNvX2NlcFwiKSxcbiAgICAgICAgICAgIHRoaXMuYnVpbGRGb3JtRmllbGQuYnVpbGRGb3JTdHJpbmcoXCJlbmRlcmVjb1wiLCBcInltcy5lcnAucGVzc29hX2VuZGVyZWNvX2VuZGVyZWNvXCIpLFxuICAgICAgICAgICAgdGhpcy5idWlsZEZvcm1GaWVsZC5idWlsZEZvclN0cmluZyhcIm51bWVyb1wiLCBcInltcy5lcnAucGVzc29hX2VuZGVyZWNvX251bWVyb1wiKSxcbiAgICAgICAgICAgIHRoaXMuYnVpbGRGb3JtRmllbGQuYnVpbGRGb3JTdHJpbmcoXCJiYWlycm9cIiwgXCJ5bXMuZXJwLnBlc3NvYV9lbmRlcmVjb19iYWlycm9cIiksXG4gICAgICAgIF07XG4gICAgfVxuICBcbiAgICBwcml2YXRlIGdldE9yaWdlbU1lcmNhZG9yaWFHcmlkRmllbGRzKCkge1xuICAgICAgICBjb25zdCBvcmlnZW1NZXJjYWRvcmlhRmllbGRzID0gdGhpcy5nZXRPcmlnZW1NZXJjYWRvcmlhRmllbGRzKCk7XG4gICAgICAgIG9yaWdlbU1lcmNhZG9yaWFGaWVsZHMucHVzaCggdGhpcy5idWlsZEZvcm1GaWVsZC5idWlsZEZvclN0cmluZyhcImVtcHJlc2EuZGVzY3JpY2FvXCIsIFwieW1zLmVycC5lbXByZXNhXCIpICk7XG4gICAgICAgIHJldHVybiBvcmlnZW1NZXJjYWRvcmlhRmllbGRzO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJvZHV0b1NlYXJjaEZpZWxkcygpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiY29kaWdvXCIsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnByb2R1dG9fY29kaWdvXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiZGVzY3JpY2FvXCIsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnByb2R1dG9fZGVzY3JpY2FvXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcsXG4gICAgICAgICAgICB9KVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJvZHV0b1NlYXJjaEdyaWRGaWVsZHMoKSB7XG4gICAgICAgIGNvbnN0IHByb2R1dG9TZWFyY2hGaWVsZHMgPSB0aGlzLmdldFByb2R1dG9TZWFyY2hGaWVsZHMoKTtcbiAgICAgICAgIHByb2R1dG9TZWFyY2hGaWVsZHMucHVzaChcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiZGVzY3JpY2FvQ29tcGxlbWVudGFyXCIsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnByb2R1dG9fZGVzY3JpY2FvX2NvbXBsZW1lbnRhclwiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHByb2R1dG9TZWFyY2hGaWVsZHM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRBZ2VuZGFTZWFyY2hGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImRlc2NyaWNhb1wiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5hZ2VuZGFfZGVzY3JpY2FvXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEFnZW5kYVNlYXJjaEdyaWRGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImRlc2NyaWNhb1wiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5hZ2VuZGFfZGVzY3JpY2FvXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERlcml2YWNhb1NlYXJjaEZpZWxkcygpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiY29kaWdvXCIsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLmRlcml2YWNhb19jb2RpZ29cIiksXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJkZXNjcmljYW9cIixcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAuZGVyaXZhY2FvX2Rlc2NyaWNhb1wiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREZXJpdmFjYW9TZWFyY2hHcmlkRmllbGRzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJjb2RpZ29cIixcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAuZGVyaXZhY2FvX2NvZGlnb1wiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImRlc2NyaWNhb1wiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5kZXJpdmFjYW9fZGVzY3JpY2FvXCIpLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFRyYW5zcG9ydGFkb3JhU2VhcmNoRmllbGRzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJjb2RpZ29cIixcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuSW50ZWdlcixcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAudHJhbnNwb3J0YWRvcmFfY29kaWdvXCIpXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwicGVzc29hLm5vbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC50cmFuc3BvcnRhZG9yYV9kZXNjcmljYW9cIilcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJwZXNzb2EuY3BmQ25walwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnRyYW5zcG9ydGFkb3JhX2NucGpcIilcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRUcmFuc3BvcnRhZG9yYVNlYXJjaEdyaWRGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImNvZGlnb1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5JbnRlZ2VyLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC50cmFuc3BvcnRhZG9yYV9jb2RpZ29cIilcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJwZXNzb2Eubm9tZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5JbnRlZ2VyLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwieW1zLmVycC5wZXNzb2Ffbm9tZVwiKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcInBlc3NvYS5jcGZDbnBqXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAudHJhbnNwb3J0YWRvcmFfY25walwiKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFRyYW5zZ2VuaWFTZWFyY2hGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImNvZGlnb1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnRyYW5zZ2VuaWFfY29kaWdvXCIpXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiZGVzY3JpY2FvXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAudHJhbnNnZW5pYV9kZXNjcmljYW9cIilcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VHJhbnNnZW5pYVNlYXJjaEdyaWRGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImNvZGlnb1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ5bXMuZXJwLnRyYW5zZ2VuaWFfY29kaWdvXCIpXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiZGVzY3JpY2FvXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcInltcy5lcnAudHJhbnNnZW5pYV9kZXNjcmljYW9cIilcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ29CYWNrKCkge1xuICAgICAgICBjb25zdCBwcmV2aW91c1JvdXRlID0gXCIuLi9cIjtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3ByZXZpb3VzUm91dGVdLCB7IHJlbGF0aXZlVG86IHRoaXMucm91dGUucGFyZW50IH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRhdGVBbGxGb3JtRmllbGRzKGZvcm1Hcm91cDogRm9ybUdyb3VwKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGZvcm1Hcm91cC5jb250cm9scykuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmdldChmaWVsZCk7XG4gICAgICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sKSBjb250cm9sLm1hcmtBc0RpcnR5KHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgICAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB0aGlzLnZhbGlkYXRlQWxsRm9ybUZpZWxkcyhjb250cm9sKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIGNvbnRyb2wuY29udHJvbHMuZm9yRWFjaChmb3JtID0+IHRoaXMudmFsaWRhdGVBbGxGb3JtRmllbGRzKGZvcm0gYXMgRm9ybUdyb3VwKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZm9jdXNTZXJ2aWNlLmZvY3VzRmlyc3RJbnZhbGlkSW5wdXQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNhdmVPYnNlcnZhYmxlKCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XG4gICAgICAgIHZhbHVlLmFnZW5kYSA9IHRoaXMuYWdlbmRhO1xuICAgICAgICBjb25zdCByZWNlYmltZW50b0R0byA9IFJlY2ViaW1lbnRvQ29udHJhdG8udG9EdG8odmFsdWUpO1xuXG4gICAgICAgIGxldCBmb3JuZWNlZG9yZXM6IGFueVtdID0gcmVjZWJpbWVudG9EdG8uZm9ybmVjZWRvcmVzO1xuICAgICAgICByZWNlYmltZW50b0R0by5mb3JuZWNlZG9yZXMuZm9yRWFjaChhbnRlcmlvciA9PiB7XG4gICAgICAgICAgICByZWNlYmltZW50b0R0by5mb3JuZWNlZG9yZXMuZm9yRWFjaChwb3N0ZXJpb3IgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhbnRlcmlvci5mb3JuZWNlZG9yLmlkID09PSBwb3N0ZXJpb3IuZm9ybmVjZWRvci5pZCAmJlxuICAgICAgICAgICAgICAgICAgICBhbnRlcmlvci5vcmlnZW1NZXJjYWRvcmlhLmlkID09PSBwb3N0ZXJpb3Iub3JpZ2VtTWVyY2Fkb3JpYS5pZCkge1xuICAgICAgICAgICAgICAgICAgICBwb3N0ZXJpb3IuY29udHJhdG9zLmZvckVhY2goKGNvbnRyYXRvOiBhbnkpID0+IGFudGVyaW9yLmNvbnRyYXRvcy5wdXNoKGNvbnRyYXRvKSk7XG4gICAgICAgICAgICAgICAgICAgIGZvcm5lY2Vkb3JlcyA9IGZvcm5lY2Vkb3Jlcy5zcGxpY2UoZm9ybmVjZWRvcmVzLmluZGV4T2YocG9zdGVyaW9yKSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZWNlYmltZW50b0R0by5mb3JuZWNlZG9yZXMgPSBmb3JuZWNlZG9yZXM7XG5cbiAgICAgICAgbGV0IG9ic2VydmFibGU6IGFueTtcblxuICAgICAgICBpZiAodGhpcy5pc05ldygpICYmICF2YWx1ZS5pZCkge1xuICAgICAgICAgICAgb2JzZXJ2YWJsZSA9IHRoaXMucmVjZWJpbWVudG9TZXJ2aWNlLmluc2VydChyZWNlYmltZW50b0R0byk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHZhbHVlLmlkO1xuICAgICAgICAgICAgb2JzZXJ2YWJsZSA9IHRoaXMucmVjZWJpbWVudG9TZXJ2aWNlLnVwZGF0ZShpZCwgcmVjZWJpbWVudG9EdG8pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9ic2VydmFibGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREZWxldGVPYnNlcnZhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWNlYmltZW50b1NlcnZpY2UuZGVsZXRlKCcnKS5waXBlKFxuICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZE1lc3NhZ2UoXCJzdWNjZXNzXCIsIFwieW1zLmVycC5kZWxldGVkX21lc3NhZ2VfdGl0bGVcIiwgXCJ5bXMuZXJwLmRlbGV0ZWRfbWVzc2FnZV9jb250ZW50XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ29CYWNrKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRhdGVWaXN1YWxpemF0aW9uKCkge1xuICAgICAgICBpZiAoIXVzZXJDYW5WaXN1YWxpemUodGhpcy5mb3JtR3JvdXAsIHRoaXMuYWxsUGVybWlzc2lvbnMpKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE1lc3NhZ2UoXCJlcnJvclwiLCBcInltcy5lcnAuY2Fubm90X3Zpc3VhbGl6ZV9mb3JtX3N1bW1hcnlcIiwgXCJ5bXMuZXJwLmNhbm5vdF92aXN1YWxpemVfZm9ybV9kZXRhaWxcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZE1lc3NhZ2Uoc2V2ZXJpdHk6IHN0cmluZywgc3VtbWFyeTogc3RyaW5nLCBkZXRhaWw6IHN0cmluZykge1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICBzZXZlcml0eSxcbiAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoc3VtbWFyeSksXG4gICAgICAgICAgICBkZXRhaWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoZGV0YWlsKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWFkb25seSBvbkZpbGlhbFZhbHVlQ2hhbmdlID0gKGZpbGlhbDogRmlsaWFsKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzYWJsZU9yZGVyc0J1dHRvbnMgPSAhZmlsaWFsO1xuICAgICAgICBpZiAoIWZpbGlhbCAmJiB0aGlzLmlzTmV3KCkpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcInByb2R1dG9cIikuc2V0VmFsdWUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcInByb2R1dG9cIikuZGlzYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KFwidHJhbnNnZW5pYVwiKS5zZXRWYWx1ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KFwidHJhbnNnZW5pYVwiKS5kaXNhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmNhcnJlZ2FuZG9FcnBGaWxpYWwgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcInByb2R1dG9cIikuZW5hYmxlKCk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcInRyYW5zZ2VuaWFcIikuZW5hYmxlKCk7XG4gICAgICAgIHRoaXMuY2FycmVnYW5kb0VycEZpbGlhbCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYnVzY2FyRmlsaWFsKCkge1xuICAgICAgICBjb25zdCBwbGFudGEgPSB0aGlzLmFnZW5kYS5wbGFudGEgfHwgeyBjbnBqOiBbXSB9O1xuICAgICAgICBpZiAocGxhbnRhLmNucGoubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1DYXJyZWdhZG8gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maWxpYWxTZXJ2aWNlXG4gICAgICAgICAgICAubGlzdCh7XG4gICAgICAgICAgICAgICAgcGFnZTogMCxcbiAgICAgICAgICAgICAgICBzaXplOiAxLFxuICAgICAgICAgICAgICAgIGZpbHRlclF1ZXJ5OiBgcGVzc29hLmNwZkNucGogZXEgJyR7cGxhbnRhLmNucGpbMF19J2AsXG4gICAgICAgICAgICAgICAgZGlzcGxheUZpZWxkczogWycqJywgJ2VtcHJlc2Eubm9tZSddXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh7IGNvbnRlbnRzIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcImZpbGlhbFwiKS5zZXRWYWx1ZShGaWxpYWwuZnJvbUR0byhjb250ZW50c1swXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1DYXJyZWdhZG8gPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25maWd1cmVGb3JuZWNlZG9yKGZvcm5lY2Vkb3JGb3JtOiBGb3JtR3JvdXApIHtcbiAgICAgICAgZm9ybmVjZWRvckZvcm0uZ2V0KFwiZm9ybmVjZWRvclwiKVxuICAgICAgICAgICAgLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDUwMCksXG4gICAgICAgICAgICAgICAgdGFwKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5laFBlc3NvYUp1cmlkaWNhKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm5lY2Vkb3JGb3JtLmdldChcInRpcG9Ob3RhRmlzY2FsXCIpLnNldFZhbHVlKFRpcG9Ob3RhRmlzY2FsLkVNUFJFU0FfSlVSSURJQ0EpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm5lY2Vkb3JGb3JtLmdldChcInRpcG9Ob3RhRmlzY2FsXCIpLmVuYWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybmVjZWRvckZvcm0uZ2V0KFwidGlwb05vdGFGaXNjYWxcIikuc2V0VmFsdWUoVGlwb05vdGFGaXNjYWwuUFJPRFVUT1JfUlVSQUwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm5lY2Vkb3JGb3JtLmdldChcInRpcG9Ob3RhRmlzY2FsXCIpLmRpc2FibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9ybmVjZWRvckZvcm0uZ2V0KFwidGlwb05vdGFGaXNjYWxcIikuc2V0VmFsdWUoVGlwb05vdGFGaXNjYWwuRU1QUkVTQV9KVVJJRElDQSk7XG4gICAgICAgICAgICAgICAgICAgIGZvcm5lY2Vkb3JGb3JtLmdldChcInRpcG9Ob3RhRmlzY2FsXCIpLmRpc2FibGUoKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcInRyYW5zZ2VuaWFcIikuc2V0VmFsdWUobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5nZXQoXCJ0cmFuc2dlbmlhXCIpLmRpc2FibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBtZXJnZU1hcCh2YWx1ZSA9PiB0aGlzLnBlc3NvYUVuZGVyZWNvU2VydmljZS5saXN0KHsgc2l6ZTogMTAsIHBhZ2U6IDAsIGZpbHRlclF1ZXJ5OiBgc2l0dWFjYW8gZXEgJ0FUSVZPJyBhbmQgcGVzc29hLmlkIGVxICcke3ZhbHVlLmlkfSdgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHsgY29udGVudHMgfSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChcInRyYW5zZ2VuaWFcIikuZW5hYmxlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29udGVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm5lY2Vkb3JGb3JtLmdldChcIm9yaWdlbU1lcmNhZG9yaWFcIikuc2V0VmFsdWUoUGVzc29hRW5kZXJlY28uZnJvbUR0byhjb250ZW50c1swXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybmVjZWRvckZvcm0uZ2V0KFwib3JpZ2VtTWVyY2Fkb3JpYVwiKS5zZXRWYWx1ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICBmb3JuZWNlZG9yRm9ybS5nZXQoXCJvcmlnZW1NZXJjYWRvcmlhXCIpLmVuYWJsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZWhQZXNzb2FKdXJpZGljYShwZXNzb2E6IFBlc3NvYSkge1xuICAgICAgICBjb25zdCBjcGZDbnBqID0gKHBlc3NvYS5jcGZDbnBqIHx8IFwiXCIpLnJlcGxhY2UoL1xcRCsvZywgXCJcIik7XG4gICAgICAgIHJldHVybiBjcGZDbnBqLmxlbmd0aCA+IDExO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWVuc2FnZW1CdXNjYW5kb05vdGEoKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgIHNldmVyaXR5OiAnaW5mbycsXG4gICAgICAgICAgICBzdW1tYXJ5OiAnQnVzY2FuZG8gZGFkb3MgZGEgbm90YScsXG4gICAgICAgICAgICBkZXRhaWw6ICdBZ3VhcmRlLCBidXNjYW5kbyBkYWRvcyBkYSBub3RhJyxcbiAgICAgICAgICAgIGxpZmU6IDUwMDBcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2YWxpZGFyQ25wakZvcm5lY2Vkb3IodmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMuZWhQZXNzb2FKdXJpZGljYSh7IGNwZkNucGo6IHZhbHVlIH0gYXMgUGVzc29hKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBmb3JuZWNlZG9yID0gKHRoaXMuZm9ybUdyb3VwLmdldChcImZvcm5lY2Vkb3Jlc1wiKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzLmZpbmQoKGZvcm0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoKGZvcm0udmFsdWUuZm9ybmVjZWRvciB8fCB7IGNwZkNucGo6ICcnIH0pLmNwZkNucGogYXMgc3RyaW5nKS5zdWJzdHJpbmcoMCwgOCkgPT09IHZhbHVlLnN1YnN0cmluZygwLCA4KVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZvcm5lY2Vkb3I7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyYXRvSXRlbSB7XG4gICAgaXRlbTogQ29udHJhdG9Db21wcmFJdGVtO1xuICAgIHF1YW50aWRhZGU6IG51bWJlcjtcbn1cbiJdfQ==