general-library-union 2.9.38 → 2.9.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.browserslistrc +15 -0
- package/.editorconfig +16 -0
- package/.vscode/extensions.json +4 -0
- package/.vscode/launch.json +20 -0
- package/.vscode/tasks.json +42 -0
- package/angular.json +143 -0
- package/karma.conf.js +44 -0
- package/ng-package.json +21 -0
- package/package.json +73 -62
- package/{public-api.d.ts → public-api.ts} +201 -161
- package/src/app/app.component.html +12 -0
- package/src/app/app.component.scss +0 -0
- package/src/app/app.component.spec.ts +29 -0
- package/src/app/app.component.ts +34 -0
- package/src/app/app.config.ts +43 -0
- package/src/app/app.module.ts +10 -0
- package/src/app/app.routes.ts +88 -0
- package/src/app/core/componentes/breadcrumb/breadcrumb.component.html +6 -0
- package/src/app/core/componentes/breadcrumb/breadcrumb.component.scss +0 -0
- package/src/app/core/componentes/breadcrumb/breadcrumb.component.ts +39 -0
- package/src/app/core/componentes/carga-breadcrumb/carga-breadcrumb.component.html +1 -0
- package/src/app/core/componentes/carga-breadcrumb/carga-breadcrumb.component.scss +0 -0
- package/src/app/core/componentes/carga-breadcrumb/carga-breadcrumb.component.ts +31 -0
- package/src/app/core/componentes/carga-pantalla-completa/carga-pantalla-completa.component.html +9 -0
- package/src/app/core/componentes/carga-pantalla-completa/carga-pantalla-completa.component.scss +28 -0
- package/src/app/core/componentes/carga-pantalla-completa/carga-pantalla-completa.component.ts +32 -0
- package/src/app/core/componentes/filtro-general/filtro-general.component.html +34 -0
- package/src/app/core/componentes/filtro-general/filtro-general.component.scss +3 -0
- package/src/app/core/componentes/filtro-general/filtro-general.component.ts +202 -0
- package/src/app/core/componentes/footer/footer.component.html +13 -0
- package/src/app/core/componentes/footer/footer.component.scss +3 -0
- package/src/app/core/componentes/footer/footer.component.ts +20 -0
- package/src/app/core/componentes/formulariodinamico/formulariodinamico.component.html +267 -0
- package/src/app/core/componentes/formulariodinamico/formulariodinamico.component.scss +21 -0
- package/src/app/core/componentes/formulariodinamico/formulariodinamico.component.ts +275 -0
- package/src/app/core/componentes/formulariodinamico/objetosformulario/{Cambio.d.ts → Cambio.ts} +13 -7
- package/src/app/core/componentes/formulariodinamico/objetosformulario/CampoFormulario.ts +118 -0
- package/src/app/core/componentes/formulariodinamico/objetosformulario/CampoFormularioCons.ts +76 -0
- package/src/app/core/componentes/formulariodinamico/objetosformulario/CampoFormularioNuevo.ts +67 -0
- package/src/app/core/componentes/formulariodinamico/objetosformulario/HashDirective.ts +11 -0
- package/src/app/core/componentes/inicio-component/inicio-component.component.html +29 -0
- package/src/app/core/componentes/inicio-component/inicio-component.component.scss +69 -0
- package/src/app/core/componentes/inicio-component/inicio-component.component.ts +65 -0
- package/src/app/core/componentes/menu/menu.component.html +13 -0
- package/src/app/core/componentes/menu/menu.component.scss +36 -0
- package/src/app/core/componentes/menu/menu.component.ts +35 -0
- package/src/app/core/componentes/tabla-general/tabla-general.component.html +90 -0
- package/src/app/core/componentes/tabla-general/tabla-general.component.scss +0 -0
- package/src/app/core/componentes/tabla-general/tabla-general.component.ts +96 -0
- package/src/app/core/core.module.ts +22 -0
- package/src/app/core/errores/authentication.error.ts +6 -0
- package/src/app/core/modelos/error-response.model.ts +9 -0
- package/src/app/core/modelos/table-column.model.ts +10 -0
- package/src/app/core/modelos/user.model.ts +6 -0
- package/src/app/core/plantilla-general/plantilla-general.template.html +139 -0
- package/src/app/core/plantilla-general/plantilla-general.template.scss +37 -0
- package/src/app/core/plantilla-general/plantilla-general.template.ts +233 -0
- package/src/app/core/servicios/auth.service.ts +189 -0
- package/src/app/core/servicios/cargar-control-funcionalidad.service.ts +49 -0
- package/src/app/core/servicios/data-exporter-table.utils.ts +78 -0
- package/src/app/core/servicios/error-interceptor.service.ts +208 -0
- package/src/app/core/servicios/guardias/auth.guard.ts +51 -0
- package/src/app/core/servicios/guardias/publico.guard.ts +26 -0
- package/src/app/core/servicios/interceptores/loading-interceptor.ts +37 -0
- package/src/app/core/servicios/interceptores/token-interceptor.service.ts +177 -0
- package/src/app/core/servicios/loading.service.ts +48 -0
- package/src/app/core/servicios/menu.service.ts +153 -0
- package/src/app/core/servicios/spinner-service.ts +18 -0
- package/src/app/core/servicios/storage.service.ts +68 -0
- package/src/app/core/servicios/template.service.ts +91 -0
- package/src/app/core/servicios/toast.service.ts +114 -0
- package/src/app/core/servicios/utils.service.ts +362 -0
- package/src/app/core/sharedlib.module.ts +11 -0
- package/src/app/core/utilidades/color.util.ts +197 -0
- package/src/app/layout/api/{menuchangeevent.d.ts → menuchangeevent.ts} +4 -4
- package/src/app/layout/app.breadcrumb.component.html +20 -0
- package/src/app/layout/app.breadcrumb.component.ts +78 -0
- package/src/app/layout/app.footer.component.html +18 -0
- package/src/app/layout/app.footer.component.ts +15 -0
- package/src/app/layout/app.layout.component.html +20 -0
- package/src/app/layout/app.layout.component.ts +201 -0
- package/src/app/layout/app.layout.module.ts +9 -0
- package/src/app/layout/app.menu.component.html +6 -0
- package/src/app/layout/app.menu.component.ts +51 -0
- package/src/app/layout/app.menu.service.ts +23 -0
- package/src/app/layout/app.menuitem.component.ts +252 -0
- package/src/app/layout/app.menuprofile.component.html +35 -0
- package/src/app/layout/app.menuprofile.component.ts +60 -0
- package/src/app/layout/app.rightmenu.component.html +72 -0
- package/src/app/layout/app.rightmenu.component.ts +24 -0
- package/src/app/layout/app.sidebar.component.html +40 -0
- package/src/app/layout/app.sidebar.component.ts +81 -0
- package/src/app/layout/app.topbar.component.html +214 -0
- package/src/app/layout/app.topbar.component.ts +335 -0
- package/src/app/layout/config/app.config.component.html +125 -0
- package/src/app/layout/config/app.config.component.ts +206 -0
- package/src/app/layout/config/app.config.module.ts +11 -0
- package/src/app/layout/service/app.layout.service.ts +191 -0
- package/src/app/publico/pages/login/login.page.html +53 -0
- package/src/app/publico/pages/login/login.page.scss +166 -0
- package/src/app/publico/pages/login/login.page.ts +128 -0
- package/src/app/publico/pages/not-found/not-found.page.html +35 -0
- package/src/app/publico/pages/not-found/not-found.page.scss +2 -0
- package/src/app/publico/pages/not-found/not-found.page.ts +46 -0
- package/src/app/publico/pages/seleccion-rol/seleccion-rol.component.html +58 -0
- package/src/app/publico/pages/seleccion-rol/seleccion-rol.component.scss +49 -0
- package/src/app/publico/pages/seleccion-rol/seleccion-rol.component.ts +176 -0
- package/src/app/publico/pages/timeout/timeout.page.html +24 -0
- package/src/app/publico/pages/timeout/timeout.page.scss +2 -0
- package/src/app/publico/pages/timeout/timeout.page.ts +18 -0
- package/src/app/seguridad/constantes/ConstantesGenerales.ts +30 -0
- package/src/app/seguridad/constantes/ReporteEntradaConstantes.ts +18 -0
- package/src/app/seguridad/constantes/ReporteFuenteConstantes.ts +13 -0
- package/src/app/seguridad/modelos/AplicacionModel.ts +11 -0
- package/src/app/seguridad/modelos/ArchivoPortalModel.ts +16 -0
- package/src/app/seguridad/modelos/AtributoPuntoModel.ts +9 -0
- package/src/app/seguridad/modelos/AtributoSSOportalModel.ts +22 -0
- package/src/app/seguridad/modelos/{AuditoriaArchivoModel.d.ts → AuditoriaArchivoModel.ts} +13 -10
- package/src/app/seguridad/modelos/CargueLineaModel.ts +17 -0
- package/src/app/seguridad/modelos/ColoresRGB.ts +17 -0
- package/src/app/seguridad/modelos/ColumnaFuenteModel.ts +9 -0
- package/src/app/seguridad/modelos/{ColumnaWraperModel.d.ts → ColumnaWraperModel.ts} +7 -6
- package/src/app/seguridad/modelos/ComplementoModel.ts +10 -0
- package/src/app/seguridad/modelos/ComponentePaginaModel.ts +22 -0
- package/src/app/seguridad/modelos/ConexionModel.ts +15 -0
- package/src/app/seguridad/modelos/{ContenidoHtmlPortalModel.d.ts → ContenidoHtmlPortalModel.ts} +25 -20
- package/src/app/seguridad/modelos/ControlFuncionModel.ts +10 -0
- package/src/app/seguridad/modelos/CorreoModel.ts +45 -0
- package/src/app/seguridad/modelos/CorreoWSModel.ts +49 -0
- package/src/app/seguridad/modelos/CruceRecursoPuntoModel.ts +14 -0
- package/src/app/seguridad/modelos/{DatoInicioModel.d.ts → DatoInicioModel.ts} +7 -6
- package/src/app/seguridad/modelos/{EjecucionReporteDataModel.d.ts → EjecucionReporteDataModel.ts} +21 -20
- package/src/app/seguridad/modelos/EmpresaModel.ts +25 -0
- package/src/app/seguridad/modelos/EmpresaSeguridadModel.ts +19 -0
- package/src/app/seguridad/modelos/{EntradaComplementoModel.d.ts → EntradaComplementoModel.ts} +9 -6
- package/src/app/seguridad/modelos/EtiquetaModel.ts +4 -0
- package/src/app/seguridad/modelos/Etiquetas.ts +14 -0
- package/src/app/seguridad/modelos/{ForeingWraperModel.d.ts → ForeingWraperModel.ts} +9 -6
- package/src/app/seguridad/modelos/FuenteCampoAtributoModel.ts +21 -0
- package/src/app/seguridad/modelos/{FuenteCampoModel.d.ts → FuenteCampoModel.ts} +20 -16
- package/src/app/seguridad/modelos/FuenteDato.ts +19 -0
- package/src/app/seguridad/modelos/FuenteEntradaModel.ts +9 -0
- package/src/app/seguridad/modelos/{FuenteGeneralModel.d.ts → FuenteGeneralModel.ts} +55 -36
- package/src/app/seguridad/modelos/FuenteLineaServicioModel.ts +19 -0
- package/src/app/seguridad/modelos/FuenteProcesoGeneralModel.ts +14 -0
- package/src/app/seguridad/modelos/{FuenteServicioModel.d.ts → FuenteServicioModel.ts} +61 -47
- package/src/app/seguridad/modelos/FuncionalidadModel.ts +12 -0
- package/src/app/seguridad/modelos/GeneralModel.ts +16 -0
- package/src/app/seguridad/modelos/{GrupoAccesoModel.d.ts → GrupoAccesoModel.ts} +9 -6
- package/src/app/seguridad/modelos/GrupoControlFuncionModel.ts +12 -0
- package/src/app/seguridad/modelos/GrupoFuenteModel.ts +17 -0
- package/src/app/seguridad/modelos/GrupoPermisoModel.ts +16 -0
- package/src/app/seguridad/modelos/{JoinFromModel.d.ts → JoinFromModel.ts} +4 -4
- package/src/app/seguridad/modelos/ListaServicioModel.ts +18 -0
- package/src/app/seguridad/modelos/LlaveForaneaModel.ts +6 -0
- package/src/app/seguridad/modelos/LoginModel.ts +19 -0
- package/src/app/seguridad/modelos/MensajeSistemaModel.ts +10 -0
- package/src/app/seguridad/modelos/{MenuPortalModel.d.ts → MenuPortalModel.ts} +5 -4
- package/src/app/seguridad/modelos/ModulosModel.ts +17 -0
- package/src/app/seguridad/modelos/{ObjetoReporteModel.d.ts → ObjetoReporteModel.ts} +6 -5
- package/src/app/seguridad/modelos/PaginaPortalModel.ts +23 -0
- package/src/app/seguridad/modelos/ParametroComponenteModel.ts +9 -0
- package/src/app/seguridad/modelos/ParametrosGeneralModel.ts +16 -0
- package/src/app/seguridad/modelos/PermisoFuncionModel.ts +11 -0
- package/src/app/seguridad/modelos/PermisocontenidoModel.ts +20 -0
- package/src/app/seguridad/modelos/{PeticionModel.d.ts → PeticionModel.ts} +20 -15
- package/src/app/seguridad/modelos/PreguntaSeguridadModel.ts +9 -0
- package/src/app/seguridad/modelos/PropiedadModel.ts +12 -0
- package/src/app/seguridad/modelos/PublicacionWebModel.ts +29 -0
- package/src/app/seguridad/modelos/PuntoProcesoModel.ts +7 -0
- package/src/app/seguridad/modelos/RecursoPunto.ts +13 -0
- package/src/app/seguridad/modelos/RecursoPuntoModel.ts +13 -0
- package/src/app/seguridad/modelos/ReporteBanda.ts +9 -0
- package/src/app/seguridad/modelos/ReporteColumna.ts +33 -0
- package/src/app/seguridad/modelos/ReporteColumnario.ts +82 -0
- package/src/app/seguridad/modelos/ReporteColumnarioMarcador.ts +31 -0
- package/src/app/seguridad/modelos/{ReporteEntradaModel.d.ts → ReporteEntradaModel.ts} +21 -19
- package/src/app/seguridad/modelos/{ReporteFuenteModel.d.ts → ReporteFuenteModel.ts} +141 -87
- package/src/app/seguridad/modelos/ReporteMarcador.ts +40 -0
- package/src/app/seguridad/modelos/ReporteSoporte.ts +10 -0
- package/src/app/seguridad/modelos/ReporteTabla.ts +14 -0
- package/src/app/seguridad/modelos/RespuestaModel.ts +10 -0
- package/src/app/seguridad/modelos/{RolModel.d.ts → RolModel.ts} +41 -37
- package/src/app/seguridad/modelos/ServidorCorreoModel.ts +31 -0
- package/src/app/seguridad/modelos/SistemaMensajeModel.ts +11 -0
- package/src/app/seguridad/modelos/SitioPortalModel.ts +29 -0
- package/src/app/seguridad/modelos/TablaFromModel.ts +5 -0
- package/src/app/seguridad/modelos/TareasModel.ts +54 -0
- package/src/app/seguridad/modelos/TextoModel.ts +11 -0
- package/src/app/seguridad/modelos/TipoEtiqueta.ts +8 -0
- package/src/app/seguridad/modelos/UnionModel.ts +14 -0
- package/src/app/seguridad/modelos/{UsuarioModel.d.ts → UsuarioModel.ts} +60 -49
- package/src/app/seguridad/modelos/UsuariogrupoModel.ts +27 -0
- package/src/app/seguridad/modelos/aplicacion-propiedad-model.ts +16 -0
- package/src/app/seguridad/modelos/contenidoCorreoModel.ts +13 -0
- package/src/app/shared/componentes/input-helper-seleccion-plantilla/input-helper-seleccion-plantilla.component.html +47 -0
- package/src/app/shared/componentes/input-helper-seleccion-plantilla/input-helper-seleccion-plantilla.component.scss +8 -0
- package/src/app/shared/componentes/input-helper-seleccion-plantilla/input-helper-seleccion-plantilla.component.ts +144 -0
- package/src/app/shared/servicios/cargar-archivos.service.ts +51 -0
- package/src/app/shared/servicios/cargar-mapas.service.ts +43 -0
- package/src/app/shared/servicios/encriptado-basico.service.ts +54 -0
- package/src/app/shared/servicios/encriptador-simetrico.service.ts +29 -0
- package/src/app/shared/servicios/general.service.ts +124 -0
- package/src/app/shared/servicios/parametros-navegacion.service.ts +20 -0
- package/src/app/shared/servicios/plantillas.service.ts +22 -0
- package/src/app/shared/servicios/tarea.service.ts +71 -0
- package/src/app/shared/utilidades/translate-loader.util.ts +44 -0
- package/src/app/webcommon/pages/cargue-plantilla/cargue-plantilla-general/cargue-plantilla-general.component.html +167 -0
- package/src/app/webcommon/pages/cargue-plantilla/cargue-plantilla-general/cargue-plantilla-general.component.scss +11 -0
- package/src/app/webcommon/pages/cargue-plantilla/cargue-plantilla-general/cargue-plantilla-general.component.ts +425 -0
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-campo-reporte/detalle-campo-reporte.component.html +87 -0
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-campo-reporte/detalle-campo-reporte.component.scss +0 -0
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-campo-reporte/detalle-campo-reporte.component.ts +189 -0
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-distribucion-reporte/detalle-distribucion-reporte.component.html +117 -0
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-distribucion-reporte/detalle-distribucion-reporte.component.scss +0 -0
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-distribucion-reporte/detalle-distribucion-reporte.component.ts +87 -0
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-ejecucion-reporte/detalle-ejecucion-reporte.page.html +158 -0
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-ejecucion-reporte/detalle-ejecucion-reporte.page.scss +6 -0
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-ejecucion-reporte/detalle-ejecucion-reporte.page.ts +345 -0
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-entrada-reporte/detalle-entrada-reporte.component.html +131 -0
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-entrada-reporte/detalle-entrada-reporte.component.scss +0 -0
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-entrada-reporte/detalle-entrada-reporte.component.ts +198 -0
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-punto-proceso-reporte/detalle-punto-proceso-reporte.component.html +206 -0
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-punto-proceso-reporte/detalle-punto-proceso-reporte.component.scss +3 -0
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-punto-proceso-reporte/detalle-punto-proceso-reporte.component.ts +329 -0
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-tipo-reporte/detalle-tipo-reporte.component.html +2114 -0
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-tipo-reporte/detalle-tipo-reporte.component.scss +241 -0
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-tipo-reporte/detalle-tipo-reporte.component.ts +1677 -0
- package/src/app/webcommon/pages/ejecucion-reporte/listado-ejecucion-reporte/listado-ejecucion-reporte.page.html +33 -0
- package/src/app/webcommon/pages/ejecucion-reporte/listado-ejecucion-reporte/listado-ejecucion-reporte.page.scss +0 -0
- package/src/app/webcommon/pages/ejecucion-reporte/listado-ejecucion-reporte/listado-ejecucion-reporte.page.ts +96 -0
- package/src/app/webcommon/pages/ejecucion-reporte-externo/listado-ejecucion-reporte-externo/listado-ejecucion-reporte-externo.component.html +54 -0
- package/src/app/webcommon/pages/ejecucion-reporte-externo/listado-ejecucion-reporte-externo/listado-ejecucion-reporte-externo.component.scss +0 -0
- package/src/app/webcommon/pages/ejecucion-reporte-externo/listado-ejecucion-reporte-externo/listado-ejecucion-reporte-externo.component.ts +111 -0
- package/src/app/webcommon/pages/fuente/importar-fuente-con/importar-fuente-con.component.html +394 -0
- package/src/app/webcommon/pages/fuente/importar-fuente-con/importar-fuente-con.component.scss +10 -0
- package/src/app/webcommon/pages/fuente/importar-fuente-con/importar-fuente-con.component.ts +599 -0
- package/src/app/webcommon/pages/fuente/importar-fuente-general/importar-fuente-general.component.html +130 -0
- package/src/app/webcommon/pages/fuente/importar-fuente-general/importar-fuente-general.component.scss +0 -0
- package/src/app/webcommon/pages/fuente/importar-fuente-general/importar-fuente-general.component.ts +172 -0
- package/src/app/webcommon/pages/fuente-reporte/fuente-reporte.component.html +376 -0
- package/src/app/webcommon/pages/fuente-reporte/fuente-reporte.component.scss +5 -0
- package/src/app/webcommon/pages/fuente-reporte/fuente-reporte.component.ts +749 -0
- package/src/app/webcommon/pages/fuenteGeneral/fuente-general-servicio/fuente-general-servicio.component.html +145 -0
- package/src/app/webcommon/pages/fuenteGeneral/fuente-general-servicio/fuente-general-servicio.component.scss +0 -0
- package/src/app/webcommon/pages/fuenteGeneral/fuente-general-servicio/fuente-general-servicio.component.ts +302 -0
- package/src/app/webcommon/pages/fuenteGeneral/listado-fuente-general/listado-fuente-general.page.html +19 -0
- package/src/app/webcommon/pages/fuenteGeneral/listado-fuente-general/listado-fuente-general.page.scss +0 -0
- package/src/app/webcommon/pages/fuenteGeneral/listado-fuente-general/listado-fuente-general.page.ts +89 -0
- package/src/app/webcommon/pages/fuenteGeneral/mantenimiento-fuente-general/mantenimiento-fuente-general.page.html +714 -0
- package/src/app/webcommon/pages/fuenteGeneral/mantenimiento-fuente-general/mantenimiento-fuente-general.page.scss +0 -0
- package/src/app/webcommon/pages/fuenteGeneral/mantenimiento-fuente-general/mantenimiento-fuente-general.page.ts +688 -0
- package/src/app/webcommon/pipes/dashboard.pipe.ts +79 -0
- package/src/app/webcommon/pipes/fuente.pipe.ts +207 -0
- package/src/app/webcommon/pipes/general.pipe.ts +1043 -0
- package/src/app/webcommon/pipes/reporte-columnario.pipe.ts +101 -0
- package/src/app/webcommon/pipes/reporte-fuente.pipe.ts +306 -0
- package/src/app/webcommon/pipes/sara-general.pipe.ts +289 -0
- package/src/app/webcommon/popups/popup-campos-fuente-general/popup-campos-fuente-general.component.html +90 -0
- package/src/app/webcommon/popups/popup-campos-fuente-general/popup-campos-fuente-general.component.scss +0 -0
- package/src/app/webcommon/popups/popup-campos-fuente-general/popup-campos-fuente-general.component.ts +262 -0
- package/src/app/webcommon/popups/popup-convertir-plantillas/popup-convertir-plantillas.component.html +50 -0
- package/src/app/webcommon/popups/popup-convertir-plantillas/popup-convertir-plantillas.component.scss +0 -0
- package/src/app/webcommon/popups/popup-convertir-plantillas/popup-convertir-plantillas.component.ts +135 -0
- package/src/app/webcommon/popups/popup-punto-proceso/popup-punto-proceso.component.html +41 -0
- package/src/app/webcommon/popups/popup-punto-proceso/popup-punto-proceso.component.scss +0 -0
- package/src/app/webcommon/popups/popup-punto-proceso/popup-punto-proceso.component.ts +283 -0
- package/src/app/webcommon/popups/popup-recurso/popup-recurso.component.html +179 -0
- package/src/app/webcommon/popups/popup-recurso/popup-recurso.component.scss +3 -0
- package/src/app/webcommon/popups/popup-recurso/popup-recurso.component.ts +266 -0
- package/src/app/webcommon/popups/popup-reporte/popup-reporte.component.html +261 -0
- package/src/app/webcommon/popups/popup-reporte/popup-reporte.component.scss +13 -0
- package/src/app/webcommon/popups/popup-reporte/popup-reporte.component.ts +519 -0
- package/src/app/webcommon/popups/popup-sentencia/popup-sentencia.component.html +10 -0
- package/src/app/webcommon/popups/popup-sentencia/popup-sentencia.component.scss +5 -0
- package/src/app/webcommon/popups/popup-sentencia/popup-sentencia.component.ts +58 -0
- package/src/app/webcommon/popups/popup-tablas-fuente/popup-tablas-fuente.component.html +71 -0
- package/src/app/webcommon/popups/popup-tablas-fuente/popup-tablas-fuente.component.scss +0 -0
- package/src/app/webcommon/popups/popup-tablas-fuente/popup-tablas-fuente.component.ts +151 -0
- package/src/app/webcommon/popups/punto-proceso-comp/punto-proceso-comp.component.html +11 -0
- package/src/app/webcommon/popups/punto-proceso-comp/punto-proceso-comp.component.scss +0 -0
- package/src/app/webcommon/popups/punto-proceso-comp/punto-proceso-comp.component.ts +82 -0
- package/src/app/webcommon/services/carguelinea.service.ts +72 -0
- package/src/app/webcommon/services/dashboard.service.ts +258 -0
- package/src/app/webcommon/services/ejecucionreporte.service.ts +160 -0
- package/src/app/webcommon/services/fechaUtils.service.ts +117 -0
- package/src/app/webcommon/services/fuentegeneral.service.ts +74 -0
- package/src/app/webcommon/services/homologacion.service.ts +49 -0
- package/src/app/webcommon/services/plantillas.service.ts +165 -0
- package/src/app/webcommon/services/reportes.service.ts +133 -0
- package/src/app/webcommon/webcommon.module.ts +11 -0
- package/src/environments/environment.prod.ts +3 -0
- package/src/environments/environment.ts +25 -0
- package/src/favicon.ico +0 -0
- package/src/index.html +14 -0
- package/src/main.ts +12 -0
- package/src/polyfills.ts +53 -0
- package/src/styles/primeng/sass/overrides/_theme_styles.scss +1 -1
- package/src/styles/primeng/sass/overrides/_theme_styles_dark.scss +1 -1
- package/src/test.ts +14 -0
- package/tsconfig.app.json +15 -0
- package/tsconfig.json +35 -0
- package/tsconfig.spec.json +18 -0
- package/esm2022/general-library-union.mjs +0 -5
- package/esm2022/public-api.mjs +0 -180
- package/esm2022/src/app/core/componentes/breadcrumb/breadcrumb.component.mjs +0 -40
- package/esm2022/src/app/core/componentes/carga-pantalla-completa/carga-pantalla-completa.component.mjs +0 -28
- package/esm2022/src/app/core/componentes/filtro-general/filtro-general.component.mjs +0 -194
- package/esm2022/src/app/core/componentes/footer/footer.component.mjs +0 -16
- package/esm2022/src/app/core/componentes/formulariodinamico/formulariodinamico.component.mjs +0 -272
- package/esm2022/src/app/core/componentes/formulariodinamico/objetosformulario/Cambio.mjs +0 -11
- package/esm2022/src/app/core/componentes/formulariodinamico/objetosformulario/CampoFormulario.mjs +0 -124
- package/esm2022/src/app/core/componentes/formulariodinamico/objetosformulario/CampoFormularioCons.mjs +0 -73
- package/esm2022/src/app/core/componentes/formulariodinamico/objetosformulario/CampoFormularioNuevo.mjs +0 -59
- package/esm2022/src/app/core/componentes/formulariodinamico/objetosformulario/HashDirective.mjs +0 -21
- package/esm2022/src/app/core/componentes/inicio-component/inicio-component.component.mjs +0 -67
- package/esm2022/src/app/core/componentes/menu/menu.component.mjs +0 -37
- package/esm2022/src/app/core/componentes/tabla-general/tabla-general.component.mjs +0 -93
- package/esm2022/src/app/core/core.module.mjs +0 -23
- package/esm2022/src/app/core/errores/authentication.error.mjs +0 -7
- package/esm2022/src/app/core/modelos/error-response.model.mjs +0 -2
- package/esm2022/src/app/core/modelos/table-column.model.mjs +0 -2
- package/esm2022/src/app/core/modelos/user.model.mjs +0 -7
- package/esm2022/src/app/core/plantilla-general/plantilla-general.template.mjs +0 -230
- package/esm2022/src/app/core/servicios/auth.service.mjs +0 -185
- package/esm2022/src/app/core/servicios/cargar-control-funcionalidad.service.mjs +0 -57
- package/esm2022/src/app/core/servicios/data-exporter-table.utils.mjs +0 -64
- package/esm2022/src/app/core/servicios/error-interceptor.service.mjs +0 -214
- package/esm2022/src/app/core/servicios/guardias/auth.guard.mjs +0 -66
- package/esm2022/src/app/core/servicios/guardias/publico.guard.mjs +0 -35
- package/esm2022/src/app/core/servicios/interceptores/loading-interceptor.mjs +0 -37
- package/esm2022/src/app/core/servicios/interceptores/token-interceptor.service.mjs +0 -180
- package/esm2022/src/app/core/servicios/loading.service.mjs +0 -43
- package/esm2022/src/app/core/servicios/menu.service.mjs +0 -146
- package/esm2022/src/app/core/servicios/spinner-service.mjs +0 -22
- package/esm2022/src/app/core/servicios/storage.service.mjs +0 -68
- package/esm2022/src/app/core/servicios/template.service.mjs +0 -99
- package/esm2022/src/app/core/servicios/toast.service.mjs +0 -120
- package/esm2022/src/app/core/servicios/utils.service.mjs +0 -335
- package/esm2022/src/app/core/sharedlib.module.mjs +0 -16
- package/esm2022/src/app/core/utilidades/color.util.mjs +0 -177
- package/esm2022/src/app/layout/api/menuchangeevent.mjs +0 -2
- package/esm2022/src/app/layout/app.breadcrumb.component.mjs +0 -71
- package/esm2022/src/app/layout/app.footer.component.mjs +0 -18
- package/esm2022/src/app/layout/app.layout.component.mjs +0 -188
- package/esm2022/src/app/layout/app.layout.module.mjs +0 -15
- package/esm2022/src/app/layout/app.menu.component.mjs +0 -51
- package/esm2022/src/app/layout/app.menu.service.mjs +0 -24
- package/esm2022/src/app/layout/app.menuitem.component.mjs +0 -296
- package/esm2022/src/app/layout/app.menuprofile.component.mjs +0 -78
- package/esm2022/src/app/layout/app.rightmenu.component.mjs +0 -24
- package/esm2022/src/app/layout/app.sidebar.component.mjs +0 -92
- package/esm2022/src/app/layout/app.topbar.component.mjs +0 -345
- package/esm2022/src/app/layout/service/app.layout.service.mjs +0 -134
- package/esm2022/src/app/publico/pages/login/login.page.mjs +0 -129
- package/esm2022/src/app/publico/pages/not-found/not-found.page.mjs +0 -51
- package/esm2022/src/app/publico/pages/seleccion-rol/seleccion-rol.component.mjs +0 -167
- package/esm2022/src/app/publico/pages/timeout/timeout.page.mjs +0 -20
- package/esm2022/src/app/seguridad/constantes/ConstantesGenerales.mjs +0 -30
- package/esm2022/src/app/seguridad/constantes/ReporteEntradaConstantes.mjs +0 -19
- package/esm2022/src/app/seguridad/modelos/AplicacionModel.mjs +0 -8
- package/esm2022/src/app/seguridad/modelos/ArchivoPortalModel.mjs +0 -14
- package/esm2022/src/app/seguridad/modelos/AtributoPuntoModel.mjs +0 -9
- package/esm2022/src/app/seguridad/modelos/AtributoSSOportalModel.mjs +0 -17
- package/esm2022/src/app/seguridad/modelos/AuditoriaArchivoModel.mjs +0 -11
- package/esm2022/src/app/seguridad/modelos/CargueLineaModel.mjs +0 -13
- package/esm2022/src/app/seguridad/modelos/ColoresRGB.mjs +0 -18
- package/esm2022/src/app/seguridad/modelos/ColumnaFuenteModel.mjs +0 -9
- package/esm2022/src/app/seguridad/modelos/ColumnaWraperModel.mjs +0 -6
- package/esm2022/src/app/seguridad/modelos/ComplementoModel.mjs +0 -7
- package/esm2022/src/app/seguridad/modelos/ComponentePaginaModel.mjs +0 -21
- package/esm2022/src/app/seguridad/modelos/ConexionModel.mjs +0 -14
- package/esm2022/src/app/seguridad/modelos/ContenidoHtmlPortalModel.mjs +0 -21
- package/esm2022/src/app/seguridad/modelos/ControlFuncionModel.mjs +0 -8
- package/esm2022/src/app/seguridad/modelos/CorreoModel.mjs +0 -35
- package/esm2022/src/app/seguridad/modelos/CorreoWSModel.mjs +0 -37
- package/esm2022/src/app/seguridad/modelos/CruceRecursoPuntoModel.mjs +0 -14
- package/esm2022/src/app/seguridad/modelos/DatoInicioModel.mjs +0 -6
- package/esm2022/src/app/seguridad/modelos/EjecucionReporteDataModel.mjs +0 -14
- package/esm2022/src/app/seguridad/modelos/EmpresaModel.mjs +0 -25
- package/esm2022/src/app/seguridad/modelos/EmpresaSeguridadModel.mjs +0 -19
- package/esm2022/src/app/seguridad/modelos/EntradaComplementoModel.mjs +0 -7
- package/esm2022/src/app/seguridad/modelos/EtiquetaModel.mjs +0 -5
- package/esm2022/src/app/seguridad/modelos/Etiquetas.mjs +0 -12
- package/esm2022/src/app/seguridad/modelos/ForeingWraperModel.mjs +0 -6
- package/esm2022/src/app/seguridad/modelos/FuenteCampoAtributoModel.mjs +0 -16
- package/esm2022/src/app/seguridad/modelos/FuenteCampoModel.mjs +0 -17
- package/esm2022/src/app/seguridad/modelos/FuenteDato.mjs +0 -19
- package/esm2022/src/app/seguridad/modelos/FuenteEntradaModel.mjs +0 -9
- package/esm2022/src/app/seguridad/modelos/FuenteGeneralModel.mjs +0 -37
- package/esm2022/src/app/seguridad/modelos/FuenteLineaServicioModel.mjs +0 -16
- package/esm2022/src/app/seguridad/modelos/FuenteProcesoGeneralModel.mjs +0 -11
- package/esm2022/src/app/seguridad/modelos/FuenteServicioModel.mjs +0 -51
- package/esm2022/src/app/seguridad/modelos/FuncionalidadModel.mjs +0 -10
- package/esm2022/src/app/seguridad/modelos/GeneralModel.mjs +0 -15
- package/esm2022/src/app/seguridad/modelos/GrupoAccesoModel.mjs +0 -7
- package/esm2022/src/app/seguridad/modelos/GrupoControlFuncionModel.mjs +0 -10
- package/esm2022/src/app/seguridad/modelos/GrupoFuenteModel.mjs +0 -13
- package/esm2022/src/app/seguridad/modelos/GrupoPermisoModel.mjs +0 -14
- package/esm2022/src/app/seguridad/modelos/JoinFromModel.mjs +0 -5
- package/esm2022/src/app/seguridad/modelos/ListaServicioModel.mjs +0 -17
- package/esm2022/src/app/seguridad/modelos/LlaveForaneaModel.mjs +0 -7
- package/esm2022/src/app/seguridad/modelos/LoginModel.mjs +0 -15
- package/esm2022/src/app/seguridad/modelos/MensajeSistemaModel.mjs +0 -8
- package/esm2022/src/app/seguridad/modelos/MenuPortalModel.mjs +0 -5
- package/esm2022/src/app/seguridad/modelos/ModulosModel.mjs +0 -18
- package/esm2022/src/app/seguridad/modelos/ObjetoReporteModel.mjs +0 -6
- package/esm2022/src/app/seguridad/modelos/PaginaPortalModel.mjs +0 -20
- package/esm2022/src/app/seguridad/modelos/ParametroComponenteModel.mjs +0 -9
- package/esm2022/src/app/seguridad/modelos/ParametrosGeneralModel.mjs +0 -15
- package/esm2022/src/app/seguridad/modelos/PermisoFuncionModel.mjs +0 -9
- package/esm2022/src/app/seguridad/modelos/PermisocontenidoModel.mjs +0 -20
- package/esm2022/src/app/seguridad/modelos/PeticionModel.mjs +0 -16
- package/esm2022/src/app/seguridad/modelos/PreguntaSeguridadModel.mjs +0 -7
- package/esm2022/src/app/seguridad/modelos/PropiedadModel.mjs +0 -10
- package/esm2022/src/app/seguridad/modelos/PublicacionWebModel.mjs +0 -27
- package/esm2022/src/app/seguridad/modelos/PuntoProcesoModel.mjs +0 -7
- package/esm2022/src/app/seguridad/modelos/RecursoPunto.mjs +0 -13
- package/esm2022/src/app/seguridad/modelos/RecursoPuntoModel.mjs +0 -13
- package/esm2022/src/app/seguridad/modelos/ReporteBanda.mjs +0 -8
- package/esm2022/src/app/seguridad/modelos/ReporteColumna.mjs +0 -33
- package/esm2022/src/app/seguridad/modelos/ReporteColumnario.mjs +0 -69
- package/esm2022/src/app/seguridad/modelos/ReporteColumnarioMarcador.mjs +0 -24
- package/esm2022/src/app/seguridad/modelos/ReporteEntradaModel.mjs +0 -20
- package/esm2022/src/app/seguridad/modelos/ReporteFuenteModel.mjs +0 -124
- package/esm2022/src/app/seguridad/modelos/ReporteMarcador.mjs +0 -40
- package/esm2022/src/app/seguridad/modelos/ReporteSoporte.mjs +0 -10
- package/esm2022/src/app/seguridad/modelos/ReporteTabla.mjs +0 -13
- package/esm2022/src/app/seguridad/modelos/RespuestaModel.mjs +0 -9
- package/esm2022/src/app/seguridad/modelos/RolModel.mjs +0 -39
- package/esm2022/src/app/seguridad/modelos/ServidorCorreoModel.mjs +0 -28
- package/esm2022/src/app/seguridad/modelos/SistemaMensajeModel.mjs +0 -9
- package/esm2022/src/app/seguridad/modelos/SitioPortalModel.mjs +0 -25
- package/esm2022/src/app/seguridad/modelos/TablaFromModel.mjs +0 -5
- package/esm2022/src/app/seguridad/modelos/TareasModel.mjs +0 -54
- package/esm2022/src/app/seguridad/modelos/TextoModel.mjs +0 -9
- package/esm2022/src/app/seguridad/modelos/TipoEtiqueta.mjs +0 -8
- package/esm2022/src/app/seguridad/modelos/UnionModel.mjs +0 -12
- package/esm2022/src/app/seguridad/modelos/UsuarioModel.mjs +0 -53
- package/esm2022/src/app/seguridad/modelos/UsuariogrupoModel.mjs +0 -24
- package/esm2022/src/app/seguridad/modelos/aplicacion-propiedad-model.mjs +0 -15
- package/esm2022/src/app/seguridad/modelos/contenidoCorreoModel.mjs +0 -10
- package/esm2022/src/app/shared/componentes/input-helper-seleccion-plantilla/input-helper-seleccion-plantilla.component.mjs +0 -154
- package/esm2022/src/app/shared/servicios/cargar-archivos.service.mjs +0 -54
- package/esm2022/src/app/shared/servicios/cargar-mapas.service.mjs +0 -46
- package/esm2022/src/app/shared/servicios/encriptado-basico.service.mjs +0 -53
- package/esm2022/src/app/shared/servicios/general.service.mjs +0 -104
- package/esm2022/src/app/shared/servicios/parametros-navegacion.service.mjs +0 -21
- package/esm2022/src/app/webcommon/pages/cargue-plantilla/cargue-plantilla-general/cargue-plantilla-general.component.mjs +0 -370
- package/esm2022/src/app/webcommon/pages/ejecucion-reporte/detalle-campo-reporte/detalle-campo-reporte.component.mjs +0 -187
- package/esm2022/src/app/webcommon/pages/ejecucion-reporte/detalle-distribucion-reporte/detalle-distribucion-reporte.component.mjs +0 -85
- package/esm2022/src/app/webcommon/pages/ejecucion-reporte/detalle-ejecucion-reporte/detalle-ejecucion-reporte.page.mjs +0 -347
- package/esm2022/src/app/webcommon/pages/ejecucion-reporte/detalle-entrada-reporte/detalle-entrada-reporte.component.mjs +0 -206
- package/esm2022/src/app/webcommon/pages/ejecucion-reporte/detalle-punto-proceso-reporte/detalle-punto-proceso-reporte.component.mjs +0 -328
- package/esm2022/src/app/webcommon/pages/ejecucion-reporte/detalle-tipo-reporte/detalle-tipo-reporte.component.mjs +0 -1569
- package/esm2022/src/app/webcommon/pages/ejecucion-reporte/listado-ejecucion-reporte/listado-ejecucion-reporte.page.mjs +0 -105
- package/esm2022/src/app/webcommon/pages/ejecucion-reporte-externo/listado-ejecucion-reporte-externo/listado-ejecucion-reporte-externo.component.mjs +0 -114
- package/esm2022/src/app/webcommon/pages/fuente/importar-fuente-con/importar-fuente-con.component.mjs +0 -588
- package/esm2022/src/app/webcommon/pages/fuente/importar-fuente-general/importar-fuente-general.component.mjs +0 -177
- package/esm2022/src/app/webcommon/pages/fuente-reporte/fuente-reporte.component.mjs +0 -749
- package/esm2022/src/app/webcommon/pages/fuenteGeneral/fuente-general-servicio/fuente-general-servicio.component.mjs +0 -331
- package/esm2022/src/app/webcommon/pages/fuenteGeneral/listado-fuente-general/listado-fuente-general.page.mjs +0 -96
- package/esm2022/src/app/webcommon/pages/fuenteGeneral/mantenimiento-fuente-general/mantenimiento-fuente-general.page.mjs +0 -675
- package/esm2022/src/app/webcommon/pipes/dashboard.pipe.mjs +0 -86
- package/esm2022/src/app/webcommon/pipes/fuente.pipe.mjs +0 -201
- package/esm2022/src/app/webcommon/pipes/general.pipe.mjs +0 -916
- package/esm2022/src/app/webcommon/pipes/reporte-columnario.pipe.mjs +0 -115
- package/esm2022/src/app/webcommon/pipes/reporte-fuente.pipe.mjs +0 -301
- package/esm2022/src/app/webcommon/popups/popup-campos-fuente-general/popup-campos-fuente-general.component.mjs +0 -267
- package/esm2022/src/app/webcommon/popups/popup-convertir-plantillas/popup-convertir-plantillas.component.mjs +0 -128
- package/esm2022/src/app/webcommon/popups/popup-punto-proceso/popup-punto-proceso.component.mjs +0 -293
- package/esm2022/src/app/webcommon/popups/popup-recurso/popup-recurso.component.mjs +0 -269
- package/esm2022/src/app/webcommon/popups/popup-reporte/popup-reporte.component.mjs +0 -515
- package/esm2022/src/app/webcommon/popups/popup-sentencia/popup-sentencia.component.mjs +0 -64
- package/esm2022/src/app/webcommon/popups/popup-tablas-fuente/popup-tablas-fuente.component.mjs +0 -159
- package/esm2022/src/app/webcommon/popups/punto-proceso-comp/punto-proceso-comp.component.mjs +0 -89
- package/esm2022/src/app/webcommon/services/carguelinea.service.mjs +0 -69
- package/esm2022/src/app/webcommon/services/dashboard.service.mjs +0 -253
- package/esm2022/src/app/webcommon/services/ejecucionreporte.service.mjs +0 -114
- package/esm2022/src/app/webcommon/services/fechaUtils.service.mjs +0 -88
- package/esm2022/src/app/webcommon/services/fuentegeneral.service.mjs +0 -68
- package/esm2022/src/app/webcommon/services/homologacion.service.mjs +0 -50
- package/esm2022/src/app/webcommon/services/plantillas.service.mjs +0 -129
- package/esm2022/src/app/webcommon/services/reportes.service.mjs +0 -95
- package/esm2022/src/app/webcommon/webcommon.module.mjs +0 -15
- package/esm2022/src/environments/environment.mjs +0 -24
- package/fesm2022/general-library-union.mjs +0 -15885
- package/fesm2022/general-library-union.mjs.map +0 -1
- package/index.d.ts +0 -5
- package/src/app/core/componentes/breadcrumb/breadcrumb.component.d.ts +0 -18
- package/src/app/core/componentes/carga-pantalla-completa/carga-pantalla-completa.component.d.ts +0 -14
- package/src/app/core/componentes/filtro-general/filtro-general.component.d.ts +0 -34
- package/src/app/core/componentes/footer/footer.component.d.ts +0 -9
- package/src/app/core/componentes/formulariodinamico/formulariodinamico.component.d.ts +0 -46
- package/src/app/core/componentes/formulariodinamico/objetosformulario/CampoFormulario.d.ts +0 -44
- package/src/app/core/componentes/formulariodinamico/objetosformulario/CampoFormularioCons.d.ts +0 -45
- package/src/app/core/componentes/formulariodinamico/objetosformulario/CampoFormularioNuevo.d.ts +0 -33
- package/src/app/core/componentes/formulariodinamico/objetosformulario/HashDirective.d.ts +0 -9
- package/src/app/core/componentes/inicio-component/inicio-component.component.d.ts +0 -24
- package/src/app/core/componentes/menu/menu.component.d.ts +0 -16
- package/src/app/core/componentes/tabla-general/tabla-general.component.d.ts +0 -32
- package/src/app/core/core.module.d.ts +0 -8
- package/src/app/core/errores/authentication.error.d.ts +0 -3
- package/src/app/core/modelos/error-response.model.d.ts +0 -9
- package/src/app/core/modelos/table-column.model.d.ts +0 -12
- package/src/app/core/modelos/user.model.d.ts +0 -6
- package/src/app/core/plantilla-general/plantilla-general.template.d.ts +0 -89
- package/src/app/core/servicios/auth.service.d.ts +0 -52
- package/src/app/core/servicios/cargar-control-funcionalidad.service.d.ts +0 -19
- package/src/app/core/servicios/data-exporter-table.utils.d.ts +0 -11
- package/src/app/core/servicios/error-interceptor.service.d.ts +0 -41
- package/src/app/core/servicios/guardias/auth.guard.d.ts +0 -17
- package/src/app/core/servicios/guardias/publico.guard.d.ts +0 -13
- package/src/app/core/servicios/interceptores/loading-interceptor.d.ts +0 -11
- package/src/app/core/servicios/interceptores/token-interceptor.service.d.ts +0 -26
- package/src/app/core/servicios/loading.service.d.ts +0 -22
- package/src/app/core/servicios/menu.service.d.ts +0 -35
- package/src/app/core/servicios/spinner-service.d.ts +0 -9
- package/src/app/core/servicios/storage.service.d.ts +0 -37
- package/src/app/core/servicios/template.service.d.ts +0 -20
- package/src/app/core/servicios/toast.service.d.ts +0 -48
- package/src/app/core/servicios/utils.service.d.ts +0 -42
- package/src/app/core/sharedlib.module.d.ts +0 -6
- package/src/app/core/utilidades/color.util.d.ts +0 -70
- package/src/app/layout/app.breadcrumb.component.d.ts +0 -28
- package/src/app/layout/app.footer.component.d.ts +0 -8
- package/src/app/layout/app.layout.component.d.ts +0 -39
- package/src/app/layout/app.layout.module.d.ts +0 -6
- package/src/app/layout/app.menu.component.d.ts +0 -19
- package/src/app/layout/app.menu.service.d.ts +0 -12
- package/src/app/layout/app.menuitem.component.d.ts +0 -41
- package/src/app/layout/app.menuprofile.component.d.ts +0 -18
- package/src/app/layout/app.rightmenu.component.d.ts +0 -10
- package/src/app/layout/app.sidebar.component.d.ts +0 -34
- package/src/app/layout/app.topbar.component.d.ts +0 -79
- package/src/app/layout/service/app.layout.service.d.ts +0 -57
- package/src/app/publico/pages/login/login.page.d.ts +0 -40
- package/src/app/publico/pages/not-found/not-found.page.d.ts +0 -17
- package/src/app/publico/pages/seleccion-rol/seleccion-rol.component.d.ts +0 -41
- package/src/app/publico/pages/timeout/timeout.page.d.ts +0 -10
- package/src/app/seguridad/constantes/ConstantesGenerales.d.ts +0 -25
- package/src/app/seguridad/constantes/ReporteEntradaConstantes.d.ts +0 -7
- package/src/app/seguridad/modelos/AplicacionModel.d.ts +0 -7
- package/src/app/seguridad/modelos/ArchivoPortalModel.d.ts +0 -13
- package/src/app/seguridad/modelos/AtributoPuntoModel.d.ts +0 -8
- package/src/app/seguridad/modelos/AtributoSSOportalModel.d.ts +0 -16
- package/src/app/seguridad/modelos/CargueLineaModel.d.ts +0 -12
- package/src/app/seguridad/modelos/ColoresRGB.d.ts +0 -17
- package/src/app/seguridad/modelos/ColumnaFuenteModel.d.ts +0 -8
- package/src/app/seguridad/modelos/ComplementoModel.d.ts +0 -6
- package/src/app/seguridad/modelos/ComponentePaginaModel.d.ts +0 -20
- package/src/app/seguridad/modelos/ConexionModel.d.ts +0 -13
- package/src/app/seguridad/modelos/ControlFuncionModel.d.ts +0 -7
- package/src/app/seguridad/modelos/CorreoModel.d.ts +0 -31
- package/src/app/seguridad/modelos/CorreoWSModel.d.ts +0 -33
- package/src/app/seguridad/modelos/CruceRecursoPuntoModel.d.ts +0 -13
- package/src/app/seguridad/modelos/EmpresaModel.d.ts +0 -23
- package/src/app/seguridad/modelos/EmpresaSeguridadModel.d.ts +0 -18
- package/src/app/seguridad/modelos/EtiquetaModel.d.ts +0 -4
- package/src/app/seguridad/modelos/Etiquetas.d.ts +0 -10
- package/src/app/seguridad/modelos/FuenteCampoAtributoModel.d.ts +0 -15
- package/src/app/seguridad/modelos/FuenteDato.d.ts +0 -18
- package/src/app/seguridad/modelos/FuenteEntradaModel.d.ts +0 -8
- package/src/app/seguridad/modelos/FuenteLineaServicioModel.d.ts +0 -16
- package/src/app/seguridad/modelos/FuenteProcesoGeneralModel.d.ts +0 -10
- package/src/app/seguridad/modelos/FuncionalidadModel.d.ts +0 -8
- package/src/app/seguridad/modelos/GeneralModel.d.ts +0 -8
- package/src/app/seguridad/modelos/GrupoControlFuncionModel.d.ts +0 -9
- package/src/app/seguridad/modelos/GrupoFuenteModel.d.ts +0 -13
- package/src/app/seguridad/modelos/GrupoPermisoModel.d.ts +0 -13
- package/src/app/seguridad/modelos/ListaServicioModel.d.ts +0 -16
- package/src/app/seguridad/modelos/LlaveForaneaModel.d.ts +0 -6
- package/src/app/seguridad/modelos/LoginModel.d.ts +0 -17
- package/src/app/seguridad/modelos/MensajeSistemaModel.d.ts +0 -7
- package/src/app/seguridad/modelos/ModulosModel.d.ts +0 -14
- package/src/app/seguridad/modelos/PaginaPortalModel.d.ts +0 -19
- package/src/app/seguridad/modelos/ParametroComponenteModel.d.ts +0 -8
- package/src/app/seguridad/modelos/ParametrosGeneralModel.d.ts +0 -8
- package/src/app/seguridad/modelos/PermisoFuncionModel.d.ts +0 -8
- package/src/app/seguridad/modelos/PermisocontenidoModel.d.ts +0 -18
- package/src/app/seguridad/modelos/PreguntaSeguridadModel.d.ts +0 -6
- package/src/app/seguridad/modelos/PropiedadModel.d.ts +0 -9
- package/src/app/seguridad/modelos/PublicacionWebModel.d.ts +0 -25
- package/src/app/seguridad/modelos/PuntoProcesoModel.d.ts +0 -6
- package/src/app/seguridad/modelos/RecursoPunto.d.ts +0 -12
- package/src/app/seguridad/modelos/RecursoPuntoModel.d.ts +0 -12
- package/src/app/seguridad/modelos/ReporteBanda.d.ts +0 -7
- package/src/app/seguridad/modelos/ReporteColumna.d.ts +0 -32
- package/src/app/seguridad/modelos/ReporteColumnario.d.ts +0 -68
- package/src/app/seguridad/modelos/ReporteColumnarioMarcador.d.ts +0 -23
- package/src/app/seguridad/modelos/ReporteMarcador.d.ts +0 -39
- package/src/app/seguridad/modelos/ReporteSoporte.d.ts +0 -9
- package/src/app/seguridad/modelos/ReporteTabla.d.ts +0 -12
- package/src/app/seguridad/modelos/RespuestaModel.d.ts +0 -8
- package/src/app/seguridad/modelos/ServidorCorreoModel.d.ts +0 -25
- package/src/app/seguridad/modelos/SistemaMensajeModel.d.ts +0 -8
- package/src/app/seguridad/modelos/SitioPortalModel.d.ts +0 -24
- package/src/app/seguridad/modelos/TablaFromModel.d.ts +0 -4
- package/src/app/seguridad/modelos/TareasModel.d.ts +0 -49
- package/src/app/seguridad/modelos/TextoModel.d.ts +0 -8
- package/src/app/seguridad/modelos/TipoEtiqueta.d.ts +0 -7
- package/src/app/seguridad/modelos/UnionModel.d.ts +0 -11
- package/src/app/seguridad/modelos/UsuariogrupoModel.d.ts +0 -22
- package/src/app/seguridad/modelos/aplicacion-propiedad-model.d.ts +0 -13
- package/src/app/seguridad/modelos/contenidoCorreoModel.d.ts +0 -9
- package/src/app/shared/componentes/input-helper-seleccion-plantilla/input-helper-seleccion-plantilla.component.d.ts +0 -47
- package/src/app/shared/servicios/cargar-archivos.service.d.ts +0 -15
- package/src/app/shared/servicios/cargar-mapas.service.d.ts +0 -18
- package/src/app/shared/servicios/encriptado-basico.service.d.ts +0 -10
- package/src/app/shared/servicios/general.service.d.ts +0 -24
- package/src/app/shared/servicios/parametros-navegacion.service.d.ts +0 -9
- package/src/app/webcommon/pages/cargue-plantilla/cargue-plantilla-general/cargue-plantilla-general.component.d.ts +0 -78
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-campo-reporte/detalle-campo-reporte.component.d.ts +0 -79
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-distribucion-reporte/detalle-distribucion-reporte.component.d.ts +0 -29
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-ejecucion-reporte/detalle-ejecucion-reporte.page.d.ts +0 -69
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-entrada-reporte/detalle-entrada-reporte.component.d.ts +0 -51
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-punto-proceso-reporte/detalle-punto-proceso-reporte.component.d.ts +0 -77
- package/src/app/webcommon/pages/ejecucion-reporte/detalle-tipo-reporte/detalle-tipo-reporte.component.d.ts +0 -275
- package/src/app/webcommon/pages/ejecucion-reporte/listado-ejecucion-reporte/listado-ejecucion-reporte.page.d.ts +0 -42
- package/src/app/webcommon/pages/ejecucion-reporte-externo/listado-ejecucion-reporte-externo/listado-ejecucion-reporte-externo.component.d.ts +0 -35
- package/src/app/webcommon/pages/fuente/importar-fuente-con/importar-fuente-con.component.d.ts +0 -143
- package/src/app/webcommon/pages/fuente/importar-fuente-general/importar-fuente-general.component.d.ts +0 -49
- package/src/app/webcommon/pages/fuente-reporte/fuente-reporte.component.d.ts +0 -128
- package/src/app/webcommon/pages/fuenteGeneral/fuente-general-servicio/fuente-general-servicio.component.d.ts +0 -64
- package/src/app/webcommon/pages/fuenteGeneral/listado-fuente-general/listado-fuente-general.page.d.ts +0 -33
- package/src/app/webcommon/pages/fuenteGeneral/mantenimiento-fuente-general/mantenimiento-fuente-general.page.d.ts +0 -149
- package/src/app/webcommon/pipes/dashboard.pipe.d.ts +0 -48
- package/src/app/webcommon/pipes/fuente.pipe.d.ts +0 -136
- package/src/app/webcommon/pipes/general.pipe.d.ts +0 -646
- package/src/app/webcommon/pipes/reporte-columnario.pipe.d.ts +0 -59
- package/src/app/webcommon/pipes/reporte-fuente.pipe.d.ts +0 -193
- package/src/app/webcommon/popups/popup-campos-fuente-general/popup-campos-fuente-general.component.d.ts +0 -59
- package/src/app/webcommon/popups/popup-convertir-plantillas/popup-convertir-plantillas.component.d.ts +0 -27
- package/src/app/webcommon/popups/popup-punto-proceso/popup-punto-proceso.component.d.ts +0 -64
- package/src/app/webcommon/popups/popup-recurso/popup-recurso.component.d.ts +0 -63
- package/src/app/webcommon/popups/popup-reporte/popup-reporte.component.d.ts +0 -97
- package/src/app/webcommon/popups/popup-sentencia/popup-sentencia.component.d.ts +0 -21
- package/src/app/webcommon/popups/popup-tablas-fuente/popup-tablas-fuente.component.d.ts +0 -42
- package/src/app/webcommon/popups/punto-proceso-comp/punto-proceso-comp.component.d.ts +0 -30
- package/src/app/webcommon/services/carguelinea.service.d.ts +0 -19
- package/src/app/webcommon/services/dashboard.service.d.ts +0 -27
- package/src/app/webcommon/services/ejecucionreporte.service.d.ts +0 -34
- package/src/app/webcommon/services/fechaUtils.service.d.ts +0 -29
- package/src/app/webcommon/services/fuentegeneral.service.d.ts +0 -24
- package/src/app/webcommon/services/homologacion.service.d.ts +0 -17
- package/src/app/webcommon/services/plantillas.service.d.ts +0 -26
- package/src/app/webcommon/services/reportes.service.d.ts +0 -35
- package/src/app/webcommon/webcommon.module.d.ts +0 -6
- package/src/environments/environment.d.ts +0 -7
|
@@ -1,1569 +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
|
-
//reporte dinamico
|
|
113
|
-
listaTipoBanda = [
|
|
114
|
-
{ key: 'banda1', value: 'Banda 1' },
|
|
115
|
-
{ key: 'banda2', value: 'Banda 2' },
|
|
116
|
-
{ key: 'banda3', value: 'Banda 3' },
|
|
117
|
-
{ key: 'banda4', value: 'Banda 4' },
|
|
118
|
-
{ key: 'banda5', value: 'Banda 5' },
|
|
119
|
-
{ key: 'detalle', value: 'Detalle' },
|
|
120
|
-
{ key: 'summary', value: 'Resumen' },
|
|
121
|
-
];
|
|
122
|
-
existeJasper = false;
|
|
123
|
-
bandaSeleccionada = { key: null, value: null };
|
|
124
|
-
nuevaBanda = false;
|
|
125
|
-
verTabBanda = false;
|
|
126
|
-
nuevoReporteMarcadorDinamico = false;
|
|
127
|
-
reporteMarcadorDinamico = new ReporteMarcadorModel;
|
|
128
|
-
reporteBanda = new ReporteBandaModel;
|
|
129
|
-
formReporteDinamico;
|
|
130
|
-
listaMarcadorDinamico = [];
|
|
131
|
-
listaTipoCampoJasperDinamico = [
|
|
132
|
-
{ key: 'C', value: 'Calculo' },
|
|
133
|
-
{ key: 'T', value: 'Columna' },
|
|
134
|
-
];
|
|
135
|
-
listaTipoDatoSintaxis = [
|
|
136
|
-
{ key: 'F', value: 'Fecha' },
|
|
137
|
-
{ key: 'N', value: 'Numero' },
|
|
138
|
-
{ key: 'T', value: 'Texto' },
|
|
139
|
-
];
|
|
140
|
-
//reporte tabla
|
|
141
|
-
listaTabla = [];
|
|
142
|
-
listaNoTabla = [];
|
|
143
|
-
//reporte texto
|
|
144
|
-
listaSeparadores;
|
|
145
|
-
clickGuardarReporteTexto = false;
|
|
146
|
-
listaMarcadoresTexto = [];
|
|
147
|
-
marcadorTexto = new ReporteMarcadorModel();
|
|
148
|
-
verNuevoMarcadorTexto = false;
|
|
149
|
-
listaTipoMarcadorTexto;
|
|
150
|
-
clickGuardarMarcadorTexto = false;
|
|
151
|
-
//reporte XML
|
|
152
|
-
listaTipoMarcadorXML;
|
|
153
|
-
listaXML = [];
|
|
154
|
-
marcadorXML = new ReporteMarcadorModel;
|
|
155
|
-
clickGuardarMarcadorXML = false;
|
|
156
|
-
verNuevoMarcadorXML = false;
|
|
157
|
-
listaCamposMarcadorXML = [];
|
|
158
|
-
campoMarcadorInsertarXML = new ReporteTablaModel;
|
|
159
|
-
verReporteMarcadorDetalleXML = false;
|
|
160
|
-
clickGuardarMarcadorCampoXML = false;
|
|
161
|
-
//reporte columnario
|
|
162
|
-
listaReporteColumnario = [];
|
|
163
|
-
verNuevoReporteColumnario = false;
|
|
164
|
-
columnaBasica;
|
|
165
|
-
clickGuardarReporteColumnario = false;
|
|
166
|
-
listaTipoColumnas;
|
|
167
|
-
listaOperacionesColumnario;
|
|
168
|
-
listaOperacionesExcelColumnario;
|
|
169
|
-
listaOrdenamiento;
|
|
170
|
-
verNuevoColumnaAdicional = false;
|
|
171
|
-
clickGuardarColumnaAdicional = false;
|
|
172
|
-
columnasAdicionales = [];
|
|
173
|
-
columnaAdicional;
|
|
174
|
-
listaTipoMarcadorColumnario;
|
|
175
|
-
verNuevoMarcadorColumnario = false;
|
|
176
|
-
clickGuardarMarcadorColumnario = false;
|
|
177
|
-
marcadoresColumnario = [];
|
|
178
|
-
marcadorColumnario;
|
|
179
|
-
//grafica
|
|
180
|
-
listaTipoGrafico;
|
|
181
|
-
paginadorColumnas = [];
|
|
182
|
-
paginadorColoresGrafica = [];
|
|
183
|
-
colorCategoria = new ReporteBandaModel();
|
|
184
|
-
verColorCategoriaDetalle = false;
|
|
185
|
-
clickGuardarColorCategoria = false;
|
|
186
|
-
grafica;
|
|
187
|
-
tipoGrafica;
|
|
188
|
-
reporteFuente = new ReporteFuenteModel();
|
|
189
|
-
llaveEmpresa;
|
|
190
|
-
listaSiNo;
|
|
191
|
-
llaveReporte;
|
|
192
|
-
aplicacion;
|
|
193
|
-
listaFuentes = [];
|
|
194
|
-
_subsciprtions = [];
|
|
195
|
-
constructor(formBuilder, notificacionesBusService, generalService, generalPipe, authService, reporteFuentePipe, confirmationService, cargarArchivo, encriptadorArchivo, utilsService, translateService, fuentePipe, reporteColumnarioPipe, reporteService, dashboardService, dashboardPipe) {
|
|
196
|
-
this.formBuilder = formBuilder;
|
|
197
|
-
this.notificacionesBusService = notificacionesBusService;
|
|
198
|
-
this.generalService = generalService;
|
|
199
|
-
this.generalPipe = generalPipe;
|
|
200
|
-
this.authService = authService;
|
|
201
|
-
this.reporteFuentePipe = reporteFuentePipe;
|
|
202
|
-
this.confirmationService = confirmationService;
|
|
203
|
-
this.cargarArchivo = cargarArchivo;
|
|
204
|
-
this.encriptadorArchivo = encriptadorArchivo;
|
|
205
|
-
this.utilsService = utilsService;
|
|
206
|
-
this.translateService = translateService;
|
|
207
|
-
this.fuentePipe = fuentePipe;
|
|
208
|
-
this.reporteColumnarioPipe = reporteColumnarioPipe;
|
|
209
|
-
this.reporteService = reporteService;
|
|
210
|
-
this.dashboardService = dashboardService;
|
|
211
|
-
this.dashboardPipe = dashboardPipe;
|
|
212
|
-
}
|
|
213
|
-
ngOnInit() {
|
|
214
|
-
this.aplicacion = this.authService.getTokenKey('aplicacion');
|
|
215
|
-
this.llaveEmpresa = this.authService.getTokenKey('llaveEmpresa');
|
|
216
|
-
this.listaSiNo = this.generalPipe.LISTA_SINO;
|
|
217
|
-
this.listaTipoMarcadorColumnario = this.reporteColumnarioPipe.MAPA_TIPO_MARCADOR;
|
|
218
|
-
this.listaTipoColumnas = this.reporteColumnarioPipe.MAPA_TIPO_COLUMNAS;
|
|
219
|
-
this.listaOperacionesColumnario = this.reporteColumnarioPipe.MAPA_OPERACIONES_COLUMNARIO;
|
|
220
|
-
this.listaOperacionesExcelColumnario = this.reporteColumnarioPipe.MAPA_OPERACIONES_COLUMNARIO_EXCEL;
|
|
221
|
-
this.listaOrdenamiento = this.reporteColumnarioPipe.MAPA_ORDENAMIENTO;
|
|
222
|
-
this.listaSeparadores = this.fuentePipe.LISTA_SEPARADORES;
|
|
223
|
-
this.listaTipoMarcador = this.reporteFuentePipe.LISTA_MARCADORES;
|
|
224
|
-
this.listaTipoGrafico_JFC = this.reporteFuentePipe.LISTA_TIPO_GRAFICO_JFC;
|
|
225
|
-
this.listaGrafico = this.reporteFuentePipe.LISTA_RECURSO_GRAFICA;
|
|
226
|
-
this.listaGraficoSencillo = this.reporteFuentePipe.RECURSO_GRAFICA;
|
|
227
|
-
this.listaAlineacion = this.reporteFuentePipe.LISTA_ALINEACION;
|
|
228
|
-
this.listaOperaciones = this.generalPipe.MAPAOPERACIONES;
|
|
229
|
-
this.listaTipoMarcadorTexto = this.reporteFuentePipe.TIPOMARCADORESTEXTO;
|
|
230
|
-
this.listaTipoMarcadorXML = this.reporteFuentePipe.LISTA_MARCADORES_XML;
|
|
231
|
-
this.listaTipoGrafico = this.reporteFuentePipe.LISTA_TIPO_GRAFICO;
|
|
232
|
-
this.cargar();
|
|
233
|
-
this.cargarFormMarcadorExcel();
|
|
234
|
-
this.cargarFormMarcador();
|
|
235
|
-
this.cargarFormDinamico();
|
|
236
|
-
this.agregarSubscripciones();
|
|
237
|
-
//this.cargarListas();
|
|
238
|
-
}
|
|
239
|
-
ngOnDestroy() {
|
|
240
|
-
this._subsciprtions.forEach((sub) => {
|
|
241
|
-
sub.unsubscribe();
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
agregarSubscripciones() {
|
|
245
|
-
this._subsciprtions.push(this.formMarcadorExcel.get('tipo').valueChanges.subscribe((value) => {
|
|
246
|
-
const textoRegistroControl = this.formMarcadorExcel.get('textoRegistro');
|
|
247
|
-
const origenControl = this.formMarcadorExcel.get('origen');
|
|
248
|
-
if (!value) {
|
|
249
|
-
this.esImagenFija = true;
|
|
250
|
-
this.esMarcador = true;
|
|
251
|
-
origenControl.clearValidators();
|
|
252
|
-
textoRegistroControl.clearValidators();
|
|
253
|
-
}
|
|
254
|
-
else if (['MA'].includes(value)) {
|
|
255
|
-
this.esImagenFija = false;
|
|
256
|
-
this.esMarcador = true;
|
|
257
|
-
textoRegistroControl.setValidators(Validators.required);
|
|
258
|
-
origenControl.clearValidators();
|
|
259
|
-
}
|
|
260
|
-
else if (['IF'].includes(value)) {
|
|
261
|
-
this.esImagenFija = true;
|
|
262
|
-
this.esMarcador = false;
|
|
263
|
-
origenControl.setValidators(Validators.required);
|
|
264
|
-
textoRegistroControl.setValidators(Validators.required);
|
|
265
|
-
}
|
|
266
|
-
textoRegistroControl.updateValueAndValidity();
|
|
267
|
-
origenControl.updateValueAndValidity();
|
|
268
|
-
}));
|
|
269
|
-
this._subsciprtions.push(this.formMarcador.get('tipo').valueChanges.subscribe((value) => {
|
|
270
|
-
console.log('entra a tipo: ');
|
|
271
|
-
console.log(value);
|
|
272
|
-
this.formMarcador.clearValidators();
|
|
273
|
-
this.reporteMarcador.tipo = value;
|
|
274
|
-
if (this.reporteMarcador.tipo == this.reporteFuentePipe.MARCADORTABLA) {
|
|
275
|
-
// this.reporteMarcador.tieneSql = 'N'
|
|
276
|
-
// this.formMarcador.get('tieneSql').setValue('N')
|
|
277
|
-
}
|
|
278
|
-
this.formMarcador.updateValueAndValidity();
|
|
279
|
-
}));
|
|
280
|
-
this._subsciprtions.push(this.formMarcador.get('origen').valueChanges.subscribe((value) => {
|
|
281
|
-
this.formMarcador.clearValidators();
|
|
282
|
-
this.reporteMarcador.origen = value;
|
|
283
|
-
this.formMarcador.updateValueAndValidity();
|
|
284
|
-
}));
|
|
285
|
-
this._subsciprtions.push(this.formMarcador.get('tieneSql').valueChanges.subscribe((value) => {
|
|
286
|
-
console.log('entra a tieneSql: ');
|
|
287
|
-
console.log(value);
|
|
288
|
-
this.formMarcador.clearValidators();
|
|
289
|
-
this.reporteMarcador.tieneSql = value;
|
|
290
|
-
this.formMarcador.updateValueAndValidity();
|
|
291
|
-
}));
|
|
292
|
-
this._subsciprtions.push(this.formMarcador.get('tipoGrafico').valueChanges.subscribe((value) => {
|
|
293
|
-
this.formMarcador.clearValidators();
|
|
294
|
-
this.reporteMarcador.tipoGrafico = value;
|
|
295
|
-
this.formMarcador.updateValueAndValidity();
|
|
296
|
-
}));
|
|
297
|
-
this._subsciprtions.push(this.formMarcadorExcel.get('origen').valueChanges.subscribe((value) => {
|
|
298
|
-
if (['U'].includes(value)) {
|
|
299
|
-
this.reporteMarcadorExcel.origen = 'U';
|
|
300
|
-
}
|
|
301
|
-
else if (['C'].includes(value)) {
|
|
302
|
-
this.reporteMarcadorExcel.origen = 'C';
|
|
303
|
-
}
|
|
304
|
-
}));
|
|
305
|
-
this._subsciprtions.push(this.formReporteDinamico.get('tipoCampo').valueChanges.subscribe((value) => {
|
|
306
|
-
this.reporteMarcadorDinamico.tipoCampo = value;
|
|
307
|
-
const resultadoXControl = this.formReporteDinamico.get('resultadoX');
|
|
308
|
-
const resultadoYControl = this.formReporteDinamico.get('resultadoY');
|
|
309
|
-
if (this.bandaSeleccionada.key != 'detalle') {
|
|
310
|
-
resultadoXControl.setValidators(Validators.required);
|
|
311
|
-
resultadoYControl.setValidators(Validators.required);
|
|
312
|
-
}
|
|
313
|
-
else {
|
|
314
|
-
resultadoXControl.clearValidators();
|
|
315
|
-
resultadoYControl.clearValidators();
|
|
316
|
-
}
|
|
317
|
-
const marcadorControl = this.formReporteDinamico.get('marcador');
|
|
318
|
-
const filtroControl = this.formReporteDinamico.get('filtro');
|
|
319
|
-
const tipoDatoControl = this.formReporteDinamico.get('tipoDato');
|
|
320
|
-
if (this.reporteMarcadorDinamico.tipoCampo == 'T') {
|
|
321
|
-
marcadorControl.setValidators(Validators.required);
|
|
322
|
-
filtroControl.clearValidators();
|
|
323
|
-
tipoDatoControl.clearValidators();
|
|
324
|
-
}
|
|
325
|
-
else {
|
|
326
|
-
marcadorControl.clearValidators();
|
|
327
|
-
filtroControl.setValidators(Validators.required);
|
|
328
|
-
tipoDatoControl.setValidators(Validators.required);
|
|
329
|
-
}
|
|
330
|
-
marcadorControl.updateValueAndValidity();
|
|
331
|
-
filtroControl.updateValueAndValidity();
|
|
332
|
-
tipoDatoControl.updateValueAndValidity();
|
|
333
|
-
resultadoXControl.updateValueAndValidity();
|
|
334
|
-
resultadoYControl.updateValueAndValidity();
|
|
335
|
-
}), this.formReporteDinamico.get('tipoDato').valueChanges.subscribe((value) => {
|
|
336
|
-
this.reporteMarcadorDinamico.tipoDato = value;
|
|
337
|
-
}));
|
|
338
|
-
}
|
|
339
|
-
cambiarTab(event) {
|
|
340
|
-
switch (event.index) {
|
|
341
|
-
case 0:
|
|
342
|
-
this.cargar();
|
|
343
|
-
this.cargarListasExcel();
|
|
344
|
-
break;
|
|
345
|
-
case 1:
|
|
346
|
-
this.cargarListaMarcadores();
|
|
347
|
-
if (this.reporteFuente.unicoArchivo == 'N') {
|
|
348
|
-
this.cargarListaSoportes();
|
|
349
|
-
}
|
|
350
|
-
break;
|
|
351
|
-
case 2:
|
|
352
|
-
this.validarExisteJasper();
|
|
353
|
-
break;
|
|
354
|
-
case 3:
|
|
355
|
-
this.cargarListaMarcadoresTexto();
|
|
356
|
-
break;
|
|
357
|
-
case 4:
|
|
358
|
-
this.cargarListasTabla();
|
|
359
|
-
break;
|
|
360
|
-
case 5:
|
|
361
|
-
this.cargarListaXML();
|
|
362
|
-
break;
|
|
363
|
-
case 6:
|
|
364
|
-
this.cargarReporteColumnario();
|
|
365
|
-
break;
|
|
366
|
-
case 7:
|
|
367
|
-
this.cargarGraficasColumnas();
|
|
368
|
-
break;
|
|
369
|
-
default:
|
|
370
|
-
break;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
cargarListasTabla() {
|
|
374
|
-
this.generalService.queryForList(new GeneralModel('ReporteColumnaDTO', null, false, { buscarOrdenTabla: 'S', ordenarTabla: 'S', reporteFuente: this.reporteFuente.llave })).subscribe(data => {
|
|
375
|
-
this.listaTabla = data;
|
|
376
|
-
});
|
|
377
|
-
this.generalService.queryForList(new GeneralModel('ReporteColumnaDTO', null, false, { buscarOrdenTabla: 'N', reporteFuente: this.reporteFuente.llave })).subscribe(data => {
|
|
378
|
-
this.listaNoTabla = data;
|
|
379
|
-
});
|
|
380
|
-
}
|
|
381
|
-
cargarListaMarcadores() {
|
|
382
|
-
this.generalService.queryForList(new GeneralModel('ReporteMarcadorDTO', null, false, { tipoReporte: 'P', reporteFuente: this.reporteFuente.llave, ordenDinamico: this.generalPipe.SI })).subscribe(data => {
|
|
383
|
-
this.listaMarcadores = data;
|
|
384
|
-
});
|
|
385
|
-
}
|
|
386
|
-
cargarListasExcel() {
|
|
387
|
-
this.generalService.queryForList(new GeneralModel('ReporteColumnaDTO', null, false, { ordenExcel: 'S', reporteFuente: this.reporteFuente.llave })).subscribe(data => {
|
|
388
|
-
this.listaExcel = data;
|
|
389
|
-
});
|
|
390
|
-
this.generalService.queryForList(new GeneralModel('ReporteColumnaDTO', null, false, { ordenExcel: 'N', reporteFuente: this.reporteFuente.llave })).subscribe(data => {
|
|
391
|
-
this.listaNoExcel = data;
|
|
392
|
-
});
|
|
393
|
-
this.generalService.queryForList(new GeneralModel('ReporteMarcadorDTO', null, false, { tipoReporte: 'E', reporteFuente: this.reporteFuente.llave, ordenDinamico: this.generalPipe.SI })).subscribe(data => {
|
|
394
|
-
this.listaMarcadorExcel = data;
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
cargarListaColumnas() {
|
|
398
|
-
this.listaColumnas = [];
|
|
399
|
-
this.generalService.queryForList(new GeneralModel('ReporteColumnaDTO', null, false, { reporteFuente: this.reporteFuente.llave })).subscribe(data => {
|
|
400
|
-
this.listaColumnas = data;
|
|
401
|
-
});
|
|
402
|
-
}
|
|
403
|
-
cargarListas() {
|
|
404
|
-
this.listaTipoCifrado = [];
|
|
405
|
-
this.generalService.queryForList(new GeneralModel('EncripcionArchivoDTO', null, false, {})).subscribe(data => {
|
|
406
|
-
this.listaTipoCifrado = data;
|
|
407
|
-
});
|
|
408
|
-
this.cargarListaColumnas();
|
|
409
|
-
}
|
|
410
|
-
cargarFormMarcadorExcel() {
|
|
411
|
-
this.formMarcadorExcel = this.formBuilder.group({
|
|
412
|
-
descripcion: new FormControl(this.reporteMarcadorExcel.descripcion, [Validators.required, Validators.maxLength(100)]),
|
|
413
|
-
marcador: new FormControl(this.reporteMarcadorExcel.marcador, [Validators.required, Validators.maxLength(50)]),
|
|
414
|
-
tipo: new FormControl(this.reporteMarcadorExcel.tipo, [Validators.required]),
|
|
415
|
-
textoRegistro: new FormControl(this.reporteMarcadorExcel.textoRegistro),
|
|
416
|
-
origen: new FormControl(this.reporteMarcadorExcel.origen),
|
|
417
|
-
//campos bd
|
|
418
|
-
llave: new FormControl(this.reporteMarcadorExcel.llave),
|
|
419
|
-
reporteFuente: new FormControl(this.reporteFuente.llave),
|
|
420
|
-
tipoReporte: new FormControl('E')
|
|
421
|
-
});
|
|
422
|
-
}
|
|
423
|
-
cargarFormMarcador() {
|
|
424
|
-
this.formMarcador = this.formBuilder.group({
|
|
425
|
-
descripcion: new FormControl(this.reporteMarcador.descripcion, [Validators.required, Validators.maxLength(100)]),
|
|
426
|
-
tipo: new FormControl(this.reporteMarcador.tipo, [Validators.required]),
|
|
427
|
-
marcador: new FormControl(this.reporteMarcador.marcador, [Validators.maxLength(50)]),
|
|
428
|
-
tabla: new FormControl(this.reporteMarcador.tabla),
|
|
429
|
-
origen: new FormControl(this.reporteMarcador.origen),
|
|
430
|
-
textoRegistro: new FormControl(this.reporteMarcador.textoRegistro),
|
|
431
|
-
reporteColumna: new FormControl(this.reporteMarcador.reporteColumna),
|
|
432
|
-
formato: new FormControl(this.reporteMarcador.formato),
|
|
433
|
-
ancho: new FormControl(this.reporteMarcador.ancho),
|
|
434
|
-
alto: new FormControl(this.reporteMarcador.alto),
|
|
435
|
-
grupo1: new FormControl(this.reporteMarcador.grupo1),
|
|
436
|
-
grupo2: new FormControl(this.reporteMarcador.grupo2),
|
|
437
|
-
grupo3: new FormControl(this.reporteMarcador.grupo3),
|
|
438
|
-
finalGrupo: new FormControl(this.reporteMarcador.finalGrupo),
|
|
439
|
-
tieneSql: new FormControl(this.reporteMarcador.tieneSql),
|
|
440
|
-
query: new FormControl(this.reporteMarcador.query),
|
|
441
|
-
fuente: new FormControl(this.reporteMarcador.fuente),
|
|
442
|
-
tipoGrafico: new FormControl(this.reporteMarcador.tipoGrafico),
|
|
443
|
-
marcadorGrafico: new FormControl(this.reporteMarcador.marcadorGrafico),
|
|
444
|
-
titulox: new FormControl(this.reporteMarcador.titulox),
|
|
445
|
-
tituloy: new FormControl(this.reporteMarcador.tituloy),
|
|
446
|
-
banda: new FormControl(this.reporteMarcador.banda),
|
|
447
|
-
anchoJasperLabel: new FormControl(this.reporteMarcador.anchoJasperLabel),
|
|
448
|
-
filtro: new FormControl(this.reporteMarcador.filtro),
|
|
449
|
-
//campos bd
|
|
450
|
-
llave: new FormControl(this.reporteMarcador.llave),
|
|
451
|
-
reporteFuente: new FormControl(this.reporteFuente.llave),
|
|
452
|
-
tipoReporte: new FormControl('N')
|
|
453
|
-
});
|
|
454
|
-
}
|
|
455
|
-
cargarFormDinamico() {
|
|
456
|
-
this.formReporteDinamico = this.formBuilder.group({
|
|
457
|
-
tipoCampo: new FormControl(this.reporteMarcadorDinamico.tipoCampo, [Validators.required]),
|
|
458
|
-
tipoDato: new FormControl(this.reporteMarcadorDinamico.tipoDato),
|
|
459
|
-
filtro: new FormControl(this.reporteMarcadorDinamico.filtro),
|
|
460
|
-
marcador: new FormControl(this.reporteMarcadorDinamico.marcador),
|
|
461
|
-
alto: new FormControl(this.reporteMarcadorDinamico.alto, [Validators.required]),
|
|
462
|
-
formato: new FormControl(this.reporteMarcadorDinamico.formato),
|
|
463
|
-
descripcion: new FormControl(this.reporteMarcadorDinamico.descripcion),
|
|
464
|
-
ancho: new FormControl(this.reporteMarcadorDinamico.ancho, [Validators.required]),
|
|
465
|
-
anchoJasperLabel: new FormControl(this.reporteMarcadorDinamico.anchoJasperLabel),
|
|
466
|
-
resultadoX: new FormControl(this.reporteMarcadorDinamico.resultadoX),
|
|
467
|
-
resultadoY: new FormControl(this.reporteMarcadorDinamico.resultadoY),
|
|
468
|
-
titulox: new FormControl(this.reporteMarcadorDinamico.titulox),
|
|
469
|
-
tituloy: new FormControl(this.reporteMarcadorDinamico.tituloy),
|
|
470
|
-
tipoReporte: new FormControl(this.reporteMarcadorDinamico.tipoReporte, [Validators.required]),
|
|
471
|
-
tipoGrafico: new FormControl(this.reporteMarcadorDinamico.tipoGrafico),
|
|
472
|
-
operacion: new FormControl(this.reporteMarcadorDinamico.operacion),
|
|
473
|
-
//campos tabla
|
|
474
|
-
origen: new FormControl('D'),
|
|
475
|
-
banda: new FormControl(this.bandaSeleccionada.key),
|
|
476
|
-
reporteFuente: new FormControl(this.reporteFuente.llave),
|
|
477
|
-
llave: new FormControl(this.reporteMarcadorDinamico.llave),
|
|
478
|
-
});
|
|
479
|
-
}
|
|
480
|
-
cargar() {
|
|
481
|
-
this.existeJasper = false;
|
|
482
|
-
if (this.llaveReporte) {
|
|
483
|
-
this.generalService.queryForObject(new GeneralModel('ReporteFuenteDTO', null, false, { llave: this.llaveReporte })).subscribe(data => {
|
|
484
|
-
this.reporteFuente = data;
|
|
485
|
-
this.cargarListasExcel();
|
|
486
|
-
this.cargarListas();
|
|
487
|
-
});
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
actualizar() {
|
|
491
|
-
if (this.reporteFuente.llave) {
|
|
492
|
-
this.generalService.update(new GeneralModel('ReporteFuenteDTO', null, false, this.reporteFuente)).subscribe(data => {
|
|
493
|
-
this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_ACTUALIZAR);
|
|
494
|
-
if (this.reporteFuente.unicoArchivo == 'N') {
|
|
495
|
-
}
|
|
496
|
-
});
|
|
497
|
-
}
|
|
498
|
-
else {
|
|
499
|
-
this.reporteService.guardarReporte(this.reporteFuente).subscribe(data => {
|
|
500
|
-
this.reporteFuente = data;
|
|
501
|
-
this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_GUARDAR);
|
|
502
|
-
});
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
obtenerArchivo(event) {
|
|
506
|
-
this.reporteFuente.archivoTodo = event.data;
|
|
507
|
-
}
|
|
508
|
-
obtenerArchivoMarcadorExcel(event) {
|
|
509
|
-
this.reporteMarcador.textoRegistro = event.data;
|
|
510
|
-
}
|
|
511
|
-
obtenerArchivoMarcador(event) {
|
|
512
|
-
this.reporteMarcador.textoRegistro = event.data;
|
|
513
|
-
}
|
|
514
|
-
obtenerArchivoPlanilla(event) {
|
|
515
|
-
this.reporteFuente.archivoIndividual = event.data;
|
|
516
|
-
}
|
|
517
|
-
obtenerArchivoSoporte(event, soporte) {
|
|
518
|
-
soporte.archivoIndividual = event.data;
|
|
519
|
-
}
|
|
520
|
-
obtenerArchivoColumnario(event) {
|
|
521
|
-
this.reporteFuente.archivoExcelColumnario = event.data;
|
|
522
|
-
}
|
|
523
|
-
moverAAsociado(event) {
|
|
524
|
-
this.reporteService.actualizarReporteColumnaOrden({
|
|
525
|
-
listaAsociado: this.listaExcel,
|
|
526
|
-
excel: true
|
|
527
|
-
}).subscribe(data => { this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR_VARIOS); });
|
|
528
|
-
}
|
|
529
|
-
moverADesasociado(event) {
|
|
530
|
-
this.reporteService.actualizarReporteColumnaOrden({
|
|
531
|
-
listaDesasociado: this.listaNoExcel,
|
|
532
|
-
excel: true
|
|
533
|
-
}).subscribe(data => { this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR_VARIOS); });
|
|
534
|
-
}
|
|
535
|
-
moverAAsociadoTabla(event) {
|
|
536
|
-
this.reporteService.actualizarReporteColumnaOrden({
|
|
537
|
-
listaAsociado: this.listaTabla,
|
|
538
|
-
excel: false
|
|
539
|
-
}).subscribe(data => { this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR_VARIOS); });
|
|
540
|
-
}
|
|
541
|
-
moverADesasociadoTabla(event) {
|
|
542
|
-
this.reporteService.actualizarReporteColumnaOrden({
|
|
543
|
-
listaDesasociado: this.listaNoTabla,
|
|
544
|
-
excel: false
|
|
545
|
-
}).subscribe(data => { this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR_VARIOS); });
|
|
546
|
-
}
|
|
547
|
-
reorderTabla(event) {
|
|
548
|
-
this.reporteService.actualizarReporteColumnaOrden({
|
|
549
|
-
listaAsociado: this.listaTabla,
|
|
550
|
-
excel: false
|
|
551
|
-
}).subscribe(data => { this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR_VARIOS); });
|
|
552
|
-
}
|
|
553
|
-
verDetalleMarcadorExcel(event) {
|
|
554
|
-
this.formMarcadorExcel.reset();
|
|
555
|
-
this.verNuevoMarcadorExcel = true;
|
|
556
|
-
this.reporteMarcadorExcel = event.data;
|
|
557
|
-
this.formMarcadorExcel.patchValue(this.reporteMarcadorExcel);
|
|
558
|
-
}
|
|
559
|
-
nuevoMarcadorExcel() {
|
|
560
|
-
this.formMarcadorExcel.reset();
|
|
561
|
-
this.verNuevoMarcadorExcel = true;
|
|
562
|
-
this.esMarcador = false;
|
|
563
|
-
this.esImagenFija = false;
|
|
564
|
-
this.reporteMarcadorExcel = new ReporteMarcadorModel();
|
|
565
|
-
this.formMarcadorExcel.patchValue(this.reporteMarcadorExcel);
|
|
566
|
-
this.formMarcadorExcel.get('tipo').setValue(null);
|
|
567
|
-
}
|
|
568
|
-
guardarMarcadorExcel() {
|
|
569
|
-
this.clickGuardarMarcadorExcel = true;
|
|
570
|
-
if (this.formMarcadorExcel.valid) {
|
|
571
|
-
let llaveRegistro = this.formMarcadorExcel.get('llave').value;
|
|
572
|
-
this.formMarcadorExcel.get('reporteFuente').setValue(this.reporteFuente.llave);
|
|
573
|
-
this.formMarcadorExcel.get('tipoReporte').setValue('E');
|
|
574
|
-
if (llaveRegistro) {
|
|
575
|
-
this.generalService.update(new GeneralModel('ReporteMarcadorDTO', null, false, this.formMarcadorExcel.value)).subscribe(data => {
|
|
576
|
-
this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_ACTUALIZAR);
|
|
577
|
-
this.generalService.queryForList(new GeneralModel('ReporteMarcadorDTO', null, false, { tipoReporte: 'E', reporteFuente: this.reporteFuente.llave, ordenDinamico: this.generalPipe.SI })).subscribe(data => {
|
|
578
|
-
this.listaMarcadorExcel = data;
|
|
579
|
-
});
|
|
580
|
-
});
|
|
581
|
-
}
|
|
582
|
-
else {
|
|
583
|
-
this.formMarcadorExcel.get('llave').setValue(this.utilsService.generarLlave());
|
|
584
|
-
this.generalService.crearRegistro(new GeneralModel('ReporteMarcadorDTO', null, false, this.formMarcadorExcel.value)).subscribe(data => {
|
|
585
|
-
this.verNuevoMarcadorExcel = false;
|
|
586
|
-
this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_GUARDAR);
|
|
587
|
-
this.generalService.queryForList(new GeneralModel('ReporteMarcadorDTO', null, false, { tipoReporte: 'E', reporteFuente: this.reporteFuente.llave, ordenDinamico: this.generalPipe.SI })).subscribe(data => {
|
|
588
|
-
this.listaMarcadorExcel = data;
|
|
589
|
-
});
|
|
590
|
-
});
|
|
591
|
-
}
|
|
592
|
-
this.clickGuardarMarcadorExcel = false;
|
|
593
|
-
}
|
|
594
|
-
else {
|
|
595
|
-
this.notificacionesBusService.showError('Faltan campos obligatorios');
|
|
596
|
-
Object.keys(this.formMarcadorExcel.controls).forEach((key) => {
|
|
597
|
-
if (this.formMarcadorExcel.get(key).errors) {
|
|
598
|
-
this.formMarcadorExcel.get(key).markAsDirty();
|
|
599
|
-
}
|
|
600
|
-
});
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
eliminarMarcadorExcel(event) {
|
|
604
|
-
this.confirmationService.confirm({
|
|
605
|
-
target: event.target,
|
|
606
|
-
message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
|
|
607
|
-
acceptLabel: this.generalPipe.SI_DESC,
|
|
608
|
-
header: this.translateService.instant('confirmar'),
|
|
609
|
-
accept: () => {
|
|
610
|
-
this.generalService.delete(new GeneralModel('ReporteMarcadorDTO', null, false, this.reporteMarcadorExcel)).subscribe(data => {
|
|
611
|
-
this.formMarcadorExcel.reset();
|
|
612
|
-
this.verNuevoMarcadorExcel = false;
|
|
613
|
-
this.reporteMarcadorExcel = new ReporteMarcadorModel();
|
|
614
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
|
|
615
|
-
this.generalService.queryForList(new GeneralModel('ReporteMarcadorDTO', null, false, { tipoReporte: 'E', reporteFuente: this.reporteFuente.llave, ordenDinamico: this.generalPipe.SI })).subscribe(data => {
|
|
616
|
-
this.listaMarcadorExcel = data;
|
|
617
|
-
});
|
|
618
|
-
});
|
|
619
|
-
}
|
|
620
|
-
});
|
|
621
|
-
}
|
|
622
|
-
//plantilla
|
|
623
|
-
cargarListaCampoMarcador() {
|
|
624
|
-
this.generalService.queryForList(new GeneralModel('ReporteTablaDTO', null, false, { reporteMarcador: this.reporteMarcador.llave })).subscribe(data => {
|
|
625
|
-
this.listaCamposMarcador = data;
|
|
626
|
-
});
|
|
627
|
-
}
|
|
628
|
-
async cargarListaCampoMarcadorAsync() {
|
|
629
|
-
this.listaCamposMarcador = await this.generalService.queryForList(new GeneralModel('ReporteTablaDTO', null, false, { reporteMarcador: this.reporteMarcador.llave })).toPromise();
|
|
630
|
-
}
|
|
631
|
-
verDetalleMarcador(event) {
|
|
632
|
-
//this.formMarcador.reset();
|
|
633
|
-
this.verNuevoMarcador = true;
|
|
634
|
-
this.reporteMarcador = event.data;
|
|
635
|
-
this.formMarcador.patchValue(this.reporteMarcador);
|
|
636
|
-
this.formMarcador.get('tipo').setValue(this.reporteMarcador.tipo);
|
|
637
|
-
this.cargarListaCampoMarcador();
|
|
638
|
-
}
|
|
639
|
-
nuevoMarcador() {
|
|
640
|
-
//this.formMarcador.reset();
|
|
641
|
-
this.formMarcador.reset({}, { emitEvent: false });
|
|
642
|
-
this.verNuevoMarcador = true;
|
|
643
|
-
this.reporteMarcador = new ReporteMarcadorModel();
|
|
644
|
-
this.formMarcador.patchValue(this.reporteMarcador);
|
|
645
|
-
this.formMarcador.get('tipoReporte').setValue('P');
|
|
646
|
-
//this.formMarcador.get('tipo').setValue(null)
|
|
647
|
-
}
|
|
648
|
-
guardarMarcador() {
|
|
649
|
-
if (this.formMarcador.valid) {
|
|
650
|
-
let llaveRegistro = this.formMarcador.get('llave').value;
|
|
651
|
-
this.formMarcador.get('reporteFuente').setValue(this.reporteFuente.llave);
|
|
652
|
-
//this.formMarcador.get('tipoReporte').setValue('N')
|
|
653
|
-
if (llaveRegistro) {
|
|
654
|
-
this.generalService.update(new GeneralModel('ReporteMarcadorDTO', null, false, this.formMarcador.value)).subscribe(data => {
|
|
655
|
-
this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_ACTUALIZAR);
|
|
656
|
-
this.cargarListaMarcadores();
|
|
657
|
-
if (this.reporteFuente.unicoArchivo == 'N') {
|
|
658
|
-
this.cargarListaSoportes();
|
|
659
|
-
}
|
|
660
|
-
});
|
|
661
|
-
}
|
|
662
|
-
else {
|
|
663
|
-
this.formMarcador.get('llave').setValue(this.utilsService.generarLlave());
|
|
664
|
-
this.generalService.crearRegistro(new GeneralModel('ReporteMarcadorDTO', null, false, this.formMarcador.value)).subscribe(data => {
|
|
665
|
-
this.verNuevoMarcador = false;
|
|
666
|
-
this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_GUARDAR);
|
|
667
|
-
this.cargarListaMarcadores();
|
|
668
|
-
if (this.reporteFuente.unicoArchivo == 'N') {
|
|
669
|
-
this.cargarListaSoportes();
|
|
670
|
-
}
|
|
671
|
-
});
|
|
672
|
-
}
|
|
673
|
-
}
|
|
674
|
-
else {
|
|
675
|
-
this.notificacionesBusService.showError('Faltan campos obligatorios');
|
|
676
|
-
Object.keys(this.formMarcador.controls).forEach((key) => {
|
|
677
|
-
if (this.formMarcador.get(key).errors) {
|
|
678
|
-
this.formMarcador.get(key).markAsDirty();
|
|
679
|
-
}
|
|
680
|
-
});
|
|
681
|
-
}
|
|
682
|
-
}
|
|
683
|
-
eliminarMarcador(event) {
|
|
684
|
-
this.confirmationService.confirm({
|
|
685
|
-
target: event.target,
|
|
686
|
-
message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
|
|
687
|
-
acceptLabel: this.generalPipe.SI_DESC,
|
|
688
|
-
header: this.translateService.instant('confirmar'),
|
|
689
|
-
accept: () => {
|
|
690
|
-
this.generalService.delete(new GeneralModel('ReporteMarcadorDTO', null, false, this.reporteMarcador)).subscribe(data => {
|
|
691
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
|
|
692
|
-
this.formMarcador.reset();
|
|
693
|
-
this.verNuevoMarcador = false;
|
|
694
|
-
this.reporteMarcador = new ReporteMarcadorModel();
|
|
695
|
-
this.cargarListaMarcadores();
|
|
696
|
-
});
|
|
697
|
-
}
|
|
698
|
-
});
|
|
699
|
-
}
|
|
700
|
-
eliminarCampoMarcador(event, objeto) {
|
|
701
|
-
this.confirmationService.confirm({
|
|
702
|
-
target: event.target,
|
|
703
|
-
message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
|
|
704
|
-
acceptLabel: this.generalPipe.SI_DESC,
|
|
705
|
-
header: this.translateService.instant('confirmar'),
|
|
706
|
-
accept: () => {
|
|
707
|
-
this.generalService.delete(new GeneralModel('ReporteTablaDTO', null, false, objeto)).subscribe(data => {
|
|
708
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
|
|
709
|
-
this.cargarListaCampoMarcador();
|
|
710
|
-
});
|
|
711
|
-
}
|
|
712
|
-
});
|
|
713
|
-
}
|
|
714
|
-
nuevoCampoTabla() {
|
|
715
|
-
this.verReporteMarcadorDetalle = true;
|
|
716
|
-
this.campoMarcadorInsertar = new ReporteTablaModel();
|
|
717
|
-
this.campoMarcadorInsertar.reporteMarcador = this.reporteMarcador.llave;
|
|
718
|
-
}
|
|
719
|
-
validarCampoMarcador(campoMarcador) {
|
|
720
|
-
var validador = true;
|
|
721
|
-
validador = validador && this.utilsService.validarCampoObligatorio(campoMarcador.columna);
|
|
722
|
-
validador = validador && this.utilsService.validarCampoObligatorio(campoMarcador.campoFuente);
|
|
723
|
-
return validador;
|
|
724
|
-
}
|
|
725
|
-
agregarCampoMarcador(campoMarcador) {
|
|
726
|
-
this.clickGuardarMarcadorCampo = true;
|
|
727
|
-
if (!this.validarCampoMarcador(campoMarcador)) {
|
|
728
|
-
this.notificacionesBusService.showError('Faltan campos obligatorios');
|
|
729
|
-
return;
|
|
730
|
-
}
|
|
731
|
-
campoMarcador.reporteMarcador = this.reporteMarcador.llave;
|
|
732
|
-
if ('I' == campoMarcador.tipo) {
|
|
733
|
-
if (!campoMarcador.ancho || campoMarcador.ancho == 0) {
|
|
734
|
-
campoMarcador.ancho = 10;
|
|
735
|
-
}
|
|
736
|
-
if (!campoMarcador.alto || campoMarcador.alto == 0) {
|
|
737
|
-
campoMarcador.alto = 10;
|
|
738
|
-
}
|
|
739
|
-
}
|
|
740
|
-
if (['G'].includes(campoMarcador.tipo)) {
|
|
741
|
-
campoMarcador.columna = 0;
|
|
742
|
-
}
|
|
743
|
-
if (campoMarcador.llave) {
|
|
744
|
-
this.generalService.update(new GeneralModel('ReporteTablaDTO', null, false, campoMarcador)).subscribe(data => {
|
|
745
|
-
this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_ACTUALIZAR);
|
|
746
|
-
this.clickGuardarMarcadorCampo = false;
|
|
747
|
-
campoMarcador = new ReporteTablaModel;
|
|
748
|
-
this.cargarListaCampoMarcador();
|
|
749
|
-
});
|
|
750
|
-
}
|
|
751
|
-
else {
|
|
752
|
-
campoMarcador.llave = this.utilsService.generarLlave();
|
|
753
|
-
this.generalService.crearRegistro(new GeneralModel('ReporteTablaDTO', null, false, campoMarcador)).subscribe(data => {
|
|
754
|
-
this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_GUARDAR);
|
|
755
|
-
this.clickGuardarMarcadorCampo = false;
|
|
756
|
-
campoMarcador = new ReporteTablaModel;
|
|
757
|
-
this.verReporteMarcadorDetalle = false;
|
|
758
|
-
this.campoMarcadorInsertar = new ReporteTablaModel();
|
|
759
|
-
this.cargarListaCampoMarcador();
|
|
760
|
-
});
|
|
761
|
-
}
|
|
762
|
-
}
|
|
763
|
-
cargarListaSoportes() {
|
|
764
|
-
this.generalService.queryForList(new GeneralModel('ReporteSoporteDTO', null, false, { reporteFuente: this.reporteFuente.llave, tipo: 'S' })).subscribe(data => {
|
|
765
|
-
this.listaSoportes = data;
|
|
766
|
-
});
|
|
767
|
-
}
|
|
768
|
-
async cargarListaSoportesAsync() {
|
|
769
|
-
this.listaSoportes = await this.generalService.queryForList(new GeneralModel('ReporteSoporteDTO', null, false, { reporteFuente: this.reporteFuente.llave, tipo: 'S' })).toPromise();
|
|
770
|
-
}
|
|
771
|
-
nuevoSoporte() {
|
|
772
|
-
this.soporteIngresar = new ReporteSoporteModel();
|
|
773
|
-
this.verSoporteArchivoDetalle = true;
|
|
774
|
-
this.habilitaCampo = true;
|
|
775
|
-
}
|
|
776
|
-
cancelarSoporte() {
|
|
777
|
-
this.soporteIngresar = new ReporteSoporteModel();
|
|
778
|
-
this.verSoporteArchivoDetalle = false;
|
|
779
|
-
this.habilitaCampo = false;
|
|
780
|
-
}
|
|
781
|
-
validarSoporte(soporte) {
|
|
782
|
-
var validador = true;
|
|
783
|
-
validador = validador && this.utilsService.validarCampoObligatorio(soporte.descripcion);
|
|
784
|
-
validador = validador && this.utilsService.validarCampoObligatorio(soporte.archivoIndividual);
|
|
785
|
-
return validador;
|
|
786
|
-
}
|
|
787
|
-
agregarSoporte(soporte) {
|
|
788
|
-
this.clickGuardarSoporteArchivo = true;
|
|
789
|
-
if (!this.validarSoporte(soporte)) {
|
|
790
|
-
this.notificacionesBusService.showError('Faltan campos obligatorios');
|
|
791
|
-
return;
|
|
792
|
-
}
|
|
793
|
-
if (!soporte.llaveTabla) {
|
|
794
|
-
soporte.tipo = 'S';
|
|
795
|
-
soporte.reporteFuente = this.reporteFuente.llave;
|
|
796
|
-
this.generalService.crearRegistro(new GeneralModel('ReporteSoporteDTO', null, false, soporte)).subscribe(data => {
|
|
797
|
-
this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_GUARDAR);
|
|
798
|
-
soporte = new ReporteSoporteModel;
|
|
799
|
-
this.cargarListaSoportes();
|
|
800
|
-
this.verSoporteArchivoDetalle = false;
|
|
801
|
-
this.clickGuardarSoporteArchivo = false;
|
|
802
|
-
});
|
|
803
|
-
}
|
|
804
|
-
else {
|
|
805
|
-
this.generalService.update(new GeneralModel('ReporteSoporteDTO', null, false, soporte)).subscribe(data => {
|
|
806
|
-
this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_ACTUALIZAR);
|
|
807
|
-
this.cargarListaSoportes();
|
|
808
|
-
this.verSoporteArchivoDetalle = false;
|
|
809
|
-
this.clickGuardarSoporteArchivo = false;
|
|
810
|
-
soporte = new ReporteSoporteModel;
|
|
811
|
-
});
|
|
812
|
-
}
|
|
813
|
-
this.habilitaCampo = false;
|
|
814
|
-
}
|
|
815
|
-
eliminarSoporte(event, soporte) {
|
|
816
|
-
this.habilitaCampo = true;
|
|
817
|
-
this.confirmationService.confirm({
|
|
818
|
-
target: event.target,
|
|
819
|
-
message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
|
|
820
|
-
acceptLabel: this.generalPipe.SI_DESC,
|
|
821
|
-
header: this.translateService.instant('confirmar'),
|
|
822
|
-
accept: () => {
|
|
823
|
-
this.generalService.delete(new GeneralModel('ReporteSoporteDTO', null, false, soporte)).subscribe(data => {
|
|
824
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
|
|
825
|
-
this.cargarListaSoportes();
|
|
826
|
-
this.habilitaCampo = false;
|
|
827
|
-
});
|
|
828
|
-
}
|
|
829
|
-
});
|
|
830
|
-
}
|
|
831
|
-
iniciarEdicion() {
|
|
832
|
-
this.habilitaCampo = true;
|
|
833
|
-
}
|
|
834
|
-
async cancelarEdicion() {
|
|
835
|
-
this.cargarListaSoportesAsync();
|
|
836
|
-
this.habilitaCampo = false;
|
|
837
|
-
}
|
|
838
|
-
//Reporte Dinamico
|
|
839
|
-
generarJasper() {
|
|
840
|
-
this.reporteService.generarJasper(this.reporteFuente.llave, 'compensacion/ReportesBase').subscribe({
|
|
841
|
-
next: (data) => {
|
|
842
|
-
this.notificacionesBusService.showSuccess('Se ha generado el jasper exitosamente');
|
|
843
|
-
this.validarExisteJasper();
|
|
844
|
-
}
|
|
845
|
-
});
|
|
846
|
-
}
|
|
847
|
-
descargarJasper() {
|
|
848
|
-
let propiedad = 'ruta_plantillas';
|
|
849
|
-
//Ruta archivo
|
|
850
|
-
this.aplicacion = this.authService.getTokenKey('aplicacion');
|
|
851
|
-
this.cargarArchivo.descargarArchivo(this.encriptadorArchivo.encriptar('reportes/' + this.reporteFuente.llave + '.jrxml'), propiedad, this.aplicacion).subscribe({
|
|
852
|
-
next: blob => {
|
|
853
|
-
const a = document.createElement('a');
|
|
854
|
-
const objectUrl = URL.createObjectURL(blob);
|
|
855
|
-
a.href = objectUrl;
|
|
856
|
-
a.download = this.reporteFuente.llave + '.jrxml'; //documento.archivoorigen;
|
|
857
|
-
a.click();
|
|
858
|
-
URL.revokeObjectURL(objectUrl);
|
|
859
|
-
}
|
|
860
|
-
});
|
|
861
|
-
}
|
|
862
|
-
nuevoMarcadorDinamico() {
|
|
863
|
-
this.reporteMarcadorDinamico = new ReporteMarcadorModel;
|
|
864
|
-
this.reporteMarcadorDinamico.origen = 'D';
|
|
865
|
-
this.reporteMarcadorDinamico.reporteFuente = this.reporteFuente.llave;
|
|
866
|
-
this.reporteMarcadorDinamico.banda = this.bandaSeleccionada.key;
|
|
867
|
-
this.formReporteDinamico.reset();
|
|
868
|
-
this.formReporteDinamico.patchValue(this.reporteMarcadorDinamico);
|
|
869
|
-
this.nuevoReporteMarcadorDinamico = true;
|
|
870
|
-
}
|
|
871
|
-
verMarcadorDinamico(event) {
|
|
872
|
-
this.reporteMarcadorDinamico = event.data;
|
|
873
|
-
this.formReporteDinamico.patchValue(this.reporteMarcadorDinamico);
|
|
874
|
-
this.nuevoReporteMarcadorDinamico = true;
|
|
875
|
-
}
|
|
876
|
-
async verBanda(event) {
|
|
877
|
-
this.verTabBanda = false;
|
|
878
|
-
this.bandaSeleccionada = event.data;
|
|
879
|
-
this.reporteMarcadorDinamico = new ReporteMarcadorModel;
|
|
880
|
-
this.nuevoReporteMarcadorDinamico = false;
|
|
881
|
-
this.nuevaBanda = false;
|
|
882
|
-
if (['detalle', 'summary'].includes(this.bandaSeleccionada.key)) {
|
|
883
|
-
await this.cargarListaMarcadorDinamico();
|
|
884
|
-
}
|
|
885
|
-
else {
|
|
886
|
-
this.reporteBanda = await this.generalService.queryForObject(new GeneralModel('ReporteBandaDTO', null, false, { reporteFuente: this.reporteFuente.llave, banda: this.bandaSeleccionada.key })).toPromise();
|
|
887
|
-
if (!this.reporteBanda) {
|
|
888
|
-
this.nuevaBanda = true;
|
|
889
|
-
if (['detalle', 'summary'].includes(this.bandaSeleccionada.key)) {
|
|
890
|
-
this.nuevaBanda = false;
|
|
891
|
-
}
|
|
892
|
-
this.reporteBanda = new ReporteBandaModel;
|
|
893
|
-
this.reporteBanda.totales = 'S';
|
|
894
|
-
}
|
|
895
|
-
else {
|
|
896
|
-
await this.cargarListaMarcadorDinamico();
|
|
897
|
-
}
|
|
898
|
-
}
|
|
899
|
-
await this.sleep(25);
|
|
900
|
-
this.verTabBanda = true;
|
|
901
|
-
}
|
|
902
|
-
async cargarListaMarcadorDinamico() {
|
|
903
|
-
this.listaMarcadorDinamico = await this.generalService.queryForList(new GeneralModel('ReporteMarcadorDTO', null, false, {
|
|
904
|
-
reporteFuente: this.reporteFuente.llave,
|
|
905
|
-
banda: this.bandaSeleccionada.key,
|
|
906
|
-
ordenDinamico: 'S',
|
|
907
|
-
origen: 'D'
|
|
908
|
-
})).toPromise();
|
|
909
|
-
}
|
|
910
|
-
async guardarCaracteristicaBanda() {
|
|
911
|
-
if (this.nuevaBanda) {
|
|
912
|
-
this.reporteBanda.reporteFuente = this.reporteFuente.llave;
|
|
913
|
-
this.reporteBanda.banda = this.bandaSeleccionada.key;
|
|
914
|
-
this.reporteBanda = await this.generalService.crearRegistro(new GeneralModel('ReporteBandaDTO', null, false, this.reporteBanda)).toPromise();
|
|
915
|
-
}
|
|
916
|
-
else {
|
|
917
|
-
await this.generalService.update(new GeneralModel('ReporteBandaDTO', null, false, this.reporteBanda)).toPromise();
|
|
918
|
-
}
|
|
919
|
-
await this.sleep(25);
|
|
920
|
-
this.nuevaBanda = false;
|
|
921
|
-
this.notificacionesBusService.showInfo("Se actualizaron las caracteristicas de " + this.bandaSeleccionada.value);
|
|
922
|
-
}
|
|
923
|
-
async guardarColumnaDinamico() {
|
|
924
|
-
if (!this.formReporteDinamico.valid) {
|
|
925
|
-
this.notificacionesBusService.showError('Faltan campos obligatorios');
|
|
926
|
-
Object.keys(this.formReporteDinamico.controls).forEach((key) => {
|
|
927
|
-
if (this.formReporteDinamico.get(key).errors) {
|
|
928
|
-
this.formReporteDinamico.get(key).markAsDirty();
|
|
929
|
-
}
|
|
930
|
-
});
|
|
931
|
-
return;
|
|
932
|
-
}
|
|
933
|
-
this.reporteMarcadorDinamico = this.formReporteDinamico.value;
|
|
934
|
-
if (this.utilsService.isBlank(this.reporteMarcadorDinamico.llave)) {
|
|
935
|
-
this.reporteMarcadorDinamico.llave = this.utilsService.generarLlave();
|
|
936
|
-
this.reporteMarcadorDinamico.origen = 'D';
|
|
937
|
-
if (this.reporteMarcadorDinamico.tipoCampo == 'C') {
|
|
938
|
-
this.reporteMarcadorDinamico.marcador = this.reporteMarcadorDinamico.filtro;
|
|
939
|
-
this.reporteMarcadorDinamico.reporteColumna = null;
|
|
940
|
-
}
|
|
941
|
-
else {
|
|
942
|
-
var columna = new ReporteColumnaModel();
|
|
943
|
-
columna.llaveTabla = this.reporteMarcadorDinamico.marcador;
|
|
944
|
-
columna = await this.generalService.queryForObject(new GeneralModel('ReporteColumnaDTO', null, false, columna)).toPromise();
|
|
945
|
-
this.reporteMarcadorDinamico.marcador = columna.nombre;
|
|
946
|
-
this.reporteMarcadorDinamico.reporteColumna = columna.llaveTabla;
|
|
947
|
-
this.reporteMarcadorDinamico.filtro = columna.sintaxis;
|
|
948
|
-
this.reporteMarcadorDinamico.tipoDato = columna.tipoDato;
|
|
949
|
-
}
|
|
950
|
-
await this.generalService.crearRegistro(new GeneralModel('ReporteMarcadorDTO', null, false, this.reporteMarcadorDinamico)).toPromise();
|
|
951
|
-
}
|
|
952
|
-
else {
|
|
953
|
-
if (this.reporteMarcadorDinamico.tipoCampo == 'C') {
|
|
954
|
-
this.reporteMarcadorDinamico.marcador = this.reporteMarcadorDinamico.filtro;
|
|
955
|
-
}
|
|
956
|
-
await this.generalService.update(new GeneralModel('ReporteMarcadorDTO', null, false, this.reporteMarcadorDinamico)).toPromise();
|
|
957
|
-
}
|
|
958
|
-
this.reporteMarcadorDinamico = null;
|
|
959
|
-
this.nuevoReporteMarcadorDinamico = false;
|
|
960
|
-
await this.cargarListaMarcadorDinamico();
|
|
961
|
-
this.notificacionesBusService.showInfo('Se ha guardado el cambio');
|
|
962
|
-
}
|
|
963
|
-
regresarBandaSeleccionada() {
|
|
964
|
-
this.bandaSeleccionada = { key: null, value: null };
|
|
965
|
-
}
|
|
966
|
-
async eliminarColumnaDinamico(event) {
|
|
967
|
-
this.confirmationService.confirm({
|
|
968
|
-
target: event.target,
|
|
969
|
-
message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
|
|
970
|
-
acceptLabel: this.generalPipe.SI_DESC,
|
|
971
|
-
header: this.translateService.instant('confirmar'),
|
|
972
|
-
accept: async () => {
|
|
973
|
-
await this.generalService.delete(new GeneralModel('ReporteMarcadorDTO', null, false, this.reporteMarcadorDinamico)).toPromise();
|
|
974
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
|
|
975
|
-
this.reporteMarcadorDinamico = new ReporteMarcadorModel();
|
|
976
|
-
this.nuevoReporteMarcadorDinamico = false;
|
|
977
|
-
await this.cargarListaMarcadorDinamico();
|
|
978
|
-
}
|
|
979
|
-
});
|
|
980
|
-
}
|
|
981
|
-
validarSeparador() {
|
|
982
|
-
var validador = true;
|
|
983
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.reporteFuente.separador);
|
|
984
|
-
return validador;
|
|
985
|
-
}
|
|
986
|
-
actualizarSeparador() {
|
|
987
|
-
this.clickGuardarReporteTexto = true;
|
|
988
|
-
if (!this.validarSeparador()) {
|
|
989
|
-
this.notificacionesBusService.showError('Faltan campos obligatorios');
|
|
990
|
-
return;
|
|
991
|
-
}
|
|
992
|
-
this.actualizar();
|
|
993
|
-
}
|
|
994
|
-
cargarListaMarcadoresTexto() {
|
|
995
|
-
this.generalService.queryForList(new GeneralModel('ReporteMarcadorDTO', null, false, {
|
|
996
|
-
tipoReporte: this.reporteFuentePipe.REPORTEARCHIVOPLANO,
|
|
997
|
-
reporteFuente: this.reporteFuente.llave,
|
|
998
|
-
ordenDinamico: this.generalPipe.SI
|
|
999
|
-
})).subscribe(data => {
|
|
1000
|
-
this.listaMarcadoresTexto = data;
|
|
1001
|
-
});
|
|
1002
|
-
}
|
|
1003
|
-
verMarcadorTexto(event) {
|
|
1004
|
-
this.verNuevoMarcadorTexto = true;
|
|
1005
|
-
this.marcadorTexto = event.data;
|
|
1006
|
-
}
|
|
1007
|
-
nuevoMarcadorTexto() {
|
|
1008
|
-
this.verNuevoMarcadorTexto = true;
|
|
1009
|
-
this.marcadorTexto = new ReporteMarcadorModel();
|
|
1010
|
-
this.marcadorTexto.tipoReporte = this.reporteFuentePipe.REPORTEARCHIVOPLANO;
|
|
1011
|
-
}
|
|
1012
|
-
validarMarcadorTexto() {
|
|
1013
|
-
var validador = true;
|
|
1014
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorTexto.tipoGrafico);
|
|
1015
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorTexto.alto);
|
|
1016
|
-
if (this.reporteFuentePipe.MARCADORTEXTOFIJO == this.marcadorTexto.tipoGrafico) {
|
|
1017
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorTexto.formato);
|
|
1018
|
-
}
|
|
1019
|
-
if (this.reporteFuentePipe.MARCADORTEXTODINAMICO == this.marcadorTexto.tipoGrafico) {
|
|
1020
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorTexto.ancho);
|
|
1021
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorTexto.reporteColumna);
|
|
1022
|
-
}
|
|
1023
|
-
return validador;
|
|
1024
|
-
}
|
|
1025
|
-
async guardarMarcadorTexto() {
|
|
1026
|
-
this.clickGuardarMarcadorTexto = true;
|
|
1027
|
-
if (!this.validarMarcadorTexto()) {
|
|
1028
|
-
this.notificacionesBusService.showError('Faltan campos obligatorios');
|
|
1029
|
-
return;
|
|
1030
|
-
}
|
|
1031
|
-
this.clickGuardarMarcadorTexto = false;
|
|
1032
|
-
this.marcadorTexto.reporteFuente = this.reporteFuente.llave;
|
|
1033
|
-
if (this.marcadorTexto.llave) {
|
|
1034
|
-
await this.generalService.update(new GeneralModel('ReporteMarcadorDTO', null, false, this.marcadorTexto)).toPromise();
|
|
1035
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR);
|
|
1036
|
-
}
|
|
1037
|
-
else {
|
|
1038
|
-
this.marcadorTexto.llave = this.utilsService.generarLlave();
|
|
1039
|
-
await this.generalService.crearRegistro(new GeneralModel('ReporteMarcadorDTO', null, false, this.marcadorTexto)).toPromise();
|
|
1040
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_GUARDAR);
|
|
1041
|
-
}
|
|
1042
|
-
this.cargarListaMarcadoresTexto();
|
|
1043
|
-
this.verNuevoMarcadorTexto = false;
|
|
1044
|
-
}
|
|
1045
|
-
eliminarMarcadoTexto(event) {
|
|
1046
|
-
this.confirmationService.confirm({
|
|
1047
|
-
target: event.target,
|
|
1048
|
-
message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
|
|
1049
|
-
acceptLabel: this.generalPipe.SI_DESC,
|
|
1050
|
-
header: this.translateService.instant('confirmar'),
|
|
1051
|
-
accept: async () => {
|
|
1052
|
-
await this.generalService.delete(new GeneralModel('ReporteMarcadorDTO', null, false, this.marcadorTexto)).toPromise();
|
|
1053
|
-
this.verNuevoMarcadorTexto = false;
|
|
1054
|
-
this.marcadorTexto = new ReporteMarcadorModel();
|
|
1055
|
-
this.cargarListaMarcadoresTexto();
|
|
1056
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
|
|
1057
|
-
}
|
|
1058
|
-
});
|
|
1059
|
-
}
|
|
1060
|
-
cargarListaXML() {
|
|
1061
|
-
this.generalService.queryForList(new GeneralModel('ReporteMarcadorDTO', null, false, {
|
|
1062
|
-
tipoReporte: 'X',
|
|
1063
|
-
origen: 'X',
|
|
1064
|
-
reporteFuente: this.reporteFuente.llave,
|
|
1065
|
-
ordenDinamico: this.generalPipe.SI
|
|
1066
|
-
})).subscribe(data => {
|
|
1067
|
-
this.listaXML = data;
|
|
1068
|
-
});
|
|
1069
|
-
}
|
|
1070
|
-
nuevoMarcadorXML() {
|
|
1071
|
-
this.marcadorXML = new ReporteMarcadorModel();
|
|
1072
|
-
this.marcadorXML.tipoReporte = 'X';
|
|
1073
|
-
this.marcadorXML.origen = 'X';
|
|
1074
|
-
this.verNuevoMarcadorXML = true;
|
|
1075
|
-
}
|
|
1076
|
-
verMarcadorXML(event) {
|
|
1077
|
-
this.marcadorXML = event.data;
|
|
1078
|
-
this.verNuevoMarcadorXML = true;
|
|
1079
|
-
if (this.marcadorXML.tipo == 'MR' || this.marcadorXML.tipo == 'TB') {
|
|
1080
|
-
this.cargarListaCampoMarcadorXML();
|
|
1081
|
-
}
|
|
1082
|
-
}
|
|
1083
|
-
validarMarcadorXML() {
|
|
1084
|
-
var validador = true;
|
|
1085
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorXML.descripcion);
|
|
1086
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorXML.tipo);
|
|
1087
|
-
return validador;
|
|
1088
|
-
}
|
|
1089
|
-
guardarMarcadorXML() {
|
|
1090
|
-
this.clickGuardarMarcadorXML = true;
|
|
1091
|
-
if (!this.validarMarcadorXML()) {
|
|
1092
|
-
this.notificacionesBusService.showError('Faltan campos obligatorios');
|
|
1093
|
-
return;
|
|
1094
|
-
}
|
|
1095
|
-
this.marcadorXML.reporteFuente = this.reporteFuente.llave;
|
|
1096
|
-
if (this.marcadorXML.llave) {
|
|
1097
|
-
this.generalService.update(new GeneralModel('ReporteMarcadorDTO', null, false, this.marcadorXML)).subscribe(data => {
|
|
1098
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR);
|
|
1099
|
-
this.marcadorXML = new ReporteMarcadorModel();
|
|
1100
|
-
this.verNuevoMarcadorXML = false;
|
|
1101
|
-
this.cargarListaXML();
|
|
1102
|
-
});
|
|
1103
|
-
}
|
|
1104
|
-
else {
|
|
1105
|
-
this.marcadorXML.llave = this.utilsService.generarLlave();
|
|
1106
|
-
this.generalService.crearRegistro(new GeneralModel('ReporteMarcadorDTO', null, false, this.marcadorXML)).subscribe(data => {
|
|
1107
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_GUARDAR);
|
|
1108
|
-
this.marcadorXML = new ReporteMarcadorModel();
|
|
1109
|
-
this.verNuevoMarcadorXML = false;
|
|
1110
|
-
this.cargarListaXML();
|
|
1111
|
-
});
|
|
1112
|
-
}
|
|
1113
|
-
this.clickGuardarMarcadorXML = false;
|
|
1114
|
-
}
|
|
1115
|
-
eliminarMarcadorXML(event) {
|
|
1116
|
-
this.confirmationService.confirm({
|
|
1117
|
-
target: event.target,
|
|
1118
|
-
message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
|
|
1119
|
-
acceptLabel: this.generalPipe.SI_DESC,
|
|
1120
|
-
header: this.translateService.instant('confirmar'),
|
|
1121
|
-
accept: async () => {
|
|
1122
|
-
await this.generalService.delete(new GeneralModel('ReporteMarcadorDTO', null, false, this.marcadorXML)).toPromise();
|
|
1123
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
|
|
1124
|
-
this.marcadorXML = new ReporteMarcadorModel();
|
|
1125
|
-
this.verNuevoMarcadorXML = false;
|
|
1126
|
-
this.cargarListaXML();
|
|
1127
|
-
}
|
|
1128
|
-
});
|
|
1129
|
-
}
|
|
1130
|
-
nuevoCampoTablaXML() {
|
|
1131
|
-
this.verReporteMarcadorDetalleXML = true;
|
|
1132
|
-
this.campoMarcadorInsertarXML = new ReporteTablaModel();
|
|
1133
|
-
this.campoMarcadorInsertarXML.reporteMarcador = this.marcadorXML.llave;
|
|
1134
|
-
}
|
|
1135
|
-
cargarListaCampoMarcadorXML() {
|
|
1136
|
-
this.generalService.queryForList(new GeneralModel('ReporteTablaDTO', null, false, { reporteMarcador: this.marcadorXML.llave })).subscribe(data => {
|
|
1137
|
-
this.listaCamposMarcadorXML = data;
|
|
1138
|
-
});
|
|
1139
|
-
}
|
|
1140
|
-
async cargarListaCampoMarcadorXMLAsync() {
|
|
1141
|
-
this.listaCamposMarcadorXML = await this.generalService.queryForList(new GeneralModel('ReporteTablaDTO', null, false, { reporteMarcador: this.marcadorXML.llave })).toPromise();
|
|
1142
|
-
}
|
|
1143
|
-
validarCampoMarcadorXML(campoMarcador) {
|
|
1144
|
-
var validador = true;
|
|
1145
|
-
validador = validador && this.utilsService.validarCampoObligatorio(campoMarcador.campoFuente);
|
|
1146
|
-
validador = validador && this.utilsService.validarCampoObligatorio(campoMarcador.marcador);
|
|
1147
|
-
return validador;
|
|
1148
|
-
}
|
|
1149
|
-
agregarCampoMarcadorXML(campo) {
|
|
1150
|
-
this.clickGuardarMarcadorCampoXML = true;
|
|
1151
|
-
if (!this.validarCampoMarcadorXML(campo)) {
|
|
1152
|
-
this.notificacionesBusService.showError('Faltan campos obligatorios');
|
|
1153
|
-
return;
|
|
1154
|
-
}
|
|
1155
|
-
if (campo.llave) {
|
|
1156
|
-
this.generalService.update(new GeneralModel('ReporteTablaDTO', null, false, campo)).subscribe(data => {
|
|
1157
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR);
|
|
1158
|
-
this.campoMarcadorInsertarXML = new ReporteTablaModel();
|
|
1159
|
-
this.cargarListaCampoMarcadorXML();
|
|
1160
|
-
});
|
|
1161
|
-
}
|
|
1162
|
-
else {
|
|
1163
|
-
campo.columna = 0;
|
|
1164
|
-
campo.llave = this.utilsService.generarLlave();
|
|
1165
|
-
this.generalService.crearRegistro(new GeneralModel('ReporteTablaDTO', null, false, campo)).subscribe(data => {
|
|
1166
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_GUARDAR);
|
|
1167
|
-
campo = new ReporteTablaModel();
|
|
1168
|
-
this.cargarListaCampoMarcadorXML();
|
|
1169
|
-
});
|
|
1170
|
-
}
|
|
1171
|
-
this.clickGuardarMarcadorCampoXML = false;
|
|
1172
|
-
this.verReporteMarcadorDetalleXML = false;
|
|
1173
|
-
}
|
|
1174
|
-
eliminarCampoMarcadorXML(event, objeto) {
|
|
1175
|
-
this.confirmationService.confirm({
|
|
1176
|
-
target: event.target,
|
|
1177
|
-
message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
|
|
1178
|
-
acceptLabel: this.generalPipe.SI_DESC,
|
|
1179
|
-
header: this.translateService.instant('confirmar'),
|
|
1180
|
-
accept: () => {
|
|
1181
|
-
this.generalService.delete(new GeneralModel('ReporteTablaDTO', null, false, objeto)).subscribe(data => {
|
|
1182
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
|
|
1183
|
-
this.cargarListaCampoMarcadorXML();
|
|
1184
|
-
});
|
|
1185
|
-
}
|
|
1186
|
-
});
|
|
1187
|
-
}
|
|
1188
|
-
cambiarTabColumnario(event) {
|
|
1189
|
-
switch (event.index) {
|
|
1190
|
-
case 0:
|
|
1191
|
-
this.cargarReporteColumnario();
|
|
1192
|
-
break;
|
|
1193
|
-
case 1:
|
|
1194
|
-
this.cargarDatosAdicionales();
|
|
1195
|
-
break;
|
|
1196
|
-
case 2:
|
|
1197
|
-
this.cargarMarcadoresColumnario();
|
|
1198
|
-
break;
|
|
1199
|
-
}
|
|
1200
|
-
}
|
|
1201
|
-
cargarMarcadoresColumnario() {
|
|
1202
|
-
this.generalService.queryForList(new GeneralModel('ReporteColumnarioMarcadorDTO', null, false, { reporteFuente: this.reporteFuente.llave })).subscribe(data => {
|
|
1203
|
-
this.marcadoresColumnario = data;
|
|
1204
|
-
});
|
|
1205
|
-
}
|
|
1206
|
-
cargarDatosAdicionales() {
|
|
1207
|
-
this.generalService.queryForList(new GeneralModel('ReporteColumnarioDTO', null, false, { reporteFuente: this.reporteFuente.llave, filtroColumnaBasica: 'N' })).subscribe(data => {
|
|
1208
|
-
this.columnasAdicionales = data;
|
|
1209
|
-
});
|
|
1210
|
-
}
|
|
1211
|
-
cargarReporteColumnario() {
|
|
1212
|
-
this.generalService.queryForList(new GeneralModel('ReporteColumnarioDTO', null, false, { reporteFuente: this.reporteFuente.llave, filtroColumnaBasica: 'S' })).subscribe(data => {
|
|
1213
|
-
this.listaReporteColumnario = data;
|
|
1214
|
-
});
|
|
1215
|
-
}
|
|
1216
|
-
cargarGraficasColumnas() {
|
|
1217
|
-
this.generalService.queryForList(new GeneralModel('ReporteColumnaDTO', null, false, { reporteFuente: this.reporteFuente.llave })).subscribe(data => {
|
|
1218
|
-
this.paginadorColumnas = data;
|
|
1219
|
-
});
|
|
1220
|
-
this.generalService.queryForList(new GeneralModel('ReporteBandaDTO', null, false, { reporteFuente: this.reporteFuente.llave, totales: 'C' })).subscribe(data => {
|
|
1221
|
-
this.paginadorColoresGrafica = data;
|
|
1222
|
-
});
|
|
1223
|
-
}
|
|
1224
|
-
validarExisteJasper() {
|
|
1225
|
-
this.cargarArchivo.descargarArchivo(this.encriptadorArchivo.encriptar('reportes/' + this.reporteFuente.llave + '.jrxml'), 'ruta_plantillas', this.aplicacion).subscribe((response) => {
|
|
1226
|
-
this.existeJasper = true;
|
|
1227
|
-
}, (error) => {
|
|
1228
|
-
this.existeJasper = false;
|
|
1229
|
-
});
|
|
1230
|
-
}
|
|
1231
|
-
verReporteColumnario(event) {
|
|
1232
|
-
this.columnaBasica = event.data;
|
|
1233
|
-
this.verNuevoReporteColumnario = true;
|
|
1234
|
-
}
|
|
1235
|
-
nuevoColumnaBasica() {
|
|
1236
|
-
this.columnaBasica = new ReporteColumnarioModel();
|
|
1237
|
-
this.columnaBasica.reporteFuente = this.reporteFuente.llave;
|
|
1238
|
-
this.verNuevoReporteColumnario = true;
|
|
1239
|
-
}
|
|
1240
|
-
validarColumnaBasica() {
|
|
1241
|
-
var validador = true;
|
|
1242
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.nombre);
|
|
1243
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.tipo);
|
|
1244
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.reporteColumna);
|
|
1245
|
-
if (validador) {
|
|
1246
|
-
if (this.isMostrarOrden()) {
|
|
1247
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.orden);
|
|
1248
|
-
}
|
|
1249
|
-
if (this.isMostrarOrdenConsulta()) {
|
|
1250
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.ordenConsulta);
|
|
1251
|
-
}
|
|
1252
|
-
if (this.reporteColumnarioPipe.TIPO_CELDA == this.columnaBasica.tipo) {
|
|
1253
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.operacion);
|
|
1254
|
-
}
|
|
1255
|
-
else if (this.reporteColumnarioPipe.TIPO_COLUMNA == this.columnaBasica.tipo) {
|
|
1256
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.operacionHorizontal);
|
|
1257
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.operacionVertical);
|
|
1258
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.columnaOperacionVertical);
|
|
1259
|
-
}
|
|
1260
|
-
else if (this.reporteColumnarioPipe.TIPO_LABEL == this.columnaBasica.tipo) {
|
|
1261
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.columnaBasica.orderBy);
|
|
1262
|
-
}
|
|
1263
|
-
}
|
|
1264
|
-
return validador;
|
|
1265
|
-
}
|
|
1266
|
-
async verificarColumnasValidas(reporteColumnarioDTO) {
|
|
1267
|
-
var tipo = reporteColumnarioDTO.tipo;
|
|
1268
|
-
if (this.reporteColumnarioPipe.TIPO_FILA == reporteColumnarioDTO.tipo) {
|
|
1269
|
-
return true;
|
|
1270
|
-
}
|
|
1271
|
-
var filtro = new ReporteColumnarioModel();
|
|
1272
|
-
filtro.reporteFuente = reporteColumnarioDTO.reporteFuente;
|
|
1273
|
-
filtro.diferenteColumnario = reporteColumnarioDTO.llaveTabla;
|
|
1274
|
-
filtro.tipo = tipo;
|
|
1275
|
-
var cantidad = await this.generalService.cantidadRegistros(new GeneralModel('ReporteColumnarioDTO', null, false, filtro)).toPromise();
|
|
1276
|
-
if (cantidad == 0) {
|
|
1277
|
-
return true;
|
|
1278
|
-
}
|
|
1279
|
-
if (this.reporteColumnarioPipe.TIPO_COLUMNA == reporteColumnarioDTO.tipo) {
|
|
1280
|
-
this.notificacionesBusService.showWarning("El reporte solo puede contener 1 registro con tipo " + this.reporteColumnarioPipe.TIPO_COLUMNA_DESC);
|
|
1281
|
-
return false;
|
|
1282
|
-
}
|
|
1283
|
-
else if (this.reporteColumnarioPipe.TIPO_CELDA == reporteColumnarioDTO.tipo) {
|
|
1284
|
-
this.notificacionesBusService.showWarning("El reporte solo puede contener 1 registro con tipo " + this.reporteColumnarioPipe.TIPO_CELDA_DESC);
|
|
1285
|
-
return false;
|
|
1286
|
-
}
|
|
1287
|
-
return true;
|
|
1288
|
-
}
|
|
1289
|
-
async guardarColumnaBasica() {
|
|
1290
|
-
this.clickGuardarReporteColumnario = true;
|
|
1291
|
-
if (!this.validarColumnaBasica()) {
|
|
1292
|
-
this.notificacionesBusService.showError('Faltan campos obligatorios');
|
|
1293
|
-
return;
|
|
1294
|
-
}
|
|
1295
|
-
if (await this.verificarColumnasValidas(this.columnaBasica)) {
|
|
1296
|
-
if (this.columnaBasica.llaveTabla) {
|
|
1297
|
-
await this.generalService.update(new GeneralModel('ReporteColumnarioDTO', null, false, this.columnaBasica)).toPromise();
|
|
1298
|
-
this.columnaBasica = new ReporteColumnarioModel();
|
|
1299
|
-
this.verNuevoReporteColumnario = false;
|
|
1300
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR);
|
|
1301
|
-
}
|
|
1302
|
-
else {
|
|
1303
|
-
await this.generalService.crearRegistro(new GeneralModel('ReporteColumnarioDTO', null, false, this.columnaBasica)).toPromise();
|
|
1304
|
-
this.columnaBasica = new ReporteColumnarioModel();
|
|
1305
|
-
this.verNuevoReporteColumnario = false;
|
|
1306
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_GUARDAR);
|
|
1307
|
-
}
|
|
1308
|
-
this.clickGuardarReporteColumnario = false;
|
|
1309
|
-
this.cargarReporteColumnario();
|
|
1310
|
-
}
|
|
1311
|
-
}
|
|
1312
|
-
eliminarColumnaBasica(event) {
|
|
1313
|
-
this.confirmationService.confirm({
|
|
1314
|
-
target: event.target,
|
|
1315
|
-
message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
|
|
1316
|
-
acceptLabel: this.generalPipe.SI_DESC,
|
|
1317
|
-
header: this.translateService.instant('confirmar'),
|
|
1318
|
-
accept: () => {
|
|
1319
|
-
this.generalService.delete(new GeneralModel('ReporteColumnarioDTO', null, false, this.columnaBasica)).subscribe(data => {
|
|
1320
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
|
|
1321
|
-
this.verNuevoReporteColumnario = false;
|
|
1322
|
-
this.columnaBasica = new ReporteColumnarioModel();
|
|
1323
|
-
this.cargarReporteColumnario();
|
|
1324
|
-
});
|
|
1325
|
-
}
|
|
1326
|
-
});
|
|
1327
|
-
}
|
|
1328
|
-
nuevaColumnaAdicional() {
|
|
1329
|
-
this.columnaAdicional = new ReporteColumnarioModel();
|
|
1330
|
-
this.columnaAdicional.reporteFuente = this.reporteFuente.llave;
|
|
1331
|
-
this.columnaAdicional.tipo = this.reporteColumnarioPipe.TIPO_ADICIONAL;
|
|
1332
|
-
this.verNuevoColumnaAdicional = true;
|
|
1333
|
-
}
|
|
1334
|
-
verDetalleAdicional(event) {
|
|
1335
|
-
this.columnaAdicional = event.data;
|
|
1336
|
-
this.verNuevoColumnaAdicional = true;
|
|
1337
|
-
}
|
|
1338
|
-
validarColumnaAdicional() {
|
|
1339
|
-
var validador = true;
|
|
1340
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.columnaAdicional.nombre);
|
|
1341
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.columnaAdicional.sintaxis);
|
|
1342
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.columnaAdicional.orden);
|
|
1343
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.columnaAdicional.orderBy);
|
|
1344
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.columnaAdicional.ordenConsulta);
|
|
1345
|
-
return validador;
|
|
1346
|
-
}
|
|
1347
|
-
async guardarColumnaAdicional() {
|
|
1348
|
-
this.clickGuardarColumnaAdicional = true;
|
|
1349
|
-
if (!this.validarColumnaAdicional()) {
|
|
1350
|
-
this.notificacionesBusService.showError('Faltan campos obligatorios');
|
|
1351
|
-
return;
|
|
1352
|
-
}
|
|
1353
|
-
if (this.columnaAdicional.llaveTabla) {
|
|
1354
|
-
await this.generalService.update(new GeneralModel('ReporteColumnarioDTO', null, false, this.columnaAdicional)).toPromise();
|
|
1355
|
-
this.columnaAdicional = new ReporteColumnarioModel();
|
|
1356
|
-
this.verNuevoColumnaAdicional = false;
|
|
1357
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR);
|
|
1358
|
-
}
|
|
1359
|
-
else {
|
|
1360
|
-
await this.generalService.crearRegistro(new GeneralModel('ReporteColumnarioDTO', null, false, this.columnaAdicional)).toPromise();
|
|
1361
|
-
this.columnaAdicional = new ReporteColumnarioModel();
|
|
1362
|
-
this.verNuevoColumnaAdicional = false;
|
|
1363
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_GUARDAR);
|
|
1364
|
-
}
|
|
1365
|
-
this.clickGuardarColumnaAdicional = false;
|
|
1366
|
-
this.cargarDatosAdicionales();
|
|
1367
|
-
}
|
|
1368
|
-
eliminarColumnaAdicional(event) {
|
|
1369
|
-
this.confirmationService.confirm({
|
|
1370
|
-
target: event.target,
|
|
1371
|
-
message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
|
|
1372
|
-
acceptLabel: this.generalPipe.SI_DESC,
|
|
1373
|
-
header: this.translateService.instant('confirmar'),
|
|
1374
|
-
accept: () => {
|
|
1375
|
-
this.generalService.delete(new GeneralModel('ReporteColumnarioDTO', null, false, this.columnaAdicional)).subscribe(data => {
|
|
1376
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
|
|
1377
|
-
this.verNuevoColumnaAdicional = false;
|
|
1378
|
-
this.columnaAdicional = new ReporteColumnarioModel();
|
|
1379
|
-
this.cargarDatosAdicionales();
|
|
1380
|
-
});
|
|
1381
|
-
}
|
|
1382
|
-
});
|
|
1383
|
-
}
|
|
1384
|
-
nuevoMarcadorColumnario() {
|
|
1385
|
-
this.marcadorColumnario = new ReporteColumnarioMarcadorModel();
|
|
1386
|
-
this.marcadorColumnario.reporteFuente = this.reporteFuente.llave;
|
|
1387
|
-
this.verNuevoMarcadorColumnario = true;
|
|
1388
|
-
}
|
|
1389
|
-
verDetalleMarcadorColumnario(event) {
|
|
1390
|
-
this.marcadorColumnario = event.data;
|
|
1391
|
-
this.verNuevoMarcadorColumnario = true;
|
|
1392
|
-
}
|
|
1393
|
-
validarMarcadorColumnario() {
|
|
1394
|
-
var validador = true;
|
|
1395
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorColumnario.marcador);
|
|
1396
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorColumnario.tipo);
|
|
1397
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorColumnario.textoRegistro);
|
|
1398
|
-
validador = validador && this.utilsService.validarCampoObligatorio(this.marcadorColumnario.descripcion);
|
|
1399
|
-
return validador;
|
|
1400
|
-
}
|
|
1401
|
-
async guardarMarcadorColumnario() {
|
|
1402
|
-
this.clickGuardarMarcadorColumnario = true;
|
|
1403
|
-
if (!this.validarMarcadorColumnario()) {
|
|
1404
|
-
this.notificacionesBusService.showError('Faltan campos obligatorios');
|
|
1405
|
-
return;
|
|
1406
|
-
}
|
|
1407
|
-
if (this.marcadorColumnario.llaveTabla) {
|
|
1408
|
-
await this.generalService.update(new GeneralModel('ReporteColumnarioMarcadorDTO', null, false, this.marcadorColumnario)).toPromise();
|
|
1409
|
-
this.marcadorColumnario = new ReporteColumnarioMarcadorModel();
|
|
1410
|
-
this.verNuevoMarcadorColumnario = false;
|
|
1411
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ACTUALIZAR);
|
|
1412
|
-
}
|
|
1413
|
-
else {
|
|
1414
|
-
await this.generalService.crearRegistro(new GeneralModel('ReporteColumnarioMarcadorDTO', null, false, this.marcadorColumnario)).toPromise();
|
|
1415
|
-
this.marcadorColumnario = new ReporteColumnarioMarcadorModel();
|
|
1416
|
-
this.verNuevoMarcadorColumnario = false;
|
|
1417
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_GUARDAR);
|
|
1418
|
-
}
|
|
1419
|
-
this.clickGuardarMarcadorColumnario = false;
|
|
1420
|
-
this.cargarMarcadoresColumnario();
|
|
1421
|
-
}
|
|
1422
|
-
eliminarMarcadorColumnario(event) {
|
|
1423
|
-
this.confirmationService.confirm({
|
|
1424
|
-
target: event.target,
|
|
1425
|
-
message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
|
|
1426
|
-
acceptLabel: this.generalPipe.SI_DESC,
|
|
1427
|
-
header: this.translateService.instant('confirmar'),
|
|
1428
|
-
accept: () => {
|
|
1429
|
-
this.generalService.delete(new GeneralModel('ReporteColumnarioMarcadorDTO', null, false, this.marcadorColumnario)).subscribe(data => {
|
|
1430
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
|
|
1431
|
-
this.verNuevoMarcadorColumnario = false;
|
|
1432
|
-
this.marcadorColumnario = new ReporteColumnarioMarcadorModel();
|
|
1433
|
-
this.cargarMarcadoresColumnario();
|
|
1434
|
-
});
|
|
1435
|
-
}
|
|
1436
|
-
});
|
|
1437
|
-
}
|
|
1438
|
-
guardarGrafico() {
|
|
1439
|
-
this.actualizar();
|
|
1440
|
-
this.paginadorColumnas.forEach(data => {
|
|
1441
|
-
this.generalService.update(new GeneralModel('ReporteColumnaDTO', null, false, data)).subscribe(data => { });
|
|
1442
|
-
});
|
|
1443
|
-
}
|
|
1444
|
-
verGrafico() {
|
|
1445
|
-
this.reporteService.verGrafico({ llaveReporte: this.reporteFuente.llave }).subscribe(data => {
|
|
1446
|
-
let columna = this.dashboardService.cargarGrafica({ accion: data.tipoGrafico, datosGrafica: data });
|
|
1447
|
-
this.grafica = columna;
|
|
1448
|
-
let respuesta = this.dashboardPipe.TIPO_GRAFICO_CHART.filter(data => data.codigo == columna.datosGrafica.tipoGrafico);
|
|
1449
|
-
if (respuesta.length < 0) {
|
|
1450
|
-
return;
|
|
1451
|
-
}
|
|
1452
|
-
columna.tipoGrafico = respuesta[0].codigoChart;
|
|
1453
|
-
this.tipoGrafica = columna.tipoGrafico;
|
|
1454
|
-
console.log(this.tipoGrafica);
|
|
1455
|
-
});
|
|
1456
|
-
}
|
|
1457
|
-
nuevoColorCategoria() {
|
|
1458
|
-
this.colorCategoria = new ReporteBandaModel();
|
|
1459
|
-
this.verColorCategoriaDetalle = true;
|
|
1460
|
-
this.habilitaCampo = true;
|
|
1461
|
-
}
|
|
1462
|
-
cancelarColorCategoria() {
|
|
1463
|
-
this.colorCategoria = new ReporteBandaModel();
|
|
1464
|
-
this.verColorCategoriaDetalle = false;
|
|
1465
|
-
this.habilitaCampo = false;
|
|
1466
|
-
}
|
|
1467
|
-
validarColorCategoria(color) {
|
|
1468
|
-
var validador = true;
|
|
1469
|
-
validador = validador && this.utilsService.validarCampoObligatorio(color.titulo);
|
|
1470
|
-
validador = validador && this.utilsService.validarCampoObligatorio(color.banda);
|
|
1471
|
-
return validador;
|
|
1472
|
-
}
|
|
1473
|
-
agregarColorCategoria(color) {
|
|
1474
|
-
this.clickGuardarColorCategoria = true;
|
|
1475
|
-
if (!this.validarColorCategoria(color)) {
|
|
1476
|
-
this.notificacionesBusService.showError('Faltan campos obligatorios');
|
|
1477
|
-
return;
|
|
1478
|
-
}
|
|
1479
|
-
if (!color.llaveTabla) {
|
|
1480
|
-
color.totales = 'C';
|
|
1481
|
-
color.reporteFuente = this.reporteFuente.llave;
|
|
1482
|
-
this.generalService.crearRegistro(new GeneralModel('ReporteBandaDTO', null, false, color)).subscribe(data => {
|
|
1483
|
-
this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_GUARDAR);
|
|
1484
|
-
color = new ReporteBandaModel();
|
|
1485
|
-
this.cargarGraficasColumnas();
|
|
1486
|
-
this.verColorCategoriaDetalle = false;
|
|
1487
|
-
this.clickGuardarColorCategoria = false;
|
|
1488
|
-
});
|
|
1489
|
-
}
|
|
1490
|
-
else {
|
|
1491
|
-
this.generalService.update(new GeneralModel('ReporteBandaDTO', null, false, color)).subscribe(data => {
|
|
1492
|
-
this.notificacionesBusService.showSuccess(this.generalPipe.MENSAJE_ACTUALIZAR);
|
|
1493
|
-
this.cargarGraficasColumnas();
|
|
1494
|
-
this.verColorCategoriaDetalle = false;
|
|
1495
|
-
this.clickGuardarColorCategoria = false;
|
|
1496
|
-
color = new ReporteBandaModel();
|
|
1497
|
-
});
|
|
1498
|
-
}
|
|
1499
|
-
this.habilitaCampo = false;
|
|
1500
|
-
}
|
|
1501
|
-
eliminarColorCategoria(event, color) {
|
|
1502
|
-
this.habilitaCampo = true;
|
|
1503
|
-
this.confirmationService.confirm({
|
|
1504
|
-
target: event.target,
|
|
1505
|
-
message: this.generalPipe.MENSAJE_ELIMINAR_CONFIRMAR,
|
|
1506
|
-
acceptLabel: this.generalPipe.SI_DESC,
|
|
1507
|
-
header: this.translateService.instant('confirmar'),
|
|
1508
|
-
accept: () => {
|
|
1509
|
-
this.generalService.delete(new GeneralModel('ReporteBandaDTO', null, false, color)).subscribe(data => {
|
|
1510
|
-
this.notificacionesBusService.showInfo(this.generalPipe.MENSAJE_ELIMINAR);
|
|
1511
|
-
this.cargarGraficasColumnas();
|
|
1512
|
-
this.habilitaCampo = false;
|
|
1513
|
-
});
|
|
1514
|
-
}
|
|
1515
|
-
});
|
|
1516
|
-
}
|
|
1517
|
-
async cancelarEdicionColor() {
|
|
1518
|
-
this.cargarGraficasColumnas();
|
|
1519
|
-
this.habilitaCampo = false;
|
|
1520
|
-
}
|
|
1521
|
-
isFijo() {
|
|
1522
|
-
return this.filtroOrigenFuente(this.reporteFuentePipe.FIJO);
|
|
1523
|
-
}
|
|
1524
|
-
isSql() {
|
|
1525
|
-
return this.filtroOrigenFuente(this.reporteFuentePipe.SQL);
|
|
1526
|
-
}
|
|
1527
|
-
/**
|
|
1528
|
-
* Permite conocer si se debe presentar en la interfaz los campos referentes a orden consulta
|
|
1529
|
-
* @return Si se debe mostrar se retornara true, de lo contrario false
|
|
1530
|
-
*/
|
|
1531
|
-
isMostrarOrdenConsulta() {
|
|
1532
|
-
return this.reporteColumnarioPipe.TIPO_FILA == this.columnaBasica.tipo;
|
|
1533
|
-
}
|
|
1534
|
-
isMostrarOrden() {
|
|
1535
|
-
return this.reporteColumnarioPipe.TIPO_FILA == this.columnaBasica.tipo ||
|
|
1536
|
-
this.reporteColumnarioPipe.TIPO_COLUMNA == this.columnaBasica.tipo || this.reporteColumnarioPipe.TIPO_LABEL == this.columnaBasica.tipo;
|
|
1537
|
-
}
|
|
1538
|
-
isTipoColumna() {
|
|
1539
|
-
return this.reporteColumnarioPipe.TIPO_COLUMNA == this.columnaBasica.tipo;
|
|
1540
|
-
}
|
|
1541
|
-
isTipoFila() {
|
|
1542
|
-
return this.reporteColumnarioPipe.TIPO_FILA == this.columnaBasica.tipo;
|
|
1543
|
-
}
|
|
1544
|
-
isTipoLabel() {
|
|
1545
|
-
return this.reporteColumnarioPipe.TIPO_LABEL == this.columnaBasica.tipo;
|
|
1546
|
-
}
|
|
1547
|
-
sleep(ms) {
|
|
1548
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
1549
|
-
}
|
|
1550
|
-
isFuente() {
|
|
1551
|
-
return this.filtroOrigenFuente(this.reporteFuentePipe.FUENTE);
|
|
1552
|
-
}
|
|
1553
|
-
filtroOrigenFuente(tipo) {
|
|
1554
|
-
return this.reporteFuente.origenFuente == tipo;
|
|
1555
|
-
}
|
|
1556
|
-
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 });
|
|
1557
|
-
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]=\"'recursos' | 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\"\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\" \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\" 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\r\n icon=\"glyphicons glyphicons-pencil\"\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)=\"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\"\r\n [label]=\"soporteIngresar.archivoIndividual ? soporteIngresar.archivoIndividual: ''\" [labelarch]=\"'archivo' | translate\"\r\n [mostrarLabelInput]=\"false\" [mostraroblicargo]=\"!(!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\"\r\n [label]=\"soporte.archivoIndividual ? soporte.archivoIndividual: ''\"\r\n [mostrarLabelInput]=\"false\" [mostraroblicargo]=\"!(!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)+'*' : ('descripcion' | 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\"\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\" 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\"\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)=\"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 <p-fieldset class=\"fieldsintitulo\" *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]=\"true\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\" ></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 </p-fieldset>\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 <p-fieldset class=\"fieldsintitulo\" *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 </p-fieldset>\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-outlined background-100\" 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 p-button-raised\" 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 style=\"width: 85%\" *ngIf=\"grafica\">\r\n <p-chart [type]=\"tipoGrafica\" [data]=\"grafica.datosGrafica.data\" [options]=\"grafica.datosGrafica.options\"></p-chart>\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"] }] });
|
|
1558
|
-
}
|
|
1559
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: DetalleTipoReporteComponent, decorators: [{
|
|
1560
|
-
type: Component,
|
|
1561
|
-
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]=\"'recursos' | 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\"\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\" \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\" 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\r\n icon=\"glyphicons glyphicons-pencil\"\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)=\"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\"\r\n [label]=\"soporteIngresar.archivoIndividual ? soporteIngresar.archivoIndividual: ''\" [labelarch]=\"'archivo' | translate\"\r\n [mostrarLabelInput]=\"false\" [mostraroblicargo]=\"!(!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\"\r\n [label]=\"soporte.archivoIndividual ? soporte.archivoIndividual: ''\"\r\n [mostrarLabelInput]=\"false\" [mostraroblicargo]=\"!(!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)+'*' : ('descripcion' | 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\"\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\" 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\"\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)=\"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 <p-fieldset class=\"fieldsintitulo\" *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]=\"true\" appendTo=\"body\"\r\n [(ngModel)]=\"columnaBasica.orderBy\" optionLabel=\"nombre\" optionValue=\"codigo\" ></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 </p-fieldset>\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 <p-fieldset class=\"fieldsintitulo\" *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 </p-fieldset>\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-outlined background-100\" 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 p-button-raised\" 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 style=\"width: 85%\" *ngIf=\"grafica\">\r\n <p-chart [type]=\"tipoGrafica\" [data]=\"grafica.datosGrafica.data\" [options]=\"grafica.datosGrafica.options\"></p-chart>\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"] }]
|
|
1562
|
-
}], 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: [{
|
|
1563
|
-
type: Input
|
|
1564
|
-
}], aplicacion: [{
|
|
1565
|
-
type: Input
|
|
1566
|
-
}], listaFuentes: [{
|
|
1567
|
-
type: Input
|
|
1568
|
-
}] } });
|
|
1569
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC93ZWJjb21tb24vcGFnZXMvZWplY3VjaW9uLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC93ZWJjb21tb24vcGFnZXMvZWplY3VjaW9uLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUvZGV0YWxsZS10aXBvLXJlcG9ydGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFlLFdBQVcsRUFBYSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHbkgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRzFFLE9BQU8sRUFBdUIsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxlQUFlLEVBQW9CLE1BQU0scUJBQXFCLENBQUM7QUFFeEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDbkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDckYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDekYsT0FBTyxFQUFFLGtCQUFr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QUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLFFBQVEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwRixLQUFLLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7WUFDbEQsTUFBTSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO1lBQ3BELGFBQWEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQztZQUNsRSxjQUFjLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUM7WUFDcEUsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDO1lBQ3RELEtBQUssRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztZQUNsRCxJQUFJLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7WUFDaEQsTUFBTSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO1lBQ3BELE1BQU0sRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztZQUNwRCxNQUFNLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7WUFDcEQsVUFBVSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDO1lBQzVELFFBQVEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQztZQUN4RCxLQUFLLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGVB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YyxDQUFDO3VpQkFpSWIsWUFBWTtzQkFBM0IsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLO2dCQUNXLFlBQVk7c0JBQTVCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEdlbmVyYWxQaXBlIH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvZ2VuZXJhbC5waXBlJztcclxuaW1wb3J0IHsgR2VuZXJhbFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvc2VydmljaW9zL2dlbmVyYWwuc2VydmljZSc7XHJcbmltcG9ydCB7IEdlbmVyYWxNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL0dlbmVyYWxNb2RlbCc7XHJcbmltcG9ydCB7IENhcmdhckFyY2hpdm9zU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNpb3MvY2FyZ2FyLWFyY2hpdm9zLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbmNyaXB0YWRvQmFzaWNvU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNpb3MvZW5jcmlwdGFkby1iYXNpY28uc2VydmljZSc7XHJcbmltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UsIE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IFJlcG9ydGVGdWVudGVQaXBlIH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvcmVwb3J0ZS1mdWVudGUucGlwZSc7XHJcbmltcG9ydCB7IEVqZWN1Y2lvblJlcG9ydGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZWplY3VjaW9ucmVwb3J0ZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IEZ1ZW50ZVBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9mdWVudGUucGlwZSc7XHJcbmltcG9ydCB7IFJlcG9ydGVDb2x1bW5hcmlvUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGVzL3JlcG9ydGUtY29sdW1uYXJpby5waXBlJztcclxuaW1wb3J0IHsgUmVwb3J0ZUNvbHVtbmFNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVDb2x1bW5hJztcclxuaW1wb3J0IHsgUmVwb3J0ZU1hcmNhZG9yTW9kZWwgfSBmcm9tICcuLi8uLi8uLi8uLi9zZWd1cmlkYWQvbW9kZWxvcy9SZXBvcnRlTWFyY2Fkb3InO1xyXG5pbXBvcnQgeyBSZXBvcnRlVGFibGFNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVUYWJsYSc7XHJcbmltcG9ydCB7IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwgfSBmcm9tICcuLi8uLi8uLi8uLi9zZWd1cmlkYWQvbW9kZWxvcy9SZXBvcnRlQ29sdW1uYXJpbyc7XHJcbmltcG9ydCB7IFJlcG9ydGVGdWVudGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVGdWVudGVNb2RlbCc7XHJcbmltcG9ydCB7IFJlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3InO1xyXG5pbXBvcnQgeyBSZXBvcnRlQmFuZGFNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1JlcG9ydGVCYW5kYSc7XHJcbmltcG9ydCB7IFJlcG9ydGVTb3BvcnRlTW9kZWwgfSBmcm9tICcuLi8uLi8uLi8uLi9zZWd1cmlkYWQvbW9kZWxvcy9SZXBvcnRlU29wb3J0ZSc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc2VydmljaW9zL3RvYXN0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVdGlsc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2lvcy91dGlscy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2lvcy9hdXRoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUYWJsZU1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xyXG5pbXBvcnQgeyBUYWJWaWV3TW9kdWxlIH0gZnJvbSAncHJpbWVuZy90YWJ2aWV3JztcclxuaW1wb3J0IHsgSW5wdXRIZWxwZXJTZWxlY2Npb25QbGFudGlsbGFDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvY29tcG9uZW50ZXMvaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGEvaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGEuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRHJvcGRvd25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2Ryb3Bkb3duJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xyXG5pbXBvcnQgeyBQaWNrTGlzdE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvcGlja2xpc3QnO1xyXG5pbXBvcnQgeyBGaWVsZHNldE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZmllbGRzZXQnO1xyXG5pbXBvcnQgeyBBY2NvcmRpb25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2FjY29yZGlvbic7XHJcbmltcG9ydCB7IElucHV0VGV4dE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0JztcclxuaW1wb3J0IHsgSW5wdXRUZXh0YXJlYU1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0YXJlYSc7XHJcbmltcG9ydCB7IEZsb2F0TGFiZWxNb2R1bGUgfSBmcm9tICdwcmltZW5nL2Zsb2F0bGFiZWwnO1xyXG5pbXBvcnQgeyBJbnB1dE51bWJlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXRudW1iZXInO1xyXG5pbXBvcnQgeyBEYXNoYm9hcmRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZGFzaGJvYXJkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDaGFydE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvY2hhcnQnO1xyXG5pbXBvcnQgeyBEYXNoYm9hcmRQaXBlIH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvZGFzaGJvYXJkLnBpcGUnO1xyXG5pbXBvcnQgeyBDb2xvclBpY2tlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvY29sb3JwaWNrZXInO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkZXRhbGxlLXRpcG8tcmVwb3J0ZScsXHJcbiAgICBpbXBvcnRzOiBbVHJhbnNsYXRlTW9kdWxlLCBUYWJsZU1vZHVsZSwgVGFiVmlld01vZHVsZSwgSW5wdXRIZWxwZXJTZWxlY2Npb25QbGFudGlsbGFDb21wb25lbnQsIFJlcG9ydGVDb2x1bW5hcmlvUGlwZSwgUmVwb3J0ZUZ1ZW50ZVBpcGUsIERyb3Bkb3duTW9kdWxlLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgQ29tbW9uTW9kdWxlLCBCdXR0b25Nb2R1bGUsIFBpY2tMaXN0TW9kdWxlLCBGaWVsZHNldE1vZHVsZSwgQWNjb3JkaW9uTW9kdWxlLCBJbnB1dFRleHRNb2R1bGUsIElucHV0VGV4dGFyZWFNb2R1bGUsIEZsb2F0TGFiZWxNb2R1bGUsIElucHV0TnVtYmVyTW9kdWxlLCBGaWVsZHNldE1vZHVsZSwgQ2hhcnRNb2R1bGUsIENvbG9yUGlja2VyTW9kdWxlXSwgXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgcHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2VdLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RldGFsbGUtdGlwby1yZXBvcnRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kZXRhbGxlLXRpcG8tcmVwb3J0ZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEZXRhbGxlVGlwb1JlcG9ydGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIHB1YmxpYyBsaXN0YVRpcG9DaWZyYWRvOiBhbnlbXSA9IFtdO1xyXG4gIC8vdGFiIGV4Y2VsXHJcbiAgcHVibGljIGxpc3RhRXhjZWw6IFJlcG9ydGVDb2x1bW5hTW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyBsaXN0YU5vRXhjZWw6IFJlcG9ydGVDb2x1bW5hTW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyBsaXN0YU1hcmNhZG9yRXhjZWw6IFJlcG9ydGVNYXJjYWRvck1vZGVsW10gPSBbXTtcclxuICBwdWJsaWMgcmVwb3J0ZU1hcmNhZG9yRXhjZWw6IFJlcG9ydGVNYXJjYWRvck1vZGVsID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsO1xyXG4gIHB1YmxpYyBmb3JtTWFyY2Fkb3JFeGNlbDogRm9ybUdyb3VwO1xyXG4gIHB1YmxpYyB2ZXJOdWV2b01hcmNhZG9yRXhjZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZXNNYXJjYWRvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBlc0ltYWdlbkZpamE6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy90YWIgcGxhbnRpbGxhc1xyXG4gIHB1YmxpYyBsaXN0YUNvbHVtbmFzOiBhbnlbXSA9IFtdO1xyXG4gIHB1YmxpYyBsaXN0YU1hcmNhZG9yZXM6IFJlcG9ydGVNYXJjYWRvck1vZGVsW10gPSBbXTtcclxuICBwdWJsaWMgbGlzdGFUaXBvTWFyY2Fkb3I7XHJcbiAgcHVibGljIGxpc3RhVGlwb0dyYWZpY29fSkZDO1xyXG4gIHB1YmxpYyBsaXN0YUdyYWZpY287XHJcbiAgcHVibGljIGxpc3RhR3JhZmljb1NlbmNpbGxvO1xyXG4gIHB1YmxpYyBsaXN0YUFsaW5lYWNpb247XHJcbiAgcHVibGljIGxpc3RhT3BlcmFjaW9uZXM7XHJcbiAgcHVibGljIHJlcG9ydGVNYXJjYWRvcjogUmVwb3J0ZU1hcmNhZG9yTW9kZWwgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWw7XHJcbiAgcHVibGljIGZvcm1NYXJjYWRvcjogRm9ybUdyb3VwO1xyXG4gIHB1YmxpYyBvcmlnZW5NYXJjYWRvcjogc3RyaW5nID0gbnVsbDtcclxuICBwdWJsaWMgdmVyTnVldm9NYXJjYWRvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBsaXN0YUNhbXBvc01hcmNhZG9yOiBSZXBvcnRlVGFibGFNb2RlbFtdID0gW107XHJcbiAgcHVibGljIGNhbXBvTWFyY2Fkb3JJbnNlcnRhcjogUmVwb3J0ZVRhYmxhTW9kZWwgPSBuZXcgUmVwb3J0ZVRhYmxhTW9kZWw7XHJcbiAgcHVibGljIGxpc3RhU29wb3J0ZXM6IFJlcG9ydGVTb3BvcnRlTW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyBzb3BvcnRlSW5ncmVzYXI6IFJlcG9ydGVTb3BvcnRlTW9kZWwgPSBuZXcgUmVwb3J0ZVNvcG9ydGVNb2RlbDtcclxuICBwdWJsaWMgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wbzogYm9vbGVhbiA9IGZhbHNlXHJcbiAgcHVibGljIGNsaWNrR3VhcmRhck1hcmNhZG9yRXhjZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgdmVyUmVwb3J0ZU1hcmNhZG9yRGV0YWxsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyB2ZXJTb3BvcnRlQXJjaGl2b0RldGFsbGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgY2xpY2tHdWFyZGFyU29wb3J0ZUFyY2hpdm86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgaGFiaWxpdGFDYW1wbzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvL3JlcG9ydGUgZGluYW1pY29cclxuICBwdWJsaWMgbGlzdGFUaXBvQmFuZGEgPSBbXHJcbiAgICB7a2V5OiAnYmFuZGExJywgdmFsdWU6ICdCYW5kYSAxJ30sXHJcbiAgICB7a2V5OiAnYmFuZGEyJywgdmFsdWU6ICdCYW5kYSAyJ30sXHJcbiAgICB7a2V5OiAnYmFuZGEzJywgdmFsdWU6ICdCYW5kYSAzJ30sXHJcbiAgICB7a2V5OiAnYmFuZGE0JywgdmFsdWU6ICdCYW5kYSA0J30sXHJcbiAgICB7a2V5OiAnYmFuZGE1JywgdmFsdWU6ICdCYW5kYSA1J30sXHJcbiAgICB7a2V5OiAnZGV0YWxsZScsIHZhbHVlOiAnRGV0YWxsZSd9LFxyXG4gICAge2tleTogJ3N1bW1hcnknLCB2YWx1ZTogJ1Jlc3VtZW4nfSxcclxuICBdXHJcbiAgcHVibGljIGV4aXN0ZUphc3BlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBiYW5kYVNlbGVjY2lvbmFkYSA9IHtrZXk6IG51bGwsIHZhbHVlOiBudWxsfTtcclxuICBwdWJsaWMgbnVldmFCYW5kYTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyB2ZXJUYWJCYW5kYTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBudWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHJlcG9ydGVNYXJjYWRvckRpbmFtaWNvOiBSZXBvcnRlTWFyY2Fkb3JNb2RlbCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbDtcclxuICBwdWJsaWMgcmVwb3J0ZUJhbmRhOiBSZXBvcnRlQmFuZGFNb2RlbCA9IG5ldyBSZXBvcnRlQmFuZGFNb2RlbDtcclxuICBwdWJsaWMgZm9ybVJlcG9ydGVEaW5hbWljbzogRm9ybUdyb3VwO1xyXG4gIHB1YmxpYyBsaXN0YU1hcmNhZG9yRGluYW1pY286IFJlcG9ydGVNYXJjYWRvck1vZGVsW10gPSBbXVxyXG4gIHB1YmxpYyBsaXN0YVRpcG9DYW1wb0phc3BlckRpbmFtaWNvID0gW1xyXG4gICAge2tleTogJ0MnLCB2YWx1ZTogJ0NhbGN1bG8nfSxcclxuICAgIHtrZXk6ICdUJywgdmFsdWU6ICdDb2x1bW5hJ30sXHJcbiAgXVxyXG4gIHB1YmxpYyBsaXN0YVRpcG9EYXRvU2ludGF4aXMgPSBbXHJcbiAgICB7a2V5OiAnRicsIHZhbHVlOiAnRmVjaGEnfSxcclxuICAgIHtrZXk6ICdOJywgdmFsdWU6ICdOdW1lcm8nfSxcclxuICAgIHtrZXk6ICdUJywgdmFsdWU6ICdUZXh0byd9LFxyXG4gIF1cclxuXHJcbiAgLy9yZXBvcnRlIHRhYmxhXHJcbiAgcHVibGljIGxpc3RhVGFibGE6IFJlcG9ydGVDb2x1bW5hTW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyBsaXN0YU5vVGFibGE6IFJlcG9ydGVDb2x1bW5hTW9kZWxbXSA9IFtdO1xyXG4gIFxyXG5cclxuICAvL3JlcG9ydGUgdGV4dG9cclxuICBwdWJsaWMgbGlzdGFTZXBhcmFkb3JlcztcclxuICBwdWJsaWMgY2xpY2tHdWFyZGFyUmVwb3J0ZVRleHRvOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGxpc3RhTWFyY2Fkb3Jlc1RleHRvOiBSZXBvcnRlTWFyY2Fkb3JNb2RlbFtdID0gW107XHJcbiAgcHVibGljIG1hcmNhZG9yVGV4dG86IFJlcG9ydGVNYXJjYWRvck1vZGVsID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKClcclxuICBwdWJsaWMgdmVyTnVldm9NYXJjYWRvclRleHRvOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGxpc3RhVGlwb01hcmNhZG9yVGV4dG87XHJcbiAgcHVibGljIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG86IGJvb2xlYW4gPSBmYWxzZVxyXG5cclxuICAvL3JlcG9ydGUgWE1MXHJcbiAgcHVibGljIGxpc3RhVGlwb01hcmNhZG9yWE1MO1xyXG4gIHB1YmxpYyBsaXN0YVhNTDogUmVwb3J0ZU1hcmNhZG9yTW9kZWxbXSA9IFtdXHJcbiAgcHVibGljIG1hcmNhZG9yWE1MOiBSZXBvcnRlTWFyY2Fkb3JNb2RlbCA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbFxyXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJNYXJjYWRvclhNTDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyB2ZXJOdWV2b01hcmNhZG9yWE1MOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGxpc3RhQ2FtcG9zTWFyY2Fkb3JYTUw6IFJlcG9ydGVUYWJsYU1vZGVsW10gPSBbXTtcclxuICBwdWJsaWMgY2FtcG9NYXJjYWRvckluc2VydGFyWE1MOiBSZXBvcnRlVGFibGFNb2RlbCA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbDtcclxuICBwdWJsaWMgdmVyUmVwb3J0ZU1hcmNhZG9yRGV0YWxsZVhNTDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vcmVwb3J0ZSBjb2x1bW5hcmlvXHJcbiAgcHVibGljIGxpc3RhUmVwb3J0ZUNvbHVtbmFyaW86IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyB2ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGNvbHVtbmFCYXNpY2E6IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWw7XHJcbiAgcHVibGljIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGxpc3RhVGlwb0NvbHVtbmFzO1xyXG4gIHB1YmxpYyBsaXN0YU9wZXJhY2lvbmVzQ29sdW1uYXJpbztcclxuICBwdWJsaWMgbGlzdGFPcGVyYWNpb25lc0V4Y2VsQ29sdW1uYXJpbztcclxuICBwdWJsaWMgbGlzdGFPcmRlbmFtaWVudG87XHJcblxyXG4gIHB1YmxpYyB2ZXJOdWV2b0NvbHVtbmFBZGljaW9uYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBjb2x1bW5hc0FkaWNpb25hbGVzOiBSZXBvcnRlQ29sdW1uYXJpb01vZGVsW10gPSBbXTtcclxuICBwdWJsaWMgY29sdW1uYUFkaWNpb25hbDogUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbDtcclxuXHJcbiAgcHVibGljIGxpc3RhVGlwb01hcmNhZG9yQ29sdW1uYXJpbztcclxuICBwdWJsaWMgdmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIG1hcmNhZG9yZXNDb2x1bW5hcmlvOiBSZXBvcnRlQ29sdW1uYXJpb01hcmNhZG9yTW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyBtYXJjYWRvckNvbHVtbmFyaW86IFJlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JNb2RlbDtcclxuXHJcbiAgLy9ncmFmaWNhXHJcbiAgcHVibGljIGxpc3RhVGlwb0dyYWZpY287XHJcbiAgcHVibGljIHBhZ2luYWRvckNvbHVtbmFzOiBSZXBvcnRlQ29sdW1uYU1vZGVsW10gPSBbXTtcclxuICBwdWJsaWMgcGFnaW5hZG9yQ29sb3Jlc0dyYWZpY2E6IFJlcG9ydGVCYW5kYU1vZGVsW10gPSBbXTtcclxuICBwdWJsaWMgY29sb3JDYXRlZ29yaWE6IFJlcG9ydGVCYW5kYU1vZGVsID0gbmV3IFJlcG9ydGVCYW5kYU1vZGVsKCk7XHJcbiAgcHVibGljIHZlckNvbG9yQ2F0ZWdvcmlhRGV0YWxsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBjbGlja0d1YXJkYXJDb2xvckNhdGVnb3JpYTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBncmFmaWNhO1xyXG4gIHB1YmxpYyB0aXBvR3JhZmljYTogXCJiYXJcIiB8IFwibGluZVwiIHwgXCJzY2F0dGVyXCIgfCBcImJ1YmJsZVwiIHwgXCJwaWVcIiB8IFwiZG91Z2hudXRcIiB8IFwicG9sYXJBcmVhXCIgfCBcInJhZGFyXCI7XHJcblxyXG4gIHB1YmxpYyByZXBvcnRlRnVlbnRlIDogUmVwb3J0ZUZ1ZW50ZU1vZGVsID0gbmV3ICBSZXBvcnRlRnVlbnRlTW9kZWwoKTtcclxuICBwdWJsaWMgbGxhdmVFbXByZXNhOiBzdHJpbmc7XHJcbiAgcHVibGljIGxpc3RhU2lObztcclxuICBASW5wdXQoKSBwdWJsaWMgbGxhdmVSZXBvcnRlIDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBhcGxpY2FjaW9uIDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpICBwdWJsaWMgbGlzdGFGdWVudGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBfc3Vic2NpcHJ0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIG5vdGlmaWNhY2lvbmVzQnVzU2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnZW5lcmFsU2VydmljZTogR2VuZXJhbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdlbmVyYWxQaXBlOiBHZW5lcmFsUGlwZSxcclxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZXBvcnRlRnVlbnRlUGlwZTogUmVwb3J0ZUZ1ZW50ZVBpcGUsXHJcbiAgICBwcml2YXRlIGNvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNhcmdhckFyY2hpdm86IENhcmdhckFyY2hpdm9zU2VydmljZSxcclxuICAgIHByaXZhdGUgZW5jcmlwdGFkb3JBcmNoaXZvOiBFbmNyaXB0YWRvQmFzaWNvU2VydmljZSxcclxuICAgIHB1YmxpYyB1dGlsc1NlcnZpY2U6IFV0aWxzU2VydmljZSxcclxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgZnVlbnRlUGlwZTogRnVlbnRlUGlwZSxcclxuICAgIHByaXZhdGUgcmVwb3J0ZUNvbHVtbmFyaW9QaXBlOiBSZXBvcnRlQ29sdW1uYXJpb1BpcGUsXHJcbiAgICBwcml2YXRlIHJlcG9ydGVTZXJ2aWNlOiBFamVjdWNpb25SZXBvcnRlU2VydmljZSxcclxuICAgIHByaXZhdGUgZGFzaGJvYXJkU2VydmljZTogRGFzaGJvYXJkU2VydmljZSxcclxuICAgIHByaXZhdGUgZGFzaGJvYXJkUGlwZTogRGFzaGJvYXJkUGlwZSwpIHtcclxuICAgIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFwbGljYWNpb24gPSB0aGlzLmF1dGhTZXJ2aWNlLmdldFRva2VuS2V5KCdhcGxpY2FjaW9uJylcclxuICAgIHRoaXMubGxhdmVFbXByZXNhID0gdGhpcy5hdXRoU2VydmljZS5nZXRUb2tlbktleSgnbGxhdmVFbXByZXNhJyk7XHJcbiAgICB0aGlzLmxpc3RhU2lObyA9IHRoaXMuZ2VuZXJhbFBpcGUuTElTVEFfU0lOTztcclxuICAgIHRoaXMubGlzdGFUaXBvTWFyY2Fkb3JDb2x1bW5hcmlvID0gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuTUFQQV9USVBPX01BUkNBRE9SO1xyXG4gICAgdGhpcy5saXN0YVRpcG9Db2x1bW5hcyA9IHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLk1BUEFfVElQT19DT0xVTU5BUztcclxuICAgIHRoaXMubGlzdGFPcGVyYWNpb25lc0NvbHVtbmFyaW8gPSB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5NQVBBX09QRVJBQ0lPTkVTX0NPTFVNTkFSSU87XHJcbiAgICB0aGlzLmxpc3RhT3BlcmFjaW9uZXNFeGNlbENvbHVtbmFyaW8gPSB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5NQVBBX09QRVJBQ0lPTkVTX0NPTFVNTkFSSU9fRVhDRUw7XHJcbiAgICB0aGlzLmxpc3RhT3JkZW5hbWllbnRvID0gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuTUFQQV9PUkRFTkFNSUVOVE87XHJcbiAgICB0aGlzLmxpc3RhU2VwYXJhZG9yZXMgPSAgdGhpcy5mdWVudGVQaXBlLkxJU1RBX1NFUEFSQURPUkVTO1xyXG4gICAgdGhpcy5saXN0YVRpcG9NYXJjYWRvciA9IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuTElTVEFfTUFSQ0FET1JFUztcclxuICAgIHRoaXMubGlzdGFUaXBvR3JhZmljb19KRkMgPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLkxJU1RBX1RJUE9fR1JBRklDT19KRkM7XHJcbiAgICB0aGlzLmxpc3RhR3JhZmljbyA9IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuTElTVEFfUkVDVVJTT19HUkFGSUNBO1xyXG4gICAgdGhpcy5saXN0YUdyYWZpY29TZW5jaWxsbyA9IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuUkVDVVJTT19HUkFGSUNBO1xyXG4gICAgdGhpcy5saXN0YUFsaW5lYWNpb24gPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLkxJU1RBX0FMSU5FQUNJT047XHJcbiAgICB0aGlzLmxpc3RhT3BlcmFjaW9uZXMgPSB0aGlzLmdlbmVyYWxQaXBlLk1BUEFPUEVSQUNJT05FUztcclxuICAgIHRoaXMubGlzdGFUaXBvTWFyY2Fkb3JUZXh0byA9IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuVElQT01BUkNBRE9SRVNURVhUTztcclxuICAgIHRoaXMubGlzdGFUaXBvTWFyY2Fkb3JYTUwgPSB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLkxJU1RBX01BUkNBRE9SRVNfWE1MO1xyXG4gICAgdGhpcy5saXN0YVRpcG9HcmFmaWNvID0gdGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5MSVNUQV9USVBPX0dSQUZJQ087XHJcbiAgICB0aGlzLmNhcmdhcigpO1xyXG4gICAgdGhpcy5jYXJnYXJGb3JtTWFyY2Fkb3JFeGNlbCgpO1xyXG4gICAgdGhpcy5jYXJnYXJGb3JtTWFyY2Fkb3IoKTtcclxuICAgIHRoaXMuY2FyZ2FyRm9ybURpbmFtaWNvKCk7XHJcbiAgICB0aGlzLmFncmVnYXJTdWJzY3JpcGNpb25lcygpO1xyXG4gICAgLy90aGlzLmNhcmdhckxpc3RhcygpO1xyXG5cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCl7XHJcbiAgICB0aGlzLl9zdWJzY2lwcnRpb25zLmZvckVhY2goKHN1YikgPT4ge1xyXG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWdyZWdhclN1YnNjcmlwY2lvbmVzKCkge1xyXG4gICAgdGhpcy5fc3Vic2NpcHJ0aW9ucy5wdXNoKFxyXG4gICAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgndGlwbycpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdGV4dG9SZWdpc3Ryb0NvbnRyb2wgPSB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgndGV4dG9SZWdpc3RybycpO1xyXG4gICAgICAgIGNvbnN0IG9yaWdlbkNvbnRyb2wgPSB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgnb3JpZ2VuJyk7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSl7XHJcbiAgICAgICAgICB0aGlzLmVzSW1hZ2VuRmlqYSA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmVzTWFyY2Fkb3IgPSB0cnVlO1xyXG4gICAgICAgICAgb3JpZ2VuQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgIHRleHRvUmVnaXN0cm9Db250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoWydNQSddLmluY2x1ZGVzKHZhbHVlKSkge1xyXG4gICAgICAgICAgdGhpcy5lc0ltYWdlbkZpamEgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuZXNNYXJjYWRvciA9IHRydWU7XHJcbiAgICAgICAgICB0ZXh0b1JlZ2lzdHJvQ29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgb3JpZ2VuQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKFsnSUYnXS5pbmNsdWRlcyh2YWx1ZSkpIHtcclxuICAgICAgICAgIHRoaXMuZXNJbWFnZW5GaWphID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuZXNNYXJjYWRvciA9IGZhbHNlO1xyXG4gICAgICAgICAgb3JpZ2VuQ29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgdGV4dG9SZWdpc3Ryb0NvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGV4dG9SZWdpc3Ryb0NvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIG9yaWdlbkNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLl9zdWJzY2lwcnRpb25zLnB1c2goXHJcbiAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmdldCgndGlwbycpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2VudHJhIGEgdGlwbzogJylcclxuICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZSlcclxuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvci50aXBvID0gdmFsdWU7XHJcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpcG8gPT0gdGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5NQVJDQURPUlRBQkxBKXtcclxuICAgICAgICAgLy8gdGhpcy5yZXBvcnRlTWFyY2Fkb3IudGllbmVTcWwgPSAnTidcclxuICAgICAgICAgLy8gdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCd0aWVuZVNxbCcpLnNldFZhbHVlKCdOJylcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLl9zdWJzY2lwcnRpb25zLnB1c2goXHJcbiAgICAgIHRoaXMuZm9ybU1hcmNhZG9yLmdldCgnb3JpZ2VuJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvci5vcmlnZW4gPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuX3N1YnNjaXBydGlvbnMucHVzaChcclxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCd0aWVuZVNxbCcpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2VudHJhIGEgdGllbmVTcWw6ICcpXHJcbiAgICAgICAgY29uc29sZS5sb2codmFsdWUpXHJcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IudGllbmVTcWwgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuX3N1YnNjaXBydGlvbnMucHVzaChcclxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCd0aXBvR3JhZmljbycpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IudGlwb0dyYWZpY28gPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuX3N1YnNjaXBydGlvbnMucHVzaChcclxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoJ29yaWdlbicpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgaWYgKFsnVSddLmluY2x1ZGVzKHZhbHVlKSkge1xyXG4gICAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbC5vcmlnZW4gPSAnVSdcclxuICAgICAgICB9IGVsc2UgaWYgKFsnQyddLmluY2x1ZGVzKHZhbHVlKSkge1xyXG4gICAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbC5vcmlnZW4gPSAnQycgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5fc3Vic2NpcHJ0aW9ucy5wdXNoKFxyXG4gICAgICB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uZ2V0KCd0aXBvQ2FtcG8nKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvID0gdmFsdWU7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0YWRvWENvbnRyb2wgPSB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uZ2V0KCdyZXN1bHRhZG9YJyk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0YWRvWUNvbnRyb2wgPSB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uZ2V0KCdyZXN1bHRhZG9ZJyk7ICBcclxuICAgICAgICBpZiAodGhpcy5iYW5kYVNlbGVjY2lvbmFkYS5rZXkgIT0gJ2RldGFsbGUnKSB7XHJcbiAgICAgICAgICByZXN1bHRhZG9YQ29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgcmVzdWx0YWRvWUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0YWRvWENvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICByZXN1bHRhZG9ZQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICB9IFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IG1hcmNhZG9yQ29udHJvbCA9IHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoJ21hcmNhZG9yJyk7XHJcbiAgICAgICAgY29uc3QgZmlsdHJvQ29udHJvbCA9IHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoJ2ZpbHRybycpO1xyXG4gICAgICAgIGNvbnN0IHRpcG9EYXRvQ29udHJvbCA9IHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoJ3RpcG9EYXRvJyk7XHJcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvID09ICdUJykge1xyXG4gICAgICAgICAgbWFyY2Fkb3JDb250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICBmaWx0cm9Db250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgdGlwb0RhdG9Db250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBtYXJjYWRvckNvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICBmaWx0cm9Db250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICB0aXBvRGF0b0NvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWFyY2Fkb3JDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICBmaWx0cm9Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB0aXBvRGF0b0NvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICByZXN1bHRhZG9YQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgIHJlc3VsdGFkb1lDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoJ3RpcG9EYXRvJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9EYXRvID0gdmFsdWVcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBjYW1iaWFyVGFiKGV2ZW50KXtcclxuICAgIHN3aXRjaCAoZXZlbnQuaW5kZXgpIHtcclxuICAgICAgY2FzZSAwOlxyXG4gICAgICAgIHRoaXMuY2FyZ2FyKCk7XHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YXNFeGNlbCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yZXMoKTtcclxuICAgICAgICBpZiAodGhpcy5yZXBvcnRlRnVlbnRlLnVuaWNvQXJjaGl2byA9PSAnTicpe1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVNvcG9ydGVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgdGhpcy52YWxpZGFyRXhpc3RlSmFzcGVyKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMzpcclxuICAgICAgICB0aGlzLmNhcmdhckxpc3RhTWFyY2Fkb3Jlc1RleHRvKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgNDpcclxuICAgICAgICB0aGlzLmNhcmdhckxpc3Rhc1RhYmxhKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgNTpcclxuICAgICAgICB0aGlzLmNhcmdhckxpc3RhWE1MKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgNjpcclxuICAgICAgICB0aGlzLmNhcmdhclJlcG9ydGVDb2x1bW5hcmlvKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgNzpcclxuICAgICAgICB0aGlzLmNhcmdhckdyYWZpY2FzQ29sdW1uYXMoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhcmdhckxpc3Rhc1RhYmxhKCl7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYURUTycsIG51bGwsIGZhbHNlLCB7YnVzY2FyT3JkZW5UYWJsYTogJ1MnLCBvcmRlbmFyVGFibGE6ICdTJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YVRhYmxhID0gZGF0YTtcclxuICAgIH0pXHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYURUTycsIG51bGwsIGZhbHNlLCB7YnVzY2FyT3JkZW5UYWJsYTogJ04nLCByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmV9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RhTm9UYWJsYSA9IGRhdGE7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgY2FyZ2FyTGlzdGFNYXJjYWRvcmVzKCl7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge3RpcG9SZXBvcnRlOiAnUCcsIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgb3JkZW5EaW5hbWljbzogdGhpcy5nZW5lcmFsUGlwZS5TSX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFNYXJjYWRvcmVzID0gZGF0YTtcclxuICAgIH0pICAgIFxyXG4gIH1cclxuXHJcbiAgY2FyZ2FyTGlzdGFzRXhjZWwoKXtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hRFRPJywgbnVsbCwgZmFsc2UsIHtvcmRlbkV4Y2VsOiAnUycsIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFFeGNlbCA9IGRhdGE7XHJcbiAgICB9KVxyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFEVE8nLCBudWxsLCBmYWxzZSwge29yZGVuRXhjZWw6ICdOJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YU5vRXhjZWwgPSBkYXRhO1xyXG4gICAgfSlcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB7dGlwb1JlcG9ydGU6ICdFJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCBvcmRlbkRpbmFtaWNvOiB0aGlzLmdlbmVyYWxQaXBlLlNJfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YU1hcmNhZG9yRXhjZWwgPSBkYXRhO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNhcmdhckxpc3RhQ29sdW1uYXMoKXtcclxuICAgIHRoaXMubGlzdGFDb2x1bW5hcyA9IFtdO1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFEVE8nLCBudWxsLCBmYWxzZSwge3JlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFDb2x1bW5hcyA9IGRhdGE7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgY2FyZ2FyTGlzdGFzKCl7XHJcbiAgICB0aGlzLmxpc3RhVGlwb0NpZnJhZG8gPSBbXTtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ0VuY3JpcGNpb25BcmNoaXZvRFRPJywgbnVsbCwgZmFsc2UsIHt9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RhVGlwb0NpZnJhZG8gPSBkYXRhO1xyXG4gICAgfSlcclxuICAgIHRoaXMuY2FyZ2FyTGlzdGFDb2x1bW5hcygpO1xyXG4gIH1cclxuXHJcbiAgY2FyZ2FyRm9ybU1hcmNhZG9yRXhjZWwoKXtcclxuICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgZGVzY3JpcGNpb246IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsLmRlc2NyaXBjaW9uLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTAwKV0pLFxyXG4gICAgICBtYXJjYWRvcjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwubWFyY2Fkb3IsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCg1MCldKSxcclxuICAgICAgdGlwbzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwudGlwbywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcclxuICAgICAgdGV4dG9SZWdpc3RybzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwudGV4dG9SZWdpc3RybyksXHJcbiAgICAgIG9yaWdlbjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwub3JpZ2VuKSxcclxuICAgICAgLy9jYW1wb3MgYmRcclxuICAgICAgbGxhdmU6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsLmxsYXZlKSxcclxuICAgICAgcmVwb3J0ZUZ1ZW50ZTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSksXHJcbiAgICAgIHRpcG9SZXBvcnRlOiBuZXcgRm9ybUNvbnRyb2woJ0UnKSBcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBjYXJnYXJGb3JtTWFyY2Fkb3IoKXtcclxuICAgIHRoaXMuZm9ybU1hcmNhZG9yID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIGRlc2NyaXBjaW9uOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuZGVzY3JpcGNpb24sIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxMDApXSksXHJcbiAgICAgIHRpcG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci50aXBvLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxyXG4gICAgICBtYXJjYWRvcjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLm1hcmNhZG9yLCBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTApXSksXHJcbiAgICAgIHRhYmxhOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGFibGEpLFxyXG4gICAgICBvcmlnZW46IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5vcmlnZW4pLFxyXG4gICAgICB0ZXh0b1JlZ2lzdHJvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGV4dG9SZWdpc3RybyksXHJcbiAgICAgIHJlcG9ydGVDb2x1bW5hOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IucmVwb3J0ZUNvbHVtbmEpLFxyXG4gICAgICBmb3JtYXRvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuZm9ybWF0byksXHJcbiAgICAgIGFuY2hvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuYW5jaG8pLFxyXG4gICAgICBhbHRvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuYWx0byksXHJcbiAgICAgIGdydXBvMTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmdydXBvMSksXHJcbiAgICAgIGdydXBvMjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmdydXBvMiksXHJcbiAgICAgIGdydXBvMzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmdydXBvMyksXHJcbiAgICAgIGZpbmFsR3J1cG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5maW5hbEdydXBvKSxcclxuICAgICAgdGllbmVTcWw6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci50aWVuZVNxbCksXHJcbiAgICAgIHF1ZXJ5OiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IucXVlcnkpLFxyXG4gICAgICBmdWVudGU6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvci5mdWVudGUpLFxyXG4gICAgICB0aXBvR3JhZmljbzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpcG9HcmFmaWNvKSxcclxuICAgICAgbWFyY2Fkb3JHcmFmaWNvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IubWFyY2Fkb3JHcmFmaWNvKSxcclxuICAgICAgdGl0dWxveDogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLnRpdHVsb3gpLFxyXG4gICAgICB0aXR1bG95OiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IudGl0dWxveSksXHJcbiAgICAgIGJhbmRhOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuYmFuZGEpLFxyXG4gICAgICBhbmNob0phc3BlckxhYmVsOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IuYW5jaG9KYXNwZXJMYWJlbCksXHJcbiAgICAgIGZpbHRybzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yLmZpbHRybyksXHJcbiAgICAgIC8vY2FtcG9zIGJkXHJcbiAgICAgIGxsYXZlOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3IubGxhdmUpLFxyXG4gICAgICByZXBvcnRlRnVlbnRlOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlKSxcclxuICAgICAgdGlwb1JlcG9ydGU6IG5ldyBGb3JtQ29udHJvbCgnTicpIFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNhcmdhckZvcm1EaW5hbWljbygpe1xyXG4gICAgdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIHRpcG9DYW1wbzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxyXG4gICAgICB0aXBvRGF0bzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0RhdG8pLFxyXG4gICAgICBmaWx0cm86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmZpbHRybyksXHJcbiAgICAgIG1hcmNhZG9yOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5tYXJjYWRvciksXHJcbiAgICAgIGFsdG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmFsdG8sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIGZvcm1hdG86IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmZvcm1hdG8pLFxyXG4gICAgICBkZXNjcmlwY2lvbjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uZGVzY3JpcGNpb24pLFxyXG4gICAgICBhbmNobzogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uYW5jaG8sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIGFuY2hvSmFzcGVyTGFiZWw6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmFuY2hvSmFzcGVyTGFiZWwpLFxyXG4gICAgICByZXN1bHRhZG9YOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5yZXN1bHRhZG9YICksXHJcbiAgICAgIHJlc3VsdGFkb1k6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnJlc3VsdGFkb1kgKSxcclxuICAgICAgdGl0dWxveDogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGl0dWxveCksXHJcbiAgICAgIHRpdHVsb3k6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpdHVsb3kpLFxyXG4gICAgICB0aXBvUmVwb3J0ZTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb1JlcG9ydGUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIHRpcG9HcmFmaWNvOiBuZXcgRm9ybUNvbnRyb2wodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvR3JhZmljbyksICAgICAgXHJcbiAgICAgIG9wZXJhY2lvbjogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ub3BlcmFjaW9uKSwgICAgICBcclxuICAgICAgLy9jYW1wb3MgdGFibGFcclxuICAgICAgb3JpZ2VuOiBuZXcgRm9ybUNvbnRyb2woJ0QnKSxcclxuICAgICAgYmFuZGE6IG5ldyBGb3JtQ29udHJvbCh0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLmtleSksXHJcbiAgICAgIHJlcG9ydGVGdWVudGU6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUpLFxyXG4gICAgICBsbGF2ZTogbmV3IEZvcm1Db250cm9sKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubGxhdmUpLFxyXG5cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBjYXJnYXIoKXtcclxuICAgIHRoaXMuZXhpc3RlSmFzcGVyID0gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLmxsYXZlUmVwb3J0ZSl7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvck9iamVjdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlRnVlbnRlRFRPJywgbnVsbCwgZmFsc2UsIHtsbGF2ZTogdGhpcy5sbGF2ZVJlcG9ydGV9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXBvcnRlRnVlbnRlID0gZGF0YTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFzRXhjZWwoKTtcclxuICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFzKCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFjdHVhbGl6YXIoKXtcclxuICAgIGlmICh0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUpe1xyXG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlRnVlbnRlRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMucmVwb3J0ZUZ1ZW50ZSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XHJcbiAgICAgICAgaWYgKHRoaXMucmVwb3J0ZUZ1ZW50ZS51bmljb0FyY2hpdm8gPT0gJ04nKXtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZXBvcnRlU2VydmljZS5ndWFyZGFyUmVwb3J0ZSh0aGlzLnJlcG9ydGVGdWVudGUpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICB0aGlzLnJlcG9ydGVGdWVudGUgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvYnRlbmVyQXJjaGl2byhldmVudCl7XHJcbiAgICB0aGlzLnJlcG9ydGVGdWVudGUuYXJjaGl2b1RvZG8gPSBldmVudC5kYXRhXHJcbiAgfVxyXG5cclxuICBvYnRlbmVyQXJjaGl2b01hcmNhZG9yRXhjZWwoZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IudGV4dG9SZWdpc3RybyA9IGV2ZW50LmRhdGFcclxuICB9XHJcblxyXG4gIG9idGVuZXJBcmNoaXZvTWFyY2Fkb3IoZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IudGV4dG9SZWdpc3RybyA9IGV2ZW50LmRhdGFcclxuICB9XHJcblxyXG4gIG9idGVuZXJBcmNoaXZvUGxhbmlsbGEoZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlRnVlbnRlLmFyY2hpdm9JbmRpdmlkdWFsID0gZXZlbnQuZGF0YVxyXG4gIH1cclxuXHJcbiAgb2J0ZW5lckFyY2hpdm9Tb3BvcnRlKGV2ZW50LCBzb3BvcnRlKXtcclxuICAgIHNvcG9ydGUuYXJjaGl2b0luZGl2aWR1YWwgPSBldmVudC5kYXRhXHJcbiAgfVxyXG5cclxuICBvYnRlbmVyQXJjaGl2b0NvbHVtbmFyaW8oZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlRnVlbnRlLmFyY2hpdm9FeGNlbENvbHVtbmFyaW8gPSBldmVudC5kYXRhXHJcbiAgfVxyXG5cclxuXHJcbiAgbW92ZXJBQXNvY2lhZG8oZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlU2VydmljZS5hY3R1YWxpemFyUmVwb3J0ZUNvbHVtbmFPcmRlbih7XHJcbiAgICAgIGxpc3RhQXNvY2lhZG86IHRoaXMubGlzdGFFeGNlbCxcclxuICAgICAgZXhjZWw6IHRydWVcclxuICAgIH0pLnN1YnNjcmliZShkYXRhID0+IHt0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUl9WQVJJT1MpfSlcclxuICB9XHJcblxyXG4gIG1vdmVyQURlc2Fzb2NpYWRvKGV2ZW50KXtcclxuICAgIHRoaXMucmVwb3J0ZVNlcnZpY2UuYWN0dWFsaXphclJlcG9ydGVDb2x1bW5hT3JkZW4oe1xyXG4gICAgICBsaXN0YURlc2Fzb2NpYWRvOiB0aGlzLmxpc3RhTm9FeGNlbCxcclxuICAgICAgZXhjZWw6IHRydWVcclxuICAgICB9KS5zdWJzY3JpYmUoZGF0YSA9PiB7dGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVJfVkFSSU9TKX0pXHJcbiAgfVxyXG5cclxuICBtb3ZlckFBc29jaWFkb1RhYmxhKGV2ZW50KXtcclxuICAgIHRoaXMucmVwb3J0ZVNlcnZpY2UuYWN0dWFsaXphclJlcG9ydGVDb2x1bW5hT3JkZW4oe1xyXG4gICAgICBsaXN0YUFzb2NpYWRvOiB0aGlzLmxpc3RhVGFibGEsXHJcbiAgICAgIGV4Y2VsOiBmYWxzZVxyXG4gICAgfSkuc3Vic2NyaWJlKGRhdGEgPT4ge3RoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSX1ZBUklPUyl9KVxyXG4gIH1cclxuXHJcbiAgbW92ZXJBRGVzYXNvY2lhZG9UYWJsYShldmVudCl7XHJcbiAgICB0aGlzLnJlcG9ydGVTZXJ2aWNlLmFjdHVhbGl6YXJSZXBvcnRlQ29sdW1uYU9yZGVuKHtcclxuICAgICAgbGlzdGFEZXNhc29jaWFkbzogdGhpcy5saXN0YU5vVGFibGEsXHJcbiAgICAgIGV4Y2VsOiBmYWxzZVxyXG4gICAgIH0pLnN1YnNjcmliZShkYXRhID0+IHt0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUl9WQVJJT1MpfSlcclxuICB9XHJcblxyXG4gIHJlb3JkZXJUYWJsYShldmVudCl7XHJcbiAgICB0aGlzLnJlcG9ydGVTZXJ2aWNlLmFjdHVhbGl6YXJSZXBvcnRlQ29sdW1uYU9yZGVuKHtcclxuICAgICAgbGlzdGFBc29jaWFkbzogdGhpcy5saXN0YVRhYmxhLFxyXG4gICAgICBleGNlbDogZmFsc2VcclxuICAgICB9KS5zdWJzY3JpYmUoZGF0YSA9PiB7dGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVJfVkFSSU9TKX0pXHJcbiAgfVxyXG5cclxuICB2ZXJEZXRhbGxlTWFyY2Fkb3JFeGNlbChldmVudCl7XHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnJlc2V0KCk7XHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JFeGNlbCA9IHRydWU7XHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsID0gZXZlbnQuZGF0YTtcclxuICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwucGF0Y2hWYWx1ZSh0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsKVxyXG4gIH1cclxuXHJcbiAgbnVldm9NYXJjYWRvckV4Y2VsKCl7XHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnJlc2V0KCk7XHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JFeGNlbCA9IHRydWU7XHJcbiAgICB0aGlzLmVzTWFyY2Fkb3IgPSBmYWxzZTtcclxuICAgIHRoaXMuZXNJbWFnZW5GaWphID0gZmFsc2U7XHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckV4Y2VsID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnBhdGNoVmFsdWUodGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbClcclxuICAgIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KCd0aXBvJykuc2V0VmFsdWUobnVsbClcclxuICB9XHJcblxyXG4gIGd1YXJkYXJNYXJjYWRvckV4Y2VsKCl7XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yRXhjZWwgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwudmFsaWQpe1xyXG4gICAgICBsZXQgbGxhdmVSZWdpc3RybyA9ICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgnbGxhdmUnKS52YWx1ZVxyXG4gICAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldCgncmVwb3J0ZUZ1ZW50ZScpLnNldFZhbHVlKHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSlcclxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoJ3RpcG9SZXBvcnRlJykuc2V0VmFsdWUoJ0UnKVxyXG4gICAgICBpZiAobGxhdmVSZWdpc3Rybyl7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwudmFsdWUpKS5zdWJzY3JpYmUoIGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xyXG4gICAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHt0aXBvUmVwb3J0ZTogJ0UnLCByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIG9yZGVuRGluYW1pY286IHRoaXMuZ2VuZXJhbFBpcGUuU0l9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RhTWFyY2Fkb3JFeGNlbCA9IGRhdGE7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5nZXQoJ2xsYXZlJykuc2V0VmFsdWUodGhpcy51dGlsc1NlcnZpY2UuZ2VuZXJhckxsYXZlKCkpXHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLnZhbHVlKSkuc3Vic2NyaWJlKCBkYXRhID0+IHsgIFxyXG4gICAgICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yRXhjZWwgPSBmYWxzZSAgICAgIFxyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xyXG4gICAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHt0aXBvUmVwb3J0ZTogJ0UnLCByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIG9yZGVuRGluYW1pY286IHRoaXMuZ2VuZXJhbFBpcGUuU0l9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RhTWFyY2Fkb3JFeGNlbCA9IGRhdGE7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvckV4Y2VsID0gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJylcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5jb250cm9scykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuZm9ybU1hcmNhZG9yRXhjZWwuZ2V0KGtleSkuZXJyb3JzKSB7XHJcbiAgICAgICAgICB0aGlzLmZvcm1NYXJjYWRvckV4Y2VsLmdldChrZXkpLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gXHJcbiAgfVxyXG5cclxuICBlbGltaW5hck1hcmNhZG9yRXhjZWwoZXZlbnQpe1xyXG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xyXG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcclxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXHJcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLmdlbmVyYWxQaXBlLlNJX0RFU0MsXHJcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxyXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5yZXBvcnRlTWFyY2Fkb3JFeGNlbCkpLnN1YnNjcmliZShkYXRhID0+e1xyXG4gICAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3JFeGNlbC5yZXNldCgpO1xyXG4gICAgICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yRXhjZWwgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRXhjZWwgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUilcclxuICAgICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB7dGlwb1JlcG9ydGU6ICdFJywgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCBvcmRlbkRpbmFtaWNvOiB0aGlzLmdlbmVyYWxQaXBlLlNJfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0YU1hcmNhZG9yRXhjZWwgPSBkYXRhO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgXHJcbiAgfVxyXG5cclxuICAvL3BsYW50aWxsYVxyXG5cclxuICBjYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3IoKSB7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlVGFibGFEVE8nLCBudWxsLCBmYWxzZSwgeyByZXBvcnRlTWFyY2Fkb3I6IHRoaXMucmVwb3J0ZU1hcmNhZG9yLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YUNhbXBvc01hcmNhZG9yID0gZGF0YTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBhc3luYyBjYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3JBc3luYygpIHtcclxuICAgIHRoaXMubGlzdGFDYW1wb3NNYXJjYWRvciA9IGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCB7IHJlcG9ydGVNYXJjYWRvcjogdGhpcy5yZXBvcnRlTWFyY2Fkb3IubGxhdmV9KSkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICB2ZXJEZXRhbGxlTWFyY2Fkb3IoZXZlbnQpe1xyXG4gICAgLy90aGlzLmZvcm1NYXJjYWRvci5yZXNldCgpO1xyXG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yID0gdHJ1ZTtcclxuICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yID0gZXZlbnQuZGF0YTtcclxuICAgIHRoaXMuZm9ybU1hcmNhZG9yLnBhdGNoVmFsdWUodGhpcy5yZXBvcnRlTWFyY2Fkb3IpXHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvci5nZXQoJ3RpcG8nKS5zZXRWYWx1ZSh0aGlzLnJlcG9ydGVNYXJjYWRvci50aXBvKVxyXG4gICAgXHJcbiAgICB0aGlzLmNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvcigpO1xyXG4gIH1cclxuXHJcbiAgbnVldm9NYXJjYWRvcigpe1xyXG4gICAgLy90aGlzLmZvcm1NYXJjYWRvci5yZXNldCgpO1xyXG4gICAgdGhpcy5mb3JtTWFyY2Fkb3IucmVzZXQoe30sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3IgPSB0cnVlO1xyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3IgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcclxuICAgIHRoaXMuZm9ybU1hcmNhZG9yLnBhdGNoVmFsdWUodGhpcy5yZXBvcnRlTWFyY2Fkb3IpXHJcbiAgICB0aGlzLmZvcm1NYXJjYWRvci5nZXQoJ3RpcG9SZXBvcnRlJykuc2V0VmFsdWUoJ1AnKVxyXG4gICAgLy90aGlzLmZvcm1NYXJjYWRvci5nZXQoJ3RpcG8nKS5zZXRWYWx1ZShudWxsKVxyXG4gIH1cclxuXHJcbiAgZ3VhcmRhck1hcmNhZG9yKCl7XHJcbiAgICBpZiAodGhpcy5mb3JtTWFyY2Fkb3IudmFsaWQpe1xyXG4gICAgICBsZXQgbGxhdmVSZWdpc3RybyA9ICB0aGlzLmZvcm1NYXJjYWRvci5nZXQoJ2xsYXZlJykudmFsdWVcclxuICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCdyZXBvcnRlRnVlbnRlJykuc2V0VmFsdWUodGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlKVxyXG4gICAgICAvL3RoaXMuZm9ybU1hcmNhZG9yLmdldCgndGlwb1JlcG9ydGUnKS5zZXRWYWx1ZSgnTicpXHJcbiAgICAgIGlmIChsbGF2ZVJlZ2lzdHJvKXtcclxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5mb3JtTWFyY2Fkb3IudmFsdWUpKS5zdWJzY3JpYmUoIGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yZXMoKTtcclxuICAgICAgICAgIGlmICh0aGlzLnJlcG9ydGVGdWVudGUudW5pY29BcmNoaXZvID09ICdOJyl7XHJcbiAgICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFTb3BvcnRlcygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KCdsbGF2ZScpLnNldFZhbHVlKHRoaXMudXRpbHNTZXJ2aWNlLmdlbmVyYXJMbGF2ZSgpKVxyXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5mb3JtTWFyY2Fkb3IudmFsdWUpKS5zdWJzY3JpYmUoIGRhdGEgPT4geyAgICAgICAgICBcclxuICAgICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvciA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yZXMoKTtcclxuICAgICAgICAgIGlmICh0aGlzLnJlcG9ydGVGdWVudGUudW5pY29BcmNoaXZvID09ICdOJyl7XHJcbiAgICAgICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFTb3BvcnRlcygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKVxyXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm1NYXJjYWRvci5jb250cm9scykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuZm9ybU1hcmNhZG9yLmdldChrZXkpLmVycm9ycykge1xyXG4gICAgICAgICAgdGhpcy5mb3JtTWFyY2Fkb3IuZ2V0KGtleSkubWFya0FzRGlydHkoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBcclxuICB9XHJcblxyXG4gIGVsaW1pbmFyTWFyY2Fkb3IoZXZlbnQpe1xyXG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xyXG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcclxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXHJcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLmdlbmVyYWxQaXBlLlNJX0RFU0MsXHJcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxyXG4gICAgICBhY2NlcHQ6ICgpID0+IHsgXHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMucmVwb3J0ZU1hcmNhZG9yKSkuc3Vic2NyaWJlKGRhdGEgPT57XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpXHJcbiAgICAgICAgICB0aGlzLmZvcm1NYXJjYWRvci5yZXNldCgpO1xyXG4gICAgICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvciA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbCgpO1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yZXMoKTtcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZWxpbWluYXJDYW1wb01hcmNhZG9yKGV2ZW50LCBvYmpldG8peyBcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXHJcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxyXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxyXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcclxuICAgICAgYWNjZXB0OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIG9iamV0bykpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUik7XHJcbiAgICAgICAgICB0aGlzLmNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvcigpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBudWV2b0NhbXBvVGFibGEoKXtcclxuICAgIHRoaXMudmVyUmVwb3J0ZU1hcmNhZG9yRGV0YWxsZSA9IHRydWU7XHJcbiAgICB0aGlzLmNhbXBvTWFyY2Fkb3JJbnNlcnRhciA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbCgpO1xyXG4gICAgdGhpcy5jYW1wb01hcmNhZG9ySW5zZXJ0YXIucmVwb3J0ZU1hcmNhZG9yID0gdGhpcy5yZXBvcnRlTWFyY2Fkb3IubGxhdmVcclxuICB9XHJcblxyXG4gIHZhbGlkYXJDYW1wb01hcmNhZG9yKGNhbXBvTWFyY2Fkb3Ipe1xyXG4gICAgdmFyIHZhbGlkYWRvcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvci5jb2x1bW5hKVxyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3IuY2FtcG9GdWVudGUpXHJcbiAgICByZXR1cm4gdmFsaWRhZG9yO1xyXG4gIH1cclxuXHJcbiAgYWdyZWdhckNhbXBvTWFyY2Fkb3IoY2FtcG9NYXJjYWRvcil7XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG8gPSB0cnVlO1xyXG4gICAgaWYgKCF0aGlzLnZhbGlkYXJDYW1wb01hcmNhZG9yKGNhbXBvTWFyY2Fkb3IpKXtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjYW1wb01hcmNhZG9yLnJlcG9ydGVNYXJjYWRvciA9IHRoaXMucmVwb3J0ZU1hcmNhZG9yLmxsYXZlO1xyXG4gICAgaWYgKCdJJyA9PSBjYW1wb01hcmNhZG9yLnRpcG8pe1xyXG4gICAgICBpZiAoIWNhbXBvTWFyY2Fkb3IuYW5jaG8gfHwgY2FtcG9NYXJjYWRvci5hbmNobyA9PSAwKXtcclxuICAgICAgICBjYW1wb01hcmNhZG9yLmFuY2hvID0gMTA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFjYW1wb01hcmNhZG9yLmFsdG8gfHwgY2FtcG9NYXJjYWRvci5hbHRvID09IDApe1xyXG4gICAgICAgIGNhbXBvTWFyY2Fkb3IuYWx0byA9IDEwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoWydHJ10uaW5jbHVkZXMoY2FtcG9NYXJjYWRvci50aXBvKSl7XHJcbiAgICAgIGNhbXBvTWFyY2Fkb3IuY29sdW1uYSA9IDA7XHJcbiAgICB9XHJcbiAgICBpZiAoY2FtcG9NYXJjYWRvci5sbGF2ZSl7XHJcbiAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCBjYW1wb01hcmNhZG9yKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dTdWNjZXNzKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcclxuICAgICAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG8gPSBmYWxzZTtcclxuICAgICAgICBjYW1wb01hcmNhZG9yID0gbmV3IFJlcG9ydGVUYWJsYU1vZGVsO1xyXG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yKCk7XHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjYW1wb01hcmNhZG9yLmxsYXZlID0gdGhpcy51dGlsc1NlcnZpY2UuZ2VuZXJhckxsYXZlKCk7XHJcbiAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlVGFibGFEVE8nLCBudWxsLCBmYWxzZSwgY2FtcG9NYXJjYWRvcikpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2Vzcyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfR1VBUkRBUik7XHJcbiAgICAgICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvID0gZmFsc2U7XHJcbiAgICAgICAgY2FtcG9NYXJjYWRvciA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbDtcclxuICAgICAgICB0aGlzLnZlclJlcG9ydGVNYXJjYWRvckRldGFsbGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNhbXBvTWFyY2Fkb3JJbnNlcnRhciA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbCgpXHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3IoKTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhcmdhckxpc3RhU29wb3J0ZXMoKXtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVTb3BvcnRlRFRPJywgbnVsbCwgZmFsc2UsIHtyZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIHRpcG86ICdTJ30pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFTb3BvcnRlcyA9IGRhdGE7XHJcbiAgIH0pXHJcbiAgfVxyXG5cclxuICBhc3luYyBjYXJnYXJMaXN0YVNvcG9ydGVzQXN5bmMoKXtcclxuICAgIHRoaXMubGlzdGFTb3BvcnRlcyA9IGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVTb3BvcnRlRFRPJywgbnVsbCwgZmFsc2UsIHtyZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIHRpcG86ICdTJ30pKS50b1Byb21pc2UoKVxyXG4gIH1cclxuXHJcbiAgbnVldm9Tb3BvcnRlKCl7XHJcbiAgICB0aGlzLnNvcG9ydGVJbmdyZXNhciA9IG5ldyBSZXBvcnRlU29wb3J0ZU1vZGVsKCk7XHJcbiAgICB0aGlzLnZlclNvcG9ydGVBcmNoaXZvRGV0YWxsZSA9IHRydWU7XHJcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsYXJTb3BvcnRlKCkge1xyXG4gICAgdGhpcy5zb3BvcnRlSW5ncmVzYXIgPSBuZXcgUmVwb3J0ZVNvcG9ydGVNb2RlbCgpO1xyXG4gICAgdGhpcy52ZXJTb3BvcnRlQXJjaGl2b0RldGFsbGUgPSBmYWxzZTtcclxuICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhclNvcG9ydGUoc29wb3J0ZSl7XHJcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlLmRlc2NyaXBjaW9uKVxyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHNvcG9ydGUuYXJjaGl2b0luZGl2aWR1YWwpXHJcbiAgICByZXR1cm4gdmFsaWRhZG9yO1xyXG4gIH1cclxuXHJcbiAgYWdyZWdhclNvcG9ydGUoc29wb3J0ZSl7XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhclNvcG9ydGVBcmNoaXZvID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy52YWxpZGFyU29wb3J0ZShzb3BvcnRlKSl7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXNvcG9ydGUubGxhdmVUYWJsYSl7XHJcbiAgICAgIHNvcG9ydGUudGlwbyA9ICdTJ1xyXG4gICAgICBzb3BvcnRlLnJlcG9ydGVGdWVudGUgPSB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmVcclxuICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVTb3BvcnRlRFRPJywgbnVsbCwgZmFsc2UsIHNvcG9ydGUpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xyXG4gICAgICAgIHNvcG9ydGUgPSBuZXcgUmVwb3J0ZVNvcG9ydGVNb2RlbDtcclxuICAgICAgICB0aGlzLmNhcmdhckxpc3RhU29wb3J0ZXMoKTtcclxuICAgICAgICB0aGlzLnZlclNvcG9ydGVBcmNoaXZvRGV0YWxsZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2xpY2tHdWFyZGFyU29wb3J0ZUFyY2hpdm8gPSBmYWxzZTtcclxuICAgICAgfSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlU29wb3J0ZURUTycsIG51bGwsIGZhbHNlLCBzb3BvcnRlKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVNvcG9ydGVzKCk7XHJcbiAgICAgICAgICB0aGlzLnZlclNvcG9ydGVBcmNoaXZvRGV0YWxsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5jbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2byA9IGZhbHNlO1xyXG4gICAgICAgICAgc29wb3J0ZSA9IG5ldyBSZXBvcnRlU29wb3J0ZU1vZGVsO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBlbGltaW5hclNvcG9ydGUoZXZlbnQsIHNvcG9ydGUpe1xyXG4gICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gdHJ1ZTtcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXHJcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxyXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxyXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcclxuICAgICAgYWNjZXB0OiAoKSA9PiB7IFxyXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVTb3BvcnRlRFRPJywgbnVsbCwgZmFsc2UsIHNvcG9ydGUpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVIpO1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVNvcG9ydGVzKCk7XHJcbiAgICAgICAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSBmYWxzZTtcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgaW5pY2lhckVkaWNpb24oKSB7XHJcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FuY2VsYXJFZGljaW9uKCkgeyBcclxuICAgIHRoaXMuY2FyZ2FyTGlzdGFTb3BvcnRlc0FzeW5jKCk7ICAgXHJcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSBmYWxzZTtcclxuICAgIFxyXG4gIH1cclxuICBcclxuICAvL1JlcG9ydGUgRGluYW1pY29cclxuXHJcbiAgZ2VuZXJhckphc3Blcigpe1xyXG4gICAgdGhpcy5yZXBvcnRlU2VydmljZS5nZW5lcmFySmFzcGVyKHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSwgJ2NvbXBlbnNhY2lvbi9SZXBvcnRlc0Jhc2UnKSAuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGRhdGEpID0+IHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93U3VjY2VzcygnU2UgaGEgZ2VuZXJhZG8gZWwgamFzcGVyIGV4aXRvc2FtZW50ZScpXHJcbiAgICAgICAgdGhpcy52YWxpZGFyRXhpc3RlSmFzcGVyKCk7XHJcbiAgICAgIH1cclxuICAgIH0pOyAgICBcclxuICB9XHJcblxyXG5cclxuICBkZXNjYXJnYXJKYXNwZXIoKSB7XHJcblxyXG4gICAgbGV0IHByb3BpZWRhZCA9ICdydXRhX3BsYW50aWxsYXMnO1xyXG4gICAgLy9SdXRhIGFyY2hpdm9cclxuICAgIHRoaXMuYXBsaWNhY2lvbiA9IHRoaXMuYXV0aFNlcnZpY2UuZ2V0VG9rZW5LZXkoJ2FwbGljYWNpb24nKVxyXG4gICAgdGhpcy5jYXJnYXJBcmNoaXZvLmRlc2NhcmdhckFyY2hpdm8odGhpcy5lbmNyaXB0YWRvckFyY2hpdm8uZW5jcmlwdGFyKCdyZXBvcnRlcy8nICsgdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlICsgJy5qcnhtbCcpLCBwcm9waWVkYWQsIHRoaXMuYXBsaWNhY2lvbikuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogYmxvYiA9PiB7XHJcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcclxuICAgICAgY29uc3Qgb2JqZWN0VXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxyXG4gICAgICBhLmhyZWYgPSBvYmplY3RVcmxcclxuICAgICAgYS5kb3dubG9hZCA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSArICcuanJ4bWwnIC8vZG9jdW1lbnRvLmFyY2hpdm9vcmlnZW47XHJcbiAgICAgIGEuY2xpY2soKTtcclxuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChvYmplY3RVcmwpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIH1cclxuXHJcbiAgbnVldm9NYXJjYWRvckRpbmFtaWNvKCl7XHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsXHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLm9yaWdlbiA9ICdEJ1xyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5yZXBvcnRlRnVlbnRlID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlXHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmJhbmRhID0gdGhpcy5iYW5kYVNlbGVjY2lvbmFkYS5rZXlcclxuICAgIHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5yZXNldCgpO1xyXG4gICAgdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLnBhdGNoVmFsdWUodGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbylcclxuICAgIHRoaXMubnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IHRydWVcclxuICB9XHJcblxyXG4gIHZlck1hcmNhZG9yRGluYW1pY28oZXZlbnQpe1xyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IGV2ZW50LmRhdGE7XHJcbiAgICB0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28ucGF0Y2hWYWx1ZSh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvKVxyXG4gICAgdGhpcy5udWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHZlckJhbmRhKGV2ZW50KXtcclxuICAgIHRoaXMudmVyVGFiQmFuZGEgPSBmYWxzZTtcclxuICAgIHRoaXMuYmFuZGFTZWxlY2Npb25hZGEgPSBldmVudC5kYXRhO1xyXG4gICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IG5ldyBSZXBvcnRlTWFyY2Fkb3JNb2RlbDtcclxuICAgIHRoaXMubnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IGZhbHNlO1xyXG4gICAgdGhpcy5udWV2YUJhbmRhID0gZmFsc2U7XHJcbiAgICBpZiAoWydkZXRhbGxlJywnc3VtbWFyeSddLmluY2x1ZGVzKHRoaXMuYmFuZGFTZWxlY2Npb25hZGEua2V5KSl7XHJcbiAgICAgIGF3YWl0IHRoaXMuY2FyZ2FyTGlzdGFNYXJjYWRvckRpbmFtaWNvKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlcG9ydGVCYW5kYSA9IGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JPYmplY3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUJhbmRhRFRPJywgbnVsbCwgZmFsc2UsIHtyZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIGJhbmRhOiB0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLmtleX0pKS50b1Byb21pc2UoKTtcclxuICAgICAgaWYgKCF0aGlzLnJlcG9ydGVCYW5kYSkge1xyXG4gICAgICAgIHRoaXMubnVldmFCYW5kYSA9IHRydWU7XHJcbiAgICAgICAgaWYgKFsnZGV0YWxsZScsJ3N1bW1hcnknXS5pbmNsdWRlcyh0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLmtleSkpe1xyXG4gICAgICAgICAgdGhpcy5udWV2YUJhbmRhID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVwb3J0ZUJhbmRhID0gbmV3IFJlcG9ydGVCYW5kYU1vZGVsO1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZUJhbmRhLnRvdGFsZXMgPSAnUydcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmNhcmdhckxpc3RhTWFyY2Fkb3JEaW5hbWljbygpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuc2xlZXAoMjUpXHJcbiAgICB0aGlzLnZlclRhYkJhbmRhID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNhcmdhckxpc3RhTWFyY2Fkb3JEaW5hbWljbygpe1xyXG4gICAgdGhpcy5saXN0YU1hcmNhZG9yRGluYW1pY28gPSBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge1xyXG4gICAgICByZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIFxyXG4gICAgICBiYW5kYTogdGhpcy5iYW5kYVNlbGVjY2lvbmFkYS5rZXksXHJcbiAgICAgIG9yZGVuRGluYW1pY286ICdTJyxcclxuICAgICAgb3JpZ2VuOiAnRCdcclxuICAgIH0pKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGd1YXJkYXJDYXJhY3RlcmlzdGljYUJhbmRhKCl7XHJcbiAgICBpZih0aGlzLm51ZXZhQmFuZGEpIHtcclxuICAgICAgdGhpcy5yZXBvcnRlQmFuZGEucmVwb3J0ZUZ1ZW50ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZTtcclxuICAgICAgdGhpcy5yZXBvcnRlQmFuZGEuYmFuZGEgPSB0aGlzLmJhbmRhU2VsZWNjaW9uYWRhLmtleTtcclxuICAgICAgdGhpcy5yZXBvcnRlQmFuZGEgPSBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUJhbmRhRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMucmVwb3J0ZUJhbmRhKSkudG9Qcm9taXNlKCk7XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVCYW5kYURUTycsIG51bGwsIGZhbHNlLCB0aGlzLnJlcG9ydGVCYW5kYSkpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5zbGVlcCgyNSlcclxuICAgIHRoaXMubnVldmFCYW5kYT1mYWxzZTtcclxuICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKFwiU2UgYWN0dWFsaXphcm9uIGxhcyBjYXJhY3RlcmlzdGljYXMgZGUgXCIrdGhpcy5iYW5kYVNlbGVjY2lvbmFkYS52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBndWFyZGFyQ29sdW1uYURpbmFtaWNvKCl7XHJcbiAgICBpZiAoIXRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby52YWxpZCkge1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJyk7XHJcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLmNvbnRyb2xzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmZvcm1SZXBvcnRlRGluYW1pY28uZ2V0KGtleSkuZXJyb3JzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybVJlcG9ydGVEaW5hbWljby5nZXQoa2V5KS5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gdGhpcy5mb3JtUmVwb3J0ZURpbmFtaWNvLnZhbHVlO1xyXG4gICAgaWYodGhpcy51dGlsc1NlcnZpY2UuaXNCbGFuayh0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmxsYXZlKSl7XHJcbiAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubGxhdmUgPSB0aGlzLnV0aWxzU2VydmljZS5nZW5lcmFyTGxhdmUoKTtcclxuICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5vcmlnZW4gPSAnRCc7XHJcbiAgICAgIGlmKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvID09ICdDJyl7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5tYXJjYWRvciA9IHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uZmlsdHJvO1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ucmVwb3J0ZUNvbHVtbmEgPSBudWxsO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICB2YXIgY29sdW1uYSA9IG5ldyBSZXBvcnRlQ29sdW1uYU1vZGVsKCk7XHJcbiAgICAgICAgY29sdW1uYS5sbGF2ZVRhYmxhID0gdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5tYXJjYWRvcjtcclxuICAgICAgICBjb2x1bW5hID0gYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvck9iamVjdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYURUTycsIG51bGwsIGZhbHNlLCBjb2x1bW5hKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5tYXJjYWRvciA9IGNvbHVtbmEubm9tYnJlO1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ucmVwb3J0ZUNvbHVtbmEgPSBjb2x1bW5hLmxsYXZlVGFibGE7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5maWx0cm8gPSBjb2x1bW5hLnNpbnRheGlzO1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0RhdG8gPSBjb2x1bW5hLnRpcG9EYXRvO1xyXG4gICAgICB9XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljbykpLnRvUHJvbWlzZSgpO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIGlmKHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvID09ICdDJyl7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5tYXJjYWRvciA9IHRoaXMucmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uZmlsdHJvO1xyXG4gICAgICB9XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvKSkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gbnVsbDtcclxuICAgIHRoaXMubnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IGZhbHNlO1xyXG4gICAgYXdhaXQgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yRGluYW1pY28oKVxyXG4gICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8oJ1NlIGhhIGd1YXJkYWRvIGVsIGNhbWJpbycpO1xyXG4gIH1cclxuXHJcbiAgcmVncmVzYXJCYW5kYVNlbGVjY2lvbmFkYSgpe1xyXG4gICAgdGhpcy5iYW5kYVNlbGVjY2lvbmFkYSA9IHtrZXk6IG51bGwsIHZhbHVlOiBudWxsfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZWxpbWluYXJDb2x1bW5hRGluYW1pY28oZXZlbnQpIHtcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXHJcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxyXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxyXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcclxuICAgICAgYWNjZXB0OiBhc3luYyAoKSA9PiAge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvICkpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUilcclxuICAgICAgICB0aGlzLnJlcG9ydGVNYXJjYWRvckRpbmFtaWNvID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKClcclxuICAgICAgICB0aGlzLm51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY28gPSBmYWxzZTtcclxuICAgICAgICBhd2FpdCB0aGlzLmNhcmdhckxpc3RhTWFyY2Fkb3JEaW5hbWljbygpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICB2YWxpZGFyU2VwYXJhZG9yKCl7XHJcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLnJlcG9ydGVGdWVudGUuc2VwYXJhZG9yKTtcclxuICAgIHJldHVybiB2YWxpZGFkb3I7XHJcbiAgfVxyXG5cclxuICBhY3R1YWxpemFyU2VwYXJhZG9yKCl7XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhclJlcG9ydGVUZXh0byA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMudmFsaWRhclNlcGFyYWRvcigpKXtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuYWN0dWFsaXphcigpO1xyXG4gIH1cclxuXHJcbiAgY2FyZ2FyTGlzdGFNYXJjYWRvcmVzVGV4dG8oKXtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB7XHJcbiAgICAgIHRpcG9SZXBvcnRlOiB0aGlzLnJlcG9ydGVGdWVudGVQaXBlLlJFUE9SVEVBUkNISVZPUExBTk8sXHJcbiAgICAgIHJlcG9ydGVGdWVudGU6IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSxcclxuICAgICAgb3JkZW5EaW5hbWljbzogdGhpcy5nZW5lcmFsUGlwZS5TSVxyXG4gICAgfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5saXN0YU1hcmNhZG9yZXNUZXh0byA9IGRhdGE7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgdmVyTWFyY2Fkb3JUZXh0byhldmVudCl7XHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JUZXh0byA9IHRydWU7XHJcbiAgICB0aGlzLm1hcmNhZG9yVGV4dG8gPSBldmVudC5kYXRhO1xyXG4gIH1cclxuXHJcbiAgbnVldm9NYXJjYWRvclRleHRvKCl7XHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JUZXh0byA9IHRydWU7XHJcbiAgICB0aGlzLm1hcmNhZG9yVGV4dG8gPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcclxuXHRcdHRoaXMubWFyY2Fkb3JUZXh0by50aXBvUmVwb3J0ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuUkVQT1JURUFSQ0hJVk9QTEFOTztcclxuICB9XHJcblxyXG4gIHZhbGlkYXJNYXJjYWRvclRleHRvKCkgOiBib29sZWFue1xyXG4gICAgdmFyIHZhbGlkYWRvcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvKTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yVGV4dG8uYWx0byk7XHJcbiAgICBpZiAodGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5NQVJDQURPUlRFWFRPRklKTyA9PSB0aGlzLm1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY28pe1xyXG4gICAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvclRleHRvLmZvcm1hdG8pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuTUFSQ0FET1JURVhUT0RJTkFNSUNPID09IHRoaXMubWFyY2Fkb3JUZXh0by50aXBvR3JhZmljbyl7XHJcbiAgICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yVGV4dG8uYW5jaG8pO1xyXG4gICAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvclRleHRvLnJlcG9ydGVDb2x1bW5hKTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWxpZGFkb3I7XHJcbiAgfVxyXG5cclxuICBhc3luYyBndWFyZGFyTWFyY2Fkb3JUZXh0bygpe1xyXG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvclRleHRvID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy52YWxpZGFyTWFyY2Fkb3JUZXh0bygpKSB7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jbGlja0d1YXJkYXJNYXJjYWRvclRleHRvID0gZmFsc2U7XHJcbiAgICB0aGlzLm1hcmNhZG9yVGV4dG8ucmVwb3J0ZUZ1ZW50ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZTtcclxuICAgIGlmICh0aGlzLm1hcmNhZG9yVGV4dG8ubGxhdmUpe1xyXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5tYXJjYWRvclRleHRvKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubWFyY2Fkb3JUZXh0by5sbGF2ZSA9IHRoaXMudXRpbHNTZXJ2aWNlLmdlbmVyYXJMbGF2ZSgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JUZXh0bykpLnRvUHJvbWlzZSgpO1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfR1VBUkRBUik7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNhcmdhckxpc3RhTWFyY2Fkb3Jlc1RleHRvKCk7XHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JUZXh0byA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZWxpbWluYXJNYXJjYWRvVGV4dG8oZXZlbnQpe1xyXG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xyXG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcclxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXHJcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLmdlbmVyYWxQaXBlLlNJX0RFU0MsXHJcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxyXG4gICAgICBhY2NlcHQ6IGFzeW5jICgpID0+ICB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JUZXh0bykpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvclRleHRvID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5tYXJjYWRvclRleHRvID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YU1hcmNhZG9yZXNUZXh0bygpO1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUilcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNhcmdhckxpc3RhWE1MKCl7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlTWFyY2Fkb3JEVE8nLCBudWxsLCBmYWxzZSwge1xyXG4gICAgICB0aXBvUmVwb3J0ZTogJ1gnLFxyXG4gICAgICBvcmlnZW46ICdYJyxcclxuICAgICAgcmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLFxyXG4gICAgICBvcmRlbkRpbmFtaWNvOiB0aGlzLmdlbmVyYWxQaXBlLlNJXHJcbiAgICB9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RhWE1MID0gZGF0YTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBudWV2b01hcmNhZG9yWE1MKCl7XHJcbiAgICB0aGlzLm1hcmNhZG9yWE1MID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XHJcbiAgICB0aGlzLm1hcmNhZG9yWE1MLnRpcG9SZXBvcnRlID0gJ1gnO1xyXG4gICAgdGhpcy5tYXJjYWRvclhNTC5vcmlnZW4gPSAnWCc7XHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JYTUwgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdmVyTWFyY2Fkb3JYTUwoZXZlbnQpe1xyXG4gICAgdGhpcy5tYXJjYWRvclhNTCA9IGV2ZW50LmRhdGE7XHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JYTUwgPSB0cnVlO1xyXG4gICAgaWYgICh0aGlzLm1hcmNhZG9yWE1MLnRpcG8gPT0gJ01SJyB8fCB0aGlzLm1hcmNhZG9yWE1MLnRpcG8gPT0gJ1RCJyl7XHJcbiAgICAgIHRoaXMuY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yWE1MKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2YWxpZGFyTWFyY2Fkb3JYTUwoKXtcclxuICAgIHZhciB2YWxpZGFkb3I6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMubWFyY2Fkb3JYTUwuZGVzY3JpcGNpb24pO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMubWFyY2Fkb3JYTUwudGlwbyk7XHJcbiAgICByZXR1cm4gdmFsaWRhZG9yXHJcbiAgfVxyXG5cclxuICBndWFyZGFyTWFyY2Fkb3JYTUwoKXtcclxuICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JYTUwgPSB0cnVlO1xyXG4gICAgaWYgKCF0aGlzLnZhbGlkYXJNYXJjYWRvclhNTCgpKXtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLm1hcmNhZG9yWE1MLnJlcG9ydGVGdWVudGUgPSB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmU7XHJcbiAgICBpZiAodGhpcy5tYXJjYWRvclhNTC5sbGF2ZSl7XHJcbiAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLm1hcmNhZG9yWE1MKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcclxuICAgICAgICB0aGlzLm1hcmNhZG9yWE1MID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XHJcbiAgICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yWE1MID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVhNTCgpO1xyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5tYXJjYWRvclhNTC5sbGF2ZSA9IHRoaXMudXRpbHNTZXJ2aWNlLmdlbmVyYXJMbGF2ZSgpO1xyXG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZU1hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JYTUwpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xyXG4gICAgICAgIHRoaXMubWFyY2Fkb3JYTUwgPSBuZXcgUmVwb3J0ZU1hcmNhZG9yTW9kZWwoKTtcclxuICAgICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JYTUwgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNhcmdhckxpc3RhWE1MKCk7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yWE1MID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBlbGltaW5hck1hcmNhZG9yWE1MKGV2ZW50KXtcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXHJcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxyXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxyXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcclxuICAgICAgYWNjZXB0OiBhc3luYyAoKSA9PiAge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVNYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB0aGlzLm1hcmNhZG9yWE1MKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKTtcclxuICAgICAgICB0aGlzLm1hcmNhZG9yWE1MID0gbmV3IFJlcG9ydGVNYXJjYWRvck1vZGVsKCk7XHJcbiAgICAgICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yWE1MID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YVhNTCgpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgbnVldm9DYW1wb1RhYmxhWE1MKCl7XHJcbiAgICB0aGlzLnZlclJlcG9ydGVNYXJjYWRvckRldGFsbGVYTUwgPSB0cnVlO1xyXG4gICAgdGhpcy5jYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwgPSBuZXcgUmVwb3J0ZVRhYmxhTW9kZWwoKTtcclxuICAgIHRoaXMuY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLnJlcG9ydGVNYXJjYWRvciA9IHRoaXMubWFyY2Fkb3JYTUwubGxhdmVcclxuICB9XHJcblxyXG4gIGNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvclhNTCgpIHtcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVUYWJsYURUTycsIG51bGwsIGZhbHNlLCB7IHJlcG9ydGVNYXJjYWRvcjogdGhpcy5tYXJjYWRvclhNTC5sbGF2ZX0pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdGFDYW1wb3NNYXJjYWRvclhNTCA9IGRhdGE7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yWE1MQXN5bmMoKSB7XHJcbiAgICB0aGlzLmxpc3RhQ2FtcG9zTWFyY2Fkb3JYTUwgPSBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlVGFibGFEVE8nLCBudWxsLCBmYWxzZSwgeyByZXBvcnRlTWFyY2Fkb3I6IHRoaXMubWFyY2Fkb3JYTUwubGxhdmV9KSkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICB2YWxpZGFyQ2FtcG9NYXJjYWRvclhNTChjYW1wb01hcmNhZG9yKXtcclxuICAgIHZhciB2YWxpZGFkb3I6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3IuY2FtcG9GdWVudGUpO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3IubWFyY2Fkb3IpO1xyXG4gICAgcmV0dXJuIHZhbGlkYWRvcjtcclxuICB9XHJcblxyXG4gIGFncmVnYXJDYW1wb01hcmNhZG9yWE1MKGNhbXBvOiBSZXBvcnRlVGFibGFNb2RlbCl7XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUwgPSB0cnVlO1xyXG4gICAgaWYgKCF0aGlzLnZhbGlkYXJDYW1wb01hcmNhZG9yWE1MKGNhbXBvKSl7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoY2FtcG8ubGxhdmUpe1xyXG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlVGFibGFEVE8nLCBudWxsLCBmYWxzZSwgY2FtcG8pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xyXG4gICAgICAgIHRoaXMuY2FtcG9NYXJjYWRvckluc2VydGFyWE1MID0gbmV3IFJlcG9ydGVUYWJsYU1vZGVsKCk7XHJcbiAgICAgICAgdGhpcy5jYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3JYTUwoKTtcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNhbXBvLmNvbHVtbmEgPSAwO1xyXG4gICAgICBjYW1wby5sbGF2ZSA9IHRoaXMudXRpbHNTZXJ2aWNlLmdlbmVyYXJMbGF2ZSgpO1xyXG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIGNhbXBvKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcclxuICAgICAgICBjYW1wbyA9IG5ldyBSZXBvcnRlVGFibGFNb2RlbCgpO1xyXG4gICAgICAgIHRoaXMuY2FyZ2FyTGlzdGFDYW1wb01hcmNhZG9yWE1MKCk7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUwgPSBmYWxzZTtcclxuICAgIHRoaXMudmVyUmVwb3J0ZU1hcmNhZG9yRGV0YWxsZVhNTCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZWxpbWluYXJDYW1wb01hcmNhZG9yWE1MKGV2ZW50LCBvYmpldG8peyBcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXHJcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxyXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxyXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcclxuICAgICAgYWNjZXB0OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZVRhYmxhRFRPJywgbnVsbCwgZmFsc2UsIG9iamV0bykpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUik7XHJcbiAgICAgICAgICB0aGlzLmNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvclhNTCgpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBjYW1iaWFyVGFiQ29sdW1uYXJpbyhldmVudCl7XHJcbiAgICBzd2l0Y2ggKGV2ZW50LmluZGV4KSB7XHJcbiAgICAgIGNhc2UgMDpcclxuICAgICAgICB0aGlzLmNhcmdhclJlcG9ydGVDb2x1bW5hcmlvKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICB0aGlzLmNhcmdhckRhdG9zQWRpY2lvbmFsZXMoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIHRoaXMuY2FyZ2FyTWFyY2Fkb3Jlc0NvbHVtbmFyaW8oKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhcmdhck1hcmNhZG9yZXNDb2x1bW5hcmlvKCkge1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvckRUTycsIG51bGwsIGZhbHNlLCB7cmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5tYXJjYWRvcmVzQ29sdW1uYXJpbyA9IGRhdGE7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcblxyXG4gIGNhcmdhckRhdG9zQWRpY2lvbmFsZXMoKSB7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb0RUTycsIG51bGwsIGZhbHNlLCB7cmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCBmaWx0cm9Db2x1bW5hQmFzaWNhOiAnTid9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmNvbHVtbmFzQWRpY2lvbmFsZXMgPSBkYXRhO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNhcmdhclJlcG9ydGVDb2x1bW5hcmlvKCl7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb0RUTycsIG51bGwsIGZhbHNlLCB7cmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlLCBmaWx0cm9Db2x1bW5hQmFzaWNhOiAnUyd9KSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RhUmVwb3J0ZUNvbHVtbmFyaW8gPSBkYXRhO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNhcmdhckdyYWZpY2FzQ29sdW1uYXMoKSB7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLnF1ZXJ5Rm9yTGlzdChuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYURUTycsIG51bGwsIGZhbHNlLCB7cmVwb3J0ZUZ1ZW50ZTogdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlfSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5wYWdpbmFkb3JDb2x1bW5hcyA9IGRhdGE7XHJcbiAgICB9KVxyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5xdWVyeUZvckxpc3QobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUJhbmRhRFRPJywgbnVsbCwgZmFsc2UsIHtyZXBvcnRlRnVlbnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmUsIHRvdGFsZXM6ICdDJ30pKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMucGFnaW5hZG9yQ29sb3Jlc0dyYWZpY2EgPSBkYXRhO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHZhbGlkYXJFeGlzdGVKYXNwZXIoKXtcclxuICAgIHRoaXMuY2FyZ2FyQXJjaGl2by5kZXNjYXJnYXJBcmNoaXZvKHRoaXMuZW5jcmlwdGFkb3JBcmNoaXZvLmVuY3JpcHRhcigncmVwb3J0ZXMvJyArIHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZSArICcuanJ4bWwnKSwgJ3J1dGFfcGxhbnRpbGxhcycsIHRoaXMuYXBsaWNhY2lvbikuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICB0aGlzLmV4aXN0ZUphc3BlciA9IHRydWU7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIHRoaXMuZXhpc3RlSmFzcGVyID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICkgXHJcbiAgfVxyXG5cclxuICB2ZXJSZXBvcnRlQ29sdW1uYXJpbyhldmVudCl7XHJcbiAgICB0aGlzLmNvbHVtbmFCYXNpY2EgPSBldmVudC5kYXRhO1xyXG4gICAgdGhpcy52ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG51ZXZvQ29sdW1uYUJhc2ljYSgpe1xyXG4gICAgdGhpcy5jb2x1bW5hQmFzaWNhID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwoKTtcclxuICAgIHRoaXMuY29sdW1uYUJhc2ljYS5yZXBvcnRlRnVlbnRlID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlO1xyXG4gICAgdGhpcy52ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXJDb2x1bW5hQmFzaWNhKCl7XHJcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLm5vbWJyZSk7XHJcbiAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS50aXBvKTtcclxuICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLnJlcG9ydGVDb2x1bW5hKTtcclxuICAgIGlmICh2YWxpZGFkb3Ipe1xyXG4gICAgICBpZiAodGhpcy5pc01vc3RyYXJPcmRlbigpKXtcclxuICAgICAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS5vcmRlbik7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuaXNNb3N0cmFyT3JkZW5Db25zdWx0YSgpKXtcclxuICAgICAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS5vcmRlbkNvbnN1bHRhKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19DRUxEQSA9PSB0aGlzLmNvbHVtbmFCYXNpY2EudGlwbykge1xyXG4gICAgICAgIHZhbGlkYWRvciA9ICB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQmFzaWNhLm9wZXJhY2lvbik7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19DT0xVTU5BPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG8pIHtcclxuICAgICAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS5vcGVyYWNpb25Ib3Jpem9udGFsKTtcclxuICAgICAgICB2YWxpZGFkb3IgPSAgdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUJhc2ljYS5vcGVyYWNpb25WZXJ0aWNhbCk7XHJcbiAgICAgICAgdmFsaWRhZG9yID0gIHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFCYXNpY2EuY29sdW1uYU9wZXJhY2lvblZlcnRpY2FsKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0xBQkVMID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvKSB7XHJcbiAgICAgICAgdmFsaWRhZG9yID0gIHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFCYXNpY2Eub3JkZXJCeSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB2YWxpZGFkb3I7XHJcbiAgfVxyXG5cclxuICBhc3luYyB2ZXJpZmljYXJDb2x1bW5hc1ZhbGlkYXMocmVwb3J0ZUNvbHVtbmFyaW9EVE8pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHZhciB0aXBvPXJlcG9ydGVDb2x1bW5hcmlvRFRPLnRpcG87XHJcblx0XHRpZih0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0ZJTEEgPT0gcmVwb3J0ZUNvbHVtbmFyaW9EVE8udGlwbyl7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0dmFyIGZpbHRybz1uZXcgIFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwoKTtcclxuXHRcdGZpbHRyby5yZXBvcnRlRnVlbnRlID0gcmVwb3J0ZUNvbHVtbmFyaW9EVE8ucmVwb3J0ZUZ1ZW50ZTtcclxuXHRcdGZpbHRyby5kaWZlcmVudGVDb2x1bW5hcmlvID0gcmVwb3J0ZUNvbHVtbmFyaW9EVE8ubGxhdmVUYWJsYTtcclxuXHRcdGZpbHRyby50aXBvID0gdGlwbztcclxuXHRcdHZhciBjYW50aWRhZD0gYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5jYW50aWRhZFJlZ2lzdHJvcyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb0RUTycsIG51bGwsIGZhbHNlLCBmaWx0cm8pKS50b1Byb21pc2UoKTtcclxuXHRcdGlmKGNhbnRpZGFkPT0wKXtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblx0XHRpZih0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0NPTFVNTkEgPT0gcmVwb3J0ZUNvbHVtbmFyaW9EVE8udGlwbyl7XHJcblx0XHRcdFx0dGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1dhcm5pbmcoXCJFbCByZXBvcnRlIHNvbG8gcHVlZGUgY29udGVuZXIgMSByZWdpc3RybyBjb24gdGlwbyBcIit0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0NPTFVNTkFfREVTQyk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cdFx0fWVsc2UgaWYodGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19DRUxEQSA9PSByZXBvcnRlQ29sdW1uYXJpb0RUTy50aXBvKXtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1dhcm5pbmcoXCJFbCByZXBvcnRlIHNvbG8gcHVlZGUgY29udGVuZXIgMSByZWdpc3RybyBjb24gdGlwbyBcIit0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0NFTERBX0RFU0MpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGd1YXJkYXJDb2x1bW5hQmFzaWNhKCl7XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy52YWxpZGFyQ29sdW1uYUJhc2ljYSgpKXtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmIChhd2FpdCB0aGlzLnZlcmlmaWNhckNvbHVtbmFzVmFsaWRhcyh0aGlzLmNvbHVtbmFCYXNpY2EpKXtcclxuICAgICAgaWYgKHRoaXMuY29sdW1uYUJhc2ljYS5sbGF2ZVRhYmxhKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9EVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5jb2x1bW5hQmFzaWNhKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5hQmFzaWNhID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTW9kZWwoKTtcclxuICAgICAgICB0aGlzLnZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW8gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmFsU2VydmljZS5jcmVhclJlZ2lzdHJvKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuY29sdW1uYUJhc2ljYSkpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHRoaXMuY29sdW1uYUJhc2ljYSA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01vZGVsKCk7XHJcbiAgICAgICAgdGhpcy52ZXJOdWV2b1JlcG9ydGVDb2x1bW5hcmlvID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW8gPSBmYWxzZTtcclxuICAgICAgdGhpcy5jYXJnYXJSZXBvcnRlQ29sdW1uYXJpbygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZWxpbWluYXJDb2x1bW5hQmFzaWNhKGV2ZW50KXsgXHJcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XHJcbiAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxyXG4gICAgICBtZXNzYWdlOiAgdGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSX0NPTkZJUk1BUixcclxuICAgICAgYWNjZXB0TGFiZWw6IHRoaXMuZ2VuZXJhbFBpcGUuU0lfREVTQyxcclxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnY29uZmlybWFyJyksXHJcbiAgICAgIGFjY2VwdDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuY29sdW1uYUJhc2ljYSkpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUik7XHJcbiAgICAgICAgICB0aGlzLnZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW8gPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuY29sdW1uYUJhc2ljYSA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01vZGVsKCk7XHJcbiAgICAgICAgICB0aGlzLmNhcmdhclJlcG9ydGVDb2x1bW5hcmlvKCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICBcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG51ZXZhQ29sdW1uYUFkaWNpb25hbCgpIHtcclxuICAgIHRoaXMuY29sdW1uYUFkaWNpb25hbCA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01vZGVsKCk7XHJcbiAgICB0aGlzLmNvbHVtbmFBZGljaW9uYWwucmVwb3J0ZUZ1ZW50ZSA9IHRoaXMucmVwb3J0ZUZ1ZW50ZS5sbGF2ZTtcclxuICAgIHRoaXMuY29sdW1uYUFkaWNpb25hbC50aXBvID0gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19BRElDSU9OQUw7XHJcbiAgICB0aGlzLnZlck51ZXZvQ29sdW1uYUFkaWNpb25hbCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICB2ZXJEZXRhbGxlQWRpY2lvbmFsKGV2ZW50KSB7XHJcbiAgICB0aGlzLmNvbHVtbmFBZGljaW9uYWwgPSBldmVudC5kYXRhO1xyXG4gICAgdGhpcy52ZXJOdWV2b0NvbHVtbmFBZGljaW9uYWwgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhckNvbHVtbmFBZGljaW9uYWwoKSB7XHJcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFBZGljaW9uYWwubm9tYnJlKTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLmNvbHVtbmFBZGljaW9uYWwuc2ludGF4aXMpO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUFkaWNpb25hbC5vcmRlbik7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5jb2x1bW5hQWRpY2lvbmFsLm9yZGVyQnkpO1xyXG4gICAgdmFsaWRhZG9yID0gdmFsaWRhZG9yICYmIHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHRoaXMuY29sdW1uYUFkaWNpb25hbC5vcmRlbkNvbnN1bHRhKTtcclxuICAgIHJldHVybiB2YWxpZGFkb3I7XHJcbiAgfVxyXG5cclxuICBhc3luYyBndWFyZGFyQ29sdW1uYUFkaWNpb25hbCgpIHtcclxuICAgIHRoaXMuY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbCA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMudmFsaWRhckNvbHVtbmFBZGljaW9uYWwoKSl7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dFcnJvcignRmFsdGFuIGNhbXBvcyBvYmxpZ2F0b3Jpb3MnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY29sdW1uYUFkaWNpb25hbC5sbGF2ZVRhYmxhKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UudXBkYXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hcmlvRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMuY29sdW1uYUFkaWNpb25hbCkpLnRvUHJvbWlzZSgpO1xyXG4gICAgICB0aGlzLmNvbHVtbmFBZGljaW9uYWwgPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCgpO1xyXG4gICAgICB0aGlzLnZlck51ZXZvQ29sdW1uYUFkaWNpb25hbCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93SW5mbyh0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfQUNUVUFMSVpBUik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLmNyZWFyUmVnaXN0cm8obmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9EVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5jb2x1bW5hQWRpY2lvbmFsKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgIHRoaXMuY29sdW1uYUFkaWNpb25hbCA9IG5ldyBSZXBvcnRlQ29sdW1uYXJpb01vZGVsKCk7XHJcbiAgICAgIHRoaXMudmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsID0gZmFsc2U7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbCA9IGZhbHNlO1xyXG4gICAgdGhpcy5jYXJnYXJEYXRvc0FkaWNpb25hbGVzKCk7XHJcbiAgfVxyXG5cclxuICBlbGltaW5hckNvbHVtbmFBZGljaW9uYWwoZXZlbnQpIHtcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXHJcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxyXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxyXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcclxuICAgICAgYWNjZXB0OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS5kZWxldGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFyaW9EVE8nLCBudWxsLCBmYWxzZSwgdGhpcy5jb2x1bW5hQWRpY2lvbmFsKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKTtcclxuICAgICAgICAgIHRoaXMudmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmNvbHVtbmFBZGljaW9uYWwgPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9Nb2RlbCgpO1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJEYXRvc0FkaWNpb25hbGVzKCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvKCkge1xyXG4gICAgdGhpcy5tYXJjYWRvckNvbHVtbmFyaW8gPSBuZXcgUmVwb3J0ZUNvbHVtbmFyaW9NYXJjYWRvck1vZGVsKCk7XHJcbiAgICB0aGlzLm1hcmNhZG9yQ29sdW1uYXJpby5yZXBvcnRlRnVlbnRlID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlO1xyXG4gICAgdGhpcy52ZXJOdWV2b01hcmNhZG9yQ29sdW1uYXJpbyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICB2ZXJEZXRhbGxlTWFyY2Fkb3JDb2x1bW5hcmlvKGV2ZW50KSB7XHJcbiAgICB0aGlzLm1hcmNhZG9yQ29sdW1uYXJpbyA9IGV2ZW50LmRhdGE7XHJcbiAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXJNYXJjYWRvckNvbHVtbmFyaW8oKSB7XHJcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyh0aGlzLm1hcmNhZG9yQ29sdW1uYXJpby5tYXJjYWRvcik7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvckNvbHVtbmFyaW8udGlwbyk7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvckNvbHVtbmFyaW8udGV4dG9SZWdpc3Rybyk7XHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5tYXJjYWRvckNvbHVtbmFyaW8uZGVzY3JpcGNpb24pO1xyXG4gICAgcmV0dXJuIHZhbGlkYWRvcjtcclxuICB9XHJcblxyXG4gIGFzeW5jIGd1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW8oKSB7XHJcbiAgICB0aGlzLmNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpbyA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMudmFsaWRhck1hcmNhZG9yQ29sdW1uYXJpbygpKXtcclxuICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0Vycm9yKCdGYWx0YW4gY2FtcG9zIG9ibGlnYXRvcmlvcycpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tYXJjYWRvckNvbHVtbmFyaW8ubGxhdmVUYWJsYSkge1xyXG4gICAgICBhd2FpdCB0aGlzLmdlbmVyYWxTZXJ2aWNlLnVwZGF0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb01hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgIHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JNb2RlbCgpO1xyXG4gICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvID0gZmFsc2U7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9BQ1RVQUxJWkFSKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb01hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgIHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JNb2RlbCgpO1xyXG4gICAgICB0aGlzLnZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvID0gZmFsc2U7XHJcbiAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9HVUFSREFSKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvID0gZmFsc2U7XHJcbiAgICB0aGlzLmNhcmdhck1hcmNhZG9yZXNDb2x1bW5hcmlvKCk7XHJcbiAgfVxyXG5cclxuICBlbGltaW5hck1hcmNhZG9yQ29sdW1uYXJpbyhldmVudCkge1xyXG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xyXG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcclxuICAgICAgbWVzc2FnZTogIHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUl9DT05GSVJNQVIsXHJcbiAgICAgIGFjY2VwdExhYmVsOiB0aGlzLmdlbmVyYWxQaXBlLlNJX0RFU0MsXHJcbiAgICAgIGhlYWRlcjogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NvbmZpcm1hcicpLFxyXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmRlbGV0ZShuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQ29sdW1uYXJpb01hcmNhZG9yRFRPJywgbnVsbCwgZmFsc2UsIHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd0luZm8odGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0VMSU1JTkFSKTtcclxuICAgICAgICAgIHRoaXMudmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW8gPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMubWFyY2Fkb3JDb2x1bW5hcmlvID0gbmV3IFJlcG9ydGVDb2x1bW5hcmlvTWFyY2Fkb3JNb2RlbCgpO1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJNYXJjYWRvcmVzQ29sdW1uYXJpbygpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ3VhcmRhckdyYWZpY28oKSB7XHJcbiAgICB0aGlzLmFjdHVhbGl6YXIoKTtcclxuICAgIHRoaXMucGFnaW5hZG9yQ29sdW1uYXMuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUNvbHVtbmFEVE8nLCBudWxsLCBmYWxzZSwgZGF0YSkpLnN1YnNjcmliZShkYXRhID0+IHt9KVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdmVyR3JhZmljbygpIHtcclxuICAgIHRoaXMucmVwb3J0ZVNlcnZpY2UudmVyR3JhZmljbyh7bGxhdmVSZXBvcnRlOiB0aGlzLnJlcG9ydGVGdWVudGUubGxhdmV9KS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIGxldCBjb2x1bW5hID0gdGhpcy5kYXNoYm9hcmRTZXJ2aWNlLmNhcmdhckdyYWZpY2Eoe2FjY2lvbjogZGF0YS50aXBvR3JhZmljbywgZGF0b3NHcmFmaWNhOiBkYXRhfSk7XHJcbiAgICAgIHRoaXMuZ3JhZmljYSA9IGNvbHVtbmE7XHJcbiAgICAgIGxldCByZXNwdWVzdGEgPSB0aGlzLmRhc2hib2FyZFBpcGUuVElQT19HUkFGSUNPX0NIQVJULmZpbHRlcihkYXRhID0+IGRhdGEuY29kaWdvID09IGNvbHVtbmEuZGF0b3NHcmFmaWNhLnRpcG9HcmFmaWNvKTtcclxuICAgICAgICAgICAgaWYgKHJlc3B1ZXN0YS5sZW5ndGggPCAwKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbHVtbmEudGlwb0dyYWZpY28gPSByZXNwdWVzdGFbMF0uY29kaWdvQ2hhcnQ7XHJcbiAgICAgIHRoaXMudGlwb0dyYWZpY2EgPSAgY29sdW1uYS50aXBvR3JhZmljbztcclxuICAgICAgY29uc29sZS5sb2codGhpcy50aXBvR3JhZmljYSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBudWV2b0NvbG9yQ2F0ZWdvcmlhKCl7XHJcbiAgICB0aGlzLmNvbG9yQ2F0ZWdvcmlhID0gbmV3IFJlcG9ydGVCYW5kYU1vZGVsKCk7XHJcbiAgICB0aGlzLnZlckNvbG9yQ2F0ZWdvcmlhRGV0YWxsZSA9IHRydWU7XHJcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsYXJDb2xvckNhdGVnb3JpYSgpIHtcclxuICAgIHRoaXMuY29sb3JDYXRlZ29yaWEgPSBuZXcgUmVwb3J0ZUJhbmRhTW9kZWwoKTtcclxuICAgIHRoaXMudmVyQ29sb3JDYXRlZ29yaWFEZXRhbGxlID0gZmFsc2U7XHJcbiAgICB0aGlzLmhhYmlsaXRhQ2FtcG8gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXJDb2xvckNhdGVnb3JpYShjb2xvcil7XHJcbiAgICB2YXIgdmFsaWRhZG9yOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHZhbGlkYWRvciA9IHZhbGlkYWRvciAmJiB0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2xvci50aXR1bG8pXHJcbiAgICB2YWxpZGFkb3IgPSB2YWxpZGFkb3IgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sb3IuYmFuZGEpXHJcbiAgICByZXR1cm4gdmFsaWRhZG9yO1xyXG4gIH1cclxuXHJcbiAgYWdyZWdhckNvbG9yQ2F0ZWdvcmlhKGNvbG9yKXtcclxuICAgIHRoaXMuY2xpY2tHdWFyZGFyQ29sb3JDYXRlZ29yaWEgPSB0cnVlO1xyXG4gICAgaWYgKCF0aGlzLnZhbGlkYXJDb2xvckNhdGVnb3JpYShjb2xvcikpe1xyXG4gICAgICB0aGlzLm5vdGlmaWNhY2lvbmVzQnVzU2VydmljZS5zaG93RXJyb3IoJ0ZhbHRhbiBjYW1wb3Mgb2JsaWdhdG9yaW9zJylcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCFjb2xvci5sbGF2ZVRhYmxhKXtcclxuICAgICAgY29sb3IudG90YWxlcyA9ICdDJ1xyXG4gICAgICBjb2xvci5yZXBvcnRlRnVlbnRlID0gdGhpcy5yZXBvcnRlRnVlbnRlLmxsYXZlXHJcbiAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3JlYXJSZWdpc3RybyhuZXcgR2VuZXJhbE1vZGVsKCdSZXBvcnRlQmFuZGFEVE8nLCBudWxsLCBmYWxzZSwgY29sb3IpKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0dVQVJEQVIpO1xyXG4gICAgICAgIGNvbG9yID0gbmV3IFJlcG9ydGVCYW5kYU1vZGVsKCk7XHJcbiAgICAgICAgdGhpcy5jYXJnYXJHcmFmaWNhc0NvbHVtbmFzKCk7XHJcbiAgICAgICAgdGhpcy52ZXJDb2xvckNhdGVnb3JpYURldGFsbGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNsaWNrR3VhcmRhckNvbG9yQ2F0ZWdvcmlhID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5nZW5lcmFsU2VydmljZS51cGRhdGUobmV3IEdlbmVyYWxNb2RlbCgnUmVwb3J0ZUJhbmRhRFRPJywgbnVsbCwgZmFsc2UsIGNvbG9yKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYWNpb25lc0J1c1NlcnZpY2Uuc2hvd1N1Y2Nlc3ModGhpcy5nZW5lcmFsUGlwZS5NRU5TQUpFX0FDVFVBTElaQVIpO1xyXG4gICAgICAgICAgdGhpcy5jYXJnYXJHcmFmaWNhc0NvbHVtbmFzKCk7XHJcbiAgICAgICAgICB0aGlzLnZlckNvbG9yQ2F0ZWdvcmlhRGV0YWxsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5jbGlja0d1YXJkYXJDb2xvckNhdGVnb3JpYSA9IGZhbHNlO1xyXG4gICAgICAgICAgY29sb3IgPSBuZXcgUmVwb3J0ZUJhbmRhTW9kZWwoKTtcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZWxpbWluYXJDb2xvckNhdGVnb3JpYShldmVudCwgY29sb3Ipe1xyXG4gICAgdGhpcy5oYWJpbGl0YUNhbXBvID0gdHJ1ZTtcclxuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXHJcbiAgICAgIG1lc3NhZ2U6ICB0aGlzLmdlbmVyYWxQaXBlLk1FTlNBSkVfRUxJTUlOQVJfQ09ORklSTUFSLFxyXG4gICAgICBhY2NlcHRMYWJlbDogdGhpcy5nZW5lcmFsUGlwZS5TSV9ERVNDLFxyXG4gICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdjb25maXJtYXInKSxcclxuICAgICAgYWNjZXB0OiAoKSA9PiB7IFxyXG4gICAgICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZGVsZXRlKG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVCYW5kYURUTycsIG51bGwsIGZhbHNlLCBjb2xvcikpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2FjaW9uZXNCdXNTZXJ2aWNlLnNob3dJbmZvKHRoaXMuZ2VuZXJhbFBpcGUuTUVOU0FKRV9FTElNSU5BUik7XHJcbiAgICAgICAgICB0aGlzLmNhcmdhckdyYWZpY2FzQ29sdW1uYXMoKTtcclxuICAgICAgICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IGZhbHNlO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBhc3luYyBjYW5jZWxhckVkaWNpb25Db2xvcigpIHsgXHJcbiAgICB0aGlzLmNhcmdhckdyYWZpY2FzQ29sdW1uYXMoKTsgICBcclxuICAgIHRoaXMuaGFiaWxpdGFDYW1wbyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzRmlqbygpOmJvb2xlYW57XHJcbiAgICByZXR1cm4gdGhpcy5maWx0cm9PcmlnZW5GdWVudGUodGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5GSUpPKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1NxbCgpOmJvb2xlYW57XHJcbiAgICByZXR1cm4gdGhpcy5maWx0cm9PcmlnZW5GdWVudGUodGhpcy5yZXBvcnRlRnVlbnRlUGlwZS5TUUwpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcblx0ICogUGVybWl0ZSBjb25vY2VyIHNpIHNlIGRlYmUgcHJlc2VudGFyIGVuIGxhIGludGVyZmF6IGxvcyBjYW1wb3MgcmVmZXJlbnRlcyBhIG9yZGVuIGNvbnN1bHRhXHJcblx0ICogQHJldHVybiBTaSBzZSBkZWJlIG1vc3RyYXIgc2UgcmV0b3JuYXJhIHRydWUsIGRlIGxvIGNvbnRyYXJpbyBmYWxzZVxyXG5cdCAqL1xyXG5cdGlzTW9zdHJhck9yZGVuQ29uc3VsdGEoKXtcclxuXHRcdHJldHVybiB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0ZJTEEgPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG87XHJcblx0fVxyXG5cdFxyXG5cclxuXHRpc01vc3RyYXJPcmRlbigpe1xyXG5cdFx0cmV0dXJuIHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fRklMQSA9PSB0aGlzLmNvbHVtbmFCYXNpY2EudGlwb3x8XHJcblx0XHRcdFx0dGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19DT0xVTU5BID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvfHx0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0xBQkVMID09IHRoaXMuY29sdW1uYUJhc2ljYS50aXBvO1xyXG5cdH1cclxuXHJcblx0aXNUaXBvQ29sdW1uYSgpe1xyXG5cdFx0cmV0dXJuIHRoaXMucmVwb3J0ZUNvbHVtbmFyaW9QaXBlLlRJUE9fQ09MVU1OQSA9PSB0aGlzLmNvbHVtbmFCYXNpY2EudGlwbztcclxuXHR9XHJcblx0XHJcblxyXG5cdGlzVGlwb0ZpbGEoKXtcclxuXHRcdHJldHVybiB0aGlzLnJlcG9ydGVDb2x1bW5hcmlvUGlwZS5USVBPX0ZJTEEgPT0gdGhpcy5jb2x1bW5hQmFzaWNhLnRpcG87XHRcclxuXHR9XHJcblxyXG5cdGlzVGlwb0xhYmVsKCl7XHJcblx0XHRyZXR1cm4gdGhpcy5yZXBvcnRlQ29sdW1uYXJpb1BpcGUuVElQT19MQUJFTCA9PSB0aGlzLmNvbHVtbmFCYXNpY2EudGlwbztcdFxyXG5cdH1cclxuXHJcbiAgc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNGdWVudGUoKTpib29sZWFue1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdHJvT3JpZ2VuRnVlbnRlKHRoaXMucmVwb3J0ZUZ1ZW50ZVBpcGUuRlVFTlRFKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmaWx0cm9PcmlnZW5GdWVudGUodGlwbzpzdHJpbmcpOmJvb2xlYW57XHJcbiAgICByZXR1cm4gdGhpcy5yZXBvcnRlRnVlbnRlLm9yaWdlbkZ1ZW50ZSA9PSB0aXBvO1xyXG4gIH1cclxufSIsIjxwLXRhYlZpZXcgKG9uQ2hhbmdlKT1cImNhbWJpYXJUYWIoJGV2ZW50KVwiPlxyXG4gICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3snZXhjZWwnIHwgdHJhbnNsYXRlIH19XCIgW3NlbGVjdGVkXT1cInRydWVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC1zZW1pYm9sZFwiPnt7J2RlYmUnIHwgdHJhbnNsYXRlfX0ge3snaW5kaWNhcicgfCB0cmFuc2xhdGV9fSB7eydwbGFudGlsbGEnIHwgdHJhbnNsYXRlfX0ge3sneScgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIHt7J2hvamEnIHwgdHJhbnNsYXRlfX0ge3sncGFyYScgfCB0cmFuc2xhdGV9fSB7eydxdWUnIHwgdHJhbnNsYXRlfX0ge3snZXN0YScgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIHt7J29wY2lvbicgfCB0cmFuc2xhdGV9fSB7eydzZScgfCB0cmFuc2xhdGV9fSB7eydhY3RpdmUnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYSBbcmVhZG9ubHldPVwiZmFsc2VcIiBbc2hvd0RpYWxvZ109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwicmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvVG9kbyA/IHJlcG9ydGVGdWVudGUuYXJjaGl2b1RvZG86ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtleHRlbnNpb25lc109XCIneGxzO3hsc3gnXCIgW21vc3RyYXJvYmxpY2FyZ29dPVwidHJ1ZVwiIFtsYWJlbHJhcl09XCIncGxhbnRpbGxhJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3RlZCk9XCJvYnRlbmVyQXJjaGl2bygkZXZlbnQpXCI+PC9hcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGE+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5ob2phRXhjZWxcIiBzaXplPVwiMjVcIiBtYXhsZW5ndGg9XCIyMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J25vbWJyZScgfCB0cmFuc2xhdGUgfX0ge3snZGUnIHwgdHJhbnNsYXRlIH19IHt7J2xhJyB8IHRyYW5zbGF0ZSB9fSB7eydob2phJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlIH19PC9sYWJlbD4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9DaWZyYWRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5jaWZyYWRvRXhjZWxcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jaWZyYWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXJlZnJlc2hcIiBsYWJlbD1cInt7J2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3R1YWxpemFyKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPHAtcGlja0xpc3QgW3NvdXJjZV09XCJsaXN0YUV4Y2VsXCIgW3RhcmdldF09XCJsaXN0YU5vRXhjZWxcIiBzb3VyY2VIZWFkZXI9XCJBc29jaWFkb1wiIHNvdXJjZUZpbHRlclBsYWNlaG9sZGVyPVwiQXNvY2lhZG9cIlxyXG4gICAgICAgICAgICB0YXJnZXRIZWFkZXI9XCJEZXNhc29jaWFkb1wiIFtkcmFnZHJvcF09XCJ0cnVlXCIgW3Jlc3BvbnNpdmVdPVwidHJ1ZVwiIHRhcmdldEZpbHRlclBsYWNlaG9sZGVyPVwiRGVzYXNvY2lhZG9cIlxyXG4gICAgICAgICAgICBmaWx0ZXJCeT1cInNpbnRheGlzXCIgKG9uU291cmNlUmVvcmRlcik9XCJtb3ZlckFBc29jaWFkbygkZXZlbnQpXCJcclxuICAgICAgICAgICAgKG9uTW92ZUFsbFRvVGFyZ2V0KT1cIm1vdmVyQURlc2Fzb2NpYWRvKCRldmVudClcIiAob25Nb3ZlQWxsVG9Tb3VyY2UpPVwibW92ZXJBQXNvY2lhZG8oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChvbk1vdmVUb1RhcmdldCk9XCJtb3ZlckFEZXNhc29jaWFkbygkZXZlbnQpXCIgKG9uTW92ZVRvU291cmNlKT1cIm1vdmVyQUFzb2NpYWRvKCRldmVudClcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1leGNlbCBwVGVtcGxhdGU9XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD57e2V4Y2VsLm5vbWJyZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvcC1waWNrTGlzdD5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgPGgxIGNsYXNzPVwidGV4dC14bFwiPnt7J21hcmNhZG9yZXMnIHwgdHJhbnNsYXRlfX08L2gxPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgZm9udC1zZW1pYm9sZFwiIGljb249XCJwaSBwaS1wbHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibnVldm9NYXJjYWRvckV4Y2VsKClcIiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAqbmdJZj1cIiF2ZXJOdWV2b01hcmNhZG9yRXhjZWxcIj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCAgbWItMVwiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvckV4Y2VsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cInZlck51ZXZvTWFyY2Fkb3JFeGNlbCA9IGZhbHNlXCIgbGFiZWw9IFwie3snbGlzdGFkbycgfCB0cmFuc2xhdGV9fSB7eydtYXJjYWRvcmVzJyB8IHRyYW5zbGF0ZX19XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGV2cm9uLWxlZnRcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgZm9udC1zZW1pYm9sZCBmbGV4LXNocmluay0wIFwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwibGlzdGFNYXJjYWRvckV4Y2VsXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIFtzY3JvbGxhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgW3NlbGVjdGlvbl09XCJyZXBvcnRlTWFyY2Fkb3JFeGNlbFwiIFtyb3dzXT1cIjEwXCJcclxuICAgICAgICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwibGlzdGFNYXJjYWRvckV4Y2VsLmxlbmd0aFwiIFtwYWdpbmF0b3JdPVwibGlzdGFNYXJjYWRvckV4Y2VsLmxlbmd0aCA+IDEwXCJcclxuICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJEZXRhbGxlTWFyY2Fkb3JFeGNlbCgkZXZlbnQpXCIgKG9uUm93VW5zZWxlY3QpPVwidmVyRGV0YWxsZU1hcmNhZG9yRXhjZWwoJGV2ZW50KVwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JFeGNlbFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJmb25kb1RhYmxhUGluY2lwYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2Rlc2NyaXBjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1tYXJjYWRvcj5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cIm1hcmNhZG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmNhZG9yLmRlc2NyaXBjaW9ufX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIiBjbGFzcz1cInAtMyBmb250LW1lZGl1bSBlbXB0eW1lc3NhZ2VcIj57eydtZW5zYWpldGFibGF2YWNpYScgfCB0cmFuc2xhdGV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvcC10YWJsZT5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIG10LTNcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JFeGNlbFwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibXQtM1wiPjxpIGNsYXNzPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWJvb2tcIj48L2k+e3snZGV0YWxsZScgfCB0cmFuc2xhdGV9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtNCBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1NYXJjYWRvckV4Y2VsXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIHAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcGNpb25cIiBzaXplPVwiMjVcIiBtYXhsZW5ndGg9XCI0MDAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydkZXNjcmlwY2lvbicgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJtYXJjYWRvclwiIHNpemU9XCIyNVwiIG1heGxlbmd0aD1cIjQwMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J21hcmNhZG9yJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93blxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiW3tsYWJlbDogJ0ltYWdlbiBGaWphJywgdmFsdWU6ICdJRid9LCB7bGFiZWw6ICdNYXJjYWRvcicsIHZhbHVlOiAnTUEnfV1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXBvXCIgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwbycgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMlwiIFtoaWRkZW5dPVwiZXNJbWFnZW5GaWphXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiAgcElucHV0VGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwidGV4dG9SZWdpc3Ryb1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd2YWxvcicgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJlc01hcmNhZG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIlt7bGFiZWw6ICdVbmljYScsIHZhbHVlOiAnVSd9LCB7bGFiZWw6ICdDYWRhIEVtcHJlc2EnLCB2YWx1ZTogJ0MnfV1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBmb3JtQ29udHJvbE5hbWU9XCJvcmlnZW5cIiBvcHRpb25MYWJlbD1cImxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmlnZW4nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwiZXNNYXJjYWRvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGEgW3JlYWRvbmx5XT1cImZhbHNlXCIgW3Nob3dEaWFsb2ddPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0ZXh0b1JlZ2lzdHJvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInJlcG9ydGVNYXJjYWRvckV4Y2VsLnRleHRvUmVnaXN0cm8gPyByZXBvcnRlTWFyY2Fkb3JFeGNlbC50ZXh0b1JlZ2lzdHJvOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtleHRlbnNpb25lc109XCInanBnO3BuZydcIiAob25TZWxlY3RlZCk9XCJvYnRlbmVyQXJjaGl2b01hcmNhZG9yRXhjZWwoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9waWVkYWRdPVwiJ3J1dGFfcmVjdXJzb3MnXCIgIFtsYWJlbHJhcl09XCIoJ3JlY3Vyc29zJyB8IHRyYW5zbGF0ZSlcIiBbbGFiZWxhcmNoXT1cIidyZWN1cnNvJyB8IHRyYW5zbGF0ZVwiIFttb3N0cmFyWF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vc3RyYXJvYmxpY2FyZ29dPVwiISghdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKHJlcG9ydGVNYXJjYWRvckV4Y2VsLnRleHRvUmVnaXN0cm8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yRXhjZWwpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FuZXhvUHJvcGllZGFkXT1cInJlcG9ydGVNYXJjYWRvckV4Y2VsLm9yaWdlbiA9PSdDJyA/IGxsYXZlRW1wcmVzYTogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGllZGFkRGVTaXN0ZW1hXT1cInRydWVcIj48L2FwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JFeGNlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIHt7cmVwb3J0ZU1hcmNhZG9yRXhjZWwubGxhdmUgPyAnZ2x5cGhpY29ucy1yZWZyZXNoJyA6ICdnbHlwaGljb25zLWZsb3BweS1zYXZlJ319XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3tyZXBvcnRlTWFyY2Fkb3JFeGNlbC5sbGF2ZSA/ICgnbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZSkgOiAoJ2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGUpfX1cIiAoY2xpY2spPVwiZ3VhcmRhck1hcmNhZG9yRXhjZWwoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1iaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JFeGNlbC5sbGF2ZSAhPSBudWxsXCIgbGFiZWw9XCJ7eydsaW5rX2VsaW1pbmFyJyB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbGltaW5hck1hcmNhZG9yRXhjZWwoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvcC10YWJQYW5lbD5cclxuICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J3BsYW50aWxsYScgfCB0cmFuc2xhdGUgfX1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVNpTm9cIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUudW5pY29BcmNoaXZvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snc29wb3J0ZScgfCB0cmFuc2xhdGUgfX0ge3sndW5pY28nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhU2lOb1wiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5kZXNjYXJnYXJGdWVudGVcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydkZXNjYXJnYXJkb2MnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhU2lOb1wiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5nZW5lcmFyUGluXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZ2VuZXJhcnBpbicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFDb2x1bW5hc1wiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5jYW1wb0FncnVwYWNpb25QbGFuaWxsYVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImxsYXZlVGFibGFcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYWdydXBhcnBvcicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUubm9tYnJlQWdydXBhY2lvblBsYW5pbGxhXCIgc2l6ZT1cIjI1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIxMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydub21icmVhcmNoaXZvYWdydXBhY2lvbicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvQ2lmcmFkb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuY2lmcmFkb1BsYW5pbGxhXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvY2lmcmFkbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZUZ1ZW50ZS51bmljb0FyY2hpdm8gPT0gJ04nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGEgW3JlYWRvbmx5XT1cImZhbHNlXCIgW3Nob3dEaWFsb2ddPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInJlcG9ydGVGdWVudGUuYXJjaGl2b0luZGl2aWR1YWwgPyByZXBvcnRlRnVlbnRlLmFyY2hpdm9JbmRpdmlkdWFsOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxyYXJdPVwiJ2FyY2hpdm8nIHwgdHJhbnNsYXRlXCIgW2xhYmVsYXJjaF09XCInYXJjaGl2bycgfCB0cmFuc2xhdGVcIiBbbW9zdHJhcm9ibGljYXJnb109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvUGxhbmlsbGEoJGV2ZW50KVwiPjwvYXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXJlZnJlc2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJhY3R1YWxpemFyKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPHAtdGFiVmlldyA+XHJcbiAgICAgICAgICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J21hcmNhZG9yZXMnIHwgdHJhbnNsYXRlIH19XCIgW3NlbGVjdGVkXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5IGZvbnQtc2VtaWJvbGQgbWItMlwiIGljb249XCJwaSBwaS1wbHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm51ZXZvTWFyY2Fkb3IoKVwiIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kICBtYi0xXCIgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJ2ZXJOdWV2b01hcmNhZG9yID0gZmFsc2VcIiBsYWJlbD0gXCJ7eydsaXN0YWRvJyB8IHRyYW5zbGF0ZX19IHt7J21hcmNhZG9yZXMnIHwgdHJhbnNsYXRlfX1cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGV2cm9uLWxlZnRcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgZm9udC1zZW1pYm9sZCBmbGV4LXNocmluay0wIFwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwibGlzdGFNYXJjYWRvcmVzXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiIFtzZWxlY3Rpb25dPVwicmVwb3J0ZU1hcmNhZG9yXCJcclxuICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibGlzdGFNYXJjYWRvcmVzLmxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJsaXN0YU1hcmNhZG9yZXMubGVuZ3RoID4gMTBcIiAqbmdJZj1cIiF2ZXJOdWV2b01hcmNhZG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAob25Sb3dTZWxlY3QpPVwidmVyRGV0YWxsZU1hcmNhZG9yKCRldmVudClcIiAob25Sb3dVbnNlbGVjdCk9XCJ2ZXJEZXRhbGxlTWFyY2Fkb3IoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2Rlc2NyaXBjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3sndGlwbycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydtYXJjYWRvcicgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1tYXJjYWRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJtYXJjYWRvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY2Fkb3IuZGVzY3JpcGNpb259fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjYWRvci50aXBvIHwgcmVwb3J0ZUZ1ZW50ZVBpcGUgOiAnbGlzdGFUaXBvRGF0b01hcmNhZG9yZXMnfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY2Fkb3IudGlwbyA9PSAnSUYnID8gbWFyY2Fkb3IudGV4dG9SZWdpc3RybyA6IG1hcmNhZG9yLm5vbWJyZUNvbHVtbmF9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjYWRvci5tYXJjYWRvcn19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIiBjbGFzcz1cInAtMyBmb250LW1lZGl1bSBlbXB0eW1lc3NhZ2VcIj57eydtZW5zYWpldGFibGF2YWNpYScgfCB0cmFuc2xhdGV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvcC10YWJsZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjb2wtbWQtMTJcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1NYXJjYWRvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmb250LXNlbWlib2xkXCI+e3snaW5kaXF1ZScgfCB0cmFuc2xhdGV9fSB7eydlbicgfCB0cmFuc2xhdGV9fSB7eydxdWUnIHwgdHJhbnNsYXRlfX0ge3snY29sdW1uYScgfCB0cmFuc2xhdGV9fSB7eydkZXNlYScgfCB0cmFuc2xhdGV9fSB7eydxdWUnIHwgdHJhbnNsYXRlfX0ge3snYXBhcmV6Y2EnIHwgdHJhbnNsYXRlfX0ge3snbGEnIHwgdHJhbnNsYXRlfX0ge3snaW5mb3JtYWNpb24nIHwgdHJhbnNsYXRlfX0uIHt7J2xhJyB8IHRyYW5zbGF0ZX19IHt7J3ByaW1lcmEnIHwgdHJhbnNsYXRlfX0ge3snY29sdW1uYScgfCB0cmFuc2xhdGV9fSB7eydlcycgfCB0cmFuc2xhdGV9fSB7eydsYScgfCB0cmFuc2xhdGV9fSAxLjwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXBjaW9uXCIgc2l6ZT1cIjI1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCI0MDAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvTWFyY2Fkb3JcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRpcG9cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwbycgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhKFsnTUEnLCdJTScsJ01SJywnSUYnLCdRUicsJ0JDJywnRzEnXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwbykpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cIm1hcmNhZG9yXCIgc2l6ZT1cIjI1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbWFyY2Fkb3InIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cInJlcG9ydGVNYXJjYWRvci50aXBvICE9ICdUQidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwidGFibGFcIiBzaXplPVwiMjVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0YWJsYScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gIT0gJ0lGJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJbe2xhYmVsOiAnVW5pY2EnLCB2YWx1ZTogJ1UnfSwge2xhYmVsOiAnQ2FkYSBFbXByZXNhJywgdmFsdWU6ICdDJ31dXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiIGZvcm1Db250cm9sTmFtZT1cIm9yaWdlblwiIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JpZ2VuJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnSUYnIHx8ICFyZXBvcnRlTWFyY2Fkb3Iub3JpZ2VuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhIFtyZWFkb25seV09XCJmYWxzZVwiIFtzaG93RGlhbG9nXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0ZXh0b1JlZ2lzdHJvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwicmVwb3J0ZU1hcmNhZG9yLnRleHRvUmVnaXN0cm8gPyByZXBvcnRlTWFyY2Fkb3IudGV4dG9SZWdpc3RybzogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtleHRlbnNpb25lc109XCInanBnO3BuZydcIiAob25TZWxlY3RlZCk9XCJvYnRlbmVyQXJjaGl2b01hcmNhZG9yKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9waWVkYWRdPVwiJ3J1dGFfcmVjdXJzb3MnXCIgW2xhYmVscmFyXT1cIidyZWN1cnNvcycgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbmV4b1Byb3BpZWRhZF09XCJyZXBvcnRlTWFyY2Fkb3Iub3JpZ2VuID09J0MnID8gbGxhdmVFbXByZXNhOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BpZWRhZERlU2lzdGVtYV09XCJ0cnVlXCI+PC9hcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFbJ01BJywnSU0nLCdRUicsJ0JDJywnRzEnXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwbylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhQ29sdW1uYXNcIiBmb3JtQ29udHJvbE5hbWU9XCJyZXBvcnRlQ29sdW1uYVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnTUEnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImZvcm1hdG9cIiBzaXplPVwiMjVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmb3JtYXRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCIhWydJTScsJ0lGJywnUVInLCdCQycsJ0cxJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpcG8pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciBmb3JtQ29udHJvbE5hbWU9XCJhbmNob1wiIFttYXhsZW5ndGhdPVwiNVwiPiA8L3AtaW5wdXROdW1iZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYW5jaG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFbJ0lNJywnSUYnLCdRUicsJ0JDJywnRzEnXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwbylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWlucHV0TnVtYmVyIGZvcm1Db250cm9sTmFtZT1cImFsdG9cIiBbbWF4bGVuZ3RoXT1cIjVcIj4gPC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FsdG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cInJlcG9ydGVNYXJjYWRvci50aXBvICE9ICdNUidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTAgbWF4LWgtMjAwXCIgcElucHV0VGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwiZ3J1cG8xXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydncnVwbzEnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnTVInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiIHBJbnB1dFRleHRhcmVhIGZvcm1Db250cm9sTmFtZT1cImdydXBvMlwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZ3J1cG8yJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnTVInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiIHBJbnB1dFRleHRhcmVhIGZvcm1Db250cm9sTmFtZT1cImdydXBvM1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZ3J1cG8zJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnTVInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiIHBJbnB1dFRleHRhcmVhIGZvcm1Db250cm9sTmFtZT1cImZpbmFsR3J1cG9cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2ZpbmFsZ3J1cG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiBbaGlkZGVuXT1cInJlcG9ydGVNYXJjYWRvci50aXBvICE9ICdNUidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTAgbWF4LWgtMjAwXCIgcElucHV0VGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwidGV4dG9SZWdpc3Ryb1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGV4dG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFbJ01SJywnVEInXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwbylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhU2lOb1wiIGZvcm1Db250cm9sTmFtZT1cInRpZW5lU3FsXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snc3FsJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyAhPSAnVEInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9HcmFmaWNvX0pGQ1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0aXBvR3JhZmljb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cImNvZGlnb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydncmFmaWNhJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIShbJ01SJywnVEInXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwbykgJiYgKFsnUyddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aWVuZVNxbCkpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiBwSW5wdXRUZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJxdWVyeVwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snY29uc3VsdGEnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiEoWydNUicsJ1RCJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpcG8pICYmIChbJ04nXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGllbmVTcWwpKSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhRnVlbnRlc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmdWVudGVcIiBvcHRpb25MYWJlbD1cImRlc2NyaXBjaW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cImxsYXZlXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2Z1ZW50ZScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwiIXJlcG9ydGVNYXJjYWRvci50aXBvR3JhZmljb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJtYXJjYWRvckdyYWZpY29cIiBzaXplPVwiMjVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydtYXJjYWRvcmdyYWZpY2EnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFbJ0EnXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGlwb0dyYWZpY28pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cInRpdHVsb3hcIiBzaXplPVwiMjVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXR1bG8nIHwgdHJhbnNsYXRlIH19IFg8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiIVsnQSddLmluY2x1ZGVzKHJlcG9ydGVNYXJjYWRvci50aXBvR3JhZmljbylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwidGl0dWxveVwiIHNpemU9XCIyNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpdHVsbycgfCB0cmFuc2xhdGUgfX0gWTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgW2hpZGRlbl09XCIhcmVwb3J0ZU1hcmNhZG9yLnRpcG9HcmFmaWNvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImJhbmRhXCIgc2l6ZT1cIjI1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snY29sb3JkaW5hbWljbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiIFtoaWRkZW5dPVwiIXJlcG9ydGVNYXJjYWRvci50aXBvR3JhZmljb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJhbmNob0phc3BlckxhYmVsXCIgc2l6ZT1cIjI1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snbnVtZXJvY2F0ZWdvcmlhcycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtMTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiEoWydNUicsJ1RCJ10uaW5jbHVkZXMocmVwb3J0ZU1hcmNhZG9yLnRpcG8pICYmIChbJ04nXS5pbmNsdWRlcyhyZXBvcnRlTWFyY2Fkb3IudGllbmVTcWwpKSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInctZnVsbCBtaW4taC0xNTAgbWF4LWgtMjAwXCIgcElucHV0VGV4dGFyZWEgZm9ybUNvbnRyb2xOYW1lPVwiZmlsdHJvXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmaWx0cm8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImdseXBoaWNvbnMge3tyZXBvcnRlTWFyY2Fkb3IubGxhdmUgPyAnZ2x5cGhpY29ucy1yZWZyZXNoJyA6ICdnbHlwaGljb25zLWZsb3BweS1zYXZlJyB9fVwiIGxhYmVsPVwie3tyZXBvcnRlTWFyY2Fkb3IubGxhdmUgPyAoJ2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGUpIDogKCdsaW5rX2d1YXJkYXInIHwgdHJhbnNsYXRlKX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ3VhcmRhck1hcmNhZG9yKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1iaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yLmxsYXZlICE9IG51bGxcIiBsYWJlbD1cInt7J2xpbmtfZWxpbWluYXInIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbGltaW5hck1hcmNhZG9yKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3IgJiYgcmVwb3J0ZU1hcmNhZG9yLmxsYXZlICE9IG51bGwgJiYgKHJlcG9ydGVNYXJjYWRvci50aXBvID09ICdNUicgfHwgcmVwb3J0ZU1hcmNhZG9yLnRpcG8gPT0gJ1RCJylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwibnVldm9DYW1wb1RhYmxhKClcIiBpY29uPVwicGkgcGktcGx1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtcmlwcGxlIHAtZWxlbWVudCBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1zZWNvbmRhcnkgbWItMlwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YUNhbXBvc01hcmNhZG9yXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1zdHJpcGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cImxpc3RhQ2FtcG9zTWFyY2Fkb3IubGVuZ3RoXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwibGlzdGFDYW1wb3NNYXJjYWRvci5sZW5ndGggPiAxMFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIiBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie2ZpcnN0fSBhbCB7bGFzdH0gZGUge3RvdGFsUmVjb3Jkc30gcmVnaXN0cm9zXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRNb2RlPVwicm93XCIgZGF0YUtleT1cImxsYXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+e3snY29sdW1uYScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+e3snY2FtcG8nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAlO1wiPnt7J2Zvcm1hdG8nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAlO1wiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gPT0gJ1RCJ1wiPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAlO1wiKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyA9PSAnVEInXCI+e3snbWVkaWRhcycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCU7XCI+IDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiVGFibGFOdWV2b1JlZ2lzdHJvXCIgKm5nSWY9XCJ2ZXJSZXBvcnRlTWFyY2Fkb3JEZXRhbGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgWyhuZ01vZGVsKV09XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXIuY29sdW1uYVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvckluc2VydGFyLmNvbHVtbmEpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9ySW5zZXJ0YXIuY29sdW1uYSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyLmNhbXBvRnVlbnRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3JJbnNlcnRhci5jYW1wb0Z1ZW50ZSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3JJbnNlcnRhci5jYW1wb0Z1ZW50ZSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvTWFyY2Fkb3JJbnNlcnRhci5mb3JtYXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yLnRpcG8gPT0gJ1RCJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUdyYWZpY29cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyLnRpcG9cIiBhcHBlbmRUbz1cImJvZHlcIiBbYXV0b1pJbmRleF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAxMCU7XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3IudGlwbyA9PSAnVEInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXIudGlwbyA9PSdJJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyLmFuY2hvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FuY2hvJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyLmFsdG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYWx0bycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktY2hlY2tcIiAoY2xpY2spPVwiYWdyZWdhckNhbXBvTWFyY2Fkb3IoY2FtcG9NYXJjYWRvckluc2VydGFyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zdWNjZXNzIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwidmVyUmVwb3J0ZU1hcmNhZG9yRGV0YWxsZSA9IGZhbHNlXCIgaWNvbj1cInBpIHBpLXRpbWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWRhbmdlciBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1jYW1wbyBsZXQtZWRpdGluZz1cImVkaXRpbmdcIiBsZXQtcmk9XCJyb3dJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFtwRWRpdGFibGVSb3ddPVwiY2FtcG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgIHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wby5jb2x1bW5hXCIgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG8uY29sdW1uYSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1wiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvLmNvbHVtbmEpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NhbXBvLmNvbHVtbmF9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvLmNhbXBvRnVlbnRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG8uY2FtcG9GdWVudGUpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvLmNhbXBvRnVlbnRlKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2FtcG8uY2FtcG9GdWVudGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvLmZvcm1hdG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjYW1wby5mb3JtYXRvfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvci50aXBvID09ICdUQidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhR3JhZmljb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNhbXBvLnRpcG9cIiBhcHBlbmRUbz1cImJvZHlcIiBbYXV0b1pJbmRleF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NhbXBvLnRpcG8gfCByZXBvcnRlRnVlbnRlUGlwZSA6J2xpc3RhUmVjdXJzb0dyYWZpY2EnfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJTtcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvci50aXBvID09ICdUQidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjYW1wby50aXBvID09J0knXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG8uYW5jaG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbmNobycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvLmFsdG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbHRvJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjYW1wby50aXBvID09J0knXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J2FuY2hvJyB8IHRyYW5zbGF0ZX19OiB7e2NhbXBvLmFuY2hvfX0gPGJyLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snYWx0bycgfCB0cmFuc2xhdGV9fToge3tjYW1wby5hbHRvfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAgc3R5bGU9XCJ3aWR0aDogMTAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENIRUNLIEdVQVJEQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcFNhdmVFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGVja1wiIChjbGljayk9XCJhZ3JlZ2FyQ2FtcG9NYXJjYWRvcihjYW1wbylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tc3VjY2VzcyBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENBTkNFTEFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBDYW5jZWxFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiIChjbGljayk9XCJjYXJnYXJMaXN0YUNhbXBvTWFyY2Fkb3JBc3luYygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWRhbmdlciBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVESVRBUiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcEluaXRFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcGVuY2lsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXNlY29uZGFyeSBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVMSU1JTkFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwRGVsZXRlRWRpdGFibGVSb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdHJhc2hcIiAoY2xpY2spPVwiZWxpbWluYXJDYW1wb01hcmNhZG9yKCRldmVudCxjYW1wbylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tb3V0bGluZWQgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPnt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvcC10YWJQYW5lbD5cclxuICAgICAgICAgICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3snc29wb3J0ZScgfCB0cmFuc2xhdGUgfX0ge3snYXJjaGl2bycgfCB0cmFuc2xhdGUgfX1zXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwicmVwb3J0ZUZ1ZW50ZS51bmljb0FyY2hpdm8gPT0gJ04nXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJudWV2b1NvcG9ydGUoKVwiIGljb249XCJwaSBwaS1wbHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImhhYmlsaXRhQ2FtcG9cIiBjbGFzcz1cInAtcmlwcGxlIHAtZWxlbWVudCBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1zZWNvbmRhcnkgbWItMlwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwibGlzdGFTb3BvcnRlc1wiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIiBzdHlsZUNsYXNzPVwicC1kYXRhdGFibGUtc3RyaXBlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cImxpc3RhU29wb3J0ZXMubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cImxpc3RhU29wb3J0ZXMubGVuZ3RoID4gMTBcIiBcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIiBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie2ZpcnN0fSBhbCB7bGFzdH0gZGUge3RvdGFsUmVjb3Jkc30gcmVnaXN0cm9zXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdE1vZGU9XCJyb3dcIiBkYXRhS2V5PVwibGxhdmVUYWJsYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogNDUlXCI+e3snZGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDQ1JVwiPnt7J2FyY2hpdm8nIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDEwJVwiPiA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJUYWJsYU51ZXZvUmVnaXN0cm9cIiAqbmdJZj1cInZlclNvcG9ydGVBcmNoaXZvRGV0YWxsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDQ1JVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJzb3BvcnRlSW5ncmVzYXIuZGVzY3JpcGNpb25cIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oc29wb3J0ZUluZ3Jlc2FyLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oc29wb3J0ZUluZ3Jlc2FyLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiA0NSVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhIFtyZWFkb25seV09XCJmYWxzZVwiIFtzaG93RGlhbG9nXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInNvcG9ydGVJbmdyZXNhci5hcmNoaXZvSW5kaXZpZHVhbCA/IHNvcG9ydGVJbmdyZXNhci5hcmNoaXZvSW5kaXZpZHVhbDogJydcIiBbbGFiZWxhcmNoXT1cIidhcmNoaXZvJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb3N0cmFyTGFiZWxJbnB1dF09XCJmYWxzZVwiIFttb3N0cmFyb2JsaWNhcmdvXT1cIiEoIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlSW5ncmVzYXIuYXJjaGl2b0luZGl2aWR1YWwpICYmIGNsaWNrR3VhcmRhclNvcG9ydGVBcmNoaXZvKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvU29wb3J0ZSgkZXZlbnQsIHNvcG9ydGVJbmdyZXNhcilcIj48L2FwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWNoZWNrXCIgKGNsaWNrKT1cImFncmVnYXJTb3BvcnRlKHNvcG9ydGVJbmdyZXNhcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zdWNjZXNzIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ2ZXJTb3BvcnRlQXJjaGl2b0RldGFsbGUgPSBmYWxzZVwiIGljb249XCJwaSBwaS10aW1lc1wiIChjbGljayk9XCJjYW5jZWxhclNvcG9ydGUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWRhbmdlciBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtc29wb3J0ZSBsZXQtZWRpdGluZz1cImVkaXRpbmdcIiBsZXQtcmk9XCJyb3dJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgW3BFZGl0YWJsZVJvd109XCJzb3BvcnRlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDQ1JVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInNvcG9ydGUuZGVzY3JpcGNpb25cIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3NvcG9ydGUuZGVzY3JpcGNpb259fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiA0NSVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGEgW3JlYWRvbmx5XT1cImZhbHNlXCIgW3Nob3dEaWFsb2ddPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJzb3BvcnRlLmFyY2hpdm9JbmRpdmlkdWFsID8gc29wb3J0ZS5hcmNoaXZvSW5kaXZpZHVhbDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb3N0cmFyTGFiZWxJbnB1dF09XCJmYWxzZVwiIFttb3N0cmFyb2JsaWNhcmdvXT1cIiEoIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhzb3BvcnRlLmFyY2hpdm9JbmRpdmlkdWFsKSAmJiBjbGlja0d1YXJkYXJTb3BvcnRlQXJjaGl2bylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdGVkKT1cIm9idGVuZXJBcmNoaXZvU29wb3J0ZSgkZXZlbnQsIHNvcG9ydGUpXCI+PC9hcHAtaW5wdXQtaGVscGVyLXNlbGVjY2lvbi1wbGFudGlsbGE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c29wb3J0ZS5hcmNoaXZvSW5kaXZpZHVhbH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDSEVDSyBHVUFSREFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcFNhdmVFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZWNrXCIgKGNsaWNrKT1cImFncmVnYXJTb3BvcnRlKHNvcG9ydGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tc3VjY2VzcyBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0FOQ0VMQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwQ2FuY2VsRWRpdGFibGVSb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiIChjbGljayk9XCJjYW5jZWxhckVkaWNpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWRhbmdlciBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRURJVEFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBJbml0RWRpdGFibGVSb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcGVuY2lsXCIgW2Rpc2FibGVkXT1cImhhYmlsaXRhQ2FtcG9cIiAoY2xpY2spPVwiaW5pY2lhckVkaWNpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXNlY29uZGFyeSBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRUxJTUlOQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcERlbGV0ZUVkaXRhYmxlUm93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdHJhc2hcIiAoY2xpY2spPVwiZWxpbWluYXJTb3BvcnRlKCRldmVudCwgc29wb3J0ZSlcIiBbZGlzYWJsZWRdPVwiaGFiaWxpdGFDYW1wb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLW91dGxpbmVkIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L3AtdGFibGU+XHJcbiAgICAgICAgICAgIDwvcC10YWJQYW5lbD5cclxuICAgICAgICA8L3AtdGFiVmlldz5cclxuICAgIDwvcC10YWJQYW5lbD5cclxuICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J3JlcG9ydGUnIHwgdHJhbnNsYXRlIH19IHt7J2RpbmFtaWNvJyB8IHRyYW5zbGF0ZSB9fVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhU2lOb1wiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5kb2JsZUxpbmVhXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZG9ibGVsaW5lYScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLnRpdHVsb1BhcmFtZXRyb1wiIHNpemU9XCIyNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0NpZnJhZG9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLmNpZnJhZG9KYXNwZXJcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jaWZyYWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWQgYmFja2dyb3VuZC0xMDBcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXJlc3RhcnRcIiAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfZ2VuZXJhcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJnZW5lcmFySmFzcGVyKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZWZyZXNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiYWN0dWFsaXphcigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cInBpIHBpLWRvd25sb2FkXCIgKm5nSWY9XCJleGlzdGVKYXNwZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7J2xpbmtfZGVzY2FyZ2FyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImRlc2Nhcmdhckphc3BlcigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMiBtYi0yXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cImJhbmRhU2VsZWNjaW9uYWRhLmtleVwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cInJlZ3Jlc2FyQmFuZGFTZWxlY2Npb25hZGEoKVwiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snYmFuZGFzJyB8IHRyYW5zbGF0ZX19XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YVRpcG9CYW5kYVwiIFtzY3JvbGxhYmxlXT1cInRydWVcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCJcclxuICAgICAgICAgICAgZGF0YUtleT1cImxsYXZlVGFibGFcIiBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgW3Jvd3NdPVwiMTBcIlxyXG4gICAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cImxpc3RhVGlwb0JhbmRhLmxlbmd0aFwiIFtwYWdpbmF0b3JdPVwibGlzdGFUaXBvQmFuZGEubGVuZ3RoID4gMTBcIlxyXG4gICAgICAgICAgICAob25Sb3dTZWxlY3QpPVwidmVyQmFuZGEoJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cInZlckJhbmRhKCRldmVudClcIiAqbmdJZj1cIiFiYW5kYVNlbGVjY2lvbmFkYS5rZXlcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydiYW5kYScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtYmFuZGE+XHJcbiAgICAgICAgICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cImJhbmRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmFuZGEudmFsdWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIiBjbGFzcz1cInAtMyBmb250LW1lZGl1bSBlbXB0eW1lc3NhZ2VcIj57eydtZW5zYWpldGFibGF2YWNpYScgfCB0cmFuc2xhdGV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvcC10YWJsZT5cclxuXHJcbiAgICAgICAgPHAtdGFiVmlldyAqbmdJZj1cImJhbmRhU2VsZWNjaW9uYWRhLmtleSAmJiB2ZXJUYWJCYW5kYVwiPlxyXG4gICAgICAgICAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7eydjYXJhY3RlcmlzdGljYXMnIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhWydkZXRhbGxlJywnc3VtbWFyeSddLmluY2x1ZGVzKGJhbmRhU2VsZWNjaW9uYWRhLmtleSlcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVNpTm9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIiAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlcG9ydGVCYW5kYS50b3RhbGVzXCIgPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RvdGFsJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwicmVwb3J0ZUJhbmRhLnRpdHVsb1wiIG1heGxlbmd0aD1cIjIwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGl0dWxvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtZmxvcHB5LXNhdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImd1YXJkYXJDYXJhY3RlcmlzdGljYUJhbmRhKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3AtdGFiUGFuZWw+XHJcbiAgICAgICAgICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7YmFuZGFTZWxlY2Npb25hZGEudmFsdWV9fVwiICpuZ0lmPVwiIW51ZXZhQmFuZGFcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyIG10LTIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwibnVldm9NYXJjYWRvckRpbmFtaWNvKClcIiBpY29uPVwicGkgcGktcGx1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtcmlwcGxlIHAtZWxlbWVudCBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1zZWNvbmRhcnkgbWItMlwiICpuZ0lmPVwiIW51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY29cIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cImxpc3RhTWFyY2Fkb3JEaW5hbWljb1wiIFtzY3JvbGxhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIiBkYXRhS2V5PVwibGxhdmVUYWJsYVwiIHNlbGVjdGlvbk1vZGU9XCJzaW5nbGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjEwXCIgW3RvdGFsUmVjb3Jkc109XCJsaXN0YU1hcmNhZG9yRGluYW1pY28ubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cImxpc3RhTWFyY2Fkb3JEaW5hbWljby5sZW5ndGggPiAxMFwiICpuZ0lmPVwiIW51ZXZvUmVwb3J0ZU1hcmNhZG9yRGluYW1pY29cIlxyXG4gICAgICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJNYXJjYWRvckRpbmFtaWNvKCRldmVudClcIiAgKG9uUm93VW5zZWxlY3QpPVwidmVyTWFyY2Fkb3JEaW5hbWljbygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiZm9uZG9UYWJsYVBpbmNpcGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snYmFuZGEnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydvcmRlbicgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydldGlxdWV0YScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2Zvcm1hdG8nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydhbmNobycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J29wZXJhY2lvbicgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1kaW5hbWljbz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJkaW5hbWljb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGluYW1pY28uYmFuZGF9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tkaW5hbWljby5iYW5kYSA/IGRpbmFtaWNvLmFsdG8gOiAnJ319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2RpbmFtaWNvLm1hcmNhZG9yfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGluYW1pY28uYmFuZGEgPyBkaW5hbWljby5kZXNjcmlwY2lvbiA6ICcnfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGluYW1pY28uYmFuZGEgPyBkaW5hbWljby5mb3JtYXRvIDogJyd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tbJ2RldGFsbGUnXS5pbmNsdWRlcyhkaW5hbWljby5iYW5kYSkgPyBkaW5hbWljby5hbmNobyA6ICcnfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7ZGluYW1pY28uYmFuZGEgPyBkaW5hbWljby5vcGVyYWNpb24gOiAnJ319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIiBjbGFzcz1cInAtMyBmb250LW1lZGl1bSBlbXB0eW1lc3NhZ2VcIj57eydtZW5zYWpldGFibGF2YWNpYScgfCB0cmFuc2xhdGV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvcC10YWJsZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyICBtYi0yXCI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC1zZW1pYm9sZCBtdC0zXCI+e3snaW5kaXF1ZScgfCB0cmFuc2xhdGV9fSB7eydlbicgfCB0cmFuc2xhdGV9fSB7eydxdWUnIHwgdHJhbnNsYXRlfX0ge3snY29sdW1uYScgfCB0cmFuc2xhdGV9fSB7eydkZXNlYScgfCB0cmFuc2xhdGV9fSB7eydxdWUnIHwgdHJhbnNsYXRlfX0ge3snYXBhcmV6Y2EnIHwgdHJhbnNsYXRlfX0ge3snbGEnIHwgdHJhbnNsYXRlfX0ge3snaW5mb3JtYWNpb24nIHwgdHJhbnNsYXRlfX0uIHt7J2xhJyB8IHRyYW5zbGF0ZX19IHt7J3ByaW1lcmEnIHwgdHJhbnNsYXRlfX0ge3snY29sdW1uYScgfCB0cmFuc2xhdGV9fSB7eydlcycgfCB0cmFuc2xhdGV9fSB7eydsYScgfCB0cmFuc2xhdGV9fSAxLjwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwibnVldm9SZXBvcnRlTWFyY2Fkb3JEaW5hbWljbyA9IGZhbHNlXCIgbGFiZWw9IFwie3snbGlzdGFkbycgfCB0cmFuc2xhdGV9fSB7e2JhbmRhU2VsZWNjaW9uYWRhLnZhbHVlfX1cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCIgKm5nSWY9XCJudWV2b1JlcG9ydGVNYXJjYWRvckRpbmFtaWNvXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVJlcG9ydGVEaW5hbWljb1wiIGNsYXNzPVwicC1mbHVpZCBncmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvQ2FtcG9KYXNwZXJEaW5hbWljb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXBvQ2FtcG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwidmFsdWVcIiBvcHRpb25WYWx1ZT1cImtleVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvY2FtcG8nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gPT0nQydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhVGlwb0RhdG9TaW50YXhpc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGlwb0RhdG9cIiBvcHRpb25MYWJlbD1cInZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cImtleVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvZGF0bycgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IGZvcm1Db250cm9sTmFtZT1cImFsdG9cIiBtYXhsZW5ndGg9XCI1XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pbnB1dD1cInRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnJlcGxhY2UoL1teMC05XS9nLCAnJykuc2xpY2UoMCwgNSk7XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmRlbicgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFDb2x1bW5hc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibWFyY2Fkb3JcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubGxhdmUgJiYgcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJtYXJjYWRvclwiIHNpemU9XCIyNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5sbGF2ZSAmJiByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtMTJcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyA9PSdDJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiBwSW5wdXRUZXh0YXJlYSBmb3JtQ29udHJvbE5hbWU9XCJmaWx0cm9cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3NpbnRheGlzJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZpZWxkc2V0IGNsYXNzPVwiZmllbGRzaW50aXR1bG9cIiAgY2xhc3M9XCJmaWVsZHNpbnRpdHVsb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgZ3JpZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTYgbWItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIHRleHQtYmFzZSBtbC0xXCI+e3sncmVzdWx0YWRvJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02IG1iLTBcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyA9PSdDJ1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTYgbWItMFwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5LTkwMCB0ZXh0LWJhc2UgbWwtMVwiID57eydsYWJlbCcgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJmb3JtYXRvXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmb3JtYXRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwY2lvblwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGl0dWxvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiYW5jaG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYW5jaG8nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCIgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQycgJiYgJ2RldGFsbGUnID09IHJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmJhbmRhIFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJyAmJiAnZGV0YWxsZScgIT0gcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uYmFuZGEgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImFuY2hvSmFzcGVyTGFiZWxcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYW5jaG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiICpuZ0lmPVwiJ2RldGFsbGUnICE9IHJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLmJhbmRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cInJlc3VsdGFkb1hcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sneCcgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9DYW1wbyAhPSdDJyAmJiAnZGV0YWxsZScgIT0gcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uYmFuZGEgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cInRpdHVsb3hcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sneCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCIgKm5nSWY9XCInZGV0YWxsZScgIT0gcmVwb3J0ZU1hcmNhZG9yRGluYW1pY28uYmFuZGFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwicmVzdWx0YWRvWVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd5JyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnICYmICdkZXRhbGxlJyAhPSByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5iYW5kYSBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwidGl0dWxveVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd5JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhQWxpbmVhY2lvblwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGlwb1JlcG9ydGVcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCIgPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbGluZWFjaW9uJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNiBsZzpjb2wtNlwiICpuZ0lmPVwicmVwb3J0ZU1hcmNhZG9yRGluYW1pY28udGlwb0NhbXBvICE9J0MnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUFsaW5lYWNpb25cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGlwb0dyYWZpY29cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCIgPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydhbGluZWFjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIiAqbmdJZj1cInJlcG9ydGVNYXJjYWRvckRpbmFtaWNvLnRpcG9EYXRvID09ICdOJyAmJiByZXBvcnRlTWFyY2Fkb3JEaW5hbWljby50aXBvQ2FtcG8gIT0nQydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhT3BlcmFjaW9uZXNcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwib3BlcmFjaW9uXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiID48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3BlcmFjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1maWVsZHNldD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMge3tyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5sbGF2ZSA/ICdnbHlwaGljb25zLXJlZnJlc2gnIDogJ2dseXBoaWNvbnMtZmxvcHB5LXNhdmUnfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7cmVwb3J0ZU1hcmNhZG9yRGluYW1pY28ubGxhdmUgPyAoJ2xpbmtfYWN0dWFsaXphcicgfCB0cmFuc2xhdGUpIDogKCdsaW5rX2d1YXJkYXInIHwgdHJhbnNsYXRlKX19XCIgKGNsaWNrKT1cImd1YXJkYXJDb2x1bW5hRGluYW1pY28oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYmluXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyZXBvcnRlTWFyY2Fkb3JEaW5hbWljby5sbGF2ZSAhPSBudWxsXCIgbGFiZWw9XCJ7eydsaW5rX2VsaW1pbmFyJyB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVsaW1pbmFyQ29sdW1uYURpbmFtaWNvKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3AtdGFiUGFuZWw+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIDwvcC10YWJWaWV3PlxyXG4gICAgPC9wLXRhYlBhbmVsPlxyXG4gICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3sncmVwb3J0ZScgfCB0cmFuc2xhdGUgfX0ge3sndGV4dG8nIHwgdHJhbnNsYXRlIH19XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuYXJjaGl2b1RleHRvXCIgc2l6ZT1cIjUwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIyMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydub21icmVhcmNoaXZvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVNlcGFyYWRvcmVzXCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLnNlcGFyYWRvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8ocmVwb3J0ZUZ1ZW50ZS5zZXBhcmFkb3IpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVUZXh0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhyZXBvcnRlRnVlbnRlLnNlcGFyYWRvcikgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZVRleHRvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIiA+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3NlcGFyYWRvcicgfCB0cmFuc2xhdGUgfX0qPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvQ2lmcmFkb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuY2lmcmFkb1RleHRvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvY2lmcmFkbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcmVmcmVzaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImFjdHVhbGl6YXJTZXBhcmFkb3IoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XHJcbiAgICAgICAgICAgIDxoMSBjbGFzcz1cInRleHQteGxcIj57eydtYXJjYWRvcmVzJyB8IHRyYW5zbGF0ZX19PC9oMT5cclxuICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgZm9udC1zZW1pYm9sZFwiIGljb249XCJwaSBwaS1wbHVzXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJudWV2b01hcmNhZG9yVGV4dG8oKVwiIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwiIXZlck51ZXZvTWFyY2Fkb3JUZXh0b1wiPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCAgbWItMVwiICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvclRleHRvXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwidmVyTnVldm9NYXJjYWRvclRleHRvID0gZmFsc2U7IGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG8gPSBmYWxzZTtcIiBsYWJlbD0gXCJ7eydsaXN0YWRvJyB8IHRyYW5zbGF0ZX19IHt7J21hcmNhZG9yZXMnIHwgdHJhbnNsYXRlfX1cIiBcclxuICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hldnJvbi1sZWZ0XCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IGZvbnQtc2VtaWJvbGQgZmxleC1zaHJpbmstMCBcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cImxpc3RhTWFyY2Fkb3Jlc1RleHRvXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxyXG4gICAgICAgICAgICBkYXRhS2V5PVwibGxhdmVUYWJsYVwiIHNlbGVjdGlvbk1vZGU9XCJzaW5nbGVcIiBcclxuICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cImxpc3RhTWFyY2Fkb3Jlc1RleHRvLmxlbmd0aFwiXHJcbiAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwibGlzdGFNYXJjYWRvcmVzVGV4dG8ubGVuZ3RoID4gMTBcIiAqbmdJZj1cIiF2ZXJOdWV2b01hcmNhZG9yVGV4dG9cIlxyXG4gICAgICAgICAgICAob25Sb3dTZWxlY3QpPVwidmVyTWFyY2Fkb3JUZXh0bygkZXZlbnQpXCIgKG9uUm93VW5zZWxlY3QpPVwidmVyTWFyY2Fkb3JUZXh0bygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJmb25kb1RhYmxhUGluY2lwYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+e3sndGlwbycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2Zvcm1hdG8nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+e3snb3JkZW4nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8dGg+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LW1hcmN0ZXh0bz5cclxuICAgICAgICAgICAgICAgIDx0ciBbcFNlbGVjdGFibGVSb3ddPVwibWFyY3RleHRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY3RleHRvLnRpcG9HcmFmaWNvIHwgcmVwb3J0ZUZ1ZW50ZVBpcGUgOiAnbGlzdGFUaXBvTWFyY2Fkb3Jlc1RleHRvJ319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjdGV4dG8ubm9tYnJlQ29sdW1uYX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjdGV4dG8uZm9ybWF0b319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjdGV4dG8uYWx0b319PC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPnt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9wLXRhYmxlPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIG10LTNcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JUZXh0b1wiPiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJtdC0zXCI+PGkgY2xhc3M9XCJnbHlwaGljb25zIGdseXBoaWNvbnMtbm90ZXNcIj48L2k+e3snZGV0YWxsZScgfCB0cmFuc2xhdGV9fTwvaDU+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvTWFyY2Fkb3JUZXh0b1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY29cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yVGV4dG8udGlwb0dyYWZpY28pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG9cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwbycgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJtYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvID09ICdEJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFDb2x1bW5hc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yVGV4dG8ucmVwb3J0ZUNvbHVtbmFcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by5yZXBvcnRlQ29sdW1uYSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLnJlcG9ydGVDb2x1bW5hKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwibWFyY2Fkb3JUZXh0by50aXBvR3JhZmljb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yVGV4dG8uZm9ybWF0b1wiIG1heGxlbmd0aD1cIjUwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLmZvcm1hdG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yVGV4dG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by5mb3JtYXRvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3ttYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvID09ICdEJyA/ICgnZm9ybWF0bycgfCB0cmFuc2xhdGUpKycqJyA6ICgnZGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlKSsnKicgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwibWFyY2Fkb3JUZXh0by50aXBvR3JhZmljbyA9PSAnRCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJtYXJjYWRvclRleHRvLmFuY2hvXCIgbWF4bGVuZ3RoPVwiMjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by5hbmNobykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclRleHRvLmFuY2hvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snYW5jaG8nIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJtYXJjYWRvclRleHRvLnRpcG9HcmFmaWNvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwibWFyY2Fkb3JUZXh0by5hbHRvXCIgbWF4bGVuZ3RoPVwiMjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JUZXh0by5hbHRvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclRleHRvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yVGV4dG8uYWx0bykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JUZXh0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29yZGVuJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiID5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMge3ttYXJjYWRvclRleHRvLmxsYXZlID8gJ2dseXBoaWNvbnMtcmVmcmVzaCcgOiAnZ2x5cGhpY29ucy1mbG9wcHktc2F2ZSd9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3ttYXJjYWRvclRleHRvLmxsYXZlID8gKCdsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlKSA6ICgnbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZSl9fVwiIChjbGljayk9XCJndWFyZGFyTWFyY2Fkb3JUZXh0bygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1iaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1hcmNhZG9yVGV4dG8ubGxhdmUgIT0gbnVsbFwiIGxhYmVsPVwie3snbGlua19lbGltaW5hcicgfCB0cmFuc2xhdGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbGltaW5hck1hcmNhZG9UZXh0bygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L3AtdGFiUGFuZWw+XHJcbiAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7eyd0YWJsYScgfCB0cmFuc2xhdGUgfX1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiID5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5ub21icmVUYWJsYVwiIG1heGxlbmd0aD1cIjQwMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydub21icmV0YWJsYScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcmVmcmVzaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiYWN0dWFsaXphcigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxwLXBpY2tMaXN0IFtzb3VyY2VdPVwibGlzdGFUYWJsYVwiIFt0YXJnZXRdPVwibGlzdGFOb1RhYmxhXCIgc291cmNlSGVhZGVyPVwiQXNvY2lhZG9cIiBzb3VyY2VGaWx0ZXJQbGFjZWhvbGRlcj1cIkFzb2NpYWRvXCJcclxuICAgICAgICAgICAgdGFyZ2V0SGVhZGVyPVwiRGVzYXNvY2lhZG9cIiBbZHJhZ2Ryb3BdPVwidHJ1ZVwiIFtyZXNwb25zaXZlXT1cInRydWVcIiB0YXJnZXRGaWx0ZXJQbGFjZWhvbGRlcj1cIkRlc2Fzb2NpYWRvXCJcclxuICAgICAgICAgICAgZmlsdGVyQnk9XCJub21icmVcIiAqbmdJZj1cImlzRnVlbnRlKClcIiAob25Tb3VyY2VSZW9yZGVyKT1cInJlb3JkZXJUYWJsYSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKG9uTW92ZUFsbFRvVGFyZ2V0KT1cIm1vdmVyQURlc2Fzb2NpYWRvVGFibGEoJGV2ZW50KVwiIChvbk1vdmVBbGxUb1NvdXJjZSk9XCJtb3ZlckFBc29jaWFkb1RhYmxhKCRldmVudClcIlxyXG4gICAgICAgICAgICAob25Nb3ZlVG9UYXJnZXQpPVwibW92ZXJBRGVzYXNvY2lhZG9UYWJsYSgkZXZlbnQpXCIgKG9uTW92ZVRvU291cmNlKT1cIm1vdmVyQUFzb2NpYWRvVGFibGEoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LXRhYmxhIHBUZW1wbGF0ZT1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7dGFibGEubm9tYnJlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9wLXBpY2tMaXN0PlxyXG4gICAgPC9wLXRhYlBhbmVsPlxyXG4gICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3snYXJjaGl2b3htbCcgfCB0cmFuc2xhdGUgfX1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtNTAgbWF4LWgtMTAwXCIgIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS50YWdFbmNhYmV6YWRvXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0YWdlbmNhYmV6YWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtNTAgbWF4LWgtMTAwXCIgIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS50YWdDaWVycmVFbmNhYmV6YWRvXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0YWdjaWVycmVlbmNhYmV6YWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPiBcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTUwIG1heC1oLTEwMFwiICBwSW5wdXRUZXh0YXJlYSBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuZXN0cnVjdHVyYVJlZ2lzdHJvXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0YWdyZWdpc3RybycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD4gXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9DaWZyYWRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5jaWZyYWRvWG1sXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvY2lmcmFkbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcmVmcmVzaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3snbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImFjdHVhbGl6YXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XHJcbiAgICAgICAgICAgIDxoMSBjbGFzcz1cInRleHQteGxcIj57eydtYXJjYWRvcmVzJyB8IHRyYW5zbGF0ZX19PC9oMT5cclxuICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgZm9udC1zZW1pYm9sZFwiIGljb249XCJwaSBwaS1wbHVzXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJudWV2b01hcmNhZG9yWE1MKClcIiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAqbmdJZj1cIiF2ZXJOdWV2b01hcmNhZG9yWE1MXCI+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kICBtYi0xXCIgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yWE1MXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwidmVyTnVldm9NYXJjYWRvclhNTCA9IGZhbHNlOyBjbGlja0d1YXJkYXJNYXJjYWRvclhNTCA9IGZhbHNlO1wiIGxhYmVsPSBcInt7J2xpc3RhZG8nIHwgdHJhbnNsYXRlfX0ge3snbWFyY2Fkb3JlcycgfCB0cmFuc2xhdGV9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGV2cm9uLWxlZnRcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgZm9udC1zZW1pYm9sZCBmbGV4LXNocmluay0wIFwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwibGlzdGFYTUxcIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXHJcbiAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiICBcclxuICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cImxpc3RhWE1MLmxlbmd0aFwiXHJcbiAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwibGlzdGFYTUwubGVuZ3RoID4gMTBcIiAqbmdJZj1cIiF2ZXJOdWV2b01hcmNhZG9yWE1MXCJcclxuICAgICAgICAgICAgKG9uUm93U2VsZWN0KT1cInZlck1hcmNhZG9yWE1MKCRldmVudClcIiAob25Sb3dVbnNlbGVjdCk9XCJ2ZXJNYXJjYWRvclhNTCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJmb25kb1RhYmxhUGluY2lwYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+e3snZGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+e3sndGlwbycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J21hcmNhZG9yJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1tYXJjdGV4dG8+XHJcbiAgICAgICAgICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cIm1hcmN0ZXh0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD57e21hcmN0ZXh0by5kZXNjcmlwY2lvbn19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjdGV4dG8udGlwbyB8IHJlcG9ydGVGdWVudGVQaXBlIDogJ2xpc3RhVGlwb0RhdG9NYXJjYWRvcmVzJ319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjdGV4dG8ubm9tYnJlQ29sdW1uYX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjdGV4dG8ubWFyY2Fkb3J9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIiBjbGFzcz1cInAtMyBmb250LW1lZGl1bSBlbXB0eW1lc3NhZ2VcIj57eydtZW5zYWpldGFibGF2YWNpYScgfCB0cmFuc2xhdGV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvcC10YWJsZT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBtdC0zXCIgKm5nSWY9XCJ2ZXJOdWV2b01hcmNhZG9yWE1MXCI+ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDxoNSBjbGFzcz1cIm10LTNcIj48aSBjbGFzcz1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1ub3Rlc1wiPjwvaT57eydkZXRhbGxlJyB8IHRyYW5zbGF0ZX19PC9oNT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiID5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLmRlc2NyaXBjaW9uXCIgbWF4bGVuZ3RoPVwiMTAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclhNTC5kZXNjcmlwY2lvbikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JYTUxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JYTUwuZGVzY3JpcGNpb24pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yWE1MXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvTWFyY2Fkb3JYTUxcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLnRpcG9cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclhNTC50aXBvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclhNTFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvclhNTC50aXBvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvclhNTFwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIlsnTUEnLCdNUiddLmluY2x1ZGVzKG1hcmNhZG9yWE1MLnRpcG8pXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLm1hcmNhZG9yXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J21hcmNhZG9yJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIm1hcmNhZG9yWE1MLnRpcG8gPT0gJ1RCJ1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJtYXJjYWRvclhNTC5tYXJjYWRvclwiIG1heGxlbmd0aD1cIjVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGFibGEnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICAqbmdJZj1cIm1hcmNhZG9yWE1MLnRpcG8gPT0gJ01BJ1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhQ29sdW1uYXNcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtYXJjYWRvclhNTC5yZXBvcnRlQ29sdW1uYVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCIgPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJtYXJjYWRvclhNTC50aXBvID09ICdNQSdcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwuZm9ybWF0b1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmb3JtYXRvJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIm1hcmNhZG9yWE1MLnRpcG8gPT0gJ01SJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiBwSW5wdXRUZXh0YXJlYSBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLnRleHRvUmVnaXN0cm9cIiA+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0ZXh0bycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIlsnTVInLCdUQiddLmluY2x1ZGVzKG1hcmNhZG9yWE1MLnRpcG8pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUZ1ZW50ZXNcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtYXJjYWRvclhNTC5mdWVudGVcIiBvcHRpb25MYWJlbD1cImRlc2NyaXBjaW9uXCIgb3B0aW9uVmFsdWU9XCJsbGF2ZVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmdWVudGUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIlsnTVInLCdUQiddLmluY2x1ZGVzKG1hcmNhZG9yWE1MLnRpcG8pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtMTUwIG1heC1oLTIwMFwiIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwibWFyY2Fkb3JYTUwuZmlsdHJvXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydmaWx0cm8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cIm1hcmNhZG9yWE1MLnRpcG8gPT0gJ1RCJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTE1MCBtYXgtaC0yMDBcIiBwSW5wdXRUZXh0YXJlYSBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yWE1MLmVzdHJ1Y3R1cmFUYWJsYVhNTFwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZXN0cnVjdHVyYXRhYmxhJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwiZ2x5cGhpY29ucyB7e21hcmNhZG9yWE1MLmxsYXZlID8gJ2dseXBoaWNvbnMtcmVmcmVzaCcgOiAnZ2x5cGhpY29ucy1mbG9wcHktc2F2ZSd9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3ttYXJjYWRvclhNTC5sbGF2ZSA/ICgnbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZSkgOiAoJ2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGUpfX1cIiAoY2xpY2spPVwiZ3VhcmRhck1hcmNhZG9yWE1MKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWJpblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibWFyY2Fkb3JYTUwubGxhdmUgIT0gbnVsbFwiIGxhYmVsPVwie3snbGlua19lbGltaW5hcicgfCB0cmFuc2xhdGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbGltaW5hck1hcmNhZG9yWE1MKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwidmVyTnVldm9NYXJjYWRvclhNTCAmJiBtYXJjYWRvclhNTC5sbGF2ZSAhPSBudWxsICYmIChtYXJjYWRvclhNTC50aXBvID09ICdNUicgfHwgbWFyY2Fkb3JYTUwudGlwbyA9PSAnVEInKVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cIm51ZXZvQ2FtcG9UYWJsYVhNTCgpXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1yaXBwbGUgcC1lbGVtZW50IHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLXNlY29uZGFyeSBtYi0yXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwibGlzdGFDYW1wb3NNYXJjYWRvclhNTFwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIiBzdHlsZUNsYXNzPVwicC1kYXRhdGFibGUtc3RyaXBlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cImxpc3RhQ2FtcG9zTWFyY2Fkb3JYTUwubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cImxpc3RhQ2FtcG9zTWFyY2Fkb3JYTUwubGVuZ3RoID4gMTBcIiBcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIiBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie2ZpcnN0fSBhbCB7bGFzdH0gZGUge3RvdGFsUmVjb3Jkc30gcmVnaXN0cm9zXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdE1vZGU9XCJyb3dcIiBkYXRhS2V5PVwibGxhdmVcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJmb25kb1RhYmxhUGluY2lwYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDMwJTtcIj57eydjYW1wbycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMzAlO1wiPnt7J21hcmNhZG9yJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAzMCU7XCI+e3snZm9ybWF0bycgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTAlXCI+IDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJUYWJsYU51ZXZvUmVnaXN0cm9cIiAqbmdJZj1cInZlclJlcG9ydGVNYXJjYWRvckRldGFsbGVYTUxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDMwJTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwuY2FtcG9GdWVudGVcIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wb01hcmNhZG9ySW5zZXJ0YXJYTUwuY2FtcG9GdWVudGUpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLmNhbXBvRnVlbnRlKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAzMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLm1hcmNhZG9yXCIgc3R5bGU9XCJ3aWR0aDogLXdlYmtpdC1maWxsLWF2YWlsYWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG9NYXJjYWRvckluc2VydGFyWE1MLm1hcmNhZG9yKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvTWFyY2Fkb3JJbnNlcnRhclhNTC5tYXJjYWRvcikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMzAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvTWFyY2Fkb3JJbnNlcnRhclhNTC5mb3JtYXRvXCIgc3R5bGU9XCJ3aWR0aDogLXdlYmtpdC1maWxsLWF2YWlsYWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMTAlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktY2hlY2tcIiAoY2xpY2spPVwiYWdyZWdhckNhbXBvTWFyY2Fkb3JYTUwoY2FtcG9NYXJjYWRvckluc2VydGFyWE1MKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tc3VjY2VzcyBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ2ZXJSZXBvcnRlTWFyY2Fkb3JEZXRhbGxlWE1MID0gZmFsc2VcIiBpY29uPVwicGkgcGktdGltZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWRhbmdlciBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWNhbXBvIGxldC1lZGl0aW5nPVwiZWRpdGluZ1wiIGxldC1yaT1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyIFtwRWRpdGFibGVSb3ddPVwiY2FtcG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDMwJTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjYW1wby5jYW1wb0Z1ZW50ZVwiIHN0eWxlPVwid2lkdGg6IC13ZWJraXQtZmlsbC1hdmFpbGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG8uY2FtcG9GdWVudGUpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhjYW1wby5jYW1wb0Z1ZW50ZSkgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDYW1wb1hNTFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIm91dHB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NhbXBvLmNhbXBvRnVlbnRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAzMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG8ubWFyY2Fkb3JcIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNhbXBvLm1hcmNhZG9yKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNhbXBvWE1MXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY2FtcG8ubWFyY2Fkb3IpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ2FtcG9YTUxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjYW1wby5tYXJjYWRvcn19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMzAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNhbXBvLmZvcm1hdG9cIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y2FtcG8uZm9ybWF0b319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0hFQ0sgR1VBUkRBUiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcFNhdmVFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hlY2tcIiAoY2xpY2spPVwiYWdyZWdhckNhbXBvTWFyY2Fkb3JYTUwoY2FtcG8pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zdWNjZXNzIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENBTkNFTEFSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwQ2FuY2VsRWRpdGFibGVSb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCIgKGNsaWNrKT1cImNhcmdhckxpc3RhQ2FtcG9NYXJjYWRvclhNTEFzeW5jKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWRhbmdlciBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFRElUQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwSW5pdEVkaXRhYmxlUm93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcGVuY2lsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1zZWNvbmRhcnkgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRUxJTUlOQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwRGVsZXRlRWRpdGFibGVSb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRyYXNoXCIgKGNsaWNrKT1cImVsaW1pbmFyQ2FtcG9NYXJjYWRvclhNTCgkZXZlbnQsY2FtcG8pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1vdXRsaW5lZCBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3AtdGFibGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L3AtdGFiUGFuZWw+XHJcbiAgICA8cC10YWJQYW5lbCBoZWFkZXI9XCJ7eydjb2x1bW5hcmlvJyB8IHRyYW5zbGF0ZSB9fVwiPlxyXG4gICAgICAgIDxwLWFjY29yZGlvbiAob25PcGVuKT1cImNhbWJpYXJUYWJDb2x1bW5hcmlvKCRldmVudClcIiA+XHJcbiAgICAgICAgICAgIDxwLWFjY29yZGlvblRhYiBbc2VsZWN0ZWRdPVwidHJ1ZVwiID5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj48aSBjbGFzcz1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1ub3Rlc1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICB7eydjb2x1bW5hc2Jhc2ljYXMnfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgZm9udC1zZW1pYm9sZFwiIGljb249XCJwaSBwaS1wbHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm51ZXZvQ29sdW1uYUJhc2ljYSgpXCIgbGFiZWw9XCJ7eydsaW5rX251ZXZvJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhdmVyTnVldm9SZXBvcnRlQ29sdW1uYXJpb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cInZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cInZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW8gPSBmYWxzZTsgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW8gPSBmYWxzZTtcIiBsYWJlbD0gXCJ7eydsaXN0YWRvJyB8IHRyYW5zbGF0ZX19IHt7J2NvbHVtbmFzYmFzaWNhcycgfCB0cmFuc2xhdGV9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkIGZsZXgtc2hyaW5rLTAgXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJsaXN0YVJlcG9ydGVDb2x1bW5hcmlvXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiICBcclxuICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibGlzdGFSZXBvcnRlQ29sdW1uYXJpby5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwibGlzdGFSZXBvcnRlQ29sdW1uYXJpby5sZW5ndGggPiAxMFwiICpuZ0lmPVwiIXZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJSZXBvcnRlQ29sdW1uYXJpbygkZXZlbnQpXCIgKG9uUm93VW5zZWxlY3QpPVwidmVyUmVwb3J0ZUNvbHVtbmFyaW8oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J25vbWJyZScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+e3snb3JkZW4nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD57eydvcGVyYWNpb24nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtYmVhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJiZWFuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tiZWFuLm5vbWJyZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2JlYW4ubm9tYnJlQ29sdW1uYX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2JlYW4udGlwbyB8IHJlcG9ydGVDb2x1bW5hcmlvUGlwZTogJ2xpc3RhVGlwb0NvbHVtbmEnfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmVhbi5vcmRlbn19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2JlYW4ub3BlcmFjaW9uIHwgcmVwb3J0ZUNvbHVtbmFyaW9QaXBlOiAnbGlzdGFPcGVyYWNpb24nfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPnt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxyXG4gICAgICAgICAgICAgICAgPHAtZmllbGRzZXQgY2xhc3M9XCJmaWVsZHNpbnRpdHVsb1wiICAqbmdJZj1cInZlck51ZXZvUmVwb3J0ZUNvbHVtbmFyaW9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiRGV0YWxsZXJlcG9ydGUgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjb2x1bW5hQmFzaWNhLm5vbWJyZVwiIG1heGxlbmd0aD1cIjEwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm5vbWJyZSkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm5vbWJyZSkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J25vbWJyZScgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YVRpcG9Db2x1bW5hc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS50aXBvXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLnRpcG8pICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS50aXBvKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFDb2x1bW5hc1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS5yZXBvcnRlQ29sdW1uYVwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJsbGF2ZVRhYmxhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2EucmVwb3J0ZUNvbHVtbmEpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5yZXBvcnRlQ29sdW1uYSkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cImNvbHVtbmFCYXNpY2EudGlwbyA9PSAnRCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFPcGVyYWNpb25lc0NvbHVtbmFyaW9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9wZXJhY2lvbikgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9wZXJhY2lvbikgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcGVyYWNpb24nIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiaXNUaXBvQ29sdW1uYSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhT3BlcmFjaW9uZXNFeGNlbENvbHVtbmFyaW9cIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uSG9yaXpvbnRhbFwiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcGVyYWNpb25Ib3Jpem9udGFsKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uSG9yaXpvbnRhbCkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcGVyYWNpb25ob3Jpem9udGFsJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgZmlsYSBPcGVyYWNpb24gVmVydGljYWwgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJpc1RpcG9Db2x1bW5hKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS5jb2x1bW5hT3BlcmFjaW9uVmVydGljYWxcIiBtYXhsZW5ndGg9XCI1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9XCJ0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLnNsaWNlKDAsIDUpO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLmNvbHVtbmFPcGVyYWNpb25WZXJ0aWNhbCkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLmNvbHVtbmFPcGVyYWNpb25WZXJ0aWNhbCkgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2NvbHVtbmFvcGVyYWNpb24nIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gT3BlcmFjaW9uIFZlcnRpY2lhbCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cImlzVGlwb0NvbHVtbmEoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YU9wZXJhY2lvbmVzRXhjZWxDb2x1bW5hcmlvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW5hQmFzaWNhLm9wZXJhY2lvblZlcnRpY2FsXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9wZXJhY2lvblZlcnRpY2FsKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFCYXNpY2Eub3BlcmFjaW9uVmVydGljYWwpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3BlcmFjaW9udmVydGljYWwnIHwgdHJhbnNsYXRlIH19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE9yZGVuIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiICpuZ0lmPVwiaXNNb3N0cmFyT3JkZW4oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjb2x1bW5hQmFzaWNhLm9yZGVuXCIgbWF4bGVuZ3RoPVwiNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcmRlbikgJiYgY2xpY2tHdWFyZGFyUmVwb3J0ZUNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9yZGVuKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW4nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE9yZGVuYW1pZW50byBGaWxhcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIiAqbmdJZj1cImlzVGlwb0xhYmVsKCkgfHwgaXNUaXBvRmlsYSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhT3JkZW5hbWllbnRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBbc2hvd0NsZWFyXT1cInRydWVcIiAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS5vcmRlckJ5XCIgb3B0aW9uTGFiZWw9XCJub21icmVcIiBvcHRpb25WYWx1ZT1cImNvZGlnb1wiID48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmRlbmFtaWVudG8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBPcmRlbmFtaWVudG8gRGF0b3MgZGUgbGEgY29uc3VsdGEgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC00XCIgKm5nSWY9XCJpc01vc3RyYXJPcmRlbkNvbnN1bHRhKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY29sdW1uYUJhc2ljYS5vcmRlbkNvbnN1bHRhXCIgbWF4bGVuZ3RoPVwiNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQmFzaWNhLm9yZGVuQ29uc3VsdGEpICYmIGNsaWNrR3VhcmRhclJlcG9ydGVDb2x1bW5hcmlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUJhc2ljYS5vcmRlbkNvbnN1bHRhKSAmJiBjbGlja0d1YXJkYXJSZXBvcnRlQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydvcmRlbmNvbnN1bHRhJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMge3tjb2x1bW5hQmFzaWNhLmxsYXZlVGFibGEgPyAnZ2x5cGhpY29ucy1yZWZyZXNoJyA6ICdnbHlwaGljb25zLWZsb3BweS1zYXZlJ319XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7Y29sdW1uYUJhc2ljYS5sbGF2ZVRhYmxhID8gKCdsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlKSA6ICgnbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZSl9fVwiIChjbGljayk9XCJndWFyZGFyQ29sdW1uYUJhc2ljYSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYmluXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbmFCYXNpY2EubGxhdmVUYWJsYSAhPSBudWxsXCIgbGFiZWw9XCJ7eydsaW5rX2VsaW1pbmFyJyB8IHRyYW5zbGF0ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWxpbWluYXJDb2x1bW5hQmFzaWNhKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvcC1maWVsZHNldD5cclxuICAgICAgICAgICAgPC9wLWFjY29yZGlvblRhYj5cclxuICAgICAgICA8L3AtYWNjb3JkaW9uPlxyXG4gICAgICAgIDxwLWFjY29yZGlvbiAob25PcGVuKT1cImNhbWJpYXJUYWJDb2x1bW5hcmlvKCRldmVudClcIj5cclxuICAgICAgICAgICAgPHAtYWNjb3JkaW9uVGFiID5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj48aSBjbGFzcz1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1ub3Rlc1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICB7eydkYXRvc2FkaWNpb25hbGVzJ3x0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxwLWZpZWxkc2V0IGNsYXNzPVwiZmllbGRzaW50aXR1bG9cIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1pbnB1dC1oZWxwZXItc2VsZWNjaW9uLXBsYW50aWxsYSBbcmVhZG9ubHldPVwiZmFsc2VcIiBbc2hvd0RpYWxvZ109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwicmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvRXhjZWxDb2x1bW5hcmlvID8gcmVwb3J0ZUZ1ZW50ZS5hcmNoaXZvRXhjZWxDb2x1bW5hcmlvOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXh0ZW5zaW9uZXNdPVwiJ3hsczt4bHN4O3hsc20nXCIgW21vc3RyYXJvYmxpY2FyZ29dPVwidHJ1ZVwiIFtsYWJlbHJhcl09XCIncGxhbnRpbGxhJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3RlZCk9XCJvYnRlbmVyQXJjaGl2b0NvbHVtbmFyaW8oJGV2ZW50KVwiPjwvYXBwLWlucHV0LWhlbHBlci1zZWxlY2Npb24tcGxhbnRpbGxhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuaG9qYUV4Y2VsXCIgc2l6ZT1cIjI1XCIgbWF4bGVuZ3RoPVwiMjBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J25vbWJyZScgfCB0cmFuc2xhdGUgfX0ge3snZGUnIHwgdHJhbnNsYXRlIH19IHt7J2xhJyB8IHRyYW5zbGF0ZSB9fSB7eydob2phJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUgfX08L2xhYmVsPiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5maWxhSW5pY2lvQ29sdW1uYXJpb1wiIG1heGxlbmd0aD1cIjVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZmlsYWluaWNpb2NvbHVtbmFyaW8nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvQ2lmcmFkb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5jaWZyYWRvQ29sdW1uYXJpb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwibGxhdmVUYWJsYVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpcG9jaWZyYWRvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtNTAgbWF4LWgtMTAwXCIgIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwicmVwb3J0ZUZ1ZW50ZS5zaW50YXhpc0NvbHVtbmFyaW9cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snc2ludGF4aXNjb2x1bW5hcmlvJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1CT1RPTkVTLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtcmVmcmVzaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiYWN0dWFsaXphcigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3AtZmllbGRzZXQ+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMyBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgxIGNsYXNzPVwidGV4dC14bFwiPnt7J2NvbHVtbmFhZGljaW9uYWwnIHwgdHJhbnNsYXRlfX08L2gxPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5IGZvbnQtc2VtaWJvbGRcIiBpY29uPVwicGkgcGktcGx1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJudWV2YUNvbHVtbmFBZGljaW9uYWwoKVwiIGxhYmVsPVwie3snbGlua19udWV2bycgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwiIXZlck51ZXZvQ29sdW1uYUFkaWNpb25hbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cInZlck51ZXZvQ29sdW1uYUFkaWNpb25hbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSAoY2xpY2spPVwidmVyTnVldm9Db2x1bW5hQWRpY2lvbmFsID0gZmFsc2U7IGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWwgPSBmYWxzZTtcIiBsYWJlbD0gXCJ7eydsaXN0YWRvJyB8IHRyYW5zbGF0ZX19IHt7J2NvbHVtbmFhZGljaW9uYWwnIHwgdHJhbnNsYXRlfX1cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGV2cm9uLWxlZnRcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgZm9udC1zZW1pYm9sZCBmbGV4LXNocmluay0wIFwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwiY29sdW1uYXNBZGljaW9uYWxlc1wiIFtzY3JvbGxhYmxlXT1cInRydWVcIiByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhS2V5PVwibGxhdmVUYWJsYVwiIHNlbGVjdGlvbk1vZGU9XCJzaW5nbGVcIiAgXHJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiMTBcIiBbdG90YWxSZWNvcmRzXT1cImNvbHVtbmFzQWRpY2lvbmFsZXMubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cImNvbHVtbmFzQWRpY2lvbmFsZXMubGVuZ3RoID4gMTBcIiAqbmdJZj1cIiF2ZXJOdWV2b0NvbHVtbmFBZGljaW9uYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJEZXRhbGxlQWRpY2lvbmFsKCRldmVudClcIiAob25Sb3dVbnNlbGVjdCk9XCJ2ZXJEZXRhbGxlQWRpY2lvbmFsKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J25vbWJyZScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J29yZGVuJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWNvbHVtbmFhZGljaW9uYWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBbcFNlbGVjdGFibGVSb3ddPVwiY29sdW1uYWFkaWNpb25hbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7Y29sdW1uYWFkaWNpb25hbC5ub21icmV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tjb2x1bW5hYWRpY2lvbmFsLm9yZGVufX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPnt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxyXG4gICAgICAgICAgICAgICAgPHAtZmllbGRzZXQgY2xhc3M9XCJmaWVsZHNpbnRpdHVsb1wiICAqbmdJZj1cInZlck51ZXZvQ29sdW1uYUFkaWNpb25hbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTNcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNvbHVtbmFBZGljaW9uYWwubm9tYnJlXCIgbWF4bGVuZ3RoPVwiMTAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFBZGljaW9uYWwubm9tYnJlKSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5ub21icmUpICYmIGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J2FsaWFzJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtM1wiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCBbKG5nTW9kZWwpXT1cImNvbHVtbmFBZGljaW9uYWwub3JkZW5cIiBtYXhsZW5ndGg9XCI1XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5vcmRlbikgJiYgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFBZGljaW9uYWwub3JkZW4pICYmIGNsaWNrR3VhcmRhckNvbHVtbmFBZGljaW9uYWxcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snb3JkZW4nIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtvcHRpb25zXT1cImxpc3RhT3JkZW5hbWllbnRvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW5hQWRpY2lvbmFsLm9yZGVyQnlcIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiIG9wdGlvblZhbHVlPVwiY29kaWdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFBZGljaW9uYWwub3JkZXJCeSkgJiYgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbHVtbmFBZGljaW9uYWwub3JkZXJCeSkgJiYgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbFwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29yZGVuYW1pZW50bycgfCB0cmFuc2xhdGUgfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTNcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgWyhuZ01vZGVsKV09XCJjb2x1bW5hQWRpY2lvbmFsLm9yZGVuQ29uc3VsdGFcIiBtYXhsZW5ndGg9XCI1XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PVwidGhpcy52YWx1ZSA9IHRoaXMudmFsdWUucmVwbGFjZSgvW14wLTldL2csICcnKS5zbGljZSgwLCA1KTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5vcmRlbkNvbnN1bHRhKSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5vcmRlbkNvbnN1bHRhKSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J29yZGVuY29uc3VsdGEnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMlwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGwgbWluLWgtNTAgbWF4LWgtMTAwXCIgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJjb2x1bW5hQWRpY2lvbmFsLnNpbnRheGlzXCIgbWF4bGVuZ3RoPVwiNDAwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2x1bW5hQWRpY2lvbmFsLnNpbnRheGlzKSAmJiBjbGlja0d1YXJkYXJDb2x1bW5hQWRpY2lvbmFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sdW1uYUFkaWNpb25hbC5zaW50YXhpcykgJiYgY2xpY2tHdWFyZGFyQ29sdW1uYUFkaWNpb25hbFwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydzaW50YXhpcycgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUJPVE9ORVMtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiIGljb249XCJnbHlwaGljb25zIHt7Y29sdW1uYUFkaWNpb25hbC5sbGF2ZVRhYmxhID8gJ2dseXBoaWNvbnMtcmVmcmVzaCcgOiAnZ2x5cGhpY29ucy1mbG9wcHktc2F2ZSd9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7e2NvbHVtbmFBZGljaW9uYWwubGxhdmVUYWJsYSA/ICgnbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZSkgOiAoJ2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGUpfX1cIiAoY2xpY2spPVwiZ3VhcmRhckNvbHVtbmFBZGljaW9uYWwoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24tb3V0bGluZWRcIiBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLWJpblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW5hQWRpY2lvbmFsLmxsYXZlVGFibGEgIT0gbnVsbFwiIGxhYmVsPVwie3snbGlua19lbGltaW5hcicgfCB0cmFuc2xhdGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVsaW1pbmFyQ29sdW1uYUFkaWNpb25hbCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3AtZmllbGRzZXQ+XHJcbiAgICAgICAgICAgIDwvcC1hY2NvcmRpb25UYWI+XHJcbiAgICAgICAgICAgIDxwLWFjY29yZGlvblRhYiA+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+PGkgY2xhc3M9XCJnbHlwaGljb25zIGdseXBoaWNvbnMtbm90ZXNcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAge3snbWFyY2Fkb3Jlcyd8dHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgZm9udC1zZW1pYm9sZFwiIGljb249XCJwaSBwaS1wbHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvKClcIiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAqbmdJZj1cIiF2ZXJOdWV2b01hcmNhZG9yQ29sdW1uYXJpb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgIG1iLTFcIiAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIChjbGljayk9XCJ2ZXJOdWV2b01hcmNhZG9yQ29sdW1uYXJpbyA9IGZhbHNlOyBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW8gPSBmYWxzZTtcIiBsYWJlbD0gXCJ7eydsaXN0YWRvJyB8IHRyYW5zbGF0ZX19IHt7J21hcmNhZG9yJyB8IHRyYW5zbGF0ZX19XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2hldnJvbi1sZWZ0XCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IGZvbnQtc2VtaWJvbGQgZmxleC1zaHJpbmstMCBcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cIm1hcmNhZG9yZXNDb2x1bW5hcmlvXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiICBcclxuICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiIFt0b3RhbFJlY29yZHNdPVwibWFyY2Fkb3Jlc0NvbHVtbmFyaW8ubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cIm1hcmNhZG9yZXNDb2x1bW5hcmlvLmxlbmd0aCA+IDEwXCIgKm5nSWY9XCIhdmVyTnVldm9NYXJjYWRvckNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJ2ZXJEZXRhbGxlTWFyY2Fkb3JDb2x1bW5hcmlvKCRldmVudClcIiAob25Sb3dVbnNlbGVjdCk9XCJ2ZXJEZXRhbGxlTWFyY2Fkb3JDb2x1bW5hcmlvKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J25vbWJyZScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPnt7J3RpcG9tYXJjYWRvcicgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1tYXJjYWRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJtYXJjYWRvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7bWFyY2Fkb3IubWFyY2Fkb3J9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3ttYXJjYWRvci50aXBvIHwgcmVwb3J0ZUNvbHVtbmFyaW9QaXBlOiAnbGlzdGFUaXBvTWFyY2Fkb3InfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPnt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxyXG4gICAgICAgICAgICAgICAgPHAtZmllbGRzZXQgY2xhc3M9XCJmaWVsZHNpbnRpdHVsb1wiICAqbmdJZj1cInZlck51ZXZvTWFyY2Fkb3JDb2x1bW5hcmlvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkRldGFsbGVyZXBvcnRlIG10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yQ29sdW1uYXJpby5kZXNjcmlwY2lvblwiIG1heGxlbmd0aD1cIjQwMDBcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yQ29sdW1uYXJpby5kZXNjcmlwY2lvbikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JDb2x1bW5hcmlvLmRlc2NyaXBjaW9uKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW9cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snZGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCBbKG5nTW9kZWwpXT1cIm1hcmNhZG9yQ29sdW1uYXJpby5tYXJjYWRvclwiIG1heGxlbmd0aD1cIjUwXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yQ29sdW1uYXJpby5tYXJjYWRvcikgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvckNvbHVtbmFyaW8ubWFyY2Fkb3IpICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpb1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydtYXJjYWRvcicgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvTWFyY2Fkb3JDb2x1bW5hcmlvXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIiBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtYXJjYWRvckNvbHVtbmFyaW8udGlwb1wiIG9wdGlvbkxhYmVsPVwibm9tYnJlXCIgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8obWFyY2Fkb3JDb2x1bW5hcmlvLnRpcG8pICYmIGNsaWNrR3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yQ29sdW1uYXJpby50aXBvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW9cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyd0aXBvJyB8IHRyYW5zbGF0ZSB9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtMTJcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidy1mdWxsIG1pbi1oLTUwIG1heC1oLTEwMFwiIHBJbnB1dFRleHRhcmVhIFsobmdNb2RlbCldPVwibWFyY2Fkb3JDb2x1bW5hcmlvLnRleHRvUmVnaXN0cm9cIiBtYXhsZW5ndGg9XCI0MDAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKG1hcmNhZG9yQ29sdW1uYXJpby50ZXh0b1JlZ2lzdHJvKSAmJiBjbGlja0d1YXJkYXJNYXJjYWRvckNvbHVtbmFyaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3JpbyhtYXJjYWRvckNvbHVtbmFyaW8udGV4dG9SZWdpc3RybykgJiYgY2xpY2tHdWFyZGFyTWFyY2Fkb3JDb2x1bW5hcmlvXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3ZhbG9yJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTNcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgaWNvbj1cImdseXBoaWNvbnMge3ttYXJjYWRvckNvbHVtbmFyaW8ubGxhdmVUYWJsYSA/ICdnbHlwaGljb25zLXJlZnJlc2gnIDogJ2dseXBoaWNvbnMtZmxvcHB5LXNhdmUnfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3ttYXJjYWRvckNvbHVtbmFyaW8ubGxhdmVUYWJsYSA/ICgnbGlua19hY3R1YWxpemFyJyB8IHRyYW5zbGF0ZSkgOiAoJ2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGUpfX1cIiAoY2xpY2spPVwiZ3VhcmRhck1hcmNhZG9yQ29sdW1uYXJpbygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbi1vdXRsaW5lZFwiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYmluXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1hcmNhZG9yQ29sdW1uYXJpby5sbGF2ZVRhYmxhICE9IG51bGxcIiBsYWJlbD1cInt7J2xpbmtfZWxpbWluYXInIHwgdHJhbnNsYXRlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbGltaW5hck1hcmNhZG9yQ29sdW1uYXJpbygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3AtZmllbGRzZXQ+XHJcbiAgICAgICAgICAgIDwvcC1hY2NvcmRpb25UYWI+XHJcbiAgICAgICAgPC9wLWFjY29yZGlvbj5cclxuICAgIDwvcC10YWJQYW5lbD5cclxuICAgIDxwLXRhYlBhbmVsIGhlYWRlcj1cInt7J2dyYWZpY2EnIHwgdHJhbnNsYXRlIH19XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJEZXRhbGxlcmVwb3J0ZSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1mbHVpZCBwLWZvcm1ncmlkIGdyaWRcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUuY29kaWdvXCIgc2l6ZT1cIjI1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIxMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydjb2RpZ28nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJyZXBvcnRlRnVlbnRlLnRpdHVsb0dyYWZpY29cIiBzaXplPVwiMjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J3RpdHVsbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGNvbC0xMiBtZDpjb2wtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwibGlzdGFUaXBvR3JhZmljb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlcG9ydGVGdWVudGUudGlwb0dyYWZpY29cIiBvcHRpb25MYWJlbD1cIm5vbWJyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sndGlwbycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tQk9UT05FUy0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCIgKm5nSWY9XCJpc1NxbCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uLW91dGxpbmVkIGJhY2tncm91bmQtMTAwXCIgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1yZWZyZXNoXCIgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX2FjdHVhbGl6YXInIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwiZ3VhcmRhckdyYWZpY28oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibWwtMiBwLWJ1dHRvbiBwLWJ1dHRvbi1yYWlzZWRcIiBpY29uPVwicGkgcGktZXllXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eydsaW5rX3ZlcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJ2ZXJHcmFmaWNvKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPHAtdGFibGUgW3ZhbHVlXT1cInBhZ2luYWRvckNvbHVtbmFzXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIFtzY3JvbGxhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbcm93c109XCIyMFwiIFt0b3RhbFJlY29yZHNdPVwicGFnaW5hZG9yQ29sdW1uYXMubGVuZ3RoXCIgW3BhZ2luYXRvcl09XCJwYWdpbmFkb3JDb2x1bW5hcy5sZW5ndGggPiAyMFwiID5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImZvbmRvVGFibGFQaW5jaXBhbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD57eydjb2x1bW5hJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J3NpbnRheGlzJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPnt7J3RpcG8nIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+e3snYWNjaW9uJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1iZWFuPlxyXG4gICAgICAgICAgICAgICAgPHRyIFtwU2VsZWN0YWJsZVJvd109XCJiZWFuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmVhbi5ub21icmV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7YmVhbi5zaW50YXhpc319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3tiZWFuLnRpcG9EYXRvIHwgcmVwb3J0ZUZ1ZW50ZVBpcGUgOiAnbGlzdGFUaXBvRGF0byd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJsaXN0YUdyYWZpY29TZW5jaWxsb1wiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYmVhbi5ncmFmaWNvRnVlbnRlXCIgb3B0aW9uTGFiZWw9XCJub21icmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJjb2RpZ29cIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPnt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9wLXRhYmxlPiBcclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTIgbWItMlwiPlxyXG4gICAgICAgICAgICA8aDEgY2xhc3M9XCJ0ZXh0LXhsXCI+Q29sb3JlczwvaDE+XHJcbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwibnVldm9Db2xvckNhdGVnb3JpYSgpXCIgaWNvbj1cInBpIHBpLXBsdXNcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImhhYmlsaXRhQ2FtcG9cIiBjbGFzcz1cInAtcmlwcGxlIHAtZWxlbWVudCBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1zZWNvbmRhcnkgbWItMlwiPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJwYWdpbmFkb3JDb2xvcmVzR3JhZmljYVwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIiBzdHlsZUNsYXNzPVwicC1kYXRhdGFibGUtc3RyaXBlZFwiXHJcbiAgICAgICAgICAgIFtyb3dzXT1cIjEwXCIgW3RvdGFsUmVjb3Jkc109XCJwYWdpbmFkb3JDb2xvcmVzR3JhZmljYS5sZW5ndGhcIlxyXG4gICAgICAgICAgICBbcGFnaW5hdG9yXT1cInBhZ2luYWRvckNvbG9yZXNHcmFmaWNhLmxlbmd0aCA+IDEwXCIgXHJcbiAgICAgICAgICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IGFsIHtsYXN0fSBkZSB7dG90YWxSZWNvcmRzfSByZWdpc3Ryb3NcIiBcclxuICAgICAgICAgICAgZWRpdE1vZGU9XCJyb3dcIiBkYXRhS2V5PVwibGxhdmVUYWJsYVwiPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJmb25kb1RhYmxhUGluY2lwYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogNDUlXCI+e3snY2F0ZWdvcmlhJyB8IHRyYW5zbGF0ZX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogNDUlXCI+e3snY29sb3InIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxMCVcIj4gPC90aD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJUYWJsYU51ZXZvUmVnaXN0cm9cIiAqbmdJZj1cInZlckNvbG9yQ2F0ZWdvcmlhRGV0YWxsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiA0NSVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImNvbG9yQ2F0ZWdvcmlhLnRpdHVsb1wiIHN0eWxlPVwid2lkdGg6IC13ZWJraXQtZmlsbC1hdmFpbGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sb3JDYXRlZ29yaWEudGl0dWxvKSAmJiBjbGlja0d1YXJkYXJDb2xvckNhdGVnb3JpYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbG9yQ2F0ZWdvcmlhLnRpdHVsbykgJiYgY2xpY2tHdWFyZGFyQ29sb3JDYXRlZ29yaWFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiA0NSVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiAxMDAlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jb2xvclBpY2tlciBbKG5nTW9kZWwpXT1cImNvbG9yQ2F0ZWdvcmlhLmJhbmRhXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiIXV0aWxzU2VydmljZS52YWxpZGFyQ2FtcG9PYmxpZ2F0b3Jpbyhjb2xvckNhdGVnb3JpYS5iYW5kYSkgJiYgY2xpY2tHdWFyZGFyQ29sb3JDYXRlZ29yaWFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sb3JDYXRlZ29yaWEuYmFuZGEpICYmIGNsaWNrR3VhcmRhckNvbG9yQ2F0ZWdvcmlhXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWNoZWNrXCIgKGNsaWNrKT1cImFncmVnYXJDb2xvckNhdGVnb3JpYShjb2xvckNhdGVnb3JpYSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tc3VjY2VzcyBtci0yIG1iLTIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInZlckNvbG9yQ2F0ZWdvcmlhRGV0YWxsZSA9IGZhbHNlXCIgaWNvbj1cInBpIHBpLXRpbWVzXCIgKGNsaWNrKT1cImNhbmNlbGFyQ29sb3JDYXRlZ29yaWEoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1kYW5nZXIgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtY29sb3IgbGV0LWVkaXRpbmc9XCJlZGl0aW5nXCIgbGV0LXJpPVwicm93SW5kZXhcIj5cclxuICAgICAgICAgICAgICAgIDx0ciBbcEVkaXRhYmxlUm93XT1cImNvbG9yXCIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiA0NSVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJjb2xvci50aXR1bG9cIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5nLWRpcnR5XT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sb3IudGl0dWxvKSAmJiBjbGlja0d1YXJkYXJDb2xvckNhdGVnb3JpYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1pbnZhbGlkXT1cIiF1dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8oY29sb3IudGl0dWxvKSAmJiBjbGlja0d1YXJkYXJDb2xvckNhdGVnb3JpYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbG9yLnRpdHVsb319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiA0NSVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jb2xvclBpY2tlciBbKG5nTW9kZWwpXT1cImNvbG9yLmJhbmRhXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbG9yLmJhbmRhKSAmJiBjbGlja0d1YXJkYXJDb2xvckNhdGVnb3JpYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCIhdXRpbHNTZXJ2aWNlLnZhbGlkYXJDYW1wb09ibGlnYXRvcmlvKGNvbG9yLmJhbmRhKSAmJiBjbGlja0d1YXJkYXJDb2xvckNhdGVnb3JpYVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtY29sb3JQaWNrZXIgWyhuZ01vZGVsKV09XCJjb2xvci5iYW5kYVwiIFtkaXNhYmxlZF09XCJ0cnVlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEwJVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENIRUNLIEdVQVJEQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcFNhdmVFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGVja1wiIChjbGljayk9XCJhZ3JlZ2FyQ29sb3JDYXRlZ29yaWEoY29sb3IpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXN1Y2Nlc3MgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDQU5DRUxBUiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwQ2FuY2VsRWRpdGFibGVSb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIiAoY2xpY2spPVwiY2FuY2VsYXJFZGljaW9uQ29sb3IoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWVsZW1lbnQgcC1yaXBwbGUgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1kYW5nZXIgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFRElUQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBJbml0RWRpdGFibGVSb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZ2x5cGhpY29ucyBnbHlwaGljb25zLXBlbmNpbFwiIFtkaXNhYmxlZF09XCJoYWJpbGl0YUNhbXBvXCIgKGNsaWNrKT1cImluaWNpYXJFZGljaW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tc2Vjb25kYXJ5IG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRUxJTUlOQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBEZWxldGVFZGl0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10cmFzaFwiIChjbGljayk9XCJlbGltaW5hckNvbG9yQ2F0ZWdvcmlhKCRldmVudCwgY29sb3IpXCIgW2Rpc2FibGVkXT1cImhhYmlsaXRhQ2FtcG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1lbGVtZW50IHAtcmlwcGxlIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tb3V0bGluZWQgbXItMiBtYi0yIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTAwXCIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+e3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L3AtdGFibGU+XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiA4NSVcIiAqbmdJZj1cImdyYWZpY2FcIj5cclxuICAgICAgICAgICAgPHAtY2hhcnQgW3R5cGVdPVwidGlwb0dyYWZpY2FcIiBbZGF0YV09XCJncmFmaWNhLmRhdG9zR3JhZmljYS5kYXRhXCIgW29wdGlvbnNdPVwiZ3JhZmljYS5kYXRvc0dyYWZpY2Eub3B0aW9uc1wiPjwvcC1jaGFydD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvcC10YWJQYW5lbD5cclxuPC9wLXRhYlZpZXc+Il19
|