general-library-union 3.0.46 → 3.0.48

Sign up to get free protection for your applications and to get access to all the features.
Files changed (653) hide show
  1. package/.browserslistrc +15 -0
  2. package/.editorconfig +16 -0
  3. package/.vscode/extensions.json +4 -0
  4. package/.vscode/launch.json +20 -0
  5. package/.vscode/tasks.json +42 -0
  6. package/angular.json +143 -0
  7. package/karma.conf.js +44 -0
  8. package/ng-package.json +21 -0
  9. package/package.json +73 -62
  10. package/{public-api.d.ts → public-api.ts} +201 -161
  11. package/src/app/app.component.html +12 -0
  12. package/src/app/app.component.scss +0 -0
  13. package/src/app/app.component.spec.ts +29 -0
  14. package/src/app/app.component.ts +34 -0
  15. package/src/app/app.config.ts +43 -0
  16. package/src/app/app.module.ts +10 -0
  17. package/src/app/app.routes.ts +88 -0
  18. package/src/app/core/componentes/breadcrumb/breadcrumb.component.html +6 -0
  19. package/src/app/core/componentes/breadcrumb/breadcrumb.component.scss +0 -0
  20. package/src/app/core/componentes/breadcrumb/breadcrumb.component.ts +39 -0
  21. package/src/app/core/componentes/carga-breadcrumb/carga-breadcrumb.component.html +1 -0
  22. package/src/app/core/componentes/carga-breadcrumb/carga-breadcrumb.component.scss +0 -0
  23. package/src/app/core/componentes/carga-breadcrumb/carga-breadcrumb.component.ts +31 -0
  24. package/src/app/core/componentes/carga-pantalla-completa/carga-pantalla-completa.component.html +9 -0
  25. package/src/app/core/componentes/carga-pantalla-completa/carga-pantalla-completa.component.scss +28 -0
  26. package/src/app/core/componentes/carga-pantalla-completa/carga-pantalla-completa.component.ts +32 -0
  27. package/src/app/core/componentes/filtro-general/filtro-general.component.html +36 -0
  28. package/src/app/core/componentes/filtro-general/filtro-general.component.scss +3 -0
  29. package/src/app/core/componentes/filtro-general/filtro-general.component.ts +203 -0
  30. package/src/app/core/componentes/footer/footer.component.html +13 -0
  31. package/src/app/core/componentes/footer/footer.component.scss +3 -0
  32. package/src/app/core/componentes/footer/footer.component.ts +20 -0
  33. package/src/app/core/componentes/formulariodinamico/formulariodinamico.component.html +267 -0
  34. package/src/app/core/componentes/formulariodinamico/formulariodinamico.component.scss +21 -0
  35. package/src/app/core/componentes/formulariodinamico/formulariodinamico.component.ts +275 -0
  36. package/src/app/core/componentes/formulariodinamico/objetosformulario/{Cambio.d.ts → Cambio.ts} +13 -7
  37. package/src/app/core/componentes/formulariodinamico/objetosformulario/CampoFormulario.ts +118 -0
  38. package/src/app/core/componentes/formulariodinamico/objetosformulario/CampoFormularioCons.ts +76 -0
  39. package/src/app/core/componentes/formulariodinamico/objetosformulario/CampoFormularioNuevo.ts +67 -0
  40. package/src/app/core/componentes/formulariodinamico/objetosformulario/HashDirective.ts +11 -0
  41. package/src/app/core/componentes/inicio-component/inicio-component.component.html +29 -0
  42. package/src/app/core/componentes/inicio-component/inicio-component.component.scss +69 -0
  43. package/src/app/core/componentes/inicio-component/inicio-component.component.ts +70 -0
  44. package/src/app/core/componentes/menu/menu.component.html +13 -0
  45. package/src/app/core/componentes/menu/menu.component.scss +36 -0
  46. package/src/app/core/componentes/menu/menu.component.ts +35 -0
  47. package/src/app/core/componentes/tabla-general/tabla-general.component.html +90 -0
  48. package/src/app/core/componentes/tabla-general/tabla-general.component.scss +0 -0
  49. package/src/app/core/componentes/tabla-general/tabla-general.component.ts +96 -0
  50. package/src/app/core/core.module.ts +22 -0
  51. package/src/app/core/errores/authentication.error.ts +6 -0
  52. package/src/app/core/modelos/error-response.model.ts +9 -0
  53. package/src/app/core/modelos/table-column.model.ts +10 -0
  54. package/src/app/core/modelos/user.model.ts +6 -0
  55. package/src/app/core/plantilla-general/plantilla-general.template.html +139 -0
  56. package/src/app/core/plantilla-general/plantilla-general.template.scss +37 -0
  57. package/src/app/core/plantilla-general/plantilla-general.template.ts +233 -0
  58. package/src/app/core/servicios/auth.service.ts +189 -0
  59. package/src/app/core/servicios/cargar-control-funcionalidad.service.ts +49 -0
  60. package/src/app/core/servicios/data-exporter-table.utils.ts +78 -0
  61. package/src/app/core/servicios/error-interceptor.service.ts +208 -0
  62. package/src/app/core/servicios/guardias/auth.guard.ts +51 -0
  63. package/src/app/core/servicios/guardias/publico.guard.ts +26 -0
  64. package/src/app/core/servicios/interceptores/loading-interceptor.ts +37 -0
  65. package/src/app/core/servicios/interceptores/token-interceptor.service.ts +177 -0
  66. package/src/app/core/servicios/loading.service.ts +48 -0
  67. package/src/app/core/servicios/menu.service.ts +153 -0
  68. package/src/app/core/servicios/spinner-service.ts +18 -0
  69. package/src/app/core/servicios/storage.service.ts +68 -0
  70. package/src/app/core/servicios/template.service.ts +91 -0
  71. package/src/app/core/servicios/toast.service.ts +114 -0
  72. package/src/app/core/servicios/utils.service.ts +367 -0
  73. package/src/app/core/sharedlib.module.ts +11 -0
  74. package/src/app/core/utilidades/color.util.ts +197 -0
  75. package/src/app/layout/api/{menuchangeevent.d.ts → menuchangeevent.ts} +4 -4
  76. package/src/app/layout/app.breadcrumb.component.html +20 -0
  77. package/src/app/layout/app.breadcrumb.component.ts +78 -0
  78. package/src/app/layout/app.footer.component.html +18 -0
  79. package/src/app/layout/app.footer.component.ts +15 -0
  80. package/src/app/layout/app.layout.component.html +20 -0
  81. package/src/app/layout/app.layout.component.ts +201 -0
  82. package/src/app/layout/app.layout.module.ts +9 -0
  83. package/src/app/layout/app.menu.component.html +6 -0
  84. package/src/app/layout/app.menu.component.ts +51 -0
  85. package/src/app/layout/app.menu.service.ts +23 -0
  86. package/src/app/layout/app.menuitem.component.ts +252 -0
  87. package/src/app/layout/app.menuprofile.component.html +35 -0
  88. package/src/app/layout/app.menuprofile.component.ts +60 -0
  89. package/src/app/layout/app.rightmenu.component.html +72 -0
  90. package/src/app/layout/app.rightmenu.component.ts +24 -0
  91. package/src/app/layout/app.sidebar.component.html +40 -0
  92. package/src/app/layout/app.sidebar.component.ts +81 -0
  93. package/src/app/layout/app.topbar.component.html +214 -0
  94. package/src/app/layout/app.topbar.component.ts +336 -0
  95. package/src/app/layout/config/app.config.component.html +125 -0
  96. package/src/app/layout/config/app.config.component.ts +206 -0
  97. package/src/app/layout/config/app.config.module.ts +11 -0
  98. package/src/app/layout/service/app.layout.service.ts +191 -0
  99. package/src/app/publico/pages/login/login.page.html +53 -0
  100. package/src/app/publico/pages/login/login.page.scss +166 -0
  101. package/src/app/publico/pages/login/login.page.ts +128 -0
  102. package/src/app/publico/pages/not-found/not-found.page.html +35 -0
  103. package/src/app/publico/pages/not-found/not-found.page.scss +2 -0
  104. package/src/app/publico/pages/not-found/not-found.page.ts +46 -0
  105. package/src/app/publico/pages/seleccion-rol/seleccion-rol.component.html +58 -0
  106. package/src/app/publico/pages/seleccion-rol/seleccion-rol.component.scss +49 -0
  107. package/src/app/publico/pages/seleccion-rol/seleccion-rol.component.ts +176 -0
  108. package/src/app/publico/pages/timeout/timeout.page.html +24 -0
  109. package/src/app/publico/pages/timeout/timeout.page.scss +2 -0
  110. package/src/app/publico/pages/timeout/timeout.page.ts +18 -0
  111. package/src/app/seguridad/constantes/ConstantesGenerales.ts +30 -0
  112. package/src/app/seguridad/constantes/ReporteEntradaConstantes.ts +18 -0
  113. package/src/app/seguridad/constantes/ReporteFuenteConstantes.ts +13 -0
  114. package/src/app/seguridad/modelos/AplicacionModel.ts +11 -0
  115. package/src/app/seguridad/modelos/ArchivoPortalModel.ts +16 -0
  116. package/src/app/seguridad/modelos/AtributoPuntoModel.ts +9 -0
  117. package/src/app/seguridad/modelos/AtributoSSOportalModel.ts +22 -0
  118. package/src/app/seguridad/modelos/{AuditoriaArchivoModel.d.ts → AuditoriaArchivoModel.ts} +13 -10
  119. package/src/app/seguridad/modelos/CargueLineaModel.ts +17 -0
  120. package/src/app/seguridad/modelos/ColoresRGB.ts +17 -0
  121. package/src/app/seguridad/modelos/ColumnaFuenteModel.ts +9 -0
  122. package/src/app/seguridad/modelos/{ColumnaWraperModel.d.ts → ColumnaWraperModel.ts} +7 -6
  123. package/src/app/seguridad/modelos/ComplementoModel.ts +10 -0
  124. package/src/app/seguridad/modelos/ComponentePaginaModel.ts +22 -0
  125. package/src/app/seguridad/modelos/ConexionModel.ts +15 -0
  126. package/src/app/seguridad/modelos/{ContenidoHtmlPortalModel.d.ts → ContenidoHtmlPortalModel.ts} +25 -20
  127. package/src/app/seguridad/modelos/ControlFuncionModel.ts +10 -0
  128. package/src/app/seguridad/modelos/CorreoModel.ts +45 -0
  129. package/src/app/seguridad/modelos/CorreoWSModel.ts +49 -0
  130. package/src/app/seguridad/modelos/CruceRecursoPuntoModel.ts +14 -0
  131. package/src/app/seguridad/modelos/{DatoInicioModel.d.ts → DatoInicioModel.ts} +7 -6
  132. package/src/app/seguridad/modelos/{EjecucionReporteDataModel.d.ts → EjecucionReporteDataModel.ts} +21 -20
  133. package/src/app/seguridad/modelos/EmpresaModel.ts +25 -0
  134. package/src/app/seguridad/modelos/EmpresaSeguridadModel.ts +19 -0
  135. package/src/app/seguridad/modelos/{EntradaComplementoModel.d.ts → EntradaComplementoModel.ts} +9 -6
  136. package/src/app/seguridad/modelos/EtiquetaModel.ts +4 -0
  137. package/src/app/seguridad/modelos/Etiquetas.ts +14 -0
  138. package/src/app/seguridad/modelos/{ForeingWraperModel.d.ts → ForeingWraperModel.ts} +9 -6
  139. package/src/app/seguridad/modelos/FuenteCampoAtributoModel.ts +21 -0
  140. package/src/app/seguridad/modelos/{FuenteCampoModel.d.ts → FuenteCampoModel.ts} +20 -16
  141. package/src/app/seguridad/modelos/FuenteDato.ts +19 -0
  142. package/src/app/seguridad/modelos/FuenteEntradaModel.ts +9 -0
  143. package/src/app/seguridad/modelos/{FuenteGeneralModel.d.ts → FuenteGeneralModel.ts} +55 -36
  144. package/src/app/seguridad/modelos/FuenteLineaServicioModel.ts +19 -0
  145. package/src/app/seguridad/modelos/FuenteProcesoGeneralModel.ts +14 -0
  146. package/src/app/seguridad/modelos/{FuenteServicioModel.d.ts → FuenteServicioModel.ts} +61 -47
  147. package/src/app/seguridad/modelos/FuncionalidadModel.ts +12 -0
  148. package/src/app/seguridad/modelos/GeneralModel.ts +16 -0
  149. package/src/app/seguridad/modelos/{GrupoAccesoModel.d.ts → GrupoAccesoModel.ts} +9 -6
  150. package/src/app/seguridad/modelos/GrupoControlFuncionModel.ts +12 -0
  151. package/src/app/seguridad/modelos/GrupoFuenteModel.ts +17 -0
  152. package/src/app/seguridad/modelos/GrupoPermisoModel.ts +16 -0
  153. package/src/app/seguridad/modelos/{JoinFromModel.d.ts → JoinFromModel.ts} +4 -4
  154. package/src/app/seguridad/modelos/ListaServicioModel.ts +18 -0
  155. package/src/app/seguridad/modelos/LlaveForaneaModel.ts +6 -0
  156. package/src/app/seguridad/modelos/LoginModel.ts +19 -0
  157. package/src/app/seguridad/modelos/MensajeSistemaModel.ts +10 -0
  158. package/src/app/seguridad/modelos/{MenuPortalModel.d.ts → MenuPortalModel.ts} +5 -4
  159. package/src/app/seguridad/modelos/ModulosModel.ts +17 -0
  160. package/src/app/seguridad/modelos/{ObjetoReporteModel.d.ts → ObjetoReporteModel.ts} +6 -5
  161. package/src/app/seguridad/modelos/PaginaPortalModel.ts +23 -0
  162. package/src/app/seguridad/modelos/ParametroComponenteModel.ts +9 -0
  163. package/src/app/seguridad/modelos/ParametrosGeneralModel.ts +16 -0
  164. package/src/app/seguridad/modelos/PermisoFuncionModel.ts +11 -0
  165. package/src/app/seguridad/modelos/PermisocontenidoModel.ts +20 -0
  166. package/src/app/seguridad/modelos/{PeticionModel.d.ts → PeticionModel.ts} +20 -15
  167. package/src/app/seguridad/modelos/PreguntaSeguridadModel.ts +9 -0
  168. package/src/app/seguridad/modelos/PropiedadModel.ts +12 -0
  169. package/src/app/seguridad/modelos/PublicacionWebModel.ts +29 -0
  170. package/src/app/seguridad/modelos/PuntoProcesoModel.ts +7 -0
  171. package/src/app/seguridad/modelos/RecursoPunto.ts +13 -0
  172. package/src/app/seguridad/modelos/RecursoPuntoModel.ts +13 -0
  173. package/src/app/seguridad/modelos/ReporteBanda.ts +9 -0
  174. package/src/app/seguridad/modelos/ReporteColumna.ts +33 -0
  175. package/src/app/seguridad/modelos/ReporteColumnario.ts +82 -0
  176. package/src/app/seguridad/modelos/ReporteColumnarioMarcador.ts +31 -0
  177. package/src/app/seguridad/modelos/{ReporteEntradaModel.d.ts → ReporteEntradaModel.ts} +21 -19
  178. package/src/app/seguridad/modelos/{ReporteFuenteModel.d.ts → ReporteFuenteModel.ts} +141 -87
  179. package/src/app/seguridad/modelos/ReporteMarcador.ts +40 -0
  180. package/src/app/seguridad/modelos/ReporteSoporte.ts +10 -0
  181. package/src/app/seguridad/modelos/ReporteTabla.ts +14 -0
  182. package/src/app/seguridad/modelos/RespuestaModel.ts +10 -0
  183. package/src/app/seguridad/modelos/{RolModel.d.ts → RolModel.ts} +41 -37
  184. package/src/app/seguridad/modelos/ServidorCorreoModel.ts +31 -0
  185. package/src/app/seguridad/modelos/SistemaMensajeModel.ts +11 -0
  186. package/src/app/seguridad/modelos/SitioPortalModel.ts +29 -0
  187. package/src/app/seguridad/modelos/TablaFromModel.ts +5 -0
  188. package/src/app/seguridad/modelos/TareasModel.ts +54 -0
  189. package/src/app/seguridad/modelos/TextoModel.ts +11 -0
  190. package/src/app/seguridad/modelos/TipoEtiqueta.ts +8 -0
  191. package/src/app/seguridad/modelos/UnionModel.ts +14 -0
  192. package/src/app/seguridad/modelos/{UsuarioModel.d.ts → UsuarioModel.ts} +60 -49
  193. package/src/app/seguridad/modelos/UsuariogrupoModel.ts +27 -0
  194. package/src/app/seguridad/modelos/aplicacion-propiedad-model.ts +16 -0
  195. package/src/app/seguridad/modelos/contenidoCorreoModel.ts +13 -0
  196. package/src/app/shared/componentes/input-helper-seleccion-plantilla/input-helper-seleccion-plantilla.component.html +47 -0
  197. package/src/app/shared/componentes/input-helper-seleccion-plantilla/input-helper-seleccion-plantilla.component.scss +8 -0
  198. package/src/app/shared/componentes/input-helper-seleccion-plantilla/input-helper-seleccion-plantilla.component.ts +144 -0
  199. package/src/app/shared/servicios/cargar-archivos.service.ts +51 -0
  200. package/src/app/shared/servicios/cargar-mapas.service.ts +43 -0
  201. package/src/app/shared/servicios/encriptado-basico.service.ts +54 -0
  202. package/src/app/shared/servicios/encriptador-simetrico.service.ts +29 -0
  203. package/src/app/shared/servicios/general.service.ts +124 -0
  204. package/src/app/shared/servicios/parametros-navegacion.service.ts +20 -0
  205. package/src/app/shared/servicios/plantillas.service.ts +22 -0
  206. package/src/app/shared/servicios/tarea.service.ts +71 -0
  207. package/src/app/shared/utilidades/translate-loader.util.ts +44 -0
  208. package/src/app/webcommon/pages/cargue-plantilla/cargue-plantilla-general/cargue-plantilla-general.component.html +175 -0
  209. package/src/app/webcommon/pages/cargue-plantilla/cargue-plantilla-general/cargue-plantilla-general.component.scss +78 -0
  210. package/src/app/webcommon/pages/cargue-plantilla/cargue-plantilla-general/cargue-plantilla-general.component.ts +438 -0
  211. package/src/app/webcommon/pages/ejecucion-reporte/detalle-campo-reporte/detalle-campo-reporte.component.html +87 -0
  212. package/src/app/webcommon/pages/ejecucion-reporte/detalle-campo-reporte/detalle-campo-reporte.component.scss +0 -0
  213. package/src/app/webcommon/pages/ejecucion-reporte/detalle-campo-reporte/detalle-campo-reporte.component.ts +189 -0
  214. package/src/app/webcommon/pages/ejecucion-reporte/detalle-distribucion-reporte/detalle-distribucion-reporte.component.html +117 -0
  215. package/src/app/webcommon/pages/ejecucion-reporte/detalle-distribucion-reporte/detalle-distribucion-reporte.component.scss +0 -0
  216. package/src/app/webcommon/pages/ejecucion-reporte/detalle-distribucion-reporte/detalle-distribucion-reporte.component.ts +87 -0
  217. package/src/app/webcommon/pages/ejecucion-reporte/detalle-ejecucion-reporte/detalle-ejecucion-reporte.page.html +158 -0
  218. package/src/app/webcommon/pages/ejecucion-reporte/detalle-ejecucion-reporte/detalle-ejecucion-reporte.page.scss +6 -0
  219. package/src/app/webcommon/pages/ejecucion-reporte/detalle-ejecucion-reporte/detalle-ejecucion-reporte.page.ts +345 -0
  220. package/src/app/webcommon/pages/ejecucion-reporte/detalle-entrada-reporte/detalle-entrada-reporte.component.html +131 -0
  221. package/src/app/webcommon/pages/ejecucion-reporte/detalle-entrada-reporte/detalle-entrada-reporte.component.scss +0 -0
  222. package/src/app/webcommon/pages/ejecucion-reporte/detalle-entrada-reporte/detalle-entrada-reporte.component.ts +198 -0
  223. package/src/app/webcommon/pages/ejecucion-reporte/detalle-punto-proceso-reporte/detalle-punto-proceso-reporte.component.html +206 -0
  224. package/src/app/webcommon/pages/ejecucion-reporte/detalle-punto-proceso-reporte/detalle-punto-proceso-reporte.component.scss +3 -0
  225. package/src/app/webcommon/pages/ejecucion-reporte/detalle-punto-proceso-reporte/detalle-punto-proceso-reporte.component.ts +330 -0
  226. package/src/app/webcommon/pages/ejecucion-reporte/detalle-tipo-reporte/detalle-tipo-reporte.component.html +2121 -0
  227. package/src/app/webcommon/pages/ejecucion-reporte/detalle-tipo-reporte/detalle-tipo-reporte.component.scss +241 -0
  228. package/src/app/webcommon/pages/ejecucion-reporte/detalle-tipo-reporte/detalle-tipo-reporte.component.ts +1694 -0
  229. package/src/app/webcommon/pages/ejecucion-reporte/listado-ejecucion-reporte/listado-ejecucion-reporte.page.html +33 -0
  230. package/src/app/webcommon/pages/ejecucion-reporte/listado-ejecucion-reporte/listado-ejecucion-reporte.page.scss +0 -0
  231. package/src/app/webcommon/pages/ejecucion-reporte/listado-ejecucion-reporte/listado-ejecucion-reporte.page.ts +96 -0
  232. package/src/app/webcommon/pages/ejecucion-reporte-externo/listado-ejecucion-reporte-externo/listado-ejecucion-reporte-externo.component.html +54 -0
  233. package/src/app/webcommon/pages/ejecucion-reporte-externo/listado-ejecucion-reporte-externo/listado-ejecucion-reporte-externo.component.scss +0 -0
  234. package/src/app/webcommon/pages/ejecucion-reporte-externo/listado-ejecucion-reporte-externo/listado-ejecucion-reporte-externo.component.ts +111 -0
  235. package/src/app/webcommon/pages/fuente/importar-fuente-con/importar-fuente-con.component.html +394 -0
  236. package/src/app/webcommon/pages/fuente/importar-fuente-con/importar-fuente-con.component.scss +10 -0
  237. package/src/app/webcommon/pages/fuente/importar-fuente-con/importar-fuente-con.component.ts +599 -0
  238. package/src/app/webcommon/pages/fuente/importar-fuente-general/importar-fuente-general.component.html +130 -0
  239. package/src/app/webcommon/pages/fuente/importar-fuente-general/importar-fuente-general.component.scss +0 -0
  240. package/src/app/webcommon/pages/fuente/importar-fuente-general/importar-fuente-general.component.ts +172 -0
  241. package/src/app/webcommon/pages/fuente-reporte/fuente-reporte.component.html +403 -0
  242. package/src/app/webcommon/pages/fuente-reporte/fuente-reporte.component.scss +5 -0
  243. package/src/app/webcommon/pages/fuente-reporte/fuente-reporte.component.ts +761 -0
  244. package/src/app/webcommon/pages/fuenteGeneral/fuente-general-servicio/fuente-general-servicio.component.html +145 -0
  245. package/src/app/webcommon/pages/fuenteGeneral/fuente-general-servicio/fuente-general-servicio.component.scss +0 -0
  246. package/src/app/webcommon/pages/fuenteGeneral/fuente-general-servicio/fuente-general-servicio.component.ts +302 -0
  247. package/src/app/webcommon/pages/fuenteGeneral/listado-fuente-general/listado-fuente-general.page.html +19 -0
  248. package/src/app/webcommon/pages/fuenteGeneral/listado-fuente-general/listado-fuente-general.page.scss +0 -0
  249. package/src/app/webcommon/pages/fuenteGeneral/listado-fuente-general/listado-fuente-general.page.ts +89 -0
  250. package/src/app/webcommon/pages/fuenteGeneral/mantenimiento-fuente-general/mantenimiento-fuente-general.page.html +714 -0
  251. package/src/app/webcommon/pages/fuenteGeneral/mantenimiento-fuente-general/mantenimiento-fuente-general.page.scss +0 -0
  252. package/src/app/webcommon/pages/fuenteGeneral/mantenimiento-fuente-general/mantenimiento-fuente-general.page.ts +688 -0
  253. package/src/app/webcommon/pipes/dashboard.pipe.ts +79 -0
  254. package/src/app/webcommon/pipes/fuente.pipe.ts +207 -0
  255. package/src/app/webcommon/pipes/general.pipe.ts +1043 -0
  256. package/src/app/webcommon/pipes/reporte-columnario.pipe.ts +101 -0
  257. package/src/app/webcommon/pipes/reporte-fuente.pipe.ts +306 -0
  258. package/src/app/webcommon/pipes/sara-general.pipe.ts +289 -0
  259. package/src/app/webcommon/popups/popup-campos-fuente-general/popup-campos-fuente-general.component.html +90 -0
  260. package/src/app/webcommon/popups/popup-campos-fuente-general/popup-campos-fuente-general.component.scss +0 -0
  261. package/src/app/webcommon/popups/popup-campos-fuente-general/popup-campos-fuente-general.component.ts +262 -0
  262. package/src/app/webcommon/popups/popup-convertir-plantillas/popup-convertir-plantillas.component.html +50 -0
  263. package/src/app/webcommon/popups/popup-convertir-plantillas/popup-convertir-plantillas.component.scss +0 -0
  264. package/src/app/webcommon/popups/popup-convertir-plantillas/popup-convertir-plantillas.component.ts +135 -0
  265. package/src/app/webcommon/popups/popup-editor-formula/popup-editor-formula.component.html +44 -0
  266. package/src/app/webcommon/popups/popup-editor-formula/popup-editor-formula.component.scss +0 -0
  267. package/src/app/webcommon/popups/popup-editor-formula/popup-editor-formula.component.ts +66 -0
  268. package/src/app/webcommon/popups/popup-punto-proceso/popup-punto-proceso.component.html +41 -0
  269. package/src/app/webcommon/popups/popup-punto-proceso/popup-punto-proceso.component.scss +0 -0
  270. package/src/app/webcommon/popups/popup-punto-proceso/popup-punto-proceso.component.ts +283 -0
  271. package/src/app/webcommon/popups/popup-recurso/popup-recurso.component.html +179 -0
  272. package/src/app/webcommon/popups/popup-recurso/popup-recurso.component.scss +3 -0
  273. package/src/app/webcommon/popups/popup-recurso/popup-recurso.component.ts +266 -0
  274. package/src/app/webcommon/popups/popup-reporte/popup-reporte.component.html +273 -0
  275. package/src/app/webcommon/popups/popup-reporte/popup-reporte.component.scss +13 -0
  276. package/src/app/webcommon/popups/popup-reporte/popup-reporte.component.ts +557 -0
  277. package/src/app/webcommon/popups/popup-sentencia/popup-sentencia.component.html +10 -0
  278. package/src/app/webcommon/popups/popup-sentencia/popup-sentencia.component.scss +5 -0
  279. package/src/app/webcommon/popups/popup-sentencia/popup-sentencia.component.ts +58 -0
  280. package/src/app/webcommon/popups/popup-tablas-fuente/popup-tablas-fuente.component.html +71 -0
  281. package/src/app/webcommon/popups/popup-tablas-fuente/popup-tablas-fuente.component.scss +0 -0
  282. package/src/app/webcommon/popups/popup-tablas-fuente/popup-tablas-fuente.component.ts +154 -0
  283. package/src/app/webcommon/popups/punto-proceso-comp/punto-proceso-comp.component.html +11 -0
  284. package/src/app/webcommon/popups/punto-proceso-comp/punto-proceso-comp.component.scss +0 -0
  285. package/src/app/webcommon/popups/punto-proceso-comp/punto-proceso-comp.component.ts +82 -0
  286. package/src/app/webcommon/services/carguelinea.service.ts +74 -0
  287. package/src/app/webcommon/services/dashboard.service.ts +258 -0
  288. package/src/app/webcommon/services/ejecucionreporte.service.ts +160 -0
  289. package/src/app/webcommon/services/fechaUtils.service.ts +127 -0
  290. package/src/app/webcommon/services/fuentegeneral.service.ts +74 -0
  291. package/src/app/webcommon/services/homologacion.service.ts +49 -0
  292. package/src/app/webcommon/services/plantillas.service.ts +165 -0
  293. package/src/app/webcommon/services/reportes.service.ts +133 -0
  294. package/src/app/webcommon/webcommon.module.ts +11 -0
  295. package/src/environments/environment.prod.ts +3 -0
  296. package/src/environments/environment.ts +25 -0
  297. package/src/favicon.ico +0 -0
  298. package/src/index.html +14 -0
  299. package/src/main.ts +12 -0
  300. package/src/polyfills.ts +53 -0
  301. package/src/styles/primeng/sass/overrides/_theme_styles.scss +3 -0
  302. package/src/test.ts +14 -0
  303. package/tsconfig.app.json +15 -0
  304. package/tsconfig.json +35 -0
  305. package/tsconfig.spec.json +18 -0
  306. package/esm2022/general-library-union.mjs +0 -5
  307. package/esm2022/public-api.mjs +0 -180
  308. package/esm2022/src/app/core/componentes/breadcrumb/breadcrumb.component.mjs +0 -40
  309. package/esm2022/src/app/core/componentes/carga-pantalla-completa/carga-pantalla-completa.component.mjs +0 -28
  310. package/esm2022/src/app/core/componentes/filtro-general/filtro-general.component.mjs +0 -196
  311. package/esm2022/src/app/core/componentes/footer/footer.component.mjs +0 -16
  312. package/esm2022/src/app/core/componentes/formulariodinamico/formulariodinamico.component.mjs +0 -272
  313. package/esm2022/src/app/core/componentes/formulariodinamico/objetosformulario/Cambio.mjs +0 -11
  314. package/esm2022/src/app/core/componentes/formulariodinamico/objetosformulario/CampoFormulario.mjs +0 -124
  315. package/esm2022/src/app/core/componentes/formulariodinamico/objetosformulario/CampoFormularioCons.mjs +0 -73
  316. package/esm2022/src/app/core/componentes/formulariodinamico/objetosformulario/CampoFormularioNuevo.mjs +0 -59
  317. package/esm2022/src/app/core/componentes/formulariodinamico/objetosformulario/HashDirective.mjs +0 -21
  318. package/esm2022/src/app/core/componentes/inicio-component/inicio-component.component.mjs +0 -72
  319. package/esm2022/src/app/core/componentes/menu/menu.component.mjs +0 -37
  320. package/esm2022/src/app/core/componentes/tabla-general/tabla-general.component.mjs +0 -93
  321. package/esm2022/src/app/core/core.module.mjs +0 -23
  322. package/esm2022/src/app/core/errores/authentication.error.mjs +0 -7
  323. package/esm2022/src/app/core/modelos/error-response.model.mjs +0 -2
  324. package/esm2022/src/app/core/modelos/table-column.model.mjs +0 -2
  325. package/esm2022/src/app/core/modelos/user.model.mjs +0 -7
  326. package/esm2022/src/app/core/plantilla-general/plantilla-general.template.mjs +0 -230
  327. package/esm2022/src/app/core/servicios/auth.service.mjs +0 -185
  328. package/esm2022/src/app/core/servicios/cargar-control-funcionalidad.service.mjs +0 -57
  329. package/esm2022/src/app/core/servicios/data-exporter-table.utils.mjs +0 -64
  330. package/esm2022/src/app/core/servicios/error-interceptor.service.mjs +0 -214
  331. package/esm2022/src/app/core/servicios/guardias/auth.guard.mjs +0 -66
  332. package/esm2022/src/app/core/servicios/guardias/publico.guard.mjs +0 -35
  333. package/esm2022/src/app/core/servicios/interceptores/loading-interceptor.mjs +0 -37
  334. package/esm2022/src/app/core/servicios/interceptores/token-interceptor.service.mjs +0 -180
  335. package/esm2022/src/app/core/servicios/loading.service.mjs +0 -43
  336. package/esm2022/src/app/core/servicios/menu.service.mjs +0 -146
  337. package/esm2022/src/app/core/servicios/spinner-service.mjs +0 -22
  338. package/esm2022/src/app/core/servicios/storage.service.mjs +0 -68
  339. package/esm2022/src/app/core/servicios/template.service.mjs +0 -99
  340. package/esm2022/src/app/core/servicios/toast.service.mjs +0 -120
  341. package/esm2022/src/app/core/servicios/utils.service.mjs +0 -338
  342. package/esm2022/src/app/core/sharedlib.module.mjs +0 -16
  343. package/esm2022/src/app/core/utilidades/color.util.mjs +0 -177
  344. package/esm2022/src/app/layout/api/menuchangeevent.mjs +0 -2
  345. package/esm2022/src/app/layout/app.breadcrumb.component.mjs +0 -71
  346. package/esm2022/src/app/layout/app.footer.component.mjs +0 -18
  347. package/esm2022/src/app/layout/app.layout.component.mjs +0 -188
  348. package/esm2022/src/app/layout/app.layout.module.mjs +0 -15
  349. package/esm2022/src/app/layout/app.menu.component.mjs +0 -51
  350. package/esm2022/src/app/layout/app.menu.service.mjs +0 -24
  351. package/esm2022/src/app/layout/app.menuitem.component.mjs +0 -296
  352. package/esm2022/src/app/layout/app.menuprofile.component.mjs +0 -78
  353. package/esm2022/src/app/layout/app.rightmenu.component.mjs +0 -24
  354. package/esm2022/src/app/layout/app.sidebar.component.mjs +0 -92
  355. package/esm2022/src/app/layout/app.topbar.component.mjs +0 -346
  356. package/esm2022/src/app/layout/service/app.layout.service.mjs +0 -134
  357. package/esm2022/src/app/publico/pages/login/login.page.mjs +0 -129
  358. package/esm2022/src/app/publico/pages/not-found/not-found.page.mjs +0 -51
  359. package/esm2022/src/app/publico/pages/seleccion-rol/seleccion-rol.component.mjs +0 -167
  360. package/esm2022/src/app/publico/pages/timeout/timeout.page.mjs +0 -20
  361. package/esm2022/src/app/seguridad/constantes/ConstantesGenerales.mjs +0 -30
  362. package/esm2022/src/app/seguridad/constantes/ReporteEntradaConstantes.mjs +0 -19
  363. package/esm2022/src/app/seguridad/modelos/AplicacionModel.mjs +0 -8
  364. package/esm2022/src/app/seguridad/modelos/ArchivoPortalModel.mjs +0 -14
  365. package/esm2022/src/app/seguridad/modelos/AtributoPuntoModel.mjs +0 -9
  366. package/esm2022/src/app/seguridad/modelos/AtributoSSOportalModel.mjs +0 -17
  367. package/esm2022/src/app/seguridad/modelos/AuditoriaArchivoModel.mjs +0 -11
  368. package/esm2022/src/app/seguridad/modelos/CargueLineaModel.mjs +0 -13
  369. package/esm2022/src/app/seguridad/modelos/ColoresRGB.mjs +0 -18
  370. package/esm2022/src/app/seguridad/modelos/ColumnaFuenteModel.mjs +0 -9
  371. package/esm2022/src/app/seguridad/modelos/ColumnaWraperModel.mjs +0 -6
  372. package/esm2022/src/app/seguridad/modelos/ComplementoModel.mjs +0 -7
  373. package/esm2022/src/app/seguridad/modelos/ComponentePaginaModel.mjs +0 -21
  374. package/esm2022/src/app/seguridad/modelos/ConexionModel.mjs +0 -14
  375. package/esm2022/src/app/seguridad/modelos/ContenidoHtmlPortalModel.mjs +0 -21
  376. package/esm2022/src/app/seguridad/modelos/ControlFuncionModel.mjs +0 -8
  377. package/esm2022/src/app/seguridad/modelos/CorreoModel.mjs +0 -35
  378. package/esm2022/src/app/seguridad/modelos/CorreoWSModel.mjs +0 -37
  379. package/esm2022/src/app/seguridad/modelos/CruceRecursoPuntoModel.mjs +0 -14
  380. package/esm2022/src/app/seguridad/modelos/DatoInicioModel.mjs +0 -6
  381. package/esm2022/src/app/seguridad/modelos/EjecucionReporteDataModel.mjs +0 -14
  382. package/esm2022/src/app/seguridad/modelos/EmpresaModel.mjs +0 -25
  383. package/esm2022/src/app/seguridad/modelos/EmpresaSeguridadModel.mjs +0 -19
  384. package/esm2022/src/app/seguridad/modelos/EntradaComplementoModel.mjs +0 -7
  385. package/esm2022/src/app/seguridad/modelos/EtiquetaModel.mjs +0 -5
  386. package/esm2022/src/app/seguridad/modelos/Etiquetas.mjs +0 -12
  387. package/esm2022/src/app/seguridad/modelos/ForeingWraperModel.mjs +0 -6
  388. package/esm2022/src/app/seguridad/modelos/FuenteCampoAtributoModel.mjs +0 -16
  389. package/esm2022/src/app/seguridad/modelos/FuenteCampoModel.mjs +0 -17
  390. package/esm2022/src/app/seguridad/modelos/FuenteDato.mjs +0 -19
  391. package/esm2022/src/app/seguridad/modelos/FuenteEntradaModel.mjs +0 -9
  392. package/esm2022/src/app/seguridad/modelos/FuenteGeneralModel.mjs +0 -37
  393. package/esm2022/src/app/seguridad/modelos/FuenteLineaServicioModel.mjs +0 -16
  394. package/esm2022/src/app/seguridad/modelos/FuenteProcesoGeneralModel.mjs +0 -11
  395. package/esm2022/src/app/seguridad/modelos/FuenteServicioModel.mjs +0 -51
  396. package/esm2022/src/app/seguridad/modelos/FuncionalidadModel.mjs +0 -10
  397. package/esm2022/src/app/seguridad/modelos/GeneralModel.mjs +0 -15
  398. package/esm2022/src/app/seguridad/modelos/GrupoAccesoModel.mjs +0 -7
  399. package/esm2022/src/app/seguridad/modelos/GrupoControlFuncionModel.mjs +0 -10
  400. package/esm2022/src/app/seguridad/modelos/GrupoFuenteModel.mjs +0 -13
  401. package/esm2022/src/app/seguridad/modelos/GrupoPermisoModel.mjs +0 -14
  402. package/esm2022/src/app/seguridad/modelos/JoinFromModel.mjs +0 -5
  403. package/esm2022/src/app/seguridad/modelos/ListaServicioModel.mjs +0 -17
  404. package/esm2022/src/app/seguridad/modelos/LlaveForaneaModel.mjs +0 -7
  405. package/esm2022/src/app/seguridad/modelos/LoginModel.mjs +0 -15
  406. package/esm2022/src/app/seguridad/modelos/MensajeSistemaModel.mjs +0 -8
  407. package/esm2022/src/app/seguridad/modelos/MenuPortalModel.mjs +0 -5
  408. package/esm2022/src/app/seguridad/modelos/ModulosModel.mjs +0 -18
  409. package/esm2022/src/app/seguridad/modelos/ObjetoReporteModel.mjs +0 -6
  410. package/esm2022/src/app/seguridad/modelos/PaginaPortalModel.mjs +0 -20
  411. package/esm2022/src/app/seguridad/modelos/ParametroComponenteModel.mjs +0 -9
  412. package/esm2022/src/app/seguridad/modelos/ParametrosGeneralModel.mjs +0 -15
  413. package/esm2022/src/app/seguridad/modelos/PermisoFuncionModel.mjs +0 -9
  414. package/esm2022/src/app/seguridad/modelos/PermisocontenidoModel.mjs +0 -20
  415. package/esm2022/src/app/seguridad/modelos/PeticionModel.mjs +0 -16
  416. package/esm2022/src/app/seguridad/modelos/PreguntaSeguridadModel.mjs +0 -7
  417. package/esm2022/src/app/seguridad/modelos/PropiedadModel.mjs +0 -10
  418. package/esm2022/src/app/seguridad/modelos/PublicacionWebModel.mjs +0 -27
  419. package/esm2022/src/app/seguridad/modelos/PuntoProcesoModel.mjs +0 -7
  420. package/esm2022/src/app/seguridad/modelos/RecursoPunto.mjs +0 -13
  421. package/esm2022/src/app/seguridad/modelos/RecursoPuntoModel.mjs +0 -13
  422. package/esm2022/src/app/seguridad/modelos/ReporteBanda.mjs +0 -8
  423. package/esm2022/src/app/seguridad/modelos/ReporteColumna.mjs +0 -33
  424. package/esm2022/src/app/seguridad/modelos/ReporteColumnario.mjs +0 -69
  425. package/esm2022/src/app/seguridad/modelos/ReporteColumnarioMarcador.mjs +0 -24
  426. package/esm2022/src/app/seguridad/modelos/ReporteEntradaModel.mjs +0 -20
  427. package/esm2022/src/app/seguridad/modelos/ReporteFuenteModel.mjs +0 -124
  428. package/esm2022/src/app/seguridad/modelos/ReporteMarcador.mjs +0 -40
  429. package/esm2022/src/app/seguridad/modelos/ReporteSoporte.mjs +0 -10
  430. package/esm2022/src/app/seguridad/modelos/ReporteTabla.mjs +0 -13
  431. package/esm2022/src/app/seguridad/modelos/RespuestaModel.mjs +0 -9
  432. package/esm2022/src/app/seguridad/modelos/RolModel.mjs +0 -39
  433. package/esm2022/src/app/seguridad/modelos/ServidorCorreoModel.mjs +0 -28
  434. package/esm2022/src/app/seguridad/modelos/SistemaMensajeModel.mjs +0 -9
  435. package/esm2022/src/app/seguridad/modelos/SitioPortalModel.mjs +0 -25
  436. package/esm2022/src/app/seguridad/modelos/TablaFromModel.mjs +0 -5
  437. package/esm2022/src/app/seguridad/modelos/TareasModel.mjs +0 -54
  438. package/esm2022/src/app/seguridad/modelos/TextoModel.mjs +0 -9
  439. package/esm2022/src/app/seguridad/modelos/TipoEtiqueta.mjs +0 -8
  440. package/esm2022/src/app/seguridad/modelos/UnionModel.mjs +0 -12
  441. package/esm2022/src/app/seguridad/modelos/UsuarioModel.mjs +0 -53
  442. package/esm2022/src/app/seguridad/modelos/UsuariogrupoModel.mjs +0 -24
  443. package/esm2022/src/app/seguridad/modelos/aplicacion-propiedad-model.mjs +0 -15
  444. package/esm2022/src/app/seguridad/modelos/contenidoCorreoModel.mjs +0 -10
  445. package/esm2022/src/app/shared/componentes/input-helper-seleccion-plantilla/input-helper-seleccion-plantilla.component.mjs +0 -154
  446. package/esm2022/src/app/shared/servicios/cargar-archivos.service.mjs +0 -54
  447. package/esm2022/src/app/shared/servicios/cargar-mapas.service.mjs +0 -46
  448. package/esm2022/src/app/shared/servicios/encriptado-basico.service.mjs +0 -53
  449. package/esm2022/src/app/shared/servicios/general.service.mjs +0 -104
  450. package/esm2022/src/app/shared/servicios/parametros-navegacion.service.mjs +0 -21
  451. package/esm2022/src/app/webcommon/pages/cargue-plantilla/cargue-plantilla-general/cargue-plantilla-general.component.mjs +0 -378
  452. package/esm2022/src/app/webcommon/pages/ejecucion-reporte/detalle-campo-reporte/detalle-campo-reporte.component.mjs +0 -187
  453. package/esm2022/src/app/webcommon/pages/ejecucion-reporte/detalle-distribucion-reporte/detalle-distribucion-reporte.component.mjs +0 -85
  454. package/esm2022/src/app/webcommon/pages/ejecucion-reporte/detalle-ejecucion-reporte/detalle-ejecucion-reporte.page.mjs +0 -347
  455. package/esm2022/src/app/webcommon/pages/ejecucion-reporte/detalle-entrada-reporte/detalle-entrada-reporte.component.mjs +0 -206
  456. package/esm2022/src/app/webcommon/pages/ejecucion-reporte/detalle-punto-proceso-reporte/detalle-punto-proceso-reporte.component.mjs +0 -329
  457. package/esm2022/src/app/webcommon/pages/ejecucion-reporte/detalle-tipo-reporte/detalle-tipo-reporte.component.mjs +0 -1583
  458. package/esm2022/src/app/webcommon/pages/ejecucion-reporte/listado-ejecucion-reporte/listado-ejecucion-reporte.page.mjs +0 -105
  459. package/esm2022/src/app/webcommon/pages/ejecucion-reporte-externo/listado-ejecucion-reporte-externo/listado-ejecucion-reporte-externo.component.mjs +0 -114
  460. package/esm2022/src/app/webcommon/pages/fuente/importar-fuente-con/importar-fuente-con.component.mjs +0 -588
  461. package/esm2022/src/app/webcommon/pages/fuente/importar-fuente-general/importar-fuente-general.component.mjs +0 -177
  462. package/esm2022/src/app/webcommon/pages/fuente-reporte/fuente-reporte.component.mjs +0 -767
  463. package/esm2022/src/app/webcommon/pages/fuenteGeneral/fuente-general-servicio/fuente-general-servicio.component.mjs +0 -331
  464. package/esm2022/src/app/webcommon/pages/fuenteGeneral/listado-fuente-general/listado-fuente-general.page.mjs +0 -96
  465. package/esm2022/src/app/webcommon/pages/fuenteGeneral/mantenimiento-fuente-general/mantenimiento-fuente-general.page.mjs +0 -675
  466. package/esm2022/src/app/webcommon/pipes/dashboard.pipe.mjs +0 -86
  467. package/esm2022/src/app/webcommon/pipes/fuente.pipe.mjs +0 -201
  468. package/esm2022/src/app/webcommon/pipes/general.pipe.mjs +0 -916
  469. package/esm2022/src/app/webcommon/pipes/reporte-columnario.pipe.mjs +0 -115
  470. package/esm2022/src/app/webcommon/pipes/reporte-fuente.pipe.mjs +0 -301
  471. package/esm2022/src/app/webcommon/popups/popup-campos-fuente-general/popup-campos-fuente-general.component.mjs +0 -267
  472. package/esm2022/src/app/webcommon/popups/popup-convertir-plantillas/popup-convertir-plantillas.component.mjs +0 -128
  473. package/esm2022/src/app/webcommon/popups/popup-editor-formula/popup-editor-formula.component.mjs +0 -73
  474. package/esm2022/src/app/webcommon/popups/popup-punto-proceso/popup-punto-proceso.component.mjs +0 -293
  475. package/esm2022/src/app/webcommon/popups/popup-recurso/popup-recurso.component.mjs +0 -269
  476. package/esm2022/src/app/webcommon/popups/popup-reporte/popup-reporte.component.mjs +0 -555
  477. package/esm2022/src/app/webcommon/popups/popup-sentencia/popup-sentencia.component.mjs +0 -64
  478. package/esm2022/src/app/webcommon/popups/popup-tablas-fuente/popup-tablas-fuente.component.mjs +0 -162
  479. package/esm2022/src/app/webcommon/popups/punto-proceso-comp/punto-proceso-comp.component.mjs +0 -89
  480. package/esm2022/src/app/webcommon/services/carguelinea.service.mjs +0 -69
  481. package/esm2022/src/app/webcommon/services/dashboard.service.mjs +0 -253
  482. package/esm2022/src/app/webcommon/services/ejecucionreporte.service.mjs +0 -114
  483. package/esm2022/src/app/webcommon/services/fechaUtils.service.mjs +0 -97
  484. package/esm2022/src/app/webcommon/services/fuentegeneral.service.mjs +0 -68
  485. package/esm2022/src/app/webcommon/services/homologacion.service.mjs +0 -50
  486. package/esm2022/src/app/webcommon/services/plantillas.service.mjs +0 -129
  487. package/esm2022/src/app/webcommon/services/reportes.service.mjs +0 -95
  488. package/esm2022/src/app/webcommon/webcommon.module.mjs +0 -15
  489. package/esm2022/src/environments/environment.mjs +0 -24
  490. package/fesm2022/general-library-union.mjs +0 -16036
  491. package/fesm2022/general-library-union.mjs.map +0 -1
  492. package/index.d.ts +0 -5
  493. package/src/app/core/componentes/breadcrumb/breadcrumb.component.d.ts +0 -18
  494. package/src/app/core/componentes/carga-pantalla-completa/carga-pantalla-completa.component.d.ts +0 -14
  495. package/src/app/core/componentes/filtro-general/filtro-general.component.d.ts +0 -34
  496. package/src/app/core/componentes/footer/footer.component.d.ts +0 -9
  497. package/src/app/core/componentes/formulariodinamico/formulariodinamico.component.d.ts +0 -46
  498. package/src/app/core/componentes/formulariodinamico/objetosformulario/CampoFormulario.d.ts +0 -44
  499. package/src/app/core/componentes/formulariodinamico/objetosformulario/CampoFormularioCons.d.ts +0 -45
  500. package/src/app/core/componentes/formulariodinamico/objetosformulario/CampoFormularioNuevo.d.ts +0 -33
  501. package/src/app/core/componentes/formulariodinamico/objetosformulario/HashDirective.d.ts +0 -9
  502. package/src/app/core/componentes/inicio-component/inicio-component.component.d.ts +0 -26
  503. package/src/app/core/componentes/menu/menu.component.d.ts +0 -16
  504. package/src/app/core/componentes/tabla-general/tabla-general.component.d.ts +0 -32
  505. package/src/app/core/core.module.d.ts +0 -8
  506. package/src/app/core/errores/authentication.error.d.ts +0 -3
  507. package/src/app/core/modelos/error-response.model.d.ts +0 -9
  508. package/src/app/core/modelos/table-column.model.d.ts +0 -12
  509. package/src/app/core/modelos/user.model.d.ts +0 -6
  510. package/src/app/core/plantilla-general/plantilla-general.template.d.ts +0 -89
  511. package/src/app/core/servicios/auth.service.d.ts +0 -52
  512. package/src/app/core/servicios/cargar-control-funcionalidad.service.d.ts +0 -19
  513. package/src/app/core/servicios/data-exporter-table.utils.d.ts +0 -11
  514. package/src/app/core/servicios/error-interceptor.service.d.ts +0 -41
  515. package/src/app/core/servicios/guardias/auth.guard.d.ts +0 -17
  516. package/src/app/core/servicios/guardias/publico.guard.d.ts +0 -13
  517. package/src/app/core/servicios/interceptores/loading-interceptor.d.ts +0 -11
  518. package/src/app/core/servicios/interceptores/token-interceptor.service.d.ts +0 -26
  519. package/src/app/core/servicios/loading.service.d.ts +0 -22
  520. package/src/app/core/servicios/menu.service.d.ts +0 -35
  521. package/src/app/core/servicios/spinner-service.d.ts +0 -9
  522. package/src/app/core/servicios/storage.service.d.ts +0 -37
  523. package/src/app/core/servicios/template.service.d.ts +0 -20
  524. package/src/app/core/servicios/toast.service.d.ts +0 -48
  525. package/src/app/core/servicios/utils.service.d.ts +0 -43
  526. package/src/app/core/sharedlib.module.d.ts +0 -6
  527. package/src/app/core/utilidades/color.util.d.ts +0 -70
  528. package/src/app/layout/app.breadcrumb.component.d.ts +0 -28
  529. package/src/app/layout/app.footer.component.d.ts +0 -8
  530. package/src/app/layout/app.layout.component.d.ts +0 -39
  531. package/src/app/layout/app.layout.module.d.ts +0 -6
  532. package/src/app/layout/app.menu.component.d.ts +0 -19
  533. package/src/app/layout/app.menu.service.d.ts +0 -12
  534. package/src/app/layout/app.menuitem.component.d.ts +0 -41
  535. package/src/app/layout/app.menuprofile.component.d.ts +0 -18
  536. package/src/app/layout/app.rightmenu.component.d.ts +0 -10
  537. package/src/app/layout/app.sidebar.component.d.ts +0 -34
  538. package/src/app/layout/app.topbar.component.d.ts +0 -79
  539. package/src/app/layout/service/app.layout.service.d.ts +0 -57
  540. package/src/app/publico/pages/login/login.page.d.ts +0 -40
  541. package/src/app/publico/pages/not-found/not-found.page.d.ts +0 -17
  542. package/src/app/publico/pages/seleccion-rol/seleccion-rol.component.d.ts +0 -41
  543. package/src/app/publico/pages/timeout/timeout.page.d.ts +0 -10
  544. package/src/app/seguridad/constantes/ConstantesGenerales.d.ts +0 -25
  545. package/src/app/seguridad/constantes/ReporteEntradaConstantes.d.ts +0 -7
  546. package/src/app/seguridad/modelos/AplicacionModel.d.ts +0 -7
  547. package/src/app/seguridad/modelos/ArchivoPortalModel.d.ts +0 -13
  548. package/src/app/seguridad/modelos/AtributoPuntoModel.d.ts +0 -8
  549. package/src/app/seguridad/modelos/AtributoSSOportalModel.d.ts +0 -16
  550. package/src/app/seguridad/modelos/CargueLineaModel.d.ts +0 -12
  551. package/src/app/seguridad/modelos/ColoresRGB.d.ts +0 -17
  552. package/src/app/seguridad/modelos/ColumnaFuenteModel.d.ts +0 -8
  553. package/src/app/seguridad/modelos/ComplementoModel.d.ts +0 -6
  554. package/src/app/seguridad/modelos/ComponentePaginaModel.d.ts +0 -20
  555. package/src/app/seguridad/modelos/ConexionModel.d.ts +0 -13
  556. package/src/app/seguridad/modelos/ControlFuncionModel.d.ts +0 -7
  557. package/src/app/seguridad/modelos/CorreoModel.d.ts +0 -31
  558. package/src/app/seguridad/modelos/CorreoWSModel.d.ts +0 -33
  559. package/src/app/seguridad/modelos/CruceRecursoPuntoModel.d.ts +0 -13
  560. package/src/app/seguridad/modelos/EmpresaModel.d.ts +0 -23
  561. package/src/app/seguridad/modelos/EmpresaSeguridadModel.d.ts +0 -18
  562. package/src/app/seguridad/modelos/EtiquetaModel.d.ts +0 -4
  563. package/src/app/seguridad/modelos/Etiquetas.d.ts +0 -10
  564. package/src/app/seguridad/modelos/FuenteCampoAtributoModel.d.ts +0 -15
  565. package/src/app/seguridad/modelos/FuenteDato.d.ts +0 -18
  566. package/src/app/seguridad/modelos/FuenteEntradaModel.d.ts +0 -8
  567. package/src/app/seguridad/modelos/FuenteLineaServicioModel.d.ts +0 -16
  568. package/src/app/seguridad/modelos/FuenteProcesoGeneralModel.d.ts +0 -10
  569. package/src/app/seguridad/modelos/FuncionalidadModel.d.ts +0 -8
  570. package/src/app/seguridad/modelos/GeneralModel.d.ts +0 -8
  571. package/src/app/seguridad/modelos/GrupoControlFuncionModel.d.ts +0 -9
  572. package/src/app/seguridad/modelos/GrupoFuenteModel.d.ts +0 -13
  573. package/src/app/seguridad/modelos/GrupoPermisoModel.d.ts +0 -13
  574. package/src/app/seguridad/modelos/ListaServicioModel.d.ts +0 -16
  575. package/src/app/seguridad/modelos/LlaveForaneaModel.d.ts +0 -6
  576. package/src/app/seguridad/modelos/LoginModel.d.ts +0 -17
  577. package/src/app/seguridad/modelos/MensajeSistemaModel.d.ts +0 -7
  578. package/src/app/seguridad/modelos/ModulosModel.d.ts +0 -14
  579. package/src/app/seguridad/modelos/PaginaPortalModel.d.ts +0 -19
  580. package/src/app/seguridad/modelos/ParametroComponenteModel.d.ts +0 -8
  581. package/src/app/seguridad/modelos/ParametrosGeneralModel.d.ts +0 -8
  582. package/src/app/seguridad/modelos/PermisoFuncionModel.d.ts +0 -8
  583. package/src/app/seguridad/modelos/PermisocontenidoModel.d.ts +0 -18
  584. package/src/app/seguridad/modelos/PreguntaSeguridadModel.d.ts +0 -6
  585. package/src/app/seguridad/modelos/PropiedadModel.d.ts +0 -9
  586. package/src/app/seguridad/modelos/PublicacionWebModel.d.ts +0 -25
  587. package/src/app/seguridad/modelos/PuntoProcesoModel.d.ts +0 -6
  588. package/src/app/seguridad/modelos/RecursoPunto.d.ts +0 -12
  589. package/src/app/seguridad/modelos/RecursoPuntoModel.d.ts +0 -12
  590. package/src/app/seguridad/modelos/ReporteBanda.d.ts +0 -7
  591. package/src/app/seguridad/modelos/ReporteColumna.d.ts +0 -32
  592. package/src/app/seguridad/modelos/ReporteColumnario.d.ts +0 -68
  593. package/src/app/seguridad/modelos/ReporteColumnarioMarcador.d.ts +0 -23
  594. package/src/app/seguridad/modelos/ReporteMarcador.d.ts +0 -39
  595. package/src/app/seguridad/modelos/ReporteSoporte.d.ts +0 -9
  596. package/src/app/seguridad/modelos/ReporteTabla.d.ts +0 -12
  597. package/src/app/seguridad/modelos/RespuestaModel.d.ts +0 -8
  598. package/src/app/seguridad/modelos/ServidorCorreoModel.d.ts +0 -25
  599. package/src/app/seguridad/modelos/SistemaMensajeModel.d.ts +0 -8
  600. package/src/app/seguridad/modelos/SitioPortalModel.d.ts +0 -24
  601. package/src/app/seguridad/modelos/TablaFromModel.d.ts +0 -4
  602. package/src/app/seguridad/modelos/TareasModel.d.ts +0 -49
  603. package/src/app/seguridad/modelos/TextoModel.d.ts +0 -8
  604. package/src/app/seguridad/modelos/TipoEtiqueta.d.ts +0 -7
  605. package/src/app/seguridad/modelos/UnionModel.d.ts +0 -11
  606. package/src/app/seguridad/modelos/UsuariogrupoModel.d.ts +0 -22
  607. package/src/app/seguridad/modelos/aplicacion-propiedad-model.d.ts +0 -13
  608. package/src/app/seguridad/modelos/contenidoCorreoModel.d.ts +0 -9
  609. package/src/app/shared/componentes/input-helper-seleccion-plantilla/input-helper-seleccion-plantilla.component.d.ts +0 -47
  610. package/src/app/shared/servicios/cargar-archivos.service.d.ts +0 -15
  611. package/src/app/shared/servicios/cargar-mapas.service.d.ts +0 -18
  612. package/src/app/shared/servicios/encriptado-basico.service.d.ts +0 -10
  613. package/src/app/shared/servicios/general.service.d.ts +0 -24
  614. package/src/app/shared/servicios/parametros-navegacion.service.d.ts +0 -9
  615. package/src/app/webcommon/pages/cargue-plantilla/cargue-plantilla-general/cargue-plantilla-general.component.d.ts +0 -79
  616. package/src/app/webcommon/pages/ejecucion-reporte/detalle-campo-reporte/detalle-campo-reporte.component.d.ts +0 -79
  617. package/src/app/webcommon/pages/ejecucion-reporte/detalle-distribucion-reporte/detalle-distribucion-reporte.component.d.ts +0 -29
  618. package/src/app/webcommon/pages/ejecucion-reporte/detalle-ejecucion-reporte/detalle-ejecucion-reporte.page.d.ts +0 -69
  619. package/src/app/webcommon/pages/ejecucion-reporte/detalle-entrada-reporte/detalle-entrada-reporte.component.d.ts +0 -51
  620. package/src/app/webcommon/pages/ejecucion-reporte/detalle-punto-proceso-reporte/detalle-punto-proceso-reporte.component.d.ts +0 -77
  621. package/src/app/webcommon/pages/ejecucion-reporte/detalle-tipo-reporte/detalle-tipo-reporte.component.d.ts +0 -278
  622. package/src/app/webcommon/pages/ejecucion-reporte/listado-ejecucion-reporte/listado-ejecucion-reporte.page.d.ts +0 -42
  623. package/src/app/webcommon/pages/ejecucion-reporte-externo/listado-ejecucion-reporte-externo/listado-ejecucion-reporte-externo.component.d.ts +0 -35
  624. package/src/app/webcommon/pages/fuente/importar-fuente-con/importar-fuente-con.component.d.ts +0 -143
  625. package/src/app/webcommon/pages/fuente/importar-fuente-general/importar-fuente-general.component.d.ts +0 -49
  626. package/src/app/webcommon/pages/fuente-reporte/fuente-reporte.component.d.ts +0 -131
  627. package/src/app/webcommon/pages/fuenteGeneral/fuente-general-servicio/fuente-general-servicio.component.d.ts +0 -64
  628. package/src/app/webcommon/pages/fuenteGeneral/listado-fuente-general/listado-fuente-general.page.d.ts +0 -33
  629. package/src/app/webcommon/pages/fuenteGeneral/mantenimiento-fuente-general/mantenimiento-fuente-general.page.d.ts +0 -149
  630. package/src/app/webcommon/pipes/dashboard.pipe.d.ts +0 -48
  631. package/src/app/webcommon/pipes/fuente.pipe.d.ts +0 -136
  632. package/src/app/webcommon/pipes/general.pipe.d.ts +0 -646
  633. package/src/app/webcommon/pipes/reporte-columnario.pipe.d.ts +0 -59
  634. package/src/app/webcommon/pipes/reporte-fuente.pipe.d.ts +0 -193
  635. package/src/app/webcommon/popups/popup-campos-fuente-general/popup-campos-fuente-general.component.d.ts +0 -59
  636. package/src/app/webcommon/popups/popup-convertir-plantillas/popup-convertir-plantillas.component.d.ts +0 -27
  637. package/src/app/webcommon/popups/popup-editor-formula/popup-editor-formula.component.d.ts +0 -21
  638. package/src/app/webcommon/popups/popup-punto-proceso/popup-punto-proceso.component.d.ts +0 -64
  639. package/src/app/webcommon/popups/popup-recurso/popup-recurso.component.d.ts +0 -63
  640. package/src/app/webcommon/popups/popup-reporte/popup-reporte.component.d.ts +0 -105
  641. package/src/app/webcommon/popups/popup-sentencia/popup-sentencia.component.d.ts +0 -21
  642. package/src/app/webcommon/popups/popup-tablas-fuente/popup-tablas-fuente.component.d.ts +0 -42
  643. package/src/app/webcommon/popups/punto-proceso-comp/punto-proceso-comp.component.d.ts +0 -30
  644. package/src/app/webcommon/services/carguelinea.service.d.ts +0 -19
  645. package/src/app/webcommon/services/dashboard.service.d.ts +0 -27
  646. package/src/app/webcommon/services/ejecucionreporte.service.d.ts +0 -34
  647. package/src/app/webcommon/services/fechaUtils.service.d.ts +0 -30
  648. package/src/app/webcommon/services/fuentegeneral.service.d.ts +0 -24
  649. package/src/app/webcommon/services/homologacion.service.d.ts +0 -17
  650. package/src/app/webcommon/services/plantillas.service.d.ts +0 -26
  651. package/src/app/webcommon/services/reportes.service.d.ts +0 -35
  652. package/src/app/webcommon/webcommon.module.d.ts +0 -6
  653. package/src/environments/environment.d.ts +0 -7
@@ -1,1583 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import { FormControl, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
3
- import { GeneralModel } from '../../../../seguridad/modelos/GeneralModel';
4
- import { MessageService } from 'primeng/api';
5
- import { ReporteFuentePipe } from '../../../pipes/reporte-fuente.pipe';
6
- import { TranslateModule } from '@ngx-translate/core';
7
- import { ReporteColumnarioPipe } from '../../../pipes/reporte-columnario.pipe';
8
- import { ReporteColumnaModel } from '../../../../seguridad/modelos/ReporteColumna';
9
- import { ReporteMarcadorModel } from '../../../../seguridad/modelos/ReporteMarcador';
10
- import { ReporteTablaModel } from '../../../../seguridad/modelos/ReporteTabla';
11
- import { ReporteColumnarioModel } from '../../../../seguridad/modelos/ReporteColumnario';
12
- import { ReporteFuenteModel } from '../../../../seguridad/modelos/ReporteFuenteModel';
13
- import { ReporteColumnarioMarcadorModel } from '../../../../seguridad/modelos/ReporteColumnarioMarcador';
14
- import { ReporteBandaModel } from '../../../../seguridad/modelos/ReporteBanda';
15
- import { ReporteSoporteModel } from '../../../../seguridad/modelos/ReporteSoporte';
16
- import { TableModule } from 'primeng/table';
17
- import { TabViewModule } from 'primeng/tabview';
18
- import { InputHelperSeleccionPlantillaComponent } from '../../../../shared/componentes/input-helper-seleccion-plantilla/input-helper-seleccion-plantilla.component';
19
- import { DropdownModule } from 'primeng/dropdown';
20
- import { CommonModule } from '@angular/common';
21
- import { ButtonModule } from 'primeng/button';
22
- import { PickListModule } from 'primeng/picklist';
23
- import { FieldsetModule } from 'primeng/fieldset';
24
- import { AccordionModule } from 'primeng/accordion';
25
- import { InputTextModule } from 'primeng/inputtext';
26
- import { InputTextareaModule } from 'primeng/inputtextarea';
27
- import { FloatLabelModule } from 'primeng/floatlabel';
28
- import { InputNumberModule } from 'primeng/inputnumber';
29
- import { ChartModule } from 'primeng/chart';
30
- import { ColorPickerModule } from 'primeng/colorpicker';
31
- import * as i0 from "@angular/core";
32
- import * as i1 from "@angular/forms";
33
- import * as i2 from "../../../../core/servicios/toast.service";
34
- import * as i3 from "../../../../shared/servicios/general.service";
35
- import * as i4 from "../../../pipes/general.pipe";
36
- import * as i5 from "../../../../core/servicios/auth.service";
37
- import * as i6 from "../../../pipes/reporte-fuente.pipe";
38
- import * as i7 from "primeng/api";
39
- import * as i8 from "../../../../shared/servicios/cargar-archivos.service";
40
- import * as i9 from "../../../../shared/servicios/encriptado-basico.service";
41
- import * as i10 from "../../../../core/servicios/utils.service";
42
- import * as i11 from "@ngx-translate/core";
43
- import * as i12 from "../../../pipes/fuente.pipe";
44
- import * as i13 from "../../../pipes/reporte-columnario.pipe";
45
- import * as i14 from "../../../services/ejecucionreporte.service";
46
- import * as i15 from "../../../services/dashboard.service";
47
- import * as i16 from "../../../pipes/dashboard.pipe";
48
- import * as i17 from "primeng/table";
49
- import * as i18 from "primeng/tabview";
50
- import * as i19 from "primeng/dropdown";
51
- import * as i20 from "@angular/common";
52
- import * as i21 from "primeng/button";
53
- import * as i22 from "primeng/picklist";
54
- import * as i23 from "primeng/fieldset";
55
- import * as i24 from "primeng/accordion";
56
- import * as i25 from "primeng/inputtext";
57
- import * as i26 from "primeng/inputtextarea";
58
- import * as i27 from "primeng/floatlabel";
59
- import * as i28 from "primeng/inputnumber";
60
- import * as i29 from "primeng/chart";
61
- import * as i30 from "primeng/colorpicker";
62
- export class DetalleTipoReporteComponent {
63
- formBuilder;
64
- notificacionesBusService;
65
- generalService;
66
- generalPipe;
67
- authService;
68
- reporteFuentePipe;
69
- confirmationService;
70
- cargarArchivo;
71
- encriptadorArchivo;
72
- utilsService;
73
- translateService;
74
- fuentePipe;
75
- reporteColumnarioPipe;
76
- reporteService;
77
- dashboardService;
78
- dashboardPipe;
79
- listaTipoCifrado = [];
80
- //tab excel
81
- listaExcel = [];
82
- listaNoExcel = [];
83
- listaMarcadorExcel = [];
84
- reporteMarcadorExcel = new ReporteMarcadorModel;
85
- formMarcadorExcel;
86
- verNuevoMarcadorExcel = false;
87
- esMarcador = false;
88
- esImagenFija = false;
89
- //tab plantillas
90
- listaColumnas = [];
91
- listaMarcadores = [];
92
- listaTipoMarcador;
93
- listaTipoGrafico_JFC;
94
- listaGrafico;
95
- listaGraficoSencillo;
96
- listaAlineacion;
97
- listaOperaciones;
98
- reporteMarcador = new ReporteMarcadorModel;
99
- formMarcador;
100
- origenMarcador = null;
101
- verNuevoMarcador = false;
102
- listaCamposMarcador = [];
103
- campoMarcadorInsertar = new ReporteTablaModel;
104
- listaSoportes = [];
105
- soporteIngresar = new ReporteSoporteModel;
106
- clickGuardarMarcadorCampo = false;
107
- clickGuardarMarcadorExcel = false;
108
- verReporteMarcadorDetalle = false;
109
- verSoporteArchivoDetalle = false;
110
- clickGuardarSoporteArchivo = false;
111
- habilitaCampo = false;
112
- bloquearCampoMarcador = false;
113
- bloquearSoporte = false;
114
- //reporte dinamico
115
- listaTipoBanda = [
116
- { key: 'banda1', value: 'Banda 1' },
117
- { key: 'banda2', value: 'Banda 2' },
118
- { key: 'banda3', value: 'Banda 3' },
119
- { key: 'banda4', value: 'Banda 4' },
120
- { key: 'banda5', value: 'Banda 5' },
121
- { key: 'detalle', value: 'Detalle' },
122
- { key: 'summary', value: 'Resumen' },
123
- ];
124
- existeJasper = false;
125
- bandaSeleccionada = { key: null, value: null };
126
- nuevaBanda = false;
127
- verTabBanda = false;
128
- nuevoReporteMarcadorDinamico = false;
129
- reporteMarcadorDinamico = new ReporteMarcadorModel;
130
- reporteBanda = new ReporteBandaModel;
131
- formReporteDinamico;
132
- listaMarcadorDinamico = [];
133
- listaTipoCampoJasperDinamico = [
134
- { key: 'C', value: 'Calculo' },
135
- { key: 'T', value: 'Columna' },
136
- ];
137
- listaTipoDatoSintaxis = [
138
- { key: 'F', value: 'Fecha' },
139
- { key: 'N', value: 'Numero' },
140
- { key: 'T', value: 'Texto' },
141
- ];
142
- //reporte tabla
143
- listaTabla = [];
144
- listaNoTabla = [];
145
- //reporte texto
146
- listaSeparadores;
147
- clickGuardarReporteTexto = false;
148
- listaMarcadoresTexto = [];
149
- marcadorTexto = new ReporteMarcadorModel();
150
- verNuevoMarcadorTexto = false;
151
- listaTipoMarcadorTexto;
152
- clickGuardarMarcadorTexto = false;
153
- //reporte XML
154
- listaTipoMarcadorXML;
155
- listaXML = [];
156
- marcadorXML = new ReporteMarcadorModel;
157
- clickGuardarMarcadorXML = false;
158
- verNuevoMarcadorXML = false;
159
- listaCamposMarcadorXML = [];
160
- campoMarcadorInsertarXML = new ReporteTablaModel;
161
- verReporteMarcadorDetalleXML = false;
162
- clickGuardarMarcadorCampoXML = false;
163
- //reporte columnario
164
- listaReporteColumnario = [];
165
- verNuevoReporteColumnario = false;
166
- columnaBasica;
167
- clickGuardarReporteColumnario = false;
168
- listaTipoColumnas;
169
- listaOperacionesColumnario;
170
- listaOperacionesExcelColumnario;
171
- listaOrdenamiento;
172
- verNuevoColumnaAdicional = false;
173
- clickGuardarColumnaAdicional = false;
174
- columnasAdicionales = [];
175
- columnaAdicional;
176
- listaTipoMarcadorColumnario;
177
- verNuevoMarcadorColumnario = false;
178
- clickGuardarMarcadorColumnario = false;
179
- marcadoresColumnario = [];
180
- marcadorColumnario;
181
- //grafica
182
- listaTipoGrafico;
183
- paginadorColumnas = [];
184
- paginadorColoresGrafica = [];
185
- colorCategoria = new ReporteBandaModel();
186
- verColorCategoriaDetalle = false;
187
- clickGuardarColorCategoria = false;
188
- grafica;
189
- tipoGrafica;
190
- reporteFuente = new ReporteFuenteModel();
191
- llaveEmpresa;
192
- listaSiNo;
193
- llaveReporte;
194
- aplicacion;
195
- listaFuentes = [];
196
- _subsciprtions = [];
197
- constructor(formBuilder, notificacionesBusService, generalService, generalPipe, authService, reporteFuentePipe, confirmationService, cargarArchivo, encriptadorArchivo, utilsService, translateService, fuentePipe, reporteColumnarioPipe, reporteService, dashboardService, dashboardPipe) {
198
- this.formBuilder = formBuilder;
199
- this.notificacionesBusService = notificacionesBusService;
200
- this.generalService = generalService;
201
- this.generalPipe = generalPipe;
202
- this.authService = authService;
203
- this.reporteFuentePipe = reporteFuentePipe;
204
- this.confirmationService = confirmationService;
205
- this.cargarArchivo = cargarArchivo;
206
- this.encriptadorArchivo = encriptadorArchivo;
207
- this.utilsService = utilsService;
208
- this.translateService = translateService;
209
- this.fuentePipe = fuentePipe;
210
- this.reporteColumnarioPipe = reporteColumnarioPipe;
211
- this.reporteService = reporteService;
212
- this.dashboardService = dashboardService;
213
- this.dashboardPipe = dashboardPipe;
214
- }
215
- ngOnInit() {
216
- this.aplicacion = this.authService.getTokenKey('aplicacion');
217
- this.llaveEmpresa = this.authService.getTokenKey('llaveEmpresa');
218
- this.listaSiNo = this.generalPipe.LISTA_SINO;
219
- this.listaTipoMarcadorColumnario = this.reporteColumnarioPipe.MAPA_TIPO_MARCADOR;
220
- this.listaTipoColumnas = this.reporteColumnarioPipe.MAPA_TIPO_COLUMNAS;
221
- this.listaOperacionesColumnario = this.reporteColumnarioPipe.MAPA_OPERACIONES_COLUMNARIO;
222
- this.listaOperacionesExcelColumnario = this.reporteColumnarioPipe.MAPA_OPERACIONES_COLUMNARIO_EXCEL;
223
- this.listaOrdenamiento = this.reporteColumnarioPipe.MAPA_ORDENAMIENTO;
224
- this.listaSeparadores = this.fuentePipe.LISTA_SEPARADORES;
225
- this.listaTipoMarcador = this.reporteFuentePipe.LISTA_MARCADORES;
226
- this.listaTipoGrafico_JFC = this.reporteFuentePipe.LISTA_TIPO_GRAFICO_JFC;
227
- this.listaGrafico = this.reporteFuentePipe.LISTA_RECURSO_GRAFICA;
228
- this.listaGraficoSencillo = this.reporteFuentePipe.RECURSO_GRAFICA;
229
- this.listaAlineacion = this.reporteFuentePipe.LISTA_ALINEACION;
230
- this.listaOperaciones = this.generalPipe.MAPAOPERACIONES;
231
- this.listaTipoMarcadorTexto = this.reporteFuentePipe.TIPOMARCADORESTEXTO;
232
- this.listaTipoMarcadorXML = this.reporteFuentePipe.LISTA_MARCADORES_XML;
233
- this.listaTipoGrafico = this.reporteFuentePipe.LISTA_TIPO_GRAFICO;
234
- this.cargar();
235
- this.cargarFormMarcadorExcel();
236
- this.cargarFormMarcador();
237
- this.cargarFormDinamico();
238
- this.agregarSubscripciones();
239
- //this.cargarListas();
240
- }
241
- ngOnDestroy() {
242
- this._subsciprtions.forEach((sub) => {
243
- sub.unsubscribe();
244
- });
245
- }
246
- agregarSubscripciones() {
247
- this._subsciprtions.push(this.formMarcadorExcel.get('tipo').valueChanges.subscribe((value) => {
248
- const textoRegistroControl = this.formMarcadorExcel.get('textoRegistro');
249
- const origenControl = this.formMarcadorExcel.get('origen');
250
- if (!value) {
251
- this.esImagenFija = true;
252
- this.esMarcador = true;
253
- origenControl.clearValidators();
254
- textoRegistroControl.clearValidators();
255
- }
256
- else if (['MA'].includes(value)) {
257
- this.esImagenFija = false;
258
- this.esMarcador = true;
259
- textoRegistroControl.setValidators(Validators.required);
260
- origenControl.clearValidators();
261
- }
262
- else if (['IF'].includes(value)) {
263
- this.esImagenFija = true;
264
- this.esMarcador = false;
265
- origenControl.setValidators(Validators.required);
266
- textoRegistroControl.setValidators(Validators.required);
267
- }
268
- textoRegistroControl.updateValueAndValidity();
269
- origenControl.updateValueAndValidity();
270
- }));
271
- this._subsciprtions.push(this.formMarcador.get('tipo').valueChanges.subscribe((value) => {
272
- console.log('entra a tipo: ');
273
- console.log(value);
274
- this.formMarcador.clearValidators();
275
- this.reporteMarcador.tipo = value;
276
- if (this.reporteMarcador.tipo == this.reporteFuentePipe.MARCADORTABLA) {
277
- // this.reporteMarcador.tieneSql = 'N'
278
- // this.formMarcador.get('tieneSql').setValue('N')
279
- }
280
- this.formMarcador.updateValueAndValidity();
281
- }));
282
- this._subsciprtions.push(this.formMarcador.get('origen').valueChanges.subscribe((value) => {
283
- this.formMarcador.clearValidators();
284
- this.reporteMarcador.origen = value;
285
- this.formMarcador.updateValueAndValidity();
286
- }));
287
- this._subsciprtions.push(this.formMarcador.get('tieneSql').valueChanges.subscribe((value) => {
288
- console.log('entra a tieneSql: ');
289
- console.log(value);
290
- this.formMarcador.clearValidators();
291
- this.reporteMarcador.tieneSql = value;
292
- this.formMarcador.updateValueAndValidity();
293
- }));
294
- this._subsciprtions.push(this.formMarcador.get('tipoGrafico').valueChanges.subscribe((value) => {
295
- this.formMarcador.clearValidators();
296
- this.reporteMarcador.tipoGrafico = value;
297
- this.formMarcador.updateValueAndValidity();
298
- }));
299
- this._subsciprtions.push(this.formMarcadorExcel.get('origen').valueChanges.subscribe((value) => {
300
- if (['U'].includes(value)) {
301
- this.reporteMarcadorExcel.origen = 'U';
302
- }
303
- else if (['C'].includes(value)) {
304
- this.reporteMarcadorExcel.origen = 'C';
305
- }
306
- }));
307
- this._subsciprtions.push(this.formReporteDinamico.get('tipoCampo').valueChanges.subscribe((value) => {
308
- this.reporteMarcadorDinamico.tipoCampo = value;
309
- const resultadoXControl = this.formReporteDinamico.get('resultadoX');
310
- const resultadoYControl = this.formReporteDinamico.get('resultadoY');
311
- if (this.bandaSeleccionada.key != 'detalle') {
312
- resultadoXControl.setValidators(Validators.required);
313
- resultadoYControl.setValidators(Validators.required);
314
- }
315
- else {
316
- resultadoXControl.clearValidators();
317
- resultadoYControl.clearValidators();
318
- }
319
- const marcadorControl = this.formReporteDinamico.get('marcador');
320
- const filtroControl = this.formReporteDinamico.get('filtro');
321
- const tipoDatoControl = this.formReporteDinamico.get('tipoDato');
322
- if (this.reporteMarcadorDinamico.tipoCampo == 'T') {
323
- marcadorControl.setValidators(Validators.required);
324
- filtroControl.clearValidators();
325
- tipoDatoControl.clearValidators();
326
- }
327
- else {
328
- marcadorControl.clearValidators();
329
- filtroControl.setValidators(Validators.required);
330
- tipoDatoControl.setValidators(Validators.required);
331
- }
332
- marcadorControl.updateValueAndValidity();
333
- filtroControl.updateValueAndValidity();
334
- tipoDatoControl.updateValueAndValidity();
335
- resultadoXControl.updateValueAndValidity();
336
- resultadoYControl.updateValueAndValidity();
337
- }), this.formReporteDinamico.get('tipoDato').valueChanges.subscribe((value) => {
338
- this.reporteMarcadorDinamico.tipoDato = value;
339
- }));
340
- }
341
- cambiarTab(event) {
342
- switch (event.index) {
343
- case 0:
344
- this.cargar();
345
- this.cargarListasExcel();
346
- break;
347
- case 1:
348
- this.cargarListaMarcadores();
349
- if (this.reporteFuente.unicoArchivo == 'N') {
350
- this.cargarListaSoportes();
351
- }
352
- break;
353
- case 2:
354
- this.validarExisteJasper();
355
- break;
356
- case 3:
357
- this.cargarListaMarcadoresTexto();
358
- break;
359
- case 4:
360
- this.cargarListasTabla();
361
- break;
362
- case 5:
363
- this.cargarListaXML();
364
- break;
365
- case 6:
366
- this.cargarReporteColumnario();
367
- break;
368
- case 7:
369
- this.cargarGraficasColumnas();
370
- break;
371
- default:
372
- break;
373
- }
374
- }
375
- cargarListasTabla() {
376
- this.generalService.queryForList(new GeneralModel('ReporteColumnaDTO', null, false, { buscarOrdenTabla: 'S', ordenarTabla: 'S', reporteFuente: this.reporteFuente.llave })).subscribe(data => {
377
- this.listaTabla = data;
378
- });
379
- this.generalService.queryForList(new GeneralModel('ReporteColumnaDTO', null, false, { buscarOrdenTabla: 'N', reporteFuente: this.reporteFuente.llave })).subscribe(data => {
380
- this.listaNoTabla = data;
381
- });
382
- }
383
- cargarListaMarcadores() {
384
- this.generalService.queryForList(new GeneralModel('ReporteMarcadorDTO', null, false, { tipoReporte: 'P', reporteFuente: this.reporteFuente.llave, ordenDinamico: this.generalPipe.SI })).subscribe(data => {
385
- this.listaMarcadores = data;
386
- });
387
- }
388
- cargarListasExcel() {
389
- this.generalService.queryForList(new GeneralModel('ReporteColumnaDTO', null, false, { ordenExcel: 'S', reporteFuente: this.reporteFuente.llave })).subscribe(data => {
390
- this.listaExcel = data;
391
- });
392
- this.generalService.queryForList(new GeneralModel('ReporteColumnaDTO', null, false, { ordenExcel: 'N', reporteFuente: this.reporteFuente.llave })).subscribe(data => {
393
- this.listaNoExcel = data;
394
- });
395
- this.generalService.queryForList(new GeneralModel('ReporteMarcadorDTO', null, false, { tipoReporte: 'E', reporteFuente: this.reporteFuente.llave, ordenDinamico: this.generalPipe.SI })).subscribe(data => {
396
- this.listaMarcadorExcel = data;
397
- });
398
- }
399
- cargarListaColumnas() {
400
- this.listaColumnas = [];
401
- this.generalService.queryForList(new GeneralModel('ReporteColumnaDTO', null, false, { reporteFuente: this.reporteFuente.llave })).subscribe(data => {
402
- this.listaColumnas = data;
403
- });
404
- }
405
- cargarListas() {
406
- this.listaTipoCifrado = [];
407
- this.generalService.queryForList(new GeneralModel('EncripcionArchivoDTO', null, false, {})).subscribe(data => {
408
- this.listaTipoCifrado = data;
409
- });
410
- this.cargarListaColumnas();
411
- }
412
- cargarFormMarcadorExcel() {
413
- this.formMarcadorExcel = this.formBuilder.group({
414
- descripcion: new FormControl(this.reporteMarcadorExcel.descripcion, [Validators.required, Validators.maxLength(100)]),
415
- marcador: new FormControl(this.reporteMarcadorExcel.marcador, [Validators.required, Validators.maxLength(50)]),
416
- tipo: new FormControl(this.reporteMarcadorExcel.tipo, [Validators.required]),
417
- textoRegistro: new FormControl(this.reporteMarcadorExcel.textoRegistro),
418
- origen: new FormControl(this.reporteMarcadorExcel.origen),
419
- //campos bd
420
- llave: new FormControl(this.reporteMarcadorExcel.llave),
421
- reporteFuente: new FormControl(this.reporteFuente.llave),
422
- tipoReporte: new FormControl('E')
423
- });
424
- }
425
- cargarFormMarcador() {
426
- this.formMarcador = this.formBuilder.group({
427
- descripcion: new FormControl(this.reporteMarcador.descripcion, [Validators.required, Validators.maxLength(100)]),
428
- tipo: new FormControl(this.reporteMarcador.tipo, [Validators.required]),
429
- marcador: new FormControl(this.reporteMarcador.marcador, [Validators.maxLength(50)]),
430
- tabla: new FormControl(this.reporteMarcador.tabla),
431
- origen: new FormControl(this.reporteMarcador.origen),
432
- textoRegistro: new FormControl(this.reporteMarcador.textoRegistro),
433
- reporteColumna: new FormControl(this.reporteMarcador.reporteColumna),
434
- formato: new FormControl(this.reporteMarcador.formato),
435
- ancho: new FormControl(this.reporteMarcador.ancho),
436
- alto: new FormControl(this.reporteMarcador.alto),
437
- grupo1: new FormControl(this.reporteMarcador.grupo1),
438
- grupo2: new FormControl(this.reporteMarcador.grupo2),
439
- grupo3: new FormControl(this.reporteMarcador.grupo3),
440
- finalGrupo: new FormControl(this.reporteMarcador.finalGrupo),
441
- tieneSql: new FormControl(this.reporteMarcador.tieneSql),
442
- query: new FormControl(this.reporteMarcador.query),
443
- fuente: new FormControl(this.reporteMarcador.fuente),
444
- tipoGrafico: new FormControl(this.reporteMarcador.tipoGrafico),
445
- marcadorGrafico: new FormControl(this.reporteMarcador.marcadorGrafico),
446
- titulox: new FormControl(this.reporteMarcador.titulox),
447
- tituloy: new FormControl(this.reporteMarcador.tituloy),
448
- banda: new FormControl(this.reporteMarcador.banda),
449
- anchoJasperLabel: new FormControl(this.reporteMarcador.anchoJasperLabel),
450
- filtro: new FormControl(this.reporteMarcador.filtro),
451
- //campos bd
452
- llave: new FormControl(this.reporteMarcador.llave),
453
- reporteFuente: new FormControl(this.reporteFuente.llave),
454
- tipoReporte: new FormControl('N')
455
- });
456
- }
457
- cargarFormDinamico() {
458
- this.formReporteDinamico = this.formBuilder.group({
459
- tipoCampo: new FormControl(this.reporteMarcadorDinamico.tipoCampo, [Validators.required]),
460
- tipoDato: new FormControl(this.reporteMarcadorDinamico.tipoDato),
461
- filtro: new FormControl(this.reporteMarcadorDinamico.filtro),
462
- marcador: new FormControl(this.reporteMarcadorDinamico.marcador),
463
- alto: new FormControl(this.reporteMarcadorDinamico.alto, [Validators.required]),
464
- formato: new FormControl(this.reporteMarcadorDinamico.formato),
465
- descripcion: new FormControl(this.reporteMarcadorDinamico.descripcion),
466
- ancho: new FormControl(this.reporteMarcadorDinamico.ancho, [Validators.required]),
467
- anchoJasperLabel: new FormControl(this.reporteMarcadorDinamico.anchoJasperLabel),
468
- resultadoX: new FormControl(this.reporteMarcadorDinamico.resultadoX),
469
- resultadoY: new FormControl(this.reporteMarcadorDinamico.resultadoY),
470
- titulox: new FormControl(this.reporteMarcadorDinamico.titulox),
471
- tituloy: new FormControl(this.reporteMarcadorDinamico.tituloy),
472
- tipoReporte: new FormControl(this.reporteMarcadorDinamico.tipoReporte, [Validators.required]),
473
- tipoGrafico: new FormControl(this.reporteMarcadorDinamico.tipoGrafico),
474
- operacion: new FormControl(this.reporteMarcadorDinamico.operacion),
475
- //campos tabla
476
- origen: new FormControl('D'),
477
- banda: new FormControl(this.bandaSeleccionada.key),
478
- reporteFuente: new FormControl(this.reporteFuente.llave),
479
- llave: new FormControl(this.reporteMarcadorDinamico.llave),
480
- });
481
- }
482
- cargar() {
483
- this.existeJasper = false;
484
- if (this.llaveReporte) {
485
- this.generalService.queryForObject(new GeneralModel('ReporteFuenteDTO', null, false, { llave: this.llaveReporte })).subscribe(data => {
486
- this.reporteFuente = data;
487
- this.cargarListasExcel();
488
- this.cargarListas();
489
- });
490
- }
491
- }
492
- actualizar() {
493
- if (this.reporteFuente.llave) {
494
- this.generalService.update(new GeneralModel('ReporteFuenteDTO', null, false, this.reporteFuente)).subscribe(data => {
495
- this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_ACTUALIZAR);
496
- if (this.reporteFuente.unicoArchivo == 'N') {
497
- }
498
- });
499
- }
500
- else {
501
- this.reporteService.guardarReporte(this.reporteFuente).subscribe(data => {
502
- this.reporteFuente = data;
503
- this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_GUARDAR);
504
- });
505
- }
506
- }
507
- obtenerArchivo(event) {
508
- this.reporteFuente.archivoTodo = event.data;
509
- }
510
- obtenerArchivoMarcadorExcel(event) {
511
- this.reporteMarcador.textoRegistro = event.data;
512
- }
513
- obtenerArchivoMarcador(event) {
514
- this.reporteMarcador.textoRegistro = event.data;
515
- }
516
- obtenerArchivoPlanilla(event) {
517
- this.reporteFuente.archivoIndividual = event.data;
518
- }
519
- obtenerArchivoSoporte(event, soporte) {
520
- soporte.archivoIndividual = event.data;
521
- }
522
- obtenerArchivoColumnario(event) {
523
- this.reporteFuente.archivoExcelColumnario = event.data;
524
- }
525
- moverAAsociado(event) {
526
- this.reporteService.actualizarReporteColumnaOrden({
527
- listaAsociado: this.listaExcel,
528
- excel: true
529
- }).subscribe(data => { this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR_VARIOS); });
530
- }
531
- moverADesasociado(event) {
532
- this.reporteService.actualizarReporteColumnaOrden({
533
- listaDesasociado: this.listaNoExcel,
534
- excel: true
535
- }).subscribe(data => { this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR_VARIOS); });
536
- }
537
- moverAAsociadoTabla(event) {
538
- this.reporteService.actualizarReporteColumnaOrden({
539
- listaAsociado: this.listaTabla,
540
- excel: false
541
- }).subscribe(data => { this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR_VARIOS); });
542
- }
543
- moverADesasociadoTabla(event) {
544
- this.reporteService.actualizarReporteColumnaOrden({
545
- listaDesasociado: this.listaNoTabla,
546
- excel: false
547
- }).subscribe(data => { this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR_VARIOS); });
548
- }
549
- reorderTabla(event) {
550
- this.reporteService.actualizarReporteColumnaOrden({
551
- listaAsociado: this.listaTabla,
552
- excel: false
553
- }).subscribe(data => { this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR_VARIOS); });
554
- }
555
- verDetalleMarcadorExcel(event) {
556
- this.formMarcadorExcel.reset();
557
- this.verNuevoMarcadorExcel = true;
558
- this.reporteMarcadorExcel = event.data;
559
- this.formMarcadorExcel.patchValue(this.reporteMarcadorExcel);
560
- }
561
- nuevoMarcadorExcel() {
562
- this.formMarcadorExcel.reset();
563
- this.verNuevoMarcadorExcel = true;
564
- this.esMarcador = false;
565
- this.esImagenFija = false;
566
- this.reporteMarcadorExcel = new ReporteMarcadorModel();
567
- this.formMarcadorExcel.patchValue(this.reporteMarcadorExcel);
568
- this.formMarcadorExcel.get('tipo').setValue(null);
569
- }
570
- guardarMarcadorExcel() {
571
- this.clickGuardarMarcadorExcel = true;
572
- if (this.formMarcadorExcel.valid) {
573
- let llaveRegistro = this.formMarcadorExcel.get('llave').value;
574
- this.formMarcadorExcel.get('reporteFuente').setValue(this.reporteFuente.llave);
575
- this.formMarcadorExcel.get('tipoReporte').setValue('E');
576
- if (llaveRegistro) {
577
- this.generalService.update(new GeneralModel('ReporteMarcadorDTO', null, false, this.formMarcadorExcel.value)).subscribe(data => {
578
- this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_ACTUALIZAR);
579
- this.generalService.queryForList(new GeneralModel('ReporteMarcadorDTO', null, false, { tipoReporte: 'E', reporteFuente: this.reporteFuente.llave, ordenDinamico: this.generalPipe.SI })).subscribe(data => {
580
- this.listaMarcadorExcel = data;
581
- });
582
- });
583
- }
584
- else {
585
- this.formMarcadorExcel.get('llave').setValue(this.utilsService.generarLlave());
586
- this.generalService.crearRegistro(new GeneralModel('ReporteMarcadorDTO', null, false, this.formMarcadorExcel.value)).subscribe(data => {
587
- this.verNuevoMarcadorExcel = false;
588
- this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_GUARDAR);
589
- this.generalService.queryForList(new GeneralModel('ReporteMarcadorDTO', null, false, { tipoReporte: 'E', reporteFuente: this.reporteFuente.llave, ordenDinamico: this.generalPipe.SI })).subscribe(data => {
590
- this.listaMarcadorExcel = data;
591
- });
592
- });
593
- }
594
- this.clickGuardarMarcadorExcel = false;
595
- }
596
- else {
597
- this.notificacionesBusService.showError('Faltan campos obligatorios');
598
- Object.keys(this.formMarcadorExcel.controls).forEach((key) => {
599
- if (this.formMarcadorExcel.get(key).errors) {
600
- this.formMarcadorExcel.get(key).markAsDirty();
601
- }
602
- });
603
- }
604
- }
605
- eliminarMarcadorExcel(event) {
606
- this.confirmationService.confirm({
607
- target: event.target,
608
- message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
609
- acceptLabel: this.generalPipe.SI_DESC,
610
- header: this.translateService.instant('confirmar'),
611
- accept: () => {
612
- this.generalService.delete(new GeneralModel('ReporteMarcadorDTO', null, false, this.reporteMarcadorExcel)).subscribe(data => {
613
- this.formMarcadorExcel.reset();
614
- this.verNuevoMarcadorExcel = false;
615
- this.reporteMarcadorExcel = new ReporteMarcadorModel();
616
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
617
- this.generalService.queryForList(new GeneralModel('ReporteMarcadorDTO', null, false, { tipoReporte: 'E', reporteFuente: this.reporteFuente.llave, ordenDinamico: this.generalPipe.SI })).subscribe(data => {
618
- this.listaMarcadorExcel = data;
619
- });
620
- });
621
- }
622
- });
623
- }
624
- //plantilla
625
- cargarListaCampoMarcador() {
626
- this.generalService.queryForList(new GeneralModel('ReporteTablaDTO', null, false, { reporteMarcador: this.reporteMarcador.llave })).subscribe(data => {
627
- this.listaCamposMarcador = data;
628
- });
629
- }
630
- async cargarListaCampoMarcadorAsync() {
631
- this.bloquearCampoMarcador = false;
632
- this.listaCamposMarcador = await this.generalService.queryForList(new GeneralModel('ReporteTablaDTO', null, false, { reporteMarcador: this.reporteMarcador.llave })).toPromise();
633
- }
634
- verDetalleMarcador(event) {
635
- //this.formMarcador.reset();
636
- this.verNuevoMarcador = true;
637
- this.reporteMarcador = event.data;
638
- this.formMarcador.patchValue(this.reporteMarcador);
639
- this.formMarcador.get('tipo').setValue(this.reporteMarcador.tipo);
640
- this.cargarListaCampoMarcador();
641
- }
642
- nuevoMarcador() {
643
- //this.formMarcador.reset();
644
- this.formMarcador.reset({}, { emitEvent: false });
645
- this.verNuevoMarcador = true;
646
- this.reporteMarcador = new ReporteMarcadorModel();
647
- this.formMarcador.patchValue(this.reporteMarcador);
648
- this.formMarcador.get('tipoReporte').setValue('P');
649
- //this.formMarcador.get('tipo').setValue(null)
650
- }
651
- guardarMarcador() {
652
- if (this.formMarcador.valid) {
653
- let llaveRegistro = this.formMarcador.get('llave').value;
654
- this.formMarcador.get('reporteFuente').setValue(this.reporteFuente.llave);
655
- //this.formMarcador.get('tipoReporte').setValue('N')
656
- if (llaveRegistro) {
657
- this.generalService.update(new GeneralModel('ReporteMarcadorDTO', null, false, this.formMarcador.value)).subscribe(data => {
658
- this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_ACTUALIZAR);
659
- this.cargarListaMarcadores();
660
- if (this.reporteFuente.unicoArchivo == 'N') {
661
- this.cargarListaSoportes();
662
- }
663
- });
664
- }
665
- else {
666
- this.formMarcador.get('llave').setValue(this.utilsService.generarLlave());
667
- this.generalService.crearRegistro(new GeneralModel('ReporteMarcadorDTO', null, false, this.formMarcador.value)).subscribe(data => {
668
- this.verNuevoMarcador = false;
669
- this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_GUARDAR);
670
- this.cargarListaMarcadores();
671
- if (this.reporteFuente.unicoArchivo == 'N') {
672
- this.cargarListaSoportes();
673
- }
674
- });
675
- }
676
- }
677
- else {
678
- this.notificacionesBusService.showError('Faltan campos obligatorios');
679
- Object.keys(this.formMarcador.controls).forEach((key) => {
680
- if (this.formMarcador.get(key).errors) {
681
- this.formMarcador.get(key).markAsDirty();
682
- }
683
- });
684
- }
685
- }
686
- eliminarMarcador(event) {
687
- this.confirmationService.confirm({
688
- target: event.target,
689
- message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
690
- acceptLabel: this.generalPipe.SI_DESC,
691
- header: this.translateService.instant('confirmar'),
692
- accept: () => {
693
- this.generalService.delete(new GeneralModel('ReporteMarcadorDTO', null, false, this.reporteMarcador)).subscribe(data => {
694
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
695
- this.formMarcador.reset();
696
- this.verNuevoMarcador = false;
697
- this.reporteMarcador = new ReporteMarcadorModel();
698
- this.cargarListaMarcadores();
699
- });
700
- }
701
- });
702
- }
703
- eliminarCampoMarcador(event, objeto) {
704
- this.confirmationService.confirm({
705
- target: event.target,
706
- message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
707
- acceptLabel: this.generalPipe.SI_DESC,
708
- header: this.translateService.instant('confirmar'),
709
- accept: () => {
710
- this.generalService.delete(new GeneralModel('ReporteTablaDTO', null, false, objeto)).subscribe(data => {
711
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
712
- this.cargarListaCampoMarcador();
713
- });
714
- }
715
- });
716
- }
717
- nuevoCampoTabla() {
718
- this.verReporteMarcadorDetalle = true;
719
- this.bloquearCampoMarcador = true;
720
- this.campoMarcadorInsertar = new ReporteTablaModel();
721
- this.campoMarcadorInsertar.reporteMarcador = this.reporteMarcador.llave;
722
- }
723
- validarCampoMarcador(campoMarcador) {
724
- var validador = true;
725
- validador = validador && this.utilsService.validarCampoObligatorio(campoMarcador.columna);
726
- validador = validador && this.utilsService.validarCampoObligatorio(campoMarcador.campoFuente);
727
- return validador;
728
- }
729
- editarCampoMarcador() {
730
- this.bloquearCampoMarcador = true;
731
- }
732
- agregarCampoMarcador(campoMarcador) {
733
- this.clickGuardarMarcadorCampo = true;
734
- if (!this.validarCampoMarcador(campoMarcador)) {
735
- this.notificacionesBusService.showError('Faltan campos obligatorios');
736
- return;
737
- }
738
- campoMarcador.reporteMarcador = this.reporteMarcador.llave;
739
- if ('I' == campoMarcador.tipo) {
740
- if (!campoMarcador.ancho || campoMarcador.ancho == 0) {
741
- campoMarcador.ancho = 10;
742
- }
743
- if (!campoMarcador.alto || campoMarcador.alto == 0) {
744
- campoMarcador.alto = 10;
745
- }
746
- }
747
- if (['G'].includes(campoMarcador.tipo)) {
748
- campoMarcador.columna = 0;
749
- }
750
- if (campoMarcador.llave) {
751
- this.generalService.update(new GeneralModel('ReporteTablaDTO', null, false, campoMarcador)).subscribe(data => {
752
- this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_ACTUALIZAR);
753
- this.clickGuardarMarcadorCampo = false;
754
- campoMarcador = new ReporteTablaModel;
755
- this.bloquearCampoMarcador = false;
756
- this.cargarListaCampoMarcador();
757
- });
758
- }
759
- else {
760
- campoMarcador.llave = this.utilsService.generarLlave();
761
- this.generalService.crearRegistro(new GeneralModel('ReporteTablaDTO', null, false, campoMarcador)).subscribe(data => {
762
- this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_GUARDAR);
763
- this.clickGuardarMarcadorCampo = false;
764
- campoMarcador = new ReporteTablaModel;
765
- this.verReporteMarcadorDetalle = false;
766
- this.campoMarcadorInsertar = new ReporteTablaModel();
767
- this.bloquearCampoMarcador = false;
768
- this.cargarListaCampoMarcador();
769
- });
770
- }
771
- }
772
- cargarListaSoportes() {
773
- this.generalService.queryForList(new GeneralModel('ReporteSoporteDTO', null, false, { reporteFuente: this.reporteFuente.llave, tipo: 'S' })).subscribe(data => {
774
- this.listaSoportes = data;
775
- });
776
- }
777
- async cargarListaSoportesAsync() {
778
- this.listaSoportes = await this.generalService.queryForList(new GeneralModel('ReporteSoporteDTO', null, false, { reporteFuente: this.reporteFuente.llave, tipo: 'S' })).toPromise();
779
- }
780
- nuevoSoporte() {
781
- this.soporteIngresar = new ReporteSoporteModel();
782
- this.verSoporteArchivoDetalle = true;
783
- this.habilitaCampo = true;
784
- }
785
- cancelarSoporte() {
786
- this.soporteIngresar = new ReporteSoporteModel();
787
- this.verSoporteArchivoDetalle = false;
788
- this.habilitaCampo = false;
789
- }
790
- validarSoporte(soporte) {
791
- var validador = true;
792
- validador = validador && this.utilsService.validarCampoObligatorio(soporte.descripcion);
793
- validador = validador && this.utilsService.validarCampoObligatorio(soporte.archivoIndividual);
794
- return validador;
795
- }
796
- agregarSoporte(soporte) {
797
- this.clickGuardarSoporteArchivo = true;
798
- if (!this.validarSoporte(soporte)) {
799
- this.notificacionesBusService.showError('Faltan campos obligatorios');
800
- return;
801
- }
802
- if (!soporte.llaveTabla) {
803
- soporte.tipo = 'S';
804
- soporte.reporteFuente = this.reporteFuente.llave;
805
- this.generalService.crearRegistro(new GeneralModel('ReporteSoporteDTO', null, false, soporte)).subscribe(data => {
806
- this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_GUARDAR);
807
- soporte = new ReporteSoporteModel;
808
- this.cargarListaSoportes();
809
- this.verSoporteArchivoDetalle = false;
810
- this.clickGuardarSoporteArchivo = false;
811
- });
812
- }
813
- else {
814
- this.generalService.update(new GeneralModel('ReporteSoporteDTO', null, false, soporte)).subscribe(data => {
815
- this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_ACTUALIZAR);
816
- this.cargarListaSoportes();
817
- this.verSoporteArchivoDetalle = false;
818
- this.clickGuardarSoporteArchivo = false;
819
- soporte = new ReporteSoporteModel;
820
- });
821
- }
822
- this.habilitaCampo = false;
823
- }
824
- eliminarSoporte(event, soporte) {
825
- this.habilitaCampo = true;
826
- this.confirmationService.confirm({
827
- target: event.target,
828
- message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
829
- acceptLabel: this.generalPipe.SI_DESC,
830
- header: this.translateService.instant('confirmar'),
831
- accept: () => {
832
- this.generalService.delete(new GeneralModel('ReporteSoporteDTO', null, false, soporte)).subscribe(data => {
833
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
834
- this.cargarListaSoportes();
835
- this.habilitaCampo = false;
836
- });
837
- }
838
- });
839
- }
840
- iniciarEdicion() {
841
- this.habilitaCampo = true;
842
- }
843
- async cancelarEdicion() {
844
- this.cargarListaSoportesAsync();
845
- this.habilitaCampo = false;
846
- }
847
- //Reporte Dinamico
848
- generarJasper() {
849
- this.reporteService.generarJasper(this.reporteFuente.llave, 'compensacion/ReportesBase').subscribe({
850
- next: (data) => {
851
- this.notificacionesBusService.showSuccess('Se ha generado el jasper exitosamente');
852
- this.validarExisteJasper();
853
- }
854
- });
855
- }
856
- descargarJasper() {
857
- let propiedad = 'ruta_plantillas';
858
- //Ruta archivo
859
- this.aplicacion = this.authService.getTokenKey('aplicacion');
860
- this.cargarArchivo.descargarArchivo(this.encriptadorArchivo.encriptar('reportes/' + this.reporteFuente.llave + '.jrxml'), propiedad, this.aplicacion).subscribe({
861
- next: blob => {
862
- const a = document.createElement('a');
863
- const objectUrl = URL.createObjectURL(blob);
864
- a.href = objectUrl;
865
- a.download = this.reporteFuente.llave + '.jrxml'; //documento.archivoorigen;
866
- a.click();
867
- URL.revokeObjectURL(objectUrl);
868
- }
869
- });
870
- }
871
- nuevoMarcadorDinamico() {
872
- this.reporteMarcadorDinamico = new ReporteMarcadorModel;
873
- this.reporteMarcadorDinamico.origen = 'D';
874
- this.reporteMarcadorDinamico.reporteFuente = this.reporteFuente.llave;
875
- this.reporteMarcadorDinamico.banda = this.bandaSeleccionada.key;
876
- this.formReporteDinamico.reset();
877
- this.formReporteDinamico.patchValue(this.reporteMarcadorDinamico);
878
- this.nuevoReporteMarcadorDinamico = true;
879
- }
880
- verMarcadorDinamico(event) {
881
- this.reporteMarcadorDinamico = event.data;
882
- this.formReporteDinamico.patchValue(this.reporteMarcadorDinamico);
883
- this.nuevoReporteMarcadorDinamico = true;
884
- }
885
- async verBanda(event) {
886
- this.verTabBanda = false;
887
- this.bandaSeleccionada = event.data;
888
- this.reporteMarcadorDinamico = new ReporteMarcadorModel;
889
- this.nuevoReporteMarcadorDinamico = false;
890
- this.nuevaBanda = false;
891
- if (['detalle', 'summary'].includes(this.bandaSeleccionada.key)) {
892
- await this.cargarListaMarcadorDinamico();
893
- }
894
- else {
895
- this.reporteBanda = await this.generalService.queryForObject(new GeneralModel('ReporteBandaDTO', null, false, { reporteFuente: this.reporteFuente.llave, banda: this.bandaSeleccionada.key })).toPromise();
896
- if (!this.reporteBanda) {
897
- this.nuevaBanda = true;
898
- if (['detalle', 'summary'].includes(this.bandaSeleccionada.key)) {
899
- this.nuevaBanda = false;
900
- }
901
- this.reporteBanda = new ReporteBandaModel;
902
- this.reporteBanda.totales = 'S';
903
- }
904
- else {
905
- await this.cargarListaMarcadorDinamico();
906
- }
907
- }
908
- await this.sleep(25);
909
- this.verTabBanda = true;
910
- }
911
- async cargarListaMarcadorDinamico() {
912
- this.listaMarcadorDinamico = await this.generalService.queryForList(new GeneralModel('ReporteMarcadorDTO', null, false, {
913
- reporteFuente: this.reporteFuente.llave,
914
- banda: this.bandaSeleccionada.key,
915
- ordenDinamico: 'S',
916
- origen: 'D'
917
- })).toPromise();
918
- }
919
- async guardarCaracteristicaBanda() {
920
- if (this.nuevaBanda) {
921
- this.reporteBanda.reporteFuente = this.reporteFuente.llave;
922
- this.reporteBanda.banda = this.bandaSeleccionada.key;
923
- this.reporteBanda = await this.generalService.crearRegistro(new GeneralModel('ReporteBandaDTO', null, false, this.reporteBanda)).toPromise();
924
- }
925
- else {
926
- await this.generalService.update(new GeneralModel('ReporteBandaDTO', null, false, this.reporteBanda)).toPromise();
927
- }
928
- await this.sleep(25);
929
- this.nuevaBanda = false;
930
- this.notificacionesBusService.showInfo("Se actualizaron las caracteristicas de " + this.bandaSeleccionada.value);
931
- }
932
- async guardarColumnaDinamico() {
933
- if (!this.formReporteDinamico.valid) {
934
- this.notificacionesBusService.showError('Faltan campos obligatorios');
935
- Object.keys(this.formReporteDinamico.controls).forEach((key) => {
936
- if (this.formReporteDinamico.get(key).errors) {
937
- this.formReporteDinamico.get(key).markAsDirty();
938
- }
939
- });
940
- return;
941
- }
942
- this.reporteMarcadorDinamico = this.formReporteDinamico.value;
943
- if (this.utilsService.isBlank(this.reporteMarcadorDinamico.llave)) {
944
- this.reporteMarcadorDinamico.llave = this.utilsService.generarLlave();
945
- this.reporteMarcadorDinamico.origen = 'D';
946
- if (this.reporteMarcadorDinamico.tipoCampo == 'C') {
947
- this.reporteMarcadorDinamico.marcador = this.reporteMarcadorDinamico.filtro;
948
- this.reporteMarcadorDinamico.reporteColumna = null;
949
- }
950
- else {
951
- var columna = new ReporteColumnaModel();
952
- columna.llaveTabla = this.reporteMarcadorDinamico.marcador;
953
- columna = await this.generalService.queryForObject(new GeneralModel('ReporteColumnaDTO', null, false, columna)).toPromise();
954
- this.reporteMarcadorDinamico.marcador = columna.nombre;
955
- this.reporteMarcadorDinamico.reporteColumna = columna.llaveTabla;
956
- this.reporteMarcadorDinamico.filtro = columna.sintaxis;
957
- this.reporteMarcadorDinamico.tipoDato = columna.tipoDato;
958
- }
959
- await this.generalService.crearRegistro(new GeneralModel('ReporteMarcadorDTO', null, false, this.reporteMarcadorDinamico)).toPromise();
960
- }
961
- else {
962
- if (this.reporteMarcadorDinamico.tipoCampo == 'C') {
963
- this.reporteMarcadorDinamico.marcador = this.reporteMarcadorDinamico.filtro;
964
- }
965
- await this.generalService.update(new GeneralModel('ReporteMarcadorDTO', null, false, this.reporteMarcadorDinamico)).toPromise();
966
- }
967
- this.reporteMarcadorDinamico = null;
968
- this.nuevoReporteMarcadorDinamico = false;
969
- await this.cargarListaMarcadorDinamico();
970
- this.notificacionesBusService.showInfo('Se ha guardado el cambio');
971
- }
972
- regresarBandaSeleccionada() {
973
- this.bandaSeleccionada = { key: null, value: null };
974
- }
975
- async eliminarColumnaDinamico(event) {
976
- this.confirmationService.confirm({
977
- target: event.target,
978
- message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
979
- acceptLabel: this.generalPipe.SI_DESC,
980
- header: this.translateService.instant('confirmar'),
981
- accept: async () => {
982
- await this.generalService.delete(new GeneralModel('ReporteMarcadorDTO', null, false, this.reporteMarcadorDinamico)).toPromise();
983
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
984
- this.reporteMarcadorDinamico = new ReporteMarcadorModel();
985
- this.nuevoReporteMarcadorDinamico = false;
986
- await this.cargarListaMarcadorDinamico();
987
- }
988
- });
989
- }
990
- validarSeparador() {
991
- var validador = true;
992
- validador = validador && this.utilsService.validarCampoObligatorio(this.reporteFuente.separador);
993
- return validador;
994
- }
995
- actualizarSeparador() {
996
- this.clickGuardarReporteTexto = true;
997
- if (!this.validarSeparador()) {
998
- this.notificacionesBusService.showError('Faltan campos obligatorios');
999
- return;
1000
- }
1001
- this.actualizar();
1002
- }
1003
- cargarListaMarcadoresTexto() {
1004
- this.generalService.queryForList(new GeneralModel('ReporteMarcadorDTO', null, false, {
1005
- tipoReporte: this.reporteFuentePipe.REPORTEARCHIVOPLANO,
1006
- reporteFuente: this.reporteFuente.llave,
1007
- ordenDinamico: this.generalPipe.SI
1008
- })).subscribe(data => {
1009
- this.listaMarcadoresTexto = data;
1010
- });
1011
- }
1012
- verMarcadorTexto(event) {
1013
- this.verNuevoMarcadorTexto = true;
1014
- this.marcadorTexto = event.data;
1015
- }
1016
- nuevoMarcadorTexto() {
1017
- this.verNuevoMarcadorTexto = true;
1018
- this.marcadorTexto = new ReporteMarcadorModel();
1019
- this.marcadorTexto.tipoReporte = this.reporteFuentePipe.REPORTEARCHIVOPLANO;
1020
- }
1021
- validarMarcadorTexto() {
1022
- var validador = true;
1023
- validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorTexto.tipoGrafico);
1024
- validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorTexto.alto);
1025
- if (this.reporteFuentePipe.MARCADORTEXTOFIJO == this.marcadorTexto.tipoGrafico) {
1026
- validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorTexto.formato);
1027
- }
1028
- if (this.reporteFuentePipe.MARCADORTEXTODINAMICO == this.marcadorTexto.tipoGrafico) {
1029
- validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorTexto.ancho);
1030
- validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorTexto.reporteColumna);
1031
- }
1032
- return validador;
1033
- }
1034
- async guardarMarcadorTexto() {
1035
- this.clickGuardarMarcadorTexto = true;
1036
- if (!this.validarMarcadorTexto()) {
1037
- this.notificacionesBusService.showError('Faltan campos obligatorios');
1038
- return;
1039
- }
1040
- this.clickGuardarMarcadorTexto = false;
1041
- this.marcadorTexto.reporteFuente = this.reporteFuente.llave;
1042
- if (this.marcadorTexto.llave) {
1043
- await this.generalService.update(new GeneralModel('ReporteMarcadorDTO', null, false, this.marcadorTexto)).toPromise();
1044
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR);
1045
- }
1046
- else {
1047
- this.marcadorTexto.llave = this.utilsService.generarLlave();
1048
- await this.generalService.crearRegistro(new GeneralModel('ReporteMarcadorDTO', null, false, this.marcadorTexto)).toPromise();
1049
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_GUARDAR);
1050
- }
1051
- this.cargarListaMarcadoresTexto();
1052
- this.verNuevoMarcadorTexto = false;
1053
- }
1054
- eliminarMarcadoTexto(event) {
1055
- this.confirmationService.confirm({
1056
- target: event.target,
1057
- message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
1058
- acceptLabel: this.generalPipe.SI_DESC,
1059
- header: this.translateService.instant('confirmar'),
1060
- accept: async () => {
1061
- await this.generalService.delete(new GeneralModel('ReporteMarcadorDTO', null, false, this.marcadorTexto)).toPromise();
1062
- this.verNuevoMarcadorTexto = false;
1063
- this.marcadorTexto = new ReporteMarcadorModel();
1064
- this.cargarListaMarcadoresTexto();
1065
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
1066
- }
1067
- });
1068
- }
1069
- cargarListaXML() {
1070
- this.generalService.queryForList(new GeneralModel('ReporteMarcadorDTO', null, false, {
1071
- tipoReporte: 'X',
1072
- origen: 'X',
1073
- reporteFuente: this.reporteFuente.llave,
1074
- ordenDinamico: this.generalPipe.SI
1075
- })).subscribe(data => {
1076
- this.listaXML = data;
1077
- });
1078
- }
1079
- nuevoMarcadorXML() {
1080
- this.marcadorXML = new ReporteMarcadorModel();
1081
- this.marcadorXML.tipoReporte = 'X';
1082
- this.marcadorXML.origen = 'X';
1083
- this.verNuevoMarcadorXML = true;
1084
- }
1085
- verMarcadorXML(event) {
1086
- this.marcadorXML = event.data;
1087
- this.verNuevoMarcadorXML = true;
1088
- if (this.marcadorXML.tipo == 'MR' || this.marcadorXML.tipo == 'TB') {
1089
- this.cargarListaCampoMarcadorXML();
1090
- }
1091
- }
1092
- validarMarcadorXML() {
1093
- var validador = true;
1094
- validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorXML.descripcion);
1095
- validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorXML.tipo);
1096
- return validador;
1097
- }
1098
- guardarMarcadorXML() {
1099
- this.clickGuardarMarcadorXML = true;
1100
- if (!this.validarMarcadorXML()) {
1101
- this.notificacionesBusService.showError('Faltan campos obligatorios');
1102
- return;
1103
- }
1104
- this.marcadorXML.reporteFuente = this.reporteFuente.llave;
1105
- if (this.marcadorXML.llave) {
1106
- this.generalService.update(new GeneralModel('ReporteMarcadorDTO', null, false, this.marcadorXML)).subscribe(data => {
1107
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR);
1108
- this.marcadorXML = new ReporteMarcadorModel();
1109
- this.verNuevoMarcadorXML = false;
1110
- this.cargarListaXML();
1111
- });
1112
- }
1113
- else {
1114
- this.marcadorXML.llave = this.utilsService.generarLlave();
1115
- this.generalService.crearRegistro(new GeneralModel('ReporteMarcadorDTO', null, false, this.marcadorXML)).subscribe(data => {
1116
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_GUARDAR);
1117
- this.marcadorXML = new ReporteMarcadorModel();
1118
- this.verNuevoMarcadorXML = false;
1119
- this.cargarListaXML();
1120
- });
1121
- }
1122
- this.clickGuardarMarcadorXML = false;
1123
- }
1124
- eliminarMarcadorXML(event) {
1125
- this.confirmationService.confirm({
1126
- target: event.target,
1127
- message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
1128
- acceptLabel: this.generalPipe.SI_DESC,
1129
- header: this.translateService.instant('confirmar'),
1130
- accept: async () => {
1131
- await this.generalService.delete(new GeneralModel('ReporteMarcadorDTO', null, false, this.marcadorXML)).toPromise();
1132
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
1133
- this.marcadorXML = new ReporteMarcadorModel();
1134
- this.verNuevoMarcadorXML = false;
1135
- this.cargarListaXML();
1136
- }
1137
- });
1138
- }
1139
- nuevoCampoTablaXML() {
1140
- this.verReporteMarcadorDetalleXML = true;
1141
- this.campoMarcadorInsertarXML = new ReporteTablaModel();
1142
- this.campoMarcadorInsertarXML.reporteMarcador = this.marcadorXML.llave;
1143
- this.habilitaCampo = true;
1144
- }
1145
- cargarListaCampoMarcadorXML() {
1146
- this.generalService.queryForList(new GeneralModel('ReporteTablaDTO', null, false, { reporteMarcador: this.marcadorXML.llave })).subscribe(data => {
1147
- this.listaCamposMarcadorXML = data;
1148
- });
1149
- }
1150
- async cargarListaCampoMarcadorXMLAsync() {
1151
- this.habilitaCampo = false;
1152
- this.listaCamposMarcadorXML = await this.generalService.queryForList(new GeneralModel('ReporteTablaDTO', null, false, { reporteMarcador: this.marcadorXML.llave })).toPromise();
1153
- }
1154
- validarCampoMarcadorXML(campoMarcador) {
1155
- var validador = true;
1156
- validador = validador && this.utilsService.validarCampoObligatorio(campoMarcador.campoFuente);
1157
- validador = validador && this.utilsService.validarCampoObligatorio(campoMarcador.marcador);
1158
- return validador;
1159
- }
1160
- agregarCampoMarcadorXML(campo) {
1161
- this.clickGuardarMarcadorCampoXML = true;
1162
- if (!this.validarCampoMarcadorXML(campo)) {
1163
- this.notificacionesBusService.showError('Faltan campos obligatorios');
1164
- return;
1165
- }
1166
- if (campo.llave) {
1167
- this.generalService.update(new GeneralModel('ReporteTablaDTO', null, false, campo)).subscribe(data => {
1168
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR);
1169
- this.campoMarcadorInsertarXML = new ReporteTablaModel();
1170
- this.habilitaCampo = false;
1171
- this.cargarListaCampoMarcadorXML();
1172
- });
1173
- }
1174
- else {
1175
- campo.columna = 0;
1176
- campo.llave = this.utilsService.generarLlave();
1177
- this.generalService.crearRegistro(new GeneralModel('ReporteTablaDTO', null, false, campo)).subscribe(data => {
1178
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_GUARDAR);
1179
- campo = new ReporteTablaModel();
1180
- this.habilitaCampo = false;
1181
- this.cargarListaCampoMarcadorXML();
1182
- });
1183
- }
1184
- this.clickGuardarMarcadorCampoXML = false;
1185
- this.verReporteMarcadorDetalleXML = false;
1186
- }
1187
- eliminarCampoMarcadorXML(event, objeto) {
1188
- this.confirmationService.confirm({
1189
- target: event.target,
1190
- message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
1191
- acceptLabel: this.generalPipe.SI_DESC,
1192
- header: this.translateService.instant('confirmar'),
1193
- accept: () => {
1194
- this.generalService.delete(new GeneralModel('ReporteTablaDTO', null, false, objeto)).subscribe(data => {
1195
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
1196
- this.cargarListaCampoMarcadorXML();
1197
- });
1198
- }
1199
- });
1200
- }
1201
- cambiarTabColumnario(event) {
1202
- switch (event.index) {
1203
- case 0:
1204
- this.cargarReporteColumnario();
1205
- break;
1206
- case 1:
1207
- this.cargarDatosAdicionales();
1208
- break;
1209
- case 2:
1210
- this.cargarMarcadoresColumnario();
1211
- break;
1212
- }
1213
- }
1214
- cargarMarcadoresColumnario() {
1215
- this.generalService.queryForList(new GeneralModel('ReporteColumnarioMarcadorDTO', null, false, { reporteFuente: this.reporteFuente.llave })).subscribe(data => {
1216
- this.marcadoresColumnario = data;
1217
- });
1218
- }
1219
- cargarDatosAdicionales() {
1220
- this.generalService.queryForList(new GeneralModel('ReporteColumnarioDTO', null, false, { reporteFuente: this.reporteFuente.llave, filtroColumnaBasica: 'N' })).subscribe(data => {
1221
- this.columnasAdicionales = data;
1222
- });
1223
- }
1224
- cargarReporteColumnario() {
1225
- this.generalService.queryForList(new GeneralModel('ReporteColumnarioDTO', null, false, { reporteFuente: this.reporteFuente.llave, filtroColumnaBasica: 'S' })).subscribe(data => {
1226
- this.listaReporteColumnario = data;
1227
- });
1228
- }
1229
- cargarGraficasColumnas() {
1230
- this.generalService.queryForList(new GeneralModel('ReporteColumnaDTO', null, false, { reporteFuente: this.reporteFuente.llave })).subscribe(data => {
1231
- this.paginadorColumnas = data;
1232
- });
1233
- this.generalService.queryForList(new GeneralModel('ReporteBandaDTO', null, false, { reporteFuente: this.reporteFuente.llave, totales: 'C' })).subscribe(data => {
1234
- this.paginadorColoresGrafica = data;
1235
- });
1236
- }
1237
- validarExisteJasper() {
1238
- this.cargarArchivo.descargarArchivo(this.encriptadorArchivo.encriptar('reportes/' + this.reporteFuente.llave + '.jrxml'), 'ruta_plantillas', this.aplicacion).subscribe((response) => {
1239
- this.existeJasper = true;
1240
- }, (error) => {
1241
- this.existeJasper = false;
1242
- });
1243
- }
1244
- verReporteColumnario(event) {
1245
- this.columnaBasica = event.data;
1246
- this.verNuevoReporteColumnario = true;
1247
- }
1248
- nuevoColumnaBasica() {
1249
- this.columnaBasica = new ReporteColumnarioModel();
1250
- this.columnaBasica.reporteFuente = this.reporteFuente.llave;
1251
- this.verNuevoReporteColumnario = true;
1252
- }
1253
- validarColumnaBasica() {
1254
- var validador = true;
1255
- validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.nombre);
1256
- validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.tipo);
1257
- validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.reporteColumna);
1258
- if (validador) {
1259
- if (this.isMostrarOrden()) {
1260
- validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.orden);
1261
- }
1262
- if (this.isMostrarOrdenConsulta()) {
1263
- validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.ordenConsulta);
1264
- }
1265
- if (this.reporteColumnarioPipe.TIPO_CELDA == this.columnaBasica.tipo) {
1266
- validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.operacion);
1267
- }
1268
- else if (this.reporteColumnarioPipe.TIPO_COLUMNA == this.columnaBasica.tipo) {
1269
- validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.operacionHorizontal);
1270
- validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.operacionVertical);
1271
- validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.columnaOperacionVertical);
1272
- }
1273
- else if (this.reporteColumnarioPipe.TIPO_LABEL == this.columnaBasica.tipo) {
1274
- validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.orderBy);
1275
- }
1276
- }
1277
- return validador;
1278
- }
1279
- async verificarColumnasValidas(reporteColumnarioDTO) {
1280
- var tipo = reporteColumnarioDTO.tipo;
1281
- if (this.reporteColumnarioPipe.TIPO_FILA == reporteColumnarioDTO.tipo) {
1282
- return true;
1283
- }
1284
- var filtro = new ReporteColumnarioModel();
1285
- filtro.reporteFuente = reporteColumnarioDTO.reporteFuente;
1286
- filtro.diferenteColumnario = reporteColumnarioDTO.llaveTabla;
1287
- filtro.tipo = tipo;
1288
- var cantidad = await this.generalService.cantidadRegistros(new GeneralModel('ReporteColumnarioDTO', null, false, filtro)).toPromise();
1289
- if (cantidad == 0) {
1290
- return true;
1291
- }
1292
- if (this.reporteColumnarioPipe.TIPO_COLUMNA == reporteColumnarioDTO.tipo) {
1293
- this.notificacionesBusService.showWarning("El reporte solo puede contener 1 registro con tipo " + this.reporteColumnarioPipe.TIPO_COLUMNA_DESC);
1294
- return false;
1295
- }
1296
- else if (this.reporteColumnarioPipe.TIPO_CELDA == reporteColumnarioDTO.tipo) {
1297
- this.notificacionesBusService.showWarning("El reporte solo puede contener 1 registro con tipo " + this.reporteColumnarioPipe.TIPO_CELDA_DESC);
1298
- return false;
1299
- }
1300
- return true;
1301
- }
1302
- async guardarColumnaBasica() {
1303
- this.clickGuardarReporteColumnario = true;
1304
- if (!this.validarColumnaBasica()) {
1305
- this.notificacionesBusService.showError('Faltan campos obligatorios');
1306
- return;
1307
- }
1308
- if (await this.verificarColumnasValidas(this.columnaBasica)) {
1309
- if (this.columnaBasica.llaveTabla) {
1310
- await this.generalService.update(new GeneralModel('ReporteColumnarioDTO', null, false, this.columnaBasica)).toPromise();
1311
- this.columnaBasica = new ReporteColumnarioModel();
1312
- this.verNuevoReporteColumnario = false;
1313
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR);
1314
- }
1315
- else {
1316
- await this.generalService.crearRegistro(new GeneralModel('ReporteColumnarioDTO', null, false, this.columnaBasica)).toPromise();
1317
- this.columnaBasica = new ReporteColumnarioModel();
1318
- this.verNuevoReporteColumnario = false;
1319
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_GUARDAR);
1320
- }
1321
- this.clickGuardarReporteColumnario = false;
1322
- this.cargarReporteColumnario();
1323
- }
1324
- }
1325
- eliminarColumnaBasica(event) {
1326
- this.confirmationService.confirm({
1327
- target: event.target,
1328
- message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
1329
- acceptLabel: this.generalPipe.SI_DESC,
1330
- header: this.translateService.instant('confirmar'),
1331
- accept: () => {
1332
- this.generalService.delete(new GeneralModel('ReporteColumnarioDTO', null, false, this.columnaBasica)).subscribe(data => {
1333
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
1334
- this.verNuevoReporteColumnario = false;
1335
- this.columnaBasica = new ReporteColumnarioModel();
1336
- this.cargarReporteColumnario();
1337
- });
1338
- }
1339
- });
1340
- }
1341
- nuevaColumnaAdicional() {
1342
- this.columnaAdicional = new ReporteColumnarioModel();
1343
- this.columnaAdicional.reporteFuente = this.reporteFuente.llave;
1344
- this.columnaAdicional.tipo = this.reporteColumnarioPipe.TIPO_ADICIONAL;
1345
- this.verNuevoColumnaAdicional = true;
1346
- }
1347
- verDetalleAdicional(event) {
1348
- this.columnaAdicional = event.data;
1349
- this.verNuevoColumnaAdicional = true;
1350
- }
1351
- validarColumnaAdicional() {
1352
- var validador = true;
1353
- validador = validador && this.utilsService.validarCampoObligatorio(this.columnaAdicional.nombre);
1354
- validador = validador && this.utilsService.validarCampoObligatorio(this.columnaAdicional.sintaxis);
1355
- validador = validador && this.utilsService.validarCampoObligatorio(this.columnaAdicional.orden);
1356
- validador = validador && this.utilsService.validarCampoObligatorio(this.columnaAdicional.orderBy);
1357
- validador = validador && this.utilsService.validarCampoObligatorio(this.columnaAdicional.ordenConsulta);
1358
- return validador;
1359
- }
1360
- async guardarColumnaAdicional() {
1361
- this.clickGuardarColumnaAdicional = true;
1362
- if (!this.validarColumnaAdicional()) {
1363
- this.notificacionesBusService.showError('Faltan campos obligatorios');
1364
- return;
1365
- }
1366
- if (this.columnaAdicional.llaveTabla) {
1367
- await this.generalService.update(new GeneralModel('ReporteColumnarioDTO', null, false, this.columnaAdicional)).toPromise();
1368
- this.columnaAdicional = new ReporteColumnarioModel();
1369
- this.verNuevoColumnaAdicional = false;
1370
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR);
1371
- }
1372
- else {
1373
- await this.generalService.crearRegistro(new GeneralModel('ReporteColumnarioDTO', null, false, this.columnaAdicional)).toPromise();
1374
- this.columnaAdicional = new ReporteColumnarioModel();
1375
- this.verNuevoColumnaAdicional = false;
1376
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_GUARDAR);
1377
- }
1378
- this.clickGuardarColumnaAdicional = false;
1379
- this.cargarDatosAdicionales();
1380
- }
1381
- eliminarColumnaAdicional(event) {
1382
- this.confirmationService.confirm({
1383
- target: event.target,
1384
- message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
1385
- acceptLabel: this.generalPipe.SI_DESC,
1386
- header: this.translateService.instant('confirmar'),
1387
- accept: () => {
1388
- this.generalService.delete(new GeneralModel('ReporteColumnarioDTO', null, false, this.columnaAdicional)).subscribe(data => {
1389
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
1390
- this.verNuevoColumnaAdicional = false;
1391
- this.columnaAdicional = new ReporteColumnarioModel();
1392
- this.cargarDatosAdicionales();
1393
- });
1394
- }
1395
- });
1396
- }
1397
- nuevoMarcadorColumnario() {
1398
- this.marcadorColumnario = new ReporteColumnarioMarcadorModel();
1399
- this.marcadorColumnario.reporteFuente = this.reporteFuente.llave;
1400
- this.verNuevoMarcadorColumnario = true;
1401
- }
1402
- verDetalleMarcadorColumnario(event) {
1403
- this.marcadorColumnario = event.data;
1404
- this.verNuevoMarcadorColumnario = true;
1405
- }
1406
- validarMarcadorColumnario() {
1407
- var validador = true;
1408
- validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorColumnario.marcador);
1409
- validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorColumnario.tipo);
1410
- validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorColumnario.textoRegistro);
1411
- validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorColumnario.descripcion);
1412
- return validador;
1413
- }
1414
- async guardarMarcadorColumnario() {
1415
- this.clickGuardarMarcadorColumnario = true;
1416
- if (!this.validarMarcadorColumnario()) {
1417
- this.notificacionesBusService.showError('Faltan campos obligatorios');
1418
- return;
1419
- }
1420
- if (this.marcadorColumnario.llaveTabla) {
1421
- await this.generalService.update(new GeneralModel('ReporteColumnarioMarcadorDTO', null, false, this.marcadorColumnario)).toPromise();
1422
- this.marcadorColumnario = new ReporteColumnarioMarcadorModel();
1423
- this.verNuevoMarcadorColumnario = false;
1424
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR);
1425
- }
1426
- else {
1427
- await this.generalService.crearRegistro(new GeneralModel('ReporteColumnarioMarcadorDTO', null, false, this.marcadorColumnario)).toPromise();
1428
- this.marcadorColumnario = new ReporteColumnarioMarcadorModel();
1429
- this.verNuevoMarcadorColumnario = false;
1430
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_GUARDAR);
1431
- }
1432
- this.clickGuardarMarcadorColumnario = false;
1433
- this.cargarMarcadoresColumnario();
1434
- }
1435
- eliminarMarcadorColumnario(event) {
1436
- this.confirmationService.confirm({
1437
- target: event.target,
1438
- message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
1439
- acceptLabel: this.generalPipe.SI_DESC,
1440
- header: this.translateService.instant('confirmar'),
1441
- accept: () => {
1442
- this.generalService.delete(new GeneralModel('ReporteColumnarioMarcadorDTO', null, false, this.marcadorColumnario)).subscribe(data => {
1443
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
1444
- this.verNuevoMarcadorColumnario = false;
1445
- this.marcadorColumnario = new ReporteColumnarioMarcadorModel();
1446
- this.cargarMarcadoresColumnario();
1447
- });
1448
- }
1449
- });
1450
- }
1451
- guardarGrafico() {
1452
- this.actualizar();
1453
- this.paginadorColumnas.forEach(data => {
1454
- this.generalService.update(new GeneralModel('ReporteColumnaDTO', null, false, data)).subscribe(data => { });
1455
- });
1456
- }
1457
- verGrafico() {
1458
- this.reporteService.verGrafico({ llaveReporte: this.reporteFuente.llave }).subscribe(data => {
1459
- let columna = this.dashboardService.cargarGrafica({ accion: data.tipoGrafico, datosGrafica: data });
1460
- this.grafica = columna;
1461
- let respuesta = this.dashboardPipe.TIPO_GRAFICO_CHART.filter(data => data.codigo == columna.datosGrafica.tipoGrafico);
1462
- if (respuesta.length < 0) {
1463
- return;
1464
- }
1465
- columna.tipoGrafico = respuesta[0].codigoChart;
1466
- this.tipoGrafica = columna.tipoGrafico;
1467
- console.log(this.tipoGrafica);
1468
- });
1469
- }
1470
- nuevoColorCategoria() {
1471
- this.colorCategoria = new ReporteBandaModel();
1472
- this.colorCategoria.banda = '#FFFFFF';
1473
- this.verColorCategoriaDetalle = true;
1474
- this.habilitaCampo = true;
1475
- }
1476
- cancelarColorCategoria() {
1477
- this.colorCategoria = new ReporteBandaModel();
1478
- this.verColorCategoriaDetalle = false;
1479
- this.habilitaCampo = false;
1480
- }
1481
- validarColorCategoria(color) {
1482
- var validador = true;
1483
- validador = validador && this.utilsService.validarCampoObligatorio(color.titulo);
1484
- validador = validador && this.utilsService.validarCampoObligatorio(color.banda);
1485
- return validador;
1486
- }
1487
- agregarColorCategoria(color) {
1488
- this.clickGuardarColorCategoria = true;
1489
- if (!this.validarColorCategoria(color)) {
1490
- this.notificacionesBusService.showError('Faltan campos obligatorios');
1491
- return;
1492
- }
1493
- if (!color.llaveTabla) {
1494
- color.totales = 'C';
1495
- color.reporteFuente = this.reporteFuente.llave;
1496
- this.generalService.crearRegistro(new GeneralModel('ReporteBandaDTO', null, false, color)).subscribe(data => {
1497
- this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_GUARDAR);
1498
- color = new ReporteBandaModel();
1499
- this.cargarGraficasColumnas();
1500
- this.verColorCategoriaDetalle = false;
1501
- this.clickGuardarColorCategoria = false;
1502
- });
1503
- }
1504
- else {
1505
- this.generalService.update(new GeneralModel('ReporteBandaDTO', null, false, color)).subscribe(data => {
1506
- this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_ACTUALIZAR);
1507
- this.cargarGraficasColumnas();
1508
- this.verColorCategoriaDetalle = false;
1509
- this.clickGuardarColorCategoria = false;
1510
- color = new ReporteBandaModel();
1511
- });
1512
- }
1513
- this.habilitaCampo = false;
1514
- }
1515
- eliminarColorCategoria(event, color) {
1516
- this.habilitaCampo = true;
1517
- this.confirmationService.confirm({
1518
- target: event.target,
1519
- message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
1520
- acceptLabel: this.generalPipe.SI_DESC,
1521
- header: this.translateService.instant('confirmar'),
1522
- accept: () => {
1523
- this.generalService.delete(new GeneralModel('ReporteBandaDTO', null, false, color)).subscribe(data => {
1524
- this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
1525
- this.cargarGraficasColumnas();
1526
- this.habilitaCampo = false;
1527
- });
1528
- }
1529
- });
1530
- }
1531
- async cancelarEdicionColor() {
1532
- this.cargarGraficasColumnas();
1533
- this.habilitaCampo = false;
1534
- }
1535
- isFijo() {
1536
- return this.filtroOrigenFuente(this.reporteFuentePipe.FIJO);
1537
- }
1538
- isSql() {
1539
- return this.filtroOrigenFuente(this.reporteFuentePipe.SQL);
1540
- }
1541
- /**
1542
- * Permite conocer si se debe presentar en la interfaz los campos referentes a orden consulta
1543
- * @return Si se debe mostrar se retornara true, de lo contrario false
1544
- */
1545
- isMostrarOrdenConsulta() {
1546
- return this.reporteColumnarioPipe.TIPO_FILA == this.columnaBasica.tipo;
1547
- }
1548
- isMostrarOrden() {
1549
- return this.reporteColumnarioPipe.TIPO_FILA == this.columnaBasica.tipo ||
1550
- this.reporteColumnarioPipe.TIPO_COLUMNA == this.columnaBasica.tipo || this.reporteColumnarioPipe.TIPO_LABEL == this.columnaBasica.tipo;
1551
- }
1552
- isTipoColumna() {
1553
- return this.reporteColumnarioPipe.TIPO_COLUMNA == this.columnaBasica.tipo;
1554
- }
1555
- isTipoFila() {
1556
- return this.reporteColumnarioPipe.TIPO_FILA == this.columnaBasica.tipo;
1557
- }
1558
- isTipoLabel() {
1559
- return this.reporteColumnarioPipe.TIPO_LABEL == this.columnaBasica.tipo;
1560
- }
1561
- sleep(ms) {
1562
- return new Promise((resolve) => setTimeout(resolve, ms));
1563
- }
1564
- isFuente() {
1565
- return this.filtroOrigenFuente(this.reporteFuentePipe.FUENTE);
1566
- }
1567
- filtroOrigenFuente(tipo) {
1568
- return this.reporteFuente.origenFuente == tipo;
1569
- }
1570
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: DetalleTipoReporteComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ToastService }, { token: i3.GeneralService }, { token: i4.GeneralPipe }, { token: i5.AuthService }, { token: i6.ReporteFuentePipe }, { token: i7.ConfirmationService }, { token: i8.CargarArchivosService }, { token: i9.EncriptadoBasicoService }, { token: i10.UtilsService }, { token: i11.TranslateService }, { token: i12.FuentePipe }, { token: i13.ReporteColumnarioPipe }, { token: i14.EjecucionReporteService }, { token: i15.DashboardService }, { token: i16.DashboardPipe }], target: i0.ɵɵFactoryTarget.Component });
1571
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: DetalleTipoReporteComponent, isStandalone: true, selector: "detalle-tipo-reporte", inputs: { llaveReporte: "llaveReporte", aplicacion: "aplicacion", listaFuentes: "listaFuentes" }, providers: [MessageService], ngImport: i0, template: "<p-tabView (onChange)=\"cambiarTab($event)\">\r\n <p-tabPanel header=\"{{'excel' | translate }}\" [selected]=\"true\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <p class=\"font-semibold\">{{'debe' | translate}} {{'indicar' | translate}} {{'plantilla' | translate}} {{'y' | translate}}\r\n {{'hoja' | translate}} {{'para' | translate}} {{'que' | translate}} {{'esta' | translate}}\r\n {{'opcion' | translate}} {{'se' | translate}} {{'active' | translate}}\r\n </p>\r\n <div class=\"p-fluid p-formgrid grid\">\r\n <div class=\"field col-12 md:col-4\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"reporteFuente.archivoTodo ? reporteFuente.archivoTodo: ''\"\r\n [extensiones]=\"'xls;xlsx'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\r\n (onSelected)=\"obtenerArchivo($event)\"></app-input-helper-seleccion-plantilla>\r\n\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\r\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\r\n translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoExcel\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\r\n icon=\"glyphicons glyphicons-refresh\" label=\"{{'link_actualizar' | translate}}\"\r\n (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-pickList [source]=\"listaExcel\" [target]=\"listaNoExcel\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\r\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\r\n filterBy=\"sintaxis\" (onSourceReorder)=\"moverAAsociado($event)\"\r\n (onMoveAllToTarget)=\"moverADesasociado($event)\" (onMoveAllToSource)=\"moverAAsociado($event)\"\r\n (onMoveToTarget)=\"moverADesasociado($event)\" (onMoveToSource)=\"moverAAsociado($event)\">\r\n <ng-template let-excel pTemplate=\"item\">\r\n <div>\r\n <label>{{excel.nombre}}</label>\r\n </div>\r\n </ng-template>\r\n </p-pickList>\r\n\r\n <div class=\"mt-4\">\r\n <div class=\"flex justify-content-between align-items-center mt-2 mb-2\">\r\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorExcel()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorExcel\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorExcel\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorExcel = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadorExcel\" responsiveLayout=\"scroll\" [scrollable]=\"true\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcadorExcel\" [rows]=\"10\"\r\n [totalRecords]=\"listaMarcadorExcel.length\" [paginator]=\"listaMarcadorExcel.length > 10\"\r\n (onRowSelect)=\"verDetalleMarcadorExcel($event)\" (onRowUnselect)=\"verDetalleMarcadorExcel($event)\" *ngIf=\"!verNuevoMarcadorExcel\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'descripcion' | translate }}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marcador>\r\n <tr [pSelectableRow]=\"marcador\">\r\n <td>{{marcador.descripcion}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorExcel\">\r\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-book\"></i>{{'detalle' | translate}}</h5>\r\n <div class=\"Detallereporte mt-4 \">\r\n <form [formGroup]=\"formMarcadorExcel\" >\r\n <div class=\"col-md-12 p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\" maxlength=\"4000\">\r\n <label>{{'descripcion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\" maxlength=\"4000\">\r\n <label>{{'marcador' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [options]=\"[{label: 'Imagen Fija', value: 'IF'}, {label: 'Marcador', value: 'MA'}]\"\r\n [autoDisplayFirst]=\"false\" formControlName=\"tipo\" optionLabel=\"label\"\r\n optionValue=\"value\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\" [hidden]=\"esImagenFija\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\r\n <label>{{'valor' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\r\n [autoDisplayFirst]=\"false\" formControlName=\"origen\" optionLabel=\"label\"\r\n optionValue=\"value\"></p-dropdown>\r\n <label>{{'origen' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n formControlName=\"textoRegistro\"\r\n [label]=\"reporteMarcadorExcel.textoRegistro ? reporteMarcadorExcel.textoRegistro: ''\"\r\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcadorExcel($event)\"\r\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"('recursos' | translate)\" [labelarch]=\"'recurso' | translate\" [mostrarX]=\"true\"\r\n [mostraroblicargo]=\"!(!utilsService.validarCampoObligatorio(reporteMarcadorExcel.textoRegistro) && clickGuardarMarcadorExcel)\"\r\n [anexoPropiedad]=\"reporteMarcadorExcel.origen =='C' ? llaveEmpresa: ''\"\r\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\r\n </div>\r\n </div>\r\n </form>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" *ngIf=\"verNuevoMarcadorExcel\">\r\n <button pButton pRipple class=\"ml-2 p-button-raised\" icon=\"glyphicons {{reporteMarcadorExcel.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{reporteMarcadorExcel.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorExcel()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"reporteMarcadorExcel.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadorExcel($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'plantilla' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.unicoArchivo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'soporte' | translate }} {{'unico' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.descargarFuente\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'descargardoc' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.generarPin\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'generarpin' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [(ngModel)]=\"reporteFuente.campoAgrupacionPlanilla\" \r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'agruparpor' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreAgrupacionPlanilla\" size=\"25\"\r\n maxlength=\"100\">\r\n <label>{{'nombrearchivoagrupacion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoPlanilla\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteFuente.unicoArchivo == 'N'\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"reporteFuente.archivoIndividual ? reporteFuente.archivoIndividual: ''\"\r\n [labelrar]=\"'archivo' | translate\" [labelarch]=\"'archivo' | translate\" [mostraroblicargo]=\"true\"\r\n (onSelected)=\"obtenerArchivoPlanilla($event)\"></app-input-helper-seleccion-plantilla>\r\n </div>\r\n\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-tabView >\r\n <p-tabPanel header=\"{{'marcadores' | translate }}\" [selected]=\"true\">\r\n \r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton pRipple class=\"p-button-secondary font-semibold mb-2\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcador()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcador\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcador\">\r\n <button pButton pRipple (click)=\"verNuevoMarcador = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadores\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcador\"\r\n [rows]=\"10\" [totalRecords]=\"listaMarcadores.length\"\r\n [paginator]=\"listaMarcadores.length > 10\" *ngIf=\"!verNuevoMarcador\"\r\n (onRowSelect)=\"verDetalleMarcador($event)\" (onRowUnselect)=\"verDetalleMarcador($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'descripcion' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'marcador' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marcador>\r\n <tr [pSelectableRow]=\"marcador\">\r\n <td>{{marcador.descripcion}}</td>\r\n <td>{{marcador.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\r\n <td>{{marcador.tipo == 'IF' ? marcador.textoRegistro : marcador.nombreColumna}}</td>\r\n <td>{{marcador.marcador}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <div class=\"card col-md-12\" *ngIf=\"verNuevoMarcador\">\r\n <div class=\"Detallereporte mt-2\">\r\n <form [formGroup]=\"formMarcador\">\r\n <p class=\"font-semibold\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\"\r\n maxlength=\"4000\">\r\n <label>{{'descripcion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoMarcador\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"tipo\" optionLabel=\"nombre\"\r\n optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!(['MA','IM','MR','IF','QR','BC','G1'].includes(reporteMarcador.tipo))\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\">\r\n <label>{{'marcador' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"tabla\" size=\"25\">\r\n <label>{{'tabla' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'IF'\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\" formControlName=\"origen\" optionLabel=\"label\"\r\n optionValue=\"value\"></p-dropdown>\r\n <label>{{'origen' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"reporteMarcador.tipo != 'IF' || !reporteMarcador.origen\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n formControlName=\"textoRegistro\"\r\n [label]=\"reporteMarcador.textoRegistro ? reporteMarcador.textoRegistro: ''\"\r\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcador($event)\"\r\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"'recursossssss' | translate\"\r\n [anexoPropiedad]=\"reporteMarcador.origen =='C' ? llaveEmpresa: ''\"\r\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['MA','IM','QR','BC','G1'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" formControlName=\"reporteColumna\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\r\n optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'columna' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MA'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"formato\" size=\"25\">\r\n <label>{{'formato' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-inputNumber formControlName=\"ancho\" [maxlength]=\"5\"> </p-inputNumber>\r\n <label>{{'ancho' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-inputNumber formControlName=\"alto\" [maxlength]=\"5\"> </p-inputNumber>\r\n <label>{{'alto' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo1\"></textarea>\r\n <label>{{'grupo1' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo2\"></textarea>\r\n <label>{{'grupo2' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo3\"></textarea>\r\n <label>{{'grupo3' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"finalGrupo\"></textarea>\r\n <label>{{'finalgrupo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\r\n <label>{{'texto' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['MR','TB'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" formControlName=\"tieneSql\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'sql' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoGrafico_JFC\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\"\r\n optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'grafica' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\"\r\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['S'].includes(reporteMarcador.tieneSql)))\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"query\"></textarea>\r\n <label>{{'consulta' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"fuente\" optionLabel=\"descripcion\"\r\n optionValue=\"llave\"></p-dropdown>\r\n <label>{{'fuente' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"marcadorGrafico\" size=\"25\">\r\n <label>{{'marcadorgrafica' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"titulox\" size=\"25\">\r\n <label>{{'titulo' | translate }} X</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"tituloy\" size=\"25\">\r\n <label>{{'titulo' | translate }} Y</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"banda\" size=\"25\">\r\n <label>{{'colordinamico' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" size=\"25\">\r\n <label>{{'numerocategorias' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\"\r\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"filtro\"></textarea>\r\n <label>{{'filtro' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\r\n icon=\"glyphicons {{reporteMarcador.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save' }}\" label=\"{{reporteMarcador.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\"\r\n (click)=\"guardarMarcador()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"reporteMarcador.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcador($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"verNuevoMarcador && reporteMarcador.llave != null && (reporteMarcador.tipo == 'MR' || reporteMarcador.tipo == 'TB')\">\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTabla()\" icon=\"pi pi-plus\" [disabled]=\"bloquearCampoMarcador\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"listaCamposMarcador\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcador.length\" [scrollable]=\"true\"\r\n [paginator]=\"listaCamposMarcador.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 10%;\">{{'columna' | translate }}</th>\r\n <th style=\"width: 10%;\">{{'campo' | translate }}</th>\r\n <th style=\"width: 10%;\">{{'formato' | translate }}</th>\r\n <th style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">{{'tipo' | translate }}</th>\r\n <th style=\"width: 10%;\"*ngIf=\"reporteMarcador.tipo == 'TB'\">{{'medidas' | translate }}</th>\r\n <th style=\"width: 10%;\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalle\">\r\n <td style=\"width: 10%;\">\r\n <input pInputText [(ngModel)]=\"campoMarcadorInsertar.columna\" oninput=\"this.value = this.value.replace(/[^0-9]/g, '');\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\" />\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.campoFuente\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\">\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.formato\">\r\n </td>\r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [(ngModel)]=\"campoMarcadorInsertar.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\r\n </td>\r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <div *ngIf=\"campoMarcadorInsertar.tipo =='I'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.ancho\">\r\n <label>{{'ancho' | translate}}</label>\r\n </p-floatLabel>\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.alto\">\r\n <label>{{'alto' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n </td>\r\n <td style=\"width: 10%;\" >\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campoMarcadorInsertar)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalle = false; bloquearCampoMarcador = false\" icon=\"pi pi-times\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"campo\">\r\n <td style=\"width: 10%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.columna\" oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" \r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" />\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.columna}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.campoFuente}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n\r\n <td style=\"width: 10%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.formato}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n \r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [(ngModel)]=\"campo.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.tipo | reporteFuentePipe :'listaRecursoGrafica'}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n \r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <div *ngIf=\"campo.tipo =='I'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.ancho\">\r\n <label>{{'ancho' | translate}}</label>\r\n </p-floatLabel>\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.alto\">\r\n <label>{{'alto' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <div *ngIf=\"campo.tipo =='I'\">\r\n {{'ancho' | translate}}: {{campo.ancho}} <br/>\r\n {{'alto' | translate}}: {{campo.alto}}\r\n </div> \r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorAsync()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow [disabled]=\"bloquearCampoMarcador\"\r\n icon=\"glyphicons glyphicons-pencil\" (click)=\"editarCampoMarcador()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow [disabled]=\"bloquearCampoMarcador\"\r\n icon=\"pi pi-trash\" (click)=\"eliminarCampoMarcador($event,campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'soporte' | translate }} {{'archivo' | translate }}s\"\r\n *ngIf=\"reporteFuente.unicoArchivo == 'N'\">\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoSoporte()\" icon=\"pi pi-plus\"\r\n [disabled]=\"habilitaCampo\" class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"listaSoportes\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"listaSoportes.length\"\r\n [paginator]=\"listaSoportes.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llaveTabla\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 45%\">{{'descripcion' | translate}}</th>\r\n <th style=\"width: 45%\">{{'archivo' | translate}}</th>\r\n <th style=\"width: 10%\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verSoporteArchivoDetalle\">\r\n <td style=\"width: 45%\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"soporteIngresar.descripcion\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\">\r\n </td>\r\n <td style=\"width: 45%\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\" [mostrarX]=\"true\"\r\n [label]=\"soporteIngresar.archivoIndividual ? soporteIngresar.archivoIndividual: ''\" [labelarch]=\"'archivo' | translate\"\r\n [mostrarLabelInput]=\"false\" [mostraroblicargo]=\"true\" [booleano]=\"!utilsService.validarCampoObligatorio(soporteIngresar.archivoIndividual) && clickGuardarSoporteArchivo\"\r\n (onSelected)=\"obtenerArchivoSoporte($event, soporteIngresar)\"></app-input-helper-seleccion-plantilla>\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarSoporte(soporteIngresar)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verSoporteArchivoDetalle = false\" icon=\"pi pi-times\" (click)=\"cancelarSoporte()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-soporte let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"soporte\" style=\"width: 100%\">\r\n <td style=\"width: 45%\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"soporte.descripcion\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{soporte.descripcion}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 45%\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\" [mostrarX]=\"true\"\r\n [label]=\"soporte.archivoIndividual ? soporte.archivoIndividual: ''\"\r\n [mostrarLabelInput]=\"false\" [booleano]=\"!utilsService.validarCampoObligatorio(soporte.archivoIndividual) && clickGuardarSoporteArchivo\"\r\n (onSelected)=\"obtenerArchivoSoporte($event, soporte)\"></app-input-helper-seleccion-plantilla>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{soporte.archivoIndividual}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarSoporte(soporte)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cancelarEdicion()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\r\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" (click)=\"eliminarSoporte($event, soporte)\" [disabled]=\"habilitaCampo\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </p-tabPanel>\r\n </p-tabView>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'reporte' | translate }} {{'dinamico' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.dobleLinea\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'doblelinea' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.tituloParametro\" size=\"25\"\r\n maxlength=\"100\">\r\n <label>{{'descripcion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoJasper\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n \r\n \r\n <button pButton pRipple class=\"ml-2 p-button-outlined background-100\" icon=\"glyphicons glyphicons-restart\" \r\n label=\"{{'link_generar' | translate}}\" (click)=\"generarJasper()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"pi pi-download\" *ngIf=\"existeJasper\"\r\n label=\"{{'link_descargar' | translate}}\" (click)=\"descargarJasper()\">\r\n </button>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"bandaSeleccionada.key\">\r\n <button pButton pRipple (click)=\"regresarBandaSeleccionada()\" label= \"{{'listado' | translate}} {{'bandas' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaTipoBanda\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" [rows]=\"10\"\r\n [totalRecords]=\"listaTipoBanda.length\" [paginator]=\"listaTipoBanda.length > 10\"\r\n (onRowSelect)=\"verBanda($event)\" (onRowUnselect)=\"verBanda($event)\" *ngIf=\"!bandaSeleccionada.key\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'banda' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-banda>\r\n <tr [pSelectableRow]=\"banda\">\r\n <td>{{banda.value}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <p-tabView *ngIf=\"bandaSeleccionada.key && verTabBanda\">\r\n <p-tabPanel header=\"{{'caracteristicas' | translate}}\"\r\n *ngIf=\"!['detalle','summary'].includes(bandaSeleccionada.key)\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"codigo\" \r\n [(ngModel)]=\"reporteBanda.totales\" ></p-dropdown>\r\n <label>{{'total' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteBanda.titulo\" maxlength=\"200\">\r\n <label>{{'titulo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-floppy-save\"\r\n label=\"{{'link_guardar' | translate}}\" (click)=\"guardarCaracteristicaBanda()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{bandaSeleccionada.value}}\" *ngIf=\"!nuevaBanda\">\r\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\r\n <div class=\"flex justify-content-end mb-1\" >\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoMarcadorDinamico()\" icon=\"pi pi-plus\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\" *ngIf=\"!nuevoReporteMarcadorDinamico\"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadorDinamico\" [scrollable]=\"true\"\r\n responsiveLayout=\"scroll\" dataKey=\"llaveTabla\" selectionMode=\"single\"\r\n [rows]=\"10\" [totalRecords]=\"listaMarcadorDinamico.length\"\r\n [paginator]=\"listaMarcadorDinamico.length > 10\" *ngIf=\"!nuevoReporteMarcadorDinamico\"\r\n (onRowSelect)=\"verMarcadorDinamico($event)\" (onRowUnselect)=\"verMarcadorDinamico($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'banda' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'etiqueta' | translate }}</th>\r\n <th>{{'formato' | translate }}</th>\r\n <th>{{'ancho' | translate }}</th>\r\n <th>{{'operacion' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-dinamico>\r\n <tr [pSelectableRow]=\"dinamico\">\r\n <td>{{dinamico.banda}}</td>\r\n <td>{{dinamico.banda ? dinamico.alto : ''}}</td>\r\n <td>{{dinamico.marcador}}</td>\r\n <td>{{dinamico.banda ? dinamico.descripcion : ''}}</td>\r\n <td>{{dinamico.banda ? dinamico.formato : ''}}</td>\r\n <td>{{['detalle'].includes(dinamico.banda) ? dinamico.ancho : ''}}</td>\r\n <td>{{dinamico.banda ? dinamico.operacion : ''}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <div *ngIf=\"nuevoReporteMarcadorDinamico\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"flex justify-content-between align-items-center mb-2\"> \r\n <p class=\"font-semibold mt-3\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\r\n <button pButton pRipple (click)=\"nuevoReporteMarcadorDinamico = false\" label= \"{{'listado' | translate}} {{bandaSeleccionada.value}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \" *ngIf=\"nuevoReporteMarcadorDinamico\"></button>\r\n </div>\r\n <form [formGroup]=\"formReporteDinamico\" class=\"p-fluid grid\">\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCampoJasperDinamico\"\r\n [autoDisplayFirst]=\"false\" formControlName=\"tipoCampo\"\r\n optionLabel=\"value\" optionValue=\"key\"></p-dropdown>\r\n <label>{{'tipocampo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoDatoSintaxis\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"tipoDato\" optionLabel=\"value\"\r\n optionValue=\"key\"></p-dropdown>\r\n <label>{{'tipodato' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText formControlName=\"alto\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\r\n <label>{{'orden' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"marcador\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\r\n *ngIf=\"!reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\"></p-dropdown>\r\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\"\r\n *ngIf=\"reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <label>{{'columna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-12\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"filtro\"></textarea>\r\n <label>{{'sintaxis' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\">\r\n <p-fieldset class=\"fieldsintitulo\" class=\"fieldsintitulo\">\r\n <div class=\"p-fluid grid\">\r\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\">\r\n <label class=\"font-semibold text-gray-900 text-base ml-1\">{{'resultado' | translate}}</label>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\"></div>\r\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <label class=\"font-semibold text-gray-900 text-base ml-1\" >{{'label' | translate}}</label>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"formato\" />\r\n <label>{{'formato' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"descripcion\" />\r\n <label>{{'titulo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"ancho\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\r\n <label>{{'ancho' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' == reporteMarcadorDinamico.banda \"></div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'ancho' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"resultadoX\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'x' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"titulox\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'x' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"resultadoY\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'y' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"tituloy\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'y' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"tipoReporte\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'alineacion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'alineacion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoDato == 'N' && reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaOperaciones\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"operacion\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'operacion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </div>\r\n </form>\r\n \r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{reporteMarcadorDinamico.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{reporteMarcadorDinamico.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaDinamico()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"reporteMarcadorDinamico.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarColumnaDinamico($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n \r\n </p-tabView>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'reporte' | translate }} {{'texto' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.archivoTexto\" size=\"50\"\r\n maxlength=\"200\">\r\n <label>{{'nombrearchivo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSeparadores\" [(ngModel)]=\"reporteFuente.separador\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\r\n [autoDisplayFirst]=\"false\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'separador' | translate }}*</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoTexto\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizarSeparador()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex justify-content-between lign-items-center mb-3\">\r\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorTexto()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorTexto\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorTexto\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorTexto = false; clickGuardarMarcadorTexto = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadoresTexto\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"listaMarcadoresTexto.length\"\r\n [paginator]=\"listaMarcadoresTexto.length > 10\" *ngIf=\"!verNuevoMarcadorTexto\"\r\n (onRowSelect)=\"verMarcadorTexto($event)\" (onRowUnselect)=\"verMarcadorTexto($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'formato' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marctexto>\r\n <tr [pSelectableRow]=\"marctexto\">\r\n <td>{{marctexto.tipoGrafico | reporteFuentePipe : 'listaTipoMarcadoresTexto'}}</td>\r\n <td>{{marctexto.nombreColumna}}</td>\r\n <td>{{marctexto.formato}}</td>\r\n <td>{{marctexto.alto}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorTexto\"> \r\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoMarcadorTexto\" [autoDisplayFirst]=\"false\"\r\n [(ngModel)]=\"marcadorTexto.tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\"\r\n [(ngModel)]=\"marcadorTexto.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"></p-dropdown>\r\n <label>{{'columna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.formato\" maxlength=\"50\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\">\r\n <label>{{marcadorTexto.tipoGrafico == 'D' ? ('formato' | translate)+'*' : ('valor' | translate)+'*' }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.ancho\" maxlength=\"22\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\">\r\n <label>{{'ancho' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.alto\" maxlength=\"22\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\">\r\n <label>{{'orden' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorTexto.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{marcadorTexto.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorTexto()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"marcadorTexto.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadoTexto($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'tabla' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreTabla\" maxlength=\"4000\">\r\n <label>{{'nombretabla' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-8\">\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-pickList [source]=\"listaTabla\" [target]=\"listaNoTabla\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\r\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\r\n filterBy=\"nombre\" *ngIf=\"isFuente()\" (onSourceReorder)=\"reorderTabla($event)\"\r\n (onMoveAllToTarget)=\"moverADesasociadoTabla($event)\" (onMoveAllToSource)=\"moverAAsociadoTabla($event)\"\r\n (onMoveToTarget)=\"moverADesasociadoTabla($event)\" (onMoveToSource)=\"moverAAsociadoTabla($event)\">\r\n <ng-template let-tabla pTemplate=\"item\">\r\n <div>\r\n <label>{{tabla.nombre}}</label>\r\n </div>\r\n </ng-template>\r\n </p-pickList>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'archivoxml' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.tagEncabezado\"></textarea>\r\n <label>{{'tagencabezado' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.tagCierreEncabezado\"></textarea>\r\n <label>{{'tagcierreencabezado' | translate }}</label>\r\n </p-floatLabel> \r\n </div>\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.estructuraRegistro\"></textarea>\r\n <label>{{'tagregistro' | translate }}</label>\r\n </p-floatLabel> \r\n </div>\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoXml\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"flex justify-content-between align-items-center mb-3\">\r\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorXML()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorXML\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorXML\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorXML = false; clickGuardarMarcadorXML = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaXML\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"listaXML.length\"\r\n [paginator]=\"listaXML.length > 10\" *ngIf=\"!verNuevoMarcadorXML\"\r\n (onRowSelect)=\"verMarcadorXML($event)\" (onRowUnselect)=\"verMarcadorXML($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'descripcion' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'marcador' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marctexto>\r\n <tr [pSelectableRow]=\"marctexto\">\r\n <td>{{marctexto.descripcion}}</td>\r\n <td>{{marctexto.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\r\n <td>{{marctexto.nombreColumna}}</td>\r\n <td>{{marctexto.marcador}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorXML\"> \r\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.descripcion\" maxlength=\"100\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\">\r\n <label>{{'descripcion' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaTipoMarcadorXML\" [autoDisplayFirst]=\"false\" \r\n [(ngModel)]=\"marcadorXML.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MA','MR'].includes(marcadorXML.tipo)\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" >\r\n <label>{{'marcador' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\r\n <label>{{'tabla' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"marcadorXML.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\" ></p-dropdown>\r\n <label>{{'columna' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.formato\" >\r\n <label>{{'formato' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.textoRegistro\" ></textarea>\r\n <label>{{'texto' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"marcadorXML.fuente\" optionLabel=\"descripcion\" optionValue=\"llave\"></p-dropdown>\r\n <label>{{'fuente' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.filtro\"></textarea>\r\n <label>{{'filtro' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.estructuraTablaXML\"></textarea>\r\n <label>{{'estructuratabla' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorXML.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{marcadorXML.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorXML()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"marcadorXML.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadorXML($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"verNuevoMarcadorXML && marcadorXML.llave != null && (marcadorXML.tipo == 'MR' || marcadorXML.tipo == 'TB')\">\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTablaXML()\" icon=\"pi pi-plus\" [disabled]=\"habilitaCampo\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"listaCamposMarcadorXML\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcadorXML.length\"\r\n [paginator]=\"listaCamposMarcadorXML.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 30%;\">{{'campo' | translate }}</th>\r\n <th style=\"width: 30%;\">{{'marcador' | translate }}</th>\r\n <th style=\"width: 30%;\">{{'formato' | translate }}</th>\r\n <th style=\"width: 10%\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalleXML\">\r\n <td style=\"width: 30%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.campoFuente\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\">\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.marcador\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\">\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.formato\" style=\"width: -webkit-fill-available\">\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\" >\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campoMarcadorInsertarXML)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalleXML = false; habilitaCampo = false;\" icon=\"pi pi-times\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"campo\">\r\n <td style=\"width: 30%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.campoFuente}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.marcador\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.marcador}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\" style=\"width: -webkit-fill-available\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.formato}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n \r\n \r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorXMLAsync()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\r\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" [disabled]=\"habilitaCampo\" (click)=\"eliminarCampoMarcadorXML($event,campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'columnario' | translate }}\">\r\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\" >\r\n <p-accordionTab [selected]=\"true\" >\r\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\r\n {{'columnasbasicas'|translate}}\r\n </ng-template>\r\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoColumnaBasica()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoReporteColumnario\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoReporteColumnario\">\r\n <button pButton pRipple (click)=\"verNuevoReporteColumnario = false; clickGuardarReporteColumnario = false;\" label= \"{{'listado' | translate}} {{'columnasbasicas' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaReporteColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"listaReporteColumnario.length\"\r\n [paginator]=\"listaReporteColumnario.length > 10\" *ngIf=\"!verNuevoReporteColumnario\"\r\n (onRowSelect)=\"verReporteColumnario($event)\" (onRowUnselect)=\"verReporteColumnario($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'nombre' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n <th>{{'operacion' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-bean>\r\n <tr [pSelectableRow]=\"bean\">\r\n <td>{{bean.nombre}}</td>\r\n <td>{{bean.nombreColumna}}</td>\r\n <td>{{bean.tipo | reporteColumnarioPipe: 'listaTipoColumna'}}</td>\r\n <td>{{bean.orden}}</td>\r\n <td>{{bean.operacion | reporteColumnarioPipe: 'listaOperacion'}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div *ngIf=\"verNuevoReporteColumnario\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.nombre\" maxlength=\"100\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\">\r\n <label>{{'nombre' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaTipoColumnas\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'tipocolumna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'columna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"columnaBasica.tipo == 'D'\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOperacionesColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.operacion\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'operacion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.operacionHorizontal\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'operacionhorizontal' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- fila Operacion Vertical -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.columnaOperacionVertical\" maxlength=\"5\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\">\r\n <label>{{'columnaoperacion' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Operacion Verticial -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.operacionVertical\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'operacionvertical' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Orden -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrden()\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.orden\" maxlength=\"5\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\">\r\n <label>{{'orden' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Ordenamiento Filas -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoLabel() || isTipoFila()\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" [showClear]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\" \r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.orderBy) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.orderBy) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'ordenamiento' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Ordenamiento Datos de la consulta -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrdenConsulta()\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.ordenConsulta\" maxlength=\"5\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\r\n <label>{{'ordenconsulta' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaBasica.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{columnaBasica.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaBasica()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"columnaBasica.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarColumnaBasica($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </p-accordionTab>\r\n </p-accordion>\r\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\">\r\n <p-accordionTab >\r\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\r\n {{'datosadicionales'|translate}}\r\n </ng-template>\r\n <p-fieldset class=\"fieldsintitulo\" >\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n \r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"reporteFuente.archivoExcelColumnario ? reporteFuente.archivoExcelColumnario: ''\"\r\n [extensiones]=\"'xls;xlsx;xlsm'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\r\n (onSelected)=\"obtenerArchivoColumnario($event)\"></app-input-helper-seleccion-plantilla>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\r\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\r\n translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"reporteFuente.filaInicioColumnario\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\r\n <label>{{'filainiciocolumnario' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" appendTo=\"body\"\r\n [(ngModel)]=\"reporteFuente.cifradoColumnario\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.sintaxisColumnario\"></textarea>\r\n <label>{{'sintaxiscolumnario' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n <div class=\"flex justify-content-between align-items-center mb-3 mt-3\">\r\n <h1 class=\"text-xl\">{{'columnaadicional' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevaColumnaAdicional()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoColumnaAdicional\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoColumnaAdicional\">\r\n <button pButton pRipple (click)=\"verNuevoColumnaAdicional = false; clickGuardarColumnaAdicional = false;\" label= \"{{'listado' | translate}} {{'columnaadicional' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"columnasAdicionales\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"columnasAdicionales.length\"\r\n [paginator]=\"columnasAdicionales.length > 10\" *ngIf=\"!verNuevoColumnaAdicional\"\r\n (onRowSelect)=\"verDetalleAdicional($event)\" (onRowUnselect)=\"verDetalleAdicional($event)\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'nombre' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-columnaadicional>\r\n <tr [pSelectableRow]=\"columnaadicional\">\r\n <td>{{columnaadicional.nombre}}</td>\r\n <td>{{columnaadicional.orden}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <p-fieldset class=\"fieldsintitulo\" *ngIf=\"verNuevoColumnaAdicional\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-3\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaAdicional.nombre\" maxlength=\"100\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\">\r\n <label>{{'alias' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"columnaAdicional.orden\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\" />\r\n <label>{{'orden' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaAdicional.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"></p-dropdown>\r\n <label>{{'ordenamiento' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-3\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"columnaAdicional.ordenConsulta\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\" />\r\n <label>{{'ordenconsulta' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\" >\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"columnaAdicional.sintaxis\" maxlength=\"4000\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"></textarea>\r\n <label>{{'sintaxis' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaAdicional.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{columnaAdicional.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaAdicional()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"columnaAdicional.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarColumnaAdicional($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </p-accordionTab>\r\n <p-accordionTab >\r\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\r\n {{'marcadores'|translate}}\r\n </ng-template>\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorColumnario()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorColumnario\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorColumnario\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorColumnario = false; clickGuardarMarcadorColumnario = false;\" label= \"{{'listado' | translate}} {{'marcador' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"marcadoresColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"marcadoresColumnario.length\"\r\n [paginator]=\"marcadoresColumnario.length > 10\" *ngIf=\"!verNuevoMarcadorColumnario\"\r\n (onRowSelect)=\"verDetalleMarcadorColumnario($event)\" (onRowUnselect)=\"verDetalleMarcadorColumnario($event)\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'nombre' | translate }}</th>\r\n <th>{{'tipomarcador' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marcador>\r\n <tr [pSelectableRow]=\"marcador\">\r\n <td>{{marcador.marcador}}</td>\r\n <td>{{marcador.tipo | reporteColumnarioPipe: 'listaTipoMarcador'}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div *ngIf=\"verNuevoMarcadorColumnario\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"marcadorColumnario.descripcion\" maxlength=\"4000\" \r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\" />\r\n <label>{{'descripcion' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"marcadorColumnario.marcador\" maxlength=\"50\" \r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\" />\r\n <label>{{'marcador' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaTipoMarcadorColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"marcadorColumnario.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-12\" >\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"marcadorColumnario.textoRegistro\" maxlength=\"4000\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"></textarea>\r\n <label>{{'valor' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorColumnario.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{marcadorColumnario.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorColumnario()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"marcadorColumnario.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadorColumnario($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </p-accordionTab>\r\n </p-accordion>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'grafica' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.codigo\" size=\"25\"\r\n maxlength=\"100\">\r\n <label>{{'codigo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.tituloGrafico\" size=\"25\"\r\n maxlength=\"100\">\r\n <label>{{'titulo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoGrafico\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.tipoGrafico\" optionLabel=\"nombre\"\r\n optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'tipo' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" *ngIf=\"isSql()\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\" \r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"guardarGrafico()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined background-100\" icon=\"pi pi-eye\"\r\n label=\"{{'link_ver' | translate}}\" (click)=\"verGrafico()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-table [value]=\"paginadorColumnas\" responsiveLayout=\"scroll\" [scrollable]=\"true\"\r\n [rows]=\"20\" [totalRecords]=\"paginadorColumnas.length\" [paginator]=\"paginadorColumnas.length > 20\" >\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'sintaxis' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'accion' | translate }}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-bean>\r\n <tr [pSelectableRow]=\"bean\">\r\n <td>{{bean.nombre}}</td>\r\n <td>{{bean.sintaxis}}</td>\r\n <td>{{bean.tipoDato | reporteFuentePipe : 'listaTipoDato'}}</td>\r\n <td>\r\n <p-dropdown [options]=\"listaGraficoSencillo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"bean.graficoFuente\" optionLabel=\"nombre\"\r\n optionValue=\"codigo\"></p-dropdown>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table> \r\n\r\n <div class=\"flex justify-content-between align-items-center mt-2 mb-2\">\r\n <h1 class=\"text-xl\">Colores</h1>\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoColorCategoria()\" icon=\"pi pi-plus\"\r\n [disabled]=\"habilitaCampo\" class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"paginadorColoresGrafica\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"paginadorColoresGrafica.length\"\r\n [paginator]=\"paginadorColoresGrafica.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llaveTabla\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 45%\">{{'categoria' | translate}}</th>\r\n <th style=\"width: 45%\">{{'color' | translate}}</th>\r\n <th style=\"width: 10%\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verColorCategoriaDetalle\">\r\n <td style=\"width: 45%\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"colorCategoria.titulo\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(colorCategoria.titulo) && clickGuardarColorCategoria\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(colorCategoria.titulo) && clickGuardarColorCategoria\">\r\n </td>\r\n <td style=\"width: 45%\">\r\n <div style=\"width: 100%\">\r\n <p-colorPicker [(ngModel)]=\"colorCategoria.banda\" appendTo=\"body\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(colorCategoria.banda) && clickGuardarColorCategoria\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(colorCategoria.banda) && clickGuardarColorCategoria\" />\r\n </div>\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarColorCategoria(colorCategoria)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verColorCategoriaDetalle = false\" icon=\"pi pi-times\" (click)=\"cancelarColorCategoria()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-color let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"color\" style=\"width: 100%\">\r\n <td style=\"width: 45%\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"color.titulo\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(color.titulo) && clickGuardarColorCategoria\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(color.titulo) && clickGuardarColorCategoria\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{color.titulo}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 45%\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <div style=\"width: 100%\">\r\n <p-colorPicker [(ngModel)]=\"color.banda\" appendTo=\"body\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(color.banda) && clickGuardarColorCategoria\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(color.banda) && clickGuardarColorCategoria\"/>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <p-colorPicker [(ngModel)]=\"color.banda\" [disabled]=\"true\" />\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarColorCategoria(color)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cancelarEdicionColor()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\r\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" (click)=\"eliminarColorCategoria($event, color)\" [disabled]=\"habilitaCampo\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div class=\"flex justify-content-between card mt-3\" *ngIf=\"grafica\">\r\n <h1 class=\"text-xl\">{{'grafica' | translate}}</h1>\r\n <div style=\"width: 35%\"></div>\r\n <div style=\"width: 30%\">\r\n <p-chart [type]=\"tipoGrafica\" [data]=\"grafica.datosGrafica.data\" [options]=\"grafica.datosGrafica.options\"></p-chart>\r\n </div>\r\n <div style=\"width: 35%\"></div>\r\n </div>\r\n </p-tabPanel>\r\n</p-tabView>", styles: [":host ::ng-deep .p-picklist-buttons.p-picklist-source-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist-buttons.p-picklist-target-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist.p-component{margin:0}:host ::ng-deep .p-picklist-item span{float:left!important}:host ::ng-deep .fieldsintitulo .p-fieldset-legend{display:none!important}:host ::ng-deep .p-picklist-list-wrapper.p-picklist-source-wrapper ul{box-shadow:inset 1px 8px 10px -10px var(--color-200)}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-200) no-repeat}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-50) no-repeat}:host ::ng-deep .p-picklist .p-picklist-header{display:none}:host ::ng-deep .p-picklist .p-picklist-filter-container span{color:var(--color-100)}:host ::ng-deep .p-picklist .p-picklist-filter-container{border-radius:10px 10px 0 0;padding:3%;border:1px solid var(--color-100);border-bottom:none;box-shadow:0 4px 7px var(--color-100);position:relative}:host ::ng-deep .p-picklist .p-picklist-list{border:1px solid var(--color-100);height:400px}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item{padding:2%;color:#000000de;background:solid 2px var(--color-50) no-repeat;margin:16px 16px -7px;border-radius:5px;border:solid 1px var(--color-100);transition:.2s;background:#fff}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h6,:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h7{color:var(--color-500);margin-bottom:2px;font-size:1rem;margin-top:0}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item span{float:left;margin-right:4px;min-height:30px;color:var(--color-400)}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover{background:var(--color-400);color:#fff;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h6,:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h7{color:#fff!important;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover span{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight{background:var(--color-500);color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h6,:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h7{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight span{color:#fff!important}:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.5%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:20px}.p-picklist-buttons{padding:2rem}.p-picklist-buttons .p-button:disabled{background-color:var(--color3)!important;color:#fff!important}.p-picklist-buttons .p-button{margin-bottom:.5rem;border-radius:100%}.p-picklist-buttons .p-button.p-button-icon-only{padding:.4rem .5rem;width:40px;height:40px;max-width:initial;max-height:initial}.p-picklist-buttons .p-button.p-button-icon-only span{font-size:18px}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only{border-radius:100%;width:3rem!important;background:var(--color-500)}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only span{font-size:1.2rem;background:var(--color--300);color:#fff}:host ::ng-deep .p-picklist-buttons .p-button:disabled{background:var(--color-300)!important}@media (max-width: 1440px){:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.2%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:15px}}:host ::ng-deep .p-button{width:auto}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i11.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i17.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i7.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i17.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "component", type: i17.CellEditor, selector: "p-cellEditor" }, { kind: "directive", type: i17.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i17.InitEditableRow, selector: "[pInitEditableRow]" }, { kind: "directive", type: i17.SaveEditableRow, selector: "[pSaveEditableRow]" }, { kind: "directive", type: i17.CancelEditableRow, selector: "[pCancelEditableRow]" }, { kind: "ngmodule", type: TabViewModule }, { kind: "component", type: i18.TabView, selector: "p-tabView", inputs: ["style", "styleClass", "controlClose", "scrollable", "activeIndex", "selectOnFocus", "nextButtonAriaLabel", "prevButtonAriaLabel", "autoHideButtons", "tabindex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { kind: "component", type: i18.TabPanel, selector: "p-tabPanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { kind: "component", type: InputHelperSeleccionPlantillaComponent, selector: "app-input-helper-seleccion-plantilla", inputs: ["value", "label", "labelrar", "labelarch", "extensiones", "readonly", "propiedad", "anexoPropiedad", "showDialog", "propiedadDeSistema", "mostraroblicargo", "mostrarX", "booleano", "mostrarLabelInput"], outputs: ["onSelected"] }, { kind: "pipe", type: ReporteColumnarioPipe, name: "reporteColumnarioPipe" }, { kind: "pipe", type: ReporteFuentePipe, name: "reporteFuentePipe" }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i19.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i20.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i21.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "ngmodule", type: PickListModule }, { kind: "component", type: i22.PickList, selector: "p-pickList", inputs: ["source", "target", "sourceHeader", "tabindex", "rightButtonAriaLabel", "leftButtonAriaLabel", "allRightButtonAriaLabel", "allLeftButtonAriaLabel", "upButtonAriaLabel", "downButtonAriaLabel", "topButtonAriaLabel", "bottomButtonAriaLabel", "targetHeader", "responsive", "filterBy", "filterLocale", "trackBy", "sourceTrackBy", "targetTrackBy", "showSourceFilter", "showTargetFilter", "metaKeySelection", "dragdrop", "style", "styleClass", "sourceStyle", "targetStyle", "showSourceControls", "showTargetControls", "sourceFilterPlaceholder", "targetFilterPlaceholder", "disabled", "ariaSourceFilterLabel", "ariaTargetFilterLabel", "filterMatchMode", "stripedRows", "keepSelection", "breakpoint"], outputs: ["onMoveToSource", "onMoveAllToSource", "onMoveAllToTarget", "onMoveToTarget", "onSourceReorder", "onTargetReorder", "onSourceSelect", "onTargetSelect", "onSourceFilter", "onTargetFilter", "onFocus", "onBlur"] }, { kind: "ngmodule", type: FieldsetModule }, { kind: "component", type: i23.Fieldset, selector: "p-fieldset", inputs: ["legend", "toggleable", "collapsed", "style", "styleClass", "transitionOptions"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "ngmodule", type: AccordionModule }, { kind: "component", type: i24.Accordion, selector: "p-accordion", inputs: ["multiple", "style", "styleClass", "expandIcon", "collapseIcon", "activeIndex", "selectOnFocus", "headerAriaLevel"], outputs: ["onClose", "onOpen", "activeIndexChange"] }, { kind: "component", type: i24.AccordionTab, selector: "p-accordionTab", inputs: ["id", "header", "headerStyle", "tabStyle", "contentStyle", "tabStyleClass", "headerStyleClass", "contentStyleClass", "disabled", "cache", "transitionOptions", "iconPos", "selected", "headerAriaLevel"], outputs: ["selectedChange"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i25.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "ngmodule", type: InputTextareaModule }, { kind: "directive", type: i26.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize", "variant"], outputs: ["onResize"] }, { kind: "ngmodule", type: FloatLabelModule }, { kind: "component", type: i27.FloatLabel, selector: "p-floatLabel" }, { kind: "ngmodule", type: InputNumberModule }, { kind: "component", type: i28.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "ngmodule", type: ChartModule }, { kind: "component", type: i29.UIChart, selector: "p-chart", inputs: ["type", "plugins", "width", "height", "responsive", "ariaLabel", "ariaLabelledBy", "data", "options"], outputs: ["onDataSelect"] }, { kind: "ngmodule", type: ColorPickerModule }, { kind: "component", type: i30.ColorPicker, selector: "p-colorPicker", inputs: ["style", "styleClass", "inline", "format", "appendTo", "disabled", "tabindex", "inputId", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "autofocus"], outputs: ["onChange", "onShow", "onHide"] }] });
1572
- }
1573
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: DetalleTipoReporteComponent, decorators: [{
1574
- type: Component,
1575
- args: [{ selector: 'detalle-tipo-reporte', imports: [TranslateModule, TableModule, TabViewModule, InputHelperSeleccionPlantillaComponent, ReporteColumnarioPipe, ReporteFuentePipe, DropdownModule, FormsModule, ReactiveFormsModule, CommonModule, ButtonModule, PickListModule, FieldsetModule, AccordionModule, InputTextModule, InputTextareaModule, FloatLabelModule, InputNumberModule, FieldsetModule, ChartModule, ColorPickerModule], standalone: true, providers: [MessageService], template: "<p-tabView (onChange)=\"cambiarTab($event)\">\r\n <p-tabPanel header=\"{{'excel' | translate }}\" [selected]=\"true\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <p class=\"font-semibold\">{{'debe' | translate}} {{'indicar' | translate}} {{'plantilla' | translate}} {{'y' | translate}}\r\n {{'hoja' | translate}} {{'para' | translate}} {{'que' | translate}} {{'esta' | translate}}\r\n {{'opcion' | translate}} {{'se' | translate}} {{'active' | translate}}\r\n </p>\r\n <div class=\"p-fluid p-formgrid grid\">\r\n <div class=\"field col-12 md:col-4\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"reporteFuente.archivoTodo ? reporteFuente.archivoTodo: ''\"\r\n [extensiones]=\"'xls;xlsx'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\r\n (onSelected)=\"obtenerArchivo($event)\"></app-input-helper-seleccion-plantilla>\r\n\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\r\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\r\n translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoExcel\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\r\n icon=\"glyphicons glyphicons-refresh\" label=\"{{'link_actualizar' | translate}}\"\r\n (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-pickList [source]=\"listaExcel\" [target]=\"listaNoExcel\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\r\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\r\n filterBy=\"sintaxis\" (onSourceReorder)=\"moverAAsociado($event)\"\r\n (onMoveAllToTarget)=\"moverADesasociado($event)\" (onMoveAllToSource)=\"moverAAsociado($event)\"\r\n (onMoveToTarget)=\"moverADesasociado($event)\" (onMoveToSource)=\"moverAAsociado($event)\">\r\n <ng-template let-excel pTemplate=\"item\">\r\n <div>\r\n <label>{{excel.nombre}}</label>\r\n </div>\r\n </ng-template>\r\n </p-pickList>\r\n\r\n <div class=\"mt-4\">\r\n <div class=\"flex justify-content-between align-items-center mt-2 mb-2\">\r\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorExcel()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorExcel\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorExcel\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorExcel = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadorExcel\" responsiveLayout=\"scroll\" [scrollable]=\"true\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcadorExcel\" [rows]=\"10\"\r\n [totalRecords]=\"listaMarcadorExcel.length\" [paginator]=\"listaMarcadorExcel.length > 10\"\r\n (onRowSelect)=\"verDetalleMarcadorExcel($event)\" (onRowUnselect)=\"verDetalleMarcadorExcel($event)\" *ngIf=\"!verNuevoMarcadorExcel\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'descripcion' | translate }}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marcador>\r\n <tr [pSelectableRow]=\"marcador\">\r\n <td>{{marcador.descripcion}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorExcel\">\r\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-book\"></i>{{'detalle' | translate}}</h5>\r\n <div class=\"Detallereporte mt-4 \">\r\n <form [formGroup]=\"formMarcadorExcel\" >\r\n <div class=\"col-md-12 p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\" maxlength=\"4000\">\r\n <label>{{'descripcion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\" maxlength=\"4000\">\r\n <label>{{'marcador' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [options]=\"[{label: 'Imagen Fija', value: 'IF'}, {label: 'Marcador', value: 'MA'}]\"\r\n [autoDisplayFirst]=\"false\" formControlName=\"tipo\" optionLabel=\"label\"\r\n optionValue=\"value\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\" [hidden]=\"esImagenFija\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\r\n <label>{{'valor' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\r\n [autoDisplayFirst]=\"false\" formControlName=\"origen\" optionLabel=\"label\"\r\n optionValue=\"value\"></p-dropdown>\r\n <label>{{'origen' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"esMarcador\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n formControlName=\"textoRegistro\"\r\n [label]=\"reporteMarcadorExcel.textoRegistro ? reporteMarcadorExcel.textoRegistro: ''\"\r\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcadorExcel($event)\"\r\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"('recursos' | translate)\" [labelarch]=\"'recurso' | translate\" [mostrarX]=\"true\"\r\n [mostraroblicargo]=\"!(!utilsService.validarCampoObligatorio(reporteMarcadorExcel.textoRegistro) && clickGuardarMarcadorExcel)\"\r\n [anexoPropiedad]=\"reporteMarcadorExcel.origen =='C' ? llaveEmpresa: ''\"\r\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\r\n </div>\r\n </div>\r\n </form>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" *ngIf=\"verNuevoMarcadorExcel\">\r\n <button pButton pRipple class=\"ml-2 p-button-raised\" icon=\"glyphicons {{reporteMarcadorExcel.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{reporteMarcadorExcel.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorExcel()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"reporteMarcadorExcel.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadorExcel($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'plantilla' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.unicoArchivo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'soporte' | translate }} {{'unico' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.descargarFuente\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'descargardoc' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.generarPin\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'generarpin' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [(ngModel)]=\"reporteFuente.campoAgrupacionPlanilla\" \r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'agruparpor' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreAgrupacionPlanilla\" size=\"25\"\r\n maxlength=\"100\">\r\n <label>{{'nombrearchivoagrupacion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoPlanilla\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteFuente.unicoArchivo == 'N'\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"reporteFuente.archivoIndividual ? reporteFuente.archivoIndividual: ''\"\r\n [labelrar]=\"'archivo' | translate\" [labelarch]=\"'archivo' | translate\" [mostraroblicargo]=\"true\"\r\n (onSelected)=\"obtenerArchivoPlanilla($event)\"></app-input-helper-seleccion-plantilla>\r\n </div>\r\n\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-tabView >\r\n <p-tabPanel header=\"{{'marcadores' | translate }}\" [selected]=\"true\">\r\n \r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton pRipple class=\"p-button-secondary font-semibold mb-2\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcador()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcador\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcador\">\r\n <button pButton pRipple (click)=\"verNuevoMarcador = false\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadores\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" [selection]=\"reporteMarcador\"\r\n [rows]=\"10\" [totalRecords]=\"listaMarcadores.length\"\r\n [paginator]=\"listaMarcadores.length > 10\" *ngIf=\"!verNuevoMarcador\"\r\n (onRowSelect)=\"verDetalleMarcador($event)\" (onRowUnselect)=\"verDetalleMarcador($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'descripcion' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'marcador' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marcador>\r\n <tr [pSelectableRow]=\"marcador\">\r\n <td>{{marcador.descripcion}}</td>\r\n <td>{{marcador.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\r\n <td>{{marcador.tipo == 'IF' ? marcador.textoRegistro : marcador.nombreColumna}}</td>\r\n <td>{{marcador.marcador}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <div class=\"card col-md-12\" *ngIf=\"verNuevoMarcador\">\r\n <div class=\"Detallereporte mt-2\">\r\n <form [formGroup]=\"formMarcador\">\r\n <p class=\"font-semibold\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"descripcion\" size=\"25\"\r\n maxlength=\"4000\">\r\n <label>{{'descripcion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoMarcador\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"tipo\" optionLabel=\"nombre\"\r\n optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!(['MA','IM','MR','IF','QR','BC','G1'].includes(reporteMarcador.tipo))\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\">\r\n <label>{{'marcador' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"tabla\" size=\"25\">\r\n <label>{{'tabla' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'IF'\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [options]=\"[{label: 'Unica', value: 'U'}, {label: 'Cada Empresa', value: 'C'}]\"\r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\" formControlName=\"origen\" optionLabel=\"label\"\r\n optionValue=\"value\"></p-dropdown>\r\n <label>{{'origen' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"reporteMarcador.tipo != 'IF' || !reporteMarcador.origen\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n formControlName=\"textoRegistro\"\r\n [label]=\"reporteMarcador.textoRegistro ? reporteMarcador.textoRegistro: ''\"\r\n [extensiones]=\"'jpg;png'\" (onSelected)=\"obtenerArchivoMarcador($event)\"\r\n [propiedad]=\"'ruta_recursos'\" [labelrar]=\"'recursossssss' | translate\"\r\n [anexoPropiedad]=\"reporteMarcador.origen =='C' ? llaveEmpresa: ''\"\r\n [propiedadDeSistema]=\"true\"></app-input-helper-seleccion-plantilla>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['MA','IM','QR','BC','G1'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" formControlName=\"reporteColumna\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\r\n optionLabel=\"nombre\" optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'columna' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MA'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"formato\" size=\"25\">\r\n <label>{{'formato' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-inputNumber formControlName=\"ancho\" [maxlength]=\"5\"> </p-inputNumber>\r\n <label>{{'ancho' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['IM','IF','QR','BC','G1'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-inputNumber formControlName=\"alto\" [maxlength]=\"5\"> </p-inputNumber>\r\n <label>{{'alto' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo1\"></textarea>\r\n <label>{{'grupo1' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo2\"></textarea>\r\n <label>{{'grupo2' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"grupo3\"></textarea>\r\n <label>{{'grupo3' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"finalGrupo\"></textarea>\r\n <label>{{'finalgrupo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"textoRegistro\"></textarea>\r\n <label>{{'texto' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['MR','TB'].includes(reporteMarcador.tipo)\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" formControlName=\"tieneSql\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'sql' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"reporteMarcador.tipo != 'TB'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoGrafico_JFC\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\"\r\n optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'grafica' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\"\r\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['S'].includes(reporteMarcador.tieneSql)))\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"query\"></textarea>\r\n <label>{{'consulta' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"fuente\" optionLabel=\"descripcion\"\r\n optionValue=\"llave\"></p-dropdown>\r\n <label>{{'fuente' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"marcadorGrafico\" size=\"25\">\r\n <label>{{'marcadorgrafica' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"titulox\" size=\"25\">\r\n <label>{{'titulo' | translate }} X</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\"\r\n [hidden]=\"!['A'].includes(reporteMarcador.tipoGrafico)\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"tituloy\" size=\"25\">\r\n <label>{{'titulo' | translate }} Y</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"banda\" size=\"25\">\r\n <label>{{'colordinamico' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" [hidden]=\"!reporteMarcador.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" size=\"25\">\r\n <label>{{'numerocategorias' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\"\r\n [hidden]=\"!(['MR','TB'].includes(reporteMarcador.tipo) && (['N'].includes(reporteMarcador.tieneSql)))\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"filtro\"></textarea>\r\n <label>{{'filtro' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\r\n icon=\"glyphicons {{reporteMarcador.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save' }}\" label=\"{{reporteMarcador.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\"\r\n (click)=\"guardarMarcador()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"reporteMarcador.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcador($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"verNuevoMarcador && reporteMarcador.llave != null && (reporteMarcador.tipo == 'MR' || reporteMarcador.tipo == 'TB')\">\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTabla()\" icon=\"pi pi-plus\" [disabled]=\"bloquearCampoMarcador\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"listaCamposMarcador\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcador.length\" [scrollable]=\"true\"\r\n [paginator]=\"listaCamposMarcador.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 10%;\">{{'columna' | translate }}</th>\r\n <th style=\"width: 10%;\">{{'campo' | translate }}</th>\r\n <th style=\"width: 10%;\">{{'formato' | translate }}</th>\r\n <th style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">{{'tipo' | translate }}</th>\r\n <th style=\"width: 10%;\"*ngIf=\"reporteMarcador.tipo == 'TB'\">{{'medidas' | translate }}</th>\r\n <th style=\"width: 10%;\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalle\">\r\n <td style=\"width: 10%;\">\r\n <input pInputText [(ngModel)]=\"campoMarcadorInsertar.columna\" oninput=\"this.value = this.value.replace(/[^0-9]/g, '');\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.columna) && clickGuardarMarcadorCampo\" />\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.campoFuente\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertar.campoFuente) && clickGuardarMarcadorCampo\">\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.formato\">\r\n </td>\r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [(ngModel)]=\"campoMarcadorInsertar.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\r\n </td>\r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <div *ngIf=\"campoMarcadorInsertar.tipo =='I'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.ancho\">\r\n <label>{{'ancho' | translate}}</label>\r\n </p-floatLabel>\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertar.alto\">\r\n <label>{{'alto' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n </td>\r\n <td style=\"width: 10%;\" >\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campoMarcadorInsertar)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalle = false; bloquearCampoMarcador = false\" icon=\"pi pi-times\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"campo\">\r\n <td style=\"width: 10%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.columna\" oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" \r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.columna) && clickGuardarMarcadorCampo\" />\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.columna}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampo\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.campoFuente}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n\r\n <td style=\"width: 10%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.formato}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n \r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <p-dropdown [options]=\"listaGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [(ngModel)]=\"campo.tipo\" appendTo=\"body\" [autoZIndex]=\"false\"\r\n [autoDisplayFirst]=\"false\" [showClear]=\"true\"></p-dropdown>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.tipo | reporteFuentePipe :'listaRecursoGrafica'}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n \r\n <td style=\"width: 10%;\" *ngIf=\"reporteMarcador.tipo == 'TB'\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <div *ngIf=\"campo.tipo =='I'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.ancho\">\r\n <label>{{'ancho' | translate}}</label>\r\n </p-floatLabel>\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.alto\">\r\n <label>{{'alto' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <div *ngIf=\"campo.tipo =='I'\">\r\n {{'ancho' | translate}}: {{campo.ancho}} <br/>\r\n {{'alto' | translate}}: {{campo.alto}}\r\n </div> \r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%;\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcador(campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorAsync()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow [disabled]=\"bloquearCampoMarcador\"\r\n icon=\"glyphicons glyphicons-pencil\" (click)=\"editarCampoMarcador()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow [disabled]=\"bloquearCampoMarcador\"\r\n icon=\"pi pi-trash\" (click)=\"eliminarCampoMarcador($event,campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'soporte' | translate }} {{'archivo' | translate }}s\"\r\n *ngIf=\"reporteFuente.unicoArchivo == 'N'\">\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoSoporte()\" icon=\"pi pi-plus\"\r\n [disabled]=\"habilitaCampo\" class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"listaSoportes\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"listaSoportes.length\"\r\n [paginator]=\"listaSoportes.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llaveTabla\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 45%\">{{'descripcion' | translate}}</th>\r\n <th style=\"width: 45%\">{{'archivo' | translate}}</th>\r\n <th style=\"width: 10%\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verSoporteArchivoDetalle\">\r\n <td style=\"width: 45%\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"soporteIngresar.descripcion\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporteIngresar.descripcion) && clickGuardarSoporteArchivo\">\r\n </td>\r\n <td style=\"width: 45%\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\" [mostrarX]=\"true\"\r\n [label]=\"soporteIngresar.archivoIndividual ? soporteIngresar.archivoIndividual: ''\" [labelarch]=\"'archivo' | translate\"\r\n [mostrarLabelInput]=\"false\" [mostraroblicargo]=\"true\" [booleano]=\"!utilsService.validarCampoObligatorio(soporteIngresar.archivoIndividual) && clickGuardarSoporteArchivo\"\r\n (onSelected)=\"obtenerArchivoSoporte($event, soporteIngresar)\"></app-input-helper-seleccion-plantilla>\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarSoporte(soporteIngresar)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verSoporteArchivoDetalle = false\" icon=\"pi pi-times\" (click)=\"cancelarSoporte()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-soporte let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"soporte\" style=\"width: 100%\">\r\n <td style=\"width: 45%\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"soporte.descripcion\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(soporte.descripcion) && clickGuardarSoporteArchivo\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{soporte.descripcion}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 45%\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\" [mostrarX]=\"true\"\r\n [label]=\"soporte.archivoIndividual ? soporte.archivoIndividual: ''\"\r\n [mostrarLabelInput]=\"false\" [booleano]=\"!utilsService.validarCampoObligatorio(soporte.archivoIndividual) && clickGuardarSoporteArchivo\"\r\n (onSelected)=\"obtenerArchivoSoporte($event, soporte)\"></app-input-helper-seleccion-plantilla>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{soporte.archivoIndividual}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarSoporte(soporte)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cancelarEdicion()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\r\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" (click)=\"eliminarSoporte($event, soporte)\" [disabled]=\"habilitaCampo\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </p-tabPanel>\r\n </p-tabView>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'reporte' | translate }} {{'dinamico' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [(ngModel)]=\"reporteFuente.dobleLinea\" [showClear]=\"true\" [autoDisplayFirst]=\"false\"\r\n optionLabel=\"nombre\" optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'doblelinea' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.tituloParametro\" size=\"25\"\r\n maxlength=\"100\">\r\n <label>{{'descripcion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoJasper\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n \r\n \r\n <button pButton pRipple class=\"ml-2 p-button-outlined background-100\" icon=\"glyphicons glyphicons-restart\" \r\n label=\"{{'link_generar' | translate}}\" (click)=\"generarJasper()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"pi pi-download\" *ngIf=\"existeJasper\"\r\n label=\"{{'link_descargar' | translate}}\" (click)=\"descargarJasper()\">\r\n </button>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"bandaSeleccionada.key\">\r\n <button pButton pRipple (click)=\"regresarBandaSeleccionada()\" label= \"{{'listado' | translate}} {{'bandas' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaTipoBanda\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" [rows]=\"10\"\r\n [totalRecords]=\"listaTipoBanda.length\" [paginator]=\"listaTipoBanda.length > 10\"\r\n (onRowSelect)=\"verBanda($event)\" (onRowUnselect)=\"verBanda($event)\" *ngIf=\"!bandaSeleccionada.key\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'banda' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-banda>\r\n <tr [pSelectableRow]=\"banda\">\r\n <td>{{banda.value}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <p-tabView *ngIf=\"bandaSeleccionada.key && verTabBanda\">\r\n <p-tabPanel header=\"{{'caracteristicas' | translate}}\"\r\n *ngIf=\"!['detalle','summary'].includes(bandaSeleccionada.key)\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSiNo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" optionLabel=\"nombre\" optionValue=\"codigo\" \r\n [(ngModel)]=\"reporteBanda.totales\" ></p-dropdown>\r\n <label>{{'total' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteBanda.titulo\" maxlength=\"200\">\r\n <label>{{'titulo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-floppy-save\"\r\n label=\"{{'link_guardar' | translate}}\" (click)=\"guardarCaracteristicaBanda()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{bandaSeleccionada.value}}\" *ngIf=\"!nuevaBanda\">\r\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\r\n <div class=\"flex justify-content-end mb-1\" >\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoMarcadorDinamico()\" icon=\"pi pi-plus\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\" *ngIf=\"!nuevoReporteMarcadorDinamico\"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadorDinamico\" [scrollable]=\"true\"\r\n responsiveLayout=\"scroll\" dataKey=\"llaveTabla\" selectionMode=\"single\"\r\n [rows]=\"10\" [totalRecords]=\"listaMarcadorDinamico.length\"\r\n [paginator]=\"listaMarcadorDinamico.length > 10\" *ngIf=\"!nuevoReporteMarcadorDinamico\"\r\n (onRowSelect)=\"verMarcadorDinamico($event)\" (onRowUnselect)=\"verMarcadorDinamico($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'banda' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'etiqueta' | translate }}</th>\r\n <th>{{'formato' | translate }}</th>\r\n <th>{{'ancho' | translate }}</th>\r\n <th>{{'operacion' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-dinamico>\r\n <tr [pSelectableRow]=\"dinamico\">\r\n <td>{{dinamico.banda}}</td>\r\n <td>{{dinamico.banda ? dinamico.alto : ''}}</td>\r\n <td>{{dinamico.marcador}}</td>\r\n <td>{{dinamico.banda ? dinamico.descripcion : ''}}</td>\r\n <td>{{dinamico.banda ? dinamico.formato : ''}}</td>\r\n <td>{{['detalle'].includes(dinamico.banda) ? dinamico.ancho : ''}}</td>\r\n <td>{{dinamico.banda ? dinamico.operacion : ''}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <div *ngIf=\"nuevoReporteMarcadorDinamico\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"flex justify-content-between align-items-center mb-2\"> \r\n <p class=\"font-semibold mt-3\">{{'indique' | translate}} {{'en' | translate}} {{'que' | translate}} {{'columna' | translate}} {{'desea' | translate}} {{'que' | translate}} {{'aparezca' | translate}} {{'la' | translate}} {{'informacion' | translate}}. {{'la' | translate}} {{'primera' | translate}} {{'columna' | translate}} {{'es' | translate}} {{'la' | translate}} 1.</p>\r\n <button pButton pRipple (click)=\"nuevoReporteMarcadorDinamico = false\" label= \"{{'listado' | translate}} {{bandaSeleccionada.value}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \" *ngIf=\"nuevoReporteMarcadorDinamico\"></button>\r\n </div>\r\n <form [formGroup]=\"formReporteDinamico\" class=\"p-fluid grid\">\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCampoJasperDinamico\"\r\n [autoDisplayFirst]=\"false\" formControlName=\"tipoCampo\"\r\n optionLabel=\"value\" optionValue=\"key\"></p-dropdown>\r\n <label>{{'tipocampo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoDatoSintaxis\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"tipoDato\" optionLabel=\"value\"\r\n optionValue=\"key\"></p-dropdown>\r\n <label>{{'tipodato' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText formControlName=\"alto\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\r\n <label>{{'orden' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"marcador\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\r\n *ngIf=\"!reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\"></p-dropdown>\r\n <input pInputText type=\"text\" formControlName=\"marcador\" size=\"25\"\r\n *ngIf=\"reporteMarcadorDinamico.llave && reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <label>{{'columna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-12\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea formControlName=\"filtro\"></textarea>\r\n <label>{{'sintaxis' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\">\r\n <p-fieldset class=\"fieldsintitulo\" class=\"fieldsintitulo\">\r\n <div class=\"p-fluid grid\">\r\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\">\r\n <label class=\"font-semibold text-gray-900 text-base ml-1\">{{'resultado' | translate}}</label>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo =='C'\"></div>\r\n <div class=\"field col-12 md:col-6 lg:col-6 mb-0\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <label class=\"font-semibold text-gray-900 text-base ml-1\" >{{'label' | translate}}</label>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"formato\" />\r\n <label>{{'formato' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"descripcion\" />\r\n <label>{{'titulo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"ancho\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\r\n <label>{{'ancho' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' == reporteMarcadorDinamico.banda \"></div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"anchoJasperLabel\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'ancho' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"resultadoX\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'x' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"titulox\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'x' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"'detalle' != reporteMarcadorDinamico.banda\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"resultadoY\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'y' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C' && 'detalle' != reporteMarcadorDinamico.banda \">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" formControlName=\"tituloy\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"/>\r\n <label>{{'y' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" \r\n formControlName=\"tipoReporte\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'alineacion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaAlineacion\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'alineacion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-6 lg:col-6\" *ngIf=\"reporteMarcadorDinamico.tipoDato == 'N' && reporteMarcadorDinamico.tipoCampo !='C'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaOperaciones\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n formControlName=\"operacion\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'operacion' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </div>\r\n </form>\r\n \r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{reporteMarcadorDinamico.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{reporteMarcadorDinamico.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaDinamico()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"reporteMarcadorDinamico.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarColumnaDinamico($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n \r\n </p-tabView>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'reporte' | translate }} {{'texto' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.archivoTexto\" size=\"50\"\r\n maxlength=\"200\">\r\n <label>{{'nombrearchivo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaSeparadores\" [(ngModel)]=\"reporteFuente.separador\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(reporteFuente.separador) && clickGuardarReporteTexto\"\r\n [autoDisplayFirst]=\"false\" optionLabel=\"nombre\" optionValue=\"codigo\" ></p-dropdown>\r\n <label>{{'separador' | translate }}*</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoTexto\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizarSeparador()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex justify-content-between lign-items-center mb-3\">\r\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorTexto()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorTexto\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorTexto\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorTexto = false; clickGuardarMarcadorTexto = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaMarcadoresTexto\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"listaMarcadoresTexto.length\"\r\n [paginator]=\"listaMarcadoresTexto.length > 10\" *ngIf=\"!verNuevoMarcadorTexto\"\r\n (onRowSelect)=\"verMarcadorTexto($event)\" (onRowUnselect)=\"verMarcadorTexto($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'formato' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marctexto>\r\n <tr [pSelectableRow]=\"marctexto\">\r\n <td>{{marctexto.tipoGrafico | reporteFuentePipe : 'listaTipoMarcadoresTexto'}}</td>\r\n <td>{{marctexto.nombreColumna}}</td>\r\n <td>{{marctexto.formato}}</td>\r\n <td>{{marctexto.alto}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorTexto\"> \r\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoMarcadorTexto\" [autoDisplayFirst]=\"false\"\r\n [(ngModel)]=\"marcadorTexto.tipoGrafico\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.tipoGrafico) && clickGuardarMarcadorTexto\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\"\r\n [(ngModel)]=\"marcadorTexto.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.reporteColumna) && clickGuardarMarcadorTexto\"></p-dropdown>\r\n <label>{{'columna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.formato\" maxlength=\"50\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.formato) && clickGuardarMarcadorTexto\">\r\n <label>{{marcadorTexto.tipoGrafico == 'D' ? ('formato' | translate)+'*' : ('valor' | translate)+'*' }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico == 'D'\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.ancho\" maxlength=\"22\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.ancho) && clickGuardarMarcadorTexto\">\r\n <label>{{'ancho' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorTexto.tipoGrafico\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorTexto.alto\" maxlength=\"22\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorTexto.alto) && clickGuardarMarcadorTexto\">\r\n <label>{{'orden' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorTexto.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{marcadorTexto.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorTexto()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"marcadorTexto.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadoTexto($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'tabla' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.nombreTabla\" maxlength=\"4000\">\r\n <label>{{'nombretabla' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n <div class=\"field col-12 md:col-8\">\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-pickList [source]=\"listaTabla\" [target]=\"listaNoTabla\" sourceHeader=\"Asociado\" sourceFilterPlaceholder=\"Asociado\"\r\n targetHeader=\"Desasociado\" [dragdrop]=\"true\" [responsive]=\"true\" targetFilterPlaceholder=\"Desasociado\"\r\n filterBy=\"nombre\" *ngIf=\"isFuente()\" (onSourceReorder)=\"reorderTabla($event)\"\r\n (onMoveAllToTarget)=\"moverADesasociadoTabla($event)\" (onMoveAllToSource)=\"moverAAsociadoTabla($event)\"\r\n (onMoveToTarget)=\"moverADesasociadoTabla($event)\" (onMoveToSource)=\"moverAAsociadoTabla($event)\">\r\n <ng-template let-tabla pTemplate=\"item\">\r\n <div>\r\n <label>{{tabla.nombre}}</label>\r\n </div>\r\n </ng-template>\r\n </p-pickList>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'archivoxml' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.tagEncabezado\"></textarea>\r\n <label>{{'tagencabezado' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.tagCierreEncabezado\"></textarea>\r\n <label>{{'tagcierreencabezado' | translate }}</label>\r\n </p-floatLabel> \r\n </div>\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.estructuraRegistro\"></textarea>\r\n <label>{{'tagregistro' | translate }}</label>\r\n </p-floatLabel> \r\n </div>\r\n\r\n <div class=\"field col-12 md:col-6\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.cifradoXml\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"flex justify-content-between align-items-center mb-3\">\r\n <h1 class=\"text-xl\">{{'marcadores' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorXML()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorXML\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorXML\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorXML = false; clickGuardarMarcadorXML = false;\" label= \"{{'listado' | translate}} {{'marcadores' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaXML\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"listaXML.length\"\r\n [paginator]=\"listaXML.length > 10\" *ngIf=\"!verNuevoMarcadorXML\"\r\n (onRowSelect)=\"verMarcadorXML($event)\" (onRowUnselect)=\"verMarcadorXML($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'descripcion' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'marcador' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marctexto>\r\n <tr [pSelectableRow]=\"marctexto\">\r\n <td>{{marctexto.descripcion}}</td>\r\n <td>{{marctexto.tipo | reporteFuentePipe : 'listaTipoDatoMarcadores'}}</td>\r\n <td>{{marctexto.nombreColumna}}</td>\r\n <td>{{marctexto.marcador}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div class=\"card mt-3\" *ngIf=\"verNuevoMarcadorXML\"> \r\n <h5 class=\"mt-3\"><i class=\"glyphicons glyphicons-notes\"></i>{{'detalle' | translate}}</h5>\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.descripcion\" maxlength=\"100\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.descripcion) && clickGuardarMarcadorXML\">\r\n <label>{{'descripcion' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaTipoMarcadorXML\" [autoDisplayFirst]=\"false\" \r\n [(ngModel)]=\"marcadorXML.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorXML.tipo) && clickGuardarMarcadorXML\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MA','MR'].includes(marcadorXML.tipo)\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" >\r\n <label>{{'marcador' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.marcador\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\r\n <label>{{'tabla' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"marcadorXML.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\" ></p-dropdown>\r\n <label>{{'columna' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MA'\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"marcadorXML.formato\" >\r\n <label>{{'formato' | translate}}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'MR'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.textoRegistro\" ></textarea>\r\n <label>{{'texto' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaFuentes\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"marcadorXML.fuente\" optionLabel=\"descripcion\" optionValue=\"llave\"></p-dropdown>\r\n <label>{{'fuente' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"['MR','TB'].includes(marcadorXML.tipo)\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.filtro\"></textarea>\r\n <label>{{'filtro' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"marcadorXML.tipo == 'TB'\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-150 max-h-200\" pInputTextarea [(ngModel)]=\"marcadorXML.estructuraTablaXML\"></textarea>\r\n <label>{{'estructuratabla' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorXML.llave ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{marcadorXML.llave ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorXML()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"marcadorXML.llave != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadorXML($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"verNuevoMarcadorXML && marcadorXML.llave != null && (marcadorXML.tipo == 'MR' || marcadorXML.tipo == 'TB')\">\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoCampoTablaXML()\" icon=\"pi pi-plus\" [disabled]=\"habilitaCampo\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"listaCamposMarcadorXML\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"listaCamposMarcadorXML.length\"\r\n [paginator]=\"listaCamposMarcadorXML.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 30%;\">{{'campo' | translate }}</th>\r\n <th style=\"width: 30%;\">{{'marcador' | translate }}</th>\r\n <th style=\"width: 30%;\">{{'formato' | translate }}</th>\r\n <th style=\"width: 10%\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verReporteMarcadorDetalleXML\">\r\n <td style=\"width: 30%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.campoFuente\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.campoFuente) && clickGuardarMarcadorCampoXML\">\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.marcador\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campoMarcadorInsertarXML.marcador) && clickGuardarMarcadorCampoXML\">\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campoMarcadorInsertarXML.formato\" style=\"width: -webkit-fill-available\">\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\" >\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campoMarcadorInsertarXML)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verReporteMarcadorDetalleXML = false; habilitaCampo = false;\" icon=\"pi pi-times\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"campo\">\r\n <td style=\"width: 30%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.campoFuente\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.campoFuente) && clickGuardarMarcadorCampoXML\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.campoFuente}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.marcador\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(campo.marcador) && clickGuardarMarcadorCampoXML\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.marcador}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 30%;\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.formato\" style=\"width: -webkit-fill-available\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{campo.formato}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n \r\n \r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarCampoMarcadorXML(campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cargarListaCampoMarcadorXMLAsync()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\r\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" [disabled]=\"habilitaCampo\" (click)=\"eliminarCampoMarcadorXML($event,campo)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'columnario' | translate }}\">\r\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\" >\r\n <p-accordionTab [selected]=\"true\" >\r\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\r\n {{'columnasbasicas'|translate}}\r\n </ng-template>\r\n <div class=\"flex justify-content-end align-items-center mt-2 mb-2\">\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoColumnaBasica()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoReporteColumnario\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoReporteColumnario\">\r\n <button pButton pRipple (click)=\"verNuevoReporteColumnario = false; clickGuardarReporteColumnario = false;\" label= \"{{'listado' | translate}} {{'columnasbasicas' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"listaReporteColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"listaReporteColumnario.length\"\r\n [paginator]=\"listaReporteColumnario.length > 10\" *ngIf=\"!verNuevoReporteColumnario\"\r\n (onRowSelect)=\"verReporteColumnario($event)\" (onRowUnselect)=\"verReporteColumnario($event)\">\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'nombre' | translate }}</th>\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n <th>{{'operacion' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-bean>\r\n <tr [pSelectableRow]=\"bean\">\r\n <td>{{bean.nombre}}</td>\r\n <td>{{bean.nombreColumna}}</td>\r\n <td>{{bean.tipo | reporteColumnarioPipe: 'listaTipoColumna'}}</td>\r\n <td>{{bean.orden}}</td>\r\n <td>{{bean.operacion | reporteColumnarioPipe: 'listaOperacion'}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div *ngIf=\"verNuevoReporteColumnario\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.nombre\" maxlength=\"100\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.nombre) && clickGuardarReporteColumnario\">\r\n <label>{{'nombre' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaTipoColumnas\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.tipo) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'tipocolumna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaColumnas\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.reporteColumna\" optionLabel=\"nombre\" optionValue=\"llaveTabla\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.reporteColumna) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'columna' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"columnaBasica.tipo == 'D'\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOperacionesColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.operacion\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacion) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'operacion' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.operacionHorizontal\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionHorizontal) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'operacionhorizontal' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- fila Operacion Vertical -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.columnaOperacionVertical\" maxlength=\"5\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.columnaOperacionVertical) && clickGuardarReporteColumnario\">\r\n <label>{{'columnaoperacion' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Operacion Verticial -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoColumna()\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOperacionesExcelColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.operacionVertical\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.operacionVertical) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'operacionvertical' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Orden -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrden()\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.orden\" maxlength=\"5\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.orden) && clickGuardarReporteColumnario\">\r\n <label>{{'orden' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Ordenamiento Filas -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isTipoLabel() || isTipoFila()\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" [showClear]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\" \r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.orderBy) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.orderBy) && clickGuardarReporteColumnario\"></p-dropdown>\r\n <label>{{'ordenamiento' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n <!-- Ordenamiento Datos de la consulta -->\r\n <div class=\"field col-12 md:col-4\" *ngIf=\"isMostrarOrdenConsulta()\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaBasica.ordenConsulta\" maxlength=\"5\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaBasica.ordenConsulta) && clickGuardarReporteColumnario\"\r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" >\r\n <label>{{'ordenconsulta' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaBasica.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{columnaBasica.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaBasica()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"columnaBasica.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarColumnaBasica($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </p-accordionTab>\r\n </p-accordion>\r\n <p-accordion (onOpen)=\"cambiarTabColumnario($event)\">\r\n <p-accordionTab >\r\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\r\n {{'datosadicionales'|translate}}\r\n </ng-template>\r\n <p-fieldset class=\"fieldsintitulo\" >\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n \r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <app-input-helper-seleccion-plantilla [readonly]=\"false\" [showDialog]=\"false\"\r\n [label]=\"reporteFuente.archivoExcelColumnario ? reporteFuente.archivoExcelColumnario: ''\"\r\n [extensiones]=\"'xls;xlsx;xlsm'\" [mostraroblicargo]=\"true\" [labelrar]=\"'plantilla' | translate\"\r\n (onSelected)=\"obtenerArchivoColumnario($event)\"></app-input-helper-seleccion-plantilla>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.hojaExcel\" size=\"25\" maxlength=\"20\">\r\n <label>{{'nombre' | translate }} {{'de' | translate }} {{'la' | translate }} {{'hoja' |\r\n translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"reporteFuente.filaInicioColumnario\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\" />\r\n <label>{{'filainiciocolumnario' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoCifrado\" [autoDisplayFirst]=\"false\" [showClear]=\"true\" appendTo=\"body\"\r\n [(ngModel)]=\"reporteFuente.cifradoColumnario\" optionLabel=\"nombre\"\r\n optionValue=\"llaveTabla\"></p-dropdown>\r\n <label>{{'tipocifrado' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\">\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"reporteFuente.sintaxisColumnario\"></textarea>\r\n <label>{{'sintaxiscolumnario' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\"\r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"actualizar()\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n <div class=\"flex justify-content-between align-items-center mb-3 mt-3\">\r\n <h1 class=\"text-xl\">{{'columnaadicional' | translate}}</h1>\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevaColumnaAdicional()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoColumnaAdicional\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoColumnaAdicional\">\r\n <button pButton pRipple (click)=\"verNuevoColumnaAdicional = false; clickGuardarColumnaAdicional = false;\" label= \"{{'listado' | translate}} {{'columnaadicional' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"columnasAdicionales\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"columnasAdicionales.length\"\r\n [paginator]=\"columnasAdicionales.length > 10\" *ngIf=\"!verNuevoColumnaAdicional\"\r\n (onRowSelect)=\"verDetalleAdicional($event)\" (onRowUnselect)=\"verDetalleAdicional($event)\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'nombre' | translate }}</th>\r\n <th>{{'orden' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-columnaadicional>\r\n <tr [pSelectableRow]=\"columnaadicional\">\r\n <td>{{columnaadicional.nombre}}</td>\r\n <td>{{columnaadicional.orden}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <p-fieldset class=\"fieldsintitulo\" *ngIf=\"verNuevoColumnaAdicional\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-3\" >\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"columnaAdicional.nombre\" maxlength=\"100\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.nombre) && clickGuardarColumnaAdicional\">\r\n <label>{{'alias' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"columnaAdicional.orden\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orden) && clickGuardarColumnaAdicional\" />\r\n <label>{{'orden' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-3\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaOrdenamiento\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaAdicional.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.orderBy) && clickGuardarColumnaAdicional\"></p-dropdown>\r\n <label>{{'ordenamiento' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-3\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"columnaAdicional.ordenConsulta\" maxlength=\"5\" \r\n oninput=\"this.value = this.value.replace(/[^0-9]/g, '').slice(0, 5);\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.ordenConsulta) && clickGuardarColumnaAdicional\" />\r\n <label>{{'ordenconsulta' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-12\" >\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"columnaAdicional.sintaxis\" maxlength=\"4000\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(columnaAdicional.sintaxis) && clickGuardarColumnaAdicional\"></textarea>\r\n <label>{{'sintaxis' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{columnaAdicional.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{columnaAdicional.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarColumnaAdicional()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"columnaAdicional.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarColumnaAdicional($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </p-fieldset>\r\n </p-accordionTab>\r\n <p-accordionTab >\r\n <ng-template pTemplate=\"header\"><i class=\"glyphicons glyphicons-notes\"></i>\r\n {{'marcadores'|translate}}\r\n </ng-template>\r\n <div class=\"flex justify-content-end align-items-center mb-3\">\r\n <button pButton pRipple class=\"p-button-secondary font-semibold\" icon=\"pi pi-plus\"\r\n (click)=\"nuevoMarcadorColumnario()\" label=\"{{'link_nuevo' | translate}}\" *ngIf=\"!verNuevoMarcadorColumnario\">\r\n </button>\r\n <div class=\"flex justify-content-end mb-1\" *ngIf=\"verNuevoMarcadorColumnario\">\r\n <button pButton pRipple (click)=\"verNuevoMarcadorColumnario = false; clickGuardarMarcadorColumnario = false;\" label= \"{{'listado' | translate}} {{'marcador' | translate}}\" \r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold flex-shrink-0 \"></button>\r\n </div>\r\n </div>\r\n <p-table [value]=\"marcadoresColumnario\" [scrollable]=\"true\" responsiveLayout=\"scroll\"\r\n dataKey=\"llaveTabla\" selectionMode=\"single\" \r\n [rows]=\"10\" [totalRecords]=\"marcadoresColumnario.length\"\r\n [paginator]=\"marcadoresColumnario.length > 10\" *ngIf=\"!verNuevoMarcadorColumnario\"\r\n (onRowSelect)=\"verDetalleMarcadorColumnario($event)\" (onRowUnselect)=\"verDetalleMarcadorColumnario($event)\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'nombre' | translate }}</th>\r\n <th>{{'tipomarcador' | translate }}</th>\r\n </tr>\r\n <th>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-marcador>\r\n <tr [pSelectableRow]=\"marcador\">\r\n <td>{{marcador.marcador}}</td>\r\n <td>{{marcador.tipo | reporteColumnarioPipe: 'listaTipoMarcador'}}</td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div *ngIf=\"verNuevoMarcadorColumnario\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\" >\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"marcadorColumnario.descripcion\" maxlength=\"4000\" \r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.descripcion) && clickGuardarMarcadorColumnario\" />\r\n <label>{{'descripcion' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\" >\r\n <p-floatLabel>\r\n <input pInputText [(ngModel)]=\"marcadorColumnario.marcador\" maxlength=\"50\" \r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.marcador) && clickGuardarMarcadorColumnario\" />\r\n <label>{{'marcador' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel> \r\n <p-dropdown [options]=\"listaTipoMarcadorColumnario\" [autoDisplayFirst]=\"false\" appendTo=\"body\"\r\n [(ngModel)]=\"marcadorColumnario.tipo\" optionLabel=\"nombre\" optionValue=\"codigo\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.tipo) && clickGuardarMarcadorColumnario\"></p-dropdown>\r\n <label>{{'tipo' | translate }} *</label>\r\n </p-floatLabel>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-12\" >\r\n <p-floatLabel>\r\n <textarea class=\"w-full min-h-50 max-h-100\" pInputTextarea [(ngModel)]=\"marcadorColumnario.textoRegistro\" maxlength=\"4000\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(marcadorColumnario.textoRegistro) && clickGuardarMarcadorColumnario\"></textarea>\r\n <label>{{'valor' | translate}} *</label>\r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" >\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons {{marcadorColumnario.llaveTabla ? 'glyphicons-refresh' : 'glyphicons-floppy-save'}}\"\r\n label=\"{{marcadorColumnario.llaveTabla ? ('link_actualizar' | translate) : ('link_guardar' | translate)}}\" (click)=\"guardarMarcadorColumnario()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined\" icon=\"glyphicons glyphicons-bin\"\r\n *ngIf=\"marcadorColumnario.llaveTabla != null\" label=\"{{'link_eliminar' | translate}}\"\r\n (click)=\"eliminarMarcadorColumnario($event)\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </p-accordionTab>\r\n </p-accordion>\r\n </p-tabPanel>\r\n <p-tabPanel header=\"{{'grafica' | translate }}\">\r\n <div class=\"card col-md-12\">\r\n <div class=\"Detallereporte mt-2\">\r\n <div class=\"p-fluid p-formgrid grid\">\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.codigo\" size=\"25\"\r\n maxlength=\"100\">\r\n <label>{{'codigo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <input pInputText type=\"text\" [(ngModel)]=\"reporteFuente.tituloGrafico\" size=\"25\"\r\n maxlength=\"100\">\r\n <label>{{'titulo' | translate }}</label>\r\n </p-floatLabel>\r\n </div>\r\n\r\n <div class=\"field col-12 md:col-4\">\r\n <p-floatLabel>\r\n <p-dropdown [options]=\"listaTipoGrafico\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"reporteFuente.tipoGrafico\" optionLabel=\"nombre\"\r\n optionValue=\"codigo\"></p-dropdown>\r\n <label>{{'tipo' | translate }}</label> \r\n </p-floatLabel>\r\n </div>\r\n </div>\r\n\r\n <!--BOTONES-->\r\n <div class=\"flex justify-content-end mb-3\" *ngIf=\"isSql()\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" icon=\"glyphicons glyphicons-refresh\" \r\n label=\"{{'link_actualizar' | translate}}\" (click)=\"guardarGrafico()\">\r\n </button>\r\n <button pButton pRipple class=\"ml-2 p-button-outlined background-100\" icon=\"pi pi-eye\"\r\n label=\"{{'link_ver' | translate}}\" (click)=\"verGrafico()\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-table [value]=\"paginadorColumnas\" responsiveLayout=\"scroll\" [scrollable]=\"true\"\r\n [rows]=\"20\" [totalRecords]=\"paginadorColumnas.length\" [paginator]=\"paginadorColumnas.length > 20\" >\r\n <ng-template pTemplate=\"header\">\r\n\r\n <tr class=\"fondoTablaPincipal\">\r\n <th>{{'columna' | translate }}</th>\r\n <th>{{'sintaxis' | translate }}</th>\r\n <th>{{'tipo' | translate }}</th>\r\n <th>{{'accion' | translate }}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-bean>\r\n <tr [pSelectableRow]=\"bean\">\r\n <td>{{bean.nombre}}</td>\r\n <td>{{bean.sintaxis}}</td>\r\n <td>{{bean.tipoDato | reporteFuentePipe : 'listaTipoDato'}}</td>\r\n <td>\r\n <p-dropdown [options]=\"listaGraficoSencillo\" [autoDisplayFirst]=\"false\" [showClear]=\"true\"\r\n [(ngModel)]=\"bean.graficoFuente\" optionLabel=\"nombre\"\r\n optionValue=\"codigo\"></p-dropdown>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table> \r\n\r\n <div class=\"flex justify-content-between align-items-center mt-2 mb-2\">\r\n <h1 class=\"text-xl\">Colores</h1>\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevoColorCategoria()\" icon=\"pi pi-plus\"\r\n [disabled]=\"habilitaCampo\" class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <p-table [value]=\"paginadorColoresGrafica\" responsiveLayout=\"scroll\" styleClass=\"p-datatable-striped\"\r\n [rows]=\"10\" [totalRecords]=\"paginadorColoresGrafica.length\"\r\n [paginator]=\"paginadorColoresGrafica.length > 10\" \r\n [showCurrentPageReport]=\"true\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" \r\n editMode=\"row\" dataKey=\"llaveTabla\">\r\n <ng-template pTemplate=\"header\">\r\n <tr class=\"fondoTablaPincipal\">\r\n <th style=\"width: 45%\">{{'categoria' | translate}}</th>\r\n <th style=\"width: 45%\">{{'color' | translate}}</th>\r\n <th style=\"width: 10%\"> </th>\r\n </tr>\r\n <tr class=\"TablaNuevoRegistro\" *ngIf=\"verColorCategoriaDetalle\">\r\n <td style=\"width: 45%\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"colorCategoria.titulo\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(colorCategoria.titulo) && clickGuardarColorCategoria\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(colorCategoria.titulo) && clickGuardarColorCategoria\">\r\n </td>\r\n <td style=\"width: 45%\">\r\n <div style=\"width: 100%\">\r\n <p-colorPicker [(ngModel)]=\"colorCategoria.banda\" appendTo=\"body\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(colorCategoria.banda) && clickGuardarColorCategoria\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(colorCategoria.banda) && clickGuardarColorCategoria\" />\r\n </div>\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-check\" (click)=\"agregarColorCategoria(colorCategoria)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"verColorCategoriaDetalle = false\" icon=\"pi pi-times\" (click)=\"cancelarColorCategoria()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-color let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"color\" style=\"width: 100%\">\r\n <td style=\"width: 45%\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"color.titulo\" style=\"width: -webkit-fill-available\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(color.titulo) && clickGuardarColorCategoria\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(color.titulo) && clickGuardarColorCategoria\">\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n {{color.titulo}}\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 45%\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <div style=\"width: 100%\">\r\n <p-colorPicker [(ngModel)]=\"color.banda\" appendTo=\"body\"\r\n [class.ng-dirty]=\"!utilsService.validarCampoObligatorio(color.banda) && clickGuardarColorCategoria\"\r\n [class.ng-invalid]=\"!utilsService.validarCampoObligatorio(color.banda) && clickGuardarColorCategoria\"/>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <p-colorPicker [(ngModel)]=\"color.banda\" [disabled]=\"true\" />\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n <td style=\"width: 10%\">\r\n <div class=\"flex justify-content-end\">\r\n <!-- CHECK GUARDAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow\r\n icon=\"pi pi-check\" (click)=\"agregarColorCategoria(color)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-success mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- CANCELAR -->\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow\r\n icon=\"pi pi-times\" (click)=\"cancelarEdicionColor()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-danger mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- EDITAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow\r\n icon=\"glyphicons glyphicons-pencil\" [disabled]=\"habilitaCampo\" (click)=\"iniciarEdicion()\"\r\n class=\"p-element p-ripple p-button-rounded p-button-secondary mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n <!-- ELIMINAR -->\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" (click)=\"eliminarColorCategoria($event, color)\" [disabled]=\"habilitaCampo\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr>\r\n <td colspan=\"100\" class=\"p-3 font-medium emptymessage\">{{'mensajetablavacia' | translate}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div class=\"flex justify-content-between card mt-3\" *ngIf=\"grafica\">\r\n <h1 class=\"text-xl\">{{'grafica' | translate}}</h1>\r\n <div style=\"width: 35%\"></div>\r\n <div style=\"width: 30%\">\r\n <p-chart [type]=\"tipoGrafica\" [data]=\"grafica.datosGrafica.data\" [options]=\"grafica.datosGrafica.options\"></p-chart>\r\n </div>\r\n <div style=\"width: 35%\"></div>\r\n </div>\r\n </p-tabPanel>\r\n</p-tabView>", styles: [":host ::ng-deep .p-picklist-buttons.p-picklist-source-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist-buttons.p-picklist-target-controls.ng-star-inserted{display:none}:host ::ng-deep .p-picklist.p-component{margin:0}:host ::ng-deep .p-picklist-item span{float:left!important}:host ::ng-deep .fieldsintitulo .p-fieldset-legend{display:none!important}:host ::ng-deep .p-picklist-list-wrapper.p-picklist-source-wrapper ul{box-shadow:inset 1px 8px 10px -10px var(--color-200)}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-200) no-repeat}:host ::ng-deep .p-picklist .p-picklist-target{background:var(--color-50) no-repeat}:host ::ng-deep .p-picklist .p-picklist-header{display:none}:host ::ng-deep .p-picklist .p-picklist-filter-container span{color:var(--color-100)}:host ::ng-deep .p-picklist .p-picklist-filter-container{border-radius:10px 10px 0 0;padding:3%;border:1px solid var(--color-100);border-bottom:none;box-shadow:0 4px 7px var(--color-100);position:relative}:host ::ng-deep .p-picklist .p-picklist-list{border:1px solid var(--color-100);height:400px}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item{padding:2%;color:#000000de;background:solid 2px var(--color-50) no-repeat;margin:16px 16px -7px;border-radius:5px;border:solid 1px var(--color-100);transition:.2s;background:#fff}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h6,:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item h7{color:var(--color-500);margin-bottom:2px;font-size:1rem;margin-top:0}:host ::ng-deep .p-picklist .p-picklist-list .p-picklist-item span{float:left;margin-right:4px;min-height:30px;color:var(--color-400)}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover{background:var(--color-400);color:#fff;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h6,:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover h7{color:#fff!important;transition:.2s}:host ::ng-deep .p-picklist .p-picklist-list:not(.cdk-drop-list-dragging) .p-picklist-item:not(.p-highlight):hover span{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight{background:var(--color-500);color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h6,:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight h7{color:#fff!important}:host ::ng-deep .p-picklist li.p-ripple.p-element.cdk-drag.ng-star-inserted.p-picklist-item.p-highlight span{color:#fff!important}:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.5%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:20px}.p-picklist-buttons{padding:2rem}.p-picklist-buttons .p-button:disabled{background-color:var(--color3)!important;color:#fff!important}.p-picklist-buttons .p-button{margin-bottom:.5rem;border-radius:100%}.p-picklist-buttons .p-button.p-button-icon-only{padding:.4rem .5rem;width:40px;height:40px;max-width:initial;max-height:initial}.p-picklist-buttons .p-button.p-button-icon-only span{font-size:18px}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only{border-radius:100%;width:3rem!important;background:var(--color-500)}:host ::ng-deep .p-picklist-buttons .p-button.p-button-icon-only span{font-size:1.2rem;background:var(--color--300);color:#fff}:host ::ng-deep .p-picklist-buttons .p-button:disabled{background:var(--color-300)!important}@media (max-width: 1440px){:host ::ng-deep span.p-input-icon-left{width:calc(50% - .25rem - 20px);border-bottom:none;border:1px solid var(--color-100);padding:1.2%;border-radius:10px 10px 0 0;margin-left:-8px}:host ::ng-deep span.p-input-icon-left i{margin-left:15px}}:host ::ng-deep .p-button{width:auto}\n"] }]
1576
- }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.ToastService }, { type: i3.GeneralService }, { type: i4.GeneralPipe }, { type: i5.AuthService }, { type: i6.ReporteFuentePipe }, { type: i7.ConfirmationService }, { type: i8.CargarArchivosService }, { type: i9.EncriptadoBasicoService }, { type: i10.UtilsService }, { type: i11.TranslateService }, { type: i12.FuentePipe }, { type: i13.ReporteColumnarioPipe }, { type: i14.EjecucionReporteService }, { type: i15.DashboardService }, { type: i16.DashboardPipe }], propDecorators: { llaveReporte: [{
1577
- type: Input
1578
- }], aplicacion: [{
1579
- type: Input
1580
- }], listaFuentes: [{
1581
- type: Input
1582
- }] } });
1583
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC93ZWJjb21tb24vcGFnZXMvZWplY3VjaW9uLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC93ZWJjb21tb24vcGFnZXMvZWplY3VjaW9uLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFlLFdBQVcsRUFBYSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHbkgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRzFFLE9BQU8sRUFBdUIsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxlQUFlLEVBQW9CLE1BQU0scUJBQXFCLENBQUM7QUFFeEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDbkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDckYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDekYsT0FBTyxFQUFFLGtCQUFr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QUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLFFBQVEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwRixLQUFLLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7WUFDbEQsTUFBTSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO1lBQ3BELGFBQWEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQztZQUNsRSxjQUFjLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUM7WUFDcEUsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDO1lBQ3RELEtBQUssRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztZQUNsRCxJQUFJLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7WUFDaEQsTUFBTSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO1lBQ3BELE1BQU0sRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztZQUNwRCxNQUFNLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7WUFDcEQsVUFBVSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDO1lBQzVELFFBQVEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFD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LDRxQ0FBRSxXQUFXLHNoQ0FBRSxtQkFBbUIsK1VBQUUsWUFBWSxtSUFBRSxZQUFZLDZPQUFFLGNBQWMsMi9CQUFFLGNBQWMsNlBBQUUsZUFBZSxpbEJBQUUsZUFBZSx5SEFBRSxtQkFBbUIsc0tBQUUsZ0JBQWdCLHFHQUFFLGlCQUFpQiwwdkJBQWtCLFdBQVcsd09BQUUsaUJBQWlCOzsyRkFNeFgsMkJBQTJCO2tCQVJ2QyxTQUFTOytCQUNFLHNCQUFzQixXQUNyQixDQUFDLGVBQWUsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLHNDQUFzQyxFQUFFLHFCQUFxQixFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxjQUN0WCxJQUFJLGFBQ0wsQ0FBQyxjQUFjLENBQUM7dWlCQXFJYixZQUFZO3NCQUEzQixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1csWUFBWTtzQkFBNUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgR2VuZXJhbFBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9nZW5lcmFsLnBpcGUnO1xyXG5pbXBvcnQgeyBHZW5lcmFsU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNpb3MvZ2VuZXJhbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR2VuZXJhbE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvR2VuZXJhbE1vZGVsJztcclxuaW1wb3J0IHsgQ2FyZ2FyQXJjaGl2b3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2lvcy9jYXJnYXItYXJjaGl2b3Muc2VydmljZSc7XHJcbmltcG9ydCB7IEVuY3JpcHRhZG9CYXNpY29TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2lvcy9lbmNyaXB0YWRvLWJhc2ljby5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uU2VydmljZSwgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgUmVwb3J0ZUZ1ZW50ZVBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9yZXBvcnRlLWZ1ZW50ZS5waXBlJztcclxuaW1wb3J0IHsgRWplY3VjaW9uUmVwb3J0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lamVjdWNpb25yZXBvcnRlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgRnVlbnRlUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGVzL2Z1ZW50ZS5waXBlJztcclxuaW1wb3J0IHsgUmVwb3J0ZUNvbHVtbmFyaW9QaXBlIH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvcmVwb3J0ZS1jb2x1bW5hcmlvLnBpcGUnO1xyXG5pbXBvcnQgeyBSZXBvcnRlQ29sdW1uYU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZUNvbHVtbmEnO1xyXG5pbXBvcnQgeyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVNYXJjYWRvcic7XHJcbmltcG9ydCB7IFJlcG9ydGVUYWJsYU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZVRhYmxhJztcclxuaW1wb3J0IHsgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVDb2x1bW5hcmlvJztcclxuaW1wb3J0IHsgUmVwb3J0ZUZ1ZW50ZU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZUZ1ZW50ZU1vZGVsJztcclxuaW1wb3J0IHsgUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvck1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvcic7XHJcbmltcG9ydCB7IFJlcG9ydGVCYW5kYU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZUJhbmRhJztcclxuaW1wb3J0IHsgUmVwb3J0ZVNvcG9ydGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVTb3BvcnRlJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNpb3MvdG9hc3Quc2VydmljZSc7XHJcbmltcG9ydCB7IFV0aWxzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc2VydmljaW9zL3V0aWxzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc2VydmljaW9zL2F1dGguc2VydmljZSc7XHJcbmltcG9ydCB7IFRhYmxlTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XHJcbmltcG9ydCB7IFRhYlZpZXdNb2R1bGUgfSBmcm9tICdwcmltZW5nL3RhYnZpZXcnO1xyXG5pbXBvcnQgeyBJbnB1dEhlbHBlclNlbGVjY2lvblBsYW50aWxsYUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC9jb21wb25lbnRlcy9pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYS9pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZHJvcGRvd24nO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XHJcbmltcG9ydCB7IFBpY2tMaXN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9waWNrbGlzdCc7XHJcbmltcG9ydCB7IEZpZWxkc2V0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9maWVsZHNldCc7XHJcbmltcG9ydCB7IEFjY29yZGlvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYWNjb3JkaW9uJztcclxuaW1wb3J0IHsgSW5wdXRUZXh0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHRleHQnO1xyXG5pbXBvcnQgeyBJbnB1dFRleHRhcmVhTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHRleHRhcmVhJztcclxuaW1wb3J0IHsgRmxvYXRMYWJlbE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZmxvYXRsYWJlbCc7XHJcbmltcG9ydCB7IElucHV0TnVtYmVyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dG51bWJlcic7XHJcbmltcG9ydCB7IERhc2hib2FyZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9kYXNoYm9hcmQuc2VydmljZSc7XHJcbmltcG9ydCB7IENoYXJ0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9jaGFydCc7XHJcbmltcG9ydCB7IERhc2hib2FyZFBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9kYXNoYm9hcmQucGlwZSc7XHJcbmltcG9ydCB7IENvbG9yUGlja2VyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9jb2xvcnBpY2tlcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2RldGFsbGUtdGlwby1yZXBvcnRlJyxcclxuICAgIGltcG9ydHM6IFtUcmFuc2xhdGVNb2R1bGUsIFRhYmxlTW9kdWxlLCBUYWJWaWV3TW9kdWxlLCBJbnB1dEhlbHBlclNlbGVjY2lvblBsYW50aWxsYUNvbXBvbmVudCwgUmVwb3J0ZUNvbHVtbmFyaW9QaXBlLCBSZXBvcnRlRnVlbnRlUGlwZSwgRHJvcGRvd25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBDb21tb25Nb2R1bGUsIEJ1dHRvbk1vZHVsZSwgUGlja0xpc3RNb2R1bGUsIEZpZWxkc2V0TW9kdWxlLCBBY2NvcmRpb25Nb2R1bGUsIElucHV0VGV4dE1vZHVsZSwgSW5wdXRUZXh0YXJlYU1vZHVsZSwgRmxvYXRMYWJlbE1vZHVsZSwgSW5wdXROdW1iZXJNb2R1bGUsIEZpZWxkc2V0TW9kdWxlLCBDaGFydE1vZHVsZSwgQ29sb3JQaWNrZXJNb2R1bGVdLCBcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBwcm92aWRlcnM6IFtNZXNzYWdlU2VydmljZV0sXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2RldGFsbGUtdGlwby1yZXBvcnRlLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIERldGFsbGVUaXBvUmVwb3J0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgcHVibGljIGxpc3RhVGlwb0NpZnJhZG86IGFueVtdID0gW107XHJcbiAgLy90YWIgZXhjZWxcclxuICBwdWJsaWMgbGlzdGFFeGNlbDogUmVwb3J0ZUNvbHVtbmFNb2RlbFtdID0gW107XHJcbiAgcHVibGljIGxpc3RhTm9FeGNlbDogUmVwb3J0ZUNvbHVtbmFNb2RlbFtdID0gW107XHJcbiAgcHVibGljIGxpc3RhTWFyY2Fkb3JFeGNlbDogUmVwb3J0ZU1hcmNhZG9yTW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyByZXBvcnRlTWFyY2Fkb3JFeGNlbDogUmVwb3J0ZU1hcmNhZG9yTW9kZWwgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWw7XHJcbiAgcHVibGljIGZvcm1NYXJjYWRvckV4Y2VsOiBGb3JtR3JvdXA7XHJcbiAgcHVibGljIHZlck51ZXZvTWFyY2Fkb3JFeGNlbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBlc01hcmNhZG9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGVzSW1hZ2VuRmlqYTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvL3RhYiBwbGFudGlsbGFzXHJcbiAgcHVibGljIGxpc3RhQ29sdW1uYXM6IGFueVtdID0gW107XHJcbiAgcHVibGljIGxpc3RhTWFyY2Fkb3JlczogUmVwb3J0ZU1hcmNhZG9yTW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyBsaXN0YVRpcG9NYXJjYWRvcjtcclxuICBwdWJsaWMgbGlzdGFUaXBvR3JhZmljb19KRkM7XHJcbiAgcHVibGljIGxpc3RhR3JhZmljbztcclxuICBwdWJsaWMgbGlzdGFHcmFmaWNvU2VuY2lsbG87XHJcbiAgcHVibGljIGxpc3RhQWxpbmVhY2lvbjtcclxuICBwdWJsaWMgbGlzdGFPcGVyYWNpb25lcztcclxuICBwdWJsaWMgcmVwb3J0ZU1hcmNhZG9yOiBSZXBvcnRlTWFyY2Fkb3JNb2RlbCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbDtcclxuICBwdWJsaWMgZm9ybU1hcmNhZG9yOiBGb3JtR3JvdXA7XHJcbiAgcHVibGljIG9yaWdlbk1hcmNhZG9yOiBzdHJpbmcgPSBudWxsO1xyXG4gIHB1YmxpYyB2ZXJOdWV2b01hcmNhZG9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGxpc3RhQ2FtcG9zTWFyY2Fkb3I6IFJlcG9ydGVUYWJsYU1vZGVsW10gPSBbXTtcclxuICBwdWJsaWMgY2FtcG9NYXJjYWRvckluc2VydGFyOiBSZXBvcnRlVGFibGFNb2RlbCA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbDtcclxuICBwdWJsaWMgbGlzdGFTb3BvcnRlczogUmVwb3J0ZVNvcG9ydGVNb2RlbFtdID0gW107XHJcbiAgcHVibGljIHNvcG9ydGVJbmdyZXNhcjogUmVwb3J0ZVNvcG9ydGVNb2RlbCA9IG5ldyBSZXBvcnRlU29wb3J0ZU1vZGVsO1xyXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvOiBib29sZWFuID0gZmFsc2VcclxuICBwdWJsaWMgY2xpY2tHdWFyZGFyTWFyY2Fkb3JFeGNlbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyB2ZXJSZXBvcnRlTWFyY2Fkb3JEZXRhbGxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHZlclNvcG9ydGVBcmNoaXZvRGV0YWxsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2bzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBoYWJpbGl0YUNhbXBvOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBibG9xdWVhckNhbXBvTWFyY2Fkb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgYmxvcXVlYXJTb3BvcnRlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICAvL3JlcG9ydGUgZGluYW1pY29cclxuICBwdWJsaWMgbGlzdGFUaXBvQmFuZGEgPSBbXHJcbiAgICB7a2V5OiAnYmFuZGExJywgdmFsdWU6ICdCYW5kYSAxJ30sXHJcbiAgICB7a2V5OiAnYmFuZGEyJywgdmFsdWU6ICdCYW5kYSAyJ30sXHJcbiAgICB7a2V5OiAnYmFuZGEzJywgdmFsdWU6ICdCYW5kYSAzJ30sXHJcbiAgICB7a2V5OiAnYmFuZGE0JywgdmFsdWU6ICdCYW5kYSA0J30sXHJcbiAgICB7a2V5OiAnYmFuZGE1JywgdmFsdWU6ICdCYW5kYSA1J30sXHJcbiAgICB7a2V5OiAnZGV0YWxsZScsIHZhbHVlOiAnRGV0YWxsZSd9LFxyXG4gICAge2tleTogJ3N1bW1hcnknLCB2YWx1ZTogJ1Jlc3VtZW4nfSxcclxuICBdXHJcbiAgcHVibGljIGV4aXN0ZUphc3BlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBiYW5kYVNlbGVjY2lvbmFkYSA9IHtrZXk6IG51bGwsIHZhbHVlOiBudWxsfTtcclxuICBwdWJsaWMgbnVldmFCYW5kYTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyB2ZXJUYWJCYW5kYTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBudWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHJlcG9ydGVNYXJjYWRvckRpbmFtaWNvOiBSZXBvcnRlTWFyY2Fkb3JNb2RlbCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbDtcclxuICBwdWJsaWMgcmVwb3J0ZUJhbmRhOiBSZXBvcnRlQmFuZGFNb2RlbCA9IG5ldyBSZXBvcnRlQmFuZGFNb2RlbDtcclxuICBwdWJsaWMgZm9ybVJlcG9ydGVEaW5hbWljbzogRm9ybUdyb3VwO1xyXG4gIHB1YmxpYyBsaXN0YU1hcmNhZG9yRGluYW1pY286IFJlcG9ydGVNYXJjYWRvck1vZGVsW10gPSBbXVxyXG4gIHB1YmxpYyBsaXN0YVRpcG9DYW1wb0phc3BlckRpbmFtaWNvID0gW1xyXG4gICAge2tleTogJ0MnLCB2YWx1ZTogJ0NhbGN1bG8nfSxcclxuICAgIHtrZXk6ICdUJywgdmFsdWU6ICdDb2x1bW5hJ30sXHJcbiAgXVxyXG4gIHB1YmxpYyBsaXN0YVRpcG9EYXRvU2ludGF4aXMgPSBbXHJcbiAgICB7a2V5OiAnRicsIHZhbHVlOiAnRmVjaGEnfSxcclxuICAgIHtrZXk6ICdOJywgdmFsdWU6ICdOdW1lcm8nfSxcclxuICAgIHtrZXk6ICdUJywgdmFsdWU6ICdUZXh0byd9LFxyXG4gIF1cclxuXHJcbiAgLy9yZXBvcnRlIHRhYmxhXHJcbiAgcHVibGljIGxpc3RhVGFibGE6IFJlcG9ydGVDb2x1bW5hTW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyBsaXN0YU5vVGFibGE6IFJlcG9ydGVDb2x1bW5hTW9kZWxbXSA9IFtdO1xyXG4gIFxyXG5cclxuICAvL3JlcG9ydGUgdGV4dG9cclxuICBwdWJsaWMgbGlzdGFTZXBhcmFkb3JlcztcclxuICBwdWJsaWMgY2xpY2tHdWFyZGFyUmVwb3J0ZVRleHRvOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGxpc3RhTWFyY2Fkb3Jlc1RleHRvOiBSZXBvcnRlTWFyY2Fkb3JNb2RlbFtdID0gW107XHJcbiAgcHVibGljIG1hcmNhZG9yVGV4dG86IFJlcG9ydGVNYXJjYWRvck1vZGVsID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKClcclxuICBwdWJsaWMgdmVyTnVldm9NYXJjYWRvclRleHRvOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGxpc3RhVGlwb01hcmNhZG9yVGV4dG87XHJcbiAgcHVibGljIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG86IGJvb2xlYW4gPSBmYWxzZVxyXG5cclxuICAvL3JlcG9ydGUgWE1MXHJcbiAgcHVibGljIGxpc3RhVGlwb01hcmNhZG9yWE1MO1xyXG4gIHB1YmxpYyBsaXN0YVhNTDogUmVwb3J0ZU1hcmNhZG9yTW9kZWxbXSA9IFtdXHJcbiAgcHVibGljIG1hcmNhZG9yWE1MOiBSZXBvcnRlTWFyY2Fkb3JNb2RlbCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbFxyXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJNYXJjYWRvclhNTDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyB2ZXJOdWV2b01hcmNhZG9yWE1MOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGxpc3RhQ2FtcG9zTWFyY2Fkb3JYTUw6IFJlcG9ydGVUYWJsYU1vZGVsW10gPSBbXTtcclxuICBwdWJsaWMgY2FtcG9NYXJjYWRvckluc2VydGFyWE1MOiBSZXBvcnRlVGFibGFNb2RlbCA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbDtcclxuICBwdWJsaWMgdmVyUmVwb3J0ZU1hcmNhZG9yRGV0YWxsZVhNTDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vcmVwb3J0ZSBjb2x1bW5hcmlvXHJcbiAgcHVibGljIGxpc3RhUmVwb3J0ZUNvbHVtbmFyaW86IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyB2ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGNvbHVtbmFCYXNpY2E6IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWw7XHJcbiAgcHVibGljIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGxpc3RhVGlwb0NvbHVtbmFzO1xyXG4gIHB1YmxpYyBsaXN0YU9wZXJhY2lvbmVzQ29sdW1uYXJpbztcclxuICBwdWJsaWMgbGlzdGFPcGVyYWNpb25lc0V4Y2VsQ29sdW1uYXJpbztcclxuICBwdWJsaWMgbGlzdGFPcmRlbmFtaWVudG87XHJcblxyXG4gIHB1YmxpYyB2ZXJOdWV2b0NvbHVtbmFBZGljaW9uYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBjb2x1bW5hc0FkaWNpb25hbGVzOiBSZXBvcnRlQ29sdW1uYXJpb01vZGVsW10gPSBbXTtcclxuICBwdWJsaWMgY29sdW1uYUFkaWNpb25hbDogUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbDtcclxuXHJcbiAgcHVibGljIGxpc3RhVGlwb01hcmNhZG9yQ29sdW1uYXJpbztcclxuICBwdWJsaWMgdmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIG1hcmNhZG9yZXNDb2x1bW5hcmlvOiBSZXBvcnRlQ29sdW1uYXJpb01hcmNhZG9yTW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyBtYXJjYWRvckNvbHVtbmFyaW86IFJlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JNb2RlbDtcclxuXHJcbiAgLy9ncmFmaWNhXHJcbiAgcHVibGljIGxpc3RhVGlwb0dyYWZpY287XHJcbiAgcHVibGljIHBhZ2luYWRvckNvbHVtbmFzOiBSZXBvcnRlQ29sdW1uYU1vZGVsW10gPSBbXTtcclxuICBwdWJsaWMgcGFnaW5hZG9yQ29sb3Jlc0dyYWZpY2E6IFJlcG9ydGVCYW5kYU1vZGVsW10gPSBbXTtcclxuICBwdWJsaWMgY29sb3JDYXRlZ29yaWE6IFJlcG9ydGVCYW5kYU1vZGVsID0gbmV3IFJlcG9ydGVCYW5kYU1vZGVsKCk7XHJcbiAgcHVibGljIHZlckNvbG9yQ2F0ZWdvcmlhRGV0YWxsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJDb2xvckNhdGVnb3JpYTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBncmFmaWNhO1xyXG4gIHB1YmxpYyB0aXBvR3JhZmljYTogXCJiYXJcIiB8IFwibGluZVwiIHwgXCJzY2F0dGVyXCIgfCBcImJ1YmJsZVwiIHwgXCJwaWVcIiB8IFwiZG91Z2hudXRcIiB8IFwicG9sYXJBcmVhXCIgfCBcInJhZGFyXCI7XHJcblxyXG4gIHB1YmxpYyByZXBvcnRlRnVlbnRlIDogUmVwb3J0ZUZ1ZW50ZU1vZGVsID0gbmV3ICBSZXBvcnRlRnVlbnRlTW9kZWwoKTtcclxuICBwdWJsaWMgbGxhdmVFbXByZXNhOiBzdHJpbmc7XHJcbiAgcHVibGljIGxpc3RhU2lObztcclxuICBASW5wdXQoKSBwdWJsaWMgbGxhdmVSZXBvcnRlIDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBhcGxpY2FjaW9uIDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpICBwdWJsaWMgbGlzdGFGdWVudGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBfc3Vic2NpcHJ0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIG5vdGlmaWNhY2lvbmVzQnVzU2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnZW5lcmFsU2VydmljZTogR2VuZXJhbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdlbmVyYWxQaXBlOiBHZW5lcmFsUGlwZSxcclxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZXBvcnRlRnVlbnRlUGlwZTogUmVwb3J0ZUZ1ZW50ZVBpcGUsXHJcbiAgICBwcml2YXRlIGNvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNhcmdhckFyY2hpdm86IENhcmdhckFyY2hpdm9zU2VydmljZSxcclxuICAgIHByaXZhdGUgZW5jcmlwdGFkb3JBcmNoaXZvOiBFbmNyaXB0YWRvQmFzaWNvU2VydmljZSxcclxuICAgIHB1YmxpYyB1dGlsc1NlcnZpY2U6IFV0aWxzU2VydmljZSxcclxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgZnVlbnRlUGlwZTogRnVlbnRlUGlwZSxcclxuICAgIHByaXZhdGUgcmVwb3J0ZUNvbHVtbmFyaW9QaXBlOiBSZXBvcnRlQ29sdW1uYXJpb1BpcGUsXHJcbiAgICBwcml2YXRlIHJlcG9ydGVTZXJ2aWNlOiBFamVjdWNpb25SZXBvcnRlU2VydmljZSxcclxuICAgIHByaXZhdGUgZGFzaGJvYXJkU2VydmljZTogRGFzaGJvYXJkU2VydmljZSxcclxuICAgIHByaXZhdGUgZGFzaGJvYXJkUGlwZTogRGFzaGJvYXJkUGlwZSwpIHtcclxuICAgIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFwbGljYWNpb24gPSB0aGlzLmF1dGhTZXJ2aWNlLmdldFRva2VuS2V5KCdhcGxpY2FjaW9uJylcclxuICAgIHRoaXMubGxhdmVFbXByZXNhID0gdGhpcy5hdXRoU2VydmljZS5nZXRUb2tlbktleSgnbGxhdmVFbXByZXNhJyk7XHJcbiAgICB0aGlzLmxpc3RhU2lObyA9IHRoaXMuZ2VuZXJhbFBpcGUuTElTVEFfU0lOTztcclxuICAgIHRoaXMubGlzdGFUaXBvTWFyY2Fkb3JDb2x1bW5hcmlvID0gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuTUFQQV9USVBPX01BUkNBRE9SO1xyXG4gICAgdGhpcy5saXN0YVRpcG9Db2x1bW5hcyA9IHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLk1BUEFfVElQT19DT0xVTU5BUztcclxuICAgIHRoaXMubGlzdGFPcGVyYWNpb25lc0NvbHVtbmFyaW8gPSB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5NQVBBX09QRVJBQ0lPTkVTX0NPTFVNTkFSSU87XHJcbiAgICB0aGlzLmxpc3RhT3BlcmFjaW9uZXNFeGNlbENvbHVtbmFyaW8gPSB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5NQVBBX09QRVJBQ0lPTkVTX0NPTFVNTkFSSU9fRVhDRUw7XHJcbiAgICB0aGlzLmxpc3RhT3JkZW5hbWllbnRvID0gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuTUFQQV9PUkRFTkFNSUVOVE87XHJcbiAgICB0aGlzLmxpc3RhU2VwYXJhZG9yZXMgPSAgdGhpcy5mdWVudGVQaXBlLkxJU1RBX1NFUEFSQURPUkVTO1xyXG4gICAgdGhpcy5saXN0YVRpcG9NYXJjYWRvciA9IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuTElTVEFfTUFSQ0FET1JFUztcclxuICAgIHRoaXMubGlzdGFUaXBvR3JhZmljb19KRkMgPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLkxJU1RBX1RJUE9fR1JBRklDT19KRkM7XHJcbiAgICB0aGlzLmxpc3RhR3JhZmljbyA9IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuTElTVEFfUkVDVVJTT19HUkFGSUNBO1xyXG4gICAgdGhpcy5saXN0YUdyYWZpY29TZW5jaWxsbyA9IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuUkVDVVJTT19HUkFGSUNBO1xyXG4gICAgdGhpcy5saXN0YUFsaW5lYWNpb24gPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLkxJU1RBX0FMSU5FQUNJT047XHJcbiAgICB0aGlzLmxpc3RhT3BlcmFjaW9uZXMgPSB0aGlzLmdlbmVyYWxQaXBlLk1BUEFPUEVSQUNJT05FUztcclxuICAgIHRoaXMubGlzdGFUaXBvTWFyY2Fkb3JUZXh0byA9IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuVElQT01BUkNBRE9SRVNURVhUTztcclxuICAgIHRoaXMubGlzdGFUaXBvTWFyY2Fkb3JYTUwgPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLkxJU1RBX01BUkNBRE9SRVNfWE1MO1xyXG4gICAgdGhpcy5saXN0YVRpcG9HcmFmaWNvID0gdGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5MSVNUQV9USVBPX0dSQUZJQ087XHJcbiAgICB0aGlzLmNhcmdhcigpO1xyXG4gICAgdGhpcy5jYXJnYXJGb3JtTWFyY2Fkb3JFeGNlbCgpO1xyXG4gICAgdGhpcy5jYXJnYXJGb3JtTWFyY2Fkb3IoKTtcclxuICAgIHRoaXMuY2FyZ2FyRm9ybURpbmFtaWNvKCk7XHJcbiAgICB0aGlzLmFncmVnYXJTdWJzY3JpcGNpb25lcygpO1xyXG4gICAgLy90aGlzLmNhcmdhckxpc3RhcygpO1xyXG5cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCl7XHJcbiAgICB0aGlzLl9zdWJzY2lwcnRpb25zLmZvckVhY2goKHN1YikgPT4ge1xyXG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWdyZWdhclN1YnNjcmlwY2lvbmVzKCkge1xyXG4gICAgdGhpcy5fc3Vic2NpcHJ0aW9ucy5wdXNoKFxyXG4gICAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgndGlwbycpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdGV4dG9SZWdpc3Ryb0NvbnRyb2wgPSB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgndGV4dG9SZWdpc3RybycpO1xyXG4gICAgICAgIGNvbnN0IG9yaWdlbkNvbnRyb2wgPSB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgnb3JpZ2VuJyk7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSl7XHJcbiAgICAgICAgICB0aGlzLmVzSW1hZ2VuRmlqYSA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmVzTWFyY2Fkb3IgPSB0cnVlO1xyXG4gICAgICAgICAgb3JpZ2VuQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgIHRleHRvUmVnaXN0cm9Db250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoWydNQSddLmluY2x1ZGVzKHZhbHVlKSkge1xyXG4gICAgICAgICAgdGhpcy5lc0ltYWdlbkZpamEgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuZXNNYXJjYWRvciA9IHRydWU7XHJcbiAgICAgICAgICB0ZXh0b1JlZ2lzdHJvQ29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgb3JpZ2VuQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKFsnSUYnXS5pbmNsdWRlcyh2YWx1ZSkpIHtcclxuICAgICAgICAgIHRoaXMuZXNJbWFnZW5GaWphID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuZXNNYXJjYWRvciA9IGZhbHNlO1xyXG4gICAgICAgICAgb3JpZ2VuQ29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgdGV4dG9SZWdpc3Ryb0NvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGV4dG9SZWdpc3Ryb0NvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIG9yaWdlbkNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLl9zdWJzY2lwcnRpb25zLnB1c2goXHJcbiAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmdldCgndGlwbycpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2VudHJhIGEgdGlwbzogJylcclxuICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZSlcclxuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvci50aXBvID0gdmFsdWU7XHJcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpcG8gPT0gdGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5NQVJDQURPUlRBQkxBKXtcclxuICAgICAgICAgLy8gdGhpcy5yZXBvcnRlTWFyY2Fkb3IudGllbmVTcWwgPSAnTidcclxuICAgICAgICAgLy8gdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCd0aWVuZVNxbCcpLnNldFZhbHVlKCdOJylcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLl9zdWJzY2lwcnRpb25zLnB1c2goXHJcbiAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmdldCgnb3JpZ2VuJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvci5vcmlnZW4gPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuX3N1YnNjaXBydGlvbnMucHVzaChcclxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCd0aWVuZVNxbCcpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2VudHJhIGEgdGllbmVTcWw6ICcpXHJcbiAgICAgICAgY29uc29sZS5sb2codmFsdWUpXHJcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IudGllbmVTcWwgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuX3N1YnNjaXBydGlvbnMucHVzaChcclxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCd0aXBvR3JhZmljbycpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IudGlwb0dyYWZpY28gPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuX3N1YnNjaXBydGlvbnMucHVzaChcclxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoJ29yaWdlbicpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgaWYgKFsnVSddLmluY2x1ZGVzKHZhbHVlKSkge1xyXG4gICAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbC5vcmlnZW4gPSAnVSdcclxuICAgICAgICB9IGVsc2UgaWYgKFsnQyddLmluY2x1ZGVzKHZhbHVlKSkge1xyXG4gICAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbC5vcmlnZW4gPSAnQycgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5fc3Vic2NpcHJ0aW9ucy5wdXNoKFxyXG4gICAgICB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uZ2V0KCd0aXBvQ2FtcG8nKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvID0gdmFsdWU7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0YWRvWENvbnRyb2wgPSB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uZ2V0KCdyZXN1bHRhZG9YJyk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0YWRvWUNvbnRyb2wgPSB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uZ2V0KCdyZXN1bHRhZG9ZJyk7ICBcclxuICAgICAgICBpZiAodGhpcy5iYW5kYVNlbGVjY2lvbmFkYS5rZXkgIT0gJ2RldGFsbGUnKSB7XHJcbiAgICAgICAgICByZXN1bHRhZG9YQ29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgcmVzdWx0YWRvWUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0YWRvWENvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICByZXN1bHRhZG9ZQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICB9IFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IG1hcmNhZG9yQ29udHJvbCA9IHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoJ21hcmNhZG9yJyk7XHJcbiAgICAgICAgY29uc3QgZmlsdHJvQ29udHJvbCA9IHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoJ2ZpbHRybycpO1xyXG4gICAgICAgIGNvbnN0IHRpcG9EYXRvQ29udHJvbCA9IHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoJ3RpcG9EYXRvJyk7XHJcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvID09ICdUJykge1xyXG4gICAgICAgICAgbWFyY2Fkb3JDb250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICBmaWx0cm9Db250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgdGlwb0RhdG9Db250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBtYXJjYWRvckNvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICBmaWx0cm9Db250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICB0aXBvRGF0b0NvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWFyY2Fkb3JDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICBmaWx0cm9Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB0aXBvRGF0b0NvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICByZXN1bHRhZG9YQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgIHJlc3VsdGFkb1lDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoJ3RpcG9EYXRvJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9EYXRvID0gdmFsdWVcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBjYW1iaWFyVGFiKGV2ZW50KXtcclxuICAgIHN3aXRjaCAoZXZlbnQuaW5kZXgpIHtcclxuICAgICAgY2FzZSAwOlxyXG4gICAgICAgIHRoaXMuY2FyZ2FyKCk7XHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YXNFeGNlbCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yZXMoKTtcclxuICAgICAgICBpZiAodGhpcy5yZXBvcnRlRnVlbnRlLnVuaWNvQXJjaGl2byA9PSAnTicpe1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVNvcG9ydGVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgdGhpcy52YWxpZGFyRXhpc3RlSmFzcGVyKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMzpcclxuICAgICAgICB0aGlzLmNhcmdhckxpc3RhTWFyY2Fkb3Jlc1RleHRvKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgNDpcclxuICAgICAgICB0aGlzLmNhcmdhckxpc3Rhc1RhYmxhKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgNTpcclxuICAgICAgICB0aGlzLmNhcmdhckxpc3RhWE1MKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgNjpcclxuICAgICAgICB0aGlzLmNhcmdhclJlcG9ydGVDb2x1bW5hcmlvKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgNzpcclxuICAgICAgICB0aGlzLmNhcmdhckdyYWZpY2FzQ29sdW1uYXMoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhcmdhckxpc3Rhc1RhYmxhKCl7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYURUTycsIG51bGwsIGZhbHNlLCB7YnVzY2FyT3JkZW5UYWJsYTogJ1MnLCBvcmRlbmFyVGFibGE6ICdTJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YVRhYmxhID0gZGF0YTtcclxuICAgIH0pXHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYURUTycsIG51bGwsIGZhbHNlLCB7YnVzY2FyT3JkZW5UYWJsYTogJ04nLCByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmV9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RhTm9UYWJsYSA9IGRhdGE7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgY2FyZ2FyTGlzdGFNYXJjYWRvcmVzKCl7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge3RpcG9SZXBvcnRlOiAnUCcsIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgb3JkZW5EaW5hbWljbzogdGhpcy5nZW5lcmFsUGlwZS5TSX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFNYXJjYWRvcmVzID0gZGF0YTtcclxuICAgIH0pICAgIFxyXG4gIH1cclxuXHJcbiAgY2FyZ2FyTGlzdGFzRXhjZWwoKXtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hRFRPJywgbnVsbCwgZmFsc2UsIHtvcmRlbkV4Y2VsOiAnUycsIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFFeGNlbCA9IGRhdGE7XHJcbiAgICB9KVxyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFEVE8nLCBudWxsLCBmYWxzZSwge29yZGVuRXhjZWw6ICdOJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YU5vRXhjZWwgPSBkYXRhO1xyXG4gICAgfSlcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB7dGlwb1JlcG9ydGU6ICdFJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCBvcmRlbkRpbmFtaWNvOiB0aGlzLmdlbmVyYWxQaXBlLlNJfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YU1hcmNhZG9yRXhjZWwgPSBkYXRhO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNhcmdhckxpc3RhQ29sdW1uYXMoKXtcclxuICAgIHRoaXMubGlzdGFDb2x1bW5hcyA9IFtdO1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFEVE8nLCBudWxsLCBmYWxzZSwge3JlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFDb2x1bW5hcyA9IGRhdGE7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgY2FyZ2FyTGlzdGFzKCl7XHJcbiAgICB0aGlzLmxpc3RhVGlwb0NpZnJhZG8gPSBbXTtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ0VuY3JpcGNpb25BcmNoaXZvRFRPJywgbnVsbCwgZmFsc2UsIHt9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RhVGlwb0NpZnJhZG8gPSBkYXRhO1xyXG4gICAgfSlcclxuICAgIHRoaXMuY2FyZ2FyTGlzdGFDb2x1bW5hcygpO1xyXG4gIH1cclxuXHJcbiAgY2FyZ2FyRm9ybU1hcmNhZG9yRXhjZWwoKXtcclxuICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgZGVzY3JpcGNpb246IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsLmRlc2NyaXBjaW9uLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTAwKV0pLFxyXG4gICAgICBtYXJjYWRvcjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwubWFyY2Fkb3IsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCg1MCldKSxcclxuICAgICAgdGlwbzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwudGlwbywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcclxuICAgICAgdGV4dG9SZWdpc3RybzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwudGV4dG9SZWdpc3RybyksXHJcbiAgICAgIG9yaWdlbjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwub3JpZ2VuKSxcclxuICAgICAgLy9jYW1wb3MgYmRcclxuICAgICAgbGxhdmU6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsLmxsYXZlKSxcclxuICAgICAgcmVwb3J0ZUZ1ZW50ZTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSksXHJcbiAgICAgIHRpcG9SZXBvcnRlOiBuZXcgRm9ybUNvbnRyb2woJ0UnKSBcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBjYXJnYXJGb3JtTWFyY2Fkb3IoKXtcclxuICAgIHRoaXMuZm9ybU1hcmNhZG9yID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIGRlc2NyaXBjaW9uOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuZGVzY3JpcGNpb24sIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxMDApXSksXHJcbiAgICAgIHRpcG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci50aXBvLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxyXG4gICAgICBtYXJjYWRvcjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLm1hcmNhZG9yLCBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTApXSksXHJcbiAgICAgIHRhYmxhOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGFibGEpLFxyXG4gICAgICBvcmlnZW46IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5vcmlnZW4pLFxyXG4gICAgICB0ZXh0b1JlZ2lzdHJvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGV4dG9SZWdpc3RybyksXHJcbiAgICAgIHJlcG9ydGVDb2x1bW5hOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IucmVwb3J0ZUNvbHVtbmEpLFxyXG4gICAgICBmb3JtYXRvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuZm9ybWF0byksXHJcbiAgICAgIGFuY2hvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuYW5jaG8pLFxyXG4gICAgICBhbHRvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuYWx0byksXHJcbiAgICAgIGdydXBvMTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmdydXBvMSksXHJcbiAgICAgIGdydXBvMjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmdydXBvMiksXHJcbiAgICAgIGdydXBvMzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmdydXBvMyksXHJcbiAgICAgIGZpbmFsR3J1cG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5maW5hbEdydXBvKSxcclxuICAgICAgdGllbmVTcWw6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci50aWVuZVNxbCksXHJcbiAgICAgIHF1ZXJ5OiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IucXVlcnkpLFxyXG4gICAgICBmdWVudGU6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5mdWVudGUpLFxyXG4gICAgICB0aXBvR3JhZmljbzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpcG9HcmFmaWNvKSxcclxuICAgICAgbWFyY2Fkb3JHcmFmaWNvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IubWFyY2Fkb3JHcmFmaWNvKSxcclxuICAgICAgdGl0dWxveDogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpdHVsb3gpLFxyXG4gICAgICB0aXR1bG95OiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGl0dWxveSksXHJcbiAgICAgIGJhbmRhOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuYmFuZGEpLFxyXG4gICAgICBhbmNob0phc3BlckxhYmVsOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuYW5jaG9KYXNwZXJMYWJlbCksXHJcbiAgICAgIGZpbHRybzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmZpbHRybyksXHJcbiAgICAgIC8vY2FtcG9zIGJkXHJcbiAgICAgIGxsYXZlOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IubGxhdmUpLFxyXG4gICAgICByZXBvcnRlRnVlbnRlOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlKSxcclxuICAgICAgdGlwb1JlcG9ydGU6IG5ldyBGb3JtQ29udHJvbCgnTicpIFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNhcmdhckZvcm1EaW5hbWljbygpe1xyXG4gICAgdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIHRpcG9DYW1wbzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxyXG4gICAgICB0aXBvRGF0bzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0RhdG8pLFxyXG4gICAgICBmaWx0cm86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmZpbHRybyksXHJcbiAgICAgIG1hcmNhZG9yOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5tYXJjYWRvciksXHJcbiAgICAgIGFsdG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmFsdG8sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIGZvcm1hdG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmZvcm1hdG8pLFxyXG4gICAgICBkZXNjcmlwY2lvbjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uZGVzY3JpcGNpb24pLFxyXG4gICAgICBhbmNobzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uYW5jaG8sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIGFuY2hvSmFzcGVyTGFiZWw6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmFuY2hvSmFzcGVyTGFiZWwpLFxyXG4gICAgICByZXN1bHRhZG9YOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5yZXN1bHRhZG9YICksXHJcbiAgICAgIHJlc3VsdGFkb1k6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnJlc3VsdGFkb1kgKSxcclxuICAgICAgdGl0dWxveDogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGl0dWxveCksXHJcbiAgICAgIHRpdHVsb3k6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpdHVsb3kpLFxyXG4gICAgICB0aXBvUmVwb3J0ZTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb1JlcG9ydGUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIHRpcG9HcmFmaWNvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvR3JhZmljbyksICAgICAgXHJcbiAgICAgIG9wZXJhY2lvbjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ub3BlcmFjaW9uKSwgICAgICBcclxuICAgICAgLy9jYW1wb3MgdGFibGFcclxuICAgICAgb3JpZ2VuOiBuZXcgRm9ybUNvbnRyb2woJ0QnKSxcclxuICAgICAgYmFuZGE6IG5ldyBGb3JtQ29udHJvbCh0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLmtleSksXHJcbiAgICAgIHJlcG9ydGVGdWVudGU6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUpLFxyXG4gICAgICBsbGF2ZTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubGxhdmUpLFxyXG5cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBjYXJnYXIoKXtcclxuICAgIHRoaXMuZXhpc3RlSmFzcGVyID0gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLmxsYXZlUmVwb3J0ZSl7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvck9iamVjdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlRnVlbnRlRFRPJywgbnVsbCwgZmFsc2UsIHtsbGF2ZTogdGhpcy5sbGF2ZVJlcG9ydGV9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXBvcnRlRnVlbnRlID0gZGF0YTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFzRXhjZWwoKTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFzKCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFjdHVhbGl6YXIoKXtcclxuICAgIGlmICh0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUpe1xyXG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlRnVlbnRlRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMucmVwb3J0ZUZ1ZW50ZSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XHJcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0ZUZ1ZW50ZS51bmljb0FyY2hpdm8gPT0gJ04nKXtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZXBvcnRlU2VydmljZS5ndWFyZGFyUmVwb3J0ZSh0aGlzLnJlcG9ydGVGdWVudGUpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICB0aGlzLnJlcG9ydGVGdWVudGUgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvYnRlbmVyQXJjaGl2byhldmVudCl7XHJcbiAgICB0aGlzLnJlcG9ydGVGdWVudGUuYXJjaGl2b1RvZG8gPSBldmVudC5kYXRhXHJcbiAgfVxyXG5cclxuICBvYnRlbmVyQXJjaGl2b01hcmNhZG9yRXhjZWwoZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IudGV4dG9SZWdpc3RybyA9IGV2ZW50LmRhdGFcclxuICB9XHJcblxyXG4gIG9idGVuZXJBcmNoaXZvTWFyY2Fkb3IoZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IudGV4dG9SZWdpc3RybyA9IGV2ZW50LmRhdGFcclxuICB9XHJcblxyXG4gIG9idGVuZXJBcmNoaXZvUGxhbmlsbGEoZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlRnVlbnRlLmFyY2hpdm9JbmRpdmlkdWFsID0gZXZlbnQuZGF0YVxyXG4gIH1cclxuXHJcbiAgb2J0ZW5lckFyY2hpdm9Tb3BvcnRlKGV2ZW50LCBzb3BvcnRlKXtcclxuICAgIHNvcG9ydGUuYXJjaGl2b0luZGl2aWR1YWwgPSBldmVudC5kYXRhXHJcbiAgfVxyXG5cclxuICBvYnRlbmVyQXJjaGl2b0NvbHVtbmFyaW8oZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlRnVlbnRlLmFyY2hpdm9FeGNlbENvbHVtbmFyaW8gPSBldmVudC5kYXRhXHJcbiAgfVxyXG5cclxuXHJcbiAgbW92ZXJBQXNvY2lhZG8oZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlU2VydmljZS5hY3R1YWxpemFyUmVwb3J0ZUNvbHVtbmFPcmRlbih7XHJcbiAgICAgIGxpc3RhQXNvY2lhZG86IHRoaXMubGlzdGFFeGNlbCxcclxuICAgICAgZXhjZWw6IHRydWVcclxuICAgIH0pLnN1YnNjcmliZShkYXRhID0+IHt0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUl9WQVJJT1MpfSlcclxuICB9XHJcblxyXG4gIG1vdmVyQURlc2Fzb2NpYWRvKGV2ZW50KXtcclxuICAgIHRoaXMucmVwb3J0ZVNlcnZpY2UuYWN0dWFsaXphclJlcG9ydGVDb2x1bW5hT3JkZW4oe1xyXG4gICAgICBsaXN0YURlc2Fzb2NpYWRvOiB0aGlzLmxpc3RhTm9FeGNlbCxcclxuICAgICAgZXhjZWw6IHRydWVcclxuICAgICB9KS5zdWJzY3JpYmUoZGF0YSA9PiB7dGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVJfVkFSSU9TKX0pXHJcbiAgfVxyXG5cclxuICBtb3ZlckFBc29jaWFkb1RhYmxhKGV2ZW50KXtcclxuICAgIHRoaXMucmVwb3J0ZVNlcnZpY2UuYWN0dWFsaXphclJlcG9ydGVDb2x1bW5hT3JkZW4oe1xyXG4gICAgICBsaXN0YUFzb2NpYWRvOiB0aGlzLmxpc3RhVGFibGEsXHJcbiAgICAgIGV4Y2VsOiBmYWxzZVxyXG4gICAgfSkuc3Vic2NyaWJlKGRhdGEgPT4ge3RoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSX1ZBUklPUyl9KVxyXG4gIH1cclxuXHJcbiAgbW92ZXJBRGVzYXNvY2lhZG9UYWJsYShldmVudCl7XHJcbiAgICB0aGlzLnJlcG9ydGVTZXJ2aWNlLmFjdHVhbGl6YXJSZXBvcnRlQ29sdW1uYU9yZGVuKHtcclxuICAgICAgbGlzdGFEZXNhc29jaWFkbzogdGhpcy5saXN0YU5vVGFibGEsXHJcbiAgICAgIGV4Y2VsOiBmYWxzZVxyXG4gICAgIH0pLnN1YnNjcmliZShkYXRhID0+IHt0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUl9WQVJJT1MpfSlcclxuICB9XHJcblxyXG4gIHJlb3JkZXJUYWJsYShldmVudCl7XHJcbiAgICB0aGlzLnJlcG9ydGVTZXJ2aWNlLmFjdHVhbGl6YXJSZXBvcnRlQ29sdW1uYU9yZGVuKHtcclxuICAgICAgbGlzdGFBc29jaWFkbzogdGhpcy5saXN0YVRhYmxhLFxyXG4gICAgICBleGNlbDogZmFsc2VcclxuICAgICB9KS5zdWJzY3JpYmUoZGF0YSA9PiB7dGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVJfVkFSSU9TKX0pXHJcbiAgfVxyXG5cclxuICB2ZXJEZXRhbGxlTWFyY2Fkb3JFeGNlbChldmVudCl7XHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnJlc2V0KCk7XHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JFeGNlbCA9IHRydWU7XHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsID0gZXZlbnQuZGF0YTtcclxuICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwucGF0Y2hWYWx1ZSh0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsKVxyXG4gIH1cclxuXHJcbiAgbnVldm9NYXJjYWRvckV4Y2VsKCl7XHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnJlc2V0KCk7XHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JFeGNlbCA9IHRydWU7XHJcbiAgICB0aGlzLmVzTWFyY2Fkb3IgPSBmYWxzZTtcclxuICAgIHRoaXMuZXNJbWFnZW5GaWphID0gZmFsc2U7XHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnBhdGNoVmFsdWUodGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbClcclxuICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KCd0aXBvJykuc2V0VmFsdWUobnVsbClcclxuICB9XHJcblxyXG4gIGd1YXJkYXJNYXJjYWRvckV4Y2VsKCl7XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yRXhjZWwgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwudmFsaWQpe1xyXG4gICAgICBsZXQgbGxhdmVSZWdpc3RybyA9ICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgnbGxhdmUnKS52YWx1ZVxyXG4gICAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgncmVwb3J0ZUZ1ZW50ZScpLnNldFZhbHVlKHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSlcclxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoJ3RpcG9SZXBvcnRlJykuc2V0VmFsdWUoJ0UnKVxyXG4gICAgICBpZiAobGxhdmVSZWdpc3Rybyl7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwudmFsdWUpKS5zdWJzY3JpYmUoIGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xyXG4gICAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHt0aXBvUmVwb3J0ZTogJ0UnLCByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIG9yZGVuRGluYW1pY286IHRoaXMuZ2VuZXJhbFBpcGUuU0l9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RhTWFyY2Fkb3JFeGNlbCA9IGRhdGE7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoJ2xsYXZlJykuc2V0VmFsdWUodGhpcy51dGlsc1NlcnZpY2UuZ2VuZXJhckxsYXZlKCkpXHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnZhbHVlKSkuc3Vic2NyaWJlKCBkYXRhID0+IHsgIFxyXG4gICAgICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yRXhjZWwgPSBmYWxzZSAgICAgIFxyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xyXG4gICAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHt0aXBvUmVwb3J0ZTogJ0UnLCByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIG9yZGVuRGluYW1pY286IHRoaXMuZ2VuZXJhbFBpcGUuU0l9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RhTWFyY2Fkb3JFeGNlbCA9IGRhdGE7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvckV4Y2VsID0gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJylcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5jb250cm9scykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KGtleSkuZXJyb3JzKSB7XHJcbiAgICAgICAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldChrZXkpLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gXHJcbiAgfVxyXG5cclxuICBlbGltaW5hck1hcmNhZG9yRXhjZWwoZXZlbnQpe1xyXG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xyXG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcclxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXHJcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLmdlbmVyYWxQaXBlLlNJX0RFU0MsXHJcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxyXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbCkpLnN1YnNjcmliZShkYXRhID0+e1xyXG4gICAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5yZXNldCgpO1xyXG4gICAgICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yRXhjZWwgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUilcclxuICAgICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB7dGlwb1JlcG9ydGU6ICdFJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCBvcmRlbkRpbmFtaWNvOiB0aGlzLmdlbmVyYWxQaXBlLlNJfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0YU1hcmNhZG9yRXhjZWwgPSBkYXRhO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgXHJcbiAgfVxyXG5cclxuICAvL3BsYW50aWxsYVxyXG5cclxuICBjYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3IoKSB7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlVGFibGFEVE8nLCBudWxsLCBmYWxzZSwgeyByZXBvcnRlTWFyY2Fkb3I6IHRoaXMucmVwb3J0ZU1hcmNhZG9yLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YUNhbXBvc01hcmNhZG9yID0gZGF0YTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBhc3luYyBjYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3JBc3luYygpIHtcclxuICAgIHRoaXMuYmxvcXVlYXJDYW1wb01hcmNhZG9yID0gZmFsc2U7XHJcbiAgICB0aGlzLmxpc3RhQ2FtcG9zTWFyY2Fkb3IgPSBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlVGFibGFEVE8nLCBudWxsLCBmYWxzZSwgeyByZXBvcnRlTWFyY2Fkb3I6IHRoaXMucmVwb3J0ZU1hcmNhZG9yLmxsYXZlfSkpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgdmVyRGV0YWxsZU1hcmNhZG9yKGV2ZW50KXtcclxuICAgIC8vdGhpcy5mb3JtTWFyY2Fkb3IucmVzZXQoKTtcclxuICAgIHRoaXMudmVyTnVldm9NYXJjYWRvciA9IHRydWU7XHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvciA9IGV2ZW50LmRhdGE7XHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvci5wYXRjaFZhbHVlKHRoaXMucmVwb3J0ZU1hcmNhZG9yKVxyXG4gICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCd0aXBvJykuc2V0VmFsdWUodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGlwbylcclxuICAgIFxyXG4gICAgdGhpcy5jYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3IoKTtcclxuICB9XHJcblxyXG4gIG51ZXZvTWFyY2Fkb3IoKXtcclxuICAgIC8vdGhpcy5mb3JtTWFyY2Fkb3IucmVzZXQoKTtcclxuICAgIHRoaXMuZm9ybU1hcmNhZG9yLnJlc2V0KHt9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcblxyXG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yID0gdHJ1ZTtcclxuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvci5wYXRjaFZhbHVlKHRoaXMucmVwb3J0ZU1hcmNhZG9yKVxyXG4gICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCd0aXBvUmVwb3J0ZScpLnNldFZhbHVlKCdQJylcclxuICAgIC8vdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCd0aXBvJykuc2V0VmFsdWUobnVsbClcclxuICB9XHJcblxyXG4gIGd1YXJkYXJNYXJjYWRvcigpe1xyXG4gICAgaWYgKHRoaXMuZm9ybU1hcmNhZG9yLnZhbGlkKXtcclxuICAgICAgbGV0IGxsYXZlUmVnaXN0cm8gPSAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCdsbGF2ZScpLnZhbHVlXHJcbiAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmdldCgncmVwb3J0ZUZ1ZW50ZScpLnNldFZhbHVlKHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSlcclxuICAgICAgLy90aGlzLmZvcm1NYXJjYWRvci5nZXQoJ3RpcG9SZXBvcnRlJykuc2V0VmFsdWUoJ04nKVxyXG4gICAgICBpZiAobGxhdmVSZWdpc3Rybyl7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuZm9ybU1hcmNhZG9yLnZhbHVlKSkuc3Vic2NyaWJlKCBkYXRhID0+IHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvcmVzKCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5yZXBvcnRlRnVlbnRlLnVuaWNvQXJjaGl2byA9PSAnTicpe1xyXG4gICAgICAgICAgICB0aGlzLmNhcmdhckxpc3RhU29wb3J0ZXMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmdldCgnbGxhdmUnKS5zZXRWYWx1ZSh0aGlzLnV0aWxzU2VydmljZS5nZW5lcmFyTGxhdmUoKSlcclxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuZm9ybU1hcmNhZG9yLnZhbHVlKSkuc3Vic2NyaWJlKCBkYXRhID0+IHsgICAgICAgICAgXHJcbiAgICAgICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3IgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvcmVzKCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5yZXBvcnRlRnVlbnRlLnVuaWNvQXJjaGl2byA9PSAnTicpe1xyXG4gICAgICAgICAgICB0aGlzLmNhcmdhckxpc3RhU29wb3J0ZXMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJylcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5mb3JtTWFyY2Fkb3IuY29udHJvbHMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmZvcm1NYXJjYWRvci5nZXQoa2V5KS5lcnJvcnMpIHtcclxuICAgICAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmdldChrZXkpLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gXHJcbiAgfVxyXG5cclxuICBlbGltaW5hck1hcmNhZG9yKGV2ZW50KXtcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXHJcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxyXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxyXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcclxuICAgICAgYWNjZXB0OiAoKSA9PiB7IFxyXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLnJlcG9ydGVNYXJjYWRvcikpLnN1YnNjcmliZShkYXRhID0+e1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKVxyXG4gICAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IucmVzZXQoKTtcclxuICAgICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvciA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvcmVzKCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGVsaW1pbmFyQ2FtcG9NYXJjYWRvcihldmVudCwgb2JqZXRvKXsgXHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XHJcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxyXG4gICAgICBtZXNzYWdlOiAgdGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSX0NPTkZJUk1BUixcclxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcclxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXHJcbiAgICAgIGFjY2VwdDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCBvYmpldG8pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpO1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3IoKTtcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgbnVldm9DYW1wb1RhYmxhKCl7XHJcbiAgICB0aGlzLnZlclJlcG9ydGVNYXJjYWRvckRldGFsbGUgPSB0cnVlO1xyXG4gICAgdGhpcy5ibG9xdWVhckNhbXBvTWFyY2Fkb3IgPSB0cnVlO1xyXG4gICAgdGhpcy5jYW1wb01hcmNhZG9ySW5zZXJ0YXIgPSBuZXcgUmVwb3J0ZVRhYmxhTW9kZWwoKTtcclxuICAgIHRoaXMuY2FtcG9NYXJjYWRvckluc2VydGFyLnJlcG9ydGVNYXJjYWRvciA9IHRoaXMucmVwb3J0ZU1hcmNhZG9yLmxsYXZlXHJcbiAgfVxyXG5cclxuICB2YWxpZGFyQ2FtcG9NYXJjYWRvcihjYW1wb01hcmNhZG9yKXtcclxuICAgIHZhciB2YWxpZGFkb3I6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3IuY29sdW1uYSlcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9yLmNhbXBvRnVlbnRlKVxyXG4gICAgcmV0dXJuIHZhbGlkYWRvcjtcclxuICB9XHJcblxyXG4gIGVkaXRhckNhbXBvTWFyY2Fkb3IoKSB7XHJcbiAgICB0aGlzLmJsb3F1ZWFyQ2FtcG9NYXJjYWRvciA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBhZ3JlZ2FyQ2FtcG9NYXJjYWRvcihjYW1wb01hcmNhZG9yKXtcclxuICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wbyA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMudmFsaWRhckNhbXBvTWFyY2Fkb3IoY2FtcG9NYXJjYWRvcikpe1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNhbXBvTWFyY2Fkb3IucmVwb3J0ZU1hcmNhZG9yID0gdGhpcy5yZXBvcnRlTWFyY2Fkb3IubGxhdmU7XHJcbiAgICBpZiAoJ0knID09IGNhbXBvTWFyY2Fkb3IudGlwbyl7XHJcbiAgICAgIGlmICghY2FtcG9NYXJjYWRvci5hbmNobyB8fCBjYW1wb01hcmNhZG9yLmFuY2hvID09IDApe1xyXG4gICAgICAgIGNhbXBvTWFyY2Fkb3IuYW5jaG8gPSAxMDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWNhbXBvTWFyY2Fkb3IuYWx0byB8fCBjYW1wb01hcmNhZG9yLmFsdG8gPT0gMCl7XHJcbiAgICAgICAgY2FtcG9NYXJjYWRvci5hbHRvID0gMTA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChbJ0cnXS5pbmNsdWRlcyhjYW1wb01hcmNhZG9yLnRpcG8pKXtcclxuICAgICAgY2FtcG9NYXJjYWRvci5jb2x1bW5hID0gMDtcclxuICAgIH1cclxuICAgIGlmIChjYW1wb01hcmNhZG9yLmxsYXZlKXtcclxuICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIGNhbXBvTWFyY2Fkb3IpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xyXG4gICAgICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wbyA9IGZhbHNlO1xyXG4gICAgICAgIGNhbXBvTWFyY2Fkb3IgPSBuZXcgUmVwb3J0ZVRhYmxhTW9kZWw7XHJcbiAgICAgICAgdGhpcy5ibG9xdWVhckNhbXBvTWFyY2Fkb3IgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvcigpO1xyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2FtcG9NYXJjYWRvci5sbGF2ZSA9IHRoaXMudXRpbHNTZXJ2aWNlLmdlbmVyYXJMbGF2ZSgpO1xyXG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIGNhbXBvTWFyY2Fkb3IpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xyXG4gICAgICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wbyA9IGZhbHNlO1xyXG4gICAgICAgIGNhbXBvTWFyY2Fkb3IgPSBuZXcgUmVwb3J0ZVRhYmxhTW9kZWw7XHJcbiAgICAgICAgdGhpcy52ZXJSZXBvcnRlTWFyY2Fkb3JEZXRhbGxlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jYW1wb01hcmNhZG9ySW5zZXJ0YXIgPSBuZXcgUmVwb3J0ZVRhYmxhTW9kZWwoKTtcclxuICAgICAgICB0aGlzLmJsb3F1ZWFyQ2FtcG9NYXJjYWRvciA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yKCk7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYXJnYXJMaXN0YVNvcG9ydGVzKCl7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlU29wb3J0ZURUTycsIG51bGwsIGZhbHNlLCB7cmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCB0aXBvOiAnUyd9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RhU29wb3J0ZXMgPSBkYXRhO1xyXG4gICB9KVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FyZ2FyTGlzdGFTb3BvcnRlc0FzeW5jKCl7XHJcbiAgICB0aGlzLmxpc3RhU29wb3J0ZXMgPSBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlU29wb3J0ZURUTycsIG51bGwsIGZhbHNlLCB7cmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCB0aXBvOiAnUyd9KSkudG9Qcm9taXNlKClcclxuICB9XHJcblxyXG4gIG51ZXZvU29wb3J0ZSgpe1xyXG4gICAgdGhpcy5zb3BvcnRlSW5ncmVzYXIgPSBuZXcgUmVwb3J0ZVNvcG9ydGVNb2RlbCgpO1xyXG4gICAgdGhpcy52ZXJTb3BvcnRlQXJjaGl2b0RldGFsbGUgPSB0cnVlO1xyXG4gICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGNhbmNlbGFyU29wb3J0ZSgpIHtcclxuICAgIHRoaXMuc29wb3J0ZUluZ3Jlc2FyID0gbmV3IFJlcG9ydGVTb3BvcnRlTW9kZWwoKTtcclxuICAgIHRoaXMudmVyU29wb3J0ZUFyY2hpdm9EZXRhbGxlID0gZmFsc2U7XHJcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXJTb3BvcnRlKHNvcG9ydGUpe1xyXG4gICAgdmFyIHZhbGlkYWRvcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oc29wb3J0ZS5kZXNjcmlwY2lvbilcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlLmFyY2hpdm9JbmRpdmlkdWFsKVxyXG4gICAgcmV0dXJuIHZhbGlkYWRvcjtcclxuICB9XHJcblxyXG4gIGFncmVnYXJTb3BvcnRlKHNvcG9ydGUpe1xyXG4gICAgdGhpcy5jbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2byA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMudmFsaWRhclNvcG9ydGUoc29wb3J0ZSkpe1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJylcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCFzb3BvcnRlLmxsYXZlVGFibGEpe1xyXG4gICAgICBzb3BvcnRlLnRpcG8gPSAnUydcclxuICAgICAgc29wb3J0ZS5yZXBvcnRlRnVlbnRlID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlXHJcbiAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlU29wb3J0ZURUTycsIG51bGwsIGZhbHNlLCBzb3BvcnRlKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcclxuICAgICAgICBzb3BvcnRlID0gbmV3IFJlcG9ydGVTb3BvcnRlTW9kZWw7XHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVNvcG9ydGVzKCk7XHJcbiAgICAgICAgdGhpcy52ZXJTb3BvcnRlQXJjaGl2b0RldGFsbGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNsaWNrR3VhcmRhclNvcG9ydGVBcmNoaXZvID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVNvcG9ydGVEVE8nLCBudWxsLCBmYWxzZSwgc29wb3J0ZSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFTb3BvcnRlcygpO1xyXG4gICAgICAgICAgdGhpcy52ZXJTb3BvcnRlQXJjaGl2b0RldGFsbGUgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuY2xpY2tHdWFyZGFyU29wb3J0ZUFyY2hpdm8gPSBmYWxzZTtcclxuICAgICAgICAgIHNvcG9ydGUgPSBuZXcgUmVwb3J0ZVNvcG9ydGVNb2RlbDtcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZWxpbWluYXJTb3BvcnRlKGV2ZW50LCBzb3BvcnRlKXtcclxuICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IHRydWU7XHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XHJcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxyXG4gICAgICBtZXNzYWdlOiAgdGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSX0NPTkZJUk1BUixcclxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcclxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXHJcbiAgICAgIGFjY2VwdDogKCkgPT4geyBcclxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlU29wb3J0ZURUTycsIG51bGwsIGZhbHNlLCBzb3BvcnRlKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFTb3BvcnRlcygpO1xyXG4gICAgICAgICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gZmFsc2U7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGluaWNpYXJFZGljaW9uKCkge1xyXG4gICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNhbmNlbGFyRWRpY2lvbigpIHsgXHJcbiAgICB0aGlzLmNhcmdhckxpc3RhU29wb3J0ZXNBc3luYygpOyAgIFxyXG4gICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gZmFsc2U7XHJcbiAgICBcclxuICB9XHJcbiAgXHJcbiAgLy9SZXBvcnRlIERpbmFtaWNvXHJcblxyXG4gIGdlbmVyYXJKYXNwZXIoKXtcclxuICAgIHRoaXMucmVwb3J0ZVNlcnZpY2UuZ2VuZXJhckphc3Blcih0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsICdjb21wZW5zYWNpb24vUmVwb3J0ZXNCYXNlJykgLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ1NlIGhhIGdlbmVyYWRvIGVsIGphc3BlciBleGl0b3NhbWVudGUnKVxyXG4gICAgICAgIHRoaXMudmFsaWRhckV4aXN0ZUphc3BlcigpO1xyXG4gICAgICB9XHJcbiAgICB9KTsgICAgXHJcbiAgfVxyXG5cclxuXHJcbiAgZGVzY2FyZ2FySmFzcGVyKCkge1xyXG5cclxuICAgIGxldCBwcm9waWVkYWQgPSAncnV0YV9wbGFudGlsbGFzJztcclxuICAgIC8vUnV0YSBhcmNoaXZvXHJcbiAgICB0aGlzLmFwbGljYWNpb24gPSB0aGlzLmF1dGhTZXJ2aWNlLmdldFRva2VuS2V5KCdhcGxpY2FjaW9uJylcclxuICAgIHRoaXMuY2FyZ2FyQXJjaGl2by5kZXNjYXJnYXJBcmNoaXZvKHRoaXMuZW5jcmlwdGFkb3JBcmNoaXZvLmVuY3JpcHRhcigncmVwb3J0ZXMvJyArIHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSArICcuanJ4bWwnKSwgcHJvcGllZGFkLCB0aGlzLmFwbGljYWNpb24pLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IGJsb2IgPT4ge1xyXG4gICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXHJcbiAgICAgIGNvbnN0IG9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcclxuICAgICAgYS5ocmVmID0gb2JqZWN0VXJsXHJcbiAgICAgIGEuZG93bmxvYWQgPSB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUgKyAnLmpyeG1sJyAvL2RvY3VtZW50by5hcmNoaXZvb3JpZ2VuO1xyXG4gICAgICBhLmNsaWNrKCk7XHJcbiAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwob2JqZWN0VXJsKTtcclxuICAgIH1cclxuICB9KTtcclxuICB9XHJcblxyXG4gIG51ZXZvTWFyY2Fkb3JEaW5hbWljbygpe1xyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbFxyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5vcmlnZW4gPSAnRCdcclxuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ucmVwb3J0ZUZ1ZW50ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZVxyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5iYW5kYSA9IHRoaXMuYmFuZGFTZWxlY2Npb25hZGEua2V5XHJcbiAgICB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28ucmVzZXQoKTtcclxuICAgIHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5wYXRjaFZhbHVlKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28pXHJcbiAgICB0aGlzLm51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSB0cnVlXHJcbiAgfVxyXG5cclxuICB2ZXJNYXJjYWRvckRpbmFtaWNvKGV2ZW50KXtcclxuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSBldmVudC5kYXRhO1xyXG4gICAgdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLnBhdGNoVmFsdWUodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbylcclxuICAgIHRoaXMubnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBhc3luYyB2ZXJCYW5kYShldmVudCl7XHJcbiAgICB0aGlzLnZlclRhYkJhbmRhID0gZmFsc2U7XHJcbiAgICB0aGlzLmJhbmRhU2VsZWNjaW9uYWRhID0gZXZlbnQuZGF0YTtcclxuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWw7XHJcbiAgICB0aGlzLm51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSBmYWxzZTtcclxuICAgIHRoaXMubnVldmFCYW5kYSA9IGZhbHNlO1xyXG4gICAgaWYgKFsnZGV0YWxsZScsJ3N1bW1hcnknXS5pbmNsdWRlcyh0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLmtleSkpe1xyXG4gICAgICBhd2FpdCB0aGlzLmNhcmdhckxpc3RhTWFyY2Fkb3JEaW5hbWljbygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZXBvcnRlQmFuZGEgPSBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yT2JqZWN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVCYW5kYURUTycsIG51bGwsIGZhbHNlLCB7cmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCBiYW5kYTogdGhpcy5iYW5kYVNlbGVjY2lvbmFkYS5rZXl9KSkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGlmICghdGhpcy5yZXBvcnRlQmFuZGEpIHtcclxuICAgICAgICB0aGlzLm51ZXZhQmFuZGEgPSB0cnVlO1xyXG4gICAgICAgIGlmIChbJ2RldGFsbGUnLCdzdW1tYXJ5J10uaW5jbHVkZXModGhpcy5iYW5kYVNlbGVjY2lvbmFkYS5rZXkpKXtcclxuICAgICAgICAgIHRoaXMubnVldmFCYW5kYSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlcG9ydGVCYW5kYSA9IG5ldyBSZXBvcnRlQmFuZGFNb2RlbDtcclxuICAgICAgICB0aGlzLnJlcG9ydGVCYW5kYS50b3RhbGVzID0gJ1MnXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yRGluYW1pY28oKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnNsZWVwKDI1KVxyXG4gICAgdGhpcy52ZXJUYWJCYW5kYSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjYXJnYXJMaXN0YU1hcmNhZG9yRGluYW1pY28oKXtcclxuICAgIHRoaXMubGlzdGFNYXJjYWRvckRpbmFtaWNvID0gYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHtcclxuICAgICAgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCBcclxuICAgICAgYmFuZGE6IHRoaXMuYmFuZGFTZWxlY2Npb25hZGEua2V5LFxyXG4gICAgICBvcmRlbkRpbmFtaWNvOiAnUycsXHJcbiAgICAgIG9yaWdlbjogJ0QnXHJcbiAgICB9KSkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBndWFyZGFyQ2FyYWN0ZXJpc3RpY2FCYW5kYSgpe1xyXG4gICAgaWYodGhpcy5udWV2YUJhbmRhKSB7XHJcbiAgICAgIHRoaXMucmVwb3J0ZUJhbmRhLnJlcG9ydGVGdWVudGUgPSB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmU7XHJcbiAgICAgIHRoaXMucmVwb3J0ZUJhbmRhLmJhbmRhID0gdGhpcy5iYW5kYVNlbGVjY2lvbmFkYS5rZXk7XHJcbiAgICAgIHRoaXMucmVwb3J0ZUJhbmRhID0gYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVCYW5kYURUTycsIG51bGwsIGZhbHNlLCB0aGlzLnJlcG9ydGVCYW5kYSkpLnRvUHJvbWlzZSgpO1xyXG4gICAgfWVsc2Uge1xyXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQmFuZGFEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5yZXBvcnRlQmFuZGEpKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuc2xlZXAoMjUpXHJcbiAgICB0aGlzLm51ZXZhQmFuZGE9ZmFsc2U7XHJcbiAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyhcIlNlIGFjdHVhbGl6YXJvbiBsYXMgY2FyYWN0ZXJpc3RpY2FzIGRlIFwiK3RoaXMuYmFuZGFTZWxlY2Npb25hZGEudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ3VhcmRhckNvbHVtbmFEaW5hbWljbygpe1xyXG4gICAgaWYgKCF0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28udmFsaWQpIHtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5jb250cm9scykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLmdldChrZXkpLmVycm9ycykge1xyXG4gICAgICAgICAgICB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uZ2V0KGtleSkubWFya0FzRGlydHkoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby52YWx1ZTtcclxuICAgIGlmKHRoaXMudXRpbHNTZXJ2aWNlLmlzQmxhbmsodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5sbGF2ZSkpe1xyXG4gICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmxsYXZlID0gdGhpcy51dGlsc1NlcnZpY2UuZ2VuZXJhckxsYXZlKCk7XHJcbiAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ub3JpZ2VuID0gJ0QnO1xyXG4gICAgICBpZih0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyA9PSAnQycpe1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubWFyY2Fkb3IgPSB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmZpbHRybztcclxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnJlcG9ydGVDb2x1bW5hID0gbnVsbDtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgdmFyIGNvbHVtbmEgPSBuZXcgUmVwb3J0ZUNvbHVtbmFNb2RlbCgpO1xyXG4gICAgICAgIGNvbHVtbmEubGxhdmVUYWJsYSA9IHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubWFyY2Fkb3I7XHJcbiAgICAgICAgY29sdW1uYSA9IGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JPYmplY3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFEVE8nLCBudWxsLCBmYWxzZSwgY29sdW1uYSkpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubWFyY2Fkb3IgPSBjb2x1bW5hLm5vbWJyZTtcclxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnJlcG9ydGVDb2x1bW5hID0gY29sdW1uYS5sbGF2ZVRhYmxhO1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uZmlsdHJvID0gY29sdW1uYS5zaW50YXhpcztcclxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9EYXRvID0gY29sdW1uYS50aXBvRGF0bztcclxuICAgICAgfVxyXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28pKS50b1Byb21pc2UoKTtcclxuICAgIH1lbHNle1xyXG4gICAgICBpZih0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyA9PSAnQycpe1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubWFyY2Fkb3IgPSB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmZpbHRybztcclxuICAgICAgfVxyXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbykpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IG51bGw7XHJcbiAgICB0aGlzLm51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSBmYWxzZTtcclxuICAgIGF3YWl0IHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvckRpbmFtaWNvKClcclxuICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKCdTZSBoYSBndWFyZGFkbyBlbCBjYW1iaW8nKTtcclxuICB9XHJcblxyXG4gIHJlZ3Jlc2FyQmFuZGFTZWxlY2Npb25hZGEoKXtcclxuICAgIHRoaXMuYmFuZGFTZWxlY2Npb25hZGEgPSB7a2V5OiBudWxsLCB2YWx1ZTogbnVsbH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGVsaW1pbmFyQ29sdW1uYURpbmFtaWNvKGV2ZW50KSB7XHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XHJcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxyXG4gICAgICBtZXNzYWdlOiAgdGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSX0NPTkZJUk1BUixcclxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcclxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXHJcbiAgICAgIGFjY2VwdDogYXN5bmMgKCkgPT4gIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyApKS50b1Byb21pc2UoKTtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpXHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCgpXHJcbiAgICAgICAgdGhpcy5udWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gZmFsc2U7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yRGluYW1pY28oKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgdmFsaWRhclNlcGFyYWRvcigpe1xyXG4gICAgdmFyIHZhbGlkYWRvcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5yZXBvcnRlRnVlbnRlLnNlcGFyYWRvcik7XHJcbiAgICByZXR1cm4gdmFsaWRhZG9yO1xyXG4gIH1cclxuXHJcbiAgYWN0dWFsaXphclNlcGFyYWRvcigpe1xyXG4gICAgdGhpcy5jbGlja0d1YXJkYXJSZXBvcnRlVGV4dG8gPSB0cnVlO1xyXG4gICAgaWYgKCF0aGlzLnZhbGlkYXJTZXBhcmFkb3IoKSl7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmFjdHVhbGl6YXIoKTtcclxuICB9XHJcblxyXG4gIGNhcmdhckxpc3RhTWFyY2Fkb3Jlc1RleHRvKCl7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge1xyXG4gICAgICB0aXBvUmVwb3J0ZTogdGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5SRVBPUlRFQVJDSElWT1BMQU5PLFxyXG4gICAgICByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsXHJcbiAgICAgIG9yZGVuRGluYW1pY286IHRoaXMuZ2VuZXJhbFBpcGUuU0lcclxuICAgIH0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFNYXJjYWRvcmVzVGV4dG8gPSBkYXRhO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHZlck1hcmNhZG9yVGV4dG8oZXZlbnQpe1xyXG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yVGV4dG8gPSB0cnVlO1xyXG4gICAgdGhpcy5tYXJjYWRvclRleHRvID0gZXZlbnQuZGF0YTtcclxuICB9XHJcblxyXG4gIG51ZXZvTWFyY2Fkb3JUZXh0bygpe1xyXG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yVGV4dG8gPSB0cnVlO1xyXG4gICAgdGhpcy5tYXJjYWRvclRleHRvID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XHJcblx0XHR0aGlzLm1hcmNhZG9yVGV4dG8udGlwb1JlcG9ydGUgPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLlJFUE9SVEVBUkNISVZPUExBTk87XHJcbiAgfVxyXG5cclxuICB2YWxpZGFyTWFyY2Fkb3JUZXh0bygpIDogYm9vbGVhbntcclxuICAgIHZhciB2YWxpZGFkb3I6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMubWFyY2Fkb3JUZXh0by50aXBvR3JhZmljbyk7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvclRleHRvLmFsdG8pO1xyXG4gICAgaWYgKHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuTUFSQ0FET1JURVhUT0ZJSk8gPT0gdGhpcy5tYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvKXtcclxuICAgICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMubWFyY2Fkb3JUZXh0by5mb3JtYXRvKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnJlcG9ydGVGdWVudGVQaXBlLk1BUkNBRE9SVEVYVE9ESU5BTUlDTyA9PSB0aGlzLm1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY28pe1xyXG4gICAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvclRleHRvLmFuY2hvKTtcclxuICAgICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMubWFyY2Fkb3JUZXh0by5yZXBvcnRlQ29sdW1uYSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsaWRhZG9yO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ3VhcmRhck1hcmNhZG9yVGV4dG8oKXtcclxuICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0byA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMudmFsaWRhck1hcmNhZG9yVGV4dG8oKSkge1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0byA9IGZhbHNlO1xyXG4gICAgdGhpcy5tYXJjYWRvclRleHRvLnJlcG9ydGVGdWVudGUgPSB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmU7XHJcbiAgICBpZiAodGhpcy5tYXJjYWRvclRleHRvLmxsYXZlKXtcclxuICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JUZXh0bykpLnRvUHJvbWlzZSgpO1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm1hcmNhZG9yVGV4dG8ubGxhdmUgPSB0aGlzLnV0aWxzU2VydmljZS5nZW5lcmFyTGxhdmUoKTtcclxuICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLm1hcmNhZG9yVGV4dG8pKS50b1Byb21pc2UoKTtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yZXNUZXh0bygpO1xyXG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yVGV4dG8gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGVsaW1pbmFyTWFyY2Fkb1RleHRvKGV2ZW50KXtcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXHJcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxyXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxyXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcclxuICAgICAgYWNjZXB0OiBhc3luYyAoKSA9PiAge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLm1hcmNhZG9yVGV4dG8pKS50b1Byb21pc2UoKTtcclxuICAgICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JUZXh0byA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubWFyY2Fkb3JUZXh0byA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCgpO1xyXG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvcmVzVGV4dG8oKTtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBjYXJnYXJMaXN0YVhNTCgpe1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHtcclxuICAgICAgdGlwb1JlcG9ydGU6ICdYJyxcclxuICAgICAgb3JpZ2VuOiAnWCcsXHJcbiAgICAgIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSxcclxuICAgICAgb3JkZW5EaW5hbWljbzogdGhpcy5nZW5lcmFsUGlwZS5TSVxyXG4gICAgfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YVhNTCA9IGRhdGE7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgbnVldm9NYXJjYWRvclhNTCgpe1xyXG4gICAgdGhpcy5tYXJjYWRvclhNTCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCgpO1xyXG4gICAgdGhpcy5tYXJjYWRvclhNTC50aXBvUmVwb3J0ZSA9ICdYJztcclxuICAgIHRoaXMubWFyY2Fkb3JYTUwub3JpZ2VuID0gJ1gnO1xyXG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yWE1MID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHZlck1hcmNhZG9yWE1MKGV2ZW50KXtcclxuICAgIHRoaXMubWFyY2Fkb3JYTUwgPSBldmVudC5kYXRhO1xyXG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yWE1MID0gdHJ1ZTtcclxuICAgIGlmICAodGhpcy5tYXJjYWRvclhNTC50aXBvID09ICdNUicgfHwgdGhpcy5tYXJjYWRvclhNTC50aXBvID09ICdUQicpe1xyXG4gICAgICB0aGlzLmNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvclhNTCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmFsaWRhck1hcmNhZG9yWE1MKCl7XHJcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yWE1MLmRlc2NyaXBjaW9uKTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yWE1MLnRpcG8pO1xyXG4gICAgcmV0dXJuIHZhbGlkYWRvclxyXG4gIH1cclxuXHJcbiAgZ3VhcmRhck1hcmNhZG9yWE1MKCl7XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yWE1MID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy52YWxpZGFyTWFyY2Fkb3JYTUwoKSl7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tYXJjYWRvclhNTC5yZXBvcnRlRnVlbnRlID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlO1xyXG4gICAgaWYgKHRoaXMubWFyY2Fkb3JYTUwubGxhdmUpe1xyXG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5tYXJjYWRvclhNTCkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XHJcbiAgICAgICAgdGhpcy5tYXJjYWRvclhNTCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCgpO1xyXG4gICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvclhNTCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFYTUwoKTtcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubWFyY2Fkb3JYTUwubGxhdmUgPSB0aGlzLnV0aWxzU2VydmljZS5nZW5lcmFyTGxhdmUoKTtcclxuICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLm1hcmNhZG9yWE1MKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcclxuICAgICAgICB0aGlzLm1hcmNhZG9yWE1MID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XHJcbiAgICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yWE1MID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVhNTCgpO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvclhNTCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZWxpbWluYXJNYXJjYWRvclhNTChldmVudCl7XHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XHJcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxyXG4gICAgICBtZXNzYWdlOiAgdGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSX0NPTkZJUk1BUixcclxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcclxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXHJcbiAgICAgIGFjY2VwdDogYXN5bmMgKCkgPT4gIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5tYXJjYWRvclhNTCkpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUik7XHJcbiAgICAgICAgdGhpcy5tYXJjYWRvclhNTCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCgpO1xyXG4gICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvclhNTCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFYTUwoKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG51ZXZvQ2FtcG9UYWJsYVhNTCgpe1xyXG4gICAgdGhpcy52ZXJSZXBvcnRlTWFyY2Fkb3JEZXRhbGxlWE1MID0gdHJ1ZTtcclxuICAgIHRoaXMuY2FtcG9NYXJjYWRvckluc2VydGFyWE1MID0gbmV3IFJlcG9ydGVUYWJsYU1vZGVsKCk7XHJcbiAgICB0aGlzLmNhbXBvTWFyY2Fkb3JJbnNlcnRhclhNTC5yZXBvcnRlTWFyY2Fkb3IgPSB0aGlzLm1hcmNhZG9yWE1MLmxsYXZlXHJcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yWE1MKCkge1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIHsgcmVwb3J0ZU1hcmNhZG9yOiB0aGlzLm1hcmNhZG9yWE1MLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YUNhbXBvc01hcmNhZG9yWE1MID0gZGF0YTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBhc3luYyBjYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3JYTUxBc3luYygpIHtcclxuICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IGZhbHNlO1xyXG4gICAgdGhpcy5saXN0YUNhbXBvc01hcmNhZG9yWE1MID0gYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIHsgcmVwb3J0ZU1hcmNhZG9yOiB0aGlzLm1hcmNhZG9yWE1MLmxsYXZlfSkpLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhckNhbXBvTWFyY2Fkb3JYTUwoY2FtcG9NYXJjYWRvcil7XHJcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9yLmNhbXBvRnVlbnRlKTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9yLm1hcmNhZG9yKTtcclxuICAgIHJldHVybiB2YWxpZGFkb3I7XHJcbiAgfVxyXG5cclxuICBhZ3JlZ2FyQ2FtcG9NYXJjYWRvclhNTChjYW1wbzogUmVwb3J0ZVRhYmxhTW9kZWwpe1xyXG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy52YWxpZGFyQ2FtcG9NYXJjYWRvclhNTChjYW1wbykpe1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJylcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGNhbXBvLmxsYXZlKXtcclxuICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIGNhbXBvKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcclxuICAgICAgICB0aGlzLmNhbXBvTWFyY2Fkb3JJbnNlcnRhclhNTCA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbCgpO1xyXG4gICAgICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yWE1MKCk7XHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjYW1wby5jb2x1bW5hID0gMDtcclxuICAgICAgY2FtcG8ubGxhdmUgPSB0aGlzLnV0aWxzU2VydmljZS5nZW5lcmFyTGxhdmUoKTtcclxuICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCBjYW1wbykpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfR1VBUkRBUik7XHJcbiAgICAgICAgY2FtcG8gPSBuZXcgUmVwb3J0ZVRhYmxhTW9kZWwoKTtcclxuICAgICAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvclhNTCgpO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MID0gZmFsc2U7XHJcbiAgICB0aGlzLnZlclJlcG9ydGVNYXJjYWRvckRldGFsbGVYTUwgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGVsaW1pbmFyQ2FtcG9NYXJjYWRvclhNTChldmVudCwgb2JqZXRvKXsgXHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XHJcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxyXG4gICAgICBtZXNzYWdlOiAgdGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSX0NPTkZJUk1BUixcclxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcclxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXHJcbiAgICAgIGFjY2VwdDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCBvYmpldG8pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpO1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3JYTUwoKTtcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgY2FtYmlhclRhYkNvbHVtbmFyaW8oZXZlbnQpe1xyXG4gICAgc3dpdGNoIChldmVudC5pbmRleCkge1xyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgdGhpcy5jYXJnYXJSZXBvcnRlQ29sdW1uYXJpbygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgICAgdGhpcy5jYXJnYXJEYXRvc0FkaWNpb25hbGVzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgICB0aGlzLmNhcmdhck1hcmNhZG9yZXNDb2x1bW5hcmlvKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYXJnYXJNYXJjYWRvcmVzQ29sdW1uYXJpbygpIHtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge3JlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubWFyY2Fkb3Jlc0NvbHVtbmFyaW8gPSBkYXRhO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG5cclxuICBjYXJnYXJEYXRvc0FkaWNpb25hbGVzKCkge1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9EVE8nLCBudWxsLCBmYWxzZSwge3JlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgZmlsdHJvQ29sdW1uYUJhc2ljYTogJ04nfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5jb2x1bW5hc0FkaWNpb25hbGVzID0gZGF0YTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBjYXJnYXJSZXBvcnRlQ29sdW1uYXJpbygpe1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9EVE8nLCBudWxsLCBmYWxzZSwge3JlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgZmlsdHJvQ29sdW1uYUJhc2ljYTogJ1MnfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YVJlcG9ydGVDb2x1bW5hcmlvID0gZGF0YTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBjYXJnYXJHcmFmaWNhc0NvbHVtbmFzKCkge1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFEVE8nLCBudWxsLCBmYWxzZSwge3JlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMucGFnaW5hZG9yQ29sdW1uYXMgPSBkYXRhO1xyXG4gICAgfSlcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVCYW5kYURUTycsIG51bGwsIGZhbHNlLCB7cmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCB0b3RhbGVzOiAnQyd9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLnBhZ2luYWRvckNvbG9yZXNHcmFmaWNhID0gZGF0YTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICB2YWxpZGFyRXhpc3RlSmFzcGVyKCl7XHJcbiAgICB0aGlzLmNhcmdhckFyY2hpdm8uZGVzY2FyZ2FyQXJjaGl2byh0aGlzLmVuY3JpcHRhZG9yQXJjaGl2by5lbmNyaXB0YXIoJ3JlcG9ydGVzLycgKyB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUgKyAnLmpyeG1sJyksICdydXRhX3BsYW50aWxsYXMnLCB0aGlzLmFwbGljYWNpb24pLnN1YnNjcmliZShcclxuICAgICAgKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5leGlzdGVKYXNwZXIgPSB0cnVlO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICB0aGlzLmV4aXN0ZUphc3BlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICApIFxyXG4gIH1cclxuXHJcbiAgdmVyUmVwb3J0ZUNvbHVtbmFyaW8oZXZlbnQpe1xyXG4gICAgdGhpcy5jb2x1bW5hQmFzaWNhID0gZXZlbnQuZGF0YTtcclxuICAgIHRoaXMudmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpbyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBudWV2b0NvbHVtbmFCYXNpY2EoKXtcclxuICAgIHRoaXMuY29sdW1uYUJhc2ljYSA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01vZGVsKCk7XHJcbiAgICB0aGlzLmNvbHVtbmFCYXNpY2EucmVwb3J0ZUZ1ZW50ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZTtcclxuICAgIHRoaXMudmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpbyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICB2YWxpZGFyQ29sdW1uYUJhc2ljYSgpe1xyXG4gICAgdmFyIHZhbGlkYWRvcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS5ub21icmUpO1xyXG4gICAgdmFsaWRhZG9yID0gIHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFCYXNpY2EudGlwbyk7XHJcbiAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS5yZXBvcnRlQ29sdW1uYSk7XHJcbiAgICBpZiAodmFsaWRhZG9yKXtcclxuICAgICAgaWYgKHRoaXMuaXNNb3N0cmFyT3JkZW4oKSl7XHJcbiAgICAgICAgdmFsaWRhZG9yID0gIHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFCYXNpY2Eub3JkZW4pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmlzTW9zdHJhck9yZGVuQ29uc3VsdGEoKSl7XHJcbiAgICAgICAgdmFsaWRhZG9yID0gIHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFCYXNpY2Eub3JkZW5Db25zdWx0YSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fQ0VMREEgPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG8pIHtcclxuICAgICAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS5vcGVyYWNpb24pO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fQ09MVU1OQT09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvKSB7XHJcbiAgICAgICAgdmFsaWRhZG9yID0gIHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uSG9yaXpvbnRhbCk7XHJcbiAgICAgICAgdmFsaWRhZG9yID0gIHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uVmVydGljYWwpO1xyXG4gICAgICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLmNvbHVtbmFPcGVyYWNpb25WZXJ0aWNhbCk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19MQUJFTCA9PSB0aGlzLmNvbHVtbmFCYXNpY2EudGlwbykge1xyXG4gICAgICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLm9yZGVyQnkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsaWRhZG9yO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgdmVyaWZpY2FyQ29sdW1uYXNWYWxpZGFzKHJlcG9ydGVDb2x1bW5hcmlvRFRPKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB2YXIgdGlwbz1yZXBvcnRlQ29sdW1uYXJpb0RUTy50aXBvO1xyXG5cdFx0aWYodGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19GSUxBID09IHJlcG9ydGVDb2x1bW5hcmlvRFRPLnRpcG8pe1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHRcdHZhciBmaWx0cm89bmV3ICBSZXBvcnRlQ29sdW1uYXJpb01vZGVsKCk7XHJcblx0XHRmaWx0cm8ucmVwb3J0ZUZ1ZW50ZSA9IHJlcG9ydGVDb2x1bW5hcmlvRFRPLnJlcG9ydGVGdWVudGU7XHJcblx0XHRmaWx0cm8uZGlmZXJlbnRlQ29sdW1uYXJpbyA9IHJlcG9ydGVDb2x1bW5hcmlvRFRPLmxsYXZlVGFibGE7XHJcblx0XHRmaWx0cm8udGlwbyA9IHRpcG87XHJcblx0XHR2YXIgY2FudGlkYWQ9IGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuY2FudGlkYWRSZWdpc3Ryb3MobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9EVE8nLCBudWxsLCBmYWxzZSwgZmlsdHJvKSkudG9Qcm9taXNlKCk7XHJcblx0XHRpZihjYW50aWRhZD09MCl7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0aWYodGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19DT0xVTU5BID09IHJlcG9ydGVDb2x1bW5hcmlvRFRPLnRpcG8pe1xyXG5cdFx0XHRcdHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dXYXJuaW5nKFwiRWwgcmVwb3J0ZSBzb2xvIHB1ZWRlIGNvbnRlbmVyIDEgcmVnaXN0cm8gY29uIHRpcG8gXCIrdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19DT0xVTU5BX0RFU0MpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuXHRcdH1lbHNlIGlmKHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fQ0VMREEgPT0gcmVwb3J0ZUNvbHVtbmFyaW9EVE8udGlwbyl7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dXYXJuaW5nKFwiRWwgcmVwb3J0ZSBzb2xvIHB1ZWRlIGNvbnRlbmVyIDEgcmVnaXN0cm8gY29uIHRpcG8gXCIrdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19DRUxEQV9ERVNDKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBhc3luYyBndWFyZGFyQ29sdW1uYUJhc2ljYSgpe1xyXG4gICAgdGhpcy5jbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpbyA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMudmFsaWRhckNvbHVtbmFCYXNpY2EoKSl7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAoYXdhaXQgdGhpcy52ZXJpZmljYXJDb2x1bW5hc1ZhbGlkYXModGhpcy5jb2x1bW5hQmFzaWNhKSl7XHJcbiAgICAgIGlmICh0aGlzLmNvbHVtbmFCYXNpY2EubGxhdmVUYWJsYSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuY29sdW1uYUJhc2ljYSkpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHRoaXMuY29sdW1uYUJhc2ljYSA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01vZGVsKCk7XHJcbiAgICAgICAgdGhpcy52ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb0RUTycsIG51bGwsIGZhbHNlLCB0aGlzLmNvbHVtbmFCYXNpY2EpKS50b1Byb21pc2UoKTtcclxuICAgICAgICB0aGlzLmNvbHVtbmFCYXNpY2EgPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCgpO1xyXG4gICAgICAgIHRoaXMudmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpbyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2FyZ2FyUmVwb3J0ZUNvbHVtbmFyaW8oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGVsaW1pbmFyQ29sdW1uYUJhc2ljYShldmVudCl7IFxyXG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xyXG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcclxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXHJcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLmdlbmVyYWxQaXBlLlNJX0RFU0MsXHJcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxyXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb0RUTycsIG51bGwsIGZhbHNlLCB0aGlzLmNvbHVtbmFCYXNpY2EpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpO1xyXG4gICAgICAgICAgdGhpcy52ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmNvbHVtbmFCYXNpY2EgPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCgpO1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJSZXBvcnRlQ29sdW1uYXJpbygpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBudWV2YUNvbHVtbmFBZGljaW9uYWwoKSB7XHJcbiAgICB0aGlzLmNvbHVtbmFBZGljaW9uYWwgPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCgpO1xyXG4gICAgdGhpcy5jb2x1bW5hQWRpY2lvbmFsLnJlcG9ydGVGdWVudGUgPSB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmU7XHJcbiAgICB0aGlzLmNvbHVtbmFBZGljaW9uYWwudGlwbyA9IHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fQURJQ0lPTkFMO1xyXG4gICAgdGhpcy52ZXJOdWV2b0NvbHVtbmFBZGljaW9uYWwgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdmVyRGV0YWxsZUFkaWNpb25hbChldmVudCkge1xyXG4gICAgdGhpcy5jb2x1bW5hQWRpY2lvbmFsID0gZXZlbnQuZGF0YTtcclxuICAgIHRoaXMudmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXJDb2x1bW5hQWRpY2lvbmFsKCkge1xyXG4gICAgdmFyIHZhbGlkYWRvcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQWRpY2lvbmFsLm5vbWJyZSk7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQWRpY2lvbmFsLnNpbnRheGlzKTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFBZGljaW9uYWwub3JkZW4pO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUFkaWNpb25hbC5vcmRlckJ5KTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFBZGljaW9uYWwub3JkZW5Db25zdWx0YSk7XHJcbiAgICByZXR1cm4gdmFsaWRhZG9yO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ3VhcmRhckNvbHVtbmFBZGljaW9uYWwoKSB7XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWwgPSB0cnVlO1xyXG4gICAgaWYgKCF0aGlzLnZhbGlkYXJDb2x1bW5hQWRpY2lvbmFsKCkpe1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvbHVtbmFBZGljaW9uYWwubGxhdmVUYWJsYSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb0RUTycsIG51bGwsIGZhbHNlLCB0aGlzLmNvbHVtbmFBZGljaW9uYWwpKS50b1Byb21pc2UoKTtcclxuICAgICAgdGhpcy5jb2x1bW5hQWRpY2lvbmFsID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwoKTtcclxuICAgICAgdGhpcy52ZXJOdWV2b0NvbHVtbmFBZGljaW9uYWwgPSBmYWxzZTtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuY29sdW1uYUFkaWNpb25hbCkpLnRvUHJvbWlzZSgpO1xyXG4gICAgICB0aGlzLmNvbHVtbmFBZGljaW9uYWwgPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCgpO1xyXG4gICAgICB0aGlzLnZlck51ZXZvQ29sdW1uYUFkaWNpb25hbCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfR1VBUkRBUik7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWwgPSBmYWxzZTtcclxuICAgIHRoaXMuY2FyZ2FyRGF0b3NBZGljaW9uYWxlcygpO1xyXG4gIH1cclxuXHJcbiAgZWxpbWluYXJDb2x1bW5hQWRpY2lvbmFsKGV2ZW50KSB7XHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XHJcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxyXG4gICAgICBtZXNzYWdlOiAgdGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSX0NPTkZJUk1BUixcclxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcclxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXHJcbiAgICAgIGFjY2VwdDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuY29sdW1uYUFkaWNpb25hbCkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUik7XHJcbiAgICAgICAgICB0aGlzLnZlck51ZXZvQ29sdW1uYUFkaWNpb25hbCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5jb2x1bW5hQWRpY2lvbmFsID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwoKTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyRGF0b3NBZGljaW9uYWxlcygpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBudWV2b01hcmNhZG9yQ29sdW1uYXJpbygpIHtcclxuICAgIHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JNb2RlbCgpO1xyXG4gICAgdGhpcy5tYXJjYWRvckNvbHVtbmFyaW8ucmVwb3J0ZUZ1ZW50ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZTtcclxuICAgIHRoaXMudmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW8gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdmVyRGV0YWxsZU1hcmNhZG9yQ29sdW1uYXJpbyhldmVudCkge1xyXG4gICAgdGhpcy5tYXJjYWRvckNvbHVtbmFyaW8gPSBldmVudC5kYXRhO1xyXG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yQ29sdW1uYXJpbyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICB2YWxpZGFyTWFyY2Fkb3JDb2x1bW5hcmlvKCkge1xyXG4gICAgdmFyIHZhbGlkYWRvcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvckNvbHVtbmFyaW8ubWFyY2Fkb3IpO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvLnRpcG8pO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvLnRleHRvUmVnaXN0cm8pO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvLmRlc2NyaXBjaW9uKTtcclxuICAgIHJldHVybiB2YWxpZGFkb3I7XHJcbiAgfVxyXG5cclxuICBhc3luYyBndWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvKCkge1xyXG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW8gPSB0cnVlO1xyXG4gICAgaWYgKCF0aGlzLnZhbGlkYXJNYXJjYWRvckNvbHVtbmFyaW8oKSl7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvLmxsYXZlVGFibGEpIHtcclxuICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLm1hcmNhZG9yQ29sdW1uYXJpbykpLnRvUHJvbWlzZSgpO1xyXG4gICAgICB0aGlzLm1hcmNhZG9yQ29sdW1uYXJpbyA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01hcmNhZG9yTW9kZWwoKTtcclxuICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yQ29sdW1uYXJpbyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLm1hcmNhZG9yQ29sdW1uYXJpbykpLnRvUHJvbWlzZSgpO1xyXG4gICAgICB0aGlzLm1hcmNhZG9yQ29sdW1uYXJpbyA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01hcmNhZG9yTW9kZWwoKTtcclxuICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yQ29sdW1uYXJpbyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfR1VBUkRBUik7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpbyA9IGZhbHNlO1xyXG4gICAgdGhpcy5jYXJnYXJNYXJjYWRvcmVzQ29sdW1uYXJpbygpO1xyXG4gIH1cclxuXHJcbiAgZWxpbWluYXJNYXJjYWRvckNvbHVtbmFyaW8oZXZlbnQpIHtcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXHJcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxyXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxyXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcclxuICAgICAgYWNjZXB0OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLm1hcmNhZG9yQ29sdW1uYXJpbykpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUik7XHJcbiAgICAgICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLm1hcmNhZG9yQ29sdW1uYXJpbyA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01hcmNhZG9yTW9kZWwoKTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyTWFyY2Fkb3Jlc0NvbHVtbmFyaW8oKTtcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGd1YXJkYXJHcmFmaWNvKCkge1xyXG4gICAgdGhpcy5hY3R1YWxpemFyKCk7XHJcbiAgICB0aGlzLnBhZ2luYWRvckNvbHVtbmFzLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hRFRPJywgbnVsbCwgZmFsc2UsIGRhdGEpKS5zdWJzY3JpYmUoZGF0YSA9PiB7fSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHZlckdyYWZpY28oKSB7XHJcbiAgICB0aGlzLnJlcG9ydGVTZXJ2aWNlLnZlckdyYWZpY28oe2xsYXZlUmVwb3J0ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlfSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICBsZXQgY29sdW1uYSA9IHRoaXMuZGFzaGJvYXJkU2VydmljZS5jYXJnYXJHcmFmaWNhKHthY2Npb246IGRhdGEudGlwb0dyYWZpY28sIGRhdG9zR3JhZmljYTogZGF0YX0pO1xyXG4gICAgICB0aGlzLmdyYWZpY2EgPSBjb2x1bW5hO1xyXG4gICAgICBsZXQgcmVzcHVlc3RhID0gdGhpcy5kYXNoYm9hcmRQaXBlLlRJUE9fR1JBRklDT19DSEFSVC5maWx0ZXIoZGF0YSA9PiBkYXRhLmNvZGlnbyA9PSBjb2x1bW5hLmRhdG9zR3JhZmljYS50aXBvR3JhZmljbyk7XHJcbiAgICAgICAgICAgIGlmIChyZXNwdWVzdGEubGVuZ3RoIDwgMCkge1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb2x1bW5hLnRpcG9HcmFmaWNvID0gcmVzcHVlc3RhWzBdLmNvZGlnb0NoYXJ0O1xyXG4gICAgICB0aGlzLnRpcG9HcmFmaWNhID0gIGNvbHVtbmEudGlwb0dyYWZpY287XHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMudGlwb0dyYWZpY2EpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgbnVldm9Db2xvckNhdGVnb3JpYSgpe1xyXG4gICAgdGhpcy5jb2xvckNhdGVnb3JpYSA9IG5ldyBSZXBvcnRlQmFuZGFNb2RlbCgpO1xyXG4gICAgdGhpcy5jb2xvckNhdGVnb3JpYS5iYW5kYSA9ICcjRkZGRkZGJztcclxuICAgIHRoaXMudmVyQ29sb3JDYXRlZ29yaWFEZXRhbGxlID0gdHJ1ZTtcclxuICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBjYW5jZWxhckNvbG9yQ2F0ZWdvcmlhKCkge1xyXG4gICAgdGhpcy5jb2xvckNhdGVnb3JpYSA9IG5ldyBSZXBvcnRlQmFuZGFNb2RlbCgpO1xyXG4gICAgdGhpcy52ZXJDb2xvckNhdGVnb3JpYURldGFsbGUgPSBmYWxzZTtcclxuICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhckNvbG9yQ2F0ZWdvcmlhKGNvbG9yKXtcclxuICAgIHZhciB2YWxpZGFkb3I6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbG9yLnRpdHVsbylcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2xvci5iYW5kYSlcclxuICAgIHJldHVybiB2YWxpZGFkb3I7XHJcbiAgfVxyXG5cclxuICBhZ3JlZ2FyQ29sb3JDYXRlZ29yaWEoY29sb3Ipe1xyXG4gICAgdGhpcy5jbGlja0d1YXJkYXJDb2xvckNhdGVnb3JpYSA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMudmFsaWRhckNvbG9yQ2F0ZWdvcmlhKGNvbG9yKSl7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIWNvbG9yLmxsYXZlVGFibGEpe1xyXG4gICAgICBjb2xvci50b3RhbGVzID0gJ0MnXHJcbiAgICAgIGNvbG9yLnJlcG9ydGVGdWVudGUgPSB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmVcclxuICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVCYW5kYURUTycsIG51bGwsIGZhbHNlLCBjb2xvcikpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfR1VBUkRBUik7XHJcbiAgICAgICAgY29sb3IgPSBuZXcgUmVwb3J0ZUJhbmRhTW9kZWwoKTtcclxuICAgICAgICB0aGlzLmNhcmdhckdyYWZpY2FzQ29sdW1uYXMoKTtcclxuICAgICAgICB0aGlzLnZlckNvbG9yQ2F0ZWdvcmlhRGV0YWxsZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2xpY2tHdWFyZGFyQ29sb3JDYXRlZ29yaWEgPSBmYWxzZTtcclxuICAgICAgfSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQmFuZGFEVE8nLCBudWxsLCBmYWxzZSwgY29sb3IpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XHJcbiAgICAgICAgICB0aGlzLmNhcmdhckdyYWZpY2FzQ29sdW1uYXMoKTtcclxuICAgICAgICAgIHRoaXMudmVyQ29sb3JDYXRlZ29yaWFEZXRhbGxlID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmNsaWNrR3VhcmRhckNvbG9yQ2F0ZWdvcmlhID0gZmFsc2U7XHJcbiAgICAgICAgICBjb2xvciA9IG5ldyBSZXBvcnRlQmFuZGFNb2RlbCgpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBlbGltaW5hckNvbG9yQ2F0ZWdvcmlhKGV2ZW50LCBjb2xvcil7XHJcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSB0cnVlO1xyXG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xyXG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcclxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXHJcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLmdlbmVyYWxQaXBlLlNJX0RFU0MsXHJcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxyXG4gICAgICBhY2NlcHQ6ICgpID0+IHsgXHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUJhbmRhRFRPJywgbnVsbCwgZmFsc2UsIGNvbG9yKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyR3JhZmljYXNDb2x1bW5hcygpO1xyXG4gICAgICAgICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gZmFsc2U7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGFzeW5jIGNhbmNlbGFyRWRpY2lvbkNvbG9yKCkgeyBcclxuICAgIHRoaXMuY2FyZ2FyR3JhZmljYXNDb2x1bW5hcygpOyAgIFxyXG4gICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNGaWpvKCk6Ym9vbGVhbntcclxuICAgIHJldHVybiB0aGlzLmZpbHRyb09yaWdlbkZ1ZW50ZSh0aGlzLnJlcG9ydGVGdWVudGVQaXBlLkZJSk8pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzU3FsKCk6Ym9vbGVhbntcclxuICAgIHJldHVybiB0aGlzLmZpbHRyb09yaWdlbkZ1ZW50ZSh0aGlzLnJlcG9ydGVGdWVudGVQaXBlLlNRTCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuXHQgKiBQZXJtaXRlIGNvbm9jZXIgc2kgc2UgZGViZSBwcmVzZW50YXIgZW4gbGEgaW50ZXJmYXogbG9zIGNhbXBvcyByZWZlcmVudGVzIGEgb3JkZW4gY29uc3VsdGFcclxuXHQgKiBAcmV0dXJuIFNpIHNlIGRlYmUgbW9zdHJhciBzZSByZXRvcm5hcmEgdHJ1ZSwgZGUgbG8gY29udHJhcmlvIGZhbHNlXHJcblx0ICovXHJcblx0aXNNb3N0cmFyT3JkZW5Db25zdWx0YSgpe1xyXG5cdFx0cmV0dXJuIHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fRklMQSA9PSB0aGlzLmNvbHVtbmFCYXNpY2EudGlwbztcclxuXHR9XHJcblx0XHJcblxyXG5cdGlzTW9zdHJhck9yZGVuKCl7XHJcblx0XHRyZXR1cm4gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19GSUxBID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvfHxcclxuXHRcdFx0XHR0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0NPTFVNTkEgPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG98fHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fTEFCRUwgPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG87XHJcblx0fVxyXG5cclxuXHRpc1RpcG9Db2x1bW5hKCl7XHJcblx0XHRyZXR1cm4gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19DT0xVTU5BID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvO1xyXG5cdH1cclxuXHRcclxuXHJcblx0aXNUaXBvRmlsYSgpe1xyXG5cdFx0cmV0dXJuIHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fRklMQSA9PSB0aGlzLmNvbHVtbmFCYXNpY2EudGlwbztcdFxyXG5cdH1cclxuXHJcblx0aXNUaXBvTGFiZWwoKXtcclxuXHRcdHJldHVybiB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0xBQkVMID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvO1x0XHJcblx0fVxyXG5cclxuICBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0Z1ZW50ZSgpOmJvb2xlYW57XHJcbiAgICByZXR1cm4gdGhpcy5maWx0cm9PcmlnZW5GdWVudGUodGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5GVUVOVEUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZpbHRyb09yaWdlbkZ1ZW50ZSh0aXBvOnN0cmluZyk6Ym9vbGVhbntcclxuICAgIHJldHVybiB0aGlzLnJlcG9ydGVGdWVudGUub3JpZ2VuRnVlbnRlID09IHRpcG87XHJcbiAgfVxyXG59IiwiPHAtdGFiVmlldyAob25DaGFuZ2UpPVwiY2FtYmlhclRhYigkZXZlbnQpXCI+XHJcbiAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7eydleGNlbCcgfCB0cmFuc2xhdGUgfX1cIiBbc2VsZWN0ZWRdPVwidHJ1ZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmb250LXNlbWlib2xkXCI+e3snZGViZScgfCB0cmFuc2xhdGV9fSB7eydpbmRpY2FyJyB8IHRyYW5zbGF0ZX19IHt7J3BsYW50aWxsYScgfCB0cmFuc2xhdGV9fSB7eyd5JyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAge3snaG9qYScgfCB0cmFuc2xhdGV9fSB7eydwYXJhJyB8IHRyYW5zbGF0ZX19IHt7J3F1ZScgfCB0cmFuc2xhdGV9fSB7eydlc3RhJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAge3snb3BjaW9uJyB8IHRyYW5zbGF0ZX19IHt7J3NlJyB8IHRyYW5zbGF0ZX19IHt7J2FjdGl2ZScgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhIFtyZWFkb25seV09XCJmYWxzZVwiIFtzaG93RGlhbG9nXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJyZXBvcnRlRnVlbnRlLmFyY2hpdm9Ub2RvID8gcmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvVG9kbzogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V4dGVuc2lvbmVzXT1cIid4bHM7eGxzeCdcIiBbbW9zdHJhcm9ibGljYXJnb109XCJ0cnVlXCIgW2xhYmVscmFyXT1cIidwbGFudGlsbGEnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvKCRldmVudClcIj48L2FwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmhvamFFeGNlbFwiIHNpemU9XCIyNVwiIG1heGxlbmd0aD1cIjIwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbm9tYnJlJyB8IHRyYW5zbGF0ZSB9fSB7eydkZScgfCB0cmFuc2xhdGUgfX0ge3snbGEnIHwgdHJhbnNsYXRlIH19IHt7J2hvamEnIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUgfX08L2xhYmVsPiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0NpZnJhZG9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmNpZnJhZG9FeGNlbFwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cImxsYXZlVGFibGFcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwb2NpZnJhZG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcmVmcmVzaFwiIGxhYmVsPVwie3snbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdHVhbGl6YXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8cC1waWNrTGlzdCBbc291cmNlXT1cImxpc3RhRXhjZWxcIiBbdGFyZ2V0XT1cImxpc3RhTm9FeGNlbFwiIHNvdXJjZUhlYWRlcj1cIkFzb2NpYWRvXCIgc291cmNlRmlsdGVyUGxhY2Vob2xkZXI9XCJBc29jaWFkb1wiXHJcbiAgICAgICAgICAgIHRhcmdldEhlYWRlcj1cIkRlc2Fzb2NpYWRvXCIgW2RyYWdkcm9wXT1cInRydWVcIiBbcmVzcG9uc2l2ZV09XCJ0cnVlXCIgdGFyZ2V0RmlsdGVyUGxhY2Vob2xkZXI9XCJEZXNhc29jaWFkb1wiXHJcbiAgICAgICAgICAgIGZpbHRlckJ5PVwic2ludGF4aXNcIiAob25Tb3VyY2VSZW9yZGVyKT1cIm1vdmVyQUFzb2NpYWRvKCRldmVudClcIlxyXG4gICAgICAgICAgICAob25Nb3ZlQWxsVG9UYXJnZXQpPVwibW92ZXJBRGVzYXNvY2lhZG8oJGV2ZW50KVwiIChvbk1vdmVBbGxUb1NvdXJjZSk9XCJtb3ZlckFBc29jaWFkbygkZXZlbnQpXCJcclxuICAgICAgICAgICAgKG9uTW92ZVRvVGFyZ2V0KT1cIm1vdmVyQURlc2Fzb2NpYWRvKCRldmVudClcIiAob25Nb3ZlVG9Tb3VyY2UpPVwibW92ZXJBQXNvY2lhZG8oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWV4Y2VsIHBUZW1wbGF0ZT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ZXhjZWwubm9tYnJlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9wLXBpY2tMaXN0PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICA8aDEgY2xhc3M9XCJ0ZXh0LXhsXCI+e3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGV9fTwvaDE+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cInAtYnV0dG9uLXNlY29uZGFyeSBmb250LXNlbWlib2xkXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJudWV2b01hcmNhZG9yRXhjZWwoKVwiIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JFeGNlbFwiPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kICBtYi0xXCIgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yRXhjZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwidmVyTnVldm9NYXJjYWRvckV4Y2VsID0gZmFsc2VcIiBsYWJlbD0gXCJ7eydsaXN0YWRvJyB8IHRyYW5zbGF0ZX19IHt7J21hcmNhZG9yZXMnIHwgdHJhbnNsYXRlfX1cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YU1hcmNhZG9yRXhjZWxcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBkYXRhS2V5PVwibGxhdmVUYWJsYVwiIHNlbGVjdGlvbk1vZGU9XCJzaW5nbGVcIiBbc2VsZWN0aW9uXT1cInJlcG9ydGVNYXJjYWRvckV4Y2VsXCIgW3Jvd3NdPVwiMTBcIlxyXG4gICAgICAgICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJsaXN0YU1hcmNhZG9yRXhjZWwubGVuZ3RoXCIgW3BhZ2luYXRvcl09XCJsaXN0YU1hcmNhZG9yRXhjZWwubGVuZ3RoID4gMTBcIlxyXG4gICAgICAgICAgICAgICAgKG9uUm93U2VsZWN0KT1cInZlckRldGFsbGVNYXJjYWRvckV4Y2VsKCRldmVudClcIiAob25Sb3dVbnNlbGVjdCk9XCJ2ZXJEZXRhbGxlTWFyY2Fkb3JFeGNlbCgkZXZlbnQpXCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvckV4Y2VsXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snZGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LW1hcmNhZG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ciBbcFNlbGVjdGFibGVSb3ddPVwibWFyY2Fkb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY2Fkb3IuZGVzY3JpcGNpb259fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPnt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9wLXRhYmxlPlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgbXQtM1wiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvckV4Y2VsXCI+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtdC0zXCI+PGkgY2xhc3M9XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYm9va1wiPjwvaT57eydkZXRhbGxlJyB8IHRyYW5zbGF0ZX19PC9oNT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC00IFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybU1hcmNhZG9yRXhjZWxcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgcC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwY2lvblwiIHNpemU9XCIyNVwiIG1heGxlbmd0aD1cIjQwMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Rlc2NyaXBjaW9uJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cIm1hcmNhZG9yXCIgc2l6ZT1cIjI1XCIgbWF4bGVuZ3RoPVwiNDAwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbWFyY2Fkb3InIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJbe2xhYmVsOiAnSW1hZ2VuIEZpamEnLCB2YWx1ZTogJ0lGJ30sIHtsYWJlbDogJ01hcmNhZG9yJywgdmFsdWU6ICdNQSd9XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGZvcm1Db250cm9sTmFtZT1cInRpcG9cIiBvcHRpb25MYWJlbD1cImxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTEyXCIgW2hpZGRlbl09XCJlc0ltYWdlbkZpamFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiICBwSW5wdXRUZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJ0ZXh0b1JlZ2lzdHJvXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3ZhbG9yJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cImVzTWFyY2Fkb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93blxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiW3tsYWJlbDogJ1VuaWNhJywgdmFsdWU6ICdVJ30sIHtsYWJlbDogJ0NhZGEgRW1wcmVzYScsIHZhbHVlOiAnQyd9XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGZvcm1Db250cm9sTmFtZT1cIm9yaWdlblwiIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29yaWdlbicgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJlc01hcmNhZG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYSBbcmVhZG9ubHldPVwiZmFsc2VcIiBbc2hvd0RpYWxvZ109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRleHRvUmVnaXN0cm9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwicmVwb3J0ZU1hcmNhZG9yRXhjZWwudGV4dG9SZWdpc3RybyA/IHJlcG9ydGVNYXJjYWRvckV4Y2VsLnRleHRvUmVnaXN0cm86ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V4dGVuc2lvbmVzXT1cIidqcGc7cG5nJ1wiIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvTWFyY2Fkb3JFeGNlbCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BpZWRhZF09XCIncnV0YV9yZWN1cnNvcydcIiAgW2xhYmVscmFyXT1cIigncmVjdXJzb3MnIHwgdHJhbnNsYXRlKVwiIFtsYWJlbGFyY2hdPVwiJ3JlY3Vyc28nIHwgdHJhbnNsYXRlXCIgW21vc3RyYXJYXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9zdHJhcm9ibGljYXJnb109XCIhKCF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8ocmVwb3J0ZU1hcmNhZG9yRXhjZWwudGV4dG9SZWdpc3RybykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JFeGNlbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYW5leG9Qcm9waWVkYWRdPVwicmVwb3J0ZU1hcmNhZG9yRXhjZWwub3JpZ2VuID09J0MnID8gbGxhdmVFbXByZXNhOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9waWVkYWREZVNpc3RlbWFdPVwidHJ1ZVwiPjwvYXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvckV4Y2VsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiAgcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMge3tyZXBvcnRlTWFyY2Fkb3JFeGNlbC5sbGF2ZSA/ICdnbHlwaGljb25zLXJlZnJlc2gnIDogJ2dseXBoaWNvbnMtZmxvcHB5LXNhdmUnfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7e3JlcG9ydGVNYXJjYWRvckV4Y2VsLmxsYXZlID8gKCdsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlKSA6ICgnbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZSl9fVwiIChjbGljayk9XCJndWFyZGFyTWFyY2Fkb3JFeGNlbCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWJpblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckV4Y2VsLmxsYXZlICE9IG51bGxcIiBsYWJlbD1cInt7J2xpbmtfZWxpbWluYXInIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVsaW1pbmFyTWFyY2Fkb3JFeGNlbCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9wLXRhYlBhbmVsPlxyXG4gICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3sncGxhbnRpbGxhJyB8IHRyYW5zbGF0ZSB9fVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhU2lOb1wiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS51bmljb0FyY2hpdm9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydzb3BvcnRlJyB8IHRyYW5zbGF0ZSB9fSB7eyd1bmljbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFTaU5vXCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmRlc2NhcmdhckZ1ZW50ZVwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Rlc2NhcmdhcmRvYycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFTaU5vXCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmdlbmVyYXJQaW5cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydnZW5lcmFycGluJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUNvbHVtbmFzXCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmNhbXBvQWdydXBhY2lvblBsYW5pbGxhXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhZ3J1cGFycG9yJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5ub21icmVBZ3J1cGFjaW9uUGxhbmlsbGFcIiBzaXplPVwiMjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J25vbWJyZWFyY2hpdm9hZ3J1cGFjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9DaWZyYWRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5jaWZyYWRvUGxhbmlsbGFcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jaWZyYWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlRnVlbnRlLnVuaWNvQXJjaGl2byA9PSAnTidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYSBbcmVhZG9ubHldPVwiZmFsc2VcIiBbc2hvd0RpYWxvZ109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwicmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvSW5kaXZpZHVhbCA/IHJlcG9ydGVGdWVudGUuYXJjaGl2b0luZGl2aWR1YWw6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbHJhcl09XCInYXJjaGl2bycgfCB0cmFuc2xhdGVcIiBbbGFiZWxhcmNoXT1cIidhcmNoaXZvJyB8IHRyYW5zbGF0ZVwiIFttb3N0cmFyb2JsaWNhcmdvXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0ZWQpPVwib2J0ZW5lckFyY2hpdm9QbGFuaWxsYSgkZXZlbnQpXCI+PC9hcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGE+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcmVmcmVzaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImFjdHVhbGl6YXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8cC10YWJWaWV3ID5cclxuICAgICAgICAgICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGUgfX1cIiBbc2VsZWN0ZWRdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgZm9udC1zZW1pYm9sZCBtYi0yXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibnVldm9NYXJjYWRvcigpXCIgbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cInZlck51ZXZvTWFyY2Fkb3IgPSBmYWxzZVwiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGV9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YU1hcmNhZG9yZXNcIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgW3NlbGVjdGlvbl09XCJyZXBvcnRlTWFyY2Fkb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjEwXCIgW3RvdGFsUmVjb3Jkc109XCJsaXN0YU1hcmNhZG9yZXMubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cImxpc3RhTWFyY2Fkb3Jlcy5sZW5ndGggPiAxMFwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJEZXRhbGxlTWFyY2Fkb3IoJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cInZlckRldGFsbGVNYXJjYWRvcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snZGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J21hcmNhZG9yJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LW1hcmNhZG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cIm1hcmNhZG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjYWRvci5kZXNjcmlwY2lvbn19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmNhZG9yLnRpcG8gfCByZXBvcnRlRnVlbnRlUGlwZSA6ICdsaXN0YVRpcG9EYXRvTWFyY2Fkb3Jlcyd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjYWRvci50aXBvID09ICdJRicgPyBtYXJjYWRvci50ZXh0b1JlZ2lzdHJvIDogbWFyY2Fkb3Iubm9tYnJlQ29sdW1uYX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmNhZG9yLm1hcmNhZG9yfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPnt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybU1hcmNhZG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtc2VtaWJvbGRcIj57eydpbmRpcXVlJyB8IHRyYW5zbGF0ZX19IHt7J2VuJyB8IHRyYW5zbGF0ZX19IHt7J3F1ZScgfCB0cmFuc2xhdGV9fSB7eydjb2x1bW5hJyB8IHRyYW5zbGF0ZX19IHt7J2Rlc2VhJyB8IHRyYW5zbGF0ZX19IHt7J3F1ZScgfCB0cmFuc2xhdGV9fSB7eydhcGFyZXpjYScgfCB0cmFuc2xhdGV9fSB7eydsYScgfCB0cmFuc2xhdGV9fSB7eydpbmZvcm1hY2lvbicgfCB0cmFuc2xhdGV9fS4ge3snbGEnIHwgdHJhbnNsYXRlfX0ge3sncHJpbWVyYScgfCB0cmFuc2xhdGV9fSB7eydjb2x1bW5hJyB8IHRyYW5zbGF0ZX19IHt7J2VzJyB8IHRyYW5zbGF0ZX19IHt7J2xhJyB8IHRyYW5zbGF0ZX19IDEuPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcGNpb25cIiBzaXplPVwiMjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjQwMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9NYXJjYWRvclwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGlwb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cImNvZGlnb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiEoWydNQScsJ0lNJywnTVInLCdJRicsJ1FSJywnQkMnLCdHMSddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvKSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwibWFyY2Fkb3JcIiBzaXplPVwiMjVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydtYXJjYWRvcicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ1RCJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJ0YWJsYVwiIHNpemU9XCIyNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RhYmxhJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnSUYnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93blxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIlt7bGFiZWw6ICdVbmljYScsIHZhbHVlOiAnVSd9LCB7bGFiZWw6ICdDYWRhIEVtcHJlc2EnLCB2YWx1ZTogJ0MnfV1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgZm9ybUNvbnRyb2xOYW1lPVwib3JpZ2VuXCIgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmlnZW4nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cInJlcG9ydGVNYXJjYWRvci50aXBvICE9ICdJRicgfHwgIXJlcG9ydGVNYXJjYWRvci5vcmlnZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGEgW3JlYWRvbmx5XT1cImZhbHNlXCIgW3Nob3dEaWFsb2ddPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRleHRvUmVnaXN0cm9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJyZXBvcnRlTWFyY2Fkb3IudGV4dG9SZWdpc3RybyA/IHJlcG9ydGVNYXJjYWRvci50ZXh0b1JlZ2lzdHJvOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V4dGVuc2lvbmVzXT1cIidqcGc7cG5nJ1wiIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvTWFyY2Fkb3IoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BpZWRhZF09XCIncnV0YV9yZWN1cnNvcydcIiBbbGFiZWxyYXJdPVwiJ3JlY3Vyc29zc3Nzc3MnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYW5leG9Qcm9waWVkYWRdPVwicmVwb3J0ZU1hcmNhZG9yLm9yaWdlbiA9PSdDJyA/IGxsYXZlRW1wcmVzYTogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9waWVkYWREZVNpc3RlbWFdPVwidHJ1ZVwiPjwvYXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhWydNQScsJ0lNJywnUVInLCdCQycsJ0cxJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpcG8pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUNvbHVtbmFzXCIgZm9ybUNvbnRyb2xOYW1lPVwicmVwb3J0ZUNvbHVtbmFcIiBbc2hvd0NsZWFyXT1cInRydWVcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImxsYXZlVGFibGFcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ01BJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJmb3JtYXRvXCIgc2l6ZT1cIjI1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZm9ybWF0bycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIVsnSU0nLCdJRicsJ1FSJywnQkMnLCdHMSddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXIgZm9ybUNvbnRyb2xOYW1lPVwiYW5jaG9cIiBbbWF4bGVuZ3RoXT1cIjVcIj4gPC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FuY2hvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhWydJTScsJ0lGJywnUVInLCdCQycsJ0cxJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpcG8pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciBmb3JtQ29udHJvbE5hbWU9XCJhbHRvXCIgW21heGxlbmd0aF09XCI1XCI+IDwvcC1pbnB1dE51bWJlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbHRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnTVInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiIHBJbnB1dFRleHRhcmVhIGZvcm1Db250cm9sTmFtZT1cImdydXBvMVwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZ3J1cG8xJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ01SJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiBwSW5wdXRUZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJncnVwbzJcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2dydXBvMicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ01SJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiBwSW5wdXRUZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJncnVwbzNcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2dydXBvMycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ01SJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiBwSW5wdXRUZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJmaW5hbEdydXBvXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmaW5hbGdydXBvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnTVInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiIHBJbnB1dFRleHRhcmVhIGZvcm1Db250cm9sTmFtZT1cInRleHRvUmVnaXN0cm9cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RleHRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhWydNUicsJ1RCJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpcG8pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVNpTm9cIiBmb3JtQ29udHJvbE5hbWU9XCJ0aWVuZVNxbFwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3NxbCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ1RCJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvR3JhZmljb19KRkNcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGlwb0dyYWZpY29cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZ3JhZmljYScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtMTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiEoWydNUicsJ1RCJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpcG8pICYmIChbJ1MnXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGllbmVTcWwpKSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTAgbWF4LWgtMjAwXCIgcElucHV0VGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwicXVlcnlcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2NvbnN1bHRhJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhKFsnTVInLCdUQiddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvKSAmJiAoWydOJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpZW5lU3FsKSkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUZ1ZW50ZXNcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZnVlbnRlXCIgb3B0aW9uTGFiZWw9XCJkZXNjcmlwY2lvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmdWVudGUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cIiFyZXBvcnRlTWFyY2Fkb3IudGlwb0dyYWZpY29cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwibWFyY2Fkb3JHcmFmaWNvXCIgc2l6ZT1cIjI1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbWFyY2Fkb3JncmFmaWNhJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhWydBJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpcG9HcmFmaWNvKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXR1bG94XCIgc2l6ZT1cIjI1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGl0dWxvJyB8IHRyYW5zbGF0ZSB9fSBYPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFbJ0EnXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwb0dyYWZpY28pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cInRpdHVsb3lcIiBzaXplPVwiMjVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXR1bG8nIHwgdHJhbnNsYXRlIH19IFk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwiIXJlcG9ydGVNYXJjYWRvci50aXBvR3JhZmljb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJiYW5kYVwiIHNpemU9XCIyNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2NvbG9yZGluYW1pY28nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cIiFyZXBvcnRlTWFyY2Fkb3IudGlwb0dyYWZpY29cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiYW5jaG9KYXNwZXJMYWJlbFwiIHNpemU9XCIyNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J251bWVyb2NhdGVnb3JpYXMnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhKFsnTVInLCdUQiddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvKSAmJiAoWydOJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpZW5lU3FsKSkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiIHBJbnB1dFRleHRhcmVhIGZvcm1Db250cm9sTmFtZT1cImZpbHRyb1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZmlsdHJvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJnbHlwaGljb25zIHt7cmVwb3J0ZU1hcmNhZG9yLmxsYXZlID8gJ2dseXBoaWNvbnMtcmVmcmVzaCcgOiAnZ2x5cGhpY29ucy1mbG9wcHktc2F2ZScgfX1cIiBsYWJlbD1cInt7cmVwb3J0ZU1hcmNhZG9yLmxsYXZlID8gKCdsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlKSA6ICgnbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZSl9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImd1YXJkYXJNYXJjYWRvcigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYmluXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJlcG9ydGVNYXJjYWRvci5sbGF2ZSAhPSBudWxsXCIgbGFiZWw9XCJ7eydsaW5rX2VsaW1pbmFyJyB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWxpbWluYXJNYXJjYWRvcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yICYmIHJlcG9ydGVNYXJjYWRvci5sbGF2ZSAhPSBudWxsICYmIChyZXBvcnRlTWFyY2Fkb3IudGlwbyA9PSAnTVInIHx8IHJlcG9ydGVNYXJjYWRvci50aXBvID09ICdUQicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cIm51ZXZvQ2FtcG9UYWJsYSgpXCIgaWNvbj1cInBpIHBpLXBsdXNcIiBbZGlzYWJsZWRdPVwiYmxvcXVlYXJDYW1wb01hcmNhZG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1yaXBwbGUgcC1lbGVtZW50IHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLXNlY29uZGFyeSBtYi0yXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cImxpc3RhQ2FtcG9zTWFyY2Fkb3JcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCIgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLXN0cmlwZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibGlzdGFDYW1wb3NNYXJjYWRvci5sZW5ndGhcIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJsaXN0YUNhbXBvc01hcmNhZG9yLmxlbmd0aCA+IDEwXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IGFsIHtsYXN0fSBkZSB7dG90YWxSZWNvcmRzfSByZWdpc3Ryb3NcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdE1vZGU9XCJyb3dcIiBkYXRhS2V5PVwibGxhdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDEwJTtcIj57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDEwJTtcIj57eydjYW1wbycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+e3snZm9ybWF0bycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCU7XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyA9PSAnVEInXCI+e3sndGlwbycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCU7XCIqbmdJZj1cInJlcG9ydGVNYXJjYWRvci50aXBvID09ICdUQidcIj57eydtZWRpZGFzJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDEwJTtcIj4gPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJUYWJsYU51ZXZvUmVnaXN0cm9cIiAqbmdJZj1cInZlclJlcG9ydGVNYXJjYWRvckRldGFsbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCBbKG5nTW9kZWwpXT1cImNhbXBvTWFyY2Fkb3JJbnNlcnRhci5jb2x1bW5hXCIgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJyk7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3JJbnNlcnRhci5jb2x1bW5hKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvckluc2VydGFyLmNvbHVtbmEpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvTWFyY2Fkb3JJbnNlcnRhci5jYW1wb0Z1ZW50ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9ySW5zZXJ0YXIuY2FtcG9GdWVudGUpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9ySW5zZXJ0YXIuY2FtcG9GdWVudGUpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXIuZm9ybWF0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvci50aXBvID09ICdUQidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFHcmFmaWNvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNhbXBvTWFyY2Fkb3JJbnNlcnRhci50aXBvXCIgYXBwZW5kVG89XCJib2R5XCIgW2F1dG9aSW5kZXhdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gPT0gJ1RCJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2FtcG9NYXJjYWRvckluc2VydGFyLnRpcG8gPT0nSSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvTWFyY2Fkb3JJbnNlcnRhci5hbmNob1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbmNobycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvTWFyY2Fkb3JJbnNlcnRhci5hbHRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FsdG8nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIiAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWNoZWNrXCIgKGNsaWNrKT1cImFncmVnYXJDYW1wb01hcmNhZG9yKGNhbXBvTWFyY2Fkb3JJbnNlcnRhcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tc3VjY2VzcyBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInZlclJlcG9ydGVNYXJjYWRvckRldGFsbGUgPSBmYWxzZTsgYmxvcXVlYXJDYW1wb01hcmNhZG9yID0gZmFsc2VcIiBpY29uPVwicGkgcGktdGltZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWNhbXBvIGxldC1lZGl0aW5nPVwiZWRpdGluZ1wiIGxldC1yaT1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgW3BFZGl0YWJsZVJvd109XCJjYW1wb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCAgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvLmNvbHVtbmFcIiBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wby5jb2x1bW5hKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG8uY29sdW1uYSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2FtcG8uY29sdW1uYX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG8uY2FtcG9GdWVudGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wby5jYW1wb0Z1ZW50ZSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG8uY2FtcG9GdWVudGUpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjYW1wby5jYW1wb0Z1ZW50ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG8uZm9ybWF0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NhbXBvLmZvcm1hdG99fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gPT0gJ1RCJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFHcmFmaWNvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2FtcG8udGlwb1wiIGFwcGVuZFRvPVwiYm9keVwiIFthdXRvWkluZGV4XT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2FtcG8udGlwbyB8IHJlcG9ydGVGdWVudGVQaXBlIDonbGlzdGFSZWN1cnNvR3JhZmljYSd9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gPT0gJ1RCJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNhbXBvLnRpcG8gPT0nSSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wby5hbmNob1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FuY2hvJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG8uYWx0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FsdG8nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNhbXBvLnRpcG8gPT0nSSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snYW5jaG8nIHwgdHJhbnNsYXRlfX06IHt7Y2FtcG8uYW5jaG99fSA8YnIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydhbHRvJyB8IHRyYW5zbGF0ZX19OiB7e2NhbXBvLmFsdG99fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICBzdHlsZT1cIndpZHRoOiAxMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0hFQ0sgR1VBUkRBUiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwU2F2ZUVkaXRhYmxlUm93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZWNrXCIgKGNsaWNrKT1cImFncmVnYXJDYW1wb01hcmNhZG9yKGNhbXBvKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zdWNjZXNzIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0FOQ0VMQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcENhbmNlbEVkaXRhYmxlUm93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCIgKGNsaWNrKT1cImNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvckFzeW5jKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRURJVEFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwSW5pdEVkaXRhYmxlUm93IFtkaXNhYmxlZF09XCJibG9xdWVhckNhbXBvTWFyY2Fkb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcGVuY2lsXCIgKGNsaWNrKT1cImVkaXRhckNhbXBvTWFyY2Fkb3IoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zZWNvbmRhcnkgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFTElNSU5BUiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcERlbGV0ZUVkaXRhYmxlUm93IFtkaXNhYmxlZF09XCJibG9xdWVhckNhbXBvTWFyY2Fkb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10cmFzaFwiIChjbGljayk9XCJlbGltaW5hckNhbXBvTWFyY2Fkb3IoJGV2ZW50LGNhbXBvKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1vdXRsaW5lZCBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8L3AtdGFibGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9wLXRhYlBhbmVsPlxyXG4gICAgICAgICAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7eydzb3BvcnRlJyB8IHRyYW5zbGF0ZSB9fSB7eydhcmNoaXZvJyB8IHRyYW5zbGF0ZSB9fXNcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJyZXBvcnRlRnVlbnRlLnVuaWNvQXJjaGl2byA9PSAnTidcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cIm51ZXZvU29wb3J0ZSgpXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaGFiaWxpdGFDYW1wb1wiIGNsYXNzPVwicC1yaXBwbGUgcC1lbGVtZW50IHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLXNlY29uZGFyeSBtYi0yXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YVNvcG9ydGVzXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1zdHJpcGVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibGlzdGFTb3BvcnRlcy5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwibGlzdGFTb3BvcnRlcy5sZW5ndGggPiAxMFwiIFxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IGFsIHtsYXN0fSBkZSB7dG90YWxSZWNvcmRzfSByZWdpc3Ryb3NcIiBcclxuICAgICAgICAgICAgICAgICAgICBlZGl0TW9kZT1cInJvd1wiIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJmb25kb1RhYmxhUGluY2lwYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiA0NSVcIj57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGV9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogNDUlXCI+e3snYXJjaGl2bycgfCB0cmFuc2xhdGV9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAlXCI+IDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cIlRhYmxhTnVldm9SZWdpc3Ryb1wiICpuZ0lmPVwidmVyU29wb3J0ZUFyY2hpdm9EZXRhbGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogNDUlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInNvcG9ydGVJbmdyZXNhci5kZXNjcmlwY2lvblwiIHN0eWxlPVwid2lkdGg6IC13ZWJraXQtZmlsbC1hdmFpbGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlSW5ncmVzYXIuZGVzY3JpcGNpb24pICYmIGNsaWNrR3VhcmRhclNvcG9ydGVBcmNoaXZvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlSW5ncmVzYXIuZGVzY3JpcGNpb24pICYmIGNsaWNrR3VhcmRhclNvcG9ydGVBcmNoaXZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDQ1JVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGEgW3JlYWRvbmx5XT1cImZhbHNlXCIgW3Nob3dEaWFsb2ddPVwiZmFsc2VcIiBbbW9zdHJhclhdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJzb3BvcnRlSW5ncmVzYXIuYXJjaGl2b0luZGl2aWR1YWwgPyBzb3BvcnRlSW5ncmVzYXIuYXJjaGl2b0luZGl2aWR1YWw6ICcnXCIgW2xhYmVsYXJjaF09XCInYXJjaGl2bycgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9zdHJhckxhYmVsSW5wdXRdPVwiZmFsc2VcIiBbbW9zdHJhcm9ibGljYXJnb109XCJ0cnVlXCIgW2Jvb2xlYW5vXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oc29wb3J0ZUluZ3Jlc2FyLmFyY2hpdm9JbmRpdmlkdWFsKSAmJiBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvU29wb3J0ZSgkZXZlbnQsIHNvcG9ydGVJbmdyZXNhcilcIj48L2FwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWNoZWNrXCIgKGNsaWNrKT1cImFncmVnYXJTb3BvcnRlKHNvcG9ydGVJbmdyZXNhcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zdWNjZXNzIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ2ZXJTb3BvcnRlQXJjaGl2b0RldGFsbGUgPSBmYWxzZVwiIGljb249XCJwaSBwaS10aW1lc1wiIChjbGljayk9XCJjYW5jZWxhclNvcG9ydGUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWRhbmdlciBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtc29wb3J0ZSBsZXQtZWRpdGluZz1cImVkaXRpbmdcIiBsZXQtcmk9XCJyb3dJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgW3BFZGl0YWJsZVJvd109XCJzb3BvcnRlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDQ1JVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInNvcG9ydGUuZGVzY3JpcGNpb25cIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3NvcG9ydGUuZGVzY3JpcGNpb259fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiA0NSVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGEgW3JlYWRvbmx5XT1cImZhbHNlXCIgW3Nob3dEaWFsb2ddPVwiZmFsc2VcIiBbbW9zdHJhclhdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInNvcG9ydGUuYXJjaGl2b0luZGl2aWR1YWwgPyBzb3BvcnRlLmFyY2hpdm9JbmRpdmlkdWFsOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vc3RyYXJMYWJlbElucHV0XT1cImZhbHNlXCIgIFtib29sZWFub109XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHNvcG9ydGUuYXJjaGl2b0luZGl2aWR1YWwpICYmIGNsaWNrR3VhcmRhclNvcG9ydGVBcmNoaXZvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3RlZCk9XCJvYnRlbmVyQXJjaGl2b1NvcG9ydGUoJGV2ZW50LCBzb3BvcnRlKVwiPjwvYXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3NvcG9ydGUuYXJjaGl2b0luZGl2aWR1YWx9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0hFQ0sgR1VBUkRBUiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBTYXZlRWRpdGFibGVSb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGVja1wiIChjbGljayk9XCJhZ3JlZ2FyU29wb3J0ZShzb3BvcnRlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXN1Y2Nlc3MgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENBTkNFTEFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcENhbmNlbEVkaXRhYmxlUm93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIiAoY2xpY2spPVwiY2FuY2VsYXJFZGljaW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1kYW5nZXIgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVESVRBUiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwSW5pdEVkaXRhYmxlUm93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXBlbmNpbFwiIFtkaXNhYmxlZF09XCJoYWJpbGl0YUNhbXBvXCIgKGNsaWNrKT1cImluaWNpYXJFZGljaW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zZWNvbmRhcnkgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVMSU1JTkFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBEZWxldGVFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRyYXNoXCIgKGNsaWNrKT1cImVsaW1pbmFyU29wb3J0ZSgkZXZlbnQsIHNvcG9ydGUpXCIgW2Rpc2FibGVkXT1cImhhYmlsaXRhQ2FtcG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1vdXRsaW5lZCBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPnt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxyXG4gICAgICAgICAgICA8L3AtdGFiUGFuZWw+XHJcbiAgICAgICAgPC9wLXRhYlZpZXc+XHJcbiAgICA8L3AtdGFiUGFuZWw+XHJcbiAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7eydyZXBvcnRlJyB8IHRyYW5zbGF0ZSB9fSB7eydkaW5hbWljbycgfCB0cmFuc2xhdGUgfX1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVNpTm9cIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuZG9ibGVMaW5lYVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2RvYmxlbGluZWEnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS50aXR1bG9QYXJhbWV0cm9cIiBzaXplPVwiMjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Rlc2NyaXBjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9DaWZyYWRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5jaWZyYWRvSmFzcGVyXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvY2lmcmFkbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkIGJhY2tncm91bmQtMTAwXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZXN0YXJ0XCIgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2dlbmVyYXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiZ2VuZXJhckphc3BlcigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcmVmcmVzaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImFjdHVhbGl6YXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJwaSBwaS1kb3dubG9hZFwiICpuZ0lmPVwiZXhpc3RlSmFzcGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2Rlc2NhcmdhcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJkZXNjYXJnYXJKYXNwZXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIG10LTIgbWItMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kICBtYi0xXCIgKm5nSWY9XCJiYW5kYVNlbGVjY2lvbmFkYS5rZXlcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJyZWdyZXNhckJhbmRhU2VsZWNjaW9uYWRhKClcIiBsYWJlbD0gXCJ7eydsaXN0YWRvJyB8IHRyYW5zbGF0ZX19IHt7J2JhbmRhcycgfCB0cmFuc2xhdGV9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGV2cm9uLWxlZnRcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgZm9udC1zZW1pYm9sZCBmbGV4LXNocmluay0wIFwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwibGlzdGFUaXBvQmFuZGFcIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXHJcbiAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiIFtyb3dzXT1cIjEwXCJcclxuICAgICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJsaXN0YVRpcG9CYW5kYS5sZW5ndGhcIiBbcGFnaW5hdG9yXT1cImxpc3RhVGlwb0JhbmRhLmxlbmd0aCA+IDEwXCJcclxuICAgICAgICAgICAgKG9uUm93U2VsZWN0KT1cInZlckJhbmRhKCRldmVudClcIiAob25Sb3dVbnNlbGVjdCk9XCJ2ZXJCYW5kYSgkZXZlbnQpXCIgKm5nSWY9XCIhYmFuZGFTZWxlY2Npb25hZGEua2V5XCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJmb25kb1RhYmxhUGluY2lwYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+e3snYmFuZGEnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8dGg+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWJhbmRhPlxyXG4gICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJiYW5kYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e2JhbmRhLnZhbHVlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L3AtdGFibGU+XHJcblxyXG4gICAgICAgIDxwLXRhYlZpZXcgKm5nSWY9XCJiYW5kYVNlbGVjY2lvbmFkYS5rZXkgJiYgdmVyVGFiQmFuZGFcIj5cclxuICAgICAgICAgICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3snY2FyYWN0ZXJpc3RpY2FzJyB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIVsnZGV0YWxsZScsJ3N1bW1hcnknXS5pbmNsdWRlcyhiYW5kYVNlbGVjY2lvbmFkYS5rZXkpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFTaU5vXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCIgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZXBvcnRlQmFuZGEudG90YWxlc1wiID48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0b3RhbCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVCYW5kYS50aXR1bG9cIiBtYXhsZW5ndGg9XCIyMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpdHVsbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWZsb3BweS1zYXZlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJndWFyZGFyQ2FyYWN0ZXJpc3RpY2FCYW5kYSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9wLXRhYlBhbmVsPlxyXG4gICAgICAgICAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7e2JhbmRhU2VsZWNjaW9uYWRhLnZhbHVlfX1cIiAqbmdJZj1cIiFudWV2YUJhbmRhXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kICBtYi0xXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cIm51ZXZvTWFyY2Fkb3JEaW5hbWljbygpXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLXJpcHBsZSBwLWVsZW1lbnQgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24tc2Vjb25kYXJ5IG1iLTJcIiAqbmdJZj1cIiFudWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YU1hcmNhZG9yRGluYW1pY29cIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCIgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCJcclxuICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibGlzdGFNYXJjYWRvckRpbmFtaWNvLmxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJsaXN0YU1hcmNhZG9yRGluYW1pY28ubGVuZ3RoID4gMTBcIiAqbmdJZj1cIiFudWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvXCJcclxuICAgICAgICAgICAgICAgICAgICAob25Sb3dTZWxlY3QpPVwidmVyTWFyY2Fkb3JEaW5hbWljbygkZXZlbnQpXCIgIChvblJvd1Vuc2VsZWN0KT1cInZlck1hcmNhZG9yRGluYW1pY28oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2JhbmRhJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snb3JkZW4nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snZXRpcXVldGEnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydmb3JtYXRvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snYW5jaG8nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydvcGVyYWNpb24nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtZGluYW1pY28+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBbcFNlbGVjdGFibGVSb3ddPVwiZGluYW1pY29cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2RpbmFtaWNvLmJhbmRhfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGluYW1pY28uYmFuZGEgPyBkaW5hbWljby5hbHRvIDogJyd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tkaW5hbWljby5tYXJjYWRvcn19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2RpbmFtaWNvLmJhbmRhID8gZGluYW1pY28uZGVzY3JpcGNpb24gOiAnJ319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2RpbmFtaWNvLmJhbmRhID8gZGluYW1pY28uZm9ybWF0byA6ICcnfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7WydkZXRhbGxlJ10uaW5jbHVkZXMoZGluYW1pY28uYmFuZGEpID8gZGluYW1pY28uYW5jaG8gOiAnJ319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2RpbmFtaWNvLmJhbmRhID8gZGluYW1pY28ub3BlcmFjaW9uIDogJyd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L3AtdGFibGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY29cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciAgbWItMlwiPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtc2VtaWJvbGQgbXQtM1wiPnt7J2luZGlxdWUnIHwgdHJhbnNsYXRlfX0ge3snZW4nIHwgdHJhbnNsYXRlfX0ge3sncXVlJyB8IHRyYW5zbGF0ZX19IHt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlfX0ge3snZGVzZWEnIHwgdHJhbnNsYXRlfX0ge3sncXVlJyB8IHRyYW5zbGF0ZX19IHt7J2FwYXJlemNhJyB8IHRyYW5zbGF0ZX19IHt7J2xhJyB8IHRyYW5zbGF0ZX19IHt7J2luZm9ybWFjaW9uJyB8IHRyYW5zbGF0ZX19LiB7eydsYScgfCB0cmFuc2xhdGV9fSB7eydwcmltZXJhJyB8IHRyYW5zbGF0ZX19IHt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlfX0ge3snZXMnIHwgdHJhbnNsYXRlfX0ge3snbGEnIHwgdHJhbnNsYXRlfX0gMS48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cIm51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSBmYWxzZVwiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3tiYW5kYVNlbGVjY2lvbmFkYS52YWx1ZX19XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGV2cm9uLWxlZnRcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgZm9udC1zZW1pYm9sZCBmbGV4LXNocmluay0wIFwiICpuZ0lmPVwibnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljb1wiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1SZXBvcnRlRGluYW1pY29cIiBjbGFzcz1cInAtZmx1aWQgZ3JpZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0NhbXBvSmFzcGVyRGluYW1pY29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwidGlwb0NhbXBvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cInZhbHVlXCIgb3B0aW9uVmFsdWU9XCJrZXlcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwb2NhbXBvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvID09J0MnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9EYXRvU2ludGF4aXNcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRpcG9EYXRvXCIgb3B0aW9uTGFiZWw9XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJrZXlcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwb2RhdG8nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCBmb3JtQ29udHJvbE5hbWU9XCJhbHRvXCIgbWF4bGVuZ3RoPVwiNVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW4nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhQ29sdW1uYXNcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1hcmNhZG9yXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImxsYXZlVGFibGFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmxsYXZlICYmIHJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJ1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwibWFyY2Fkb3JcIiBzaXplPVwiMjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubGxhdmUgJiYgcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTEyXCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gPT0nQydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTAgbWF4LWgtMjAwXCIgcElucHV0VGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwiZmlsdHJvXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydzaW50YXhpcycgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1maWVsZHNldCBjbGFzcz1cImZpZWxkc2ludGl0dWxvXCIgIGNsYXNzPVwiZmllbGRzaW50aXR1bG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIGdyaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02IG1iLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsICBjbGFzcz1cImZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5LTkwMCB0ZXh0LWJhc2UgbWwtMVwiPnt7J3Jlc3VsdGFkbycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNiBtYi0wXCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gPT0nQydcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02IG1iLTBcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb250LXNlbWlib2xkIHRleHQtZ3JheS05MDAgdGV4dC1iYXNlIG1sLTFcIiA+e3snbGFiZWwnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZm9ybWF0b1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZm9ybWF0bycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcGNpb25cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpdHVsbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImFuY2hvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FuY2hvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnICYmICdkZXRhbGxlJyA9PSByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5iYW5kYSBcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQycgJiYgJ2RldGFsbGUnICE9IHJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmJhbmRhIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJhbmNob0phc3BlckxhYmVsXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FuY2hvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIiAqbmdJZj1cIidkZXRhbGxlJyAhPSByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5iYW5kYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJyZXN1bHRhZG9YXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3gnIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQycgJiYgJ2RldGFsbGUnICE9IHJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmJhbmRhIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXR1bG94XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3gnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiICpuZ0lmPVwiJ2RldGFsbGUnICE9IHJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmJhbmRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cInJlc3VsdGFkb1lcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sneScgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJyAmJiAnZGV0YWxsZScgIT0gcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uYmFuZGEgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cInRpdHVsb3lcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sneScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUFsaW5lYWNpb25cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRpcG9SZXBvcnRlXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiID48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYWxpbmVhY2lvbicgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFBbGluZWFjaW9uXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRpcG9HcmFmaWNvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiID48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYWxpbmVhY2lvbicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvRGF0byA9PSAnTicgJiYgcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YU9wZXJhY2lvbmVzXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm9wZXJhY2lvblwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIiA+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29wZXJhY2lvbicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmllbGRzZXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIHt7cmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubGxhdmUgPyAnZ2x5cGhpY29ucy1yZWZyZXNoJyA6ICdnbHlwaGljb25zLWZsb3BweS1zYXZlJ319XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7e3JlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmxsYXZlID8gKCdsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlKSA6ICgnbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZSl9fVwiIChjbGljayk9XCJndWFyZGFyQ29sdW1uYURpbmFtaWNvKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWJpblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubGxhdmUgIT0gbnVsbFwiIGxhYmVsPVwie3snbGlua19lbGltaW5hcicgfCB0cmFuc2xhdGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbGltaW5hckNvbHVtbmFEaW5hbWljbygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9wLXRhYlBhbmVsPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICA8L3AtdGFiVmlldz5cclxuICAgIDwvcC10YWJQYW5lbD5cclxuICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J3JlcG9ydGUnIHwgdHJhbnNsYXRlIH19IHt7J3RleHRvJyB8IHRyYW5zbGF0ZSB9fVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmFyY2hpdm9UZXh0b1wiIHNpemU9XCI1MFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMjAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbm9tYnJlYXJjaGl2bycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFTZXBhcmFkb3Jlc1wiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5zZXBhcmFkb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHJlcG9ydGVGdWVudGUuc2VwYXJhZG9yKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlVGV4dG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8ocmVwb3J0ZUZ1ZW50ZS5zZXBhcmFkb3IpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVUZXh0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCIgPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydzZXBhcmFkb3InIHwgdHJhbnNsYXRlIH19KjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0NpZnJhZG9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmNpZnJhZG9UZXh0b1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cImxsYXZlVGFibGFcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwb2NpZnJhZG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXJlZnJlc2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJhY3R1YWxpemFyU2VwYXJhZG9yKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gbGlnbi1pdGVtcy1jZW50ZXIgbWItM1wiPlxyXG4gICAgICAgICAgICA8aDEgY2xhc3M9XCJ0ZXh0LXhsXCI+e3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGV9fTwvaDE+XHJcbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5IGZvbnQtc2VtaWJvbGRcIiBpY29uPVwicGkgcGktcGx1c1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibnVldm9NYXJjYWRvclRleHRvKClcIiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAqbmdJZj1cIiF2ZXJOdWV2b01hcmNhZG9yVGV4dG9cIj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JUZXh0b1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cInZlck51ZXZvTWFyY2Fkb3JUZXh0byA9IGZhbHNlOyBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvID0gZmFsc2U7XCIgbGFiZWw9IFwie3snbGlzdGFkbycgfCB0cmFuc2xhdGV9fSB7eydtYXJjYWRvcmVzJyB8IHRyYW5zbGF0ZX19XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YU1hcmNhZG9yZXNUZXh0b1wiIFtzY3JvbGxhYmxlXT1cInRydWVcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCJcclxuICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgXHJcbiAgICAgICAgICAgIFtyb3dzXT1cIjEwXCIgW3RvdGFsUmVjb3Jkc109XCJsaXN0YU1hcmNhZG9yZXNUZXh0by5sZW5ndGhcIlxyXG4gICAgICAgICAgICBbcGFnaW5hdG9yXT1cImxpc3RhTWFyY2Fkb3Jlc1RleHRvLmxlbmd0aCA+IDEwXCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvclRleHRvXCJcclxuICAgICAgICAgICAgKG9uUm93U2VsZWN0KT1cInZlck1hcmNhZG9yVGV4dG8oJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cInZlck1hcmNhZG9yVGV4dG8oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydmb3JtYXRvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J29yZGVuJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1tYXJjdGV4dG8+XHJcbiAgICAgICAgICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cIm1hcmN0ZXh0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmN0ZXh0by50aXBvR3JhZmljbyB8IHJlcG9ydGVGdWVudGVQaXBlIDogJ2xpc3RhVGlwb01hcmNhZG9yZXNUZXh0byd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY3RleHRvLm5vbWJyZUNvbHVtbmF9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY3RleHRvLmZvcm1hdG99fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY3RleHRvLmFsdG99fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIiBjbGFzcz1cInAtMyBmb250LW1lZGl1bSBlbXB0eW1lc3NhZ2VcIj57eydtZW5zYWpldGFibGF2YWNpYScgfCB0cmFuc2xhdGV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvcC10YWJsZT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBtdC0zXCIgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yVGV4dG9cIj4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPGg1IGNsYXNzPVwibXQtM1wiPjxpIGNsYXNzPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLW5vdGVzXCI+PC9pPnt7J2RldGFsbGUnIHwgdHJhbnNsYXRlfX08L2g1PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb01hcmNhZG9yVGV4dG9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by50aXBvR3JhZmljbykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwibWFyY2Fkb3JUZXh0by50aXBvR3JhZmljbyA9PSAnRCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhQ29sdW1uYXNcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtYXJjYWRvclRleHRvLnJlcG9ydGVDb2x1bW5hXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImxsYXZlVGFibGFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yVGV4dG8ucmVwb3J0ZUNvbHVtbmEpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by5yZXBvcnRlQ29sdW1uYSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0b1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIm1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY29cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJtYXJjYWRvclRleHRvLmZvcm1hdG9cIiBtYXhsZW5ndGg9XCI1MFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by5mb3JtYXRvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yVGV4dG8uZm9ybWF0bykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7bWFyY2Fkb3JUZXh0by50aXBvR3JhZmljbyA9PSAnRCcgPyAoJ2Zvcm1hdG8nIHwgdHJhbnNsYXRlKSsnKicgOiAoJ3ZhbG9yJyB8IHRyYW5zbGF0ZSkrJyonIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIm1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY28gPT0gJ0QnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwibWFyY2Fkb3JUZXh0by5hbmNob1wiIG1heGxlbmd0aD1cIjIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yVGV4dG8uYW5jaG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by5hbmNobykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FuY2hvJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwibWFyY2Fkb3JUZXh0by50aXBvR3JhZmljb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yVGV4dG8uYWx0b1wiIG1heGxlbmd0aD1cIjIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yVGV4dG8uYWx0bykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLmFsdG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmRlbicgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIHt7bWFyY2Fkb3JUZXh0by5sbGF2ZSA/ICdnbHlwaGljb25zLXJlZnJlc2gnIDogJ2dseXBoaWNvbnMtZmxvcHB5LXNhdmUnfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7bWFyY2Fkb3JUZXh0by5sbGF2ZSA/ICgnbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZSkgOiAoJ2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGUpfX1cIiAoY2xpY2spPVwiZ3VhcmRhck1hcmNhZG9yVGV4dG8oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYmluXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJtYXJjYWRvclRleHRvLmxsYXZlICE9IG51bGxcIiBsYWJlbD1cInt7J2xpbmtfZWxpbWluYXInIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWxpbWluYXJNYXJjYWRvVGV4dG8oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9wLXRhYlBhbmVsPlxyXG4gICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3sndGFibGEnIHwgdHJhbnNsYXRlIH19XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUubm9tYnJlVGFibGFcIiBtYXhsZW5ndGg9XCI0MDAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbm9tYnJldGFibGEnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXJlZnJlc2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImFjdHVhbGl6YXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8cC1waWNrTGlzdCBbc291cmNlXT1cImxpc3RhVGFibGFcIiBbdGFyZ2V0XT1cImxpc3RhTm9UYWJsYVwiIHNvdXJjZUhlYWRlcj1cIkFzb2NpYWRvXCIgc291cmNlRmlsdGVyUGxhY2Vob2xkZXI9XCJBc29jaWFkb1wiXHJcbiAgICAgICAgICAgIHRhcmdldEhlYWRlcj1cIkRlc2Fzb2NpYWRvXCIgW2RyYWdkcm9wXT1cInRydWVcIiBbcmVzcG9uc2l2ZV09XCJ0cnVlXCIgdGFyZ2V0RmlsdGVyUGxhY2Vob2xkZXI9XCJEZXNhc29jaWFkb1wiXHJcbiAgICAgICAgICAgIGZpbHRlckJ5PVwibm9tYnJlXCIgKm5nSWY9XCJpc0Z1ZW50ZSgpXCIgKG9uU291cmNlUmVvcmRlcik9XCJyZW9yZGVyVGFibGEoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChvbk1vdmVBbGxUb1RhcmdldCk9XCJtb3ZlckFEZXNhc29jaWFkb1RhYmxhKCRldmVudClcIiAob25Nb3ZlQWxsVG9Tb3VyY2UpPVwibW92ZXJBQXNvY2lhZG9UYWJsYSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKG9uTW92ZVRvVGFyZ2V0KT1cIm1vdmVyQURlc2Fzb2NpYWRvVGFibGEoJGV2ZW50KVwiIChvbk1vdmVUb1NvdXJjZSk9XCJtb3ZlckFBc29jaWFkb1RhYmxhKCRldmVudClcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC10YWJsYSBwVGVtcGxhdGU9XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD57e3RhYmxhLm5vbWJyZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvcC1waWNrTGlzdD5cclxuICAgIDwvcC10YWJQYW5lbD5cclxuICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J2FyY2hpdm94bWwnIHwgdHJhbnNsYXRlIH19XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTUwIG1heC1oLTEwMFwiICBwSW5wdXRUZXh0YXJlYSBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUudGFnRW5jYWJlemFkb1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGFnZW5jYWJlemFkbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTUwIG1heC1oLTEwMFwiICBwSW5wdXRUZXh0YXJlYSBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUudGFnQ2llcnJlRW5jYWJlemFkb1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGFnY2llcnJlZW5jYWJlemFkbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD4gXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC01MCBtYXgtaC0xMDBcIiAgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmVzdHJ1Y3R1cmFSZWdpc3Ryb1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGFncmVnaXN0cm8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+IFxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvQ2lmcmFkb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuY2lmcmFkb1htbFwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cImxsYXZlVGFibGFcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwb2NpZnJhZG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXJlZnJlc2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJhY3R1YWxpemFyKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItM1wiPlxyXG4gICAgICAgICAgICA8aDEgY2xhc3M9XCJ0ZXh0LXhsXCI+e3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGV9fTwvaDE+XHJcbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5IGZvbnQtc2VtaWJvbGRcIiBpY29uPVwicGkgcGktcGx1c1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibnVldm9NYXJjYWRvclhNTCgpXCIgbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvclhNTFwiPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCAgbWItMVwiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvclhNTFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cInZlck51ZXZvTWFyY2Fkb3JYTUwgPSBmYWxzZTsgY2xpY2tHdWFyZGFyTWFyY2Fkb3JYTUwgPSBmYWxzZTtcIiBsYWJlbD0gXCJ7eydsaXN0YWRvJyB8IHRyYW5zbGF0ZX19IHt7J21hcmNhZG9yZXMnIHwgdHJhbnNsYXRlfX1cIiBcclxuICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hldnJvbi1sZWZ0XCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IGZvbnQtc2VtaWJvbGQgZmxleC1zaHJpbmstMCBcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cImxpc3RhWE1MXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxyXG4gICAgICAgICAgICBkYXRhS2V5PVwibGxhdmVUYWJsYVwiIHNlbGVjdGlvbk1vZGU9XCJzaW5nbGVcIiAgXHJcbiAgICAgICAgICAgIFtyb3dzXT1cIjEwXCIgW3RvdGFsUmVjb3Jkc109XCJsaXN0YVhNTC5sZW5ndGhcIlxyXG4gICAgICAgICAgICBbcGFnaW5hdG9yXT1cImxpc3RhWE1MLmxlbmd0aCA+IDEwXCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvclhNTFwiXHJcbiAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJNYXJjYWRvclhNTCgkZXZlbnQpXCIgKG9uUm93VW5zZWxlY3QpPVwidmVyTWFyY2Fkb3JYTUwoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2Rlc2NyaXBjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydtYXJjYWRvcicgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtbWFyY3RleHRvPlxyXG4gICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJtYXJjdGV4dG9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjdGV4dG8uZGVzY3JpcGNpb259fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY3RleHRvLnRpcG8gfCByZXBvcnRlRnVlbnRlUGlwZSA6ICdsaXN0YVRpcG9EYXRvTWFyY2Fkb3Jlcyd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY3RleHRvLm5vbWJyZUNvbHVtbmF9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY3RleHRvLm1hcmNhZG9yfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L3AtdGFibGU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgbXQtM1wiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvclhNTFwiPiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJtdC0zXCI+PGkgY2xhc3M9XCJnbHlwaGljb25zIGdseXBoaWNvbnMtbm90ZXNcIj48L2k+e3snZGV0YWxsZScgfCB0cmFuc2xhdGV9fTwvaDU+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJtYXJjYWRvclhNTC5kZXNjcmlwY2lvblwiIG1heGxlbmd0aD1cIjEwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JYTUwuZGVzY3JpcGNpb24pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yWE1MXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yWE1MLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclhNTFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Rlc2NyaXBjaW9uJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb01hcmNhZG9yWE1MXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtYXJjYWRvclhNTC50aXBvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JYTUwudGlwbykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JYTUxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JYTUwudGlwbykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JYTUxcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwbycgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJbJ01BJywnTVInXS5pbmNsdWRlcyhtYXJjYWRvclhNTC50aXBvKVwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJtYXJjYWRvclhNTC5tYXJjYWRvclwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydtYXJjYWRvcicgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJtYXJjYWRvclhNTC50aXBvID09ICdUQidcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwubWFyY2Fkb3JcIiBtYXhsZW5ndGg9XCI1XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RhYmxhJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAgKm5nSWY9XCJtYXJjYWRvclhNTC50aXBvID09ICdNQSdcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUNvbHVtbmFzXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwucmVwb3J0ZUNvbHVtbmFcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiID48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwibWFyY2Fkb3JYTUwudGlwbyA9PSAnTUEnXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLmZvcm1hdG9cIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZm9ybWF0bycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJtYXJjYWRvclhNTC50aXBvID09ICdNUidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTAgbWF4LWgtMjAwXCIgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJtYXJjYWRvclhNTC50ZXh0b1JlZ2lzdHJvXCIgPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGV4dG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJbJ01SJywnVEInXS5pbmNsdWRlcyhtYXJjYWRvclhNTC50aXBvKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFGdWVudGVzXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwuZnVlbnRlXCIgb3B0aW9uTGFiZWw9XCJkZXNjcmlwY2lvblwiIG9wdGlvblZhbHVlPVwibGxhdmVcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZnVlbnRlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJbJ01SJywnVEInXS5pbmNsdWRlcyhtYXJjYWRvclhNTC50aXBvKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiBwSW5wdXRUZXh0YXJlYSBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLmZpbHRyb1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZmlsdHJvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJtYXJjYWRvclhNTC50aXBvID09ICdUQidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTAgbWF4LWgtMjAwXCIgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJtYXJjYWRvclhNTC5lc3RydWN0dXJhVGFibGFYTUxcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2VzdHJ1Y3R1cmF0YWJsYScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiID5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMge3ttYXJjYWRvclhNTC5sbGF2ZSA/ICdnbHlwaGljb25zLXJlZnJlc2gnIDogJ2dseXBoaWNvbnMtZmxvcHB5LXNhdmUnfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7bWFyY2Fkb3JYTUwubGxhdmUgPyAoJ2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGUpIDogKCdsaW5rX2d1YXJkYXInIHwgdHJhbnNsYXRlKX19XCIgKGNsaWNrKT1cImd1YXJkYXJNYXJjYWRvclhNTCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1iaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1hcmNhZG9yWE1MLmxsYXZlICE9IG51bGxcIiBsYWJlbD1cInt7J2xpbmtfZWxpbWluYXInIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWxpbWluYXJNYXJjYWRvclhNTCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JYTUwgJiYgbWFyY2Fkb3JYTUwubGxhdmUgIT0gbnVsbCAmJiAobWFyY2Fkb3JYTUwudGlwbyA9PSAnTVInIHx8IG1hcmNhZG9yWE1MLnRpcG8gPT0gJ1RCJylcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJudWV2b0NhbXBvVGFibGFYTUwoKVwiIGljb249XCJwaSBwaS1wbHVzXCIgW2Rpc2FibGVkXT1cImhhYmlsaXRhQ2FtcG9cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1yaXBwbGUgcC1lbGVtZW50IHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLXNlY29uZGFyeSBtYi0yXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwibGlzdGFDYW1wb3NNYXJjYWRvclhNTFwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIiBzdHlsZUNsYXNzPVwicC1kYXRhdGFibGUtc3RyaXBlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cImxpc3RhQ2FtcG9zTWFyY2Fkb3JYTUwubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cImxpc3RhQ2FtcG9zTWFyY2Fkb3JYTUwubGVuZ3RoID4gMTBcIiBcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIiBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie2ZpcnN0fSBhbCB7bGFzdH0gZGUge3RvdGFsUmVjb3Jkc30gcmVnaXN0cm9zXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdE1vZGU9XCJyb3dcIiBkYXRhS2V5PVwibGxhdmVcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJmb25kb1RhYmxhUGluY2lwYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDMwJTtcIj57eydjYW1wbycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMzAlO1wiPnt7J21hcmNhZG9yJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAzMCU7XCI+e3snZm9ybWF0bycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAlXCI+IDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJUYWJsYU51ZXZvUmVnaXN0cm9cIiAqbmdJZj1cInZlclJlcG9ydGVNYXJjYWRvckRldGFsbGVYTUxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDMwJTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwuY2FtcG9GdWVudGVcIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwuY2FtcG9GdWVudGUpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLmNhbXBvRnVlbnRlKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAzMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLm1hcmNhZG9yXCIgc3R5bGU9XCJ3aWR0aDogLXdlYmtpdC1maWxsLWF2YWlsYWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLm1hcmNhZG9yKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3JJbnNlcnRhclhNTC5tYXJjYWRvcikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMzAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvTWFyY2Fkb3JJbnNlcnRhclhNTC5mb3JtYXRvXCIgc3R5bGU9XCJ3aWR0aDogLXdlYmtpdC1maWxsLWF2YWlsYWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktY2hlY2tcIiAoY2xpY2spPVwiYWdyZWdhckNhbXBvTWFyY2Fkb3JYTUwoY2FtcG9NYXJjYWRvckluc2VydGFyWE1MKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tc3VjY2VzcyBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ2ZXJSZXBvcnRlTWFyY2Fkb3JEZXRhbGxlWE1MID0gZmFsc2U7IGhhYmlsaXRhQ2FtcG8gPSBmYWxzZTtcIiBpY29uPVwicGkgcGktdGltZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWRhbmdlciBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWNhbXBvIGxldC1lZGl0aW5nPVwiZWRpdGluZ1wiIGxldC1yaT1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyIFtwRWRpdGFibGVSb3ddPVwiY2FtcG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDMwJTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wby5jYW1wb0Z1ZW50ZVwiIHN0eWxlPVwid2lkdGg6IC13ZWJraXQtZmlsbC1hdmFpbGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG8uY2FtcG9GdWVudGUpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wby5jYW1wb0Z1ZW50ZSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NhbXBvLmNhbXBvRnVlbnRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAzMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG8ubWFyY2Fkb3JcIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvLm1hcmNhZG9yKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG8ubWFyY2Fkb3IpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjYW1wby5tYXJjYWRvcn19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMzAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvLmZvcm1hdG9cIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2FtcG8uZm9ybWF0b319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0hFQ0sgR1VBUkRBUiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcFNhdmVFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hlY2tcIiAoY2xpY2spPVwiYWdyZWdhckNhbXBvTWFyY2Fkb3JYTUwoY2FtcG8pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zdWNjZXNzIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENBTkNFTEFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwQ2FuY2VsRWRpdGFibGVSb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCIgKGNsaWNrKT1cImNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvclhNTEFzeW5jKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWRhbmdlciBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFRElUQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwSW5pdEVkaXRhYmxlUm93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcGVuY2lsXCIgW2Rpc2FibGVkXT1cImhhYmlsaXRhQ2FtcG9cIiAoY2xpY2spPVwiaW5pY2lhckVkaWNpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tc2Vjb25kYXJ5IG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVMSU1JTkFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcERlbGV0ZUVkaXRhYmxlUm93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10cmFzaFwiIFtkaXNhYmxlZF09XCJoYWJpbGl0YUNhbXBvXCIgKGNsaWNrKT1cImVsaW1pbmFyQ2FtcG9NYXJjYWRvclhNTCgkZXZlbnQsY2FtcG8pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1vdXRsaW5lZCBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3AtdGFibGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L3AtdGFiUGFuZWw+XHJcbiAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7eydjb2x1bW5hcmlvJyB8IHRyYW5zbGF0ZSB9fVwiPlxyXG4gICAgICAgIDxwLWFjY29yZGlvbiAob25PcGVuKT1cImNhbWJpYXJUYWJDb2x1bW5hcmlvKCRldmVudClcIiA+XHJcbiAgICAgICAgICAgIDxwLWFjY29yZGlvblRhYiBbc2VsZWN0ZWRdPVwidHJ1ZVwiID5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj48aSBjbGFzcz1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1ub3Rlc1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICB7eydjb2x1bW5hc2Jhc2ljYXMnfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgZm9udC1zZW1pYm9sZFwiIGljb249XCJwaSBwaS1wbHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm51ZXZvQ29sdW1uYUJhc2ljYSgpXCIgbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhdmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cInZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cInZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW8gPSBmYWxzZTsgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW8gPSBmYWxzZTtcIiBsYWJlbD0gXCJ7eydsaXN0YWRvJyB8IHRyYW5zbGF0ZX19IHt7J2NvbHVtbmFzYmFzaWNhcycgfCB0cmFuc2xhdGV9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YVJlcG9ydGVDb2x1bW5hcmlvXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiICBcclxuICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibGlzdGFSZXBvcnRlQ29sdW1uYXJpby5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwibGlzdGFSZXBvcnRlQ29sdW1uYXJpby5sZW5ndGggPiAxMFwiICpuZ0lmPVwiIXZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJSZXBvcnRlQ29sdW1uYXJpbygkZXZlbnQpXCIgKG9uUm93VW5zZWxlY3QpPVwidmVyUmVwb3J0ZUNvbHVtbmFyaW8oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J25vbWJyZScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snb3JkZW4nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydvcGVyYWNpb24nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtYmVhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJiZWFuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tiZWFuLm5vbWJyZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2JlYW4ubm9tYnJlQ29sdW1uYX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2JlYW4udGlwbyB8IHJlcG9ydGVDb2x1bW5hcmlvUGlwZTogJ2xpc3RhVGlwb0NvbHVtbmEnfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmVhbi5vcmRlbn19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2JlYW4ub3BlcmFjaW9uIHwgcmVwb3J0ZUNvbHVtbmFyaW9QaXBlOiAnbGlzdGFPcGVyYWNpb24nfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPnt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAgKm5nSWY9XCJ2ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS5ub21icmVcIiBtYXhsZW5ndGg9XCIxMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5ub21icmUpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5ub21icmUpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydub21icmUnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvQ29sdW1uYXNcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2EudGlwb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS50aXBvKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2EudGlwbykgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvY29sdW1uYScgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhQ29sdW1uYXNcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2EucmVwb3J0ZUNvbHVtbmFcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLnJlcG9ydGVDb2x1bW5hKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2EucmVwb3J0ZUNvbHVtbmEpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJjb2x1bW5hQmFzaWNhLnRpcG8gPT0gJ0QnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhT3BlcmFjaW9uZXNDb2x1bW5hcmlvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW5hQmFzaWNhLm9wZXJhY2lvblwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcGVyYWNpb24pICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcGVyYWNpb24pICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3BlcmFjaW9uJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cImlzVGlwb0NvbHVtbmEoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YU9wZXJhY2lvbmVzRXhjZWxDb2x1bW5hcmlvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW5hQmFzaWNhLm9wZXJhY2lvbkhvcml6b250YWxcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uSG9yaXpvbnRhbCkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9wZXJhY2lvbkhvcml6b250YWwpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3BlcmFjaW9uaG9yaXpvbnRhbCcgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gIGZpbGEgT3BlcmFjaW9uIFZlcnRpY2FsIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiaXNUaXBvQ29sdW1uYSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2EuY29sdW1uYU9wZXJhY2lvblZlcnRpY2FsXCIgbWF4bGVuZ3RoPVwiNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5jb2x1bW5hT3BlcmFjaW9uVmVydGljYWwpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5jb2x1bW5hT3BlcmFjaW9uVmVydGljYWwpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydjb2x1bW5hb3BlcmFjaW9uJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE9wZXJhY2lvbiBWZXJ0aWNpYWwgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJpc1RpcG9Db2x1bW5hKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFPcGVyYWNpb25lc0V4Y2VsQ29sdW1uYXJpb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS5vcGVyYWNpb25WZXJ0aWNhbFwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcGVyYWNpb25WZXJ0aWNhbCkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9wZXJhY2lvblZlcnRpY2FsKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29wZXJhY2lvbnZlcnRpY2FsJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBPcmRlbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cImlzTW9zdHJhck9yZGVuKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS5vcmRlblwiIG1heGxlbmd0aD1cIjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eub3JkZW4pICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcmRlbikgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29yZGVuJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE9yZGVuYW1pZW50byBGaWxhcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cImlzVGlwb0xhYmVsKCkgfHwgaXNUaXBvRmlsYSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhT3JkZW5hbWllbnRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cImZhbHNlXCIgIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2Eub3JkZXJCeVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eub3JkZXJCeSkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9yZGVyQnkpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW5hbWllbnRvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBPcmRlbmFtaWVudG8gRGF0b3MgZGUgbGEgY29uc3VsdGEgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJpc01vc3RyYXJPcmRlbkNvbnN1bHRhKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS5vcmRlbkNvbnN1bHRhXCIgbWF4bGVuZ3RoPVwiNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9yZGVuQ29uc3VsdGEpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcmRlbkNvbnN1bHRhKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmRlbmNvbnN1bHRhJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMge3tjb2x1bW5hQmFzaWNhLmxsYXZlVGFibGEgPyAnZ2x5cGhpY29ucy1yZWZyZXNoJyA6ICdnbHlwaGljb25zLWZsb3BweS1zYXZlJ319XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7Y29sdW1uYUJhc2ljYS5sbGF2ZVRhYmxhID8gKCdsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlKSA6ICgnbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZSl9fVwiIChjbGljayk9XCJndWFyZGFyQ29sdW1uYUJhc2ljYSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYmluXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbmFCYXNpY2EubGxhdmVUYWJsYSAhPSBudWxsXCIgbGFiZWw9XCJ7eydsaW5rX2VsaW1pbmFyJyB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWxpbWluYXJDb2x1bW5hQmFzaWNhKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3AtYWNjb3JkaW9uVGFiPlxyXG4gICAgICAgIDwvcC1hY2NvcmRpb24+XHJcbiAgICAgICAgPHAtYWNjb3JkaW9uIChvbk9wZW4pPVwiY2FtYmlhclRhYkNvbHVtbmFyaW8oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8cC1hY2NvcmRpb25UYWIgPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPjxpIGNsYXNzPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLW5vdGVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7J2RhdG9zYWRpY2lvbmFsZXMnfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPHAtZmllbGRzZXQgY2xhc3M9XCJmaWVsZHNpbnRpdHVsb1wiID5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhIFtyZWFkb25seV09XCJmYWxzZVwiIFtzaG93RGlhbG9nXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJyZXBvcnRlRnVlbnRlLmFyY2hpdm9FeGNlbENvbHVtbmFyaW8gPyByZXBvcnRlRnVlbnRlLmFyY2hpdm9FeGNlbENvbHVtbmFyaW86ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtleHRlbnNpb25lc109XCIneGxzO3hsc3g7eGxzbSdcIiBbbW9zdHJhcm9ibGljYXJnb109XCJ0cnVlXCIgW2xhYmVscmFyXT1cIidwbGFudGlsbGEnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvQ29sdW1uYXJpbygkZXZlbnQpXCI+PC9hcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5ob2phRXhjZWxcIiBzaXplPVwiMjVcIiBtYXhsZW5ndGg9XCIyMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbm9tYnJlJyB8IHRyYW5zbGF0ZSB9fSB7eydkZScgfCB0cmFuc2xhdGUgfX0ge3snbGEnIHwgdHJhbnNsYXRlIH19IHt7J2hvamEnIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmZpbGFJbmljaW9Db2x1bW5hcmlvXCIgbWF4bGVuZ3RoPVwiNVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmaWxhaW5pY2lvY29sdW1uYXJpbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9DaWZyYWRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIiBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmNpZnJhZG9Db2x1bW5hcmlvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwb2NpZnJhZG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC01MCBtYXgtaC0xMDBcIiAgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLnNpbnRheGlzQ29sdW1uYXJpb1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydzaW50YXhpc2NvbHVtbmFyaW8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZWZyZXNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJhY3R1YWxpemFyKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvcC1maWVsZHNldD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aDEgY2xhc3M9XCJ0ZXh0LXhsXCI+e3snY29sdW1uYWFkaWNpb25hbCcgfCB0cmFuc2xhdGV9fTwvaDE+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgZm9udC1zZW1pYm9sZFwiIGljb249XCJwaSBwaS1wbHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm51ZXZhQ29sdW1uYUFkaWNpb25hbCgpXCIgbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhdmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCAgbWItMVwiICpuZ0lmPVwidmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJ2ZXJOdWV2b0NvbHVtbmFBZGljaW9uYWwgPSBmYWxzZTsgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbCA9IGZhbHNlO1wiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snY29sdW1uYWFkaWNpb25hbCcgfCB0cmFuc2xhdGV9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJjb2x1bW5hc0FkaWNpb25hbGVzXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiICBcclxuICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwiY29sdW1uYXNBZGljaW9uYWxlcy5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwiY29sdW1uYXNBZGljaW9uYWxlcy5sZW5ndGggPiAxMFwiICpuZ0lmPVwiIXZlck51ZXZvQ29sdW1uYUFkaWNpb25hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9uUm93U2VsZWN0KT1cInZlckRldGFsbGVBZGljaW9uYWwoJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cInZlckRldGFsbGVBZGljaW9uYWwoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snbm9tYnJlJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snb3JkZW4nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtY29sdW1uYWFkaWNpb25hbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJjb2x1bW5hYWRpY2lvbmFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tjb2x1bW5hYWRpY2lvbmFsLm5vbWJyZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2NvbHVtbmFhZGljaW9uYWwub3JkZW59fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L3AtdGFibGU+XHJcbiAgICAgICAgICAgICAgICA8cC1maWVsZHNldCBjbGFzcz1cImZpZWxkc2ludGl0dWxvXCIgICpuZ0lmPVwidmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtM1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY29sdW1uYUFkaWNpb25hbC5ub21icmVcIiBtYXhsZW5ndGg9XCIxMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5ub21icmUpICYmIGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLm5vbWJyZSkgJiYgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYWxpYXMnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0zXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwiY29sdW1uYUFkaWNpb25hbC5vcmRlblwiIG1heGxlbmd0aD1cIjVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLm9yZGVuKSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5vcmRlbikgJiYgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmRlbicgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFPcmRlbmFtaWVudG9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbmFBZGljaW9uYWwub3JkZXJCeVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5vcmRlckJ5KSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5vcmRlckJ5KSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW5hbWllbnRvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtM1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCBbKG5nTW9kZWwpXT1cImNvbHVtbmFBZGljaW9uYWwub3JkZW5Db25zdWx0YVwiIG1heGxlbmd0aD1cIjVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLm9yZGVuQ29uc3VsdGEpICYmIGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLm9yZGVuQ29uc3VsdGEpICYmIGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWxcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW5jb25zdWx0YScgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTEyXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC01MCBtYXgtaC0xMDBcIiBwSW5wdXRUZXh0YXJlYSBbKG5nTW9kZWwpXT1cImNvbHVtbmFBZGljaW9uYWwuc2ludGF4aXNcIiBtYXhsZW5ndGg9XCI0MDAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFBZGljaW9uYWwuc2ludGF4aXMpICYmIGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLnNpbnRheGlzKSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3NpbnRheGlzJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMge3tjb2x1bW5hQWRpY2lvbmFsLmxsYXZlVGFibGEgPyAnZ2x5cGhpY29ucy1yZWZyZXNoJyA6ICdnbHlwaGljb25zLWZsb3BweS1zYXZlJ319XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7Y29sdW1uYUFkaWNpb25hbC5sbGF2ZVRhYmxhID8gKCdsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlKSA6ICgnbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZSl9fVwiIChjbGljayk9XCJndWFyZGFyQ29sdW1uYUFkaWNpb25hbCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYmluXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbmFBZGljaW9uYWwubGxhdmVUYWJsYSAhPSBudWxsXCIgbGFiZWw9XCJ7eydsaW5rX2VsaW1pbmFyJyB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWxpbWluYXJDb2x1bW5hQWRpY2lvbmFsKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvcC1maWVsZHNldD5cclxuICAgICAgICAgICAgPC9wLWFjY29yZGlvblRhYj5cclxuICAgICAgICAgICAgPHAtYWNjb3JkaW9uVGFiID5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj48aSBjbGFzcz1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1ub3Rlc1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICB7eydtYXJjYWRvcmVzJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cInAtYnV0dG9uLXNlY29uZGFyeSBmb250LXNlbWlib2xkXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibnVldm9NYXJjYWRvckNvbHVtbmFyaW8oKVwiIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCAgbWItMVwiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cInZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvID0gZmFsc2U7IGNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpbyA9IGZhbHNlO1wiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snbWFyY2Fkb3InIHwgdHJhbnNsYXRlfX1cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGV2cm9uLWxlZnRcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgZm9udC1zZW1pYm9sZCBmbGV4LXNocmluay0wIFwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwibWFyY2Fkb3Jlc0NvbHVtbmFyaW9cIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgIFxyXG4gICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjEwXCIgW3RvdGFsUmVjb3Jkc109XCJtYXJjYWRvcmVzQ29sdW1uYXJpby5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwibWFyY2Fkb3Jlc0NvbHVtbmFyaW8ubGVuZ3RoID4gMTBcIiAqbmdJZj1cIiF2ZXJOdWV2b01hcmNhZG9yQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9uUm93U2VsZWN0KT1cInZlckRldGFsbGVNYXJjYWRvckNvbHVtbmFyaW8oJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cInZlckRldGFsbGVNYXJjYWRvckNvbHVtbmFyaW8oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snbm9tYnJlJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3sndGlwb21hcmNhZG9yJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LW1hcmNhZG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cIm1hcmNhZG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjYWRvci5tYXJjYWRvcn19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmNhZG9yLnRpcG8gfCByZXBvcnRlQ29sdW1uYXJpb1BpcGU6ICdsaXN0YVRpcG9NYXJjYWRvcid9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L3AtdGFibGU+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwibWFyY2Fkb3JDb2x1bW5hcmlvLmRlc2NyaXBjaW9uXCIgbWF4bGVuZ3RoPVwiNDAwMFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JDb2x1bW5hcmlvLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvckNvbHVtbmFyaW8uZGVzY3JpcGNpb24pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpb1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwibWFyY2Fkb3JDb2x1bW5hcmlvLm1hcmNhZG9yXCIgbWF4bGVuZ3RoPVwiNTBcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JDb2x1bW5hcmlvLm1hcmNhZG9yKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yQ29sdW1uYXJpby5tYXJjYWRvcikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J21hcmNhZG9yJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9NYXJjYWRvckNvbHVtbmFyaW9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yQ29sdW1uYXJpby50aXBvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvckNvbHVtbmFyaW8udGlwbykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JDb2x1bW5hcmlvLnRpcG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMlwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtNTAgbWF4LWgtMTAwXCIgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJtYXJjYWRvckNvbHVtbmFyaW8udGV4dG9SZWdpc3Ryb1wiIG1heGxlbmd0aD1cIjQwMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JDb2x1bW5hcmlvLnRleHRvUmVnaXN0cm8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yQ29sdW1uYXJpby50ZXh0b1JlZ2lzdHJvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW9cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndmFsb3InIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyB7e21hcmNhZG9yQ29sdW1uYXJpby5sbGF2ZVRhYmxhID8gJ2dseXBoaWNvbnMtcmVmcmVzaCcgOiAnZ2x5cGhpY29ucy1mbG9wcHktc2F2ZSd9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7e21hcmNhZG9yQ29sdW1uYXJpby5sbGF2ZVRhYmxhID8gKCdsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlKSA6ICgnbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZSl9fVwiIChjbGljayk9XCJndWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1iaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibWFyY2Fkb3JDb2x1bW5hcmlvLmxsYXZlVGFibGEgIT0gbnVsbFwiIGxhYmVsPVwie3snbGlua19lbGltaW5hcicgfCB0cmFuc2xhdGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVsaW1pbmFyTWFyY2Fkb3JDb2x1bW5hcmlvKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3AtYWNjb3JkaW9uVGFiPlxyXG4gICAgICAgIDwvcC1hY2NvcmRpb24+XHJcbiAgICA8L3AtdGFiUGFuZWw+XHJcbiAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7eydncmFmaWNhJyB8IHRyYW5zbGF0ZSB9fVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmNvZGlnb1wiIHNpemU9XCIyNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snY29kaWdvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS50aXR1bG9HcmFmaWNvXCIgc2l6ZT1cIjI1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIxMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXR1bG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0dyYWZpY29cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLnRpcG9HcmFmaWNvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwiY29kaWdvXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiICpuZ0lmPVwiaXNTcWwoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXJlZnJlc2hcIiAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJndWFyZGFyR3JhZmljbygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkIGJhY2tncm91bmQtMTAwXCIgaWNvbj1cInBpIHBpLWV5ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua192ZXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwidmVyR3JhZmljbygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJwYWdpbmFkb3JDb2x1bW5hc1wiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgW3Jvd3NdPVwiMjBcIiBbdG90YWxSZWNvcmRzXT1cInBhZ2luYWRvckNvbHVtbmFzLmxlbmd0aFwiIFtwYWdpbmF0b3JdPVwicGFnaW5hZG9yQ29sdW1uYXMubGVuZ3RoID4gMjBcIiA+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJmb25kb1RhYmxhUGluY2lwYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydzaW50YXhpcycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2FjY2lvbicgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtYmVhbj5cclxuICAgICAgICAgICAgICAgIDx0ciBbcFNlbGVjdGFibGVSb3ddPVwiYmVhblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e2JlYW4ubm9tYnJlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e2JlYW4uc2ludGF4aXN9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmVhbi50aXBvRGF0byB8IHJlcG9ydGVGdWVudGVQaXBlIDogJ2xpc3RhVGlwb0RhdG8nfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFHcmFmaWNvU2VuY2lsbG9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImJlYW4uZ3JhZmljb0Z1ZW50ZVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwiY29kaWdvXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIiBjbGFzcz1cInAtMyBmb250LW1lZGl1bSBlbXB0eW1lc3NhZ2VcIj57eydtZW5zYWpldGFibGF2YWNpYScgfCB0cmFuc2xhdGV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvcC10YWJsZT4gXHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yIG1iLTJcIj5cclxuICAgICAgICAgICAgPGgxIGNsYXNzPVwidGV4dC14bFwiPkNvbG9yZXM8L2gxPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cIm51ZXZvQ29sb3JDYXRlZ29yaWEoKVwiIGljb249XCJwaSBwaS1wbHVzXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJoYWJpbGl0YUNhbXBvXCIgY2xhc3M9XCJwLXJpcHBsZSBwLWVsZW1lbnQgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24tc2Vjb25kYXJ5IG1iLTJcIj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwicGFnaW5hZG9yQ29sb3Jlc0dyYWZpY2FcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCIgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLXN0cmlwZWRcIlxyXG4gICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwicGFnaW5hZG9yQ29sb3Jlc0dyYWZpY2EubGVuZ3RoXCJcclxuICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJwYWdpbmFkb3JDb2xvcmVzR3JhZmljYS5sZW5ndGggPiAxMFwiIFxyXG4gICAgICAgICAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIiBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie2ZpcnN0fSBhbCB7bGFzdH0gZGUge3RvdGFsUmVjb3Jkc30gcmVnaXN0cm9zXCIgXHJcbiAgICAgICAgICAgIGVkaXRNb2RlPVwicm93XCIgZGF0YUtleT1cImxsYXZlVGFibGFcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDQ1JVwiPnt7J2NhdGVnb3JpYScgfCB0cmFuc2xhdGV9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDQ1JVwiPnt7J2NvbG9yJyB8IHRyYW5zbGF0ZX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAlXCI+IDwvdGg+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiVGFibGFOdWV2b1JlZ2lzdHJvXCIgKm5nSWY9XCJ2ZXJDb2xvckNhdGVnb3JpYURldGFsbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogNDUlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjb2xvckNhdGVnb3JpYS50aXR1bG9cIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbG9yQ2F0ZWdvcmlhLnRpdHVsbykgJiYgY2xpY2tHdWFyZGFyQ29sb3JDYXRlZ29yaWFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2xvckNhdGVnb3JpYS50aXR1bG8pICYmIGNsaWNrR3VhcmRhckNvbG9yQ2F0ZWdvcmlhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogNDUlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY29sb3JQaWNrZXIgWyhuZ01vZGVsKV09XCJjb2xvckNhdGVnb3JpYS5iYW5kYVwiIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sb3JDYXRlZ29yaWEuYmFuZGEpICYmIGNsaWNrR3VhcmRhckNvbG9yQ2F0ZWdvcmlhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbG9yQ2F0ZWdvcmlhLmJhbmRhKSAmJiBjbGlja0d1YXJkYXJDb2xvckNhdGVnb3JpYVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1jaGVja1wiIChjbGljayk9XCJhZ3JlZ2FyQ29sb3JDYXRlZ29yaWEoY29sb3JDYXRlZ29yaWEpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXN1Y2Nlc3MgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ2ZXJDb2xvckNhdGVnb3JpYURldGFsbGUgPSBmYWxzZVwiIGljb249XCJwaSBwaS10aW1lc1wiIChjbGljayk9XCJjYW5jZWxhckNvbG9yQ2F0ZWdvcmlhKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWNvbG9yIGxldC1lZGl0aW5nPVwiZWRpdGluZ1wiIGxldC1yaT1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8dHIgW3BFZGl0YWJsZVJvd109XCJjb2xvclwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogNDUlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY29sb3IudGl0dWxvXCIgc3R5bGU9XCJ3aWR0aDogLXdlYmtpdC1maWxsLWF2YWlsYWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbG9yLnRpdHVsbykgJiYgY2xpY2tHdWFyZGFyQ29sb3JDYXRlZ29yaWFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbG9yLnRpdHVsbykgJiYgY2xpY2tHdWFyZGFyQ29sb3JDYXRlZ29yaWFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb2xvci50aXR1bG99fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogNDUlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDEwMCVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY29sb3JQaWNrZXIgWyhuZ01vZGVsKV09XCJjb2xvci5iYW5kYVwiIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2xvci5iYW5kYSkgJiYgY2xpY2tHdWFyZGFyQ29sb3JDYXRlZ29yaWFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2xvci5iYW5kYSkgJiYgY2xpY2tHdWFyZGFyQ29sb3JDYXRlZ29yaWFcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNvbG9yUGlja2VyIFsobmdNb2RlbCldPVwiY29sb3IuYmFuZGFcIiBbZGlzYWJsZWRdPVwidHJ1ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDSEVDSyBHVUFSREFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBTYXZlRWRpdGFibGVSb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hlY2tcIiAoY2xpY2spPVwiYWdyZWdhckNvbG9yQ2F0ZWdvcmlhKGNvbG9yKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zdWNjZXNzIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0FOQ0VMQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcENhbmNlbEVkaXRhYmxlUm93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCIgKGNsaWNrKT1cImNhbmNlbGFyRWRpY2lvbkNvbG9yKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRURJVEFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwSW5pdEVkaXRhYmxlUm93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1wZW5jaWxcIiBbZGlzYWJsZWRdPVwiaGFiaWxpdGFDYW1wb1wiIChjbGljayk9XCJpbmljaWFyRWRpY2lvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXNlY29uZGFyeSBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVMSU1JTkFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwRGVsZXRlRWRpdGFibGVSb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdHJhc2hcIiAoY2xpY2spPVwiZWxpbWluYXJDb2xvckNhdGVnb3JpYSgkZXZlbnQsIGNvbG9yKVwiIFtkaXNhYmxlZF09XCJoYWJpbGl0YUNhbXBvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLW91dGxpbmVkIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPnt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9wLXRhYmxlPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGNhcmQgbXQtM1wiICpuZ0lmPVwiZ3JhZmljYVwiPlxyXG4gICAgICAgICAgICA8aDEgY2xhc3M9XCJ0ZXh0LXhsXCI+e3snZ3JhZmljYScgfCB0cmFuc2xhdGV9fTwvaDE+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMzUlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMzAlXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1jaGFydCBbdHlwZV09XCJ0aXBvR3JhZmljYVwiIFtkYXRhXT1cImdyYWZpY2EuZGF0b3NHcmFmaWNhLmRhdGFcIiBbb3B0aW9uc109XCJncmFmaWNhLmRhdG9zR3JhZmljYS5vcHRpb25zXCI+PC9wLWNoYXJ0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiAzNSVcIj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvcC10YWJQYW5lbD5cclxuPC9wLXRhYlZpZXc+Il19