@senior-gestao-empresarial/erpx-components 0.0.0-develop-3bab051d

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 (382) hide show
  1. package/bundles/senior-gestao-empresarial-erpx-components.umd.js +37665 -0
  2. package/bundles/senior-gestao-empresarial-erpx-components.umd.js.map +1 -0
  3. package/bundles/senior-gestao-empresarial-erpx-components.umd.min.js +17 -0
  4. package/bundles/senior-gestao-empresarial-erpx-components.umd.min.js.map +1 -0
  5. package/components/breadcrumb/breadcrumb.component.d.ts +21 -0
  6. package/components/breadcrumb/breadcrumb.module.d.ts +2 -0
  7. package/components/breadcrumb/index.d.ts +2 -0
  8. package/components/focus/focus.service.d.ts +4 -0
  9. package/components/lote-serie/erp-lote-serie.component.d.ts +183 -0
  10. package/components/lote-serie/erp-lote-serie.module.d.ts +2 -0
  11. package/components/lote-serie/erp-lote-serie.service.d.ts +137 -0
  12. package/components/lote-serie/index.d.ts +2 -0
  13. package/components/rateio-editor/erp-rateio-editor.component.d.ts +202 -0
  14. package/components/rateio-editor/erp-rateio-editor.converter.d.ts +18 -0
  15. package/components/rateio-editor/erp-rateio-editor.module.d.ts +2 -0
  16. package/components/rateio-editor/erp-rateio-editor.service.d.ts +17 -0
  17. package/components/rateio-editor/erp-rateio-editor.types.d.ts +171 -0
  18. package/components/rateio-editor/index.d.ts +4 -0
  19. package/components/resumo/erp-resumo.component.d.ts +17 -0
  20. package/components/resumo/erp-resumo.module.d.ts +2 -0
  21. package/components/resumo/erp-resumo.service.d.ts +2 -0
  22. package/components/resumo/index.d.ts +2 -0
  23. package/components/tributos/calculators/effective-tax-rate-calculator.d.ts +34 -0
  24. package/components/tributos/calculators/gross-amount-calculator.d.ts +20 -0
  25. package/components/tributos/calculators/tax-amount-calculator.d.ts +54 -0
  26. package/components/tributos/erp-tributos.component.d.ts +215 -0
  27. package/components/tributos/erp-tributos.module.d.ts +2 -0
  28. package/components/tributos/erp-tributos.service.d.ts +10 -0
  29. package/components/tributos/erp-tributos.types.d.ts +286 -0
  30. package/components/tributos/index.d.ts +12 -0
  31. package/components/tributos/mappings/enum-tip-imp-cst-mapping.d.ts +2 -0
  32. package/components/tributos/rules/calculation/registries/calculation-rules-registries/calculation-rules.registry.d.ts +15 -0
  33. package/components/tributos/rules/calculation/registries/calculation-rules-registries/incoming-invoice-calculation-rules.registry.d.ts +28 -0
  34. package/components/tributos/rules/calculation/registries/calculation-rules-registries/outgoing-invoice-calculation-rules.registry.d.ts +30 -0
  35. package/components/tributos/rules/calculation/registries/calculation-rules-registries/purchase-order-calculation-rules.registry.d.ts +22 -0
  36. package/components/tributos/rules/calculation/registries/calculation-rules-registries/sale-order-calculation-rules.registry.d.ts +22 -0
  37. package/components/tributos/rules/calculation/rules/apply-net-value-to-document-calculation-rule.d.ts +5 -0
  38. package/components/tributos/rules/calculation/rules/assessment-period-calculation-rule.d.ts +5 -0
  39. package/components/tributos/rules/calculation/rules/effective-tax-rate-calculation-rule.d.ts +8 -0
  40. package/components/tributos/rules/calculation/rules/gross-amount-calculation-rule.d.ts +8 -0
  41. package/components/tributos/rules/calculation/rules/manual-tax-calculation-rule.d.ts +5 -0
  42. package/components/tributos/rules/calculation/rules/tax-amount-calculation-rule.d.ts +8 -0
  43. package/components/tributos/rules/calculation/rules/tax-calculation-type-calculation-rule.d.ts +5 -0
  44. package/components/tributos/rules/calculation/rules/tax-classification-calculation-rule.d.ts +6 -0
  45. package/components/tributos/rules/calculation/rules/tax-rate-calculation-rule.d.ts +5 -0
  46. package/components/tributos/rules/calculation/rules/tax-situation-calculation-rule.d.ts +5 -0
  47. package/components/tributos/rules/calculation/rules/taxable-base-calculation-rule.d.ts +8 -0
  48. package/components/tributos/rules/rules.service.d.ts +19 -0
  49. package/components/tributos/rules/status/registries/incoming-invoice-status-rules.registry.d.ts +16 -0
  50. package/components/tributos/rules/status/registries/outgoing-invoice-status-rules.registry.d.ts +12 -0
  51. package/components/tributos/rules/status/registries/purchase-order-status-rules.registry.d.ts +12 -0
  52. package/components/tributos/rules/status/registries/sale-order-status-rules.registry.d.ts +8 -0
  53. package/components/tributos/rules/status/registries/status-rules.registry.d.ts +15 -0
  54. package/components/tributos/rules/status/rules/apply-net-value-to-document-status-rule.d.ts +5 -0
  55. package/components/tributos/rules/status/rules/tax-classification-status-rule.d.ts +5 -0
  56. package/components/tributos/rules/status/rules/tax-rate-status-rule.d.ts +5 -0
  57. package/components/tributos/rules/status/rules/taxable-base-status-rule.d.ts +5 -0
  58. package/components/tributos/rules/types/available-fields.d.ts +2 -0
  59. package/components/tributos/rules/types/available-taxes.d.ts +1 -0
  60. package/components/tributos/rules/types/field-calculation-rule-mapping.d.ts +6 -0
  61. package/components/tributos/rules/types/field-rule-mapping.d.ts +6 -0
  62. package/components/tributos/rules/types/field-status-rule-mapping.d.ts +6 -0
  63. package/components/tributos/rules/types/rule-payload.d.ts +9 -0
  64. package/components/tributos/rules/types/schemas/incoming-invoice.schema.d.ts +235 -0
  65. package/components/tributos/rules/types/schemas/outgoing-invoice.schema.d.ts +349 -0
  66. package/components/tributos/rules/types/schemas/purchase-order.schema.d.ts +26 -0
  67. package/components/tributos/rules/types/schemas/sale-order.schema.d.ts +131 -0
  68. package/components/tributos/rules/types/strategies-by-document.d.ts +12 -0
  69. package/components/tributos/rules/types/strategies.d.ts +4 -0
  70. package/components/tributos/rules/types/tax-rule.d.ts +4 -0
  71. package/components/tributos/rules/validation/registries/incoming-invoice-validation-rules.registry.d.ts +20 -0
  72. package/components/tributos/rules/validation/registries/outgoing-invoice-validation-rules.registry.d.ts +22 -0
  73. package/components/tributos/rules/validation/registries/purchase-order-validation-rules.registry.d.ts +14 -0
  74. package/components/tributos/rules/validation/registries/sale-order-validation-rules.registry.d.ts +14 -0
  75. package/components/tributos/rules/validation/registries/validation-rules.registry.d.ts +15 -0
  76. package/components/tributos/rules/validation/rules/required/apply-net-value-to-document-required-validation-rule.d.ts +5 -0
  77. package/components/tributos/rules/validation/rules/required/assessment-period-required-validation-rule.d.ts +5 -0
  78. package/components/tributos/rules/validation/rules/required/tax-amount-required-validation-rule.d.ts +5 -0
  79. package/components/tributos/rules/validation/rules/required/tax-classification-required-validation-rule.d.ts +5 -0
  80. package/components/tributos/rules/validation/rules/required/tax-rate-required-validation-rule.d.ts +6 -0
  81. package/components/tributos/rules/validation/rules/required/tax-situation-required-validation-rule.d.ts +6 -0
  82. package/components/tributos/rules/validation/rules/required/taxable-base-required-validation-rule.d.ts +6 -0
  83. package/components/tributos/services/tax-rounding.service.d.ts +5 -0
  84. package/components/tributos/stores/tax.store.d.ts +10 -0
  85. package/components/tributos/tax-reform-utilities.d.ts +36 -0
  86. package/components/tributos/types/context.d.ts +7 -0
  87. package/components/tributos/types/controllership-incoming-invoice-context.d.ts +5 -0
  88. package/components/tributos/types/controllership-incoming-invoice.d.ts +3 -0
  89. package/components/tributos/types/controllership-outgoing-invoice-context.d.ts +5 -0
  90. package/components/tributos/types/controllership-outgoing-invoice.d.ts +3 -0
  91. package/components/tributos/types/credit-invoice-type.d.ts +1 -0
  92. package/components/tributos/types/debit-invoice-type.d.ts +1 -0
  93. package/components/tributos/types/group.d.ts +6 -0
  94. package/components/tributos/types/incoming-invoice-context.d.ts +5 -0
  95. package/components/tributos/types/incoming-invoice-item.d.ts +4 -0
  96. package/components/tributos/types/incoming-invoice-type.d.ts +1 -0
  97. package/components/tributos/types/incoming-invoice.d.ts +11 -0
  98. package/components/tributos/types/item-type.d.ts +1 -0
  99. package/components/tributos/types/outgoing-Invoice.d.ts +11 -0
  100. package/components/tributos/types/outgoing-invoice-context.d.ts +5 -0
  101. package/components/tributos/types/outgoing-invoice-item.d.ts +4 -0
  102. package/components/tributos/types/outgoing-invoice-type.d.ts +1 -0
  103. package/components/tributos/types/purchase-order-context.d.ts +5 -0
  104. package/components/tributos/types/purchase-order-type.d.ts +1 -0
  105. package/components/tributos/types/purchase-order.d.ts +8 -0
  106. package/components/tributos/types/sale-order-context.d.ts +5 -0
  107. package/components/tributos/types/sale-order-type.d.ts +1 -0
  108. package/components/tributos/types/sale-order.d.ts +8 -0
  109. package/components/tributos/types/tax.d.ts +8 -0
  110. package/components/utils/breakpoints.d.ts +10 -0
  111. package/components/utils/export-utils.d.ts +6 -0
  112. package/components/utils/index.d.ts +3 -0
  113. package/components/utils/loading-context.d.ts +7 -0
  114. package/components/utils/utils.d.ts +4 -0
  115. package/core/entities/entity-service.d.ts +32 -0
  116. package/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda-dto.d.ts +36 -0
  117. package/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.d.ts +40 -0
  118. package/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.module.d.ts +2 -0
  119. package/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.service.d.ts +11 -0
  120. package/core/enums/enum-classificacao-tributaria.d.ts +4 -0
  121. package/core/enums/enum-tipo-calculo-imposto.d.ts +5 -0
  122. package/core/enums/enum-tipo-documento-parametros.d.ts +7 -0
  123. package/core/enums/enum-tipo-documento.d.ts +10 -0
  124. package/core/enums/erpx-com-processo-faturamento-backend/enum-indicativo-padrao.d.ts +5 -0
  125. package/core/enums/erpx-cpl-imp-cadastros-backend/enum-indicativo-padrao.d.ts +8 -0
  126. package/esm2015/components/breadcrumb/breadcrumb.component.js +86 -0
  127. package/esm2015/components/breadcrumb/breadcrumb.module.js +17 -0
  128. package/esm2015/components/breadcrumb/index.js +3 -0
  129. package/esm2015/components/focus/focus.service.js +32 -0
  130. package/esm2015/components/lote-serie/erp-lote-serie.component.js +1772 -0
  131. package/esm2015/components/lote-serie/erp-lote-serie.module.js +47 -0
  132. package/esm2015/components/lote-serie/erp-lote-serie.service.js +94 -0
  133. package/esm2015/components/lote-serie/index.js +3 -0
  134. package/esm2015/components/rateio-editor/erp-rateio-editor.component.js +794 -0
  135. package/esm2015/components/rateio-editor/erp-rateio-editor.converter.js +52 -0
  136. package/esm2015/components/rateio-editor/erp-rateio-editor.module.js +40 -0
  137. package/esm2015/components/rateio-editor/erp-rateio-editor.service.js +49 -0
  138. package/esm2015/components/rateio-editor/erp-rateio-editor.types.js +5 -0
  139. package/esm2015/components/rateio-editor/index.js +4 -0
  140. package/esm2015/components/resumo/erp-resumo.component.js +19 -0
  141. package/esm2015/components/resumo/erp-resumo.module.js +25 -0
  142. package/esm2015/components/resumo/erp-resumo.service.js +13 -0
  143. package/esm2015/components/resumo/index.js +2 -0
  144. package/esm2015/components/tributos/calculators/effective-tax-rate-calculator.js +53 -0
  145. package/esm2015/components/tributos/calculators/gross-amount-calculator.js +37 -0
  146. package/esm2015/components/tributos/calculators/tax-amount-calculator.js +87 -0
  147. package/esm2015/components/tributos/erp-tributos.component.js +5176 -0
  148. package/esm2015/components/tributos/erp-tributos.module.js +33 -0
  149. package/esm2015/components/tributos/erp-tributos.service.js +23 -0
  150. package/esm2015/components/tributos/erp-tributos.types.js +268 -0
  151. package/esm2015/components/tributos/index.js +4 -0
  152. package/esm2015/components/tributos/mappings/enum-tip-imp-cst-mapping.js +33 -0
  153. package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/calculation-rules.registry.js +45 -0
  154. package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/incoming-invoice-calculation-rules.registry.js +3102 -0
  155. package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/outgoing-invoice-calculation-rules.registry.js +4516 -0
  156. package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/purchase-order-calculation-rules.registry.js +294 -0
  157. package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/sale-order-calculation-rules.registry.js +1464 -0
  158. package/esm2015/components/tributos/rules/calculation/rules/apply-net-value-to-document-calculation-rule.js +48 -0
  159. package/esm2015/components/tributos/rules/calculation/rules/assessment-period-calculation-rule.js +55 -0
  160. package/esm2015/components/tributos/rules/calculation/rules/effective-tax-rate-calculation-rule.js +83 -0
  161. package/esm2015/components/tributos/rules/calculation/rules/gross-amount-calculation-rule.js +74 -0
  162. package/esm2015/components/tributos/rules/calculation/rules/manual-tax-calculation-rule.js +72 -0
  163. package/esm2015/components/tributos/rules/calculation/rules/tax-amount-calculation-rule.js +244 -0
  164. package/esm2015/components/tributos/rules/calculation/rules/tax-calculation-type-calculation-rule.js +74 -0
  165. package/esm2015/components/tributos/rules/calculation/rules/tax-classification-calculation-rule.js +170 -0
  166. package/esm2015/components/tributos/rules/calculation/rules/tax-rate-calculation-rule.js +100 -0
  167. package/esm2015/components/tributos/rules/calculation/rules/tax-situation-calculation-rule.js +124 -0
  168. package/esm2015/components/tributos/rules/calculation/rules/taxable-base-calculation-rule.js +292 -0
  169. package/esm2015/components/tributos/rules/rules.service.js +61 -0
  170. package/esm2015/components/tributos/rules/status/registries/incoming-invoice-status-rules.registry.js +1076 -0
  171. package/esm2015/components/tributos/rules/status/registries/outgoing-invoice-status-rules.registry.js +1317 -0
  172. package/esm2015/components/tributos/rules/status/registries/purchase-order-status-rules.registry.js +62 -0
  173. package/esm2015/components/tributos/rules/status/registries/sale-order-status-rules.registry.js +18 -0
  174. package/esm2015/components/tributos/rules/status/registries/status-rules.registry.js +45 -0
  175. package/esm2015/components/tributos/rules/status/rules/apply-net-value-to-document-status-rule.js +39 -0
  176. package/esm2015/components/tributos/rules/status/rules/tax-classification-status-rule.js +94 -0
  177. package/esm2015/components/tributos/rules/status/rules/tax-rate-status-rule.js +61 -0
  178. package/esm2015/components/tributos/rules/status/rules/taxable-base-status-rule.js +65 -0
  179. package/esm2015/components/tributos/rules/types/available-fields.js +1 -0
  180. package/esm2015/components/tributos/rules/types/available-taxes.js +1 -0
  181. package/esm2015/components/tributos/rules/types/field-calculation-rule-mapping.js +1 -0
  182. package/esm2015/components/tributos/rules/types/field-rule-mapping.js +1 -0
  183. package/esm2015/components/tributos/rules/types/field-status-rule-mapping.js +1 -0
  184. package/esm2015/components/tributos/rules/types/rule-payload.js +1 -0
  185. package/esm2015/components/tributos/rules/types/schemas/incoming-invoice.schema.js +1816 -0
  186. package/esm2015/components/tributos/rules/types/schemas/outgoing-invoice.schema.js +2750 -0
  187. package/esm2015/components/tributos/rules/types/schemas/purchase-order.schema.js +150 -0
  188. package/esm2015/components/tributos/rules/types/schemas/sale-order.schema.js +879 -0
  189. package/esm2015/components/tributos/rules/types/strategies-by-document.js +1 -0
  190. package/esm2015/components/tributos/rules/types/strategies.js +1 -0
  191. package/esm2015/components/tributos/rules/types/tax-rule.js +1 -0
  192. package/esm2015/components/tributos/rules/validation/registries/incoming-invoice-validation-rules.registry.js +3606 -0
  193. package/esm2015/components/tributos/rules/validation/registries/outgoing-invoice-validation-rules.registry.js +5452 -0
  194. package/esm2015/components/tributos/rules/validation/registries/purchase-order-validation-rules.registry.js +270 -0
  195. package/esm2015/components/tributos/rules/validation/registries/sale-order-validation-rules.registry.js +1392 -0
  196. package/esm2015/components/tributos/rules/validation/registries/validation-rules.registry.js +45 -0
  197. package/esm2015/components/tributos/rules/validation/rules/required/apply-net-value-to-document-required-validation-rule.js +73 -0
  198. package/esm2015/components/tributos/rules/validation/rules/required/assessment-period-required-validation-rule.js +78 -0
  199. package/esm2015/components/tributos/rules/validation/rules/required/tax-amount-required-validation-rule.js +902 -0
  200. package/esm2015/components/tributos/rules/validation/rules/required/tax-classification-required-validation-rule.js +401 -0
  201. package/esm2015/components/tributos/rules/validation/rules/required/tax-rate-required-validation-rule.js +719 -0
  202. package/esm2015/components/tributos/rules/validation/rules/required/tax-situation-required-validation-rule.js +300 -0
  203. package/esm2015/components/tributos/rules/validation/rules/required/taxable-base-required-validation-rule.js +717 -0
  204. package/esm2015/components/tributos/services/tax-rounding.service.js +18 -0
  205. package/esm2015/components/tributos/stores/tax.store.js +19 -0
  206. package/esm2015/components/tributos/tax-reform-utilities.js +243 -0
  207. package/esm2015/components/tributos/types/context.js +1 -0
  208. package/esm2015/components/tributos/types/controllership-incoming-invoice-context.js +1 -0
  209. package/esm2015/components/tributos/types/controllership-incoming-invoice.js +1 -0
  210. package/esm2015/components/tributos/types/controllership-outgoing-invoice-context.js +1 -0
  211. package/esm2015/components/tributos/types/controllership-outgoing-invoice.js +1 -0
  212. package/esm2015/components/tributos/types/credit-invoice-type.js +1 -0
  213. package/esm2015/components/tributos/types/debit-invoice-type.js +1 -0
  214. package/esm2015/components/tributos/types/group.js +1 -0
  215. package/esm2015/components/tributos/types/incoming-invoice-context.js +1 -0
  216. package/esm2015/components/tributos/types/incoming-invoice-item.js +1 -0
  217. package/esm2015/components/tributos/types/incoming-invoice-type.js +1 -0
  218. package/esm2015/components/tributos/types/incoming-invoice.js +1 -0
  219. package/esm2015/components/tributos/types/item-type.js +1 -0
  220. package/esm2015/components/tributos/types/outgoing-Invoice.js +1 -0
  221. package/esm2015/components/tributos/types/outgoing-invoice-context.js +1 -0
  222. package/esm2015/components/tributos/types/outgoing-invoice-item.js +1 -0
  223. package/esm2015/components/tributos/types/outgoing-invoice-type.js +1 -0
  224. package/esm2015/components/tributos/types/purchase-order-context.js +1 -0
  225. package/esm2015/components/tributos/types/purchase-order-type.js +1 -0
  226. package/esm2015/components/tributos/types/purchase-order.js +1 -0
  227. package/esm2015/components/tributos/types/sale-order-context.js +1 -0
  228. package/esm2015/components/tributos/types/sale-order-type.js +1 -0
  229. package/esm2015/components/tributos/types/sale-order.js +1 -0
  230. package/esm2015/components/tributos/types/tax.js +2 -0
  231. package/esm2015/components/utils/breakpoints.js +11 -0
  232. package/esm2015/components/utils/export-utils.js +71 -0
  233. package/esm2015/components/utils/index.js +4 -0
  234. package/esm2015/components/utils/loading-context.js +20 -0
  235. package/esm2015/components/utils/utils.js +18 -0
  236. package/esm2015/core/entities/entity-service.js +91 -0
  237. package/esm2015/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda-dto.js +1 -0
  238. package/esm2015/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.js +62 -0
  239. package/esm2015/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.module.js +24 -0
  240. package/esm2015/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.service.js +24 -0
  241. package/esm2015/core/enums/enum-classificacao-tributaria.js +6 -0
  242. package/esm2015/core/enums/enum-tipo-calculo-imposto.js +7 -0
  243. package/esm2015/core/enums/enum-tipo-documento-parametros.js +9 -0
  244. package/esm2015/core/enums/enum-tipo-documento.js +12 -0
  245. package/esm2015/core/enums/erpx-com-processo-faturamento-backend/enum-indicativo-padrao.js +7 -0
  246. package/esm2015/core/enums/erpx-cpl-imp-cadastros-backend/enum-indicativo-padrao.js +10 -0
  247. package/esm2015/locale/fallback.js +56 -0
  248. package/esm2015/public-api.js +8 -0
  249. package/esm2015/senior-gestao-empresarial-erpx-components.js +58 -0
  250. package/esm5/components/breadcrumb/breadcrumb.component.js +91 -0
  251. package/esm5/components/breadcrumb/breadcrumb.module.js +20 -0
  252. package/esm5/components/breadcrumb/index.js +3 -0
  253. package/esm5/components/focus/focus.service.js +35 -0
  254. package/esm5/components/lote-serie/erp-lote-serie.component.js +1830 -0
  255. package/esm5/components/lote-serie/erp-lote-serie.module.js +50 -0
  256. package/esm5/components/lote-serie/erp-lote-serie.service.js +96 -0
  257. package/esm5/components/lote-serie/index.js +3 -0
  258. package/esm5/components/rateio-editor/erp-rateio-editor.component.js +861 -0
  259. package/esm5/components/rateio-editor/erp-rateio-editor.converter.js +68 -0
  260. package/esm5/components/rateio-editor/erp-rateio-editor.module.js +43 -0
  261. package/esm5/components/rateio-editor/erp-rateio-editor.service.js +51 -0
  262. package/esm5/components/rateio-editor/erp-rateio-editor.types.js +5 -0
  263. package/esm5/components/rateio-editor/index.js +4 -0
  264. package/esm5/components/resumo/erp-resumo.component.js +22 -0
  265. package/esm5/components/resumo/erp-resumo.module.js +28 -0
  266. package/esm5/components/resumo/erp-resumo.service.js +16 -0
  267. package/esm5/components/resumo/index.js +2 -0
  268. package/esm5/components/tributos/calculators/effective-tax-rate-calculator.js +58 -0
  269. package/esm5/components/tributos/calculators/gross-amount-calculator.js +39 -0
  270. package/esm5/components/tributos/calculators/tax-amount-calculator.js +91 -0
  271. package/esm5/components/tributos/erp-tributos.component.js +5296 -0
  272. package/esm5/components/tributos/erp-tributos.module.js +36 -0
  273. package/esm5/components/tributos/erp-tributos.service.js +24 -0
  274. package/esm5/components/tributos/erp-tributos.types.js +268 -0
  275. package/esm5/components/tributos/index.js +4 -0
  276. package/esm5/components/tributos/mappings/enum-tip-imp-cst-mapping.js +33 -0
  277. package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/calculation-rules.registry.js +46 -0
  278. package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/incoming-invoice-calculation-rules.registry.js +3104 -0
  279. package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/outgoing-invoice-calculation-rules.registry.js +4518 -0
  280. package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/purchase-order-calculation-rules.registry.js +296 -0
  281. package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/sale-order-calculation-rules.registry.js +1466 -0
  282. package/esm5/components/tributos/rules/calculation/rules/apply-net-value-to-document-calculation-rule.js +60 -0
  283. package/esm5/components/tributos/rules/calculation/rules/assessment-period-calculation-rule.js +77 -0
  284. package/esm5/components/tributos/rules/calculation/rules/effective-tax-rate-calculation-rule.js +92 -0
  285. package/esm5/components/tributos/rules/calculation/rules/gross-amount-calculation-rule.js +83 -0
  286. package/esm5/components/tributos/rules/calculation/rules/manual-tax-calculation-rule.js +87 -0
  287. package/esm5/components/tributos/rules/calculation/rules/tax-amount-calculation-rule.js +286 -0
  288. package/esm5/components/tributos/rules/calculation/rules/tax-calculation-type-calculation-rule.js +89 -0
  289. package/esm5/components/tributos/rules/calculation/rules/tax-classification-calculation-rule.js +241 -0
  290. package/esm5/components/tributos/rules/calculation/rules/tax-rate-calculation-rule.js +118 -0
  291. package/esm5/components/tributos/rules/calculation/rules/tax-situation-calculation-rule.js +200 -0
  292. package/esm5/components/tributos/rules/calculation/rules/taxable-base-calculation-rule.js +330 -0
  293. package/esm5/components/tributos/rules/rules.service.js +139 -0
  294. package/esm5/components/tributos/rules/status/registries/incoming-invoice-status-rules.registry.js +1078 -0
  295. package/esm5/components/tributos/rules/status/registries/outgoing-invoice-status-rules.registry.js +1319 -0
  296. package/esm5/components/tributos/rules/status/registries/purchase-order-status-rules.registry.js +64 -0
  297. package/esm5/components/tributos/rules/status/registries/sale-order-status-rules.registry.js +19 -0
  298. package/esm5/components/tributos/rules/status/registries/status-rules.registry.js +46 -0
  299. package/esm5/components/tributos/rules/status/rules/apply-net-value-to-document-status-rule.js +43 -0
  300. package/esm5/components/tributos/rules/status/rules/tax-classification-status-rule.js +106 -0
  301. package/esm5/components/tributos/rules/status/rules/tax-rate-status-rule.js +68 -0
  302. package/esm5/components/tributos/rules/status/rules/taxable-base-status-rule.js +72 -0
  303. package/esm5/components/tributos/rules/types/available-fields.js +1 -0
  304. package/esm5/components/tributos/rules/types/available-taxes.js +1 -0
  305. package/esm5/components/tributos/rules/types/field-calculation-rule-mapping.js +1 -0
  306. package/esm5/components/tributos/rules/types/field-rule-mapping.js +1 -0
  307. package/esm5/components/tributos/rules/types/field-status-rule-mapping.js +1 -0
  308. package/esm5/components/tributos/rules/types/rule-payload.js +1 -0
  309. package/esm5/components/tributos/rules/types/schemas/incoming-invoice.schema.js +1817 -0
  310. package/esm5/components/tributos/rules/types/schemas/outgoing-invoice.schema.js +2751 -0
  311. package/esm5/components/tributos/rules/types/schemas/purchase-order.schema.js +151 -0
  312. package/esm5/components/tributos/rules/types/schemas/sale-order.schema.js +880 -0
  313. package/esm5/components/tributos/rules/types/strategies-by-document.js +1 -0
  314. package/esm5/components/tributos/rules/types/strategies.js +1 -0
  315. package/esm5/components/tributos/rules/types/tax-rule.js +1 -0
  316. package/esm5/components/tributos/rules/validation/registries/incoming-invoice-validation-rules.registry.js +3608 -0
  317. package/esm5/components/tributos/rules/validation/registries/outgoing-invoice-validation-rules.registry.js +5454 -0
  318. package/esm5/components/tributos/rules/validation/registries/purchase-order-validation-rules.registry.js +272 -0
  319. package/esm5/components/tributos/rules/validation/registries/sale-order-validation-rules.registry.js +1394 -0
  320. package/esm5/components/tributos/rules/validation/registries/validation-rules.registry.js +46 -0
  321. package/esm5/components/tributos/rules/validation/rules/required/apply-net-value-to-document-required-validation-rule.js +77 -0
  322. package/esm5/components/tributos/rules/validation/rules/required/assessment-period-required-validation-rule.js +86 -0
  323. package/esm5/components/tributos/rules/validation/rules/required/tax-amount-required-validation-rule.js +968 -0
  324. package/esm5/components/tributos/rules/validation/rules/required/tax-classification-required-validation-rule.js +433 -0
  325. package/esm5/components/tributos/rules/validation/rules/required/tax-rate-required-validation-rule.js +774 -0
  326. package/esm5/components/tributos/rules/validation/rules/required/tax-situation-required-validation-rule.js +323 -0
  327. package/esm5/components/tributos/rules/validation/rules/required/taxable-base-required-validation-rule.js +772 -0
  328. package/esm5/components/tributos/services/tax-rounding.service.js +23 -0
  329. package/esm5/components/tributos/stores/tax.store.js +26 -0
  330. package/esm5/components/tributos/tax-reform-utilities.js +249 -0
  331. package/esm5/components/tributos/types/context.js +1 -0
  332. package/esm5/components/tributos/types/controllership-incoming-invoice-context.js +1 -0
  333. package/esm5/components/tributos/types/controllership-incoming-invoice.js +1 -0
  334. package/esm5/components/tributos/types/controllership-outgoing-invoice-context.js +1 -0
  335. package/esm5/components/tributos/types/controllership-outgoing-invoice.js +1 -0
  336. package/esm5/components/tributos/types/credit-invoice-type.js +1 -0
  337. package/esm5/components/tributos/types/debit-invoice-type.js +1 -0
  338. package/esm5/components/tributos/types/group.js +1 -0
  339. package/esm5/components/tributos/types/incoming-invoice-context.js +1 -0
  340. package/esm5/components/tributos/types/incoming-invoice-item.js +1 -0
  341. package/esm5/components/tributos/types/incoming-invoice-type.js +1 -0
  342. package/esm5/components/tributos/types/incoming-invoice.js +1 -0
  343. package/esm5/components/tributos/types/item-type.js +1 -0
  344. package/esm5/components/tributos/types/outgoing-Invoice.js +1 -0
  345. package/esm5/components/tributos/types/outgoing-invoice-context.js +1 -0
  346. package/esm5/components/tributos/types/outgoing-invoice-item.js +1 -0
  347. package/esm5/components/tributos/types/outgoing-invoice-type.js +1 -0
  348. package/esm5/components/tributos/types/purchase-order-context.js +1 -0
  349. package/esm5/components/tributos/types/purchase-order-type.js +1 -0
  350. package/esm5/components/tributos/types/purchase-order.js +1 -0
  351. package/esm5/components/tributos/types/sale-order-context.js +1 -0
  352. package/esm5/components/tributos/types/sale-order-type.js +1 -0
  353. package/esm5/components/tributos/types/sale-order.js +1 -0
  354. package/esm5/components/tributos/types/tax.js +2 -0
  355. package/esm5/components/utils/breakpoints.js +11 -0
  356. package/esm5/components/utils/export-utils.js +78 -0
  357. package/esm5/components/utils/index.js +4 -0
  358. package/esm5/components/utils/loading-context.js +22 -0
  359. package/esm5/components/utils/utils.js +20 -0
  360. package/esm5/core/entities/entity-service.js +98 -0
  361. package/esm5/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda-dto.js +1 -0
  362. package/esm5/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.js +67 -0
  363. package/esm5/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.module.js +27 -0
  364. package/esm5/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.service.js +27 -0
  365. package/esm5/core/enums/enum-classificacao-tributaria.js +6 -0
  366. package/esm5/core/enums/enum-tipo-calculo-imposto.js +7 -0
  367. package/esm5/core/enums/enum-tipo-documento-parametros.js +9 -0
  368. package/esm5/core/enums/enum-tipo-documento.js +12 -0
  369. package/esm5/core/enums/erpx-com-processo-faturamento-backend/enum-indicativo-padrao.js +7 -0
  370. package/esm5/core/enums/erpx-cpl-imp-cadastros-backend/enum-indicativo-padrao.js +10 -0
  371. package/esm5/locale/fallback.js +56 -0
  372. package/esm5/public-api.js +8 -0
  373. package/esm5/senior-gestao-empresarial-erpx-components.js +58 -0
  374. package/fesm2015/senior-gestao-empresarial-erpx-components.js +36350 -0
  375. package/fesm2015/senior-gestao-empresarial-erpx-components.js.map +1 -0
  376. package/fesm5/senior-gestao-empresarial-erpx-components.js +37396 -0
  377. package/fesm5/senior-gestao-empresarial-erpx-components.js.map +1 -0
  378. package/locale/fallback.d.ts +55 -0
  379. package/package.json +23 -0
  380. package/public-api.d.ts +7 -0
  381. package/senior-gestao-empresarial-erpx-components.d.ts +57 -0
  382. package/senior-gestao-empresarial-erpx-components.metadata.json +1 -0
@@ -0,0 +1,861 @@
1
+ import { __assign, __decorate, __read, __spread } from "tslib";
2
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
3
+ import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms';
4
+ import { TranslateService } from '@ngx-translate/core';
5
+ import { E044CcuLookup, E091PlfLookup, EnumLogicalOperator } from '@senior-gestao-empresarial/angular-components';
6
+ import { ButtonPriority, ButtonSize, FieldType, FormField } from '@seniorsistemas/angular-components';
7
+ import { Subject } from 'rxjs';
8
+ import { finalize, takeUntil } from 'rxjs/operators';
9
+ import { ErpRateioEditorService } from './erp-rateio-editor.service';
10
+ import { MessageService } from 'primeng';
11
+ var ErpRateioEditorComponent = /** @class */ (function () {
12
+ function ErpRateioEditorComponent(fb, service, translate, e091PlfLookup, e044CcuLookup, messageService) {
13
+ this.fb = fb;
14
+ this.service = service;
15
+ this.translate = translate;
16
+ this.e091PlfLookup = e091PlfLookup;
17
+ this.e044CcuLookup = e044CcuLookup;
18
+ this.messageService = messageService;
19
+ this.readOnly = false;
20
+ this.showSugestaoButton = true;
21
+ /**
22
+ * Controla se o rateio deve ser carregado automaticamente via API quando
23
+ * idMovimento está presente (modo conectado). Default: true.
24
+ *
25
+ * Defina como false para restaurar um rateio que o usuário já distribuiu e que
26
+ * ainda não foi persistido no backend de rateio: o componente popula a grid a
27
+ * partir de initialContext/initialRateios e mantém o botão Salvar e a gravação
28
+ * vinculada ao movimento.
29
+ */
30
+ this.loadFromApi = true;
31
+ /**
32
+ * Critério de rateio padrão usado pela API de sugestão.
33
+ * Default: 'V3' (Despesas — Conta X C. Custos).
34
+ */
35
+ this.criRat = 'V3';
36
+ // === OUTPUTS ===
37
+ this.save = new EventEmitter();
38
+ this.cancel = new EventEmitter();
39
+ this.change = new EventEmitter();
40
+ this.error = new EventEmitter();
41
+ // === CONSTANTES EXPOSTAS AO TEMPLATE ===
42
+ this.ButtonPriority = ButtonPriority;
43
+ this.ButtonSize = ButtonSize;
44
+ this.loading = false;
45
+ this.selection = [];
46
+ /** Seleção de centros de custo por conta financeira (keyed por idContaFinanceira). */
47
+ this.ccSelection = {};
48
+ this.contasDataSource = [];
49
+ this.editingRowBackup = null;
50
+ this.editingCCBackup = null;
51
+ /** Último valor selecionado no lookup de conta (carrega anaSin para validação). */
52
+ this.selectedConta = null;
53
+ /** Último valor selecionado no lookup de centro de custo (carrega anaSin/aceRat). */
54
+ this.selectedCC = null;
55
+ // === MODAL CONTA FINANCEIRA ===
56
+ this.displayContaDialog = false;
57
+ this.editingContaIndex = null;
58
+ // === MODAL CENTRO DE CUSTO ===
59
+ this.displayCCDialog = false;
60
+ this.editingCCContaIndex = null;
61
+ this.editingCCIndex = null;
62
+ this.ngUnsubscribe = new Subject();
63
+ this.formGroup = this.fb.group({
64
+ contas: this.fb.array([])
65
+ });
66
+ }
67
+ ErpRateioEditorComponent_1 = ErpRateioEditorComponent;
68
+ Object.defineProperty(ErpRateioEditorComponent.prototype, "effectiveReadOnly", {
69
+ get: function () {
70
+ var _a;
71
+ var ic = (_a = this.loadedContext) === null || _a === void 0 ? void 0 : _a.integracaoControladoria;
72
+ var hasIntegracao = !!ic && (ic.contabilidade === true ||
73
+ ic.tributos === true ||
74
+ ic.patrimonio === true);
75
+ return this.readOnly || hasIntegracao;
76
+ },
77
+ enumerable: true,
78
+ configurable: true
79
+ });
80
+ Object.defineProperty(ErpRateioEditorComponent.prototype, "contasFormArray", {
81
+ get: function () {
82
+ return this.formGroup.get('contas');
83
+ },
84
+ enumerable: true,
85
+ configurable: true
86
+ });
87
+ Object.defineProperty(ErpRateioEditorComponent.prototype, "valorBase", {
88
+ get: function () {
89
+ var _a, _b;
90
+ return (_b = (_a = this.loadedContext) === null || _a === void 0 ? void 0 : _a.valorBase) !== null && _b !== void 0 ? _b : 0;
91
+ },
92
+ enumerable: true,
93
+ configurable: true
94
+ });
95
+ Object.defineProperty(ErpRateioEditorComponent.prototype, "percentualRestante", {
96
+ get: function () {
97
+ var _a;
98
+ var soma = this.contasDataSource.reduce(function (acc, conta) { return acc + (conta.percentual || 0); }, 0);
99
+ return +(100 - soma).toFixed((_a = this.config.percentageScale) !== null && _a !== void 0 ? _a : 4);
100
+ },
101
+ enumerable: true,
102
+ configurable: true
103
+ });
104
+ Object.defineProperty(ErpRateioEditorComponent.prototype, "valorRestante", {
105
+ get: function () {
106
+ var _a;
107
+ var soma = this.contasDataSource.reduce(function (acc, conta) { return acc + (conta.valorRateadoConta || 0); }, 0);
108
+ return +(this.valorBase - soma).toFixed((_a = this.config.currencyScale) !== null && _a !== void 0 ? _a : 2);
109
+ },
110
+ enumerable: true,
111
+ configurable: true
112
+ });
113
+ Object.defineProperty(ErpRateioEditorComponent.prototype, "valorRestanteDisplay", {
114
+ /**
115
+ * Valor restante a ser exibido nos cards de resumo.
116
+ * Considera o total já distribuído nos centros de custo de todas as contas
117
+ * (e não o total das contas financeiras), refletindo a distribuição real
118
+ * ponta-a-ponta — centro de custo é sempre obrigatório.
119
+ */
120
+ get: function () {
121
+ var _a;
122
+ var totalCC = this.contasDataSource.reduce(function (acc, conta) { return acc + (conta.rateiosCCusto || []).reduce(function (ccAcc, cc) { return ccAcc + (cc.valor || 0); }, 0); }, 0);
123
+ return +(this.valorBase - totalCC).toFixed((_a = this.config.currencyScale) !== null && _a !== void 0 ? _a : 2);
124
+ },
125
+ enumerable: true,
126
+ configurable: true
127
+ });
128
+ Object.defineProperty(ErpRateioEditorComponent.prototype, "percentualRestanteDisplay", {
129
+ /**
130
+ * Percentual restante a ser exibido nos cards de resumo.
131
+ * Derivado de `valorRestanteDisplay` para manter consistência com o valor.
132
+ */
133
+ get: function () {
134
+ var _a;
135
+ if (!this.valorBase) {
136
+ return 0;
137
+ }
138
+ return +(this.valorRestanteDisplay / this.valorBase * 100).toFixed((_a = this.config.percentageScale) !== null && _a !== void 0 ? _a : 4);
139
+ },
140
+ enumerable: true,
141
+ configurable: true
142
+ });
143
+ Object.defineProperty(ErpRateioEditorComponent.prototype, "numberFormatOptions", {
144
+ get: function () {
145
+ var _a, _b;
146
+ if (this.currencyCode) {
147
+ return {
148
+ numberFormatOptions: {
149
+ style: 'currency',
150
+ currency: this.currencyCode
151
+ }
152
+ };
153
+ }
154
+ return {
155
+ numberFormatOptions: {
156
+ style: 'decimal',
157
+ minimumFractionDigits: (_a = this.config.currencyScale) !== null && _a !== void 0 ? _a : 2,
158
+ maximumFractionDigits: (_b = this.config.currencyScale) !== null && _b !== void 0 ? _b : 2
159
+ }
160
+ };
161
+ },
162
+ enumerable: true,
163
+ configurable: true
164
+ });
165
+ ErpRateioEditorComponent.prototype.ngOnChanges = function (changes) {
166
+ var movimentoChanged = changes.idMovimento || changes.tipoMovimento;
167
+ if (movimentoChanged && this.idMovimento && this.tipoMovimento && this.loadFromApi) {
168
+ // Modo conectado com carga via API
169
+ this.carregarRateio();
170
+ }
171
+ else if (this.isInputDriven && (changes.initialContext || changes.initialRateios || changes.loadFromApi || movimentoChanged)) {
172
+ // Alimentado por inputs: modo standalone OU conectado sem carga via API
173
+ this.inicializarPorInputs();
174
+ }
175
+ };
176
+ Object.defineProperty(ErpRateioEditorComponent.prototype, "rateios", {
177
+ /** Retorna o conteúdo atual da grid (uso standalone — quem consome lê os rateios daqui). */
178
+ get: function () {
179
+ return this.contasDataSource;
180
+ },
181
+ enumerable: true,
182
+ configurable: true
183
+ });
184
+ Object.defineProperty(ErpRateioEditorComponent.prototype, "isStandalone", {
185
+ /** Indica se o componente está operando sem idMovimento (modo standalone). */
186
+ get: function () {
187
+ return !this.idMovimento;
188
+ },
189
+ enumerable: true,
190
+ configurable: true
191
+ });
192
+ Object.defineProperty(ErpRateioEditorComponent.prototype, "isInputDriven", {
193
+ /**
194
+ * Indica se o componente é alimentado por inputs em vez da API:
195
+ * modo standalone (sem idMovimento) OU modo conectado com loadFromApi = false.
196
+ */
197
+ get: function () {
198
+ return this.isStandalone || !this.loadFromApi;
199
+ },
200
+ enumerable: true,
201
+ configurable: true
202
+ });
203
+ Object.defineProperty(ErpRateioEditorComponent.prototype, "isReady", {
204
+ /** Indica se o componente está pronto para exibir UI (carregou via API OU foi inicializado por inputs). */
205
+ get: function () {
206
+ return !!this.loadedContext || this.isInputDriven;
207
+ },
208
+ enumerable: true,
209
+ configurable: true
210
+ });
211
+ ErpRateioEditorComponent.prototype.ngOnDestroy = function () {
212
+ this.ngUnsubscribe.next();
213
+ this.ngUnsubscribe.complete();
214
+ };
215
+ // === AÇÕES PÚBLICAS ===
216
+ ErpRateioEditorComponent.prototype.onSalvar = function () {
217
+ var _this = this;
218
+ var _a;
219
+ if (this.effectiveReadOnly) {
220
+ return;
221
+ }
222
+ if (this.hasContaSemCentroCusto()) {
223
+ var message = this.translate.instant('erpx.rateio_editor.erro_centro_custo_obrigatorio');
224
+ this.messageService.add({
225
+ severity: 'error',
226
+ summary: this.translate.instant('erpx.rateio_editor.erro_titulo'),
227
+ detail: message
228
+ });
229
+ this.error.emit({ operacao: 'save', message: message });
230
+ return;
231
+ }
232
+ if (!this.isDistribuicaoCompleta()) {
233
+ var message = this.translate.instant('erpx.rateio_editor.erro_distribuicao_incompleta');
234
+ this.messageService.add({
235
+ severity: 'error',
236
+ summary: this.translate.instant('erpx.rateio_editor.erro_titulo'),
237
+ detail: message
238
+ });
239
+ this.error.emit({ operacao: 'save', message: message });
240
+ return;
241
+ }
242
+ var ctx = this.loadedContext;
243
+ if (!((_a = ctx === null || ctx === void 0 ? void 0 : ctx.e070fil) === null || _a === void 0 ? void 0 : _a.id) || !(ctx === null || ctx === void 0 ? void 0 : ctx.criRat)) {
244
+ var message = this.translate.instant('erpx.rateio_editor.erro_contexto_incompleto');
245
+ this.messageService.add({
246
+ severity: 'error',
247
+ summary: this.translate.instant('erpx.rateio_editor.erro_titulo'),
248
+ detail: message
249
+ });
250
+ this.error.emit({ operacao: 'save', message: message });
251
+ return;
252
+ }
253
+ var input = {
254
+ idMovimento: this.idMovimento,
255
+ tipoMovimento: this.tipoMovimento,
256
+ agrupadorId: ctx.agrupadorId,
257
+ e070fil_id: ctx.e070fil.id,
258
+ criterioRateio: ctx.criRat,
259
+ dataBase: ctx.dataBase,
260
+ dataMovimento: ctx.dataMovimento,
261
+ rateios: this.contasDataSource
262
+ };
263
+ this.loading = true;
264
+ this.service.gravarRateioManual(input)
265
+ .pipe(takeUntil(this.ngUnsubscribe), finalize(function () { return (_this.loading = false); }))
266
+ .subscribe(function () {
267
+ _this.messageService.add({
268
+ severity: 'success',
269
+ summary: _this.translate.instant('erpx.rateio_editor.salvo_com_sucesso_titulo'),
270
+ detail: _this.translate.instant('erpx.rateio_editor.salvo_com_sucesso_detalhe')
271
+ });
272
+ _this.save.emit({ idMovimento: _this.idMovimento, tipoMovimento: _this.tipoMovimento, rateios: _this.contasDataSource });
273
+ }, function (err) {
274
+ var _a;
275
+ var detail = ((_a = err === null || err === void 0 ? void 0 : err.error) === null || _a === void 0 ? void 0 : _a.message) || (err === null || err === void 0 ? void 0 : err.message) || _this.translate.instant('erpx.rateio_editor.erro_salvar');
276
+ _this.messageService.add({
277
+ severity: 'error',
278
+ summary: _this.translate.instant('erpx.rateio_editor.erro_titulo'),
279
+ detail: detail
280
+ });
281
+ _this.error.emit({ operacao: 'save', message: detail, originalError: err });
282
+ });
283
+ };
284
+ ErpRateioEditorComponent.prototype.onSugerir = function () {
285
+ var _this = this;
286
+ var _a, _b;
287
+ if (this.effectiveReadOnly || !this.showSugestaoButton) {
288
+ return;
289
+ }
290
+ var ctx = this.loadedContext;
291
+ var e070fil_id = this.filialId || ((_a = ctx === null || ctx === void 0 ? void 0 : ctx.e070fil) === null || _a === void 0 ? void 0 : _a.id);
292
+ var criterio = this.criRat || (ctx === null || ctx === void 0 ? void 0 : ctx.criRat);
293
+ var valorBase = (_b = ctx === null || ctx === void 0 ? void 0 : ctx.valorBase) !== null && _b !== void 0 ? _b : 0;
294
+ if (!e070fil_id || !criterio) {
295
+ return;
296
+ }
297
+ var parametro = {
298
+ e070fil_id: e070fil_id,
299
+ valorBase: valorBase,
300
+ criRat: criterio,
301
+ dataBase: ctx === null || ctx === void 0 ? void 0 : ctx.dataBase,
302
+ dataMovimento: ctx === null || ctx === void 0 ? void 0 : ctx.dataMovimento
303
+ };
304
+ if (this.idMovimento) {
305
+ parametro.idMovimento = this.idMovimento;
306
+ }
307
+ if (this.e091plfId) {
308
+ parametro.e091plf_id = this.e091plfId;
309
+ }
310
+ if (this.e044ccuId) {
311
+ parametro.e044ccu_id = this.e044ccuId;
312
+ }
313
+ if (this.idTransacao) {
314
+ parametro.idTransacao = this.idTransacao;
315
+ }
316
+ if (this.idFamilia) {
317
+ parametro.idFamilia = this.idFamilia;
318
+ }
319
+ if (this.idDerivacao) {
320
+ parametro.idDerivacao = this.idDerivacao;
321
+ }
322
+ if (this.idServico) {
323
+ parametro.idServico = this.idServico;
324
+ }
325
+ if (this.valorExcedente != null) {
326
+ parametro.valorExcedente = this.valorExcedente;
327
+ }
328
+ var input = {
329
+ tipo: this.tipoMovimento,
330
+ parametros: [parametro]
331
+ };
332
+ this.loading = true;
333
+ this.service.sugerirRateio(input)
334
+ .pipe(takeUntil(this.ngUnsubscribe), finalize(function () { return (_this.loading = false); }))
335
+ .subscribe(function (resp) {
336
+ var sugestao = (resp.sugestao || [])
337
+ .find(function (s) { return !_this.idMovimento || s.idMovimento === _this.idMovimento; })
338
+ || (resp.sugestao || [])[0];
339
+ var rateio = sugestao === null || sugestao === void 0 ? void 0 : sugestao.rateio;
340
+ if (!sugestao || !rateio || rateio.length === 0) {
341
+ return;
342
+ }
343
+ _this.popularComRateios(rateio);
344
+ _this.emitChange();
345
+ }, function (err) { var _a; return _this.error.emit({ operacao: 'suggest', message: ((_a = err === null || err === void 0 ? void 0 : err.error) === null || _a === void 0 ? void 0 : _a.message) || (err === null || err === void 0 ? void 0 : err.message) || _this.translate.instant('erpx.rateio_editor.erro_sugerir'), originalError: err }); });
346
+ };
347
+ // === MODAL CONTA FINANCEIRA ===
348
+ ErpRateioEditorComponent.prototype.openContaDialog = function (editIndex) {
349
+ var _this = this;
350
+ var _a;
351
+ this.editingContaIndex = editIndex != null ? editIndex : null;
352
+ var remainingPct = this.editingContaIndex != null
353
+ ? this.percentualRestante + this.contasDataSource[this.editingContaIndex].percentual
354
+ : this.percentualRestante;
355
+ // Usa o valor restante real em vez de recalcular via percentual, evitando
356
+ // diferenças de arredondamento acumuladas nas entradas anteriores.
357
+ var remainingValor = this.editingContaIndex != null
358
+ ? +(this.valorRestante + this.contasDataSource[this.editingContaIndex].valorRateadoConta).toFixed((_a = this.config.currencyScale) !== null && _a !== void 0 ? _a : 2)
359
+ : this.valorRestante;
360
+ var contaValue = null;
361
+ var percentualValue = remainingPct > 0 ? remainingPct : null;
362
+ var valorValue = percentualValue != null ? remainingValor : null;
363
+ if (this.editingContaIndex != null) {
364
+ var conta = this.contasDataSource[this.editingContaIndex];
365
+ contaValue = { id: conta.idContaFinanceira, label: conta.contaFinanceira };
366
+ percentualValue = conta.percentual;
367
+ valorValue = conta.valorRateadoConta;
368
+ }
369
+ this.selectedConta = contaValue;
370
+ this.contaDialogFormGroup = this.fb.group({
371
+ contaFinanceira: [{ value: contaValue, disabled: this.editingContaIndex != null }, Validators.required],
372
+ percentual: [{ value: percentualValue, disabled: false }, [Validators.required, Validators.max(remainingPct)]],
373
+ valor: [{ value: valorValue, disabled: false }, [Validators.required, Validators.max(remainingValor)]]
374
+ });
375
+ this.contaDialogFormGroup.get('contaFinanceira').valueChanges
376
+ .pipe(takeUntil(this.ngUnsubscribe))
377
+ .subscribe(function (value) { return (_this.selectedConta = value || null); });
378
+ this.setupPercentualValorSync(this.contaDialogFormGroup, function () { return _this.valorBase; });
379
+ this.contaDialogFields = this.getContaDialogFields();
380
+ this.displayContaDialog = true;
381
+ };
382
+ ErpRateioEditorComponent.prototype.onSaveContaDialog = function () {
383
+ var _this = this;
384
+ var _a, _b, _c, _d, _e;
385
+ if (this.contaDialogFormGroup.invalid) {
386
+ return;
387
+ }
388
+ var contaControl = this.contaDialogFormGroup.get('contaFinanceira');
389
+ var data = this.contaDialogFormGroup.getRawValue();
390
+ var contaFinanceira = data.contaFinanceira;
391
+ var percentual = Number(data.percentual) || 0;
392
+ var valor = +(Number(data.valor) || 0).toFixed((_a = this.config.currencyScale) !== null && _a !== void 0 ? _a : 2);
393
+ var idContaFinanceira = ((_b = this.selectedConta) === null || _b === void 0 ? void 0 : _b.id) || (contaFinanceira === null || contaFinanceira === void 0 ? void 0 : contaFinanceira.id) || '';
394
+ // Validação analítica: conta sintética não pode ser usada no rateio
395
+ if (((_c = this.selectedConta) === null || _c === void 0 ? void 0 : _c.anaSin) === ErpRateioEditorComponent_1.ANA_SIN_SINTETICO) {
396
+ contaControl.setErrors({ contaSintetica: true });
397
+ return;
398
+ }
399
+ // Validação de duplicidade (adição e edição, ignorando o item em edição)
400
+ var duplicada = this.contasDataSource.some(function (c, i) { return i !== _this.editingContaIndex && c.idContaFinanceira === idContaFinanceira; });
401
+ if (duplicada) {
402
+ contaControl.setErrors({ duplicate: true });
403
+ return;
404
+ }
405
+ if (this.editingContaIndex != null) {
406
+ var conta = this.contasDataSource[this.editingContaIndex];
407
+ conta.percentual = percentual;
408
+ conta.valorRateadoConta = valor;
409
+ // Recalcula os valores dos CCs proporcionalmente ao novo valor da conta,
410
+ // mantendo os percentuais intactos.
411
+ if ((_d = conta.rateiosCCusto) === null || _d === void 0 ? void 0 : _d.length) {
412
+ var currencyScale_1 = (_e = this.config.currencyScale) !== null && _e !== void 0 ? _e : 2;
413
+ conta.rateiosCCusto = conta.rateiosCCusto.map(function (cc) { return (__assign(__assign({}, cc), { valor: +((cc.percentual / 100) * valor).toFixed(currencyScale_1) })); });
414
+ }
415
+ this.contasDataSource = __spread(this.contasDataSource);
416
+ }
417
+ else {
418
+ var labelConta = (contaFinanceira === null || contaFinanceira === void 0 ? void 0 : contaFinanceira.label) || '';
419
+ var novaConta = {
420
+ idContaFinanceira: idContaFinanceira,
421
+ contaFinanceira: labelConta,
422
+ percentual: percentual,
423
+ valorRateadoConta: valor,
424
+ rateiosCCusto: []
425
+ };
426
+ this.contasDataSource = __spread(this.contasDataSource, [novaConta]);
427
+ this.ccSelection[novaConta.idContaFinanceira] = [];
428
+ }
429
+ this.displayContaDialog = false;
430
+ this.emitChange();
431
+ };
432
+ ErpRateioEditorComponent.prototype.onHideContaDialog = function () {
433
+ this.displayContaDialog = false;
434
+ };
435
+ // === MODAL CENTRO DE CUSTO ===
436
+ ErpRateioEditorComponent.prototype.openCCDialog = function (contaIndex, editCCIndex) {
437
+ var _this = this;
438
+ var _a, _b;
439
+ this.editingCCContaIndex = contaIndex;
440
+ this.editingCCIndex = editCCIndex != null ? editCCIndex : null;
441
+ var conta = this.contasDataSource[contaIndex];
442
+ var ccList = conta.rateiosCCusto || [];
443
+ var valorBaseCC = conta.valorRateadoConta || 0;
444
+ // Calcula o restante excluindo o item em edição (para que edição possa manter o próprio valor)
445
+ var somaCCPct = ccList.reduce(function (acc, cc, i) { return acc + (i === _this.editingCCIndex ? 0 : (cc.percentual || 0)); }, 0);
446
+ var somaCCValor = ccList.reduce(function (acc, cc, i) { return acc + (i === _this.editingCCIndex ? 0 : (cc.valor || 0)); }, 0);
447
+ var remainingPct = +(100 - somaCCPct).toFixed((_a = this.config.percentageScale) !== null && _a !== void 0 ? _a : 4);
448
+ var remainingValor = +(valorBaseCC - somaCCValor).toFixed((_b = this.config.currencyScale) !== null && _b !== void 0 ? _b : 2);
449
+ var ccValue = null;
450
+ var percentualValue = remainingPct > 0 ? remainingPct : null;
451
+ // Usa o valor restante real (já calculado acima) em vez de recalcular via percentual,
452
+ // evitando diferenças de arredondamento acumuladas nos CCs anteriores.
453
+ var valorValue = percentualValue != null ? remainingValor : null;
454
+ if (this.editingCCIndex != null) {
455
+ var cc = ccList[this.editingCCIndex];
456
+ ccValue = { id: cc.idCentroCusto, label: cc.descCCusto || cc.idCentroCusto };
457
+ percentualValue = cc.percentual;
458
+ valorValue = cc.valor;
459
+ }
460
+ // maxPct: percentual máximo que este CC pode ter (não pode ultrapassar o restante da conta)
461
+ var maxPct = remainingPct;
462
+ // maxValor: valor máximo que este CC pode ter (não pode ultrapassar o restante em dinheiro)
463
+ var maxValor = remainingValor;
464
+ this.selectedCC = ccValue;
465
+ this.ccDialogFormGroup = this.fb.group({
466
+ centroCusto: [{ value: ccValue, disabled: this.editingCCIndex != null }, Validators.required],
467
+ percentual: [{ value: percentualValue, disabled: false }, [Validators.required, Validators.max(maxPct)]],
468
+ valor: [{ value: valorValue, disabled: false }, [Validators.required, Validators.max(maxValor)]]
469
+ });
470
+ this.ccDialogFormGroup.get('centroCusto').valueChanges
471
+ .pipe(takeUntil(this.ngUnsubscribe))
472
+ .subscribe(function (value) { return (_this.selectedCC = value || null); });
473
+ this.setupPercentualValorSync(this.ccDialogFormGroup, function () { return valorBaseCC; });
474
+ this.ccDialogFields = this.getCCDialogFields();
475
+ this.displayCCDialog = true;
476
+ };
477
+ ErpRateioEditorComponent.prototype.onSaveCCDialog = function () {
478
+ var _this = this;
479
+ var _a, _b, _c, _d;
480
+ if (this.ccDialogFormGroup.invalid) {
481
+ return;
482
+ }
483
+ var ccControl = this.ccDialogFormGroup.get('centroCusto');
484
+ var data = this.ccDialogFormGroup.getRawValue();
485
+ var centroCusto = data.centroCusto;
486
+ var percentual = Number(data.percentual) || 0;
487
+ var valor = +(Number(data.valor) || 0).toFixed((_a = this.config.currencyScale) !== null && _a !== void 0 ? _a : 2);
488
+ var conta = this.contasDataSource[this.editingCCContaIndex];
489
+ var idCentroCusto = ((_b = this.selectedCC) === null || _b === void 0 ? void 0 : _b.id) || (centroCusto === null || centroCusto === void 0 ? void 0 : centroCusto.id) || '';
490
+ // Validação analítica: CC sintético ou que não aceita rateio é inválido
491
+ var ccInvalido = ((_c = this.selectedCC) === null || _c === void 0 ? void 0 : _c.aceRat) === false
492
+ || ((_d = this.selectedCC) === null || _d === void 0 ? void 0 : _d.anaSin) === ErpRateioEditorComponent_1.ANA_SIN_SINTETICO;
493
+ if (ccInvalido) {
494
+ ccControl.setErrors({ centroCustoInvalido: true });
495
+ return;
496
+ }
497
+ // Validação de duplicidade na mesma conta (adição e edição, ignorando o item em edição)
498
+ var ccList = conta.rateiosCCusto || [];
499
+ var duplicado = ccList.some(function (cc, i) { return i !== _this.editingCCIndex && cc.idCentroCusto === idCentroCusto; });
500
+ if (duplicado) {
501
+ ccControl.setErrors({ duplicate: true });
502
+ return;
503
+ }
504
+ if (this.editingCCIndex != null) {
505
+ var cc = conta.rateiosCCusto[this.editingCCIndex];
506
+ cc.percentual = percentual;
507
+ cc.valor = valor;
508
+ }
509
+ else {
510
+ var labelCCusto = (centroCusto === null || centroCusto === void 0 ? void 0 : centroCusto.label) || '';
511
+ conta.rateiosCCusto = __spread(ccList, [{ idCentroCusto: idCentroCusto, descCCusto: labelCCusto, percentual: percentual, valor: valor }]);
512
+ }
513
+ this.contasDataSource = __spread(this.contasDataSource);
514
+ this.displayCCDialog = false;
515
+ this.emitChange();
516
+ };
517
+ ErpRateioEditorComponent.prototype.onHideCCDialog = function () {
518
+ this.displayCCDialog = false;
519
+ };
520
+ // === AÇÕES DA TABELA ===
521
+ ErpRateioEditorComponent.prototype.onDeleteSelected = function () {
522
+ var _this = this;
523
+ if (!this.selection.length) {
524
+ return;
525
+ }
526
+ var idsToRemove = new Set(this.selection.map(function (s) { return s.idContaFinanceira; }));
527
+ this.contasDataSource = this.contasDataSource.filter(function (c) { return !idsToRemove.has(c.idContaFinanceira); });
528
+ idsToRemove.forEach(function (id) { return delete _this.ccSelection[id]; });
529
+ this.selection = [];
530
+ this.emitChange();
531
+ };
532
+ /** Remove os centros de custo selecionados de uma conta financeira. */
533
+ ErpRateioEditorComponent.prototype.onDeleteSelectedCC = function (conta) {
534
+ var selecionados = this.ccSelection[conta.idContaFinanceira] || [];
535
+ if (!selecionados.length) {
536
+ this.messageService.add({
537
+ severity: 'warn',
538
+ summary: this.translate.instant('erpx.rateio_editor.erro_titulo'),
539
+ detail: this.translate.instant('erpx.rateio_editor.nenhum_centro_custo_selecionado')
540
+ });
541
+ return;
542
+ }
543
+ var idsToRemove = new Set(selecionados.map(function (cc) { return cc.idCentroCusto; }));
544
+ conta.rateiosCCusto = conta.rateiosCCusto.filter(function (cc) { return !idsToRemove.has(cc.idCentroCusto); });
545
+ this.ccSelection[conta.idContaFinanceira] = [];
546
+ this.contasDataSource = __spread(this.contasDataSource);
547
+ this.emitChange();
548
+ };
549
+ ErpRateioEditorComponent.prototype.removerConta = function (index) {
550
+ var removida = this.contasDataSource[index];
551
+ if (removida) {
552
+ delete this.ccSelection[removida.idContaFinanceira];
553
+ }
554
+ this.contasDataSource = this.contasDataSource.filter(function (_, i) { return i !== index; });
555
+ this.emitChange();
556
+ };
557
+ ErpRateioEditorComponent.prototype.removerCentroCusto = function (contaIndex, ccIndex) {
558
+ var conta = this.contasDataSource[contaIndex];
559
+ conta.rateiosCCusto = conta.rateiosCCusto.filter(function (_, i) { return i !== ccIndex; });
560
+ this.contasDataSource = __spread(this.contasDataSource);
561
+ this.emitChange();
562
+ };
563
+ ErpRateioEditorComponent.prototype.getContaIndex = function (rowData) {
564
+ return this.contasDataSource.indexOf(rowData);
565
+ };
566
+ ErpRateioEditorComponent.prototype.getCCIndex = function (conta, cc) {
567
+ return (conta.rateiosCCusto || []).indexOf(cc);
568
+ };
569
+ // === PRIVADOS ===
570
+ /** Inicializa o componente a partir dos inputs (sem chamada à API de carga). */
571
+ ErpRateioEditorComponent.prototype.inicializarPorInputs = function () {
572
+ var _a, _b, _c;
573
+ this.loadedContext = (this.initialContext || {});
574
+ this.popularComRateios(this.initialRateios || []);
575
+ if (!this.empresaId) {
576
+ this.empresaId = (_c = (_b = (_a = this.initialContext) === null || _a === void 0 ? void 0 : _a.e070fil) === null || _b === void 0 ? void 0 : _b.e070emp) === null || _c === void 0 ? void 0 : _c.id;
577
+ }
578
+ this.gridColumns = this.getGridColumns();
579
+ // Emite o estado de validade já na carga inicial (sem marcar como "sujo"),
580
+ // permitindo que o host conheça o isValid mesmo sem o usuário editar.
581
+ this.emitChange(false);
582
+ };
583
+ ErpRateioEditorComponent.prototype.carregarRateio = function () {
584
+ var _this = this;
585
+ this.loading = true;
586
+ this.service
587
+ .retornarRateio({ idMovimento: this.idMovimento, tipoMovimento: this.tipoMovimento })
588
+ .pipe(takeUntil(this.ngUnsubscribe), finalize(function () { return (_this.loading = false); }))
589
+ .subscribe(function (output) {
590
+ _this.loadedContext = output;
591
+ _this.popularComRateios(output.rateio || []);
592
+ if (!_this.empresaId) {
593
+ _this.empresaId = output.e070fil.e070emp.id;
594
+ }
595
+ _this.gridColumns = _this.getGridColumns();
596
+ // Emite o estado de validade do rateio carregado (sem marcar como "sujo").
597
+ _this.emitChange(false);
598
+ }, function (err) { var _a; return _this.error.emit({ operacao: 'load', message: ((_a = err === null || err === void 0 ? void 0 : err.error) === null || _a === void 0 ? void 0 : _a.message) || (err === null || err === void 0 ? void 0 : err.message) || _this.translate.instant('erpx.rateio_editor.erro_carregar'), originalError: err }); });
599
+ };
600
+ ErpRateioEditorComponent.prototype.popularComRateios = function (rateios) {
601
+ var _this = this;
602
+ this.contasDataSource = __spread(rateios);
603
+ this.ccSelection = {};
604
+ this.contasDataSource.forEach(function (conta) {
605
+ _this.ccSelection[conta.idContaFinanceira] = [];
606
+ });
607
+ };
608
+ Object.defineProperty(ErpRateioEditorComponent.prototype, "distribuicaoCompleta", {
609
+ /**
610
+ * Distribuição completa: restantes globais e de cada conta iguais a zero.
611
+ * Exposto publicamente para que o template possa reagir ao estado real de
612
+ * completude (contas + centros de custo).
613
+ */
614
+ get: function () {
615
+ var _this = this;
616
+ if (this.percentualRestante !== 0 || this.valorRestante !== 0) {
617
+ return false;
618
+ }
619
+ return this.contasDataSource.every(function (conta) { return _this.isContaCCCompleta(conta); });
620
+ },
621
+ enumerable: true,
622
+ configurable: true
623
+ });
624
+ /** @deprecated Usar o getter `distribuicaoCompleta`. Mantido para compatibilidade interna. */
625
+ ErpRateioEditorComponent.prototype.isDistribuicaoCompleta = function () {
626
+ return this.distribuicaoCompleta;
627
+ };
628
+ /** Indica se há ao menos uma conta financeira sem nenhum centro de custo vinculado. */
629
+ ErpRateioEditorComponent.prototype.hasContaSemCentroCusto = function () {
630
+ return this.contasDataSource.some(function (conta) { return (conta.rateiosCCusto || []).length === 0; });
631
+ };
632
+ /** Restante de % e de valor dos centros de custo de uma conta igual a zero. */
633
+ ErpRateioEditorComponent.prototype.isContaCCCompleta = function (conta) {
634
+ var _a, _b;
635
+ var ccs = conta.rateiosCCusto || [];
636
+ if (ccs.length === 0) {
637
+ // Centro de custo é sempre obrigatório: conta sem nenhum CC nunca é completa.
638
+ return false;
639
+ }
640
+ var somaPct = ccs.reduce(function (acc, cc) { return acc + (cc.percentual || 0); }, 0);
641
+ var somaValor = ccs.reduce(function (acc, cc) { return acc + (cc.valor || 0); }, 0);
642
+ var pctRestante = +(100 - somaPct).toFixed((_a = this.config.percentageScale) !== null && _a !== void 0 ? _a : 4);
643
+ var valorRestante = +((conta.valorRateadoConta || 0) - somaValor).toFixed((_b = this.config.currencyScale) !== null && _b !== void 0 ? _b : 2);
644
+ return pctRestante === 0 && valorRestante === 0;
645
+ };
646
+ ErpRateioEditorComponent.prototype.getContaDialogFields = function () {
647
+ var _this = this;
648
+ var _a, _b;
649
+ return [
650
+ new FormField(__assign(__assign({}, this.e091PlfLookup.mountOptions({
651
+ multiple: false,
652
+ formGroup: 'contaFinanceira',
653
+ queryFields: ['anaSin'],
654
+ defaultFilter: [
655
+ { field: 'excluido', operator: EnumLogicalOperator.Eq, values: ['false'] },
656
+ { field: 'sitFin', operator: EnumLogicalOperator.Eq, values: ['VA'] },
657
+ { field: 'e070emp', operator: EnumLogicalOperator.Eq, values: [this.empresaId] }
658
+ ]
659
+ })), { size: { sm: 12, md: 12, lg: 12, xl: 12 }, required: function () { return true; } })),
660
+ new FormField({
661
+ name: 'percentual',
662
+ label: this.translate.instant('erpx.rateio_editor.percentual'),
663
+ size: { sm: 12, md: 6, lg: 6, xl: 6 },
664
+ type: FieldType.Double,
665
+ precision: 7,
666
+ scale: (_a = this.config.percentageScale) !== null && _a !== void 0 ? _a : 4,
667
+ rightAddon: { label: '%' },
668
+ required: function () { return true; }
669
+ }),
670
+ new FormField({
671
+ name: 'valor',
672
+ label: this.translate.instant('erpx.rateio_editor.valor'),
673
+ size: { sm: 12, md: 6, lg: 6, xl: 6 },
674
+ type: FieldType.Money,
675
+ currenncy: function () { return _this.currencyCode; },
676
+ precision: 18,
677
+ scale: (_b = this.config.currencyScale) !== null && _b !== void 0 ? _b : 2,
678
+ required: function () { return true; }
679
+ })
680
+ ];
681
+ };
682
+ ErpRateioEditorComponent.prototype.getCCDialogFields = function () {
683
+ var _this = this;
684
+ var _a, _b;
685
+ return [
686
+ new FormField(__assign(__assign({}, this.e044CcuLookup.mountOptions({
687
+ multiple: false,
688
+ formGroup: 'centroCusto',
689
+ queryFields: ['anaSin', 'aceRat'],
690
+ defaultFilter: [
691
+ { field: 'excluido', operator: EnumLogicalOperator.Eq, values: ['false'] },
692
+ { field: 'sitCcu', operator: EnumLogicalOperator.Eq, values: ['VA'] },
693
+ { field: 'e070emp', operator: EnumLogicalOperator.Eq, values: [this.empresaId] }
694
+ ]
695
+ })), { size: { sm: 12, md: 12, lg: 12, xl: 12 }, required: function () { return true; } })),
696
+ new FormField({
697
+ name: 'percentual',
698
+ label: this.translate.instant('erpx.rateio_editor.percentual'),
699
+ size: { sm: 12, md: 6, lg: 6, xl: 6 },
700
+ type: FieldType.Double,
701
+ precision: 7,
702
+ scale: (_a = this.config.percentageScale) !== null && _a !== void 0 ? _a : 4,
703
+ rightAddon: { label: '%' },
704
+ required: function () { return true; }
705
+ }),
706
+ new FormField({
707
+ name: 'valor',
708
+ label: this.translate.instant('erpx.rateio_editor.valor'),
709
+ size: { sm: 12, md: 6, lg: 6, xl: 6 },
710
+ type: FieldType.Money,
711
+ currenncy: function () { return _this.currencyCode; },
712
+ precision: 18,
713
+ scale: (_b = this.config.currencyScale) !== null && _b !== void 0 ? _b : 2,
714
+ required: function () { return true; }
715
+ })
716
+ ];
717
+ };
718
+ /**
719
+ * Sincroniza os campos percentual e valor de um FormGroup de modal.
720
+ * Quando o usuário altera percentual, recalcula valor (percentual/100 * base).
721
+ * Quando o usuário altera valor, recalcula percentual (valor/base * 100).
722
+ * O argumento getBase retorna a base usada no cálculo (valorBase global ou valorRateadoConta da conta pai).
723
+ */
724
+ ErpRateioEditorComponent.prototype.setupPercentualValorSync = function (form, getBase) {
725
+ var _a, _b;
726
+ var percentualScale = (_a = this.config.percentageScale) !== null && _a !== void 0 ? _a : 4;
727
+ var currencyScale = (_b = this.config.currencyScale) !== null && _b !== void 0 ? _b : 2;
728
+ form.get('percentual').valueChanges
729
+ .pipe(takeUntil(this.ngUnsubscribe))
730
+ .subscribe(function (pct) {
731
+ var base = getBase();
732
+ if (pct == null || base == null) {
733
+ return;
734
+ }
735
+ var novoValor = +((Number(pct) / 100) * base).toFixed(currencyScale);
736
+ if (Number(form.get('valor').value) !== novoValor) {
737
+ form.get('valor').setValue(novoValor, { emitEvent: false });
738
+ }
739
+ });
740
+ form.get('valor').valueChanges
741
+ .pipe(takeUntil(this.ngUnsubscribe))
742
+ .subscribe(function (val) {
743
+ var base = getBase();
744
+ if (val == null || !base) {
745
+ return;
746
+ }
747
+ var novoPct = +((Number(val) / base) * 100).toFixed(percentualScale);
748
+ if (Number(form.get('percentual').value) !== novoPct) {
749
+ form.get('percentual').setValue(novoPct, { emitEvent: false });
750
+ }
751
+ });
752
+ };
753
+ ErpRateioEditorComponent.prototype.getGridColumns = function () {
754
+ return [
755
+ { field: 'contaFinanceira', header: 'erpx.rateio_editor.conta_financeira' },
756
+ { field: 'percentual', header: 'erpx.rateio_editor.percentual' },
757
+ { field: 'valorRateadoConta', header: 'erpx.rateio_editor.valor' }
758
+ ];
759
+ };
760
+ ErpRateioEditorComponent.prototype.emitChange = function (isDirty) {
761
+ if (isDirty === void 0) { isDirty = true; }
762
+ this.change.emit({
763
+ isDirty: isDirty,
764
+ isValid: this.isDistribuicaoCompleta(),
765
+ rateios: this.contasDataSource
766
+ });
767
+ };
768
+ var ErpRateioEditorComponent_1;
769
+ /** Valor de anaSin que indica registro sintético (não analítico). */
770
+ ErpRateioEditorComponent.ANA_SIN_SINTETICO = 'VS';
771
+ ErpRateioEditorComponent.ctorParameters = function () { return [
772
+ { type: FormBuilder },
773
+ { type: ErpRateioEditorService },
774
+ { type: TranslateService },
775
+ { type: E091PlfLookup },
776
+ { type: E044CcuLookup },
777
+ { type: MessageService }
778
+ ]; };
779
+ __decorate([
780
+ Input()
781
+ ], ErpRateioEditorComponent.prototype, "idMovimento", void 0);
782
+ __decorate([
783
+ Input()
784
+ ], ErpRateioEditorComponent.prototype, "tipoMovimento", void 0);
785
+ __decorate([
786
+ Input()
787
+ ], ErpRateioEditorComponent.prototype, "readOnly", void 0);
788
+ __decorate([
789
+ Input()
790
+ ], ErpRateioEditorComponent.prototype, "showSugestaoButton", void 0);
791
+ __decorate([
792
+ Input()
793
+ ], ErpRateioEditorComponent.prototype, "config", void 0);
794
+ __decorate([
795
+ Input()
796
+ ], ErpRateioEditorComponent.prototype, "initialContext", void 0);
797
+ __decorate([
798
+ Input()
799
+ ], ErpRateioEditorComponent.prototype, "initialRateios", void 0);
800
+ __decorate([
801
+ Input()
802
+ ], ErpRateioEditorComponent.prototype, "loadFromApi", void 0);
803
+ __decorate([
804
+ Input()
805
+ ], ErpRateioEditorComponent.prototype, "empresaId", void 0);
806
+ __decorate([
807
+ Input()
808
+ ], ErpRateioEditorComponent.prototype, "filialId", void 0);
809
+ __decorate([
810
+ Input()
811
+ ], ErpRateioEditorComponent.prototype, "criRat", void 0);
812
+ __decorate([
813
+ Input()
814
+ ], ErpRateioEditorComponent.prototype, "e091plfId", void 0);
815
+ __decorate([
816
+ Input()
817
+ ], ErpRateioEditorComponent.prototype, "e044ccuId", void 0);
818
+ __decorate([
819
+ Input()
820
+ ], ErpRateioEditorComponent.prototype, "idTransacao", void 0);
821
+ __decorate([
822
+ Input()
823
+ ], ErpRateioEditorComponent.prototype, "idFamilia", void 0);
824
+ __decorate([
825
+ Input()
826
+ ], ErpRateioEditorComponent.prototype, "idDerivacao", void 0);
827
+ __decorate([
828
+ Input()
829
+ ], ErpRateioEditorComponent.prototype, "idServico", void 0);
830
+ __decorate([
831
+ Input()
832
+ ], ErpRateioEditorComponent.prototype, "valorExcedente", void 0);
833
+ __decorate([
834
+ Input()
835
+ ], ErpRateioEditorComponent.prototype, "currencyCode", void 0);
836
+ __decorate([
837
+ Output()
838
+ ], ErpRateioEditorComponent.prototype, "save", void 0);
839
+ __decorate([
840
+ Output()
841
+ ], ErpRateioEditorComponent.prototype, "cancel", void 0);
842
+ __decorate([
843
+ Output()
844
+ ], ErpRateioEditorComponent.prototype, "change", void 0);
845
+ __decorate([
846
+ Output()
847
+ ], ErpRateioEditorComponent.prototype, "error", void 0);
848
+ __decorate([
849
+ ViewChild('tableRateio')
850
+ ], ErpRateioEditorComponent.prototype, "table", void 0);
851
+ ErpRateioEditorComponent = ErpRateioEditorComponent_1 = __decorate([
852
+ Component({
853
+ selector: 'erp-rateio-editor',
854
+ template: "<s-loading-state [loading]=\"loading\" [blockWindow]=\"true\">\n <!-- Se\u00E7\u00E3o 1: Informa\u00E7\u00F5es do movimento -->\n <div class=\"sds-section-title\" *ngIf=\"isReady\">\n {{ 'erpx.rateio_editor.titulo' | translate }}\n </div>\n\n <div class=\"ui-g custom-stats\" *ngIf=\"isReady\">\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n color=\"#0C9348\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-dollar-sign\"\n [label]=\"'erpx.rateio_editor.valor_base' | translate\"\n [value]=\"valorBase | numeric:numberFormatOptions | async\"\n ></s-stats-card>\n </div>\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n color=\"#428BCA\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-percent\"\n [label]=\"'erpx.rateio_editor.percentual_restante' | translate\"\n [value]=\"percentualRestanteDisplay + '%'\"\n ></s-stats-card>\n </div>\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n [color]=\"distribuicaoCompleta ? '#0C9348' : '#C13018'\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-dollar-sign\"\n [label]=\"'erpx.rateio_editor.valor_restante' | translate\"\n [value]=\"valorRestanteDisplay | numeric:numberFormatOptions | async\"\n ></s-stats-card>\n </div>\n </div>\n\n <!-- Se\u00E7\u00E3o 2: Tabela de rateios -->\n <div class=\"sds-section-title\" *ngIf=\"isReady\">\n {{ 'erpx.rateio_editor.lista_rateios' | translate }}\n </div>\n\n <s-empty-state\n *ngIf=\"isReady && contasDataSource?.length === 0\"\n iconClass=\"far fa-dollar-sign\"\n [title]=\"'erpx.rateio_editor.sem_rateios_titulo' | translate\"\n [description]=\"'erpx.rateio_editor.sem_rateios_descricao' | translate\"\n [showPrimaryAction]=\"!effectiveReadOnly\"\n [primaryActionLabel]=\"'erpx.rateio_editor.adicionar_conta' | translate\"\n (primaryAction)=\"openContaDialog()\"\n [showSecondaryAction]=\"!effectiveReadOnly && showSugestaoButton\"\n [secondaryActionLabel]=\"'erpx.rateio_editor.sugerir_rateio' | translate\"\n (secondaryAction)=\"onSugerir()\"\n ></s-empty-state>\n\n <div class=\"ui-g\" *ngIf=\"isReady && contasDataSource?.length > 0\">\n <div class=\"ui-g-12\" *ngIf=\"!effectiveReadOnly\">\n <s-button\n [label]=\"'erpx.rateio_editor.adicionar_conta' | translate\"\n iconClass=\"fa fa-plus\"\n (onClick)=\"openContaDialog()\"\n ></s-button>\n <s-button\n *ngIf=\"showSugestaoButton\"\n [label]=\"'erpx.rateio_editor.sugerir_rateio' | translate\"\n [priority]=\"ButtonPriority.Secondary\"\n iconClass=\"fa fa-magic\"\n (onClick)=\"onSugerir()\"\n ></s-button>\n <s-button\n [label]=\"'erpx.rateio_editor.remover_conta' | translate\"\n [priority]=\"ButtonPriority.Secondary\"\n (onClick)=\"onDeleteSelected()\"\n [disabled]=\"!selection.length\"\n ></s-button>\n </div>\n\n <div class=\"ui-g-12\">\n <p-table\n #tableRateio\n [value]=\"contasDataSource\"\n [columns]=\"gridColumns\"\n dataKey=\"idContaFinanceira\"\n [resizableColumns]=\"true\"\n [totalRecords]=\"contasDataSource.length\"\n [(selection)]=\"selection\"\n [paginator]=\"false\"\n [rows]=\"10\"\n >\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th scope=\"col\" style=\"width: 3em\"></th>\n <th scope=\"col\" class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableHeaderCheckbox *ngIf=\"!effectiveReadOnly\"></p-tableHeaderCheckbox>\n </th>\n <th *ngFor=\"let col of columns\" scope=\"col\" pResizableColumn>\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ col.header | translate }}</span>\n </div>\n </th>\n <th scope=\"col\" *ngIf=\"!effectiveReadOnly\">\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ 'erpx.rateio_editor.acoes' | translate }}</span>\n </div>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\" let-expanded=\"expanded\">\n <tr>\n <td style=\"width: 3em; text-align: center\">\n <a *ngIf=\"rowData.rateiosCCusto?.length || !effectiveReadOnly\" [pRowToggler]=\"rowData\" role=\"button\" tabindex=\"0\">\n <i [class]=\"expanded ? 'fa fa-minus' : 'fa fa-plus'\"></i>\n </a>\n </td>\n <td class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableCheckbox *ngIf=\"!effectiveReadOnly\" [value]=\"rowData\"></p-tableCheckbox>\n </td>\n <td>{{ rowData.contaFinanceira || rowData.idContaFinanceira }}</td>\n <td style=\"text-align: right\">{{ rowData.percentual }}</td>\n <td style=\"text-align: right\">{{ rowData.valorRateadoConta | numeric:numberFormatOptions | async }}</td>\n <td *ngIf=\"!effectiveReadOnly\">\n <s-button\n [auxiliary]=\"true\"\n [priority]=\"ButtonPriority.Default\"\n [size]=\"ButtonSize.Small\"\n iconClass=\"fa fa-pencil\"\n [label]=\"'erpx.rateio_editor.editar' | translate\"\n (onClick)=\"openContaDialog(getContaIndex(rowData))\"\n ></s-button>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"rowexpansion\" let-rowData let-rowIndex=\"rowIndex\">\n <tr>\n <td [attr.colspan]=\"effectiveReadOnly ? gridColumns.length + 2 : gridColumns.length + 3\">\n <div class=\"ui-g\" style=\"padding: 8px 16px\">\n <div class=\"ui-g-12 rateio-cc-toolbar\" *ngIf=\"!effectiveReadOnly\">\n <s-button\n [label]=\"'erpx.rateio_editor.adicionar_centro_custo' | translate\"\n iconClass=\"fa fa-plus\"\n (onClick)=\"openCCDialog(getContaIndex(rowData))\"\n ></s-button>\n <s-button\n [label]=\"'erpx.rateio_editor.remover_centro_custo' | translate\"\n [priority]=\"ButtonPriority.Secondary\"\n (onClick)=\"onDeleteSelectedCC(rowData)\"\n [disabled]=\"!(ccSelection[rowData.idContaFinanceira]?.length)\"\n ></s-button>\n </div>\n <div class=\"ui-g-12\">\n <p-table\n [value]=\"rowData.rateiosCCusto\"\n dataKey=\"idCentroCusto\"\n [(selection)]=\"ccSelection[rowData.idContaFinanceira]\"\n [responsive]=\"true\"\n >\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"col\" class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableHeaderCheckbox *ngIf=\"!effectiveReadOnly\"></p-tableHeaderCheckbox>\n </th>\n <th scope=\"col\">{{ 'erpx.rateio_editor.centro_custo' | translate }}</th>\n <th scope=\"col\">{{ 'erpx.rateio_editor.percentual' | translate }}</th>\n <th scope=\"col\">{{ 'erpx.rateio_editor.valor' | translate }}</th>\n <th scope=\"col\" *ngIf=\"!effectiveReadOnly\">{{ 'erpx.rateio_editor.acoes' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-cc let-ccIndex=\"rowIndex\">\n <tr>\n <td class=\"col-checkbox\" style=\"width: 50px\">\n <p-tableCheckbox *ngIf=\"!effectiveReadOnly\" [value]=\"cc\"></p-tableCheckbox>\n </td>\n <td>{{ cc.descCCusto || cc.idCentroCusto }}</td>\n <td style=\"text-align: right\">{{ cc.percentual }}</td>\n <td style=\"text-align: right\">{{ cc.valor | numeric:numberFormatOptions | async }}</td>\n <td *ngIf=\"!effectiveReadOnly\">\n <s-button\n [auxiliary]=\"true\"\n [priority]=\"ButtonPriority.Default\"\n [size]=\"ButtonSize.Small\"\n iconClass=\"fa fa-pencil\"\n [label]=\"'erpx.rateio_editor.editar' | translate\"\n (onClick)=\"openCCDialog(getContaIndex(rowData), getCCIndex(rowData, cc))\"\n ></s-button>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [attr.colspan]=\"effectiveReadOnly ? 3 : 5\">\n {{ 'erpx.rateio_editor.sem_centros_custo' | translate }}\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n\n <!-- Bot\u00F5es de a\u00E7\u00E3o -->\n <div *ngIf=\"isReady\" class=\"ui-g rateio-editor-actions\">\n <div class=\"ui-g-12\">\n <s-button\n *ngIf=\"!effectiveReadOnly && !isStandalone\"\n priority=\"primary\"\n iconClass=\"fa fa-check\"\n [label]=\"'erpx.rateio_editor.salvar' | translate\"\n (onClick)=\"onSalvar()\"\n ></s-button>\n </div>\n </div>\n</s-loading-state>\n\n<!-- Modal: Adicionar/Editar Conta Financeira -->\n<p-dialog\n [header]=\"'erpx.rateio_editor.adicionar_conta' | translate\"\n appendTo=\"body\"\n [modal]=\"true\"\n [(visible)]=\"displayContaDialog\"\n (onHide)=\"onHideContaDialog()\"\n [blockScroll]=\"true\"\n [focusOnShow]=\"false\"\n styleClass=\"custom-dialog\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [style]=\"{width: '40%'}\"\n>\n <form *ngIf=\"contaDialogFormGroup\" [formGroup]=\"contaDialogFormGroup\" (ngSubmit)=\"onSaveContaDialog()\">\n <div class=\"ui-fluid\">\n <s-dynamic-form\n [fields]=\"contaDialogFields\"\n [form]=\"contaDialogFormGroup\"\n [errorMessages]=\"{\n required: ('erpx.rateio_editor.erro_obrigatorio' | translate),\n duplicate: ('erpx.rateio_editor.conta_duplicada' | translate),\n contaSintetica: ('erpx.rateio_editor.erro_conta_sintetica' | translate),\n max: ('erpx.rateio_editor.erro_valor_maximo_conta' | translate)\n }\"\n ></s-dynamic-form>\n </div>\n </form>\n <p-footer>\n <s-button\n id=\"dialog-conta-save\"\n type=\"button\"\n priority=\"primary\"\n [label]=\"'erpx.rateio_editor.salvar' | translate\"\n (onClick)=\"onSaveContaDialog()\"\n ></s-button>\n <s-button\n id=\"dialog-conta-cancel\"\n type=\"button\"\n priority=\"secondary\"\n [label]=\"'erpx.rateio_editor.cancelar' | translate\"\n (onClick)=\"onHideContaDialog()\"\n ></s-button>\n </p-footer>\n</p-dialog>\n\n<!-- Modal: Adicionar/Editar Centro de Custo -->\n<p-dialog\n [header]=\"'erpx.rateio_editor.adicionar_centro_custo' | translate\"\n appendTo=\"body\"\n [modal]=\"true\"\n [(visible)]=\"displayCCDialog\"\n (onHide)=\"onHideCCDialog()\"\n [blockScroll]=\"true\"\n [focusOnShow]=\"false\"\n styleClass=\"custom-dialog\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [style]=\"{width: '40%'}\"\n>\n <form *ngIf=\"ccDialogFormGroup\" [formGroup]=\"ccDialogFormGroup\" (ngSubmit)=\"onSaveCCDialog()\">\n <div class=\"ui-fluid\">\n <s-dynamic-form\n [fields]=\"ccDialogFields\"\n [form]=\"ccDialogFormGroup\"\n [errorMessages]=\"{\n required: ('erpx.rateio_editor.erro_obrigatorio' | translate),\n duplicate: ('erpx.rateio_editor.centro_custo_duplicado' | translate),\n centroCustoInvalido: ('erpx.rateio_editor.erro_centro_custo_invalido' | translate),\n max: ('erpx.rateio_editor.erro_maximo_centro_custo' | translate)\n }\"\n ></s-dynamic-form>\n </div>\n </form>\n <p-footer>\n <s-button\n id=\"dialog-cc-save\"\n type=\"button\"\n priority=\"primary\"\n [label]=\"'erpx.rateio_editor.salvar' | translate\"\n (onClick)=\"onSaveCCDialog()\"\n ></s-button>\n <s-button\n id=\"dialog-cc-cancel\"\n type=\"button\"\n priority=\"secondary\"\n [label]=\"'erpx.rateio_editor.cancelar' | translate\"\n (onClick)=\"onHideCCDialog()\"\n ></s-button>\n </p-footer>\n</p-dialog>\n",
855
+ styles: [":host ::ng-deep .rateio-cc-toolbar .s-button-text{overflow:visible;-ms-flex-pack:start;justify-content:flex-start}"]
856
+ })
857
+ ], ErpRateioEditorComponent);
858
+ return ErpRateioEditorComponent;
859
+ }());
860
+ export { ErpRateioEditorComponent };
861
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJwLXJhdGVpby1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNlbmlvci1nZXN0YW8tZW1wcmVzYXJpYWwvZXJweC1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9yYXRlaW8tZWRpdG9yL2VycC1yYXRlaW8tZWRpdG9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUF3QixNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2SCxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNsSCxPQUFPLEVBQ0gsY0FBYyxFQUNkLFVBQVUsRUFDVixTQUFTLEVBQ1QsU0FBUyxFQUNaLE1BQU0sb0NBQW9DLENBQUM7QUFFNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBa0JyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBT3pDO0lBME5JLGtDQUNxQixFQUFlLEVBQ2YsT0FBK0IsRUFDL0IsU0FBMkIsRUFDM0IsYUFBNEIsRUFDNUIsYUFBNEIsRUFDNUIsY0FBOEI7UUFMOUIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFlBQU8sR0FBUCxPQUFPLENBQXdCO1FBQy9CLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLGtC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K0RBQW1CO0lBS2xCO1FBQVIsS0FBSyxFQUFFO2lFQUFxQjtJQUtwQjtRQUFSLEtBQUssRUFBRTsrREFBbUI7SUFNbEI7UUFBUixLQUFLLEVBQUU7b0VBQXdCO0lBTXZCO1FBQVIsS0FBSyxFQUFFO2tFQUFzQjtJQUdwQjtRQUFULE1BQU0sRUFBRTswREFBNEM7SUFDM0M7UUFBVCxNQUFNLEVBQUU7NERBQW1DO0lBQ2xDO1FBQVQsTUFBTSxFQUFFOzREQUFnRDtJQUMvQztRQUFULE1BQU0sRUFBRTsyREFBOEM7SUFHN0I7UUFBekIsU0FBUyxDQUFDLGFBQWEsQ0FBQzsyREFBdUI7SUF4R3ZDLHdCQUF3QjtRQUxwQyxTQUFTLENBQUM7WUFDUCxRQUFRLEVBQUUsbUJBQW1CO1lBQzdCLG1tZkFBaUQ7O1NBRXBELENBQUM7T0FDVyx3QkFBd0IsQ0E4MUJwQztJQUFELCtCQUFDO0NBQUEsQUE5MUJELElBODFCQztTQTkxQlksd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEUwNDRDY3VMb29rdXAsIEUwOTFQbGZMb29rdXAsIEVudW1Mb2dpY2FsT3BlcmF0b3IgfSBmcm9tICdAc2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtcbiAgICBCdXR0b25Qcmlvcml0eSxcbiAgICBCdXR0b25TaXplLFxuICAgIEZpZWxkVHlwZSxcbiAgICBGb3JtRmllbGRcbn0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cyc7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmluYWxpemUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEVycFJhdGVpb0VkaXRvclNlcnZpY2UgfSBmcm9tICcuL2VycC1yYXRlaW8tZWRpdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgICBHcmF2YXJSYXRlaW9NYW51YWxJbnB1dCxcbiAgICBJbnRlZ3JhY2FvQ29udHJvbGFkb3JpYSxcbiAgICBSYXRlaW9DaGFuZ2VFdmVudCxcbiAgICBSYXRlaW9Db250YSxcbiAgICBSYXRlaW9DQ3VzdG8sXG4gICAgUmF0ZWlvRWRpdG9yQ29uZmlnLFxuICAgIFJhdGVpb0Vycm9yRXZlbnQsXG4gICAgUmF0ZWlvU2F2ZUV2ZW50LFxuICAgIFJldG9ybmFyUmF0ZWlvT3V0cHV0LFxuICAgIFN1Z2VyaXJSYXRlaW9JbnB1dCxcbiAgICBTdWdlcmlyUmF0ZWlvUGFyYW1ldHJvLFxuICAgIFRpcG9Nb3ZpbWVudG8sXG4gICAgQ3JpdGVyaW9SYXRlaW8sXG4gICAgQ29udGFGaW5hbmNlaXJhTG9va3VwLFxuICAgIENlbnRyb0N1c3RvTG9va3VwXG59IGZyb20gJy4vZXJwLXJhdGVpby1lZGl0b3IudHlwZXMnO1xuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdlcnAtcmF0ZWlvLWVkaXRvcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2VycC1yYXRlaW8tZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9lcnAtcmF0ZWlvLWVkaXRvci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEVycFJhdGVpb0VkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblxuICAgIC8qKiBWYWxvciBkZSBhbmFTaW4gcXVlIGluZGljYSByZWdpc3RybyBzaW50w6l0aWNvIChuw6NvIGFuYWzDrXRpY28pLiAqL1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFOQV9TSU5fU0lOVEVUSUNPID0gJ1ZTJztcblxuICAgIC8vID09PSBJTlBVVFMgPT09XG4gICAgQElucHV0KCkgaWRNb3ZpbWVudG86IHN0cmluZztcbiAgICBASW5wdXQoKSB0aXBvTW92aW1lbnRvOiBUaXBvTW92aW1lbnRvO1xuICAgIEBJbnB1dCgpIHJlYWRPbmx5ID0gZmFsc2U7XG4gICAgQElucHV0KCkgc2hvd1N1Z2VzdGFvQnV0dG9uID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBjb25maWc6IFJhdGVpb0VkaXRvckNvbmZpZztcblxuICAgIC8qKlxuICAgICAqIENvbnRleHRvIGluaWNpYWwgdXNhZG8gcXVhbmRvIG8gY29tcG9uZW50ZSDDqSBhbGltZW50YWRvIHBvciBpbnB1dHMgZW0gdmV6IGRhIEFQSS5cbiAgICAgKiBBcGxpY2Etc2UgYW8gbW9kbyBzdGFuZGFsb25lIChzZW0gaWRNb3ZpbWVudG8pIGUgYW8gbW9kbyBjb25lY3RhZG8gY29tXG4gICAgICogbG9hZEZyb21BcGkgPSBmYWxzZS4gRm9ybmVjZSB2YWxvckJhc2UsIGZpbGlhbCwgY3JpdMOpcmlvLCBhZ3J1cGFkb3JJZCwgZGF0YXMsIGV0Yy5cbiAgICAgKiBFbSBtb2RvIGNvbmVjdGFkbyBzZW0gY2FyZ2EgdmlhIEFQSSwgw6kgZGVzdGUgY29udGV4dG8gcXVlIGEgZ3JhdmHDp8Ojb1xuICAgICAqIChncmF2YXJSYXRlaW9NYW51YWwpIG9idMOpbSBlMDcwZmlsLCBjcmlSYXQsIGRhdGFCYXNlLCBkYXRhTW92aW1lbnRvIGUgYWdydXBhZG9ySWQuXG4gICAgICovXG4gICAgQElucHV0KCkgaW5pdGlhbENvbnRleHQ/OiBQYXJ0aWFsPFJldG9ybmFyUmF0ZWlvT3V0cHV0PjtcblxuICAgIC8qKiBSYXRlaW9zIGluaWNpYWlzIHBhcmEgcG9wdWxhciBhIGdyaWQgcXVhbmRvIGFsaW1lbnRhZG8gcG9yIGlucHV0cy4gKi9cbiAgICBASW5wdXQoKSBpbml0aWFsUmF0ZWlvcz86IFJhdGVpb0NvbnRhW107XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9sYSBzZSBvIHJhdGVpbyBkZXZlIHNlciBjYXJyZWdhZG8gYXV0b21hdGljYW1lbnRlIHZpYSBBUEkgcXVhbmRvXG4gICAgICogaWRNb3ZpbWVudG8gZXN0w6EgcHJlc2VudGUgKG1vZG8gY29uZWN0YWRvKS4gRGVmYXVsdDogdHJ1ZS5cbiAgICAgKlxuICAgICAqIERlZmluYSBjb21vIGZhbHNlIHBhcmEgcmVzdGF1cmFyIHVtIHJhdGVpbyBxdWUgbyB1c3XDoXJpbyBqw6EgZGlzdHJpYnVpdSBlIHF1ZVxuICAgICAqIGFpbmRhIG7Do28gZm9pIHBlcnNpc3RpZG8gbm8gYmFja2VuZCBkZSByYXRlaW86IG8gY29tcG9uZW50ZSBwb3B1bGEgYSBncmlkIGFcbiAgICAgKiBwYXJ0aXIgZGUgaW5pdGlhbENvbnRleHQvaW5pdGlhbFJhdGVpb3MgZSBtYW50w6ltIG8gYm90w6NvIFNhbHZhciBlIGEgZ3JhdmHDp8Ojb1xuICAgICAqIHZpbmN1bGFkYSBhbyBtb3ZpbWVudG8uXG4gICAgICovXG4gICAgQElucHV0KCkgbG9hZEZyb21BcGkgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogSUQgZGEgZW1wcmVzYSB1c2FkbyBwYXJhIGZpbHRyYXIgb3MgbG9va3VwcyBkZSBjb250YSBmaW5hbmNlaXJhIGUgY2VudHJvIGRlIGN1c3RvLlxuICAgICAqIFF1YW5kbyBpbmZvcm1hZG8sIHNvYnJlc2NyZXZlIG8gSUQgZGVyaXZhZG8gZG8gY29udGV4dG8gY2FycmVnYWRvL2luaWNpYWwuXG4gICAgICovXG4gICAgQElucHV0KCkgZW1wcmVzYUlkOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBJRCBkYSBmaWxpYWwgdXNhZG8gcGVsYSBBUEkgZGUgc3VnZXN0w6NvIGRlIHJhdGVpby5cbiAgICAgKiBRdWFuZG8gaW5mb3JtYWRvLCB0ZW0gcHJpb3JpZGFkZSBzb2JyZSBvIElEIGRlcml2YWRvIGRvIGNvbnRleHRvLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGZpbGlhbElkOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBDcml0w6lyaW8gZGUgcmF0ZWlvIHBhZHLDo28gdXNhZG8gcGVsYSBBUEkgZGUgc3VnZXN0w6NvLlxuICAgICAqIERlZmF1bHQ6ICdWMycgKERlc3Blc2FzIOKAlCBDb250YSBYIEMuIEN1c3RvcykuXG4gICAgICovXG4gICAgQElucHV0KCkgY3JpUmF0OiBDcml0ZXJpb1JhdGVpbyA9ICdWMyc7XG5cbiAgICAvKipcbiAgICAgKiBJRCBkYSBjb250YSBmaW5hbmNlaXJhIChlMDkxcGxmKSBwYXJhIGZpbHRyYXIgYSBzdWdlc3TDo28gZGUgcmF0ZWlvLlxuICAgICAqIFF1YW5kbyBpbmZvcm1hZG8sIMOpIGVudmlhZG8gY29tbyBwYXLDom1ldHJvIG5hIEFQSSBzdWdlcmlyUmF0ZWlvLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGUwOTFwbGZJZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSUQgZG8gY2VudHJvIGRlIGN1c3RvIChlMDQ0Y2N1KSBwYXJhIGZpbHRyYXIgYSBzdWdlc3TDo28gZGUgcmF0ZWlvLlxuICAgICAqIFF1YW5kbyBpbmZvcm1hZG8sIMOpIGVudmlhZG8gY29tbyBwYXLDom1ldHJvIG5hIEFQSSBzdWdlcmlyUmF0ZWlvLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGUwNDRjY3VJZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSUQgZGEgdHJhbnNhw6fDo28gdXNhZGEgcGFyYSBmaWx0cmFyIGEgc3VnZXN0w6NvIGRlIHJhdGVpby5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBpZFRyYW5zYWNhbzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSUQgZGEgZmFtw61saWEgdXNhZGEgcGFyYSBmaWx0cmFyIGEgc3VnZXN0w6NvIGRlIHJhdGVpby5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBpZEZhbWlsaWE6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIElEIGRhIGRlcml2YcOnw6NvIHVzYWRhIHBhcmEgZmlsdHJhciBhIHN1Z2VzdMOjbyBkZSByYXRlaW8uXG4gICAgICovXG4gICAgQElucHV0KCkgaWREZXJpdmFjYW86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIElEIGRvIHNlcnZpw6dvIHVzYWRvIHBhcmEgZmlsdHJhciBhIHN1Z2VzdMOjbyBkZSByYXRlaW8uXG4gICAgICovXG4gICAgQElucHV0KCkgaWRTZXJ2aWNvOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBWYWxvciBleGNlZGVudGUgaW5mb3JtYWRvIHBhcmEgYSBzdWdlc3TDo28gZGUgcmF0ZWlvLlxuICAgICAqIFF1YW5kbyBpbmZvcm1hZG8sIMOpIGVudmlhZG8gY29tbyBwYXLDom1ldHJvIG5hIEFQSSBzdWdlcmlyUmF0ZWlvLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHZhbG9yRXhjZWRlbnRlOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBDw7NkaWdvIElTTyBkYSBtb2VkYSBwYXJhIGZvcm1hdGHDp8OjbyBkZSB2YWxvcmVzIG5hIGdyaWQgKGV4OiAnQlJMJywgJ1VTRCcpLlxuICAgICAqIFNlIG7Do28gaW5mb3JtYWRvLCB1c2EgZXN0aWxvIGRlY2ltYWwgc2VtIHPDrW1ib2xvLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGN1cnJlbmN5Q29kZTogc3RyaW5nO1xuXG4gICAgLy8gPT09IE9VVFBVVFMgPT09XG4gICAgQE91dHB1dCgpIHNhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPFJhdGVpb1NhdmVFdmVudD4oKTtcbiAgICBAT3V0cHV0KCkgY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAgIEBPdXRwdXQoKSBjaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFJhdGVpb0NoYW5nZUV2ZW50PigpO1xuICAgIEBPdXRwdXQoKSBlcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8UmF0ZWlvRXJyb3JFdmVudD4oKTtcblxuICAgIC8vID09PSBSRUZFUsOKTkNJQVMgRE8gVEVNUExBVEUgPT09XG4gICAgQFZpZXdDaGlsZCgndGFibGVSYXRlaW8nKSByZWFkb25seSB0YWJsZTogVGFibGU7XG5cbiAgICAvLyA9PT0gQ09OU1RBTlRFUyBFWFBPU1RBUyBBTyBURU1QTEFURSA9PT1cbiAgICByZWFkb25seSBCdXR0b25Qcmlvcml0eSA9IEJ1dHRvblByaW9yaXR5O1xuICAgIHJlYWRvbmx5IEJ1dHRvblNpemUgPSBCdXR0b25TaXplO1xuXG4gICAgLy8gPT09IEVTVEFETyA9PT1cbiAgICBwdWJsaWMgZm9ybUdyb3VwOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcbiAgICBwdWJsaWMgbG9hZGVkQ29udGV4dDogUmV0b3JuYXJSYXRlaW9PdXRwdXQ7XG4gICAgcHVibGljIHNlbGVjdGlvbjogYW55W10gPSBbXTtcbiAgICAvKiogU2VsZcOnw6NvIGRlIGNlbnRyb3MgZGUgY3VzdG8gcG9yIGNvbnRhIGZpbmFuY2VpcmEgKGtleWVkIHBvciBpZENvbnRhRmluYW5jZWlyYSkuICovXG4gICAgcHVibGljIGNjU2VsZWN0aW9uOiB7IFtpZENvbnRhRmluYW5jZWlyYTogc3RyaW5nXTogUmF0ZWlvQ0N1c3RvW10gfSA9IHt9O1xuICAgIHB1YmxpYyBncmlkQ29sdW1uczogYW55W107XG4gICAgcHVibGljIGNvbnRhc0RhdGFTb3VyY2U6IFJhdGVpb0NvbnRhW10gPSBbXTtcbiAgICBwdWJsaWMgZWRpdGluZ1Jvd0JhY2t1cDogUmF0ZWlvQ29udGEgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgZWRpdGluZ0NDQmFja3VwOiBSYXRlaW9DQ3VzdG8gfCBudWxsID0gbnVsbDtcblxuICAgIC8qKiDDmmx0aW1vIHZhbG9yIHNlbGVjaW9uYWRvIG5vIGxvb2t1cCBkZSBjb250YSAoY2FycmVnYSBhbmFTaW4gcGFyYSB2YWxpZGHDp8OjbykuICovXG4gICAgcHVibGljIHNlbGVjdGVkQ29udGE6IENvbnRhRmluYW5jZWlyYUxvb2t1cCB8IG51bGwgPSBudWxsO1xuICAgIC8qKiDDmmx0aW1vIHZhbG9yIHNlbGVjaW9uYWRvIG5vIGxvb2t1cCBkZSBjZW50cm8gZGUgY3VzdG8gKGNhcnJlZ2EgYW5hU2luL2FjZVJhdCkuICovXG4gICAgcHVibGljIHNlbGVjdGVkQ0M6IENlbnRyb0N1c3RvTG9va3VwIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvLyA9PT0gTU9EQUwgQ09OVEEgRklOQU5DRUlSQSA9PT1cbiAgICBwdWJsaWMgZGlzcGxheUNvbnRhRGlhbG9nID0gZmFsc2U7XG4gICAgcHVibGljIGNvbnRhRGlhbG9nRm9ybUdyb3VwOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIGNvbnRhRGlhbG9nRmllbGRzOiBGb3JtRmllbGRbXTtcbiAgICBwdWJsaWMgZWRpdGluZ0NvbnRhSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gPT09IE1PREFMIENFTlRSTyBERSBDVVNUTyA9PT1cbiAgICBwdWJsaWMgZGlzcGxheUNDRGlhbG9nID0gZmFsc2U7XG4gICAgcHVibGljIGNjRGlhbG9nRm9ybUdyb3VwOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIGNjRGlhbG9nRmllbGRzOiBGb3JtRmllbGRbXTtcbiAgICBwdWJsaWMgZWRpdGluZ0NDQ29udGFJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGVkaXRpbmdDQ0luZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBwdWJsaWMgZ2V0IGVmZmVjdGl2ZVJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpYzogSW50ZWdyYWNhb0NvbnRyb2xhZG9yaWEgfCB1bmRlZmluZWQgPSB0aGlzLmxvYWRlZENvbnRleHQ/LmludGVncmFjYW9Db250cm9sYWRvcmlhO1xuICAgICAgICBjb25zdCBoYXNJbnRlZ3JhY2FvID0gISFpYyAmJiAoXG4gICAgICAgICAgICBpYy5jb250YWJpbGlkYWRlID09PSB0cnVlIHx8XG4gICAgICAgICAgICBpYy50cmlidXRvcyA9PT0gdHJ1ZSB8fFxuICAgICAgICAgICAgaWMucGF0cmltb25pbyA9PT0gdHJ1ZVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkT25seSB8fCBoYXNJbnRlZ3JhY2FvO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29udGFzRm9ybUFycmF5KCk6IEZvcm1BcnJheSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5nZXQoJ2NvbnRhcycpIGFzIEZvcm1BcnJheTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZhbG9yQmFzZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZWRDb250ZXh0Py52YWxvckJhc2UgPz8gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBlcmNlbnR1YWxSZXN0YW50ZSgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBzb21hID0gdGhpcy5jb250YXNEYXRhU291cmNlLnJlZHVjZShcbiAgICAgICAgICAgIChhY2MsIGNvbnRhKSA9PiBhY2MgKyAoY29udGEucGVyY2VudHVhbCB8fCAwKSwgMFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gKygxMDAgLSBzb21hKS50b0ZpeGVkKHRoaXMuY29uZmlnLnBlcmNlbnRhZ2VTY2FsZSA/PyA0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZhbG9yUmVzdGFudGUoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3Qgc29tYSA9IHRoaXMuY29udGFzRGF0YVNvdXJjZS5yZWR1Y2UoXG4gICAgICAgICAgICAoYWNjLCBjb250YSkgPT4gYWNjICsgKGNvbnRhLnZhbG9yUmF0ZWFkb0NvbnRhIHx8IDApLCAwXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiArKHRoaXMudmFsb3JCYXNlIC0gc29tYSkudG9GaXhlZCh0aGlzLmNvbmZpZy5jdXJyZW5jeVNjYWxlID8/IDIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbG9yIHJlc3RhbnRlIGEgc2VyIGV4aWJpZG8gbm9zIGNhcmRzIGRlIHJlc3Vtby5cbiAgICAgKiBDb25zaWRlcmEgbyB0b3RhbCBqw6EgZGlzdHJpYnXDrWRvIG5vcyBjZW50cm9zIGRlIGN1c3RvIGRlIHRvZGFzIGFzIGNvbnRhc1xuICAgICAqIChlIG7Do28gbyB0b3RhbCBkYXMgY29udGFzIGZpbmFuY2VpcmFzKSwgcmVmbGV0aW5kbyBhIGRpc3RyaWJ1acOnw6NvIHJlYWxcbiAgICAgKiBwb250YS1hLXBvbnRhIOKAlCBjZW50cm8gZGUgY3VzdG8gw6kgc2VtcHJlIG9icmlnYXTDs3Jpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZhbG9yUmVzdGFudGVEaXNwbGF5KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRvdGFsQ0MgPSB0aGlzLmNvbnRhc0RhdGFTb3VyY2UucmVkdWNlKFxuICAgICAgICAgICAgKGFjYywgY29udGEpID0+IGFjYyArIChjb250YS5yYXRlaW9zQ0N1c3RvIHx8IFtdKS5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGNjQWNjLCBjYykgPT4gY2NBY2MgKyAoY2MudmFsb3IgfHwgMCksIDBcbiAgICAgICAgICAgICksIDBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuICsodGhpcy52YWxvckJhc2UgLSB0b3RhbENDKS50b0ZpeGVkKHRoaXMuY29uZmlnLmN1cnJlbmN5U2NhbGUgPz8gMik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyY2VudHVhbCByZXN0YW50ZSBhIHNlciBleGliaWRvIG5vcyBjYXJkcyBkZSByZXN1bW8uXG4gICAgICogRGVyaXZhZG8gZGUgYHZhbG9yUmVzdGFudGVEaXNwbGF5YCBwYXJhIG1hbnRlciBjb25zaXN0w6puY2lhIGNvbSBvIHZhbG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGVyY2VudHVhbFJlc3RhbnRlRGlzcGxheSgpOiBudW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMudmFsb3JCYXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKyh0aGlzLnZhbG9yUmVzdGFudGVEaXNwbGF5IC8gdGhpcy52YWxvckJhc2UgKiAxMDApLnRvRml4ZWQodGhpcy5jb25maWcucGVyY2VudGFnZVNjYWxlID8/IDQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbnVtYmVyRm9ybWF0T3B0aW9ucygpOiBhbnkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW5jeUNvZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbnVtYmVyRm9ybWF0T3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZTogJ2N1cnJlbmN5JyxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVuY3k6IHRoaXMuY3VycmVuY3lDb2RlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbnVtYmVyRm9ybWF0T3B0aW9uczoge1xuICAgICAgICAgICAgICAgIHN0eWxlOiAnZGVjaW1hbCcsXG4gICAgICAgICAgICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiB0aGlzLmNvbmZpZy5jdXJyZW5jeVNjYWxlID8/IDIsXG4gICAgICAgICAgICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiB0aGlzLmNvbmZpZy5jdXJyZW5jeVNjYWxlID8/IDJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZTogRXJwUmF0ZWlvRWRpdG9yU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZTA5MVBsZkxvb2t1cDogRTA5MVBsZkxvb2t1cCxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBlMDQ0Q2N1TG9va3VwOiBFMDQ0Q2N1TG9va3VwLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgY29udGFzOiB0aGlzLmZiLmFycmF5KFtdKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBjb25zdCBtb3ZpbWVudG9DaGFuZ2VkID0gY2hhbmdlcy5pZE1vdmltZW50byB8fCBjaGFuZ2VzLnRpcG9Nb3ZpbWVudG87XG5cbiAgICAgICAgaWYgKG1vdmltZW50b0NoYW5nZWQgJiYgdGhpcy5pZE1vdmltZW50byAmJiB0aGlzLnRpcG9Nb3ZpbWVudG8gJiYgdGhpcy5sb2FkRnJvbUFwaSkge1xuICAgICAgICAgICAgLy8gTW9kbyBjb25lY3RhZG8gY29tIGNhcmdhIHZpYSBBUElcbiAgICAgICAgICAgIHRoaXMuY2FycmVnYXJSYXRlaW8oKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzSW5wdXREcml2ZW4gJiYgKGNoYW5nZXMuaW5pdGlhbENvbnRleHQgfHwgY2hhbmdlcy5pbml0aWFsUmF0ZWlvcyB8fCBjaGFuZ2VzLmxvYWRGcm9tQXBpIHx8IG1vdmltZW50b0NoYW5nZWQpKSB7XG4gICAgICAgICAgICAvLyBBbGltZW50YWRvIHBvciBpbnB1dHM6IG1vZG8gc3RhbmRhbG9uZSBPVSBjb25lY3RhZG8gc2VtIGNhcmdhIHZpYSBBUElcbiAgICAgICAgICAgIHRoaXMuaW5pY2lhbGl6YXJQb3JJbnB1dHMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBSZXRvcm5hIG8gY29udGXDumRvIGF0dWFsIGRhIGdyaWQgKHVzbyBzdGFuZGFsb25lIOKAlCBxdWVtIGNvbnNvbWUgbMOqIG9zIHJhdGVpb3MgZGFxdWkpLiAqL1xuICAgIHB1YmxpYyBnZXQgcmF0ZWlvcygpOiBSYXRlaW9Db250YVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFzRGF0YVNvdXJjZTtcbiAgICB9XG5cbiAgICAvKiogSW5kaWNhIHNlIG8gY29tcG9uZW50ZSBlc3TDoSBvcGVyYW5kbyBzZW0gaWRNb3ZpbWVudG8gKG1vZG8gc3RhbmRhbG9uZSkuICovXG4gICAgcHVibGljIGdldCBpc1N0YW5kYWxvbmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pZE1vdmltZW50bztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2Egc2UgbyBjb21wb25lbnRlIMOpIGFsaW1lbnRhZG8gcG9yIGlucHV0cyBlbSB2ZXogZGEgQVBJOlxuICAgICAqIG1vZG8gc3RhbmRhbG9uZSAoc2VtIGlkTW92aW1lbnRvKSBPVSBtb2RvIGNvbmVjdGFkbyBjb20gbG9hZEZyb21BcGkgPSBmYWxzZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzSW5wdXREcml2ZW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU3RhbmRhbG9uZSB8fCAhdGhpcy5sb2FkRnJvbUFwaTtcbiAgICB9XG5cbiAgICAvKiogSW5kaWNhIHNlIG8gY29tcG9uZW50ZSBlc3TDoSBwcm9udG8gcGFyYSBleGliaXIgVUkgKGNhcnJlZ291IHZpYSBBUEkgT1UgZm9pIGluaWNpYWxpemFkbyBwb3IgaW5wdXRzKS4gKi9cbiAgICBwdWJsaWMgZ2V0IGlzUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMubG9hZGVkQ29udGV4dCB8fCB0aGlzLmlzSW5wdXREcml2ZW47XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvLyA9PT0gQcOHw5VFUyBQw5pCTElDQVMgPT09XG5cbiAgICBwdWJsaWMgb25TYWx2YXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmVmZmVjdGl2ZVJlYWRPbmx5KSB7IHJldHVybjsgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0NvbnRhU2VtQ2VudHJvQ3VzdG8oKSkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VycHgucmF0ZWlvX2VkaXRvci5lcnJvX2NlbnRyb19jdXN0b19vYnJpZ2F0b3JpbycpO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VycHgucmF0ZWlvX2VkaXRvci5lcnJvX3RpdHVsbycpLFxuICAgICAgICAgICAgICAgIGRldGFpbDogbWVzc2FnZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmVycm9yLmVtaXQoeyBvcGVyYWNhbzogJ3NhdmUnLCBtZXNzYWdlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzRGlzdHJpYnVpY2FvQ29tcGxldGEoKSkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VycHgucmF0ZWlvX2VkaXRvci5lcnJvX2Rpc3RyaWJ1aWNhb19pbmNvbXBsZXRhJyk7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLmVycm9fdGl0dWxvJyksXG4gICAgICAgICAgICAgICAgZGV0YWlsOiBtZXNzYWdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IuZW1pdCh7IG9wZXJhY2FvOiAnc2F2ZScsIG1lc3NhZ2UgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmxvYWRlZENvbnRleHQ7XG4gICAgICAgIGlmICghY3R4Py5lMDcwZmlsPy5pZCB8fCAhY3R4Py5jcmlSYXQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlcnB4LnJhdGVpb19lZGl0b3IuZXJyb19jb250ZXh0b19pbmNvbXBsZXRvJyk7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLmVycm9fdGl0dWxvJyksXG4gICAgICAgICAgICAgICAgZGV0YWlsOiBtZXNzYWdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IuZW1pdCh7IG9wZXJhY2FvOiAnc2F2ZScsIG1lc3NhZ2UgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnB1dDogR3JhdmFyUmF0ZWlvTWFudWFsSW5wdXQgPSB7XG4gICAgICAgICAgICBpZE1vdmltZW50bzogdGhpcy5pZE1vdmltZW50byxcbiAgICAgICAgICAgIHRpcG9Nb3ZpbWVudG86IHRoaXMudGlwb01vdmltZW50byxcbiAgICAgICAgICAgIGFncnVwYWRvcklkOiBjdHguYWdydXBhZG9ySWQsXG4gICAgICAgICAgICBlMDcwZmlsX2lkOiBjdHguZTA3MGZpbC5pZCxcbiAgICAgICAgICAgIGNyaXRlcmlvUmF0ZWlvOiBjdHguY3JpUmF0LFxuICAgICAgICAgICAgZGF0YUJhc2U6IGN0eC5kYXRhQmFzZSxcbiAgICAgICAgICAgIGRhdGFNb3ZpbWVudG86IGN0eC5kYXRhTW92aW1lbnRvLFxuICAgICAgICAgICAgcmF0ZWlvczogdGhpcy5jb250YXNEYXRhU291cmNlXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmdyYXZhclJhdGVpb01hbnVhbChpbnB1dClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLCBmaW5hbGl6ZSgoKSA9PiAodGhpcy5sb2FkaW5nID0gZmFsc2UpKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLnNhbHZvX2NvbV9zdWNlc3NvX3RpdHVsbycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlcnB4LnJhdGVpb19lZGl0b3Iuc2Fsdm9fY29tX3N1Y2Vzc29fZGV0YWxoZScpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmUuZW1pdCh7IGlkTW92aW1lbnRvOiB0aGlzLmlkTW92aW1lbnRvLCB0aXBvTW92aW1lbnRvOiB0aGlzLnRpcG9Nb3ZpbWVudG8sIHJhdGVpb3M6IHRoaXMuY29udGFzRGF0YVNvdXJjZSB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV0YWlsID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnI/Lm1lc3NhZ2UgfHwgdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLmVycm9fc2FsdmFyJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLmVycm9fdGl0dWxvJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IuZW1pdCh7IG9wZXJhY2FvOiAnc2F2ZScsIG1lc3NhZ2U6IGRldGFpbCwgb3JpZ2luYWxFcnJvcjogZXJyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uU3VnZXJpcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZWZmZWN0aXZlUmVhZE9ubHkgfHwgIXRoaXMuc2hvd1N1Z2VzdGFvQnV0dG9uKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMubG9hZGVkQ29udGV4dDtcbiAgICAgICAgY29uc3QgZTA3MGZpbF9pZCA9IHRoaXMuZmlsaWFsSWQgfHwgY3R4Py5lMDcwZmlsPy5pZDtcbiAgICAgICAgY29uc3QgY3JpdGVyaW8gPSB0aGlzLmNyaVJhdCB8fCBjdHg/LmNyaVJhdDtcbiAgICAgICAgY29uc3QgdmFsb3JCYXNlID0gY3R4Py52YWxvckJhc2UgPz8gMDtcblxuICAgICAgICBpZiAoIWUwNzBmaWxfaWQgfHwgIWNyaXRlcmlvKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJhbWV0cm86IFN1Z2VyaXJSYXRlaW9QYXJhbWV0cm8gPSB7XG4gICAgICAgICAgICBlMDcwZmlsX2lkLFxuICAgICAgICAgICAgdmFsb3JCYXNlLFxuICAgICAgICAgICAgY3JpUmF0OiBjcml0ZXJpbyxcbiAgICAgICAgICAgIGRhdGFCYXNlOiBjdHg/LmRhdGFCYXNlLFxuICAgICAgICAgICAgZGF0YU1vdmltZW50bzogY3R4Py5kYXRhTW92aW1lbnRvXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuaWRNb3ZpbWVudG8pIHtcbiAgICAgICAgICAgIHBhcmFtZXRyby5pZE1vdmltZW50byA9IHRoaXMuaWRNb3ZpbWVudG87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZTA5MXBsZklkKSB7XG4gICAgICAgICAgICBwYXJhbWV0cm8uZTA5MXBsZl9pZCA9IHRoaXMuZTA5MXBsZklkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmUwNDRjY3VJZCkge1xuICAgICAgICAgICAgcGFyYW1ldHJvLmUwNDRjY3VfaWQgPSB0aGlzLmUwNDRjY3VJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pZFRyYW5zYWNhbykge1xuICAgICAgICAgICAgcGFyYW1ldHJvLmlkVHJhbnNhY2FvID0gdGhpcy5pZFRyYW5zYWNhbztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pZEZhbWlsaWEpIHtcbiAgICAgICAgICAgIHBhcmFtZXRyby5pZEZhbWlsaWEgPSB0aGlzLmlkRmFtaWxpYTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pZERlcml2YWNhbykge1xuICAgICAgICAgICAgcGFyYW1ldHJvLmlkRGVyaXZhY2FvID0gdGhpcy5pZERlcml2YWNhbztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pZFNlcnZpY28pIHtcbiAgICAgICAgICAgIHBhcmFtZXRyby5pZFNlcnZpY28gPSB0aGlzLmlkU2VydmljbztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy52YWxvckV4Y2VkZW50ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBwYXJhbWV0cm8udmFsb3JFeGNlZGVudGUgPSB0aGlzLnZhbG9yRXhjZWRlbnRlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5wdXQ6IFN1Z2VyaXJSYXRlaW9JbnB1dCA9IHtcbiAgICAgICAgICAgIHRpcG86IHRoaXMudGlwb01vdmltZW50byxcbiAgICAgICAgICAgIHBhcmFtZXRyb3M6IFtwYXJhbWV0cm9dXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnN1Z2VyaXJSYXRlaW8oaW5wdXQpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSwgZmluYWxpemUoKCkgPT4gKHRoaXMubG9hZGluZyA9IGZhbHNlKSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIChyZXNwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Z2VzdGFvID0gKHJlc3Auc3VnZXN0YW8gfHwgW10pXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmluZChzID0+ICF0aGlzLmlkTW92aW1lbnRvIHx8IHMuaWRNb3ZpbWVudG8gPT09IHRoaXMuaWRNb3ZpbWVudG8pXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCAocmVzcC5zdWdlc3RhbyB8fCBbXSlbMF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhdGVpbyA9IHN1Z2VzdGFvPy5yYXRlaW87XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3VnZXN0YW8gfHwgIXJhdGVpbyB8fCByYXRlaW8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3B1bGFyQ29tUmF0ZWlvcyhyYXRlaW8pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlcnIpID0+IHRoaXMuZXJyb3IuZW1pdCh7IG9wZXJhY2FvOiAnc3VnZ2VzdCcsIG1lc3NhZ2U6IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyPy5tZXNzYWdlIHx8IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VycHgucmF0ZWlvX2VkaXRvci5lcnJvX3N1Z2VyaXInKSwgb3JpZ2luYWxFcnJvcjogZXJyIH0pXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8vID09PSBNT0RBTCBDT05UQSBGSU5BTkNFSVJBID09PVxuXG4gICAgcHVibGljIG9wZW5Db250YURpYWxvZyhlZGl0SW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0aW5nQ29udGFJbmRleCA9IGVkaXRJbmRleCAhPSBudWxsID8gZWRpdEluZGV4IDogbnVsbDtcbiAgICAgICAgY29uc3QgcmVtYWluaW5nUGN0ID0gdGhpcy5lZGl0aW5nQ29udGFJbmRleCAhPSBudWxsXG4gICAgICAgICAgICA/IHRoaXMucGVyY2VudHVhbFJlc3RhbnRlICsgdGhpcy5jb250YXNEYXRhU291cmNlW3RoaXMuZWRpdGluZ0NvbnRhSW5kZXhdLnBlcmNlbnR1YWxcbiAgICAgICAgICAgIDogdGhpcy5wZXJjZW50dWFsUmVzdGFudGU7XG4gICAgICAgIC8vIFVzYSBvIHZhbG9yIHJlc3RhbnRlIHJlYWwgZW0gdmV6IGRlIHJlY2FsY3VsYXIgdmlhIHBlcmNlbnR1YWwsIGV2aXRhbmRvXG4gICAgICAgIC8vIGRpZmVyZW7Dp2FzIGRlIGFycmVkb25kYW1lbnRvIGFjdW11bGFkYXMgbmFzIGVudHJhZGFzIGFudGVyaW9yZXMuXG4gICAgICAgIGNvbnN0IHJlbWFpbmluZ1ZhbG9yID0gdGhpcy5lZGl0aW5nQ29udGFJbmRleCAhPSBudWxsXG4gICAgICAgICAgICA/ICsodGhpcy52YWxvclJlc3RhbnRlICsgdGhpcy5jb250YXNEYXRhU291cmNlW3RoaXMuZWRpdGluZ0NvbnRhSW5kZXhdLnZhbG9yUmF0ZWFkb0NvbnRhKS50b0ZpeGVkKHRoaXMuY29uZmlnLmN1cnJlbmN5U2NhbGUgPz8gMilcbiAgICAgICAgICAgIDogdGhpcy52YWxvclJlc3RhbnRlO1xuXG4gICAgICAgIGxldCBjb250YVZhbHVlID0gbnVsbDtcbiAgICAgICAgbGV0IHBlcmNlbnR1YWxWYWx1ZTogbnVtYmVyIHwgbnVsbCA9IHJlbWFpbmluZ1BjdCA+IDAgPyByZW1haW5pbmdQY3QgOiBudWxsO1xuICAgICAgICBsZXQgdmFsb3JWYWx1ZTogbnVtYmVyIHwgbnVsbCA9IHBlcmNlbnR1YWxWYWx1ZSAhPSBudWxsID8gcmVtYWluaW5nVmFsb3IgOiBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLmVkaXRpbmdDb250YUluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhID0gdGhpcy5jb250YXNEYXRhU291cmNlW3RoaXMuZWRpdGluZ0NvbnRhSW5kZXhdO1xuICAgICAgICAgICAgY29udGFWYWx1ZSA9IHsgaWQ6IGNvbnRhLmlkQ29udGFGaW5hbmNlaXJhLCBsYWJlbDogY29udGEuY29udGFGaW5hbmNlaXJhIH07XG4gICAgICAgICAgICBwZXJjZW50dWFsVmFsdWUgPSBjb250YS5wZXJjZW50dWFsO1xuICAgICAgICAgICAgdmFsb3JWYWx1ZSA9IGNvbnRhLnZhbG9yUmF0ZWFkb0NvbnRhO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbnRhID0gY29udGFWYWx1ZSBhcyBDb250YUZpbmFuY2VpcmFMb29rdXAgfCBudWxsO1xuICAgICAgICB0aGlzLmNvbnRhRGlhbG9nRm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICBjb250YUZpbmFuY2VpcmE6IFt7IHZhbHVlOiBjb250YVZhbHVlLCBkaXNhYmxlZDogdGhpcy5lZGl0aW5nQ29udGFJbmRleCAhPSBudWxsIH0sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgcGVyY2VudHVhbDogW3sgdmFsdWU6IHBlcmNlbnR1YWxWYWx1ZSwgZGlzYWJsZWQ6IGZhbHNlIH0sIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heChyZW1haW5pbmdQY3QpXV0sXG4gICAgICAgICAgICB2YWxvcjogW3sgdmFsdWU6IHZhbG9yVmFsdWUsIGRpc2FibGVkOiBmYWxzZSB9LCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXgocmVtYWluaW5nVmFsb3IpXV1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29udGFEaWFsb2dGb3JtR3JvdXAuZ2V0KCdjb250YUZpbmFuY2VpcmEnKS52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IENvbnRhRmluYW5jZWlyYUxvb2t1cCkgPT4gKHRoaXMuc2VsZWN0ZWRDb250YSA9IHZhbHVlIHx8IG51bGwpKTtcbiAgICAgICAgdGhpcy5zZXR1cFBlcmNlbnR1YWxWYWxvclN5bmModGhpcy5jb250YURpYWxvZ0Zvcm1Hcm91cCwgKCkgPT4gdGhpcy52YWxvckJhc2UpO1xuICAgICAgICB0aGlzLmNvbnRhRGlhbG9nRmllbGRzID0gdGhpcy5nZXRDb250YURpYWxvZ0ZpZWxkcygpO1xuICAgICAgICB0aGlzLmRpc3BsYXlDb250YURpYWxvZyA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIG9uU2F2ZUNvbnRhRGlhbG9nKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb250YURpYWxvZ0Zvcm1Hcm91cC5pbnZhbGlkKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRhQ29udHJvbCA9IHRoaXMuY29udGFEaWFsb2dGb3JtR3JvdXAuZ2V0KCdjb250YUZpbmFuY2VpcmEnKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY29udGFEaWFsb2dGb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKTtcbiAgICAgICAgY29uc3QgY29udGFGaW5hbmNlaXJhID0gZGF0YS5jb250YUZpbmFuY2VpcmE7XG4gICAgICAgIGNvbnN0IHBlcmNlbnR1YWwgPSBOdW1iZXIoZGF0YS5wZXJjZW50dWFsKSB8fCAwO1xuICAgICAgICBjb25zdCB2YWxvciA9ICsoTnVtYmVyKGRhdGEudmFsb3IpIHx8IDApLnRvRml4ZWQodGhpcy5jb25maWcuY3VycmVuY3lTY2FsZSA/PyAyKTtcbiAgICAgICAgY29uc3QgaWRDb250YUZpbmFuY2VpcmEgPSB0aGlzLnNlbGVjdGVkQ29udGE/LmlkIHx8IGNvbnRhRmluYW5jZWlyYT8uaWQgfHwgJyc7XG5cbiAgICAgICAgLy8gVmFsaWRhw6fDo28gYW5hbMOtdGljYTogY29udGEgc2ludMOpdGljYSBuw6NvIHBvZGUgc2VyIHVzYWRhIG5vIHJhdGVpb1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENvbnRhPy5hbmFTaW4gPT09IEVycFJhdGVpb0VkaXRvckNvbXBvbmVudC5BTkFfU0lOX1NJTlRFVElDTykge1xuICAgICAgICAgICAgY29udGFDb250cm9sLnNldEVycm9ycyh7IGNvbnRhU2ludGV0aWNhOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhw6fDo28gZGUgZHVwbGljaWRhZGUgKGFkacOnw6NvIGUgZWRpw6fDo28sIGlnbm9yYW5kbyBvIGl0ZW0gZW0gZWRpw6fDo28pXG4gICAgICAgIGNvbnN0IGR1cGxpY2FkYSA9IHRoaXMuY29udGFzRGF0YVNvdXJjZS5zb21lKFxuICAgICAgICAgICAgKGMsIGkpID0+IGkgIT09IHRoaXMuZWRpdGluZ0NvbnRhSW5kZXggJiYgYy5pZENvbnRhRmluYW5jZWlyYSA9PT0gaWRDb250YUZpbmFuY2VpcmFcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGR1cGxpY2FkYSkge1xuICAgICAgICAgICAgY29udGFDb250cm9sLnNldEVycm9ycyh7IGR1cGxpY2F0ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmVkaXRpbmdDb250YUluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhID0gdGhpcy5jb250YXNEYXRhU291cmNlW3RoaXMuZWRpdGluZ0NvbnRhSW5kZXhdO1xuICAgICAgICAgICAgY29udGEucGVyY2VudHVhbCA9IHBlcmNlbnR1YWw7XG4gICAgICAgICAgICBjb250YS52YWxvclJhdGVhZG9Db250YSA9IHZhbG9yO1xuICAgICAgICAgICAgLy8gUmVjYWxjdWxhIG9zIHZhbG9yZXMgZG9zIENDcyBwcm9wb3JjaW9uYWxtZW50ZSBhbyBub3ZvIHZhbG9yIGRhIGNvbnRhLFxuICAgICAgICAgICAgLy8gbWFudGVuZG8gb3MgcGVyY2VudHVhaXMgaW50YWN0b3MuXG4gICAgICAgICAgICBpZiAoY29udGEucmF0ZWlvc0NDdXN0bz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVuY3lTY2FsZSA9IHRoaXMuY29uZmlnLmN1cnJlbmN5U2NhbGUgPz8gMjtcbiAgICAgICAgICAgICAgICBjb250YS5yYXRlaW9zQ0N1c3RvID0gY29udGEucmF0ZWlvc0NDdXN0by5tYXAoY2MgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY2MsXG4gICAgICAgICAgICAgICAgICAgIHZhbG9yOiArKChjYy5wZXJjZW50dWFsIC8gMTAwKSAqIHZhbG9yKS50b0ZpeGVkKGN1cnJlbmN5U2NhbGUpXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb250YXNEYXRhU291cmNlID0gWy4uLnRoaXMuY29udGFzRGF0YVNvdXJjZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbENvbnRhID0gY29udGFGaW5hbmNlaXJhPy5sYWJlbCB8fCAnJztcbiAgICAgICAgICAgIGNvbnN0IG5vdmFDb250YTogUmF0ZWlvQ29udGEgPSB7XG4gICAgICAgICAgICAgICAgaWRDb250YUZpbmFuY2VpcmEsXG4gICAgICAgICAgICAgICAgY29udGFGaW5hbmNlaXJhOiBsYWJlbENvbnRhLFxuICAgICAgICAgICAgICAgIHBlcmNlbnR1YWwsXG4gICAgICAgICAgICAgICAgdmFsb3JSYXRlYWRvQ29udGE6IHZhbG9yLFxuICAgICAgICAgICAgICAgIHJhdGVpb3NDQ3VzdG86IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5jb250YXNEYXRhU291cmNlID0gWy4uLnRoaXMuY29udGFzRGF0YVNvdXJjZSwgbm92YUNvbnRhXTtcbiAgICAgICAgICAgIHRoaXMuY2NTZWxlY3Rpb25bbm92YUNvbnRhLmlkQ29udGFGaW5hbmNlaXJhXSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwbGF5Q29udGFEaWFsb2cgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uSGlkZUNvbnRhRGlhbG9nKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc3BsYXlDb250YURpYWxvZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vID09PSBNT0RBTCBDRU5UUk8gREUgQ1VTVE8gPT09XG5cbiAgICBwdWJsaWMgb3BlbkNDRGlhbG9nKGNvbnRhSW5kZXg6IG51bWJlciwgZWRpdENDSW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0aW5nQ0NDb250YUluZGV4ID0gY29udGFJbmRleDtcbiAgICAgICAgdGhpcy5lZGl0aW5nQ0NJbmRleCA9IGVkaXRDQ0luZGV4ICE9IG51bGwgPyBlZGl0Q0NJbmRleCA6IG51bGw7XG5cbiAgICAgICAgY29uc3QgY29udGEgPSB0aGlzLmNvbnRhc0RhdGFTb3VyY2VbY29udGFJbmRleF07XG4gICAgICAgIGNvbnN0IGNjTGlzdCA9IGNvbnRhLnJhdGVpb3NDQ3VzdG8gfHwgW107XG4gICAgICAgIGNvbnN0IHZhbG9yQmFzZUNDID0gY29udGEudmFsb3JSYXRlYWRvQ29udGEgfHwgMDtcblxuICAgICAgICAvLyBDYWxjdWxhIG8gcmVzdGFudGUgZXhjbHVpbmRvIG8gaXRlbSBlbSBlZGnDp8OjbyAocGFyYSBxdWUgZWRpw6fDo28gcG9zc2EgbWFudGVyIG8gcHLDs3ByaW8gdmFsb3IpXG4gICAgICAgIGNvbnN0IHNvbWFDQ1BjdCA9IGNjTGlzdC5yZWR1Y2UoKGFjYywgY2MsIGkpID0+IGFjYyArIChpID09PSB0aGlzLmVkaXRpbmdDQ0luZGV4ID8gMCA6IChjYy5wZXJjZW50dWFsIHx8IDApKSwgMCk7XG4gICAgICAgIGNvbnN0IHNvbWFDQ1ZhbG9yID0gY2NMaXN0LnJlZHVjZSgoYWNjLCBjYywgaSkgPT4gYWNjICsgKGkgPT09IHRoaXMuZWRpdGluZ0NDSW5kZXggPyAwIDogKGNjLnZhbG9yIHx8IDApKSwgMCk7XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZ1BjdCA9ICsoMTAwIC0gc29tYUNDUGN0KS50b0ZpeGVkKHRoaXMuY29uZmlnLnBlcmNlbnRhZ2VTY2FsZSA/PyA0KTtcbiAgICAgICAgY29uc3QgcmVtYWluaW5nVmFsb3IgPSArKHZhbG9yQmFzZUNDIC0gc29tYUNDVmFsb3IpLnRvRml4ZWQodGhpcy5jb25maWcuY3VycmVuY3lTY2FsZSA/PyAyKTtcblxuICAgICAgICBsZXQgY2NWYWx1ZSA9IG51bGw7XG4gICAgICAgIGxldCBwZXJjZW50dWFsVmFsdWU6IG51bWJlciB8IG51bGwgPSByZW1haW5pbmdQY3QgPiAwID8gcmVtYWluaW5nUGN0IDogbnVsbDtcbiAgICAgICAgLy8gVXNhIG8gdmFsb3IgcmVzdGFudGUgcmVhbCAoasOhIGNhbGN1bGFkbyBhY2ltYSkgZW0gdmV6IGRlIHJlY2FsY3VsYXIgdmlhIHBlcmNlbnR1YWwsXG4gICAgICAgIC8vIGV2aXRhbmRvIGRpZmVyZW7Dp2FzIGRlIGFycmVkb25kYW1lbnRvIGFjdW11bGFkYXMgbm9zIENDcyBhbnRlcmlvcmVzLlxuICAgICAgICBsZXQgdmFsb3JWYWx1ZTogbnVtYmVyIHwgbnVsbCA9IHBlcmNlbnR1YWxWYWx1ZSAhPSBudWxsID8gcmVtYWluaW5nVmFsb3IgOiBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLmVkaXRpbmdDQ0luZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNjID0gY2NMaXN0W3RoaXMuZWRpdGluZ0NDSW5kZXhdO1xuICAgICAgICAgICAgY2NWYWx1ZSA9IHsgaWQ6IGNjLmlkQ2VudHJvQ3VzdG8sIGxhYmVsOiBjYy5kZXNjQ0N1c3RvIHx8IGNjLmlkQ2VudHJvQ3VzdG8gfTtcbiAgICAgICAgICAgIHBlcmNlbnR1YWxWYWx1ZSA9IGNjLnBlcmNlbnR1YWw7XG4gICAgICAgICAgICB2YWxvclZhbHVlID0gY2MudmFsb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYXhQY3Q6IHBlcmNlbnR1YWwgbcOheGltbyBxdWUgZXN0ZSBDQyBwb2RlIHRlciAobsOjbyBwb2RlIHVsdHJhcGFzc2FyIG8gcmVzdGFudGUgZGEgY29udGEpXG4gICAgICAgIGNvbnN0IG1heFBjdCA9IHJlbWFpbmluZ1BjdDtcbiAgICAgICAgLy8gbWF4VmFsb3I6IHZhbG9yIG3DoXhpbW8gcXVlIGVzdGUgQ0MgcG9kZSB0ZXIgKG7Do28gcG9kZSB1bHRyYXBhc3NhciBvIHJlc3RhbnRlIGVtIGRpbmhlaXJvKVxuICAgICAgICBjb25zdCBtYXhWYWxvciA9IHJlbWFpbmluZ1ZhbG9yO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDQyA9IGNjVmFsdWUgYXMgQ2VudHJvQ3VzdG9Mb29rdXAgfCBudWxsO1xuICAgICAgICB0aGlzLmNjRGlhbG9nRm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICBjZW50cm9DdXN0bzogW3sgdmFsdWU6IGNjVmFsdWUsIGRpc2FibGVkOiB0aGlzLmVkaXRpbmdDQ0luZGV4ICE9IG51bGwgfSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICBwZXJjZW50dWFsOiBbeyB2YWx1ZTogcGVyY2VudHVhbFZhbHVlLCBkaXNhYmxlZDogZmFsc2UgfSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4KG1heFBjdCldXSxcbiAgICAgICAgICAgIHZhbG9yOiBbeyB2YWx1ZTogdmFsb3JWYWx1ZSwgZGlzYWJsZWQ6IGZhbHNlIH0sIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heChtYXhWYWxvcildXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jY0RpYWxvZ0Zvcm1Hcm91cC5nZXQoJ2NlbnRyb0N1c3RvJykudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlOiBDZW50cm9DdXN0b0xvb2t1cCkgPT4gKHRoaXMuc2VsZWN0ZWRDQyA9IHZhbHVlIHx8IG51bGwpKTtcbiAgICAgICAgdGhpcy5zZXR1cFBlcmNlbnR1YWxWYWxvclN5bmModGhpcy5jY0RpYWxvZ0Zvcm1Hcm91cCwgKCkgPT4gdmFsb3JCYXNlQ0MpO1xuICAgICAgICB0aGlzLmNjRGlhbG9nRmllbGRzID0gdGhpcy5nZXRDQ0RpYWxvZ0ZpZWxkcygpO1xuICAgICAgICB0aGlzLmRpc3BsYXlDQ0RpYWxvZyA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIG9uU2F2ZUNDRGlhbG9nKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jY0RpYWxvZ0Zvcm1Hcm91cC5pbnZhbGlkKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNvbnN0IGNjQ29udHJvbCA9IHRoaXMuY2NEaWFsb2dGb3JtR3JvdXAuZ2V0KCdjZW50cm9DdXN0bycpO1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5jY0RpYWxvZ0Zvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpO1xuICAgICAgICBjb25zdCBjZW50cm9DdXN0byA9IGRhdGEuY2VudHJvQ3VzdG87XG4gICAgICAgIGNvbnN0IHBlcmNlbnR1YWwgPSBOdW1iZXIoZGF0YS5wZXJjZW50dWFsKSB8fCAwO1xuICAgICAgICBjb25zdCB2YWxvciA9ICsoTnVtYmVyKGRhdGEudmFsb3IpIHx8IDApLnRvRml4ZWQodGhpcy5jb25maWcuY3VycmVuY3lTY2FsZSA/PyAyKTtcbiAgICAgICAgY29uc3QgY29udGEgPSB0aGlzLmNvbnRhc0RhdGFTb3VyY2VbdGhpcy5lZGl0aW5nQ0NDb250YUluZGV4XTtcbiAgICAgICAgY29uc3QgaWRDZW50cm9DdXN0byA9IHRoaXMuc2VsZWN0ZWRDQz8uaWQgfHwgY2VudHJvQ3VzdG8/LmlkIHx8ICcnO1xuXG4gICAgICAgIC8vIFZhbGlkYcOnw6NvIGFuYWzDrXRpY2E6IENDIHNpbnTDqXRpY28gb3UgcXVlIG7Do28gYWNlaXRhIHJhdGVpbyDDqSBpbnbDoWxpZG9cbiAgICAgICAgY29uc3QgY2NJbnZhbGlkbyA9IHRoaXMuc2VsZWN0ZWRDQz8uYWNlUmF0ID09PSBmYWxzZVxuICAgICAgICAgICAgfHwgdGhpcy5zZWxlY3RlZENDPy5hbmFTaW4gPT09IEVycFJhdGVpb0VkaXRvckNvbXBvbmVudC5BTkFfU0lOX1NJTlRFVElDTztcbiAgICAgICAgaWYgKGNjSW52YWxpZG8pIHtcbiAgICAgICAgICAgIGNjQ29udHJvbC5zZXRFcnJvcnMoeyBjZW50cm9DdXN0b0ludmFsaWRvOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhw6fDo28gZGUgZHVwbGljaWRhZGUgbmEgbWVzbWEgY29udGEgKGFkacOnw6NvIGUgZWRpw6fDo28sIGlnbm9yYW5kbyBvIGl0ZW0gZW0gZWRpw6fDo28pXG4gICAgICAgIGNvbnN0IGNjTGlzdCA9IGNvbnRhLnJhdGVpb3NDQ3VzdG8gfHwgW107XG4gICAgICAgIGNvbnN0IGR1cGxpY2FkbyA9IGNjTGlzdC5zb21lKFxuICAgICAgICAgICAgKGNjLCBpKSA9PiBpICE9PSB0aGlzLmVkaXRpbmdDQ0luZGV4ICYmIGNjLmlkQ2VudHJvQ3VzdG8gPT09IGlkQ2VudHJvQ3VzdG9cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGR1cGxpY2Fkbykge1xuICAgICAgICAgICAgY2NDb250cm9sLnNldEVycm9ycyh7IGR1cGxpY2F0ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmVkaXRpbmdDQ0luZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNjID0gY29udGEucmF0ZWlvc0NDdXN0b1t0aGlzLmVkaXRpbmdDQ0luZGV4XTtcbiAgICAgICAgICAgIGNjLnBlcmNlbnR1YWwgPSBwZXJjZW50dWFsO1xuICAgICAgICAgICAgY2MudmFsb3IgPSB2YWxvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsQ0N1c3RvID0gY2VudHJvQ3VzdG8/LmxhYmVsIHx8ICcnO1xuICAgICAgICAgICAgY29udGEucmF0ZWlvc0NDdXN0byA9IFsuLi5jY0xpc3QsIHsgaWRDZW50cm9DdXN0bywgZGVzY0NDdXN0bzogbGFiZWxDQ3VzdG8sIHBlcmNlbnR1YWwsIHZhbG9yIH1dO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250YXNEYXRhU291cmNlID0gWy4uLnRoaXMuY29udGFzRGF0YVNvdXJjZV07XG4gICAgICAgIHRoaXMuZGlzcGxheUNDRGlhbG9nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkhpZGVDQ0RpYWxvZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5Q0NEaWFsb2cgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyA9PT0gQcOHw5VFUyBEQSBUQUJFTEEgPT09XG5cbiAgICBwdWJsaWMgb25EZWxldGVTZWxlY3RlZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5sZW5ndGgpIHsgcmV0dXJuOyB9XG4gICAgICAgIGNvbnN0IGlkc1RvUmVtb3ZlID0gbmV3IFNldCh0aGlzLnNlbGVjdGlvbi5tYXAocyA9PiBzLmlkQ29udGFGaW5hbmNlaXJhKSk7XG4gICAgICAgIHRoaXMuY29udGFzRGF0YVNvdXJjZSA9IHRoaXMuY29udGFzRGF0YVNvdXJjZS5maWx0ZXIoYyA9PiAhaWRzVG9SZW1vdmUuaGFzKGMuaWRDb250YUZpbmFuY2VpcmEpKTtcbiAgICAgICAgaWRzVG9SZW1vdmUuZm9yRWFjaChpZCA9PiBkZWxldGUgdGhpcy5jY1NlbGVjdGlvbltpZF0pO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IFtdO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKiogUmVtb3ZlIG9zIGNlbnRyb3MgZGUgY3VzdG8gc2VsZWNpb25hZG9zIGRlIHVtYSBjb250YSBmaW5hbmNlaXJhLiAqL1xuICAgIHB1YmxpYyBvbkRlbGV0ZVNlbGVjdGVkQ0MoY29udGE6IFJhdGVpb0NvbnRhKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlbGVjaW9uYWRvcyA9IHRoaXMuY2NTZWxlY3Rpb25bY29udGEuaWRDb250YUZpbmFuY2VpcmFdIHx8IFtdO1xuICAgICAgICBpZiAoIXNlbGVjaW9uYWRvcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICBzZXZlcml0eTogJ3dhcm4nLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2VycHgucmF0ZWlvX2VkaXRvci5lcnJvX3RpdHVsbycpLFxuICAgICAgICAgICAgICAgIGRldGFpbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLm5lbmh1bV9jZW50cm9fY3VzdG9fc2VsZWNpb25hZG8nKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWRzVG9SZW1vdmUgPSBuZXcgU2V0KHNlbGVjaW9uYWRvcy5tYXAoY2MgPT4gY2MuaWRDZW50cm9DdXN0bykpO1xuICAgICAgICBjb250YS5yYXRlaW9zQ0N1c3RvID0gY29udGEucmF0ZWlvc0NDdXN0by5maWx0ZXIoY2MgPT4gIWlkc1RvUmVtb3ZlLmhhcyhjYy5pZENlbnRyb0N1c3RvKSk7XG4gICAgICAgIHRoaXMuY2NTZWxlY3Rpb25bY29udGEuaWRDb250YUZpbmFuY2VpcmFdID0gW107XG4gICAgICAgIHRoaXMuY29udGFzRGF0YVNvdXJjZSA9IFsuLi50aGlzLmNvbnRhc0RhdGFTb3VyY2VdO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlckNvbnRhKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVtb3ZpZGEgPSB0aGlzLmNvbnRhc0RhdGFTb3VyY2VbaW5kZXhdO1xuICAgICAgICBpZiAocmVtb3ZpZGEpIHsgZGVsZXRlIHRoaXMuY2NTZWxlY3Rpb25bcmVtb3ZpZGEuaWRDb250YUZpbmFuY2VpcmFdOyB9XG4gICAgICAgIHRoaXMuY29udGFzRGF0YVNvdXJjZSA9IHRoaXMuY29udGFzRGF0YVNvdXJjZS5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZXJDZW50cm9DdXN0byhjb250YUluZGV4OiBudW1iZXIsIGNjSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBjb250YSA9IHRoaXMuY29udGFzRGF0YVNvdXJjZVtjb250YUluZGV4XTtcbiAgICAgICAgY29udGEucmF0ZWlvc0NDdXN0byA9IGNvbnRhLnJhdGVpb3NDQ3VzdG8uZmlsdGVyKChfLCBpKSA9PiBpICE9PSBjY0luZGV4KTtcbiAgICAgICAgdGhpcy5jb250YXNEYXRhU291cmNlID0gWy4uLnRoaXMuY29udGFzRGF0YVNvdXJjZV07XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cblxuXG4gICAgcHVibGljIGdldENvbnRhSW5kZXgocm93RGF0YTogUmF0ZWlvQ29udGEpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YXNEYXRhU291cmNlLmluZGV4T2Yocm93RGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENDSW5kZXgoY29udGE6IFJhdGVpb0NvbnRhLCBjYzogUmF0ZWlvQ0N1c3RvKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIChjb250YS5yYXRlaW9zQ0N1c3RvIHx8IFtdKS5pbmRleE9mKGNjKTtcbiAgICB9XG5cbiAgICAvLyA9PT0gUFJJVkFET1MgPT09XG5cbiAgICAvKiogSW5pY2lhbGl6YSBvIGNvbXBvbmVudGUgYSBwYXJ0aXIgZG9zIGlucHV0cyAoc2VtIGNoYW1hZGEgw6AgQVBJIGRlIGNhcmdhKS4gKi9cbiAgICBwcml2YXRlIGluaWNpYWxpemFyUG9ySW5wdXRzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvYWRlZENvbnRleHQgPSAodGhpcy5pbml0aWFsQ29udGV4dCB8fCB7fSkgYXMgUmV0b3JuYXJSYXRlaW9PdXRwdXQ7XG4gICAgICAgIHRoaXMucG9wdWxhckNvbVJhdGVpb3ModGhpcy5pbml0aWFsUmF0ZWlvcyB8fCBbXSk7XG4gICAgICAgIGlmICghdGhpcy5lbXByZXNhSWQpIHtcbiAgICAgICAgICAgIHRoaXMuZW1wcmVzYUlkID0gdGhpcy5pbml0aWFsQ29udGV4dD8uZTA3MGZpbD8uZTA3MGVtcD8uaWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ncmlkQ29sdW1ucyA9IHRoaXMuZ2V0R3JpZENvbHVtbnMoKTtcbiAgICAgICAgLy8gRW1pdGUgbyBlc3RhZG8gZGUgdmFsaWRhZGUgasOhIG5hIGNhcmdhIGluaWNpYWwgKHNlbSBtYXJjYXIgY29tbyBcInN1am9cIiksXG4gICAgICAgIC8vIHBlcm1pdGluZG8gcXVlIG8gaG9zdCBjb25oZcOnYSBvIGlzVmFsaWQgbWVzbW8gc2VtIG8gdXN1w6FyaW8gZWRpdGFyLlxuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoZmFsc2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FycmVnYXJSYXRlaW8oKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VydmljZVxuICAgICAgICAgICAgLnJldG9ybmFyUmF0ZWlvKHsgaWRNb3ZpbWVudG86IHRoaXMuaWRNb3ZpbWVudG8sIHRpcG9Nb3ZpbWVudG86IHRoaXMudGlwb01vdmltZW50byB9KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksIGZpbmFsaXplKCgpID0+ICh0aGlzLmxvYWRpbmcgPSBmYWxzZSkpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAob3V0cHV0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkQ29udGV4dCA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3B1bGFyQ29tUmF0ZWlvcyhvdXRwdXQucmF0ZWlvIHx8IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmVtcHJlc2FJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbXByZXNhSWQgPSBvdXRwdXQuZTA3MGZpbC5lMDcwZW1wLmlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZENvbHVtbnMgPSB0aGlzLmdldEdyaWRDb2x1bW5zKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVtaXRlIG8gZXN0YWRvIGRlIHZhbGlkYWRlIGRvIHJhdGVpbyBjYXJyZWdhZG8gKHNlbSBtYXJjYXIgY29tbyBcInN1am9cIikuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdENoYW5nZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZXJyKSA9PiB0aGlzLmVycm9yLmVtaXQoeyBvcGVyYWNhbzogJ2xvYWQnLCBtZXNzYWdlOiBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVycj8ubWVzc2FnZSB8fCB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlcnB4LnJhdGVpb19lZGl0b3IuZXJyb19jYXJyZWdhcicpLCBvcmlnaW5hbEVycm9yOiBlcnIgfSlcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwb3B1bGFyQ29tUmF0ZWlvcyhyYXRlaW9zOiBSYXRlaW9Db250YVtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udGFzRGF0YVNvdXJjZSA9IFsuLi5yYXRlaW9zXTtcbiAgICAgICAgdGhpcy5jY1NlbGVjdGlvbiA9IHt9O1xuICAgICAgICB0aGlzLmNvbnRhc0RhdGFTb3VyY2UuZm9yRWFjaChjb250YSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNjU2VsZWN0aW9uW2NvbnRhLmlkQ29udGFGaW5hbmNlaXJhXSA9IFtdO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXN0cmlidWnDp8OjbyBjb21wbGV0YTogcmVzdGFudGVzIGdsb2JhaXMgZSBkZSBjYWRhIGNvbnRhIGlndWFpcyBhIHplcm8uXG4gICAgICogRXhwb3N0byBwdWJsaWNhbWVudGUgcGFyYSBxdWUgbyB0ZW1wbGF0ZSBwb3NzYSByZWFnaXIgYW8gZXN0YWRvIHJlYWwgZGVcbiAgICAgKiBjb21wbGV0dWRlIChjb250YXMgKyBjZW50cm9zIGRlIGN1c3RvKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRpc3RyaWJ1aWNhb0NvbXBsZXRhKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5wZXJjZW50dWFsUmVzdGFudGUgIT09IDAgfHwgdGhpcy52YWxvclJlc3RhbnRlICE9PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb250YXNEYXRhU291cmNlLmV2ZXJ5KGNvbnRhID0+IHRoaXMuaXNDb250YUNDQ29tcGxldGEoY29udGEpKTtcbiAgICB9XG5cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNhciBvIGdldHRlciBgZGlzdHJpYnVpY2FvQ29tcGxldGFgLiBNYW50aWRvIHBhcmEgY29tcGF0aWJpbGlkYWRlIGludGVybmEuICovXG4gICAgcHJpdmF0ZSBpc0Rpc3RyaWJ1aWNhb0NvbXBsZXRhKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXN0cmlidWljYW9Db21wbGV0YTtcbiAgICB9XG5cbiAgICAvKiogSW5kaWNhIHNlIGjDoSBhbyBtZW5vcyB1bWEgY29udGEgZmluYW5jZWlyYSBzZW0gbmVuaHVtIGNlbnRybyBkZSBjdXN0byB2aW5jdWxhZG8uICovXG4gICAgcHJpdmF0ZSBoYXNDb250YVNlbUNlbnRyb0N1c3RvKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YXNEYXRhU291cmNlLnNvbWUoY29udGEgPT4gKGNvbnRhLnJhdGVpb3NDQ3VzdG8gfHwgW10pLmxlbmd0aCA9PT0gMCk7XG4gICAgfVxuXG4gICAgLyoqIFJlc3RhbnRlIGRlICUgZSBkZSB2YWxvciBkb3MgY2VudHJvcyBkZSBjdXN0byBkZSB1bWEgY29udGEgaWd1YWwgYSB6ZXJvLiAqL1xuICAgIHByaXZhdGUgaXNDb250YUNDQ29tcGxldGEoY29udGE6IFJhdGVpb0NvbnRhKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNjcyA9IGNvbnRhLnJhdGVpb3NDQ3VzdG8gfHwgW107XG4gICAgICAgIGlmIChjY3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBDZW50cm8gZGUgY3VzdG8gw6kgc2VtcHJlIG9icmlnYXTDs3JpbzogY29udGEgc2VtIG5lbmh1bSBDQyBudW5jYSDDqSBjb21wbGV0YS5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb21hUGN0ID0gY2NzLnJlZHVjZSgoYWNjLCBjYykgPT4gYWNjICsgKGNjLnBlcmNlbnR1YWwgfHwgMCksIDApO1xuICAgICAgICBjb25zdCBzb21hVmFsb3IgPSBjY3MucmVkdWNlKChhY2MsIGNjKSA9PiBhY2MgKyAoY2MudmFsb3IgfHwgMCksIDApO1xuICAgICAgICBjb25zdCBwY3RSZXN0YW50ZSA9ICsoMTAwIC0gc29tYVBjdCkudG9GaXhlZCh0aGlzLmNvbmZpZy5wZXJjZW50YWdlU2NhbGUgPz8gNCk7XG4gICAgICAgIGNvbnN0IHZhbG9yUmVzdGFudGUgPSArKChjb250YS52YWxvclJhdGVhZG9Db250YSB8fCAwKSAtIHNvbWFWYWxvcikudG9GaXhlZCh0aGlzLmNvbmZpZy5jdXJyZW5jeVNjYWxlID8/IDIpO1xuICAgICAgICByZXR1cm4gcGN0UmVzdGFudGUgPT09IDAgJiYgdmFsb3JSZXN0YW50ZSA9PT0gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvbnRhRGlhbG9nRmllbGRzKCk6IEZvcm1GaWVsZFtdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuZTA5MVBsZkxvb2t1cC5tb3VudE9wdGlvbnMoe1xuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Hcm91cDogJ2NvbnRhRmluYW5jZWlyYScsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5RmllbGRzOiBbJ2FuYVNpbiddLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVyOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGZpZWxkOiAnZXhjbHVpZG8nLCBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSwgdmFsdWVzOiBbJ2ZhbHNlJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZmllbGQ6ICdzaXRGaW4nLCBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSwgdmFsdWVzOiBbJ1ZBJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZmllbGQ6ICdlMDcwZW1wJywgb3BlcmF0b3I6IEVudW1Mb2dpY2FsT3BlcmF0b3IuRXEsIHZhbHVlczogW3RoaXMuZW1wcmVzYUlkXSB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAoKSA9PiB0cnVlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdwZXJjZW50dWFsJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLnBlcmNlbnR1YWwnKSxcbiAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDYsIGxnOiA2LCB4bDogNiB9LFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5Eb3VibGUsXG4gICAgICAgICAgICAgICAgcHJlY2lzaW9uOiA3LFxuICAgICAgICAgICAgICAgIHNjYWxlOiB0aGlzLmNvbmZpZy5wZXJjZW50YWdlU2NhbGUgPz8gNCxcbiAgICAgICAgICAgICAgICByaWdodEFkZG9uOiB7IGxhYmVsOiAnJScgfSxcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogKCkgPT4gdHJ1ZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndmFsb3InLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlcnB4LnJhdGVpb19lZGl0b3IudmFsb3InKSxcbiAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDYsIGxnOiA2LCB4bDogNiB9LFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5Nb25leSxcbiAgICAgICAgICAgICAgICBjdXJyZW5uY3k6ICgpID0+IHRoaXMuY3VycmVuY3lDb2RlLFxuICAgICAgICAgICAgICAgIHByZWNpc2lvbjogMTgsXG4gICAgICAgICAgICAgICAgc2NhbGU6IHRoaXMuY29uZmlnLmN1cnJlbmN5U2NhbGUgPz8gMixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogKCkgPT4gdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENDRGlhbG9nRmllbGRzKCk6IEZvcm1GaWVsZFtdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuZTA0NENjdUxvb2t1cC5tb3VudE9wdGlvbnMoe1xuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Hcm91cDogJ2NlbnRyb0N1c3RvJyxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlGaWVsZHM6IFsnYW5hU2luJywgJ2FjZVJhdCddLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVyOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGZpZWxkOiAnZXhjbHVpZG8nLCBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSwgdmFsdWVzOiBbJ2ZhbHNlJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZmllbGQ6ICdzaXRDY3UnLCBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSwgdmFsdWVzOiBbJ1ZBJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZmllbGQ6ICdlMDcwZW1wJywgb3BlcmF0b3I6IEVudW1Mb2dpY2FsT3BlcmF0b3IuRXEsIHZhbHVlczogW3RoaXMuZW1wcmVzYUlkXSB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAoKSA9PiB0cnVlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdwZXJjZW50dWFsJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZXJweC5yYXRlaW9fZWRpdG9yLnBlcmNlbnR1YWwnKSxcbiAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDYsIGxnOiA2LCB4bDogNiB9LFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5Eb3VibGUsXG4gICAgICAgICAgICAgICAgcHJlY2lzaW9uOiA3LFxuICAgICAgICAgICAgICAgIHNjYWxlOiB0aGlzLmNvbmZpZy5wZXJjZW50YWdlU2NhbGUgPz8gNCxcbiAgICAgICAgICAgICAgICByaWdodEFkZG9uOiB7IGxhYmVsOiAnJScgfSxcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogKCkgPT4gdHJ1ZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndmFsb3InLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdlcnB4LnJhdGVpb19lZGl0b3IudmFsb3InKSxcbiAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDYsIGxnOiA2LCB4bDogNiB9LFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5Nb25leSxcbiAgICAgICAgICAgICAgICBjdXJyZW5uY3k6ICgpID0+IHRoaXMuY3VycmVuY3lDb2RlLFxuICAgICAgICAgICAgICAgIHByZWNpc2lvbjogMTgsXG4gICAgICAgICAgICAgICAgc2NhbGU6IHRoaXMuY29uZmlnLmN1cnJlbmN5U2NhbGUgPz8gMixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogKCkgPT4gdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaW5jcm9uaXphIG9zIGNhbXBvcyBwZXJjZW50dWFsIGUgdmFsb3IgZGUgdW0gRm9ybUdyb3VwIGRlIG1vZGFsLlxuICAgICAqIFF1YW5kbyBvIHVzdcOhcmlvIGFsdGVyYSBwZXJjZW50dWFsLCByZWNhbGN1bGEgdmFsb3IgKHBlcmNlbnR1YWwvMTAwICogYmFzZSkuXG4gICAgICogUXVhbmRvIG8gdXN1w6FyaW8gYWx0ZXJhIHZhbG9yLCByZWNhbGN1bGEgcGVyY2VudHVhbCAodmFsb3IvYmFzZSAqIDEwMCkuXG4gICAgICogTyBhcmd1bWVudG8gZ2V0QmFzZSByZXRvcm5hIGEgYmFzZSB1c2FkYSBubyBjw6FsY3VsbyAodmFsb3JCYXNlIGdsb2JhbCBvdSB2YWxvclJhdGVhZG9Db250YSBkYSBjb250YSBwYWkpLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0dXBQZXJjZW50dWFsVmFsb3JTeW5jKGZvcm06IEZvcm1Hcm91cCwgZ2V0QmFzZTogKCkgPT4gbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBlcmNlbnR1YWxTY2FsZSA9IHRoaXMuY29uZmlnLnBlcmNlbnRhZ2VTY2FsZSA/PyA0O1xuICAgICAgICBjb25zdCBjdXJyZW5jeVNjYWxlID0gdGhpcy5jb25maWcuY3VycmVuY3lTY2FsZSA/PyAyO1xuXG4gICAgICAgIGZvcm0uZ2V0KCdwZXJjZW50dWFsJykudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocGN0ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gZ2V0QmFzZSgpO1xuICAgICAgICAgICAgICAgIGlmIChwY3QgPT0gbnVsbCB8fCBiYXNlID09IG51bGwpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICAgICAgY29uc3Qgbm92b1ZhbG9yID0gKygoTnVtYmVyKHBjdCkgLyAxMDApICogYmFzZSkudG9GaXhlZChjdXJyZW5jeVNjYWxlKTtcbiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyKGZvcm0uZ2V0KCd2YWxvcicpLnZhbHVlKSAhPT0gbm92b1ZhbG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm0uZ2V0KCd2YWxvcicpLnNldFZhbHVlKG5vdm9WYWxvciwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGZvcm0uZ2V0KCd2YWxvcicpLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHZhbCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IGdldEJhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsID09IG51bGwgfHwgIWJhc2UpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICAgICAgY29uc3Qgbm92b1BjdCA9ICsoKE51bWJlcih2YWwpIC8gYmFzZSkgKiAxMDApLnRvRml4ZWQocGVyY2VudHVhbFNjYWxlKTtcbiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyKGZvcm0uZ2V0KCdwZXJjZW50dWFsJykudmFsdWUpICE9PSBub3ZvUGN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm0uZ2V0KCdwZXJjZW50dWFsJykuc2V0VmFsdWUobm92b1BjdCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0R3JpZENvbHVtbnMoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgeyBmaWVsZDogJ2NvbnRhRmluYW5jZWlyYScsIGhlYWRlcjogJ2VycHgucmF0ZWlvX2VkaXRvci5jb250YV9maW5hbmNlaXJhJyB9LFxuICAgICAgICAgICAgeyBmaWVsZDogJ3BlcmNlbnR1YWwnLCBoZWFkZXI6ICdlcnB4LnJhdGVpb19lZGl0b3IucGVyY2VudHVhbCcgfSxcbiAgICAgICAgICAgIHsgZmllbGQ6ICd2YWxvclJhdGVhZG9Db250YScsIGhlYWRlcjogJ2VycHgucmF0ZWlvX2VkaXRvci52YWxvcicgfVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW1pdENoYW5nZShpc0RpcnR5OiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgIGlzRGlydHksXG4gICAgICAgICAgICBpc1ZhbGlkOiB0aGlzLmlzRGlzdHJpYnVpY2FvQ29tcGxldGEoKSxcbiAgICAgICAgICAgIHJhdGVpb3M6IHRoaXMuY29udGFzRGF0YVNvdXJjZVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=