sigesp 0.9.5-210331 → 0.9.6-2022-12-04
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/bundles/sigesp.umd.js +11012 -1633
- package/bundles/sigesp.umd.js.map +1 -1
- package/bundles/sigesp.umd.min.js +1 -15
- package/bundles/sigesp.umd.min.js.map +1 -1
- package/esm2015/lib/app/app.component.js +1 -1
- package/esm2015/lib/app/app.module.js +5 -1
- package/esm2015/lib/core/interfaces/Auditoria.js +49 -0
- package/esm2015/lib/core/interfaces/Banco.js +1 -1
- package/esm2015/lib/core/interfaces/Catalogo.js +1 -1
- package/esm2015/lib/core/interfaces/CentroCosto.js +1 -1
- package/esm2015/lib/core/interfaces/Clasificacion.js +1 -1
- package/esm2015/lib/core/interfaces/ComprobantePresupuestario.js +1 -1
- package/esm2015/lib/core/interfaces/Comunidad.js +1 -1
- package/esm2015/lib/core/interfaces/Configuracion.js +2 -0
- package/esm2015/lib/core/interfaces/ConfiguracionRPC.js +1 -1
- package/esm2015/lib/core/interfaces/ConfiguracionSCG.js +1 -1
- package/esm2015/lib/core/interfaces/ConfigurationSPG.js +1 -1
- package/esm2015/lib/core/interfaces/Constantes.js +350 -0
- package/esm2015/lib/core/interfaces/CuentaEgresos.js +1 -1
- package/esm2015/lib/core/interfaces/CuentaIngreso.js +1 -1
- package/esm2015/lib/core/interfaces/CuentaIngresoEstructura.js +1 -1
- package/esm2015/lib/core/interfaces/CuentaInstitucional.js +1 -1
- package/esm2015/lib/core/interfaces/CuentaPresupuesto.js +1 -1
- package/esm2015/lib/core/interfaces/CuentasPorPagar.js +1 -1
- package/esm2015/lib/core/interfaces/Documento.js +1 -1
- package/esm2015/lib/core/interfaces/EntradaSuministro.js +2 -0
- package/esm2015/lib/core/interfaces/Especialidad.js +1 -1
- package/esm2015/lib/core/interfaces/EstructuraPresupuestaria.js +1 -1
- package/esm2015/lib/core/interfaces/FuenteFinanciamiento.js +1 -1
- package/esm2015/lib/core/interfaces/IBancoCuentasPorPagar.js +2 -0
- package/esm2015/lib/core/interfaces/ITipoDepositos.js +2 -0
- package/esm2015/lib/core/interfaces/Integracion.js +1 -1
- package/esm2015/lib/core/interfaces/Lugares.js +1 -1
- package/esm2015/lib/core/interfaces/Moneda.js +1 -1
- package/esm2015/lib/core/interfaces/Nomina.js +27 -0
- package/esm2015/lib/core/interfaces/PlanUnicoCuenta.js +1 -1
- package/esm2015/lib/core/interfaces/Presupuesto.js +1 -1
- package/esm2015/lib/core/interfaces/Proveedor.js +1 -1
- package/esm2015/lib/core/interfaces/RecursosHumanos.js +4 -0
- package/esm2015/lib/core/interfaces/Request.js +1 -1
- package/esm2015/lib/core/interfaces/Response.js +1 -1
- package/esm2015/lib/core/interfaces/Seguridad.js +1 -1
- package/esm2015/lib/core/interfaces/Servicios.js +1 -1
- package/esm2015/lib/core/interfaces/Sistema.js +1 -1
- package/esm2015/lib/core/interfaces/Tributos.js +1 -1
- package/esm2015/lib/core/interfaces/UnidadTributaria.js +1 -1
- package/esm2015/lib/core/interfaces/Usuario.js +1 -1
- package/esm2015/lib/core/interfaces/UsuarioPrefijo.js +1 -1
- package/esm2015/lib/core/models/CFG/Empresa.model.js +109 -0
- package/esm2015/lib/core/models/CFG/comunidad.model.js +15 -0
- package/esm2015/lib/core/models/CFG/locations.model.js +133 -0
- package/esm2015/lib/core/models/CXP/MConceptosCXP.model.js +31 -0
- package/esm2015/lib/core/models/CXP/MTipoDocumentoCXP.model.js +41 -0
- package/esm2015/lib/core/models/RPC/clasification.model.js +14 -0
- package/esm2015/lib/core/models/RPC/configuracionRPC.model.js +23 -0
- package/esm2015/lib/core/models/RPC/document.model.js +16 -0
- package/esm2015/lib/core/models/RPC/proveedores.model.js +9 -0
- package/esm2015/lib/core/models/RPC/providerBeneficiary.model.js +154 -0
- package/esm2015/lib/core/models/RPC/specialty.model.js +12 -0
- package/esm2015/lib/core/models/SCB/bank.model.js +175 -0
- package/esm2015/lib/core/models/SCG/IncomeAccount.js +81 -0
- package/esm2015/lib/core/models/SCG/accountMarriage.model.js +11 -0
- package/esm2015/lib/core/models/SCG/centroCosto.model.js +7 -0
- package/esm2015/lib/core/models/SCG/configuracionSCG.model.js +169 -0
- package/esm2015/lib/core/models/SCG/cuentaInstitucional.model.js +26 -0
- package/esm2015/lib/core/models/SCG/planUnicoCuenta.model.js +7 -0
- package/esm2015/lib/core/models/SIV/MDetaContable.model.js +62 -0
- package/esm2015/lib/core/models/SIV/MDetaEntrada.model.js +94 -0
- package/esm2015/lib/core/models/SIV/MEntradaSuministro.model.js +132 -0
- package/esm2015/lib/core/models/SIV/MTipoDepositos.model.js +61 -0
- package/esm2015/lib/core/models/SNO/MAnticipoPrestaciones.model.js +97 -0
- package/esm2015/lib/core/models/SNO/MArchivoTxtCampo.model.js +58 -0
- package/esm2015/lib/core/models/SNO/MArchivosTxt.model.js +38 -0
- package/esm2015/lib/core/models/SNO/MAsignacionCargo.model.js +192 -0
- package/esm2015/lib/core/models/SNO/MAspectoEvaluacion.model.js +84 -0
- package/esm2015/lib/core/models/SNO/MAuditoria.model.js +58 -0
- package/esm2015/lib/core/models/SNO/MBeneficiario.model.js +81 -0
- package/esm2015/lib/core/models/SNO/MCargaMasiva.model.js +34 -0
- package/esm2015/lib/core/models/SNO/MCargosPersonal.model.js +88 -0
- package/esm2015/lib/core/models/SNO/MClasificacionObrero.mdel.js +43 -0
- package/esm2015/lib/core/models/SNO/MCodigoUnicoRac.model.js +36 -0
- package/esm2015/lib/core/models/SNO/MComponete.model.js +35 -0
- package/esm2015/lib/core/models/SNO/MConceptoVacaciones.model.js +82 -0
- package/esm2015/lib/core/models/SNO/MConceptosNomina.model.js +217 -0
- package/esm2015/lib/core/models/SNO/MConceptosPersonalNomina.model.js +94 -0
- package/esm2015/lib/core/models/SNO/MConcursante.model.js +302 -0
- package/esm2015/lib/core/models/SNO/MConcurso.model.js +234 -0
- package/esm2015/lib/core/models/SNO/MConfiguracionSNO.model.js +389 -0
- package/esm2015/lib/core/models/SNO/MConstanteNomina.model.js +64 -0
- package/esm2015/lib/core/models/SNO/MConstantePersonalNomina.model.js +76 -0
- package/esm2015/lib/core/models/SNO/MDedicacion.model.js +32 -0
- package/esm2015/lib/core/models/SNO/MDefinicionNomina.model.js +339 -0
- package/esm2015/lib/core/models/SNO/MDefinicionesBasicas.model.js +75 -0
- package/esm2015/lib/core/models/SNO/MDeudaAnterior.model.js +37 -0
- package/esm2015/lib/core/models/SNO/MEncargaduria.model.js +135 -0
- package/esm2015/lib/core/models/SNO/MEscalaEvaluacion.model.js +35 -0
- package/esm2015/lib/core/models/SNO/MEscalaEvaluacionDt.model.js +34 -0
- package/esm2015/lib/core/models/SNO/MEstructuraOrganizativa.model.js +109 -0
- package/esm2015/lib/core/models/SNO/MFamiliares.model.js +83 -0
- package/esm2015/lib/core/models/SNO/MFeriados.model.js +43 -0
- package/esm2015/lib/core/models/SNO/MFideicomiso.model.js +388 -0
- package/esm2015/lib/core/models/SNO/MFormacionAcademica.model.js +46 -0
- package/esm2015/lib/core/models/SNO/MGrado.model.js +44 -0
- package/esm2015/lib/core/models/SNO/MHojaTiempo.model.js +112 -0
- package/esm2015/lib/core/models/SNO/MImpuestoSobreRenta.model.js +70 -0
- package/esm2015/lib/core/models/SNO/MMetodoBanco.model.js +99 -0
- package/esm2015/lib/core/models/SNO/MNominaSimple.model.js +79 -0
- package/esm2015/lib/core/models/SNO/MPeriodoNomina.model.js +92 -0
- package/esm2015/lib/core/models/SNO/MPermisos.model.js +65 -0
- package/esm2015/lib/core/models/SNO/MPersonal.model.js +579 -0
- package/esm2015/lib/core/models/SNO/MPersonalJubilado.model.js +46 -0
- package/esm2015/lib/core/models/SNO/MPersonalNomina.model.js +298 -0
- package/esm2015/lib/core/models/SNO/MPlanHorario.model.js +131 -0
- package/esm2015/lib/core/models/SNO/MPlantillaConstancia.model.js +31 -0
- package/esm2015/lib/core/models/SNO/MPrestamo.model.js +212 -0
- package/esm2015/lib/core/models/SNO/MPrimaGrados.model.js +40 -0
- package/esm2015/lib/core/models/SNO/MPrimasConcepto.model.js +40 -0
- package/esm2015/lib/core/models/SNO/MRango.model.js +40 -0
- package/esm2015/lib/core/models/SNO/MReportesRRHH.js +402 -0
- package/esm2015/lib/core/models/SNO/MRequisitosConcursante.model.js +43 -0
- package/esm2015/lib/core/models/SNO/MRequisitosConcursos.model.js +34 -0
- package/esm2015/lib/core/models/SNO/MRequisitosMinimos.model.js +107 -0
- package/esm2015/lib/core/models/SNO/MSalarioHistorico.model.js +67 -0
- package/esm2015/lib/core/models/SNO/MSolicitudEmpleo.model.js +118 -0
- package/esm2015/lib/core/models/SNO/MTablaVacaciones.model.js +54 -0
- package/esm2015/lib/core/models/SNO/MTablaVacacionesPeriodo.model.js +37 -0
- package/esm2015/lib/core/models/SNO/MTabulador.model.js +90 -0
- package/esm2015/lib/core/models/SNO/MTipoEvaluacion.model.js +69 -0
- package/esm2015/lib/core/models/SNO/MTipoPersonal.model.js +31 -0
- package/esm2015/lib/core/models/SNO/MTiposEnfermedad.model.js +34 -0
- package/esm2015/lib/core/models/SNO/MTrabajoAnterior.model.js +62 -0
- package/esm2015/lib/core/models/SNO/MUbicacionFisica.model.js +58 -0
- package/esm2015/lib/core/models/SNO/MVacacionesPersonal.model.js +112 -0
- package/esm2015/lib/core/models/SNO/McargaFamiliar.model.js +49 -0
- package/esm2015/lib/core/models/SOC/charge.model.js +63 -0
- package/esm2015/lib/core/models/SOC/clause.model.js +25 -0
- package/esm2015/lib/core/models/SOC/clauseModality.model.js +29 -0
- package/esm2015/lib/core/models/SOC/configuracionSOC.model.js +56 -0
- package/esm2015/lib/core/models/SOC/service.model.js +40 -0
- package/esm2015/lib/core/models/SOC/serviceCharge.model.js +18 -22
- package/esm2015/lib/core/models/SOC/serviceType.model.js +22 -0
- package/esm2015/lib/core/models/SPG/administrativeUnit.model.js +1 -1
- package/esm2015/lib/core/models/SPG/comprobantePresupuestario.model.js +47 -0
- package/esm2015/lib/core/models/SPG/configurationSPG.model.js +55 -0
- package/esm2015/lib/core/models/SPG/cuentaPresupuesto.model.js +13 -0
- package/esm2015/lib/core/models/SPG/estructuraPresupuestaria.model.js +132 -0
- package/esm2015/lib/core/models/SPG/expensiveAccount.model.js +40 -0
- package/esm2015/lib/core/models/SPG/fuenteFinanciamiento.model.js +10 -0
- package/esm2015/lib/core/models/SPG/incomeStructureAccount.model.js +81 -0
- package/esm2015/lib/core/models/SPG/organizationType.model.js +12 -0
- package/esm2015/lib/core/models/SSS/component.model.js +1 -1
- package/esm2015/lib/core/models/SSS/group.model.js +2 -2
- package/esm2015/lib/core/models/SSS/log.model.js +29 -0
- package/esm2015/lib/core/models/SSS/securityConfiguration.model.js +20 -0
- package/esm2015/lib/core/models/SSS/sistema.js +15 -0
- package/esm2015/lib/core/models/SSS/user.model.js +29 -0
- package/esm2015/lib/core/models/SSS/userDetail.model.js +70 -0
- package/esm2015/lib/core/models/SSS/userPermit.model.js +5 -1
- package/esm2015/lib/core/models/SSS/userPrefix.model.js +15 -0
- package/esm2015/lib/core/models/SSS/userRights.model.js +25 -1
- package/esm2015/lib/core/models/STB/deduction.model.js +78 -0
- package/esm2015/lib/core/models/STB/deductionType.model.js +20 -0
- package/esm2015/lib/core/models/STB/moneda.model.js +27 -0
- package/esm2015/lib/core/models/STB/unidadTributaria.model.js +14 -0
- package/esm2015/lib/core/models/basic-model.model.js +1 -1
- package/esm2015/lib/shared/components/catalogo/catalogo.component.js +1 -1
- package/esm2015/lib/shared/components/catalogo-doble-input/catalogo-doble-input.component.js +1 -1
- package/esm2015/lib/shared/components/catalogo-estructuras/catalogo-estructuras.component.js +1 -1
- package/esm2015/lib/shared/components/confirm/confirm.component.js +1 -1
- package/esm2015/lib/shared/components/icon/icon.component.js +1 -1
- package/esm2015/lib/shared/components/table-select/table-select.component.js +18 -3
- package/esm2015/lib/shared/material/customPaginator.js +1 -1
- package/esm2015/lib/shared/material/material.module.js +1 -1
- package/esm2015/lib/shared/pipes/iso-currency.pipe.js +1 -1
- package/esm2015/lib/shared/shared.module.js +5 -1
- package/esm2015/lib/sigesp.service.js +592 -124
- package/esm2015/lib/validation.service.js +1 -1
- package/esm2015/public-api.js +127 -41
- package/esm2015/sigesp.js +11 -11
- package/fesm2015/sigesp.js +10538 -1755
- package/fesm2015/sigesp.js.map +1 -1
- package/lib/core/interfaces/Auditoria.d.ts +18 -0
- package/lib/core/interfaces/Banco.d.ts +548 -0
- package/lib/core/interfaces/Configuracion.d.ts +34 -0
- package/lib/core/interfaces/ConfiguracionSCG.d.ts +1 -0
- package/lib/core/interfaces/Constantes.d.ts +78 -0
- package/lib/core/interfaces/CuentasPorPagar.d.ts +19 -0
- package/lib/core/interfaces/EntradaSuministro.d.ts +87 -0
- package/lib/core/interfaces/IBancoCuentasPorPagar.d.ts +186 -0
- package/lib/core/interfaces/ITipoDepositos.d.ts +17 -0
- package/lib/core/interfaces/Lugares.d.ts +8 -0
- package/lib/core/interfaces/Nomina.d.ts +500 -0
- package/lib/core/interfaces/Proveedor.d.ts +2 -1
- package/lib/core/interfaces/RecursosHumanos.d.ts +1483 -0
- package/lib/core/interfaces/Seguridad.d.ts +22 -0
- package/lib/core/interfaces/Servicios.d.ts +14 -2
- package/lib/core/interfaces/Tributos.d.ts +8 -0
- package/lib/core/interfaces/Usuario.d.ts +18 -0
- package/lib/core/models/CFG/Empresa.model.d.ts +38 -0
- package/lib/core/models/{comunidad.model.d.ts → CFG/comunidad.model.d.ts} +1 -1
- package/lib/core/models/CFG/locations.model.d.ts +46 -0
- package/lib/core/models/CXP/MConceptosCXP.model.d.ts +11 -0
- package/lib/core/models/CXP/MTipoDocumentoCXP.model.d.ts +15 -0
- package/lib/core/models/{clasification.model.d.ts → RPC/clasification.model.d.ts} +1 -1
- package/lib/core/models/{configuracionRPC.model.d.ts → RPC/configuracionRPC.model.d.ts} +1 -1
- package/lib/core/models/{document.model.d.ts → RPC/document.model.d.ts} +1 -1
- package/lib/core/models/{proveedores.model.d.ts → RPC/proveedores.model.d.ts} +1 -1
- package/lib/core/models/{providerBeneficiary.model.d.ts → RPC/providerBeneficiary.model.d.ts} +6 -2
- package/lib/core/models/{specialty.model.d.ts → RPC/specialty.model.d.ts} +1 -1
- package/lib/core/models/SCB/bank.model.d.ts +61 -0
- package/lib/core/models/{IncomeAccount.d.ts → SCG/IncomeAccount.d.ts} +1 -1
- package/lib/core/models/{accountMarriage.model.d.ts → SCG/accountMarriage.model.d.ts} +1 -1
- package/lib/core/models/{centroCosto.model.d.ts → SCG/centroCosto.model.d.ts} +1 -1
- package/lib/core/models/{configuracionSCG.model.d.ts → SCG/configuracionSCG.model.d.ts} +20 -17
- package/lib/core/models/{cuentaInstitucional.model.d.ts → SCG/cuentaInstitucional.model.d.ts} +1 -1
- package/lib/core/models/{planUnicoCuenta.model.d.ts → SCG/planUnicoCuenta.model.d.ts} +1 -1
- package/lib/core/models/SIV/MDetaContable.model.d.ts +21 -0
- package/lib/core/models/SIV/MDetaEntrada.model.d.ts +33 -0
- package/lib/core/models/SIV/MEntradaSuministro.model.d.ts +47 -0
- package/lib/core/models/SIV/MTipoDepositos.model.d.ts +21 -0
- package/lib/core/models/SNO/MAnticipoPrestaciones.model.d.ts +31 -0
- package/lib/core/models/SNO/MArchivoTxtCampo.model.d.ts +20 -0
- package/lib/core/models/SNO/MArchivosTxt.model.d.ts +14 -0
- package/lib/core/models/SNO/MAsignacionCargo.model.d.ts +73 -0
- package/lib/core/models/SNO/MAspectoEvaluacion.model.d.ts +28 -0
- package/lib/core/models/SNO/MAuditoria.model.d.ts +20 -0
- package/lib/core/models/SNO/MBeneficiario.model.d.ts +31 -0
- package/lib/core/models/SNO/MCargaMasiva.model.d.ts +12 -0
- package/lib/core/models/SNO/MCargosPersonal.model.d.ts +36 -0
- package/lib/core/models/SNO/MClasificacionObrero.mdel.d.ts +15 -0
- package/lib/core/models/SNO/MCodigoUnicoRac.model.d.ts +13 -0
- package/lib/core/models/SNO/MComponete.model.d.ts +13 -0
- package/lib/core/models/SNO/MConceptoVacaciones.model.d.ts +29 -0
- package/lib/core/models/SNO/MConceptosNomina.model.d.ts +72 -0
- package/lib/core/models/SNO/MConceptosPersonalNomina.model.d.ts +33 -0
- package/lib/core/models/SNO/MConcursante.model.d.ts +99 -0
- package/lib/core/models/SNO/MConcurso.model.d.ts +79 -0
- package/lib/core/models/SNO/MConfiguracionSNO.model.d.ts +131 -0
- package/lib/core/models/SNO/MConstanteNomina.model.d.ts +22 -0
- package/lib/core/models/SNO/MConstantePersonalNomina.model.d.ts +26 -0
- package/lib/core/models/SNO/MDedicacion.model.d.ts +12 -0
- package/lib/core/models/SNO/MDefinicionNomina.model.d.ts +129 -0
- package/lib/core/models/SNO/MDefinicionesBasicas.model.d.ts +23 -0
- package/lib/core/models/SNO/MDeudaAnterior.model.d.ts +13 -0
- package/lib/core/models/SNO/MEncargaduria.model.d.ts +46 -0
- package/lib/core/models/SNO/MEscalaEvaluacion.model.d.ts +14 -0
- package/lib/core/models/SNO/MEscalaEvaluacionDt.model.d.ts +13 -0
- package/lib/core/models/SNO/MEstructuraOrganizativa.model.d.ts +38 -0
- package/lib/core/models/SNO/MFamiliares.model.d.ts +30 -0
- package/lib/core/models/SNO/MFeriados.model.d.ts +16 -0
- package/lib/core/models/SNO/MFideicomiso.model.d.ts +135 -0
- package/lib/core/models/SNO/MFormacionAcademica.model.d.ts +17 -0
- package/lib/core/models/SNO/MGrado.model.d.ts +17 -0
- package/lib/core/models/SNO/MHojaTiempo.model.d.ts +38 -0
- package/lib/core/models/SNO/MImpuestoSobreRenta.model.d.ts +24 -0
- package/lib/core/models/SNO/MMetodoBanco.model.d.ts +33 -0
- package/lib/core/models/SNO/MNominaSimple.model.d.ts +32 -0
- package/lib/core/models/SNO/MPeriodoNomina.model.d.ts +25 -0
- package/lib/core/models/SNO/MPermisos.model.d.ts +23 -0
- package/lib/core/models/SNO/MPersonal.model.d.ts +196 -0
- package/lib/core/models/SNO/MPersonalJubilado.model.d.ts +16 -0
- package/lib/core/models/SNO/MPersonalNomina.model.d.ts +93 -0
- package/lib/core/models/SNO/MPlanHorario.model.d.ts +46 -0
- package/lib/core/models/SNO/MPlantillaConstancia.model.d.ts +11 -0
- package/lib/core/models/SNO/MPrestamo.model.d.ts +66 -0
- package/lib/core/models/SNO/MPrimaGrados.model.d.ts +14 -0
- package/lib/core/models/SNO/MPrimasConcepto.model.d.ts +14 -0
- package/lib/core/models/SNO/MRango.model.d.ts +14 -0
- package/lib/core/models/SNO/MReportesRRHH.d.ts +130 -0
- package/lib/core/models/SNO/MRequisitosConcursante.model.d.ts +15 -0
- package/lib/core/models/SNO/MRequisitosConcursos.model.d.ts +13 -0
- package/lib/core/models/SNO/MRequisitosMinimos.model.d.ts +37 -0
- package/lib/core/models/SNO/MSalarioHistorico.model.d.ts +24 -0
- package/lib/core/models/SNO/MSolicitudEmpleo.model.d.ts +41 -0
- package/lib/core/models/SNO/MTablaVacaciones.model.d.ts +14 -0
- package/lib/core/models/SNO/MTablaVacacionesPeriodo.model.d.ts +14 -0
- package/lib/core/models/SNO/MTabulador.model.d.ts +37 -0
- package/lib/core/models/SNO/MTipoEvaluacion.model.d.ts +26 -0
- package/lib/core/models/SNO/MTipoPersonal.model.d.ts +12 -0
- package/lib/core/models/SNO/MTiposEnfermedad.model.d.ts +13 -0
- package/lib/core/models/SNO/MTrabajoAnterior.model.d.ts +23 -0
- package/lib/core/models/SNO/MUbicacionFisica.model.d.ts +20 -0
- package/lib/core/models/SNO/MVacacionesPersonal.model.d.ts +39 -0
- package/lib/core/models/SNO/McargaFamiliar.model.d.ts +17 -0
- package/lib/core/models/{charge.model.d.ts → SOC/charge.model.d.ts} +2 -2
- package/lib/core/models/{clause.model.d.ts → SOC/clause.model.d.ts} +2 -2
- package/lib/core/models/{clauseModality.model.d.ts → SOC/clauseModality.model.d.ts} +2 -2
- package/lib/core/models/{configuracionSOC.model.d.ts → SOC/configuracionSOC.model.d.ts} +6 -2
- package/lib/core/models/{service.model.d.ts → SOC/service.model.d.ts} +5 -4
- package/lib/core/models/SOC/serviceCharge.model.d.ts +4 -10
- package/lib/core/models/{serviceType.model.d.ts → SOC/serviceType.model.d.ts} +2 -2
- package/lib/core/models/{comprobantePresupuestario.model.d.ts → SPG/comprobantePresupuestario.model.d.ts} +1 -1
- package/lib/core/models/{configurationSPG.model.d.ts → SPG/configurationSPG.model.d.ts} +2 -2
- package/lib/core/models/{cuentaPresupuesto.model.d.ts → SPG/cuentaPresupuesto.model.d.ts} +1 -1
- package/lib/core/models/{estructuraPresupuestaria.model.d.ts → SPG/estructuraPresupuestaria.model.d.ts} +1 -1
- package/lib/core/models/{expensiveAccount.model.d.ts → SPG/expensiveAccount.model.d.ts} +1 -1
- package/lib/core/models/{fuenteFinanciamiento.model.d.ts → SPG/fuenteFinanciamiento.model.d.ts} +1 -1
- package/lib/core/models/{incomeStructureAccount.model.d.ts → SPG/incomeStructureAccount.model.d.ts} +1 -1
- package/lib/core/models/{organizationType.model.d.ts → SPG/organizationType.model.d.ts} +1 -1
- package/lib/core/models/SSS/group.model.d.ts +1 -1
- package/lib/core/models/SSS/log.model.d.ts +15 -0
- package/lib/core/models/{securityConfiguration.model.d.ts → SSS/securityConfiguration.model.d.ts} +2 -2
- package/lib/core/models/{sistema.d.ts → SSS/sistema.d.ts} +1 -1
- package/lib/core/models/SSS/user.model.d.ts +19 -0
- package/lib/core/models/{userDetail.model.d.ts → SSS/userDetail.model.d.ts} +8 -7
- package/lib/core/models/SSS/userPermit.model.d.ts +2 -0
- package/lib/core/models/SSS/userPrefix.model.d.ts +11 -0
- package/lib/core/models/SSS/userRights.model.d.ts +8 -0
- package/lib/core/models/STB/deduction.model.d.ts +26 -0
- package/lib/core/models/{deductionType.model.d.ts → STB/deductionType.model.d.ts} +2 -2
- package/lib/core/models/{moneda.model.d.ts → STB/moneda.model.d.ts} +1 -1
- package/lib/core/models/{unidadTributaria.model.d.ts → STB/unidadTributaria.model.d.ts} +1 -1
- package/lib/shared/components/catalogo-estructuras/catalogo-estructuras.component.d.ts +1 -1
- package/lib/shared/components/table-select/table-select.component.d.ts +5 -3
- package/lib/sigesp.service.d.ts +314 -40
- package/lib/validation.service.d.ts +1 -1
- package/package.json +3 -3
- package/public-api.d.ts +127 -47
- package/sigesp.d.ts +26 -24
- package/sigesp.metadata.json +1 -1
- package/esm2015/lib/core/interfaces/Bank.js +0 -2
- package/esm2015/lib/core/models/IncomeAccount.js +0 -81
- package/esm2015/lib/core/models/SCB/bankAccount.model.js +0 -36
- package/esm2015/lib/core/models/accountMarriage.model.js +0 -11
- package/esm2015/lib/core/models/bank.model.js +0 -45
- package/esm2015/lib/core/models/centroCosto.model.js +0 -7
- package/esm2015/lib/core/models/charge.model.js +0 -63
- package/esm2015/lib/core/models/clasification.model.js +0 -14
- package/esm2015/lib/core/models/clause.model.js +0 -25
- package/esm2015/lib/core/models/clauseModality.model.js +0 -29
- package/esm2015/lib/core/models/comprobantePresupuestario.model.js +0 -47
- package/esm2015/lib/core/models/comunidad.model.js +0 -15
- package/esm2015/lib/core/models/configuracionRPC.model.js +0 -23
- package/esm2015/lib/core/models/configuracionSCG.model.js +0 -57
- package/esm2015/lib/core/models/configuracionSOC.model.js +0 -44
- package/esm2015/lib/core/models/configurationSPG.model.js +0 -55
- package/esm2015/lib/core/models/cuentaInstitucional.model.js +0 -26
- package/esm2015/lib/core/models/cuentaPresupuesto.model.js +0 -13
- package/esm2015/lib/core/models/deduction.model.js +0 -30
- package/esm2015/lib/core/models/deductionType.model.js +0 -20
- package/esm2015/lib/core/models/document.model.js +0 -16
- package/esm2015/lib/core/models/estructuraPresupuestaria.model.js +0 -132
- package/esm2015/lib/core/models/expensiveAccount.model.js +0 -40
- package/esm2015/lib/core/models/fuenteFinanciamiento.model.js +0 -10
- package/esm2015/lib/core/models/incomeStructureAccount.model.js +0 -81
- package/esm2015/lib/core/models/locations.model.js +0 -52
- package/esm2015/lib/core/models/moneda.model.js +0 -27
- package/esm2015/lib/core/models/organizationType.model.js +0 -12
- package/esm2015/lib/core/models/planUnicoCuenta.model.js +0 -7
- package/esm2015/lib/core/models/proveedores.model.js +0 -9
- package/esm2015/lib/core/models/providerBeneficiary.model.js +0 -135
- package/esm2015/lib/core/models/securityConfiguration.model.js +0 -20
- package/esm2015/lib/core/models/service.model.js +0 -37
- package/esm2015/lib/core/models/serviceType.model.js +0 -22
- package/esm2015/lib/core/models/sistema.js +0 -15
- package/esm2015/lib/core/models/specialty.model.js +0 -12
- package/esm2015/lib/core/models/unidadTributaria.model.js +0 -14
- package/esm2015/lib/core/models/user.model.js +0 -18
- package/esm2015/lib/core/models/userDetail.model.js +0 -66
- package/esm2015/lib/core/models/userPrefix.model.js +0 -11
- package/lib/core/interfaces/Bank.d.ts +0 -17
- package/lib/core/models/SCB/bankAccount.model.d.ts +0 -20
- package/lib/core/models/bank.model.d.ts +0 -26
- package/lib/core/models/deduction.model.d.ts +0 -14
- package/lib/core/models/locations.model.d.ts +0 -31
- package/lib/core/models/user.model.d.ts +0 -14
- package/lib/core/models/userPrefix.model.d.ts +0 -10
|
@@ -1,50 +1,64 @@
|
|
|
1
1
|
import { __awaiter } from "tslib";
|
|
2
|
+
import { MPersonalNomina } from './core/models/SNO/MPersonalNomina.model';
|
|
3
|
+
import { MHojaTiempo } from './core/models/SNO/MHojaTiempo.model';
|
|
2
4
|
import { Injectable } from '@angular/core';
|
|
3
|
-
import { MUsuario } from './core/models/user.model';
|
|
5
|
+
import { MUsuario } from './core/models/SSS/user.model';
|
|
4
6
|
import { HttpClient, HttpHeaders } from '@angular/common/http';
|
|
5
7
|
import { throwError } from 'rxjs';
|
|
6
|
-
import { MProveedor } from './core/models/proveedores.model';
|
|
8
|
+
import { MProveedor } from './core/models/RPC/proveedores.model';
|
|
7
9
|
import { map, catchError, retry } from 'rxjs/operators';
|
|
8
10
|
import { MatDialog } from '@angular/material/dialog';
|
|
11
|
+
import { MUsuarioPrefijo } from './core/models/SSS/userPrefix.model';
|
|
9
12
|
import { CatalogoComponent } from './shared/components/catalogo/catalogo.component';
|
|
10
|
-
import { MCuentaPresupuesto } from './core/models/cuentaPresupuesto.model';
|
|
11
|
-
import { MCuentaInstitucional } from './core/models/cuentaInstitucional.model';
|
|
12
|
-
import { MMoneda, MMonedaConfig } from './core/models/moneda.model';
|
|
13
|
-
import { MComunidad } from './core/models/comunidad.model';
|
|
13
|
+
import { MCuentaPresupuesto } from './core/models/SPG/cuentaPresupuesto.model';
|
|
14
|
+
import { MCuentaInstitucional } from './core/models/SCG/cuentaInstitucional.model';
|
|
15
|
+
import { MMoneda, MMonedaConfig } from './core/models/STB/moneda.model';
|
|
16
|
+
import { MComunidad } from './core/models/CFG/comunidad.model';
|
|
14
17
|
import { ToastrService } from 'ngx-toastr';
|
|
15
|
-
import { MUnidadTributaria } from './core/models/unidadTributaria.model';
|
|
18
|
+
import { MUnidadTributaria } from './core/models/STB/unidadTributaria.model';
|
|
16
19
|
import { ConfirmComponent } from './shared/components/confirm/confirm.component';
|
|
17
|
-
import { MConfiguracionSCG } from './core/models/configuracionSCG.model';
|
|
18
|
-
import { MPlanUnicoCuenta } from './core/models/planUnicoCuenta.model';
|
|
20
|
+
import { MConfiguracionSCG } from './core/models/SCG/configuracionSCG.model';
|
|
21
|
+
import { MPlanUnicoCuenta } from './core/models/SCG/planUnicoCuenta.model';
|
|
19
22
|
import { TableSelectComponent } from './shared/components/table-select/table-select.component';
|
|
20
|
-
import { MConfigurationSPG } from './core/models/configurationSPG.model';
|
|
21
|
-
import { MEstructuraPresupuestariaOne, MEstructuraPresupuestariaTwo, MEstructuraPresupuestariaThree, MEstructuraPresupuestariaFour, MEstructuraPresupuestariaFiveComplete, MEstructuraPresupuestariaFive, MAllStructure } from './core/models/estructuraPresupuestaria.model';
|
|
22
|
-
import { MCentroCosto } from './core/models/centroCosto.model';
|
|
23
|
-
import { MFuenteFinanciamiento } from './core/models/fuenteFinanciamiento.model';
|
|
24
|
-
import { MCuentaEgresos } from './core/models/expensiveAccount.model';
|
|
23
|
+
import { MConfigurationSPG } from './core/models/SPG/configurationSPG.model';
|
|
24
|
+
import { MEstructuraPresupuestariaOne, MEstructuraPresupuestariaTwo, MEstructuraPresupuestariaThree, MEstructuraPresupuestariaFour, MEstructuraPresupuestariaFiveComplete, MEstructuraPresupuestariaFive, MAllStructure } from './core/models/SPG/estructuraPresupuestaria.model';
|
|
25
|
+
import { MCentroCosto } from './core/models/SCG/centroCosto.model';
|
|
26
|
+
import { MFuenteFinanciamiento } from './core/models/SPG/fuenteFinanciamiento.model';
|
|
27
|
+
import { MCuentaEgresos } from './core/models/SPG/expensiveAccount.model';
|
|
25
28
|
import { CatalogoEstructurasComponent } from './shared/components/catalogo-estructuras/catalogo-estructuras.component';
|
|
26
29
|
import { CatalogoDobleInputComponent } from './shared/components/catalogo-doble-input/catalogo-doble-input.component';
|
|
27
|
-
import { MSistema } from './core/models/sistema';
|
|
28
|
-
import { MComprobantePresupuestarioEgresos, MComprobantePresupuestarioIngresos } from './core/models/comprobantePresupuestario.model';
|
|
29
|
-
import { MCuentaIngresos } from './core/models/IncomeAccount';
|
|
30
|
-
import { MIncomeStructureAccount } from './core/models/incomeStructureAccount.model';
|
|
31
|
-
import { MOrganizationType } from './core/models/organizationType.model';
|
|
32
|
-
import { MSpecialty } from './core/models/specialty.model';
|
|
33
|
-
import { MDocument } from './core/models/document.model';
|
|
34
|
-
import { MClasification } from './core/models/clasification.model';
|
|
35
|
-
import { MCountry, MState, MMunicipality, MParish } from './core/models/locations.model';
|
|
36
|
-
import { MProviderBeneficiary } from './core/models/providerBeneficiary.model';
|
|
37
|
-
import { MSigecofBank, MBank, MBankAccountType } from './core/models/bank.model';
|
|
38
|
-
import { MConfigurationRPC } from './core/models/configuracionRPC.model';
|
|
39
|
-
import { MConfigSOC } from './core/models/configuracionSOC.model';
|
|
40
|
-
import { MDeductionType } from './core/models/deductionType.model';
|
|
41
|
-
import { MCargo } from './core/models/charge.model';
|
|
42
|
-
import { MDeduction } from './core/models/deduction.model';
|
|
43
|
-
import { MConfigSSS } from './core/models/securityConfiguration.model';
|
|
30
|
+
import { MSistema } from './core/models/SSS/sistema';
|
|
31
|
+
import { MComprobantePresupuestarioEgresos, MComprobantePresupuestarioIngresos } from './core/models/SPG/comprobantePresupuestario.model';
|
|
32
|
+
import { MCuentaIngresos } from './core/models/SCG/IncomeAccount';
|
|
33
|
+
import { MIncomeStructureAccount } from './core/models/SPG/incomeStructureAccount.model';
|
|
34
|
+
import { MOrganizationType } from './core/models/SPG/organizationType.model';
|
|
35
|
+
import { MSpecialty } from './core/models/RPC/specialty.model';
|
|
36
|
+
import { MDocument } from './core/models/RPC/document.model';
|
|
37
|
+
import { MClasification } from './core/models/RPC/clasification.model';
|
|
38
|
+
import { MCountry, MState, MMunicipality, MParish, MCity } from './core/models/CFG/locations.model';
|
|
39
|
+
import { MProviderBeneficiary } from './core/models/RPC/providerBeneficiary.model';
|
|
40
|
+
import { MSigecofBank, MBank, MBankAccountType, MAgenciaBanco, MCuentaBanco } from './core/models/SCB/bank.model';
|
|
41
|
+
import { MConfigurationRPC } from './core/models/RPC/configuracionRPC.model';
|
|
42
|
+
import { MConfigSOC } from './core/models/SOC/configuracionSOC.model';
|
|
43
|
+
import { MDeductionType } from './core/models/STB/deductionType.model';
|
|
44
|
+
import { MCargo } from './core/models/SOC/charge.model';
|
|
45
|
+
import { MConceptoRetencion, MDeduction } from './core/models/STB/deduction.model';
|
|
46
|
+
import { MConfigSSS } from './core/models/SSS/securityConfiguration.model';
|
|
44
47
|
import { MAdministrativeUnit } from './core/models/SPG/administrativeUnit.model';
|
|
45
|
-
import { MCuentaBanco } from './core/models/SCB/bankAccount.model';
|
|
46
48
|
import { MComponent } from './core/models/SSS/component.model';
|
|
47
49
|
import { MServiceCharge } from './core/models/SOC/serviceCharge.model';
|
|
50
|
+
import { MEmpresa } from './core/models/CFG/Empresa.model';
|
|
51
|
+
import { MConceptosCXP } from './core/models/CXP/MConceptosCXP.model';
|
|
52
|
+
import { MTipoDocumentoCXP } from './core/models/CXP/MTipoDocumentoCXP.model';
|
|
53
|
+
import { MConfiguracionSNO } from './core/models/SNO/MConfiguracionSNO.model';
|
|
54
|
+
import { MDefinicionNomina } from './core/models/SNO/MDefinicionNomina.model';
|
|
55
|
+
import { MAsignacionCargo } from './core/models/SNO/MAsignacionCargo.model';
|
|
56
|
+
import { MNominaSimple } from './core/models/SNO/MNominaSimple.model';
|
|
57
|
+
import { MPersonal } from './core/models/SNO/MPersonal.model';
|
|
58
|
+
import { MEntradaSuministros } from './core/models/SIV/MEntradaSuministro.model';
|
|
59
|
+
import Swal from 'sweetalert2';
|
|
60
|
+
import * as CryptoJS from 'crypto-js';
|
|
61
|
+
import { MTipoDepositos } from './core/models/SIV/MTipoDepositos.model';
|
|
48
62
|
import * as i0 from "@angular/core";
|
|
49
63
|
import * as i1 from "@angular/common/http";
|
|
50
64
|
import * as i2 from "@angular/material/dialog";
|
|
@@ -77,6 +91,8 @@ export class SigespService {
|
|
|
77
91
|
this.toast = toast;
|
|
78
92
|
this.usuarioActivo = null;
|
|
79
93
|
this.currentComponent = null;
|
|
94
|
+
this.userMenu = null;
|
|
95
|
+
this.ip_adress = '127.0.0.1';
|
|
80
96
|
}
|
|
81
97
|
/**
|
|
82
98
|
* @description Valida que selo se escriban guiones y 9
|
|
@@ -238,9 +254,9 @@ export class SigespService {
|
|
|
238
254
|
yield this.getBudgetStructureFive(5).subscribe(result => {
|
|
239
255
|
data.push(...result);
|
|
240
256
|
});
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
})
|
|
257
|
+
// await this.getBudgetStructureThreeComplete(3).subscribe(result => {
|
|
258
|
+
// data.push(...result)
|
|
259
|
+
// })
|
|
244
260
|
yield resolve(data);
|
|
245
261
|
}));
|
|
246
262
|
});
|
|
@@ -464,6 +480,24 @@ export class SigespService {
|
|
|
464
480
|
return resp;
|
|
465
481
|
}));
|
|
466
482
|
}
|
|
483
|
+
/**
|
|
484
|
+
* @description Obtiene las MConfiguracionSNO de la nomina
|
|
485
|
+
* @return Observable<MConfiguracionSNO[]>
|
|
486
|
+
* @date 27-07-2021
|
|
487
|
+
*/
|
|
488
|
+
getConfigurationSNO() {
|
|
489
|
+
return this.http.get(`${this.URL}/dao/sno/configuracion_dao.php?tipo=${'configuracion'}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => {
|
|
490
|
+
if (resp.success) {
|
|
491
|
+
if (resp.data != null) {
|
|
492
|
+
resp.data = resp.data.map(e => new MConfiguracionSNO(e));
|
|
493
|
+
}
|
|
494
|
+
else {
|
|
495
|
+
resp.data = [];
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
return resp;
|
|
499
|
+
}));
|
|
500
|
+
}
|
|
467
501
|
dateToString(date) {
|
|
468
502
|
return `${date.getFullYear()}-${date.getMonth() + 1 >= 10 ? date.getMonth() + 1 : `0${date.getMonth() + 1}`}-${date.getDate() >= 10 ? date.getDate() : `0${date.getDate()}`}`;
|
|
469
503
|
}
|
|
@@ -500,16 +534,15 @@ export class SigespService {
|
|
|
500
534
|
* @description Obtiene los centros de costo
|
|
501
535
|
* @return Observable<MCentroCosto[]>
|
|
502
536
|
* @author Miguel Ramírez
|
|
537
|
+
* modificado 9-11-2022
|
|
503
538
|
*/
|
|
504
|
-
getCentroCosto() {
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
servidor: this.URL,
|
|
509
|
-
usuario: this.usuarioActivo.getInterface()
|
|
539
|
+
getCentroCosto(tipo) {
|
|
540
|
+
return this.http.get(`${this.URL}/dao/scg/centro_costo_dao.php?codigo=${tipo}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
541
|
+
if (res.success) {
|
|
542
|
+
res.data = res.data.map(e => new MCentroCosto(e));
|
|
510
543
|
}
|
|
511
|
-
|
|
512
|
-
|
|
544
|
+
return res;
|
|
545
|
+
}));
|
|
513
546
|
}
|
|
514
547
|
/**
|
|
515
548
|
* @description Obtiene los centros de costo
|
|
@@ -530,16 +563,26 @@ export class SigespService {
|
|
|
530
563
|
* @param title Título de la modal
|
|
531
564
|
* @param dataSource Data que s eva a mostrar en la tabla
|
|
532
565
|
*/
|
|
533
|
-
openDialogMultiSelect(
|
|
566
|
+
openDialogMultiSelect(
|
|
567
|
+
// columns: string[],
|
|
568
|
+
// title: string,
|
|
569
|
+
// dataSource: any[],
|
|
570
|
+
// columnNames?: string[]
|
|
571
|
+
columns, title, dataSource, columnNames = null, width = '450px', options = {
|
|
572
|
+
disableClose: false,
|
|
573
|
+
hasBackdrop: false,
|
|
574
|
+
}) {
|
|
534
575
|
let dialogRef = this.dialog.open(TableSelectComponent, {
|
|
535
576
|
data: {
|
|
536
577
|
title: title,
|
|
537
578
|
columns: columns,
|
|
538
579
|
dataSource: dataSource,
|
|
539
|
-
columnNames
|
|
580
|
+
columnNames,
|
|
540
581
|
},
|
|
541
|
-
width:
|
|
542
|
-
maxHeight: '90vh'
|
|
582
|
+
width: width,
|
|
583
|
+
maxHeight: '90vh',
|
|
584
|
+
hasBackdrop: options.hasBackdrop,
|
|
585
|
+
disableClose: options.disableClose
|
|
543
586
|
});
|
|
544
587
|
return dialogRef.afterClosed().toPromise();
|
|
545
588
|
}
|
|
@@ -576,16 +619,10 @@ export class SigespService {
|
|
|
576
619
|
* @description Obtiene la configuración de SCG
|
|
577
620
|
* @return Observable<MConfiguracionSCG[]>
|
|
578
621
|
* @author Miguel Ramírez
|
|
622
|
+
* @modifit 25-07-2021
|
|
579
623
|
*/
|
|
580
624
|
getConfigurationSCG() {
|
|
581
|
-
|
|
582
|
-
operacion: 'obtenerData',
|
|
583
|
-
sigesp_conexion: {
|
|
584
|
-
servidor: this.URL,
|
|
585
|
-
usuario: this.usuarioActivo.getInterface()
|
|
586
|
-
}
|
|
587
|
-
};
|
|
588
|
-
return this.http.post(`${this.URL}/dao/scg/configuracion_scg_dao.php`, request).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.map(element => new MConfiguracionSCG(element))));
|
|
625
|
+
return this.http.get(`${this.URL}/dao/scg/configuracion_contabilidad_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.data.map(element => new MConfiguracionSCG(element))));
|
|
589
626
|
}
|
|
590
627
|
/**
|
|
591
628
|
* @description Abre un dialog de confirmación
|
|
@@ -626,37 +663,17 @@ export class SigespService {
|
|
|
626
663
|
return formGroup.get(name);
|
|
627
664
|
}
|
|
628
665
|
/**
|
|
629
|
-
* @description
|
|
666
|
+
* @description Previene que se escriban letras en el input (Usar en keypress)
|
|
630
667
|
* @param event Evento del teclado
|
|
631
668
|
* @return boolean
|
|
632
669
|
* @author Miguel Ramírez
|
|
670
|
+
* @modificado como onlyNumero para corregir codigo, usar currency-input si quiere usar decimales
|
|
633
671
|
*/
|
|
634
672
|
onlyDecimal(event) {
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
let number = event.target.value + event.key;
|
|
638
|
-
// console.log(number);
|
|
639
|
-
if (this.onlyNumbers(event) || event.key === ',') {
|
|
640
|
-
for (let i = 0; i < number.length; i++) {
|
|
641
|
-
if (number.charAt(i) === ',') {
|
|
642
|
-
contPoint++;
|
|
643
|
-
}
|
|
644
|
-
}
|
|
645
|
-
if (contPoint > 1) {
|
|
646
|
-
return false;
|
|
647
|
-
}
|
|
648
|
-
else {
|
|
649
|
-
if (number.indexOf(',') !== -1) {
|
|
650
|
-
if (number.substring(number.indexOf(',') + 1, number.length).length > 2) {
|
|
651
|
-
return false;
|
|
652
|
-
}
|
|
653
|
-
}
|
|
654
|
-
return true;
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
else {
|
|
658
|
-
return false;
|
|
673
|
+
if (!isNaN(+event.key) && event.keyCode != 32) {
|
|
674
|
+
return true;
|
|
659
675
|
}
|
|
676
|
+
return false;
|
|
660
677
|
}
|
|
661
678
|
/**
|
|
662
679
|
* @description Previene que se escriban letras en el input (Usar en keypress)
|
|
@@ -666,7 +683,52 @@ export class SigespService {
|
|
|
666
683
|
*/
|
|
667
684
|
onlyNumbers(event) {
|
|
668
685
|
// console.log(event);
|
|
669
|
-
if (!isNaN(+event.key)
|
|
686
|
+
if (!isNaN(+event.key) && event.keyCode != 32) {
|
|
687
|
+
return true;
|
|
688
|
+
}
|
|
689
|
+
return false;
|
|
690
|
+
}
|
|
691
|
+
/**
|
|
692
|
+
* @description Permite (a-z A-Z á-ú ñÑ üÜ ',.) que se escriban numeros en el input (Usar en keypress)
|
|
693
|
+
* @param event Evento del teclado
|
|
694
|
+
* @return boolean
|
|
695
|
+
* @date 14-05-2022
|
|
696
|
+
*
|
|
697
|
+
*/
|
|
698
|
+
typeName(event) {
|
|
699
|
+
if ((event.key >= 'a' && event.key <= 'z') || (event.key >= 'A' && event.key <= 'Z') || event.key == "ñ" || event.key == "Ñ"
|
|
700
|
+
|| (event.key >= 'á' && event.key <= 'ú') || event.key >= 'ü' || event.key >= 'Ü' || event.key == "'" || event.keyCode == 32
|
|
701
|
+
|| event.key == "." || event.key == ",") {
|
|
702
|
+
return true;
|
|
703
|
+
}
|
|
704
|
+
return false;
|
|
705
|
+
}
|
|
706
|
+
/**
|
|
707
|
+
* @description Permite (0-9 a-z A-Z á-ú ñÑ üÜ ',.-_/:()%#º&$€£¥) que se escriban en el input (Usar en keypress)
|
|
708
|
+
* @param event Evento del teclado
|
|
709
|
+
* @return boolean
|
|
710
|
+
* @date 14-05-2022
|
|
711
|
+
*
|
|
712
|
+
*/
|
|
713
|
+
typeText(event) {
|
|
714
|
+
if ((event.key >= 'a' && event.key <= 'z') || (event.key >= 'A' && event.key <= 'Z') || event.key == "ñ" || event.key == "Ñ"
|
|
715
|
+
|| (event.key >= 'á' && event.key <= 'ú') || event.key == 'ü' || event.key == 'Ü' || event.key == "'" || isNaN(+event.key)
|
|
716
|
+
|| event.key == "." || event.key == "," || event.key == "&" || event.key == "_" || event.key == "-" || event.key == "#"
|
|
717
|
+
|| event.key == "º" || event.key == "$" || event.key == "(" || event.key == ")" || event.key == "%" || event.key == ' '
|
|
718
|
+
|| event.key == ':' || event.key == '/' || event.keyCode == 8364 || event.keyCode == 165 || event.keyCode == 163) {
|
|
719
|
+
return true;
|
|
720
|
+
}
|
|
721
|
+
return false;
|
|
722
|
+
}
|
|
723
|
+
/**
|
|
724
|
+
* @description Permite (0-9 a-z A-Z ñÑ .-_) que se escriban en el input (Usar en keypress)
|
|
725
|
+
* @param event Evento del teclado
|
|
726
|
+
* @return boolean
|
|
727
|
+
* @date 14-05-2022
|
|
728
|
+
*/
|
|
729
|
+
typeCode(event) {
|
|
730
|
+
if ((event.key >= 'a' && event.key <= 'z') || (event.key >= 'A' && event.key <= 'Z') || event.key == "ñ" || event.key == "Ñ"
|
|
731
|
+
|| isNaN(+event.key) || event.key == "." || event.key == "_" || event.key == "-") {
|
|
670
732
|
return true;
|
|
671
733
|
}
|
|
672
734
|
return false;
|
|
@@ -788,7 +850,7 @@ export class SigespService {
|
|
|
788
850
|
usuario: this.usuarioActivo.getInterface()
|
|
789
851
|
}
|
|
790
852
|
};
|
|
791
|
-
return this.http.post(`${this.URL}/dao/cfg/
|
|
853
|
+
return this.http.post(`${this.URL}/dao/cfg/comunidades_dao.php`, request).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.map(element => new MComunidad(element))));
|
|
792
854
|
}
|
|
793
855
|
/**
|
|
794
856
|
* @description Abre el dialog de las las monedas
|
|
@@ -797,7 +859,7 @@ export class SigespService {
|
|
|
797
859
|
*/
|
|
798
860
|
openDialogMonedas() {
|
|
799
861
|
return __awaiter(this, void 0, void 0, function* () {
|
|
800
|
-
let coins = yield this.getMonedas().toPromise();
|
|
862
|
+
let coins = yield this.getMonedas('todas').toPromise();
|
|
801
863
|
let dialogRef = this.dialog.open(CatalogoComponent, {
|
|
802
864
|
data: {
|
|
803
865
|
columns: ['codigo', 'denominacion', 'iso', 'simbolo'],
|
|
@@ -815,16 +877,13 @@ export class SigespService {
|
|
|
815
877
|
* @description Obtiene las monedas
|
|
816
878
|
* @return Observable<MMoneda[]>
|
|
817
879
|
* @author Miguel Ramírez
|
|
880
|
+
* actualizado 4-12-2022
|
|
881
|
+
* @param tipo :string {'todas','uno','actual}
|
|
882
|
+
* @param id : number
|
|
883
|
+
* @returns
|
|
818
884
|
*/
|
|
819
|
-
getMonedas() {
|
|
820
|
-
|
|
821
|
-
operacion: 'obtenerData',
|
|
822
|
-
sigesp_conexion: {
|
|
823
|
-
servidor: this.URL,
|
|
824
|
-
usuario: this.usuarioActivo.getInterface()
|
|
825
|
-
}
|
|
826
|
-
};
|
|
827
|
-
return this.http.post(`${this.URL}/dao/cfg/moneda_dao.php`, request).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.map(element => new MMoneda(element))));
|
|
885
|
+
getMonedas(tipo, id) {
|
|
886
|
+
return this.http.get(`${this.URL}/dao/cfg/monedas_dao.php?tipo=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.map(element => new MMoneda(element))));
|
|
828
887
|
}
|
|
829
888
|
/**
|
|
830
889
|
* @description Abre el dialog de las las cuentas contables (Cuentas Institucionales)
|
|
@@ -1006,8 +1065,8 @@ export class SigespService {
|
|
|
1006
1065
|
* @return Observable<IResponse>
|
|
1007
1066
|
* @author Carlos Albornoz
|
|
1008
1067
|
*/
|
|
1009
|
-
getServiceCharges() {
|
|
1010
|
-
return this.http.get(`${this.URL}/dao/soc/servicio_cargo_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1068
|
+
getServiceCharges(serviceId = null) {
|
|
1069
|
+
return this.http.get(`${this.URL}/dao/soc/servicio_cargo_dao.php${serviceId ? `?service_id=${serviceId}` : ''}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1011
1070
|
if (res.success) {
|
|
1012
1071
|
res.data = res.data.map(e => new MServiceCharge(e));
|
|
1013
1072
|
}
|
|
@@ -1015,36 +1074,62 @@ export class SigespService {
|
|
|
1015
1074
|
}));
|
|
1016
1075
|
}
|
|
1017
1076
|
/**
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1077
|
+
* @description Obtiene los paises
|
|
1078
|
+
* @return Observable<MCountry>
|
|
1079
|
+
* @author Carlos Albornoz
|
|
1080
|
+
* @modified 10-01-2022
|
|
1081
|
+
* @param codigo: Codigo del pais
|
|
1082
|
+
|
|
1083
|
+
*/
|
|
1084
|
+
getCountries(codigo) {
|
|
1085
|
+
return this.http.get(`${this.URL}/dao/cfg/paises_dao.php?codigo=${codigo}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => res.data.map(e => new MCountry(e))));
|
|
1024
1086
|
}
|
|
1025
1087
|
/**
|
|
1026
1088
|
* @description Obtiene los estados
|
|
1027
1089
|
* @return Observable<MState>
|
|
1028
1090
|
* @author Carlos Albornoz
|
|
1091
|
+
* @modificado 4-12-2022
|
|
1092
|
+
* @param codigo: Codigo del pais
|
|
1029
1093
|
*/
|
|
1030
|
-
getStates() {
|
|
1031
|
-
return this.http.get(`${this.URL}/dao/
|
|
1094
|
+
getStates(codigo) {
|
|
1095
|
+
return this.http.get(`${this.URL}/dao/cfg/estados_dao.php?codigo=${codigo}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => res.data.map(e => new MState(e))));
|
|
1032
1096
|
}
|
|
1033
1097
|
/**
|
|
1034
1098
|
* @description Obtiene los municipios
|
|
1035
1099
|
* @return Observable<MMunicipality>
|
|
1036
1100
|
* @author Carlos Albornoz
|
|
1101
|
+
* @modificado 10-01-2022
|
|
1102
|
+
* @param pais: Codigo del pais ,
|
|
1103
|
+
* @param estado: Codigo del estado
|
|
1104
|
+
* @actualizado 4-12-2022
|
|
1037
1105
|
*/
|
|
1038
|
-
getMunicipalities() {
|
|
1039
|
-
return this.http.get(`${this.URL}/dao/
|
|
1106
|
+
getMunicipalities(pais, estado) {
|
|
1107
|
+
return this.http.get(`${this.URL}/dao/cfg/municipios_dao.php?pais=${pais}&estado=${estado}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => res.data.map(e => new MMunicipality(e))));
|
|
1040
1108
|
}
|
|
1041
1109
|
/**
|
|
1042
1110
|
* @description Obtiene las parroquias
|
|
1043
1111
|
* @return Observable<MParish>
|
|
1044
1112
|
* @author Carlos Albornoz
|
|
1113
|
+
* @modificado 10-01-2022
|
|
1114
|
+
* @param pais: Codigo del pais
|
|
1115
|
+
* @param estado: Codigo del estado
|
|
1116
|
+
* @param municipio:codigo Municipio
|
|
1117
|
+
* @actualizado 4-12-2022
|
|
1118
|
+
|
|
1119
|
+
*/
|
|
1120
|
+
getParishes(pais, estado, municipio) {
|
|
1121
|
+
return this.http.get(`${this.URL}/dao/cfg/parroquias_dao.php?pais=${pais}&estado=${estado}&municipio=${municipio}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => res.data.map(e => new MParish(e))));
|
|
1122
|
+
}
|
|
1123
|
+
/**
|
|
1124
|
+
* @description Obtiene las ciudades
|
|
1125
|
+
* @return Observable<MParish>
|
|
1126
|
+
* @author Carlos Albornoz
|
|
1127
|
+
* @modificado 10-01-2022
|
|
1128
|
+
* @param pais: Codigo del pais
|
|
1129
|
+
|
|
1045
1130
|
*/
|
|
1046
|
-
|
|
1047
|
-
return this.http.get(`${this.URL}/dao/
|
|
1131
|
+
getCitys(pais) {
|
|
1132
|
+
return this.http.get(`${this.URL}/dao/cfg/ciudades_dao.php?pais=${pais}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => res.data.map(e => new MCity(e))));
|
|
1048
1133
|
}
|
|
1049
1134
|
/**
|
|
1050
1135
|
* @description Obtiene los sistemas activas
|
|
@@ -1058,9 +1143,10 @@ export class SigespService {
|
|
|
1058
1143
|
* @description Obtiene la moneda actual
|
|
1059
1144
|
* @return Observable<IResponse>
|
|
1060
1145
|
* @author Carlos Albornoz
|
|
1146
|
+
* @actualizado: 4-12-20222
|
|
1061
1147
|
*/
|
|
1062
1148
|
getCurrentCurrency() {
|
|
1063
|
-
return this.http.get(`${this.URL}/dao/
|
|
1149
|
+
return this.http.get(`${this.URL}/dao/cfg/moneda_dao.php?tipo={'actual'}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1064
1150
|
if (res.success) {
|
|
1065
1151
|
res.data = new MMonedaConfig(res.data);
|
|
1066
1152
|
}
|
|
@@ -1124,17 +1210,15 @@ export class SigespService {
|
|
|
1124
1210
|
* @param procede De que módulo procede
|
|
1125
1211
|
* @param codsis Código del sistema
|
|
1126
1212
|
* @return Observable<MUsuarioPrefijo[]>
|
|
1127
|
-
* @author
|
|
1213
|
+
* @author Carlos Albornoz
|
|
1128
1214
|
*/
|
|
1129
|
-
getUserPrefix(
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
servidor: this.URL,
|
|
1134
|
-
usuario: Object.assign(Object.assign({}, this.usuarioActivo.getInterface()), { procede: procede, codsis: codsis })
|
|
1215
|
+
getUserPrefix(filter = null, code = null) {
|
|
1216
|
+
return this.http.get(`${this.URL}/dao/cfg/control_numero_dao.php${filter ? `?filter=${filter}&code=${code}` : ''}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1217
|
+
if (res.success) {
|
|
1218
|
+
res.data = res.data.map(e => new MUsuarioPrefijo(e));
|
|
1135
1219
|
}
|
|
1136
|
-
|
|
1137
|
-
|
|
1220
|
+
return res;
|
|
1221
|
+
}));
|
|
1138
1222
|
}
|
|
1139
1223
|
/**
|
|
1140
1224
|
* @description Abre el dialog para buscar los proveedores
|
|
@@ -1298,17 +1382,182 @@ export class SigespService {
|
|
|
1298
1382
|
return res;
|
|
1299
1383
|
}));
|
|
1300
1384
|
}
|
|
1385
|
+
/**
|
|
1386
|
+
* @description Obtiene la los datos de Empresa
|
|
1387
|
+
* @return Observable<IResponse>
|
|
1388
|
+
* @author Dimaly Crespo
|
|
1389
|
+
*
|
|
1390
|
+
*/
|
|
1391
|
+
getCompany(tipo, id) {
|
|
1392
|
+
return this.http.get(`${this.URL}/dao/cfg/empresas_dao.php?tipo=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1393
|
+
if (res.success) {
|
|
1394
|
+
res.data = res.data.map(e => new MEmpresa(e));
|
|
1395
|
+
}
|
|
1396
|
+
return res;
|
|
1397
|
+
}));
|
|
1398
|
+
}
|
|
1399
|
+
/**
|
|
1400
|
+
* @description Obtiene los tipos de documentos registrados en CXP
|
|
1401
|
+
* @return Observable<IResponse>
|
|
1402
|
+
* @author Dimaly Crespo
|
|
1403
|
+
* @date 20-07-2021
|
|
1404
|
+
*/
|
|
1405
|
+
getTiposDocumetos() {
|
|
1406
|
+
return this.http.get(`${this.URL}/dao/cxp/tipo_documento_dao.php?operacion=${'buscar'}&existen=${'existen'}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1407
|
+
if (res.success) {
|
|
1408
|
+
res.data = res.data.map(e => new MTipoDocumentoCXP(e));
|
|
1409
|
+
}
|
|
1410
|
+
return res;
|
|
1411
|
+
}));
|
|
1412
|
+
}
|
|
1413
|
+
/**
|
|
1414
|
+
* @param get toma los valores: [ idOrdenCompra ,'recepcion','existen','codigo', 'ordenesSOC', 'op', 'art' ]
|
|
1415
|
+
* @param n codigo Documento Orden, se usa para obtener los detalles de la orden de compra, es obligatorio al combinar con la opcion get: idOrdenCompra
|
|
1416
|
+
* @description 'recepcion': Obtine las ordenes de suministro,
|
|
1417
|
+
* existe y codigo: Obtiene los codigos registrados,
|
|
1418
|
+
* ordenesSOC: obtiene las ordenes de compra,
|
|
1419
|
+
* op: obtiene las ordenes pendientes
|
|
1420
|
+
* art: obtiene los articulos
|
|
1421
|
+
* @return Observable<IResponse>
|
|
1422
|
+
* @date 3-10-2021
|
|
1423
|
+
* @returns
|
|
1424
|
+
*/
|
|
1425
|
+
getEntradaSuministros(get, n) {
|
|
1426
|
+
return this.http.get(`${this.URL}/dao/siv/entrada_suministro_dao.php?get=${get}&n=${n}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1427
|
+
if (res.success) {
|
|
1428
|
+
res.data = res.data.map(e => new MEntradaSuministros(e));
|
|
1429
|
+
}
|
|
1430
|
+
return res;
|
|
1431
|
+
}));
|
|
1432
|
+
}
|
|
1433
|
+
/**
|
|
1434
|
+
* @description Obtiene los tipos de documentos registrados en CXP
|
|
1435
|
+
* @return Observable<IResponse>
|
|
1436
|
+
* @author Dimaly Crespo
|
|
1437
|
+
* @date 20-07-2021
|
|
1438
|
+
*/
|
|
1439
|
+
getConceptosCxP() {
|
|
1440
|
+
return this.http.get(`${this.URL}/dao/cxp/concepto_dao.php?operacion=${'buscar'}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1441
|
+
if (res.success) {
|
|
1442
|
+
res.data = res.data.map(e => new MConceptosCXP(e));
|
|
1443
|
+
}
|
|
1444
|
+
return res;
|
|
1445
|
+
}));
|
|
1446
|
+
}
|
|
1447
|
+
/**
|
|
1448
|
+
* @description Obtiene los los conceptos Retencion ISRL
|
|
1449
|
+
* @return Observable<IResponse>
|
|
1450
|
+
* @author Dimaly Crespo
|
|
1451
|
+
* @date 26-07-2021
|
|
1452
|
+
*/
|
|
1453
|
+
getConceptosRetencion() {
|
|
1454
|
+
return this.http.get(`${this.URL}/dao/stb/deducciones_dao.php?code=${'conceptos'}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1455
|
+
if (res.success) {
|
|
1456
|
+
res.data = res.data.map(e => new MConceptoRetencion(e));
|
|
1457
|
+
}
|
|
1458
|
+
return res;
|
|
1459
|
+
}));
|
|
1460
|
+
}
|
|
1461
|
+
/**
|
|
1462
|
+
* @description Obtiene la configuración de RRHH y de SNO
|
|
1463
|
+
* @return Observable<IResponse>
|
|
1464
|
+
* @author Dimaly Crespo
|
|
1465
|
+
*/
|
|
1466
|
+
obtenerConfiguracionSNO() {
|
|
1467
|
+
return this.http.get(`${this.URL}/dao/sno/configuracion_dao.php?tipo=${'configuracion'}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1468
|
+
if (res.success) {
|
|
1469
|
+
if (res.data.length > 0) {
|
|
1470
|
+
res.data = res.data.map(e => new MConfiguracionSNO(e));
|
|
1471
|
+
}
|
|
1472
|
+
}
|
|
1473
|
+
return res;
|
|
1474
|
+
}));
|
|
1475
|
+
}
|
|
1476
|
+
/**
|
|
1477
|
+
*
|
|
1478
|
+
* @param tipo ['default', 'uno', 'cargos'] dafault:Todas las nominas, uno: una nomina, 'cargos': nominas por cargos
|
|
1479
|
+
* @param id :id de la nomina. Campo requerido para uno y cargos
|
|
1480
|
+
* @returns array()
|
|
1481
|
+
* @description Obtiene las nominas registradas
|
|
1482
|
+
* @return Observable<IResponse>
|
|
1483
|
+
* @date 20-10-21
|
|
1484
|
+
*
|
|
1485
|
+
*/
|
|
1486
|
+
getNomina(tipo, id) {
|
|
1487
|
+
return this.http.get(`${this.URL}/dao/sno/definicion_nomina_dao.php?tipo=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1488
|
+
if (res.success) {
|
|
1489
|
+
res.data = res.data.map(e => new MDefinicionNomina(e));
|
|
1490
|
+
}
|
|
1491
|
+
return res;
|
|
1492
|
+
}));
|
|
1493
|
+
}
|
|
1494
|
+
/**
|
|
1495
|
+
* @description Obtiene los cargos de las nomina
|
|
1496
|
+
* @param tipo ['codigo','default'] ->codigo: obtiene el proximo codigo. ->default: obtiene todos los cargos de la nomina
|
|
1497
|
+
* @param id id de la nomina
|
|
1498
|
+
* @returns array()
|
|
1499
|
+
*/
|
|
1500
|
+
getCargosNomina(tipo, id) {
|
|
1501
|
+
return this.http.get(`${this.URL}/dao/sno/asignacion_cargos_dao.php?tipo=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1502
|
+
if (res.success) {
|
|
1503
|
+
res.data = res.data.map(e => new MAsignacionCargo(e));
|
|
1504
|
+
}
|
|
1505
|
+
return res;
|
|
1506
|
+
}));
|
|
1507
|
+
}
|
|
1508
|
+
/**
|
|
1509
|
+
* @description Obtiene un personal de la nómina
|
|
1510
|
+
* @return Observable<IResponse>
|
|
1511
|
+
* @author Dimaly Crespo
|
|
1512
|
+
*/
|
|
1513
|
+
getPersonalSRH(tipo, id) {
|
|
1514
|
+
return this.http.get(`${this.URL}/dao/sno/personal_dao.php?tipo=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1515
|
+
if (res.success) {
|
|
1516
|
+
res.data = res.data.map(e => new MPersonal(e));
|
|
1517
|
+
}
|
|
1518
|
+
return res;
|
|
1519
|
+
}));
|
|
1520
|
+
}
|
|
1521
|
+
/**
|
|
1522
|
+
* @description Obtiene las agencia de banco
|
|
1523
|
+
* @return Observable<IResponse>
|
|
1524
|
+
* @author Dimaly Crespo
|
|
1525
|
+
*/
|
|
1526
|
+
getAgenciaBanco(tipo, id) {
|
|
1527
|
+
return this.http.get(`${this.URL}/dao/scb/agencia_dao.php?code=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1528
|
+
if (res.success) {
|
|
1529
|
+
res.data = res.data.map(e => new MAgenciaBanco(e));
|
|
1530
|
+
}
|
|
1531
|
+
return res;
|
|
1532
|
+
}));
|
|
1533
|
+
}
|
|
1534
|
+
/**
|
|
1535
|
+
* @description Obtiene la hojas de tiempo
|
|
1536
|
+
* @return Observable<IResponse>
|
|
1537
|
+
* @author Dimaly Crespo
|
|
1538
|
+
*/
|
|
1539
|
+
getHojaTiempo(tipo, idPersonal, idNomina) {
|
|
1540
|
+
return this.http.get(`${this.URL}/dao/sno/hoja_tiempo_dao.php?idPersonal=${idPersonal}&idNomina=${idNomina}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1541
|
+
if (res.success) {
|
|
1542
|
+
res.data = res.data.map(e => new MHojaTiempo(e));
|
|
1543
|
+
}
|
|
1544
|
+
return res;
|
|
1545
|
+
}));
|
|
1546
|
+
}
|
|
1301
1547
|
userHasRights(column) {
|
|
1302
1548
|
return this.http.get(`${this.URL}/dao/sss/derechos_usuario_dao.php?idComponent=${this.currentComponent.id}&column=${column}`, { headers: this.getHttpHeaders() });
|
|
1303
1549
|
}
|
|
1304
1550
|
/**
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1551
|
+
* @description Retorna los headers para hacer las peticiones
|
|
1552
|
+
* @params type: Tipo MIME permitido por defecto se toma application/json
|
|
1553
|
+
* @return HttpHeaders
|
|
1554
|
+
* @author Miguel Ramírez
|
|
1555
|
+
* @date-update: 15-06-2022
|
|
1556
|
+
*/
|
|
1557
|
+
getHttpHeaders(type) {
|
|
1558
|
+
!type ? type = 'application/json' : '';
|
|
1310
1559
|
const headers = new HttpHeaders({
|
|
1311
|
-
'Content-Type':
|
|
1560
|
+
'Content-Type': type,
|
|
1312
1561
|
'Authorization': `${this.usuarioActivo.token}`
|
|
1313
1562
|
});
|
|
1314
1563
|
return headers;
|
|
@@ -1355,6 +1604,32 @@ export class SigespService {
|
|
|
1355
1604
|
showToastError(message) {
|
|
1356
1605
|
this.toast.error(message);
|
|
1357
1606
|
}
|
|
1607
|
+
/**
|
|
1608
|
+
* @description Muestra un sweetalert2 de éxito
|
|
1609
|
+
* @param message Mensaje que se va a mostrar
|
|
1610
|
+
* @return void
|
|
1611
|
+
* @date 22-11-2021
|
|
1612
|
+
*/
|
|
1613
|
+
showToastSuccessSwal(message) {
|
|
1614
|
+
Swal.fire({
|
|
1615
|
+
icon: 'success',
|
|
1616
|
+
title: 'Éxito',
|
|
1617
|
+
text: message,
|
|
1618
|
+
});
|
|
1619
|
+
}
|
|
1620
|
+
/**
|
|
1621
|
+
* @description Muestra un sweetalert2 de error
|
|
1622
|
+
* @param message Mensaje que se va a mostrar
|
|
1623
|
+
* @return void
|
|
1624
|
+
* @date 22-11-2021
|
|
1625
|
+
*/
|
|
1626
|
+
showToastErrorSwal(message) {
|
|
1627
|
+
Swal.fire({
|
|
1628
|
+
icon: 'error',
|
|
1629
|
+
title: '¡Error!',
|
|
1630
|
+
text: message,
|
|
1631
|
+
});
|
|
1632
|
+
}
|
|
1358
1633
|
/**
|
|
1359
1634
|
* @description Guarda el usuario logueado en el SessionStorage
|
|
1360
1635
|
* @param user Usuario que se va a guardar en el SessionStorage
|
|
@@ -1406,9 +1681,202 @@ export class SigespService {
|
|
|
1406
1681
|
});
|
|
1407
1682
|
}
|
|
1408
1683
|
handlerError(error) {
|
|
1409
|
-
console.error(error);
|
|
1410
1684
|
return throwError('Ocurrió un error');
|
|
1411
1685
|
}
|
|
1686
|
+
/**
|
|
1687
|
+
* @description obtiene el personal segun filtro
|
|
1688
|
+
* @return Observable<IResponse>
|
|
1689
|
+
* @date 15-11-2021
|
|
1690
|
+
* @param tipo: valores ['catalogo','default','nomina']
|
|
1691
|
+
* @params dato:object {nombre:string, apellido:string, cedula.string} use para la opcion 'catalogo'
|
|
1692
|
+
*/
|
|
1693
|
+
getPersonal(tipo, dato) {
|
|
1694
|
+
return this.http.get(`${this.URL}/dao/sno/personal_dao.php?
|
|
1695
|
+
tipo=${tipo}&cedula=${dato.cedula}&nombre=${dato.nombre}&apellido=${dato.apellido}&expediente=${dato.expediente}&idTipo=${dato.tipo}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1696
|
+
if (res.success) {
|
|
1697
|
+
res.data = res.data.map(e => new MPersonal(e));
|
|
1698
|
+
}
|
|
1699
|
+
return res;
|
|
1700
|
+
}));
|
|
1701
|
+
}
|
|
1702
|
+
/**
|
|
1703
|
+
* @description obtener personal Nomina segun filtro
|
|
1704
|
+
* @return Observable<IResponse>
|
|
1705
|
+
* @date 15-11-2021
|
|
1706
|
+
* * @param tipo: valores ['catalogo','default','nomina']
|
|
1707
|
+
* @params dato:object {nombre:string, apellido:string, cedula.string} use para la opcion 'catalogo'
|
|
1708
|
+
|
|
1709
|
+
*/
|
|
1710
|
+
getPersonalNomina(tipo, dato) {
|
|
1711
|
+
return this.http.get(`${this.URL}/dao/sno/asignacion_personal_nomina_dao.php?
|
|
1712
|
+
tipo=${tipo}&cedula=${dato.cedula}&nombre=${dato.nombre}&apellido=${dato.apellido}&expediente=${dato.expediente}&idTipo=${dato.idTipo}&idNomina=${dato.idNomina}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1713
|
+
if (res.success) {
|
|
1714
|
+
res.data = res.data.map(e => new MPersonalNomina(e));
|
|
1715
|
+
}
|
|
1716
|
+
return res;
|
|
1717
|
+
}));
|
|
1718
|
+
}
|
|
1719
|
+
/**
|
|
1720
|
+
* @param idPersonal: id del personal
|
|
1721
|
+
* @param tipo: valores['nomina_personal']
|
|
1722
|
+
* @description Obtiene las nominas del personal resumida
|
|
1723
|
+
* @deprecated; 20-01-22
|
|
1724
|
+
* @returns
|
|
1725
|
+
*/
|
|
1726
|
+
getPersonalNominaResumida(idPersonal, tipo) {
|
|
1727
|
+
return this.http.get(`${this.URL}/dao/sno/personal_dao.php?idPersonal=${idPersonal}&tipo=${tipo}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1728
|
+
if (res.success) {
|
|
1729
|
+
res.data = res.data.map(e => new MNominaSimple(e));
|
|
1730
|
+
}
|
|
1731
|
+
return res;
|
|
1732
|
+
}));
|
|
1733
|
+
}
|
|
1734
|
+
/**
|
|
1735
|
+
* @description Obtiene el Json Menu para el usuario definido segun su permisologia del Sistema
|
|
1736
|
+
* @return Json data
|
|
1737
|
+
* @author Ing. Wilmer Briceno
|
|
1738
|
+
*/
|
|
1739
|
+
getPerfilNoComponent(id_usuario, sistema, nameComponent) {
|
|
1740
|
+
return this.http.get(`${this.URL}/dao/sss/derechos_usuario_dao.php?id_usuario=${id_usuario}&sistema=${sistema}&namecomponent=${nameComponent}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1741
|
+
return res;
|
|
1742
|
+
}));
|
|
1743
|
+
}
|
|
1744
|
+
/**
|
|
1745
|
+
* @description Obtiene el Json Menu para el usuario definido segun su permisologia del Sistema
|
|
1746
|
+
* @return Json data
|
|
1747
|
+
* @author Ing. Wilmer Briceno
|
|
1748
|
+
*/
|
|
1749
|
+
getJsonMenu(id_usuario, sistema) {
|
|
1750
|
+
return this.http.get(`${this.URL}/dao/sss/menu_dao.php?id_usuario=${id_usuario}&sistema=${sistema}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1751
|
+
this.userMenu = res.data;
|
|
1752
|
+
return this.userMenu;
|
|
1753
|
+
}));
|
|
1754
|
+
}
|
|
1755
|
+
/**
|
|
1756
|
+
* @description Obtiene el Json Menu para el usuario definido segun su permisologia del Sistema
|
|
1757
|
+
* @return Json data
|
|
1758
|
+
* @author Ing. Wilmer Briceno
|
|
1759
|
+
*/
|
|
1760
|
+
log(body) {
|
|
1761
|
+
return this.http.post(`${this.URL}/dao/sss/log_dao.php`, body, {
|
|
1762
|
+
headers: this.getHttpHeaders()
|
|
1763
|
+
}).pipe(map((res) => {
|
|
1764
|
+
return res;
|
|
1765
|
+
}));
|
|
1766
|
+
}
|
|
1767
|
+
/**
|
|
1768
|
+
* @name EncryptData
|
|
1769
|
+
* @description Enscripta una expresion data
|
|
1770
|
+
* @author Ing. Wilmer Briceño
|
|
1771
|
+
*/
|
|
1772
|
+
EncryptData(expresion) {
|
|
1773
|
+
const key = CryptoJS.enc.Utf8.parse("0123456789SIGESP"); // número hexadecimal de 16 dígitos como clave
|
|
1774
|
+
const iv = CryptoJS.enc.Utf8.parse('SIGESP0123456789'); // Número hexadecimal como desplazamiento de clave
|
|
1775
|
+
let srcs = CryptoJS.enc.Utf8.parse(expresion);
|
|
1776
|
+
let encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
|
|
1777
|
+
return encrypted.ciphertext.toString().toUpperCase();
|
|
1778
|
+
}
|
|
1779
|
+
/**
|
|
1780
|
+
* @name DecryptData
|
|
1781
|
+
* @description Desencripta una expresion data
|
|
1782
|
+
* @author Ing. Wilmer Briceño
|
|
1783
|
+
*/
|
|
1784
|
+
DecryptData(expresion) {
|
|
1785
|
+
const key = CryptoJS.enc.Utf8.parse("0123456789SIGESP"); // número hexadecimal de 16 dígitos como clave
|
|
1786
|
+
const iv = CryptoJS.enc.Utf8.parse('SIGESP0123456789'); // Número hexadecimal como desplazamiento de clave
|
|
1787
|
+
let encryptedHexStr = CryptoJS.enc.Hex.parse(expresion);
|
|
1788
|
+
let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
|
|
1789
|
+
let decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
|
|
1790
|
+
let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
|
|
1791
|
+
return decryptedStr.toString();
|
|
1792
|
+
}
|
|
1793
|
+
/**
|
|
1794
|
+
* @name getResponsePerfilToolbar
|
|
1795
|
+
* @description Metodo que obtiene una respuesta true o false basado en una estructura sring binanria segun
|
|
1796
|
+
* la posicion dada del toolbar. se pasa string binario que contiene 1 y 0 en representacion
|
|
1797
|
+
* de las propiestades administrador,consultar,ejecutar,imprimir etc ... cada posicion secuencial
|
|
1798
|
+
* si esta en 1 es true y 0 en false y devuleve el valor segun lo requiera el usuario:
|
|
1799
|
+
* stringbinario : '1011' y posicion es 2, por tanto se tare 0 y es false que representa opcion consultar.
|
|
1800
|
+
* Estructura string binario:
|
|
1801
|
+
* Posición :
|
|
1802
|
+
* 0. Administrador 6. Descargar 12. Reversar aprobar 18. Reversar anular contabilizado
|
|
1803
|
+
* 1. insertar 7. Ejecutar 13. Anular.
|
|
1804
|
+
* 2. Actualizar 8. Enviar 14. reversar anular
|
|
1805
|
+
* 3. consultar 9. Imprimir 15. contabilizar
|
|
1806
|
+
* 4. Eliminar 10. Visible 16. reversar contabilizar
|
|
1807
|
+
* 5. Anular 11. Aprobar 17. anular contabilizado
|
|
1808
|
+
*
|
|
1809
|
+
* @author Ing. Wilmer Briceño
|
|
1810
|
+
*/
|
|
1811
|
+
getResponsePerfilToolbar(stringbinario, position) {
|
|
1812
|
+
let binario = stringbinario.substring(position, position + 1);
|
|
1813
|
+
if (binario == "1") {
|
|
1814
|
+
return true;
|
|
1815
|
+
}
|
|
1816
|
+
return false;
|
|
1817
|
+
}
|
|
1818
|
+
/**
|
|
1819
|
+
* @description Obtiene el Ip del cliente
|
|
1820
|
+
* @return Json data
|
|
1821
|
+
* @author Ing. Wilmer Briceno
|
|
1822
|
+
*/
|
|
1823
|
+
getIPAddress() {
|
|
1824
|
+
return this.http.get("http://api.ipify.org/?format=json")
|
|
1825
|
+
.pipe(catchError((err) => {
|
|
1826
|
+
console.log('error caught in service');
|
|
1827
|
+
console.error(err);
|
|
1828
|
+
sessionStorage.setItem('ip_adress', '127.0.0.1');
|
|
1829
|
+
//Handle the error here
|
|
1830
|
+
return throwError(err); //Rethrow it back to component
|
|
1831
|
+
}));
|
|
1832
|
+
}
|
|
1833
|
+
/**
|
|
1834
|
+
* @description Obtiene el Ip del cliente
|
|
1835
|
+
* @return Json data
|
|
1836
|
+
* @author Ing. Wilmer Briceno
|
|
1837
|
+
*/
|
|
1838
|
+
setIpAdress() {
|
|
1839
|
+
this.getIPAddress().subscribe((resp) => {
|
|
1840
|
+
sessionStorage.setItem('ip_adress', resp.ip);
|
|
1841
|
+
this.ip_adress = resp.ip;
|
|
1842
|
+
});
|
|
1843
|
+
}
|
|
1844
|
+
/**
|
|
1845
|
+
* @description Obtiene el Ip del cliente
|
|
1846
|
+
* @return Json data
|
|
1847
|
+
* @author Ing. Wilmer Briceno
|
|
1848
|
+
*/
|
|
1849
|
+
getIpAdress() {
|
|
1850
|
+
this.ip_adress = sessionStorage.getItem('ip_adress');
|
|
1851
|
+
}
|
|
1852
|
+
/**
|
|
1853
|
+
* @description Obtiene el Ip del cliente
|
|
1854
|
+
* @return Json data
|
|
1855
|
+
* @dia 19-05-2022
|
|
1856
|
+
*/
|
|
1857
|
+
createAuditoria(sno) {
|
|
1858
|
+
let body = [];
|
|
1859
|
+
sno.forEach(e => { body.push(e.dataInteface()); });
|
|
1860
|
+
return this.http.post(`${this.URL}/dao/sno/seguridad_dao.php?`, body, { headers: this.getHttpHeaders() })
|
|
1861
|
+
.pipe(retry(3), catchError(this.handlerError), map((res) => { return res; }));
|
|
1862
|
+
}
|
|
1863
|
+
/**
|
|
1864
|
+
* @description Obtiene los tipos de depositos *
|
|
1865
|
+
* @param procede : procede del modulo
|
|
1866
|
+
* @param idArticulo : id del articulo
|
|
1867
|
+
* @param idUsuario : id usuario permitido
|
|
1868
|
+
* @returns
|
|
1869
|
+
* @author Javier Tovar
|
|
1870
|
+
* @date 23-11-2022
|
|
1871
|
+
*/
|
|
1872
|
+
getDepositType(procede, idArticulo, idUsuario) {
|
|
1873
|
+
return this.http.get(`${this.URL}/dao/siv/catalogo_parametrizado_dao.php?get=${procede}&id=${idArticulo}&i=${idUsuario}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1874
|
+
if (res.success) {
|
|
1875
|
+
res.data = res.data.map(e => new MTipoDepositos(e));
|
|
1876
|
+
}
|
|
1877
|
+
return res;
|
|
1878
|
+
}));
|
|
1879
|
+
}
|
|
1412
1880
|
}
|
|
1413
1881
|
SigespService.ɵprov = i0.ɵɵdefineInjectable({ factory: function SigespService_Factory() { return new SigespService(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.MatDialog), i0.ɵɵinject(i3.ToastrService)); }, token: SigespService, providedIn: "root" });
|
|
1414
1882
|
SigespService.decorators = [
|
|
@@ -1421,4 +1889,4 @@ SigespService.ctorParameters = () => [
|
|
|
1421
1889
|
{ type: MatDialog },
|
|
1422
1890
|
{ type: ToastrService }
|
|
1423
1891
|
];
|
|
1424
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnZXNwLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiQzovVXNlcnMvQ2FybG9zL0RvY3VtZW50cy9UcmFiYWpvL1NJR0VTUC9Db3JlL3Byb2plY3RzL3NpZ2VzcC9zcmMvIiwic291cmNlcyI6WyJsaWIvc2lnZXNwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQXFCLFdBQVcsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBRTlGLE9BQU8sRUFBYyxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUdyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNwRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRXpFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBQy9GLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSw0QkFBNEIsRUFBRSw4QkFBOEIsRUFBRSw2QkFBNkIsRUFBRSxxQ0FBcUMsRUFBRSw2QkFBNkIsRUFBMEMsYUFBYSxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFdFQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSx5RUFBeUUsQ0FBQztBQUV2SCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx5RUFBeUUsQ0FBQztBQUN0SCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFakQsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDdEksT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDakYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7Ozs7O0FBTXJFLE1BQU0sT0FBTyxhQUFhO0lBTXhCLHlEQUF5RDtJQUN6RCw4QkFBOEI7SUFDOUIsa0JBQWtCO0lBQ2xCLHVDQUF1QztJQUN2QywwQkFBMEI7SUFDMUIseUJBQXlCO0lBQ3pCLHlEQUF5RDtJQUN6RCwrQkFBK0I7SUFDL0Isc0JBQXNCO0lBQ3RCLGdDQUFnQztJQUNoQyxPQUFPO0lBQ1AsZUFBZTtJQUNmLGFBQWE7SUFDYixtQ0FBbUM7SUFDbkMsNEJBQTRCO0lBQzVCLE9BQU87SUFDUCxzQkFBc0I7SUFDdEIsMGFBQTBhO0lBQzFhLElBQUk7SUFDSiw4QkFBOEI7SUFDOUIsMEJBQTBCO0lBRzFCLFlBQW9CLElBQWdCLEVBQVUsTUFBaUIsRUFBVSxLQUFvQjtRQUF6RSxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUFVLFVBQUssR0FBTCxLQUFLLENBQWU7UUEzQnRGLGtCQUFhLEdBQWEsSUFBSSxDQUFDO1FBRS9CLHFCQUFnQixHQUFlLElBQUksQ0FBQztJQXlCc0QsQ0FBQztJQUVsRzs7O09BR0c7SUFDSSxrQkFBa0IsQ0FBQyxLQUFVO1FBQ2xDLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUU7WUFDMUMsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ksdUJBQXVCLENBQUMsTUFBYyxFQUFFLGFBQXFCO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQU0sR0FBRyxJQUFJLENBQUMsR0FBRyw0Q0FBNEMsRUFBRTtZQUNqRixNQUFNLEVBQUUsTUFBTTtZQUNkLGNBQWMsRUFBRSxhQUFhO1NBQzlCLEVBQUU7WUFDRCxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRTtTQUMvQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksc0NBQXNDLENBQUMsV0FBOEM7UUFDMUYsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBTSxHQUFHLElBQUksQ0FBQyxHQUFHLHFEQUFxRCxrQ0FDckYsV0FBVyxLQUFFLEVBQUUsRUFBRSxXQUFXLENBQUMsWUFBWSxLQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVEOztPQUVHO0lBQ0ksbUNBQW1DO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQXNDLEdBQUcsSUFBSSxDQUFDLEdBQUcscURBQXFELEVBQUU7WUFDMUgsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUU7U0FDL0IsQ0FBQyxDQUFDLElBQUksQ0FDTCxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQ1IsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFDN0IsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksaUNBQWlDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUMzRixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNJLHVDQUF1QyxDQUFDLFdBQStDO1FBQzVGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxxREFBcUQsa0NBQ3JGLFdBQVcsS0FBRSxFQUFFLEVBQUUsV0FBVyxDQUFDLFlBQVksS0FBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFRDs7T0FFRztJQUNJLG9DQUFvQztRQUN6QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUF1QyxHQUFHLElBQUksQ0FBQyxHQUFHLHNEQUFzRCxFQUFFO1lBQzVILE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFO1NBQy9CLENBQUMsQ0FBQyxJQUFJLENBQ0wsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQzdCLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLGtDQUFrQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FDNUYsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSSxnQ0FBZ0MsQ0FBQyxZQUFpQztRQUN2RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsa0NBQWtDLEVBQUUsWUFBWSxFQUNoRixFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7O09BR0c7SUFDSSwrQkFBK0IsQ0FBQyxZQUF5QztRQUM5RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsbUNBQW1DLEVBQUUsWUFBWSxFQUM1RixFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUMsQ0FBQzthQUNoQyxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDZixJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUM7Z0JBQ2QsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDMUM7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksd0NBQXdDLENBQUMsWUFBeUMsRUFBRSxLQUFhO1FBQ3RHLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQVksR0FBRyxJQUFJLENBQUMsR0FBRyw2Q0FBNkMsRUFBRSxZQUFZLEVBQ3RHLEVBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBQyxDQUFDO2FBQ2hDLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNmLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBQztnQkFDZCxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksdUJBQXVCLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN6RDtZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLDBCQUEwQixDQUFDLEtBQWEsRUFBRSxFQUFVO1FBQ3pELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQW1CLEdBQUcsSUFBSSxDQUFDLEdBQUc7ZUFDekMsS0FBSyxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBQyxDQUFDO2FBQzNELElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxHQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUN2RSxDQUFBO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG9DQUFvQyxDQUFDLElBQVcsRUFBRSxhQUFnQztRQUN2RixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRTtZQUM5RCxJQUFJLEVBQUU7Z0JBQ0osSUFBSTtnQkFDSixhQUFhO2FBQ2Q7WUFDRCxLQUFLLEVBQUUsT0FBTztZQUNkLFNBQVMsRUFBRSxNQUFNO1NBQ2xCLENBQUMsQ0FBQztRQUNILE9BQU8sUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksa0JBQWtCLENBQUMsZ0JBQXlCLEtBQUs7UUFDdEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBbUIsR0FBRyxJQUFJLENBQUMsR0FBRyxtQ0FDaEQsYUFBYSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFDdEMsRUFBRSxFQUFFLEVBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBQyxDQUFDO2FBQ3BDLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxHQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUN2RSxDQUFBO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0JBQ3BELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRTtvQkFDdkQsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFO3dCQUN4RCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUU7NEJBQ3RELElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQ0FDN0QsT0FBTyxDQUFDLElBQUksYUFBYSxDQUFDO29DQUN4QixZQUFZO29DQUNaLFlBQVk7b0NBQ1osY0FBYztvQ0FDZCxhQUFhO29DQUNiLGFBQWE7aUNBQ2QsQ0FBQyxDQUFDLENBQUM7NEJBQ04sQ0FBQyxDQUFDLENBQUM7d0JBQ0wsQ0FBQyxDQUFDLENBQUM7b0JBQ0wsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDVSwwQkFBMEI7O1lBQ3JDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBTyxPQUFPLEVBQUUsRUFBRTtnQkFFbkMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUVkLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFBO2dCQUN0QixDQUFDLENBQUMsQ0FBQTtnQkFDRixNQUFNLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQy9ELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQTtnQkFDdEIsQ0FBQyxDQUFDLENBQUE7Z0JBRUYsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFdEIsQ0FBQyxDQUFBLENBQUMsQ0FBQztRQUNMLENBQUM7S0FBQTtJQUVEOzs7OztPQUtHO0lBQ0kseUJBQXlCLENBQUMsWUFBbUI7UUFDbEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyw2Q0FBNkMsRUFDM0YsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLHlCQUF5QixDQUFDLFVBQTJDO1FBQzFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyw2Q0FBNkMsRUFBRSxVQUFVLEVBQ3pGLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksc0JBQXNCLENBQUMsVUFBMkM7UUFDdkUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLDZDQUE2QyxFQUFFLFVBQVUsRUFDMUYsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLHNCQUFzQixDQUFDLFFBQWdCLElBQUk7UUFDaEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsR0FBRyxJQUFJLENBQUMsR0FBRywyREFBMkQsRUFDeEUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3RDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUM3QixHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxxQ0FBcUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUM1RixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNJLDZCQUE2QixDQUFDLEtBQWM7UUFDakQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsR0FBRyxJQUFJLENBQUMsR0FBRyw4Q0FBOEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFDNUYsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3RDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUM3QixHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQ3pGLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSx5QkFBeUIsQ0FBQyxZQUFtQjtRQUNsRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLDZDQUE2QyxFQUMzRixFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0kseUJBQXlCLENBQUMsVUFBMkM7UUFDMUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLDZDQUE2QyxFQUFFLFVBQVUsRUFDekYsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxzQkFBc0IsQ0FBQyxVQUEyQztRQUN2RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsNkNBQTZDLEVBQUUsVUFBVSxFQUMxRixFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLHNCQUFzQixDQUFDLEtBQWM7UUFDMUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsR0FBRyxJQUFJLENBQUMsR0FBRyw4Q0FBOEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFDNUYsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3RDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUM3QixHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQ3pGLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSwwQkFBMEIsQ0FBQyxZQUFtQjtRQUNuRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLDZDQUE2QyxFQUMzRixFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksMEJBQTBCLENBQUMsVUFBNEM7UUFDNUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLDZDQUE2QyxFQUFFLFVBQVUsRUFDekYsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSx1QkFBdUIsQ0FBQyxVQUE0QztRQUN6RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsNkNBQTZDLEVBQUUsVUFBVSxFQUMxRixFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksK0JBQStCLENBQUMsS0FBYTtRQUNsRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixHQUFHLElBQUksQ0FBQyxHQUFHLDJEQUEyRCxFQUN4RSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDdEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQzdCLEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLHFDQUFxQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQ3hHLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSx1QkFBdUIsQ0FBQyxLQUFjO1FBQzNDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLEdBQUcsSUFBSSxDQUFDLEdBQUcsOENBQThDLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQzVGLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN0QyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQ1IsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFDN0IsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksOEJBQThCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUMxRixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksd0JBQXdCLENBQUMsWUFBbUI7UUFDakQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyw2Q0FBNkMsRUFDM0YsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksd0JBQXdCLENBQUMsU0FBeUM7UUFDdkUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLDZDQUE2QyxFQUFFLFNBQVMsRUFDeEYsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxxQkFBcUIsQ0FBQyxnQkFBZ0Q7UUFDM0UsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLDZDQUE2QyxFQUM5RSxnQkFBZ0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZELENBQUM7SUFFRDs7OztPQUlHO0lBQ0kscUJBQXFCLENBQUMsS0FBYTtRQUN4QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFpQyxHQUFHLElBQUksQ0FBQyxHQUFHLHNEQUFzRCxLQUFLLEVBQUUsRUFDN0gsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3RDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLDRCQUE0QixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUMxRixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSSx3QkFBd0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBaUMsR0FBRyxJQUFJLENBQUMsR0FBRyw2Q0FBNkMsRUFDN0csRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3RDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLDRCQUE0QixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUMxRixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksd0JBQXdCLENBQUMsWUFBbUI7UUFDakQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyw2Q0FBNkMsRUFDM0YsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksd0JBQXdCLENBQUMsU0FBeUM7UUFDdkUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLDZDQUE2QyxFQUFFLFNBQVMsRUFDeEYsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxxQkFBcUIsQ0FBQyxnQkFBZ0Q7UUFDM0UsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLDZDQUE2QyxFQUM5RSxnQkFBZ0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZELENBQUM7SUFFRDs7OztPQUlHO0lBQ0kscUJBQXFCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQWlDLEdBQUcsSUFBSSxDQUFDLEdBQUcsNkNBQTZDLEVBQzdHLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN0QyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQ1IsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDMUYsQ0FBQztJQUNOLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksbUJBQW1CO1FBRXhCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsbURBQW1ELEVBQ3RHLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN0QyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQ1IsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFDN0IsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUN4RCxDQUFDO0lBQ0osQ0FBQztJQUNEOzs7O09BSUc7SUFDSSxtQkFBbUI7UUFFeEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBb0IsR0FBRyxJQUFJLENBQUMsR0FBRyxtQ0FBbUMsRUFDdEYsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3RDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUM3QixHQUFHLENBQUMsQ0FBQyxJQUFlLEVBQUUsRUFBRTtZQUN0QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7YUFDN0M7WUFDRCxPQUFPLElBQUksQ0FBQTtRQUNiLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU0sWUFBWSxDQUFDLElBQVU7UUFDNUIsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFDMUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFDM0UsSUFDRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUM1RCxFQUFFLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFlBQVk7UUFFakIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBWSxHQUFHLElBQUksQ0FBQyxHQUFHLG1DQUFtQyxFQUM5RSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDdEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQzdCLEdBQUcsQ0FBQyxDQUFDLElBQWUsRUFBRSxFQUFFO1lBQ3RCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDaEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7YUFDdEM7WUFDRCxPQUFPLElBQUksQ0FBQTtRQUNiLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU0sYUFBYSxDQUFDLGFBQXFCLElBQUksRUFBRSxNQUFlO1FBRTdELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLEdBQUcsSUFBSSxDQUFDLEdBQUcsZ0NBQWdDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxVQUFVLEdBQzFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUM1QixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUNULEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUNuQyxDQUFDLElBQUksQ0FFSixHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDUixJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2YsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDakQ7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUNILENBQUE7SUFFSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLHVCQUF1QjtRQUM1QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUEwQixHQUFHLElBQUksQ0FBQyxHQUFHLHdDQUF3QyxFQUNqRyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDdEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQzdCLEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FDakYsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksY0FBYztRQUNuQixNQUFNLE9BQU8sR0FBYTtZQUN4QixTQUFTLEVBQUUsYUFBYTtZQUN4QixlQUFlLEVBQUU7Z0JBQ2YsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNsQixPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUU7YUFDM0M7U0FDRixDQUFBO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBaUIsR0FBRyxJQUFJLENBQUMsR0FBRyw4QkFBOEIsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQzVGLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUM3QixHQUFHLENBQUMsQ0FBQyxJQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQ3JFLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGNBQWM7UUFDbkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBWSxHQUFHLElBQUksQ0FBQyxHQUFHLCtCQUErQixFQUMxRSxFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUMsQ0FDL0IsQ0FBQyxJQUFJLENBQ0osS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQzdCLEdBQUcsQ0FBQyxDQUFDLEdBQWMsRUFBRSxFQUFFO1lBQ3JCLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtnQkFDZixHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTthQUM5RDtZQUNELE9BQU8sR0FBRyxDQUFBO1FBQ1osQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLHFCQUFxQixDQUFDLE9BQWlCLEVBQUUsS0FBYSxFQUFFLFVBQWlCLEVBQ2hGLFdBQXNCO1FBQ3BCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQ3JELElBQUksRUFBRTtnQkFDSixLQUFLLEVBQUUsS0FBSztnQkFDWixPQUFPLEVBQUUsT0FBTztnQkFDaEIsVUFBVSxFQUFFLFVBQVU7Z0JBQ3RCLFdBQVc7YUFDWjtZQUNELEtBQUssRUFBRSxPQUFPO1lBQ2QsU0FBUyxFQUFFLE1BQU07U0FDbEIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUNEOzs7O09BSUc7SUFDVSwwQkFBMEI7O1lBQ3JDLElBQUksTUFBTSxHQUF1QixNQUFNLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3JGLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUNsRCxJQUFJLEVBQUU7b0JBQ0osT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQztvQkFDbkMsV0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQztvQkFDdkMsS0FBSyxFQUFFLHFDQUFxQztvQkFDNUMsVUFBVSxFQUFFLE1BQU07aUJBQ047Z0JBQ2QsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsU0FBUyxFQUFFLE1BQU07YUFDbEIsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDN0MsQ0FBQztLQUFBO0lBRUQ7Ozs7T0FJRztJQUNJLDBCQUEwQjtRQUMvQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFxQixHQUFHLElBQUksQ0FBQyxHQUFHLDZCQUE2QixFQUNqRixFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDdEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQzdCLEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FDNUUsQ0FBQTtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksbUJBQW1CO1FBQ3hCLE1BQU0sT0FBTyxHQUFhO1lBQ3hCLFNBQVMsRUFBRSxhQUFhO1lBQ3hCLGVBQWUsRUFBRTtnQkFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRTthQUMzQztTQUNGLENBQUE7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFzQixHQUFHLElBQUksQ0FBQyxHQUFHLG9DQUFvQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDdkcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQzdCLEdBQUcsQ0FBQyxDQUFDLElBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUMxRSxDQUFBO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGlCQUFpQixDQUFDLEtBQWEsRUFBRSxPQUFnQjtRQUN0RCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUNqRCxJQUFJLEVBQUU7Z0JBQ0osS0FBSyxFQUFFLEtBQUs7Z0JBQ1osT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSTthQUNwQztZQUNELEtBQUssRUFBRSxPQUFPO1lBQ2QsU0FBUyxFQUFFLE1BQU07U0FDbEIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGlCQUFpQixDQUFDLFNBQW9CLEVBQUUsSUFBWTtRQUN6RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ2xILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxrQkFBa0IsQ0FBQyxTQUFvQixFQUFFLElBQVk7UUFDMUQsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFdBQVcsQ0FBQyxLQUFVO1FBQzNCLHNCQUFzQjtRQUN0QixJQUFJLFNBQVMsR0FBVyxDQUFDLENBQUM7UUFDMUIsSUFBSSxNQUFNLEdBQVcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUNwRCx1QkFBdUI7UUFFdkIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFO1lBQ2hELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN0QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO29CQUM1QixTQUFTLEVBQUUsQ0FBQztpQkFDYjthQUNGO1lBRUQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO2dCQUNqQixPQUFPLEtBQUssQ0FBQzthQUNkO2lCQUFNO2dCQUNMLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDOUIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUNyRSxPQUFPLEtBQUssQ0FBQztxQkFDZDtpQkFDRjtnQkFFRCxPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7YUFBTTtZQUNMLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxXQUFXLENBQUMsS0FBVztRQUM1QixzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNVLDZCQUE2Qjs7WUFDeEMsSUFBSSxhQUFhLEdBQXdCLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDekYsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ2xELElBQUksRUFBRTtvQkFDSixPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDO29CQUNuSCxLQUFLLEVBQUUsa0NBQWtDO29CQUN6QyxVQUFVLEVBQUUsYUFBYTtpQkFDYjtnQkFDZCxLQUFLLEVBQUUsT0FBTztnQkFDZCxTQUFTLEVBQUUsTUFBTTthQUNsQixDQUFDLENBQUM7WUFDSCxPQUFPLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3QyxDQUFDO0tBQUE7SUFFRDs7OztPQUlHO0lBQ0ksc0JBQXNCO1FBQzNCLE1BQU0sT0FBTyxHQUFhO1lBQ3hCLFNBQVMsRUFBRSxhQUFhO1lBQ3hCLGVBQWUsRUFBRTtnQkFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRTthQUMzQztTQUNGLENBQUE7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFzQixHQUFHLElBQUksQ0FBQyxHQUFHLGdDQUFnQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDbkcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQzdCLEdBQUcsQ0FBQyxDQUFDLElBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUMxRSxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDVSxvQkFBb0IsQ0FDL0IsT0FBaUIsRUFDakIsS0FBYSxFQUNiLFVBQWlCLEVBQ2pCLGNBQXdCLElBQUksRUFDNUIsUUFBZ0IsT0FBTyxFQUN2QixVQUdJLEVBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFDOztZQUU3QyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDbEQsSUFBSSxFQUFFO29CQUNKLE9BQU87b0JBQ1AsS0FBSztvQkFDTCxVQUFVO29CQUNWLFdBQVc7aUJBQ0M7Z0JBQ2QsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osU0FBUyxFQUFFLE1BQU07Z0JBQ2pCLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLO2dCQUM5RCxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSzthQUNsRSxDQUFDLENBQUM7WUFDSCxPQUFPLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3QyxDQUFDO0tBQUE7SUFFRDs7Ozs7OztPQU9HO0lBQ1UscUJBQXFCLENBQ2hDLE9BQWlCLEVBQ2pCLEtBQWEsRUFDYixVQUFpQixFQUNqQixVQUF3QixFQUN4QixjQUF3QixJQUFJLEVBQzVCLFFBQWdCLE9BQU87O1lBRXZCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFO2dCQUM1RCxJQUFJLEVBQUU7b0JBQ0osT0FBTztvQkFDUCxLQUFLO29CQUNMLFVBQVU7b0JBQ1YsV0FBVztvQkFDWCxVQUFVO2lCQUNFO2dCQUNkLEtBQUssRUFBRSxLQUFLO2dCQUNaLFNBQVMsRUFBRSxNQUFNO2FBQ2xCLENBQUMsQ0FBQztZQUNILE9BQU8sU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzdDLENBQUM7S0FBQTtJQUVEOzs7O09BSUc7SUFDVSxtQkFBbUI7O1lBQzlCLElBQUksV0FBVyxHQUFpQixNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN4RSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDbEQsSUFBSSxFQUFFO29CQUNKLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQztvQkFDdkYsS0FBSyxFQUFFLHlCQUF5QjtvQkFDaEMsVUFBVSxFQUFFLFdBQVc7aUJBQ1g7Z0JBQ2QsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsU0FBUyxFQUFFLE1BQU07YUFDbEIsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDN0MsQ0FBQztLQUFBO0lBRUQ7Ozs7T0FJRztJQUNJLGNBQWM7UUFDbkIsTUFBTSxPQUFPLEdBQWE7WUFDeEIsU0FBUyxFQUFFLGFBQWE7WUFDeEIsZUFBZSxFQUFFO2dCQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRztnQkFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFO2FBQzNDO1NBQ0YsQ0FBQTtRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyw0QkFBNEIsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQ3hGLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUM3QixHQUFHLENBQUMsQ0FBQyxJQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQ25FLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNVLGlCQUFpQjs7WUFDNUIsSUFBSSxLQUFLLEdBQWMsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDM0QsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ2xELElBQUksRUFBRTtvQkFDSixPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUM7b0JBQ3JELEtBQUssRUFBRSxxQkFBcUI7b0JBQzVCLFdBQVcsRUFBRSxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQztvQkFDekQsVUFBVSxFQUFFLEtBQUs7aUJBQ0w7Z0JBQ2QsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsU0FBUyxFQUFFLE1BQU07YUFDbEIsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDN0MsQ0FBQztLQUFBO0lBRUQ7Ozs7T0FJRztJQUNJLFVBQVU7UUFDZixNQUFNLE9BQU8sR0FBYTtZQUN4QixTQUFTLEVBQUUsYUFBYTtZQUN4QixlQUFlLEVBQUU7Z0JBQ2YsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNsQixPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUU7YUFDM0M7U0FDRixDQUFBO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBWSxHQUFHLElBQUksQ0FBQyxHQUFHLHlCQUF5QixFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDbEYsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQzdCLEdBQUcsQ0FBQyxDQUFDLElBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FDaEUsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ1UsZ0NBQWdDOztZQUMzQyxJQUFJLFFBQVEsR0FBMkIsTUFBTSxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxRixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDbEQsSUFBSSxFQUFFO29CQUNKLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUM7b0JBQ25DLFdBQVcsRUFBRSxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUM7b0JBQ3ZDLEtBQUssRUFBRSwwQ0FBMEM7b0JBQ2pELFVBQVUsRUFBRSxRQUFRO2lCQUNSO2dCQUNkLEtBQUssRUFBRSxPQUFPO2dCQUNkLFNBQVMsRUFBRSxNQUFNO2FBQ2xCLENBQUMsQ0FBQztZQUNILE9BQU8sU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzdDLENBQUM7S0FBQTtJQUVEOzs7O09BSUc7SUFDSSx5QkFBeUIsQ0FBQyxTQUFtQjtRQUNsRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUF5QixHQUFHLElBQUksQ0FBQyxHQUFHLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQ3pILEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN0QyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQ1IsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFDN0IsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUNoRixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDVSw0QkFBNEI7O1lBQ3ZDLElBQUksUUFBUSxHQUF5QixNQUFNLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BGLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUNsRCxJQUFJLEVBQUU7b0JBQ0osV0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQztvQkFDdkMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQztvQkFDbkMsS0FBSyxFQUFFLG9DQUFvQztvQkFDM0MsVUFBVSxFQUFFLFFBQVE7aUJBQ1I7Z0JBQ2QsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsU0FBUyxFQUFFLE1BQU07YUFDbEIsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDN0MsQ0FBQztLQUFBO0lBRUQ7Ozs7T0FJRztJQUNJLHFCQUFxQjtRQUMxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFxQixHQUFHLElBQUksQ0FBQyxHQUFHLHFDQUFxQyxFQUN6RixFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDdEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQzdCLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FDNUUsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNVLCtCQUErQixDQUMxQyxNQUFjLEVBQ2QsU0FBbUMsSUFBSSxFQUN2QyxRQUFnQixPQUFPOztZQUV2QixJQUFJLE9BQU8sR0FBeUIsRUFBRSxDQUFDO1lBRXZDLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQzFELE9BQU8sR0FBRyxHQUFHLENBQUM7Z0JBQ2QsSUFBSSxNQUFNLEVBQUU7b0JBQ1YsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO3dCQUNqQixPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTs0QkFDM0IsT0FBTyxDQUFDLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUE7d0JBQ2xDLENBQUMsQ0FBQyxDQUFBO3FCQUNIO29CQUNELElBQUksTUFBTSxDQUFDLElBQUksRUFBRTt3QkFDZixPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTs0QkFDM0IsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUE7d0JBQzlCLENBQUMsQ0FBQyxDQUFBO3FCQUNIO2lCQUNGO2dCQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUN4QixDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFBO29CQUNsRSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFBO29CQUN6RCxPQUFPLENBQUMsQ0FBQTtnQkFDVixDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUFBO1lBQ0YsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQzlCLENBQUMsUUFBUSxFQUFDLGNBQWMsRUFBQyxZQUFZLEVBQUMsVUFBVSxDQUFDLEVBQ2pELE1BQU0sRUFDTixPQUFPLEVBQ1AsQ0FBQyxRQUFRLEVBQUMsY0FBYyxFQUFDLFFBQVEsRUFBQyxNQUFNLENBQUMsRUFDekMsS0FBSyxDQUNOLENBQUE7UUFDSCxDQUFDO0tBQUE7SUFFRDs7Ozs7T0FLRztJQUNVLHlCQUF5QixDQUNwQyxNQUFjLEVBQ2QsY0FBdUIsSUFBSSxFQUMzQixRQUFnQixPQUFPOztZQUV2QixJQUFJLE9BQU8sR0FBcUIsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNyRCxPQUFPLEdBQUcsR0FBRyxDQUFBO2dCQUNiLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUMzQixPQUFPLENBQUMsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFBO2dCQUN4QixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ1QsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQTtvQkFDbEUsT0FBTyxDQUFDLENBQUM7Z0JBQ1gsQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDLENBQUMsQ0FBQTtZQUNGLElBQUksV0FBVyxFQUFFO2dCQUNmLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUMvQixDQUFDLFFBQVEsRUFBQyxjQUFjLEVBQUMsWUFBWSxFQUFDLFlBQVksQ0FBQyxFQUNuRCxNQUFNLEVBQ04sT0FBTyxFQUNQLENBQUM7d0JBQ0MsV0FBVyxFQUFFLFFBQVE7d0JBQ3JCLFFBQVEsRUFBRSxRQUFRO3FCQUNuQixFQUFFO3dCQUNELFdBQVcsRUFBRSxZQUFZO3dCQUN6QixRQUFRLEVBQUUsWUFBWTtxQkFDdkIsQ0FBQyxFQUNGLENBQUMsUUFBUSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLEVBQ2xELEtBQUssQ0FDTixDQUFBO2FBQ0Y7aUJBQU07Z0JBQ0wsSUFBSSxnQkFBZ0IsR0FBcUIsRUFBRSxDQUFDO2dCQUM1QyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNsQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUU7d0JBQ3JELGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtxQkFDekI7Z0JBQ0gsQ0FBQyxDQUFDLENBQUE7Z0JBQ0YsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQzlCLENBQUMsUUFBUSxFQUFDLGNBQWMsRUFBQyxZQUFZLENBQUMsRUFDdEMsTUFBTSxFQUNOLGdCQUFnQixFQUNoQixDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLEVBQ3BDLEtBQUssQ0FDTixDQUFBO2FBQ0Y7UUFDSCxDQUFDO0tBQUE7SUFFRDs7Ozs7T0FLRztJQUNVLDBCQUEwQixDQUNyQyxNQUFjLEVBQ2QsY0FBdUIsSUFBSSxFQUMzQixRQUFnQixPQUFPOztZQUV2QixJQUFJLE9BQU8sR0FBc0IsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBYyxFQUFFLEVBQUU7Z0JBQ2pFLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFBO2dCQUNsQixPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDM0IsT0FBTyxDQUFDLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQTtnQkFDeEIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNULENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUE7b0JBQ2xFLE9BQU8sQ0FBQyxDQUFDO2dCQUNYLENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQyxDQUFDLENBQUE7WUFDRixJQUFJLFdBQVcsRUFBRTtnQkFDZixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FDL0IsQ0FBQyxRQUFRLEVBQUMsY0FBYyxFQUFDLFlBQVksRUFBQyxZQUFZLENBQUMsRUFDbkQsTUFBTSxFQUNOLE9BQU8sRUFDUCxDQUFDO3dCQUNDLFdBQVcsRUFBRSxRQUFRO3dCQUNyQixRQUFRLEVBQUUsUUFBUTtxQkFDbkIsRUFBRTt3QkFDRCxXQUFXLEVBQUUsWUFBWTt3QkFDekIsUUFBUSxFQUFFLFlBQVk7cUJBQ3ZCLENBQUMsRUFDRixDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxFQUNsRCxLQUFLLENBQ04sQ0FBQTthQUNGO2lCQUFNO2dCQUNMLElBQUksZ0JBQWdCLEdBQXNCLEVBQUUsQ0FBQztnQkFDN0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDbEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFO3dCQUNyRCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7cUJBQ3pCO2dCQUNILENBQUMsQ0FBQyxDQUFBO2dCQUNGLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUM5QixDQUFDLFFBQVEsRUFBQyxjQUFjLEVBQUMsWUFBWSxDQUFDLEVBQ3RDLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsQ0FBQyxRQUFRLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxFQUNwQyxLQUFLLENBQ04sQ0FBQTthQUNGO1FBQ0gsQ0FBQztLQUFBO0lBRU0sdUJBQXVCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyx3Q0FBd0MsRUFDeEUsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFDLENBQUM7YUFDaEMsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLEdBQU8sRUFBRSxFQUFFO1lBQ2QsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO2dCQUNmLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDMUQ7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUNILENBQUE7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGlCQUFpQjtRQUN0QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsaUNBQWlDLEVBQzVFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN0QyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQ1IsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFDN0IsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDZixJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2YsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDckQ7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFlBQVk7UUFDakIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLDBCQUEwQixFQUNwRSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDdEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQzdCLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3RELENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFNBQVM7UUFDZCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsNEJBQTRCLEVBQ3BFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN0QyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQ1IsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFDN0IsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDcEQsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksaUJBQWlCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsK0JBQStCLEVBQzlFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN0QyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQ1IsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFDN0IsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDM0QsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksV0FBVztRQUNoQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsK0JBQStCLEVBQ3hFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN0QyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQ1IsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFDN0IsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDckQsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksV0FBVztRQUNoQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsMkJBQTJCLEVBQ3JFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN0QyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQ1IsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFDN0IsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDdEQsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksa0JBQWtCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxtQ0FBbUMsRUFDOUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3RDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUM3QixHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNmLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtnQkFDZixHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN4QztZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxvQ0FBb0MsRUFDL0UsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3RDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUM3QixHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNmLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtnQkFDZixHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hEO1lBQ0QsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxjQUFjO1FBQ25CLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQVksR0FBRyxJQUFJLENBQUMsR0FBRywrQkFBK0IsRUFDMUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3RDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUM3QixHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNmLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtnQkFDZixHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNqRDtZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksWUFBWTtRQUNqQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsNEJBQTRCLEVBQ3ZFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN0QyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQ1IsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFDN0IsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDZixJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2YsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEQ7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGlCQUFpQjtRQUN0QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsZ0NBQWdDLEVBQzNFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN0QyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQ1IsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFDN0IsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDZixJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2YsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDckQ7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksYUFBYSxDQUFDLE9BQWUsRUFBRSxNQUFjO1FBQ2xELElBQUksT0FBTyxHQUFhO1lBQ3RCLFNBQVMsRUFBRSx1QkFBdUI7WUFDbEMsZUFBZSxFQUFFO2dCQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRztnQkFDbEIsT0FBTyxrQ0FDRixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxLQUNwQyxPQUFPLEVBQUUsT0FBTyxFQUNoQixNQUFNLEVBQUUsTUFBTSxHQUNmO2FBQ0Y7U0FDRixDQUFBO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBb0IsR0FBRyxJQUFJLENBQUMsR0FBRyxnQ0FBZ0MsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQ2pHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUM3QixHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQXdCLENBQUMsQ0FDNUMsQ0FBQTtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ1UscUJBQXFCOztZQUNoQyxJQUFJLFdBQVcsR0FBaUIsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDeEUsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ2xELElBQUksRUFBRTtvQkFDSixPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQztvQkFDbEMsS0FBSyxFQUFFLHlDQUF5QztvQkFDaEQsVUFBVSxFQUFFLFdBQVc7aUJBQ1g7Z0JBQ2QsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsU0FBUyxFQUFFLE1BQU07YUFDbEIsQ0FBQyxDQUFDO1lBRUgsT0FBTyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDN0MsQ0FBQztLQUFBO0lBRUQ7Ozs7T0FJRztJQUNJLGNBQWM7UUFDbkIsSUFBSSxPQUFPLEdBQWE7WUFDdEIsU0FBUyxFQUFFLGFBQWE7WUFDeEIsZUFBZSxFQUFFO2dCQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRztnQkFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFO2FBQzNDO1NBQ0YsQ0FBQTtRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyx5Q0FBeUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQ3JHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUM3QixHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQy9ELENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLDRCQUE0QixDQUFDLE9BQWUsSUFBSTtRQUNyRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsMENBQTBDLElBQUksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLElBQUksRUFBRSxDQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFDNUgsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3RDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUM3QixHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNmLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtnQkFDZixHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzNEO1lBQ0QsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUdEOzs7O09BSUc7SUFDSSxXQUFXLENBQUMsRUFBVTtRQUMzQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsK0JBQStCLEVBQUUsRUFBRSxFQUM5RSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDdEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQzdCLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ2YsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO2dCQUNmLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ25DO1lBQ0QsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxRQUFRO1FBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBWSxHQUFHLElBQUksQ0FBQyxHQUFHLHdCQUF3QixFQUNuRSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDdEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQzdCLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ2YsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO2dCQUNmLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzVDO1lBQ0QsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxtQkFBbUI7UUFDeEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBWSxHQUFHLElBQUksQ0FBQyxHQUFHLG9DQUFvQyxFQUMvRSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDdEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQzdCLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ2YsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO2dCQUNmLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdkQ7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU0saUJBQWlCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxnQ0FBZ0MsRUFDaEUsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFDLENBQUM7YUFDaEMsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLEdBQU8sRUFBRSxFQUFFO1lBQ2QsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO2dCQUNmLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQy9EO2lCQUFNO2dCQUNMLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2FBQ2Y7WUFDRCxPQUFPLEdBQUcsQ0FBQTtRQUNaLENBQUMsQ0FBQyxDQUNILENBQUE7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGVBQWU7UUFDcEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBWSxHQUFHLElBQUksQ0FBQyxHQUFHLG1DQUFtQyxFQUM5RSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDdEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNSLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQzdCLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ2YsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO2dCQUNmLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ25EO1lBQ0QsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxZQUFZO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxnQ0FBZ0MsRUFDM0UsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3RDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUM3QixHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNmLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtnQkFDZixHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNyQztZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksaUJBQWlCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxpQ0FBaUMsRUFDNUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3RDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUM3QixHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNmLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtnQkFDZixHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNyRDtZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxnQkFBeUIsS0FBSztRQUNyRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsb0NBQzlCLGFBQWEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQ3RDLEVBQUUsRUFBRSxFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUMsQ0FBQyxDQUFDLElBQUksQ0FDeEMsR0FBRyxDQUFDLENBQUMsR0FBTyxFQUFFLEVBQUU7WUFDZCxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2YsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7YUFDckQ7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUNILENBQUE7SUFDSCxDQUFDO0lBRU0sVUFBVTtRQUVmLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLEdBQUcsSUFBSSxDQUFDLEdBQUcseUJBQXlCLEVBQ3BDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUNuQyxDQUFDLElBQUksQ0FDSixHQUFHLENBQUMsQ0FBQyxHQUFjLEVBQUUsRUFBRTtZQUNyQixJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2YsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7YUFDNUM7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUNILENBQUE7SUFFSCxDQUFDO0lBRU0sYUFBYTtRQUVsQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixHQUFHLElBQUksQ0FBQyxHQUFHLDhCQUE4QixFQUN6QyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FDbkMsQ0FBQyxJQUFJLENBQ0osR0FBRyxDQUFDLENBQUMsR0FBYyxFQUFFLEVBQUU7WUFDckIsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO2dCQUNmLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO2FBQ2hEO1lBQ0QsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUMsQ0FDSCxDQUFBO0lBRUgsQ0FBQztJQUVNLGFBQWEsQ0FBQyxNQUVVO1FBRTdCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLEdBQUcsSUFBSSxDQUFDLEdBQUcsaURBQ1QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQ3hCLFdBQVcsTUFBTSxFQUFFLEVBQ25CLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUNuQyxDQUFBO0lBRUgsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxjQUFjO1FBQ25CLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDO1lBQzlCLGNBQWMsRUFBRSxrQkFBa0I7WUFDbEMsZUFBZSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUU7U0FDL0MsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxTQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7OztPQUlHO0lBQ1UsT0FBTzs7WUFDbEIsSUFBSSxRQUFRLEdBQWMsQ0FBQSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzNILHVCQUF1QjtZQUN2QixXQUFXO1lBQ1gsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQzthQUM5QjtRQUVILENBQUM7S0FBQTtJQUVEOzs7OztPQUtHO0lBQ0ksZ0JBQWdCLENBQUMsT0FBZTtRQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxjQUFjLENBQUMsT0FBZTtRQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxRQUFRLENBQUMsSUFBZTtRQUM3QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDekIsSUFBSSxhQUFhLEdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN2RCxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsR0FBVztRQUN2QixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLElBQUk7UUFDVCxnR0FBZ0c7UUFDaEcsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2xDLDhDQUE4QztZQUM5QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDaEI7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNVLFFBQVE7O1lBQ25CLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ3JDLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO2lCQUNkO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtpQkFDZjtZQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztLQUFBO0lBRU8sWUFBWSxDQUFDLEtBQXdCO1FBQzNDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsT0FBTyxVQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtJQUN2QyxDQUFDOzs7O1lBMXdERixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQXpETSxVQUFVO1lBS1YsU0FBUztZQVFULGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1Vc3VhcmlvIH0gZnJvbSAnLi9jb3JlL21vZGVscy91c2VyLm1vZGVsJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJUmVxdWVzdCB9IGZyb20gJy4vY29yZS9pbnRlcmZhY2VzL1JlcXVlc3QnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1Qcm92ZWVkb3IgfSBmcm9tICcuL2NvcmUvbW9kZWxzL3Byb3ZlZWRvcmVzLm1vZGVsJztcclxuaW1wb3J0IHsgbWFwLCBjYXRjaEVycm9yLCByZXRyeSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgTVVzdWFyaW9QcmVmaWpvIH0gZnJvbSAnLi9jb3JlL21vZGVscy91c2VyUHJlZml4Lm1vZGVsJztcclxuaW1wb3J0IHsgSUNhdGFsb2dvLCBmaWx0ZXJEYXRhIH0gZnJvbSAnLi9jb3JlL2ludGVyZmFjZXMvQ2F0YWxvZ28nO1xyXG5pbXBvcnQgeyBDYXRhbG9nb0NvbXBvbmVudCB9IGZyb20gJy4vc2hhcmVkL2NvbXBvbmVudHMvY2F0YWxvZ28vY2F0YWxvZ28uY29tcG9uZW50JztcclxuaW1wb3J0IHsgTUN1ZW50YVByZXN1cHVlc3RvIH0gZnJvbSAnLi9jb3JlL21vZGVscy9jdWVudGFQcmVzdXB1ZXN0by5tb2RlbCc7XHJcbmltcG9ydCB7IE1DdWVudGFJbnN0aXR1Y2lvbmFsIH0gZnJvbSAnLi9jb3JlL21vZGVscy9jdWVudGFJbnN0aXR1Y2lvbmFsLm1vZGVsJztcclxuaW1wb3J0IHsgTU1vbmVkYSwgTU1vbmVkYUNvbmZpZyB9IGZyb20gJy4vY29yZS9tb2RlbHMvbW9uZWRhLm1vZGVsJztcclxuaW1wb3J0IHsgTUNvbXVuaWRhZCB9IGZyb20gJy4vY29yZS9tb2RlbHMvY29tdW5pZGFkLm1vZGVsJztcclxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xyXG5pbXBvcnQgeyBNVW5pZGFkVHJpYnV0YXJpYSB9IGZyb20gJy4vY29yZS9tb2RlbHMvdW5pZGFkVHJpYnV0YXJpYS5tb2RlbCc7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb25maXJtQ29tcG9uZW50IH0gZnJvbSAnLi9zaGFyZWQvY29tcG9uZW50cy9jb25maXJtL2NvbmZpcm0uY29tcG9uZW50JztcclxuaW1wb3J0IHsgTUNvbmZpZ3VyYWNpb25TQ0cgfSBmcm9tICcuL2NvcmUvbW9kZWxzL2NvbmZpZ3VyYWNpb25TQ0cubW9kZWwnO1xyXG5pbXBvcnQgeyBNUGxhblVuaWNvQ3VlbnRhIH0gZnJvbSAnLi9jb3JlL21vZGVscy9wbGFuVW5pY29DdWVudGEubW9kZWwnO1xyXG5pbXBvcnQgeyBJQ29uZXhpb24gfSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9Vc3VhcmlvJztcclxuaW1wb3J0IHsgVGFibGVTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuL3NoYXJlZC9jb21wb25lbnRzL3RhYmxlLXNlbGVjdC90YWJsZS1zZWxlY3QuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTUNvbmZpZ3VyYXRpb25TUEcgfSBmcm9tICcuL2NvcmUvbW9kZWxzL2NvbmZpZ3VyYXRpb25TUEcubW9kZWwnO1xyXG5pbXBvcnQgeyBNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhT25lLCBNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVHdvLCBNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVGhyZWUsIE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGb3VyLCBNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhRml2ZUNvbXBsZXRlLCBNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhRml2ZSwgTUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVRocmVlQ29tcGxldGUsIE1BbGxTdHJ1Y3R1cmUgfSBmcm9tICcuL2NvcmUvbW9kZWxzL2VzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYS5tb2RlbCc7XHJcbmltcG9ydCB7IElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFPbmUsIElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFUd28sIElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFUaHJlZSwgSUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZvdXIsIElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGaXZlQ29tcGxldGUsIElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGaXZlIH0gZnJvbSAnLi9jb3JlL2ludGVyZmFjZXMvRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhJztcclxuaW1wb3J0IHsgTUNlbnRyb0Nvc3RvIH0gZnJvbSAnLi9jb3JlL21vZGVscy9jZW50cm9Db3N0by5tb2RlbCc7XHJcbmltcG9ydCB7IE1GdWVudGVGaW5hbmNpYW1pZW50byB9IGZyb20gJy4vY29yZS9tb2RlbHMvZnVlbnRlRmluYW5jaWFtaWVudG8ubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ3VlbnRhRWdyZXNvcyB9IGZyb20gJy4vY29yZS9tb2RlbHMvZXhwZW5zaXZlQWNjb3VudC5tb2RlbCc7XHJcbmltcG9ydCB7IENhdGFsb2dvRXN0cnVjdHVyYXNDb21wb25lbnQgfSBmcm9tICcuL3NoYXJlZC9jb21wb25lbnRzL2NhdGFsb2dvLWVzdHJ1Y3R1cmFzL2NhdGFsb2dvLWVzdHJ1Y3R1cmFzLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IElVcGRhdGVEaXN0cmlidXRpb24sIElVcGRhdGVEaXN0cmlidXRpb25JbmdyZXNvcyB9IGZyb20gJy4vY29yZS9pbnRlcmZhY2VzL0N1ZW50YUVncmVzb3MnO1xyXG5pbXBvcnQgeyBDYXRhbG9nb0RvYmxlSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL3NoYXJlZC9jb21wb25lbnRzL2NhdGFsb2dvLWRvYmxlLWlucHV0L2NhdGFsb2dvLWRvYmxlLWlucHV0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1TaXN0ZW1hIH0gZnJvbSAnLi9jb3JlL21vZGVscy9zaXN0ZW1hJztcclxuaW1wb3J0IHsgSUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9FZ3Jlc29zLCBJQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0luZ3Jlc29zIH0gZnJvbSAnLi9jb3JlL2ludGVyZmFjZXMvQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpbyc7XHJcbmltcG9ydCB7IE1Db21wcm9iYW50ZVByZXN1cHVlc3RhcmlvRWdyZXNvcywgTUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9JbmdyZXNvcyB9IGZyb20gJy4vY29yZS9tb2RlbHMvY29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpby5tb2RlbCc7XHJcbmltcG9ydCB7IE1DdWVudGFJbmdyZXNvcyB9IGZyb20gJy4vY29yZS9tb2RlbHMvSW5jb21lQWNjb3VudCc7XHJcbmltcG9ydCB7IE1JbmNvbWVTdHJ1Y3R1cmVBY2NvdW50IH0gZnJvbSAnLi9jb3JlL21vZGVscy9pbmNvbWVTdHJ1Y3R1cmVBY2NvdW50Lm1vZGVsJztcclxuaW1wb3J0IHsgTU9yZ2FuaXphdGlvblR5cGUgfSBmcm9tICcuL2NvcmUvbW9kZWxzL29yZ2FuaXphdGlvblR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBNU3BlY2lhbHR5IH0gZnJvbSAnLi9jb3JlL21vZGVscy9zcGVjaWFsdHkubW9kZWwnO1xyXG5pbXBvcnQgeyBNRG9jdW1lbnQgfSBmcm9tICcuL2NvcmUvbW9kZWxzL2RvY3VtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgTUNsYXNpZmljYXRpb24gfSBmcm9tICcuL2NvcmUvbW9kZWxzL2NsYXNpZmljYXRpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ291bnRyeSwgTVN0YXRlLCBNTXVuaWNpcGFsaXR5LCBNUGFyaXNoIH0gZnJvbSAnLi9jb3JlL21vZGVscy9sb2NhdGlvbnMubW9kZWwnO1xyXG5pbXBvcnQgeyBNUHJvdmlkZXJCZW5lZmljaWFyeSB9IGZyb20gJy4vY29yZS9tb2RlbHMvcHJvdmlkZXJCZW5lZmljaWFyeS5tb2RlbCc7XHJcbmltcG9ydCB7IE1TaWdlY29mQmFuaywgTUJhbmssIE1CYW5rQWNjb3VudFR5cGUgfSBmcm9tICcuL2NvcmUvbW9kZWxzL2JhbmsubW9kZWwnO1xyXG5pbXBvcnQgeyBJUmVzcG9uc2UgfSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9SZXNwb25zZSc7XHJcbmltcG9ydCB7IE1Db25maWd1cmF0aW9uUlBDIH0gZnJvbSAnLi9jb3JlL21vZGVscy9jb25maWd1cmFjaW9uUlBDLm1vZGVsJztcclxuaW1wb3J0IHsgTUNvbmZpZ1NPQyB9IGZyb20gJy4vY29yZS9tb2RlbHMvY29uZmlndXJhY2lvblNPQy5tb2RlbCc7XHJcbmltcG9ydCB7IE1EZWR1Y3Rpb25UeXBlIH0gZnJvbSAnLi9jb3JlL21vZGVscy9kZWR1Y3Rpb25UeXBlLm1vZGVsJztcclxuaW1wb3J0IHsgTUNhcmdvIH0gZnJvbSAnLi9jb3JlL21vZGVscy9jaGFyZ2UubW9kZWwnO1xyXG5pbXBvcnQgeyBNRGVkdWN0aW9uIH0gZnJvbSAnLi9jb3JlL21vZGVscy9kZWR1Y3Rpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ29uZmlnU1NTIH0gZnJvbSAnLi9jb3JlL21vZGVscy9zZWN1cml0eUNvbmZpZ3VyYXRpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBNQWRtaW5pc3RyYXRpdmVVbml0IH0gZnJvbSAnLi9jb3JlL21vZGVscy9TUEcvYWRtaW5pc3RyYXRpdmVVbml0Lm1vZGVsJztcclxuaW1wb3J0IHsgTUN1ZW50YUJhbmNvIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TQ0IvYmFua0FjY291bnQubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ29tcG9uZW50IH0gZnJvbSAnLi9jb3JlL21vZGVscy9TU1MvY29tcG9uZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgTVNlcnZpY2VDaGFyZ2UgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NPQy9zZXJ2aWNlQ2hhcmdlLm1vZGVsJztcclxuXHJcbiAgXHJcbiAgQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbiAgfSlcclxuICBleHBvcnQgY2xhc3MgU2lnZXNwU2VydmljZSB7XHJcblxyXG4gICAgcHVibGljIHVzdWFyaW9BY3Rpdm86IE1Vc3VhcmlvID0gbnVsbDtcclxuICAgIHB1YmxpYyBVUkw6IHN0cmluZztcclxuICAgIHB1YmxpYyBjdXJyZW50Q29tcG9uZW50OiBNQ29tcG9uZW50ID0gbnVsbDtcclxuXHJcbiAgICAvLyBwdWJsaWMgVVJMOiBzdHJpbmcgPSBcImh0dHA6Ly8xOTIuMTY4LjEuNjcvc2lnZXNwX3BocFwiO1xyXG4gICAgLy8gdXN1YXJpb0FjdGl2bzogTVVzdWFyaW8gPSB7XHJcbiAgICAvLyAgIGNvbmV4aW9uREI6IHtcclxuICAgIC8vICAgICBiYXNlRGVEYXRvczogXCJkYl9zaWdlc3BfZGVtb3YzXCIsXHJcbiAgICAvLyAgICAgZ2VzdG9yOiBcInBvc3RncmVzXCIsXHJcbiAgICAvLyAgICAgbG9naW46IFwicG9zdGdyZXNcIixcclxuICAgIC8vICAgICBub21icmU6IFwiU0lHRVNQIEMuQSwgc2Vydmlkb3IgODUgKFNFIFBVRURFIFVTQVIpXCIsXHJcbiAgICAvLyAgICAgcGFzc3dvcmQ6IFwiYWRtaW5zaWdlc3BcIixcclxuICAgIC8vICAgICBwdWVydG86IFwiNTQzMlwiLFxyXG4gICAgLy8gICAgIHNlcnZpZG9yOiBcIjE5Mi4xNjguMS42N1wiLFxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gICBlbXByZXNhOiB7XHJcbiAgICAvLyAgICAgaWQ6IDEsXHJcbiAgICAvLyAgICAgcGVyaW9kb0Zpc2NhbDogXCIyMDE5LTAxLTAxXCIsXHJcbiAgICAvLyAgICAgdGl0dWxvOiBcIlNJR0VTUCBDLkEuXCJcclxuICAgIC8vICAgfSxcclxuICAgIC8vICAgbm9tYnJlOiBcIlNJR0VTUFwiLFxyXG4gICAgLy8gICB0b2tlbjogXCJleUowZVhBaU9pSktWMVFpTENKaGJHY2lPaUpJVXpNNE5DSjkuZXlKd1lYTnpkMjl5WkY5MWMzVWlPaUl4TWpNME5UWTNPQ0lzSW1sa1gyVnRjSEpsYzJFaU9pSXhJaXdpZEdsMFpXMXdJam9pVTBsSFJWTlFJRU11UVM0aUxDSndaWEptYVhOallXd2lPaUl5TURFNUxUQXhMVEF4SWl3aWJGOTFjM1ZoY21sdklqb2lVMGxIUlZOUUlpd2ljMlZ5ZG1sa2IzSWlPaUl4T1RJdU1UWTRMakV1TmpjaUxDSndkV1Z5ZEc4aU9pSTFORE15SWl3aVltRnpaV1JsWkdGMGIzTWlPaUprWWw5emFXZGxjM0JmWkdWdGIzWXpJaXdpYkc5bmFXNGlPaUp3YjNOMFozSmxjeUlzSW5CaGMzTjNiM0prSWpvaVlXUnRhVzV6YVdkbGMzQWlmUS5QSVNCU2Z1ZVJBZHNXc0oxQWFHY1ZDZ1ctMmFKa2d0dkxkc1cwQmdvNWx0eVlvd0Q4b3lfbnFLNXNqRTJVUkdrXCJcclxuICAgIC8vIH1cclxuICAgIC8vIHByb2NlZGU6IHN0cmluZyA9ICdTQ0dDTVAnO1xyXG4gICAgLy8gY29kc2lzOiBzdHJpbmcgPSAnU0NHJztcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLCBwcml2YXRlIHRvYXN0OiBUb2FzdHJTZXJ2aWNlKSB7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBWYWxpZGEgcXVlIHNlbG8gc2UgZXNjcmliYW4gZ3Vpb25lcyB5IDlcclxuICAgICAqIEBwYXJhbSBldmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25seUd1aW9uZXNBbmROaW5lKGV2ZW50OiBhbnkpIHtcclxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJy0nIHx8IGV2ZW50LmtleSA9PT0gJzknKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFjdHVhbGl6YSBlbCBtb25jbXAgZGUgc2lnZXNwX2NvbXByb2JhbnRlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVDb21wcm9iYW50ZUFtb3VudChhbW91bnQ6IG51bWJlciwgaWRDb21wcm9iYW50ZTogbnVtYmVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8YW55PihgJHt0aGlzLlVSTH0vZGFvL3NpZ2VzcC9jb21wcm9iYW50ZV9kYW8ucGhwP21vbnRvPXRydWVgLCB7XHJcbiAgICAgICAgbW9uY21wOiBhbW91bnQsXHJcbiAgICAgICAgaWRfY29tcHJvYmFudGU6IGlkQ29tcHJvYmFudGVcclxuICAgICAgfSwge1xyXG4gICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBY3R1YWxpemEgZWwgY29tcHJvYmFudGUgcHJzdXB1ZXN0YXJpbyBkZSBFZ3Jlc29zXHJcbiAgICAgKiBAcGFyYW0gY29tcHJvYmFudGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9FZ3Jlc29zKGNvbXByb2JhbnRlOiBJQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0VncmVzb3MpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxhbnk+KGAke3RoaXMuVVJMfS9kYW8vc3BnL2NvbXByb2JhbnRlX3ByZXN1cHVlc3RhcmlvX2VncmVzb3NfZGFvLnBocGAsXHJcbiAgICAgIHsgLi4uY29tcHJvYmFudGUsIGlkOiBjb21wcm9iYW50ZS5pZF9kdF9zcGdjbXAgfSwgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCBjb21wcm9iYW50ZSBwcmVzdXB1ZXN0YXJpbyBkZSBFZ3Jlc29zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb21wcm9iYW50ZVByZXN1cHVlc3RhcmlvRWdyZXNvcygpOiBPYnNlcnZhYmxlPE1Db21wcm9iYW50ZVByZXN1cHVlc3RhcmlvRWdyZXNvc1tdPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1Db21wcm9iYW50ZVByZXN1cHVlc3RhcmlvRWdyZXNvc1tdPihgJHt0aGlzLlVSTH0vZGFvL3NwZy9jb21wcm9iYW50ZV9wcmVzdXB1ZXN0YXJpb19lZ3Jlc29zX2Rhby5waHBgLCB7XHJcbiAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpXHJcbiAgICAgIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4gcmVzLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1Db21wcm9iYW50ZVByZXN1cHVlc3RhcmlvRWdyZXNvcyhlbGVtZW50KSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWN0dWFsaXphIGVsIGNvbXByb2JhbnRlIHByc3VwdWVzdGFyaW8gZGUgSW5ncmVzb3NcclxuICAgICAqIEBwYXJhbSBjb21wcm9iYW50ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0luZ3Jlc29zKGNvbXByb2JhbnRlOiBJQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0luZ3Jlc29zKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8YW55PihgJHt0aGlzLlVSTH0vZGFvL3NwZy9jb21wcm9iYW50ZV9wcmVzdXB1ZXN0YXJpb19lZ3Jlc29zX2Rhby5waHBgLFxyXG4gICAgICB7IC4uLmNvbXByb2JhbnRlLCBpZDogY29tcHJvYmFudGUuaWRfZHRfc3BpY21wIH0sIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgZWwgY29tcHJvYmFudGUgcHJlc3VwdWVzdGFyaW8gZGUgSW5ncmVzb3NcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9JbmdyZXNvcygpOiBPYnNlcnZhYmxlPE1Db21wcm9iYW50ZVByZXN1cHVlc3RhcmlvSW5ncmVzb3NbXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0luZ3Jlc29zW10+KGAke3RoaXMuVVJMfS9kYW8vc3BpL2NvbXByb2JhbnRlX3ByZXN1cHVlc3RhcmlvX2luZ3Jlc29zX2Rhby5waHBgLCB7XHJcbiAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpXHJcbiAgICAgIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4gcmVzLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1Db21wcm9iYW50ZVByZXN1cHVlc3RhcmlvSW5ncmVzb3MoZWxlbWVudCkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQEFjdHVhbGl6YSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhIGN1ZW50YSBkZSBlZ3Jlc29cclxuICAgICAqIEBwYXJhbSBkaXN0cmlidXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZURpc3RyaWJ1dGlvbkV4cGVuc2VBY2NvdW50KGRpc3RyaWJ1dGlvbjogSVVwZGF0ZURpc3RyaWJ1dGlvbik6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0KGAke3RoaXMuVVJMfS9kYW8vc3BnL2N1ZW50YXNfZWdyZXNvc19kYW8ucGhwYCwgZGlzdHJpYnV0aW9uLFxyXG4gICAgICB7aGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAQWN0dWFsaXphIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbGEgY3VlbnRhIGRlIEluZ3Jlc29cclxuICAgICAqIEBwYXJhbSBkaXN0cmlidXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZURpc3RyaWJ1dGlvbkluY29tZUFjY291bnQoZGlzdHJpYnV0aW9uOiBJVXBkYXRlRGlzdHJpYnV0aW9uSW5ncmVzb3MpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc3BpL2N1ZW50YXNfaW5ncmVzb3NfZGFvLnBocGAsIGRpc3RyaWJ1dGlvbixcclxuICAgICAge2hlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKX0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcyl7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gbmV3IE1DdWVudGFJbmdyZXNvcyhyZXMuZGF0YSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAQWN0dWFsaXphIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbGEgY3VlbnRhIGRlIEluZ3Jlc28gZGUgRXN0cnVjdHVyYVxyXG4gICAgICogQHBhcmFtIGRpc3RyaWJ1dGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlRGlzdHJpYnV0aW9uSW5jb21lU3RydWN0dXJlQWNjb3VudChkaXN0cmlidXRpb246IElVcGRhdGVEaXN0cmlidXRpb25JbmdyZXNvcywgbGV2ZWw6IG51bWJlcik6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zcGkvY3VlbnRhX2VzdHJ1Y3R1cmFfaW5ncmVzb3NfZGFvLnBocGAsIGRpc3RyaWJ1dGlvbixcclxuICAgICAge2hlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKX0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcyl7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gbmV3IE1JbmNvbWVTdHJ1Y3R1cmVBY2NvdW50KHJlcy5kYXRhLCBsZXZlbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgY3VlbnRhcyBwb3Igbml2ZWwgZGUgbGFzIGN1ZW5hdHMgZGUgZWdyZXNvc1xyXG4gICAgICogQHBhcmFtIGxldmVsIE7Dum1lcm8gZGUgbml2ZWxlcyBkZSBsYSBjb25maWd1cmFjacOzblxyXG4gICAgICogQHBhcmFtIGlkIGlkIGRlbCBuaXZlbCAzIG8gNSBxdWUgc2UgdmEgYSBidXNjYXJcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNQ3VlbnRhRWdyZXNvc1tdPlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RXhwZW5zZUFjY291bnRzRm9yTGV2ZWwobGV2ZWw6IG51bWJlciwgaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8TUN1ZW50YUVncmVzb3NbXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNQ3VlbnRhRWdyZXNvc1tdPihgJHt0aGlzLlVSTH0vZGFvL3NwZy9jdWVudGFzX2VncmVzb3NfZGFvLnBocFxyXG4gICAgICA/bGV2ZWw9JHtsZXZlbH0maWQ9JHtpZH1gLCB7aGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6YW55KSA9PiByZXMuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUN1ZW50YUVncmVzb3MoZWxlbWVudCkpKVxyXG4gICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWJyZSBlbCBjYXTDoWxvZ28gZGUgZXN0cnVjdHVyYSBwcmVzdXB1ZXNhcmlhXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBEYXRhIHF1ZSBzZSB2YSBhIG1vc3RyYXJcclxuICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIENvbmZpZ3VyYWNpw7NuIGRlIGxhIGVzdHJ1Y3R1cmFcclxuICAgICAqIEByZXR1cm4gUHJvbWlzZTxhbnk+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3BlbkNhdGFsb2dvRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhKGRhdGE6IGFueVtdLCBjb25maWd1cmF0aW9uOiBNQ29uZmlndXJhdGlvblNQRyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgIGNvbnN0IGNhdGFsb2dvID0gdGhpcy5kaWFsb2cub3BlbihDYXRhbG9nb0VzdHJ1Y3R1cmFzQ29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgZGF0YSxcclxuICAgICAgICAgIGNvbmZpZ3VyYXRpb25cclxuICAgICAgICB9LFxyXG4gICAgICAgIHdpZHRoOiAnNDUwcHgnLFxyXG4gICAgICAgIG1heEhlaWdodDogJzkwdmgnXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gY2F0YWxvZ28uYWZ0ZXJDbG9zZWQoKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBjdWVudGFzIGRlIGVncmVzb3NcclxuICAgICAqIEBwYXJhbSBvbmx5QXZhaWxhYmxlXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUN1ZW50YUVncmVzb3NbXT5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEV4cGVuc2VBY2NvdW50cyhvbmx5QXZhaWxhYmxlOiBib29sZWFuID0gZmFsc2UpOiBPYnNlcnZhYmxlPE1DdWVudGFFZ3Jlc29zW10+e1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNQ3VlbnRhRWdyZXNvc1tdPihgJHt0aGlzLlVSTH0vZGFvL3NwZy9jdWVudGFzX2VncmVzb3NfZGFvLnBocCR7XHJcbiAgICAgICAgb25seUF2YWlsYWJsZSA/ICc/YXZhaWxhYmxlPXRydWUnIDogJydcclxuICAgICAgfWAsIHtoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlczphbnkpID0+IHJlcy5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNQ3VlbnRhRWdyZXNvcyhlbGVtZW50KSkpXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIHRvZGFzIGxhcyBlc3RydWN0dXJhcyBwcmVzdXB1ZXRzYXJpYXMgZGUgbGFzIDUgdGFibGFzXHJcbiAgICAgKiBAcmV0dXJuIFByb21pc2U8TUFsbFN0cnVjdHVyZT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBbGxCdWRnZXRTdHJ1Y3R1cmUoKTogUHJvbWlzZTxNQWxsU3RydWN0dXJlPiB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZXRCdWRnZXRTdHJ1Y3R1cmVPbmUoKS5zdWJzY3JpYmUoc3RydWN0dXJlT25lID0+IHtcclxuICAgICAgICAgIHRoaXMuZ2V0QnVkZ2V0U3RydWN0dXJlVHdvQWxsKCkuc3Vic2NyaWJlKHN0cnVjdHVyZVR3byA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0QnVkZ2V0U3RydWN0dXJlVGhyZWUoKS5zdWJzY3JpYmUoc3RydWN0dXJlVGhyZWUgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0QnVkZ2V0U3RydWN0dXJlRm91cigpLnN1YnNjcmliZShzdHJ1Y3R1cmVGb3VyID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0QnVkZ2V0U3RydWN0dXJlRml2ZUJ5SWRFcDQoKS5zdWJzY3JpYmUoc3RydWN0dXJlRml2ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IE1BbGxTdHJ1Y3R1cmUoe1xyXG4gICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZU9uZSxcclxuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVUd28sXHJcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlVGhyZWUsXHJcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlRm91cixcclxuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVGaXZlXHJcbiAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGEgZXN0cnVjdHVyYSBjb21wbGV0YSBkZXBlbmRpZW5kbyBkZSBsYSBjb25maWd1cmFjacOzblxyXG4gICAgICogQHJldHVybiBQcm9taXNlPGFueVtdPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldEJ1ZGdldFN0cnVjdHVyZUNvbXBsZXRlKCk6IFByb21pc2U8YW55W10+IHtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlKSA9PiB7XHJcblxyXG4gICAgICAgIGxldCBkYXRhID0gW107XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0QnVkZ2V0U3RydWN0dXJlRml2ZSg1KS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuICAgICAgICAgIGRhdGEucHVzaCguLi5yZXN1bHQpXHJcbiAgICAgICAgfSlcclxuICAgICAgICBhd2FpdCB0aGlzLmdldEJ1ZGdldFN0cnVjdHVyZVRocmVlQ29tcGxldGUoMykuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICBkYXRhLnB1c2goLi4ucmVzdWx0KVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIGF3YWl0IHJlc29sdmUoZGF0YSk7XHJcblxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBFbGltaW5hIHVuYSBvIHZhcmlhcyBlc3RydWN0dXJhcyBwcmVzdXB1ZXN0YXJpYXNcclxuICAgICAqIEBwYXJhbSBpZFN0cnVjdHVyZXMgSWQgZGUgbGFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyA1IHF1ZSB2YW4gYSBzZXIgZWxpbWluYWRhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxldGVCdWRnZXRTdHJ1Y3R1cmVGaXZlKGlkU3RydWN0dXJlczogYW55W10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoJ2RlbGV0ZScsIGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWE1X2Rhby5waHBgLFxyXG4gICAgICB7IGJvZHk6IGlkU3RydWN0dXJlcywgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFjdHVhbGl6YSB1bmEgbyB2YXJpYXMgZXN0cnVjdHVyYXMgNFxyXG4gICAgICogQHBhcmFtIHN0cnVjdHVyZXMgRXN0cnVjdHVyYXMgcHJlc3VwdWVzdGFyaWFzIHF1ZSB2YW4gYSBzZXIgYWN0dWFsaXphZGFzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8YW55PlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZUJ1ZGdldFN0cnVjdHVyZUZpdmUoc3RydWN0dXJlczogSUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZpdmVbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0KGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWE1X2Rhby5waHBgLCBzdHJ1Y3R1cmVzLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBZ3JlZ2EgdW5hIG8gdmFyaWFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyA0XHJcbiAgICAgKiBAcGFyYW0gc3RydWN0dXJlcyBMYXMgZXN0cnVjdHVyYXMgcXVlIHZhbiBhIHNlciByZWdpc3RyYWRhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRCdWRnZXRTdHJ1Y3R1cmVGaXZlKHN0cnVjdHVyZXM6IElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGaXZlW10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTVfZGFvLnBocGAsIHN0cnVjdHVyZXMsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgdG9kYSBsYSBlc3RydWN0dXJhIHByZXN1cHVlc3RhcmlhIDVcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhRml2ZVtdPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJ1ZGdldFN0cnVjdHVyZUZpdmUobGV2ZWw6IG51bWJlciA9IG51bGwpOiBPYnNlcnZhYmxlPE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGaXZlQ29tcGxldGVbXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhRml2ZUNvbXBsZXRlW10+KFxyXG4gICAgICAgIGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWE1X2Rhby5waHA/Y29tcGxldGU9dHJ1ZWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXNwOiBhbnkpID0+IHJlc3AuZGF0YS5tYXAoZSA9PiBuZXcgTUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZpdmVDb21wbGV0ZShlLCBsZXZlbCkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGEgZXN0cnVjdHVyYSBwcmVzdXB1ZXN0YXJpYSA1IHBvciBlbCBJZCBkZSBsYSBlc3RydWN0dXJhIDRcclxuICAgICAqIEBwYXJhbSBpZEVwNCBpZCBkZSBsYSBlc3RydWN0dXJhIHByZXN1cHVlc3RhcmlhIDRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJ1ZGdldFN0cnVjdHVyZUZpdmVCeUlkRXA0KGlkRXA0Pzogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnlbXT4oXHJcbiAgICAgICAgYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTVfZGFvLnBocCR7aWRFcDQgPyBgP2lkX2VwND0ke2lkRXA0fWAgOiAnJ31gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55KSA9PiByZXNwLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGaXZlKGVsZW1lbnQpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBFbGltaW5hIHVuYSBvIHZhcmlhcyBlc3RydWN0dXJhcyBwcmVzdXB1ZXN0YXJpYXNcclxuICAgICAqIEBwYXJhbSBpZFN0cnVjdHVyZXMgSWQgZGUgbGFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyAzIHF1ZSB2YW5hICBzZXIgZWxpbWluYWRhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxldGVCdWRnZXRTdHJ1Y3R1cmVGb3VyKGlkU3RydWN0dXJlczogYW55W10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoJ2RlbGV0ZScsIGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWE0X2Rhby5waHBgLFxyXG4gICAgICB7IGJvZHk6IGlkU3RydWN0dXJlcywgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFjdHVhbGl6YSB1bmEgbyB2YXJpYXMgZXN0cnVjdHVyYXMgNFxyXG4gICAgICogQHBhcmFtIHN0cnVjdHVyZXMgRXN0cnVjdHVyYXMgcHJlc3VwdWVzdGFyaWFzIHF1ZSB2YW4gYSBzZXIgYWN0dWFsaXphZGFzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8YW55PlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZUJ1ZGdldFN0cnVjdHVyZUZvdXIoc3RydWN0dXJlczogSUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZvdXJbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0KGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWE0X2Rhby5waHBgLCBzdHJ1Y3R1cmVzLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBZ3JlZ2EgdW5hIG8gdmFyaWFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyA0XHJcbiAgICAgKiBAcGFyYW0gc3RydWN0dXJlcyBMYXMgZXN0cnVjdHVyYXMgcXVlIHZhbiBhIHNlciByZWdpc3RyYWRhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRCdWRnZXRTdHJ1Y3R1cmVGb3VyKHN0cnVjdHVyZXM6IElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGb3VyW10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTRfZGFvLnBocGAsIHN0cnVjdHVyZXMsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyA0XHJcbiAgICAgKiBAcGFyYW0gaWRFcDMgSWQgZGUgbGEgZXN0cnVjdHVyYSBwcmVzdXB1ZXN0YXJpYSAzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUVzdHJ1Y3R1cmFwcmVzdXB1ZXN0YXJpYVtdPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJ1ZGdldFN0cnVjdHVyZUZvdXIoaWRFcDM/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGb3VyW10+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZvdXJbXT4oXHJcbiAgICAgICAgYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTRfZGFvLnBocCR7aWRFcDMgPyBgP2lkX2VwMz0ke2lkRXAzfWAgOiAnJ31gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55KSA9PiByZXNwLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGb3VyKGVsZW1lbnQpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBFbGltaW5hIHVuYSBvIHZhcmlhcyBlc3RydWN0dXJhcyBwcmVzdXB1ZXN0YXJpYXNcclxuICAgICAqIEBwYXJhbSBpZFN0cnVjdHVyZXMgSWQgZGUgbGFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyAzIHF1ZSB2YW5hICBzZXIgZWxpbWluYWRhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxldGVCdWRnZXRTdHJ1Y3R1cmVUaHJlZShpZFN0cnVjdHVyZXM6IGFueVtdKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KCdkZWxldGUnLCBgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhM19kYW8ucGhwYCxcclxuICAgICAgeyBib2R5OiBpZFN0cnVjdHVyZXMsIGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBY3R1YWxpemEgdW5hIG8gdmFyaWFzIGVzdHJ1Y3R1cmFzIDNcclxuICAgICAqIEBwYXJhbSBzdHJ1Y3R1cmVzIEVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyBxdWUgdmFuIGEgc2VyIGFjdHVhbGl6YWRhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVCdWRnZXRTdHJ1Y3R1cmVUaHJlZShzdHJ1Y3R1cmVzOiBJRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVGhyZWVbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0KGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWEzX2Rhby5waHBgLCBzdHJ1Y3R1cmVzLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBZ3JlZ2EgdW5hIG8gdmFyaWFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyAzXHJcbiAgICAgKiBAcGFyYW0gc3RydWN0dXJlcyBMYXMgZXN0cnVjdHVyYXMgcXVlIHZhbiBhIHNlciByZWdpc3RyYWRhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRCdWRnZXRTdHJ1Y3R1cmVUaHJlZShzdHJ1Y3R1cmVzOiBJRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVGhyZWVbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhM19kYW8ucGhwYCwgc3RydWN0dXJlcyxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU2UgdHJhZSBsYSBlc3RydWN0dXJhIHByZXN1cHVlc3RhcmlhIGNvbXBsZXRhIGhhc3RhIGVsIG5pdmVsIDNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxhbnlbXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRCdWRnZXRTdHJ1Y3R1cmVUaHJlZUNvbXBsZXRlKGxldmVsOiBudW1iZXIpOiBPYnNlcnZhYmxlPE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGaXZlQ29tcGxldGVbXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhRml2ZUNvbXBsZXRlW10+KFxyXG4gICAgICAgIGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWEzX2Rhby5waHA/Y29tcGxldGU9dHJ1ZWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXNwOiBhbnkpID0+IHJlc3AuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZpdmVDb21wbGV0ZShlbGVtZW50LCBsZXZlbCkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyAzXHJcbiAgICAgKiBAcGFyYW0gaWRFcDIgSWQgZGUgbGEgZXN0cnVjdHVyYSBwcmVzdXB1ZXN0YXJpYSAyXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUVzdHJ1Y3R1cmFwcmVzdXB1ZXN0YXJpYVtdPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJ1ZGdldFN0cnVjdHVyZVRocmVlKGlkRXAyPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVGhyZWVbXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVGhyZWVbXT4oXHJcbiAgICAgICAgYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTNfZGFvLnBocCR7aWRFcDIgPyBgP2lkX2VwMj0ke2lkRXAyfWAgOiAnJ31gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55KSA9PiByZXNwLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFUaHJlZShlbGVtZW50KSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gRWxpbWluYSB1bmEgbyB2YXJpYXMgZXN0cnVjdHVyYXMgcHJlc3VwdWVzdGFyaWFzIHVub1xyXG4gICAgICogQHBhcmFtIGlkU3RydWN0dXJlcyBJZCBkZSBsYSBvIGxhcyBlc3RydWN0dXJhcyBwcmVzdXB1ZXN0YXJpYXMgcXVlIHZhbiBhIHNlciBlbGltaW5hZGFzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8YW55PlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlbGV0ZUJ1ZGdldFN0cnVjdHVyZVR3byhpZFN0cnVjdHVyZXM6IGFueVtdKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KCdkZWxldGUnLCBgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhMl9kYW8ucGhwYCxcclxuICAgICAgeyBib2R5OiBpZFN0cnVjdHVyZXMsIGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBY3R1YWxpemEgdW5hIGVzdHJ1Y3R1cmEgcHJlc3VwdWVzdGFyaWEgZG9zXHJcbiAgICAgKiBAcGFyYW0gc3RydWN0dXJlIEVzdHJ1Y3R1cmEgcHJlc3VwdWVzdGFyaWEgdW5vIHF1ZSBzZSB2YSBhIGFjdHVhbGl6YXJcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxhbnk+XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVCdWRnZXRTdHJ1Y3R1cmVUd28oc3RydWN0dXJlOiBJRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVHdvW10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dChgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhMl9kYW8ucGhwYCwgc3RydWN0dXJlLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RyYSBsYXMgZXN0cnVjdHVyYXMgcHJlc3VwdWVzdHJpYXMgZG9zIGVuIGxhIGJhc2UgZGUgZGF0b3NcclxuICAgICAqIEBwYXJhbSBidWRnZXRTdHJ1Y3R1cmVzIEFycmF5IGRlIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhIHF1ZSBzZSB2YW4gYSByZWdpc3RyYXJcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxhbnk+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0QnVkZ2V0U3RydWN0dXJlVHdvKGJ1ZGdldFN0cnVjdHVyZXM6IElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFUd29bXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhMl9kYW8ucGhwYCxcclxuICAgICAgYnVkZ2V0U3RydWN0dXJlcywgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhIGVzdHJ1Y3R1cmEgcHJlc3VwdWVzdGFyaWFcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhW10+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0QnVkZ2V0U3RydWN0dXJlVHdvKGlkRXAxOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFUd29bXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVHdvW10+KGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWEyX2Rhby5waHA/aWRfZXAxPSR7aWRFcDF9YCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKChyZXNwOiBhbnkpID0+IHJlc3AuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVR3byhlbGVtZW50KSkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGEgZXN0cnVjdHVyYSBwcmVzdXB1ZXN0YXJpYVxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFbXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRCdWRnZXRTdHJ1Y3R1cmVUd29BbGwoKTogT2JzZXJ2YWJsZTxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVHdvW10+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVR3b1tdPihgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhMl9kYW8ucGhwYCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKChyZXNwOiBhbnkpID0+IHJlc3AuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVR3byhlbGVtZW50KSkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEVsaW1pbmEgdW5hIG8gdmFyaWFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyB1bm9cclxuICAgICAqIEBwYXJhbSBpZFN0cnVjdHVyZXMgSWQgZGUgbGEgbyBsYXMgZXN0cnVjdHVyYXMgcHJlc3VwdWVzdGFyaWFzIHF1ZSB2YW4gYSBzZXIgZWxpbWluYWRhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxldGVCdWRnZXRTdHJ1Y3R1cmVPbmUoaWRTdHJ1Y3R1cmVzOiBhbnlbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdCgnZGVsZXRlJywgYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTFfZGFvLnBocGAsXHJcbiAgICAgIHsgYm9keTogaWRTdHJ1Y3R1cmVzLCBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWN0dWFsaXphIHVuYSBlc3RydWN0dXJhIHByZXN1cHVlc3RhcmlhIHVub1xyXG4gICAgICogQHBhcmFtIHN0cnVjdHVyZSBFc3RydWN0dXJhIHByZXN1cHVlc3RhcmlhIHVubyBxdWUgc2UgdmEgYSBhY3R1YWxpemFyXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8YW55PlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlQnVkZ2V0U3RydWN0dXJlT25lKHN0cnVjdHVyZTogSUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYU9uZVtdKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQoYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTFfZGFvLnBocGAsIHN0cnVjdHVyZSxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0cmEgbGFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RyaWFzIGVuIGxhIGJhc2UgZGUgZGF0b3NcclxuICAgICAqIEBwYXJhbSBidWRnZXRTdHJ1Y3R1cmVzIEFycmF5IGRlIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhIHF1ZSBzIGV2YW4gYSByZWdpc3RyYXJcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxhbnk+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0QnVkZ2V0U3RydWN0dXJlT25lKGJ1ZGdldFN0cnVjdHVyZXM6IElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFPbmVbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhMV9kYW8ucGhwYCxcclxuICAgICAgYnVkZ2V0U3RydWN0dXJlcywgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhIGVzdHJ1Y3R1cmEgcHJlc3VwdWVzdGFyaWFcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhW10+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0QnVkZ2V0U3RydWN0dXJlT25lKCk6IE9ic2VydmFibGU8TUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYU9uZVtdPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYU9uZVtdPihgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhMV9kYW8ucGhwYCxcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICAgIG1hcCgoKHJlc3A6IGFueSkgPT4gcmVzcC5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhT25lKGVsZW1lbnQpKSkpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBjb25maWd1cmFjaW9uZXMgZGUgbGEgZXN0cnVjdHVyYSBwcmVzdXB1ZXN0YXJpYVxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1Db25maWd1cmF0aW9uU1BHW10+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29uZmlndXJhdGlvblNQRygpOiBPYnNlcnZhYmxlPE1Db25maWd1cmF0aW9uU1BHPiB7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNQ29uZmlndXJhdGlvblNQRz4oYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYV9jb25maWdfZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXNwOiBhbnkpID0+IG5ldyBNQ29uZmlndXJhdGlvblNQRyhyZXNwLmRhdGFbMF0pKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgY29uZmlndXJhY2lvbmVzIGRlIGxvcyBwcm92ZWVkb3Jlc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1Db25maWd1cmF0aW9uUlBDW10+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29uZmlndXJhdGlvblJQQygpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUNvbmZpZ3VyYXRpb25SUEM+KGAke3RoaXMuVVJMfS9kYW8vcnBjL3Byb3ZlZWRvcl9jb25maWdfZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXNwOiBJUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzcC5kYXRhID0gbmV3IE1Db25maWd1cmF0aW9uUlBDKHJlc3AuZGF0YSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXNwXHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGF0ZVRvU3RyaW5nKGRhdGU6IERhdGUpOiBzdHJpbmd7XHJcbiAgICAgIHJldHVybiBgJHtkYXRlLmdldEZ1bGxZZWFyKCl9LSR7XHJcbiAgICAgICAgZGF0ZS5nZXRNb250aCgpICsgMSA+PSAxMCA/IGRhdGUuZ2V0TW9udGgoKSArIDEgOiBgMCR7ZGF0ZS5nZXRNb250aCgpICsgMX1gXHJcbiAgICAgIH0tJHtcclxuICAgICAgICBkYXRlLmdldERhdGUoKSA+PSAxMCA/IGRhdGUuZ2V0RGF0ZSgpIDogYDAke2RhdGUuZ2V0RGF0ZSgpfWBcclxuICAgICAgfWBcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBjb25maWd1cmFjaW9uZXMgZGUgU2VndXJpZGFkXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbmZpZ1NTUygpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3Nzcy9zZWd1cmlkYWRfY29uZmlnX2Rhby5waHBgLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogSVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcC5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlc3AuZGF0YSA9IG5ldyBNQ29uZmlnU1NTKHJlc3AuZGF0YSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXNwXHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50cyhzeXN0ZW1Db2RlOiBzdHJpbmcgPSBudWxsLCBwZXJtaXQ6IGJvb2xlYW4pOiBPYnNlcnZhYmxlPElSZXNwb25zZT57XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KFxyXG4gICAgICAgIGAke3RoaXMuVVJMfS9kYW8vc3NzL2NvbXBvbmVudGVzX2Rhby5waHA/JHtzeXN0ZW1Db2RlID8gYGNvZHNpcz0ke3N5c3RlbUNvZGV9JHtcclxuICAgICAgICAgIHBlcm1pdCA/IGAmcGVybWl0PXRydWVgIDogJydcclxuICAgICAgICB9YCA6ICcnfWAsXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfVxyXG4gICAgICApLnBpcGUoXHJcbiAgXHJcbiAgICAgICAgbWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUNvbXBvbmVudChlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICBcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBmdWVudGVzIGRlIGZpbmFuY2lhbWllbnRvXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUZ1ZW50ZUZpbmFuY2lhbWllbnRvW10+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RnVlbnRlRmluYW5jaWFtaWVudG8oKTogT2JzZXJ2YWJsZTxNRnVlbnRlRmluYW5jaWFtaWVudG9bXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNRnVlbnRlRmluYW5jaWFtaWVudG9bXT4oYCR7dGhpcy5VUkx9L2Rhby9zcGcvZnVlbnRlX2ZpbmFuY2lhbWllbnRvX2Rhby5waHBgLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55KSA9PiByZXNwLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1GdWVudGVGaW5hbmNpYW1pZW50byhlbGVtZW50KSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgY2VudHJvcyBkZSBjb3N0b1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1DZW50cm9Db3N0b1tdPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENlbnRyb0Nvc3RvKCk6IE9ic2VydmFibGU8TUNlbnRyb0Nvc3RvW10+IHtcclxuICAgICAgY29uc3QgcmVxdWVzdDogSVJlcXVlc3QgPSB7XHJcbiAgICAgICAgb3BlcmFjaW9uOiAnb2J0ZW5lckRhdGEnLFxyXG4gICAgICAgIHNpZ2VzcF9jb25leGlvbjoge1xyXG4gICAgICAgICAgc2Vydmlkb3I6IHRoaXMuVVJMLFxyXG4gICAgICAgICAgdXN1YXJpbzogdGhpcy51c3VhcmlvQWN0aXZvLmdldEludGVyZmFjZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxNQ2VudHJvQ29zdG9bXT4oYCR7dGhpcy5VUkx9L2Rhby9zY2cvY2VudHJvY29zdG9fZGFvLnBocGAsIHJlcXVlc3QpLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXNwOiBhbnlbXSkgPT4gcmVzcC5tYXAoZWxlbWVudCA9PiBuZXcgTUNlbnRyb0Nvc3RvKGVsZW1lbnQpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyBjZW50cm9zIGRlIGNvc3RvXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvc3RDZW50ZXJzKCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zY2cvY2VudHJvX2Nvc3RvX2Rhby5waHBgLCBcclxuICAgICAge2hlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKX1cclxuICAgICAgKS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBJUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNQ2VudHJvQ29zdG8oZWxlbWVudCkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzXHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIGVsIGRpYWxvZyBkZSBjaGVja2tzXHJcbiAgICAgKiBAcGFyYW0gY29sdW1ucyBDb2x1bW5hcyBxdWUgdmEgYSB0ZW5lciBsYSB0YWJsYVxyXG4gICAgICogQHBhcmFtIHRpdGxlIFTDrXR1bG8gZGUgbGEgbW9kYWxcclxuICAgICAqIEBwYXJhbSBkYXRhU291cmNlIERhdGEgcXVlIHMgZXZhIGEgbW9zdHJhciBlbiBsYSB0YWJsYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3BlbkRpYWxvZ011bHRpU2VsZWN0KGNvbHVtbnM6IHN0cmluZ1tdLCB0aXRsZTogc3RyaW5nLCBkYXRhU291cmNlOiBhbnlbXSxcclxuICAgIGNvbHVtbk5hbWVzPzogc3RyaW5nW10pOiBQcm9taXNlPGFueVtdPiB7XHJcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFRhYmxlU2VsZWN0Q29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgY29sdW1uczogY29sdW1ucyxcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IGRhdGFTb3VyY2UsXHJcbiAgICAgICAgICBjb2x1bW5OYW1lc1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2lkdGg6ICc0NTBweCcsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiAnOTB2aCdcclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIGVsIGRpYWxvZyBkZSBsYXMgY29tdW5pZGFkZXNcclxuICAgICAqIEByZXR1cm4gUHJvbWlzZTxNUGxhblVuaWNvQ3VlbnRhPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG9wZW5EaWFsb2dQbGFuVW5pY29DdWVudGFzKCk6IFByb21pc2U8TVBsYW5Vbmljb0N1ZW50YT4ge1xyXG4gICAgICBsZXQgcGxhbmVzOiBNUGxhblVuaWNvQ3VlbnRhW10gPSBhd2FpdCB0aGlzLmdldExpc3RhZG9QTGFuVW5pY29DdWVudGFzKCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENhdGFsb2dvQ29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgY29sdW1uczogWydjdWVudGEnLCAnZGVub21pbmFjaW9uJ10sXHJcbiAgICAgICAgICBjb2x1bW5OYW1lczogWydjdWVudGEnLCAnZGVub21pbmFjacOzbiddLFxyXG4gICAgICAgICAgdGl0bGU6ICdDYXTDoWxvZ28gZGUgUGxhbiBkZSBDdWVudGFzIEfDqW5lcmFsJyxcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IHBsYW5lc1xyXG4gICAgICAgIH0gYXMgSUNhdGFsb2dvLFxyXG4gICAgICAgIHdpZHRoOiAnNDUwcHgnLFxyXG4gICAgICAgIG1heEhlaWdodDogJzkwdmgnXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCBsaXN0YWRvIGRlbCBwbGFuIMO6bmljbyBkZSBjdWVudGFzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TXBsYW5Vbmljb0N1ZW50YVtdPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldExpc3RhZG9QTGFuVW5pY29DdWVudGFzKCk6IE9ic2VydmFibGU8TVBsYW5Vbmljb0N1ZW50YVtdPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1QbGFuVW5pY29DdWVudGFbXT4oYCR7dGhpcy5VUkx9L2Rhby9zY2cvcGxhbl91bmljb19kYW8ucGhwYCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlc3A6IGFueSkgPT4gcmVzcC5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNUGxhblVuaWNvQ3VlbnRhKGVsZW1lbnQpKSlcclxuICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGEgY29uZmlndXJhY2nDs24gZGUgU0NHXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUNvbmZpZ3VyYWNpb25TQ0dbXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb25maWd1cmF0aW9uU0NHKCk6IE9ic2VydmFibGU8TUNvbmZpZ3VyYWNpb25TQ0dbXT4ge1xyXG4gICAgICBjb25zdCByZXF1ZXN0OiBJUmVxdWVzdCA9IHtcclxuICAgICAgICBvcGVyYWNpb246ICdvYnRlbmVyRGF0YScsXHJcbiAgICAgICAgc2lnZXNwX2NvbmV4aW9uOiB7XHJcbiAgICAgICAgICBzZXJ2aWRvcjogdGhpcy5VUkwsXHJcbiAgICAgICAgICB1c3VhcmlvOiB0aGlzLnVzdWFyaW9BY3Rpdm8uZ2V0SW50ZXJmYWNlKClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PE1Db25maWd1cmFjaW9uU0NHW10+KGAke3RoaXMuVVJMfS9kYW8vc2NnL2NvbmZpZ3VyYWNpb25fc2NnX2Rhby5waHBgLCByZXF1ZXN0KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55W10pID0+IHJlc3AubWFwKGVsZW1lbnQgPT4gbmV3IE1Db25maWd1cmFjaW9uU0NHKGVsZW1lbnQpKSlcclxuICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgdW4gZGlhbG9nIGRlIGNvbmZpcm1hY2nDs25cclxuICAgICAqIEBwYXJhbSB0aXRsZSBUw610dWxvIGRlIGxhIG1vZGFsIGRlIGNvbmZpcm1cclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lbnNhamUgKG9wY2lvbmFsKSBwYXJhIGVsIHVzdXNhcmlvXHJcbiAgICAgKiBAcmV0dXJuIFByb21pc2U8Ym9vbGVhbj5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvcGVuRGlhbG9nQ29uZmlybSh0aXRsZTogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENvbmZpcm1Db21wb25lbnQsIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICBtZXNzYWdlOiAobWVzc2FnZSkgPyBtZXNzYWdlIDogbnVsbFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2lkdGg6ICc0NTBweCcsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiAnOTB2aCdcclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ29udmllcnRlIGVsIGNvbnRlbmlkbyBkZSB1biBBYnN0cmFjdENvbnRyb2wgZW4gbWF5w7pzY3VsYSAoVXNhciBlbiBldmVudG8ga2V5dXApXHJcbiAgICAgKiBAcGFyYW0gZm9ybUdyb3VwIEZvcm11bGFyaW8gZMOzbmRlIHNlIHZhIGEgYnVzY2FyIGVsIEFic3RyYWN0Q29udHJvbFxyXG4gICAgICogQHBhcmFtIG5hbWUgTm9tYnJlIGRlbCBBYnN0cmFjdENvbnRyb2xcclxuICAgICAqIEByZXR1cm4gdm9pZFxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNoYW5nZVRvVXBwZXJDYXNlKGZvcm1Hcm91cDogRm9ybUdyb3VwLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgdGhpcy5nZXRBYnN0cmFjdENvbnRyb2woZm9ybUdyb3VwLCBuYW1lKS5zZXRWYWx1ZSh0aGlzLmdldEFic3RyYWN0Q29udHJvbChmb3JtR3JvdXAsIG5hbWUpLnZhbHVlLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgZWwgQWJzdHJhY3RDb250cm9sIGRlIHVuIGZvcm11bGFyaW9cclxuICAgICAqIEBwYXJhbSBmb3JtR3JvdXAgRm9ybXVsYXJpbyBkb25kZSBzZSB2YSBhIGJ1c2NhciBlbCBBYnN0cmFjdENvbnRyb2xcclxuICAgICAqIEBwYXJhbSBuYW1lIE5vbWJyZSBkZWwgQWJzdHJhY3RDb250cm9sXHJcbiAgICAgKiBAcmV0dXJuIEFic3RyYWN0Q29udHJvbFxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFic3RyYWN0Q29udHJvbChmb3JtR3JvdXA6IEZvcm1Hcm91cCwgbmFtZTogc3RyaW5nKTogQWJzdHJhY3RDb250cm9sIHtcclxuICAgICAgcmV0dXJuIGZvcm1Hcm91cC5nZXQobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gRnVuY2nDs24gcGFyYSBlc2NyaWJpciBzb2xvIGRlY2ltYWxlcyAoVXNhciBlbiBldmVudG8ga2V5cHJlc3MpXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgRXZlbnRvIGRlbCB0ZWNsYWRvXHJcbiAgICAgKiBAcmV0dXJuIGJvb2xlYW5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbmx5RGVjaW1hbChldmVudDogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKGV2ZW50KTtcclxuICAgICAgbGV0IGNvbnRQb2ludDogbnVtYmVyID0gMDtcclxuICAgICAgbGV0IG51bWJlcjogc3RyaW5nID0gZXZlbnQudGFyZ2V0LnZhbHVlICsgZXZlbnQua2V5O1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhudW1iZXIpO1xyXG5cclxuICAgICAgaWYgKHRoaXMub25seU51bWJlcnMoZXZlbnQpIHx8IGV2ZW50LmtleSA9PT0gJywnKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChudW1iZXIuY2hhckF0KGkpID09PSAnLCcpIHtcclxuICAgICAgICAgICAgY29udFBvaW50Kys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29udFBvaW50ID4gMSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAobnVtYmVyLmluZGV4T2YoJywnKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgaWYgKG51bWJlci5zdWJzdHJpbmcobnVtYmVyLmluZGV4T2YoJywnKSsxLCBudW1iZXIubGVuZ3RoKS5sZW5ndGggPiAyKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFByZXZpZW5lIHF1ZSBzZSBlc2NyaWJhbiBsZXRyYXMgZW4gZWwgaW5wdXQgKFVzYXIgZW4ga2V5cHJlc3MpXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgRXZlbnRvIGRlbCB0ZWNsYWRvXHJcbiAgICAgKiBAcmV0dXJuIGJvb2xlYW5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbmx5TnVtYmVycyhldmVudD86IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhldmVudCk7XHJcbiAgICAgIGlmICghaXNOYU4oK2V2ZW50LmtleSkgfHwgZXZlbnQua2V5Q29kZSA9PSA4KSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgZWwgZGlhbG9nIGRlIGxhcyBjb211bmlkYWRlc1xyXG4gICAgICogQHJldHVybiBQcm9taXNlPE1Db211bmlkYWQ+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgb3BlbkRpYWxvZ1VuaWRhZGVzVHJpYnV0YXJpYXMoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgbGV0IHVkVHJpYnV0YXJpYXM6IE1VbmlkYWRUcmlidXRhcmlhW10gPSBhd2FpdCB0aGlzLmdldFVuaWRhZGVzVHJpYnV0YXJpYXMoKS50b1Byb21pc2UoKTtcclxuICAgICAgbGV0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ2F0YWxvZ29Db21wb25lbnQsIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBjb2x1bW5zOiBbJ2HDsW8nLCAnbnJvX2RlY3JldG8nLCAnZmVjaGFfZGVjcmV0bycsICdlbnRyYWRhX3ZpZGVuY2lhJywgJ3B1YmxpY2FjaW9uX2dhY2V0YScsICducm9fZ2FjZXRhJywgJ3ZhbG9ydXQnXSxcclxuICAgICAgICAgIHRpdGxlOiAnQ2F0w6Fsb2dvIGRlIFVuaWRhZGVzIFRyaWJ1dGFyaWFzJyxcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IHVkVHJpYnV0YXJpYXNcclxuICAgICAgICB9IGFzIElDYXRhbG9nbyxcclxuICAgICAgICB3aWR0aDogJzQ1MHB4JyxcclxuICAgICAgICBtYXhIZWlnaHQ6ICc5MHZoJ1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIHVuaWRhZGVzIHRyaWJ1dGFyaWFzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8YW55PlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFVuaWRhZGVzVHJpYnV0YXJpYXMoKTogT2JzZXJ2YWJsZTxNVW5pZGFkVHJpYnV0YXJpYVtdPiB7XHJcbiAgICAgIGNvbnN0IHJlcXVlc3Q6IElSZXF1ZXN0ID0ge1xyXG4gICAgICAgIG9wZXJhY2lvbjogJ29idGVuZXJEYXRhJyxcclxuICAgICAgICBzaWdlc3BfY29uZXhpb246IHtcclxuICAgICAgICAgIHNlcnZpZG9yOiB0aGlzLlVSTCxcclxuICAgICAgICAgIHVzdWFyaW86IHRoaXMudXN1YXJpb0FjdGl2by5nZXRJbnRlcmZhY2UoKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8TVVuaWRhZFRyaWJ1dGFyaWFbXT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvdW5kdHJpYnV0YXJpYV9kYW8ucGhwYCwgcmVxdWVzdCkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlc3A6IGFueVtdKSA9PiByZXNwLm1hcChlbGVtZW50ID0+IG5ldyBNVW5pZGFkVHJpYnV0YXJpYShlbGVtZW50KSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWJyZSB1bmEgbW9kYWwgZ8OpbmVyaWNhXHJcbiAgICAgKiBAcGFyYW0gY29sdW1ucyBDb2x1bW5hcyBxdWUgdmEgYSB0ZW5lciBsYSB0YWJsYVxyXG4gICAgICogQHBhcmFtIHRpdGxlIFTDrXR1bG8gZGVsIGRpYWxvZ1xyXG4gICAgICogQHBhcmFtIGRhdGFTb3VyY2UgRGF0YSBxdWUgc2UgdmEgYSBtb3N0cmFyIGVuIGxhIHRhYmxhXHJcbiAgICAgKiBAcmV0dXJuIFByb21pc2U8YW55PlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG9wZW5DYXRhbG9nb0dlbmVyaWNvKFxyXG4gICAgICBjb2x1bW5zOiBzdHJpbmdbXSwgXHJcbiAgICAgIHRpdGxlOiBzdHJpbmcsIFxyXG4gICAgICBkYXRhU291cmNlOiBhbnlbXSwgXHJcbiAgICAgIGNvbHVtbk5hbWVzOiBzdHJpbmdbXSA9IG51bGwsIFxyXG4gICAgICB3aWR0aDogc3RyaW5nID0gJzQ1MHB4JyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGhhc0JhY2tkcm9wPzogYm9vbGVhbixcclxuICAgICAgICBkaXNhYmxlQ2xvc2U/OiBib29sZWFuXHJcbiAgICAgIH0gPSB7ZGlzYWJsZUNsb3NlOiBmYWxzZSwgaGFzQmFja2Ryb3A6IGZhbHNlfVxyXG4gICAgKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgbGV0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ2F0YWxvZ29Db21wb25lbnQsIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBjb2x1bW5zLFxyXG4gICAgICAgICAgdGl0bGUsXHJcbiAgICAgICAgICBkYXRhU291cmNlLFxyXG4gICAgICAgICAgY29sdW1uTmFtZXNcclxuICAgICAgICB9IGFzIElDYXRhbG9nbyxcclxuICAgICAgICB3aWR0aDogd2lkdGgsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiAnOTB2aCcsXHJcbiAgICAgICAgaGFzQmFja2Ryb3A6IG9wdGlvbnMuaGFzQmFja2Ryb3AgPyBvcHRpb25zLmhhc0JhY2tkcm9wIDogZmFsc2UsXHJcbiAgICAgICAgZGlzYWJsZUNsb3NlOiBvcHRpb25zLmRpc2FibGVDbG9zZSA/IG9wdGlvbnMuZGlzYWJsZUNsb3NlIDogZmFsc2UsXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWJyZSB1bmEgbW9kYWwgZ8OpbmVyaWNhIGNvbiAyIGlucHV0c1xyXG4gICAgICogQHBhcmFtIGNvbHVtbnMgQ29sdW1uYXMgcXVlIHZhIGEgdGVuZXIgbGEgdGFibGFcclxuICAgICAqIEBwYXJhbSB0aXRsZSBUw610dWxvIGRlbCBkaWFsb2dcclxuICAgICAqIEBwYXJhbSBkYXRhU291cmNlIERhdGEgcXVlIHNlIHZhIGEgbW9zdHJhciBlbiBsYSB0YWJsYVxyXG4gICAgICogQHJldHVybiBQcm9taXNlPGFueT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBvcGVuQ2F0YWxvZ29Eb3NJbnB1dHMoXHJcbiAgICAgIGNvbHVtbnM6IHN0cmluZ1tdLFxyXG4gICAgICB0aXRsZTogc3RyaW5nLCBcclxuICAgICAgZGF0YVNvdXJjZTogYW55W10sIFxyXG4gICAgICBmaWx0ZXJEYXRhOiBmaWx0ZXJEYXRhW10sXHJcbiAgICAgIGNvbHVtbk5hbWVzOiBzdHJpbmdbXSA9IG51bGwsXHJcbiAgICAgIHdpZHRoOiBzdHJpbmcgPSBcIjQ1MHB4XCJcclxuICAgICk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENhdGFsb2dvRG9ibGVJbnB1dENvbXBvbmVudCwge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIGNvbHVtbnMsXHJcbiAgICAgICAgICB0aXRsZSxcclxuICAgICAgICAgIGRhdGFTb3VyY2UsXHJcbiAgICAgICAgICBjb2x1bW5OYW1lcyxcclxuICAgICAgICAgIGZpbHRlckRhdGFcclxuICAgICAgICB9IGFzIElDYXRhbG9nbyxcclxuICAgICAgICB3aWR0aDogd2lkdGgsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiAnOTB2aCdcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIGVsIGRpYWxvZyBkZSBsYXMgY29tdW5pZGFkZXNcclxuICAgICAqIEByZXR1cm4gUHJvbWlzZTxNQ29tdW5pZGFkPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG9wZW5EaWFsb2dDb211bmlkYWQoKTogUHJvbWlzZTxNQ29tdW5pZGFkPiB7XHJcbiAgICAgIGxldCBjb211bmlkYWRlczogTUNvbXVuaWRhZFtdID0gYXdhaXQgdGhpcy5nZXRDb211bmlkYWRlcygpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBsZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDYXRhbG9nb0NvbXBvbmVudCwge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIGNvbHVtbnM6IFsncHJlZmlqbycsICdwYWlzJywgJ2VzdGFkbycsICdtdW5pY2lwaW8nLCAncGFycm9xdWlhJywgJ2NvZGlnbycsICdjb211bmlkYWQnXSxcclxuICAgICAgICAgIHRpdGxlOiAnQ2F0w6Fsb2dvIGRlIENvbXVuaWRhZGVzJyxcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IGNvbXVuaWRhZGVzXHJcbiAgICAgICAgfSBhcyBJQ2F0YWxvZ28sXHJcbiAgICAgICAgd2lkdGg6ICc0NTBweCcsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiAnOTB2aCdcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBjb211bmlkYWRlc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1Db211bmlkYWRbXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb211bmlkYWRlcygpOiBPYnNlcnZhYmxlPE1Db211bmlkYWRbXT4ge1xyXG4gICAgICBjb25zdCByZXF1ZXN0OiBJUmVxdWVzdCA9IHtcclxuICAgICAgICBvcGVyYWNpb246ICdvYnRlbmVyRGF0YScsXHJcbiAgICAgICAgc2lnZXNwX2NvbmV4aW9uOiB7XHJcbiAgICAgICAgICBzZXJ2aWRvcjogdGhpcy5VUkwsXHJcbiAgICAgICAgICB1c3VhcmlvOiB0aGlzLnVzdWFyaW9BY3Rpdm8uZ2V0SW50ZXJmYWNlKClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PE1Db211bmlkYWRbXT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvY29tdW5pZGFkX2Rhby5waHBgLCByZXF1ZXN0KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55W10pID0+IHJlc3AubWFwKGVsZW1lbnQgPT4gbmV3IE1Db211bmlkYWQoZWxlbWVudCkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgZWwgZGlhbG9nIGRlIGxhcyBsYXMgbW9uZWRhc1xyXG4gICAgICogQHJldHVybiBQcm9taXNlPE1Nb25lZGE+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgb3BlbkRpYWxvZ01vbmVkYXMoKTogUHJvbWlzZTxNTW9uZWRhPiB7XHJcbiAgICAgIGxldCBjb2luczogTU1vbmVkYVtdID0gYXdhaXQgdGhpcy5nZXRNb25lZGFzKCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENhdGFsb2dvQ29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgY29sdW1uczogWydjb2RpZ28nLCAnZGVub21pbmFjaW9uJywgJ2lzbycsICdzaW1ib2xvJ10sXHJcbiAgICAgICAgICB0aXRsZTogJ0NhdMOhbG9nbyBkZSBNb25lZGFzJyxcclxuICAgICAgICAgIGNvbHVtbk5hbWVzOiBbJ2PDs2RpZ28nLCAnZGVub21pbmFjacOzbicsICdpc28nLCAnc2ltYm9sbyddLFxyXG4gICAgICAgICAgZGF0YVNvdXJjZTogY29pbnNcclxuICAgICAgICB9IGFzIElDYXRhbG9nbyxcclxuICAgICAgICB3aWR0aDogJzQ1MHB4JyxcclxuICAgICAgICBtYXhIZWlnaHQ6ICc5MHZoJ1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIG1vbmVkYXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNTW9uZWRhW10+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TW9uZWRhcygpOiBPYnNlcnZhYmxlPE1Nb25lZGFbXT4ge1xyXG4gICAgICBjb25zdCByZXF1ZXN0OiBJUmVxdWVzdCA9IHtcclxuICAgICAgICBvcGVyYWNpb246ICdvYnRlbmVyRGF0YScsXHJcbiAgICAgICAgc2lnZXNwX2NvbmV4aW9uOiB7XHJcbiAgICAgICAgICBzZXJ2aWRvcjogdGhpcy5VUkwsXHJcbiAgICAgICAgICB1c3VhcmlvOiB0aGlzLnVzdWFyaW9BY3Rpdm8uZ2V0SW50ZXJmYWNlKClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PE1Nb25lZGFbXT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvbW9uZWRhX2Rhby5waHBgLCByZXF1ZXN0KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55W10pID0+IHJlc3AubWFwKGVsZW1lbnQgPT4gbmV3IE1Nb25lZGEoZWxlbWVudCkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgZWwgZGlhbG9nIGRlIGxhcyBsYXMgY3VlbnRhcyBjb250YWJsZXMgKEN1ZW50YXMgSW5zdGl0dWNpb25hbGVzKVxyXG4gICAgICogQHJldHVybiBQcm9taXNlPE1jdWVudGFJbnN0aXR1Y2lvbmFsPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG9wZW5EaWFsb2dDdWVudGFzSW5zdGl0dWNpb25hbGVzKCk6IFByb21pc2U8TUN1ZW50YUluc3RpdHVjaW9uYWw+IHtcclxuICAgICAgbGV0IGFjY291bnRzOiBNQ3VlbnRhSW5zdGl0dWNpb25hbFtdID0gYXdhaXQgdGhpcy5nZXRDdWVudGFzSW5zdGl0dWNpb25hbGVzKCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENhdGFsb2dvQ29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgY29sdW1uczogWydjdWVudGEnLCAnZGVub21pbmFjaW9uJ10sXHJcbiAgICAgICAgICBjb2x1bW5OYW1lczogWydjdWVudGEnLCAnZGVub21pbmFjacOzbiddLFxyXG4gICAgICAgICAgdGl0bGU6ICdDYXTDoWxvZ28gZGUgcGxhbiBkZSBjdWVudGEgaW5zdGl0dWNpb25hbCcsXHJcbiAgICAgICAgICBkYXRhU291cmNlOiBhY2NvdW50c1xyXG4gICAgICAgIH0gYXMgSUNhdGFsb2dvLFxyXG4gICAgICAgIHdpZHRoOiAnNDUwcHgnLFxyXG4gICAgICAgIG1heEhlaWdodDogJzkwdmgnXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgY3VlbnRhcyBjb250YWJsZXMgKEN1ZW50YXMgSW5zdGl0dWNpb25hbGVzKVxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1DdWVudGFJbnN0aXR1Y2lvbmFsW10+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q3VlbnRhc0luc3RpdHVjaW9uYWxlcyhpbnZlbnRvcnk/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxNQ3VlbnRhSW5zdGl0dWNpb25hbFtdPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1DdWVudGFJbnN0aXR1Y2lvbmFsW10+KGAke3RoaXMuVVJMfS9kYW8vc2NnL2N1ZW50YXNfZGFvLnBocCR7KGludmVudG9yeSkgPyAnP2ludmVudG9yeT10cnVlJyA6ICcnfWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXNwOiBhbnkpID0+IHJlc3AuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUN1ZW50YUluc3RpdHVjaW9uYWwoZWxlbWVudCkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgZWwgZGlhbG9nIGRlIGxhcyBjdWVudGFzIGRlIHByZXN1cHVlc3RvIChSZWN1cnNvcyB5IEVncmVzb3MpXHJcbiAgICAgKiBAcmV0dXJuIFByb21pc2U8TUN1ZW50YVByZXN1cHVlc3RvPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG9wZW5EaWFsb2dDdWVudGFzUHJlc3VwdWVzdG8oKTogUHJvbWlzZTxNQ3VlbnRhUHJlc3VwdWVzdG8+IHtcclxuICAgICAgbGV0IGFjY291bnRzOiBNQ3VlbnRhUHJlc3VwdWVzdG9bXSA9IGF3YWl0IHRoaXMuZ2V0Q3VlbnRhc1ByZXN1cHVlc3RvKCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENhdGFsb2dvQ29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgY29sdW1uTmFtZXM6IFsnY3VlbnRhJywgJ2Rlbm9taW5hY2nDs24nXSxcclxuICAgICAgICAgIGNvbHVtbnM6IFsnY3VlbnRhJywgJ2Rlbm9taW5hY2lvbiddLFxyXG4gICAgICAgICAgdGl0bGU6ICdDYXTDoWxvZ28gZGUgQ3VlbnRhcyBkZSBQcmVzdXB1ZXN0bycsXHJcbiAgICAgICAgICBkYXRhU291cmNlOiBhY2NvdW50c1xyXG4gICAgICAgIH0gYXMgSUNhdGFsb2dvLFxyXG4gICAgICAgIHdpZHRoOiAnNDUwcHgnLFxyXG4gICAgICAgIG1heEhlaWdodDogJzkwdmgnXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgY3VlbnRhcyBkZSByZWN1cnNvcyB5IGVncmVzb3NcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNQ3VlbnRhUHJlc3VwdWVzdG8+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q3VlbnRhc1ByZXN1cHVlc3RvKCk6IE9ic2VydmFibGU8TUN1ZW50YVByZXN1cHVlc3RvW10+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUN1ZW50YVByZXN1cHVlc3RvPihgJHt0aGlzLlVSTH0vZGFvL3NjZy9wbGFuX3VuaWNvX2N1ZW50YXNfZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4gcmVzLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1DdWVudGFQcmVzdXB1ZXN0byhlbGVtZW50KSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWJyZSBlbCBjw6F0YWxvZ28gZGUgY3VlbnRhcyBkZSBsYSB0YWJsYSBcInNjZ19wbGFuX3VuaWNvX3JlXCJcclxuICAgICAqIEByZXR1cm5zIFByb21pc2U8TUN1ZW50YVByZXN1cHVlc3RvPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqIEBwYXJhbXMgZmlsdHJvOiBJbmRpY2EgYmFqbyBxdWUgcGFyYW1ldHJvcyBzZSB2YSBhIGZpbHRyYXIgZWwgY2F0YWxvZ29cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG9wZW5DYXRhbG9nb0N1ZW50YXNQcmVzdXNwdWVzdG8oXHJcbiAgICAgIHRpdHVsbzogc3RyaW5nLFxyXG4gICAgICBmaWx0cm86IGZpbHRyb0N1ZW50YXNQcmVzdXB1ZXN0byA9IG51bGwsXHJcbiAgICAgIGFuY2hvOiBzdHJpbmcgPSAnNzUwcHgnXHJcbiAgICApOiBQcm9taXNlPE1DdWVudGFQcmVzdXB1ZXN0bz4ge1xyXG4gICAgICBsZXQgY3VlbnRhczogTUN1ZW50YVByZXN1cHVlc3RvW10gPSBbXTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Q3VlbnRhc1ByZXN1cHVlc3RvKCkudG9Qcm9taXNlKCkudGhlbigocmVzKSA9PiB7XHJcbiAgICAgICAgY3VlbnRhcyA9IHJlcztcclxuICAgICAgICBpZiAoZmlsdHJvKSB7XHJcbiAgICAgICAgICBpZiAoZmlsdHJvLmVzdGFkbykge1xyXG4gICAgICAgICAgICBjdWVudGFzID0gY3VlbnRhcy5maWx0ZXIoYyA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGMuc3RhdHVzID09IGZpbHRyby5lc3RhZG9cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChmaWx0cm8udGlwbykge1xyXG4gICAgICAgICAgICBjdWVudGFzID0gY3VlbnRhcy5maWx0ZXIoYyA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGMudGlwbyA9PSBmaWx0cm8udGlwb1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjdWVudGFzID0gY3VlbnRhcy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICBlWydwcm92U3RhdHVzJ10gPSBlLnN0YXR1cyA9PSBcIkNcIiA/IFwiTW92aW1pZW50b3NcIiA6IFwiVG90YWxpemFkb3JhXCJcclxuICAgICAgICAgIGVbJ3Byb3ZUeXBlJ10gPSBlLnN0YXR1cyA9PSBcIlJcIiA/IFwiUmVjdXJzb3NcIiA6IFwiSW5ncmVzb3NcIlxyXG4gICAgICAgICAgcmV0dXJuIGVcclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gICAgICByZXR1cm4gdGhpcy5vcGVuQ2F0YWxvZ29HZW5lcmljbyhcclxuICAgICAgICBbXCJjdWVudGFcIixcImRlbm9taW5hY2lvblwiLFwicHJvdlN0YXR1c1wiLFwicHJvdlR5cGVcIl0sXHJcbiAgICAgICAgdGl0dWxvLFxyXG4gICAgICAgIGN1ZW50YXMsXHJcbiAgICAgICAgW1wiQ3VlbnRhXCIsXCJEZW5vbWluYWNpw7NuXCIsXCJFc3RhZG9cIixcIlRpcG9cIl0sXHJcbiAgICAgICAgYW5jaG9cclxuICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgZWwgY8OhdGFsb2dvIGRlIGN1ZW50YXMgZGUgbGEgdGFibGEgXCJzcGdfY3VlbnRhc1wiXHJcbiAgICAgKiBAcmV0dXJucyBQcm9taXNlPE1DdWVudGFFZ3Jlc29zPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqIEBwYXJhbXMgcHJlc3VwdWVzdG86IEluZGljYSBzaSBzZSBhIHRyYWJhamFyIGNvbiBlc3RydWN0dXJhIGRlIHByZXN1cHVlc3RvIG8gbm9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG9wZW5DYXRhbG9nb0N1ZW50YXNFZ3Jlc28oXHJcbiAgICAgIHRpdHVsbzogc3RyaW5nLFxyXG4gICAgICBwcmVzdXB1ZXN0bzogYm9vbGVhbiA9IHRydWUsXHJcbiAgICAgIGFuY2hvOiBzdHJpbmcgPSBcIjc1MHB4XCJcclxuICAgICk6IFByb21pc2U8TUN1ZW50YUVncmVzb3M+e1xyXG4gICAgICBsZXQgY3VlbnRhczogTUN1ZW50YUVncmVzb3NbXSA9IFtdO1xyXG4gICAgICBhd2FpdCB0aGlzLmdldEV4cGVuc2VBY2NvdW50cygpLnRvUHJvbWlzZSgpLnRoZW4ocmVzID0+IHtcclxuICAgICAgICBjdWVudGFzID0gcmVzXHJcbiAgICAgICAgY3VlbnRhcyA9IGN1ZW50YXMuZmlsdGVyKGUgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGUuc3RhdHVzID09IFwiQ1wiXHJcbiAgICAgICAgfSkubWFwKGUgPT4ge1xyXG4gICAgICAgICAgZVsncHJvdlN0YXR1cyddID0gZS5zdGF0dXMgPT0gXCJDXCIgPyBcIk1vdmltaWVudG9zXCIgOiBcIlRvdGFsaXphZG9yYVwiXHJcbiAgICAgICAgICByZXR1cm4gZTtcclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gICAgICBpZiAocHJlc3VwdWVzdG8pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcGVuQ2F0YWxvZ29Eb3NJbnB1dHMoXHJcbiAgICAgICAgICBbXCJjdWVudGFcIixcImRlbm9taW5hY2lvblwiLFwiZXN0cnVjdHVyYVwiLFwicHJvdlN0YXR1c1wiXSxcclxuICAgICAgICAgIHRpdHVsbyxcclxuICAgICAgICAgIGN1ZW50YXMsXHJcbiAgICAgICAgICBbe1xyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJDdWVudGFcIixcclxuICAgICAgICAgICAgcHJvcGVydHk6IFwiY3VlbnRhXCJcclxuICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiRXN0cnVjdHVyYVwiLFxyXG4gICAgICAgICAgICBwcm9wZXJ0eTogXCJlc3RydWN0dXJhXCJcclxuICAgICAgICAgIH1dLFxyXG4gICAgICAgICAgW1wiQ3VlbnRhXCIsIFwiRGVub21pbmFjacOzblwiLCBcIkVzdHJ1Y3R1cmFcIiwgXCJFc3RhZG9cIl0sXHJcbiAgICAgICAgICBhbmNob1xyXG4gICAgICAgIClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgZmlsdGVyZWRBY2NvdW50czogTUN1ZW50YUVncmVzb3NbXSA9IFtdO1xyXG4gICAgICAgIGN1ZW50YXMuZm9yRWFjaChjID0+IHtcclxuICAgICAgICAgIGlmICghZmlsdGVyZWRBY2NvdW50cy5maW5kKGUgPT4gZS5jdWVudGEgPT0gYy5jdWVudGEpKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkQWNjb3VudHMucHVzaChjKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbkNhdGFsb2dvR2VuZXJpY28oXHJcbiAgICAgICAgICBbXCJjdWVudGFcIixcImRlbm9taW5hY2lvblwiLFwicHJvdlN0YXR1c1wiXSxcclxuICAgICAgICAgIHRpdHVsbyxcclxuICAgICAgICAgIGZpbHRlcmVkQWNjb3VudHMsXHJcbiAgICAgICAgICBbXCJDdWVudGFcIiwgXCJEZW5vbWluYWNpw7NuXCIsIFwiRXN0YWRvXCJdLFxyXG4gICAgICAgICAgYW5jaG9cclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIGVsIGPDoXRhbG9nbyBkZSBjdWVudGFzIGRlIGxhIHRhYmxhIFwic3BpX2N1ZW50YXNcIlxyXG4gICAgICogQHJldHVybnMgUHJvbWlzZTxNQ3VlbnRhSW5ncmVzb3M+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICogQHBhcmFtcyBwcmVzdXB1ZXN0bzogSW5kaWNhIHNpIHNlIGEgdHJhYmFqYXIgY29uIGVzdHJ1Y3R1cmEgZGUgcHJlc3VwdWVzdG8gbyBub1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgb3BlbkNhdGFsb2dvQ3VlbnRhc0luZ3Jlc28oXHJcbiAgICAgIHRpdHVsbzogc3RyaW5nLFxyXG4gICAgICBwcmVzdXB1ZXN0bzogYm9vbGVhbiA9IHRydWUsXHJcbiAgICAgIGFuY2hvOiBzdHJpbmcgPSBcIjc1MHB4XCJcclxuICAgICk6IFByb21pc2U8TUN1ZW50YUluZ3Jlc29zPntcclxuICAgICAgbGV0IGN1ZW50YXM6IE1DdWVudGFJbmdyZXNvc1tdID0gW107XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2V0SW5jb21lQWNjb3VudHMoKS50b1Byb21pc2UoKS50aGVuKChyZXM6IElSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGN1ZW50YXMgPSByZXMuZGF0YVxyXG4gICAgICAgIGN1ZW50YXMgPSBjdWVudGFzLmZpbHRlcihlID0+IHtcclxuICAgICAgICAgIHJldHVybiBlLmVzdGFkbyA9PSBcIkNcIlxyXG4gICAgICAgIH0pLm1hcChlID0+IHtcclxuICAgICAgICAgIGVbJ3Byb3ZTdGF0dXMnXSA9IGUuZXN0YWRvID09IFwiQ1wiID8gXCJNb3ZpbWllbnRvc1wiIDogXCJUb3RhbGl6YWRvcmFcIlxyXG4gICAgICAgICAgcmV0dXJuIGU7XHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgICAgaWYgKHByZXN1cHVlc3RvKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbkNhdGFsb2dvRG9zSW5wdXRzKFxyXG4gICAgICAgICAgW1wiY3VlbnRhXCIsXCJkZW5vbWluYWNpb25cIixcImVzdHJ1Y3R1cmFcIixcInByb3ZTdGF0dXNcIl0sXHJcbiAgICAgICAgICB0aXR1bG8sXHJcbiAgICAgICAgICBjdWVudGFzLFxyXG4gICAgICAgICAgW3tcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiQ3VlbnRhXCIsXHJcbiAgICAgICAgICAgIHByb3BlcnR5OiBcImN1ZW50YVwiXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIkVzdHJ1Y3R1cmFcIixcclxuICAgICAgICAgICAgcHJvcGVydHk6IFwiZXN0cnVjdHVyYVwiXHJcbiAgICAgICAgICB9XSxcclxuICAgICAgICAgIFtcIkN1ZW50YVwiLCBcIkRlbm9taW5hY2nDs25cIiwgXCJFc3RydWN0dXJhXCIsIFwiRXN0YWRvXCJdLFxyXG4gICAgICAgICAgYW5jaG9cclxuICAgICAgICApXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGZpbHRlcmVkQWNjb3VudHM6IE1DdWVudGFJbmdyZXNvc1tdID0gW107XHJcbiAgICAgICAgY3VlbnRhcy5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICAgICAgaWYgKCFmaWx0ZXJlZEFjY291bnRzLmZpbmQoZSA9PiBlLmN1ZW50YSA9PSBjLmN1ZW50YSkpIHtcclxuICAgICAgICAgICAgZmlsdGVyZWRBY2NvdW50cy5wdXNoKGMpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gdGhpcy5vcGVuQ2F0YWxvZ29HZW5lcmljbyhcclxuICAgICAgICAgIFtcImN1ZW50YVwiLFwiZGVub21pbmFjaW9uXCIsXCJwcm92U3RhdHVzXCJdLFxyXG4gICAgICAgICAgdGl0dWxvLFxyXG4gICAgICAgICAgZmlsdGVyZWRBY2NvdW50cyxcclxuICAgICAgICAgIFtcIkN1ZW50YVwiLCBcIkRlbm9taW5hY2nDs25cIiwgXCJFc3RhZG9cIl0sXHJcbiAgICAgICAgICBhbmNob1xyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgfSAgICBcclxuXHJcbiAgICBwdWJsaWMgZ2V0VW5pZGFkQWRtaW5pc3RyYXRpdmEoKXtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5VUkx9L2Rhby9zcGcvdW5pZGFkX2FkbWluaXN0cmF0aXZhX2Rhby5waHBgLFxyXG4gICAgICB7aGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6YW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUFkbWluaXN0cmF0aXZlVW5pdChlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pIFxyXG4gICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIGNhcmdvcyBkZSBzZXJ2aWNpb3NcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U2VydmljZUNoYXJnZXMoKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3NvYy9zZXJ2aWNpb19jYXJnb19kYW8ucGhwYCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTVNlcnZpY2VDaGFyZ2UoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyBwYWlzZXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNQ291bnRyeT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb3VudHJpZXMoKTogT2JzZXJ2YWJsZTxNQ291bnRyeVtdPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1Db3VudHJ5PihgJHt0aGlzLlVSTH0vZGFvL3NpZ2VzcC9wYWlzX2Rhby5waHBgLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNQ291bnRyeShlKSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgZXN0YWRvc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1TdGF0ZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTdGF0ZXMoKTogT2JzZXJ2YWJsZTxNU3RhdGVbXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNU3RhdGU+KGAke3RoaXMuVVJMfS9kYW8vc2lnZXNwL2VzdGFkb19kYW8ucGhwYCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTVN0YXRlKGUpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyBtdW5pY2lwaW9zXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TU11bmljaXBhbGl0eT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRNdW5pY2lwYWxpdGllcygpOiBPYnNlcnZhYmxlPE1NdW5pY2lwYWxpdHlbXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNTXVuaWNpcGFsaXR5PihgJHt0aGlzLlVSTH0vZGFvL3NpZ2VzcC9tdW5pY2lwaW9fZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1NdW5pY2lwYWxpdHkoZSkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIHBhcnJvcXVpYXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNUGFyaXNoPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFBhcmlzaGVzKCk6IE9ic2VydmFibGU8TVBhcmlzaFtdPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1QYXJpc2g+KGAke3RoaXMuVVJMfS9kYW8vc2lnZXNwL3BhcnJvcXVpYV9kYW8ucGhwYCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTVBhcmlzaChlKSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3Mgc2lzdGVtYXMgYWN0aXZhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1TaXN0ZW1hPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNpc3RlbWFzKCk6IE9ic2VydmFibGU8TVNpc3RlbWFbXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNU2lzdGVtYT4oYCR7dGhpcy5VUkx9L2Rhby9zc3Mvc2lzdGVtYXNfZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1TaXN0ZW1hKGUpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhIG1vbmVkYSBhY3R1YWxcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q3VycmVudEN1cnJlbmN5KCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zaWdlc3AvbW9uZWRhX2FjdHVhbF9kYW8ucGhwYCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSBuZXcgTU1vbmVkYUNvbmZpZyhyZXMuZGF0YSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgdGlwb3MgZGUgb3JnYW5pemFjaW9uXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE9yZ2FuaXphdGlvblR5cGVzKCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9ycGMvdGlwb19vcmdhbml6YWNpb25fZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1Pcmdhbml6YXRpb25UeXBlKGUpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyB0aXBvcyBkZSBvcmdhbml6YWNpb25cclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U3BlY2lhbHRpZXMoKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3JwYy9lc3BlY2lhbGlkYWRfZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1TcGVjaWFsdHkoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIGRvY3VtZW50b3NcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RG9jdW1lbnRzKCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9ycGMvZG9jdW1lbnRvX2Rhby5waHBgLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNRG9jdW1lbnQoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGNsYXNpZmljYWNpb25lc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDbGFzaWZpY2F0aW9ucygpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vcnBjL2NsYXNpZmljYWNpb25fZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1DbGFzaWZpY2F0aW9uKGUpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGVsIHByZWZpam8gZGUgbG9zIHVzdWFyaW9zXHJcbiAgICAgKiBAcGFyYW0gcHJvY2VkZSBEZSBxdWUgbcOzZHVsbyBwcm9jZWRlXHJcbiAgICAgKiBAcGFyYW0gY29kc2lzIEPDs2RpZ28gZGVsIHNpc3RlbWFcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNVXN1YXJpb1ByZWZpam9bXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRVc2VyUHJlZml4KHByb2NlZGU6IHN0cmluZywgY29kc2lzOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1Vc3VhcmlvUHJlZmlqb1tdPiB7XHJcbiAgICAgIGxldCByZXF1ZXN0OiBJUmVxdWVzdCA9IHtcclxuICAgICAgICBvcGVyYWNpb246ICdvYnRlbmVyUHJlZmlqb1VzdWFyaW8nLFxyXG4gICAgICAgIHNpZ2VzcF9jb25leGlvbjoge1xyXG4gICAgICAgICAgc2Vydmlkb3I6IHRoaXMuVVJMLFxyXG4gICAgICAgICAgdXN1YXJpbzoge1xyXG4gICAgICAgICAgICAuLi50aGlzLnVzdWFyaW9BY3Rpdm8uZ2V0SW50ZXJmYWNlKCksXHJcbiAgICAgICAgICAgIHByb2NlZGU6IHByb2NlZGUsXHJcbiAgICAgICAgICAgIGNvZHNpczogY29kc2lzXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxNVXN1YXJpb1ByZWZpam9bXT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvY29udHJvbG51bWVyb19kYW8ucGhwYCwgcmVxdWVzdCkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiByZXMgYXMgTVVzdWFyaW9QcmVmaWpvW10pXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIGVsIGRpYWxvZyBwYXJhIGJ1c2NhciBsb3MgcHJvdmVlZG9yZXNcclxuICAgICAqIEByZXR1cm4gUHJvbWlzZTxNUHJvdmVlZG9yPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG9wZW5EaWFsb2dQcm92ZWVkb3JlcygpOiBQcm9taXNlPE1Qcm92ZWVkb3I+IHtcclxuICAgICAgbGV0IHByb3ZlZWRvcmVzOiBNUHJvdmVlZG9yW10gPSBhd2FpdCB0aGlzLmdldFByb3ZlZWRvcmVzKCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENhdGFsb2dvQ29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgY29sdW1uczogWyd0aXBvJywgJ3JpZicsICdub21icmUnXSxcclxuICAgICAgICAgIHRpdGxlOiAnQ2F0w6Fsb2dvIGRlIFByb3ZlZWRvcmVzIHkgQmVuZWZpY2lhcmlvcycsXHJcbiAgICAgICAgICBkYXRhU291cmNlOiBwcm92ZWVkb3Jlc1xyXG4gICAgICAgIH0gYXMgSUNhdGFsb2dvLFxyXG4gICAgICAgIHdpZHRoOiAnNDUwcHgnLFxyXG4gICAgICAgIG1heEhlaWdodDogJzkwdmgnXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIHByb3ZlZWRvcmVzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TVByb3ZlZWRvcltdPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFByb3ZlZWRvcmVzKCk6IE9ic2VydmFibGU8TVByb3ZlZWRvcltdPiB7XHJcbiAgICAgIGxldCByZXF1ZXN0OiBJUmVxdWVzdCA9IHtcclxuICAgICAgICBvcGVyYWNpb246ICdvYnRlbmVyRGF0YScsXHJcbiAgICAgICAgc2lnZXNwX2NvbmV4aW9uOiB7XHJcbiAgICAgICAgICBzZXJ2aWRvcjogdGhpcy5VUkwsXHJcbiAgICAgICAgICB1c3VhcmlvOiB0aGlzLnVzdWFyaW9BY3Rpdm8uZ2V0SW50ZXJmYWNlKClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PE1Qcm92ZWVkb3JbXT4oYCR7dGhpcy5VUkx9L2Rhby9ycGMvcHJvdmVlZG9yX2JlbmVmaWNpYXJpb19kYW8ucGhwYCwgcmVxdWVzdCkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiByZXMubWFwKGVsZW1lbnQgPT4gbmV3IE1Qcm92ZWVkb3IoZWxlbWVudCkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIHByb3ZlZWRvcmVzIHkgYmVuZWZpY2lhcmlvc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQcm92aWRlcnNBbmRCZW5lZmljaWFyaWVzKHR5cGU6IHN0cmluZyA9IG51bGwpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vcnBjL3Byb3ZlZWRvcl9iZW5lZmljaWFyaW9fZGFvLnBocCR7dHlwZSA/IGA/cHJvdmlkZXJfdHlwZT0ke3R5cGV9YCAgOiAnJ31gLCBcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTVByb3ZpZGVyQmVuZWZpY2lhcnkoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIHVuIFVzdWFyaW8gc2VndW4gc3UgSURcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VXNlckJ5SWQoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zc3MvdXN1YXJpb19kYW8ucGhwP2lkPSR7aWR9YCwgXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gbmV3IE1Vc3VhcmlvKHJlcy5kYXRhKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyBiYW5jb3NcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0QmFua3MoKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3NjYi9iYW5jb19kYW8ucGhwYCwgXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1CYW5rKGUpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyB0aXBvcyBkZSBjdWVudGEgYmFuY2FyaWFzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJhbmtBY2NvdW50VHlwZXMoKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3NjYi9iYW5jb190aXBvX2N1ZW50YV9kYW8ucGhwYCwgXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1CYW5rQWNjb3VudFR5cGUoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBbGxCYW5rQWNjb3VudCgpeyAgICAgICAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuVVJMfS9kYW8vc2NiL2N1ZW50YV9iYW5jb19kYW8ucGhwP2AsXHJcbiAgICAgIHtoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlczphbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNQ3VlbnRhQmFuY28oZWxlbWVudCkpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSBbXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXNcclxuICAgICAgICB9KSBcclxuICAgICAgKVxyXG4gICAgfSBcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyBiYW5jb3Mgc2lnZWNvZlxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTaWdlY29mQmFua3MoKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3NpZ2VzcC9iYW5jb19zaWdlY29mX2Rhby5waHBgLCBcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTVNpZ2Vjb2ZCYW5rKGUpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhIGNvbmZpZ3VyYWNpb24gZGUgU09DXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbmZpZ1NPQygpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc29jL2NvbmZpZ3VyYWNpb25fZGFvLnBocGAsIFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IG5ldyBNQ29uZmlnU09DKHJlcy5kYXRhKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyB0aXBvcyBkZSBkZWR1Y2Npb25cclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RGVkdWN0aW9uVHlwZXMoKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3N0Yi90aXBvX2RlZHVjY2lvbl9kYW8ucGhwYCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTURlZHVjdGlvblR5cGUoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJbmNvbWVBY2NvdW50cyhvbmx5QXZhaWxhYmxlOiBib29sZWFuID0gZmFsc2UpOiBPYnNlcnZhYmxlPGFueT57XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuVVJMfS9kYW8vc3BpL2N1ZW50YXNfaW5ncmVzb3NfZGFvLnBocCR7XHJcbiAgICAgICAgb25seUF2YWlsYWJsZSA/ICc/YXZhaWxhYmxlPXRydWUnIDogJydcclxuICAgICAgfWAsIHtoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9KS5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzOmFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1DdWVudGFJbmdyZXNvcyhlKSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFyZ2VzKCl7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KFxyXG4gICAgICAgIGAke3RoaXMuVVJMfS9kYW8vc3RiL2Nhcmdvc19kYW8ucGhwYCwgXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfVxyXG4gICAgICApLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6IElSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1DYXJnbyhlKSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXREZWR1Y3Rpb25zKCl7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KFxyXG4gICAgICAgIGAke3RoaXMuVVJMfS9kYW8vc3RiL2RlZHVjY2lvbmVzX2Rhby5waHBgLCBcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9XHJcbiAgICAgICkucGlwZShcclxuICAgICAgICBtYXAoKHJlczogSVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTURlZHVjdGlvbihlKSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1c2VySGFzUmlnaHRzKGNvbHVtbjonYWRtaW5pc3RyYWRvcicgfCAnaW5zZXJ0YXInIHwgJ2FjdHVhbGl6YXInIHwgJ2NvbnN1bHRhcicgXHJcbiAgICB8ICdlbGltaW5hcicgfCAnYW51bGFyJyB8J2Rlc2NhcmdhcicgfCAnZWplY3V0YXJfX3Byb2Nlc2FyXycgfCAnaW1wcmltaXInIFxyXG4gICAgfCAnZW52aWFyX19jb3JyZW9fJyB8ICd2aXNpYmxlJyl7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KFxyXG4gICAgICAgIGAke3RoaXMuVVJMfS9kYW8vc3NzL2RlcmVjaG9zX3VzdWFyaW9fZGFvLnBocD9pZENvbXBvbmVudD0ke1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50Q29tcG9uZW50LmlkXHJcbiAgICAgICAgfSZjb2x1bW49JHtjb2x1bW59YCwgXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfVxyXG4gICAgICApXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFJldG9ybmEgbG9zIGhlYWRlcnMgcGFyYSBoYWNlciBsYXMgcGV0aWNpb25lc1xyXG4gICAgICogQHJldHVybiBIdHRwSGVhZGVyc1xyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEh0dHBIZWFkZXJzKCk6IEh0dHBIZWFkZXJzIHtcclxuICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAnQXV0aG9yaXphdGlvbic6IGAke3RoaXMudXN1YXJpb0FjdGl2by50b2tlbn1gXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gaGVhZGVycztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGVsIHNlcnZpZG9yIGd1YXJkYWRvIGVuIGVsIHNlc3Npb25TdG9yYWdlXHJcbiAgICAgKiBAcmV0dXJuIHN0cmluZ1xyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNlcnZlcigpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5VUkw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCB1c3VhcmlvIGd1YXJkYWRvIGVuIGVsIHNlc3Npb25TdG9yYWdlXHJcbiAgICAgKiBAcmV0dXJuIE1Vc3VhcmlvXHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0VXNlcigpIHtcclxuICAgICAgbGV0IGNvbmV4aW9uOiBJQ29uZXhpb24gPSBhd2FpdCAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgndXNlcicpKSA/IEpTT04ucGFyc2UoYXRvYihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd1c2VyJykpKSA6IG51bGw7XHJcbiAgICAgIC8vY29uc29sZS5sb2coY29uZXhpb24pXHJcbiAgICAgIC8vIGRlYnVnZ2VyXHJcbiAgICAgIGlmIChjb25leGlvbikge1xyXG4gICAgICAgIHRoaXMudXN1YXJpb0FjdGl2byA9IG5ldyBNVXN1YXJpbyhjb25leGlvbi51c3VhcmlvKTtcclxuICAgICAgICB0aGlzLlVSTCA9IGNvbmV4aW9uLnNlcnZpZG9yO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE11ZXN0cmEgdW4gdG9hc3QgZGUgc3VjY2Vzc1xyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgTWVuc2FqZSBxdWUgc2UgdmEgYSBtb3N0cmFyXHJcbiAgICAgKiBAcmV0dXJuIHZvaWRcclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaG93VG9hc3RTdWNjZXNzKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICB0aGlzLnRvYXN0LnN1Y2Nlc3MobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gTXVlc3RyYSB1biB0b2FzdCBkZSBlcnJvclxyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgTWVuc2FqZSBxdWUgc2UgdmEgYSBtb3N0cmFyXHJcbiAgICAgKiBAcmV0dXJuIHZvaWRcclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaG93VG9hc3RFcnJvcihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgdGhpcy50b2FzdC5lcnJvcihtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBHdWFyZGEgZWwgdXN1YXJpbyBsb2d1ZWFkbyBlbiBlbCBTZXNzaW9uU3RvcmFnZVxyXG4gICAgICogQHBhcmFtIHVzZXIgVXN1YXJpbyBxdWUgc2UgdmEgYSBndWFyZGFyIGVuIGVsIFNlc3Npb25TdG9yYWdlXHJcbiAgICAgKiBAcmV0dXJuIHZvaWRcclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzYXZlVXNlcihkYXRhOiBJQ29uZXhpb24pOiB2b2lkIHtcclxuICAgICAgdGhpcy51c3VhcmlvQWN0aXZvID0gbmV3IE1Vc3VhcmlvKGRhdGEudXN1YXJpbyk7XHJcbiAgICAgIHRoaXMuVVJMID0gZGF0YS5zZXJ2aWRvcjtcclxuICAgICAgbGV0IGVuY3J5cHRlZFVzZXI6IHN0cmluZyA9IGJ0b2EoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCd1c2VyJywgZW5jcnlwdGVkVXNlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU2V0ZSBhIGxhIHVybCBhIGxhIGN1YWwgc2UgbGUgdmFuIGEgcmVhbGl6YXIgcGV0aWNpb25lcyBhbCBiYWNrRW5kXHJcbiAgICAgKiBAcGFyYW0gdXJsIFVSbCBkb25kZSBzZSB2YW4gYSByZWFsaXphciBsYXMgcGV0aWNpb25lc1xyXG4gICAgICogQHJldHVybiB2b2lkXHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0VXJsKHVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuVVJMID0gdXJsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEluaWNpYWxpemEgZWwgc2VydmljaW8gZGUgc2lnZXNwXHJcbiAgICAgKiBAcmV0dXJuIHZvaWRcclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbml0KCk6IHZvaWQge1xyXG4gICAgICAvLyBWZXJpZmljYW1vcyBzaSBoYXkgdW4gdXN1YXJpbyBlbiBsYSBzZXNzaW9uU3RvcmFnZSwgZXN0byBlcyBuZWNlc2FyaW8gcGFyYSByZWNhcmdhciBsYSBww6FnaW5hXHJcbiAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd1c2VyJykpIHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd1c2VyJykpXHJcbiAgICAgICAgdGhpcy5nZXRVc2VyKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBWZXJpZmljYSBzaSB1biB1c3VhcmlvIGVzdMOhIGxvZ3VlYWRvXHJcbiAgICAgKiBAcmV0dXJuIFByb21pc2U8Ym9vbGVhbj5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBpc0xvZ2dlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgndXNlcicpKSB7XHJcbiAgICAgICAgICByZXNvbHZlKHRydWUpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc29sdmUoZmFsc2UpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlckVycm9yKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSk6IGFueSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcignT2N1cnJpw7MgdW4gZXJyb3InKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbmludGVyZmFjZSBmaWx0cm9DdWVudGFzUHJlc3VwdWVzdG8ge1xyXG4gIHRpcG8/OiAnRScgfCAnUicsXHJcbiAgZXN0YWRvPzogJ0MnIHwgJ1MnXHJcbn0iXX0=
|
|
1892
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnZXNwLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiQzovQXBwU2Vydi93d3cvc2lnZXNwdjMoZ2l0KS9zaWdlc3AtZXN0YWJsZS9zaWdlc3BfY29yZS9wcm9qZWN0cy9zaWdlc3Avc3JjLyIsInNvdXJjZXMiOlsibGliL3NpZ2VzcC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxVQUFVLEVBQXFCLFdBQVcsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBRTlGLE9BQU8sRUFBYyxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDcEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDL0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDbkYsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDL0QsT0FBTyxFQUFFLGFBQWEs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QUFDO2VBQzdHLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFNLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFLLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFHLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRztlQUMxRyxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBTSxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUc7ZUFDMUcsS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLElBQUcsS0FBSyxDQUFDLE9BQU8sSUFBRSxJQUFJLElBQUssS0FBSyxDQUFDLE9BQU8sSUFBRSxHQUFHLElBQUcsS0FBSyxDQUFDLE9BQU8sSUFBRSxHQUFHLEVBQUM7WUFDdEcsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7OztLQUtDO0lBQ08sUUFBUSxDQUFDLEtBQVc7UUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFLLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsQ0FBQyxJQUFLLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRztlQUM5RyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLElBQUssS0FBSyxD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LEVBQzlFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBQyxDQUFDO2FBQ2pDLElBQUksQ0FDSCxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQ1IsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFDN0IsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsR0FBRSxPQUFPLEdBQUcsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUNqQyxDQUFDO0lBQ0osQ0FBQztJQUVKOzs7Ozs7OztPQVFHO0lBQ0ssY0FBYyxDQUFDLE9BQWMsRUFBQyxVQUFpQixFQUFDLFNBQWlCO1FBQ3RFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQVksR0FBRyxJQUFJLENBQUMsR0FBRywrQ0FBK0MsT0FBTyxPQUFPLFVBQVUsTUFBTSxTQUFTLEVBQUUsRUFDbkksRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3RDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUM3QixHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNmLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtnQkFDYixHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN2RDtZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7Ozs7WUE5M0VBLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBdEVNLFVBQVU7WUFLVixTQUFTO1lBUVQsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1QZXJzb25hbE5vbWluYSB9IGZyb20gJy4vY29yZS9tb2RlbHMvU05PL01QZXJzb25hbE5vbWluYS5tb2RlbCc7XHJcbmltcG9ydCB7IE1Ib2phVGllbXBvIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TTk8vTUhvamFUaWVtcG8ubW9kZWwnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1Vc3VhcmlvIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TU1MvdXNlci5tb2RlbCc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSVJlcXVlc3QgfSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9SZXF1ZXN0JztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBNUHJvdmVlZG9yIH0gZnJvbSAnLi9jb3JlL21vZGVscy9SUEMvcHJvdmVlZG9yZXMubW9kZWwnO1xyXG5pbXBvcnQgeyBtYXAsIGNhdGNoRXJyb3IsIHJldHJ5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBNVXN1YXJpb1ByZWZpam8gfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NTUy91c2VyUHJlZml4Lm1vZGVsJztcclxuaW1wb3J0IHsgSUNhdGFsb2dvLCBmaWx0ZXJEYXRhIH0gZnJvbSAnLi9jb3JlL2ludGVyZmFjZXMvQ2F0YWxvZ28nO1xyXG5pbXBvcnQgeyBDYXRhbG9nb0NvbXBvbmVudCB9IGZyb20gJy4vc2hhcmVkL2NvbXBvbmVudHMvY2F0YWxvZ28vY2F0YWxvZ28uY29tcG9uZW50JztcclxuaW1wb3J0IHsgTUN1ZW50YVByZXN1cHVlc3RvIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TUEcvY3VlbnRhUHJlc3VwdWVzdG8ubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ3VlbnRhSW5zdGl0dWNpb25hbCB9IGZyb20gJy4vY29yZS9tb2RlbHMvU0NHL2N1ZW50YUluc3RpdHVjaW9uYWwubW9kZWwnO1xyXG5pbXBvcnQgeyBNTW9uZWRhLCBNTW9uZWRhQ29uZmlnIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TVEIvbW9uZWRhLm1vZGVsJztcclxuaW1wb3J0IHsgTUNvbXVuaWRhZCB9IGZyb20gJy4vY29yZS9tb2RlbHMvQ0ZHL2NvbXVuaWRhZC5tb2RlbCc7XHJcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcclxuaW1wb3J0IHsgTVVuaWRhZFRyaWJ1dGFyaWEgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NUQi91bmlkYWRUcmlidXRhcmlhLm1vZGVsJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENvbmZpcm1Db21wb25lbnQgfSBmcm9tICcuL3NoYXJlZC9jb21wb25lbnRzL2NvbmZpcm0vY29uZmlybS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNQ29uZmlndXJhY2lvblNDRyB9IGZyb20gJy4vY29yZS9tb2RlbHMvU0NHL2NvbmZpZ3VyYWNpb25TQ0cubW9kZWwnO1xyXG5pbXBvcnQgeyBNUGxhblVuaWNvQ3VlbnRhIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TQ0cvcGxhblVuaWNvQ3VlbnRhLm1vZGVsJztcclxuaW1wb3J0IHsgSUNvbmV4aW9uIH0gZnJvbSAnLi9jb3JlL2ludGVyZmFjZXMvVXN1YXJpbyc7XHJcbmltcG9ydCB7IFRhYmxlU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi9zaGFyZWQvY29tcG9uZW50cy90YWJsZS1zZWxlY3QvdGFibGUtc2VsZWN0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1Db25maWd1cmF0aW9uU1BHIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TUEcvY29uZmlndXJhdGlvblNQRy5tb2RlbCc7XHJcbmltcG9ydCB7IE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFPbmUsIE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFUd28sIE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFUaHJlZSwgTUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZvdXIsIE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGaXZlQ29tcGxldGUsIE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGaXZlLCBNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVGhyZWVDb21wbGV0ZSwgTUFsbFN0cnVjdHVyZSB9IGZyb20gJy4vY29yZS9tb2RlbHMvU1BHL2VzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYS5tb2RlbCc7XHJcbmltcG9ydCB7IElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFPbmUsIElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFUd28sIElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFUaHJlZSwgSUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZvdXIsIElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGaXZlQ29tcGxldGUsIElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGaXZlIH0gZnJvbSAnLi9jb3JlL2ludGVyZmFjZXMvRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhJztcclxuaW1wb3J0IHsgTUNlbnRyb0Nvc3RvIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TQ0cvY2VudHJvQ29zdG8ubW9kZWwnO1xyXG5pbXBvcnQgeyBNRnVlbnRlRmluYW5jaWFtaWVudG8gfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NQRy9mdWVudGVGaW5hbmNpYW1pZW50by5tb2RlbCc7XHJcbmltcG9ydCB7IE1DdWVudGFFZ3Jlc29zIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TUEcvZXhwZW5zaXZlQWNjb3VudC5tb2RlbCc7XHJcbmltcG9ydCB7IENhdGFsb2dvRXN0cnVjdHVyYXNDb21wb25lbnQgfSBmcm9tICcuL3NoYXJlZC9jb21wb25lbnRzL2NhdGFsb2dvLWVzdHJ1Y3R1cmFzL2NhdGFsb2dvLWVzdHJ1Y3R1cmFzLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IElVcGRhdGVEaXN0cmlidXRpb24sIElVcGRhdGVEaXN0cmlidXRpb25JbmdyZXNvcyB9IGZyb20gJy4vY29yZS9pbnRlcmZhY2VzL0N1ZW50YUVncmVzb3MnO1xyXG5pbXBvcnQgeyBDYXRhbG9nb0RvYmxlSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL3NoYXJlZC9jb21wb25lbnRzL2NhdGFsb2dvLWRvYmxlLWlucHV0L2NhdGFsb2dvLWRvYmxlLWlucHV0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1TaXN0ZW1hIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TU1Mvc2lzdGVtYSc7XHJcbmltcG9ydCB7IElDb21wcm9iYW50ZVByZXN1cHVlc3RhcmlvRWdyZXNvcywgSUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9JbmdyZXNvcyB9IGZyb20gJy4vY29yZS9pbnRlcmZhY2VzL0NvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW8nO1xyXG5pbXBvcnQgeyBNQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0VncmVzb3MsIE1Db21wcm9iYW50ZVByZXN1cHVlc3RhcmlvSW5ncmVzb3MgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NQRy9jb21wcm9iYW50ZVByZXN1cHVlc3RhcmlvLm1vZGVsJztcclxuaW1wb3J0IHsgTUN1ZW50YUluZ3Jlc29zIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TQ0cvSW5jb21lQWNjb3VudCc7XHJcbmltcG9ydCB7IE1JbmNvbWVTdHJ1Y3R1cmVBY2NvdW50IH0gZnJvbSAnLi9jb3JlL21vZGVscy9TUEcvaW5jb21lU3RydWN0dXJlQWNjb3VudC5tb2RlbCc7XHJcbmltcG9ydCB7IE1Pcmdhbml6YXRpb25UeXBlIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TUEcvb3JnYW5pemF0aW9uVHlwZS5tb2RlbCc7XHJcbmltcG9ydCB7IE1TcGVjaWFsdHkgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1JQQy9zcGVjaWFsdHkubW9kZWwnO1xyXG5pbXBvcnQgeyBNRG9jdW1lbnQgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1JQQy9kb2N1bWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IE1DbGFzaWZpY2F0aW9uIH0gZnJvbSAnLi9jb3JlL21vZGVscy9SUEMvY2xhc2lmaWNhdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IE1Db3VudHJ5LCBNU3RhdGUsIE1NdW5pY2lwYWxpdHksIE1QYXJpc2gsIE1DaXR5IH0gZnJvbSAnLi9jb3JlL21vZGVscy9DRkcvbG9jYXRpb25zLm1vZGVsJztcclxuaW1wb3J0IHsgTVByb3ZpZGVyQmVuZWZpY2lhcnkgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1JQQy9wcm92aWRlckJlbmVmaWNpYXJ5Lm1vZGVsJztcclxuaW1wb3J0IHsgTVNpZ2Vjb2ZCYW5rLCBNQmFuaywgTUJhbmtBY2NvdW50VHlwZSwgTUFnZW5jaWFCYW5jbywgTUN1ZW50YUJhbmNvIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TQ0IvYmFuay5tb2RlbCc7XHJcbmltcG9ydCB7IElSZXNwb25zZSB9IGZyb20gJy4vY29yZS9pbnRlcmZhY2VzL1Jlc3BvbnNlJztcclxuaW1wb3J0IHsgTUNvbmZpZ3VyYXRpb25SUEMgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1JQQy9jb25maWd1cmFjaW9uUlBDLm1vZGVsJztcclxuaW1wb3J0IHsgTUNvbmZpZ1NPQyB9IGZyb20gJy4vY29yZS9tb2RlbHMvU09DL2NvbmZpZ3VyYWNpb25TT0MubW9kZWwnO1xyXG5pbXBvcnQgeyBNRGVkdWN0aW9uVHlwZSB9IGZyb20gJy4vY29yZS9tb2RlbHMvU1RCL2RlZHVjdGlvblR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ2FyZ28gfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NPQy9jaGFyZ2UubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ29uY2VwdG9SZXRlbmNpb24sIE1EZWR1Y3Rpb24gfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NUQi9kZWR1Y3Rpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ29uZmlnU1NTIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TU1Mvc2VjdXJpdHlDb25maWd1cmF0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgTUFkbWluaXN0cmF0aXZlVW5pdCB9IGZyb20gJy4vY29yZS9tb2RlbHMvU1BHL2FkbWluaXN0cmF0aXZlVW5pdC5tb2RlbCc7XHJcbmltcG9ydCB7IE1Db21wb25lbnQgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NTUy9jb21wb25lbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBNTG9nIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TU1MvbG9nLm1vZGVsJztcclxuaW1wb3J0IHsgTVNlcnZpY2VDaGFyZ2UgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NPQy9zZXJ2aWNlQ2hhcmdlLm1vZGVsJztcclxuaW1wb3J0IHsgTUVtcHJlc2EgfSBmcm9tICcuL2NvcmUvbW9kZWxzL0NGRy9FbXByZXNhLm1vZGVsJztcclxuaW1wb3J0IHsgTUNvbmNlcHRvc0NYUCB9IGZyb20gJy4vY29yZS9tb2RlbHMvQ1hQL01Db25jZXB0b3NDWFAubW9kZWwnO1xyXG5pbXBvcnQgeyBNVGlwb0RvY3VtZW50b0NYUCB9IGZyb20gJy4vY29yZS9tb2RlbHMvQ1hQL01UaXBvRG9jdW1lbnRvQ1hQLm1vZGVsJztcclxuaW1wb3J0IHsgTUNvbmZpZ3VyYWNpb25TTk8gfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NOTy9NQ29uZmlndXJhY2lvblNOTy5tb2RlbCc7XHJcbmltcG9ydCB7IE1EZWZpbmljaW9uTm9taW5hIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TTk8vTURlZmluaWNpb25Ob21pbmEubW9kZWwnO1xyXG5pbXBvcnQgeyBNQXNpZ25hY2lvbkNhcmdvIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TTk8vTUFzaWduYWNpb25DYXJnby5tb2RlbCc7XHJcbmltcG9ydCB7IE1Ob21pbmFTaW1wbGUgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NOTy9NTm9taW5hU2ltcGxlLm1vZGVsJztcclxuaW1wb3J0IHsgTVBlcnNvbmFsIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TTk8vTVBlcnNvbmFsLm1vZGVsJztcclxuaW1wb3J0IHsgTUVudHJhZGFTdW1pbmlzdHJvcyB9IGZyb20gJy4vY29yZS9tb2RlbHMvU0lWL01FbnRyYWRhU3VtaW5pc3Ryby5tb2RlbCc7XHJcbmltcG9ydCBTd2FsIGZyb20gJ3N3ZWV0YWxlcnQyJ1xyXG5pbXBvcnQgKiBhcyBDcnlwdG9KUyBmcm9tICdjcnlwdG8tanMnOyBcclxuaW1wb3J0IHsgTVNub0xvZyB9IGZyb20gJy4vY29yZS9tb2RlbHMvU05PL01BdWRpdG9yaWEubW9kZWwnO1xyXG5pbXBvcnQgeyBNVGlwb0RlcG9zaXRvcyB9IGZyb20gJy4vY29yZS9tb2RlbHMvU0lWL01UaXBvRGVwb3NpdG9zLm1vZGVsJztcclxuXHJcbiAgXHJcbiAgQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbiAgfSlcclxuICBleHBvcnQgY2xhc3MgU2lnZXNwU2VydmljZSB7XHJcblxyXG4gICAgcHVibGljIHVzdWFyaW9BY3Rpdm86IE1Vc3VhcmlvID0gbnVsbDtcclxuICAgIHB1YmxpYyBVUkw6IHN0cmluZztcclxuICAgIHB1YmxpYyBjdXJyZW50Q29tcG9uZW50OiBNQ29tcG9uZW50ID0gbnVsbDtcclxuICAgIHB1YmxpYyB1c2VyTWVudSAgPSBudWxsOyBcclxuICAgIHB1YmxpYyBpcF9hZHJlc3MgPSAnMTI3LjAuMC4xJztcclxuICAgIC8vIHB1YmxpYyBVUkw6IHN0cmluZyA9IFwiaHR0cDovLzE5Mi4xNjguMS42Ny9zaWdlc3BfcGhwXCI7XHJcbiAgICAvLyB1c3VhcmlvQWN0aXZvOiBNVXN1YXJpbyA9IHtcclxuICAgIC8vICAgY29uZXhpb25EQjoge1xyXG4gICAgLy8gICAgIGJhc2VEZURhdG9zOiBcImRiX3NpZ2VzcF9kZW1vdjNcIixcclxuICAgIC8vICAgICBnZXN0b3I6IFwicG9zdGdyZXNcIixcclxuICAgIC8vICAgICBsb2dpbjogXCJwb3N0Z3Jlc1wiLFxyXG4gICAgLy8gICAgIG5vbWJyZTogXCJTSUdFU1AgQy5BLCBzZXJ2aWRvciA4NSAoU0UgUFVFREUgVVNBUilcIixcclxuICAgIC8vICAgICBwYXNzd29yZDogXCJhZG1pbnNpZ2VzcFwiLFxyXG4gICAgLy8gICAgIHB1ZXJ0bzogXCI1NDMyXCIsXHJcbiAgICAvLyAgICAgc2Vydmlkb3I6IFwiMTkyLjE2OC4xLjY3XCIsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIGVtcHJlc2E6IHtcclxuICAgIC8vICAgICBpZDogMSxcclxuICAgIC8vICAgICBwZXJpb2RvRmlzY2FsOiBcIjIwMTktMDEtMDFcIixcclxuICAgIC8vICAgICB0aXR1bG86IFwiU0lHRVNQIEMuQS5cIlxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gICBub21icmU6IFwiU0lHRVNQXCIsXHJcbiAgICAvLyAgIHRva2VuOiBcImV5SjBlWEFpT2lKS1YxUWlMQ0poYkdjaU9pSklVek00TkNKOS5leUp3WVhOemQyOXlaRjkxYzNVaU9pSXhNak0wTlRZM09DSXNJbWxrWDJWdGNISmxjMkVpT2lJeElpd2lkR2wwWlcxd0lqb2lVMGxIUlZOUUlFTXVRUzRpTENKd1pYSm1hWE5qWVd3aU9pSXlNREU1TFRBeExUQXhJaXdpYkY5MWMzVmhjbWx2SWpvaVUwbEhSVk5RSWl3aWMyVnlkbWxrYjNJaU9pSXhPVEl1TVRZNExqRXVOamNpTENKd2RXVnlkRzhpT2lJMU5ETXlJaXdpWW1GelpXUmxaR0YwYjNNaU9pSmtZbDl6YVdkbGMzQmZaR1Z0YjNZeklpd2liRzluYVc0aU9pSndiM04wWjNKbGN5SXNJbkJoYzNOM2IzSmtJam9pWVdSdGFXNXphV2RsYzNBaWZRLlBJU0JTZnVlUkFkc1dzSjFBYUdjVkNnVy0yYUprZ3R2TGRzVzBCZ281bHR5WW93RDhveV9ucUs1c2pFMlVSR2tcIlxyXG4gICAgLy8gfVxyXG4gICAgLy8gcHJvY2VkZTogc3RyaW5nID0gJ1NDR0NNUCc7XHJcbiAgICAvLyBjb2RzaXM6IHN0cmluZyA9ICdTQ0cnO1xyXG5cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csIHByaXZhdGUgdG9hc3Q6IFRvYXN0clNlcnZpY2UpIHsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFZhbGlkYSBxdWUgc2VsbyBzZSBlc2NyaWJhbiBndWlvbmVzIHkgOVxyXG4gICAgICogQHBhcmFtIGV2ZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbmx5R3Vpb25lc0FuZE5pbmUoZXZlbnQ6IGFueSkge1xyXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnLScgfHwgZXZlbnQua2V5ID09PSAnOScpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWN0dWFsaXphIGVsIG1vbmNtcCBkZSBzaWdlc3BfY29tcHJvYmFudGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZUNvbXByb2JhbnRlQW1vdW50KGFtb3VudDogbnVtYmVyLCBpZENvbXByb2JhbnRlOiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxhbnk+KGAke3RoaXMuVVJMfS9kYW8vc2lnZXNwL2NvbXByb2JhbnRlX2Rhby5waHA/bW9udG89dHJ1ZWAsIHtcclxuICAgICAgICBtb25jbXA6IGFtb3VudCxcclxuICAgICAgICBpZF9jb21wcm9iYW50ZTogaWRDb21wcm9iYW50ZVxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFjdHVhbGl6YSBlbCBjb21wcm9iYW50ZSBwcnN1cHVlc3RhcmlvIGRlIEVncmVzb3NcclxuICAgICAqIEBwYXJhbSBjb21wcm9iYW50ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0VncmVzb3MoY29tcHJvYmFudGU6IElDb21wcm9iYW50ZVByZXN1cHVlc3RhcmlvRWdyZXNvcyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PGFueT4oYCR7dGhpcy5VUkx9L2Rhby9zcGcvY29tcHJvYmFudGVfcHJlc3VwdWVzdGFyaW9fZWdyZXNvc19kYW8ucGhwYCxcclxuICAgICAgeyAuLi5jb21wcm9iYW50ZSwgaWQ6IGNvbXByb2JhbnRlLmlkX2R0X3NwZ2NtcCB9LCB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGVsIGNvbXByb2JhbnRlIHByZXN1cHVlc3RhcmlvIGRlIEVncmVzb3NcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9FZ3Jlc29zKCk6IE9ic2VydmFibGU8TUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9FZ3Jlc29zW10+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9FZ3Jlc29zW10+KGAke3RoaXMuVVJMfS9kYW8vc3BnL2NvbXByb2JhbnRlX3ByZXN1cHVlc3RhcmlvX2VncmVzb3NfZGFvLnBocGAsIHtcclxuICAgICAgICBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKClcclxuICAgICAgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiByZXMuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9FZ3Jlc29zKGVsZW1lbnQpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBY3R1YWxpemEgZWwgY29tcHJvYmFudGUgcHJzdXB1ZXN0YXJpbyBkZSBJbmdyZXNvc1xyXG4gICAgICogQHBhcmFtIGNvbXByb2JhbnRlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVDb21wcm9iYW50ZVByZXN1cHVlc3RhcmlvSW5ncmVzb3MoY29tcHJvYmFudGU6IElDb21wcm9iYW50ZVByZXN1cHVlc3RhcmlvSW5ncmVzb3MpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxhbnk+KGAke3RoaXMuVVJMfS9kYW8vc3BnL2NvbXByb2JhbnRlX3ByZXN1cHVlc3RhcmlvX2VncmVzb3NfZGFvLnBocGAsXHJcbiAgICAgIHsgLi4uY29tcHJvYmFudGUsIGlkOiBjb21wcm9iYW50ZS5pZF9kdF9zcGljbXAgfSwgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCBjb21wcm9iYW50ZSBwcmVzdXB1ZXN0YXJpbyBkZSBJbmdyZXNvc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0luZ3Jlc29zKCk6IE9ic2VydmFibGU8TUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9JbmdyZXNvc1tdPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1Db21wcm9iYW50ZVByZXN1cHVlc3RhcmlvSW5ncmVzb3NbXT4oYCR7dGhpcy5VUkx9L2Rhby9zcGkvY29tcHJvYmFudGVfcHJlc3VwdWVzdGFyaW9faW5ncmVzb3NfZGFvLnBocGAsIHtcclxuICAgICAgICBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKClcclxuICAgICAgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiByZXMuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9JbmdyZXNvcyhlbGVtZW50KSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAQWN0dWFsaXphIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbGEgY3VlbnRhIGRlIGVncmVzb1xyXG4gICAgICogQHBhcmFtIGRpc3RyaWJ1dGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlRGlzdHJpYnV0aW9uRXhwZW5zZUFjY291bnQoZGlzdHJpYnV0aW9uOiBJVXBkYXRlRGlzdHJpYnV0aW9uKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQoYCR7dGhpcy5VUkx9L2Rhby9zcGcvY3VlbnRhc19lZ3Jlc29zX2Rhby5waHBgLCBkaXN0cmlidXRpb24sXHJcbiAgICAgIHtoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBBY3R1YWxpemEgbGEgZGlzdHJpYnVjacOzbiBkZSBsYSBjdWVudGEgZGUgSW5ncmVzb1xyXG4gICAgICogQHBhcmFtIGRpc3RyaWJ1dGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlRGlzdHJpYnV0aW9uSW5jb21lQWNjb3VudChkaXN0cmlidXRpb246IElVcGRhdGVEaXN0cmlidXRpb25JbmdyZXNvcyk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zcGkvY3VlbnRhc19pbmdyZXNvc19kYW8ucGhwYCwgZGlzdHJpYnV0aW9uLFxyXG4gICAgICB7aGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKXtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSBuZXcgTUN1ZW50YUluZ3Jlc29zKHJlcy5kYXRhKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBBY3R1YWxpemEgbGEgZGlzdHJpYnVjacOzbiBkZSBsYSBjdWVudGEgZGUgSW5ncmVzbyBkZSBFc3RydWN0dXJhXHJcbiAgICAgKiBAcGFyYW0gZGlzdHJpYnV0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVEaXN0cmlidXRpb25JbmNvbWVTdHJ1Y3R1cmVBY2NvdW50KGRpc3RyaWJ1dGlvbjogSVVwZGF0ZURpc3RyaWJ1dGlvbkluZ3Jlc29zLCBsZXZlbDogbnVtYmVyKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3NwaS9jdWVudGFfZXN0cnVjdHVyYV9pbmdyZXNvc19kYW8ucGhwYCwgZGlzdHJpYnV0aW9uLFxyXG4gICAgICB7aGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKXtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSBuZXcgTUluY29tZVN0cnVjdHVyZUFjY291bnQocmVzLmRhdGEsIGxldmVsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBjdWVudGFzIHBvciBuaXZlbCBkZSBsYXMgY3VlbmF0cyBkZSBlZ3Jlc29zXHJcbiAgICAgKiBAcGFyYW0gbGV2ZWwgTsO6bWVybyBkZSBuaXZlbGVzIGRlIGxhIGNvbmZpZ3VyYWNpw7NuXHJcbiAgICAgKiBAcGFyYW0gaWQgaWQgZGVsIG5pdmVsIDMgbyA1IHF1ZSBzZSB2YSBhIGJ1c2NhclxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1DdWVudGFFZ3Jlc29zW10+XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRFeHBlbnNlQWNjb3VudHNGb3JMZXZlbChsZXZlbDogbnVtYmVyLCBpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxNQ3VlbnRhRWdyZXNvc1tdPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1DdWVudGFFZ3Jlc29zW10+KGAke3RoaXMuVVJMfS9kYW8vc3BnL2N1ZW50YXNfZWdyZXNvc19kYW8ucGhwXHJcbiAgICAgID9sZXZlbD0ke2xldmVsfSZpZD0ke2lkfWAsIHtoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlczphbnkpID0+IHJlcy5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNQ3VlbnRhRWdyZXNvcyhlbGVtZW50KSkpXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIGVsIGNhdMOhbG9nbyBkZSBlc3RydWN0dXJhIHByZXN1cHVlc2FyaWFcclxuICAgICAqIEBwYXJhbSBkYXRhIERhdGEgcXVlIHNlIHZhIGEgbW9zdHJhclxyXG4gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gQ29uZmlndXJhY2nDs24gZGUgbGEgZXN0cnVjdHVyYVxyXG4gICAgICogQHJldHVybiBQcm9taXNlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvcGVuQ2F0YWxvZ29Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWEoZGF0YTogYW55W10sIGNvbmZpZ3VyYXRpb246IE1Db25maWd1cmF0aW9uU1BHKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgY29uc3QgY2F0YWxvZ28gPSB0aGlzLmRpYWxvZy5vcGVuKENhdGFsb2dvRXN0cnVjdHVyYXNDb21wb25lbnQsIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgY29uZmlndXJhdGlvblxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2lkdGg6ICc0NTBweCcsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiAnOTB2aCdcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBjYXRhbG9nby5hZnRlckNsb3NlZCgpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGN1ZW50YXMgZGUgZWdyZXNvc1xyXG4gICAgICogQHBhcmFtIG9ubHlBdmFpbGFibGVcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNQ3VlbnRhRWdyZXNvc1tdPlxyXG4gICAgICovXHJcbiAgICAgcHVibGljIGdldEV4cGVuc2VBY2NvdW50cyhvbmx5QXZhaWxhYmxlOiBib29sZWFuID0gZmFsc2UpOiBPYnNlcnZhYmxlPE1DdWVudGFFZ3Jlc29zW10+e1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNQ3VlbnRhRWdyZXNvc1tdPihgJHt0aGlzLlVSTH0vZGFvL3NwZy9jdWVudGFzX2VncmVzb3NfZGFvLnBocCR7XHJcbiAgICAgICAgb25seUF2YWlsYWJsZSA/ICc/YXZhaWxhYmxlPXRydWUnIDogJydcclxuICAgICAgfWAsIHtoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlczphbnkpID0+IHJlcy5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNQ3VlbnRhRWdyZXNvcyhlbGVtZW50KSkpXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIHRvZGFzIGxhcyBlc3RydWN0dXJhcyBwcmVzdXB1ZXRzYXJpYXMgZGUgbGFzIDUgdGFibGFzXHJcbiAgICAgKiBAcmV0dXJuIFByb21pc2U8TUFsbFN0cnVjdHVyZT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBbGxCdWRnZXRTdHJ1Y3R1cmUoKTogUHJvbWlzZTxNQWxsU3RydWN0dXJlPiB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgdGhpcy5nZXRCdWRnZXRTdHJ1Y3R1cmVPbmUoKS5zdWJzY3JpYmUoc3RydWN0dXJlT25lID0+IHtcclxuICAgICAgICAgIHRoaXMuZ2V0QnVkZ2V0U3RydWN0dXJlVHdvQWxsKCkuc3Vic2NyaWJlKHN0cnVjdHVyZVR3byA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0QnVkZ2V0U3RydWN0dXJlVGhyZWUoKS5zdWJzY3JpYmUoc3RydWN0dXJlVGhyZWUgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0QnVkZ2V0U3RydWN0dXJlRm91cigpLnN1YnNjcmliZShzdHJ1Y3R1cmVGb3VyID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0QnVkZ2V0U3RydWN0dXJlRml2ZUJ5SWRFcDQoKS5zdWJzY3JpYmUoc3RydWN0dXJlRml2ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IE1BbGxTdHJ1Y3R1cmUoe1xyXG4gICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZU9uZSxcclxuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVUd28sXHJcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlVGhyZWUsXHJcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlRm91cixcclxuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVGaXZlXHJcbiAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGEgZXN0cnVjdHVyYSBjb21wbGV0YSBkZXBlbmRpZW5kbyBkZSBsYSBjb25maWd1cmFjacOzblxyXG4gICAgICogQHJldHVybiBQcm9taXNlPGFueVtdPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldEJ1ZGdldFN0cnVjdHVyZUNvbXBsZXRlKCk6IFByb21pc2U8YW55W10+IHtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlKSA9PiB7XHJcblxyXG4gICAgICAgIGxldCBkYXRhID0gW107XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0QnVkZ2V0U3RydWN0dXJlRml2ZSg1KS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuICAgICAgICAgIGRhdGEucHVzaCguLi5yZXN1bHQpXHJcbiAgICAgICAgfSlcclxuICAgICAgICAvLyBhd2FpdCB0aGlzLmdldEJ1ZGdldFN0cnVjdHVyZVRocmVlQ29tcGxldGUoMykuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgLy8gICBkYXRhLnB1c2goLi4ucmVzdWx0KVxyXG4gICAgICAgIC8vIH0pXHJcblxyXG4gICAgICAgIGF3YWl0IHJlc29sdmUoZGF0YSk7XHJcblxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBFbGltaW5hIHVuYSBvIHZhcmlhcyBlc3RydWN0dXJhcyBwcmVzdXB1ZXN0YXJpYXNcclxuICAgICAqIEBwYXJhbSBpZFN0cnVjdHVyZXMgSWQgZGUgbGFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyA1IHF1ZSB2YW4gYSBzZXIgZWxpbWluYWRhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxldGVCdWRnZXRTdHJ1Y3R1cmVGaXZlKGlkU3RydWN0dXJlczogYW55W10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoJ2RlbGV0ZScsIGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWE1X2Rhby5waHBgLFxyXG4gICAgICB7IGJvZHk6IGlkU3RydWN0dXJlcywgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFjdHVhbGl6YSB1bmEgbyB2YXJpYXMgZXN0cnVjdHVyYXMgNFxyXG4gICAgICogQHBhcmFtIHN0cnVjdHVyZXMgRXN0cnVjdHVyYXMgcHJlc3VwdWVzdGFyaWFzIHF1ZSB2YW4gYSBzZXIgYWN0dWFsaXphZGFzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8YW55PlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZUJ1ZGdldFN0cnVjdHVyZUZpdmUoc3RydWN0dXJlczogSUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZpdmVbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0KGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWE1X2Rhby5waHBgLCBzdHJ1Y3R1cmVzLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBZ3JlZ2EgdW5hIG8gdmFyaWFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyA0XHJcbiAgICAgKiBAcGFyYW0gc3RydWN0dXJlcyBMYXMgZXN0cnVjdHVyYXMgcXVlIHZhbiBhIHNlciByZWdpc3RyYWRhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRCdWRnZXRTdHJ1Y3R1cmVGaXZlKHN0cnVjdHVyZXM6IElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGaXZlW10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTVfZGFvLnBocGAsIHN0cnVjdHVyZXMsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgdG9kYSBsYSBlc3RydWN0dXJhIHByZXN1cHVlc3RhcmlhIDVcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhRml2ZVtdPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJ1ZGdldFN0cnVjdHVyZUZpdmUobGV2ZWw6IG51bWJlciA9IG51bGwpOiBPYnNlcnZhYmxlPE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGaXZlQ29tcGxldGVbXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhRml2ZUNvbXBsZXRlW10+KFxyXG4gICAgICAgIGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWE1X2Rhby5waHA/Y29tcGxldGU9dHJ1ZWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXNwOiBhbnkpID0+IHJlc3AuZGF0YS5tYXAoZSA9PiBuZXcgTUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZpdmVDb21wbGV0ZShlLCBsZXZlbCkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGEgZXN0cnVjdHVyYSBwcmVzdXB1ZXN0YXJpYSA1IHBvciBlbCBJZCBkZSBsYSBlc3RydWN0dXJhIDRcclxuICAgICAqIEBwYXJhbSBpZEVwNCBpZCBkZSBsYSBlc3RydWN0dXJhIHByZXN1cHVlc3RhcmlhIDRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJ1ZGdldFN0cnVjdHVyZUZpdmVCeUlkRXA0KGlkRXA0Pzogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnlbXT4oXHJcbiAgICAgICAgYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTVfZGFvLnBocCR7aWRFcDQgPyBgP2lkX2VwND0ke2lkRXA0fWAgOiAnJ31gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55KSA9PiByZXNwLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGaXZlKGVsZW1lbnQpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBFbGltaW5hIHVuYSBvIHZhcmlhcyBlc3RydWN0dXJhcyBwcmVzdXB1ZXN0YXJpYXNcclxuICAgICAqIEBwYXJhbSBpZFN0cnVjdHVyZXMgSWQgZGUgbGFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyAzIHF1ZSB2YW5hICBzZXIgZWxpbWluYWRhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxldGVCdWRnZXRTdHJ1Y3R1cmVGb3VyKGlkU3RydWN0dXJlczogYW55W10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoJ2RlbGV0ZScsIGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWE0X2Rhby5waHBgLFxyXG4gICAgICB7IGJvZHk6IGlkU3RydWN0dXJlcywgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFjdHVhbGl6YSB1bmEgbyB2YXJpYXMgZXN0cnVjdHVyYXMgNFxyXG4gICAgICogQHBhcmFtIHN0cnVjdHVyZXMgRXN0cnVjdHVyYXMgcHJlc3VwdWVzdGFyaWFzIHF1ZSB2YW4gYSBzZXIgYWN0dWFsaXphZGFzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8YW55PlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZUJ1ZGdldFN0cnVjdHVyZUZvdXIoc3RydWN0dXJlczogSUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZvdXJbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0KGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWE0X2Rhby5waHBgLCBzdHJ1Y3R1cmVzLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBZ3JlZ2EgdW5hIG8gdmFyaWFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyA0XHJcbiAgICAgKiBAcGFyYW0gc3RydWN0dXJlcyBMYXMgZXN0cnVjdHVyYXMgcXVlIHZhbiBhIHNlciByZWdpc3RyYWRhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRCdWRnZXRTdHJ1Y3R1cmVGb3VyKHN0cnVjdHVyZXM6IElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGb3VyW10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTRfZGFvLnBocGAsIHN0cnVjdHVyZXMsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyA0XHJcbiAgICAgKiBAcGFyYW0gaWRFcDMgSWQgZGUgbGEgZXN0cnVjdHVyYSBwcmVzdXB1ZXN0YXJpYSAzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUVzdHJ1Y3R1cmFwcmVzdXB1ZXN0YXJpYVtdPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJ1ZGdldFN0cnVjdHVyZUZvdXIoaWRFcDM/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGb3VyW10+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZvdXJbXT4oXHJcbiAgICAgICAgYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTRfZGFvLnBocCR7aWRFcDMgPyBgP2lkX2VwMz0ke2lkRXAzfWAgOiAnJ31gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55KSA9PiByZXNwLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGb3VyKGVsZW1lbnQpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBFbGltaW5hIHVuYSBvIHZhcmlhcyBlc3RydWN0dXJhcyBwcmVzdXB1ZXN0YXJpYXNcclxuICAgICAqIEBwYXJhbSBpZFN0cnVjdHVyZXMgSWQgZGUgbGFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyAzIHF1ZSB2YW5hICBzZXIgZWxpbWluYWRhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxldGVCdWRnZXRTdHJ1Y3R1cmVUaHJlZShpZFN0cnVjdHVyZXM6IGFueVtdKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KCdkZWxldGUnLCBgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhM19kYW8ucGhwYCxcclxuICAgICAgeyBib2R5OiBpZFN0cnVjdHVyZXMsIGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBY3R1YWxpemEgdW5hIG8gdmFyaWFzIGVzdHJ1Y3R1cmFzIDNcclxuICAgICAqIEBwYXJhbSBzdHJ1Y3R1cmVzIEVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyBxdWUgdmFuIGEgc2VyIGFjdHVhbGl6YWRhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVCdWRnZXRTdHJ1Y3R1cmVUaHJlZShzdHJ1Y3R1cmVzOiBJRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVGhyZWVbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0KGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWEzX2Rhby5waHBgLCBzdHJ1Y3R1cmVzLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBZ3JlZ2EgdW5hIG8gdmFyaWFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyAzXHJcbiAgICAgKiBAcGFyYW0gc3RydWN0dXJlcyBMYXMgZXN0cnVjdHVyYXMgcXVlIHZhbiBhIHNlciByZWdpc3RyYWRhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRCdWRnZXRTdHJ1Y3R1cmVUaHJlZShzdHJ1Y3R1cmVzOiBJRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVGhyZWVbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhM19kYW8ucGhwYCwgc3RydWN0dXJlcyxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU2UgdHJhZSBsYSBlc3RydWN0dXJhIHByZXN1cHVlc3RhcmlhIGNvbXBsZXRhIGhhc3RhIGVsIG5pdmVsIDNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxhbnlbXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRCdWRnZXRTdHJ1Y3R1cmVUaHJlZUNvbXBsZXRlKGxldmVsOiBudW1iZXIpOiBPYnNlcnZhYmxlPE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGaXZlQ29tcGxldGVbXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhRml2ZUNvbXBsZXRlW10+KFxyXG4gICAgICAgIGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWEzX2Rhby5waHA/Y29tcGxldGU9dHJ1ZWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXNwOiBhbnkpID0+IHJlc3AuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZpdmVDb21wbGV0ZShlbGVtZW50LCBsZXZlbCkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyAzXHJcbiAgICAgKiBAcGFyYW0gaWRFcDIgSWQgZGUgbGEgZXN0cnVjdHVyYSBwcmVzdXB1ZXN0YXJpYSAyXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUVzdHJ1Y3R1cmFwcmVzdXB1ZXN0YXJpYVtdPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJ1ZGdldFN0cnVjdHVyZVRocmVlKGlkRXAyPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVGhyZWVbXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVGhyZWVbXT4oXHJcbiAgICAgICAgYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTNfZGFvLnBocCR7aWRFcDIgPyBgP2lkX2VwMj0ke2lkRXAyfWAgOiAnJ31gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55KSA9PiByZXNwLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFUaHJlZShlbGVtZW50KSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gRWxpbWluYSB1bmEgbyB2YXJpYXMgZXN0cnVjdHVyYXMgcHJlc3VwdWVzdGFyaWFzIHVub1xyXG4gICAgICogQHBhcmFtIGlkU3RydWN0dXJlcyBJZCBkZSBsYSBvIGxhcyBlc3RydWN0dXJhcyBwcmVzdXB1ZXN0YXJpYXMgcXVlIHZhbiBhIHNlciBlbGltaW5hZGFzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8YW55PlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlbGV0ZUJ1ZGdldFN0cnVjdHVyZVR3byhpZFN0cnVjdHVyZXM6IGFueVtdKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KCdkZWxldGUnLCBgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhMl9kYW8ucGhwYCxcclxuICAgICAgeyBib2R5OiBpZFN0cnVjdHVyZXMsIGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBY3R1YWxpemEgdW5hIGVzdHJ1Y3R1cmEgcHJlc3VwdWVzdGFyaWEgZG9zXHJcbiAgICAgKiBAcGFyYW0gc3RydWN0dXJlIEVzdHJ1Y3R1cmEgcHJlc3VwdWVzdGFyaWEgdW5vIHF1ZSBzZSB2YSBhIGFjdHVhbGl6YXJcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxhbnk+XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVCdWRnZXRTdHJ1Y3R1cmVUd28oc3RydWN0dXJlOiBJRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVHdvW10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dChgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhMl9kYW8ucGhwYCwgc3RydWN0dXJlLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RyYSBsYXMgZXN0cnVjdHVyYXMgcHJlc3VwdWVzdHJpYXMgZG9zIGVuIGxhIGJhc2UgZGUgZGF0b3NcclxuICAgICAqIEBwYXJhbSBidWRnZXRTdHJ1Y3R1cmVzIEFycmF5IGRlIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhIHF1ZSBzZSB2YW4gYSByZWdpc3RyYXJcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxhbnk+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0QnVkZ2V0U3RydWN0dXJlVHdvKGJ1ZGdldFN0cnVjdHVyZXM6IElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFUd29bXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhMl9kYW8ucGhwYCxcclxuICAgICAgYnVkZ2V0U3RydWN0dXJlcywgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhIGVzdHJ1Y3R1cmEgcHJlc3VwdWVzdGFyaWFcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhW10+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0QnVkZ2V0U3RydWN0dXJlVHdvKGlkRXAxOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFUd29bXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVHdvW10+KGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWEyX2Rhby5waHA/aWRfZXAxPSR7aWRFcDF9YCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKChyZXNwOiBhbnkpID0+IHJlc3AuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVR3byhlbGVtZW50KSkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGEgZXN0cnVjdHVyYSBwcmVzdXB1ZXN0YXJpYVxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFbXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRCdWRnZXRTdHJ1Y3R1cmVUd29BbGwoKTogT2JzZXJ2YWJsZTxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVHdvW10+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVR3b1tdPihgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhMl9kYW8ucGhwYCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKChyZXNwOiBhbnkpID0+IHJlc3AuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVR3byhlbGVtZW50KSkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEVsaW1pbmEgdW5hIG8gdmFyaWFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyB1bm9cclxuICAgICAqIEBwYXJhbSBpZFN0cnVjdHVyZXMgSWQgZGUgbGEgbyBsYXMgZXN0cnVjdHVyYXMgcHJlc3VwdWVzdGFyaWFzIHF1ZSB2YW4gYSBzZXIgZWxpbWluYWRhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxldGVCdWRnZXRTdHJ1Y3R1cmVPbmUoaWRTdHJ1Y3R1cmVzOiBhbnlbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdCgnZGVsZXRlJywgYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTFfZGFvLnBocGAsXHJcbiAgICAgIHsgYm9keTogaWRTdHJ1Y3R1cmVzLCBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWN0dWFsaXphIHVuYSBlc3RydWN0dXJhIHByZXN1cHVlc3RhcmlhIHVub1xyXG4gICAgICogQHBhcmFtIHN0cnVjdHVyZSBFc3RydWN0dXJhIHByZXN1cHVlc3RhcmlhIHVubyBxdWUgc2UgdmEgYSBhY3R1YWxpemFyXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8YW55PlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlQnVkZ2V0U3RydWN0dXJlT25lKHN0cnVjdHVyZTogSUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYU9uZVtdKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQoYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTFfZGFvLnBocGAsIHN0cnVjdHVyZSxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0cmEgbGFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RyaWFzIGVuIGxhIGJhc2UgZGUgZGF0b3NcclxuICAgICAqIEBwYXJhbSBidWRnZXRTdHJ1Y3R1cmVzIEFycmF5IGRlIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhIHF1ZSBzIGV2YW4gYSByZWdpc3RyYXJcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxhbnk+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0QnVkZ2V0U3RydWN0dXJlT25lKGJ1ZGdldFN0cnVjdHVyZXM6IElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFPbmVbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhMV9kYW8ucGhwYCxcclxuICAgICAgYnVkZ2V0U3RydWN0dXJlcywgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhIGVzdHJ1Y3R1cmEgcHJlc3VwdWVzdGFyaWFcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhW10+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0QnVkZ2V0U3RydWN0dXJlT25lKCk6IE9ic2VydmFibGU8TUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYU9uZVtdPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYU9uZVtdPihgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhMV9kYW8ucGhwYCxcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICAgIG1hcCgoKHJlc3A6IGFueSkgPT4gcmVzcC5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhT25lKGVsZW1lbnQpKSkpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBjb25maWd1cmFjaW9uZXMgZGUgbGEgZXN0cnVjdHVyYSBwcmVzdXB1ZXN0YXJpYVxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1Db25maWd1cmF0aW9uU1BHW10+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29uZmlndXJhdGlvblNQRygpOiBPYnNlcnZhYmxlPE1Db25maWd1cmF0aW9uU1BHPiB7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNQ29uZmlndXJhdGlvblNQRz4oYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYV9jb25maWdfZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXNwOiBhbnkpID0+IG5ldyBNQ29uZmlndXJhdGlvblNQRyhyZXNwLmRhdGFbMF0pKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgY29uZmlndXJhY2lvbmVzIGRlIGxvcyBwcm92ZWVkb3Jlc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1Db25maWd1cmF0aW9uUlBDW10+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29uZmlndXJhdGlvblJQQygpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUNvbmZpZ3VyYXRpb25SUEM+KGAke3RoaXMuVVJMfS9kYW8vcnBjL3Byb3ZlZWRvcl9jb25maWdfZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXNwOiBJUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzcC5kYXRhID0gbmV3IE1Db25maWd1cmF0aW9uUlBDKHJlc3AuZGF0YSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXNwXHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBNQ29uZmlndXJhY2lvblNOTyBkZSBsYSBub21pbmFcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNQ29uZmlndXJhY2lvblNOT1tdPlxyXG4gICAgICogQGRhdGUgMjctMDctMjAyMVxyXG4gICAgICovXHJcbiAgICAgcHVibGljIGdldENvbmZpZ3VyYXRpb25TTk8oKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zbm8vY29uZmlndXJhY2lvbl9kYW8ucGhwP3RpcG89JHsnY29uZmlndXJhY2lvbid9YCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlc3A6IElSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3Auc3VjY2Vzcykge1xyXG4gICAgICAgICAgICBpZihyZXNwLmRhdGEgIT1udWxsKXtcclxuICAgICAgICAgICAgICByZXNwLmRhdGEgPSByZXNwLmRhdGEubWFwKGUgPT4gbmV3IE1Db25maWd1cmFjaW9uU05PKGUpKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXNwLmRhdGE9W107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXNwXHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGRhdGVUb1N0cmluZyhkYXRlOiBEYXRlKTogc3RyaW5ne1xyXG4gICAgICByZXR1cm4gYCR7ZGF0ZS5nZXRGdWxsWWVhcigpfS0ke1xyXG4gICAgICAgIGRhdGUuZ2V0TW9udGgoKSArIDEgPj0gMTAgPyBkYXRlLmdldE1vbnRoKCkgKyAxIDogYDAke2RhdGUuZ2V0TW9udGgoKSArIDF9YFxyXG4gICAgICB9LSR7XHJcbiAgICAgICAgZGF0ZS5nZXREYXRlKCkgPj0gMTAgPyBkYXRlLmdldERhdGUoKSA6IGAwJHtkYXRlLmdldERhdGUoKX1gXHJcbiAgICAgIH1gXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgY29uZmlndXJhY2lvbmVzIGRlIFNlZ3VyaWRhZFxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb25maWdTU1MoKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zc3Mvc2VndXJpZGFkX2NvbmZpZ19kYW8ucGhwYCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlc3A6IElSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3Auc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXNwLmRhdGEgPSBuZXcgTUNvbmZpZ1NTUyhyZXNwLmRhdGEpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzcFxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENvbXBvbmVudHMoc3lzdGVtQ29kZTogc3RyaW5nID0gbnVsbCwgcGVybWl0OiBib29sZWFuKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+e1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihcclxuICAgICAgICBgJHt0aGlzLlVSTH0vZGFvL3Nzcy9jb21wb25lbnRlc19kYW8ucGhwPyR7c3lzdGVtQ29kZSA/IGBjb2RzaXM9JHtzeXN0ZW1Db2RlfSR7XHJcbiAgICAgICAgICBwZXJtaXQgPyBgJnBlcm1pdD10cnVlYCA6ICcnXHJcbiAgICAgICAgfWAgOiAnJ31gLFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH1cclxuICAgICAgKS5waXBlKFxyXG4gIFxyXG4gICAgICAgIG1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1Db21wb25lbnQoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgZnVlbnRlcyBkZSBmaW5hbmNpYW1pZW50b1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1GdWVudGVGaW5hbmNpYW1pZW50b1tdPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEZ1ZW50ZUZpbmFuY2lhbWllbnRvKCk6IE9ic2VydmFibGU8TUZ1ZW50ZUZpbmFuY2lhbWllbnRvW10+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUZ1ZW50ZUZpbmFuY2lhbWllbnRvW10+KGAke3RoaXMuVVJMfS9kYW8vc3BnL2Z1ZW50ZV9maW5hbmNpYW1pZW50b19kYW8ucGhwYCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlc3A6IGFueSkgPT4gcmVzcC5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNRnVlbnRlRmluYW5jaWFtaWVudG8oZWxlbWVudCkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIGNlbnRyb3MgZGUgY29zdG9cclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNQ2VudHJvQ29zdG9bXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKiBtb2RpZmljYWRvIDktMTEtMjAyMlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q2VudHJvQ29zdG8odGlwbzpzdHJpbmcpOiBPYnNlcnZhYmxlPE1DZW50cm9Db3N0b1tdPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zY2cvY2VudHJvX2Nvc3RvX2Rhby5waHA/Y29kaWdvPSR7dGlwb31gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2VzcykgeyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1DZW50cm9Db3N0byhlKSk7ICAgICAgICAgICAgICBcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgY2VudHJvcyBkZSBjb3N0b1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb3N0Q2VudGVycygpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc2NnL2NlbnRyb19jb3N0b19kYW8ucGhwYCwgXHJcbiAgICAgIHtoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9XHJcbiAgICAgICkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogSVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUNlbnRyb0Nvc3RvKGVsZW1lbnQpKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlc1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWJyZSBlbCBkaWFsb2cgZGUgY2hlY2trc1xyXG4gICAgICogQHBhcmFtIGNvbHVtbnMgQ29sdW1uYXMgcXVlIHZhIGEgdGVuZXIgbGEgdGFibGFcclxuICAgICAqIEBwYXJhbSB0aXRsZSBUw610dWxvIGRlIGxhIG1vZGFsXHJcbiAgICAgKiBAcGFyYW0gZGF0YVNvdXJjZSBEYXRhIHF1ZSBzIGV2YSBhIG1vc3RyYXIgZW4gbGEgdGFibGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9wZW5EaWFsb2dNdWx0aVNlbGVjdChcclxuICAgICAgLy8gY29sdW1uczogc3RyaW5nW10sIFxyXG4gICAgICAvLyB0aXRsZTogc3RyaW5nLCBcclxuICAgICAgLy8gZGF0YVNvdXJjZTogYW55W10sXHJcbiAgICAgIC8vIGNvbHVtbk5hbWVzPzogc3RyaW5nW11cclxuICAgICAgY29sdW1uczogc3RyaW5nW10sIFxyXG4gICAgICB0aXRsZTogc3RyaW5nLCBcclxuICAgICAgZGF0YVNvdXJjZTogYW55W10sIFxyXG4gICAgICBjb2x1bW5OYW1lczogc3RyaW5nW10gPSBudWxsLCBcclxuICAgICAgd2lkdGg6IHN0cmluZyA9ICc0NTBweCcsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICBoYXNCYWNrZHJvcD86IGJvb2xlYW4sXHJcbiAgICAgICAgZGlzYWJsZUNsb3NlPzogYm9vbGVhbixcclxuICAgICAgIC8vIGRpc2FibGVNYXN0ZXJUb2dnbGU/OiBib29sZWFuXHJcbiAgICAgIH0gPSB7XHJcbiAgICAgICAgZGlzYWJsZUNsb3NlOiBmYWxzZSwgXHJcbiAgICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLCBcclxuICAgICAgLy8gIGRpc2FibGVNYXN0ZXJUb2dnbGU6IGZhbHNlXHJcbiAgICAgIH1cclxuICAgICk6IFByb21pc2U8YW55W10+IHtcclxuICAgICAgbGV0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oVGFibGVTZWxlY3RDb21wb25lbnQsIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICBjb2x1bW5zOiBjb2x1bW5zLFxyXG4gICAgICAgICAgZGF0YVNvdXJjZTogZGF0YVNvdXJjZSxcclxuICAgICAgICAgIGNvbHVtbk5hbWVzLFxyXG4gICAgICAgICAvLyBkaXNhYmxlTWFzdGVyVG9nZ2xlOiBvcHRpb25zLmRpc2FibGVNYXN0ZXJUb2dnbGVcclxuICAgICAgICB9LFxyXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcclxuICAgICAgICBtYXhIZWlnaHQ6ICc5MHZoJyxcclxuICAgICAgICBoYXNCYWNrZHJvcDogb3B0aW9ucy5oYXNCYWNrZHJvcCxcclxuICAgICAgICBkaXNhYmxlQ2xvc2U6IG9wdGlvbnMuZGlzYWJsZUNsb3NlXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWJyZSBlbCBkaWFsb2cgZGUgbGFzIGNvbXVuaWRhZGVzXHJcbiAgICAgKiBAcmV0dXJuIFByb21pc2U8TVBsYW5Vbmljb0N1ZW50YT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBvcGVuRGlhbG9nUGxhblVuaWNvQ3VlbnRhcygpOiBQcm9taXNlPE1QbGFuVW5pY29DdWVudGE+IHtcclxuICAgICAgbGV0IHBsYW5lczogTVBsYW5Vbmljb0N1ZW50YVtdID0gYXdhaXQgdGhpcy5nZXRMaXN0YWRvUExhblVuaWNvQ3VlbnRhcygpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBsZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDYXRhbG9nb0NvbXBvbmVudCwge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIGNvbHVtbnM6IFsnY3VlbnRhJywgJ2Rlbm9taW5hY2lvbiddLFxyXG4gICAgICAgICAgY29sdW1uTmFtZXM6IFsnY3VlbnRhJywgJ2Rlbm9taW5hY2nDs24nXSxcclxuICAgICAgICAgIHRpdGxlOiAnQ2F0w6Fsb2dvIGRlIFBsYW4gZGUgQ3VlbnRhcyBHw6luZXJhbCcsXHJcbiAgICAgICAgICBkYXRhU291cmNlOiBwbGFuZXNcclxuICAgICAgICB9IGFzIElDYXRhbG9nbyxcclxuICAgICAgICB3aWR0aDogJzQ1MHB4JyxcclxuICAgICAgICBtYXhIZWlnaHQ6ICc5MHZoJ1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgZWwgbGlzdGFkbyBkZWwgcGxhbiDDum5pY28gZGUgY3VlbnRhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1wbGFuVW5pY29DdWVudGFbXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRMaXN0YWRvUExhblVuaWNvQ3VlbnRhcygpOiBPYnNlcnZhYmxlPE1QbGFuVW5pY29DdWVudGFbXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNUGxhblVuaWNvQ3VlbnRhW10+KGAke3RoaXMuVVJMfS9kYW8vc2NnL3BsYW5fdW5pY29fZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXNwOiBhbnkpID0+IHJlc3AuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTVBsYW5Vbmljb0N1ZW50YShlbGVtZW50KSkpXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhIGNvbmZpZ3VyYWNpw7NuIGRlIFNDR1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1Db25maWd1cmFjaW9uU0NHW10+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICogQG1vZGlmaXQgMjUtMDctMjAyMVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29uZmlndXJhdGlvblNDRygpOiBPYnNlcnZhYmxlPE1Db25maWd1cmFjaW9uU0NHW10+IHsgICAgICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUNvbmZpZ3VyYWNpb25TQ0dbXT4oYCR7dGhpcy5VUkx9L2Rhby9zY2cvY29uZmlndXJhY2lvbl9jb250YWJpbGlkYWRfZGFvLnBocGAsXHJcbiAgICAgIHtoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9XHJcbiAgICAgICkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlc3A6IGFueSkgPT4gcmVzcC5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNQ29uZmlndXJhY2lvblNDRyhlbGVtZW50KSkpXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIHVuIGRpYWxvZyBkZSBjb25maXJtYWNpw7NuXHJcbiAgICAgKiBAcGFyYW0gdGl0bGUgVMOtdHVsbyBkZSBsYSBtb2RhbCBkZSBjb25maXJtXHJcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZW5zYWplIChvcGNpb25hbCkgcGFyYSBlbCB1c3VzYXJpb1xyXG4gICAgICogQHJldHVybiBQcm9taXNlPGJvb2xlYW4+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3BlbkRpYWxvZ0NvbmZpcm0odGl0bGU6IHN0cmluZywgbWVzc2FnZT86IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICBsZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtQ29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgbWVzc2FnZTogKG1lc3NhZ2UpID8gbWVzc2FnZSA6IG51bGxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHdpZHRoOiAnNDUwcHgnLFxyXG4gICAgICAgIG1heEhlaWdodDogJzkwdmgnXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENvbnZpZXJ0ZSBlbCBjb250ZW5pZG8gZGUgdW4gQWJzdHJhY3RDb250cm9sIGVuIG1hecO6c2N1bGEgKFVzYXIgZW4gZXZlbnRvIGtleXVwKVxyXG4gICAgICogQHBhcmFtIGZvcm1Hcm91cCBGb3JtdWxhcmlvIGTDs25kZSBzZSB2YSBhIGJ1c2NhciBlbCBBYnN0cmFjdENvbnRyb2xcclxuICAgICAqIEBwYXJhbSBuYW1lIE5vbWJyZSBkZWwgQWJzdHJhY3RDb250cm9sXHJcbiAgICAgKiBAcmV0dXJuIHZvaWRcclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjaGFuZ2VUb1VwcGVyQ2FzZShmb3JtR3JvdXA6IEZvcm1Hcm91cCwgbmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuZ2V0QWJzdHJhY3RDb250cm9sKGZvcm1Hcm91cCwgbmFtZSkuc2V0VmFsdWUodGhpcy5nZXRBYnN0cmFjdENvbnRyb2woZm9ybUdyb3VwLCBuYW1lKS52YWx1ZS50b1VwcGVyQ2FzZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGVsIEFic3RyYWN0Q29udHJvbCBkZSB1biBmb3JtdWxhcmlvXHJcbiAgICAgKiBAcGFyYW0gZm9ybUdyb3VwIEZvcm11bGFyaW8gZG9uZGUgc2UgdmEgYSBidXNjYXIgZWwgQWJzdHJhY3RDb250cm9sXHJcbiAgICAgKiBAcGFyYW0gbmFtZSBOb21icmUgZGVsIEFic3RyYWN0Q29udHJvbFxyXG4gICAgICogQHJldHVybiBBYnN0cmFjdENvbnRyb2xcclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBYnN0cmFjdENvbnRyb2woZm9ybUdyb3VwOiBGb3JtR3JvdXAsIG5hbWU6IHN0cmluZyk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICAgIHJldHVybiBmb3JtR3JvdXAuZ2V0KG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFByZXZpZW5lIHF1ZSBzZSBlc2NyaWJhbiBsZXRyYXMgZW4gZWwgaW5wdXQgKFVzYXIgZW4ga2V5cHJlc3MpXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgRXZlbnRvIGRlbCB0ZWNsYWRvXHJcbiAgICAgKiBAcmV0dXJuIGJvb2xlYW5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKiBAbW9kaWZpY2FkbyBjb21vIG9ubHlOdW1lcm8gcGFyYSBjb3JyZWdpciBjb2RpZ28sIHVzYXIgY3VycmVuY3ktaW5wdXQgc2kgcXVpZXJlIHVzYXIgZGVjaW1hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25seURlY2ltYWwoZXZlbnQ/OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIWlzTmFOKCtldmVudC5rZXkpICYmIGV2ZW50LmtleUNvZGUgIT0gMzIpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUHJldmllbmUgcXVlIHNlIGVzY3JpYmFuIGxldHJhcyBlbiBlbCBpbnB1dCAoVXNhciBlbiBrZXlwcmVzcylcclxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZGVsIHRlY2xhZG9cclxuICAgICAqIEByZXR1cm4gYm9vbGVhblxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9ubHlOdW1iZXJzKGV2ZW50PzogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKGV2ZW50KTtcclxuICAgICAgaWYgKCFpc05hTigrZXZlbnQua2V5KSAmJiBldmVudC5rZXlDb2RlICE9IDMyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBQZXJtaXRlIChhLXogQS1aIMOhLcO6IMOxw5Egw7zDnCAnLC4pIHF1ZSBzZSBlc2NyaWJhbiBudW1lcm9zIGVuIGVsIGlucHV0IChVc2FyIGVuIGtleXByZXNzKVxyXG4gICAgICogQHBhcmFtIGV2ZW50IEV2ZW50byBkZWwgdGVjbGFkb1xyXG4gICAgICogQHJldHVybiBib29sZWFuXHJcbiAgICAgKiBAZGF0ZSAxNC0wNS0yMDIyXHJcbiAgICAgKiBcclxuICAgICAqL1xyXG4gICAgICBwdWJsaWMgdHlwZU5hbWUoZXZlbnQ/OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoKGV2ZW50LmtleT49J2EnICYmIGV2ZW50LmtleTw9J3onKSAgfHwgKGV2ZW50LmtleT49J0EnICYmIGV2ZW50LmtleTw9J1onKSB8fCAgZXZlbnQua2V5PT1cIsOxXCIgfHwgIGV2ZW50LmtleT09XCLDkVwiIFxyXG4gICAgICAgICAgfHwgKGV2ZW50LmtleT49J8OhJyAmJiBldmVudC5rZXk8PSfDuicpIHx8IGV2ZW50LmtleT49J8O8JyAgfHwgZXZlbnQua2V5Pj0nw5wnICB8fCBldmVudC5rZXk9PVwiJ1wiICB8fCBldmVudC5rZXlDb2RlPT0zMiBcclxuICAgICAgICAgIHx8ICBldmVudC5rZXk9PVwiLlwiIHx8ICBldmVudC5rZXk9PVwiLFwiICApe1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUGVybWl0ZSAoMC05IGEteiBBLVogw6Etw7ogw7HDkSDDvMOcICcsLi1fLzooKSUjwromJOKCrMKjwqUpIHF1ZSBzZSBlc2NyaWJhbiAgZW4gZWwgaW5wdXQgKFVzYXIgZW4ga2V5cHJlc3MpXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgRXZlbnRvIGRlbCB0ZWNsYWRvXHJcbiAgICAgKiBAcmV0dXJuIGJvb2xlYW5cclxuICAgICAqIEBkYXRlIDE0LTA1LTIwMjJcclxuICAgICAqIFxyXG4gICAgICovXHJcbiAgICAgIHB1YmxpYyB0eXBlVGV4dChldmVudD86IGFueSk6IGJvb2xlYW4geyAgICAgIFxyXG4gICAgICAgIGlmICgoZXZlbnQua2V5Pj0nYScgICYmIGV2ZW50LmtleTw9J3onKSB8fCAoZXZlbnQua2V5Pj0nQScgJiYgZXZlbnQua2V5PD0nWicpIHx8IGV2ZW50LmtleT09XCLDsVwiIHx8IGV2ZW50LmtleT09XCLDkVwiIFxyXG4gICAgICAgICAgfHwgKGV2ZW50LmtleT49J8OhJyAmJiBldmVudC5rZXk8PSfDuicpIHx8IGV2ZW50LmtleT09J8O8JyB8fCBldmVudC5rZXk9PSfDnCcgfHwgZXZlbnQua2V5PT1cIidcIiB8fCBpc05hTigrZXZlbnQua2V5KSBcclxuICAgICAgICAgIHx8IGV2ZW50LmtleT09XCIuXCIgIHx8ICBldmVudC5rZXk9PVwiLFwiIHx8IGV2ZW50LmtleT09XCImXCIgfHwgIGV2ZW50LmtleT09XCJfXCJ8fCBldmVudC5rZXk9PVwiLVwiIHx8IGV2ZW50LmtleT09XCIjXCJcclxuICAgICAgICAgIHx8IGV2ZW50LmtleT09XCLCulwiICB8fCAgZXZlbnQua2V5PT1cIiRcIiB8fCBldmVudC5rZXk9PVwiKFwiIHx8IGV2ZW50LmtleT09XCIpXCIgfHwgZXZlbnQua2V5PT1cIiVcIiB8fCBldmVudC5rZXk9PScgJ1xyXG4gICAgICAgICAgfHwgZXZlbnQua2V5PT0nOicgIHx8ZXZlbnQua2V5PT0nLyd8fCBldmVudC5rZXlDb2RlPT04MzY0IHx8ICBldmVudC5rZXlDb2RlPT0xNjUgfHxldmVudC5rZXlDb2RlPT0xNjMpe1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgIFxyXG4gICAgICB9XHJcblxyXG4gICAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBQZXJtaXRlICgwLTkgYS16IEEtWiDDscORIC4tXykgcXVlIHNlIGVzY3JpYmFuICBlbiBlbCBpbnB1dCAoVXNhciBlbiBrZXlwcmVzcylcclxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZGVsIHRlY2xhZG9cclxuICAgICAqIEByZXR1cm4gYm9vbGVhblxyXG4gICAgICogQGRhdGUgMTQtMDUtMjAyMlxyXG4gICAgICovXHJcbiAgICAgICBwdWJsaWMgdHlwZUNvZGUoZXZlbnQ/OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoKGV2ZW50LmtleT49J2EnICAmJiBldmVudC5rZXk8PSd6JykgfHwgKGV2ZW50LmtleT49J0EnICYmIGV2ZW50LmtleTw9J1onKSAgfHwgZXZlbnQua2V5PT1cIsOxXCIgfHwgZXZlbnQua2V5PT1cIsORXCIgXHJcbiAgICAgICAgICB8fGlzTmFOKCtldmVudC5rZXkpIHx8IGV2ZW50LmtleT09XCIuXCIgfHwgIGV2ZW50LmtleT09XCJfXCIgfHwgZXZlbnQua2V5PT1cIi1cIil7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9ICAgICAgICBcclxuICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgXHJcbiAgICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIGVsIGRpYWxvZyBkZSBsYXMgY29tdW5pZGFkZXNcclxuICAgICAqIEByZXR1cm4gUHJvbWlzZTxNQ29tdW5pZGFkPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG9wZW5EaWFsb2dVbmlkYWRlc1RyaWJ1dGFyaWFzKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgIGxldCB1ZFRyaWJ1dGFyaWFzOiBNVW5pZGFkVHJpYnV0YXJpYVtdID0gYXdhaXQgdGhpcy5nZXRVbmlkYWRlc1RyaWJ1dGFyaWFzKCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENhdGFsb2dvQ29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgY29sdW1uczogWydhw7FvJywgJ25yb19kZWNyZXRvJywgJ2ZlY2hhX2RlY3JldG8nLCAnZW50cmFkYV92aWRlbmNpYScsICdwdWJsaWNhY2lvbl9nYWNldGEnLCAnbnJvX2dhY2V0YScsICd2YWxvcnV0J10sXHJcbiAgICAgICAgICB0aXRsZTogJ0NhdMOhbG9nbyBkZSBVbmlkYWRlcyBUcmlidXRhcmlhcycsXHJcbiAgICAgICAgICBkYXRhU291cmNlOiB1ZFRyaWJ1dGFyaWFzXHJcbiAgICAgICAgfSBhcyBJQ2F0YWxvZ28sXHJcbiAgICAgICAgd2lkdGg6ICc0NTBweCcsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiAnOTB2aCdcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyB1bmlkYWRlcyB0cmlidXRhcmlhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRVbmlkYWRlc1RyaWJ1dGFyaWFzKCk6IE9ic2VydmFibGU8TVVuaWRhZFRyaWJ1dGFyaWFbXT4ge1xyXG4gICAgICBjb25zdCByZXF1ZXN0OiBJUmVxdWVzdCA9IHtcclxuICAgICAgICBvcGVyYWNpb246ICdvYnRlbmVyRGF0YScsXHJcbiAgICAgICAgc2lnZXNwX2NvbmV4aW9uOiB7XHJcbiAgICAgICAgICBzZXJ2aWRvcjogdGhpcy5VUkwsXHJcbiAgICAgICAgICB1c3VhcmlvOiB0aGlzLnVzdWFyaW9BY3Rpdm8uZ2V0SW50ZXJmYWNlKClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PE1VbmlkYWRUcmlidXRhcmlhW10+KGAke3RoaXMuVVJMfS9kYW8vY2ZnL3VuZHRyaWJ1dGFyaWFfZGFvLnBocGAsIHJlcXVlc3QpLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXNwOiBhbnlbXSkgPT4gcmVzcC5tYXAoZWxlbWVudCA9PiBuZXcgTVVuaWRhZFRyaWJ1dGFyaWEoZWxlbWVudCkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgdW5hIG1vZGFsIGfDqW5lcmljYVxyXG4gICAgICogQHBhcmFtIGNvbHVtbnMgQ29sdW1uYXMgcXVlIHZhIGEgdGVuZXIgbGEgdGFibGFcclxuICAgICAqIEBwYXJhbSB0aXRsZSBUw610dWxvIGRlbCBkaWFsb2dcclxuICAgICAqIEBwYXJhbSBkYXRhU291cmNlIERhdGEgcXVlIHNlIHZhIGEgbW9zdHJhciBlbiBsYSB0YWJsYVxyXG4gICAgICogQHJldHVybiBQcm9taXNlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBvcGVuQ2F0YWxvZ29HZW5lcmljbyhcclxuICAgICAgY29sdW1uczogc3RyaW5nW10sIFxyXG4gICAgICB0aXRsZTogc3RyaW5nLCBcclxuICAgICAgZGF0YVNvdXJjZTogYW55W10sIFxyXG4gICAgICBjb2x1bW5OYW1lczogc3RyaW5nW10gPSBudWxsLCBcclxuICAgICAgd2lkdGg6IHN0cmluZyA9ICc0NTBweCcsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICBoYXNCYWNrZHJvcD86IGJvb2xlYW4sXHJcbiAgICAgICAgZGlzYWJsZUNsb3NlPzogYm9vbGVhblxyXG4gICAgICB9ID0ge2Rpc2FibGVDbG9zZTogZmFsc2UsIGhhc0JhY2tkcm9wOiBmYWxzZX1cclxuICAgICk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENhdGFsb2dvQ29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgY29sdW1ucyxcclxuICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgICAgZGF0YVNvdXJjZSxcclxuICAgICAgICAgIGNvbHVtbk5hbWVzXHJcbiAgICAgICAgfSBhcyBJQ2F0YWxvZ28sXHJcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxyXG4gICAgICAgIG1heEhlaWdodDogJzkwdmgnLFxyXG4gICAgICAgIGhhc0JhY2tkcm9wOiBvcHRpb25zLmhhc0JhY2tkcm9wID8gb3B0aW9ucy5oYXNCYWNrZHJvcCA6IGZhbHNlLFxyXG4gICAgICAgIGRpc2FibGVDbG9zZTogb3B0aW9ucy5kaXNhYmxlQ2xvc2UgPyBvcHRpb25zLmRpc2FibGVDbG9zZSA6IGZhbHNlLFxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgdW5hIG1vZGFsIGfDqW5lcmljYSBjb24gMiBpbnB1dHNcclxuICAgICAqIEBwYXJhbSBjb2x1bW5zIENvbHVtbmFzIHF1ZSB2YSBhIHRlbmVyIGxhIHRhYmxhXHJcbiAgICAgKiBAcGFyYW0gdGl0bGUgVMOtdHVsbyBkZWwgZGlhbG9nXHJcbiAgICAgKiBAcGFyYW0gZGF0YVNvdXJjZSBEYXRhIHF1ZSBzZSB2YSBhIG1vc3RyYXIgZW4gbGEgdGFibGFcclxuICAgICAqIEByZXR1cm4gUHJvbWlzZTxhbnk+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgb3BlbkNhdGFsb2dvRG9zSW5wdXRzKFxyXG4gICAgICBjb2x1bW5zOiBzdHJpbmdbXSxcclxuICAgICAgdGl0bGU6IHN0cmluZywgXHJcbiAgICAgIGRhdGFTb3VyY2U6IGFueVtdLCBcclxuICAgICAgZmlsdGVyRGF0YTogZmlsdGVyRGF0YVtdLFxyXG4gICAgICBjb2x1bW5OYW1lczogc3RyaW5nW10gPSBudWxsLFxyXG4gICAgICB3aWR0aDogc3RyaW5nID0gXCI0NTBweFwiXHJcbiAgICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICBsZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDYXRhbG9nb0RvYmxlSW5wdXRDb21wb25lbnQsIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBjb2x1bW5zLFxyXG4gICAgICAgICAgdGl0bGUsXHJcbiAgICAgICAgICBkYXRhU291cmNlLFxyXG4gICAgICAgICAgY29sdW1uTmFtZXMsXHJcbiAgICAgICAgICBmaWx0ZXJEYXRhXHJcbiAgICAgICAgfSBhcyBJQ2F0YWxvZ28sXHJcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxyXG4gICAgICAgIG1heEhlaWdodDogJzkwdmgnXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWJyZSBlbCBkaWFsb2cgZGUgbGFzIGNvbXVuaWRhZGVzXHJcbiAgICAgKiBAcmV0dXJuIFByb21pc2U8TUNvbXVuaWRhZD5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBvcGVuRGlhbG9nQ29tdW5pZGFkKCk6IFByb21pc2U8TUNvbXVuaWRhZD4ge1xyXG4gICAgICBsZXQgY29tdW5pZGFkZXM6IE1Db211bmlkYWRbXSA9IGF3YWl0IHRoaXMuZ2V0Q29tdW5pZGFkZXMoKS50b1Byb21pc2UoKTtcclxuICAgICAgbGV0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ2F0YWxvZ29Db21wb25lbnQsIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBjb2x1bW5zOiBbJ3ByZWZpam8nLCAncGFpcycsICdlc3RhZG8nLCAnbXVuaWNpcGlvJywgJ3BhcnJvcXVpYScsICdjb2RpZ28nLCAnY29tdW5pZGFkJ10sXHJcbiAgICAgICAgICB0aXRsZTogJ0NhdMOhbG9nbyBkZSBDb211bmlkYWRlcycsXHJcbiAgICAgICAgICBkYXRhU291cmNlOiBjb211bmlkYWRlc1xyXG4gICAgICAgIH0gYXMgSUNhdGFsb2dvLFxyXG4gICAgICAgIHdpZHRoOiAnNDUwcHgnLFxyXG4gICAgICAgIG1heEhlaWdodDogJzkwdmgnXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgY29tdW5pZGFkZXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNQ29tdW5pZGFkW10+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29tdW5pZGFkZXMoKTogT2JzZXJ2YWJsZTxNQ29tdW5pZGFkW10+IHtcclxuICAgICAgY29uc3QgcmVxdWVzdDogSVJlcXVlc3QgPSB7XHJcbiAgICAgICAgb3BlcmFjaW9uOiAnb2J0ZW5lckRhdGEnLFxyXG4gICAgICAgIHNpZ2VzcF9jb25leGlvbjoge1xyXG4gICAgICAgICAgc2Vydmlkb3I6IHRoaXMuVVJMLFxyXG4gICAgICAgICAgdXN1YXJpbzogdGhpcy51c3VhcmlvQWN0aXZvLmdldEludGVyZmFjZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxNQ29tdW5pZGFkW10+KGAke3RoaXMuVVJMfS9kYW8vY2ZnL2NvbXVuaWRhZGVzX2Rhby5waHBgLCByZXF1ZXN0KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55W10pID0+IHJlc3AubWFwKGVsZW1lbnQgPT4gbmV3IE1Db211bmlkYWQoZWxlbWVudCkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgZWwgZGlhbG9nIGRlIGxhcyBsYXMgbW9uZWRhc1xyXG4gICAgICogQHJldHVybiBQcm9taXNlPE1Nb25lZGE+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgb3BlbkRpYWxvZ01vbmVkYXMoKTogUHJvbWlzZTxNTW9uZWRhPiB7XHJcbiAgICAgIGxldCBjb2luczogTU1vbmVkYVtdID0gYXdhaXQgdGhpcy5nZXRNb25lZGFzKCd0b2RhcycpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBsZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDYXRhbG9nb0NvbXBvbmVudCwge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIGNvbHVtbnM6IFsnY29kaWdvJywgJ2Rlbm9taW5hY2lvbicsICdpc28nLCAnc2ltYm9sbyddLFxyXG4gICAgICAgICAgdGl0bGU6ICdDYXTDoWxvZ28gZGUgTW9uZWRhcycsXHJcbiAgICAgICAgICBjb2x1bW5OYW1lczogWydjw7NkaWdvJywgJ2Rlbm9taW5hY2nDs24nLCAnaXNvJywgJ3NpbWJvbG8nXSxcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IGNvaW5zXHJcbiAgICAgICAgfSBhcyBJQ2F0YWxvZ28sXHJcbiAgICAgICAgd2lkdGg6ICc0NTBweCcsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiAnOTB2aCdcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIG1vbmVkYXNcclxuICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TU1vbmVkYVtdPlxyXG4gICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICogYWN0dWFsaXphZG8gNC0xMi0yMDIyXHJcbiAgICogQHBhcmFtIHRpcG8gOnN0cmluZyB7J3RvZGFzJywndW5vJywnYWN0dWFsfVxyXG4gICAqIEBwYXJhbSBpZCA6IG51bWJlclxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqLyBcclxuICAgIFxyXG4gICAgXHJcbiAgICBwdWJsaWMgZ2V0TW9uZWRhcyh0aXBvOnN0cmluZyxpZD86bnVtYmVyKTogT2JzZXJ2YWJsZTxNTW9uZWRhW10+IHsgICAgIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNTW9uZWRhW10+KGAke3RoaXMuVVJMfS9kYW8vY2ZnL21vbmVkYXNfZGFvLnBocD90aXBvPSR7dGlwb30maWQ9JHtpZH1gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKX0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXNwOiBhbnlbXSkgPT4gcmVzcC5tYXAoZWxlbWVudCA9PiBuZXcgTU1vbmVkYShlbGVtZW50KSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG5cclxuICBcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIGVsIGRpYWxvZyBkZSBsYXMgbGFzIGN1ZW50YXMgY29udGFibGVzIChDdWVudGFzIEluc3RpdHVjaW9uYWxlcylcclxuICAgICAqIEByZXR1cm4gUHJvbWlzZTxNY3VlbnRhSW5zdGl0dWNpb25hbD5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBvcGVuRGlhbG9nQ3VlbnRhc0luc3RpdHVjaW9uYWxlcygpOiBQcm9taXNlPE1DdWVudGFJbnN0aXR1Y2lvbmFsPiB7XHJcbiAgICAgIGxldCBhY2NvdW50czogTUN1ZW50YUluc3RpdHVjaW9uYWxbXSA9IGF3YWl0IHRoaXMuZ2V0Q3VlbnRhc0luc3RpdHVjaW9uYWxlcygpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBsZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDYXRhbG9nb0NvbXBvbmVudCwge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIGNvbHVtbnM6IFsnY3VlbnRhJywgJ2Rlbm9taW5hY2lvbiddLFxyXG4gICAgICAgICAgY29sdW1uTmFtZXM6IFsnY3VlbnRhJywgJ2Rlbm9taW5hY2nDs24nXSxcclxuICAgICAgICAgIHRpdGxlOiAnQ2F0w6Fsb2dvIGRlIHBsYW4gZGUgY3VlbnRhIGluc3RpdHVjaW9uYWwnLFxyXG4gICAgICAgICAgZGF0YVNvdXJjZTogYWNjb3VudHNcclxuICAgICAgICB9IGFzIElDYXRhbG9nbyxcclxuICAgICAgICB3aWR0aDogJzQ1MHB4JyxcclxuICAgICAgICBtYXhIZWlnaHQ6ICc5MHZoJ1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGN1ZW50YXMgY29udGFibGVzIChDdWVudGFzIEluc3RpdHVjaW9uYWxlcylcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNQ3VlbnRhSW5zdGl0dWNpb25hbFtdPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEN1ZW50YXNJbnN0aXR1Y2lvbmFsZXMoaW52ZW50b3J5PzogYm9vbGVhbik6IE9ic2VydmFibGU8TUN1ZW50YUluc3RpdHVjaW9uYWxbXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNQ3VlbnRhSW5zdGl0dWNpb25hbFtdPihgJHt0aGlzLlVSTH0vZGFvL3NjZy9jdWVudGFzX2Rhby5waHAkeyhpbnZlbnRvcnkpID8gJz9pbnZlbnRvcnk9dHJ1ZScgOiAnJ31gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55KSA9PiByZXNwLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1DdWVudGFJbnN0aXR1Y2lvbmFsKGVsZW1lbnQpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIGVsIGRpYWxvZyBkZSBsYXMgY3VlbnRhcyBkZSBwcmVzdXB1ZXN0byAoUmVjdXJzb3MgeSBFZ3Jlc29zKVxyXG4gICAgICogQHJldHVybiBQcm9taXNlPE1DdWVudGFQcmVzdXB1ZXN0bz5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBvcGVuRGlhbG9nQ3VlbnRhc1ByZXN1cHVlc3RvKCk6IFByb21pc2U8TUN1ZW50YVByZXN1cHVlc3RvPiB7XHJcbiAgICAgIGxldCBhY2NvdW50czogTUN1ZW50YVByZXN1cHVlc3RvW10gPSBhd2FpdCB0aGlzLmdldEN1ZW50YXNQcmVzdXB1ZXN0bygpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBsZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDYXRhbG9nb0NvbXBvbmVudCwge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIGNvbHVtbk5hbWVzOiBbJ2N1ZW50YScsICdkZW5vbWluYWNpw7NuJ10sXHJcbiAgICAgICAgICBjb2x1bW5zOiBbJ2N1ZW50YScsICdkZW5vbWluYWNpb24nXSxcclxuICAgICAgICAgIHRpdGxlOiAnQ2F0w6Fsb2dvIGRlIEN1ZW50YXMgZGUgUHJlc3VwdWVzdG8nLFxyXG4gICAgICAgICAgZGF0YVNvdXJjZTogYWNjb3VudHNcclxuICAgICAgICB9IGFzIElDYXRhbG9nbyxcclxuICAgICAgICB3aWR0aDogJzQ1MHB4JyxcclxuICAgICAgICBtYXhIZWlnaHQ6ICc5MHZoJ1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGN1ZW50YXMgZGUgcmVjdXJzb3MgeSBlZ3Jlc29zXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUN1ZW50YVByZXN1cHVlc3RvPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEN1ZW50YXNQcmVzdXB1ZXN0bygpOiBPYnNlcnZhYmxlPE1DdWVudGFQcmVzdXB1ZXN0b1tdPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1DdWVudGFQcmVzdXB1ZXN0bz4oYCR7dGhpcy5VUkx9L2Rhby9zY2cvcGxhbl91bmljb19jdWVudGFzX2Rhby5waHBgLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNQ3VlbnRhUHJlc3VwdWVzdG8oZWxlbWVudCkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgZWwgY8OhdGFsb2dvIGRlIGN1ZW50YXMgZGUgbGEgdGFibGEgXCJzY2dfcGxhbl91bmljb19yZVwiXHJcbiAgICAgKiBAcmV0dXJucyBQcm9taXNlPE1DdWVudGFQcmVzdXB1ZXN0bz5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKiBAcGFyYW1zIGZpbHRybzogSW5kaWNhIGJham8gcXVlIHBhcmFtZXRyb3Mgc2UgdmEgYSBmaWx0cmFyIGVsIGNhdGFsb2dvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBvcGVuQ2F0YWxvZ29DdWVudGFzUHJlc3VzcHVlc3RvKFxyXG4gICAgICB0aXR1bG86IHN0cmluZyxcclxuICAgICAgZmlsdHJvOiBmaWx0cm9DdWVudGFzUHJlc3VwdWVzdG8gPSBudWxsLFxyXG4gICAgICBhbmNobzogc3RyaW5nID0gJzc1MHB4J1xyXG4gICAgKTogUHJvbWlzZTxNQ3VlbnRhUHJlc3VwdWVzdG8+IHtcclxuICAgICAgbGV0IGN1ZW50YXM6IE1DdWVudGFQcmVzdXB1ZXN0b1tdID0gW107XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLmdldEN1ZW50YXNQcmVzdXB1ZXN0bygpLnRvUHJvbWlzZSgpLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgIGN1ZW50YXMgPSByZXM7XHJcbiAgICAgICAgaWYgKGZpbHRybykge1xyXG4gICAgICAgICAgaWYgKGZpbHRyby5lc3RhZG8pIHtcclxuICAgICAgICAgICAgY3VlbnRhcyA9IGN1ZW50YXMuZmlsdGVyKGMgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiBjLnN0YXR1cyA9PSBmaWx0cm8uZXN0YWRvXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZmlsdHJvLnRpcG8pIHtcclxuICAgICAgICAgICAgY3VlbnRhcyA9IGN1ZW50YXMuZmlsdGVyKGMgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiBjLnRpcG8gPT0gZmlsdHJvLnRpcG9cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY3VlbnRhcyA9IGN1ZW50YXMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgZVsncHJvdlN0YXR1cyddID0gZS5zdGF0dXMgPT0gXCJDXCIgPyBcIk1vdmltaWVudG9zXCIgOiBcIlRvdGFsaXphZG9yYVwiXHJcbiAgICAgICAgICBlWydwcm92VHlwZSddID0gZS5zdGF0dXMgPT0gXCJSXCIgPyBcIlJlY3Vyc29zXCIgOiBcIkluZ3Jlc29zXCJcclxuICAgICAgICAgIHJldHVybiBlXHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgICAgcmV0dXJuIHRoaXMub3BlbkNhdGFsb2dvR2VuZXJpY28oXHJcbiAgICAgICAgW1wiY3VlbnRhXCIsXCJkZW5vbWluYWNpb25cIixcInByb3ZTdGF0dXNcIixcInByb3ZUeXBlXCJdLFxyXG4gICAgICAgIHRpdHVsbyxcclxuICAgICAgICBjdWVudGFzLFxyXG4gICAgICAgIFtcIkN1ZW50YVwiLFwiRGVub21pbmFjacOzblwiLFwiRXN0YWRvXCIsXCJUaXBvXCJdLFxyXG4gICAgICAgIGFuY2hvXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIGVsIGPDoXRhbG9nbyBkZSBjdWVudGFzIGRlIGxhIHRhYmxhIFwic3BnX2N1ZW50YXNcIlxyXG4gICAgICogQHJldHVybnMgUHJvbWlzZTxNQ3VlbnRhRWdyZXNvcz5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKiBAcGFyYW1zIHByZXN1cHVlc3RvOiBJbmRpY2Egc2kgc2UgYSB0cmFiYWphciBjb24gZXN0cnVjdHVyYSBkZSBwcmVzdXB1ZXN0byBvIG5vXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBvcGVuQ2F0YWxvZ29DdWVudGFzRWdyZXNvKFxyXG4gICAgICB0aXR1bG86IHN0cmluZyxcclxuICAgICAgcHJlc3VwdWVzdG86IGJvb2xlYW4gPSB0cnVlLFxyXG4gICAgICBhbmNobzogc3RyaW5nID0gXCI3NTBweFwiXHJcbiAgICApOiBQcm9taXNlPE1DdWVudGFFZ3Jlc29zPntcclxuICAgICAgbGV0IGN1ZW50YXM6IE1DdWVudGFFZ3Jlc29zW10gPSBbXTtcclxuICAgICAgYXdhaXQgdGhpcy5nZXRFeHBlbnNlQWNjb3VudHMoKS50b1Byb21pc2UoKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgY3VlbnRhcyA9IHJlc1xyXG4gICAgICAgIGN1ZW50YXMgPSBjdWVudGFzLmZpbHRlcihlID0+IHtcclxuICAgICAgICAgIHJldHVybiBlLnN0YXR1cyA9PSBcIkNcIlxyXG4gICAgICAgIH0pLm1hcChlID0+IHtcclxuICAgICAgICAgIGVbJ3Byb3ZTdGF0dXMnXSA9IGUuc3RhdHVzID09IFwiQ1wiID8gXCJNb3ZpbWllbnRvc1wiIDogXCJUb3RhbGl6YWRvcmFcIlxyXG4gICAgICAgICAgcmV0dXJuIGU7XHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgICAgaWYgKHByZXN1cHVlc3RvKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbkNhdGFsb2dvRG9zSW5wdXRzKFxyXG4gICAgICAgICAgW1wiY3VlbnRhXCIsXCJkZW5vbWluYWNpb25cIixcImVzdHJ1Y3R1cmFcIixcInByb3ZTdGF0dXNcIl0sXHJcbiAgICAgICAgICB0aXR1bG8sXHJcbiAgICAgICAgICBjdWVudGFzLFxyXG4gICAgICAgICAgW3tcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiQ3VlbnRhXCIsXHJcbiAgICAgICAgICAgIHByb3BlcnR5OiBcImN1ZW50YVwiXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIkVzdHJ1Y3R1cmFcIixcclxuICAgICAgICAgICAgcHJvcGVydHk6IFwiZXN0cnVjdHVyYVwiXHJcbiAgICAgICAgICB9XSxcclxuICAgICAgICAgIFtcIkN1ZW50YVwiLCBcIkRlbm9taW5hY2nDs25cIiwgXCJFc3RydWN0dXJhXCIsIFwiRXN0YWRvXCJdLFxyXG4gICAgICAgICAgYW5jaG9cclxuICAgICAgICApXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGZpbHRlcmVkQWNjb3VudHM6IE1DdWVudGFFZ3Jlc29zW10gPSBbXTtcclxuICAgICAgICBjdWVudGFzLmZvckVhY2goYyA9PiB7XHJcbiAgICAgICAgICBpZiAoIWZpbHRlcmVkQWNjb3VudHMuZmluZChlID0+IGUuY3VlbnRhID09IGMuY3VlbnRhKSkge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZEFjY291bnRzLnB1c2goYylcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5DYXRhbG9nb0dlbmVyaWNvKFxyXG4gICAgICAgICAgW1wiY3VlbnRhXCIsXCJkZW5vbWluYWNpb25cIixcInByb3ZTdGF0dXNcIl0sXHJcbiAgICAgICAgICB0aXR1bG8sXHJcbiAgICAgICAgICBmaWx0ZXJlZEFjY291bnRzLFxyXG4gICAgICAgICAgW1wiQ3VlbnRhXCIsIFwiRGVub21pbmFjacOzblwiLCBcIkVzdGFkb1wiXSxcclxuICAgICAgICAgIGFuY2hvXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWJyZSBlbCBjw6F0YWxvZ28gZGUgY3VlbnRhcyBkZSBsYSB0YWJsYSBcInNwaV9jdWVudGFzXCJcclxuICAgICAqIEByZXR1cm5zIFByb21pc2U8TUN1ZW50YUluZ3Jlc29zPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqIEBwYXJhbXMgcHJlc3VwdWVzdG86IEluZGljYSBzaSBzZSBhIHRyYWJhamFyIGNvbiBlc3RydWN0dXJhIGRlIHByZXN1cHVlc3RvIG8gbm9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG9wZW5DYXRhbG9nb0N1ZW50YXNJbmdyZXNvKFxyXG4gICAgICB0aXR1bG86IHN0cmluZyxcclxuICAgICAgcHJlc3VwdWVzdG86IGJvb2xlYW4gPSB0cnVlLFxyXG4gICAgICBhbmNobzogc3RyaW5nID0gXCI3NTBweFwiXHJcbiAgICApOiBQcm9taXNlPE1DdWVudGFJbmdyZXNvcz57XHJcbiAgICAgIGxldCBjdWVudGFzOiBNQ3VlbnRhSW5ncmVzb3NbXSA9IFtdO1xyXG4gICAgICBhd2FpdCB0aGlzLmdldEluY29tZUFjY291bnRzKCkudG9Qcm9taXNlKCkudGhlbigocmVzOiBJUmVzcG9uc2UpID0+IHtcclxuICAgICAgICBjdWVudGFzID0gcmVzLmRhdGFcclxuICAgICAgICBjdWVudGFzID0gY3VlbnRhcy5maWx0ZXIoZSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gZS5lc3RhZG8gPT0gXCJDXCJcclxuICAgICAgICB9KS5tYXAoZSA9PiB7XHJcbiAgICAgICAgICBlWydwcm92U3RhdHVzJ10gPSBlLmVzdGFkbyA9PSBcIkNcIiA/IFwiTW92aW1pZW50b3NcIiA6IFwiVG90YWxpemFkb3JhXCJcclxuICAgICAgICAgIHJldHVybiBlO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgICAgIGlmIChwcmVzdXB1ZXN0bykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5DYXRhbG9nb0Rvc0lucHV0cyhcclxuICAgICAgICAgIFtcImN1ZW50YVwiLFwiZGVub21pbmFjaW9uXCIsXCJlc3RydWN0dXJhXCIsXCJwcm92U3RhdHVzXCJdLFxyXG4gICAgICAgICAgdGl0dWxvLFxyXG4gICAgICAgICAgY3VlbnRhcyxcclxuICAgICAgICAgIFt7XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIkN1ZW50YVwiLFxyXG4gICAgICAgICAgICBwcm9wZXJ0eTogXCJjdWVudGFcIlxyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJFc3RydWN0dXJhXCIsXHJcbiAgICAgICAgICAgIHByb3BlcnR5OiBcImVzdHJ1Y3R1cmFcIlxyXG4gICAgICAgICAgfV0sXHJcbiAgICAgICAgICBbXCJDdWVudGFcIiwgXCJEZW5vbWluYWNpw7NuXCIsIFwiRXN0cnVjdHVyYVwiLCBcIkVzdGFkb1wiXSxcclxuICAgICAgICAgIGFuY2hvXHJcbiAgICAgICAgKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBmaWx0ZXJlZEFjY291bnRzOiBNQ3VlbnRhSW5ncmVzb3NbXSA9IFtdO1xyXG4gICAgICAgIGN1ZW50YXMuZm9yRWFjaChjID0+IHtcclxuICAgICAgICAgIGlmICghZmlsdGVyZWRBY2NvdW50cy5maW5kKGUgPT4gZS5jdWVudGEgPT0gYy5jdWVudGEpKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkQWNjb3VudHMucHVzaChjKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbkNhdGFsb2dvR2VuZXJpY28oXHJcbiAgICAgICAgICBbXCJjdWVudGFcIixcImRlbm9taW5hY2lvblwiLFwicHJvdlN0YXR1c1wiXSxcclxuICAgICAgICAgIHRpdHVsbyxcclxuICAgICAgICAgIGZpbHRlcmVkQWNjb3VudHMsXHJcbiAgICAgICAgICBbXCJDdWVudGFcIiwgXCJEZW5vbWluYWNpw7NuXCIsIFwiRXN0YWRvXCJdLFxyXG4gICAgICAgICAgYW5jaG9cclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgIH0gICAgXHJcblxyXG4gICAgcHVibGljIGdldFVuaWRhZEFkbWluaXN0cmF0aXZhKCl7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuVVJMfS9kYW8vc3BnL3VuaWRhZF9hZG1pbmlzdHJhdGl2YV9kYW8ucGhwYCxcclxuICAgICAge2hlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKX0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzOmFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1BZG1pbmlzdHJhdGl2ZVVuaXQoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KSBcclxuICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyBjYXJnb3MgZGUgc2VydmljaW9zXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNlcnZpY2VDaGFyZ2VzKHNlcnZpY2VJZDpudW1iZXIgPSBudWxsKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3NvYy9zZXJ2aWNpb19jYXJnb19kYW8ucGhwJHtcclxuICAgICAgICBzZXJ2aWNlSWQgPyBgP3NlcnZpY2VfaWQ9JHtzZXJ2aWNlSWR9YCA6ICcnXHJcbiAgICAgIH1gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNU2VydmljZUNoYXJnZShlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgIC8qKiBcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyBwYWlzZXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNQ291bnRyeT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKiBAbW9kaWZpZWQgMTAtMDEtMjAyMlxyXG4gICAgICogQHBhcmFtIGNvZGlnbzogQ29kaWdvIGRlbCBwYWlzXHJcblxyXG4gICAgICovXHJcbiAgICAgIHB1YmxpYyBnZXRDb3VudHJpZXMoY29kaWdvPzpzdHJpbmcpOiBPYnNlcnZhYmxlPE1Db3VudHJ5W10+IHtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNQ291bnRyeT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvcGFpc2VzX2Rhby5waHA/Y29kaWdvPSR7Y29kaWdvfWAsXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUNvdW50cnkoZSkpKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgLyoqXHJcbiAgICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyBlc3RhZG9zXHJcbiAgICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNU3RhdGU+XHJcbiAgICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgICAqIEBtb2RpZmljYWRvIDQtMTItMjAyMlxyXG4gICAgICAgKiBAcGFyYW0gY29kaWdvOiBDb2RpZ28gZGVsIHBhaXNcclxuICAgICAgICovXHJcbiAgICAgIHB1YmxpYyBnZXRTdGF0ZXMoY29kaWdvPzpzdHJpbmcpOiBPYnNlcnZhYmxlPE1TdGF0ZVtdPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TVN0YXRlPihgJHt0aGlzLlVSTH0vZGFvL2NmZy9lc3RhZG9zX2Rhby5waHA/Y29kaWdvPSR7Y29kaWdvfWAsXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTVN0YXRlKGUpKSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgbXVuaWNpcGlvc1xyXG4gICAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TU11bmljaXBhbGl0eT5cclxuICAgICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAgICogQG1vZGlmaWNhZG8gMTAtMDEtMjAyMlxyXG4gICAgICAgKiBAcGFyYW0gcGFpczogQ29kaWdvIGRlbCBwYWlzICxcclxuICAgICAgICogQHBhcmFtIGVzdGFkbzogQ29kaWdvIGRlbCBlc3RhZG9cclxuICAgICAgICogQGFjdHVhbGl6YWRvIDQtMTItMjAyMlxyXG4gICAgICAgKi9cclxuICAgICAgcHVibGljIGdldE11bmljaXBhbGl0aWVzKHBhaXM/OnN0cmluZyxlc3RhZG8/OnN0cmluZyk6IE9ic2VydmFibGU8TU11bmljaXBhbGl0eVtdPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TU11bmljaXBhbGl0eT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvbXVuaWNpcGlvc19kYW8ucGhwP3BhaXM9JHtwYWlzfSZlc3RhZG89JHtlc3RhZG99YCxcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNTXVuaWNpcGFsaXR5KGUpKSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgcGFycm9xdWlhcyBcclxuICAgICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1QYXJpc2g+XHJcbiAgICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgICAqIEBtb2RpZmljYWRvIDEwLTAxLTIwMjJcclxuICAgICAgICogQHBhcmFtIHBhaXM6IENvZGlnbyBkZWwgcGFpc1xyXG4gICAgICAgKiBAcGFyYW0gZXN0YWRvOiBDb2RpZ28gZGVsIGVzdGFkb1xyXG4gICAgICAgKiBAcGFyYW0gbXVuaWNpcGlvOmNvZGlnbyBNdW5pY2lwaW9cclxuICAgICAgICogQGFjdHVhbGl6YWRvIDQtMTItMjAyMlxyXG5cclxuICAgICAgICovXHJcbiAgICAgIHB1YmxpYyBnZXRQYXJpc2hlcyhwYWlzPzpzdHJpbmcsZXN0YWRvPzpzdHJpbmcsbXVuaWNpcGlvPzpzdHJpbmcpOiBPYnNlcnZhYmxlPE1QYXJpc2hbXT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1QYXJpc2g+KGAke3RoaXMuVVJMfS9kYW8vY2ZnL3BhcnJvcXVpYXNfZGFvLnBocD9wYWlzPSR7cGFpc30mZXN0YWRvPSR7ZXN0YWRvfSZtdW5pY2lwaW89JHttdW5pY2lwaW99YCxcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNUGFyaXNoKGUpKSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgY2l1ZGFkZXNcclxuICAgICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1QYXJpc2g+XHJcbiAgICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgICAqIEBtb2RpZmljYWRvIDEwLTAxLTIwMjJcclxuICAgICAgICogQHBhcmFtIHBhaXM6IENvZGlnbyBkZWwgcGFpc1xyXG5cclxuICAgICAgICovXHJcbiAgICAgICAgICAgcHVibGljIGdldENpdHlzKHBhaXM/OnN0cmluZyk6IE9ic2VydmFibGU8TVBhcmlzaFtdPiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1QYXJpc2g+KGAke3RoaXMuVVJMfS9kYW8vY2ZnL2NpdWRhZGVzX2Rhby5waHA/cGFpcz0ke3BhaXN9YCxcclxuICAgICAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUNpdHkoZSkpKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICBcclxuICBcclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIHNpc3RlbWFzIGFjdGl2YXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNU2lzdGVtYT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTaXN0ZW1hcygpOiBPYnNlcnZhYmxlPE1TaXN0ZW1hW10+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TVNpc3RlbWE+KGAke3RoaXMuVVJMfS9kYW8vc3NzL3Npc3RlbWFzX2Rhby5waHBgLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNU2lzdGVtYShlKSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYSBtb25lZGEgYWN0dWFsXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqIEBhY3R1YWxpemFkbzogNC0xMi0yMDIyMlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q3VycmVudEN1cnJlbmN5KCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvbW9uZWRhX2Rhby5waHA/dGlwbz17J2FjdHVhbCd9YCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSBuZXcgTU1vbmVkYUNvbmZpZyhyZXMuZGF0YSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgdGlwb3MgZGUgb3JnYW5pemFjaW9uXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE9yZ2FuaXphdGlvblR5cGVzKCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9ycGMvdGlwb19vcmdhbml6YWNpb25fZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1Pcmdhbml6YXRpb25UeXBlKGUpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyB0aXBvcyBkZSBvcmdhbml6YWNpb25cclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U3BlY2lhbHRpZXMoKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3JwYy9lc3BlY2lhbGlkYWRfZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1TcGVjaWFsdHkoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIGRvY3VtZW50b3NcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RG9jdW1lbnRzKCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9ycGMvZG9jdW1lbnRvX2Rhby5waHBgLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNRG9jdW1lbnQoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGNsYXNpZmljYWNpb25lc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDbGFzaWZpY2F0aW9ucygpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vcnBjL2NsYXNpZmljYWNpb25fZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1DbGFzaWZpY2F0aW9uKGUpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGVsIHByZWZpam8gZGUgbG9zIHVzdWFyaW9zXHJcbiAgICAgKiBAcGFyYW0gcHJvY2VkZSBEZSBxdWUgbcOzZHVsbyBwcm9jZWRlXHJcbiAgICAgKiBAcGFyYW0gY29kc2lzIEPDs2RpZ28gZGVsIHNpc3RlbWFcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNVXN1YXJpb1ByZWZpam9bXT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRVc2VyUHJlZml4KGZpbHRlcjogJ2FsbCcgfCAnZGV0YWlsJyA9IG51bGwsIGNvZGU6IHN0cmluZyA9IG51bGwpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL2NmZy9jb250cm9sX251bWVyb19kYW8ucGhwJHtcclxuICAgICAgICBmaWx0ZXIgPyBgP2ZpbHRlcj0ke2ZpbHRlcn0mY29kZT0ke2NvZGV9YCA6ICcnXHJcbiAgICAgIH1gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNVXN1YXJpb1ByZWZpam8oZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgZWwgZGlhbG9nIHBhcmEgYnVzY2FyIGxvcyBwcm92ZWVkb3Jlc1xyXG4gICAgICogQHJldHVybiBQcm9taXNlPE1Qcm92ZWVkb3I+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgb3BlbkRpYWxvZ1Byb3ZlZWRvcmVzKCk6IFByb21pc2U8TVByb3ZlZWRvcj4ge1xyXG4gICAgICBsZXQgcHJvdmVlZG9yZXM6IE1Qcm92ZWVkb3JbXSA9IGF3YWl0IHRoaXMuZ2V0UHJvdmVlZG9yZXMoKS50b1Byb21pc2UoKTtcclxuICAgICAgbGV0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ2F0YWxvZ29Db21wb25lbnQsIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBjb2x1bW5zOiBbJ3RpcG8nLCAncmlmJywgJ25vbWJyZSddLFxyXG4gICAgICAgICAgdGl0bGU6ICdDYXTDoWxvZ28gZGUgUHJvdmVlZG9yZXMgeSBCZW5lZmljaWFyaW9zJyxcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IHByb3ZlZWRvcmVzXHJcbiAgICAgICAgfSBhcyBJQ2F0YWxvZ28sXHJcbiAgICAgICAgd2lkdGg6ICc0NTBweCcsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiAnOTB2aCdcclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgcHJvdmVlZG9yZXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNUHJvdmVlZG9yW10+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UHJvdmVlZG9yZXMoKTogT2JzZXJ2YWJsZTxNUHJvdmVlZG9yW10+IHtcclxuICAgICAgbGV0IHJlcXVlc3Q6IElSZXF1ZXN0ID0ge1xyXG4gICAgICAgIG9wZXJhY2lvbjogJ29idGVuZXJEYXRhJyxcclxuICAgICAgICBzaWdlc3BfY29uZXhpb246IHtcclxuICAgICAgICAgIHNlcnZpZG9yOiB0aGlzLlVSTCxcclxuICAgICAgICAgIHVzdWFyaW86IHRoaXMudXN1YXJpb0FjdGl2by5nZXRJbnRlcmZhY2UoKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8TVByb3ZlZWRvcltdPihgJHt0aGlzLlVSTH0vZGFvL3JwYy9wcm92ZWVkb3JfYmVuZWZpY2lhcmlvX2Rhby5waHBgLCByZXF1ZXN0KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5tYXAoZWxlbWVudCA9PiBuZXcgTVByb3ZlZWRvcihlbGVtZW50KSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgcHJvdmVlZG9yZXMgeSBiZW5lZmljaWFyaW9zXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFByb3ZpZGVyc0FuZEJlbmVmaWNpYXJpZXModHlwZTogc3RyaW5nID0gbnVsbCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9ycGMvcHJvdmVlZG9yX2JlbmVmaWNpYXJpb19kYW8ucGhwJHt0eXBlID8gYD9wcm92aWRlcl90eXBlPSR7dHlwZX1gICA6ICcnfWAsIFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNUHJvdmlkZXJCZW5lZmljaWFyeShlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgdW4gVXN1YXJpbyBzZWd1biBzdSBJRFxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRVc2VyQnlJZChpZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3Nzcy91c3VhcmlvX2Rhby5waHA/aWQ9JHtpZH1gLCBcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSBuZXcgTVVzdWFyaW8ocmVzLmRhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIGJhbmNvc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRCYW5rcygpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc2NiL2JhbmNvX2Rhby5waHBgLCBcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUJhbmsoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIHRpcG9zIGRlIGN1ZW50YSBiYW5jYXJpYXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0QmFua0FjY291bnRUeXBlcygpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc2NiL2JhbmNvX3RpcG9fY3VlbnRhX2Rhby5waHBgLCBcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUJhbmtBY2NvdW50VHlwZShlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFsbEJhbmtBY2NvdW50KCl7ICAgICAgICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5VUkx9L2Rhby9zY2IvY3VlbnRhX2JhbmNvX2Rhby5waHA/YCxcclxuICAgICAge2hlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKX0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzOmFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1DdWVudGFCYW5jbyhlbGVtZW50KSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IFtdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlc1xyXG4gICAgICAgIH0pIFxyXG4gICAgICApXHJcbiAgICB9IFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIGJhbmNvcyBzaWdlY29mXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNpZ2Vjb2ZCYW5rcygpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc2lnZXNwL2JhbmNvX3NpZ2Vjb2ZfZGFvLnBocGAsIFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNU2lnZWNvZkJhbmsoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGEgY29uZmlndXJhY2lvbiBkZSBTT0NcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29uZmlnU09DKCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zb2MvY29uZmlndXJhY2lvbl9kYW8ucGhwYCwgXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gbmV3IE1Db25maWdTT0MocmVzLmRhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIHRpcG9zIGRlIGRlZHVjY2lvblxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXREZWR1Y3Rpb25UeXBlcygpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc3RiL3RpcG9fZGVkdWNjaW9uX2Rhby5waHBgLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNRGVkdWN0aW9uVHlwZShlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEluY29tZUFjY291bnRzKG9ubHlBdmFpbGFibGU6IGJvb2xlYW4gPSBmYWxzZSk6IE9ic2VydmFibGU8YW55PntcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5VUkx9L2Rhby9zcGkvY3VlbnRhc19pbmdyZXNvc19kYW8ucGhwJHtcclxuICAgICAgICBvbmx5QXZhaWxhYmxlID8gJz9hdmFpbGFibGU9dHJ1ZScgOiAnJ1xyXG4gICAgICB9YCwge2hlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKX0pLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6YW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUN1ZW50YUluZ3Jlc29zKGUpKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYXJnZXMoKXtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oXHJcbiAgICAgICAgYCR7dGhpcy5VUkx9L2Rhby9zdGIvY2FyZ29zX2Rhby5waHBgLCBcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9XHJcbiAgICAgICkucGlwZShcclxuICAgICAgICBtYXAoKHJlczogSVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUNhcmdvKGUpKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldERlZHVjdGlvbnMoKXtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oXHJcbiAgICAgICAgYCR7dGhpcy5VUkx9L2Rhby9zdGIvZGVkdWNjaW9uZXNfZGFvLnBocGAsIFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH1cclxuICAgICAgKS5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzOiBJUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNRGVkdWN0aW9uKGUpKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGEgbG9zIGRhdG9zIGRlIEVtcHJlc2FcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIERpbWFseSBDcmVzcG9cclxuICAgICAqIFxyXG4gICAgICovXHJcbiAgICAgcHVibGljIGdldENvbXBhbnkodGlwbzpzdHJpbmcsaWQ/Om51bWJlcik6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvZW1wcmVzYXNfZGFvLnBocD90aXBvPSR7dGlwb30maWQ9JHtpZH1gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNRW1wcmVzYShlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgIC8qKiBcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyB0aXBvcyBkZSBkb2N1bWVudG9zIHJlZ2lzdHJhZG9zIGVuIENYUFxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgRGltYWx5IENyZXNwb1xyXG4gICAgICogQGRhdGUgMjAtMDctMjAyMVxyXG4gICAgICovXHJcbiAgICAgIHB1YmxpYyBnZXRUaXBvc0RvY3VtZXRvcygpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9jeHAvdGlwb19kb2N1bWVudG9fZGFvLnBocD9vcGVyYWNpb249JHsnYnVzY2FyJ30mZXhpc3Rlbj0keydleGlzdGVuJ31gLFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1UaXBvRG9jdW1lbnRvQ1hQKGUpKTsgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgLyoqXHJcbiAgICAgICogQHBhcmFtIGdldCB0b21hIGxvcyB2YWxvcmVzOiBbIGlkT3JkZW5Db21wcmEgLCdyZWNlcGNpb24nLCdleGlzdGVuJywnY29kaWdvJywgJ29yZGVuZXNTT0MnLCAnb3AnLCAnYXJ0JyBdXHJcbiAgICAgICogQHBhcmFtIG4gY29kaWdvIERvY3VtZW50byBPcmRlbiwgc2UgdXNhIHBhcmEgb2J0ZW5lciBsb3MgZGV0YWxsZXMgZGUgbGEgb3JkZW4gZGUgY29tcHJhLCBlcyBvYmxpZ2F0b3JpbyBhbCBjb21iaW5hciBjb24gbGEgb3BjaW9uIGdldDogaWRPcmRlbkNvbXByYVxyXG4gICAgICAqIEBkZXNjcmlwdGlvbiAncmVjZXBjaW9uJzogT2J0aW5lIGxhcyBvcmRlbmVzIGRlIHN1bWluaXN0cm8sXHJcbiAgICAgICogZXhpc3RlIHkgY29kaWdvOiBPYnRpZW5lIGxvcyBjb2RpZ29zIHJlZ2lzdHJhZG9zLCBcclxuICAgICAgKiBvcmRlbmVzU09DOiBvYnRpZW5lIGxhcyBvcmRlbmVzIGRlIGNvbXByYSxcclxuICAgICAgKiBvcDogb2J0aWVuZSBsYXMgb3JkZW5lcyBwZW5kaWVudGVzXHJcbiAgICAgICogYXJ0OiBvYnRpZW5lIGxvcyBhcnRpY3Vsb3MgXHJcbiAgICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAgKiBAZGF0ZSAzLTEwLTIwMjFcclxuICAgICAgKiBAcmV0dXJucyBcclxuICAgICAgKi9cclxuICAgICAgIHB1YmxpYyBnZXRFbnRyYWRhU3VtaW5pc3Ryb3MoZ2V0OmFueSwgbj86c3RyaW5nKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc2l2L2VudHJhZGFfc3VtaW5pc3Ryb19kYW8ucGhwP2dldD0ke2dldH0mbj0ke259YCxcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUVudHJhZGFTdW1pbmlzdHJvcyhlKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAvKiogXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgdGlwb3MgZGUgZG9jdW1lbnRvcyByZWdpc3RyYWRvcyBlbiBDWFBcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIERpbWFseSBDcmVzcG9cclxuICAgICAqIEBkYXRlIDIwLTA3LTIwMjFcclxuICAgICAqL1xyXG5cclxuICAgICAgcHVibGljIGdldENvbmNlcHRvc0N4UCgpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9jeHAvY29uY2VwdG9fZGFvLnBocD9vcGVyYWNpb249JHsnYnVzY2FyJ31gLFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1Db25jZXB0b3NDWFAoZSkpOyAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgIC8qKiBcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyBsb3MgY29uY2VwdG9zIFJldGVuY2lvbiBJU1JMXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBEaW1hbHkgQ3Jlc3BvXHJcbiAgICAgKiBAZGF0ZSAyNi0wNy0yMDIxXHJcbiAgICAgKi9cclxuXHJcbiAgICAgICAgcHVibGljIGdldENvbmNlcHRvc1JldGVuY2lvbigpe1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3N0Yi9kZWR1Y2Npb25lc19kYW8ucGhwP2NvZGU9JHsnY29uY2VwdG9zJ31gLFxyXG4gICAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1Db25jZXB0b1JldGVuY2lvbihlKSk7ICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAvKiogXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYSBjb25maWd1cmFjacOzbiBkZSBSUkhIIHkgZGUgU05PXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBEaW1hbHkgQ3Jlc3BvXHJcbiAgICAgKi9cclxuICAgICAgcHVibGljIG9idGVuZXJDb25maWd1cmFjaW9uU05PKCl7XHJcbiAgICAgIFxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zbm8vY29uZmlndXJhY2lvbl9kYW8ucGhwP3RpcG89JHsnY29uZmlndXJhY2lvbid9YCxcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7IFxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcy5kYXRhLmxlbmd0aD4wKXtcclxuICAgICAgICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUNvbmZpZ3VyYWNpb25TTk8oZSkpOyAgXHJcbiAgICAgICAgICAgICAgICB9ICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICAgICAgXHJcbiAgICAgIH1cclxuXHJcbiAgICAgLyoqXHJcbiAgICAgICogXHJcbiAgICAgICogQHBhcmFtIHRpcG8gWydkZWZhdWx0JywgJ3VubycsICdjYXJnb3MnXSBkYWZhdWx0OlRvZGFzIGxhcyBub21pbmFzLCB1bm86IHVuYSBub21pbmEsICdjYXJnb3MnOiBub21pbmFzIHBvciBjYXJnb3NcclxuICAgICAgKiBAcGFyYW0gaWQgOmlkIGRlIGxhIG5vbWluYS4gQ2FtcG8gcmVxdWVyaWRvIHBhcmEgdW5vIHkgY2FyZ29zXHJcbiAgICAgICogQHJldHVybnMgYXJyYXkoKSAgICAgIFxyXG4gICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBub21pbmFzIHJlZ2lzdHJhZGFzXHJcbiAgICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAgKiBAZGF0ZSAyMC0xMC0yMVxyXG4gICAgICAqXHJcbiAgICAgKi8gICAgIFxyXG5cclxuICAgICAgIHB1YmxpYyBnZXROb21pbmEodGlwbzpzdHJpbmcsaWQ/Om51bWJlcil7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3Nuby9kZWZpbmljaW9uX25vbWluYV9kYW8ucGhwP3RpcG89JHt0aXBvfSZpZD0ke2lkfWAsXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuc3VjY2VzcykgeyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTURlZmluaWNpb25Ob21pbmEoZSkpOyAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgLyoqXHJcbiAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyBjYXJnb3MgZGUgbGFzIG5vbWluYVxyXG4gICAgKiBAcGFyYW0gdGlwbyBbJ2NvZGlnbycsJ2RlZmF1bHQnXSAtPmNvZGlnbzogb2J0aWVuZSBlbCBwcm94aW1vIGNvZGlnby4gLT5kZWZhdWx0OiBvYnRpZW5lIHRvZG9zIGxvcyBjYXJnb3MgZGUgbGEgbm9taW5hXHJcbiAgICAqIEBwYXJhbSBpZCBpZCBkZSBsYSBub21pbmFcclxuICAgICogQHJldHVybnMgYXJyYXkoKVxyXG4gICAgKi9cclxuICAgICAgcHVibGljIGdldENhcmdvc05vbWluYSh0aXBvOnN0cmluZyxpZD86bnVtYmVyKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc25vL2FzaWduYWNpb25fY2FyZ29zX2Rhby5waHA/dGlwbz0ke3RpcG99JmlkPSR7aWR9YCxcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNQXNpZ25hY2lvbkNhcmdvKGUpKTsgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gIFxyXG4gICAgICBcclxuICAgICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSB1biBwZXJzb25hbCBkZSBsYSBuw7NtaW5hXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBEaW1hbHkgQ3Jlc3BvXHJcbiAgICAgKi9cclxuICAgICAgIHB1YmxpYyBnZXRQZXJzb25hbFNSSCh0aXBvOnN0cmluZyxpZD86bnVtYmVyKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc25vL3BlcnNvbmFsX2Rhby5waHA/dGlwbz0ke3RpcG99JmlkPSR7aWR9YCxcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNUGVyc29uYWwoZSkpOyAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBcclxuXHJcbiAgICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGFnZW5jaWEgZGUgYmFuY29cclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIERpbWFseSBDcmVzcG9cclxuICAgICAqL1xyXG4gICAgICAgcHVibGljIGdldEFnZW5jaWFCYW5jbyh0aXBvOnN0cmluZyxpZD86bnVtYmVyKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc2NiL2FnZW5jaWFfZGFvLnBocD9jb2RlPSR7dGlwb30maWQ9JHtpZH1gLFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1BZ2VuY2lhQmFuY28oZSkpOyAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhIGhvamFzIGRlIHRpZW1wb1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgRGltYWx5IENyZXNwb1xyXG4gICAgICovXHJcbiAgICAgICAgICAgcHVibGljIGdldEhvamFUaWVtcG8odGlwbzpzdHJpbmcsaWRQZXJzb25hbD86bnVtYmVyLGlkTm9taW5hPzpudW1iZXIpe1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc25vL2hvamFfdGllbXBvX2Rhby5waHA/aWRQZXJzb25hbD0ke2lkUGVyc29uYWx9JmlkTm9taW5hPSR7aWROb21pbmF9YCxcclxuICAgICAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNSG9qYVRpZW1wbyhlKSk7ICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gXHJcbiAgICAgIFxyXG5cclxuXHJcbiAgICBwdWJsaWMgdXNlckhhc1JpZ2h0cyhjb2x1bW46J2FkbWluaXN0cmFkb3InIHwgJ2luc2VydGFyJyB8ICdhY3R1YWxpemFyJyB8ICdjb25zdWx0YXInIFxyXG4gICAgfCAnZWxpbWluYXInIHwgJ2FudWxhcicgfCdkZXNjYXJnYXInIHwgJ2VqZWN1dGFyX19wcm9jZXNhcl8nIHwgJ2ltcHJpbWlyJyBcclxuICAgIHwgJ2Vudmlhcl9fY29ycmVvXycgfCAndmlzaWJsZScpe1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihcclxuICAgICAgICBgJHt0aGlzLlVSTH0vZGFvL3Nzcy9kZXJlY2hvc191c3VhcmlvX2Rhby5waHA/aWRDb21wb25lbnQ9JHtcclxuICAgICAgICAgIHRoaXMuY3VycmVudENvbXBvbmVudC5pZFxyXG4gICAgICAgIH0mY29sdW1uPSR7Y29sdW1ufWAsIFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH1cclxuICAgICAgKVxyXG5cclxuICAgIH1cclxuXHJcbiAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFJldG9ybmEgbG9zIGhlYWRlcnMgcGFyYSBoYWNlciBsYXMgcGV0aWNpb25lc1xyXG4gICAgICogQHBhcmFtcyB0eXBlOiBUaXBvIE1JTUUgcGVybWl0aWRvIHBvciBkZWZlY3RvIHNlIHRvbWEgYXBwbGljYXRpb24vanNvblxyXG4gICAgICogQHJldHVybiBIdHRwSGVhZGVyc1xyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqIEBkYXRlLXVwZGF0ZTogMTUtMDYtMjAyMiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEh0dHBIZWFkZXJzKHR5cGU/OnN0cmluZyk6IEh0dHBIZWFkZXJzIHsgXHJcbiAgICAgICF0eXBlPyB0eXBlPSdhcHBsaWNhdGlvbi9qc29uJzonJzsgICAgICBcclxuICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IHR5cGUsXHJcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgJHt0aGlzLnVzdWFyaW9BY3Rpdm8udG9rZW59YFxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGhlYWRlcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCBzZXJ2aWRvciBndWFyZGFkbyBlbiBlbCBzZXNzaW9uU3RvcmFnZVxyXG4gICAgICogQHJldHVybiBzdHJpbmdcclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuVVJMO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgZWwgdXN1YXJpbyBndWFyZGFkbyBlbiBlbCBzZXNzaW9uU3RvcmFnZVxyXG4gICAgICogQHJldHVybiBNVXN1YXJpb1xyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldFVzZXIoKSB7XHJcbiAgICAgIGxldCBjb25leGlvbjogSUNvbmV4aW9uID0gYXdhaXQgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3VzZXInKSkgPyBKU09OLnBhcnNlKGF0b2Ioc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgndXNlcicpKSkgOiBudWxsO1xyXG4gICAgICAvL2NvbnNvbGUubG9nKGNvbmV4aW9uKVxyXG4gICAgICAvLyBkZWJ1Z2dlclxyXG4gICAgICBpZiAoY29uZXhpb24pIHtcclxuICAgICAgICB0aGlzLnVzdWFyaW9BY3Rpdm8gPSBuZXcgTVVzdWFyaW8oY29uZXhpb24udXN1YXJpbyk7XHJcbiAgICAgICAgdGhpcy5VUkwgPSBjb25leGlvbi5zZXJ2aWRvcjtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBNdWVzdHJhIHVuIHRvYXN0IGRlIHN1Y2Nlc3NcclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lbnNhamUgcXVlIHNlIHZhIGEgbW9zdHJhclxyXG4gICAgICogQHJldHVybiB2b2lkXHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2hvd1RvYXN0U3VjY2VzcyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgdGhpcy50b2FzdC5zdWNjZXNzKG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE11ZXN0cmEgdW4gdG9hc3QgZGUgZXJyb3JcclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lbnNhamUgcXVlIHNlIHZhIGEgbW9zdHJhclxyXG4gICAgICogQHJldHVybiB2b2lkXHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2hvd1RvYXN0RXJyb3IobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgIHRoaXMudG9hc3QuZXJyb3IobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBNdWVzdHJhIHVuIHN3ZWV0YWxlcnQyIGRlIMOpeGl0b1xyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgTWVuc2FqZSBxdWUgc2UgdmEgYSBtb3N0cmFyXHJcbiAgICAgKiBAcmV0dXJuIHZvaWRcclxuICAgICAqIEBkYXRlIDIyLTExLTIwMjFcclxuICAgICAqL1xyXG4gICAgICAgcHVibGljIHNob3dUb2FzdFN1Y2Nlc3NTd2FsKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgICAgICBpY29uOiAnc3VjY2VzcycsXHJcbiAgICAgICAgICB0aXRsZTogJ8OJeGl0bycsXHJcbiAgICAgICAgICB0ZXh0OiBtZXNzYWdlLCAgICAgICBcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcblxyXG4gICAgICBcclxuXHJcbiAgICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gTXVlc3RyYSB1biBzd2VldGFsZXJ0MiBkZSBlcnJvclxyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgTWVuc2FqZSBxdWUgc2UgdmEgYSBtb3N0cmFyXHJcbiAgICAgKiBAcmV0dXJuIHZvaWRcclxuICAgICAqIEBkYXRlIDIyLTExLTIwMjFcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNob3dUb2FzdEVycm9yU3dhbChtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgU3dhbC5maXJlKHtcclxuICAgICAgICBpY29uOiAnZXJyb3InLFxyXG4gICAgICAgIHRpdGxlOiAnwqFFcnJvciEnLFxyXG4gICAgICAgIHRleHQ6IG1lc3NhZ2UsICAgICAgIFxyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEd1YXJkYSBlbCB1c3VhcmlvIGxvZ3VlYWRvIGVuIGVsIFNlc3Npb25TdG9yYWdlXHJcbiAgICAgKiBAcGFyYW0gdXNlciBVc3VhcmlvIHF1ZSBzZSB2YSBhIGd1YXJkYXIgZW4gZWwgU2Vzc2lvblN0b3JhZ2VcclxuICAgICAqIEByZXR1cm4gdm9pZFxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNhdmVVc2VyKGRhdGE6IElDb25leGlvbik6IHZvaWQge1xyXG4gICAgICB0aGlzLnVzdWFyaW9BY3Rpdm8gPSBuZXcgTVVzdWFyaW8oZGF0YS51c3VhcmlvKTtcclxuICAgICAgdGhpcy5VUkwgPSBkYXRhLnNlcnZpZG9yO1xyXG4gICAgICBsZXQgZW5jcnlwdGVkVXNlcjogc3RyaW5nID0gYnRvYShKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ3VzZXInLCBlbmNyeXB0ZWRVc2VyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXRlIGEgbGEgdXJsIGEgbGEgY3VhbCBzZSBsZSB2YW4gYSByZWFsaXphciBwZXRpY2lvbmVzIGFsIGJhY2tFbmRcclxuICAgICAqIEBwYXJhbSB1cmwgVVJsIGRvbmRlIHNlIHZhbiBhIHJlYWxpemFyIGxhcyBwZXRpY2lvbmVzXHJcbiAgICAgKiBAcmV0dXJuIHZvaWRcclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRVcmwodXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgdGhpcy5VUkwgPSB1cmw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gSW5pY2lhbGl6YSBlbCBzZXJ2aWNpbyBkZSBzaWdlc3BcclxuICAgICAqIEByZXR1cm4gdm9pZFxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGluaXQoKTogdm9pZCB7XHJcbiAgICAgIC8vIFZlcmlmaWNhbW9zIHNpIGhheSB1biB1c3VhcmlvIGVuIGxhIHNlc3Npb25TdG9yYWdlLCBlc3RvIGVzIG5lY2VzYXJpbyBwYXJhIHJlY2FyZ2FyIGxhIHDDoWdpbmFcclxuICAgICAgaWYgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3VzZXInKSkge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3VzZXInKSlcclxuICAgICAgICB0aGlzLmdldFVzZXIoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFZlcmlmaWNhIHNpIHVuIHVzdWFyaW8gZXN0w6EgbG9ndWVhZG9cclxuICAgICAqIEByZXR1cm4gUHJvbWlzZTxib29sZWFuPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGlzTG9nZ2VkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd1c2VyJykpIHtcclxuICAgICAgICAgIHJlc29sdmUodHJ1ZSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVyRXJyb3IoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKTogYW55IHtcclxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoJ09jdXJyacOzIHVuIGVycm9yJylcclxuICAgIH1cclxuXHJcbiAgICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIG9idGllbmUgZWwgcGVyc29uYWwgc2VndW4gZmlsdHJvXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGRhdGUgMTUtMTEtMjAyMVxyXG4gICAgICogQHBhcmFtIHRpcG86IHZhbG9yZXMgWydjYXRhbG9nbycsJ2RlZmF1bHQnLCdub21pbmEnXVxyXG4gICAgICogQHBhcmFtcyBkYXRvOm9iamVjdCB7bm9tYnJlOnN0cmluZywgYXBlbGxpZG86c3RyaW5nLCBjZWR1bGEuc3RyaW5nfSB1c2UgcGFyYSBsYSBvcGNpb24gJ2NhdGFsb2dvJ1xyXG4gICAgICovXHJcbiAgICAgICBwdWJsaWMgZ2V0UGVyc29uYWwodGlwbzpzdHJpbmcsIGRhdG8/OmFueSl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3Nuby9wZXJzb25hbF9kYW8ucGhwP1xyXG4gICAgICAgIHRpcG89JHt0aXBvfSZjZWR1bGE9JHtkYXRvLmNlZHVsYX0mbm9tYnJlPSR7ZGF0by5ub21icmV9JmFwZWxsaWRvPSR7ZGF0by5hcGVsbGlkb30mZXhwZWRpZW50ZT0ke2RhdG8uZXhwZWRpZW50ZX0maWRUaXBvPSR7ZGF0by50aXBvfWAsXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuc3VjY2VzcykgeyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTVBlcnNvbmFsKGUpKTsgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gXHJcblxyXG4gICAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBvYnRlbmVyIHBlcnNvbmFsIE5vbWluYSBzZWd1biBmaWx0cm9cclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAZGF0ZSAxNS0xMS0yMDIxXHJcbiAgICAgKiAqIEBwYXJhbSB0aXBvOiB2YWxvcmVzIFsnY2F0YWxvZ28nLCdkZWZhdWx0Jywnbm9taW5hJ11cclxuICAgICAqIEBwYXJhbXMgZGF0bzpvYmplY3Qge25vbWJyZTpzdHJpbmcsIGFwZWxsaWRvOnN0cmluZywgY2VkdWxhLnN0cmluZ30gdXNlIHBhcmEgbGEgb3BjaW9uICdjYXRhbG9nbydcclxuXHJcbiAgICAgKi9cclxuICAgICAgICBwdWJsaWMgZ2V0UGVyc29uYWxOb21pbmEodGlwbzpzdHJpbmcsZGF0bz86YW55KXtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zbm8vYXNpZ25hY2lvbl9wZXJzb25hbF9ub21pbmFfZGFvLnBocD9cclxuICAgICAgICAgIHRpcG89JHt0aXBvfSZjZWR1bGE9JHtkYXRvLmNlZHVsYX0mbm9tYnJlPSR7ZGF0by5ub21icmV9JmFwZWxsaWRvPSR7ZGF0by5hcGVsbGlkb30mZXhwZWRpZW50ZT0ke2RhdG8uZXhwZWRpZW50ZX0maWRUaXBvPSR7ZGF0by5pZFRpcG99JmlkTm9taW5hPSR7ZGF0by5pZE5vbWluYX1gLFxyXG4gICAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1QZXJzb25hbE5vbWluYShlKSk7ICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIGlkUGVyc29uYWw6IGlkIGRlbCBwZXJzb25hbFxyXG4gICAqIEBwYXJhbSB0aXBvOiB2YWxvcmVzWydub21pbmFfcGVyc29uYWwnXSBcclxuICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgbm9taW5hcyBkZWwgcGVyc29uYWwgcmVzdW1pZGFcclxuICAgKiBAZGVwcmVjYXRlZDsgMjAtMDEtMjJcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBcclxuICBwdWJsaWMgZ2V0UGVyc29uYWxOb21pbmFSZXN1bWlkYShpZFBlcnNvbmFsOm51bWJlcix0aXBvOnN0cmluZyl7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zbm8vcGVyc29uYWxfZGFvLnBocD9pZFBlcnNvbmFsPSR7aWRQZXJzb25hbH0mdGlwbz0ke3RpcG99YCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNTm9taW5hU2ltcGxlKGUpKTsgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICBcclxuICAgICAgIC8qKlxyXG4gICAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCBKc29uIE1lbnUgcGFyYSBlbCB1c3VhcmlvIGRlZmluaWRvIHNlZ3VuIHN1IHBlcm1pc29sb2dpYSBkZWwgU2lzdGVtYVxyXG4gICAgICAgKiBAcmV0dXJuIEpzb24gZGF0YVxyXG4gICAgICAgKiBAYXV0aG9yIEluZy4gV2lsbWVyIEJyaWNlbm9cclxuICAgICAgICovXHJcbiAgICAgICAgICBwdWJsaWMgZ2V0UGVyZmlsTm9Db21wb25lbnQoaWRfdXN1YXJpbzpudW1iZXIsc2lzdGVtYTpzdHJpbmcsIG5hbWVDb21wb25lbnQ6IHN0cmluZyApe1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLlVSTH0vZGFvL3Nzcy9kZXJlY2hvc191c3VhcmlvX2Rhby5waHA/aWRfdXN1YXJpbz0ke2lkX3VzdWFyaW99JnNpc3RlbWE9JHtzaXN0ZW1hfSZuYW1lY29tcG9uZW50PSR7bmFtZUNvbXBvbmVudH1gLFxyXG4gICAgICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKCAgICAgICAgICBcclxuICAgICAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7IFxyXG4gICAgICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICBcclxuICAgICAgIH1cclxuICBcclxuICAgICAgIC8qKlxyXG4gICAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCBKc29uIE1lbnUgcGFyYSBlbCB1c3VhcmlvIGRlZmluaWRvIHNlZ3VuIHN1IHBlcm1pc29sb2dpYSBkZWwgU2lzdGVtYVxyXG4gICAgICAgKiBAcmV0dXJuIEpzb24gZGF0YVxyXG4gICAgICAgKiBAYXV0aG9yIEluZy4gV2lsbWVyIEJyaWNlbm9cclxuICAgICAgICovXHJcbiAgICAgICAgcHVibGljIGdldEpzb25NZW51KGlkX3VzdWFyaW86bnVtYmVyLHNpc3RlbWE6c3RyaW5nKXtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuVVJMfS9kYW8vc3NzL21lbnVfZGFvLnBocD9pZF91c3VhcmlvPSR7aWRfdXN1YXJpb30mc2lzdGVtYT0ke3Npc3RlbWF9YCxcclxuICAgICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoICAgICAgICAgIFxyXG4gICAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7IFxyXG4gICAgICAgICAgICAgICB0aGlzLnVzZXJNZW51ID0gcmVzLmRhdGE7XHJcbiAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVzZXJNZW51O1xyXG4gICAgICAgICAgICAgfSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAgLyoqXHJcbiAgICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgZWwgSnNvbiBNZW51IHBhcmEgZWwgdXN1YXJpbyBkZWZpbmlkbyBzZWd1biBzdSBwZXJtaXNvbG9naWEgZGVsIFNpc3RlbWFcclxuICAgICAgKiBAcmV0dXJuIEpzb24gZGF0YVxyXG4gICAgICAqIEBhdXRob3IgSW5nLiBXaWxtZXIgQnJpY2Vub1xyXG4gICAgICAqL1xyXG4gICAgICBwdWJsaWMgbG9nKGJvZHk6IE1Mb2cgKXsgIFxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5VUkx9L2Rhby9zc3MvbG9nX2Rhby5waHBgLCBib2R5ICwge1xyXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKVxyXG4gICAgICAgIH0pLnBpcGUoICBcclxuICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHsgIFxyXG4gICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApXHJcbiAgICBcclxuICAgIH1cclxuXHJcbiAgXHJcbiAgICAgICAgXHJcbiAgIC8qKlxyXG4gICAgKiBAbmFtZSBFbmNyeXB0RGF0YVxyXG4gICAgKiBAZGVzY3JpcHRpb24gRW5zY3JpcHRhIHVuYSBleHByZXNpb24gZGF0YVxyXG4gICAgKiBAYXV0aG9yIEluZy4gV2lsbWVyIEJyaWNlw7FvXHJcbiAgICAqL1xyXG4gICAgcHVibGljIEVuY3J5cHREYXRhKCBleHByZXNpb24gOiBzdHJpbmcpe1xyXG4gICAgICAgY29uc3Qga2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UgKFwiMDEyMzQ1Njc4OVNJR0VTUFwiKTsgLy8gbsO6bWVybyBoZXhhZGVjaW1hbCBkZSAxNiBkw61naXRvcyBjb21vIGNsYXZlXHJcbiAgICAgICBjb25zdCBpdiA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlICgnU0lHRVNQMDEyMzQ1Njc4OScpOyAvLyBOw7ptZXJvIGhleGFkZWNpbWFsIGNvbW8gZGVzcGxhemFtaWVudG8gZGUgY2xhdmVcclxuICAgICAgIGxldCBzcmNzID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoZXhwcmVzaW9uKTtcclxuICAgICAgIGxldCBlbmNyeXB0ZWQgPSBDcnlwdG9KUy5BRVMuZW5jcnlwdChzcmNzLCBrZXksIHsgaXY6IGl2LCBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQywgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3IH0pO1xyXG4gICAgICAgcmV0dXJuIGVuY3J5cHRlZC5jaXBoZXJ0ZXh0LnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKTtcclxuICAgIH1cclxuIFxyXG4gICAgLyoqXHJcbiAgICAqIEBuYW1lIERlY3J5cHREYXRhXHJcbiAgICAqIEBkZXNjcmlwdGlvbiBEZXNlbmNyaXB0YSB1bmEgZXhwcmVzaW9uIGRhdGFcclxuICAgICogQGF1dGhvciBJbmcuIFdpbG1lciBCcmljZcOxb1xyXG4gICAgKi9cclxuICAgIHB1YmxpYyBEZWNyeXB0RGF0YSggZXhwcmVzaW9uIDogc3RyaW5nKXtcclxuICAgICAgIGNvbnN0IGtleSA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlIChcIjAxMjM0NTY3ODlTSUdFU1BcIik7IC8vIG7Dum1lcm8gaGV4YWRlY2ltYWwgZGUgMTYgZMOtZ2l0b3MgY29tbyBjbGF2ZVxyXG4gICAgICAgY29uc3QgaXYgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSAoJ1NJR0VTUDAxMjM0NTY3ODknKTsgLy8gTsO6bWVybyBoZXhhZGVjaW1hbCBjb21vIGRlc3BsYXphbWllbnRvIGRlIGNsYXZlXHJcbiAgICAgICBsZXQgZW5jcnlwdGVkSGV4U3RyID0gQ3J5cHRvSlMuZW5jLkhleC5wYXJzZShleHByZXNpb24pO1xyXG4gICAgICAgbGV0IHNyY3MgPSBDcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeShlbmNyeXB0ZWRIZXhTdHIpO1xyXG4gICAgICAgbGV0IGRlY3J5cHQgPSBDcnlwdG9KUy5BRVMuZGVjcnlwdChzcmNzLCBrZXksIHsgaXY6IGl2LCBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQywgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3IH0pO1xyXG4gICAgICAgbGV0IGRlY3J5cHRlZFN0ciA9IGRlY3J5cHQudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLlV0ZjgpO1xyXG4gICAgICAgcmV0dXJuIGRlY3J5cHRlZFN0ci50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gXHJcbiBcclxuICAgIC8qKlxyXG4gICAgKiBAbmFtZSBnZXRSZXNwb25zZVBlcmZpbFRvb2xiYXJcclxuICAgICogQGRlc2NyaXB0aW9uIE1ldG9kbyBxdWUgb2J0aWVuZSB1bmEgcmVzcHVlc3RhIHRydWUgbyBmYWxzZSBiYXNhZG8gZW4gdW5hIGVzdHJ1Y3R1cmEgc3JpbmcgYmluYW5yaWEgc2VndW4gXHJcbiAgICAqICAgICAgICAgICAgICBsYSBwb3NpY2lvbiBkYWRhIGRlbCB0b29sYmFyLiBzZSBwYXNhIHN0cmluZyBiaW5hcmlvIHF1ZSBjb250aWVuZSAxIHkgMCBlbiByZXByZXNlbnRhY2lvbiBcclxuICAgICogICAgICAgICAgICAgIGRlIGxhcyBwcm9waWVzdGFkZXMgYWRtaW5pc3RyYWRvcixjb25zdWx0YXIsZWplY3V0YXIsaW1wcmltaXIgZXRjIC4uLiBjYWRhIHBvc2ljaW9uIHNlY3VlbmNpYWwgXHJcbiAgICAqICAgICAgICAgICAgICBzaSBlc3RhIGVuIDEgZXMgdHJ1ZSB5IDAgZW4gZmFsc2UgeSBkZXZ1bGV2ZSBlbCB2YWxvciBzZWd1biBsbyByZXF1aWVyYSBlbCB1c3VhcmlvOlxyXG4gICAgKiAgICAgICAgICAgICAgc3RyaW5nYmluYXJpbyA6ICcxMDExJyB5IHBvc2ljaW9uIGVzIDIsIHBvciB0YW50byBzZSB0YXJlIDAgeSBlcyBmYWxzZSBxdWUgcmVwcmVzZW50YSBvcGNpb24gY29uc3VsdGFyLlxyXG4gICAgKiAgICAgICAgICAgICAgRXN0cnVjdHVyYSBzdHJpbmcgYmluYXJpbzpcclxuICAgICogICAgICAgICAgICAgIFBvc2ljacOzbiA6XHJcbiAgICAqICAgICAgICAgICAgICAwLiAgQWRtaW5pc3RyYWRvciAgICAgICAgNi4gIERlc2NhcmdhciAgICAgIDEyLiBSZXZlcnNhciBhcHJvYmFyICAgICAgMTguIFJldmVyc2FyIGFudWxhciBjb250YWJpbGl6YWRvXHJcbiAgICAqICAgICAgICAgICAgICAxLiAgaW5zZXJ0YXIgICAgICAgICAgICAgNy4gIEVqZWN1dGFyICAgICAgIDEzLiBBbnVsYXIuXHJcbiAgICAqICAgICAgICAgICAgICAyLiAgQWN0dWFsaXphciAgICAgICAgICAgOC4gIEVudmlhciAgICAgICAgIDE0LiByZXZlcnNhciBhbnVsYXJcclxuICAgICogICAgICAgICAgICAgIDMuICBjb25zdWx0YXIgICAgICAgICAgICA5LiBJbXByaW1pciAgICAgICAgMTUuIGNvbnRhYmlsaXphclxyXG4gICAgKiAgICAgICAgICAgICAgNC4gIEVsaW1pbmFyICAgICAgICAgICAgIDEwLiBWaXNpYmxlICAgICAgICAxNi4gcmV2ZXJzYXIgY29udGFiaWxpemFyXHJcbiAgICAqICAgICAgICAgICAgICA1LiAgQW51bGFyICAgICAgICAgICAgICAgMTEuIEFwcm9iYXIgICAgICAgIDE3LiBhbnVsYXIgY29udGFiaWxpemFkbyAgICAgICBcclxuICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICogQGF1dGhvciBJbmcuIFdpbG1lciBCcmljZcOxb1xyXG4gICAgKi9cclxuICAgICBwdWJsaWMgZ2V0UmVzcG9uc2VQZXJmaWxUb29sYmFyKCBzdHJpbmdiaW5hcmlvIDogc3RyaW5nLCBwb3NpdGlvbiA6IG51bWJlciApe1xyXG4gICAgICAgICAgbGV0IGJpbmFyaW8gPSBzdHJpbmdiaW5hcmlvLnN1YnN0cmluZyhwb3NpdGlvbixwb3NpdGlvbisxKSA7XHJcbiAgICAgICAgICBpZiAoYmluYXJpbz09XCIxXCIpe1xyXG4gICAgICAgICAgICAgIHJldHVybiB0cnVlOyBcclxuICAgICAgICAgIH0gICBcclxuICAgICAgICAgIHJldHVybiBmYWxzZTsgXHJcbiAgICAgfVxyXG5cclxuIC8qKlxyXG4gICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCBJcCBkZWwgY2xpZW50ZVxyXG4gICAgKiBAcmV0dXJuIEpzb24gZGF0YVxyXG4gICAgKiBAYXV0aG9yIEluZy4gV2lsbWVyIEJyaWNlbm9cclxuICAgICovXHJcbiAgcHVibGljIGdldElQQWRkcmVzcygpeyAgXHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoXCJodHRwOi8vYXBpLmlwaWZ5Lm9yZy8/Zm9ybWF0PWpzb25cIikgXHJcbiAgICAucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIGNhdWdodCBpbiBzZXJ2aWNlJylcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnaXBfYWRyZXNzJywgJzEyNy4wLjAuMScpO1xyXG4gICAgICAgIC8vSGFuZGxlIHRoZSBlcnJvciBoZXJlXHJcblxyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycik7ICAgIC8vUmV0aHJvdyBpdCBiYWNrIHRvIGNvbXBvbmVudFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIFxyXG4gIH1cclxuIC8qKlxyXG4gICogQGRlc2NyaXB0aW9uIE9idGllbmUgZWwgSXAgZGVsIGNsaWVudGVcclxuICAqIEByZXR1cm4gSnNvbiBkYXRhXHJcbiAgKiBAYXV0aG9yIEluZy4gV2lsbWVyIEJyaWNlbm9cclxuICAqL1xyXG4gIHB1YmxpYyBzZXRJcEFkcmVzcygpe1xyXG4gICAgdGhpcy5nZXRJUEFkZHJlc3MoKS5zdWJzY3JpYmUoIChyZXNwOiBhbnkpICAgPT4ge1xyXG4gICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdpcF9hZHJlc3MnLCByZXNwLmlwKTtcclxuICAgICAgICAgdGhpcy5pcF9hZHJlc3MgPSByZXNwLmlwO1xyXG4gICAgfSk7ICBcclxuICB9IFxyXG4gLyoqXHJcbiAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCBJcCBkZWwgY2xpZW50ZVxyXG4gICogQHJldHVybiBKc29uIGRhdGFcclxuICAqIEBhdXRob3IgSW5nLiBXaWxtZXIgQnJpY2Vub1xyXG4gICovXHJcbiAgcHVibGljIGdldElwQWRyZXNzKCl7XHJcbiAgICB0aGlzLmlwX2FkcmVzcyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2lwX2FkcmVzcycpOyAgXHJcbiAgfSBcclxuXHJcbiAgIC8qKlxyXG4gICogQGRlc2NyaXB0aW9uIE9idGllbmUgZWwgSXAgZGVsIGNsaWVudGVcclxuICAqIEByZXR1cm4gSnNvbiBkYXRhXHJcbiAgKiBAZGlhIDE5LTA1LTIwMjJcclxuICAqLyAgXHJcblxyXG4gICAgcHVibGljIGNyZWF0ZUF1ZGl0b3JpYShzbm86TVNub0xvZ1tdKXtcclxuICAgICAgbGV0IGJvZHk9W107XHJcbiAgICAgIHNuby5mb3JFYWNoKGU9PiB7Ym9keS5wdXNoKGUuZGF0YUludGVmYWNlKCkpfSk7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc25vL3NlZ3VyaWRhZF9kYW8ucGhwP2AsYm9keSxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7cmV0dXJuIHJlczt9KVxyXG4gICAgICApO1xyXG4gICAgfSAgXHJcblxyXG4gLyoqICBcclxuICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyB0aXBvcyBkZSBkZXBvc2l0b3MgICogXHJcbiAgKiBAcGFyYW0gcHJvY2VkZSA6IHByb2NlZGUgZGVsIG1vZHVsb1xyXG4gICogQHBhcmFtIGlkQXJ0aWN1bG8gOiBpZCBkZWwgYXJ0aWN1bG9cclxuICAqIEBwYXJhbSBpZFVzdWFyaW8gOiBpZCB1c3VhcmlvIHBlcm1pdGlkb1xyXG4gICogQHJldHVybnMgXHJcbiAgKiBAYXV0aG9yIEphdmllciBUb3ZhclxyXG4gICogQGRhdGUgMjMtMTEtMjAyMlxyXG4gICovICAgICAgXHJcbiAgcHVibGljIGdldERlcG9zaXRUeXBlKHByb2NlZGU6c3RyaW5nLGlkQXJ0aWN1bG86bnVtYmVyLGlkVXN1YXJpbz86bnVtYmVyKXtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zaXYvY2F0YWxvZ29fcGFyYW1ldHJpemFkb19kYW8ucGhwP2dldD0ke3Byb2NlZGV9JmlkPSR7aWRBcnRpY3Vsb30maT0ke2lkVXN1YXJpb31gLFxyXG4gICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgcmV0cnkoMyksXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1UaXBvRGVwb3NpdG9zKGUpKTsgICAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gICAgICAgIFxyXG59XHJcblxyXG4gIFxyXG5pbnRlcmZhY2UgZmlsdHJvQ3VlbnRhc1ByZXN1cHVlc3RvIHtcclxuICB0aXBvPzogJ0UnIHwgJ1InLFxyXG4gIGVzdGFkbz86ICdDJyB8ICdTJ1xyXG59XHJcblxyXG5cclxuIl19
|